From 1d77d32af991add91fc26c2599b565e3452221b4 Mon Sep 17 00:00:00 2001 From: 王彪总 Date: Thu, 22 Oct 2026 14:32:01 +0800 Subject: [PATCH] 业务线 小程序不用写死,从后端接口获取 --- pages-sub/problem/work-order-manage/add-maintain-order.vue | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------- 1 file changed, 61 insertions(+), 47 deletions(-) diff --git a/pages-sub/problem/work-order-manage/add-maintain-order.vue b/pages-sub/problem/work-order-manage/add-maintain-order.vue index 29f8733..208e2fc 100644 --- a/pages-sub/problem/work-order-manage/add-maintain-order.vue +++ b/pages-sub/problem/work-order-manage/add-maintain-order.vue @@ -236,6 +236,8 @@ const workFieldFormRef = ref(null) const showWorkTypeSheet = ref(false) // 作业类型选项:字典 maintain_type(打开弹窗时取,避免字典异步加载导致首次为空) const workTypeOptions = ref([]) +// 该业务线已配置工单填报项(biz_type=1)的作业类型 ID 集合,用于自动带出和下拉标记 +const configuredWorkTypeIds = ref(new Set()) // 当前作业类型下的动态字段数量(0 时给「无需填报」提示) const dynamicFieldCount = ref(0) @@ -432,21 +434,8 @@ onLoad((options) => { workOrderForm.busiLine = orderItem.busiLine // 业务线可能是逗号分隔多值(如 "yl,hj"),字段配置按单值定位,取首段 workOrderForm.businessType = String(orderItem.busiLine || '').split(',')[0].trim() - // 来源数据若已带作业类型则回显(工单主表当前无该字段,通常为空,由用户手选) - if (orderItem.workTypeId) { - workOrderForm.workTypeId = orderItem.workTypeId - workOrderForm.workTypeName = uni.$dict.getDictLabel('maintain_type', orderItem.workTypeId) || '' - } else { - // 先按工单名「大类/小类」的小类匹配作业类型(如 秩序管理/经营秩序 -> 2014 经营秩序) - const matchedWorkType = matchWorkTypeByOrderName(orderItem.orderName) - if (matchedWorkType) { - workOrderForm.workTypeId = matchedWorkType.value - workOrderForm.workTypeName = matchedWorkType.label - } else { - // 兜底:该业务线只配了一个作业类型的字段时自动选中,进页即可看到填报项 - loadDefaultWorkType() - } - } + // 作业类型:按「该业务线已配置填报项的类型」自动带出(见 initWorkType) + initWorkType(orderItem) // 共同处理人(如有数据则回显,转换为数组格式) if (orderItem.coHandlers && orderItem.coHandlersName) { // 处理ID:如果是字符串(逗号分隔),转为数组;本身是数组则直接赋值 @@ -716,9 +705,17 @@ const hideKeyboard = () => { // 打开作业类型选择弹窗 const openWorkTypeSheet = () => { - // up-action-sheet 用 name 展示,value 作为回传值 + // up-action-sheet 用 name 展示,value 作为回传值; + // 该业务线没配填报项的类型加后缀,避免选到没有填报项的类型还以为是配置丢了 + const configuredIds = configuredWorkTypeIds.value workTypeOptions.value = uni.$dict.getDictSimpleList('maintain_type') - .map(item => ({ name: item.label, value: item.value })) + .map(item => ({ + name: configuredIds.size === 0 || configuredIds.has(String(item.value)) + ? item.label + : `${item.label}(无填报项)`, + label: item.label, + value: item.value + })) if (workTypeOptions.value.length === 0) { uni.showToast({ title: '暂无作业类型字典数据', @@ -737,7 +734,8 @@ const onWorkTypeSelect = (e) => { return } workOrderForm.workTypeId = e.value - workOrderForm.workTypeName = e.name + // 展示名用字典原名,去掉下拉里的「(无填报项)」后缀 + workOrderForm.workTypeName = e.label || e.name dynamicFieldCount.value = 0 if (workOrderFormRef.value) { workOrderFormRef.value.validateField('workTypeName') @@ -750,48 +748,64 @@ const onDynamicFieldsLoaded = (count) => { } /** - * 按工单名匹配作业类型:工单名格式「大类/小类」,小类与字典 maintain_type 的 label 同名 - * (如 秩序管理/经营秩序 -> 2014 经营秩序),命中即自动带出,养护员仍可在弹窗里手改。 - * @param {String} orderName 工单名,如「秩序管理/经营秩序」 - * @returns {{value: String, label: String}|null} 未命中返回 null + * 拉取该业务线已配置工单填报项(biz_type=1)的作业类型,结果同时用于: + * ① 自动带出作业类型;② 作业类型下拉里标记哪些类型有填报项。 + * @returns {Promise>} 拉取失败返回空数组 */ -const matchWorkTypeByOrderName = (orderName) => { - const subName = String(orderName || '').split('/').pop().trim() - if (!subName) { - return null - } - const dictList = uni.$dict.getDictSimpleList('maintain_type') || [] - return dictList.find(item => item.label === subName) || null -} - -/** - * 兜底自动带出作业类型:该业务线下只有一个作业类型配置了填报项时直接选中, - * 动态字段块随之渲染(v-if 绑在 workTypeId 上),用户不用先猜该选哪个作业类型。 - * 配了多个时不自动选,交给用户手选。 - */ -const loadDefaultWorkType = async () => { +const loadConfiguredWorkTypes = async () => { if (!workOrderForm.businessType) { - return + return [] } try { const list = await getConfiguredWorkTypes({ businessType: workOrderForm.businessType, bizType: 1 }) - if (!Array.isArray(list) || list.length !== 1) { - return - } - const only = list[0] - workOrderForm.workTypeId = only.workTypeId - workOrderForm.workTypeName = only.workTypeName - || uni.$dict.getDictLabel('maintain_type', only.workTypeId) - || '' - dynamicFieldCount.value = 0 + const arr = Array.isArray(list) ? list : [] + configuredWorkTypeIds.value = new Set(arr.map(item => String(item.workTypeId))) + return arr } catch (error) { console.warn('获取已配置填报项的作业类型失败:', error) + return [] } } +/** + * 自动带出作业类型(只在该业务线已配置填报项的类型里选,完全匹配): + * ① 来源数据已带作业类型 -> 直接回显; + * ② 工单名「大类/小类」的小类与某个已配置类型的名称完全一致 -> 选中它; + * 如 秩序管理/经营秩序 -> 2014 经营秩序,秩序管理/交通秩序 -> 2013 交通秩序; + * ③ 没匹配上,但该业务线只配了 1 个类型 -> 直接选中; + * ④ 其余情况留空,由养护员在弹窗里手选。 + * 带出后仍可手改。 + * @param {Object} orderItem 待办行数据,需含 orderName、workTypeId + */ +const initWorkType = async (orderItem) => { + const configuredList = await loadConfiguredWorkTypes() + if (orderItem.workTypeId) { + workOrderForm.workTypeId = orderItem.workTypeId + workOrderForm.workTypeName = uni.$dict.getDictLabel('maintain_type', orderItem.workTypeId) || '' + return + } + if (configuredList.length === 0) { + return + } + const subName = String(orderItem.orderName || '').split('/').pop().trim() + const matched = subName + ? configuredList.find(item => (item.workTypeName + || uni.$dict.getDictLabel('maintain_type', item.workTypeId)) === subName) + : null + const picked = matched || (configuredList.length === 1 ? configuredList[0] : null) + if (!picked) { + return + } + workOrderForm.workTypeId = picked.workTypeId + workOrderForm.workTypeName = picked.workTypeName + || uni.$dict.getDictLabel('maintain_type', picked.workTypeId) + || '' + dynamicFieldCount.value = 0 +} + // 动态字段提交幂等流水号(后端按 userId+clientSeq 去重) const genClientSeq = () => `${Date.now()}-${Math.random().toString(16).slice(2, 10)}` -- libgit2 0.21.4