fix: 合并多件档口入库码回写 (#240)
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user