Bläddra i källkod

reactor:流程模板配置需求调整;

zhangchong 1 år sedan
förälder
incheckning
0d7205e75e

+ 92 - 80
src/components/LogicFlow/index.vue

@@ -14,18 +14,23 @@
 							<el-input v-model="form.code" placeholder="请输入模板编码" clearable></el-input>
 						</el-form-item>
 					</el-col>
-          <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="8">
-            <el-form-item label="模板类型" prop="flowType" :rules="[{ required: true, message: '请选择模板类型', trigger: 'change' }]">
-              <el-select v-model="form.flowType" class="w100" placeholder="请选择模板类型">
-                <el-option v-for="item in baseDataResult.flowTypeOptions" :key="item.key" :label="item.value" :value="item.key" />
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="8">
-            <el-form-item label="模板描述" prop="description" :rules="[{ required: false, message: '请输入模板描述', trigger: 'blur' }]">
-              <el-input v-model="form.description" placeholder="请输入模板描述" clearable></el-input>
-            </el-form-item>
-          </el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="8">
+						<el-form-item label="模板类型" prop="flowType" :rules="[{ required: true, message: '请选择模板类型', trigger: 'change' }]">
+							<el-select v-model="form.flowType" class="w100" placeholder="请选择模板类型">
+								<el-option v-for="item in baseDataResult.flowTypeOptions" :key="item.key" :label="item.value" :value="item.key" />
+							</el-select>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="8">
+						<el-form-item label="展示主办" prop="isMainHandlerShow" :rules="[{ required: false, message: '请选择模板类型', trigger: 'change' }]">
+							<el-switch v-model="form.isMainHandlerShow" inline-prompt active-text="展示" inactive-text="隐藏" />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="8">
+						<el-form-item label="模板描述" prop="description" :rules="[{ required: false, message: '请输入模板描述', trigger: 'blur' }]">
+							<el-input v-model="form.description" placeholder="请输入模板描述" clearable></el-input>
+						</el-form-item>
+					</el-col>
 				</el-row>
 			</el-form>
 			<!-- 流程图画布内容 -->
@@ -33,33 +38,39 @@
 				<div class="w100 h100" ref="lfElRef" style="height: 100%"></div>
 			</div>
 			<!-- 节点内容弹窗 -->
-			<PropertySetting ref="propertySettingRef" v-model="formData" @change="handlePropertyChange" @changeOther="handlePropertyChangeOther" :baseData="baseDataResult"/>
+			<PropertySetting
+				ref="propertySettingRef"
+				v-model="formData"
+				@change="handlePropertyChange"
+				@changeOther="handlePropertyChangeOther"
+				:baseData="baseDataResult"
+			/>
 		</div>
 	</div>
 </template>
 <script setup lang="ts" name="hotlineFlowDesigner">
-import {defineAsyncComponent, nextTick, onMounted, reactive, Ref, ref, unref, watch} from 'vue';
-import {useRoute, useRouter} from 'vue-router';
+import { defineAsyncComponent, nextTick, onMounted, reactive, Ref, ref, unref, watch } from 'vue';
+import { useRoute, useRouter } from 'vue-router';
 import LogicFlow from '@logicflow/core';
-import {Control, DndPanel, Group, InsertNodeInPolyline, Menu, MiniMap, SelectionSelect, Snapshot} from '@logicflow/extension';
+import { Control, DndPanel, Group, InsertNodeInPolyline, Menu, MiniMap, SelectionSelect, Snapshot } from '@logicflow/extension';
 import '@logicflow/core/dist/style/index.css';
 import '@logicflow/extension/lib/style/index.css';
-import {SnakerFlowAdapter, SnakerFlowElement} from './snakerflow/index';
-import {NodeTypeEnum} from './enums';
-import {baseData, workflowAdd, workflowUpdate} from '@/api/system/workflow';
+import { SnakerFlowAdapter, SnakerFlowElement } from './snakerflow/index';
+import { NodeTypeEnum } from './enums';
+import { baseData, workflowAdd, workflowUpdate } from '@/api/system/workflow';
 import mittBus from '@/utils/mitt';
-import {throttle} from '@/utils/tools';
-import {ElMessage, FormInstance} from 'element-plus';
+import { throttle } from '@/utils/tools';
+import { ElMessage, FormInstance } from 'element-plus';
 // 引入组件
-const PropertySetting = defineAsyncComponent(() => import('./PropertySetting/index.vue'));  // 节点属性设置
+const PropertySetting = defineAsyncComponent(() => import('./PropertySetting/index.vue')); // 节点属性设置
 
 const route = useRoute(); // 当前路由信息
 const router = useRouter(); // 路由实例
-const emits = defineEmits(['update:modelValue', 'on-save']);  // 定义组件事件
+const emits = defineEmits(['update:modelValue', 'on-save']); // 定义组件事件
 // 提交表单数据
 let formData = reactive({} as any);
 // 外层表单
-let form =  reactive<Record<string, any>>({});
+let form = reactive<Record<string, any>>({});
 const ruleFormRef = ref<RefType>();
 // 定义组件接收的参数
 const props = defineProps({
@@ -251,17 +262,15 @@ const initOp = () => {
 			text: '开始',
 			label: '开始节点',
 			properties: {
-        stepType: 1, // 节点类型(开始1 结束2)
-      },
+				stepType: 1, // 节点类型(开始1 结束2)
+			},
 			icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAAH6ji2bAAAABGdBTUEAALGPC/xhBQAAAnBJREFUOBGdVL1rU1EcPfdGBddmaZLiEhdx1MHZQXApraCzQ7GKLgoRBxMfcRELuihWKcXFRcEWF8HBf0DdDCKYRZpnl7p0svLe9Zzbd29eQhTbC8nv+9zf130AT63jvooOGS8Vf9Nt5zxba7sXQwODfkWpkbjTQfCGUd9gIp3uuPP8bZ946g56dYQvnBg+b1HB8VIQmMFrazKcKSvFW2dQTxJnJdQ77urmXWOMBCmXM2Rke4S7UAW+/8ywwFoewmBps2tu7mbTdp8VMOkIRAkKfrVawalJTtIliclFbaOBqa0M2xImHeVIfd/nKAfVq/LGnPss5Kh00VEdSzfwnBXPUpmykNss4lUI9C1ga+8PNrBD5YeqRY2Zz8PhjooIbfJXjowvQJBqkmEkVnktWhwu2SM7SMx7Cj0N9IC0oQXRo8xwAGzQms+xrB/nNSUWVveI48ayrFGyC2+E2C+aWrZHXvOuz+CiV6iycWe1Rd1Q6+QUG07nb5SbPrL4426d+9E1axKjY3AoRrlEeSQo2Eu0T6BWAAr6COhTcWjRaYfKG5csnvytvUr/WY4rrPMB53Uo7jZRjXaG6/CFfNMaXEu75nG47X+oepU7PKJvvzGDY1YLSKHJrK7vFUwXKkaxwhCW3u+sDFMVrIju54RYYbFKpALZAo7sB6wcKyyrd+aBMryMT2gPyD6GsQoRFkGHr14TthZni9ck0z+Pnmee460mHXbRAypKNy3nuMdrWgVKj8YVV8E7PSzp1BZ9SJnJAsXdryw/h5ctboUVi4AFiCd+lQaYMw5z3LGTBKjLQOeUF35k89f58Vv/tGh+l+PE/wG0rgfIUbZK5AAAAABJRU5ErkJggg==',
 		},
 		{
 			type: 'hotline:task',
 			text: '流程节点',
 			label: '流程节点',
-			properties: {
-
-			},
+			properties: {},
 			icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAEFVwZaAAAABGdBTUEAALGPC/xhBQAAAqlJREFUOBF9VM9rE0EUfrMJNUKLihGbpLGtaCOIR8VjQMGDePCgCCIiCNqzCAp2MyYUCXhUtF5E0D+g1t48qAd7CCLqQUQKEWkStcEfVGlLdp/fm3aW2QQdyLzf33zz5m2IsAZ9XhDpyaaIZkTS4ASzK41TFao88GuJ3hsr2pAbipHxuSYyKRugagICGANkfFnNh3HeE2N0b3nN2cgnpcictw5veJIzxmDamSlxxQZicq/mflxhbaH8BLRbuRwNtZp0JAhoplVRUdzmCe/vO27wFuuA3S5qXruGdboy5/PRGFsbFGKo/haRtQHIrM83bVeTrOgNhZReWaYGnE4aUQgTJNvijJFF4jQ8BxJE5xfKatZWmZcTQ+BVgh7s8SgPlCkcec4mGTmieTP4xd7PcpIEg1TX6gdeLW8rTVMVLVvb7ctXoH0Cydl2QOPJBG21STE5OsnbweVYzAnD3A7PVILuY0yiiyDwSm2g441r6rMSgp6iK42yqroI2QoXeJVeA+YeZSa47gZdXaZWQKTrG93rukk/l2Al6Kzh5AZEl7dDQy+JjgFahQjRopSxPbrbvK7GRe9ePWBo1wcU7sYrFZtavXALwGw/7Dnc50urrHJuTPSoO2IMV3gUQGNg87IbSOIY9BpiT9HV7FCZ94nPXb3MSnwHn/FFFE1vG6DTby+r31KAkUktB3Qf6ikUPWxW1BkXSPQeMHHiW0+HAd2GelJsZz1OJegCxqzl+CLVHa/IibuHeJ1HAKzhuDR+ymNaRFM+4jU6UWKXorRmbyqkq/D76FffevwdCp+jN3UAN/C9JRVTDuOxC/oh+EdMnqIOrlYteKSfadVRGLJFJPSB/ti/6K8f0CNymg/iH2gO/f0DwE0yjAFO6l8JaR5j0VPwPwfaYHqOqrCI319WzwhwzNW/aQAAAABJRU5ErkJggg==',
 			className: 'important-node',
 		},
@@ -270,8 +279,8 @@ const initOp = () => {
 			text: '结束',
 			label: '结束节点',
 			properties: {
-        stepType: 2, // 节点类型(开始1 结束2)
-      },
+				stepType: 2, // 节点类型(开始1 结束2)
+			},
 			icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAAH6ji2bAAAABGdBTUEAALGPC/xhBQAAA1BJREFUOBFtVE1IVUEYPXOf+tq40Y3vPcmFIdSjIorWoRG0ERWUgnb5FwVhYQSl72oUoZAboxKNFtWiwKRN0M+jpfSzqJAQclHo001tKkjl3emc8V69igP3znzfnO/M9zcDcKT67azmjYWTwl9Vn7Vumeqzj1DVb6cleQY4oAVnIOPb+mKAGxQmKI5CWNJ2aLPatxWa3aB9K7/fB+/Z0jUF6TmMlFLQqrkECWQzOZxYGjTlOl8eeKaIY5yHnFn486xBustDjWT6dG7pmjHOJd+33t0iitTPkK6tEvjxq4h2MozQ6WFSX/LkDUGfFwfhEZj1Auz/U4pyAi5Sznd7uKzznXeVHlI/Aywmk6j7fsUsEuCGADrWARXXwjxWQsUbIupDHJI7kF5dRktg0eN81IbiZXiTESic50iwS+t1oJgL83jAiBupLDCQqwziaWSoAFSeIR3P5Xv5az00wyIn35QRYTwdSYbz8pH8fxUUAtxnFvYmEmgI0wYXUXcCCSpeEVpXlsRhBnCEATxWylL9+EKCAYhe1NGstUa6356kS9NVvt3DU2fd+Wtbm/+lSbylJqsqkSm9CRhvoJVlvKPvF1RKY/FcPn5j4UfIMLn8D4UYb54BNsilTDXKnF4CfTobA0FpoW/LSp306wkXM+XaOJhZaFkcNM82ASNAWMrhrUbRfmyeI1FvRBTpN06WKxa9BK0o2E4Pd3zfBBEwPsv9sQBnmLVbLEIZ/Xe9LYwJu/Er17W6HYVBc7vmuk0xUQ+pqxdom5Fnp55SiytXLPYoMXNM4u4SNSCFWnrVIzKG3EGyMXo6n/BQOe+bX3FClY4PwydVhthOZ9NnS+ntiLh0fxtlUJHAuGaFoVmttpVMeum0p3WEXbcll94l1wM/gZ0Ccczop77VvN2I7TlsZCsuXf1WHvWEhjO8DPtyOVg2/mvK9QqboEth+7pD6NUQC1HN/TwvydGBARi9MZSzLE4b8Ru3XhX2PBxf8E1er2A6516o0w4sIA+lwURhAON82Kwe2iDAC1Watq4XHaGQ7skLcFOtI5lDxuM2gZe6WFIotPAhbaeYlU4to5cuarF1QrcZ/lwrLaCJl66JBocYZnrNlvm2+MBCTmUymPrYZVbjdlr/BxlMjmNmNI3SAAAAAElFTkSuQmCC',
 		},
 	]);
@@ -300,7 +309,7 @@ const initEvent = () => {
 	// })
 	// 节点点击事件
 	eventCenter.on('node:click', (args: any) => {
-		if (['hotline:start','hotline:task'].includes(args.data.type)) {
+		if (['hotline:start', 'hotline:task'].includes(args.data.type)) {
 			currentOpId.value = args.data.id;
 			propertySettingRef.value.show({
 				...args.data.properties,
@@ -324,54 +333,56 @@ const initEvent = () => {
 	// })
 };
 const closePage = () => {
-  // 更新
-  ElMessage.success('操作成功');
-  // 关闭当前 tagsView
-  mittBus.emit('onCurrentContextmenuClick', Object.assign({}, { contextMenuClickId: 1, ...route }));
-  mittBus.emit('clearCache', 'systemWorkflow');
-  if(!router.hasRoute('systemWorkflow')){
-    ElMessage.warning('未找到流程模板列表页面');
-    return;
-  }
-  router.push({
-    name: 'systemWorkflow',
-    state:{
-      index:'1'
-    }
-  });
+	// 更新
+	ElMessage.success('操作成功');
+	// 关闭当前 tagsView
+	mittBus.emit('onCurrentContextmenuClick', Object.assign({}, { contextMenuClickId: 1, ...route }));
+	mittBus.emit('clearCache', 'systemWorkflow');
+	if (!router.hasRoute('systemWorkflow')) {
+		ElMessage.warning('未找到流程模板列表页面');
+		return;
+	}
+	router.push({
+		name: 'systemWorkflow',
+		state: {
+			index: '1',
+		},
+	});
 };
 // 暂存(保存为草稿)
 const saveOnly = throttle((formEl: FormInstance | undefined) => {
 	const lf = unref(lfInstance);
 	if (!lf) return;
-  if(!formEl) return;
-  // 表单验证
-  formEl.validate((valid: boolean)=>{
-    if(!valid) return;
-    // 流程模板属性 最外层
-    Object.keys(form).forEach((key: string) => {
-      // 监听属性变化 并保存
-      lf.graphModel[key] = form[key];
-    });
-    const { submitData } = getGraphData();
+	if (!formEl) return;
+	// 表单验证
+	formEl.validate((valid: boolean) => {
+		if (!valid) return;
+		// 流程模板属性 最外层
+		Object.keys(form).forEach((key: string) => {
+			// 监听属性变化 并保存
+			lf.graphModel[key] = form[key];
+		});
+		const { submitData } = getGraphData();
 
-    if (submitData.error) {
-      //错误提示
-      ElMessage.warning(submitData.error);
-      return;
-    }
-    if (route.params.id) {
-      workflowUpdate(submitData).then(() => { //更新
-        closePage();
-      });
-    } else {
-      workflowAdd(submitData).then(() => {//保存
-        closePage()
-      });
-    }
+		if (submitData.error) {
+			//错误提示
+			ElMessage.warning(submitData.error);
+			return;
+		}
+		if (route.params.id) {
+			workflowUpdate(submitData).then(() => {
+				//更新
+				closePage();
+			});
+		} else {
+			workflowAdd(submitData).then(() => {
+				//保存
+				closePage();
+			});
+		}
 
-    emits('on-save', getGraphData());
-  })
+		emits('on-save', getGraphData());
+	});
 }, 300);
 // 重新渲染
 const reRender = (data: any): void => {
@@ -383,8 +394,9 @@ const reRender = (data: any): void => {
 			// 最外层扩展属性赋值
 			form.name = lf.graphModel.name;
 			form.code = lf.graphModel.code;
-      form.flowType = lf.graphModel.flowType;
-      form.description = lf.graphModel.description;
+			form.flowType = lf.graphModel.flowType;
+			form.description = lf.graphModel.description;
+			form.isMainHandlerShow = lf.graphModel.isMainHandlerShow;
 			form.id = route.params.id;
 			form.name = lf.graphModel.name;
 		});
@@ -460,11 +472,11 @@ const importJson = (data: any) => {
 	reRender(data);
 };
 const baseDataResult = ref<EmptyObjectType>({});
-onMounted( async()=>{
-  // 获取页面基础数据
-  const {result} = await baseData();
-  baseDataResult.value = result;
-  await init();
+onMounted(async () => {
+	// 获取页面基础数据
+	const { result } = await baseData();
+	baseDataResult.value = result;
+	await init();
 });
 
 // 出提供给外部操作-$refs.xxx

+ 2 - 0
src/components/LogicFlow/snakerflow/index.ts

@@ -32,6 +32,7 @@ class SnakerFlowAdapter {
       lf.graphModel.code = userData.code
       lf.graphModel.flowType = userData.flowType
       lf.graphModel.description = userData.description
+      lf.graphModel.isMainHandlerShow = userData.flowType
       lf.graphModel.id = userData.id
       return userData
     }
@@ -41,6 +42,7 @@ class SnakerFlowAdapter {
         code: lf.graphModel.code,
         flowType: lf.graphModel.flowType,
         description:lf.graphModel.description,
+        isMainHandlerShow:lf.graphModel.isMainHandlerShow,
         id: lf.graphModel.id,
         ...logicFlowData
       }

+ 39 - 10
src/components/ProcessAudit/index.vue

@@ -228,14 +228,15 @@
 								</el-select>
 							</el-form-item>
 						</el-col>
-						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="countersignAble">
 							<el-form-item label="发起会签" prop="isStartCountersign" :rules="[{ required: false, message: '请选择发起会签', trigger: 'change' }]">
 								<el-switch
 									v-model="state.ruleForm.isStartCountersign"
 									inline-prompt
 									active-text="是"
 									inactive-text="否"
-									:disabled="!countersignDisabled"
+									@change="changeStartCountersign"
+									:disabled="countersignDisabled"
 								/>
 							</el-form-item>
 						</el-col>
@@ -294,6 +295,7 @@
 								filterable
 								value-key="key"
 								@change="selectHandlers"
+								:multiple-limit="multipleLimit"
 							/>
 						</el-form-item>
 					</el-col>
@@ -352,14 +354,15 @@
               </el-form-item>
             </el-col>-->
 					</template>
-					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="countersignAble">
 						<el-form-item label="发起会签" prop="isStartCountersign" :rules="[{ required: false, message: '请选择发起会签', trigger: 'change' }]">
 							<el-switch
 								v-model="state.ruleForm.isStartCountersign"
 								inline-prompt
 								active-text="是"
 								inactive-text="否"
-								:disabled="!countersignDisabled"
+								@change="changeStartCountersign"
+								:disabled="countersignDisabled"
 							/>
 						</el-form-item>
 					</el-col>
@@ -527,9 +530,6 @@ const auditArr = ['甄别审批', '延期审批']; // 审批流程
 const timeType = ref<EmptyArrayType>([]); // 延期申请单位
 const orderRedoReasonOptions = ref<EmptyArrayType>([]); // 重办理由
 const screenTypeOptions = ref<EmptyArrayType>([]); // 甄别类型
-const canReject = ref<boolean>(false); // 是否可以驳回
-const timeTypeOptions = ref<EmptyArrayType>([]); // 办理时限单位
-const canStartCountersign = ref<boolean>(false); // 是否可以发起会签
 
 // 打开弹窗
 const openDialog = async (val: any) => {
@@ -609,11 +609,16 @@ const openDialog = async (val: any) => {
 		state.loading = false;
 	}
 };
+const canReject = ref<boolean>(false); // 是否可以驳回
+const timeTypeOptions = ref<EmptyArrayType>([]); // 办理时限单位
+const canStartCountersign = ref<boolean>(false); // 是否可以发起会签
+const isMainHandlerShow = ref<boolean>(false); // 是否展示主办人
 const handleResult = (res: any) => {
 	state.nextStepOptions = res.result.steps; //办理对象选择内容
 	canReject.value = res.result.canReject ?? false; // 是否可以驳回
 	timeTypeOptions.value = res.result.timeTypeOptions ?? []; // 办理时限申请单位
 	canStartCountersign.value = res.result.canStartCountersign ?? false; // 是否可以发起会签
+	isMainHandlerShow.value = res.result.isMainHandlerShow ?? false; // 是否展示主办人
 	if (handelArr.includes(state.processType)) {
 		// 办理才有期满时间
 		state.ruleForm.expiredTime = res.result.expiredTime ?? null; // 期满时间
@@ -694,9 +699,32 @@ const selectNextStep = (val: any) => {
 	fastStepCode.value = next.recommendOrgId; // 推荐派单处理对象code
 };
 //  会签是否可用 (多个办理对象,并且配置可以会签)
+const countersignAble = computed(() => {
+	return canStartCountersign.value;
+});
+// 办理对象是否能够选择多个(可以发起会签可以选择多个,不能发起会签只能选择一个)
+const multipleLimit = computed(() => {
+	return canStartCountersign.value ? 0 : 1;
+});
+watch(
+	() => state.ruleForm.nextHandlers, // 监听办理对象 多个办理对象自动发起会签
+	(val) => {
+		state.ruleForm.isStartCountersign = val.length > 1;
+	}
+);
 const countersignDisabled = computed(() => {
-	return state.ruleForm.nextHandlers.length > 1 && canStartCountersign.value;
+	// 是否可以发起会签
+	return state.ruleForm.nextHandlers.length <= 1;
 });
+// 是否发起会签
+const changeStartCountersign = (val: boolean) => {
+	if (!val) {
+		// 如果不能会签清空办理对象
+		state.ruleForm.nextHandlers = [];
+		ruleFormRef.value?.resetFields('nextHandlers');
+	}
+};
+
 // 是否展示办理对象 (只有结束节点不展示 next.stepType===2 表示为结束节点)
 const showHandlers = computed(() => {
 	const next = state.nextStepOptions.find((item: any) => item.key === state.ruleForm.nextStepCode);
@@ -766,7 +794,8 @@ const computeTimeNext = debounce(() => {
 // 选择办理对象
 const selectHandlers = () => {
 	ruleFormRef.value?.resetFields('nextMainHandler');
-	if (state.ruleForm.nextHandlers.length > 1) { // 多个办理对象 主办
+	if (state.ruleForm.nextHandlers.length > 1) {
+		// 多个办理对象 主办
 		state.ruleForm.nextMainHandler = state.ruleForm.nextHandlers[0].key;
 	}
 	if (state.ruleForm.nextHandlers.length <= 1) {
@@ -776,7 +805,7 @@ const selectHandlers = () => {
 };
 // 是否展示主办
 const showMainHandler = computed(() => {
-	return state.ruleForm.nextHandlers.length > 1;
+	return state.ruleForm.nextHandlers.length > 1 && isMainHandlerShow.value;
 });
 // 主办从办理对象中选择
 state.handlerMainOptions = computed(() => {

+ 6 - 10
src/views/business/visit/component/Visit-detail.vue

@@ -151,11 +151,9 @@
 									</template>
 									<!-- 部门评价 -->
 									<template v-if="item.visitTarget === 20">
-										<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-											<el-divider content-position="left">
-												<el-text tag="b" size="large"> {{ item.visitOrgName }} </el-text>
-											</el-divider>
-										</el-col>
+                    <el-divider content-position="left">
+                      <el-text tag="b" size="large"> {{ item.visitOrgName }} </el-text>
+                    </el-divider>
 										<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
 											<el-form-item label="部门办件结果">
 												{{ item.orgProcessingResults?.dicDataName }}
@@ -241,11 +239,9 @@
 									</template>
 									<!-- 部门评价 -->
 									<template v-if="item.visitTarget === 20">
-										<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-											<el-divider content-position="left">
-												<el-text tag="b" size="large"> {{ item.visitOrgName }} </el-text>
-											</el-divider>
-										</el-col>
+                    <el-divider content-position="left">
+                      <el-text tag="b" size="large"> {{ item.visitOrgName }} </el-text>
+                    </el-divider>
 										<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
 											<el-form-item
 												label="部门办件结果"

+ 7 - 11
src/views/statistics/order/visitDiscontent.vue

@@ -32,22 +32,20 @@
 			<el-table :data="tableData" show-summary border>
 				<el-table-column v-for="(item, index) in columns" :key="index" :prop="item.dicDataValue" :label="item.dicDataName" align="center">
 					<template #default="{ row, column, $index }">
-						<el-button type="primary" @click="handleDetail(row, row[item.dicDataValue])" link v-if="isNumber(row[item.dicDataValue])">{{
-							row[item.dicDataValue]
-						}}</el-button>
-						<span v-else>{{ row.Group_OrgCode_OrgName?.orgName }}</span>
+						<span v-if="column.property === 'orgName'">{{ row.Group_OrgCode_OrgName?.orgName }}</span>
+						<el-button type="primary" @click="handleDetail(row, row[column.property])" link v-else>{{ row[column.property] }}</el-button>
 					</template>
 				</el-table-column>
-        <template #empty>
-          <Empty />
-        </template>
+				<template #empty>
+					<Empty />
+				</template>
 			</el-table>
 		</el-card>
 	</div>
 </template>
 <script setup lang="ts" name="statisticsVisitDiscontent">
 import { onMounted, reactive, ref } from 'vue';
-import { ElButton, FormInstance } from 'element-plus';
+import { ElButton, ElMessage, FormInstance } from 'element-plus';
 import { throttle } from '@/utils/tools';
 import { departmentUnsatisfied } from '@/api/statistics/order';
 import { shortcuts } from '@/utils/constants';
@@ -120,12 +118,10 @@ const multipleSelection = ref<any>([]);
 const handleSelectionChange = (val: any[]) => {
 	multipleSelection.value = val;
 };
-const isNumber = (val: any) => {
-	return typeof val === 'number' && !isNaN(val);
-};
 // 查看详情
 const router = useRouter();
 const handleDetail = (row: any, column) => {
+	if (!column) return ElMessage.warning('暂无数据');
 	// 获取键名
 	const columnKey = Object.keys(row).find((item) => row[item] === column);
 	let startTime = null;