Selaa lähdekoodia

完成任务类型提交内容

yuanmingze 1 kuukausi sitten
vanhempi
commit
d2e8a4b843

+ 61 - 9
src/pages-common/entity-selector/index.vue

@@ -15,7 +15,7 @@
         />
       </view>
 
-      <button v-if="!isSurveyTarget" class="add-btn" @click="openAddDialog">新增</button>
+      <button v-if="canAddEntity" class="add-btn" @click="openAddDialog">新增</button>
     </view>
 
     <view v-if="isSurveyTarget" class="entity-tabs">
@@ -38,8 +38,8 @@
 
         <view class="item-content">
           <text class="item-name">{{ getItemName(item) }}</text>
-          <text v-if="item.address" class="item-address">
-            {{ item.address }}
+          <text v-if="getItemAddress(item)" class="item-address">
+            {{ getItemAddress(item) }}
           </text>
         </view>
       </view>
@@ -121,6 +121,7 @@ import {
   getWmDaPharmacyByNameApi,
   listDistributionByNameApi,
   listHospitalByNameApi,
+  listScorePackageDrugsApi,
   listWmDaPharmacyByNameApi,
 } from '@/services/modules/task/entitySelector'
 import type {
@@ -128,6 +129,7 @@ import type {
   EntitySelectorRequest,
   HospitalItem,
   PharmacyItem,
+  ScorePackageDrugItem,
   SurveyTargetItem,
 } from '@/services/modules/task/entitySelector/type'
 
@@ -147,8 +149,8 @@ const entityAliasConfig = {
 } as const
 
 type EntityAlias = keyof typeof entityAliasConfig
-type PageAlias = EntityAlias | 'surveyTarget'
-type EntityItem = PharmacyItem | HospitalItem | DistributionItem
+type PageAlias = EntityAlias | 'surveyTarget' | 'surveyCategory'
+type EntityItem = PharmacyItem | HospitalItem | DistributionItem | ScorePackageDrugItem
 
 const surveyTargetTabs: ReadonlyArray<{ alias: EntityAlias; label: string }> = [
   { alias: 'yymc', label: '选择医院' },
@@ -158,9 +160,11 @@ const surveyTargetTabs: ReadonlyArray<{ alias: EntityAlias; label: string }> = [
 
 interface PageQuery {
   alias?: string
+  packageId?: string
 }
 
 const pageAlias = ref<PageAlias>('pharmacyName')
+const packageId = ref('')
 const activeEntityAlias = ref<EntityAlias>('yymc')
 const keyword = ref('')
 const list = ref<EntityItem[]>([])
@@ -180,23 +184,44 @@ const addError = ref('')
 let requestVersion = 0
 
 const isSurveyTarget = computed(() => pageAlias.value === 'surveyTarget')
+const isSurveyCategory = computed(() => pageAlias.value === 'surveyCategory')
+const canAddEntity = computed(() => !isSurveyTarget.value && !isSurveyCategory.value)
 const currentEntityAlias = computed<EntityAlias>(() =>
   isSurveyTarget.value ? activeEntityAlias.value : (pageAlias.value as EntityAlias)
 )
-const entityName = computed(() => entityAliasConfig[currentEntityAlias.value].entityName)
+const entityName = computed(() =>
+  isSurveyCategory.value ? '药品' : entityAliasConfig[currentEntityAlias.value].entityName
+)
 const searchPlaceholder = computed(() => `搜索${entityName.value}名称`)
 const addTitle = computed(() => `新增${entityName.value}`)
 const addPlaceholder = computed(() => `请输入${entityName.value}名称`)
 
 const getItemName = (item: EntityItem): string => {
+  if ('drugname' in item) {
+    return item.drugname
+  }
+
   const surveyTargetItem: SurveyTargetItem = item
 
   return surveyTargetItem.yymc || surveyTargetItem.gsmc || surveyTargetItem.pharmacyName || ''
 }
 
+const getItemAddress = (item: EntityItem): string => {
+  return 'address' in item ? item.address || '' : ''
+}
+
 const requestEntityPage = async (
   params: EntitySelectorRequest
 ): Promise<{ records: EntityItem[]; pages: number }> => {
+  if (isSurveyCategory.value) {
+    const { data } = await listScorePackageDrugsApi({
+      ...params,
+      packageId: packageId.value,
+    })
+
+    return data
+  }
+
   if (currentEntityAlias.value === 'pharmacyName') {
     const { data } = await listWmDaPharmacyByNameApi(params)
 
@@ -215,6 +240,10 @@ const requestEntityPage = async (
 }
 
 const loadList = async (reset = false) => {
+  if (isSurveyCategory.value && !packageId.value) {
+    return
+  }
+
   if (!reset && (loading.value || finished.value)) {
     return
   }
@@ -293,9 +322,15 @@ const getOpenerEventChannel = () => {
 
 const emitSelectedItem = (item: EntityItem | string) => {
   const eventChannel = getOpenerEventChannel()
-  const eventName = isSurveyTarget.value
-    ? 'surveyTargetSelect'
-    : entityAliasConfig[currentEntityAlias.value].eventName
+  let eventName: string
+
+  if (isSurveyTarget.value) {
+    eventName = 'surveyTargetSelect'
+  } else if (isSurveyCategory.value) {
+    eventName = 'surveyCategorySelect'
+  } else {
+    eventName = entityAliasConfig[currentEntityAlias.value].eventName
+  }
 
   eventChannel?.emit(eventName, item)
 }
@@ -388,18 +423,35 @@ onLoad((query?: PageQuery) => {
 
   pageAlias.value =
     alias === 'surveyTarget' ||
+    alias === 'surveyCategory' ||
     alias === 'pharmacyName' ||
     alias === 'yymc' ||
     alias === 'companyName'
       ? alias
       : 'pharmacyName'
 
+  packageId.value = String(query?.packageId ?? '').trim()
+
   if (isSurveyTarget.value) {
     uni.setNavigationBarTitle({
       title: '选择调查对象',
     })
   }
 
+  if (isSurveyCategory.value) {
+    uni.setNavigationBarTitle({
+      title: '选择药品',
+    })
+  }
+
+  if (isSurveyCategory.value && !packageId.value) {
+    uni.showToast({
+      title: '缺少积分包信息',
+      icon: 'none',
+    })
+    return
+  }
+
   void loadList(true)
 })
 

+ 10 - 1
src/pages-task/task-form/composables/useTaskForm.ts

@@ -31,7 +31,16 @@ const ON_SITE_VISIT_TASK_TYPE_ID = '85'
 const ON_SITE_VISIT_TYPE = '现场拜访'
 const ON_SITE_VISIT_READONLY_FIELD_ALIASES = new Set(['level', 'visitType'])
 
-export const MULTIPLE_SELECT_DRUG_TASK_TYPE_IDS = new Set(['1', '2', '3', '4', '64', '75'])
+export const MULTIPLE_SELECT_DRUG_TASK_TYPE_IDS = new Set([
+  '1',
+  '2',
+  '3',
+  '4',
+  '64',
+  '75',
+  '76',
+  '81',
+])
 
 /**
  * 单选、多选组件统一使用的选项结构。

+ 53 - 4
src/pages-task/task-form/composables/useTaskSelectHandlers.ts

@@ -5,6 +5,7 @@ import type {
   DistributionItem,
   HospitalItem,
   PharmacyItem,
+  ScorePackageDrugItem,
   SurveyTargetItem,
 } from '@/services/modules/task/entitySelector/type'
 import {
@@ -67,11 +68,14 @@ const PACKAGE_DEPENDENT_FIELD_ALIASES: Readonly<Record<string, readonly string[]
   '2': ['drugs'],
   '3': ['drugs'],
   '4': ['drugs'],
+  '14': ['surveyCategory'],
+  '31': ['surveyCategory'],
+  '37': ['surveyCategory'],
   '47': ['drugs', 'realTaskTypeId'],
   '64': ['drugs'],
   '75': ['drugs', 'hospitalOrPharmacy', 'hospitalOrPharmacyAddress'],
-  '76': ['hospitalOrPharmacy', 'hospitalOrPharmacyAddress'],
-  '81': ['hospitalOrPharmacy', 'address'],
+  '76': ['drugs', 'hospitalOrPharmacy', 'hospitalOrPharmacyAddress'],
+  '81': ['drugs', 'hospitalOrPharmacy', 'address'],
   '85': ['hospital', 'level'],
 }
 
@@ -135,10 +139,18 @@ export const useTaskSelectHandlers = ({
   const openEntitySelector = <T>(
     alias: string,
     eventName: string,
-    onSelect: (selectedItem: T) => void
+    onSelect: (selectedItem: T) => void,
+    query: Record<string, string> = {}
   ): false => {
+    const queryString = [
+      `alias=${encodeURIComponent(alias)}`,
+      ...Object.entries(query).map(
+        ([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`
+      ),
+    ].join('&')
+
     uni.navigateTo({
-      url: `${ENTITY_SELECTOR_URL}?alias=${encodeURIComponent(alias)}`,
+      url: `${ENTITY_SELECTOR_URL}?${queryString}`,
       events: {
         [eventName]: onSelect,
       },
@@ -203,6 +215,22 @@ export const useTaskSelectHandlers = ({
     )
   }
 
+  const openSurveyCategoryDrugSelector = (scorePackageId: string): false => {
+    return openEntitySelector<ScorePackageDrugItem>(
+      'surveyCategory',
+      'surveyCategorySelect',
+      (selectedItem) => {
+        setFieldFormValueByAlias('surveyCategory', {
+          label: selectedItem.drugname,
+          value: selectedItem.id,
+        })
+      },
+      {
+        packageId: scorePackageId,
+      }
+    )
+  }
+
   const otcScoreList = ref<PackageRuleTaskTypeItem[]>([])
   let otcScoreRequestVersion = 0
 
@@ -297,6 +325,16 @@ export const useTaskSelectHandlers = ({
       return openSurveyTargetSelector('surveyTarget')
     }
 
+    if (hasTaskType(field, SURVEY_TARGET_TASK_TYPE_IDS) && field.alias === 'surveyCategory') {
+      const scorePackageId = requireFieldValue('scorePackage', '请先选择积分包')
+
+      if (!scorePackageId) {
+        return false
+      }
+
+      return openSurveyCategoryDrugSelector(scorePackageId)
+    }
+
     if (normalizeTaskTypeId(field.taskTypeId) === '81' && field.alias === 'hospitalOrPharmacy') {
       if (!requireFieldValue('scorePackage', '请先选择积分包')) {
         return false
@@ -337,6 +375,17 @@ export const useTaskSelectHandlers = ({
         setCompanyNameSelectEvent
       )
     }
+    if (normalizeTaskTypeId(field.taskTypeId) === '38' && field.alias === 'hospital') {
+      return openEntitySelector<DistributionItem | string>(
+        'companyName',
+        'companySelect',
+        (selectedItem) => {
+          const name = typeof selectedItem === 'string' ? selectedItem : selectedItem.gsmc
+
+          setFieldTextByAlias('hospital', name)
+        }
+      )
+    }
     if (taskTypeId.value === '47') {
       if (field.alias === 'drugs') {
         const packageId = requireFieldValue('scorePackage', '请先选择积分包')

+ 9 - 0
src/services/modules/task/entitySelector/index.ts

@@ -7,6 +7,8 @@ import type {
   ListHospitalByNameResponse,
   ListWmDaPharmacyByNameResponse,
   PharmacyItem,
+  ScorePackageDrugRequest,
+  ScorePackageDrugResponse,
 } from './type'
 
 export const listWmDaPharmacyByNameApi = (params: EntitySelectorRequest) => {
@@ -46,3 +48,10 @@ export const getDistributionByNameApi = (name: string) => {
     `/admin/wmdadistribution/getDistributionByName?name=${name}`
   )
 }
+
+export const listScorePackageDrugsApi = (params: ScorePackageDrugRequest) => {
+  return http.get<ScorePackageDrugResponse>(`/admin/wmscorepackage/drugs`, params, {
+    loading: true,
+    loadingText: '加载中...',
+  })
+}

+ 18 - 0
src/services/modules/task/entitySelector/type.d.ts

@@ -4,6 +4,10 @@ export interface EntitySelectorRequest {
   name: string
 }
 
+export interface ScorePackageDrugRequest extends EntitySelectorRequest {
+  packageId: string
+}
+
 export interface EntitySelectorPageResponse<T> {
   current: number
   hitCount: boolean
@@ -22,6 +26,20 @@ export type ListHospitalByNameResponse = EntitySelectorPageResponse<HospitalItem
 
 export type DistributionResponse = EntitySelectorPageResponse<DistributionItem>
 
+export type ScorePackageDrugResponse = EntitySelectorPageResponse<ScorePackageDrugItem>
+
+export interface ScorePackageDrugItem {
+  id: string
+  drugname: string
+  drugnameTy?: string
+  drugEntId?: string
+  drugEntName?: string
+  doseId?: string | null
+  doseName?: string | null
+  guigeId?: string | null
+  guigeName?: string | null
+}
+
 export interface SurveyTargetItem {
   id: string
   yymc?: string

+ 5 - 1
src/services/modules/task/taskFrom/index.ts

@@ -27,7 +27,11 @@ export const saveTaskContentApi = (
 ) => {
   return http.post<SaveTaskContentResponse>(
     `/admin/api/saveTaskContent?packageId=${saveTaskContentQuery.packageId}&taskTypeId=${saveTaskContentQuery.taskTypeId}`,
-    saveTaskContentBody
+    saveTaskContentBody,
+    {
+      loading: true,
+      loadingText: '提交中...',
+    }
   )
 }