diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 8e7320ad..e1f3ed36 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -1,6 +1,6 @@ { "name": "@vben/desktop", - "version": "0.1.0", + "version": "0.1.1", "private": true, "description": "萧康云医 PC 桌面端(Electron 壳,打包加载 web-antd 生产构建产物)", "author": "萧康云医", diff --git a/apps/web-antd/src/api/region-picker.ts b/apps/web-antd/src/api/region-picker.ts new file mode 100644 index 00000000..1a425cce --- /dev/null +++ b/apps/web-antd/src/api/region-picker.ts @@ -0,0 +1,64 @@ +import { requestClient } from '#/api/request'; + +const prefix = 'region-picker/'; + +/** 子节点项(children 接口) */ +export interface RegionPickerChild { + id: number; + name: string; + code: string; + pid: number; + level: number; + pinyin_first: string; + pinyin_full: string; + deleted_at: number; + has_children: boolean; +} + +/** 搜索命中项 */ +export interface RegionPickerSearchHit extends RegionPickerChild { + path: { id: number; name: string; level: number; pid: number }[]; + path_label: string; + complete: boolean; +} + +/** 按省+叶解析 */ +export interface RegionPickerResolvedPair { + province_id: number; + city_id: number; + province?: RegionPickerChild | null; + city?: { id: number; name: string; level: number; pid: number } | null; + district?: { id: number; name: string; level: number; pid: number } | null; + path_label: string; +} + +/** 懒加载子级 xk-api GET /region-picker/children */ +export async function getRegionChildren(pid = 0) { + return requestClient.get(`${prefix}children`, { + params: { pid }, + }); +} + +/** 合一搜索 xk-api GET /region-picker/search */ +export async function searchRegions(keyword: string, limit = 30) { + return requestClient.get(`${prefix}search`, { + params: { keyword, limit }, + }); +} + +/** 按省+叶回显 xk-api GET /region-picker/resolve */ +export async function resolveRegionPair(provinceId: number, cityId: number) { + return requestClient.get(`${prefix}resolve`, { + params: { province_id: provinceId, city_id: cityId }, + }); +} + +/** 批量 ID 解析 */ +export async function resolveRegionIds(ids: number[]) { + return requestClient.get<{ items: RegionPickerSearchHit[] }>( + `${prefix}resolve`, + { + params: { ids: ids.join(',') }, + }, + ); +} diff --git a/apps/web-antd/src/components/form/components/region-address-picker.vue b/apps/web-antd/src/components/form/components/region-address-picker.vue index fa17db5b..18f6c2fb 100644 --- a/apps/web-antd/src/components/form/components/region-address-picker.vue +++ b/apps/web-antd/src/components/form/components/region-address-picker.vue @@ -1,8 +1,12 @@ @@ -1554,7 +1660,7 @@ function buildRowActions(row: Record): { @open-warehouse="openChangeWarehouse" @toggle-free-shipping="toggleFreeShipping" @percent-adjust="openOrderPercentAdjust" - @go-register="goRegisterOrder" + @go-register="openRegisterDetail" @open-china-erp-sync-log="openChinaErpSyncLog" @accrue-salesperson="handleAccrueSalesperson" @reverse-salesperson="handleReverseSalesperson" diff --git a/apps/web-antd/src/views/doctor/doctor-reception/components/CreateUserPatientModal.vue b/apps/web-antd/src/views/doctor/doctor-reception/components/CreateUserPatientModal.vue index 2287460d..92b01f37 100644 --- a/apps/web-antd/src/views/doctor/doctor-reception/components/CreateUserPatientModal.vue +++ b/apps/web-antd/src/views/doctor/doctor-reception/components/CreateUserPatientModal.vue @@ -38,8 +38,8 @@ import { } from '#/views/doctor/doctor-reception/config/health-history'; import RegionAddressPicker from '#/components/form/components/region-address-picker.vue'; import { + ensureResolvedAddress, formatAddressDisplay, - resolveAddressValue, type AddressValue, } from '#/util/address-index'; @@ -237,11 +237,12 @@ function setHistoryTags(historyField: keyof ReturnType, t * 组装提交体:不展示的月经/婚育强制清零;history 仅在 status=有 时带出 * 收货地址:有详细地址才带省市区字段,后端据此建 yii_address */ -function buildSubmitPayload() { +async function buildSubmitPayload() { const f = form.value; const menstrualOk = showMenstrualHistory.value; const maritalOk = showMaritalHistory.value; - const resolved = resolveAddressValue(f.ship_region); + // 提交前按 ID 解析名称(含软删回显),避免本地树删除后取不到省市区文案 + const resolved = await ensureResolvedAddress(f.ship_region); const detail = String(f.ship_detail_address || '').trim(); const shipPayload = detail && (resolved.province || resolved.city || resolved.district) @@ -249,7 +250,8 @@ function buildSubmitPayload() { ship_province: resolved.province?.label || '', ship_city: resolved.city?.label || '', ship_area: resolved.district?.label || '', - ship_region: formatAddressDisplay(f.ship_region), + ship_region: + resolved.pathLabel || formatAddressDisplay(f.ship_region), ship_detail_address: detail, ship_name: String(f.ship_name || f.name || '').trim(), ship_mobile: String(f.ship_mobile || f.mobile || '').trim(), @@ -322,7 +324,7 @@ const [Modal, modalApi] = useVbenModal({ submitting.value = true; modalApi.setState({ confirmLoading: true }); try { - const res = await createUserPatientApi(buildSubmitPayload()); + const res = await createUserPatientApi(await buildSubmitPayload()); message.success('创建成功,已自动挂号'); // 先回调再关窗:父级按 is_pay 决定选中列表或弹认领码 onSuccessCb.value?.(res as CreateUserPatientResult); diff --git a/apps/web-antd/src/views/log/components/sync-china-order-content-viewer.vue b/apps/web-antd/src/views/log/components/sync-china-order-content-viewer.vue new file mode 100644 index 00000000..5bbb6f15 --- /dev/null +++ b/apps/web-antd/src/views/log/components/sync-china-order-content-viewer.vue @@ -0,0 +1,539 @@ + + + + + diff --git a/apps/web-antd/src/views/log/mes-open-api-log/components/detail-modal.vue b/apps/web-antd/src/views/log/mes-open-api-log/components/detail-modal.vue index df1cac4b..651b1316 100644 --- a/apps/web-antd/src/views/log/mes-open-api-log/components/detail-modal.vue +++ b/apps/web-antd/src/views/log/mes-open-api-log/components/detail-modal.vue @@ -1,26 +1,19 @@ diff --git a/apps/web-antd/src/views/log/sync-china-order-log/components/detail-modal.vue b/apps/web-antd/src/views/log/sync-china-order-log/components/detail-modal.vue index abaf9622..46c103d5 100644 --- a/apps/web-antd/src/views/log/sync-china-order-log/components/detail-modal.vue +++ b/apps/web-antd/src/views/log/sync-china-order-log/components/detail-modal.vue @@ -1,22 +1,18 @@ diff --git a/apps/web-antd/src/views/system/region/components/modal.vue b/apps/web-antd/src/views/system/region/components/modal.vue index d161ef9c..f1e53fc0 100644 --- a/apps/web-antd/src/views/system/region/components/modal.vue +++ b/apps/web-antd/src/views/system/region/components/modal.vue @@ -14,14 +14,23 @@ const onSuccessRef = ref<(() => void) | null>(null); const [Form, formApi] = useVbenForm(modalFormProps); -function buildSubmitPayload(values: Record) { +/** + * 组装提交字段:市/区暂不提交快递费(字段保留,后续级联启用再开) + * 新建子级仍写 0,避免库字段空值;编辑子级不改 express_fee + */ +function buildSubmitPayload(values: Record, update: boolean) { const formLevel = Number(values.formLevel); - return { + const payload: Record = { id: values.id, name: values.name, pid: formLevel === 1 ? 0 : values.pid, - express_fee: values.express_fee ?? 0, }; + if (formLevel === 1) { + payload.express_fee = values.express_fee ?? 0; + } else if (!update) { + payload.express_fee = 0; + } + return payload; } function validateFormValues(values: Record) { @@ -34,13 +43,16 @@ function validateFormValues(values: Record) { message.error('请选择父级地区'); return false; } - if ( - values.express_fee === null || - values.express_fee === undefined || - values.express_fee === '' - ) { - message.error('请输入快递费'); - return false; + // 仅省级要求填快递费;市/区入口已隐藏 + if (formLevel === 1) { + if ( + values.express_fee === null || + values.express_fee === undefined || + values.express_fee === '' + ) { + message.error('请输入快递费'); + return false; + } } return true; } @@ -58,7 +70,7 @@ const [Modal, modalApi] = useVbenModal({ if (!validateFormValues(values)) { return; } - const payload = buildSubmitPayload(values); + const payload = buildSubmitPayload(values, isUpdate.value); modalApi.setState({ loading: true, confirmLoading: true }); const submitApi = isUpdate.value ? updateRegion : createRegion; submitApi(payload) @@ -79,10 +91,11 @@ const [Modal, modalApi] = useVbenModal({ isUpdate.value = update; onSuccessRef.value = onSuccess ?? null; const levelLabels: Record = { - 1: '地区', - 2: '子地区', + 1: '省级地区', + 2: '市级地区', + 3: '区县', }; - modalTitle.value = `${update ? '编辑' : '新增'}${levelLabels[formLevel] ?? '快递费'}`; + modalTitle.value = `${update ? '编辑' : '新增'}${levelLabels[formLevel] ?? '地区'}`; formApi.resetForm(); if (values) { formApi.setValues({ ...values, formLevel }); diff --git a/apps/web-antd/src/views/system/region/components/region-info-bar.vue b/apps/web-antd/src/views/system/region/components/region-info-bar.vue index f9469af0..2d1876d0 100644 --- a/apps/web-antd/src/views/system/region/components/region-info-bar.vue +++ b/apps/web-antd/src/views/system/region/components/region-info-bar.vue @@ -1,4 +1,6 @@