Ver Fonte

完成任务功能

yuanmingze há 1 mês atrás
pai
commit
0721a7acbb

+ 1 - 1
src/pages-task/task-form/components/SingleSelect.vue

@@ -6,7 +6,7 @@
       :title="taskFieldConfig.taskFiledValue"
       :required="taskFieldConfig.isMustfill === '1'"
       :value="cellValue"
-      is-link
+      :is-link="!props.disabled"
       @click="pickerClick"
     />
 

+ 36 - 0
src/pages-task/task-form/composables/useTaskForm.ts

@@ -27,6 +27,10 @@ export const HIDE_FIELD_DEPT_ID = ['1611890693', '1611890565']
  */
 const EXCLUDED_AUTO_DATETIME_BASE_TYPE_IDS = new Set(['81', '85', '86', '87'])
 
+const ON_SITE_VISIT_TASK_TYPE_ID = '85'
+const ON_SITE_VISIT_TYPE = '现场拜访'
+const ON_SITE_VISIT_READONLY_FIELD_ALIASES = new Set(['level', 'visitType'])
+
 /**
  * 单选、多选组件统一使用的选项结构。
  *
@@ -41,6 +45,7 @@ export interface TaskFieldOption {
 export type TaskFieldConfigViewItem = Omit<TaskFieldConfigItem, 'id'> & {
   id: string
   show: boolean
+  readonly: boolean
   options: TaskFieldOption[] | null
 }
 
@@ -98,6 +103,28 @@ const shouldInitializeCurrentDateTime = (field: TaskFieldConfigViewItem): boolea
   return fieldType === 'datetime' && !EXCLUDED_AUTO_DATETIME_BASE_TYPE_IDS.has(taskTypeId)
 }
 
+const isOnSiteVisitField = (
+  field: Pick<TaskFieldConfigItem, 'taskTypeId' | 'alias'>,
+  alias: string
+): boolean => {
+  return String(field.taskTypeId).trim() === ON_SITE_VISIT_TASK_TYPE_ID && field.alias?.trim() === alias
+}
+
+const shouldReadonlyField = (field: TaskFieldConfigItem): boolean => {
+  return (
+    String(field.taskTypeId).trim() === ON_SITE_VISIT_TASK_TYPE_ID &&
+    ON_SITE_VISIT_READONLY_FIELD_ALIASES.has(field.alias?.trim() ?? '')
+  )
+}
+
+const serializeTaskFieldType = (field: TaskFieldConfigItem): string => {
+  if (String(field.taskTypeId).trim() === '75' && field.alias?.trim() === 'drugs') {
+    return 'multiple_select'
+  }
+
+  return field.taskFiledType
+}
+
 /**
  * 创建字段初始值。
  *
@@ -111,6 +138,13 @@ const createInitialFieldValue = (
   field: TaskFieldConfigViewItem,
   initialDateTime: ReturnType<typeof dayjs>
 ): DynamicFormFieldValue => {
+  if (isOnSiteVisitField(field, 'visitType')) {
+    return {
+      label: ON_SITE_VISIT_TYPE,
+      value: ON_SITE_VISIT_TYPE,
+    }
+  }
+
   if (!shouldInitializeCurrentDateTime(field)) {
     return createEmptyFieldValue()
   }
@@ -205,7 +239,9 @@ const serializeTaskFieldConfig = (
   return config.map((field) => ({
     ...field,
     id: String(field.id),
+    taskFiledType: serializeTaskFieldType(field),
     show: true,
+    readonly: shouldReadonlyField(field),
     options: getFieldDictOptions(field, dict),
   }))
 }

+ 79 - 10
src/pages-task/task-form/composables/useTaskSelectHandlers.ts

@@ -257,9 +257,10 @@ export const useTaskSelectHandlers = ({
       const res = await getPackageListByTaskTypeApi(trainingTypeValue.value)
       setFieldOptions(field, serializeTaskFieldOptions(res.data))
     }
-
-    if (['14', '31', '37'].includes(field.taskTypeId) && field.taskFiledValue === 'surveyTarget') {
+    if (['14', '31', '37'].includes(field.taskTypeId) && field.alias === 'surveyTarget') {
       const realTaskTypeIdValue = getFieldFormValueByAlias('realTaskTypeId')
+      console.log('realTaskTypeIdValue', realTaskTypeIdValue)
+
       if (!realTaskTypeIdValue?.value) {
         uni.showToast({
           title: '请先选择调查类别',
@@ -282,7 +283,37 @@ export const useTaskSelectHandlers = ({
       return false
     }
 
-    if (['75', '76', '81'].includes(field.taskTypeId) && field.alias === 'hospitalOrPharmacy') {
+    if (['81'].includes(field.taskTypeId) && field.alias === 'hospitalOrPharmacy') {
+      const scorePackageValue = getFieldFormValueByAlias('scorePackage')
+      if (!scorePackageValue?.value) {
+        uni.showToast({
+          title: '请先选择积分包',
+          icon: 'none',
+        })
+        return false
+      }
+      uni.navigateTo({
+        url: `/pages-common/entity-selector/index?alias=surveyTarget`,
+        events: {
+          surveyTargetSelect: (selectedItem: SurveyTargetItem) => {
+            const name = selectedItem.yymc || selectedItem.gsmc || selectedItem.pharmacyName || ''
+            const address = `${selectedItem.province}${selectedItem.city}${selectedItem.area}-${selectedItem.address}`
+
+            setFieldFormValueByAlias('hospitalOrPharmacy', {
+              label: name,
+              value: name,
+            })
+            setFieldFormValueByAlias('address', {
+              label: address,
+              value: address,
+            })
+          },
+        },
+      })
+      return false
+    }
+
+    if (['75', '76'].includes(field.taskTypeId) && field.alias === 'hospitalOrPharmacy') {
       const scorePackageValue = getFieldFormValueByAlias('scorePackage')
       if (!scorePackageValue?.value) {
         uni.showToast({
@@ -376,6 +407,34 @@ export const useTaskSelectHandlers = ({
       }
     }
 
+    if (['85'].includes(field.taskTypeId) && field.alias === 'hospital') {
+      const scorePackageValue = getFieldFormValueByAlias('scorePackage')
+      if (!scorePackageValue?.value) {
+        uni.showToast({
+          title: '请先选择积分包',
+          icon: 'none',
+        })
+        return false
+      }
+      uni.navigateTo({
+        url: `/pages-common/entity-selector/index?alias=yymc`,
+        events: {
+          yymcSelect: (selectedHospitalItem: HospitalItem | string) => {
+            if (typeof selectedHospitalItem === 'string') return
+            setFieldFormValueByAlias('hospital', {
+              label: selectedHospitalItem.yymc,
+              value: selectedHospitalItem.yymc,
+            })
+            setFieldFormValueByAlias('level', {
+              label: selectedHospitalItem.yygm ?? '',
+              value: selectedHospitalItem.yygm ?? '',
+            })
+          },
+        },
+      })
+      return false
+    }
+
     return true
   }
 
@@ -405,9 +464,6 @@ export const useTaskSelectHandlers = ({
     field: TaskFieldConfigViewItem,
     event: SingleSelectChangeEvent
   ) => {
-    console.log('单选字段:', field)
-    console.log('单选变化:', event)
-
     /**
      * OTC 推广任务的字段联动示例。
      */
@@ -445,12 +501,21 @@ export const useTaskSelectHandlers = ({
   const handleMultipleSelectBeforeOpen = async (
     field: TaskFieldConfigViewItem
   ): Promise<boolean> => {
-    const currentFormValue = getFieldFormValue(field)
+    console.log('field', field)
 
-    if (!currentFormValue) {
-      console.warn(`未找到字段对应的表单值:${field.id}`)
+    if (field.taskTypeId === '75' && field.alias === 'drugs') {
+      const scorePackageValue = getFieldFormValueByAlias('scorePackage')
+      if (!scorePackageValue?.value) {
+        uni.showToast({
+          title: '请先选择积分包',
+          icon: 'none',
+        })
+        return false
+      }
+      const res = await getListDrugTable(scorePackageValue.value)
 
-      return false
+      setFieldOptions(field, res)
+      return true
     }
 
     /**
@@ -619,6 +684,10 @@ export const useTaskSelectHandlers = ({
       label: selectedCompanyItem.jyys,
       value: selectedCompanyItem.jyys,
     })
+    setFieldFormValueByAlias('registerAddress', {
+      label: selectedCompanyItem.gszcd,
+      value: selectedCompanyItem.gszcd,
+    })
   }
   return {
     handleSingleSelectBeforeOpen,

+ 11 - 1
src/pages-task/task-form/index.vue

@@ -30,6 +30,7 @@
                   v-model:label="form.value[item.id].label"
                   v-model:value="form.value[item.id].value"
                   :task-field-config="item"
+                  :disabled="item.readonly"
                   :before-open="() => handleSingleSelectBeforeOpen(item)"
                   @change="handleTaskSingleSelectChange(item, $event)"
                 />
@@ -39,6 +40,7 @@
                   v-model:label="form.value[item.id].label"
                   v-model:value="form.value[item.id].value"
                   :task-field-config="item"
+                  :disabled="item.readonly"
                   :before-open="() => handleSingleSelectBeforeOpen(item)"
                   @change="handleSingleSelectChange(item, $event)"
                 />
@@ -48,7 +50,7 @@
                   v-model:label="form.value[item.id].label"
                   v-model:value="form.value[item.id].value"
                   :task-field-config="item"
-                  :readonly="isReadonlyText(item.taskFiledType)"
+                  :readonly="item.readonly || isReadonlyText(item.taskFiledType)"
                 />
 
                 <DateTimePicker
@@ -56,6 +58,7 @@
                   v-model:label="form.value[item.id].label"
                   v-model:value="form.value[item.id].value"
                   :task-field-config="item"
+                  :disabled="item.readonly"
                 />
 
                 <TaskLocation
@@ -63,6 +66,7 @@
                   v-model:label="form.value[item.id].label"
                   v-model:value="form.value[item.id].value"
                   :task-field-config="item"
+                  :disabled="item.readonly"
                 />
 
                 <template v-else-if="isImgUpload(item.taskFiledType)">
@@ -72,6 +76,7 @@
                     v-model:label="form.value[item.id].label"
                     v-model:value="form.value[item.id].value"
                     :task-field-config="item"
+                    :disabled="item.readonly"
                   />
                 </template>
 
@@ -82,6 +87,7 @@
                     v-model:label="form.value[item.id].label"
                     v-model:value="form.value[item.id].value"
                     :task-field-config="item"
+                    :disabled="item.readonly"
                   />
                 </template>
 
@@ -90,6 +96,7 @@
                   v-model:label="form.value[item.id].label"
                   v-model:value="form.value[item.id].value"
                   :task-field-config="item"
+                  :disabled="item.readonly"
                   :before-open="() => handleMultipleSelectBeforeOpen(item)"
                 />
 
@@ -98,6 +105,7 @@
                   v-model:label="form.value[item.id].label"
                   v-model:value="form.value[item.id].value"
                   :task-field-config="item"
+                  :disabled="item.readonly"
                 />
 
                 <template v-else-if="isLongText(item.taskFiledType) && item.show">
@@ -107,6 +115,7 @@
                     v-model:label="form.value[item.id].label"
                     v-model:value="form.value[item.id].value"
                     :task-field-config="item"
+                    :disabled="item.readonly"
                   />
 
                   <view class="line" />
@@ -117,6 +126,7 @@
                   v-model:label="form.value[item.id].label"
                   v-model:value="form.value[item.id].value"
                   :task-field-config="item"
+                  :disabled="item.readonly"
                   :select-level="selectLevel"
                 />
               </view>