Selaa lähdekoodia

feat(plan-work): 改用部门项目业务接口加载选项

- 使用 teamProjectBiz 接口替代扩展属性反向筛选
- 使用 businessName 和 business 映射业务选项
- 根据接口返回的 unit 自动填写工作量单位
- 编辑和查看时按部门加载项目业务数据
Zimo 1 viikko sitten
vanhempi
commit
f3d00c1ca4
2 muutettua tiedostoa jossa 35 lisäystä ja 35 poistoa
  1. 7 6
      src/api/pms/iotprojecttaskplan/index.ts
  2. 28 29
      src/views/pms/plan-work/fill.vue

+ 7 - 6
src/api/pms/iotprojecttaskplan/index.ts

@@ -26,9 +26,10 @@ export interface IotProjectTaskPlanPageResult {
   total: number
 }
 
-export interface IotProjectTaskPlanExtProperty {
-  identifier: string
-  [key: string]: unknown
+export interface IotProjectTaskPlanTeamProjectBiz {
+  business: string
+  businessName: string
+  unit: string
 }
 
 export interface IotProjectTaskPlanCreateData {
@@ -92,9 +93,9 @@ export const IotProjectTaskPlanApi = {
       url: `/pms/iot-project-task-plan/get?id=${id}`
     })
   },
-  getPlanExtProperties: async (deptId: number) => {
-    return await request.get<IotProjectTaskPlanExtProperty[]>({
-      url: '/pms/iot-project-task-plan/planExtProperties',
+  getTeamProjectBiz: async (deptId: number) => {
+    return await request.get<IotProjectTaskPlanTeamProjectBiz[]>({
+      url: '/pms/iot-project-task-plan/teamProjectBiz',
       params: { deptId }
     })
   },

+ 28 - 29
src/views/pms/plan-work/fill.vue

@@ -2,9 +2,9 @@
 import {
   IotProjectTaskPlanApi,
   type IotProjectTaskPlanCreateData,
-  type IotProjectTaskPlanExtProperty,
   type IotProjectTaskPlanPageParams,
   type IotProjectTaskPlanPageVO,
+  type IotProjectTaskPlanTeamProjectBiz,
   type IotProjectTaskPlanUpdateData
 } from '@/api/pms/iotprojecttaskplan'
 import * as DeptApi from '@/api/system/dept'
@@ -71,12 +71,15 @@ const BUSINESS_PLAN_CONFIG: Record<string, BusinessPlanConfig> = {
   井下: { field: 'planWellTrips', unit: '井' }
 }
 
-const businessOptions = getStrDictOptions(DICT_TYPE.RQ_IOT_WORKLOAD_PLAN_BIZ)
+const businessDictOptions = getStrDictOptions(DICT_TYPE.RQ_IOT_WORKLOAD_PLAN_BIZ)
 const deptTreeProps = { ...defaultProps, disabled: 'disabled' }
+const teamProjectBizOptions = ref<IotProjectTaskPlanTeamProjectBiz[]>([])
 
 const getBusinessPlanConfig = (business: string) => {
   const businessValue = String(business || '').trim()
-  const businessLabel = businessOptions.find((option) => option.value === businessValue)?.label
+  const businessLabel =
+    teamProjectBizOptions.value.find((option) => option.business === businessValue)?.businessName ||
+    businessDictOptions.find((option) => option.value === businessValue)?.label
   return BUSINESS_PLAN_CONFIG[businessValue] || BUSINESS_PLAN_CONFIG[businessLabel || '']
 }
 
@@ -92,10 +95,9 @@ const createDialogVisible = ref(false)
 const createLoading = ref(false)
 const formMode = ref<FormMode>('create')
 const deptOptionsLoading = ref(false)
-const extPropertiesLoading = ref(false)
+const businessOptionsLoading = ref(false)
 const deptOptions = ref<DeptOption[]>([])
 const flatDeptOptions = ref<DeptOption[]>([])
-const planExtProperties = ref<IotProjectTaskPlanExtProperty[]>([])
 const createFormRef = ref<FormInstance>()
 
 const isReadonly = computed(() => formMode.value === 'view')
@@ -108,15 +110,6 @@ const dialogDescription = computed(() =>
   isReadonly.value ? '查看部门项目业务计划工作量详情' : '维护部门各月份的项目业务计划工作量'
 )
 
-const selectableBusinessOptions = computed(() => {
-  const identifiers = new Set(planExtProperties.value.map((property) => property.identifier))
-
-  return businessOptions.filter((option) => {
-    const config = getBusinessPlanConfig(option.value)
-    return config ? identifiers.has(config.field) : false
-  })
-})
-
 const createInitialForm = (): CreatePlanForm => ({
   id: undefined,
   deptId: undefined,
@@ -166,16 +159,16 @@ const findCompanyId = (selectedDeptId: number) => {
   return undefined
 }
 
-const loadPlanExtProperties = async (selectedDeptId?: number) => {
-  planExtProperties.value = []
+const loadTeamProjectBizOptions = async (selectedDeptId?: number) => {
+  teamProjectBizOptions.value = []
   if (!selectedDeptId) return
 
-  extPropertiesLoading.value = true
+  businessOptionsLoading.value = true
   try {
-    const data = await IotProjectTaskPlanApi.getPlanExtProperties(selectedDeptId)
-    planExtProperties.value = Array.isArray(data) ? data : []
+    const data = await IotProjectTaskPlanApi.getTeamProjectBiz(selectedDeptId)
+    teamProjectBizOptions.value = Array.isArray(data) ? data : []
   } finally {
-    extPropertiesLoading.value = false
+    businessOptionsLoading.value = false
   }
 }
 
@@ -184,7 +177,7 @@ const handleDeptChange = async (selectedDeptId?: number) => {
   createFormData.value.business = ''
   createFormData.value.workloadUnit = ''
   createFormData.value.planWorkload = undefined
-  await loadPlanExtProperties(selectedDeptId)
+  await loadTeamProjectBizOptions(selectedDeptId)
 }
 
 const normalizeStartTime = (value: unknown) => {
@@ -206,7 +199,11 @@ const handleOpenForm = async (mode: FormMode, id?: number) => {
     if (id) {
       const data = await IotProjectTaskPlanApi.get(id)
       const business = String(data.business || '')
+      await loadTeamProjectBizOptions(data.deptId)
       const config = getBusinessPlanConfig(business)
+      const businessOption = teamProjectBizOptions.value.find(
+        (option) => option.business === business
+      )
       const workloadValue = config ? data[config.field] : undefined
 
       createFormData.value = {
@@ -215,11 +212,10 @@ const handleOpenForm = async (mode: FormMode, id?: number) => {
         companyId: data.companyId || findCompanyId(data.deptId),
         startTime: normalizeStartTime(data.startTime),
         business,
-        workloadUnit: data.workloadUnit || config?.unit || '',
+        workloadUnit: data.workloadUnit || businessOption?.unit || config?.unit || '',
         planWorkload:
           workloadValue === null || workloadValue === undefined ? undefined : Number(workloadValue)
       }
-      await loadPlanExtProperties(data.deptId)
     }
 
     await nextTick()
@@ -232,8 +228,11 @@ const handleOpenForm = async (mode: FormMode, id?: number) => {
 const handleOpenCreate = () => handleOpenForm('create')
 
 const handleBusinessChange = () => {
+  const businessOption = teamProjectBizOptions.value.find(
+    (option) => option.business === createFormData.value.business
+  )
   const config = getBusinessPlanConfig(createFormData.value.business)
-  createFormData.value.workloadUnit = config?.unit || ''
+  createFormData.value.workloadUnit = businessOption?.unit || config?.unit || ''
   createFormData.value.planWorkload = undefined
 }
 
@@ -495,16 +494,16 @@ watch(
                 <el-select
                   v-model="createFormData.business"
                   :placeholder="createFormData.deptId ? '请选择项目业务' : '请先选择部门'"
-                  :loading="extPropertiesLoading"
+                  :loading="businessOptionsLoading"
                   :disabled="isReadonly || !createFormData.deptId"
                   clearable
                   class="w-full"
                   @change="handleBusinessChange">
                   <el-option
-                    v-for="option in selectableBusinessOptions"
-                    :key="option.value"
-                    :label="option.label"
-                    :value="option.value" />
+                    v-for="option in teamProjectBizOptions"
+                    :key="option.business"
+                    :label="option.businessName"
+                    :value="option.business" />
                 </el-select>
               </el-form-item>
             </el-col>