daShangDao_psiServer/controllers/wangdian.go

209 lines
5.4 KiB
Go

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,
},
})
}