This commit is contained in:
Your Name
2026-05-19 10:18:00 +08:00
parent 4f9494db0b
commit 0fb51e12d1
7 changed files with 231 additions and 9 deletions
+5
View File
@@ -500,6 +500,11 @@ export function prescriptionOrderUpdateAmount(params: { id: number; amount: numb
return request.post({ url: '/tcm.prescriptionOrder/updateAmount', params })
}
/** 设置发货类型:gancao 甘草药房 / direct 洛阳药房 */
export function prescriptionOrderSetShipMode(params: { id: number; ship_mode: 'gancao' | 'direct' }) {
return request.post({ url: '/tcm.prescriptionOrder/setShipMode', params })
}
// ========== 处方库 ==========
// 处方库列表
@@ -562,6 +562,28 @@
round
class="ml-2"
>甘草 {{ detailData.gancao_reciperl_order_no }}</el-tag>
<div v-if="detailData" class="flex items-center gap-2 ml-4 shrink-0">
<span class="text-sm text-gray-500">发货类型</span>
<el-radio-group
v-perms="['tcm.prescriptionOrder/setShipMode']"
:model-value="normalizeShipMode(detailData.ship_mode)"
size="small"
:disabled="shipModeSaving || !canEditShipMode(detailData)"
@change="onDetailShipModeChange"
>
<el-radio-button label="gancao">甘草药房</el-radio-button>
<el-radio-button
label="direct"
:disabled="isShipModeLockedToGancao(detailData)"
>洛阳药房</el-radio-button>
</el-radio-group>
<el-tag
v-if="!hasSetShipModePerm"
:type="normalizeShipMode(detailData.ship_mode) === 'direct' ? 'warning' : 'success'"
effect="plain"
round
>{{ shipModeLabel(detailData.ship_mode) }}</el-tag>
</div>
</div>
<div v-if="detailData" class="flex items-center gap-2 mr-6">
<el-button
@@ -1925,10 +1947,12 @@
/>
<el-form v-loading="shipSaving" label-width="90px" class="pr-2" @submit.prevent="submitShip">
<el-form-item label="发货方式">
<el-radio-group v-model="shipForm.ship_mode">
<el-radio label="gancao">甘草药房直发</el-radio>
<el-radio label="direct">洛阳药房直发</el-radio>
</el-radio-group>
<el-tag
:type="normalizeShipMode(shipForm.ship_mode) === 'direct' ? 'warning' : 'success'"
effect="plain"
size="default"
>{{ shipDialogModeDisplay }}</el-tag>
<span class="text-xs text-gray-400 ml-2">请在订单详情顶部发货类型中设置此处不可修改</span>
</el-form-item>
<el-form-item label="承运商">
<el-select v-model="shipForm.express_company" class="w-full">
@@ -2571,6 +2595,7 @@ import {
prescriptionOrderShip,
prescriptionOrderLogs,
prescriptionOrderUpdateAmount,
prescriptionOrderSetShipMode,
prescriptionOrderAddPayOrder,
prescriptionOrderComplete,
prescriptionOrderRevokeRxAudit,
@@ -3364,6 +3389,70 @@ function canShipRow(row: { fulfillment_status?: number }) {
return Number(row.fulfillment_status) === 2
}
type ShipMode = 'gancao' | 'direct'
const hasSetShipModePerm = computed(() => {
const p = userStore.perms || []
return p.includes('*') || p.includes('tcm.prescriptionOrder/setShipMode')
})
function normalizeShipMode(v: unknown): ShipMode {
return String(v || '').toLowerCase() === 'direct' ? 'direct' : 'gancao'
}
function shipModeLabel(v: unknown): string {
return normalizeShipMode(v) === 'direct' ? '洛阳药房' : '甘草药房'
}
function isShipModeLockedToGancao(row: { gancao_reciperl_order_no?: string | null }) {
return String(row.gancao_reciperl_order_no || '').trim() !== ''
}
function canEditShipMode(row: { fulfillment_status?: number }) {
const fs = Number(row.fulfillment_status)
return fs !== 3 && fs !== 4
}
const shipModeSaving = ref(false)
function isSamePrescriptionOrderId(a: unknown, b: unknown) {
const na = Number(a)
const nb = Number(b)
return na > 0 && na === nb
}
const shipDialogModeDisplay = computed(() => {
return normalizeShipMode(shipForm.ship_mode) === 'direct' ? '洛阳药房直发' : '甘草药房直发'
})
async function onDetailShipModeChange(mode: string | number | boolean | undefined) {
const row = detailData.value
if (!row?.id) return
const next = normalizeShipMode(mode)
const prev = normalizeShipMode(row.ship_mode)
if (next === prev) return
if (!canEditShipMode(row)) {
feedback.msgWarning('当前订单状态不可修改发货类型')
return
}
shipModeSaving.value = true
try {
await prescriptionOrderSetShipMode({ id: row.id, ship_mode: next })
if (detailData.value) detailData.value.ship_mode = next
if (shipVisible.value && isSamePrescriptionOrderId(shipRowId.value, row.id)) {
shipForm.ship_mode = next
}
await refreshCurrentPrescriptionOrderDetail()
feedback.msgSuccess('发货类型已保存')
getLists()
void fetchLogs(row.id)
} catch {
/* 拦截器已提示 */
} finally {
shipModeSaving.value = false
}
}
function canAddPayOrderRow(row: { fulfillment_status?: number }) {
// (5) / (6)
const fs = Number(row.fulfillment_status)
@@ -4745,14 +4834,31 @@ const shipForm = reactive({
tracking_number: ''
})
function resolveShipModeForRow(row: { id: number; ship_mode?: unknown }) {
if (isSamePrescriptionOrderId(detailData.value?.id, row.id)) {
return normalizeShipMode(detailData.value!.ship_mode)
}
return normalizeShipMode(row.ship_mode)
}
function openShip(row: { id: number; express_company?: unknown; tracking_number?: unknown; ship_mode?: unknown }) {
shipRowId.value = row.id
shipForm.ship_mode = String(row.ship_mode || 'gancao') || 'gancao'
shipRowId.value = Number(row.id)
shipForm.ship_mode = resolveShipModeForRow(row)
shipForm.express_company = String(row.express_company || 'auto') || 'auto'
shipForm.tracking_number = String(row.tracking_number || '')
shipVisible.value = true
}
watch(
() => detailData.value?.ship_mode,
(v) => {
if (!shipVisible.value || !shipRowId.value || !isSamePrescriptionOrderId(detailData.value?.id, shipRowId.value)) {
return
}
shipForm.ship_mode = normalizeShipMode(v)
}
)
async function submitShip() {
if (!shipForm.tracking_number.trim()) {
feedback.msgError('请先填写快递单号再确认发货')
@@ -4762,7 +4868,7 @@ async function submitShip() {
try {
await prescriptionOrderShip({
id: shipRowId.value,
ship_mode: shipForm.ship_mode === 'direct' ? 'direct' : 'gancao',
ship_mode: normalizeShipMode(shipForm.ship_mode),
express_company: shipForm.express_company || 'auto',
tracking_number: shipForm.tracking_number.trim()
})