1.零售管理基础资料增加图片上传功能;
2.采购需求和采购需求提报页面增加商品图片展示列;
This commit is contained in:
parent
39589bfe0f
commit
4537477eff
|
@ -100,6 +100,7 @@ func CommodityCreate(c *gin.Context) {
|
|||
MemberDiscount: memberDiscountFloat,
|
||||
Origin: req.Origin,
|
||||
Remark: req.Remark,
|
||||
Img: req.Img,
|
||||
}
|
||||
err = commodity.SetErpCategory()
|
||||
if err != nil {
|
||||
|
@ -263,6 +264,7 @@ func CommodityEdit(c *gin.Context) {
|
|||
MemberDiscount: memberDiscountFloat,
|
||||
Origin: req.Origin,
|
||||
Remark: req.Remark,
|
||||
Img: req.Img,
|
||||
}
|
||||
commodity.ID = req.Id
|
||||
err = commodity.SetErpCategory()
|
||||
|
|
|
@ -120,6 +120,7 @@ type ErpCommodity struct {
|
|||
Origin string `json:"origin"` // 产地
|
||||
Remark string `json:"remark" gorm:"type:varchar(512)"` // 备注
|
||||
StockCount uint32 `json:"stock_count" gorm:"-"` // 库存数量
|
||||
Img string `json:"img"` // 图片
|
||||
|
||||
ErpCategory *ErpCategory `json:"erp_category" gorm:"-"`
|
||||
}
|
||||
|
@ -3145,7 +3146,8 @@ type CommodityCreateRequest struct {
|
|||
Brokerage2 float64 `json:"brokerage_2"` // 员工毛利提成
|
||||
MemberDiscount float64 `json:"member_discount"` // 会员优惠
|
||||
Origin string `json:"origin"` // 产地
|
||||
Remark string `json:"remark" gorm:"type:varchar(512)"` // 备注
|
||||
Remark string `json:"remark"` // 备注
|
||||
Img string `json:"img"` // 图片
|
||||
}
|
||||
|
||||
type CommodityEditRequest struct {
|
||||
|
@ -3164,7 +3166,8 @@ type CommodityEditRequest struct {
|
|||
Brokerage2 float64 `json:"brokerage_2"` // 员工毛利提成
|
||||
MemberDiscount float64 `json:"member_discount"` // 会员优惠
|
||||
Origin string `json:"origin"` // 产地
|
||||
Remark string `json:"remark" gorm:"type:varchar(512)"` // 备注
|
||||
Remark string `json:"remark"` // 备注
|
||||
Img string `json:"img"` // 图片
|
||||
}
|
||||
|
||||
type CommodityDetailRequest struct {
|
||||
|
|
|
@ -333,9 +333,28 @@ func (m *ErpDecisionReportReq) DecisionReportList(c *gin.Context) (*ErpDecisionR
|
|||
}
|
||||
}
|
||||
|
||||
//var sumData DecisionSumData
|
||||
for _, data := range commodityMap {
|
||||
//sumData.TotalBeginStock += data.BeginStock
|
||||
//sumData.TotalBeginAmount += data.BeginAmount
|
||||
//sumData.TotalPurchaseStock += data.PurchaseStock
|
||||
//sumData.TotalPurchaseReturn += data.PurchaseReturn
|
||||
//sumData.TotalOrderSale += data.OrderSale
|
||||
//sumData.TotalOrderReject += data.OrderReject
|
||||
//sumData.TotalAllotIn += data.AllotIn
|
||||
//sumData.TotalAllotWaitIn += data.AllotWaitIn
|
||||
//sumData.TotalAllotOut += data.AllotOut
|
||||
//sumData.TotalAllotWaitOut += data.AllotWaitOut
|
||||
//sumData.TotalProductIn += data.ProductIn
|
||||
//sumData.TotalSystemOut += data.SystemOut
|
||||
//sumData.TotalCheckIn += data.CheckIn
|
||||
//sumData.TotalCheckOut += data.CheckOut
|
||||
//sumData.TotalEndStock += data.EndStock
|
||||
//sumData.TotalEndAmount += data.EndAmount
|
||||
|
||||
reportList = append(reportList, data)
|
||||
}
|
||||
//resp.SumData = sumData
|
||||
|
||||
// 排序规则:商品编号小
|
||||
SortReportByDecisionCommodities(reportList)
|
||||
|
@ -1445,7 +1464,295 @@ func getAllotOutCount(req *ErpDecisionReportReq, stock ErpStock) (DecisionReport
|
|||
return reportData, nil
|
||||
}
|
||||
|
||||
// 查询库存汇总数据:期初库存、期初金额、采购退货数量、产品入库、系统出库、在途库存(入库)数量、期末库存、期末金额
|
||||
// 查询汇总数据:期初库存,期初金额
|
||||
func getSumStartCount(req *ErpDecisionReportReq) (DecisionReportData, error) {
|
||||
var reportData DecisionReportData
|
||||
|
||||
if req.StartTime != "" { // 有开始时间
|
||||
startTime, err := time.Parse(QueryTimeFormat, req.StartTime)
|
||||
if err != nil {
|
||||
logger.Errorf("getSystemStartCount err:", err)
|
||||
return DecisionReportData{}, err
|
||||
}
|
||||
|
||||
// 计算开始时间的前一天
|
||||
previousDay := startTime.AddDate(0, 0, -1)
|
||||
|
||||
// 获取系统入库数量
|
||||
var systemStartData DecisionReportData
|
||||
qs := orm.Eloquent.Debug().Table("erp_stock_commodity").
|
||||
Select("SUM(count) as begin_stock, SUM(wholesale_price) as begin_amount").
|
||||
Where("storage_type = ?", SystemInventory).
|
||||
Where("created_at <= ?", previousDay)
|
||||
|
||||
// 获取开始时间前一天的所有出库数量(包括销售出库、系统出库和盘点出库)
|
||||
var outStockData struct {
|
||||
SoldOut uint32 `json:"sold_out"`
|
||||
SystemOut uint32 `json:"system_out"`
|
||||
CheckOut uint32 `json:"check_out"`
|
||||
}
|
||||
es := orm.Eloquent.Debug().Table("erp_stock_commodity").
|
||||
Select("SUM(CASE WHEN state = ? THEN count ELSE 0 END) AS sold_out, "+
|
||||
"SUM(CASE WHEN state = ? THEN count ELSE 0 END) AS system_out, "+
|
||||
"SUM(CASE WHEN state = ? THEN count ELSE 0 END) AS check_out",
|
||||
SoldOut, SystemOut, CheckOut).
|
||||
Where("updated_at <= ?", previousDay).
|
||||
Where("state IN (?)", []int{SoldOut, SystemOut, CheckOut})
|
||||
|
||||
// 获取开始时间前一天的所有入库数量(包括采购入库、产品入库和盘点入库)
|
||||
var inStockData struct {
|
||||
PurchaseIn uint32 `json:"purchase_in"`
|
||||
ProductIn uint32 `json:"product_in"`
|
||||
CheckIn uint32 `json:"check_in"`
|
||||
}
|
||||
ts := orm.Eloquent.Debug().Table("erp_stock_commodity").
|
||||
Select("SUM(CASE WHEN storage_type = ? THEN count ELSE 0 END) AS purchase_in, "+
|
||||
"SUM(CASE WHEN storage_type = ? THEN count ELSE 0 END) AS product_in, "+
|
||||
"SUM(CASE WHEN storage_type = ? THEN count ELSE 0 END) AS check_in",
|
||||
PurchaseInventory, ProductInventory, CheckInventory).
|
||||
Where("created_at <= ?", previousDay)
|
||||
|
||||
if len(req.StoreId) > 0 { // 门店复选
|
||||
var storeIDs []uint32
|
||||
for _, store := range req.StoreId {
|
||||
storeIDs = append(storeIDs, store)
|
||||
}
|
||||
if len(storeIDs) == 1 {
|
||||
qs = qs.Where("store_id IN = ?", storeIDs[0])
|
||||
es = es.Where("store_id IN = ?", storeIDs[0])
|
||||
ts = ts.Where("store_id IN = ?", storeIDs[0])
|
||||
} else {
|
||||
qs = qs.Where("store_id IN (?)", storeIDs)
|
||||
es = es.Where("store_id IN (?)", storeIDs)
|
||||
ts = ts.Where("store_id IN (?)", storeIDs)
|
||||
}
|
||||
}
|
||||
|
||||
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])
|
||||
es = es.Where("erp_commodity_name = ?", commodityNames[0])
|
||||
ts = ts.Where("erp_commodity_name = ?", commodityNames[0])
|
||||
} else {
|
||||
qs = qs.Where("erp_commodity_name IN (?)", commodityNames)
|
||||
es = es.Where("erp_commodity_name IN (?)", commodityNames)
|
||||
ts = ts.Where("erp_commodity_name IN (?)", commodityNames)
|
||||
}
|
||||
}
|
||||
|
||||
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])
|
||||
es = es.Where("erp_category_id = ?", categoryIDs[0])
|
||||
ts = ts.Where("erp_category_id = ?", categoryIDs[0])
|
||||
} else {
|
||||
qs = qs.Where("erp_category_id IN (?)", categoryIDs)
|
||||
es = es.Where("erp_category_id IN (?)", categoryIDs)
|
||||
ts = ts.Where("erp_category_id IN (?)", categoryIDs)
|
||||
}
|
||||
}
|
||||
|
||||
err = qs.Find(&systemStartData).Error
|
||||
if err != nil {
|
||||
return DecisionReportData{}, err
|
||||
}
|
||||
|
||||
err = es.Find(&outStockData).Error
|
||||
if err != nil {
|
||||
return DecisionReportData{}, err
|
||||
}
|
||||
|
||||
err = ts.Find(&inStockData).Error
|
||||
if err != nil {
|
||||
return DecisionReportData{}, err
|
||||
}
|
||||
|
||||
// 计算期初库存
|
||||
beginStock := int64(systemStartData.BeginStock) - int64(outStockData.SoldOut) - int64(outStockData.SystemOut) - int64(outStockData.CheckOut) +
|
||||
int64(inStockData.PurchaseIn) + int64(inStockData.ProductIn) + int64(inStockData.CheckIn)
|
||||
|
||||
if beginStock < 0 {
|
||||
beginStock = 0 // 确保库存不会为负
|
||||
}
|
||||
reportData.BeginStock = uint32(beginStock)
|
||||
reportData.BeginAmount = systemStartData.BeginAmount
|
||||
|
||||
} else {
|
||||
// 如果没有开始时间,直接获取系统入库数量作为期初库存
|
||||
qs := orm.Eloquent.Debug().Table("erp_stock_commodity").
|
||||
Select("SUM(count) as begin_stock, SUM(wholesale_price) as begin_amount").
|
||||
Where("storage_type = ?", SystemInventory)
|
||||
|
||||
if len(req.StoreId) > 0 { // 门店复选
|
||||
var storeIDs []uint32
|
||||
for _, store := range req.StoreId {
|
||||
storeIDs = append(storeIDs, store)
|
||||
}
|
||||
if len(storeIDs) == 1 {
|
||||
qs = qs.Where("store_id IN = ?", storeIDs[0])
|
||||
} else {
|
||||
qs = qs.Where("store_id IN (?)", storeIDs)
|
||||
}
|
||||
}
|
||||
|
||||
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])
|
||||
} else {
|
||||
qs = qs.Where("erp_commodity_name IN (?)", commodityNames)
|
||||
}
|
||||
}
|
||||
|
||||
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])
|
||||
} else {
|
||||
qs = qs.Where("erp_category_id IN (?)", categoryIDs)
|
||||
}
|
||||
}
|
||||
|
||||
err := qs.Find(&reportData).Error
|
||||
if err != nil {
|
||||
return DecisionReportData{}, err
|
||||
}
|
||||
}
|
||||
|
||||
return reportData, nil
|
||||
}
|
||||
|
||||
// 查询汇总数据:期末库存,期末金额
|
||||
func getSumEndCount(req *ErpDecisionReportReq) (DecisionReportData, error) {
|
||||
var reportData DecisionReportData
|
||||
|
||||
qs := orm.Eloquent.Debug().Table("erp_stock_commodity")
|
||||
es := orm.Eloquent.Debug().Table("erp_stock_commodity")
|
||||
|
||||
if len(req.StoreId) > 0 { // 门店复选
|
||||
var storeIDs []uint32
|
||||
for _, store := range req.StoreId {
|
||||
storeIDs = append(storeIDs, store)
|
||||
}
|
||||
if len(storeIDs) == 1 {
|
||||
qs = qs.Where("store_id IN = ?", storeIDs[0])
|
||||
es = es.Where("store_id IN = ?", storeIDs[0])
|
||||
} else {
|
||||
qs = qs.Where("store_id IN (?)", storeIDs)
|
||||
es = es.Where("store_id IN (?)", storeIDs)
|
||||
}
|
||||
}
|
||||
|
||||
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])
|
||||
es = es.Where("erp_commodity_name = ?", commodityNames[0])
|
||||
} else {
|
||||
qs = qs.Where("erp_commodity_name IN (?)", commodityNames)
|
||||
es = es.Where("erp_commodity_name IN (?)", commodityNames)
|
||||
}
|
||||
}
|
||||
|
||||
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])
|
||||
es = es.Where("erp_category_id = ?", categoryIDs[0])
|
||||
} else {
|
||||
qs = qs.Where("erp_category_id IN (?)", categoryIDs)
|
||||
es = es.Where("erp_category_id IN (?)", categoryIDs)
|
||||
}
|
||||
}
|
||||
|
||||
if req.EndTime != "" { // 有结束时间
|
||||
endTime, err := time.Parse(QueryTimeFormat, req.EndTime)
|
||||
if err != nil {
|
||||
logger.Errorf("getSystemEndCount err:", err)
|
||||
return DecisionReportData{}, err
|
||||
}
|
||||
|
||||
// 获取结束时间之前的所有入库数量(包括系统入库、采购入库、产品入库和盘点入库)
|
||||
var inStockData struct {
|
||||
SystemIn uint32 `json:"system_in"`
|
||||
PurchaseIn uint32 `json:"purchase_in"`
|
||||
ProductIn uint32 `json:"product_in"`
|
||||
CheckIn uint32 `json:"check_in"`
|
||||
}
|
||||
qs = qs.Select("SUM(CASE WHEN storage_type = ? THEN count ELSE 0 END) AS system_in, "+
|
||||
"SUM(CASE WHEN storage_type = ? THEN count ELSE 0 END) AS purchase_in, "+
|
||||
"SUM(CASE WHEN storage_type = ? THEN count ELSE 0 END) AS product_in, "+
|
||||
"SUM(CASE WHEN storage_type = ? THEN count ELSE 0 END) AS check_in",
|
||||
SystemInventory, PurchaseInventory, ProductInventory, CheckInventory).
|
||||
Where("updated_at <= ?", endTime)
|
||||
|
||||
err = qs.Find(&inStockData).Error
|
||||
if err != nil {
|
||||
return DecisionReportData{}, err
|
||||
}
|
||||
|
||||
// 获取结束时间之前的所有出库数量(包括销售出库、系统出库和盘点出库)
|
||||
var outStockData struct {
|
||||
SoldOut uint32 `json:"sold_out"`
|
||||
SystemOut uint32 `json:"system_out"`
|
||||
CheckOut uint32 `json:"check_out"`
|
||||
}
|
||||
es = es.Select("SUM(CASE WHEN state = ? THEN count ELSE 0 END) AS sold_out, "+
|
||||
"SUM(CASE WHEN state = ? THEN count ELSE 0 END) AS system_out, "+
|
||||
"SUM(CASE WHEN state = ? THEN count ELSE 0 END) AS check_out",
|
||||
SoldOut, SystemOut, CheckOut).
|
||||
Where("updated_at <= ?", endTime).
|
||||
Where("state IN (?)", []int{SoldOut, SystemOut, CheckOut})
|
||||
|
||||
err = es.Find(&outStockData).Error
|
||||
if err != nil {
|
||||
return DecisionReportData{}, err
|
||||
}
|
||||
|
||||
// 计算期末库存
|
||||
endStock := int64(inStockData.SystemIn) + int64(inStockData.PurchaseIn) + int64(inStockData.ProductIn) + int64(inStockData.CheckIn) -
|
||||
int64(outStockData.SoldOut) - int64(outStockData.SystemOut) - int64(outStockData.CheckOut)
|
||||
|
||||
if endStock < 0 {
|
||||
endStock = 0 // 确保库存不会为负
|
||||
}
|
||||
reportData.EndStock = uint32(endStock)
|
||||
|
||||
} else {
|
||||
// 如果没有结束时间,直接获取系统入库数量作为期末库存
|
||||
qs = qs.Select("SUM(count) as end_stock, SUM(wholesale_price) as end_amount").
|
||||
Where("storage_type = ?", SystemInventory)
|
||||
|
||||
err := qs.Find(&reportData).Error
|
||||
if err != nil {
|
||||
return DecisionReportData{}, err
|
||||
}
|
||||
}
|
||||
|
||||
return reportData, nil
|
||||
}
|
||||
|
||||
// 查询库存汇总数据:采购退货数量、产品入库、系统出库、在途库存(入库)数量
|
||||
func getSumStockData(req *ErpDecisionReportReq) (DecisionReportData, error) {
|
||||
var reportData DecisionReportData
|
||||
qs := orm.Eloquent.Debug().Table("erp_stock_commodity")
|
||||
|
@ -1476,18 +1783,36 @@ func getSumStockData(req *ErpDecisionReportReq) (DecisionReportData, error) {
|
|||
}
|
||||
}
|
||||
|
||||
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])
|
||||
} else {
|
||||
qs = qs.Where("erp_commodity_name IN (?)", commodityNames)
|
||||
}
|
||||
}
|
||||
|
||||
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])
|
||||
} else {
|
||||
qs = qs.Where("erp_category_id IN (?)", categoryIDs)
|
||||
}
|
||||
}
|
||||
|
||||
subQuery := qs.Select(`
|
||||
SUM(CASE WHEN storage_type = ? THEN count ELSE 0 END) AS begin_stock,
|
||||
SUM(CASE WHEN storage_type = ? THEN wholesale_price ELSE 0 END) AS begin_amount,
|
||||
SUM(CASE WHEN state = ? THEN count ELSE 0 END) AS purchase_return,
|
||||
SUM(CASE WHEN storage_type = ? THEN count ELSE 0 END) AS product_in,
|
||||
SUM(CASE WHEN state = ? THEN count ELSE 0 END) AS system_out,
|
||||
SUM(CASE WHEN state = ? THEN count ELSE 0 END) AS allot_wait_in,
|
||||
SUM(CASE WHEN state IN (?) THEN count ELSE 0 END) AS end_stock,
|
||||
SUM(CASE WHEN state IN (?) THEN wholesale_price ELSE 0 END) AS end_amount
|
||||
`, SystemInventory, SystemInventory, PurchaseReturn,
|
||||
ProductInventory, SystemOut, InAllot,
|
||||
[]uint32{InStock, InAllot}, []uint32{InStock, InAllot})
|
||||
SUM(CASE WHEN state = ? THEN count ELSE 0 END) AS allot_wait_in
|
||||
`, PurchaseReturn, ProductInventory, SystemOut, InAllot)
|
||||
|
||||
err := subQuery.Scan(&reportData).Error
|
||||
if err != nil {
|
||||
|
@ -1531,6 +1856,30 @@ func getSumPurchaseData(req *ErpDecisionReportReq) (DecisionReportData, error) {
|
|||
}
|
||||
}
|
||||
|
||||
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])
|
||||
} else {
|
||||
qs = qs.Where("erp_commodity_name IN (?)", commodityNames)
|
||||
}
|
||||
}
|
||||
|
||||
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])
|
||||
} else {
|
||||
qs = qs.Where("erp_category_id IN (?)", categoryIDs)
|
||||
}
|
||||
}
|
||||
|
||||
var err error
|
||||
err = qs.Select("SUM(erp_purchase_inventory.count) AS purchase_stock").
|
||||
Joins("JOIN erp_purchase_order ON erp_purchase_order.id = erp_purchase_inventory.erp_purchase_order_id").
|
||||
|
@ -1576,6 +1925,30 @@ func getSumSalesData(req *ErpDecisionReportReq) (DecisionReportData, error) {
|
|||
}
|
||||
}
|
||||
|
||||
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])
|
||||
} else {
|
||||
qs = qs.Where("erp_commodity_name IN (?)", commodityNames)
|
||||
}
|
||||
}
|
||||
|
||||
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])
|
||||
} else {
|
||||
qs = qs.Where("erp_category_id IN (?)", categoryIDs)
|
||||
}
|
||||
}
|
||||
|
||||
subQuery := qs.Select(`
|
||||
SUM(CASE WHEN erp_order.retail_type = ? AND erp_order.state = ? AND erp_order.pay_status = ? THEN erp_order_commodity.count ELSE 0 END) AS order_sale,
|
||||
SUM(CASE WHEN erp_order.retail_type = ? AND erp_order.state = ? THEN erp_order_commodity.count ELSE 0 END) AS order_reject
|
||||
|
@ -1617,9 +1990,21 @@ func getSumInventoryData(req *ErpDecisionReportReq) (DecisionReportData, error)
|
|||
|
||||
if len(req.StoreId) > 0 {
|
||||
if len(req.StoreId) == 1 {
|
||||
qs = qs.Where("store_id = ?", req.StoreId[0])
|
||||
qs = qs.Where("erp_inventory_change_order.store_id = ?", req.StoreId[0])
|
||||
} else {
|
||||
qs = qs.Where("store_id IN (?)", req.StoreId)
|
||||
qs = qs.Where("erp_inventory_change_order.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_inventory_change_commodity.commodity_name = ?", commodityNames[0])
|
||||
} else {
|
||||
qs = qs.Where("erp_inventory_change_commodity.commodity_name IN (?)", commodityNames)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1664,6 +2049,30 @@ func getSumAllotData(req *ErpDecisionReportReq) (DecisionReportData, error) {
|
|||
qs = qs.Where("erp_inventory_allot_commodity.created_at <= ?", parse)
|
||||
}
|
||||
|
||||
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_inventory_allot_commodity.commodity_name = ?", commodityNames[0])
|
||||
} else {
|
||||
qs = qs.Where("erp_inventory_allot_commodity.commodity_name IN (?)", commodityNames)
|
||||
}
|
||||
}
|
||||
|
||||
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_inventory_allot_commodity.erp_category_id = ?", categoryIDs[0])
|
||||
} else {
|
||||
qs = qs.Where("erp_inventory_allot_commodity.erp_category_id IN (?)", categoryIDs)
|
||||
}
|
||||
}
|
||||
|
||||
// Apply store_id filter if provided
|
||||
if len(req.StoreId) > 1 {
|
||||
subQuery := qs.Select(`
|
||||
|
@ -1716,18 +2125,28 @@ func getSumAllotData(req *ErpDecisionReportReq) (DecisionReportData, error) {
|
|||
func getSumDecisionReportData(req *ErpDecisionReportReq) (DecisionSumData, error) {
|
||||
var sumData DecisionSumData
|
||||
|
||||
sumStartData, err := getSumStartCount(req)
|
||||
if err != nil {
|
||||
return DecisionSumData{}, err
|
||||
}
|
||||
sumData.TotalBeginStock = sumStartData.BeginStock
|
||||
sumData.TotalBeginAmount = sumStartData.BeginAmount
|
||||
|
||||
sumEndData, err := getSumEndCount(req)
|
||||
if err != nil {
|
||||
return DecisionSumData{}, err
|
||||
}
|
||||
sumData.TotalEndStock = sumEndData.EndStock
|
||||
sumData.TotalEndAmount = sumEndData.EndAmount
|
||||
|
||||
sumStockData, err := getSumStockData(req)
|
||||
if err != nil {
|
||||
return DecisionSumData{}, err
|
||||
}
|
||||
sumData.TotalBeginStock = sumStockData.BeginStock
|
||||
sumData.TotalBeginAmount = sumStockData.BeginAmount
|
||||
sumData.TotalPurchaseReturn = sumStockData.PurchaseReturn
|
||||
sumData.TotalAllotWaitIn = sumStockData.AllotWaitIn
|
||||
sumData.TotalProductIn = sumStockData.ProductIn
|
||||
sumData.TotalSystemOut = sumStockData.SystemOut
|
||||
sumData.TotalEndStock = sumStockData.EndStock
|
||||
sumData.TotalEndAmount = sumStockData.EndAmount
|
||||
|
||||
sumPurchaseData, err := getSumPurchaseData(req)
|
||||
if err != nil {
|
||||
|
@ -1757,6 +2176,15 @@ func getSumDecisionReportData(req *ErpDecisionReportReq) (DecisionSumData, error
|
|||
sumData.TotalAllotIn = sumAllotData.AllotIn
|
||||
sumData.TotalAllotOut = sumAllotData.AllotOut
|
||||
|
||||
// Step 4: 计算调整库存逻辑(期初+入库-出库)
|
||||
sumData.TotalEndStock = sumData.TotalBeginStock + sumData.TotalPurchaseStock + sumData.TotalAllotIn + sumData.TotalProductIn + sumData.TotalCheckIn
|
||||
if sumData.TotalEndStock < (sumData.TotalPurchaseReturn + sumData.TotalOrderSale + sumData.TotalAllotOut + sumData.TotalSystemOut + sumData.TotalCheckOut) {
|
||||
sumData.TotalEndStock = 0
|
||||
sumData.TotalEndAmount = 0
|
||||
} else {
|
||||
sumData.TotalEndStock -= sumData.TotalPurchaseReturn + sumData.TotalOrderSale + sumData.TotalAllotOut + sumData.TotalSystemOut + sumData.TotalCheckOut
|
||||
}
|
||||
|
||||
roundDecisionSumData(&sumData)
|
||||
|
||||
return sumData, nil
|
||||
|
|
|
@ -289,6 +289,7 @@ type DemandData struct {
|
|||
ErpCommodityName string `json:"erp_commodity_name"` // 商品名称
|
||||
ErpCategoryID uint32 `json:"erp_category_id"` // 商品分类id
|
||||
ErpCategoryName string `json:"erp_category_name"` // 商品分类名称
|
||||
Img string `json:"img"` // 图片
|
||||
RetailPrice float64 `json:"retail_price"` // 指导零售价
|
||||
LastWholesalePrice float64 `json:"last_wholesale_price"` // 最近采购价
|
||||
TotalCount uint32 `json:"total_count"` // 需采购总数量
|
||||
|
@ -2106,6 +2107,7 @@ func convertToDemandDataAll(commodity ErpCommodity, usedStore []uint32, stores [
|
|||
ErpCategoryName: commodity.ErpCategoryName,
|
||||
RetailPrice: commodity.RetailPrice,
|
||||
Remark: demandRemarkMap[commodity.ID].Remark,
|
||||
Img: commodity.Img,
|
||||
}
|
||||
|
||||
var demands []ErpPurchaseDemand
|
||||
|
@ -2405,6 +2407,7 @@ func convertToDemandData(commodity ErpCommodity, usedStore []uint32, stores []St
|
|||
ErpCategoryName: commodity.ErpCategoryName,
|
||||
RetailPrice: commodity.RetailPrice,
|
||||
Remark: demandRemarksMap[commodity.ID].Remark,
|
||||
Img: commodity.Img,
|
||||
}
|
||||
|
||||
var demands []ErpPurchaseDemand
|
||||
|
|
12
docs/docs.go
12
docs/docs.go
|
@ -6893,6 +6893,10 @@ const docTemplate = `{
|
|||
"description": "系统生成串码:2-是(系统生成) 3-否(手动添加)",
|
||||
"type": "integer"
|
||||
},
|
||||
"img": {
|
||||
"description": "图片",
|
||||
"type": "string"
|
||||
},
|
||||
"is_imei": {
|
||||
"description": "是否串码:1-串码类 2-非串码",
|
||||
"type": "integer"
|
||||
|
@ -6995,6 +6999,10 @@ const docTemplate = `{
|
|||
"description": "1-无串码 2-串码(系统生成) 3-串码(手动添加)",
|
||||
"type": "integer"
|
||||
},
|
||||
"img": {
|
||||
"description": "图片",
|
||||
"type": "string"
|
||||
},
|
||||
"is_imei": {
|
||||
"description": "是否串码:1-串码类 2-非串码",
|
||||
"type": "integer"
|
||||
|
@ -8063,6 +8071,10 @@ const docTemplate = `{
|
|||
"description": "1-无串码 2-串码(系统生成) 3-串码(手动添加)",
|
||||
"type": "integer"
|
||||
},
|
||||
"img": {
|
||||
"description": "图片",
|
||||
"type": "string"
|
||||
},
|
||||
"is_imei": {
|
||||
"description": "是否串码:1-串码类 2-非串码",
|
||||
"type": "integer"
|
||||
|
|
|
@ -6882,6 +6882,10 @@
|
|||
"description": "系统生成串码:2-是(系统生成) 3-否(手动添加)",
|
||||
"type": "integer"
|
||||
},
|
||||
"img": {
|
||||
"description": "图片",
|
||||
"type": "string"
|
||||
},
|
||||
"is_imei": {
|
||||
"description": "是否串码:1-串码类 2-非串码",
|
||||
"type": "integer"
|
||||
|
@ -6984,6 +6988,10 @@
|
|||
"description": "1-无串码 2-串码(系统生成) 3-串码(手动添加)",
|
||||
"type": "integer"
|
||||
},
|
||||
"img": {
|
||||
"description": "图片",
|
||||
"type": "string"
|
||||
},
|
||||
"is_imei": {
|
||||
"description": "是否串码:1-串码类 2-非串码",
|
||||
"type": "integer"
|
||||
|
@ -8052,6 +8060,10 @@
|
|||
"description": "1-无串码 2-串码(系统生成) 3-串码(手动添加)",
|
||||
"type": "integer"
|
||||
},
|
||||
"img": {
|
||||
"description": "图片",
|
||||
"type": "string"
|
||||
},
|
||||
"is_imei": {
|
||||
"description": "是否串码:1-串码类 2-非串码",
|
||||
"type": "integer"
|
||||
|
|
|
@ -510,6 +510,9 @@ definitions:
|
|||
imei_type:
|
||||
description: 系统生成串码:2-是(系统生成) 3-否(手动添加)
|
||||
type: integer
|
||||
img:
|
||||
description: 图片
|
||||
type: string
|
||||
is_imei:
|
||||
description: 是否串码:1-串码类 2-非串码
|
||||
type: integer
|
||||
|
@ -583,6 +586,9 @@ definitions:
|
|||
imei_type:
|
||||
description: 1-无串码 2-串码(系统生成) 3-串码(手动添加)
|
||||
type: integer
|
||||
img:
|
||||
description: 图片
|
||||
type: string
|
||||
is_imei:
|
||||
description: 是否串码:1-串码类 2-非串码
|
||||
type: integer
|
||||
|
@ -1369,6 +1375,9 @@ definitions:
|
|||
imei_type:
|
||||
description: 1-无串码 2-串码(系统生成) 3-串码(手动添加)
|
||||
type: integer
|
||||
img:
|
||||
description: 图片
|
||||
type: string
|
||||
is_imei:
|
||||
description: 是否串码:1-串码类 2-非串码
|
||||
type: integer
|
||||
|
|
Loading…
Reference in New Issue
Block a user