1.修复缺陷:
(1)零售取消销售锁定状态,审核通过库存即改为已售; (2)门店过期时间对应是过期当天的23:59:59; (3)库存调拨后更新最新入库时间; (4)库存导入、商品导入校验规则优化;
This commit is contained in:
parent
282c6bd470
commit
c17e078290
|
@ -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 // 状态为已售
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 = ?",
|
||||
|
|
|
@ -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{}{
|
||||
|
|
Loading…
Reference in New Issue
Block a user