This commit is contained in:
Your Name
2026-04-16 11:13:26 +08:00
parent 3d9c5dd8f5
commit 8022229e71
16 changed files with 1703 additions and 231 deletions
@@ -122,7 +122,7 @@
<div class="info-section">
<el-row :gutter="16">
<el-col :span="12">
<el-col :span="8">
<el-form-item label="处方类型" prop="prescription_type">
<el-select v-model="formData.prescription_type" placeholder="请选择处方类型" class="!w-full">
<el-option label="浓缩水丸" value="浓缩水丸" />
@@ -137,14 +137,14 @@
</el-col>
<!-- 用量字段 -->
<el-col :span="12">
<el-col :span="8">
<el-form-item label="用量" prop="dosage_amount">
<!-- 浓缩水丸1-10g 下拉选择 -->
<el-select
v-if="formData.prescription_type === '浓缩水丸'"
v-model="formData.dosage_amount"
placeholder="请选择用量"
class="!w-32"
class="!w-full"
>
<el-option :label="1 + 'g'" :value="1" />
<el-option :label="2 + 'g'" :value="2" />
@@ -162,11 +162,13 @@
v-else-if="formData.prescription_type === '饮片'"
v-model="formData.dosage_amount"
placeholder="请选择用量"
class="!w-32"
class="!w-full"
>
<el-option label="50ml" :value="50" />
<el-option label="100ml" :value="100" />
<el-option label="120ml" :value="120" />
<el-option label="150ml" :value="150" />
<el-option label="180ml" :value="180" />
<el-option label="200ml" :value="200" />
<el-option label="250ml" :value="250" />
</el-select>
@@ -176,14 +178,31 @@
v-model="formData.dosage_amount"
:min="0"
:precision="2"
class="!w-32"
class="!w-full"
/>
<span v-if="formData.prescription_type !== '浓缩水丸' && formData.prescription_type !== '饮片'" class="ml-2">{{ formData.dosage_unit }}</span>
</el-form-item>
</el-col>
<!-- 饮片每贴出包数 -->
<el-col v-if="formData.prescription_type === '饮片'" :span="8">
<el-form-item label="每贴出包数" prop="bags_per_dose">
<el-select v-model="formData.bags_per_dose" placeholder="请选择" class="!w-full">
<el-option label="1包" :value="1" />
<el-option label="2包" :value="2" />
<el-option label="3包" :value="3" />
<el-option label="4包" :value="4" />
<el-option label="5包" :value="5" />
<el-option label="6包" :value="6" />
<el-option label="7包" :value="7" />
<el-option label="8包" :value="8" />
<el-option label="9包" :value="9" />
</el-select>
</el-form-item>
</el-col>
<!-- 饮片代煎选项 -->
<el-col v-if="formData.prescription_type === '饮片'" :span="12">
<el-col v-if="formData.prescription_type === '饮片'" :span="8">
<el-form-item label="是否代煎" prop="need_decoction">
<el-radio-group v-model="formData.need_decoction">
<el-radio :label="true">代煎</el-radio>
@@ -191,6 +210,7 @@
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="服用天数" prop="usage_days">
<el-input-number v-model="formData.usage_days" :min="1" :max="365" class="!w-full" />
@@ -198,7 +218,7 @@
</el-col>
<el-col :span="8">
<el-form-item label="每天几次" prop="times_per_day">
<el-input-number v-model="formData.times_per_day" :min="1" :max="10" class="!w-full" placeholder="每天服用次数" />
<el-input-number v-model="formData.times_per_day" :min="1" :max="6" class="!w-full" placeholder="每天服用次数" />
</el-form-item>
</el-col>
<!-- <el-col :span="8">
@@ -641,6 +661,7 @@ interface PrescriptionForm {
dosage_amount: number | undefined // 用量数值
dosage_unit: string // 用量单位 (g 或 ml)
need_decoction: boolean // 是否代煎(仅饮片)
bags_per_dose: number // 每贴出包数(仅饮片,1-9包)
patient_name: string
gender: number
gender_desc: string
@@ -721,6 +742,7 @@ const formData = reactive<PrescriptionForm>({
dosage_amount: 1,
dosage_unit: 'g',
need_decoction: false,
bags_per_dose: 1,
patient_name: '',
gender: 0,
gender_desc: '女',
@@ -1129,14 +1151,17 @@ watch(() => formData.prescription_type, (newType) => {
formData.dosage_unit = 'g'
formData.dosage_amount = 1
formData.need_decoction = false
formData.bags_per_dose = 1
} else if (newType === '饮片') {
formData.dosage_unit = 'ml'
formData.dosage_amount = 50
formData.bags_per_dose = 1
// need_decoction 保持用户选择
} else {
formData.dosage_unit = 'g'
formData.dosage_amount = undefined
formData.need_decoction = false
formData.bags_per_dose = 1
}
})
@@ -1190,6 +1215,7 @@ const handleSave = async () => {
dosage_amount: formData.dosage_amount,
dosage_unit: formData.dosage_unit,
need_decoction: formData.need_decoction,
bags_per_dose: formData.bags_per_dose,
usage_days: formData.usage_days,
times_per_day: formData.times_per_day,
usage_instruction: formData.usage_instruction,
+194 -127
View File
@@ -605,11 +605,13 @@
placeholder="请选择用量"
class="w-full"
>
<el-option label="50ml" :value="50" />
<el-option label="100ml" :value="100" />
<el-option label="150ml" :value="150" />
<el-option label="200ml" :value="200" />
<el-option label="250ml" :value="250" />
<el-option label="50ml" :value="50" />
<el-option label="100ml" :value="100" />
<el-option label="120ml" :value="120" />
<el-option label="150ml" :value="150" />
<el-option label="180ml" :value="180" />
<el-option label="200ml" :value="200" />
<el-option label="250ml" :value="250" />
</el-select>
<!-- 其他类型:自由输入 -->
<el-input-number
@@ -631,9 +633,27 @@
</el-radio-group>
</el-form-item>
</el-col>
<!-- 饮片每贴出包数 -->
<el-col v-if="editForm.prescription_type === '饮片'" :span="8">
<el-form-item label="每贴出包数" prop="bags_per_dose">
<el-select v-model="editForm.bags_per_dose" placeholder="请选择" class="w-full">
<el-option label="1包" :value="1" />
<el-option label="2包" :value="2" />
<el-option label="3包" :value="3" />
<el-option label="4包" :value="4" />
<el-option label="5包" :value="5" />
<el-option label="6包" :value="6" />
<el-option label="7包" :value="7" />
<el-option label="8包" :value="8" />
<el-option label="9包" :value="9" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="每天几次" prop="times_per_day">
<el-input-number v-model="editForm.times_per_day" :min="1" :max="10" class="!w-full" placeholder="每天服用次数" />
<el-input-number v-model="editForm.times_per_day" :min="1" :max="6" class="!w-full" placeholder="每天服用次数" />
</el-form-item>
</el-col>
<el-col :span="8">
@@ -859,7 +879,7 @@
<el-cascader
v-model="createOrderForm.region"
:options="regionOptions"
:props="{ value: 'name', label: 'name', children: 'children', emitPath: false, checkStrictly: false }"
:props="{ value: 'name', label: 'name', children: 'children', emitPath: true, checkStrictly: false }"
placeholder="请选择省/市/区"
clearable
filterable
@@ -1267,143 +1287,138 @@ const createOrderForm = reactive({
})
// 省市区数据(简化版,实际项目中应该从 API 获取或使用完整的省市区数据)
const regionOptions = ref([
{
name: '四川省',
children: [
const regionOptions = ref([])
// 转换省市区数据格式
const transformRegionData = (data: any[]) => {
return data.map((province: any) => ({
name: province.province,
code: province.code,
children: province.citys?.map((city: any) => ({
name: city.city,
code: city.code,
children: city.areas?.map((area: any) => ({
name: area.area,
code: area.code
})) || []
})) || []
}))
}
// 加载省市区数据
const loadRegionData = async () => {
try {
console.log('开始加载省市区数据...')
// 使用代理路径,需要在vite.config.ts中配置代理
const response = await fetch('/api-proxy/area/ChinaCitys.json')
console.log('响应状态:', response.status)
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`)
}
const data = await response.json()
console.log('加载的数据条数:', data?.length)
// 转换数据格式
regionOptions.value = transformRegionData(data)
console.log('regionOptions 已设置,条数:', regionOptions.value.length)
} catch (error) {
console.error('加载省市区数据失败:', error)
// 如果加载失败,使用基本的省市数据作为后备
regionOptions.value = [
{
name: '成都市',
name: '四川省',
children: [
{ name: '锦江区' },
{ name: '青羊区' },
{ name: '金牛区' },
{ name: '武侯区' },
{ name: '成华区' },
{ name: '龙泉驿区' },
{ name: '青白江区' },
{ name: '新都区' },
{ name: '温江区' },
{ name: '双流区' },
{ name: '都区' },
{ name: '新津区' },
{ name: '都江堰市' },
{ name: '彭州市' },
{ name: '邛崃市' },
{ name: '崇州市' },
{ name: '阳市' },
{ name: '金堂县' },
{ name: '大邑县' },
{ name: '蒲江县' }
{
name: '成都市',
children: [
{ name: '锦江区' },
{ name: '青羊区' },
{ name: '金牛区' },
{ name: '武侯区' },
{ name: '成华区' },
{ name: '龙泉驿区' },
{ name: '青白江区' },
{ name: '都区' },
{ name: '温江区' },
{ name: '双流区' }
]
},
{
name: '阳市',
children: [
{ name: '涪城区' },
{ name: '游仙区' },
{ name: '安州区' }
]
}
]
},
{
name: '绵阳市',
children: [
{ name: '涪城区' },
{ name: '游仙区' },
{ name: '安州区' },
{ name: '江油市' },
{ name: '三台县' },
{ name: '盐亭县' },
{ name: '梓潼县' },
{ name: '北川羌族自治县' },
{ name: '平武县' }
]
}
]
},
{
name: '北京市',
children: [
{
name: '北京市',
children: [
{ name: '东城区' },
{ name: '西城区' },
{ name: '朝阳区' },
{ name: '丰台区' },
{ name: '石景山区' },
{ name: '海淀区' },
{ name: '门头沟区' },
{ name: '房山区' },
{ name: '通州区' },
{ name: '顺义区' },
{ name: '昌平区' },
{ name: '大兴区' },
{ name: '怀柔区' },
{ name: '平谷区' },
{ name: '密云区' },
{ name: '延庆区' }
]
}
]
},
{
name: '上海市',
children: [
{
name: '上海市',
children: [
{ name: '黄浦区' },
{ name: '徐汇区' },
{ name: '长宁区' },
{ name: '静安区' },
{ name: '普陀区' },
{ name: '虹口区' },
{ name: '杨浦区' },
{ name: '闵行区' },
{ name: '宝山区' },
{ name: '嘉定区' },
{ name: '浦东新区' },
{ name: '金山区' },
{ name: '松江区' },
{ name: '青浦区' },
{ name: '奉贤区' },
{ name: '崇明区' }
]
}
]
},
{
name: '广东省',
children: [
{
name: '广州市',
children: [
{ name: '荔湾区' },
{ name: '越秀区' },
{ name: '海珠区' },
{ name: '天河区' },
{ name: '白云区' },
{ name: '黄埔区' },
{ name: '番禺区' },
{ name: '花都区' },
{ name: '南沙区' },
{ name: '从化区' },
{ name: '增城区' }
{
name: '北京市',
children: [
{ name: '东城区' },
{ name: '西城区' },
{ name: '朝阳区' },
{ name: '丰台区' },
{ name: '海淀区' }
]
}
]
},
{
name: '深圳市',
name: '上海市',
children: [
{ name: '罗湖区' },
{ name: '福田区' },
{ name: '南山区' },
{ name: '宝安区' },
{ name: '龙岗区' },
{ name: '盐田区' },
{ name: '龙华区' },
{ name: '坪山区' },
{ name: '光明区' }
{
name: '上海市',
children: [
{ name: '黄浦区' },
{ name: '徐汇区' },
{ name: '长宁区' },
{ name: '静安区' },
{ name: '普陀区' }
]
}
]
},
{
name: '广东省',
children: [
{
name: '广州市',
children: [
{ name: '荔湾区' },
{ name: '越秀区' },
{ name: '海珠区' },
{ name: '天河区' },
{ name: '白云区' }
]
},
{
name: '深圳市',
children: [
{ name: '罗湖区' },
{ name: '福田区' },
{ name: '南山区' },
{ name: '宝安区' }
]
}
]
}
]
console.log('使用后备数据,条数:', regionOptions.value.length)
}
])
}
// 处理省市区选择变化
const handleRegionChange = (value: string[]) => {
console.log('选择的省市区:', value)
// value is an array like ['四川省', '成都市', '锦江区']
// We'll extract these in the submit function
}
const createOrderLinkedPaidTotal = computed(() => {
@@ -1619,6 +1634,14 @@ async function submitCreateOrderFromPrescription() {
amount: createOrderForm.amount,
remark_extra: createOrderForm.remark_extra || ''
}
// 添加省市区字段
if (createOrderForm.region && createOrderForm.region.length >= 3) {
payload.shipping_province = createOrderForm.region[0]
payload.shipping_city = createOrderForm.region[1]
payload.shipping_district = createOrderForm.region[2]
}
if (createOrderForm.medication_days != null && createOrderForm.medication_days > 0) {
payload.medication_days = createOrderForm.medication_days
}
@@ -1672,6 +1695,7 @@ const editForm = reactive({
dosage_amount: 1 as number | undefined,
dosage_unit: 'g',
need_decoction: false,
bags_per_dose: 1,
patient_name: '',
gender: 1,
age: 0,
@@ -1705,20 +1729,31 @@ const editForm = reactive({
times_per_day: 2
})
// 标志:是否正在加载数据(防止watch函数覆盖已加载的值)
const isLoadingData = ref(false)
// 监听处方类型变化,自动调整用量单位和默认值
watch(() => editForm.prescription_type, (newType) => {
// 如果正在加载数据,不要自动重置值
if (isLoadingData.value) {
return
}
if (newType === '浓缩水丸') {
editForm.dosage_unit = 'g'
editForm.dosage_amount = 1
editForm.need_decoction = false
editForm.bags_per_dose = 1
} else if (newType === '饮片') {
editForm.dosage_unit = 'ml'
editForm.dosage_amount = 50
editForm.bags_per_dose = 1
// need_decoction 保持用户选择
} else {
editForm.dosage_unit = 'g'
editForm.dosage_amount = undefined
editForm.need_decoction = false
editForm.bags_per_dose = 1
}
})
@@ -2062,6 +2097,8 @@ const handleAdd = () => {
editingWasVoid.value = false
editingWasRejected.value = false
editMode.value = 'add'
// 新建时允许watch自动设置默认值
isLoadingData.value = false
showEdit.value = true
nextTick(() => {
formRef.value?.clearValidate()
@@ -2096,12 +2133,34 @@ const handleEdit = (row: any) => {
editingWasVoid.value = Number(row.void_status) === 1
editingWasRejected.value = Number(row.audit_status) === 2
editMode.value = 'edit'
// 开始加载数据,暂时禁用watch自动重置
isLoadingData.value = true
// 深拷贝数据到表单
editForm.id = row.id
editForm.prescription_type = row.prescription_type || '浓缩水丸'
editForm.dosage_amount = row.dosage_amount ?? undefined
editForm.dosage_unit = row.dosage_unit || ''
// 确保 dosage_amount 是数字类型,以匹配下拉框的 :value
if (row.dosage_amount !== null && row.dosage_amount !== undefined && row.dosage_amount !== '') {
editForm.dosage_amount = Number(row.dosage_amount)
} else {
editForm.dosage_amount = undefined
}
// 如果数据库中没有 dosage_unit,根据 prescription_type 设置默认值
if (row.dosage_unit) {
editForm.dosage_unit = row.dosage_unit
} else {
if (editForm.prescription_type === '饮片') {
editForm.dosage_unit = 'ml'
} else {
editForm.dosage_unit = 'g'
}
}
editForm.need_decoction = row.need_decoction === 1 || row.need_decoction === true
editForm.bags_per_dose = row.bags_per_dose ? Number(row.bags_per_dose) : 1
editForm.patient_name = row.patient_name || ''
editForm.gender = row.gender ?? 1
editForm.age = row.age ?? 0
@@ -2132,6 +2191,13 @@ const handleEdit = (row: any) => {
editForm.diagnosis_id = row.diagnosis_id ?? 0
editForm.business_prescription_audit_rejected = Number(row.business_prescription_audit_rejected) === 1 ? 1 : 0
editForm.business_prescription_audit_remark = String(row.business_prescription_audit_remark || '')
// 数据加载完成,重新启用watch
// 使用 setTimeout 确保所有数据都已经渲染完成
setTimeout(() => {
isLoadingData.value = false
}, 0)
showEdit.value = true
nextTick(() => {
formRef.value?.clearValidate()
@@ -2195,6 +2261,7 @@ const handleDelete = async (id: number) => {
onMounted(async () => {
await loadRoleOptions()
await loadRegionData()
try {
const list = await getDoctors()
doctorOptions.value = Array.isArray(list) ? list : []
@@ -592,14 +592,14 @@
<el-descriptions-item label="收货人">{{ detailData.recipient_name }}</el-descriptions-item>
<el-descriptions-item label="手机">{{ detailData.recipient_phone }}</el-descriptions-item>
<el-descriptions-item label="收货地址" :span="2">{{ detailData.shipping_address }}</el-descriptions-item>
<el-descriptions-item label="收货地址" :span="2">{{ detailFullAddress }}</el-descriptions-item>
<el-descriptions-item label="复诊">{{ detailData.is_follow_up ? '是' : '否' }}</el-descriptions-item>
<el-descriptions-item label="用药疗程">{{ detailData.medication_days ? detailData.medication_days + ' 天' : '—' }}</el-descriptions-item>
<el-descriptions-item label="上次医护">{{ detailData.prev_staff || '—' }}</el-descriptions-item>
<el-descriptions-item label="服务渠道">{{ detailData.service_channel || '—' }}</el-descriptions-item>
<el-descriptions-item label="服务套餐">{{ detailData.service_package || '—' }}</el-descriptions-item>
<el-descriptions-item label="服务套餐">{{ formatServicePackage(detailData.service_package) }}</el-descriptions-item>
<el-descriptions-item label="费用类别">{{ feeTypeText(detailData.fee_type) }}</el-descriptions-item>
<el-descriptions-item v-if="detailData.internal_cost != null && detailData.internal_cost !== ''" label="内部成本">
@@ -757,8 +757,10 @@
<el-cascader
v-model="editForm.region"
:options="regionOptions"
:props="{ emitPath: true }"
placeholder="请选择省/市/区"
clearable
filterable
class="w-full"
/>
</el-form-item>
@@ -840,7 +842,22 @@
</el-col>
<el-col :span="12">
<el-form-item label="服务套餐">
<el-input v-model="editForm.service_package" maxlength="100" />
<el-select
v-model="editForm.service_package"
multiple
collapse-tags
collapse-tags-tooltip
placeholder="请选择服务套餐"
clearable
class="w-full"
>
<el-option
v-for="item in servicePackageOptions"
:key="item.value"
:label="item.name"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
@@ -1451,6 +1468,7 @@ import {
prescriptionOrderPreviewGancaoRecipel,
prescriptionDetail
} from '@/api/tcm'
import { getDictData } from '@/api/app'
import { usePaging } from '@/hooks/usePaging'
import feedback from '@/utils/feedback'
import { ElMessageBox } from 'element-plus'
@@ -1472,90 +1490,99 @@ const canViewFinanceFields = () => {
}
// 省市区数据
const regionOptions = [
{
value: '四川省',
label: '四川省',
children: [
const regionOptions = ref([])
// 服务套餐选项
const servicePackageOptions = ref<Array<{ name: string; value: string }>>([])
// 转换省市区数据格式
const transformRegionData = (data: any[]) => {
return data.map((province: any) => ({
value: province.province,
label: province.province,
code: province.code,
children: province.citys?.map((city: any) => ({
value: city.city,
label: city.city,
code: city.code,
children: city.areas?.map((area: any) => ({
value: area.area,
label: area.area,
code: area.code
})) || []
})) || []
}))
}
// 加载省市区数据
const loadRegionData = async () => {
try {
console.log('开始加载省市区数据...')
// 使用代理路径,需要在vite.config.ts中配置代理
const response = await fetch('/api-proxy/area/ChinaCitys.json')
console.log('响应状态:', response.status)
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`)
}
const data = await response.json()
console.log('加载的数据条数:', data?.length)
// 转换数据格式
regionOptions.value = transformRegionData(data)
console.log('regionOptions 已设置,条数:', regionOptions.value.length)
} catch (error) {
console.error('加载省市区数据失败:', error)
// 如果加载失败,使用基本的省市数据作为后备
regionOptions.value = [
{
value: '成都市',
label: '成都市',
value: '四川省',
label: '四川省',
children: [
{ value: '武侯区', label: '武侯区' },
{ value: '锦江区', label: '锦江区' },
{ value: '青羊区', label: '青羊区' },
{ value: '金牛区', label: '金牛区' },
{ value: '成华区', label: '成华区' },
{ value: '高新区', label: '高新区' }
{
value: '成都市',
label: '成都市',
children: [
{ value: '武侯区', label: '武侯区' },
{ value: '锦江区', label: '锦江区' },
{ value: '青羊区', label: '青羊区' },
{ value: '金牛区', label: '金牛区' },
{ value: '成华区', label: '成华区' }
]
}
]
},
{
value: '绵阳市',
label: '绵阳市',
children: [
{ value: '涪城区', label: '涪城区' },
{ value: '游仙区', label: '游仙区' }
]
}
]
},
{
value: '北京市',
label: '北京市',
children: [
{
value: '北京市',
label: '北京市',
children: [
{ value: '朝阳区', label: '朝阳区' },
{ value: '海淀区', label: '海淀区' },
{ value: '东城区', label: '东城区' },
{ value: '西城区', label: '西城区' }
]
}
]
},
{
value: '上海市',
label: '上海市',
children: [
{
value: '上海市',
label: '上海市',
children: [
{ value: '浦东新区', label: '浦东新区' },
{ value: '黄浦区', label: '黄浦区' },
{ value: '徐汇区', label: '徐汇区' },
{ value: '静安区', label: '静安区' }
]
}
]
},
{
value: '广东省',
label: '广东省',
children: [
{
value: '广州市',
label: '广州市',
children: [
{ value: '天河区', label: '天河区' },
{ value: '越秀区', label: '越秀区' },
{ value: '海珠区', label: '海珠区' }
]
},
{
value: '深圳市',
label: '深圳市',
children: [
{ value: '南山区', label: '南山区' },
{ value: '福田区', label: '福田区' },
{ value: '罗湖区', label: '罗湖区' }
{
value: '北京市',
label: '北京市',
children: [
{ value: '朝阳区', label: '朝阳区' },
{ value: '海淀区', label: '海淀区' },
{ value: '东城区', label: '东城区' }
]
}
]
}
]
}
]
}
// 加载服务套餐选项
const loadServicePackageOptions = async () => {
try {
const data = await getDictData({ type: 'server_order' })
servicePackageOptions.value = (data?.server_order || []).filter((item: any) => item.status !== 0)
console.log('服务套餐选项已加载:', servicePackageOptions.value.length)
} catch (error) {
console.error('加载服务套餐选项失败:', error)
servicePackageOptions.value = []
}
}
const queryParams = reactive({
order_no: '',
@@ -1602,6 +1629,28 @@ function feeTypeText(t: number | undefined) {
return m[Number(t)] ?? '—'
}
// 格式化服务套餐显示
function formatServicePackage(value: any): string {
if (!value) return '—'
let packages: string[] = []
if (Array.isArray(value)) {
packages = value
} else if (typeof value === 'string') {
packages = value.split(',').filter(v => v.trim() !== '')
}
if (packages.length === 0) return '—'
// 将值转换为名称
const names = packages.map(val => {
const option = servicePackageOptions.value.find(opt => opt.value === val)
return option ? option.name : val
})
return names.join('、')
}
function auditStatusText(s: number | undefined) {
if (s === 1) return '已通过'
if (s === 2) return '已驳回'
@@ -1847,6 +1896,20 @@ const detailRxHerbs = computed(() => normalizeSlipHerbs(detailPrescription.value
/** false=无权限;true/缺省兼容旧接口(旧版未下发该字段时仍展示药材) */
const detailHerbsVisible = computed(() => detailData.value?.prescription_detail_herbs_visible !== false)
// 完整收货地址(省市区 + 详细地址)
const detailFullAddress = computed(() => {
const d = detailData.value
if (!d) return '—'
const parts = []
if (d.shipping_province) parts.push(d.shipping_province)
if (d.shipping_city) parts.push(d.shipping_city)
if (d.shipping_district) parts.push(d.shipping_district)
if (d.shipping_address) parts.push(d.shipping_address)
return parts.length > 0 ? parts.join(' ') : '—'
})
function consumerRxAuditText(s: number | undefined) {
const n = Number(s)
if (n === 1) return '已通过'
@@ -2003,7 +2066,7 @@ const editForm = reactive({
dose_unit: '剂',
prev_staff: '',
service_channel: '',
service_package: '',
service_package: [] as string[],
express_company: 'auto',
tracking_number: '',
fee_type: 3,
@@ -2123,7 +2186,18 @@ async function openEdit(row: { id: number }) {
editForm.dose_unit = d.dose_unit || '剂'
editForm.prev_staff = d.prev_staff || ''
editForm.service_channel = d.service_channel || ''
editForm.service_package = d.service_package || ''
// 处理服务套餐:如果是字符串,转换为数组
if (d.service_package) {
if (Array.isArray(d.service_package)) {
editForm.service_package = d.service_package
} else if (typeof d.service_package === 'string') {
editForm.service_package = d.service_package.split(',').filter(v => v.trim() !== '')
} else {
editForm.service_package = []
}
} else {
editForm.service_package = []
}
editForm.express_company = String(d.express_company || 'auto') || 'auto'
editForm.tracking_number = d.tracking_number || ''
editForm.fee_type = Number(d.fee_type) || 3
@@ -2172,7 +2246,7 @@ async function submitEdit() {
is_follow_up: editForm.is_follow_up,
prev_staff: editForm.prev_staff || '',
service_channel: editForm.service_channel || '',
service_package: editForm.service_package || '',
service_package: Array.isArray(editForm.service_package) ? editForm.service_package.join(',') : '',
express_company: editForm.express_company || 'auto',
tracking_number: editForm.tracking_number || '',
fee_type: editForm.fee_type,
@@ -2325,10 +2399,10 @@ async function testGancaoPreview() {
gancaoPreviewDrawerVisible.value = true
feedback.msgSuccess('预下单测试成功')
} else {
feedback.msgError(d?.error || '预下单失败')
// feedback.msgError(d?.error || '预下单失败')
}
} catch (e: any) {
feedback.msgError(e?.message || '预下单失败')
// feedback.msgError(e?.message || '预下单失败')
} finally {
gancaoPreviewLoading.value = false
}
@@ -2354,12 +2428,12 @@ async function testGancaoPreviewFromDetail() {
if (d && d.success) {
gancaoPreviewData.value = d
gancaoPreviewDrawerVisible.value = true
feedback.msgSuccess('预下单测试成功')
//feedback.msgSuccess('预下单测试成功')
} else {
feedback.msgError(d?.error || '预下单失败')
// feedback.msgError(d?.error || '预下单失败')
}
} catch (e: any) {
feedback.msgError(e?.message || '预下单失败')
// feedback.msgError(e?.message || '预下单失败')
} finally {
gancaoPreviewLoading.value = false
}
@@ -2396,7 +2470,9 @@ async function confirmSubmitGancaoRecipel(row: { id: number }) {
}
}
onMounted(() => {
onMounted(async () => {
await loadRegionData()
await loadServicePackageOptions()
getLists()
})
@@ -2434,6 +2510,9 @@ async function submitQuickTrack() {
id: d.id,
recipient_name: d.recipient_name || '',
recipient_phone: d.recipient_phone || '',
shipping_province: d.shipping_province || '',
shipping_city: d.shipping_city || '',
shipping_district: d.shipping_district || '',
shipping_address: d.shipping_address || '',
is_follow_up: d.is_follow_up ? 1 : 0,
medication_days: (d.medication_days != null && String(d.medication_days).trim() !== '') ? d.medication_days : '',
+8 -1
View File
@@ -41,7 +41,14 @@ export default defineConfig({
server: {
host: '0.0.0.0',
hmr: true,
open: true
open: true,
proxy: {
'/api-proxy': {
target: 'https://admin.zhenyangtang.com.cn',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api-proxy/, '')
}
}
},
plugins: [
vue(),