Browse Source

fix: 调整提交申请 修改自定义local_name 唯一key

lanceJiang 1 năm trước cách đây
mục cha
commit
05ee76382f

+ 6 - 1
src/views/approve/components/config.ts

@@ -1,16 +1,21 @@
-type ModelContentConfig = {
+export type ModelContentConfig = {
+	// 唯一key
+	nodeKey: string
 	nodeName: string
 	type: number
+	setType: number
 	local_status?: string // 填充自定义状态
 	p_nodeNames?: string[] // 填充自定义状态
 	childNode: ModelContentConfig | null
 	lastNode_local_status?: string // 结束标记状态标记
 	conditionNodes?: {
+		nodeKey: string
 		nodeName: string
 		local_status?: string // 填充自定义状态
 		conditionList: any[]
 		childNode: ModelContentConfig
 	}[]
+	[key: string]: any
 }
 type RenderNodes = {
 	[key: string]: 0 | 1 // 0已执行 1执行中

+ 36 - 43
src/views/approve/launch/ItemDrawer.vue

@@ -18,37 +18,37 @@
 			<el-timeline class="timeline-wrap">
 				<el-timeline-item v-for="(v, index) in processTimelineList" :key="index">
 					<template v-if="v.conditionNodes">
-						<el-radio-group v-model="processChecked[v.local_name]" size="small">
-							<el-radio-button v-for="c of v.conditionNodes" :key="c.local_name" :label="c.local_name">{{ c.nodeName }}</el-radio-button>
+						<el-radio-group v-model="processChecked[v.nodeKey]" size="small">
+							<el-radio-button v-for="c of v.conditionNodes" :key="c.nodeKey" :label="c.nodeKey">{{ c.nodeName }}</el-radio-button>
 						</el-radio-group>
 					</template>
 					<template v-else>
 						<div style="padding-bottom: 6px">{{ v.nodeName }}</div>
-						<div v-if="assigneeMap[v.local_name]" style="display: flex; align-items: center; gap: 6px; flex-wrap: wrap">
-							<template v-if="assigneeMap[v.local_name].type === 1">
-								<el-tooltip v-if="!assigneeMap[v.local_name].disabled" content="添加用户" placement="left">
-									<el-button style="width: 32px" @click="selectHandler(v.local_name, 1)">
+						<div v-if="assigneeMap[v.nodeKey]" style="display: flex; align-items: center; gap: 6px; flex-wrap: wrap">
+							<template v-if="assigneeMap[v.nodeKey].type === 1">
+								<el-tooltip v-if="!assigneeMap[v.nodeKey].disabled" content="添加用户" placement="left">
+									<el-button style="width: 32px" @click="selectHandler(v.nodeKey, 1)">
 										<svg-icon style="font-size: 18px" icon-class="flow-user-add" />
 									</el-button>
 								</el-tooltip>
-								<FlowNodeAvatar v-for="(item, index) in assigneeMap[v.local_name].assignees" :key="index" :name="item.name" style="margin-top: 5px" />
+								<FlowNodeAvatar v-for="(item, index) in assigneeMap[v.nodeKey].assignees" :key="index" :name="item.name" style="margin-top: 5px" />
 							</template>
 							<template v-else>
-								<el-tooltip v-if="!assigneeMap[v.local_name].disabled" content="添加角色" placement="left">
-									<el-button style="width: 32px" @click="selectHandler(v.local_name, 3)">
+								<el-tooltip v-if="!assigneeMap[v.nodeKey].disabled" content="添加角色" placement="left">
+									<el-button style="width: 32px" @click="selectHandler(v.nodeKey, 3)">
 										<svg-icon style="font-size: 18px" icon-class="flow-group-add" />
 									</el-button>
 								</el-tooltip>
-								<FlowNodeAvatar v-for="(item, index) in assigneeMap[v.local_name].assignees" :key="index" :name="item.name" style="margin-top: 5px">
+								<FlowNodeAvatar v-for="(item, index) in assigneeMap[v.nodeKey].assignees" :key="index" :name="item.name" style="margin-top: 5px">
 									<template #avatar>
 										<svg-icon icon-class="flow-group" color="#fff" />
 									</template>
 								</FlowNodeAvatar>
 							</template>
 						</div>
-						<div v-else-if="assigneeDesc[v.local_name]">
+						<div v-else-if="assigneeDesc[v.nodeKey]">
 							<!-- 没有assigneeMap 的情况下 尝试获取描述 -->
-							<el-tag>{{ assigneeDesc[v.local_name] }}</el-tag>
+							<el-tag>{{ assigneeDesc[v.nodeKey] }}</el-tag>
 						</div>
 					</template>
 				</el-timeline-item>
@@ -76,6 +76,7 @@ import { ElMessage } from 'element-plus'
 import UseSelect from '@/components/scWorkflow/select.vue'
 import FlowNodeAvatar from '@/components/Flow/FlowNodeAvatar.vue'
 import { setTypeOptions_config } from '@/components/scWorkflow/nodes/config'
+import type { ModelContentConfig } from '@/views/approve/components/config.ts'
 const { VITE_APP_BASE_API } = import.meta.env
 const uploadFileApi = ref(`${VITE_APP_BASE_API}/v1/oss/upload`)
 const EReditorRef = ref()
@@ -112,12 +113,12 @@ const updateActive_assigneeMap = (assignees: any[]) => {
 		_cur.assignees = assignees
 	}
 }
-const selectHandler = (local_name: string, type: 1 | 3) => {
-	if (!assigneeMap.value[local_name]) {
-		assigneeMap.value[local_name] = { assignees: [], type }
+const selectHandler = (nodeKey: string, type: 1 | 3) => {
+	if (!assigneeMap.value[nodeKey]) {
+		assigneeMap.value[nodeKey] = { assignees: [], type }
 	}
-	const config = assigneeMap.value[local_name]
-	active_assigneeKey.value = local_name
+	const config = assigneeMap.value[nodeKey]
+	active_assigneeKey.value = nodeKey
 	active_selectOpts.value = config.selectOpts || {}
 	useSelectRef.value.open(type, config.assignees)
 }
@@ -141,14 +142,14 @@ const onSubmit = async () => {
 			let processForm = JSON.parse(cur_processForm_str)
 			processForm = { ...processForm, formData }
 			const _assigneeMap = assigneeMap.value
-			const assigneeMap_ = Object.keys(_assigneeMap).reduce((obj, key) => {
-				const _o = _assigneeMap[key]
-				obj[key] = {
+			const assigneeMap_ = Object.keys(_assigneeMap).reduce((obj, nodeKey: string) => {
+				const _o = _assigneeMap[nodeKey]
+				obj[nodeKey] = {
 					assigneeList: _o.assignees,
 					type: _o.type
 				}
 				return obj
-			}, {})
+			}, {} as { [nodeKey: string]: any })
 			model
 				.processLaunchApi({
 					processId, // 流程ID
@@ -168,45 +169,37 @@ const onSubmit = async () => {
 
 // 当前form 表单数据字符串
 let cur_processForm_str = '{}'
-const processChecked = reactive<{ [key: string]: any }>({})
-const modelContentConfig = ref({})
-const packageProcess = (data, list = [], levelIdx = 0) => {
+const processChecked = reactive<{ [nodeKey: string]: any }>({})
+const modelContentConfig = ref<ModelContentConfig | any>({})
+const packageProcess = (data: ModelContentConfig, list = []) => {
 	const new_list = [data]
 	let curData = data
 	while (curData.childNode) {
 		new_list.push(curData.childNode)
 		curData = curData.childNode
 	}
-	return new_list.reduce((_list, config, i) => {
-		// 节点唯一key
-		if (!config.local_name) {
-			config.local_name = `${config.nodeName}&_&${levelIdx}_${i}`
-		}
+	return new_list.reduce((_list, config) => {
 		// 条件分支
 		if (Array.isArray(config.conditionNodes)) {
 			// console.log('条件节点', config)
 			_list.push(config)
 			if (Array.isArray(config.conditionNodes) && config.conditionNodes.length) {
-				// 节点唯一key(条件分支 额外处理)
-				config.conditionNodes.map((v, _i) => {
-					v.local_name = v.local_name || `${config.local_name}_${v.nodeName}*${_i}`
-				})
-				const _val = processChecked[config.local_name]
+				const _val = processChecked[config.nodeKey]
 				let condition: any = config.conditionNodes[0]
 				if (_val) {
 					config.conditionNodes.some(_condition => {
-						if (_condition.local_name === _val) {
+						if (_condition.nodeKey === _val) {
 							condition = _condition
 							return true
 						}
 					})
 				} else {
 					// console.error('else......', condition)
-					processChecked[config.local_name] = condition.local_name
+					processChecked[config.nodeKey] = condition.nodeKey
 				}
 				// console.warn('条件节点', condition.nodeName)
 				if (condition.childNode) {
-					packageProcess(condition.childNode, _list, levelIdx + 1)
+					packageProcess(condition.childNode, _list)
 				}
 			}
 		} else {
@@ -225,7 +218,7 @@ const packageProcess = (data, list = [], levelIdx = 0) => {
 						let disabled = false
 						let selectOpts = {}
 						const user_fn = () => {
-							assigneeMap.value[config.local_name] = { assignees: config.nodeAssigneeList, type: 1, disabled, selectOpts }
+							assigneeMap.value[config.nodeKey] = { assignees: config.nodeAssigneeList, type: 1, disabled, selectOpts }
 						}
 						switch (config.setType) {
 							case 1:
@@ -235,11 +228,11 @@ const packageProcess = (data, list = [], levelIdx = 0) => {
 								break
 							case 2:
 								// 主管 (不需要选择)
-								assigneeDesc.value[config.local_name] = config.examineLevel === 1 ? '直接主管' : `发起人的第${config.examineLevel}级主管`
+								assigneeDesc.value[config.nodeKey] = config.examineLevel === 1 ? '直接主管' : `发起人的第${config.examineLevel}级主管`
 								break
 							case 3:
 								// 角色 选择角色 (允许重新选择)
-								assigneeMap.value[config.local_name] = { assignees: config.nodeAssigneeList, type: 3 }
+								assigneeMap.value[config.nodeKey] = { assignees: config.nodeAssigneeList, type: 3 }
 								break
 							case 4:
 								// 发起人自选 (1: 选择一个人, 2: 选择多个人)
@@ -250,11 +243,11 @@ const packageProcess = (data, list = [], levelIdx = 0) => {
 								user_fn()
 								break
 							case 5: // 发起人自己 (不能选择)
-								assigneeDesc.value[config.local_name] = setTypeOptions_config[5]
+								assigneeDesc.value[config.nodeKey] = setTypeOptions_config[5]
 								break
 							case 6:
 								// 连续多级主管 (不能选择)
-								assigneeDesc.value[config.local_name] = config.examineLevel === 1 ? '直接主管' : `发起人的第${config.examineLevel}级主管`
+								assigneeDesc.value[config.nodeKey] = config.examineLevel === 1 ? '直接主管' : `发起人的第${config.examineLevel}级主管`
 								break
 						}
 					}
@@ -263,7 +256,7 @@ const packageProcess = (data, list = [], levelIdx = 0) => {
 				case 2: {
 					// 抄送人
 					// 选择人员 & allowSelection 控制 true 允许选择 否则  隐藏
-					assigneeMap.value[config.local_name] = { assignees: config.nodeAssigneeList, type: 1, disabled: !config.allowSelection }
+					assigneeMap.value[config.nodeKey] = { assignees: config.nodeAssigneeList, type: 1, disabled: !config.allowSelection }
 					break
 				}
 				/*case 3: {