From 4537477eff411a0243f03d6808842305dcb4b2a4 Mon Sep 17 00:00:00 2001 From: chenlin Date: Wed, 14 Aug 2024 09:52:38 +0800 Subject: [PATCH] =?UTF-8?q?1.=E9=9B=B6=E5=94=AE=E7=AE=A1=E7=90=86=E5=9F=BA?= =?UTF-8?q?=E7=A1=80=E8=B5=84=E6=96=99=E5=A2=9E=E5=8A=A0=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=8A=9F=E8=83=BD=EF=BC=9B=202.=E9=87=87?= =?UTF-8?q?=E8=B4=AD=E9=9C=80=E6=B1=82=E5=92=8C=E9=87=87=E8=B4=AD=E9=9C=80?= =?UTF-8?q?=E6=B1=82=E6=8F=90=E6=8A=A5=E9=A1=B5=E9=9D=A2=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=95=86=E5=93=81=E5=9B=BE=E7=89=87=E5=B1=95=E7=A4=BA=E5=88=97?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/admin/apis/basic/commodity.go | 2 + app/admin/models/commodity.go | 7 +- app/admin/models/decision.go | 458 +++++++++++++++++++++++++++++- app/admin/models/purchase.go | 3 + docs/docs.go | 12 + docs/swagger.json | 12 + docs/swagger.yaml | 9 + 7 files changed, 486 insertions(+), 17 deletions(-) diff --git a/app/admin/apis/basic/commodity.go b/app/admin/apis/basic/commodity.go index 0984e5c..520b4db 100644 --- a/app/admin/apis/basic/commodity.go +++ b/app/admin/apis/basic/commodity.go @@ -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() diff --git a/app/admin/models/commodity.go b/app/admin/models/commodity.go index 0299e83..99d5453 100644 --- a/app/admin/models/commodity.go +++ b/app/admin/models/commodity.go @@ -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 { diff --git a/app/admin/models/decision.go b/app/admin/models/decision.go index a74e559..b912dc1 100644 --- a/app/admin/models/decision.go +++ b/app/admin/models/decision.go @@ -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 diff --git a/app/admin/models/purchase.go b/app/admin/models/purchase.go index b2ea995..5dcc5cd 100644 --- a/app/admin/models/purchase.go +++ b/app/admin/models/purchase.go @@ -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 diff --git a/docs/docs.go b/docs/docs.go index a7664db..04507bf 100644 --- a/docs/docs.go +++ b/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" diff --git a/docs/swagger.json b/docs/swagger.json index 61aa213..5118389 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -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" diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 405dc3c..03c3c30 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -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