1.修复缺陷:

(1)零售取消销售锁定状态,审核通过库存即改为已售;
(2)门店过期时间对应是过期当天的23:59:59;
(3)库存调拨后更新最新入库时间;
(4)库存导入、商品导入校验规则优化;
This commit is contained in:
chenlin 2024-04-29 18:10:48 +08:00
parent 282c6bd470
commit c17e078290
8 changed files with 143 additions and 76 deletions

View File

@ -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 // 状态为已售
}

View File

@ -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)

View File

@ -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

View File

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

View File

@ -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 {

View File

@ -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

View File

@ -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 = ?",

View File

@ -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{}{