diff --git a/admincron/goods_putaway.go b/admincron/goods_putaway.go index 0abe164..38e560f 100644 --- a/admincron/goods_putaway.go +++ b/admincron/goods_putaway.go @@ -1,6 +1 @@ package admincron - - - - - diff --git a/app/admin/apis/inventorymanage/Inventory.go b/app/admin/apis/inventorymanage/Inventory.go index 1cf452e..1b4db0e 100644 --- a/app/admin/apis/inventorymanage/Inventory.go +++ b/app/admin/apis/inventorymanage/Inventory.go @@ -12,8 +12,7 @@ import ( ) type DeliveryCargoReq struct { - Id uint32 `json:"id" binding:"required"` // 商品库存列表id - State uint32 `json:"state" binding:"required"` // 库存状态:4-出库 + Id uint32 `json:"id" binding:"required"` // 商品库存列表id } type AddRemarkReq struct { @@ -21,6 +20,27 @@ type AddRemarkReq struct { Remark string `json:"remark"` // 备注 } +// GetInventoryListOld 该函数只遍历了库存列表,和产品需求不符合 +// 产品需要库存列表接口返回所有商品资料数据,以及每个商品的库存情况 +func GetInventoryListOld(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 +} + // GetInventoryList 查询库存列表 // @Summary 查询库存列表 // @Tags 库存管理 @@ -36,8 +56,14 @@ func GetInventoryList(c *gin.Context) { app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误") return } + // 如果筛选条件有:库存情况筛选;则以库存表为准,查库存表即可 + // (1)没门店,则查所有库存情况并排序 + // (2)有门店,则查门店对应的库存情况并排序 - resp, err := req.List() + // 如果筛选条件没有库存情况,则先查询商品资料,并排序;支持筛选条件:商品编号、商品分类、商品名称 + // 然后查询每个商品资料的库存情况,没传门店id,则查所有库存;否则查当前门店的库存情况 + + resp, err := req.StockList() if err != nil { //logger.Error("erp commodity list err:", err) app.Error(c, http.StatusInternalServerError, err, "获取失败") @@ -96,7 +122,7 @@ func DeliveryCargo(c *gin.Context) { return } - err := models.SetStockCommodityState(req.Id, req.State) + err := models.SetStockCommodityState(req.Id) if err != nil { //logger.Error("erp stock err:", err) app.Error(c, http.StatusInternalServerError, err, "获取失败") diff --git a/app/admin/middleware/logger.go b/app/admin/middleware/logger.go index 299de8e..01c8e96 100644 --- a/app/admin/middleware/logger.go +++ b/app/admin/middleware/logger.go @@ -98,7 +98,15 @@ func RequestOutLog(c *gin.Context) { _, ok := global.WHILTE[resultUrl] if c.Request.Method != "GET" && c.Request.Method != "OPTIONS" && config2.LoggerConfig.EnabledDB && ok { - SetDBOperLog(c, clientIP, statusCode, reqUri, reqMethod, latencyTime, req.(string), response.(string)) + reqParam, respParam := "", "" + if req != nil { + reqParam = req.(string) + } + + if response != nil { + respParam = response.(string) + } + SetDBOperLog(c, clientIP, statusCode, reqUri, reqMethod, latencyTime, reqParam, respParam) } } @@ -130,9 +138,9 @@ func SetDBOperLog(c *gin.Context, clientIP string, statusCode int, reqUri string sysOperLog.Method = reqMethod if len(menuList) > 0 { - sysOperLog.Title = menuList[0].Title + sysOperLog.Title = menuList[0].Title //事件 menu.Title = menuList[0].Title - sysOperLog.MenuTitle, _ = menu.GetParentTitle() + sysOperLog.MenuTitle, _ = menu.GetParentTitle() //操作模块 } sysOperLog.CreateBy = tools.GetUserName(c) diff --git a/app/admin/models/casbinrule.go b/app/admin/models/casbinrule.go index 014e2fd..5e141c4 100644 --- a/app/admin/models/casbinrule.go +++ b/app/admin/models/casbinrule.go @@ -1,6 +1,6 @@ package models -//sys_casbin_rule +// sys_casbin_rule type CasbinRule struct { PType string `json:"p_type" gorm:"size:100;"` V0 string `json:"v0" gorm:"size:100;"` diff --git a/app/admin/models/commodity.go b/app/admin/models/commodity.go index 5ef635b..fc04c20 100644 --- a/app/admin/models/commodity.go +++ b/app/admin/models/commodity.go @@ -631,7 +631,7 @@ func (m *StockImporter) ImportStockData(colsMap []map[string]interface{}) error StoreName: list[i].StoreName, ErpCommodityId: v2.ID, ErpCommodityName: v2.Name, - CommoditySerialNumber: list[i].SerialNum, + CommoditySerialNumber: v2.SerialNumber, ErpCategoryId: v2.ErpCategoryId, ErpCategoryName: v2.ErpCategoryName, ErpSupplierId: v3, @@ -647,6 +647,12 @@ func (m *StockImporter) ImportStockData(colsMap []map[string]interface{}) error IMEI: v2.IMEI, Remark: "", } + + if list[i].StockTime != "" { //导入时间不为空 + parsedTime, _ := time.Parse("2006/1/2", list[i].StockTime) + stockCommodity.FirstStockTime = parsedTime + } + if list[i].SysGenerate != "" { //导入串码不为空,则默认为3手动添加 stockCommodity.IMEIType = 3 stockCommodity.IMEI = list[i].SysGenerate @@ -686,11 +692,11 @@ func (m *StockImporter) processErpStocks(erpStocks []ErpStockCommodity) error { stockList := erpStocks[start:end] errGroup.Go(func() error { - return createStockList(begin, stockList) + return createStockList(begin, stockList) //插入库存商品详情 }) } - err := m.ErpStockCountUpdate(begin) + err := m.ErpStockCountUpdate(begin) //更新or插入库存表 if err != nil { begin.Rollback() return err @@ -780,7 +786,26 @@ func (m *StockImporter) ErpStockCountUpdate(gdb *gorm.DB) error { fmt.Println("inventoryStock", inventoryStock.Count) m.Inventories = append(m.Inventories, inventoryStock) } + } + } + return nil +} + +// 查询库存详情时同步库存id +func updateCommodityStock(id uint32) error { + var stock ErpStock + err := orm.Eloquent.Table("erp_stock").Raw("SELECT * FROM erp_stock WHERE id = ?", id).Scan(&stock).Error + if err != nil { + return err + } + + if stock.ID != 0 { + err = orm.Eloquent.Debug().Exec(fmt.Sprintf( + "UPDATE erp_stock_commodity SET erp_stock_id = %d WHERE erp_commodity_name = '%s' AND erp_stock_id = 0;", + stock.ID, stock.ErpCommodityName)).Error + if err != nil { + return err } } @@ -1079,7 +1104,10 @@ func (m *ErpStockListReq) List() (*ErpStockListResp, error) { if m.PageSize == 0 { m.PageSize = 10 } - qs := orm.Eloquent.Table("erp_stock") + + qs := orm.Eloquent.Table("erp_stock"). + Joins("JOIN erp_category c ON erp_stock.erp_category_id = c.id") + if m.SerialNumber != "" { qs = qs.Where("commodity_serial_number=?", m.SerialNumber) } @@ -1099,6 +1127,12 @@ func (m *ErpStockListReq) List() (*ErpStockListResp, error) { qs = qs.Where("count = 0") } + // SQL Order By Clause + qs = qs.Order("CASE WHEN c.pid = 0 THEN CAST(c.number AS SIGNED) ELSE " + + "CAST(SUBSTRING(c.number, 1, 3) AS SIGNED) END"). + Order("CAST(c.pid AS SIGNED)"). + Order("CAST(SUBSTRING(erp_stock.commodity_serial_number, -4) AS SIGNED)") + var count int64 if err := qs.Count(&count).Error; err != nil { //logger.Error("count err:", err) @@ -1106,7 +1140,7 @@ func (m *ErpStockListReq) List() (*ErpStockListResp, error) { } var commodities []ErpStock - err := qs.Order("id DESC").Offset(page * m.PageSize).Limit(m.PageSize).Find(&commodities).Error + err := qs.Offset(page * m.PageSize).Limit(m.PageSize).Find(&commodities).Error if err != nil && !errors.Is(err, RecordNotFound) { //logger.Error("erp commodity list err:", err) return resp, err @@ -1121,6 +1155,367 @@ func (m *ErpStockListReq) List() (*ErpStockListResp, error) { return resp, nil } +// StockList +// 1、如果筛选条件有:库存情况筛选;则以库存表为准,查库存表即可 +// (1)没门店,则查所有库存情况并排序 +// (2)有门店,则查门店对应的库存情况并排序 +// 2、如果筛选条件没有库存情况, +// (1)先查询商品资料,并排序;支持筛选条件:商品编号、商品分类、商品名称 +// (2)然后查询每个商品资料的库存情况,没传门店id,则查所有库存;否则查当前门店的库存情况 +func (m *ErpStockListReq) StockList() (*ErpStockListResp, error) { + switch m.StockType { + case 2: // 有库存 + return m.stockNoEmptyList() + case 3: // 无库存,连表查询商品明细和库存表 + return m.stockIsEmptyList() + default: // 0和1,以及其他值,表示无库存情况筛选 + return m.allCommodityList() + } +} + +// stockIsEmptyList 库存列表-无库存查询 +// 无库存,要连表查询(商品明细、库存表) +func (m *ErpStockListReq) stockIsEmptyList() (*ErpStockListResp, error) { + resp := &ErpStockListResp{ + PageIndex: m.PageIndex, + PageSize: m.PageSize, + } + page := m.PageIndex - 1 + if page < 0 { + page = 0 + } + if m.PageSize == 0 { + m.PageSize = 10 + } + + //以下代码组合了2个连表查询 + //(1)查询无库存的商品资料 + /*** + SELECT erp_commodity.*, + COALESCE(erp_stock.count, 0) AS count + FROM erp_commodity + LEFT JOIN ( + SELECT erp_commodity_id, SUM(count) AS count + FROM erp_stock + GROUP BY erp_commodity_id + ) erp_stock ON erp_commodity.id = erp_stock.erp_commodity_id + WHERE erp_stock.count IS NULL OR erp_stock.count = 0; + ***/ + + //(2)按商品编号排序 + /*** + SELECT e.* + FROM erp_stock e + JOIN erp_category c ON e.erp_category_id = c.id + ORDER BY + CASE WHEN c.pid = 0 THEN CAST(c.number AS SIGNED) ELSE CAST(SUBSTRING(c.number, 1, 3) AS SIGNED) END, + CAST(c.pid AS SIGNED), + CAST(SUBSTRING(e.commodity_serial_number, -4) AS SIGNED); + ***/ + + qs := orm.Eloquent.Debug().Table("erp_commodity") + if m.StoreId != 0 { // 传门店id + qs = qs.Select("erp_commodity.*, COALESCE(erp_stock.count, 0) AS count"). + Joins("LEFT JOIN erp_stock ON erp_commodity.id = erp_stock.erp_commodity_id"). + Joins("JOIN erp_category c ON erp_commodity.erp_category_id = c.id"). + Where("erp_stock.count = 0 AND erp_stock.store_id = ?", m.StoreId). + Order("CASE WHEN c.pid = 0 THEN CAST(c.number AS SIGNED) " + + "ELSE CAST(SUBSTRING(c.number, 1, 3) AS SIGNED) END, " + + "CAST(c.pid AS SIGNED), CAST(SUBSTRING(erp_commodity.serial_number, -4) AS SIGNED)") + } else { // 没传门店id,则子查询先求库存表中erp_commodity_id相同的count之和 + qs = qs.Select("erp_commodity.*, COALESCE(erp_stock.count, 0) AS count"). + Joins("LEFT JOIN (SELECT erp_commodity_id, SUM(count) AS count FROM erp_stock GROUP BY erp_commodity_id) " + + "erp_stock ON erp_commodity.id = erp_stock.erp_commodity_id"). + Joins("JOIN erp_category c ON erp_commodity.erp_category_id = c.id"). + Where("erp_stock.count IS NULL OR erp_stock.count = 0"). + Order("CASE WHEN c.pid = 0 THEN CAST(c.number AS SIGNED) " + + "ELSE CAST(SUBSTRING(c.number, 1, 3) AS SIGNED) END, " + + "CAST(c.pid AS SIGNED), CAST(SUBSTRING(erp_commodity.serial_number, -4) AS SIGNED)") + } + + if m.SerialNumber != "" { + qs = qs.Where("erp_commodity.serial_number=?", m.SerialNumber) + } + if m.CommodityName != "" { + qs = qs.Where("erp_commodity.name Like '%" + m.CommodityName + "%'") + //qs = qs.Where("name LIKE ?", m.Name) + } + if m.ErpCategoryId != 0 { + qs = qs.Where("erp_commodity.erp_category_id=?", m.ErpCategoryId) + } + + var commodities []ErpCommodity + err := qs.Offset(page * m.PageSize).Limit(m.PageSize).Find(&commodities).Error + if err != nil && err != RecordNotFound { + logger.Error("查询无库存列表失败", logger.Field("err", err)) + return nil, err + } + + var count int64 + err = qs.Count(&count).Error + if err != nil { + logger.Error("查询无库存列表数量失败", logger.Field("err", err)) + return nil, err + } + + //遍历商品资料,转换为库存列表数据 + var stockList []ErpStock + for _, commodity := range commodities { + var stock ErpStock + stock.ErpCommodityId = commodity.ID + stock.ErpCommodityName = commodity.Name + stock.ErpCategoryId = commodity.ErpCategoryId + stock.ErpCategoryName = commodity.ErpCategoryName + stock.CommoditySerialNumber = commodity.SerialNumber + stock.IMEIType = commodity.IsIMEI + stock.RetailPrice = commodity.RetailPrice + stock.MinRetailPrice = commodity.MinRetailPrice + stock.Count = 0 + stock.DispatchCount = 0 + + stockList = append(stockList, stock) + } + + //跟之前保持一致 + resp.Total = int(count) + resp.PageIndex = page + 1 + resp.PageSize = m.PageSize + resp.List = stockList + + return resp, nil +} + +func (m *ErpStockListReq) stockNoEmptyList() (*ErpStockListResp, error) { + resp := &ErpStockListResp{ + PageIndex: m.PageIndex, + PageSize: m.PageSize, + } + page := m.PageIndex - 1 + if page < 0 { + page = 0 + } + if m.PageSize == 0 { + m.PageSize = 10 + } + + /*** + //组合查询 + SELECT + ec.*, + COALESCE(SUM(es.count), 0) AS total_count + FROM + erp_commodity ec + LEFT JOIN + erp_stock es ON ec.id = es.erp_commodity_id + GROUP BY + ec.id + ORDER BY + CASE + WHEN ec.erp_category_id IN (SELECT id FROM erp_category WHERE pid = 0) THEN CAST((SELECT number FROM erp_category WHERE id = ec.erp_category_id) AS SIGNED) + ELSE CAST(SUBSTRING((SELECT number FROM erp_category WHERE id = (SELECT pid FROM erp_category WHERE id = ec.erp_category_id)), 1, 3) AS SIGNED) + END, + CAST((SELECT pid FROM erp_category WHERE id = ec.erp_category_id) AS SIGNED), + CAST(SUBSTRING(ec.serial_number, -4) AS SIGNED); + ***/ + + qs := orm.Eloquent.Debug().Table("erp_commodity") + if m.StoreId == 0 { // 没指定门店,连表查询并计算总数量 + qs = qs.Select("erp_commodity.*, COALESCE(SUM(erp_stock.count), 0) AS total_count, erp_stock.id AS erp_stock_id"). + Joins("LEFT JOIN erp_stock ON erp_commodity.id = erp_stock.erp_commodity_id AND erp_stock.count != 0"). + Group("erp_commodity.id"). + Order("CASE WHEN erp_commodity.erp_category_id IN (SELECT id FROM erp_category WHERE pid = 0) " + + "THEN CAST((SELECT number FROM erp_category WHERE id = erp_commodity.erp_category_id) AS SIGNED) " + + "ELSE CAST(SUBSTRING((SELECT number FROM erp_category WHERE id = (SELECT pid FROM erp_category WHERE id = erp_commodity.erp_category_id)), 1, 3) AS SIGNED) " + + "END, CAST((SELECT pid FROM erp_category WHERE id = erp_commodity.erp_category_id) AS SIGNED), " + + "CAST(SUBSTRING(erp_commodity.serial_number, -4) AS SIGNED)") + } else { // 指定了门店,连表查询指定store_id的count + qs = qs.Select("erp_commodity.*, COALESCE(SUM(erp_stock.count), 0) AS total_count, erp_stock.id AS erp_stock_id"). + Joins("LEFT JOIN erp_stock ON erp_commodity.id = erp_stock.erp_commodity_id "+ + "AND erp_stock.count != 0 AND erp_stock.store_id = ?", m.StoreId). + Group("erp_commodity.id"). + Order("CASE WHEN erp_category.pid = 0 THEN CAST(erp_category.number AS SIGNED) " + + "ELSE CAST(SUBSTRING(erp_category.number, 1, 3) AS SIGNED) END, " + + "CAST(erp_category.pid AS SIGNED), " + + "CAST(SUBSTRING(erp_commodity.serial_number, -4) AS SIGNED)"). + Joins("JOIN erp_category ON erp_commodity.erp_category_id = erp_category.id") + } + + if m.SerialNumber != "" { + qs = qs.Where("erp_commodity.serial_number=?", m.SerialNumber) + } + if m.CommodityName != "" { + qs = qs.Where("erp_commodity.name Like '%" + m.CommodityName + "%'") + } + if m.ErpCategoryId != 0 { + qs = qs.Where("erp_commodity.erp_category_id=?", m.ErpCategoryId) + } + + var commodities []struct { + ErpCommodity + TotalCount int + ErpStockId int + } + + err := qs.Offset(page * m.PageSize).Limit(m.PageSize).Find(&commodities).Error + if err != nil && err != RecordNotFound { + logger.Error("commodityList err", logger.Field("err", err)) + return resp, err + } + + var count int64 + err = qs.Count(&count).Error + if err != nil { + logger.Error("commodityList count err", logger.Field("err", err)) + return resp, err + } + + //遍历商品资料,转换为库存列表数据 + var stockList []ErpStock + for _, commodity := range commodities { + if commodity.TotalCount != 0 { + var stock ErpStock + stock.ID = uint32(commodity.ErpStockId) + stock.ErpCommodityId = commodity.ID + stock.ErpCommodityName = commodity.Name + stock.ErpCategoryId = commodity.ErpCategoryId + stock.ErpCategoryName = commodity.ErpCategoryName + stock.CommoditySerialNumber = commodity.SerialNumber + stock.IMEIType = commodity.IsIMEI + stock.RetailPrice = commodity.RetailPrice + stock.MinRetailPrice = commodity.MinRetailPrice + stock.Count = uint32(commodity.TotalCount) + stock.DispatchCount = 0 + + stockList = append(stockList, stock) + } + + } + + //跟之前保持一致 + resp.Total = len(stockList) + resp.PageIndex = page + 1 + resp.PageSize = m.PageSize + resp.List = stockList + + return resp, nil +} + +// 筛选条件无:库存情况筛选 +// (1)先查询商品资料,并排序;支持筛选条件:商品编号、商品分类、商品名称 +// (2)然后查询每个商品资料的库存情况,没传门店id,则查所有库存;否则查当前门店的库存情况 +func (m *ErpStockListReq) allCommodityList() (*ErpStockListResp, error) { + resp := &ErpStockListResp{ + PageIndex: m.PageIndex, + PageSize: m.PageSize, + } + page := m.PageIndex - 1 + if page < 0 { + page = 0 + } + if m.PageSize == 0 { + m.PageSize = 10 + } + + /*** + //组合查询 + SELECT + ec.*, + COALESCE(SUM(es.count), 0) AS total_count + FROM + erp_commodity ec + LEFT JOIN + erp_stock es ON ec.id = es.erp_commodity_id + GROUP BY + ec.id + ORDER BY + CASE + WHEN ec.erp_category_id IN (SELECT id FROM erp_category WHERE pid = 0) THEN CAST((SELECT number FROM erp_category WHERE id = ec.erp_category_id) AS SIGNED) + ELSE CAST(SUBSTRING((SELECT number FROM erp_category WHERE id = (SELECT pid FROM erp_category WHERE id = ec.erp_category_id)), 1, 3) AS SIGNED) + END, + CAST((SELECT pid FROM erp_category WHERE id = ec.erp_category_id) AS SIGNED), + CAST(SUBSTRING(ec.serial_number, -4) AS SIGNED); + ***/ + + qs := orm.Eloquent.Debug().Table("erp_commodity") + + if m.SerialNumber != "" { + qs = qs.Where("erp_commodity.serial_number=?", m.SerialNumber) + } + if m.CommodityName != "" { + qs = qs.Where("erp_commodity.name Like '%" + m.CommodityName + "%'") + } + if m.ErpCategoryId != 0 { + qs = qs.Where("erp_commodity.erp_category_id=?", m.ErpCategoryId) + } + + if m.StoreId == 0 { // 没指定门店,连表查询并计算总数量 + qs = qs.Select("erp_commodity.*, COALESCE(SUM(erp_stock.count), 0) AS total_count, erp_stock.id AS erp_stock_id"). + Joins("LEFT JOIN erp_stock ON erp_commodity.id = erp_stock.erp_commodity_id"). + Group("erp_commodity.id"). + Order("CASE WHEN erp_commodity.erp_category_id IN (SELECT id FROM erp_category WHERE pid = 0) " + + "THEN CAST((SELECT number FROM erp_category WHERE id = erp_commodity.erp_category_id) AS SIGNED) " + + "ELSE CAST(SUBSTRING((SELECT number FROM erp_category WHERE id = (SELECT pid FROM erp_category WHERE id = erp_commodity.erp_category_id)), 1, 3) AS SIGNED) " + + "END, CAST((SELECT pid FROM erp_category WHERE id = erp_commodity.erp_category_id) AS SIGNED), " + + "CAST(SUBSTRING(erp_commodity.serial_number, -4) AS SIGNED)") + } else { // 指定了门店,连表查询指定store_id的count + qs = qs.Select("erp_commodity.*, COALESCE(SUM(erp_stock.count), 0) AS total_count, erp_stock.id AS erp_stock_id"). + Joins("LEFT JOIN erp_stock ON erp_commodity.id = erp_stock.erp_commodity_id "+ + "AND erp_stock.store_id = ?", m.StoreId). + Group("erp_commodity.id"). + Order("CASE WHEN erp_category.pid = 0 THEN CAST(erp_category.number AS SIGNED) " + + "ELSE CAST(SUBSTRING(erp_category.number, 1, 3) AS SIGNED) END, " + + "CAST(erp_category.pid AS SIGNED), " + + "CAST(SUBSTRING(erp_commodity.serial_number, -4) AS SIGNED)"). + Joins("JOIN erp_category ON erp_commodity.erp_category_id = erp_category.id") + } + + var commodities []struct { + ErpCommodity + TotalCount int + ErpStockId int + } + + err := qs.Offset(page * m.PageSize).Limit(m.PageSize).Find(&commodities).Error + if err != nil && err != RecordNotFound { + logger.Error("commodityList err", logger.Field("err", err)) + return resp, err + } + + var count int64 + err = qs.Count(&count).Error + if err != nil { + logger.Error("commodityList count err", logger.Field("err", err)) + return resp, err + } + + //遍历商品资料,转换为库存列表数据 + var stockList []ErpStock + for _, commodity := range commodities { + var stock ErpStock + stock.ID = uint32(commodity.ErpStockId) + stock.ErpCommodityId = commodity.ID + stock.ErpCommodityName = commodity.Name + stock.ErpCategoryId = commodity.ErpCategoryId + stock.ErpCategoryName = commodity.ErpCategoryName + stock.CommoditySerialNumber = commodity.SerialNumber + stock.IMEIType = commodity.IsIMEI + stock.RetailPrice = commodity.RetailPrice + stock.MinRetailPrice = commodity.MinRetailPrice + stock.Count = uint32(commodity.TotalCount) + stock.DispatchCount = 0 + + stockList = append(stockList, stock) + } + + //跟之前保持一致 + resp.Total = int(count) + resp.PageIndex = page + 1 + resp.PageSize = m.PageSize + resp.List = stockList + + return resp, nil +} + func ErpStockCommodityListSetAge(commodities []ErpStockCommodity) { nowTime := time.Now() for i, _ := range commodities { @@ -1139,7 +1534,7 @@ type ErpStockCommodityListReq struct { IMEI string `json:"imei"` // 串码 StoreId uint32 `json:"store_id"` // 门店编号 SupplierId uint32 `json:"supplier_id"` // 供应商id - State uint32 `json:"state"` // 库存状态:1-在库 2-已售 3-采购退货 4-调拨中 + State uint32 `json:"state"` // 库存状态:1-在库 2-已售 3-采购退货 4-调拨中 5-出库 Sn string `json:"sn"` // 首次入库订单编号 StorageType uint32 `json:"storage_type"` // 首次入库方式:1-系统入库 2-采购入库 StockTimeStart string `json:"stock_time_start"` // 最近入库开始时间 @@ -1174,7 +1569,12 @@ func (m *ErpStockCommodityListReq) GetDetailList() (*ErpStockCommodityListResp, m.PageSize = 10 } - qs := orm.Eloquent.Table("erp_stock_commodity").Order("id DESC") + if m.ErpStockId != 0 { + updateCommodityStock(m.ErpStockId) // 同步详情表的库存id + } + + // 出库数据不查询 + qs := orm.Eloquent.Table("erp_stock_commodity").Where("state != 5").Order("id DESC") // 构建查询条件 m.buildQueryConditions(qs) @@ -1269,18 +1669,18 @@ func (m *ErpStockCommodityListReq) buildQueryConditions(qs *gorm.DB) { } if m.StockTimeStart != "" { //最近入库开始时间 - startTime, err := time.Parse(DateTimeFormat, m.StockTimeStart) + startTime, err := time.Parse(QueryTimeFormat, m.StockTimeStart) if err == nil { - qs = qs.Where("first_stock_time>?", startTime) + qs = qs.Where("stock_time>?", startTime) } else { //logger.Error("stock time start parse err:", err) } } if m.StockTimeEnd != "" { //最近入库结束时间 - endTime, err := time.Parse(DateTimeFormat, m.StockTimeEnd) + endTime, err := time.Parse(QueryTimeFormat, m.StockTimeEnd) if err == nil { - qs = qs.Where("first_stock_time 0 { + // 扣减商品库存数量 + err = begin.Model(&record).Update("count", record.Count-1).Error + if err != nil { + logger.Error("扣减库存数量失败", logger.Field("err", err)) + return err + } + } + + err = begin.Commit().Error + if err != nil { + begin.Rollback() + logger.Error("出库事务失败", logger.Field("err", err)) + return err + } + return nil } diff --git a/app/admin/models/config.go b/app/admin/models/config.go index d41cd6c..284212e 100644 --- a/app/admin/models/config.go +++ b/app/admin/models/config.go @@ -19,8 +19,8 @@ type SysConfig struct { UpdateBy string `json:"updateBy" gorm:"size:128;"` BaseModel - DataScope string `json:"dataScope" gorm:"-"` - Params string `json:"params" gorm:"-"` + DataScope string `json:"dataScope" gorm:"-"` + Params string `json:"params" gorm:"-"` } func (SysConfig) TableName() string { diff --git a/app/admin/models/cooperative_business.go b/app/admin/models/cooperative_business.go index 3439e17..0fbe6b0 100644 --- a/app/admin/models/cooperative_business.go +++ b/app/admin/models/cooperative_business.go @@ -10,8 +10,9 @@ import ( "time" ) -//go:generate goqueryset -in cooperative_business.go // gen:qs +// +//go:generate goqueryset -in cooperative_business.go type CooperativeBusiness struct { Model diff --git a/app/admin/models/dept.go b/app/admin/models/dept.go index 7820ed5..51e4254 100644 --- a/app/admin/models/dept.go +++ b/app/admin/models/dept.go @@ -9,17 +9,17 @@ import ( ) type SysDept struct { - DeptId int `json:"deptId" gorm:"primary_key;auto_increment;"` //部门编码 - ParentId int `json:"parentId" gorm:""` //上级部门 - DeptPath string `json:"deptPath" gorm:"size:255;"` // - DeptName string `json:"deptName" gorm:"size:128;"` //部门名称 - Sort int `json:"sort" gorm:""` //排序 - Leader string `json:"leader" gorm:"size:128;"` //负责人 - Phone string `json:"phone" gorm:"size:11;"` //手机 - Email string `json:"email" gorm:"size:64;"` //邮箱 - Status string `json:"status" gorm:"size:4;"` //状态 - CreateBy string `json:"createBy" gorm:"size:64;"` - UpdateBy string `json:"updateBy" gorm:"size:64;"` + DeptId int `json:"deptId" gorm:"primary_key;auto_increment;"` //部门编码 + ParentId int `json:"parentId" gorm:""` //上级部门 + DeptPath string `json:"deptPath" gorm:"size:255;"` // + DeptName string `json:"deptName" gorm:"size:128;"` //部门名称 + Sort int `json:"sort" gorm:""` //排序 + Leader string `json:"leader" gorm:"size:128;"` //负责人 + Phone string `json:"phone" gorm:"size:11;"` //手机 + Email string `json:"email" gorm:"size:64;"` //邮箱 + Status string `json:"status" gorm:"size:4;"` //状态 + CreateBy string `json:"createBy" gorm:"size:64;"` + UpdateBy string `json:"updateBy" gorm:"size:64;"` BaseModel DataScope string `json:"dataScope" gorm:"-"` diff --git a/app/admin/models/dicttype.go b/app/admin/models/dicttype.go index 3b77fd0..cf3f687 100644 --- a/app/admin/models/dicttype.go +++ b/app/admin/models/dicttype.go @@ -10,17 +10,17 @@ import ( ) type DictType struct { - DictId int `gorm:"primary_key;auto_increment;" json:"dictId"` - DictName string `gorm:"size:128;" json:"dictName"` //字典名称 - DictType string `gorm:"size:128;" json:"dictType"` //字典类型 - Status string `gorm:"size:4;" json:"status"` //状态 - CreateBy string `gorm:"size:11;" json:"createBy"` //创建者 - UpdateBy string `gorm:"size:11;" json:"updateBy"` //更新者 - Remark string `gorm:"size:255;" json:"remark"` //备注 + DictId int `gorm:"primary_key;auto_increment;" json:"dictId"` + DictName string `gorm:"size:128;" json:"dictName"` //字典名称 + DictType string `gorm:"size:128;" json:"dictType"` //字典类型 + Status string `gorm:"size:4;" json:"status"` //状态 + CreateBy string `gorm:"size:11;" json:"createBy"` //创建者 + UpdateBy string `gorm:"size:11;" json:"updateBy"` //更新者 + Remark string `gorm:"size:255;" json:"remark"` //备注 BaseModel - DataScope string `gorm:"-" json:"dataScope"` // - Params string `gorm:"-" json:"params"` // + DataScope string `gorm:"-" json:"dataScope"` // + Params string `gorm:"-" json:"params"` // } func (DictType) TableName() string { diff --git a/app/admin/models/dispose_config.go b/app/admin/models/dispose_config.go index 16f90ef..96305d7 100644 --- a/app/admin/models/dispose_config.go +++ b/app/admin/models/dispose_config.go @@ -7,8 +7,9 @@ import ( orm "go-admin/common/global" ) -//go:generate goqueryset -in config.go // gen:qs +// +//go:generate goqueryset -in config.go type Config struct { Model diff --git a/app/admin/models/file.go b/app/admin/models/file.go index 368ab31..64b3fd7 100644 --- a/app/admin/models/file.go +++ b/app/admin/models/file.go @@ -346,6 +346,8 @@ func checkCommodityExcel(sheetCols [][]string) error { // (9)数量:必填项,限制≥1正整数, // 串码类商品需拆分成每个数量为1单独导入, // 非串码可大于1直接导入 * 串码类商品如数量填写>1,红框展示,下方红字提示“串码类商品数量只能为1” + +// (10)入库时间:必须早于/小于当前时间 func checkStockExcel(sheetCols [][]string) error { if len(sheetCols) != 9 { return errors.New("模版错误,请检查文件") @@ -358,6 +360,11 @@ func checkStockExcel(sheetCols [][]string) error { return errors.New("第" + strconv.Itoa(nMax+1) + "行商品名称和商品编号不能同时为空") } + // 判断是否有重复串码 + if duplicateName, nFlag := hasDuplicateIMEI(sheetCols[3]); nFlag { + return fmt.Errorf("商品串码不允许重复,请检查:[%v]", duplicateName) + } + //先遍历第1列 for i := 1; i < nLow; i++ { if sheetCols[0][i] == "" && sheetCols[1][i] == "" { // 商品名称和编号不能都为空 @@ -390,7 +397,7 @@ func checkStockExcel(sheetCols [][]string) error { } // 商品串码规则校验 当串码行数跟其他一致时正常遍历,如果小于其他行,则最后一行不遍历 todo - // 如何串码在商品库存表已经存在,则报错提示 + // 如串码在商品库存表已经存在,则报错提示 if len(sheetCols[3]) <= nLow && i+1 < nLow { if err := checkSerialCode(sheetCols[0][i], sheetCols[1][i], sheetCols[3][i], i); err != nil { return err @@ -419,7 +426,8 @@ func checkStockExcel(sheetCols [][]string) error { } // 入库时间格式校验 - if len(sheetCols[7]) < nLow && i+1 < nLow { + //if len(sheetCols[7]) < nLow && i+1 < nLow { + if i+1 <= len(sheetCols[7]) { if sheetCols[7][i] != "" { parsedTime, err := time.Parse("2006/1/2", sheetCols[7][i]) if err != nil { @@ -428,6 +436,13 @@ func checkStockExcel(sheetCols [][]string) error { // 格式化时间为指定格式 formattedTime := parsedTime.Format(DateTimeFormat) sheetCols[7][i] = formattedTime + "00-00-00" + + // 需小于当前时间 + nFlag, _ := isInputTimeBeforeOrEqualNow(formattedTime) + if !nFlag { + return errors.New("第" + strconv.Itoa(i+1) + "行入库时间不能晚于当前时间") + } + } } @@ -440,6 +455,35 @@ func checkStockExcel(sheetCols [][]string) error { return nil } +// 判断是否早于等于当前时间 +func isInputTimeBeforeOrEqualNow(inputTimeString string) (bool, error) { + // 将输入时间字符串解析为 time.Time 类型 + inputTime, _ := time.Parse(time.RFC3339, inputTimeString) + + // 获取当前时间 + currentTime := time.Now() + + // 比较时间 + isBeforeOrEqual := inputTime.After(currentTime) + + return !isBeforeOrEqual, nil +} + +// 校验串码是否相同,有则false +func hasDuplicateIMEI(sheetCols []string) (string, bool) { + nameMap := make(map[string]struct{}) + + for _, name := range sheetCols { + if _, exists := nameMap[name]; exists && name != "" { + // 有重复的名称 + return name, true + } + nameMap[name] = struct{}{} + } + // 没有重复的名称 + return "", false +} + func findMaxLength(sheetCols [][]string) int { maxLength := 0 for _, col := range sheetCols { @@ -534,7 +578,15 @@ func checkSerialCode(productName, productCode, serialCode string, row int) error return errors.New("非串码商品,无需填写串码") } - if nIMEIType != 1 && !isNumericOrAlpha(serialCode) { + //if nIMEIType == 2 && serialCode != ""{ + // return errors.New("第" + strconv.Itoa(row+1) + "行串码无需填写,该商品串码系统自动生成") + //} + + if nIMEIType == 2 { + return nil + } + + if nIMEIType != 3 && !isNumericOrAlpha(serialCode) { return errors.New("串码类商品,请填写正确的串码") } diff --git a/app/admin/models/filedir.go b/app/admin/models/filedir.go index 2d1e243..c4f13de 100644 --- a/app/admin/models/filedir.go +++ b/app/admin/models/filedir.go @@ -127,7 +127,7 @@ func (e *SysFileDir) Delete(id int) (success bool, err error) { return } -//批量删除 +// 批量删除 func (e *SysFileDir) BatchDelete(id []int) (Result bool, err error) { if err = orm.Eloquent.Table(e.TableName()).Where("id in (?)", id).Delete(&SysFileDir{}).Error; err != nil { return diff --git a/app/admin/models/kuaidi/kuaidi100_test.go b/app/admin/models/kuaidi/kuaidi100_test.go index 926c57c..181e864 100644 --- a/app/admin/models/kuaidi/kuaidi100_test.go +++ b/app/admin/models/kuaidi/kuaidi100_test.go @@ -20,5 +20,5 @@ func TestExpressInfo(t *testing.T) { //fmt.Println("paramJson:", string(paramJson)) //ExpressInfo("zhongtong","73155364431352") - ExpressInfo("emsbg","9868015085913") + ExpressInfo("emsbg", "9868015085913") } diff --git a/app/admin/models/post.go b/app/admin/models/post.go index bbfcf1c..6089193 100644 --- a/app/admin/models/post.go +++ b/app/admin/models/post.go @@ -6,14 +6,14 @@ import ( ) type Post struct { - PostId int `gorm:"primary_key;AUTO_INCREMENT" json:"postId"` //岗位编号 - PostName string `gorm:"size:128;" json:"postName"` //岗位名称 - PostCode string `gorm:"size:128;" json:"postCode"` //岗位代码 - Sort int `gorm:"" json:"sort"` //岗位排序 - Status string `gorm:"size:4;" json:"status"` //状态 - Remark string `gorm:"size:255;" json:"remark"` //描述 - CreateBy string `gorm:"size:128;" json:"createBy"` - UpdateBy string `gorm:"size:128;" json:"updateBy"` + PostId int `gorm:"primary_key;AUTO_INCREMENT" json:"postId"` //岗位编号 + PostName string `gorm:"size:128;" json:"postName"` //岗位名称 + PostCode string `gorm:"size:128;" json:"postCode"` //岗位代码 + Sort int `gorm:"" json:"sort"` //岗位排序 + Status string `gorm:"size:4;" json:"status"` //状态 + Remark string `gorm:"size:255;" json:"remark"` //描述 + CreateBy string `gorm:"size:128;" json:"createBy"` + UpdateBy string `gorm:"size:128;" json:"updateBy"` BaseModel DataScope string `gorm:"-" json:"dataScope"` diff --git a/app/admin/models/role.go b/app/admin/models/role.go index 1088c31..da60789 100644 --- a/app/admin/models/role.go +++ b/app/admin/models/role.go @@ -22,9 +22,9 @@ type SysRole struct { DataScope string `json:"dataScope" gorm:"size:128;"` BaseModel - Params string `json:"params" gorm:"-"` - MenuIds []int `json:"menuIds" gorm:"-"` - DeptIds []int `json:"deptIds" gorm:"-"` + Params string `json:"params" gorm:"-"` + MenuIds []int `json:"menuIds" gorm:"-"` + DeptIds []int `json:"deptIds" gorm:"-"` } func (SysRole) TableName() string { @@ -150,7 +150,7 @@ func (role *SysRole) GetRoleDeptId() ([]int, error) { return deptIds, nil } -//修改 +// 修改 func (role *SysRole) Update(id int) (update SysRole, err error) { if err = orm.Eloquent.Table(role.TableName()).First(&update, id).Error; err != nil { return @@ -172,7 +172,7 @@ func (role *SysRole) Update(id int) (update SysRole, err error) { return } -//批量删除 +// 批量删除 func (role *SysRole) BatchDelete(id []int) (Result bool, err error) { tx := orm.Eloquent.Begin() diff --git a/app/admin/models/roledept.go b/app/admin/models/roledept.go index dd094e1..eaf23fd 100644 --- a/app/admin/models/roledept.go +++ b/app/admin/models/roledept.go @@ -6,7 +6,7 @@ import ( orm "go-admin/common/global" ) -//sys_role_dept +// sys_role_dept type SysRoleDept struct { RoleId int `gorm:""` DeptId int `gorm:""` diff --git a/app/admin/models/syscategory.go b/app/admin/models/syscategory.go index b277bd9..ba8e013 100644 --- a/app/admin/models/syscategory.go +++ b/app/admin/models/syscategory.go @@ -112,7 +112,7 @@ func (e *SysCategory) Delete(id int) (success bool, err error) { return } -//批量删除 +// 批量删除 func (e *SysCategory) BatchDelete(id []int) (Result bool, err error) { if err = orm.Eloquent.Table(e.TableName()).Where("id in (?)", id).Delete(&SysCategory{}).Error; err != nil { return diff --git a/app/admin/models/syscontent.go b/app/admin/models/syscontent.go index cfa9302..0695b2e 100644 --- a/app/admin/models/syscontent.go +++ b/app/admin/models/syscontent.go @@ -122,7 +122,7 @@ func (e *SysContent) Delete(id int) (success bool, err error) { return } -//批量删除 +// 批量删除 func (e *SysContent) BatchDelete(id []int) (Result bool, err error) { if err = orm.Eloquent.Table(e.TableName()).Where("id in (?)", id).Delete(&SysContent{}).Error; err != nil { return diff --git a/app/admin/models/sysfileinfo.go b/app/admin/models/sysfileinfo.go index 2b1fd70..56dd024 100644 --- a/app/admin/models/sysfileinfo.go +++ b/app/admin/models/sysfileinfo.go @@ -102,7 +102,7 @@ func (e *SysFileInfo) Delete(id int) (success bool, err error) { return } -//批量删除 +// 批量删除 func (e *SysFileInfo) BatchDelete(id []int) (Result bool, err error) { if err = orm.Eloquent.Table(e.TableName()).Where("id in (?)", id).Delete(&SysFileInfo{}).Error; err != nil { return diff --git a/app/admin/models/sysjob.go b/app/admin/models/sysjob.go index 635d54b..9c77c1a 100644 --- a/app/admin/models/sysjob.go +++ b/app/admin/models/sysjob.go @@ -24,7 +24,7 @@ type SysJob struct { UpdateBy string `json:"updateBy" gorm:"size:128;"` // BaseModel - DataScope string `json:"dataScope" gorm:"-"` + DataScope string `json:"dataScope" gorm:"-"` } func (SysJob) TableName() string { @@ -107,7 +107,7 @@ func (e *SysJob) Delete(id int) (success bool, err error) { return } -//批量删除 +// 批量删除 func (e *SysJob) BatchDelete(id []int) error { return orm.Eloquent.Table(e.TableName()).Where(id).Delete(&SysJob{}).Error } diff --git a/app/admin/models/tools/utils.go b/app/admin/models/tools/utils.go index 0d16a8d..3dfb1e3 100644 --- a/app/admin/models/tools/utils.go +++ b/app/admin/models/tools/utils.go @@ -105,4 +105,3 @@ func RandomLenNum(length int) string { } return str } - diff --git a/app/admin/models/user.go b/app/admin/models/user.go index ee5c578..ab5c65c 100644 --- a/app/admin/models/user.go +++ b/app/admin/models/user.go @@ -87,6 +87,7 @@ const ( const DateTimeFormat = "2006-01-02" const TimeFormat = "2006-01-02 15-04-05" +const QueryTimeFormat = "2006-01-02T15:04:05-07:00" const ( ExportUrl = "https://dev.admin.deovo.com/load/export/" diff --git a/app/admin/service/dto/sysjob.go b/app/admin/service/dto/sysjob.go index 7ae6fd9..cbdea6d 100644 --- a/app/admin/service/dto/sysjob.go +++ b/app/admin/service/dto/sysjob.go @@ -37,7 +37,7 @@ func (m *SysJobSearch) Generate() dto.Index { } type SysJobControl struct { - JobId uint `json:"jobId"` + JobId uint `json:"jobId"` JobName string `json:"jobName" validate:"required"` // 名称 JobGroup string `json:"jobGroup"` // 任务分组 JobType int `json:"jobType"` // 任务类型 @@ -93,7 +93,7 @@ func (s *SysJobById) GenerateM() (common.ActiveRecord, error) { } type SysJobItem struct { - JobId uint `json:"jobId"` + JobId uint `json:"jobId"` JobName string `json:"jobName" validate:"required"` // 名称 JobGroup string `json:"jobGroup"` // 任务分组 JobType int `json:"jobType"` // 任务类型 diff --git a/common/database/sqlite3_driver.go b/common/database/sqlite3_driver.go index bbe5f76..f8ee875 100644 --- a/common/database/sqlite3_driver.go +++ b/common/database/sqlite3_driver.go @@ -1,3 +1,4 @@ +//go:build sqlite3 // +build sqlite3 package database diff --git a/common/models/response.go b/common/models/response.go index 2bf6f72..8ee0625 100644 --- a/common/models/response.go +++ b/common/models/response.go @@ -27,4 +27,4 @@ func (res *Response) ReturnOK() *Response { func (res *Response) ReturnError(code int) *Response { res.Code = code return res -} \ No newline at end of file +} diff --git a/docs/docs.go b/docs/docs.go index 85c0f02..9cd1ea1 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -4063,17 +4063,12 @@ const docTemplate = `{ "inventorymanage.DeliveryCargoReq": { "type": "object", "required": [ - "id", - "state" + "id" ], "properties": { "id": { "description": "商品库存列表id", "type": "integer" - }, - "state": { - "description": "库存状态:4-出库", - "type": "integer" } } }, @@ -4937,7 +4932,7 @@ const docTemplate = `{ "type": "string" }, "state": { - "description": "库存状态:1-在库 2-已售 3-采购退货 4-调拨中", + "description": "库存状态:1-在库 2-已售 3-采购退货 4-调拨中 5-出库", "type": "integer" }, "stock_time_end": { @@ -5893,6 +5888,10 @@ const docTemplate = `{ "description": "耗时", "type": "string" }, + "menuTitle": { + "description": "操作模块", + "type": "string" + }, "method": { "description": "函数", "type": "string" @@ -5946,7 +5945,7 @@ const docTemplate = `{ "type": "string" }, "title": { - "description": "操作模块", + "description": "操作模块-具体事件", "type": "string" }, "updateBy": { diff --git a/docs/swagger.json b/docs/swagger.json index 8adc65d..02b74c8 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -4052,17 +4052,12 @@ "inventorymanage.DeliveryCargoReq": { "type": "object", "required": [ - "id", - "state" + "id" ], "properties": { "id": { "description": "商品库存列表id", "type": "integer" - }, - "state": { - "description": "库存状态:4-出库", - "type": "integer" } } }, @@ -4926,7 +4921,7 @@ "type": "string" }, "state": { - "description": "库存状态:1-在库 2-已售 3-采购退货 4-调拨中", + "description": "库存状态:1-在库 2-已售 3-采购退货 4-调拨中 5-出库", "type": "integer" }, "stock_time_end": { @@ -5882,6 +5877,10 @@ "description": "耗时", "type": "string" }, + "menuTitle": { + "description": "操作模块", + "type": "string" + }, "method": { "description": "函数", "type": "string" @@ -5935,7 +5934,7 @@ "type": "string" }, "title": { - "description": "操作模块", + "description": "操作模块-具体事件", "type": "string" }, "updateBy": { diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 2bb5996..9be2ca5 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -413,12 +413,8 @@ definitions: id: description: 商品库存列表id type: integer - state: - description: 库存状态:4-出库 - type: integer required: - id - - state type: object models.BatchPrintInfo: properties: @@ -1048,7 +1044,7 @@ definitions: description: 首次入库订单编号 type: string state: - description: 库存状态:1-在库 2-已售 3-采购退货 4-调拨中 + description: 库存状态:1-在库 2-已售 3-采购退货 4-调拨中 5-出库 type: integer stock_time_end: description: 最近入库结束时间 @@ -1735,6 +1731,9 @@ definitions: latencyime: description: 耗时 type: string + menuTitle: + description: 操作模块 + type: string method: description: 函数 type: string @@ -1775,7 +1774,7 @@ definitions: description: 操作状态 type: string title: - description: 操作模块 + description: 操作模块-具体事件 type: string updateBy: description: 更新者 diff --git a/logger/logx.go b/logger/logx.go index 625c2a9..95d1a43 100644 --- a/logger/logx.go +++ b/logger/logx.go @@ -6,8 +6,6 @@ import ( "github.com/sirupsen/logrus" "go-admin/tools/config" "gopkg.in/natefinch/lumberjack.v2" - "io" - "os" "path/filepath" "time" ) @@ -51,7 +49,8 @@ func init() { defer fileLogger.Close() // 将日志同时输出到文件和控制台 - l.SetOutput(io.MultiWriter(os.Stdout, fileLogger)) + //l.SetOutput(io.MultiWriter(os.Stdout, fileLogger)) + l.SetOutput(fileLogger) } // 获取日志文件名,按照 server-2023-12-01.log 的格式 diff --git a/pkg/utils/file.go b/pkg/utils/file.go index 47c87ce..e52d842 100644 --- a/pkg/utils/file.go +++ b/pkg/utils/file.go @@ -1,7 +1,7 @@ package utils import ( - "io/ioutil" + "io" "mime/multipart" "os" "path" @@ -9,7 +9,7 @@ import ( // 获取文件大小 func GetSize(f multipart.File) (int, error) { - content, err := ioutil.ReadAll(f) + content, err := io.ReadAll(f) return len(content), err } @@ -19,7 +19,7 @@ func GetExt(fileName string) string { return path.Ext(fileName) } -//检查文件是否存在 +// 检查文件是否存在 func CheckExist(src string) bool { _, err := os.Stat(src) @@ -33,7 +33,7 @@ func CheckPermission(src string) bool { return os.IsPermission(err) } -//如果不存在则新建文件夹 +// 如果不存在则新建文件夹 func IsNotExistMkDir(src string) error { if exist := CheckExist(src); exist == false { if err := MkDir(src); err != nil { @@ -44,7 +44,7 @@ func IsNotExistMkDir(src string) error { return nil } -//新建文件夹 +// 新建文件夹 func MkDir(src string) error { err := os.MkdirAll(src, os.ModePerm) if err != nil { diff --git a/pkg/utils/utils.go b/pkg/utils/utils.go index fde5af7..5837bfe 100644 --- a/pkg/utils/utils.go +++ b/pkg/utils/utils.go @@ -76,7 +76,7 @@ func GetCurrentTimeStamp() int64 { return time.Now().UnixNano() / 1e6 } -//slice去重 +// slice去重 func RemoveRepByMap(slc []string) []string { result := []string{} tempMap := map[string]byte{} diff --git a/tools/captcha/captcha.go b/tools/captcha/captcha.go index 1ce3693..c66ab83 100644 --- a/tools/captcha/captcha.go +++ b/tools/captcha/captcha.go @@ -9,7 +9,7 @@ import ( var store = base64Captcha.DefaultMemStore -//configJsonBody json request body. +// configJsonBody json request body. type configJsonBody struct { Id string CaptchaType string diff --git a/tools/file.go b/tools/file.go index 94309ed..30a7faa 100644 --- a/tools/file.go +++ b/tools/file.go @@ -110,7 +110,7 @@ func GetFileSize(filename string) int64 { return result } -//获取当前路径,比如:E:/abc/data/test +// 获取当前路径,比如:E:/abc/data/test func GetCurrentPath() string { dir, err := os.Getwd() if err != nil { diff --git a/tools/ip.go b/tools/ip.go index c120bef..a9d4cad 100644 --- a/tools/ip.go +++ b/tools/ip.go @@ -3,14 +3,14 @@ package tools import ( "encoding/json" "fmt" - "io/ioutil" + "io" "net" "net/http" ) // 获取外网ip地址 func GetLocation(ip string) string { - if ip == "127.0.0.1" || ip == "localhost" { + if ip == "127.0.0.1" || ip == "localhost" || ip == "::1" { return "内部IP" } resp, err := http.Get("https://restapi.amap.com/v3/ip?ip=" + ip + "&key=3fabc36c20379fbb9300c79b19d5d05e") @@ -19,7 +19,7 @@ func GetLocation(ip string) string { } defer resp.Body.Close() - s, err := ioutil.ReadAll(resp.Body) + s, err := io.ReadAll(resp.Body) fmt.Printf(string(s)) m := make(map[string]string) diff --git a/tools/string.go b/tools/string.go index f0a71d4..c400b25 100644 --- a/tools/string.go +++ b/tools/string.go @@ -24,4 +24,4 @@ func StructToJsonStr(e interface{}) (string, error) { } else { return "", err } -} \ No newline at end of file +} diff --git a/tools/url.go b/tools/url.go index 3f31f1c..38391b8 100644 --- a/tools/url.go +++ b/tools/url.go @@ -6,7 +6,7 @@ import ( "github.com/gin-gonic/gin" ) -//获取URL中批量id并解析 +// 获取URL中批量id并解析 func IdsStrToIdsIntGroup(key string, c *gin.Context) []int { return IdsStrToIdsIntGroupStr(c.Param(key)) }