1、修改库存调拨收货时,库存列表数据重复或者加锁的问题;

This commit is contained in:
chenlin 2024-09-11 17:32:56 +08:00
parent d95814ad95
commit 2a4f28f9a8

View File

@ -786,6 +786,33 @@ func MergeCommodities(commodities []ErpInventoryAllotCommodity) []ErpInventoryAl
return mergedCommodities return mergedCommodities
} }
// MergeAllCommodities 遍历库存调拨商品信息将商品id相同的所有商品进行合并数量累加即可
func MergeAllCommodities(commodities []ErpInventoryAllotCommodity) []ErpInventoryAllotCommodity {
// 用于存储合并后的商品信息
mergedCommodities := make([]ErpInventoryAllotCommodity, 0)
// 用于记录无串码商品的合并信息
commodityMap := make(map[uint32]*ErpInventoryAllotCommodity)
for _, commodity := range commodities {
if existing, found := commodityMap[commodity.CommodityId]; found {
// 如果相同商品 ID 的无串码商品已存在,则数量累加
existing.Count += commodity.Count
commodityMap[commodity.CommodityId] = existing
} else {
// 否则,加入到 commodityMap 中
newCommodity := commodity
commodityMap[commodity.CommodityId] = &newCommodity
}
}
// 将合并后的无串码商品加入到合并后的列表中
for _, commodity := range commodityMap {
mergedCommodities = append(mergedCommodities, *commodity)
}
return mergedCommodities
}
// MergeChangeCommodities 遍历库存变动商品信息将商品id相同的非串码商品进行合并数量累加即可 // MergeChangeCommodities 遍历库存变动商品信息将商品id相同的非串码商品进行合并数量累加即可
func MergeChangeCommodities(commodities []ErpInventoryChangeCommodity) []ErpInventoryChangeCommodity { func MergeChangeCommodities(commodities []ErpInventoryChangeCommodity) []ErpInventoryChangeCommodity {
// 用于存储合并后的商品信息 // 用于存储合并后的商品信息
@ -1043,13 +1070,15 @@ func ReceiveAllotInventory(req *InventoryAllotReceiveReq, c *gin.Context) error
// 遍历库存调拨商品信息 // 遍历库存调拨商品信息
for _, v := range trimCommodities { for _, v := range trimCommodities {
var stockCommodity []ErpStockCommodity var stockCommodity []ErpStockCommodity
err := orm.Eloquent.Table("erp_stock_commodity").Where("erp_commodity_id = ? AND store_id = ? "+ err = orm.Eloquent.Table("erp_stock_commodity").Where("erp_commodity_id = ? AND store_id = ? "+
"AND state = ? AND imei = ?", v.CommodityId, inventoryAllotOrder.DeliverStoreId, InAllot, v.IMEI). "AND state = ? AND imei = ?", v.CommodityId, inventoryAllotOrder.DeliverStoreId, InAllot, v.IMEI).
Find(&stockCommodity).Error Find(&stockCommodity).Error
if err != nil { if err != nil {
begin.Rollback()
return fmt.Errorf("查询商品库存失败:[%s]", err.Error()) return fmt.Errorf("查询商品库存失败:[%s]", err.Error())
} }
if len(stockCommodity) == 0 { if len(stockCommodity) == 0 {
begin.Rollback()
return fmt.Errorf("未找到商品库存信息") return fmt.Errorf("未找到商品库存信息")
} }
@ -1059,18 +1088,37 @@ func ReceiveAllotInventory(req *InventoryAllotReceiveReq, c *gin.Context) error
stockCommodity[i].StoreName = inventoryAllotOrder.ReceiveStoreName stockCommodity[i].StoreName = inventoryAllotOrder.ReceiveStoreName
stockCommodity[i].State = InStock stockCommodity[i].State = InStock
stockCommodity[i].StockTime = time.Now() stockCommodity[i].StockTime = time.Now()
err = begin.Model(&ErpStockCommodity{}).Where("id = ?", stockCommodity[i].ID). err = begin.Where("id", stockCommodity[i].ID).Omit("created_at").Save(&stockCommodity[i]).Error
Updates(stockCommodity[i]).Error //err = begin.Model(&ErpStockCommodity{}).Where("id = ?", stockCommodity[i].ID).
// Updates(stockCommodity[i]).Error
if err != nil { if err != nil {
begin.Rollback() begin.Rollback()
return fmt.Errorf("更新商品库存失败:%s", err.Error()) return fmt.Errorf("更新商品库存失败:%s", err.Error())
} }
} }
}
// 遍历库存调拨商品信息将商品id相同的非串码商品进行合并数量累加即可
trimAllCommodities := MergeAllCommodities(trimCommodities)
for _, v := range trimAllCommodities {
var stockCommodity []ErpStockCommodity
err = orm.Eloquent.Table("erp_stock_commodity").Where("erp_commodity_id = ? AND store_id = ? "+
"AND state = ? AND imei = ?", v.CommodityId, inventoryAllotOrder.DeliverStoreId, InAllot, v.IMEI).
Find(&stockCommodity).Error
if err != nil {
begin.Rollback()
return fmt.Errorf("查询商品库存失败:[%s]", err.Error())
}
if len(stockCommodity) == 0 {
begin.Rollback()
return fmt.Errorf("未找到商品库存信息")
}
// 更新调入门店的库存数量 // 更新调入门店的库存数量
exist, err := QueryRecordExist(fmt.Sprintf("SELECT * FROM erp_stock WHERE store_id=%d AND erp_commodity_id=%d", exist, err := QueryRecordExist(fmt.Sprintf("SELECT * FROM erp_stock WHERE store_id=%d AND erp_commodity_id=%d",
inventoryAllotOrder.ReceiveStoreId, v.CommodityId)) inventoryAllotOrder.ReceiveStoreId, v.CommodityId))
if err != nil { if err != nil {
begin.Rollback()
logger.Errorf("exist err:", err) logger.Errorf("exist err:", err)
return err return err
} }
@ -1101,6 +1149,7 @@ func ReceiveAllotInventory(req *InventoryAllotReceiveReq, c *gin.Context) error
} }
err = begin.Create(stock).Error err = begin.Create(stock).Error
if err != nil { if err != nil {
begin.Rollback()
logger.Errorf("create stock err:", err) logger.Errorf("create stock err:", err)
return err return err
} }
@ -1121,6 +1170,7 @@ func ReceiveAllotInventory(req *InventoryAllotReceiveReq, c *gin.Context) error
"UPDATE erp_stock SET dispatch_count = dispatch_count-%d WHERE store_id=%d AND erp_commodity_id=%d", "UPDATE erp_stock SET dispatch_count = dispatch_count-%d WHERE store_id=%d AND erp_commodity_id=%d",
v.Count, inventoryAllotOrder.DeliverStoreId, v.CommodityId)).Error v.Count, inventoryAllotOrder.DeliverStoreId, v.CommodityId)).Error
if err != nil { if err != nil {
begin.Rollback()
logger.Errorf("update stock err:", err) logger.Errorf("update stock err:", err)
return err return err
} }