diff --git a/app/admin/apis/erpordermanage/erp_order.go b/app/admin/apis/erpordermanage/erp_order.go index 4f28aa2..f14d80c 100644 --- a/app/admin/apis/erpordermanage/erp_order.go +++ b/app/admin/apis/erpordermanage/erp_order.go @@ -159,11 +159,11 @@ func ErpOrderAudit(c *gin.Context) { } orderState := model.ErpOrderStateAudited - stockState := model.OnSale + stockState := model.SoldOut switch req.State { case 1: // 审核 orderState = model.ErpOrderStateAudited - stockState = model.OnSale // 库存-销售锁定 + stockState = model.SoldOut // 库存-已售 case 2: // 取消审核 orderState = model.ErpOrderStateUnAudit stockState = model.InStock // 库存-在库 @@ -172,7 +172,6 @@ func ErpOrderAudit(c *gin.Context) { app.OK(c, nil, "") return } - erpOrder.RetailType = model.RetailTypeSale // 订单改为销售,方便后面流程更新库存 stockState = model.SoldOut // 状态为已售 } diff --git a/app/admin/models/commodity.go b/app/admin/models/commodity.go index e00a5d2..19132c8 100644 --- a/app/admin/models/commodity.go +++ b/app/admin/models/commodity.go @@ -31,9 +31,9 @@ const ( SoldOut = 2 // 已售 PurchaseReturn = 3 // 采购退货 InAllot = 4 // 调拨中(调入门店) - OnSale = 5 // 销售锁定中 - SystemOut = 6 // 系统出库 - CheckOut = 7 // 盘点出库 + SystemOut = 5 // 系统出库 + CheckOut = 6 // 盘点出库 + OnSale = 7 // 销售锁定中 ) // ErpStock 库存列表 @@ -1389,7 +1389,8 @@ func (m *ErpStockListReq) stockIsEmptyList(c *gin.Context) (*ErpStockListResp, e } if m.StoreId != 0 { // 传门店id - qs = qs.Select("erp_commodity.*, COALESCE(erp_stock.count, 0) AS total_count"). + qs = qs.Select("erp_commodity.*, COALESCE(erp_stock.count, 0) AS total_count,"+ + "COALESCE(SUM(erp_stock.dispatch_count), 0) AS total_dispatch_count"). Joins("LEFT JOIN erp_stock ON erp_commodity.id = erp_stock.erp_commodity_id AND erp_stock.store_id = ?", m.StoreId). //Joins("LEFT JOIN erp_stock ON erp_commodity.id = erp_stock.erp_commodity_id"). Joins("LEFT JOIN erp_category c ON erp_commodity.erp_category_id = c.id"). @@ -1397,7 +1398,8 @@ func (m *ErpStockListReq) stockIsEmptyList(c *gin.Context) (*ErpStockListResp, e 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)") - es = es.Select("erp_commodity.*, COALESCE(erp_stock.count, 0) AS total_count"). + es = es.Select("erp_commodity.*, COALESCE(erp_stock.count, 0) AS total_count, "+ + "COALESCE(SUM(erp_stock.dispatch_count), 0) AS total_dispatch_count"). Joins("LEFT JOIN erp_stock ON erp_commodity.id = erp_stock.erp_commodity_id AND erp_stock.store_id = ?", m.StoreId). //Joins("LEFT JOIN erp_stock ON erp_commodity.id = erp_stock.erp_commodity_id"). Joins("LEFT JOIN erp_category c ON erp_commodity.erp_category_id = c.id"). @@ -1407,7 +1409,8 @@ func (m *ErpStockListReq) stockIsEmptyList(c *gin.Context) (*ErpStockListResp, e "CAST(c.pid AS SIGNED), CAST(SUBSTRING(erp_commodity.serial_number, -4) AS SIGNED)") } else { // 没传门店id,则子查询先求库存表中erp_commodity_id相同的count之和 if len(storeList) == 0 { - qs = qs.Select("erp_commodity.*, COALESCE(erp_stock.count, 0) AS total_count"). + qs = qs.Select("erp_commodity.*, COALESCE(erp_stock.count, 0) AS total_count, " + + "COALESCE(SUM(erp_stock.dispatch_count), 0) AS total_dispatch_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"). @@ -1415,7 +1418,8 @@ func (m *ErpStockListReq) stockIsEmptyList(c *gin.Context) (*ErpStockListResp, e 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)") - es = es.Select("erp_commodity.*, COALESCE(erp_stock.count, 0) AS total_count"). + es = es.Select("erp_commodity.*, COALESCE(erp_stock.count, 0) AS total_count, " + + "COALESCE(SUM(erp_stock.dispatch_count), 0) AS total_dispatch_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"). @@ -1424,7 +1428,8 @@ func (m *ErpStockListReq) stockIsEmptyList(c *gin.Context) (*ErpStockListResp, e "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 { - qs = qs.Select("erp_commodity.*, COALESCE(erp_stock.count, 0) AS total_count"). + qs = qs.Select("erp_commodity.*, COALESCE(erp_stock.count, 0) AS total_count, "+ + "COALESCE(SUM(erp_stock.dispatch_count), 0) AS total_dispatch_count"). Joins("LEFT JOIN (SELECT erp_commodity_id, SUM(count) AS count FROM erp_stock WHERE store_id IN (?) GROUP BY erp_commodity_id) "+ "erp_stock ON erp_commodity.id = erp_stock.erp_commodity_id", storeList). Joins("JOIN erp_category c ON erp_commodity.erp_category_id = c.id"). @@ -1432,7 +1437,8 @@ func (m *ErpStockListReq) stockIsEmptyList(c *gin.Context) (*ErpStockListResp, e 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)") - es = es.Select("erp_commodity.*, COALESCE(erp_stock.count, 0) AS total_count"). + es = es.Select("erp_commodity.*, COALESCE(erp_stock.count, 0) AS total_count, "+ + "COALESCE(SUM(erp_stock.dispatch_count), 0) AS total_dispatch_count"). Joins("LEFT JOIN (SELECT erp_commodity_id, SUM(count) AS count FROM erp_stock WHERE store_id IN (?) GROUP BY erp_commodity_id) "+ "erp_stock ON erp_commodity.id = erp_stock.erp_commodity_id", storeList). Joins("JOIN erp_category c ON erp_commodity.erp_category_id = c.id"). @@ -1466,7 +1472,8 @@ func (m *ErpStockListReq) stockIsEmptyList(c *gin.Context) (*ErpStockListResp, e var commodities []struct { ErpCommodity - TotalCount int + TotalCount int + TotalDispatchCount int } //err = qs.Offset(page * m.PageSize).Limit(m.PageSize).Find(&commodities).Error err = qs.Find(&commodities).Error @@ -1574,7 +1581,8 @@ func (m *ErpStockListReq) stockNoEmptyList(c *gin.Context) (*ErpStockListResp, e } 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"). + qs = qs.Select("erp_commodity.*, COALESCE(SUM(erp_stock.count), 0) AS total_count, " + + "COALESCE(SUM(erp_stock.dispatch_count), 0) AS total_dispatch_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) " + @@ -1582,7 +1590,8 @@ func (m *ErpStockListReq) stockNoEmptyList(c *gin.Context) (*ErpStockListResp, e "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)") - es = es.Select("erp_commodity.*, COALESCE(SUM(erp_stock.count), 0) AS total_count, erp_stock.id AS erp_stock_id"). + es = es.Select("erp_commodity.*, COALESCE(SUM(erp_stock.count), 0) AS total_count, " + + "COALESCE(SUM(erp_stock.dispatch_count), 0) AS total_dispatch_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) " + @@ -1591,7 +1600,8 @@ func (m *ErpStockListReq) stockNoEmptyList(c *gin.Context) (*ErpStockListResp, e "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"). + qs = qs.Select("erp_commodity.*, COALESCE(SUM(erp_stock.count), 0) AS total_count, "+ + "COALESCE(SUM(erp_stock.dispatch_count), 0) AS total_dispatch_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"). @@ -1600,7 +1610,8 @@ func (m *ErpStockListReq) stockNoEmptyList(c *gin.Context) (*ErpStockListResp, e "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") - es = es.Select("erp_commodity.*, COALESCE(SUM(erp_stock.count), 0) AS total_count, erp_stock.id AS erp_stock_id"). + es = es.Select("erp_commodity.*, COALESCE(SUM(erp_stock.count), 0) AS total_count, "+ + "COALESCE(SUM(erp_stock.dispatch_count), 0) AS total_dispatch_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"). @@ -1626,8 +1637,9 @@ func (m *ErpStockListReq) stockNoEmptyList(c *gin.Context) (*ErpStockListResp, e var commodities []struct { ErpCommodity - TotalCount int - ErpStockId int + TotalCount int + ErpStockId int + TotalDispatchCount int } var count int64 @@ -1659,7 +1671,7 @@ func (m *ErpStockListReq) stockNoEmptyList(c *gin.Context) (*ErpStockListResp, e stock.RetailPrice = commodity.RetailPrice stock.MinRetailPrice = commodity.MinRetailPrice stock.Count = uint32(commodity.TotalCount) - stock.DispatchCount = 0 + stock.DispatchCount = uint32(commodity.TotalDispatchCount) stockList = append(stockList, stock) } @@ -1760,7 +1772,8 @@ func (m *ErpStockListReq) allCommodityList(c *gin.Context) (*ErpStockListResp, e } 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"). + qs = qs.Select("erp_commodity.*, COALESCE(SUM(erp_stock.count), 0) AS total_count, " + + "COALESCE(SUM(erp_stock.dispatch_count), 0) AS total_dispatch_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) " + @@ -1768,7 +1781,8 @@ func (m *ErpStockListReq) allCommodityList(c *gin.Context) (*ErpStockListResp, e "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)") - es = es.Select("erp_commodity.*, COALESCE(SUM(erp_stock.count), 0) AS total_count, erp_stock.id AS erp_stock_id"). + es = es.Select("erp_commodity.*, COALESCE(SUM(erp_stock.count), 0) AS total_count, " + + "COALESCE(SUM(erp_stock.dispatch_count), 0) AS total_dispatch_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) " + @@ -1777,7 +1791,8 @@ func (m *ErpStockListReq) allCommodityList(c *gin.Context) (*ErpStockListResp, e "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"). + qs = qs.Select("erp_commodity.*, COALESCE(SUM(erp_stock.count), 0) AS total_count, "+ + "COALESCE(SUM(erp_stock.dispatch_count), 0) AS total_dispatch_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"). @@ -1786,7 +1801,8 @@ func (m *ErpStockListReq) allCommodityList(c *gin.Context) (*ErpStockListResp, e "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") - es = es.Select("erp_commodity.*, COALESCE(SUM(erp_stock.count), 0) AS total_count, erp_stock.id AS erp_stock_id"). + es = es.Select("erp_commodity.*, COALESCE(SUM(erp_stock.count), 0) AS total_count, "+ + "COALESCE(SUM(erp_stock.dispatch_count), 0) AS total_dispatch_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"). @@ -1799,8 +1815,9 @@ func (m *ErpStockListReq) allCommodityList(c *gin.Context) (*ErpStockListResp, e var commodities []struct { ErpCommodity - TotalCount int - ErpStockId int + TotalCount int + ErpStockId int + TotalDispatchCount int } var count int64 @@ -1830,7 +1847,7 @@ func (m *ErpStockListReq) allCommodityList(c *gin.Context) (*ErpStockListResp, e stock.RetailPrice = commodity.RetailPrice stock.MinRetailPrice = commodity.MinRetailPrice stock.Count = uint32(commodity.TotalCount) - stock.DispatchCount = 0 + stock.DispatchCount = uint32(commodity.TotalDispatchCount) stockList = append(stockList, stock) } @@ -2060,9 +2077,9 @@ func contains(s []int, e int) bool { func (m *ErpStockCommodityListReq) buildQueryConditions(qs *gorm.DB) { if m.ScanCode != "" { qs = qs.Where("erp_barcode = ? or imei = ?", m.ScanCode, m.ScanCode) - qs = qs.Where("state = ?", 1) + qs = qs.Where("state = ?", InStock) } else { - qs = qs.Where("state != 5") + qs = qs.Where("state in (?)", []uint32{InStock, InAllot}) if m.ErpStockId != 0 { //库存id qs = qs.Where("erp_stock_id=?", m.ErpStockId) } @@ -2171,7 +2188,7 @@ func SetStockCommodityState(id uint32) error { //更新库存状态为5,并同 return err } - // 更新商品库存详情表状态为6:系统出库 + // 更新商品库存详情表状态为:系统出库 if err := begin.Model(&ErpStockCommodity{}).Where("id=?", id).Updates(map[string]interface{}{ "state": SystemOut}).Error; err != nil { return fmt.Errorf("[update err]:%v", err) diff --git a/app/admin/models/erp_order.go b/app/admin/models/erp_order.go index 735fec4..0a343ee 100644 --- a/app/admin/models/erp_order.go +++ b/app/admin/models/erp_order.go @@ -456,6 +456,7 @@ func GetValidStoreIDs(storeData string) []uint32 { if err != nil { continue } + expireTime = expireTime.Add(24*time.Hour - time.Second) // 如果过期时间在当前时间之后,则未过期,将门店ID添加到列表中 if expireTime.After(time.Now()) { validStoreIDs = append(validStoreIDs, uint32(store.StoreID)) @@ -827,7 +828,7 @@ func UpdateStock(gdb *gorm.DB, erpOrder ErpOrder, state, auditState int) error { } err = gdb.Table("erp_stock_commodity").Where("imei = ?", commodities[i].IMEI). - Update("state", state).Error // 状态更新为销售锁定中 + Update("state", state).Error // 状态更新为已销售;反审核则更新为在库 if err != nil { logger.Error("commodities err:", logger.Field("err", err)) return err @@ -868,7 +869,7 @@ func UpdateStock(gdb *gorm.DB, erpOrder ErpOrder, state, auditState int) error { // 优先出库库存时间最长的数据 err = gdb.Table("erp_stock_commodity").Where("id = ?", rightId). - Update("state", state).Error // 状态更新为销售锁定中 + Update("state", state).Error // 状态更新为销售锁定中;反审核则更新为在库 if err != nil { logger.Error("commodities err:", logger.Field("err", err)) return err @@ -989,6 +990,8 @@ func UpdateStock(gdb *gorm.DB, erpOrder ErpOrder, state, auditState int) error { describe = "零售退货扣除积分" event = VmEventErpOrderReject vmCount = 0 - tools.RoundFloat64(erpOrder.TotalAmount) + } else { + return nil } err = UserVmUpdate(gdb, uint32(erpOrder.Uid), vmCount, event, describe) @@ -1846,10 +1849,10 @@ func QueryStoreManageData(req *ErpOrderStoreManageDataReq, c *gin.Context) (*Erp //startTime, _ := time.Parse("2006-01-02", req.StartTime) //endTime, _ := time.Parse("2006-01-02", req.EndTime) qs = qs.Where("maker_time BETWEEN ? AND ?", startTime, endTime) + } else { + qs = qs.Where("maker_time IS NOT NULL") } - qs = qs.Where("maker_time IS NOT NULL") - // 查询数据 if req.SortType == "asc" { err = qs.Select("DATE_FORMAT(maker_time, '%Y-%m-%d') AS date, SUM(total_amount) AS total_sales_amount, " + @@ -1928,22 +1931,6 @@ func constructFinalStoreManageDataList(storeManageDataList []StoreManageData, re return storeManageDataList } - //for d := startDate; d.Before(endDate) || d.Equal(endDate); d = d.AddDate(0, 0, 1) { - // dateStr := d.Format("2006-01-02") - // data, found := storeDataMap[dateStr] - // if !found { - // data = StoreManageData{ - // Date: dateStr, - // TotalSalesAmount: 0, - // PromotionFee: 0, - // SalesProfit: 0, - // StaffProfit: 0, - // Count: 0, - // } - // } - // finalStoreManageDataList = append(finalStoreManageDataList, data) - //} - for d := endDate; d.After(startDate) || d.Equal(startDate); d = d.AddDate(0, 0, -1) { dateStr := d.Format("2006-01-02") data, found := storeDataMap[dateStr] @@ -1960,6 +1947,18 @@ func constructFinalStoreManageDataList(storeManageDataList []StoreManageData, re finalStoreManageDataList = append(finalStoreManageDataList, data) } + sortType := strings.ToLower(req.SortType) + switch sortType { + case "asc": + sort.Slice(finalStoreManageDataList, func(i, j int) bool { + return finalStoreManageDataList[i].Date < finalStoreManageDataList[j].Date + }) + case "desc": + sort.Slice(finalStoreManageDataList, func(i, j int) bool { + return finalStoreManageDataList[i].Date > finalStoreManageDataList[j].Date + }) + } + return finalStoreManageDataList } @@ -3568,6 +3567,7 @@ func CheckUserStore(userStoreId uint32, sysUser *SysUser) bool { if err != nil { return false } + expireTime = expireTime.Add(24*time.Hour - time.Second) // 如果过期时间在当前时间之后,则未过期 if expireTime.After(time.Now()) { return true diff --git a/app/admin/models/file.go b/app/admin/models/file.go index a469afe..741610b 100644 --- a/app/admin/models/file.go +++ b/app/admin/models/file.go @@ -17,6 +17,7 @@ import ( "strings" "time" "unicode" + "unicode/utf8" ) type CategoryExcel struct { @@ -716,7 +717,7 @@ func checkSerialCode(productName, productCode, serialCode string, row int) error // return errors.New("第" + strconv.Itoa(row+1) + "行串码无需填写,该商品串码系统自动生成") //} - if (nIMEIType == 2 || nIMEIType == 1) && serialCode == "" { + if (nIMEIType == 2 || nIMEIType == 3) && serialCode == "" { return errors.New("第" + strconv.Itoa(row+1) + "行是串码类商品,请填写正确地串码") } @@ -724,25 +725,42 @@ func checkSerialCode(productName, productCode, serialCode string, row int) error return errors.New("串码类商品,请填写正确的串码") } - result = orm.Eloquent.Where("imei = ?", serialCode).First(&existingStockCommodity) - if result.Error != nil { - if errors.Is(result.Error, gorm.ErrRecordNotFound) { //没找到对应串码 - return nil + if nIMEIType != NoIMEICommodity { // 串码商品才进行判断 + result = orm.Eloquent.Where("imei = ?", serialCode).First(&existingStockCommodity) + if result.Error != nil { + if errors.Is(result.Error, gorm.ErrRecordNotFound) { //没找到对应串码 + return nil + } + fmt.Println("Error:", result.Error) + return result.Error } - fmt.Println("Error:", result.Error) - return result.Error + + return errors.New("第" + strconv.Itoa(row+1) + "行串码重复,请勿重复导入") } - return errors.New("第" + strconv.Itoa(row+1) + "行串码重复,请勿重复导入") + return nil } +//func isNumericOrAlpha(s string) bool { +// for _, char := range s { +// if !unicode.IsDigit(char) && !unicode.IsLetter(char) { +// return false +// } +// } +// return true +//} + func isNumericOrAlpha(s string) bool { + if utf8.RuneCountInString(s) > 100 { + return false // 字符串超过100字符,返回 false + } + for _, char := range s { - if !unicode.IsDigit(char) && !unicode.IsLetter(char) { - return false + if unicode.Is(unicode.Scripts["Han"], char) { + return false // 包含中文,返回 false } } - return true + return true // 不包含中文且长度满足条件,返回 true } // 将读取的excel数据转换成CategoryExcel struct @@ -883,6 +901,13 @@ func hasDuplicateInDb(data []CategoryExcel) (string, bool) { if exists := isCategoryExists(item.ThreeCategory); exists { return item.ThreeCategory, true } + + // 如果二级分类遍历后名称重复,则需判断其一级分类是否相同,如何相同则可以重复;否则不能重复 + if isSecondCategoryExists(item.SecondCategory) { + if !isFirstCategoryExists(item.FirstCategory) { + return item.SecondCategory, true + } + } } } @@ -899,11 +924,31 @@ func isFirstCategoryDuplicate(categoryName string) bool { return count > 0 } +// 查询一级分类名称是否重复 +func isFirstCategoryExists(categoryName string) bool { + var count int64 + orm.Eloquent.Debug().Model(&Category{}). + Where("name = ? and pid = ?", categoryName, 0). + Count(&count) + + return count > 0 +} + // 查询二级分类跟一,三级是否重复 func isSecondCategoryDuplicate(categoryName string) bool { var count int64 orm.Eloquent.Debug().Model(&Category{}). - Where("name = ? and len(number) != ?", categoryName, 6). + Where("name = ? and LENGTH(number) != ?", categoryName, 6). + Count(&count) + + return count > 0 +} + +// 查询二级分类是否重复 +func isSecondCategoryExists(categoryName string) bool { + var count int64 + orm.Eloquent.Debug().Model(&Category{}). + Where("name = ? and LENGTH(number) = ?", categoryName, 6). Count(&count) return count > 0 @@ -927,7 +972,7 @@ func ImportCommodityData(colsMap []map[string]interface{}, businessId uint32) er } var erpCommodities []ErpCommodity - erpCommodities, err = convertToErpCommodities(data) + erpCommodities, err = convertToErpCommodities(data, businessId) if err != nil { return err } @@ -992,7 +1037,7 @@ func transStockData(colsMap []map[string]interface{}) ([]StockExcel, error) { return stockInfos, nil } -func convertToErpCommodities(data []CommodityExcel) ([]ErpCommodity, error) { +func convertToErpCommodities(data []CommodityExcel, businessId uint32) ([]ErpCommodity, error) { var erpCommodities []ErpCommodity productCounter := tools.NewProductCounter() @@ -1002,7 +1047,7 @@ func convertToErpCommodities(data []CommodityExcel) ([]ErpCommodity, error) { return nil, err } - list, err := GetSupplier(GetSupplierRequest{Name: item.SupplierName}) + list, err := GetSupplier(GetSupplierRequest{Name: item.SupplierName, CooperativeBusinessId: businessId}) if len(list) == 0 || errors.Is(err, gorm.ErrRecordNotFound) { return nil, fmt.Errorf("[%v]该供应商不存在,请新建供应商", item.SupplierName) } diff --git a/app/admin/models/inventory_allot.go b/app/admin/models/inventory_allot.go index 28b0ca3..a23004f 100644 --- a/app/admin/models/inventory_allot.go +++ b/app/admin/models/inventory_allot.go @@ -882,6 +882,7 @@ func ReceiveAllotInventory(req *InventoryAllotReceiveReq) error { // 更新库存商品表商品状态为:在库 for i := 0; i < int(v.Count); i++ { stockCommodity[i].State = InStock + stockCommodity[i].StockTime = time.Now() err = begin.Model(&ErpStockCommodity{}).Where("id = ?", stockCommodity[i].ID). Updates(stockCommodity[i]).Error if err != nil { diff --git a/app/admin/models/inventory_change.go b/app/admin/models/inventory_change.go index 74302da..2bd6931 100644 --- a/app/admin/models/inventory_change.go +++ b/app/admin/models/inventory_change.go @@ -726,9 +726,10 @@ func handleInventoryReduce(gdb *gorm.DB, changeOrder ErpInventoryChangeOrder) er } if stockCommodityInfo.State == SoldOut { return fmt.Errorf("商品[%s]已经销售", stockCommodityInfo.ErpCommodityName) - } else if stockCommodityInfo.State == OnSale { - return fmt.Errorf("商品[%s]在销售锁定中", stockCommodityInfo.ErpCommodityName) } + //else if stockCommodityInfo.State == OnSale { + // return fmt.Errorf("商品[%s]在销售锁定中", stockCommodityInfo.ErpCommodityName) + //} // 更新库存商品状态为:盘点出库 err = gdb.Table("erp_stock_commodity").Where("imei = ?", commodities[i].IMEI). @@ -840,9 +841,10 @@ func handleCancelInventoryAdd(gdb *gorm.DB, changeOrder ErpInventoryChangeOrder) } if stockCommodityInfo.State == SoldOut { return fmt.Errorf("商品[%s]已经销售", stockCommodityInfo.ErpCommodityName) - } else if stockCommodityInfo.State == OnSale { - return fmt.Errorf("商品[%s]在销售锁定中", stockCommodityInfo.ErpCommodityName) } + //else if stockCommodityInfo.State == OnSale { + // return fmt.Errorf("商品[%s]在销售锁定中", stockCommodityInfo.ErpCommodityName) + //} // 更新库存数量:库存数量-1 err = gdb.Table("erp_stock").Where("store_id = ? and erp_commodity_id = ?", @@ -920,9 +922,10 @@ func handleCancelInventoryReduce(gdb *gorm.DB, changeOrder ErpInventoryChangeOrd } if stockCommodityInfo.State == SoldOut { return fmt.Errorf("商品[%s]已经销售", stockCommodityInfo.ErpCommodityName) - } else if stockCommodityInfo.State == OnSale { - return fmt.Errorf("商品[%s]在销售锁定中", stockCommodityInfo.ErpCommodityName) } + //else if stockCommodityInfo.State == OnSale { + // return fmt.Errorf("商品[%s]在销售锁定中", stockCommodityInfo.ErpCommodityName) + //} // 更新库存商品状态:在库 err = gdb.Table("erp_stock_commodity").Where("imei = ?", commodities[i].IMEI). @@ -945,7 +948,7 @@ func handleCancelInventoryReduce(gdb *gorm.DB, changeOrder ErpInventoryChangeOrd var stockCommodity []ErpStockCommodity // 非串码商品可能不止1个,更新库存商品状态 for j := 0; j < int(commodities[i].Count); j++ { - // 通过门店id,商品id,查找状态为7-盘点出库的非串码商品 + // 通过门店id,商品id,查找状态为盘点出库的非串码商品 err = orm.Eloquent.Table("erp_stock_commodity").Where("erp_commodity_id = ? and "+ "store_id = ? and state = ? and imei_type = ?", commodities[i].CommodityId, changeOrder.StoreId, CheckOut, NoIMEICommodity).Order("first_stock_time DESC").Find(&stockCommodity).Error diff --git a/app/admin/models/inventory_product.go b/app/admin/models/inventory_product.go index 8c0a014..609e0ed 100644 --- a/app/admin/models/inventory_product.go +++ b/app/admin/models/inventory_product.go @@ -528,9 +528,10 @@ func cancelProductAuditAndUpdateStock(gdb *gorm.DB, productOrder ErpInventoryPro } if stockCommodityInfo.State == SoldOut { return fmt.Errorf("商品[%s]已经销售,不能退货", stockCommodityInfo.ErpCommodityName) - } else if stockCommodityInfo.State == OnSale { - return fmt.Errorf("商品[%s]在销售锁定中,不能退货", stockCommodityInfo.ErpCommodityName) } + //else if stockCommodityInfo.State == OnSale { + // return fmt.Errorf("商品[%s]在销售锁定中,不能退货", stockCommodityInfo.ErpCommodityName) + //} // 更新库存数量 err = gdb.Table("erp_stock").Where("store_id = ? and erp_commodity_id = ?", diff --git a/app/admin/models/purchase.go b/app/admin/models/purchase.go index 4827de3..44d567a 100644 --- a/app/admin/models/purchase.go +++ b/app/admin/models/purchase.go @@ -1321,9 +1321,10 @@ func InventoryErpPurchaseUpdateRejectStock(gdb *gorm.DB, list []ErpPurchaseInven } if stockCommodityInfo.State == SoldOut { return fmt.Errorf("商品[%s]已经销售,不能退货", stockCommodityInfo.ErpCommodityName) - } else if stockCommodityInfo.State == OnSale { - return fmt.Errorf("商品[%s]在销售锁定中,不能退货", stockCommodityInfo.ErpCommodityName) } + //else if stockCommodityInfo.State == OnSale { + // return fmt.Errorf("商品[%s]在销售锁定中,不能退货", stockCommodityInfo.ErpCommodityName) + //} err = gdb.Table("erp_stock_commodity").Where("imei = ?", list[i].IMEI). Updates(&map[string]interface{}{