# 前端数据契约 - 销售发货的订单来源产品在编辑初始化、重新选择时,必须在清空 `id` 前保留 `orderProductId || id`;换仓和换批次只改变实际库存身份,不能覆盖订单明细身份。不同订单行即使物品和批次相同,也分别使用各自剩余额度;同一订单行拆为多条发货明细时累计校验,雪花ID保持字符串。 - 库存台账返回的 `provenance` 是展示字符串;向 EOM 发货接口提交产地时,使用 `purchaseOrigins` 产地编码数组转换为字符串数组。替代料与普通发货物品均需遵守此契约,不能把库存记录中的 `"[]"` 原样提交给 `JSONArray` 字段。 - 客户抽屉内打开客户历史版本详情时,详情 `ele-modal` 必须设置 `append-to-body`,避免弹窗遮罩受抽屉层叠上下文影响而覆盖弹窗内容。 - 客户与供应商共用 `saleManage/contact/components/addContactDialog.vue` 的新建并提交入口;保存主档后必须等待新建证照的 `saveOrEdit` 请求全部成功,再开启 `contact_approve` 提交弹窗。证照保存失败须提示并停止提交,避免服务端按已持久化证照校验时误判。