From 8eca0bd84d7a7da29698f97fbf473850280da636 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E7=90=A6?= Date: Wed, 15 Jul 2026 08:46:31 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E4=BF=AE=E5=A4=8D=E4=BA=86=E6=8E=A5?= =?UTF-8?q?=E8=AF=8A=E9=A1=B5=E9=9D=A2=E7=9A=84=E5=89=82=E9=87=8F=E3=80=81?= =?UTF-8?q?=E5=A4=A9=E6=95=B0=E8=BE=93=E5=85=A5=E6=A1=86=E8=BF=87=E7=AA=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../drug-search-select/drug-search-select.vue | 275 +++++++++----- .../components/express-company-select.vue | 45 ++- apps/web-antd/src/store/prescription.ts | 3 + .../src/utils/matchExpressByTrackingNo.ts | 66 ++++ .../chat/components/PrescriptionModal.vue | 97 ++++- .../chat/components/WarehouseSelectModal.vue | 92 +++++ .../order/product-order/components/detail.vue | 2 +- .../order/product-order/config/form.ts | 10 + .../order/product-order/config/table.ts | 6 + .../business/order/product-order/index.vue | 16 + .../_shared/category-warehouse-cell.vue | 110 ++++++ .../product/_shared/central-price-cell.vue | 38 ++ .../_shared/central-stock-in-modal.vue | 114 ++++++ .../product/_shared/product-info-cell.vue | 116 ++++++ .../product/health-food/config/table.ts | 110 ++---- .../business/product/health-food/index.vue | 132 +++++-- .../product/medical-device/config/table.ts | 51 +-- .../business/product/medical-device/index.vue | 124 ++++++- .../business/product/non-drug/config/table.ts | 51 +-- .../views/business/product/non-drug/index.vue | 124 ++++++- .../product/service-pack/config/table.ts | 62 ++-- .../business/product/service-pack/index.vue | 126 ++++++- .../product/western-medicine/config/table.ts | 75 ++-- .../product/western-medicine/index.vue | 129 ++++++- .../doctor/doctor-reception/api/index.ts | 12 + .../system/admin/_shared/admin-payload.ts | 11 + .../system/admin/_shared/form-schemas.ts | 24 ++ .../views/system/admin/_shared/role-meta.ts | 3 + .../system/admin/_shared/table-config.ts | 4 + .../src/views/system/admin/config/form.ts | 28 ++ .../system/admin/delivery-warehouse/index.vue | 9 + .../src/views/system/admin/order/index.vue | 10 + .../delivery-warehouse-bank-card/api/index.ts | 26 ++ .../config/form.ts | 98 +++++ .../delivery-warehouse-bank-card/index.vue | 145 ++++++++ .../delivery-warehouse-drug/api/index.ts | 71 ++++ .../components/bind-list-modal.vue | 350 ++++++++++++++++++ .../components/modal.vue | 308 +++++++++++++++ .../delivery-warehouse-drug/config/form.ts | 222 +++++++++++ .../delivery-warehouse-drug/config/search.ts | 41 ++ .../delivery-warehouse-drug/config/table.ts | 89 +++++ .../system/delivery-warehouse-drug/index.vue | 135 +++++++ .../utils/resolve-central-price.ts | 23 ++ .../delivery-warehouse-order/api/index.ts | 31 ++ .../components/detail-modal.vue | 321 ++++++++++++++++ .../components/modal.vue | 57 +++ .../delivery-warehouse-order/config/form.ts | 61 +++ .../delivery-warehouse-order/config/search.ts | 22 ++ .../delivery-warehouse-order/config/table.ts | 74 ++++ .../system/delivery-warehouse-order/index.vue | 314 ++++++++++++++++ .../delivery-warehouse-stock/api/index.ts | 6 + .../delivery-warehouse-stock/config/search.ts | 21 ++ .../delivery-warehouse-stock/config/table.ts | 67 ++++ .../system/delivery-warehouse-stock/index.vue | 212 +++++++++++ .../api/index.ts | 17 + .../config/form.ts | 27 ++ .../config/table.ts | 72 ++++ .../delivery-warehouse-withdrawal/index.vue | 31 ++ .../system/delivery-warehouse/api/index.ts | 45 +++ .../components/bank-card-report-modal.vue | 90 +++++ .../components/bank-card-status-modal.vue | 126 +++++++ .../delivery-warehouse/components/modal.vue | 67 ++++ .../system/delivery-warehouse/config/form.ts | 59 +++ .../delivery-warehouse/config/search.ts | 22 ++ .../system/delivery-warehouse/config/table.ts | 76 ++++ .../views/system/delivery-warehouse/index.vue | 234 ++++++++++++ 66 files changed, 5242 insertions(+), 393 deletions(-) create mode 100644 apps/web-antd/src/utils/matchExpressByTrackingNo.ts create mode 100644 apps/web-antd/src/views/business/chat/components/WarehouseSelectModal.vue create mode 100644 apps/web-antd/src/views/business/product/_shared/category-warehouse-cell.vue create mode 100644 apps/web-antd/src/views/business/product/_shared/central-price-cell.vue create mode 100644 apps/web-antd/src/views/business/product/_shared/central-stock-in-modal.vue create mode 100644 apps/web-antd/src/views/business/product/_shared/product-info-cell.vue create mode 100644 apps/web-antd/src/views/system/admin/delivery-warehouse/index.vue create mode 100644 apps/web-antd/src/views/system/admin/order/index.vue create mode 100644 apps/web-antd/src/views/system/delivery-warehouse-bank-card/api/index.ts create mode 100644 apps/web-antd/src/views/system/delivery-warehouse-bank-card/config/form.ts create mode 100644 apps/web-antd/src/views/system/delivery-warehouse-bank-card/index.vue create mode 100644 apps/web-antd/src/views/system/delivery-warehouse-drug/api/index.ts create mode 100644 apps/web-antd/src/views/system/delivery-warehouse-drug/components/bind-list-modal.vue create mode 100644 apps/web-antd/src/views/system/delivery-warehouse-drug/components/modal.vue create mode 100644 apps/web-antd/src/views/system/delivery-warehouse-drug/config/form.ts create mode 100644 apps/web-antd/src/views/system/delivery-warehouse-drug/config/search.ts create mode 100644 apps/web-antd/src/views/system/delivery-warehouse-drug/config/table.ts create mode 100644 apps/web-antd/src/views/system/delivery-warehouse-drug/index.vue create mode 100644 apps/web-antd/src/views/system/delivery-warehouse-drug/utils/resolve-central-price.ts create mode 100644 apps/web-antd/src/views/system/delivery-warehouse-order/api/index.ts create mode 100644 apps/web-antd/src/views/system/delivery-warehouse-order/components/detail-modal.vue create mode 100644 apps/web-antd/src/views/system/delivery-warehouse-order/components/modal.vue create mode 100644 apps/web-antd/src/views/system/delivery-warehouse-order/config/form.ts create mode 100644 apps/web-antd/src/views/system/delivery-warehouse-order/config/search.ts create mode 100644 apps/web-antd/src/views/system/delivery-warehouse-order/config/table.ts create mode 100644 apps/web-antd/src/views/system/delivery-warehouse-order/index.vue create mode 100644 apps/web-antd/src/views/system/delivery-warehouse-stock/api/index.ts create mode 100644 apps/web-antd/src/views/system/delivery-warehouse-stock/config/search.ts create mode 100644 apps/web-antd/src/views/system/delivery-warehouse-stock/config/table.ts create mode 100644 apps/web-antd/src/views/system/delivery-warehouse-stock/index.vue create mode 100644 apps/web-antd/src/views/system/delivery-warehouse-withdrawal/api/index.ts create mode 100644 apps/web-antd/src/views/system/delivery-warehouse-withdrawal/config/form.ts create mode 100644 apps/web-antd/src/views/system/delivery-warehouse-withdrawal/config/table.ts create mode 100644 apps/web-antd/src/views/system/delivery-warehouse-withdrawal/index.vue create mode 100644 apps/web-antd/src/views/system/delivery-warehouse/api/index.ts create mode 100644 apps/web-antd/src/views/system/delivery-warehouse/components/bank-card-report-modal.vue create mode 100644 apps/web-antd/src/views/system/delivery-warehouse/components/bank-card-status-modal.vue create mode 100644 apps/web-antd/src/views/system/delivery-warehouse/components/modal.vue create mode 100644 apps/web-antd/src/views/system/delivery-warehouse/config/form.ts create mode 100644 apps/web-antd/src/views/system/delivery-warehouse/config/search.ts create mode 100644 apps/web-antd/src/views/system/delivery-warehouse/config/table.ts create mode 100644 apps/web-antd/src/views/system/delivery-warehouse/index.vue diff --git a/apps/web-antd/src/components/drug-search-select/drug-search-select.vue b/apps/web-antd/src/components/drug-search-select/drug-search-select.vue index e1c59c86..77498c48 100644 --- a/apps/web-antd/src/components/drug-search-select/drug-search-select.vue +++ b/apps/web-antd/src/components/drug-search-select/drug-search-select.vue @@ -6,19 +6,20 @@ * - 支持中药/西药类型切换 * - 下拉选项展示:药品图片、名称、供应商、规格、价格 * - 选择时返回完整药品数据(包含默认用法字段) + * - isCard:单选确认场景(如仓绑药)选中后以内嵌卡片展示已选药品 * @author 系统 * @date 2024 */ import { ref, watch, onMounted, onUnmounted } from 'vue'; import { SearchOutlined, LoadingOutlined } from '@ant-design/icons-vue'; -import { Input, Spin } from 'ant-design-vue'; +import { Button, Input, Spin } from 'ant-design-vue'; import { debounce } from 'lodash-es'; import { getProductListDoctorReception } from '#/views/doctor/doctor-reception/api'; -/** 中药无图时与仓库列表一致的占位图 */ -const TCM_PLACEHOLDER_IMAGE = +/** 无图时占位(中药/西药等统一兜底,避免仓绑药下拉只剩文字) */ +const DRUG_PLACEHOLDER_IMAGE = 'https://xiaokang88.oss-cn-hangzhou.aliyuncs.com/xk_upload_20250510/cd470ebf97e31c4048ba502ba71b66a3.jpg'; // ==================== Props 定义 ==================== @@ -29,12 +30,17 @@ interface Props { * 1-中药,2-西药 */ type?: number; + /** + * 多药品类型(优先于 type;有值时支持空关键词拉全量) + * 例如 [2,4] 表示西药+中成药 + */ + types?: number[]; /** * 占位提示文本 */ placeholder?: string; /** - * 诊所ID + * 诊所ID(接诊/开方必传;仓药绑定等平台场景可省略,默认 0 走主库 types 检索) */ storeId?: number; /** @@ -45,14 +51,21 @@ interface Props { * 是否禁用 */ disabled?: boolean; + /** + * 是否以卡片展示已选药品(仓绑药等单选确认场景;开方默认 false) + */ + isCard?: boolean; } const props = withDefaults(defineProps(), { type: 1, + types: () => [], placeholder: '输入药品名称搜索', - storeId: 2, + // 默认 0:平台无门店;诊所场景由调用方传 :store-id + storeId: 0, registerId: undefined, disabled: false, + isCard: false, }); // ==================== Emits 定义 ==================== @@ -97,10 +110,21 @@ const containerRef = ref(null); */ const highlightIndex = ref(-1); +/** + * isCard 模式下已选药品(用于输入框下方卡片) + */ +const selectedDrug = ref(null); + +/** + * 搜索框引用,便于「重新选择」时聚焦 + */ +const inputRef = ref<{ focus?: () => void } | null>(null); + +/** + * 解析下拉展示图:优先真图,无图用统一占位 + */ function resolveDropdownImage(item: any): string { - if (item._image) return item._image; - if (props.type === 1) return TCM_PLACEHOLDER_IMAGE; - return ''; + return item._image || DRUG_PLACEHOLDER_IMAGE; } // ==================== 方法定义 ==================== @@ -108,10 +132,12 @@ function resolveDropdownImage(item: any): string { /** * 搜索药品 * @param keyword 搜索关键词 - * @description 调用后端API搜索药品,支持按名称和拼音搜索 + * @description 调用后端API搜索药品,支持按名称和拼音搜索; + * 传入 types 时允许空关键词拉取该类型全量列表(用于下拉展开) */ const searchDrugs = debounce(async (keyword: string) => { - if (!keyword || keyword.length < 1) { + // 单类型模式:空关键词清空;多类型模式:空关键词仍请求后端拉全量 + if ((!keyword || keyword.length < 1) && props.types.length === 0) { searchResults.value = []; showDropdown.value = false; return; @@ -121,37 +147,41 @@ const searchDrugs = debounce(async (keyword: string) => { showDropdown.value = true; try { + // types 优先:有多类型时只传 types,不传 type,避免后端被单 type 覆盖 + const typeParams = + props.types.length > 0 + ? { types: props.types } + : { type: props.type }; const res = await getProductListDoctorReception({ - name: keyword, - type: props.type, + name: keyword || '', + ...typeParams, store_id: props.storeId, ...(props.registerId ? { register_id: props.registerId } : {}), }); - // 处理返回数据 + // 处理返回数据(兼容门店 relation 与平台主库打平结构) if (Array.isArray(res)) { - searchResults.value = res.map((item: any) => ({ - // 保留原始数据 - ...item, - // 提取常用字段便于访问 - _id: item.id, - _drugId: item.drug_id || item.drug?.id, - _drugName: item.drug?.drug_name || item.drug_name || '', - _image: item.drug?.image || '', - _specification: item.drug?.specification || '', - _supplier: item.drug?.supplier?.name || '', - _price: item.price || 0, - // 默认用法字段 - _timeId: item.drug?.time_id || 0, - _typeId: item.drug?.type_id || 0, - _frequencyId: item.drug?.frequency_id || 0, - _unitId: item.drug?.unit_id || 0, - _number: item.drug?.number || 1, - // 用法名称 - _useNum: item.drug?.useNum, - _useType: item.drug?.useType, - _useFrequency: item.drug?.useFrequency, - })); + searchResults.value = res.map((item: any) => { + const drug = item.drug || {}; + return { + ...item, + _id: item.id, + _drugId: item.drug_id || drug.id || item.id, + _drugName: drug.drug_name || item.drug_name || '', + _image: drug.image || item.image || '', + _specification: drug.specification || item.specification || '', + _supplier: drug.supplier?.name || item.supplier?.name || '', + _price: Number(item.price ?? 0), + _timeId: drug.time_id || 0, + _typeId: drug.type_id || 0, + _frequencyId: drug.frequency_id || 0, + _unitId: drug.unit_id || 0, + _number: drug.number || 1, + _useNum: drug.useNum, + _useType: drug.useType, + _useFrequency: drug.useFrequency, + }; + }); } else { searchResults.value = []; } @@ -176,8 +206,14 @@ function handleInput(e: Event) { /** * 处理输入框获得焦点 + * @description 多类型模式聚焦即拉取列表并展开;单类型模式仅在已有结果时展示下拉 */ function handleFocus() { + if (props.types.length > 0) { + searchDrugs(''); + showDropdown.value = true; + return; + } if (searchResults.value.length > 0) { showDropdown.value = true; } @@ -186,15 +222,36 @@ function handleFocus() { /** * 处理选中药品 * @param drug 选中的药品数据 + * @description isCard 时保留 selectedDrug 用于卡片展示;否则清空选中态 */ function handleSelectDrug(drug: any) { emit('select', drug); - - // 清空搜索状态 searchKeyword.value = ''; searchResults.value = []; showDropdown.value = false; highlightIndex.value = -1; + if (props.isCard) { + selectedDrug.value = drug; + } else { + selectedDrug.value = null; + } +} + +/** + * 清空已选卡片并重新搜索(仅 isCard) + * 同步 emit null,便于父级清空 drug_id + */ +function handleReselect() { + selectedDrug.value = null; + searchKeyword.value = ''; + searchResults.value = []; + showDropdown.value = false; + highlightIndex.value = -1; + emit('select', null); + // 下一帧聚焦搜索框,方便重新选药 + setTimeout(() => { + inputRef.value?.focus?.(); + }, 0); } /** @@ -261,6 +318,7 @@ watch( searchResults.value = []; showDropdown.value = false; searchKeyword.value = ''; + selectedDrug.value = null; }, ); @@ -269,6 +327,7 @@ watch(
+ +
+
+ +
+
+
{{ selectedDrug._drugName }}
+
+ ID:{{ selectedDrug._drugId }} + + 规格:{{ selectedDrug._specification }} + + + 供应商:{{ selectedDrug._supplier }} + +
+
+
+ + 暂无 +
+ +
+
@@ -321,12 +423,11 @@ watch(
无图
- +
-
{{ item._drugName }}
-
+ ID:{{ item._drugId }} 规格:{{ item._specification }} @@ -336,9 +437,12 @@ watch(
- +
- ¥{{ Number(item._price).toFixed(2) }} + + 暂无
@@ -347,6 +451,7 @@ watch( diff --git a/apps/web-antd/src/store/prescription.ts b/apps/web-antd/src/store/prescription.ts index 326dec7c..a9baa635 100644 --- a/apps/web-antd/src/store/prescription.ts +++ b/apps/web-antd/src/store/prescription.ts @@ -912,6 +912,7 @@ export const usePrescriptionStore = defineStore('prescription', () => { doctorSecondSignValue = 0, customSendMode: number = 0, customStoreId: number | null = null, + warehouseMap: Record | null = null, ) => { if (currentDrugs.value.length === 0) { message.error('请选择药品'); @@ -986,6 +987,8 @@ export const usePrescriptionStore = defineStore('prescription', () => { // 诊所选择参数(转诊挂号时自动使用承接方诊所ID) send_mode: finalSendMode, custom_store_id: finalSendMode === 1 ? finalStoreId : null, + // 药店按药选配送仓映射 drug_id -> warehouse_id + warehouse_map: warehouseMap || undefined, }); const res = await response; diff --git a/apps/web-antd/src/utils/matchExpressByTrackingNo.ts b/apps/web-antd/src/utils/matchExpressByTrackingNo.ts new file mode 100644 index 00000000..3d21bc99 --- /dev/null +++ b/apps/web-antd/src/utils/matchExpressByTrackingNo.ts @@ -0,0 +1,66 @@ +/** + * 根据运单号前缀推断快递公司(用于发货表单自动选中) + * 匹配关键字同时支持公司名与 code(如 shunfeng) + */ + +export type ExpressMatchOption = { + id?: number; + name?: string; + code?: string; +}; + +/** 常见单号前缀 → 公司名 / code 关键字(按前缀长度降序匹配,避免短前缀误伤) */ +const PREFIX_RULES: Array<{ prefixes: string[]; keywords: string[] }> = [ + { prefixes: ['SF'], keywords: ['顺丰', 'shunfeng', 'sf'] }, + { prefixes: ['ZTO', 'ZT'], keywords: ['中通', 'zhongtong', 'zto'] }, + { prefixes: ['STO'], keywords: ['申通', 'shentong', 'sto'] }, + { prefixes: ['YTO', 'YT'], keywords: ['圆通', 'yuantong', 'yto'] }, + { prefixes: ['YD'], keywords: ['韵达', 'yunda', 'yd'] }, + { prefixes: ['JD'], keywords: ['京东', 'jd', 'jingdong'] }, + { prefixes: ['JT'], keywords: ['极兔', 'jitu', 'jt'] }, + { prefixes: ['EMS', 'E'], keywords: ['ems', '邮政'] }, + { prefixes: ['HHTT', 'HT'], keywords: ['百世', 'baishi', 'huitong'] }, + { prefixes: ['UC'], keywords: ['优速', 'uc'] }, + { prefixes: ['DBL'], keywords: ['德邦', 'debang', 'dbl'] }, +]; + +/** + * 按运单号前缀在 options 中找最可能的快递公司 + * @returns 匹配到的 option,未匹配返回 null + */ +export function matchExpressByTrackingNo( + trackingNo: string | undefined | null, + options: ExpressMatchOption[], +): ExpressMatchOption | null { + const no = String(trackingNo || '') + .trim() + .toUpperCase() + .replace(/\s+/g, ''); + if (!no || !Array.isArray(options) || !options.length) { + return null; + } + const sortedRules = [...PREFIX_RULES].sort( + (a, b) => + Math.max(...b.prefixes.map((p) => p.length)) - + Math.max(...a.prefixes.map((p) => p.length)), + ); + let matchedKeywords: string[] | null = null; + for (const rule of sortedRules) { + if (rule.prefixes.some((p) => no.startsWith(p))) { + matchedKeywords = rule.keywords; + break; + } + } + if (!matchedKeywords) { + return null; + } + const keywords = matchedKeywords.map((k) => k.toLowerCase()); + for (const opt of options) { + const name = String(opt.name || '').toLowerCase(); + const code = String(opt.code || '').toLowerCase(); + if (keywords.some((k) => name.includes(k) || code === k || code.includes(k))) { + return opt; + } + } + return null; +} diff --git a/apps/web-antd/src/views/business/chat/components/PrescriptionModal.vue b/apps/web-antd/src/views/business/chat/components/PrescriptionModal.vue index 8ecc11bf..be80c5b0 100644 --- a/apps/web-antd/src/views/business/chat/components/PrescriptionModal.vue +++ b/apps/web-antd/src/views/business/chat/components/PrescriptionModal.vue @@ -56,6 +56,8 @@ import InfoModal from '#/components/modal/InfoModal.vue'; import { DrugSearchSelect } from '#/components/drug-search-select'; import { formatPriceDisplay } from '#/utils/formatPrice'; import ChineseMedicineConfig from '#/views/doctor/doctor-reception/components/ChineseMedicineConfig.vue'; +import { getDeliveryWarehouseOptionsByDrugs } from '#/views/doctor/doctor-reception/api'; +import WarehouseSelectModal from './WarehouseSelectModal.vue'; const splitString = (input: string) => input.split(','); @@ -210,6 +212,77 @@ const handleCheckChineseMedicineConflict = async () => { } }; +// 药店开方待选仓时暂存发送参数 +const pendingSendParams = ref<{ + doctorSecondSignValue: number; + sendMode: number; + customStoreId: number | null; +} | null>(null); + +const [WarehouseSelectModals, warehouseSelectModalApi] = useVbenModal({ + connectedComponent: WarehouseSelectModal, +}); + +/** + * 药店在线问诊:若药品有配送仓绑定,则先弹选仓再发送 + */ +const tryPharmacyWarehouseSelect = async ( + doctorSecondSignValue: number, + sendMode: number, + customStoreId: number | null, +): Promise => { + const storagePrefix = + modalData.value?.storagePrefix || 'onlineConsultation-'; + // 诊所在线复诊前缀不走手动选仓(后端自动按报价) + if (storagePrefix === 'onlineConsultationClinic-') { + return false; + } + const drugs = prescriptionStore.currentDrugs || []; + const drugIds = drugs.map((d: any) => Number(d.id)).filter((id: number) => id > 0); + if (drugIds.length === 0) { + return false; + } + const needQtyMap: Record = {}; + drugs.forEach((d: any) => { + needQtyMap[Number(d.id)] = Number(d.select_number || d.number || 1); + }); + const optionsMap = await getDeliveryWarehouseOptionsByDrugs({ + drug_ids: drugIds.join(','), + need_qty_map: needQtyMap, + }); + const rows: any[] = []; + Object.keys(optionsMap || {}).forEach((drugId) => { + const list = optionsMap[drugId] || []; + if (!list.length) return; + const drug = drugs.find((d: any) => Number(d.id) === Number(drugId)); + rows.push({ + drug_id: Number(drugId), + drug_name: drug?.drug_name || drug?.name || `药品#${drugId}`, + options: list, + }); + }); + if (rows.length === 0) { + return false; + } + pendingSendParams.value = { doctorSecondSignValue, sendMode, customStoreId }; + warehouseSelectModalApi.setData({ rows }); + warehouseSelectModalApi.open(); + return true; +}; + +const onWarehouseSelected = async (warehouseMap: Record) => { + if (!pendingSendParams.value) return; + const { doctorSecondSignValue, sendMode, customStoreId } = + pendingSendParams.value; + pendingSendParams.value = null; + await executeSendPrescription( + doctorSecondSignValue, + sendMode, + customStoreId, + warehouseMap, + ); +}; + // 处方发送前的确认流程 const handleSendPrescription = async (doctorSecondSignValue = 0) => { // 确保基础数据已初始化(包括当前诊所列表) @@ -219,14 +292,24 @@ const handleSendPrescription = async (doctorSecondSignValue = 0) => { await prescriptionStore.fetchRegisterStoreInfo(); const storeInfo = prescriptionStore.registerStoreInfo; - + let sendMode = 0; + let customStoreId: number | null = null; if (storeInfo?.is_from_transfer === 1 && storeInfo?.delegate_store_id) { - await executeSendPrescription(doctorSecondSignValue, 1, storeInfo.delegate_store_id); + sendMode = 1; + customStoreId = storeInfo.delegate_store_id; } else if (storeInfo?.store_id) { - await executeSendPrescription(doctorSecondSignValue, 1, storeInfo.store_id); - } else { - await executeSendPrescription(doctorSecondSignValue, 0, null); + sendMode = 1; + customStoreId = storeInfo.store_id; } + const needSelect = await tryPharmacyWarehouseSelect( + doctorSecondSignValue, + sendMode, + customStoreId, + ); + if (needSelect) { + return; + } + await executeSendPrescription(doctorSecondSignValue, sendMode, customStoreId); }; // 执行发送处方 @@ -234,11 +317,13 @@ const executeSendPrescription = async ( doctorSecondSignValue: number, sendMode: number, customStoreId: number | null, + warehouseMap: Record | null = null, ) => { const result = await prescriptionStore.sendPrescription( doctorSecondSignValue, sendMode, customStoreId, + warehouseMap, ); // 检查返回结果,可能是boolean或包含转诊信息的对象 @@ -1505,6 +1590,8 @@ const cancelSaveCommonPrescription = () => { + + diff --git a/apps/web-antd/src/views/business/chat/components/WarehouseSelectModal.vue b/apps/web-antd/src/views/business/chat/components/WarehouseSelectModal.vue new file mode 100644 index 00000000..8509d832 --- /dev/null +++ b/apps/web-antd/src/views/business/chat/components/WarehouseSelectModal.vue @@ -0,0 +1,92 @@ + + + diff --git a/apps/web-antd/src/views/business/order/product-order/components/detail.vue b/apps/web-antd/src/views/business/order/product-order/components/detail.vue index 3b45118c..0b4b01ec 100644 --- a/apps/web-antd/src/views/business/order/product-order/components/detail.vue +++ b/apps/web-antd/src/views/business/order/product-order/components/detail.vue @@ -249,7 +249,7 @@ function prescriptionStatusColor() { {{ data.trans_expenses }} 元 - {{ data.free_ship === 1 ? '是' : '否' }} + {{ data.free_ship === 0 ? '是' : '否' }} 待支付 diff --git a/apps/web-antd/src/views/business/order/product-order/config/form.ts b/apps/web-antd/src/views/business/order/product-order/config/form.ts index 9e15799a..0361eece 100644 --- a/apps/web-antd/src/views/business/order/product-order/config/form.ts +++ b/apps/web-antd/src/views/business/order/product-order/config/form.ts @@ -40,6 +40,16 @@ export const modalFormProps: VbenFormProps = { formItemClass: 'col-span-6', label: '快递公司', rules: 'required', + // 单号变化时传入 trackingNo,组件按前缀自动匹配快递公司 + dependencies: { + triggerFields: ['express_no'], + componentProps(values) { + return { + placeholder: '请选择快递公司', + trackingNo: values.express_no, + }; + }, + }, }, { component: 'Textarea', diff --git a/apps/web-antd/src/views/business/order/product-order/config/table.ts b/apps/web-antd/src/views/business/order/product-order/config/table.ts index d6c34657..d0e597ea 100644 --- a/apps/web-antd/src/views/business/order/product-order/config/table.ts +++ b/apps/web-antd/src/views/business/order/product-order/config/table.ts @@ -37,6 +37,12 @@ export const gridOptions: VxeGridProps = { width: 200, slots: { default: 'express-info' }, }, + { + field: 'delivery_warehouses', + title: '配送仓库', + width: 160, + slots: { default: 'delivery-warehouses' }, + }, { field: 'delivery_method', title: '订单类型&邮寄方式&订单状态', diff --git a/apps/web-antd/src/views/business/order/product-order/index.vue b/apps/web-antd/src/views/business/order/product-order/index.vue index 876cfb65..8ccb6042 100644 --- a/apps/web-antd/src/views/business/order/product-order/index.vue +++ b/apps/web-antd/src/views/business/order/product-order/index.vue @@ -643,6 +643,22 @@ const openOrderAmountVerify = () => {
{{ formatExpressAddress(row) }}
+ + - - - -