63 lines
2.0 KiB
JavaScript
63 lines
2.0 KiB
JavaScript
/**
|
||
* 识图传方报价:请求侧增量组装
|
||
* 首次全量 drugs;同味数下只传 quote_token + drugs_patch(改了的下标),省流量
|
||
*/
|
||
|
||
/**
|
||
* 比较两味报价药品是否等价(用于算 patch)
|
||
* @param {Record<string, any>|null|undefined} a
|
||
* @param {Record<string, any>|null|undefined} b
|
||
*/
|
||
export function isSameQuoteDrug(a, b) {
|
||
if (!a || !b) return false
|
||
return (
|
||
Number(a.drug_id || 0) === Number(b.drug_id || 0) &&
|
||
Number(a.number || 0) === Number(b.number || 0) &&
|
||
Number(a.price || 0) === Number(b.price || 0) &&
|
||
String(a.name || '') === String(b.name || '') &&
|
||
Number(a.way_id || 0) === Number(b.way_id || 0)
|
||
)
|
||
}
|
||
|
||
/**
|
||
* 组装增量报价入参
|
||
* @param {{
|
||
* scalars: Record<string, any>,
|
||
* drugs: Array<Record<string, any>>,
|
||
* quoteToken?: string,
|
||
* lastQuoteDrugs?: Array<Record<string, any>>|null
|
||
* }} opts
|
||
* @returns {{ payload: Record<string, any>, nextLastDrugs: Array<Record<string, any>> }}
|
||
*/
|
||
export function buildIncrementalQuotePayload(opts) {
|
||
const scalars = opts.scalars || {}
|
||
const drugs = Array.isArray(opts.drugs) ? opts.drugs : []
|
||
const quoteToken = String(opts.quoteToken || '').trim()
|
||
const prev = Array.isArray(opts.lastQuoteDrugs) ? opts.lastQuoteDrugs : null
|
||
const payload = Object.assign({}, scalars)
|
||
if (quoteToken) {
|
||
payload.quote_token = quoteToken
|
||
}
|
||
// 无 token、味数变化、或上次快照缺失 → 全量
|
||
if (!quoteToken || !prev || prev.length !== drugs.length) {
|
||
payload.drugs = drugs
|
||
return { payload, nextLastDrugs: drugs }
|
||
}
|
||
const patches = []
|
||
for (let i = 0; i < drugs.length; i++) {
|
||
if (!isSameQuoteDrug(prev[i], drugs[i])) {
|
||
patches.push({ index: i, drug: drugs[i] })
|
||
}
|
||
}
|
||
if (patches.length === 0) {
|
||
// 只改了地址/剂数/煎法,不带 drugs
|
||
return { payload, nextLastDrugs: prev }
|
||
}
|
||
if (patches.length >= drugs.length) {
|
||
payload.drugs = drugs
|
||
} else {
|
||
payload.drugs_patch = patches
|
||
}
|
||
return { payload, nextLastDrugs: drugs }
|
||
}
|