fix: 合并多件档口入库码回写 (#240)

This commit is contained in:
chengma
2026-08-15 14:27:31 +08:00
parent 5d72141f2f
commit 8e500606c5
10 changed files with 204 additions and 31 deletions
+32
View File
@@ -50,6 +50,38 @@ const (
InnerCodeImportRestored InnerCodeImportOutcome = "restored"
)
// InnerCodeCodeOwner 是导入事务中核对单件码归属所需的最小现有记录。
type InnerCodeCodeOwner struct {
ID int64
OrderNumber string
Stall string
SpecKey string
InnerCode string
}
// LockInnerCodeCodeOwnersByDate 锁定同日现有记录,供 service 拆分聚合值并防止单件码串单。
// 查询包含软删除记录,因为软删除记录仍保留业务唯一键并可能被重新导入恢复。
func LockInnerCodeCodeOwnersByDate(tx *sql.Tx, businessDate string) ([]InnerCodeCodeOwner, error) {
rows, err := tx.Query(`SELECT id,order_number,stall,spec_key,inner_code
FROM syb_inner_code_records WHERE business_date=? ORDER BY id FOR UPDATE`, businessDate)
if err != nil {
return nil, fmt.Errorf("锁定同日档口入库码记录失败: %w", err)
}
defer rows.Close()
owners := make([]InnerCodeCodeOwner, 0)
for rows.Next() {
var owner InnerCodeCodeOwner
if err := rows.Scan(&owner.ID, &owner.OrderNumber, &owner.Stall, &owner.SpecKey, &owner.InnerCode); err != nil {
return nil, fmt.Errorf("读取同日档口入库码记录失败: %w", err)
}
owners = append(owners, owner)
}
if err := rows.Err(); err != nil {
return nil, fmt.Errorf("遍历同日档口入库码记录失败: %w", err)
}
return owners, nil
}
// UpsertInnerCodeImportRow 按已确认业务键写入一行。
// 必须在事务中调用;先锁定业务键,避免另一个唯一键冲突时更新错行。
func UpsertInnerCodeImportRow(tx *sql.Tx, row model.InnerCodeImportRow, now string) (InnerCodeImportOutcome, error) {