whx 1 月之前
父節點
當前提交
eea2eebc8f
共有 49 個文件被更改,包括 437 次插入156 次删除
  1. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/index.html
  2. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/css/2520.8144ea6e.css
  3. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/css/5387.0de04580.css
  4. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/css/703.30e7adf0.css
  5. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/1411.08776a19.js
  6. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/1654.4809e809.js
  7. 0 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/1682.750afd3f.js
  8. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/1966.0b459676.js
  9. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/2122.958d512d.js
  10. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/224.1055aa49.js
  11. 0 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/224.a42ccfe9.js
  12. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/244.2590393d.js
  13. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/2449.30966a43.js
  14. 0 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/2725.ffad5557.js
  15. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/2891.6cdd298a.js
  16. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/2925.48dd80ad.js
  17. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/3419.4017fe46.js
  18. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/3792.5b86d59c.js
  19. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/3983.a4314a95.js
  20. 0 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/5268.472d9edb.js
  21. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/5306.8b607d5b.js
  22. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/9539.46581874.js
  23. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/5499.bfe5010f.js
  24. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/5561.93878438.js
  25. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/6077.07fef7e4.js
  26. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/6364.794cbf47.js
  27. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/6466.9b14795c.js
  28. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/6636.3eede9e9.js
  29. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/3633.cbcc1c63.js
  30. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/7218.4e44e4e6.js
  31. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/7259.23e4fe4b.js
  32. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/7390.c83cc066.js
  33. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/7799.11c8b9d9.js
  34. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/7817.aa7182a4.js
  35. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/7883.a8426b02.js
  36. 0 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/8135.740af320.js
  37. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/8806.55d994f8.js
  38. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/892.76638aa1.js
  39. 0 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/9301.ae8b2235.js
  40. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/9607.7417bf99.js
  41. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/9640.e04ea215.js
  42. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/9708.21c8ebdf.js
  43. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/app.ac16116d.js
  44. 16 3
      virgo.wzfrontend/workark/src/components/common/customData.vue
  45. 7 1
      virgo.wzfrontend/workark/src/components/common/upload.vue
  46. 26 12
      virgo.wzfrontend/workark/src/components/work/system/serveSet/processForm.vue
  47. 233 23
      virgo.wzfrontend/workark/src/components/work/system/serveSet/processSet.vue
  48. 118 80
      virgo.wzfrontend/workark/src/components/work/system/serveSet/processSetItem.vue
  49. 1 1
      virgo.wzfrontend/workark/src/views/work/serve/list.vue

文件差異過大導致無法顯示
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/index.html


文件差異過大導致無法顯示
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/css/2520.8144ea6e.css


virgo.wzfrontend/src/main/resources/static/workark/static/css/9539.0de04580.css → virgo.wzfrontend/src/main/resources/static/workark/static/css/5387.0de04580.css


文件差異過大導致無法顯示
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/css/703.30e7adf0.css


文件差異過大導致無法顯示
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/1411.08776a19.js


文件差異過大導致無法顯示
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/1654.4809e809.js


文件差異過大導致無法顯示
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/1682.750afd3f.js


文件差異過大導致無法顯示
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/1966.0b459676.js


文件差異過大導致無法顯示
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/2122.958d512d.js


文件差異過大導致無法顯示
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/js/224.1055aa49.js


文件差異過大導致無法顯示
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/224.a42ccfe9.js


文件差異過大導致無法顯示
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/js/244.2590393d.js


文件差異過大導致無法顯示
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/2449.30966a43.js


文件差異過大導致無法顯示
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/2725.ffad5557.js


文件差異過大導致無法顯示
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/2891.6cdd298a.js


文件差異過大導致無法顯示
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/2925.48dd80ad.js


文件差異過大導致無法顯示
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/3419.4017fe46.js


文件差異過大導致無法顯示
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/3792.5b86d59c.js


文件差異過大導致無法顯示
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/js/3983.a4314a95.js


文件差異過大導致無法顯示
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/5268.472d9edb.js


文件差異過大導致無法顯示
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/5306.8b607d5b.js


文件差異過大導致無法顯示
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/9539.46581874.js


文件差異過大導致無法顯示
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/5499.bfe5010f.js


文件差異過大導致無法顯示
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/5561.93878438.js


文件差異過大導致無法顯示
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/6077.07fef7e4.js


文件差異過大導致無法顯示
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/js/6364.794cbf47.js


文件差異過大導致無法顯示
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/6466.9b14795c.js


文件差異過大導致無法顯示
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/6636.3eede9e9.js


文件差異過大導致無法顯示
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/3633.cbcc1c63.js


文件差異過大導致無法顯示
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/7218.4e44e4e6.js


文件差異過大導致無法顯示
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/7259.23e4fe4b.js


文件差異過大導致無法顯示
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/7390.c83cc066.js


文件差異過大導致無法顯示
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/js/7799.11c8b9d9.js


文件差異過大導致無法顯示
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/7817.aa7182a4.js


文件差異過大導致無法顯示
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/7883.a8426b02.js


文件差異過大導致無法顯示
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/8135.740af320.js


文件差異過大導致無法顯示
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/8806.55d994f8.js


文件差異過大導致無法顯示
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/892.76638aa1.js


文件差異過大導致無法顯示
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/9301.ae8b2235.js


文件差異過大導致無法顯示
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/9607.7417bf99.js


文件差異過大導致無法顯示
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/9640.e04ea215.js


文件差異過大導致無法顯示
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/js/9708.21c8ebdf.js


文件差異過大導致無法顯示
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/app.ac16116d.js


+ 16 - 3
virgo.wzfrontend/workark/src/components/common/customData.vue

@@ -13,6 +13,10 @@
 						<el-date-picker v-else-if="node.type === 'yearDate'" v-model="item[node.value]" type="year"
 							value-format="yyyy" placeholder="选择年">
 						</el-date-picker>
+						<div class="file-upload-box" v-else-if="node.type === 'file'">
+							<upload v-model="item[node.value]" type="insert" accept="*" :maxLen="1" text="上传文件">
+							</upload>
+						</div>
 						<el-input :type="node.type" v-model="item[node.value]" v-else></el-input>
 						<div class="td-icon" @click="deleteRow(index)" v-if="i === option.length-1">
 							<i class="iconfont huifont-guanbi"></i>
@@ -33,7 +37,11 @@
 </template>
 
 <script>
+	const upload = () => import('@/components/common/upload');
 	export default {
+		components: {
+			upload
+		},
 		props: {
 			list: {
 				type: Array,
@@ -116,6 +124,11 @@
 			display: flex;
 			align-items: center;
 
+			.file-upload-box {
+				flex: 1;
+				width: 0;
+			}
+
 			.el-input {
 				flex: 1;
 				width: 0;
@@ -125,13 +138,13 @@
 			.td-icon {
 				width: 20px;
 				height: 20px;
-				background:  $--color-danger;
+				background: $--color-danger;
 				border-radius: 10px;
-				border: 1px solid  $--color-danger;
+				border: 1px solid $--color-danger;
 				text-align: center;
 				line-height: 16px;
 				margin-left: 12px;
-				color:  $--color-white;
+				color: $--color-white;
 				cursor: pointer;
 			}
 

+ 7 - 1
virgo.wzfrontend/workark/src/components/common/upload.vue

@@ -101,6 +101,10 @@
 			fileSize: {
 				type: Number,
 				default: 0
+			},
+			value: {
+				type: String,
+				default: ''
 			}
 		},
 		data() {
@@ -120,6 +124,7 @@
 		mounted() {
 			this.headers.token = getToken();
 			this.fileList = JSON.parse(JSON.stringify(this.list));
+			if (this.value) this.fileList = JSON.parse(this.value);
 		},
 		methods: {
 			beforeUpload(file) {
@@ -149,6 +154,7 @@
 					url: data.node.url,
 					type: typeList[typeList.length - 1]
 				});
+				this.$emit('input', JSON.stringify(this.fileList));
 				this.$loading.close();
 			},
 			errorFile() {
@@ -268,7 +274,7 @@
 			.common-update-button-label {
 				font-size: 14px;
 				line-height: 20px;
-				padding-top: 10px;
+				padding-top: 10px;
 				color: $--color-text-secondary;
 			}
 		}

+ 26 - 12
virgo.wzfrontend/workark/src/components/work/system/serveSet/processForm.vue

@@ -2,13 +2,15 @@
 	<div class="hui-flex hui-dialog">
 		<div class="hui-flex-box hui-dialog-content">
 			<el-form :model="departmentForm" label-position="top">
-				<el-form-item label="过程排序(数字由小到大排序)">
-					<el-input type="text" v-model="departmentForm.sequence" placeholder="请输入过程排序"></el-input>
+				<el-form-item :label="`${titleContent}排序(数字由小到大排序)`">
+					<el-input type="text" v-model="departmentForm.sequence"
+						:placeholder="`请输入${titleContent}序号`"></el-input>
 				</el-form-item>
-				<el-form-item label="过程名称">
-					<el-input type="text" v-model="departmentForm.name" placeholder="请输入过程名称"></el-input>
+				<el-form-item :label="`${titleContent}名称`">
+					<el-input type="text" v-model="departmentForm.name"
+						:placeholder="`请输入${titleContent}名称`"></el-input>
 				</el-form-item>
-				<el-form-item label="是否可添加附件">
+				<el-form-item label="是否可添加附件" v-if="departmentForm.type !== 3">
 					<el-radio-group v-model="departmentForm.type">
 						<el-radio :label="0">无操作</el-radio>
 						<el-radio :label="1">添加附件</el-radio>
@@ -26,10 +28,15 @@
 						placeholder="请输入付款金额">
 					</el-input>
 				</el-form-item>
-				<el-form-item label="过程备注" class="hui-textarea">
-					<el-input type="textarea" v-model="departmentForm.remark" placeholder="请输入过程备注" resize="none">
+				<el-form-item :label="`${titleContent}描述`" class="hui-textarea">
+					<el-input type="textarea" v-model="departmentForm.remark" :placeholder="`请输入${titleContent}描述`"
+						resize="none">
 					</el-input>
 				</el-form-item>
+				<el-form-item label="示例文件" class="hui-textarea" v-if="departmentForm.type === 3">
+					<upload v-model="departmentForm.example" type="insert" accept="*" text="上传示例文件" :maxLen="5">
+					</upload>
+				</el-form-item>
 			</el-form>
 		</div>
 		<div class="hui-dialog-submit">
@@ -48,9 +55,12 @@
 		updateProcessSetData,
 		updateProcessData
 	} from '@/api/system'
-
+	const upload = () => import('@/components/common/upload');
 	export default {
-		props: ['isUpdate', 'itemId', 'partId', 'type'],
+		props: ['isUpdate', 'itemId', 'partId', 'type', 'parent'],
+		components: {
+			upload
+		},
 		data() {
 			return {
 				departmentForm: {
@@ -60,14 +70,18 @@
 					parentId: -1,
 					roleId: 1,
 					type: 0,
-					totalFee: 0
+					totalFee: 0,
+					example: ''
 				},
-				departmentRuler: {},
 				loading: false,
-				showPictures: []
+				titleContent: '过程'
 			}
 		},
 		mounted() {
+			if (this.parent && this.parent.type === 1) {
+				this.departmentForm.type = 3;
+				this.titleContent = '文件';
+			}
 			if (this.isUpdate) {
 				if (this.type === 'model') {
 					getProcessSetDataById(this.itemId).then(this.initSuccess);

+ 233 - 23
virgo.wzfrontend/workark/src/components/work/system/serveSet/processSet.vue

@@ -1,10 +1,24 @@
 <template>
 	<div :class="'process-set '+type" v-loading="loading">
-		<process-set-item :list="list" :type="operationType" :roleType="roleType"></process-set-item>
+		<div class="process-top">
+			<div class="top-item" :class="returnItemClass(item)" v-for="(item,index) in list" :ket="index"
+				@click="clickItem(item)">
+				<span>{{index+1}}</span>、<span>{{item.name}}</span>
+			</div>
+		</div>
+		<div class="set-process-box">
+			<process-set-item :list="nowTitle.children" :type="operationType" :roleType="roleType"
+				v-if="nowTitle.children.length>0"></process-set-item>
+			<div v-else>
+				<div v-if="(nowTitle.status === 1 || nowTitle.status === 4) && roleType === 2">
+					<el-button size="mini" type="primary" @click="updateStatus(nowTitle,3)">通过</el-button>
+				</div>
+			</div>
+		</div>
 		<el-dialog :close-on-click-modal="false" :title="isUpdate?'编辑':'新增'" :visible.sync="visible" width="800px"
 			:append-to-body="true">
 			<process-form v-if="visible" @callback="callback" :isUpdate="isUpdate" :itemId="itemId" :type="type"
-				:partId="part.id">
+				:partId="part.id" :parent="parent">
 			</process-form>
 		</el-dialog>
 	</div>
@@ -32,7 +46,9 @@
 				itemId: '',
 				visible: false,
 				isUpdate: false,
-				childList: []
+				childList: [],
+				nowTitle: {},
+				parent: {}
 			}
 		},
 		mounted() {
@@ -52,12 +68,39 @@
 					this.list = res.data;
 					this.childList = [];
 					this.updateParentStatus(this.list);
+					if (this.list.length > 0) {
+						let arr = this.list.filter(node => node.status === 1 || node.status === 2 || node.status === 4);
+						this.nowTitle = arr.length > 0 ? arr[0] : this.list[0];
+					}
 				}
 				this.loading = false;
 			},
+			clickItem(item) {
+				this.nowTitle = item;
+			},
+			returnItemClass(item, node) {
+				let str = ''
+				switch (item.status) {
+					case 1:
+					case 2:
+						str = 'waiting'
+						break;
+					case 3:
+						str = 'success'
+						break;
+					case 4:
+						str = 'error'
+						break;
+					default:
+						str = 'info'
+						break;
+				}
+				return str;
+			},
 			edit() {
 				let data = this.$store.getters.processSet;
 				this.itemId = data.id;
+				this.parent = data.parent;
 				switch (data.type) {
 					case 'insert':
 						this.visible = true;
@@ -74,6 +117,17 @@
 						break;
 				}
 			},
+			updateStatus(item, status) {
+				updateProcessStatus(status, item.id).then(res => {
+					if (res.state) {
+						this.$message.success('操作成功');
+						this.$store.dispatch('app/changeProcessSet', {
+							type: 'reload',
+							id: item.id
+						});
+					}
+				})
+			},
 			deleteDepartment() {
 				this.$confirm('确定要删除该过程?', () => {
 					if (this.type === 'model') {
@@ -108,30 +162,46 @@
 					}
 				})
 			},
+			removeType3Objects(arr) {
+				// 过滤当前层级中type不为3的对象,并处理子级
+				return arr
+					.filter(obj => obj.type !== 3)
+					.map(obj => {
+						// 创建新对象以避免修改原对象
+						const newObj = {
+							...obj
+						};
+						// 如果存在子数组(假设子数组属性名为children),递归处理
+						if (Array.isArray(newObj.children)) {
+							newObj.children = this.removeType3Objects(newObj.children);
+						}
+						return newObj;
+					});
+			},
 			updateParentStatus(nodes) {
 				nodes.forEach(node => {
-					// 递归处理子节点
-					if (node.children && node.children.length > 0) {
-						this.updateParentStatus(node.children); // 先处理子节点
-						// 获取所有子节点的 status
-						const childStatusList = node.children.map(child => child.status);
-						// 判断条件优先级:4 > 1/2 > 3
-						if (childStatusList.some(status => status === 4)) {
-							node.status = 4;
-						} else if (childStatusList.some(status => status === 1 || status === 2)) {
-							node.status = 1;
-						} else if (childStatusList.every(status => status === 3)) {
-							node.status = 3;
-						} else if (childStatusList.some(status => status === 3)) {
-							node.status = 1;
+					if (node.type !== 3) {
+						// 递归处理子节点
+						let children = !node.children ? [] : node.children.filter(item => item.type != 3);
+						if (children.length > 0) {
+							this.updateParentStatus(node.children); // 先处理子节点
+							// 获取所有子节点的 status
+							const childStatusList = node.children.map(child => child.status);
+							// 判断条件优先级:4 > 1/2 > 3
+							if (childStatusList.some(status => status === 4)) {
+								node.status = 4;
+							} else if (childStatusList.some(status => status === 1 || status === 2)) {
+								node.status = 1;
+							} else if (childStatusList.every(status => status === 3)) {
+								node.status = 3;
+							} else if (childStatusList.some(status => status === 3)) {
+								node.status = 1;
+							}
+						} else {
+							this.childList.push(node);
 						}
-					} else {
-						this.childList.push(node);
 					}
 				});
-			},
-			getNextNode() {
-
 			}
 		},
 		computed: {
@@ -172,6 +242,110 @@
 	.process-set {
 		padding: 15px;
 
+		.set-process-box {
+			padding-top: 15px;
+		}
+
+		.process-top {
+			display: flex;
+			white-space: nowrap;
+
+			.top-item {
+				padding: 0 15px;
+				line-height: 36px;
+				background: #ebecf0;
+				position: relative;
+				margin-right: 35px;
+				font-weight: 500;
+				cursor: pointer;
+
+				&:after {
+					content: "";
+					width: 0;
+					height: 0;
+					position: absolute;
+					right: -36px;
+					top: 0;
+					border: solid 18px transparent;
+					border-left-color: #ebecf0;
+				}
+
+				&:not(:first-child):before {
+					content: "";
+					width: 0;
+					height: 0;
+					position: absolute;
+					left: -28px;
+					top: 0;
+					border: solid 18px transparent;
+					border-top-color: #ebecf0;
+					border-right-color: #ebecf0;
+					border-bottom-color: #ebecf0;
+				}
+
+				&:hover,
+				&.active {
+					background: $--color-primary;
+					color: #fff;
+
+					&:after {
+						border-left-color: $--color-primary;
+					}
+
+					&:not(:first-child):before {
+						border-top-color: $--color-primary;
+						border-right-color: $--color-primary;
+						border-bottom-color: $--color-primary;
+					}
+				}
+
+				&.success {
+					background: $--color-success;
+					color: #fff;
+
+					&:after {
+						border-left-color: $--color-success;
+					}
+
+					&:not(:first-child):before {
+						border-top-color: $--color-success;
+						border-right-color: $--color-success;
+						border-bottom-color: $--color-success;
+					}
+				}
+
+				&.waiting {
+					background: $--color-warning;
+					color: #fff;
+
+					&:after {
+						border-left-color: $--color-warning;
+					}
+
+					&:not(:first-child):before {
+						border-top-color: $--color-warning;
+						border-right-color: $--color-warning;
+						border-bottom-color: $--color-warning;
+					}
+				}
+
+				&.error {
+					background: $--color-danger;
+					color: #fff;
+
+					&:after {
+						border-left-color: $--color-danger;
+					}
+
+					&:not(:first-child):before {
+						border-top-color: $--color-danger;
+						border-right-color: $--color-danger;
+						border-bottom-color: $--color-danger;
+					}
+				}
+			}
+		}
+
 		&.model {
 			width: 100%;
 			height: 100%;
@@ -179,7 +353,9 @@
 		}
 
 		&.product {
+			width: 100%;
 			min-height: 300px;
+			overflow-x: auto;
 		}
 
 		.process-set-item {
@@ -200,9 +376,31 @@
 
 		.operation-button {
 			border-top: 1px solid $--border-color-light;
-			text-align: right;
 			padding-top: 10px;
 			margin-top: 10px;
+			display: flex;
+			justify-content: end;
+
+			.operation-button-item {
+				padding: 2px 10px;
+				font-size: 16px;
+				color: #fff;
+				cursor: pointer;
+				border-radius: 4px;
+				margin-left: 5px;
+
+				&:hover {
+					opacity: 0.8;
+				}
+
+				&.success {
+					background: $--color-success;
+				}
+
+				&.warning {
+					background: $--color-warning;
+				}
+			}
 		}
 
 		.operation-buttons {
@@ -248,6 +446,10 @@
 			align-items: center;
 			justify-content: center;
 
+			.el-icon-success {
+				font-size: 20px;
+			}
+
 			&.info {
 				background: rgba(144, 157, 143, 0.4);
 
@@ -270,6 +472,10 @@
 				.process-set-state-2 {
 					background: rgba(255, 125, 0, 0.6);
 				}
+
+				.el-icon-success {
+					color: rgba(255, 125, 0, 1);
+				}
 			}
 
 			&.success {
@@ -295,6 +501,10 @@
 					background: rgba(245, 63, 63, 0.6);
 				}
 			}
+
+			&.state-last {
+				background: #fff;
+			}
 		}
 
 		.process-set-state-1 {

+ 118 - 80
virgo.wzfrontend/workark/src/components/work/system/serveSet/processSetItem.vue

@@ -1,91 +1,131 @@
 <template>
-	<div>
+	<div class="set-item-box">
 		<div class="process-set-item" v-for="(item,index) in list" :key="item.id">
+			<!-- 状态 -->
 			<div :class="'process-set-state ' + returnItemClass(item)">
 				<div class="process-set-state-2">
 					<div class="process-set-state-1"></div>
 				</div>
 			</div>
+			<!-- line -->
 			<div :class="'line line-top ' + returnItemClass(item)" v-if="index > 0"></div>
 			<div :class="'line line-bottom ' + returnItemClass(item)" v-if="index < list.length-1 || type === 'edit'">
 			</div>
+			<!-- 标题 -->
 			<div class="process-item-title">
 				<span class="label">{{index+1}}.{{item.name}}</span>
 				<i class="el-icon-edit-outline color-primary" v-if="type === 'edit'"
 					@click="edit('update', item.id)"></i>
 				<i class="el-icon-delete color-danger" v-if="type === 'edit'" @click="edit('delete', item.id)"></i>
 			</div>
-			<!-- 可附件 -->
-			<div v-if="item.type === 1">
-				<div v-if="(item.status === 1 || item.status === 4) && item.roleId === roleType">
-					<upload ref="upload" :list="!item.attachmentContent?[]:JSON.parse(item.attachmentContent)"
-						type="edit" text="上传文件" accept="*">
-					</upload>
-					<div class="operation-button">
-						<el-button size="mini" @click="submit(item)">保存草稿</el-button>
-						<el-button size="mini" type="primary" @click="submit(item, 2)">提交</el-button>
+			<!-- 内容 -->
+			<div class="process-item-content" v-if="item.children">
+				<!-- 附件 -->
+				<div v-if="item.type === 1">
+					<div class="process-set-item" v-for="(node,index) in item.children" :key="node.id">
+						<!-- 状态 -->
+						<div :class="'process-set-state ' + returnItemClass(item,node)">
+							<div class="process-set-state-2">
+								<div class="process-set-state-1"></div>
+							</div>
+						</div>
+						<!-- 标题 -->
+						<div class="process-item-title">
+							<span class="label">{{node.name}}</span>
+							<i class="el-icon-edit-outline color-primary" v-if="type === 'edit'"
+								@click="edit('update', node.id)">
+							</i>
+							<i class="el-icon-delete color-danger" v-if="type === 'edit'"
+								@click="edit('delete', node.id)">
+							</i>
+						</div>
+						<!-- 内容 -->
+						<div class="process-item-content" v-if="node.children">
+							<!-- 可附件 -->
+							<div v-if="(item.status === 1 || item.status === 4) && item.roleId === roleType">
+								<upload ref="upload" v-model="node.attachmentContent" type="edit" text="上传文件"
+									accept="*">
+								</upload>
+							</div>
+							<div v-else-if="item.status === 2 && roleType === 2">
+								<upload v-model="node.attachmentContent"></upload>
+								<div class="operation-button" v-if="node.status !== 3 && node.status !== 4">
+									<div class="operation-button-item success" @click="updateStatus(node,3)">
+										<i class="el-icon-check"></i>
+									</div>
+									<div class="operation-button-item warning" @click="updateStatus(node,4)">
+										<i class="el-icon-close"></i>
+									</div>
+								</div>
+							</div>
+							<!-- 展示 -->
+							<div v-else-if="item.status !== 1 && node.attachmentContent">
+								<upload v-model="node.attachmentContent">
+								</upload>
+							</div>
+						</div>
 					</div>
-				</div>
-				<div v-else-if="item.status === 2 && roleType === 2">
-					<upload :list="!item.attachmentContent ? [] : JSON.parse(item.attachmentContent)">
-					</upload>
-					<div class="operation-button">
-						<el-button size="mini" type="primary" @click="updateStatus(item,3)">通过</el-button>
-						<el-button size="mini" type="danger" @click="updateStatus(item,4)">不通过</el-button>
+					<div class="operation-button"
+						v-if="(item.status === 1 || item.status === 4) && item.roleId === roleType">
+						<el-button size="mini" @click="fileSubmit(item)">保存草稿</el-button>
+						<el-button size="mini" type="primary" @click="fileSubmit(item, 2)">提交</el-button>
 					</div>
-				</div>
-				<!-- 展示 -->
-				<div v-else-if="item.status !== 1 && item.attachmentContent">
-					<upload :list="!item.attachmentContent ? [] : JSON.parse(item.attachmentContent)">
-					</upload>
-				</div>
-			</div>
-			<!-- 可付款 -->
-			<div v-else-if="item.type === 2">
-				<div v-if="(item.status === 1 || item.status === 4) && item.roleId === roleType">
-					<div>
-						<span>待付款</span>
-						<span class="color-danger">¥</span>
-						<span class="color-danger">{{item.totalFee}}</span>
+					<div class="operation-button" v-else-if="item.status === 2 && roleType === 2">
+						<el-button size="mini" type="primary" @click="updateStatus(item,3)">通过</el-button>
 					</div>
-					<div class="operation-button">
-						<el-button size="mini" type="primary" @click="payment(item)">确认付款</el-button>
+					<!-- 新增 -->
+					<div class="process-set-insert" @click="edit('insert', item.id)" v-if="type === 'edit'">
+						新增
 					</div>
 				</div>
-				<!-- 展示 -->
-				<div v-else-if="item.type === 2 && item.status === 3">
-					<div class="hui-state">
-						<div class="hui-state-bage hui-state-success"></div>
-						<div class="hui-state-label">
-							<span>已支付</span>
-							<span class="color-success">¥</span>
-							<span class="color-success">{{item.totalFee}}</span>
+				<!-- 可付款 -->
+				<div v-else-if="item.type === 2">
+					<div v-if="(item.status === 1 || item.status === 4) && item.roleId === roleType">
+						<div>
+							<span>待付款</span>
+							<span class="color-danger">¥</span>
+							<span class="color-danger">{{item.totalFee}}</span>
+						</div>
+						<div class="operation-button">
+							<el-button size="mini" type="primary" @click="payment(item)">确认付款</el-button>
 						</div>
 					</div>
-					<div v-if="roleType === 1 && item.payStatus === '支付成功'">
-						<span class="color-primary" v-if="!item.invoice" @click="applyInvoice(item)">
-							开具发票
-						</span>
-						<span class="color-warning" v-else-if="!item.invoice.state">发票开具中</span>
-						<span class="color-success" style="cursor: pointer;" v-else @click="lookOrder(item)">
-							查看发票
-						</span>
+					<!-- 展示 -->
+					<div v-else-if="item.type === 2 && item.status === 3">
+						<div class="hui-state">
+							<div class="hui-state-bage hui-state-success"></div>
+							<div class="hui-state-label">
+								<span>已支付</span>
+								<span class="color-success">¥</span>
+								<span class="color-success">{{item.totalFee}}</span>
+							</div>
+						</div>
+						<div v-if="roleType === 1 && item.payStatus === '支付成功'">
+							<span class="color-primary" v-if="!item.invoice" @click="applyInvoice(item)">
+								开具发票
+							</span>
+							<span class="color-warning" v-else-if="!item.invoice.state">发票开具中</span>
+							<span class="color-success" style="cursor: pointer;" v-else @click="lookOrder(item)">
+								查看发票
+							</span>
+						</div>
 					</div>
 				</div>
-			</div>
-			<!-- 不可添加附件 -->
-			<div v-else-if="item.children.length === 0">
-				<div class="operation-buttons" v-if="(item.status === 1 || item.status === 4) && roleType === 2">
-					<el-button size="mini" type="primary" @click="updateStatus(item,3)">通过</el-button>
-					<el-button size="mini" type="danger" @click="updateStatus(item,4)">不通过</el-button>
+				<!-- 不可添加附件 -->
+				<div v-else-if="item.children.length === 0">
+					<div class="operation-buttons" v-if="(item.status === 1 || item.status === 4) && roleType === 2">
+						<el-button size="mini" type="primary" @click="updateStatus(item,3)">通过</el-button>
+					</div>
 				</div>
-			</div>
-			<div class="process-item-content" v-if="item.children">
-				<process-set-item :list="item.children" :type="type" :parentId="item.id" :roleType="roleType">
+				<process-set-item v-else :list="item.children" :type="type" :parent="item" :roleType="roleType">
 				</process-set-item>
 			</div>
 		</div>
-		<div class="process-set-insert" @click="edit('insert', parentId || -1)" v-if="type === 'edit'">新增</div>
+		<!-- 新增 -->
+		<div class="process-set-insert" @click="edit('insert', parent ? parent.id : -1, parent)"
+			v-if="type === 'edit' && (parent ? (parent.type != 3 && parent.type != 2) : true)">
+			新增
+		</div>
 		<el-dialog :close-on-click-modal="false" title="支付订单" :visible.sync="dialogVisible" width="600px"
 			:append-to-body="true">
 			<pay-order v-if="dialogVisible" :orderNo="nowItem.proceOrderNo" @callback="callback"></pay-order>
@@ -114,7 +154,7 @@
 		updateProcessStatus
 	} from '@/api/system'
 	export default {
-		props: ['list', 'type', 'parentId', 'roleType'],
+		props: ['list', 'type', 'parent', 'roleType'],
 		data() {
 			return {
 				nowItem: {},
@@ -136,15 +176,15 @@
 				this.nowItem = item;
 				this.drawer = true;
 			},
-			payment(item) {
-				console.log(item);
+			payment(item) {
 				this.nowItem = item;
 				if (!item.proceOrderNo || item.payStatus === '超时已关闭') return this.applyInvoice(item, 2);
 				this.dialogVisible = true;
 			},
-			returnItemClass(item) {
+			returnItemClass(item, node) {
 				let str = '';
-				switch (item.status) {
+				let status = node ? (item.status > node.status ? item.status : node.status) : item.status;
+				switch (status) {
 					case 1:
 					case 2:
 						str = 'waiting'
@@ -161,29 +201,27 @@
 				}
 				return str;
 			},
-			edit(type, id) {
+			edit(type, id, parent) {
 				this.$store.dispatch('app/changeProcessSet', {
 					type,
-					id
+					id,
+					parent
 				});
 			},
+			async fileSubmit(item, status) {
+				if (status) updateProcessStatus(status, item.id);
+				for (let i = 0; i < item.children.length; i++) {
+					await this.submit(item.children[i])
+				}
+				this.$message.success('操作成功');
+			},
 			submit(item, status) {
-				if (!this.$refs.upload) return;
-				if (this.$refs.upload[0].fileList.length === 0) return this.$message.warning('至少上传一个文件');
 				let data = {
 					id: item.id,
-					sequence: item.sequence
+					sequence: item.sequence,
+					attachmentContent: item.attachmentContent
 				};
-				data['attachmentContent'] = JSON.stringify(this.$refs.upload[0].fileList);
-				updateProcessData(data).then(res => {
-					if (res.state) {
-						if (status) {
-							this.updateStatus(item, status);
-						} else {
-							this.$message.success('操作成功');
-						}
-					}
-				})
+				return updateProcessData(data);
 			},
 			updateStatus(item, status) {
 				updateProcessStatus(status, item.id).then(res => {
@@ -198,7 +236,7 @@
 				if (type === 'payState') {
 					if (operationType === 'success') this.updateStatus(this.nowItem, 3);
 				}
-				if (type === 'init') this.edit('reload');
+				if (type === 'init') this.edit('reload');
 				if (type === 'reload') this.edit('reload');
 			}
 		},

+ 1 - 1
virgo.wzfrontend/workark/src/views/work/serve/list.vue

@@ -84,7 +84,7 @@
 				</el-pagination>
 			</div>
 		</div>
-		<el-drawer :title=" type === 1?'订单详情':'发票详情'" :visible.sync="drawer" :size="400" :append-to-body="true">
+		<el-drawer :title=" type === 1?'订单详情':'发票详情'" :visible.sync="drawer" :size="800" :append-to-body="true">
 			<detail v-if="drawer && type === 1" :detailId="detailId" :type="nowTitle.id" @callback="callback"></detail>
 			<invoice-detail v-if="drawer && type === 2" :detailId="detailId"></invoice-detail>
 		</el-drawer>