whx преди 1 ден
родител
ревизия
dcecdea720
променени са 24 файла, в които са добавени 955 реда и са изтрити 16 реда
  1. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/index.html
  2. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/css/7775.48b9c5f8.css
  3. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/css/8647.8c490058.css
  4. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/css/965.da9081ab.css
  5. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/1563.2e7fffa2.js
  6. 0 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/1786.d5ebbc5a.js
  7. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/1786.e2b14e9e.js
  8. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/5353.5a2f8d5c.js
  9. 0 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/5642.810ca1fa.js
  10. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/6344.17d50f5c.js
  11. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/6916.9757f75e.js
  12. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/7390.7844f042.js
  13. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/742.9c4006a8.js
  14. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/965.d657aced.js
  15. 2 2
      virgo.wzfrontend/src/main/resources/static/workark/static/js/app.3f28e6d3.js
  16. 77 0
      virgo.wzfrontend/workark/src/api/oa.js
  17. 21 3
      virgo.wzfrontend/workark/src/components/common/listFilter.vue
  18. 66 0
      virgo.wzfrontend/workark/src/components/work/oa/order/action.vue
  19. 212 0
      virgo.wzfrontend/workark/src/components/work/oa/order/detail.vue
  20. 169 0
      virgo.wzfrontend/workark/src/components/work/oa/order/edit.vue
  21. 195 0
      virgo.wzfrontend/workark/src/components/work/oa/order/process.vue
  22. 16 2
      virgo.wzfrontend/workark/src/config/field.js
  23. 9 2
      virgo.wzfrontend/workark/src/router/modules/work/oa.js
  24. 179 0
      virgo.wzfrontend/workark/src/views/work/oa/order/list.vue

Файловите разлики са ограничени, защото са твърде много
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/index.html


virgo.wzfrontend/src/main/resources/static/workark/static/css/5642.48b9c5f8.css → virgo.wzfrontend/src/main/resources/static/workark/static/css/7775.48b9c5f8.css


virgo.wzfrontend/src/main/resources/static/workark/static/css/5353.8c490058.css → virgo.wzfrontend/src/main/resources/static/workark/static/css/8647.8c490058.css


Файловите разлики са ограничени, защото са твърде много
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/css/965.da9081ab.css


Файловите разлики са ограничени, защото са твърде много
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/1563.2e7fffa2.js


Файловите разлики са ограничени, защото са твърде много
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/1786.d5ebbc5a.js


Файловите разлики са ограничени, защото са твърде много
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/js/1786.e2b14e9e.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/5353.10ed565b.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/5353.5a2f8d5c.js


Файловите разлики са ограничени, защото са твърде много
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/5642.810ca1fa.js


Файловите разлики са ограничени, защото са твърде много
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/js/6344.17d50f5c.js


Файловите разлики са ограничени, защото са твърде много
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/6916.9757f75e.js


Файловите разлики са ограничени, защото са твърде много
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/7390.7844f042.js


Файловите разлики са ограничени, защото са твърде много
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/742.9c4006a8.js


Файловите разлики са ограничени, защото са твърде много
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/js/965.d657aced.js


Файловите разлики са ограничени, защото са твърде много
+ 2 - 2
virgo.wzfrontend/src/main/resources/static/workark/static/js/app.3f28e6d3.js


+ 77 - 0
virgo.wzfrontend/workark/src/api/oa.js

@@ -141,4 +141,81 @@ export function deleteMeetingById(id) {
 		url: `/api/meetingMinutes/${id}`,
 		method: 'delete'
 	})
+}
+/* 
+ * 获取工单分页列表
+ * 
+ */
+export function getOrderPageListByQuery(data) {
+	return request({
+		url: `/api/workOrder/${data.currPage}/${data.pageSize}`,
+		method: 'post',
+		data: data
+	})
+}
+/* 
+ * 新增工单
+ * 
+ */
+export function insertOrder(data) {
+	return request({
+		url: `/api/workOrder`,
+		method: 'post',
+		data: data
+	})
+}
+/* 
+ * 编辑工单
+ * 
+ */
+export function updateOrder(data) {
+	return request({
+		url: `/api/workOrder/update`,
+		method: 'put',
+		data: data
+	})
+}
+/* 
+ * 获取工单详情
+ * 
+ * 
+ */
+export function getOrderDetailById(id) {
+	return request({
+		url: `/api/workOrder/${id}`,
+		method: 'get'
+	})
+}
+/* 
+ * 删除工单
+ * 
+ * 
+ */
+export function deleteOrder(id) {
+	return request({
+		url: `/api/workOrder/delete/${id}`,
+		method: 'delete'
+	})
+}
+/* 
+ * 新增工单
+ * 
+ */
+export function insertOrderProcess(data) {
+	return request({
+		url: `/api/workOrder/process`,
+		method: 'post',
+		data: data
+	})
+}
+/* 
+ * 更新工单
+ * 
+ */
+export function putOrderProcess(data) {
+	return request({
+		url: `/api/workOrder/process/update`,
+		method: 'put',
+		data: data
+	})
 }

+ 21 - 3
virgo.wzfrontend/workark/src/components/common/listFilter.vue

@@ -18,10 +18,23 @@
 					<el-option label="未支付" value="未支付"></el-option>
 				</el-select>
 			</div>
+		</div>
+		<div class="filter-box" v-if="type === 'order'">
+			<div class="filter-item">
+				<el-input prefix-icon="el-icon-search" v-model="order.name" placeholder="请输入工单名称"></el-input>
+			</div>
+			<div class="filter-item">
+				<el-select v-model="order.status" placeholder="请选择工单状态">
+					<el-option label="待提交" :value="null"></el-option>
+					<el-option label="待处理" :value="1"></el-option>
+					<el-option label="处理中" :value="2"></el-option>
+					<el-option label="已处理" :value="3"></el-option>
+				</el-select>
+			</div>
 		</div>
 		<div class="filter-btn">
-			<el-button type="primary" size="medium" @click="submit">查询</el-button>
-			<el-button size="medium" @click="resetForm">重置</el-button>
+			<el-button type="primary" size="small" @click="submit">查询</el-button>
+			<el-button size="small" @click="resetForm">重置</el-button>
 		</div>
 	</div>
 </template>
@@ -36,7 +49,12 @@
 					status: '',
 					orderStatus: ''
 				},
-				serveData: {}
+				serveData: {},
+				order: {
+					name: '',
+					status: ''
+				},
+				orderData: {},
 			}
 		},
 		mounted() {

+ 66 - 0
virgo.wzfrontend/workark/src/components/work/oa/order/action.vue

@@ -0,0 +1,66 @@
+<template>
+	<div class="hui-flex hui-dialog">
+		<div class="hui-flex-box hui-dialog-content">
+			<el-form ref="form" :model="form" label-position="top">
+				<el-form-item label="处理内容" class="hui-textarea" prop="remark"
+					:rules="[{required: true, message: '请输入处理内容'}]">
+					<el-input type="textarea" v-model="form.remark" placeholder="请输入处理内容" maxlength="120" :rows="4"
+						show-word-limit resize="none">
+					</el-input>
+				</el-form-item>
+				<el-form-item label="处理附件" class="hui-textarea">
+					<upload ref="upload" :list="responsibility" type="insert"></upload>
+				</el-form-item>
+			</el-form>
+		</div>
+		<div class="hui-dialog-submit">
+			<el-button size="small" @click="$emit('callback')">取 消</el-button>
+			<el-button size="small" type="primary" @click="submit" :loading="loading">确 定</el-button>
+		</div>
+	</div>
+</template>
+
+<script>
+	import upload from '@/components/common/upload'
+	import {
+		putOrderProcess
+	} from '@/api/oa'
+	export default {
+		props: ['operationId'],
+		data() {
+			return {
+				form: {
+					remark: ''
+				},
+				responsibility: [],
+				loading: false
+			}
+		},
+		mounted() {
+
+		},
+		methods: {
+			submit() {
+				this.loading = true;
+				let postData = {
+					id: this.operationId,
+					remark: this.form.remark,
+					attachment: JSON.stringify(this.$refs.upload.fileList),
+					status: 1
+				}
+				putOrderProcess(postData).then(res => {
+					this.loading = false;
+					if (res.state) {
+						this.$message.success('操作成功');
+						this.$emit('callback', 'init');
+					}
+				})
+			}
+		},
+		components: {
+			upload
+		}
+	}
+</script>
+
+<style lang="scss"></style>

+ 212 - 0
virgo.wzfrontend/workark/src/components/work/oa/order/detail.vue

@@ -0,0 +1,212 @@
+<template>
+	<div class="hui-flex">
+		<div class="hui-flex-box">
+			<div class="hui-detail">
+				<div class="hui-detail-box">
+					<div class="hui-detail-title">基础信息</div>
+					<div class="hui-detail-content">
+						<div class="hui-detail-item">
+							<div class="hui-detail-label">工单日期</div>
+							<div class="hui-detail-value">{{detail.date}}</div>
+						</div>
+						<div class="hui-detail-item">
+							<div class="hui-detail-label">工单名称</div>
+							<div class="hui-detail-value">{{detail.name}}</div>
+						</div>
+						<div class="hui-detail-item hui-detail-item-top">
+							<div class="hui-detail-label">工单类型</div>
+							<div class="hui-detail-value">{{$field.findTypeName('orderType',detail.workWay)}}</div>
+						</div>
+						<div class="hui-detail-item">
+							<div class="hui-detail-label">工单摘要</div>
+							<div class="hui-detail-value">{{detail.compendious}}</div>
+						</div>
+					</div>
+				</div>
+				<div class="hui-detail-box">
+					<div class="hui-detail-title">工单附件</div>
+					<div class="hui-detail-content hui-detail-image">
+						<upload ref="upload" :list="detail.attachment ? JSON.parse(detail.attachment) : []"
+							type="preview">
+						</upload>
+					</div>
+				</div>
+				<div class="hui-detail-box" v-if="detail.data && detail.data != '[]'">
+					<div class="hui-detail-title">工单内容</div>
+					<div class="hui-detail-content">
+						<div class="hui-detail-item" v-for="(item,index) in JSON.parse(detail.data)" :key="index">
+							<div class="hui-detail-label">{{item.title}}</div>
+							<div class="hui-detail-value">{{item.content}}</div>
+						</div>
+					</div>
+				</div>
+				<div class="hui-detail-box" v-if="detail.workOrderProcessList.length > 0">
+					<div class="hui-detail-title">工单过程</div>
+					<process :process="detail.workOrderProcessList"></process>
+				</div>
+			</div>
+		</div>
+		<div class="hui-drawer-submit" v-if="actionButton.length > 0">
+			<el-button size="small" type="primary" v-for="(item,index) in actionButton" :key="index"
+				@click="actionClick(item.type)">
+				{{item.name}}
+			</el-button>
+		</div>
+		<el-dialog :close-on-click-modal="false" :title="type == 1 ? '选择指派人员':'处理工单'" :visible.sync="visible"
+			width="880px" :append-to-body="true">
+			<select-user @callback="callBack" v-if="visible && type == 1" :maxLen="1"></select-user>
+			<action @callback="callBack" v-if="visible && type == 2" :operationId="operation.id"></action>
+		</el-dialog>
+	</div>
+</template>
+
+<script>
+	import {
+		getOrderDetailById,
+		updateOrder,
+		insertOrderProcess
+	} from '@/api/oa'
+	import upload from '@/components/common/upload'
+	import selectUser from '@/components/common/selectUser'
+	import process from '@/components/work/oa/order/process'
+	import action from '@/components/work/oa/order/action'
+	export default {
+		props: ['detailId'],
+		data() {
+			return {
+				detail: {
+					name: '',
+					projectItemTargetRoomIds: '',
+					tenantType: 1,
+					merchantId: '',
+					clientId: '',
+					followUpPerson: '',
+					followUpPersonPhone: '',
+					workWay: '',
+					workOrderProcessList: []
+				},
+				visible: false,
+				type: 1,
+				operation: {},
+				actionButton: []
+			}
+		},
+		mounted() {
+			if (this.detailId) this.init();
+		},
+		methods: {
+			init() {
+				getOrderDetailById(this.detailId).then(res => {
+					if (res.state) {
+						this.detail = res.data;
+						this.role();
+					}
+				})
+			},
+			role() {
+				let user = this.$store.getters.user,
+					button = [];
+				if (this.detail.userId === user.userId) { //创建者
+					if (!this.detail.status) button.push({
+						type: 1,
+						name: '提交工单'
+					})
+				}
+				let data = this.detail.workOrderProcessList.filter(node => !node.status);
+				if (data.length > 0) { //未处理工单过程
+					this.operation = data[0];
+					//处理工单人员
+					if (this.operation.operatorId === user.userId) button.push({
+						type: 2,
+						name: '处理工单'
+					})
+				}
+				if (this.detail.followUpPerson === user.userId) { //跟进人
+					if (this.detail.status === 1) button.push({
+						type: 3,
+						name: '开始工单'
+					})
+					if (this.detail.status === 2) button.push({
+						type: 4,
+						name: '指派人员'
+					})
+					if (data.length === 0 && this.detail.status === 2) button.push({
+						type: 5,
+						name: '完成工单'
+					})
+				}
+				this.actionButton = button;
+			},
+			actionClick(type) {
+				switch (type) {
+					case 1:
+						this.submitOrder('是否提交工单,提交后将不能再修改?', 1);
+						break;
+					case 2:
+						this.operationClick(2)
+						break;
+					case 3:
+						this.submitOrder('是否开始工单?', 2);
+						break;
+					case 4:
+						this.operationClick(1)
+						break;
+					case 5:
+						this.submitOrder('是否完成工单?', 3);
+						break;
+					default:
+						break;
+				}
+			},
+			submitOrder(msg, status) {
+				this.$confirm(msg, () => {
+					this.update(status);
+				});
+			},
+			update(status) {
+				updateOrder({
+					id: this.detail.id,
+					status: status
+				}).then(res => {
+					if (res.state) {
+						this.init();
+						this.$message.success('操作成功');
+						this.$emit('callback', 'init')
+					}
+				})
+			},
+			callBack(data) {
+				if (!data) return this.visible = false;
+				if (data == 'init') {
+					this.init();
+					return this.visible = false;
+				}
+				insertOrderProcess({
+					operatorId: data[0].id,
+					workOrderId: this.detailId,
+					status: 0,
+					attachment: '[]'
+				}).then(res => {
+					if (res.state) {
+						this.init();
+						this.visible = false;
+						this.$message.success('操作成功');
+					}
+				})
+			},
+			operationClick(type) {
+				this.type = type;
+				this.visible = true;
+			}
+		},
+		components: {
+			upload,
+			selectUser,
+			process,
+			action
+		},
+	}
+</script>
+<style lang="scss">
+
+</style>

+ 169 - 0
virgo.wzfrontend/workark/src/components/work/oa/order/edit.vue

@@ -0,0 +1,169 @@
+<template>
+	<div class="hui-flex hui-dialog">
+		<div class="hui-flex-box hui-dialog-content">
+			<el-form ref="form" label-position="top" :model="form">
+				<el-form-item label="工单名称" prop="name" :rules="[{required: true, message: '请输入工单名称'}]">
+					<el-input type="text" v-model="form.name" placeholder="请输入工单名称"></el-input>
+				</el-form-item>
+				<el-form-item label="工单类型" prop="workWay" :rules="[{required: true, message: '请选择工单类型'}]">
+					<el-select v-model="form.workWay" placeholder="请选择工单类型">
+						<el-option :label="item.name" :value="item.id" v-for="(item,index) in $field.field.orderType"
+							:key="item.id">
+						</el-option>
+					</el-select>
+				</el-form-item>
+				<el-form-item label="工单跟进人" prop="followUpPerson" :rules="[{required: true, message: '请选择请成员'}]">
+					<el-cascader v-model="customerId" :options="options" :props="{
+						value:'id',
+						label:'name',
+						children:'children'
+					}" @change="changeUser"></el-cascader>
+				</el-form-item>
+				<el-form-item label="工单摘要" class="hui-textarea">
+					<el-input type="textarea" v-model="form.compendious" placeholder="请输入工单摘要" resize="none">
+					</el-input>
+				</el-form-item>
+				<el-form-item label="工单附件" class="hui-textarea">
+					<upload ref="upload" :list="responsibility" type="insert" accept="*" text="上传附件"></upload>
+				</el-form-item>
+				<el-form-item label="工单内容" class="hui-textarea">
+					<custom-data ref="customData" :list="customList" :option="option"></custom-data>
+				</el-form-item>
+			</el-form>
+		</div>
+		<div class="hui-dialog-submit">
+			<el-button size="small" @click="$emit('callback')">取 消</el-button>
+			<el-button size="small" type="primary" @click="submit" :loading="loading">保 存</el-button>
+		</div>
+	</div>
+</template>
+
+<script>
+	import {
+		insertOrder,
+		updateOrder,
+		getOrderDetailById
+	} from '@/api/oa'
+	import {
+		getPartList
+	} from '@/api/organization'
+	import upload from '@/components/common/upload'
+	import customData from '@/components/common/customData'
+	import {
+		findParentIds
+	} from '@/uitls'
+	export default {
+		props: ['isUpdate', 'detailId', 'type'],
+		data() {
+			return {
+				form: {
+					name: '',
+					projectItemTargetRoomIds: '',
+					tenantType: 1,
+					merchantId: '',
+					clientId: '',
+					followUpPerson: '',
+					followUpPersonPhone: '',
+					workWay: '',
+					contractId: '',
+					contractCode: ''
+				},
+				responsibility: [],
+				customList: [],
+				loading: false,
+				option: [{
+					id: 1,
+					label: '工单标题',
+					width: '200px',
+					value: 'title',
+					type: 'text'
+				}, {
+					id: 2,
+					label: '工单内容',
+					value: 'content',
+					type: 'text'
+				}],
+				customerId: [],
+				options: []
+			}
+		},
+		mounted() {
+			getPartList(this.$store.getters.organization.id, this.$store.getters.project.id).then(res => {
+				if (res.state) {
+					this.options = res.data;
+					this.returnChildren(this.options);
+					if (this.form.followUpPerson && this.options.length > 0) this.customerId = findParentIds(this
+						.options, -this.form.followUpPerson);
+				}
+			})
+			if (!this.isUpdate) {
+				this.form['organizationId'] = this.$store.getters.organization.id;
+				this.form['projectId'] = this.$store.getters.project.id;
+				this.form['userId'] = this.$store.getters.user.userId;
+				this.form['type'] = this.type;
+			} else {
+				getOrderDetailById(this.detailId).then(res => {
+					if (res.state) {
+						this.form = res.data;
+						if (this.form.attachment) this.responsibility = JSON.parse(this.form.attachment);
+						if (this.form.data) this.customList = JSON.parse(this.form.data);
+						if (this.form.followUpPerson && this.options.length > 0) this.customerId = findParentIds(
+							this.options, -this.form.followUpPerson);
+					}
+				})
+			}
+		},
+		methods: {
+			changeUser() {
+				this.form['followUpPerson'] = -this.customerId[this.customerId.length - 1];
+			},
+			returnChildren(data) {
+				data.forEach(item => {
+					if (item.users) {
+						let obj = item.users.map(res => {
+							return {
+								id: -res.id,
+								name: res.name
+							};
+						})
+						item.children = item.children.concat(obj);
+					}
+					if (item.children && item.children.length === 0) item.children = null;
+					if (item.children && item.children.length > 0) this.returnChildren(item.children);
+				});
+			},
+			submit(e) {
+				this.loading = true;
+				this.form['userId'] = this.$store.getters.user.userId;
+				this.$refs.form.validate((valid) => {
+					if (valid) {
+						let postData = JSON.parse(JSON.stringify(this.form));
+						if (this.$refs.upload) postData['attachment'] = JSON.stringify(this.$refs.upload.fileList);
+						postData['data'] = JSON.stringify(this.$refs.customData.listData);
+						if (this.isUpdate) {
+							updateOrder(postData).then(this.successFunc);
+						} else {
+							insertOrder(postData).then(this.successFunc);
+						}
+					} else {
+						this.loading = false;
+						return false;
+					}
+				});
+			},
+			successFunc(res) {
+				this.loading = false;
+				if (res.state) {
+					this.$message.success('操作成功');
+					this.$emit('callback', 'init');
+				}
+			}
+		},
+		components: {
+			upload,
+			customData
+		},
+	}
+</script>
+
+<style lang="scss"></style>

+ 195 - 0
virgo.wzfrontend/workark/src/components/work/oa/order/process.vue

@@ -0,0 +1,195 @@
+<template>
+	<div class="process-list">
+		<div class="process-box">
+			<div class="process-item" v-for="(item,index) in list" :key="index">
+				<div class="user-avatar-box">
+					<div class="user-avatar">{{index+1}}</div>
+					<div :class="'user-avatar-status '+ returnStatus(item.status).className">
+						<i :class="'iconfont '+returnStatus(item.status).icon"></i>
+					</div>
+				</div>
+				<div class="process-content">
+					<div class="user-name">
+						<div>{{item.operatorName}}</div>
+						<p v-if="item.status"><span>{{item.date}}</span></p>
+					</div>
+					<div class="user-content" v-if="item.remark">
+						<div class="remark">
+							{{item.remark}}
+						</div>
+						<div class="remark-file" v-if="item.attachment && item.attachment != '[]'">
+							<upload :list="item.attachment ? JSON.parse(item.attachment) : []" type="preview"></upload>
+						</div>
+					</div>
+				</div>
+				<div class="user-line" v-if="index < list.length-1"></div>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	import upload from '@/components/common/upload'
+	export default {
+		props: ['process'],
+		data() {
+			return {
+				list: [],
+				visible: false
+			}
+		},
+		mounted() {
+			this.list = this.process;
+		},
+		methods: {
+			returnStatus(state) {
+				let className = '',
+					icon = '';
+				switch (state) {
+					case 0:
+						className = 'info';
+						icon = 'huifont-jinhangzhong';
+						break;
+					case 1:
+						className = 'success'
+						icon = 'huifont-tongguo';
+						break;
+					case 2:
+						className = 'failed'
+						icon = 'huifont-a-butongguojujue';
+						break;
+					default:
+						className = 'info'
+						icon = 'huifont-jinhangzhong';
+						break;
+				}
+				return {
+					className: className,
+					icon: icon
+				};
+			}
+		},
+		watch: {
+			process() {
+				this.list = this.process;
+			}
+		},
+		components: {
+			upload
+		},
+	}
+</script>
+
+<style lang="scss">
+	.process-list {
+		padding: 10px;
+
+		.process-item {
+			position: relative;
+			display: flex;
+
+			.user-avatar-box {
+				position: relative;
+
+				.user-avatar {
+					width: 32px;
+					height: 32px;
+					background: $--color-primary;
+					border-radius: 50%;
+					margin-right: 10px;
+					margin-top: 8px;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					overprocess: hidden;
+					color: #fff;
+
+					i {
+						font-size: 20px;
+					}
+				}
+
+				.user-avatar-status {
+					width: 12px;
+					height: 12px;
+					border-radius: 50%;
+					border: 1px solid #fff;
+					position: absolute;
+					top: 30px;
+					right: 10px;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+
+					i {
+						font-size: 8px;
+						color: #fff;
+					}
+				}
+
+				.user-avatar-status.success {
+					background: $--color-success;
+				}
+
+				.user-avatar-status.failed {
+					background: $--color-danger;
+				}
+
+				.user-avatar-status.waiting {
+					background: $--color-warning;
+				}
+
+				.user-avatar-status.info {
+					background: #4C4F59;
+				}
+			}
+
+
+			.process-content {
+				flex: 1;
+				width: 0;
+
+
+				.user-name {
+					height: 48px;
+					display: flex;
+					flex-direction: column;
+					justify-content: center;
+
+					p {
+						font-size: 12px;
+						opacity: 0.6;
+						display: flex;
+						align-items: center;
+						justify-content: space-between;
+					}
+				}
+
+				.user-content {
+					background: $--background-color-base;
+					border-radius: 8px;
+					padding: 13px;
+
+					.remark {
+						font-size: 12px;
+						line-height: 17px;
+
+					}
+
+					.remark-file {
+						margin-top: 12px;
+					}
+				}
+			}
+
+			.user-line {
+				width: 1px;
+				border-left: 1px dashed #374156;
+				position: absolute;
+				top: 40px;
+				bottom: -8px;
+				left: 15px;
+			}
+		}
+	}
+</style>

+ 16 - 2
virgo.wzfrontend/workark/src/config/field.js

@@ -47,6 +47,19 @@ const announcementPriority = [{
 	id: 2,
 	name: '紧急'
 }]
+const orderType = [{
+	id: 1,
+	name: '运维工单'
+}, {
+	id: 2,
+	name: '维修工单'
+}, {
+	id: 3,
+	name: '保洁工单'
+}, {
+	id: 4,
+	name: '其它工单'
+}]
 const findItem = (type, id) => {
 	return eval(type).find(node => node.id == id) || {
 		id: 0,
@@ -58,8 +71,9 @@ export default {
 	field: {
 		sealType,
 		invoiceType,
-		announcementType,
-		announcementPriority
+		announcementType,
+		announcementPriority,
+		orderType
 	},
 	findTypeName(type, id) {
 		return findItem(type, id).name;

+ 9 - 2
virgo.wzfrontend/workark/src/router/modules/work/oa.js

@@ -1,4 +1,4 @@
-const organization = [{
+const oa = [{
 	path: 'oa/meeting',
 	component: () => import('@/views/work/oa/meeting/list'),
 	name: '会议纪要',
@@ -12,5 +12,12 @@ const organization = [{
 	meta: {
 		title: '会议设置'
 	}
+},{
+	path: 'oa/order',
+	component: () => import('@/views/work/oa/order/list'),
+	name: '工单管理',
+	meta: {
+		title: '工单管理'
+	}
 }]
-export default organization;
+export default oa;

+ 179 - 0
virgo.wzfrontend/workark/src/views/work/oa/order/list.vue

@@ -0,0 +1,179 @@
+<template>
+	<div class="hui-flex hui-content border-box">
+		<div class="hui-flex">
+			<div class="hui-content-title">
+				<div class="hui-title-item active">工单管理</div>
+			</div>
+			<div class="hui-flex-box hui-flex hui-table">
+				<list-filter type="order" @filter="filterInit"></list-filter>
+				<div class="hui-content-insert" v-permission="'/work/oa/order/add'">
+					<el-button type="primary" size="mini" @click="insert">
+						新增工单
+					</el-button>
+				</div>
+				<div class="hui-flex-box">
+					<el-table :data="tableData" row-key="id" height="100%" v-loading="loading">
+						<el-table-column label="序号" width="50">
+							<template slot-scope="scope">
+								<div style="text-align: center;">{{scope.$index + 1}}</div>
+							</template>
+						</el-table-column>
+						<el-table-column label="工单类型" width="200">
+							<template slot-scope="scope">
+								<span>{{$field.findTypeName('orderType',scope.row.workWay)}}</span>
+							</template>
+						</el-table-column>
+						<el-table-column label="工单名称" prop="name"></el-table-column>
+						<el-table-column label="工单摘要" prop="compendious"></el-table-column>
+						<el-table-column label="状态">
+							<template slot-scope="scope">
+								<div class="hui-table-tag">
+									<div class="hui-tag hui-tag-info" v-if="!scope.row.status">待提交</div>
+									<div class="hui-tag" v-else-if="scope.row.status === 1">待处理</div>
+									<div class="hui-tag hui-tag-warning" v-else-if="scope.row.status === 2">处理中</div>
+									<div class="hui-tag hui-tag-success" v-else>已处理</div>
+								</div>
+							</template>
+						</el-table-column>
+						<el-table-column label="操作" width="150">
+							<template slot-scope="scope">
+								<div class="hui-table-operation">
+									<span class="table-operation" v-permission="'/work/oa/order/detail'"
+										@click="detailItem(scope.row)">
+										详情
+									</span>
+									<span class="table-operation" v-permission="'/work/oa/order/update'"
+										v-if="!scope.row.status && scope.row.userId === user.userId"
+										@click="updateItem(scope.row)">
+										编辑
+									</span>
+									<span class="table-operation" v-permission="'/work/oa/order/delete'"
+										v-if="!scope.row.status && scope.row.userId === user.userId" @click="deleteItem(scope.row)">
+										删除
+									</span>
+								</div>
+							</template>
+						</el-table-column>
+						<template slot="empty">
+							<el-empty description="暂数据"></el-empty>
+						</template>
+					</el-table>
+				</div>
+				<div class="hui-content-pagination">
+					<el-pagination :page-size="pageSize" :pager-count="9" layout="prev, pager, next" :total="totalCount"
+						@current-change="currentChange" background>
+					</el-pagination>
+				</div>
+			</div>
+		</div>
+		<el-dialog :close-on-click-modal="false" :title="isUpdate?'编辑':'新增'" :visible.sync="visible" width="900px"
+			:append-to-body="true">
+			<edit v-if="visible" @callback="callback" :isUpdate="isUpdate" :detailId="detailId" :type="type"></edit>
+		</el-dialog>
+		<el-drawer title="工单详情" :visible.sync="drawer" :size="400" :append-to-body="true">
+			<detail v-if="drawer" :detailId="detailId" @callback="callback"></detail>
+		</el-drawer>
+	</div>
+</template>
+
+<script>
+	import edit from '@/components/work/oa/order/edit'
+	import detail from '@/components/work/oa/order/detail'
+	import listFilter from '@/components/common/listFilter'
+
+	import {
+		getOrderPageListByQuery,
+		deleteOrder
+	} from '@/api/oa'
+	export default {
+		data() {
+			return {
+				tableData: [],
+				currPage: 1,
+				pageSize: 10,
+				totalCount: 0,
+				detailId: '',
+				filterOption: {},
+				isUpdate: false,
+				visible: false,
+				type: 5,
+				drawer: false,
+				loading: false,
+				user: {}
+			}
+		},
+		mounted() {
+			this.user = this.$store.getters.user;
+			this.init();
+		},
+		methods: {
+			init() {
+				if (!this.auth('/work/oa/order/list')) return;
+				this.loading = true;
+				let postData = {
+					currPage: this.currPage,
+					pageSize: this.pageSize,
+					organizationId: this.$store.getters.organization.id,
+					projectId: this.$store.getters.project.id,
+					type: this.type
+				}
+				postData = Object.assign(postData, this.filterOption);
+				getOrderPageListByQuery(postData).then(res => {
+					if (res.state) {
+						this.tableData = res.data.dataList;
+						this.totalCount = res.data.totalCount;
+					}
+					this.loading = false;
+				})
+			},
+			filterInit(option) {
+				this.filterOption = option;
+				this.currPage = 1;
+				this.init();
+			},
+			insert() {
+				this.detailId = '';
+				this.isUpdate = false;
+				this.visible = true;
+			},
+			currentChange(currPage) {
+				this.currPage = currPage;
+				this.init();
+			},
+			detailItem(item) {
+				this.detailId = item.id;
+				this.drawer = true;
+			},
+			updateItem(item) {
+				this.detailId = item.id;
+				this.isUpdate = true;
+				this.visible = true;
+			},
+			deleteItem(item) {
+				this.$confirm('确定要删除该工单?', () => {
+					deleteOrder(item.id).then(res => {
+						if (res.state) {
+							this.$message({
+								type: 'success',
+								message: '操作成功'
+							})
+							this.init();
+						}
+					})
+				});
+			},
+			callback(type) {
+				if (type === 'init') this.init();
+				this.visible = false;
+			}
+		},
+		components: {
+			edit,
+			detail,
+			listFilter
+		},
+	}
+</script>
+
+<style>
+</style>