1.零售管理基础资料增加图片上传功能;
2.采购需求和采购需求提报页面增加商品图片展示列;
This commit is contained in:
parent
39589bfe0f
commit
4537477eff
|
@ -100,6 +100,7 @@ func CommodityCreate(c *gin.Context) {
|
||||||
MemberDiscount: memberDiscountFloat,
|
MemberDiscount: memberDiscountFloat,
|
||||||
Origin: req.Origin,
|
Origin: req.Origin,
|
||||||
Remark: req.Remark,
|
Remark: req.Remark,
|
||||||
|
Img: req.Img,
|
||||||
}
|
}
|
||||||
err = commodity.SetErpCategory()
|
err = commodity.SetErpCategory()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -263,6 +264,7 @@ func CommodityEdit(c *gin.Context) {
|
||||||
MemberDiscount: memberDiscountFloat,
|
MemberDiscount: memberDiscountFloat,
|
||||||
Origin: req.Origin,
|
Origin: req.Origin,
|
||||||
Remark: req.Remark,
|
Remark: req.Remark,
|
||||||
|
Img: req.Img,
|
||||||
}
|
}
|
||||||
commodity.ID = req.Id
|
commodity.ID = req.Id
|
||||||
err = commodity.SetErpCategory()
|
err = commodity.SetErpCategory()
|
||||||
|
|
|
@ -120,6 +120,7 @@ type ErpCommodity struct {
|
||||||
Origin string `json:"origin"` // 产地
|
Origin string `json:"origin"` // 产地
|
||||||
Remark string `json:"remark" gorm:"type:varchar(512)"` // 备注
|
Remark string `json:"remark" gorm:"type:varchar(512)"` // 备注
|
||||||
StockCount uint32 `json:"stock_count" gorm:"-"` // 库存数量
|
StockCount uint32 `json:"stock_count" gorm:"-"` // 库存数量
|
||||||
|
Img string `json:"img"` // 图片
|
||||||
|
|
||||||
ErpCategory *ErpCategory `json:"erp_category" gorm:"-"`
|
ErpCategory *ErpCategory `json:"erp_category" gorm:"-"`
|
||||||
}
|
}
|
||||||
|
@ -3145,7 +3146,8 @@ type CommodityCreateRequest struct {
|
||||||
Brokerage2 float64 `json:"brokerage_2"` // 员工毛利提成
|
Brokerage2 float64 `json:"brokerage_2"` // 员工毛利提成
|
||||||
MemberDiscount float64 `json:"member_discount"` // 会员优惠
|
MemberDiscount float64 `json:"member_discount"` // 会员优惠
|
||||||
Origin string `json:"origin"` // 产地
|
Origin string `json:"origin"` // 产地
|
||||||
Remark string `json:"remark" gorm:"type:varchar(512)"` // 备注
|
Remark string `json:"remark"` // 备注
|
||||||
|
Img string `json:"img"` // 图片
|
||||||
}
|
}
|
||||||
|
|
||||||
type CommodityEditRequest struct {
|
type CommodityEditRequest struct {
|
||||||
|
@ -3164,7 +3166,8 @@ type CommodityEditRequest struct {
|
||||||
Brokerage2 float64 `json:"brokerage_2"` // 员工毛利提成
|
Brokerage2 float64 `json:"brokerage_2"` // 员工毛利提成
|
||||||
MemberDiscount float64 `json:"member_discount"` // 会员优惠
|
MemberDiscount float64 `json:"member_discount"` // 会员优惠
|
||||||
Origin string `json:"origin"` // 产地
|
Origin string `json:"origin"` // 产地
|
||||||
Remark string `json:"remark" gorm:"type:varchar(512)"` // 备注
|
Remark string `json:"remark"` // 备注
|
||||||
|
Img string `json:"img"` // 图片
|
||||||
}
|
}
|
||||||
|
|
||||||
type CommodityDetailRequest struct {
|
type CommodityDetailRequest struct {
|
||||||
|
|
|
@ -333,9 +333,28 @@ func (m *ErpDecisionReportReq) DecisionReportList(c *gin.Context) (*ErpDecisionR
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//var sumData DecisionSumData
|
||||||
for _, data := range commodityMap {
|
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)
|
reportList = append(reportList, data)
|
||||||
}
|
}
|
||||||
|
//resp.SumData = sumData
|
||||||
|
|
||||||
// 排序规则:商品编号小
|
// 排序规则:商品编号小
|
||||||
SortReportByDecisionCommodities(reportList)
|
SortReportByDecisionCommodities(reportList)
|
||||||
|
@ -1445,7 +1464,295 @@ func getAllotOutCount(req *ErpDecisionReportReq, stock ErpStock) (DecisionReport
|
||||||
return reportData, nil
|
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) {
|
func getSumStockData(req *ErpDecisionReportReq) (DecisionReportData, error) {
|
||||||
var reportData DecisionReportData
|
var reportData DecisionReportData
|
||||||
qs := orm.Eloquent.Debug().Table("erp_stock_commodity")
|
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(`
|
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 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 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 system_out,
|
||||||
SUM(CASE WHEN state = ? THEN count ELSE 0 END) AS allot_wait_in,
|
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,
|
`, PurchaseReturn, ProductInventory, SystemOut, InAllot)
|
||||||
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})
|
|
||||||
|
|
||||||
err := subQuery.Scan(&reportData).Error
|
err := subQuery.Scan(&reportData).Error
|
||||||
if err != nil {
|
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
|
var err error
|
||||||
err = qs.Select("SUM(erp_purchase_inventory.count) AS purchase_stock").
|
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").
|
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(`
|
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 = ? 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
|
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) > 0 {
|
||||||
if len(req.StoreId) == 1 {
|
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 {
|
} 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)
|
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
|
// Apply store_id filter if provided
|
||||||
if len(req.StoreId) > 1 {
|
if len(req.StoreId) > 1 {
|
||||||
subQuery := qs.Select(`
|
subQuery := qs.Select(`
|
||||||
|
@ -1716,18 +2125,28 @@ func getSumAllotData(req *ErpDecisionReportReq) (DecisionReportData, error) {
|
||||||
func getSumDecisionReportData(req *ErpDecisionReportReq) (DecisionSumData, error) {
|
func getSumDecisionReportData(req *ErpDecisionReportReq) (DecisionSumData, error) {
|
||||||
var sumData DecisionSumData
|
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)
|
sumStockData, err := getSumStockData(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return DecisionSumData{}, err
|
return DecisionSumData{}, err
|
||||||
}
|
}
|
||||||
sumData.TotalBeginStock = sumStockData.BeginStock
|
|
||||||
sumData.TotalBeginAmount = sumStockData.BeginAmount
|
|
||||||
sumData.TotalPurchaseReturn = sumStockData.PurchaseReturn
|
sumData.TotalPurchaseReturn = sumStockData.PurchaseReturn
|
||||||
sumData.TotalAllotWaitIn = sumStockData.AllotWaitIn
|
sumData.TotalAllotWaitIn = sumStockData.AllotWaitIn
|
||||||
sumData.TotalProductIn = sumStockData.ProductIn
|
sumData.TotalProductIn = sumStockData.ProductIn
|
||||||
sumData.TotalSystemOut = sumStockData.SystemOut
|
sumData.TotalSystemOut = sumStockData.SystemOut
|
||||||
sumData.TotalEndStock = sumStockData.EndStock
|
|
||||||
sumData.TotalEndAmount = sumStockData.EndAmount
|
|
||||||
|
|
||||||
sumPurchaseData, err := getSumPurchaseData(req)
|
sumPurchaseData, err := getSumPurchaseData(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -1757,6 +2176,15 @@ func getSumDecisionReportData(req *ErpDecisionReportReq) (DecisionSumData, error
|
||||||
sumData.TotalAllotIn = sumAllotData.AllotIn
|
sumData.TotalAllotIn = sumAllotData.AllotIn
|
||||||
sumData.TotalAllotOut = sumAllotData.AllotOut
|
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)
|
roundDecisionSumData(&sumData)
|
||||||
|
|
||||||
return sumData, nil
|
return sumData, nil
|
||||||
|
|
|
@ -289,6 +289,7 @@ type DemandData struct {
|
||||||
ErpCommodityName string `json:"erp_commodity_name"` // 商品名称
|
ErpCommodityName string `json:"erp_commodity_name"` // 商品名称
|
||||||
ErpCategoryID uint32 `json:"erp_category_id"` // 商品分类id
|
ErpCategoryID uint32 `json:"erp_category_id"` // 商品分类id
|
||||||
ErpCategoryName string `json:"erp_category_name"` // 商品分类名称
|
ErpCategoryName string `json:"erp_category_name"` // 商品分类名称
|
||||||
|
Img string `json:"img"` // 图片
|
||||||
RetailPrice float64 `json:"retail_price"` // 指导零售价
|
RetailPrice float64 `json:"retail_price"` // 指导零售价
|
||||||
LastWholesalePrice float64 `json:"last_wholesale_price"` // 最近采购价
|
LastWholesalePrice float64 `json:"last_wholesale_price"` // 最近采购价
|
||||||
TotalCount uint32 `json:"total_count"` // 需采购总数量
|
TotalCount uint32 `json:"total_count"` // 需采购总数量
|
||||||
|
@ -2106,6 +2107,7 @@ func convertToDemandDataAll(commodity ErpCommodity, usedStore []uint32, stores [
|
||||||
ErpCategoryName: commodity.ErpCategoryName,
|
ErpCategoryName: commodity.ErpCategoryName,
|
||||||
RetailPrice: commodity.RetailPrice,
|
RetailPrice: commodity.RetailPrice,
|
||||||
Remark: demandRemarkMap[commodity.ID].Remark,
|
Remark: demandRemarkMap[commodity.ID].Remark,
|
||||||
|
Img: commodity.Img,
|
||||||
}
|
}
|
||||||
|
|
||||||
var demands []ErpPurchaseDemand
|
var demands []ErpPurchaseDemand
|
||||||
|
@ -2405,6 +2407,7 @@ func convertToDemandData(commodity ErpCommodity, usedStore []uint32, stores []St
|
||||||
ErpCategoryName: commodity.ErpCategoryName,
|
ErpCategoryName: commodity.ErpCategoryName,
|
||||||
RetailPrice: commodity.RetailPrice,
|
RetailPrice: commodity.RetailPrice,
|
||||||
Remark: demandRemarksMap[commodity.ID].Remark,
|
Remark: demandRemarksMap[commodity.ID].Remark,
|
||||||
|
Img: commodity.Img,
|
||||||
}
|
}
|
||||||
|
|
||||||
var demands []ErpPurchaseDemand
|
var demands []ErpPurchaseDemand
|
||||||
|
|
12
docs/docs.go
12
docs/docs.go
|
@ -6893,6 +6893,10 @@ const docTemplate = `{
|
||||||
"description": "系统生成串码:2-是(系统生成) 3-否(手动添加)",
|
"description": "系统生成串码:2-是(系统生成) 3-否(手动添加)",
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
},
|
},
|
||||||
|
"img": {
|
||||||
|
"description": "图片",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
"is_imei": {
|
"is_imei": {
|
||||||
"description": "是否串码:1-串码类 2-非串码",
|
"description": "是否串码:1-串码类 2-非串码",
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
|
@ -6995,6 +6999,10 @@ const docTemplate = `{
|
||||||
"description": "1-无串码 2-串码(系统生成) 3-串码(手动添加)",
|
"description": "1-无串码 2-串码(系统生成) 3-串码(手动添加)",
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
},
|
},
|
||||||
|
"img": {
|
||||||
|
"description": "图片",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
"is_imei": {
|
"is_imei": {
|
||||||
"description": "是否串码:1-串码类 2-非串码",
|
"description": "是否串码:1-串码类 2-非串码",
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
|
@ -8063,6 +8071,10 @@ const docTemplate = `{
|
||||||
"description": "1-无串码 2-串码(系统生成) 3-串码(手动添加)",
|
"description": "1-无串码 2-串码(系统生成) 3-串码(手动添加)",
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
},
|
},
|
||||||
|
"img": {
|
||||||
|
"description": "图片",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
"is_imei": {
|
"is_imei": {
|
||||||
"description": "是否串码:1-串码类 2-非串码",
|
"description": "是否串码:1-串码类 2-非串码",
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
|
|
|
@ -6882,6 +6882,10 @@
|
||||||
"description": "系统生成串码:2-是(系统生成) 3-否(手动添加)",
|
"description": "系统生成串码:2-是(系统生成) 3-否(手动添加)",
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
},
|
},
|
||||||
|
"img": {
|
||||||
|
"description": "图片",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
"is_imei": {
|
"is_imei": {
|
||||||
"description": "是否串码:1-串码类 2-非串码",
|
"description": "是否串码:1-串码类 2-非串码",
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
|
@ -6984,6 +6988,10 @@
|
||||||
"description": "1-无串码 2-串码(系统生成) 3-串码(手动添加)",
|
"description": "1-无串码 2-串码(系统生成) 3-串码(手动添加)",
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
},
|
},
|
||||||
|
"img": {
|
||||||
|
"description": "图片",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
"is_imei": {
|
"is_imei": {
|
||||||
"description": "是否串码:1-串码类 2-非串码",
|
"description": "是否串码:1-串码类 2-非串码",
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
|
@ -8052,6 +8060,10 @@
|
||||||
"description": "1-无串码 2-串码(系统生成) 3-串码(手动添加)",
|
"description": "1-无串码 2-串码(系统生成) 3-串码(手动添加)",
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
},
|
},
|
||||||
|
"img": {
|
||||||
|
"description": "图片",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
"is_imei": {
|
"is_imei": {
|
||||||
"description": "是否串码:1-串码类 2-非串码",
|
"description": "是否串码:1-串码类 2-非串码",
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
|
|
|
@ -510,6 +510,9 @@ definitions:
|
||||||
imei_type:
|
imei_type:
|
||||||
description: 系统生成串码:2-是(系统生成) 3-否(手动添加)
|
description: 系统生成串码:2-是(系统生成) 3-否(手动添加)
|
||||||
type: integer
|
type: integer
|
||||||
|
img:
|
||||||
|
description: 图片
|
||||||
|
type: string
|
||||||
is_imei:
|
is_imei:
|
||||||
description: 是否串码:1-串码类 2-非串码
|
description: 是否串码:1-串码类 2-非串码
|
||||||
type: integer
|
type: integer
|
||||||
|
@ -583,6 +586,9 @@ definitions:
|
||||||
imei_type:
|
imei_type:
|
||||||
description: 1-无串码 2-串码(系统生成) 3-串码(手动添加)
|
description: 1-无串码 2-串码(系统生成) 3-串码(手动添加)
|
||||||
type: integer
|
type: integer
|
||||||
|
img:
|
||||||
|
description: 图片
|
||||||
|
type: string
|
||||||
is_imei:
|
is_imei:
|
||||||
description: 是否串码:1-串码类 2-非串码
|
description: 是否串码:1-串码类 2-非串码
|
||||||
type: integer
|
type: integer
|
||||||
|
@ -1369,6 +1375,9 @@ definitions:
|
||||||
imei_type:
|
imei_type:
|
||||||
description: 1-无串码 2-串码(系统生成) 3-串码(手动添加)
|
description: 1-无串码 2-串码(系统生成) 3-串码(手动添加)
|
||||||
type: integer
|
type: integer
|
||||||
|
img:
|
||||||
|
description: 图片
|
||||||
|
type: string
|
||||||
is_imei:
|
is_imei:
|
||||||
description: 是否串码:1-串码类 2-非串码
|
description: 是否串码:1-串码类 2-非串码
|
||||||
type: integer
|
type: integer
|
||||||
|
|
Loading…
Reference in New Issue
Block a user