/** * 识图传方报价:请求侧增量组装 * 首次全量 drugs;同味数下只传 quote_token + drugs_patch(改了的下标),省流量 */ /** * 比较两味报价药品是否等价(用于算 patch) * @param {Record|null|undefined} a * @param {Record|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, * drugs: Array>, * quoteToken?: string, * lastQuoteDrugs?: Array>|null * }} opts * @returns {{ payload: Record, nextLastDrugs: Array> }} */ 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 } }