package controllers import ( "fmt" "log" "net/http" "psi/constant" "psi/database" "psi/service" "psi/utils" "strconv" "github.com/gin-gonic/gin" "gorm.io/gorm" ) type WangdianApi struct{} func (i *WangdianApi) CreatePurchaseOrder(c *gin.Context) { raw := c.PostForm("purchase_order_id") if raw == "" { raw = c.Query("purchase_order_id") } purchaseOrderID, err := strconv.ParseInt(raw, 10, 64) if err != nil || purchaseOrderID <= 0 { utils.FailWithRequestLog(constant.LoggerChannelRequest, "参数错误: purchase_order_id 必须为正整数", nil, c, nil) return } resp, err := service.PushPurchaseOrder(purchaseOrderID, database.GetDB(c)) if err != nil { utils.FailWithRequestLog(constant.LoggerChannelWork, "推送采购单到旺店通失败: "+err.Error(), err, c, nil) return } c.JSON(http.StatusOK, gin.H{ "code": resp.Code, "message": resp.Message, }) } func (i *WangdianApi) QueryProvider(c *gin.Context) { db := database.GetDB(c) taskID, err := service.WrapSyncTask(service.TaskTypeSyncProvider, db, func(taskID int64, db *gorm.DB) { if err := service.SyncProvider(db, taskID); err != nil { service.FailSyncTask(db, taskID, err.Error()) log.Printf("[旺店通供应商同步] 异步同步失败: %v", err) } }) if err != nil { utils.FailWithRequestLog(constant.LoggerChannelWork, err.Error(), err, c, nil) return } c.JSON(http.StatusOK, gin.H{ "code": 0, "message": "供应商同步任务已启动", "task_id": taskID, }) } func (i *WangdianApi) QueryWarehouse(c *gin.Context) { db := database.GetDB(c) taskID, err := service.WrapSyncTask(service.TaskTypeSyncWarehouse, db, func(taskID int64, db *gorm.DB) { if err := service.SyncWarehouse(db, taskID); err != nil { service.FailSyncTask(db, taskID, err.Error()) log.Printf("[旺店通仓库同步] 异步同步失败: %v", err) } }) if err != nil { utils.FailWithRequestLog(constant.LoggerChannelWork, err.Error(), err, c, nil) return } c.JSON(http.StatusOK, gin.H{ "code": 0, "message": "仓库同步任务已启动", "task_id": taskID, }) } func (i *WangdianApi) QueryGoods(c *gin.Context) { db := database.GetDB(c) startTime := c.Query("start_time") endTime := c.Query("end_time") aboutID := c.GetInt64("about_id") taskID, err := service.WrapSyncTask(service.TaskTypeSyncGoods, db, func(taskID int64, db *gorm.DB) { if err := service.SyncGoods(db, taskID, startTime, endTime, aboutID); err != nil { service.FailSyncTask(db, taskID, err.Error()) log.Printf("[旺店通商品同步] 异步同步失败: %v", err) } }) if err != nil { utils.FailWithRequestLog(constant.LoggerChannelWork, err.Error(), err, c, nil) return } c.JSON(http.StatusOK, gin.H{ "code": 0, "message": "商品同步任务已启动", "task_id": taskID, }) } func (i *WangdianApi) GoodsPush(c *gin.Context) { goodsListJSON := c.PostForm("goods_list") if goodsListJSON == "" { goodsListJSON = c.Query("goods_list") } if goodsListJSON == "" { utils.FailWithRequestLog(constant.LoggerChannelRequest, "参数错误: goods_list 不能为空", fmt.Errorf("goods_list为空"), c, nil) return } resp, err := service.PushGoods(goodsListJSON) if err != nil { utils.FailWithRequestLog(constant.LoggerChannelWork, "推送货品到旺店通失败: "+err.Error(), err, c, nil) return } c.JSON(http.StatusOK, gin.H{ "code": resp.Code, "message": resp.Message, }) } func (i *WangdianApi) GetSyncTaskStatus(c *gin.Context) { db := database.GetDB(c) taskType := c.Query("task_type") if taskType == "" { taskType = c.Param("task_type") } if taskType == "" { utils.FailWithRequestLog(constant.LoggerChannelRequest, "参数错误: task_type 不能为空", nil, c, nil) return } task, err := service.GetSyncTaskStatus(db, taskType) if err != nil { utils.FailWithRequestLog(constant.LoggerChannelWork, "查询任务状态失败: "+err.Error(), err, c, nil) return } if task == nil { c.JSON(http.StatusOK, gin.H{ "code": 0, "message": "暂无任务记录", "data": nil, }) return } c.JSON(http.StatusOK, gin.H{ "code": 0, "message": "ok", "data": task, }) } func (i *WangdianApi) CancelSyncTask(c *gin.Context) { db := database.GetDB(c) taskIDStr := c.PostForm("task_id") if taskIDStr == "" { taskIDStr = c.Query("task_id") } taskID, err := strconv.ParseInt(taskIDStr, 10, 64) if err != nil || taskID <= 0 { utils.FailWithRequestLog(constant.LoggerChannelRequest, "参数错误: task_id 必须为正整数", nil, c, nil) return } if err := service.CancelSyncTask(db, taskID); err != nil { utils.FailWithRequestLog(constant.LoggerChannelWork, "取消任务失败: "+err.Error(), err, c, nil) return } c.JSON(http.StatusOK, gin.H{ "code": 0, "message": "任务已取消", }) } func (i *WangdianApi) ListSyncTask(c *gin.Context) { db := database.GetDB(c) taskType := c.Query("task_type") pageNo, _ := strconv.Atoi(c.DefaultQuery("page_no", "1")) pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20")) tasks, total, err := service.ListSyncTask(db, taskType, pageNo, pageSize) if err != nil { utils.FailWithRequestLog(constant.LoggerChannelWork, "查询同步任务列表失败: "+err.Error(), err, c, nil) return } c.JSON(http.StatusOK, gin.H{ "code": 0, "message": "ok", "data": gin.H{ "list": tasks, "total": total, "page_no": pageNo, "page_size": pageSize, }, }) }