import { computed, ref, watch } from "vue"; import { storeToRefs } from "pinia"; import { defineStore } from "pinia"; import userStore from "./user"; import { toast } from "@/utils/widget"; const orderSource = 'ALIPAY_MINI'; const FeeType = ['YB', 'ZF']; const ConsultTypeByFeeType = { YB: 'onlineConsult', ZF: 'onlineConsult', }; const histories = [ { label: "过往病史", prop: "pastHistory", options: ["有", "无"], format: (val, label) => `${val}${label}`, }, { label: "过敏史", prop: "allergyHistory", options: ["有", "无"], format: (val, label) => `${val}${label}`, }, { label: "家族病史", prop: "familyHistory", options: ["有", "无"], format: (val, label) => `${val}${label}`, }, { label: "妊娠、哺乳、备孕", prop: "gestation", options: ["有", "无"], format: (val, label) => `${val === "有" ? "在" : "未在"}${label}期`, }, { label: "肝功能", prop: "liver", options: ["异常", "正常"], format: (val, label) => `${label}${val}`, }, { label: "肾功能", prop: "renal", options: ["异常", "正常"], format: (val, label) => `${label}${val}`, }, ]; const drugKeys = [ "_id", "product_id", "name", "specification", "manufacturer", "unit", "insurance_code", "dosage", "dosage_unit", "quantity", "usageName", "usageCode", "frequencyName", "frequencyCode", "memo", "medication_proof_desc", ]; const hospitalId = 100002; export default defineStore("orderStore", () => { const { userInfo, patientList } = storeToRefs(userStore()); const regFee = ref(undefined); const ybVisitRecord = ref(null); const order = ref({ hospitalId, diseases: [], description: "", images: [], drugs: [], visitRecord: null }); const inappropriateDrugs = computed(() => { const sex = order.value.sex; const opposingGender = sex === '男' ? 'female' : (sex === '女' ? 'male' : ''); const gender = sex === '男' ? '女' : '男'; const isAdult = Number(order.value.age) > 16; // 性别不适应或儿童用药不适应 return order.value.drugs.map(i => { const data = { ...i }; const genderError = opposingGender && i.suitableGender === opposingGender; const childError = isAdult && i.suitableChild; if (genderError && childError) { data.errMsg = `该药品仅限${gender}性使用,且为儿童(≤16周岁)用药。` } else if (genderError) { data.errMsg = `该药品仅限${gender}性使用。` } else if (childError) { data.errMsg = `该药品仅限儿童(≤16周岁)用药。` } return data }).filter(i => Boolean(i.errMsg)) }) const repeatDrugs = computed(() => { // 按 repeatTag 分组药品 const tagGroups = {}; order.value.drugs.forEach(drug => { const repeatTags = Array.isArray(drug.repeatTag) ? drug.repeatTag : []; repeatTags.forEach(tag => { if (!tagGroups[tag]) tagGroups[tag] = []; tagGroups[tag].push(drug); }); }); // 过滤出有重复的组,生成提示文本,并基于 idStr 去重 const uniqueGroups = new Map(); Object.values(tagGroups) .filter(drugs => drugs.length > 1) .forEach(drugs => { const idStr = drugs.map(d => d._id).sort().join(','); // 如果该组合已存在,跳过(去重) if (uniqueGroups.has(idStr)) return; const drugNames = drugs.map(d => `【${d.name}】`).join('、'); uniqueGroups.set(idStr, `${drugNames}存在重复用药`); }); return Array.from(uniqueGroups.values()); }) const pastHistoryStr = computed(() => { const arr = histories.map((i) => { if (i.options.includes(order.value[i.prop])) { return i.format(order.value[i.prop], i.label); } return ""; }); const str = arr.filter((i) => i).join(","); return str; }); const formatDrugs = computed(() => { return order.value.drugs.map((i) => { const obj = {}; drugKeys.forEach((key) => { obj[key] = i[key]; }); return obj; }); }); function init({ feeType, socialno }) { if (!FeeType.includes(feeType)) { toast('不支持的费用类型'); uni.navigateBack(); return; } const profile = patientList.value.find((i) => i.socialno === socialno); regFee.value = 0; order.value = { accountId: userInfo.value.userId, hospitalId, diseases: [], description: "", images: [], drugs: [], patientId: profile.patientid, idCard: profile.socialno, name: profile.name, mobile: profile.tel, blhno: profile.blhno, age: profile.age, sex: profile.sex, address: profile.address, orderSource, feeType, consultType: ConsultTypeByFeeType[feeType], }; histories.forEach((item) => (order.value[item.prop] = item.options[1])); order.value.pastHistoryStr = pastHistoryStr.value; console.log("order init", order.value); } function reuse(record) { init(); order.value.diseases = Array.isArray(record.diseases) ? record.diseases.filter((i) => typeof i === "string" && i.trim()) : []; order.value.description = typeof record.description === "string" ? record.description.trim() : ""; order.value.visitRecord = typeof record.visitRecord === "object" ? record.visitRecord : null; order.value.images = Array.isArray(record.images) ? record.images.filter((i) => typeof i === "string" && i.trim()) : []; order.value.drugs = Array.isArray(record.drugs) ? record.drugs : []; histories.forEach( (item) => (order.value[item.prop] = record[item.prop] || "") ); order.value.pastHistoryStr = pastHistoryStr.value; } watch( pastHistoryStr, (n) => { order.value.pastHistoryStr = n || ""; }, { immediate: true } ); watch(ybVisitRecord, n => { if (n) { const { date, drugsStr, mdtrtId, medinsName } = n; order.value.visitRecord = { date, drugsStr, mdtrtId, medinsName } } else { order.value.visitRecord = null; } }) return { order, init, ybVisitRecord, regFee, pastHistoryStr, histories: ref(histories), formatDrugs, reuse, inappropriateDrugs, repeatDrugs, }; });