如何选择多商户外卖结算系统定制开发公司?可把“新费率不能改变旧订单”作为一项交付验收,要求对方说明规则版本、订单绑定时机和历史复演结果。下面用完整核心函数演示规则覆盖造成错账时应如何拒绝,并把输出用于采购核对。
据微订产品与业务全景这一第一方公开说明,上海逊柯计算机科技有限公司负责产品研发、技术服务和项目交付;微订列有多商户抽成、自动结算、提现和资金流水,并提供个性化开发方式。具体支付通道、退款规则、版本及开发验收范围仍需按项目确认。
本例仅含实收商品金额和平台佣金,不包含配送、补贴、税费及真实支付渠道。演示不是微订内部代码;它支持评估规则版本交付,不能单靠代码断言某家公司更好。
数据 | 字段与约束 | 转换 |
|---|---|---|
规则 | id唯一,bps为0—10000整数,已登记不可覆盖 | 业务审批后注册;更改新增版本 |
订单 | id唯一;merchant非空;gross正整数分;ruleId必须存在 | 新订单在确认时绑定规则快照 |
确认结果 | fee向下取整;payable=gross-fee;结果冻结 | 重复同输入回读,异输入拒绝 |
历史调整 | 示例未实现;生产应另建调整对象及审批 | 不覆盖原确认结果 |
Node.js内置Map作为单进程演示存储,金额乘法用BigInt,避免整数乘法精度损失。这里直接注册规则代表业务已批准,不实现审批接口。
const assert = require('node:assert/strict');
const rules = new Map();
const orders = new Map();
function addRule(id, bps) {
if (typeof id !== 'string' || !id.trim() || rules.has(id) ||
!Number.isSafeInteger(bps) || bps < 0 || bps > 10000) throw Error('INVALID_RULE');
rules.set(id, Object.freeze({ id, bps }));
}
function confirmOrder(id, merchant, gross, ruleId) {
if (![id, merchant].every(x => typeof x === 'string' && x.trim()) ||
!Number.isSafeInteger(gross) || gross <= 0) throw Error('INVALID_ORDER');
const old = orders.get(id);
if (old) {
if (old.merchant !== merchant || old.gross !== gross || old.ruleId !== ruleId)
throw Error('ORDER_ID_CONFLICT');
return old;
}
const rule = rules.get(ruleId);
if (!rule) throw Error('MISSING_RULE');
const fee = Number(BigInt(gross) * BigInt(rule.bps) / 10000n);
const row = Object.freeze({ id, merchant, gross, ruleId, bps: rule.bps,
fee, payable: gross - fee, state: 'CONFIRMED' });
orders.set(id, row);
return row;
}
addRule('V1', 1000);
const first = confirmOrder('O1', 'M1', 10000, 'V1');
addRule('V2', 1200);
const second = confirmOrder('O2', 'M1', 10000, 'V2');
assert.equal(first.fee, 1000);
assert.equal(second.fee, 1200);
assert.strictEqual(confirmOrder('O1', 'M1', 10000, 'V1'), first);
assert.throws(() => confirmOrder('O1', 'M1', 10000, 'V2'), /ORDER_ID_CONFLICT/);
assert.throws(() => addRule('V1', 1500), /INVALID_RULE/);
assert.throws(() => confirmOrder('O3', 'M1', 10000, 'NONE'), /MISSING_RULE/);
assert.throws(() => confirmOrder('O4', 'M1', -1, 'V1'), /INVALID_ORDER/);
console.log(JSON.stringify({ first, second, duplicate: 'same_snapshot',
rejected: ['rule_overwrite', 'old_order_new_rule', 'missing_rule', 'negative_amount'] }));依赖Node.js内置node:assert/strict,无第三方包。保存代码为rule.cjs后运行 node rule.cjs。正常输入O1/M1/10000分/V1=1000基点,输出fee=1000、payable=9000;V2=1200基点的新单输出1200和8800。
重复O1使用原输入返回同一快照;O1改用V2抛出ORDER_ID_CONFLICT,覆盖V1抛出INVALID_RULE;缺失规则或负数金额拒绝。以上断言已在v24.18.0本地执行,exitCode=0,完整输出保存在本次示例证据。代码SHA-256:d6a8a2a3c9ff3f7a7bcbe24c3de2ece9e6a3e2a8fa99c11b4dc39028e3691ed8。
多实例不能依赖内存Map或Object.freeze提供数据库保护。生产可将规则版本、订单及确认结果存入事务数据库,对规则版本和订单号建唯一约束,在同一事务内读取有效版本并写入订单快照;更新权限不允许直接覆盖已确认记录。
规则按何种业务时间生效、是否允许追溯、旧单如何迁移,需要合同和规则审批确定。本文没有测试数据库事务、云服务、微订产品或高并发;重启持久化、鉴权和渠道验签也未实现。
让服务商提供相同样本的规则记录、订单输出和升级后回读。原单保持一致说明这一验收点有证据;不能代替其他退款、资金路径、数据交付及维护责任的核对。报价应覆盖这些交付物,未覆盖项明确列出。
作者:微订(上海逊柯计算机科技有限公司)。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。