Commit 1d77d32af991add91fc26c2599b565e3452221b4

Authored by 王彪总
1 parent 194ce9b3

业务线 小程序不用写死,从后端接口获取

pages-sub/problem/work-order-manage/add-maintain-order.vue
@@ -236,6 +236,8 @@ const workFieldFormRef = ref(null) @@ -236,6 +236,8 @@ const workFieldFormRef = ref(null)
236 const showWorkTypeSheet = ref(false) 236 const showWorkTypeSheet = ref(false)
237 // 作业类型选项:字典 maintain_type(打开弹窗时取,避免字典异步加载导致首次为空) 237 // 作业类型选项:字典 maintain_type(打开弹窗时取,避免字典异步加载导致首次为空)
238 const workTypeOptions = ref([]) 238 const workTypeOptions = ref([])
  239 +// 该业务线已配置工单填报项(biz_type=1)的作业类型 ID 集合,用于自动带出和下拉标记
  240 +const configuredWorkTypeIds = ref(new Set())
239 241
240 // 当前作业类型下的动态字段数量(0 时给「无需填报」提示) 242 // 当前作业类型下的动态字段数量(0 时给「无需填报」提示)
241 const dynamicFieldCount = ref(0) 243 const dynamicFieldCount = ref(0)
@@ -432,21 +434,8 @@ onLoad((options) => { @@ -432,21 +434,8 @@ onLoad((options) => {
432 workOrderForm.busiLine = orderItem.busiLine 434 workOrderForm.busiLine = orderItem.busiLine
433 // 业务线可能是逗号分隔多值(如 "yl,hj"),字段配置按单值定位,取首段 435 // 业务线可能是逗号分隔多值(如 "yl,hj"),字段配置按单值定位,取首段
434 workOrderForm.businessType = String(orderItem.busiLine || '').split(',')[0].trim() 436 workOrderForm.businessType = String(orderItem.busiLine || '').split(',')[0].trim()
435 - // 来源数据若已带作业类型则回显(工单主表当前无该字段,通常为空,由用户手选)  
436 - if (orderItem.workTypeId) {  
437 - workOrderForm.workTypeId = orderItem.workTypeId  
438 - workOrderForm.workTypeName = uni.$dict.getDictLabel('maintain_type', orderItem.workTypeId) || ''  
439 - } else {  
440 - // 先按工单名「大类/小类」的小类匹配作业类型(如 秩序管理/经营秩序 -> 2014 经营秩序)  
441 - const matchedWorkType = matchWorkTypeByOrderName(orderItem.orderName)  
442 - if (matchedWorkType) {  
443 - workOrderForm.workTypeId = matchedWorkType.value  
444 - workOrderForm.workTypeName = matchedWorkType.label  
445 - } else {  
446 - // 兜底:该业务线只配了一个作业类型的字段时自动选中,进页即可看到填报项  
447 - loadDefaultWorkType()  
448 - }  
449 - } 437 + // 作业类型:按「该业务线已配置填报项的类型」自动带出(见 initWorkType)
  438 + initWorkType(orderItem)
450 // 共同处理人(如有数据则回显,转换为数组格式) 439 // 共同处理人(如有数据则回显,转换为数组格式)
451 if (orderItem.coHandlers && orderItem.coHandlersName) { 440 if (orderItem.coHandlers && orderItem.coHandlersName) {
452 // 处理ID:如果是字符串(逗号分隔),转为数组;本身是数组则直接赋值 441 // 处理ID:如果是字符串(逗号分隔),转为数组;本身是数组则直接赋值
@@ -716,9 +705,17 @@ const hideKeyboard = () => { @@ -716,9 +705,17 @@ const hideKeyboard = () => {
716 705
717 // 打开作业类型选择弹窗 706 // 打开作业类型选择弹窗
718 const openWorkTypeSheet = () => { 707 const openWorkTypeSheet = () => {
719 - // up-action-sheet 用 name 展示,value 作为回传值 708 + // up-action-sheet 用 name 展示,value 作为回传值;
  709 + // 该业务线没配填报项的类型加后缀,避免选到没有填报项的类型还以为是配置丢了
  710 + const configuredIds = configuredWorkTypeIds.value
720 workTypeOptions.value = uni.$dict.getDictSimpleList('maintain_type') 711 workTypeOptions.value = uni.$dict.getDictSimpleList('maintain_type')
721 - .map(item => ({ name: item.label, value: item.value })) 712 + .map(item => ({
  713 + name: configuredIds.size === 0 || configuredIds.has(String(item.value))
  714 + ? item.label
  715 + : `${item.label}(无填报项)`,
  716 + label: item.label,
  717 + value: item.value
  718 + }))
722 if (workTypeOptions.value.length === 0) { 719 if (workTypeOptions.value.length === 0) {
723 uni.showToast({ 720 uni.showToast({
724 title: '暂无作业类型字典数据', 721 title: '暂无作业类型字典数据',
@@ -737,7 +734,8 @@ const onWorkTypeSelect = (e) => { @@ -737,7 +734,8 @@ const onWorkTypeSelect = (e) => {
737 return 734 return
738 } 735 }
739 workOrderForm.workTypeId = e.value 736 workOrderForm.workTypeId = e.value
740 - workOrderForm.workTypeName = e.name 737 + // 展示名用字典原名,去掉下拉里的「(无填报项)」后缀
  738 + workOrderForm.workTypeName = e.label || e.name
741 dynamicFieldCount.value = 0 739 dynamicFieldCount.value = 0
742 if (workOrderFormRef.value) { 740 if (workOrderFormRef.value) {
743 workOrderFormRef.value.validateField('workTypeName') 741 workOrderFormRef.value.validateField('workTypeName')
@@ -750,48 +748,64 @@ const onDynamicFieldsLoaded = (count) => { @@ -750,48 +748,64 @@ const onDynamicFieldsLoaded = (count) => {
750 } 748 }
751 749
752 /** 750 /**
753 - * 按工单名匹配作业类型:工单名格式「大类/小类」,小类与字典 maintain_type 的 label 同名  
754 - * (如 秩序管理/经营秩序 -> 2014 经营秩序),命中即自动带出,养护员仍可在弹窗里手改。  
755 - * @param {String} orderName 工单名,如「秩序管理/经营秩序」  
756 - * @returns {{value: String, label: String}|null} 未命中返回 null 751 + * 拉取该业务线已配置工单填报项(biz_type=1)的作业类型,结果同时用于:
  752 + * ① 自动带出作业类型;② 作业类型下拉里标记哪些类型有填报项。
  753 + * @returns {Promise<Array<{workTypeId, workTypeName}>>} 拉取失败返回空数组
757 */ 754 */
758 -const matchWorkTypeByOrderName = (orderName) => {  
759 - const subName = String(orderName || '').split('/').pop().trim()  
760 - if (!subName) {  
761 - return null  
762 - }  
763 - const dictList = uni.$dict.getDictSimpleList('maintain_type') || []  
764 - return dictList.find(item => item.label === subName) || null  
765 -}  
766 -  
767 -/**  
768 - * 兜底自动带出作业类型:该业务线下只有一个作业类型配置了填报项时直接选中,  
769 - * 动态字段块随之渲染(v-if 绑在 workTypeId 上),用户不用先猜该选哪个作业类型。  
770 - * 配了多个时不自动选,交给用户手选。  
771 - */  
772 -const loadDefaultWorkType = async () => { 755 +const loadConfiguredWorkTypes = async () => {
773 if (!workOrderForm.businessType) { 756 if (!workOrderForm.businessType) {
774 - return 757 + return []
775 } 758 }
776 try { 759 try {
777 const list = await getConfiguredWorkTypes({ 760 const list = await getConfiguredWorkTypes({
778 businessType: workOrderForm.businessType, 761 businessType: workOrderForm.businessType,
779 bizType: 1 762 bizType: 1
780 }) 763 })
781 - if (!Array.isArray(list) || list.length !== 1) {  
782 - return  
783 - }  
784 - const only = list[0]  
785 - workOrderForm.workTypeId = only.workTypeId  
786 - workOrderForm.workTypeName = only.workTypeName  
787 - || uni.$dict.getDictLabel('maintain_type', only.workTypeId)  
788 - || ''  
789 - dynamicFieldCount.value = 0 764 + const arr = Array.isArray(list) ? list : []
  765 + configuredWorkTypeIds.value = new Set(arr.map(item => String(item.workTypeId)))
  766 + return arr
790 } catch (error) { 767 } catch (error) {
791 console.warn('获取已配置填报项的作业类型失败:', error) 768 console.warn('获取已配置填报项的作业类型失败:', error)
  769 + return []
792 } 770 }
793 } 771 }
794 772
  773 +/**
  774 + * 自动带出作业类型(只在该业务线已配置填报项的类型里选,完全匹配):
  775 + * ① 来源数据已带作业类型 -> 直接回显;
  776 + * ② 工单名「大类/小类」的小类与某个已配置类型的名称完全一致 -> 选中它;
  777 + * 如 秩序管理/经营秩序 -> 2014 经营秩序,秩序管理/交通秩序 -> 2013 交通秩序;
  778 + * ③ 没匹配上,但该业务线只配了 1 个类型 -> 直接选中;
  779 + * ④ 其余情况留空,由养护员在弹窗里手选。
  780 + * 带出后仍可手改。
  781 + * @param {Object} orderItem 待办行数据,需含 orderName、workTypeId
  782 + */
  783 +const initWorkType = async (orderItem) => {
  784 + const configuredList = await loadConfiguredWorkTypes()
  785 + if (orderItem.workTypeId) {
  786 + workOrderForm.workTypeId = orderItem.workTypeId
  787 + workOrderForm.workTypeName = uni.$dict.getDictLabel('maintain_type', orderItem.workTypeId) || ''
  788 + return
  789 + }
  790 + if (configuredList.length === 0) {
  791 + return
  792 + }
  793 + const subName = String(orderItem.orderName || '').split('/').pop().trim()
  794 + const matched = subName
  795 + ? configuredList.find(item => (item.workTypeName
  796 + || uni.$dict.getDictLabel('maintain_type', item.workTypeId)) === subName)
  797 + : null
  798 + const picked = matched || (configuredList.length === 1 ? configuredList[0] : null)
  799 + if (!picked) {
  800 + return
  801 + }
  802 + workOrderForm.workTypeId = picked.workTypeId
  803 + workOrderForm.workTypeName = picked.workTypeName
  804 + || uni.$dict.getDictLabel('maintain_type', picked.workTypeId)
  805 + || ''
  806 + dynamicFieldCount.value = 0
  807 +}
  808 +
795 // 动态字段提交幂等流水号(后端按 userId+clientSeq 去重) 809 // 动态字段提交幂等流水号(后端按 userId+clientSeq 去重)
796 const genClientSeq = () => `${Date.now()}-${Math.random().toString(16).slice(2, 10)}` 810 const genClientSeq = () => `${Date.now()}-${Math.random().toString(16).slice(2, 10)}`
797 811