145 lines
4.3 KiB
JavaScript
145 lines
4.3 KiB
JavaScript
/**
|
||
* 委托调剂三级级联(制剂 / 煎法 / 备注)
|
||
* 识图抽屉与传方详情共用,避免 pid / rule_id 分派逻辑复制两份
|
||
*/
|
||
import { unwrapXkApi } from '@/utils/api-response.js';
|
||
import { getProcessRuleList } from '@/api/reception.js';
|
||
|
||
/**
|
||
* 解包 process-rule-list 响应为数组
|
||
* 医生/诊所接口都走 jok,统一 unwrapXkApi;兼容偶发裸数组
|
||
*/
|
||
function unwrapRuleList(res) {
|
||
const { ok, payload } = unwrapXkApi(res);
|
||
if (ok && Array.isArray(payload)) return payload;
|
||
if (Array.isArray(payload)) return payload;
|
||
if (res && Array.isArray(res.result)) return res.result;
|
||
if (Array.isArray(res)) return res;
|
||
return [];
|
||
}
|
||
|
||
/**
|
||
* 按 pid / rule_id 拉一级列表并写回 target
|
||
* @param {Object} opts
|
||
* @param {Function} [opts.api] process-rule-list,默认医生 getProcessRuleList
|
||
* @param {number} [opts.pid=0] 父级 id;0 表示顶级制剂
|
||
* @param {number} [opts.ruleId=0] 有值时按 rule_id 拉备注列表
|
||
* @param {{processRuleList:Array,childProcessRuleList:Array,processRuleNoteList:Array}} opts.target 写回容器(通常是组件 this)
|
||
*/
|
||
export async function loadProcessRuleListInto(opts) {
|
||
const api = (opts && opts.api) || getProcessRuleList;
|
||
const pid = Number((opts && opts.pid) || 0);
|
||
const ruleId = Number((opts && opts.ruleId) || 0);
|
||
const target = (opts && opts.target) || {};
|
||
const data = ruleId === 0 ? { pid } : { rule_id: ruleId };
|
||
let list = [];
|
||
try {
|
||
const res = await api(data);
|
||
list = unwrapRuleList(res);
|
||
} catch (e) {
|
||
list = [];
|
||
throw e;
|
||
} finally {
|
||
if (ruleId !== 0) {
|
||
target.processRuleNoteList = list;
|
||
} else if (pid === 0) {
|
||
target.processRuleList = list;
|
||
} else {
|
||
target.childProcessRuleList = list;
|
||
}
|
||
}
|
||
return list;
|
||
}
|
||
|
||
/**
|
||
* 按 chineseConfig 中的 ID 依次拉齐三级列表(OCR / 详情回填后用)
|
||
* 为什么先拉顶级:子级接口依赖已选制剂 id,列表空时无法校验回填是否仍有效
|
||
* @param {Object} opts
|
||
* @param {Function} [opts.api]
|
||
* @param {{ruleType:number,processRuleId:*,childProcessRuleId:*}} opts.config
|
||
* @param {Object} opts.target
|
||
*/
|
||
export async function hydrateProcessRuleListsFromConfig(opts) {
|
||
const config = (opts && opts.config) || {};
|
||
const target = (opts && opts.target) || {};
|
||
const api = opts && opts.api;
|
||
if (Number(config.ruleType) !== 2) return;
|
||
if (!target.processRuleList || !target.processRuleList.length) {
|
||
await loadProcessRuleListInto({ api, pid: 0, ruleId: 0, target });
|
||
}
|
||
const prId = Number(config.processRuleId || 0);
|
||
if (prId > 0) {
|
||
await loadProcessRuleListInto({ api, pid: prId, ruleId: 0, target });
|
||
}
|
||
const childId = Number(config.childProcessRuleId || 0);
|
||
if (childId > 0) {
|
||
await loadProcessRuleListInto({ api, pid: 0, ruleId: childId, target });
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 默认中药代煎配置:传方默认委托调剂(ruleType=2)
|
||
*/
|
||
export function defaultChineseConfig(overrides) {
|
||
return Object.assign(
|
||
{
|
||
ruleType: 2,
|
||
packageMethodId: null,
|
||
processRuleId: null,
|
||
childProcessRuleId: null,
|
||
processRuleNoteId: null,
|
||
dosage: 7,
|
||
dayDosage: 2,
|
||
},
|
||
overrides || {},
|
||
);
|
||
}
|
||
|
||
/**
|
||
* 传方代煎+用量必填校验(对齐开方 PrescriptionValidator)
|
||
* @param {Object} config chineseConfig
|
||
* @returns {{valid:boolean,keys:string[],message:string}}
|
||
*/
|
||
export function validateChineseConfigRequired(config) {
|
||
const cfg = config || {};
|
||
const keys = [];
|
||
const messages = [];
|
||
const ruleType = Number(cfg.ruleType || 0);
|
||
if (ruleType !== 1 && ruleType !== 2) {
|
||
keys.push('ruleType');
|
||
messages.push('请选择制剂方式');
|
||
}
|
||
if (ruleType === 1) {
|
||
if (!Number(cfg.packageMethodId)) {
|
||
keys.push('packageMethodId');
|
||
messages.push('请选择包法');
|
||
}
|
||
} else if (ruleType === 2) {
|
||
if (!Number(cfg.processRuleId)) {
|
||
keys.push('processRuleId');
|
||
messages.push('请选择制剂要求');
|
||
}
|
||
if (!Number(cfg.childProcessRuleId)) {
|
||
keys.push('childProcessRuleId');
|
||
messages.push('请选择煎法说明');
|
||
}
|
||
if (!Number(cfg.processRuleNoteId)) {
|
||
keys.push('processRuleNoteId');
|
||
messages.push('请选择附加备注');
|
||
}
|
||
}
|
||
if (!(Number(cfg.dosage) >= 1)) {
|
||
keys.push('dosage');
|
||
messages.push('请填写剂数');
|
||
}
|
||
if (!(Number(cfg.dayDosage) >= 1)) {
|
||
keys.push('dayDosage');
|
||
messages.push('请填写用药频次');
|
||
}
|
||
return {
|
||
valid: keys.length === 0,
|
||
keys,
|
||
message: messages[0] || '',
|
||
};
|
||
}
|