1、优惠进销存报表:产品入库,系统入库需要看created_at,系统出库、在途库存需要看update_at;

2、优化其他出入库汇总和明细,有门店id时才查询,没有则查所有门店数据;没权限则报错;
This commit is contained in:
chenlin 2025-06-09 15:22:21 +08:00
parent e250fde3dd
commit 35a5d757ff
2 changed files with 161 additions and 49 deletions

View File

@ -2135,79 +2135,127 @@ func getSumEndCount(req *ErpDecisionReportReq) (DecisionReportData, error) {
return reportData, nil
}
// 查询库存汇总数据:采购退货数量、产品入库、系统入库、系统出库、在途库存(入库)数量
// 查询库存汇总数据:产品入库、系统入库、系统出库、在途库存(入库)数量
func getSumStockData(req *ErpDecisionReportReq, endTimeFlag bool) (DecisionReportData, error) {
var reportData DecisionReportData
qs := orm.Eloquent.Debug().Table("erp_stock_commodity")
es := orm.Eloquent.Debug().Table("erp_stock_commodity")
// 构建用于筛选storage_type的数据子查询
storageTypeQuery := qs
if req.StartTime != "" {
parse, err := time.Parse(QueryTimeFormat, req.StartTime)
if err != nil {
logger.Errorf("getStockData err:", err)
logger.Errorf("getStockData storage_type parse error: %v", err)
return DecisionReportData{}, err
}
qs = qs.Where("created_at > ?", parse)
storageTypeQuery = storageTypeQuery.Where("created_at > ?", parse)
}
if req.EndTime != "" && endTimeFlag {
parse, err := time.Parse(QueryTimeFormat, req.EndTime)
if err != nil {
logger.Errorf("getStockData err:", err)
logger.Errorf("getStockData storage_type parse error: %v", err)
return DecisionReportData{}, err
}
qs = qs.Where("created_at <= ?", parse)
storageTypeQuery = storageTypeQuery.Where("created_at <= ?", parse)
}
// 构建用于筛选state的数据子查询
stateQuery := es
if req.StartTime != "" {
parse, err := time.Parse(QueryTimeFormat, req.StartTime)
if err != nil {
logger.Errorf("getStockData state parse error: %v", err)
return DecisionReportData{}, err
}
stateQuery = stateQuery.Where("updated_at > ?", parse)
}
if req.EndTime != "" && endTimeFlag {
parse, err := time.Parse(QueryTimeFormat, req.EndTime)
if err != nil {
logger.Errorf("getStockData state parse error: %v", err)
return DecisionReportData{}, err
}
stateQuery = stateQuery.Where("updated_at <= ?", parse)
}
// 公共条件
if len(req.StoreId) > 0 {
if len(req.StoreId) == 1 {
qs = qs.Where("store_id = ?", req.StoreId[0])
storageTypeQuery = storageTypeQuery.Where("store_id = ?", req.StoreId[0])
stateQuery = stateQuery.Where("store_id = ?", req.StoreId[0])
} else {
qs = qs.Where("store_id IN (?)", req.StoreId)
storageTypeQuery = storageTypeQuery.Where("store_id IN (?)", req.StoreId)
stateQuery = stateQuery.Where("store_id IN (?)", req.StoreId)
}
}
if len(req.CommodityName) > 0 { // 商品名称
var commodityNames []string
for _, commodityName := range req.CommodityName {
commodityNames = append(commodityNames, commodityName)
}
if len(commodityNames) == 1 {
qs = qs.Where("erp_commodity_name = ?", commodityNames[0])
if len(req.CommodityName) > 0 {
if len(req.CommodityName) == 1 {
storageTypeQuery = storageTypeQuery.Where("erp_commodity_name = ?", req.CommodityName[0])
stateQuery = stateQuery.Where("erp_commodity_name = ?", req.CommodityName[0])
} else {
qs = qs.Where("erp_commodity_name IN (?)", commodityNames)
storageTypeQuery = storageTypeQuery.Where("erp_commodity_name IN (?)", req.CommodityName)
stateQuery = stateQuery.Where("erp_commodity_name IN (?)", req.CommodityName)
}
}
if len(req.CategoryID) > 0 { // 商品分类id
var categoryIDs []uint32
for _, category := range req.CategoryID {
categoryIDs = append(categoryIDs, category)
}
if len(categoryIDs) == 1 {
qs = qs.Where("erp_category_id = ?", categoryIDs[0])
if len(req.CategoryID) > 0 {
if len(req.CategoryID) == 1 {
storageTypeQuery = storageTypeQuery.Where("erp_category_id = ?", req.CategoryID[0])
stateQuery = stateQuery.Where("erp_category_id = ?", req.CategoryID[0])
} else {
qs = qs.Where("erp_category_id IN (?)", categoryIDs)
storageTypeQuery = storageTypeQuery.Where("erp_category_id IN (?)", req.CategoryID)
stateQuery = stateQuery.Where("erp_category_id IN (?)", req.CategoryID)
}
}
subQuery := qs.Select(`
SUM(CASE WHEN storage_type = ? THEN count ELSE 0 END) AS product_in,
SUM(CASE WHEN storage_type = ? THEN wholesale_price ELSE 0 END) AS product_in_amount,
// 分别查询 storage_type 相关的数据
var storageTypeData struct {
ProductIn uint32
ProductInAmount float64
SystemIn uint32
SystemInAmount float64
}
err := storageTypeQuery.Select(`
SUM(CASE WHEN storage_type = ? THEN count ELSE 0 END) AS product_in,
SUM(CASE WHEN storage_type = ? THEN wholesale_price ELSE 0 END) AS product_in_amount,
SUM(CASE WHEN storage_type = ? THEN count ELSE 0 END) AS system_in,
SUM(CASE WHEN storage_type = ? THEN wholesale_price ELSE 0 END) AS system_in_amount,
SUM(CASE WHEN state = ? THEN count ELSE 0 END) AS system_out,
SUM(CASE WHEN state = ? THEN wholesale_price ELSE 0 END) AS system_out_amount,
SUM(CASE WHEN state = ? THEN count ELSE 0 END) AS allot_wait_in,
SUM(CASE WHEN state = ? THEN wholesale_price ELSE 0 END) AS allot_wait_in_amount
`, ProductInventory, ProductInventory, SystemInventory, SystemInventory,
SystemOut, SystemOut, InAllot, InAllot)
err := subQuery.Scan(&reportData).Error
SUM(CASE WHEN storage_type = ? THEN wholesale_price ELSE 0 END) AS system_in_amount
`, ProductInventory, ProductInventory, SystemInventory, SystemInventory).Scan(&storageTypeData).Error
if err != nil {
logger.Errorf("getStockData err:", err)
logger.Errorf("getStockData storage_type query error: %v", err)
return DecisionReportData{}, err
}
// 查询 state 相关的数据
var stateData struct {
SystemOut uint32
SystemOutAmount float64
AllotWaitIn uint32
AllotWaitInAmount float64
}
err = stateQuery.Select(`
SUM(CASE WHEN state = ? THEN count ELSE 0 END) AS system_out,
SUM(CASE WHEN state = ? THEN wholesale_price ELSE 0 END) AS system_out_amount,
SUM(CASE WHEN state = ? THEN count ELSE 0 END) AS allot_wait_in,
SUM(CASE WHEN state = ? THEN wholesale_price ELSE 0 END) AS allot_wait_in_amount
`, SystemOut, SystemOut, InAllot, InAllot).Scan(&stateData).Error
if err != nil {
logger.Errorf("getStockData state query error: %v", err)
return DecisionReportData{}, err
}
// 合并结果
reportData.ProductIn = storageTypeData.ProductIn
reportData.ProductInAmount = storageTypeData.ProductInAmount
reportData.SystemIn = storageTypeData.SystemIn
reportData.SystemInAmount = storageTypeData.SystemInAmount
reportData.SystemOut = stateData.SystemOut
reportData.SystemOutAmount = stateData.SystemOutAmount
reportData.AllotWaitIn = stateData.AllotWaitIn
reportData.AllotWaitInAmount = stateData.AllotWaitInAmount
return reportData, nil
}

View File

@ -1950,7 +1950,31 @@ func (m *InventoryReportOtherDetailReq) ReportByOtherDetailList(c *gin.Context)
// 查询产品入库数据
func getProductOrderData(storeList []uint32) ([]ReportOtherDetailData, error) {
var productList []ReportOtherDetailData
err := orm.Eloquent.Debug().Table("erp_inventory_product_order").
//err := orm.Eloquent.Debug().Table("erp_inventory_product_order").
// Select("erp_inventory_product_order.serial_number, "+
// "erp_inventory_product_order.store_id, "+
// "erp_inventory_product_order.store_name, "+
// "erp_inventory_product_order.audit_time as stock_time, "+
// "CASE "+
// "WHEN erp_inventory_product_order.state = 2 THEN 1 "+
// "ELSE erp_inventory_product_order.state "+
// "END AS type, "+
// "erp_inventory_product_commodity.commodity_id, "+
// "erp_inventory_product_commodity.commodity_name, "+
// "erp_inventory_product_commodity.supplier_id, "+
// "erp_inventory_product_commodity.supplier_name, "+
// "erp_inventory_product_commodity.imei_type, "+
// "erp_inventory_product_commodity.imei, "+
// "erp_inventory_product_commodity.price as purchase_price, "+
// "erp_inventory_product_commodity.employee_price as employee_price").
// Joins("JOIN erp_inventory_product_commodity "+
// "ON erp_inventory_product_commodity.product_order_id = erp_inventory_product_order.id").
// Where("erp_inventory_product_order.state = ?", ErpInventoryProductOrderFinished).
// Where("erp_inventory_product_order.store_id in ?", storeList).
// Find(&productList).Error // 查询已审核的订单
qs := orm.Eloquent.Debug().Table("erp_inventory_product_order").
Select("erp_inventory_product_order.serial_number, "+
"erp_inventory_product_order.store_id, "+
"erp_inventory_product_order.store_name, "+
@ -1969,9 +1993,12 @@ func getProductOrderData(storeList []uint32) ([]ReportOtherDetailData, error) {
"erp_inventory_product_commodity.employee_price as employee_price").
Joins("JOIN erp_inventory_product_commodity "+
"ON erp_inventory_product_commodity.product_order_id = erp_inventory_product_order.id").
Where("erp_inventory_product_order.state = ?", ErpInventoryProductOrderFinished).
Where("erp_inventory_product_order.store_id in ?", storeList).
Find(&productList).Error // 查询已审核的订单
Where("erp_inventory_product_order.state = ?", ErpInventoryProductOrderFinished)
if len(storeList) > 0 {
qs = qs.Where("erp_inventory_product_order.store_id in ?", storeList)
}
err := qs.Find(&productList).Error // 查询已审核的订单
if err != nil {
return nil, err
}
@ -1982,7 +2009,32 @@ func getProductOrderData(storeList []uint32) ([]ReportOtherDetailData, error) {
// 查询盘点出入库数据
func getChangeOrderData(storeList []uint32) ([]ReportOtherDetailData, error) {
var changeList []ReportOtherDetailData
err := orm.Eloquent.Debug().Table("erp_inventory_change_order").
//err := orm.Eloquent.Debug().Table("erp_inventory_change_order").
// Select("erp_inventory_change_order.serial_number, "+
// "erp_inventory_change_order.store_id, "+
// "erp_inventory_change_order.store_name, "+
// "erp_inventory_change_order.audit_time as stock_time, "+
// "CASE "+
// "WHEN erp_inventory_change_order.change_type = 'add' THEN 2 "+
// "WHEN erp_inventory_change_order.change_type = 'reduce' THEN 4 "+
// "ELSE erp_inventory_change_order.state "+
// "END AS type, "+
// "erp_inventory_change_commodity.commodity_id, "+
// "erp_inventory_change_commodity.commodity_name, "+
// "erp_inventory_change_commodity.supplier_id, "+
// "erp_inventory_change_commodity.supplier_name, "+
// "erp_inventory_change_commodity.imei_type, "+
// "erp_inventory_change_commodity.imei, "+
// "erp_inventory_change_commodity.price as purchase_price, "+
// "erp_inventory_change_commodity.employee_price as employee_price").
// Joins("JOIN erp_inventory_change_commodity "+
// "ON erp_inventory_change_commodity.change_order_id = erp_inventory_change_order.id").
// Where("erp_inventory_change_order.state = ?", ErpInventoryChangeOrderFinished).
// Where("erp_inventory_change_order.store_id in ?", storeList).
// Find(&changeList).Error // 查询已审核的订单
qs := orm.Eloquent.Debug().Table("erp_inventory_change_order").
Select("erp_inventory_change_order.serial_number, "+
"erp_inventory_change_order.store_id, "+
"erp_inventory_change_order.store_name, "+
@ -2002,9 +2054,13 @@ func getChangeOrderData(storeList []uint32) ([]ReportOtherDetailData, error) {
"erp_inventory_change_commodity.employee_price as employee_price").
Joins("JOIN erp_inventory_change_commodity "+
"ON erp_inventory_change_commodity.change_order_id = erp_inventory_change_order.id").
Where("erp_inventory_change_order.state = ?", ErpInventoryChangeOrderFinished).
Where("erp_inventory_change_order.store_id in ?", storeList).
Find(&changeList).Error // 查询已审核的订单
Where("erp_inventory_change_order.state = ?", ErpInventoryChangeOrderFinished)
if len(storeList) > 0 {
qs = qs.Where("erp_inventory_change_order.store_id in ?", storeList)
}
err := qs.Find(&changeList).Error // 查询已审核的订单
if err != nil {
return nil, err
}
@ -2015,10 +2071,18 @@ func getChangeOrderData(storeList []uint32) ([]ReportOtherDetailData, error) {
// 查询系统出库数据
func getSystemOutData(storeList []uint32) ([]ReportOtherDetailData, error) {
var stockCommodities []ErpStockCommodity
err := orm.Eloquent.Table("erp_stock_commodity").
Where("state = ?", SystemOut).
Where("store_id in ?", storeList).
Find(&stockCommodities).Error
//err := orm.Eloquent.Table("erp_stock_commodity").
// Where("state = ?", SystemOut).
// Where("store_id in ?", storeList).
// Find(&stockCommodities).Error
qs := orm.Eloquent.Table("erp_stock_commodity").
Where("state = ?", SystemOut)
if len(storeList) > 0 {
qs = qs.Where("store_id in ?", storeList)
}
err := qs.Find(&stockCommodities).Error
if err != nil {
return nil, err
}