From 4bf39f8cdbac1d6360293ad8c05ec46504214512 Mon Sep 17 00:00:00 2001 From: chenlin Date: Wed, 15 May 2024 11:08:46 +0800 Subject: [PATCH] =?UTF-8?q?1.=E4=BF=AE=E5=A4=8D=E7=BC=BA=E9=99=B7=EF=BC=8C?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81=EF=BC=9A=20=EF=BC=881?= =?UTF-8?q?=EF=BC=89=E9=9B=B6=E5=94=AE=E9=80=80=E8=B4=A7=E6=97=B6=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0"=E5=BA=93=E5=AD=98=E5=B7=B2=E6=9C=89=E8=AF=A5?= =?UTF-8?q?=E4=B8=B2=E7=A0=81=E5=95=86=E5=93=81"=E7=9A=84=E5=88=A4?= =?UTF-8?q?=E6=96=AD=EF=BC=9B=20=EF=BC=882=EF=BC=89=E9=97=A8=E5=BA=97?= =?UTF-8?q?=E7=BB=8F=E8=90=A5=E6=95=B0=E6=8D=AE=E4=B8=AD=E9=94=80=E5=94=AE?= =?UTF-8?q?=E6=95=B0=E9=87=8F=E7=B1=BB=E5=9E=8B=E6=94=B9=E4=B8=BAint64?= =?UTF-8?q?=EF=BC=8C=E5=8F=AF=E8=83=BD=E6=9C=89=E8=B4=9F=E5=80=BC=EF=BC=9B?= =?UTF-8?q?=20=EF=BC=883=EF=BC=89=E9=9B=B6=E5=94=AE=E6=98=8E=E7=BB=86?= =?UTF-8?q?=E4=B8=AD=E5=AD=97=E6=AE=B5=E7=B1=BB=E5=9E=8Bint32=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E4=B8=BAfloat64=EF=BC=8C=E5=8C=85=E5=90=AB=EF=BC=9ARe?= =?UTF-8?q?tailPrice=E3=80=81SalePrice=E3=80=81WholesalePrice=E3=80=81Staf?= =?UTF-8?q?fPrice=EF=BC=9B=20=EF=BC=884=EF=BC=89=E5=BA=93=E5=AD=98?= =?UTF-8?q?=E8=B0=83=E6=8B=A8=E5=95=86=E5=93=81=E4=BF=A1=E6=81=AF=E8=A1=A8?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AD=97=E6=AE=B5=EF=BC=9ACategoryId?= =?UTF-8?q?=E3=80=81CategoryName=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/admin/apis/erpordermanage/erp_order.go | 6 +- app/admin/apis/system/sysuser.go | 12 ++-- app/admin/models/erp_order.go | 47 +++++++++--- app/admin/models/game_card.go | 2 +- app/admin/models/inventory_allot.go | 13 ++++ app/admin/models/inventory_report.go | 84 +++++++++++++++------- app/admin/models/purchase.go | 14 ++-- app/admin/models/user.go | 10 +-- 8 files changed, 134 insertions(+), 54 deletions(-) diff --git a/app/admin/apis/erpordermanage/erp_order.go b/app/admin/apis/erpordermanage/erp_order.go index f14d80c..633519b 100644 --- a/app/admin/apis/erpordermanage/erp_order.go +++ b/app/admin/apis/erpordermanage/erp_order.go @@ -98,7 +98,11 @@ func ErpOrderList(c *gin.Context) { resp, err := req.List(c) if err != nil { logger.Error("erp commodity list err:", logger.Field("err", err)) - app.Error(c, http.StatusInternalServerError, err, "查询失败:"+err.Error()) + if err.Error() == "库存已有该串码商品" { + app.Error(c, http.StatusInternalServerError, err, err.Error()) + } else { + app.Error(c, http.StatusInternalServerError, err, "查询失败:"+err.Error()) + } return } diff --git a/app/admin/apis/system/sysuser.go b/app/admin/apis/system/sysuser.go index ee63290..abb56fe 100644 --- a/app/admin/apis/system/sysuser.go +++ b/app/admin/apis/system/sysuser.go @@ -196,7 +196,7 @@ func InsertSysUser(c *gin.Context) { return } // 是否已经绑定过账号 - if userInfo.UserType == 2 { + if userInfo.UserType == models.UserTypeShopAssistant { app.Error(c, http.StatusInternalServerError, err, "小程序账号ID重复,请检查") return } @@ -239,7 +239,7 @@ func InsertSysUser(c *gin.Context) { // 如果添加了小程序id,则需要更新user表的user_type字段为2-店员 if req.Uid != 0 { - err = models.UpdateUserType(begin, req.Uid, 2) + err = models.UpdateUserType(begin, req.Uid, models.UserTypeShopAssistant) if err != nil { begin.Rollback() logger.Error("UpdateUserType err:", logger.Field("err", err)) @@ -296,7 +296,7 @@ func UpdateSysUser(c *gin.Context) { return } // 是否已经绑定过账号 - if userInfo.UserType == 2 { + if userInfo.UserType == models.UserTypeShopAssistant { app.Error(c, http.StatusInternalServerError, err, "小程序账号ID重复,请检查") return } @@ -341,12 +341,12 @@ func UpdateSysUser(c *gin.Context) { // 判断是否修改了uid if sysInfo.Uid == 0 && req.Uid != 0 { // 新增uid,直接更新为2即可 - err = models.UpdateUserType(begin, req.Uid, 2) + err = models.UpdateUserType(begin, req.Uid, models.UserTypeShopAssistant) } else if sysInfo.Uid != 0 { if sysInfo.Uid != req.Uid { if req.Uid != 0 { // 原uid的状态更新为1 - err = models.UpdateUserType(begin, sysInfo.Uid, 1) + err = models.UpdateUserType(begin, sysInfo.Uid, models.UserTypeConsumer) if err != nil { begin.Rollback() logger.Error("UpdateUserType err:", logger.Field("err", err)) @@ -356,7 +356,7 @@ func UpdateSysUser(c *gin.Context) { } // 新uid状态更新为2 - err = models.UpdateUserType(begin, req.Uid, 2) + err = models.UpdateUserType(begin, req.Uid, models.UserTypeShopAssistant) } } if err != nil { diff --git a/app/admin/models/erp_order.go b/app/admin/models/erp_order.go index 1c687a1..2bfa2c8 100644 --- a/app/admin/models/erp_order.go +++ b/app/admin/models/erp_order.go @@ -270,7 +270,7 @@ type StoreManageData struct { PromotionFee float64 `json:"promotion_fee"` // 推广费 SalesProfit float64 `json:"sales_profit"` // 销售毛利 StaffProfit float64 `json:"staff_profit"` // 员工毛利 - Count uint32 `json:"count"` // 销售数量 + Count int64 `json:"count"` // 销售数量 } // ErpOrderRetailMarginReq 查询商品零售毛利汇总入参 @@ -346,14 +346,14 @@ type ErpOrderRetailDetailResp struct { // RetailDetailTotalData 零售明细相关金额汇总 type RetailDetailTotalData struct { Count int32 `json:"count"` // 销售数量 - RetailPrice int32 `json:"retail_price"` // 指导零售价 - SalePrice int32 `json:"sale_price"` // 零售价 + RetailPrice float64 `json:"retail_price"` // 指导零售价 + SalePrice float64 `json:"sale_price"` // 零售价 SaleDiscount float64 `json:"sale_discount"` // 零售优惠 MemberDiscount float64 `json:"member_discount"` // 会员优惠 VmDiscount float64 `json:"vm_discount"` // 会员积分抵扣 Amount float64 `json:"amount"` // 实际零售价 - WholesalePrice int32 `json:"wholesale_price"` // 采购单价 - StaffPrice int32 `json:"staff_price"` // 员工成本价 + WholesalePrice float64 `json:"wholesale_price"` // 采购单价 + StaffPrice float64 `json:"staff_price"` // 员工成本价 SalesProfit float64 `json:"sales_profit"` // 销售毛利 StaffProfit float64 `json:"staff_profit"` // 员工毛利 TotalRetailPrice float64 `json:"total_retail_price"` // 订单总指导零售价 @@ -602,19 +602,39 @@ func (m *ErpOrderListReq) List(c *gin.Context) (*ErpOrderListResp, error) { func QueryListByScanCode(scanCode, showConfig string, c *gin.Context) (*ErpOrderListResp, error) { resp := &ErpOrderListResp{} + // 查询扫码串码的零售销售订单的商品信息 var commodity []ErpOrderCommodity - err := orm.Eloquent.Table("erp_order_commodity").Where("imei = ?", scanCode).Find(&commodity).Error + err := orm.Eloquent.Table("erp_order_commodity").Where("imei = ? and rejected_count = 0", scanCode).Find(&commodity).Error if err != nil && err != RecordNotFound { logger.Error("get erp_order_commodity err:", logger.Field("err", err)) return resp, err } + if len(commodity) == 0 { + return &ErpOrderListResp{}, nil + } + + // 判断该串码商品是否已经退货退回库存列表 + var stockCount int64 + err = orm.Eloquent.Table("erp_stock_commodity"). + Where("state = 1 AND imei = ?", scanCode).Count(&stockCount).Error + if err != nil { + return nil, err + } + if stockCount > 0 { + return nil, errors.New("库存已有该串码商品") + } + var orders []ErpOrder for _, item := range commodity { if showConfig == "OFF" { - err = orm.Eloquent.Table("erp_order").Where("id = ? and pay_status = ? and is_print != ?", item.ErpOrderId, HavePaid, NoPrint).Find(&orders).Error + err = orm.Eloquent.Table("erp_order"). + Where("id = ? and pay_status = ? and is_print != ?", item.ErpOrderId, HavePaid, NoPrint). + Order("audit_time DESC").Find(&orders).Error } else { - err = orm.Eloquent.Table("erp_order").Where("id = ? and pay_status = ?", item.ErpOrderId, HavePaid).Find(&orders).Error + err = orm.Eloquent.Table("erp_order"). + Where("id = ? and pay_status = ?", item.ErpOrderId, HavePaid). + Order("audit_time DESC").Find(&orders).Error } if err != nil && err != RecordNotFound { logger.Error("get erp_order err:", logger.Field("err", err)) @@ -647,10 +667,15 @@ func QueryListByScanCode(scanCode, showConfig string, c *gin.Context) (*ErpOrder erpOrderListSetCashier(orders) erpOrderListSetSalesman(orders) - resp.List = orders + if len(orders) != 0 { + // 查询该串码商品是否已经退过货 + resp.List = append(resp.List, orders[0]) + } else { + resp.List = orders + } //跟之前保持一致 - resp.Total = 1 + resp.Total = len(resp.List) resp.PageIndex = 1 resp.PageSize = 10 @@ -1271,7 +1296,7 @@ func erpOrderListSetCashier(list []ErpOrder) { } func (m *ErpOrder) SetErpCashier() { - if m.CashierList != "" { + if m.CashierList != "" && m.RetailType == RetailTypeSale { // 临时限制,退货订单不展示具体付款方式 var cashiers []ErpOrderCashier err := json.Unmarshal([]byte(m.CashierList), &cashiers) if err != nil { diff --git a/app/admin/models/game_card.go b/app/admin/models/game_card.go index cc6889e..ff42848 100644 --- a/app/admin/models/game_card.go +++ b/app/admin/models/game_card.go @@ -729,7 +729,7 @@ type GameCardGoodsStock struct { RentStock uint32 `json:"rent_stock"` // 租借库存 UserHoldStock uint32 `json:"user_hold_stock"` OrderCount uint32 `json:"order_count"` - TotalStock uint32 `json:"total_stock"` + TotalStock uint32 `json:"total_stock"` // 卡池-总数 Name string `json:"name" gorm:"-"` // 名称 CoverImg string `json:"cover_img" gorm:"-"` // 封面 } diff --git a/app/admin/models/inventory_allot.go b/app/admin/models/inventory_allot.go index c52afc4..8545429 100644 --- a/app/admin/models/inventory_allot.go +++ b/app/admin/models/inventory_allot.go @@ -48,6 +48,8 @@ type ErpInventoryAllotCommodity struct { AllotOrderId uint32 `json:"allot_order_id" gorm:"index"` // 库存调拨订单表id CommodityId uint32 `json:"commodity_id" gorm:"index"` // 商品id CommodityName string `json:"commodity_name"` // 商品名称 + CategoryId uint32 `json:"category_id" gorm:"index"` // 分类id + CategoryName string `json:"category_name"` // 分类名称 IMEIType uint32 `json:"imei_type"` // 1-无串码 2-串码 IMEI string `json:"imei"` // 商品串码 Count uint32 `json:"count"` // 数量 @@ -261,6 +263,17 @@ func AddInventoryAllot(req *InventoryAllotAddReq, sysUser *SysUser) (*ErpInvento // 创建库存调拨商品信息,添加库存调拨订单id for i, _ := range req.Commodities { req.Commodities[i].AllotOrderId = inventoryAllotOrder.ID + + // 查询商品信息 + commodityInfo, err := GetCommodity(req.Commodities[i].CommodityId) + if err != nil { + logger.Error("SetCategory err:", logger.Field("err", err)) + return nil, err + } + + req.Commodities[i].CategoryId = commodityInfo.ErpCategoryId + req.Commodities[i].CategoryName = commodityInfo.ErpCategoryName + err = begin.Create(&req.Commodities[i]).Error if err != nil { begin.Rollback() diff --git a/app/admin/models/inventory_report.go b/app/admin/models/inventory_report.go index ba74729..aae075c 100644 --- a/app/admin/models/inventory_report.go +++ b/app/admin/models/inventory_report.go @@ -9,6 +9,7 @@ import ( "go-admin/logger" "go-admin/tools" "go-admin/tools/config" + "math" "sort" "strconv" "time" @@ -27,16 +28,20 @@ type InventoryReportByProductReq struct { // InventoryReportByProductResp 产品库存汇总(按门店)出参 type InventoryReportByProductResp struct { - Total uint32 `json:"total"` // 总条数/记录数 - PageIndex int `json:"pageIndex"` // 页码 - PageSize int `json:"pageSize"` // 页面条数 - TotalEffectiveCount uint32 `json:"total_effective_count"` // 有效库存数 - TotalTransferCount uint32 `json:"total_transfer_count"` // 调入中数量 - TotalCount uint32 `json:"total_count"` // 总数量 - TotalEffectiveAmount float64 `json:"total_effective_amount"` // 有效库存金额 - TotalTransferAmount float64 `json:"total_transfer_amount"` // 调入中金额 - ExportUrl string `json:"export_url"` // 导出excel路径 - List []ReportByProductData `json:"list"` // + Total uint32 `json:"total"` // 总条数/记录数 + PageIndex int `json:"pageIndex"` // 页码 + PageSize int `json:"pageSize"` // 页面条数 + ReportByProductSumData + ExportUrl string `json:"export_url"` // 导出excel路径 + List []ReportByProductData `json:"list"` // +} + +type ReportByProductSumData struct { + TotalEffectiveCount uint32 `json:"total_effective_count"` // 有效库存数 + TotalTransferCount uint32 `json:"total_transfer_count"` // 调入中数量 + TotalCount uint32 `json:"total_count"` // 总数量 + TotalEffectiveAmount float64 `json:"total_effective_amount"` // 有效库存金额 + TotalTransferAmount float64 `json:"total_transfer_amount"` // 调入中金额 } // ReportByProductData 产品库存汇总(按门店)数据 @@ -275,7 +280,7 @@ func (m *InventoryReportByProductReq) ReportByProductList(c *gin.Context) (*Inve for _, category := range m.CategoryID { categoryIDs = append(categoryIDs, category) } - qs = qs.Where("category_id IN (?)", categoryIDs) + qs = qs.Where("erp_category_id IN (?)", categoryIDs) } if len(m.CommoditySerialNumber) > 0 { // 商品编号 @@ -291,7 +296,7 @@ func (m *InventoryReportByProductReq) ReportByProductList(c *gin.Context) (*Inve for _, commodityName := range m.CommodityName { commodityNames = append(commodityNames, commodityName) } - qs = qs.Where("commodity_name IN (?)", commodityNames) + qs = qs.Where("erp_commodity_name IN (?)", commodityNames) } var count int64 @@ -353,12 +358,17 @@ func (m *InventoryReportByProductReq) ReportByProductList(c *gin.Context) (*Inve reportList = append(reportList, reportData) } - resp.TotalEffectiveCount = nTotalEffectiveCount - resp.TotalTransferCount = nTotalTransferCount - resp.TotalCount = resp.TotalTransferCount + resp.TotalEffectiveCount - resp.TotalEffectiveAmount = nTotalEffectiveAmount - resp.TotalTransferAmount = nTotalTransferAmount - resp.Total = resp.TotalCount + sumData, err := getReportByProductSumData() + if err != nil { + return nil, err + } + + resp.TotalEffectiveCount = sumData.TotalEffectiveCount + resp.TotalTransferCount = sumData.TotalTransferCount + resp.TotalCount = sumData.TotalCount + resp.TotalEffectiveAmount = sumData.TotalEffectiveAmount + resp.TotalTransferAmount = sumData.TotalTransferAmount + resp.Total = uint32(count) resp.List = reportList if m.IsExport == 1 { // 导出excel @@ -420,6 +430,30 @@ func getDispatchCommodityAmount(storeId, commodityId uint32) (float64, error) { return nDispatchCommodityAmount, nil } +// 查询产品库存汇总(按门店)的汇总数据:总有效库存数、总调入中数量、总数量、总有效库存金额、总调入中金额 +func getReportByProductSumData() (ReportByProductSumData, error) { + var data ReportByProductSumData + + // 查询汇总数据 + err := orm.Eloquent.Debug().Table("erp_stock_commodity"). + Select(` + SUM(CASE WHEN state = ? THEN wholesale_price ELSE 0 END) AS total_effective_amount, + SUM(CASE WHEN state = ? THEN wholesale_price ELSE 0 END) AS total_transfer_amount, + SUM(CASE WHEN state = ? THEN Count ELSE 0 END) AS total_effective_count, + SUM(CASE WHEN state = ? THEN Count ELSE 0 END) AS total_transfer_count, + SUM(CASE WHEN state IN (?, ?) THEN Count ELSE 0 END) AS total_count + `, InStock, InAllot, InStock, InAllot, InStock, InAllot). + Find(&data).Error + if err != nil { + return data, err + } + + data.TotalEffectiveAmount = math.Round(data.TotalEffectiveAmount*100) / 100 + data.TotalTransferAmount = math.Round(data.TotalTransferAmount*100) / 100 + + return data, nil +} + // reportByProductExport 产品库存汇总(按门店)导出excel func reportByProductExport(req *InventoryReportByProductResp) (string, error) { file := excelize.NewFile() @@ -894,6 +928,8 @@ func (m *InventoryReportAllotDetailReq) ReportAllotDetailList(c *gin.Context) (* "END AS state, "+ "erp_inventory_allot_commodity.commodity_id, "+ "erp_inventory_allot_commodity.commodity_name, "+ + "erp_inventory_allot_commodity.category_id, "+ + "erp_inventory_allot_commodity.category_name, "+ "erp_inventory_allot_commodity.imei_type, "+ "erp_inventory_allot_commodity.imei, "+ "erp_inventory_allot_commodity.count, "+ @@ -934,8 +970,8 @@ func (m *InventoryReportAllotDetailReq) ReportAllotDetailList(c *gin.Context) (* for _, commodityName := range m.CommodityName { commodityNames = append(commodityNames, commodityName) } - qs = qs.Where("erp_inventory_allot_order.commodity_name IN (?)", commodityNames) - countQuery = countQuery.Where("erp_inventory_allot_order.commodity_name IN (?)", commodityNames) + qs = qs.Where("erp_inventory_allot_commodity.commodity_name IN (?)", commodityNames) + countQuery = countQuery.Where("erp_inventory_allot_commodity.commodity_name IN (?)", commodityNames) } if len(m.CategoryID) > 0 { // 商品分类id @@ -943,8 +979,8 @@ func (m *InventoryReportAllotDetailReq) ReportAllotDetailList(c *gin.Context) (* for _, category := range m.CategoryID { categoryIDs = append(categoryIDs, category) } - qs = qs.Where("erp_inventory_allot_order.category_id IN (?)", categoryIDs) - countQuery = countQuery.Where("erp_inventory_allot_order.category_id IN (?)", categoryIDs) + qs = qs.Where("erp_inventory_allot_commodity.category_id IN (?)", categoryIDs) + countQuery = countQuery.Where("erp_inventory_allot_commodity.category_id IN (?)", categoryIDs) } if m.State != 0 { // 调拨状态 @@ -1015,8 +1051,8 @@ func (m *InventoryReportAllotDetailReq) ReportAllotDetailList(c *gin.Context) (* return nil, err } - // 添加分类信息 - reportAllotDetailSetCategory(commodities) + //// 添加分类信息 + //reportAllotDetailSetCategory(commodities) resp.Total = count resp.List = commodities diff --git a/app/admin/models/purchase.go b/app/admin/models/purchase.go index 9da7231..37287aa 100644 --- a/app/admin/models/purchase.go +++ b/app/admin/models/purchase.go @@ -1314,14 +1314,16 @@ func InventoryErpPurchaseUpdateStock(gdb *gorm.DB, list []ErpPurchaseInventory, } // 遍历库存信息,合并重复数据 - newStockList := combineStocks(waitCreateStockList) - err := gdb.Debug().Create(&newStockList).Error - if err != nil { - logger.Errorf("create erp_stock err:", err) - return err + if len(waitCreateStockList) > 0 { + newStockList := combineStocks(waitCreateStockList) + err := gdb.Debug().Create(&newStockList).Error + if err != nil { + logger.Errorf("create erp_stock err:", err) + return err + } } - err = gdb.Debug().Create(&stockList).Error + err := gdb.Debug().Create(&stockList).Error if err != nil { logger.Errorf("create erp_stock_commodity err:", err) return err diff --git a/app/admin/models/user.go b/app/admin/models/user.go index 5cda29a..142c5a9 100644 --- a/app/admin/models/user.go +++ b/app/admin/models/user.go @@ -50,8 +50,8 @@ const ( ) const ( - MemberLevelConsumer = 10 // 普通用户 - MemberLevelUser = 1 // 普通会员 + MemberLevelConsumer = 10 // 普通用户:有开过零售单,留了手机号,但是小程序端未登陆过的,仍然是普通用户 + MemberLevelUser = 1 // 普通会员:仅进入了小程序且授权过手机号的为会员用户,未开通租卡会员的为“普通会员” MemberLevelGold = 2 // 黄金会员 MemberLevelPeriod = 3 // 短期会员 MemberLevelPlatinum = 4 // 白金会员 @@ -254,9 +254,9 @@ type OperationLog struct { type U struct { UserInfo - MemberExpireDays uint32 `json:"member_expire_days"` // 会员过期天数 - OrderCount int `json:"order_count"` // 消费次数 - OrderAmount int `json:"order_amount"` // 消费金额 + MemberExpireDays uint32 `json:"member_expire_days"` // 会员过期天数 + OrderCount int `json:"order_count"` // 消费次数 + OrderAmount float64 `json:"order_amount"` // 消费金额 } type NewUserListReq struct {