feat: 任务改用采集采购独立序号 (#172)

This commit is contained in:
chengma
2026-08-12 09:21:21 +08:00
parent eca3a77084
commit 9ad067503e
15 changed files with 523 additions and 44 deletions
+9 -12
View File
@@ -647,8 +647,12 @@ func RecollectPddProductForUser(db *sql.DB, actor *model.User, goodsID, clientID
return result, nil
}
taskID, err := repository.NextTaskID(tx, model.TaskCollect)
if err != nil {
return result, err
}
if err := repository.InsertCollectTaskForClientAndUser(
tx, newCollectTaskID(), p.GoodsID, p.URL, clientID, actor.UserID); err != nil {
tx, taskID, p.GoodsID, p.URL, clientID, actor.UserID); err != nil {
return result, err
}
result.Created = 1
@@ -726,7 +730,10 @@ func createPddCollectTasks(db *sql.DB, goodsIDs []string, clientID, visibleUserI
continue
}
taskID := newCollectTaskID()
taskID, err := repository.NextTaskID(tx, model.TaskCollect)
if err != nil {
return CollectTaskResult{}, err
}
if err := repository.InsertCollectTaskForClientAndUser(
tx, taskID, p.GoodsID, p.URL, clientID, createdByUserID); err != nil {
return CollectTaskResult{}, err
@@ -808,16 +815,6 @@ func FormatCollectTaskMessage(r CollectTaskResult) string {
return msg
}
// newCollectTaskID 生成采集任务编号。
// 带 COL- 前缀是为了在日志和数据库里一眼认出这是采集任务而不是采购任务。
func newCollectTaskID() string {
id := newID()
if len(id) > 16 {
id = id[:16]
}
return "COL-" + id
}
// dedupe 去掉重复项并保持原有顺序,顺带丢掉空串。
func dedupe(values []string) []string {
seen := make(map[string]bool, len(values))
+4
View File
@@ -610,6 +610,10 @@ func TestCreatePddCollectTasks_不指定客户端(t *testing.T) {
if result.Created != 1 || result.Skipped() != 0 {
t.Fatalf("Created=%d Skipped=%d,期望 1/0", result.Created, result.Skipped())
}
var taskID string
if err := db.QueryRow(`SELECT task_id FROM tasks WHERE task_type='collect' AND pdd_goods_id='737116531267'`).Scan(&taskID); err != nil || taskID != "cj1" {
t.Fatalf("第一条采集任务编号=%q err=%v,期望 cj1", taskID, err)
}
status, assigned, url, ok := collectTaskOf(t, db, "737116531267")
if !ok {
+5 -9
View File
@@ -240,8 +240,12 @@ func CreatePurchaseTasksWithOptions(db *sql.DB, actor *model.User, requests []Pu
result.Failures = append(result.Failures, TaskCreateError{SybID: request.SybID, Reason: reason})
continue
}
taskID, err := repository.NextTaskID(tx, model.TaskPurchase)
if err != nil {
return PurchaseTaskResult{}, err
}
if err := repository.InsertPurchaseTask(tx, model.Task{
TaskID: newPurchaseTaskID(), AssignedClient: clientID,
TaskID: taskID, AssignedClient: clientID,
CreatedByUserID: actor.UserID,
ExecutionMode: executionMode, LiveConfirmedBy: confirmedBy, LiveConfirmedAt: confirmedAt,
SybID: context.Order.SybID, OrderNo: context.Order.OrderNo,
@@ -315,14 +319,6 @@ func validatePurchaseRequest(q repository.Execer, request PurchaseTaskRequest) (
return "", context, choice.OptionsJSON, nil
}
func newPurchaseTaskID() string {
id := newID()
if len(id) > 16 {
id = id[:16]
}
return "PUR-" + id
}
// parsePriceYuanToCent 把网页输入的人民币元精确转成分,不使用浮点数。
func ParsePriceYuanToCent(raw string) (int64, error) {
raw = strings.TrimSpace(raw)
+4 -4
View File
@@ -314,17 +314,17 @@ func TestCreatePurchaseTasks_安全字段和重复保护(t *testing.T) {
t.Fatalf("创建结果=%+v err=%v", result, err)
}
var task model.Task
var status string
err = db.QueryRow(`SELECT status, assigned_client, syb_id, order_no, goods_id,
var status, taskID string
err = db.QueryRow(`SELECT task_id, status, assigned_client, syb_id, order_no, goods_id,
shopee_sku_id, pdd_goods_url, pdd_goods_id, pdd_options, quantity, max_price_cent
FROM tasks WHERE task_type='purchase' AND syb_id='SYB-1'`).Scan(
&status, &task.AssignedClient, &task.SybID, &task.OrderNo, &task.GoodsID,
&taskID, &status, &task.AssignedClient, &task.SybID, &task.OrderNo, &task.GoodsID,
&task.ShopeeSKUID, &task.PddGoodsURL, &task.PddGoodsID, &task.PddOptions,
&task.Quantity, &task.MaxPriceCent)
if err != nil {
t.Fatal(err)
}
if status != "assigned" || task.MaxPriceCent != 4200 || task.MaxPriceCent == 999900 ||
if taskID != "cg1" || status != "assigned" || task.MaxPriceCent != 4200 || task.MaxPriceCent == 999900 ||
task.Quantity != 1 || task.PddOptions != key || task.AssignedClient != "CLIENT-1" {
t.Fatalf("采购任务字段不安全或不完整: status=%s task=%+v", status, task)
}