package inventorymanage import ( "errors" "fmt" "github.com/gin-gonic/gin" "go-admin/app/admin/models" "go-admin/tools" "go-admin/tools/app" "io" "net/http" ) // GetInventoryList 查询库存列表 // @Summary 查询库存列表 // @Tags 库存管理 // @Produce json // @Accept json // @Param request body models.ErpStockListReq true "查询库存列表模型" // @Success 200 {object} models.ErpStockListResp // @Router /api/v1/inventory/list [post] func GetInventoryList(c *gin.Context) { req := &models.ErpStockListReq{} if err := c.ShouldBindJSON(&req); err != nil { //logger.Error(err) app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误") return } resp, err := req.List() if err != nil { //logger.Error("erp commodity list err:", err) app.Error(c, http.StatusInternalServerError, err, "获取失败") return } app.OK(c, resp, "OK") return } // GetInventoryDetail 查询库存详情 // @Summary 查询库存详情 // @Tags 库存管理 // @Produce json // @Accept json // @Param request body models.ErpStockCommodityListReq true "查询库存详情模型" // @Success 200 {object} models.ErpStockCommodityListResp // @Router /api/v1/inventory/detail [post] func GetInventoryDetail(c *gin.Context) { req := &models.ErpStockCommodityListReq{} if err := c.ShouldBindJSON(&req); err != nil { //logger.Error(err) app.Error(c, http.StatusBadRequest, errors.New("param err"), "参数错误") return } list, err := req.GetDetailList() if err != nil { //logger.Error("erp stock err:", err) app.Error(c, http.StatusInternalServerError, err, "获取失败") return } app.OK(c, list, "OK") return } type DeliveryCargoReq struct { Id uint32 `json:"id" binding:"required"` // 商品库存列表id State uint32 `json:"state" binding:"required"` // 库存状态:4-出库 } // DeliveryCargo 出库 // @Summary 出库 // @Tags 库存管理 // @Produce json // @Accept json // @Param request body DeliveryCargoReq true "出库模型" // @Success 200 {object} app.Response // @Router /api/v1/inventory/delivery [post] func DeliveryCargo(c *gin.Context) { req := &DeliveryCargoReq{} if err := c.ShouldBindJSON(&req); err != nil { //logger.Error(err) app.Error(c, http.StatusBadRequest, errors.New("param err"), "参数错误") return } if err := tools.Validate(req); err != nil { app.Error(c, http.StatusBadRequest, err, err.Error()) return } err := models.SetStockCommodityState(req.Id, req.State) if err != nil { //logger.Error("erp stock err:", err) app.Error(c, http.StatusInternalServerError, err, "获取失败") return } app.OK(c, nil, "OK") return } // BatchPrint 批量打印 // @Summary 批量打印 // @Tags 库存管理 // @Produce json // @Accept json // @Param request body models.BatchPrintInfoReq true "批量打印模型" // @Success 200 {object} app.Response // @Router /api/v1/inventory/print [post] func BatchPrint(c *gin.Context) { req := &models.BatchPrintInfoReq{} if err := c.ShouldBindJSON(&req); err != nil { //logger.Error(err) app.Error(c, http.StatusBadRequest, errors.New("param err"), "参数错误") return } if err := tools.Validate(req); err != nil { app.Error(c, http.StatusBadRequest, err, err.Error()) return } err := models.BatchPrint(req) if err != nil { //logger.Error("erp stock err:", err) app.Error(c, http.StatusInternalServerError, err, "打印失败") return } app.OK(c, nil, "OK") return } // BatchImport 库存导入 // @Summary 库存导入 // @Tags 库存管理 // @Produce json // @Accept json // @Param file body string true "上传excel文件" // @Success 200 {object} app.Response // @Router /api/v1/inventory/import [post] //func BatchImport(c *gin.Context) { // models.EsStockLock.Lock() // defer models.EsStockLock.Unlock() // // file, header, err := c.Request.FormFile("file") // if err != nil { // //logger.Error("form file err:", err) // app.Error(c, http.StatusInternalServerError, err, "导入失败") // return // } // defer file.Close() // // readAll, err := io.ReadAll(file) // if err != nil { // //logger.Error("read all err:", err) // app.Error(c, http.StatusInternalServerError, err, "导入失败") // return // } // fmt.Println("header:", header.Filename) // //fmt.Println("readAll:", readAll) // // fileStart := time.Now().UnixMilli() // bCol, colsMap, err := models.FileExcelImport(readAll, nil, 3) // if err != nil { // //logger.Error("file excel reader err:", err) // app.Error(c, http.StatusInternalServerError, err, err.Error()) // return // } // fmt.Println("FileExcelReader", time.Now().UnixMilli()-fileStart) // fmt.Println("colsMap:", colsMap) // if len(colsMap) != 0 { // colsMap = colsMap[1:] // } // // var stockFiles []models.StockExcel // err = json.Unmarshal(bCol, &stockFiles) // if err != nil { // //logger.Error("erp commodity file excel unmarshal err:", err) // app.Error(c, http.StatusInternalServerError, err, "导入失败") // return // } // if len(stockFiles) != 0 { // stockFiles = stockFiles[1:] // } // stockier := models.NewStockImporter() // fileStart = time.Now().UnixMilli() // erpStocks := make([]models.ErpStockCommodity, 0, len(stockFiles)) // erpStocks, err = stockier.ImportStockData(stockFiles) // if err != nil { // //logger.Error("processing err:", err) // app.Error(c, http.StatusInternalServerError, err, "导入失败") // return // } // fmt.Println("ErpStockFileExcelListProcessing", time.Now().UnixMilli()-fileStart) // // begin := orm.Eloquent.Begin() // total := len(erpStocks) // size := 200 // page := total / size // if total%size != 0 { // page += 1 // } // errGroup := errgroup.Group{} // for i := 0; i < page; i++ { // if i == page-1 { // stockList := erpStocks[i*size:] // err = begin.Create(&stockList).Error // if err != nil { // begin.Rollback() // //logger.Error("create commodity err:", err) // app.Error(c, http.StatusInternalServerError, err, "导入失败") // return // } // } else { // errGroup.Go(func() error { // stockList := erpStocks[i*size : (i+1)*size] // err = begin.Create(&stockList).Error // if err != nil { // begin.Rollback() // //logger.Error("create commodity err:", err) // return err // } // return nil // }) // } // } // err = stockier.ErpStockCountUpdate(begin) // if err != nil { // begin.Rollback() // //logger.Error("erp stock count update err:", err) // app.Error(c, http.StatusInternalServerError, err, "导入失败") // return // } // // err = errGroup.Wait() // if err != nil { // begin.Rollback() // //logger.Error("err group wait err:", err) // app.Error(c, http.StatusInternalServerError, err, "导入失败") // return // } // err = begin.Commit().Error // if err != nil { // begin.Rollback() // //logger.Error("commit err:", err) // app.Error(c, http.StatusInternalServerError, err, "导入失败") // return // } // // logging := models.Logging{ // Function: "库存导入", // Event: models.LoggingEventInventoryImport, // EventName: "库存导入", // } // logging.Create(c) // app.OK(c, nil, "OK") // return //} func BatchImport(c *gin.Context) { models.EsStockLock.Lock() defer models.EsStockLock.Unlock() file, header, err := c.Request.FormFile("file") if err != nil { //logger.Error("form file err:", err) app.Error(c, http.StatusInternalServerError, err, "预览失败") return } readAll, err := io.ReadAll(file) if err != nil { //logger.Error("read all err:", err) app.Error(c, http.StatusInternalServerError, err, "预览失败") return } fmt.Println("header:", header.Filename) _, colsMap, err := models.FileExcelImport(readAll, nil, 3) if err != nil { //logger.Error("file excel reader err:", err) app.Error(c, http.StatusInternalServerError, err, err.Error()) return } fmt.Println("colsMap:", colsMap) if len(colsMap) != 0 { colsMap = colsMap[1:] } stockier := models.NewStockImporter() err = stockier.ImportStockData2(colsMap) if err != nil { app.Error(c, http.StatusInternalServerError, err, err.Error()) return } app.OK(c, nil, "导入成功") return }