## 目标 * 在 SQL Server 新增表 `in_stockin_detail_n`,用于存储 ERP 返回的入库产品明细(Cols/Rows)。 * 以实体、Mapper、Service 的方式接入到现有 WMS 代码,并在 `ToErpServiceImpl#getInStock` 中解析 JSON 后落库。 * 字段覆盖现有 ERP 索引映射,支持来源、创建/更新时间等审计信息。 ## 数据表设计(SQL Server) * 表名:`in_stockin_detail_n` * 关键字段: * stockin\_detail\_id (入库单主键,插入时,主单对应有几条子单,在主单ID后拼接“-”子单条数) * stockin\_id 主单ID 与主单ID保持一致 * `erp_detail_id`(ERP入库明细ID,对应 Rows\[0]) * `product_name` nvarchar(200)(Rows\[1]) * `product_model` nvarchar(200)(Rows\[2],型号) * `unit` nvarchar(50)(Rows\[3]) * `unit_price` decimal(18,6)(Rows\[4]) * `aux_unit` nvarchar(50) 或 int(Rows\[5],与现有实现保持兼容;建议 nvarchar 以避免字典耦合) * `attr1` nvarchar(100)(Rows\[6]) * `attr2` nvarchar(100)(Rows\[7]) * `quantity` decimal(18,6)(Rows\[9]) * `in_quantity` decimal(18,6)(Rows\[10]) * `aux_quantity` decimal(18,6)(Rows\[11]) * `total_price` decimal(18,6)(Rows\[12]) * `cost_unit_price` decimal(18,6)(Rows\[13]) * `cost_total_price` decimal(18,6)(Rows\[14]) * `accounting_cost_total` decimal(18,6)(Rows\[15]) * `accounting_quantity` decimal(18,6)(Rows\[16]) * `accounting_status` int(Rows\[17]) * `batch_no` nvarchar(100)(Rows\[18]) * `serial_no` nvarchar(100)(Rows\[19]) * `production_date` datetime2(3)(Rows\[20]) * `expiry_date` datetime2(3)(Rows\[21]) * `arrival_date` datetime2(3)(Rows\[22]) * `remark` nvarchar(255)(Rows\[23]) * `custom1`..`custom6` nvarchar(255)(Rows\[24]..Rows\[29]) * `stevedore` nvarchar(100)(Rows\[30],装卸工) * `create_time` datetime2(3) 默认 `SYSDATETIME()` * `update_time` datetime2(3) 可在更新时写入 `SYSDATETIME()` * 约束:`detail_id` 主键;如需防重复插入,可使用 `detail_id + production_date` 唯一索引(按您确认)。 ## Java 代码接入 * 新增实体 `com.ruoyi.system.domain.InStockinDetailN` * 字段与表结构一一对应,类型与上面一致;保留必要的 `@Excel` 注解,遵循现有风格。 * 继承 `BaseEntity`,复用 `createTime`、`updateTime` 字段。 * 新增 Mapper 接口 `com.ruoyi.system.mapper.InStockinDetailNMapper` * 方法:`insertInStockinDetailN`、`updateInStockinDetailN`、`selectByDetailId`、`batchInsert(List<...>)`、`selectByDetailIdAndDate`(防重复)。 * 新增 XML `mapper/system/InStockinDetailNMapper.xml` * 定义 `resultMap` 与列映射;提供 `insert`、`update`、`select`、`batchInsert`(`foreach`)语句,时间字段默认使用 `SYSDATETIME()`。 * 新增 Service `IInStockinDetailNService` 与实现 `InStockinDetailNServiceImpl` * 封装批量写入与防重复逻辑(按 `detail_id` 或当天 `create_time` 过滤)。 ## 解析与入库逻辑 * 在 `ToErpServiceImpl#getInStock` 中: * 从 `row.get(15)`(产品明细 JSON)解析出 `Rows` 列表。 * 按上面索引映射生成 `InStockinDetailN` 对象,填充 `order_src='ERP'`、`create_time=当前时间`。 * 通过 `selectByDetailIdAndDate(detail_id, today)` 判断是否已存在,未存在则插入,已存在忽略。 * 将 `stockin_guid` 关联为当前主单 `newStockin.getStockinGuid()`(若可获得)。 ## 索引映射校验 * 结合已有 `ErpInStockinDetail` 的使用位置(`ToErpServiceImpl#AddStockinDetailByErpStockinDetail`),确保以下关键位一致: * `id`→Rows\[0]、`spare1`(产品名称)→Rows\[1]、`spare2`(产品编号/型号)→Rows\[2] * 数量→Rows\[9]、批号→Rows\[17]、序列号→Rows\[18]、生产/有效/到货日期→Rows\[19]/\[20]/\[21] * 如您确认 `Clos` 与 `Rows` 存在偏移或后续附加列,我们将按您提供的最终结构调整表与映射。 ## 验证与回归 * 本地运行 `getInStock`,抓取一次 ERP 返回;在控制台输出解析计数与首条样例,以确认列位。 * 手工查询:`SELECT TOP 10 * FROM in_stockin_detail_n ORDER BY create_time DESC;` * 回归检查:对 `in_stockin_n` 与新表之间的 `stockin_guid` 关联是否正确。 ## 提交约定 * 在实现时,所有 Java 代码将补充详细中文注释,解释每一步改动原因与映射关系。 * 不自动创建 `.md` 或 `.sql` 文件;如您需要,我们可生成对应 SQL 文件并在您确认后执行。 * 仅在您确认后进行代码与数据库变更,并按您要求的 Git 提交规范执行提交。