From f5b6024028c40388480f946a620672faa88de378 Mon Sep 17 00:00:00 2001 From: chenlin Date: Wed, 5 Jun 2024 10:50:15 +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=89V1.4.0=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=95=B0=E6=8D=AE=E6=9D=83=E9=99=90=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=EF=BC=9B=20=EF=BC=882=EF=BC=89=E8=BF=9B=E9=94=80=E5=AD=98?= =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E4=B8=AD=E9=9B=B6=E5=94=AE=E9=94=80=E5=94=AE?= =?UTF-8?q?=E6=95=B0=E9=87=8F=E6=9F=A5=E8=AF=A2=E8=A7=84=E5=88=99=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=EF=BC=9B=20=EF=BC=883=EF=BC=89=E9=9B=B6=E5=94=AE?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=95=86=E5=93=81=E8=A1=A8=E9=83=A8=E5=88=86?= =?UTF-8?q?uint=E7=B1=BB=E5=9E=8B=E8=B0=83=E6=95=B4=E4=B8=BAfloat64?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=EF=BC=9B=20=EF=BC=884=EF=BC=89=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=91=98=E8=B4=A6=E5=8F=B7=E9=BB=98=E8=AE=A4=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E6=89=80=E6=9C=89=E8=8F=9C=E5=8D=95=EF=BC=9B=20?= =?UTF-8?q?=EF=BC=885=EF=BC=89uer=5Fvm=5Frecord=E8=A1=A8=E6=96=B0=E5=A2=9E?= =?UTF-8?q?erp=5Forder=5Fid=E5=AD=97=E6=AE=B5=EF=BC=8C=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E7=A7=AF=E5=88=86=E8=A7=84=E5=88=99=E8=B0=83=E6=95=B4=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 | 2 - app/admin/apis/goodsmanage/game_card.go | 2 +- app/admin/apis/inventorymanage/Inventory.go | 2 +- app/admin/apis/inventorymanage/allot.go | 57 +++- app/admin/apis/inventorymanage/change.go | 41 ++- app/admin/apis/inventorymanage/product.go | 41 ++- app/admin/apis/mallmanage/mall_goods.go | 2 +- app/admin/apis/system/menu.go | 9 +- app/admin/middleware/permission.go | 2 +- app/admin/models/commodity.go | 8 +- app/admin/models/decision.go | 25 +- app/admin/models/erp_order.go | 274 +++++++++++++++++--- app/admin/models/game_card.go | 3 +- app/admin/models/inventory_allot.go | 87 ++++++- app/admin/models/inventory_change.go | 44 +++- app/admin/models/inventory_product.go | 43 ++- app/admin/models/mall.go | 33 ++- app/admin/models/menu.go | 19 ++ app/admin/models/share_card.go | 2 +- app/admin/models/user_vm.go | 17 +- 20 files changed, 600 insertions(+), 113 deletions(-) diff --git a/app/admin/apis/erpordermanage/erp_order.go b/app/admin/apis/erpordermanage/erp_order.go index f8b2ef8..c063826 100644 --- a/app/admin/apis/erpordermanage/erp_order.go +++ b/app/admin/apis/erpordermanage/erp_order.go @@ -134,8 +134,6 @@ func ErpOrderAudit(c *gin.Context) { return } - // todo 需要判断是否有审核权限 - var erpOrder model.ErpOrder err = orm.Eloquent.Table("erp_order").Where("bill_sn = ?", req.BillSn).Find(&erpOrder).Error if err != nil { diff --git a/app/admin/apis/goodsmanage/game_card.go b/app/admin/apis/goodsmanage/game_card.go index 21c1213..082d836 100644 --- a/app/admin/apis/goodsmanage/game_card.go +++ b/app/admin/apis/goodsmanage/game_card.go @@ -421,7 +421,7 @@ func GameCardStockAnalysis(c *gin.Context) { return } - resp, err := models.GameCardStockList(req.Name, req.SortType, req.SortDirection, req.StoreId, req.PageNum, req.PageSize) + resp, err := models.GameCardStockList(req.Name, req.SortType, req.SortDirection, req.StoreId, req.PageNum, req.PageSize, c) if err != nil { logger.Error("err:", logger.Field("err", err)) app.Error(c, http.StatusInternalServerError, err, "") diff --git a/app/admin/apis/inventorymanage/Inventory.go b/app/admin/apis/inventorymanage/Inventory.go index b7f2dd6..8ae7102 100644 --- a/app/admin/apis/inventorymanage/Inventory.go +++ b/app/admin/apis/inventorymanage/Inventory.go @@ -136,7 +136,7 @@ func DeliveryCargo(c *gin.Context) { return } - err := models.SetStockCommodityState(req.Id) + err := models.SetStockCommodityState(c, req.Id) if err != nil { //logger.Error("erp stock err:", err) app.Error(c, http.StatusInternalServerError, err, "获取失败") diff --git a/app/admin/apis/inventorymanage/allot.go b/app/admin/apis/inventorymanage/allot.go index 41005e5..c4b9559 100644 --- a/app/admin/apis/inventorymanage/allot.go +++ b/app/admin/apis/inventorymanage/allot.go @@ -42,6 +42,15 @@ func InventoryAllotAdd(c *gin.Context) { return } + // 校验入参门店是否包含在用户所有门店中,是否过期 + if !(tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员") { + if !models.CheckUserStore(req.DeliverStoreId, sysUser) { + app.Error(c, http.StatusInternalServerError, errors.New("操作失败:您没有该门店权限"), + "操作失败:您没有该门店权限") + return + } + } + inventoryProductOrder, err := models.AddInventoryAllot(req, sysUser) if err != nil { logger.Error("InventoryAllotAdd err:", logger.Field("err", err)) @@ -74,6 +83,13 @@ func InventoryAllotEdit(c *gin.Context) { return } + // 校验是否有入参门店权限 + err = models.AuthUserStore(c, req.DeliverStoreId) + if err != nil { + app.Error(c, http.StatusBadRequest, err, err.Error()) + return + } + inventoryProductOrder, err := models.EditAllotInventory(req) if err != nil { logger.Error("InventoryAllotEdit err:", logger.Field("err", err)) @@ -101,14 +117,7 @@ func InventoryAllotAudit(c *gin.Context) { return } - sysUser, err := models.GetSysUserByCtx(c) - if err != nil { - logger.Error("sys user err:", logger.Field("err", err)) - app.Error(c, http.StatusInternalServerError, err, "操作失败") - return - } - - err = models.AuditAllotInventory(req, sysUser) + err := models.AuditAllotInventory(req, c) if err != nil { app.Error(c, http.StatusInternalServerError, err, "审核失败:"+err.Error()) return @@ -140,8 +149,6 @@ func InventoryAllotDelete(c *gin.Context) { return } - // todo 需要校验当前用户是否有权限 - var inventoryAllotOrder models.ErpInventoryAllotOrder err = orm.Eloquent.Table("erp_inventory_allot_order").Where("serial_number = ?", req.SerialNumber). Find(&inventoryAllotOrder).Error @@ -151,6 +158,13 @@ func InventoryAllotDelete(c *gin.Context) { return } + // 校验是否有入参门店权限 + err = models.AuthUserStore(c, inventoryAllotOrder.DeliverStoreId) + if err != nil { + app.Error(c, http.StatusBadRequest, err, err.Error()) + return + } + if inventoryAllotOrder.SerialNumber == "" { logger.Error("order is null") app.Error(c, http.StatusInternalServerError, err, "删除失败:订单不存在") @@ -220,7 +234,7 @@ func InventoryAllotList(c *gin.Context) { return } - resp, err := req.List() + resp, err := req.List(c) if err != nil { app.Error(c, http.StatusInternalServerError, err, "获取失败:"+err.Error()) return @@ -258,6 +272,23 @@ func InventoryAllotDetail(c *gin.Context) { return } + sysUser, err := models.GetSysUserByCtx(c) + if err != nil { + logger.Error("sys user err:", logger.Field("err", err)) + app.Error(c, http.StatusInternalServerError, err, "操作失败") + return + } + + // 校验入参门店是否包含在用户所有门店中,是否过期 + if !(tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员") { + if !models.CheckUserStore(allotOrder.ReceiveStoreId, sysUser) && + !models.CheckUserStore(allotOrder.DeliverStoreId, sysUser) { + app.Error(c, http.StatusInternalServerError, errors.New("操作失败:您没有该门店权限"), + "操作失败:您没有该门店权限") + return + } + } + // 校验时间,如果为01-01-01 08:05,则赋值为空 if allotOrder.MakerTime != nil && allotOrder.MakerTime.IsZero() { allotOrder.MakerTime = nil @@ -296,7 +327,7 @@ func InventoryAllotDeliver(c *gin.Context) { return } - err := models.DeliverAllotInventory(req) + err := models.DeliverAllotInventory(req, c) if err != nil { app.Error(c, http.StatusInternalServerError, err, "操作失败:"+err.Error()) return @@ -322,7 +353,7 @@ func InventoryAllotReceive(c *gin.Context) { return } - err := models.ReceiveAllotInventory(req) + err := models.ReceiveAllotInventory(req, c) if err != nil { app.Error(c, http.StatusInternalServerError, err, "操作失败:"+err.Error()) return diff --git a/app/admin/apis/inventorymanage/change.go b/app/admin/apis/inventorymanage/change.go index 481a0e9..34a954b 100644 --- a/app/admin/apis/inventorymanage/change.go +++ b/app/admin/apis/inventorymanage/change.go @@ -42,6 +42,13 @@ func InventoryChangeAdd(c *gin.Context) { return } + // 校验是否有入参门店权限 + err = models.AuthUserStore(c, req.StoreId) + if err != nil { + app.Error(c, http.StatusBadRequest, err, err.Error()) + return + } + changeProductOrder, err := models.AddInventoryChange(req, sysUser) if err != nil { logger.Error("InventoryChangeAdd err:", logger.Field("err", err)) @@ -74,6 +81,13 @@ func InventoryChangeEdit(c *gin.Context) { return } + // 校验是否有入参门店权限 + err = models.AuthUserStore(c, req.StoreId) + if err != nil { + app.Error(c, http.StatusBadRequest, err, err.Error()) + return + } + if len(req.Commodities) == 0 { logger.Error("InventoryChangeEdit err:", logger.Field("err", err)) app.Error(c, http.StatusInternalServerError, errors.New("请添加商品"), "请添加商品") @@ -107,14 +121,7 @@ func InventoryChangeAudit(c *gin.Context) { return } - sysUser, err := models.GetSysUserByCtx(c) - if err != nil { - logger.Error("sys user err:", logger.Field("err", err)) - app.Error(c, http.StatusInternalServerError, err, "操作失败") - return - } - - err = models.AuditChangeInventory(req, sysUser) + err := models.AuditChangeInventory(req, c) if err != nil { app.Error(c, http.StatusInternalServerError, err, "审核失败:"+err.Error()) return @@ -146,8 +153,6 @@ func InventoryChangeDelete(c *gin.Context) { return } - // todo 需要校验当前用户是否有权限 - var inventoryChangeOrder models.ErpInventoryChangeOrder err = orm.Eloquent.Table("erp_inventory_change_order").Where("serial_number = ?", req.SerialNumber). Find(&inventoryChangeOrder).Error @@ -157,6 +162,13 @@ func InventoryChangeDelete(c *gin.Context) { return } + // 校验是否有入参门店权限 + err = models.AuthUserStore(c, inventoryChangeOrder.StoreId) + if err != nil { + app.Error(c, http.StatusBadRequest, err, err.Error()) + return + } + if inventoryChangeOrder.SerialNumber == "" { logger.Error("order is null") app.Error(c, http.StatusInternalServerError, err, "删除失败:订单不存在") @@ -226,7 +238,7 @@ func InventoryChangeList(c *gin.Context) { return } - resp, err := req.List() + resp, err := req.List(c) if err != nil { app.Error(c, http.StatusInternalServerError, err, "获取失败:"+err.Error()) return @@ -265,6 +277,13 @@ func InventoryChangeDetail(c *gin.Context) { return } + // 校验是否有入参门店权限 + err = models.AuthUserStore(c, changeOrder.StoreId) + if err != nil { + app.Error(c, http.StatusBadRequest, err, err.Error()) + return + } + // 校验时间,如果为01-01-01 08:05,则赋值为空 if changeOrder.MakerTime != nil && changeOrder.MakerTime.IsZero() { changeOrder.MakerTime = nil diff --git a/app/admin/apis/inventorymanage/product.go b/app/admin/apis/inventorymanage/product.go index cf44445..160f3f8 100644 --- a/app/admin/apis/inventorymanage/product.go +++ b/app/admin/apis/inventorymanage/product.go @@ -42,6 +42,13 @@ func ProductInventoryAdd(c *gin.Context) { return } + // 校验是否有入参门店权限 + err = models.AuthUserStore(c, req.StoreId) + if err != nil { + app.Error(c, http.StatusBadRequest, err, err.Error()) + return + } + inventoryProductOrder, err := models.AddProductInventory(req, sysUser) if err != nil { logger.Error("ProductInventoryAdd err:", logger.Field("err", err)) @@ -75,6 +82,13 @@ func ProductInventoryEdit(c *gin.Context) { return } + // 校验是否有入参门店权限 + err = models.AuthUserStore(c, req.StoreId) + if err != nil { + app.Error(c, http.StatusBadRequest, err, err.Error()) + return + } + inventoryProductOrder, err := models.EditProductInventory(req) if err != nil { logger.Error("ProductInventoryAdd err:", logger.Field("err", err)) @@ -102,14 +116,7 @@ func ProductInventoryAudit(c *gin.Context) { return } - sysUser, err := models.GetSysUserByCtx(c) - if err != nil { - logger.Error("sys user err:", logger.Field("err", err)) - app.Error(c, http.StatusInternalServerError, err, "操作失败") - return - } - - err = models.AuditProductInventory(req, sysUser) + err := models.AuditProductInventory(req, c) if err != nil { app.Error(c, http.StatusInternalServerError, err, "审核失败:"+err.Error()) return @@ -140,8 +147,6 @@ func ProductInventoryDelete(c *gin.Context) { return } - // todo 需要校验当前用户是否有权限 - var inventoryProductOrder models.ErpInventoryProductOrder err = orm.Eloquent.Table("erp_inventory_product_order").Where("serial_number = ?", req.SerialNumber). Find(&inventoryProductOrder).Error @@ -151,6 +156,13 @@ func ProductInventoryDelete(c *gin.Context) { return } + // 校验是否有入参门店权限 + err = models.AuthUserStore(c, inventoryProductOrder.StoreId) + if err != nil { + app.Error(c, http.StatusBadRequest, err, err.Error()) + return + } + if inventoryProductOrder.SerialNumber == "" { logger.Error("order is null") app.Error(c, http.StatusInternalServerError, err, "删除失败:订单不存在") @@ -219,7 +231,7 @@ func ProductInventoryList(c *gin.Context) { return } - resp, err := req.List() + resp, err := req.List(c) if err != nil { app.Error(c, http.StatusInternalServerError, err, "获取失败:"+err.Error()) return @@ -257,6 +269,13 @@ func ProductInventoryDetail(c *gin.Context) { return } + // 校验是否有入参门店权限 + err = models.AuthUserStore(c, productOrder.StoreId) + if err != nil { + app.Error(c, http.StatusBadRequest, err, err.Error()) + return + } + // 校验时间,如果为01-01-01 08:05,则赋值为空 if productOrder.MakerTime != nil && productOrder.MakerTime.IsZero() { productOrder.MakerTime = nil diff --git a/app/admin/apis/mallmanage/mall_goods.go b/app/admin/apis/mallmanage/mall_goods.go index 38547ea..23bbba1 100644 --- a/app/admin/apis/mallmanage/mall_goods.go +++ b/app/admin/apis/mallmanage/mall_goods.go @@ -445,7 +445,7 @@ func DeliverTaskList(c *gin.Context) { } req.StoreId = sysUser.StoreId fmt.Println("StoreId:", req.StoreId) - list, totalCount, err := req.List() + list, totalCount, err := req.List(c) if err != nil { logger.Errorf("err:%#v", err) msg := "获取发货列表失败" diff --git a/app/admin/apis/system/menu.go b/app/admin/apis/system/menu.go index 29f0526..f78c38f 100644 --- a/app/admin/apis/system/menu.go +++ b/app/admin/apis/system/menu.go @@ -154,7 +154,14 @@ func DeleteMenu(c *gin.Context) { // @Security Bearer func GetMenuRole(c *gin.Context) { var Menu models.Menu - result, err := Menu.SetMenuRole(tools.GetRoleName(c)) + var result []models.Menu + var err error + if tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员" { + result, err = Menu.SetAdminMenuRole() + } else { + result, err = Menu.SetMenuRole(tools.GetRoleName(c)) + } + tools.HasError(err, "获取失败", 500) app.OK(c, result, "") } diff --git a/app/admin/middleware/permission.go b/app/admin/middleware/permission.go index 80a41e4..a1fe12a 100644 --- a/app/admin/middleware/permission.go +++ b/app/admin/middleware/permission.go @@ -11,7 +11,7 @@ import ( "go-admin/tools" ) -// 权限检查中间件 +// AuthCheckRole 权限检查中间件 func AuthCheckRole() gin.HandlerFunc { return func(c *gin.Context) { data, _ := c.Get(jwtauth.JwtPayloadKey) diff --git a/app/admin/models/commodity.go b/app/admin/models/commodity.go index a7d4010..4321c6e 100644 --- a/app/admin/models/commodity.go +++ b/app/admin/models/commodity.go @@ -2377,7 +2377,7 @@ func (m *ErpStockCommodityListReq) buildQueryConditions(qs *gorm.DB) { } // SetStockCommodityState 更新库存状态 -func SetStockCommodityState(id uint32) error { //更新库存状态为5,并同步扣减库存数量 +func SetStockCommodityState(c *gin.Context, id uint32) error { //更新库存状态为5,并同步扣减库存数量 begin := orm.Eloquent.Begin() // 查询库存详情 @@ -2390,6 +2390,12 @@ func SetStockCommodityState(id uint32) error { //更新库存状态为5,并同 return err } + // 校验是否有入参门店权限 + err = AuthUserStore(c, commodityInfo.StoreId) + if err != nil { + return err + } + // 查询库存数据 var record ErpStock err = orm.Eloquent.Table("erp_stock"). diff --git a/app/admin/models/decision.go b/app/admin/models/decision.go index f4b5643..2c940e0 100644 --- a/app/admin/models/decision.go +++ b/app/admin/models/decision.go @@ -432,29 +432,28 @@ func getPurchaseReturnCount(req *ErpDecisionReportReq, stock ErpStock) (Decision func getSaleOutCount(req *ErpDecisionReportReq, stock ErpStock) (DecisionReportData, error) { var reportData DecisionReportData - qs := orm.Eloquent.Debug().Table("erp_stock_commodity") + qs := orm.Eloquent.Debug().Table("erp_order_commodity"). + Joins("JOIN erp_order ON erp_order_commodity.erp_order_id = erp_order.id") - // 进行条件查询 - if req.StartTime != "" { // 出入库开始时间 + if req.StartTime != "" { // 审核开始时间 parse, err := time.Parse(QueryTimeFormat, req.StartTime) if err != nil { - logger.Errorf("getSystemStartCount err:", err) - return DecisionReportData{}, err + logger.Errorf("err:", err) } - qs = qs.Where("updated_at > ?", parse) + qs = qs.Where("erp_order.audit_time > ?", parse) } - - if req.EndTime != "" { // 出入库结束时间 + if req.EndTime != "" { // 审核结束时间 parse, err := time.Parse(QueryTimeFormat, req.EndTime) if err != nil { - logger.Errorf("getSystemStartCount err:", err) - return DecisionReportData{}, err + logger.Errorf("err:", err) } - qs = qs.Where("updated_at > ?", parse) + qs = qs.Where("erp_order.audit_time < ?", parse) } - err := qs.Select("SUM(count) as order_sale").Where("state = ? and store_id = ? "+ - "and erp_commodity_id = ?", SoldOut, stock.StoreId, stock.ErpCommodityId).Find(&reportData).Error + err := qs.Select("count(*) as order_sale").Where("erp_order.retail_type = ? and erp_order.state = ? "+ + "and erp_order.store_id = ? and erp_order.pay_status = ? "+ + "and erp_order_commodity.erp_commodity_id = ?", + RetailTypeSale, ErpOrderStateAudited, stock.StoreId, HavePaid, stock.ErpCommodityId).Find(&reportData).Error if err != nil { return DecisionReportData{}, err } diff --git a/app/admin/models/erp_order.go b/app/admin/models/erp_order.go index feb999f..e1fa39e 100644 --- a/app/admin/models/erp_order.go +++ b/app/admin/models/erp_order.go @@ -116,12 +116,12 @@ type ErpOrderCommodity struct { RejectedCount uint32 `json:"rejected_count"` // 退货数量 RejectedAmount float64 `json:"rejected_amount"` // 退货金额 RejectedOrderCommodityId uint32 `json:"rejected_order_commodity_id"` // 退货订单商品id - StaffCostPrice int32 `json:"staff_cost_price"` // 员工成本价加价(如:加价50,不是加价后的价格) - WholesalePrice int32 `json:"wholesale_price"` // 指导采购价 + StaffCostPrice float64 `json:"staff_cost_price"` // 员工成本价加价(如:加价50,不是加价后的价格) + WholesalePrice float64 `json:"wholesale_price"` // 指导采购价 SalesProfit float64 `json:"sales_profit"` // 销售毛利:实际零售价-采购单价;如果为退货订单,则为实际退货价-采购单价 StaffProfit float64 `json:"staff_profit"` // 员工毛利:实际零售价-员工成本价;如果为退货订单,则为实际退货价-员工成本价 ErpStockCommodityID string `json:"erp_stock_commodity_id"` // 库存商品表主键id - StaffPrice int32 `json:"staff_price" gorm:"-"` // 员工成本价 + StaffPrice float64 `json:"staff_price" gorm:"-"` // 员工成本价 } // ErpOrderCashier 订单收款方式 @@ -1026,15 +1026,27 @@ func UpdateStock(gdb *gorm.DB, erpOrder ErpOrder, state, auditState int) error { event = VmEventErpOrderSale vmCount = tools.RoundFloat64(erpOrder.TotalAmount) - } else if erpOrder.RetailType == RetailTypeRejected { // 退货订单,扣减用户积分 - describe = "零售退货扣除积分" - event = VmEventErpOrderReject - vmCount = 0 - tools.RoundFloat64(erpOrder.TotalAmount) + } else if erpOrder.RetailType == RetailTypeRejected { // 退货订单,扣减用户积分(需校验购物时已积分,有则扣除) + var count int64 + err = orm.Eloquent.Table("user_vm_record").Where("erp_order_id = ?", erpOrder.SaleOrderId). + Count(&count).Error + if err != nil { + logger.Errorf("query user_vm_record error, erp_order_id is:", erpOrder.SaleOrderId) + } + + // 积过分才扣除 + if count > 0 { + describe = "零售退货扣除积分" + event = VmEventErpOrderReject + vmCount = 0 - tools.RoundFloat64(erpOrder.TotalAmount) + } else { + return nil + } } else { return nil } - err = UserVmUpdate(gdb, uint32(erpOrder.Uid), vmCount, event, describe) + err = UserVmUpdate(gdb, erpOrder.ID, uint32(erpOrder.Uid), vmCount, event, describe) if err != nil { logger.Errorf("err:", err) return err @@ -1161,8 +1173,8 @@ func (m *ErpOrder) SetRetailDetailCommodity() { orderCommodity.ErpSupplierId = stockCommodity.ErpSupplierId orderCommodity.ErpSupplierName = stockCommodity.ErpSupplierName - orderCommodity.WholesalePrice = int32(stockCommodity.WholesalePrice) - orderCommodity.StaffCostPrice = int32(stockCommodity.StaffCostPrice) + orderCommodity.WholesalePrice = stockCommodity.WholesalePrice + orderCommodity.StaffCostPrice = stockCommodity.StaffCostPrice orderCommodity.StaffPrice = orderCommodity.WholesalePrice + orderCommodity.StaffCostPrice respOrderCommodities = append(respOrderCommodities, orderCommodity) } @@ -1188,6 +1200,75 @@ func (m *ErpOrder) SetCommodity() { m.Commodities = orderCommodities } +// 添加订单的销售员信息 +func erpOrderListSetSalesmanByRetailDetail(userId uint32, list []ErpOrder) { + for i, _ := range list { + _ = list[i].SetOrderSalesmanRetailDetail(userId) + } +} + +func (m *ErpOrder) SetOrderSalesmanRetailDetail(userId uint32) error { + var salesProfit, staffProfit, totalStaffProfit float64 + //获取销售毛利、员工毛利数据 + for _, item := range m.Commodities { + erpCommodity, err := GetCommodity(item.ErpCommodityId) + if err != nil { + logger.Error("GetCommodity err:", logger.Field("err", err)) + } + salesProfit += item.SalesProfit * erpCommodity.Brokerage1 * 0.01 + staffProfit += item.StaffProfit * erpCommodity.Brokerage2 * 0.01 + totalStaffProfit += item.StaffProfit + } + // 四舍五入并保留两位小数 + salesProfit = math.Round(salesProfit*100) / 100 + staffProfit = math.Round(staffProfit*100) / 100 + totalStaffProfit = math.Round(totalStaffProfit*100) / 100 + + var salesmanInfo []ErpOrderSales + err := orm.Eloquent.Model(&ErpOrderSales{}).Where("erp_order_id = ?", m.ID).Find(&salesmanInfo).Error + if err != nil { + return err + } + + var salesmanList []ErpOrderSales + for _, item := range salesmanInfo { + item.SalesProfitPer = salesProfit / float64(len(salesmanInfo)) + item.StaffProfitPer = staffProfit / float64(len(salesmanInfo)) + + // 获取员工毛利 + userInfo, err := GetSysUserInfoById(item.Uid) + if err != nil { + logger.Error("GetSysUserInfoByUid err:", logger.Field("err", err)) + } + item.Name = userInfo.NickName + item.SalesmanPer = totalStaffProfit * userInfo.SalesCommRate * 0.01 / float64(len(salesmanInfo)) + + //if m.RetailType == RetailTypeRejected { + // item.SalesProfitPer = -item.SalesProfitPer + // item.StaffProfitPer = -item.StaffProfitPer + // item.SalesmanPer = -item.SalesmanPer + //} + + if userId != item.Uid { + item.SalesProfitPer = 0 + item.StaffProfitPer = 0 + item.SalesmanPer = 0 + } + + salesmanList = append(salesmanList, item) + } + + if len(salesmanList) == 0 { + m.Salesman = []ErpOrderSales{} + } else { + m.Salesman = salesmanList + } + + m.SalesmanList = "" + + return nil +} + // 添加订单的销售员信息 func erpOrderListSetSalesman(list []ErpOrder) { for i, _ := range list { @@ -1264,7 +1345,7 @@ func (m *ErpOrder) SetSalesman() { } func (m *ErpOrderCreateReq) GetSalesmanList() (string, error) { - var salesProfit, staffProfit float64 + var salesProfit, staffProfit, totalStaffProfit float64 //获取销售毛利、员工毛利数据 for _, item := range m.ErpOrderCommodities { erpCommodity, err := GetCommodity(item.ErpCommodityId) @@ -1273,10 +1354,12 @@ func (m *ErpOrderCreateReq) GetSalesmanList() (string, error) { } salesProfit += item.SalesProfit * erpCommodity.Brokerage1 * 0.01 staffProfit += item.StaffProfit * erpCommodity.Brokerage2 * 0.01 + totalStaffProfit += item.StaffProfit } // 四舍五入并保留两位小数 salesProfit = math.Round(salesProfit*100) / 100 staffProfit = math.Round(staffProfit*100) / 100 + totalStaffProfit = math.Round(totalStaffProfit*100) / 100 var salesmanList []ErpOrderSales for _, item := range m.Salesman { @@ -1289,7 +1372,8 @@ func (m *ErpOrderCreateReq) GetSalesmanList() (string, error) { logger.Error("GetSysUserInfoByUid err:", logger.Field("err", err)) } item.Name = userInfo.NickName - item.SalesmanPer = staffProfit * userInfo.SalesCommRate / float64(len(m.Salesman)) + //item.SalesmanPer = staffProfit * userInfo.SalesCommRate * 0.01 / float64(len(m.Salesman)) + item.SalesmanPer = totalStaffProfit * userInfo.SalesCommRate * 0.01 / float64(len(m.Salesman)) salesmanList = append(salesmanList, item) } @@ -3147,23 +3231,30 @@ func queryRetailDetailCommon(req *ErpOrderRetailDetailReq, c *gin.Context) (*Erp } qs := orm.Eloquent.Table("erp_order") + totalPerQs := orm.Eloquent.Table("erp_order") if showConfig.ShowAll == "OFF" { qs = qs.Where("is_print = ? or retail_type = ?", HavePrinted, RetailTypeRejected) + totalPerQs = totalPerQs.Where("is_print = ? or retail_type = ?", HavePrinted, RetailTypeRejected) } if req.BillSn != "" { // 订单编号 qs = qs.Where("bill_sn=?", req.BillSn) + totalPerQs = totalPerQs.Where("bill_sn=?", req.BillSn) } else { if req.RetailType != "" { // 销售类型 qs = qs.Where("retail_type=?", req.RetailType) + totalPerQs = totalPerQs.Where("retail_type=?", req.RetailType) } if req.Uid != 0 { // 用户ID qs = qs.Where("erp_order.uid=?", req.Uid) + totalPerQs = totalPerQs.Where("erp_order.uid=?", req.Uid) } if req.Tel != "" { // 用户手机号 qs = qs.Where("tel=?", req.Tel) + totalPerQs = totalPerQs.Where("tel=?", req.Tel) } if req.StoreId != 0 { // 门店ID qs = qs.Where("store_id=?", req.StoreId) + totalPerQs = totalPerQs.Where("store_id=?", req.StoreId) } // 非管理员才判断所属门店 if !(tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员") { @@ -3177,8 +3268,10 @@ func queryRetailDetailCommon(req *ErpOrderRetailDetailReq, c *gin.Context) (*Erp if len(storeList) > 0 { if len(storeList) == 1 { qs = qs.Where("store_id = ?", storeList[0]) + totalPerQs = totalPerQs.Where("store_id = ?", storeList[0]) } else { qs = qs.Where("store_id IN (?)", storeList) + totalPerQs = totalPerQs.Where("store_id IN (?)", storeList) } } else { return nil, errors.New("用户未绑定门店") @@ -3186,6 +3279,7 @@ func queryRetailDetailCommon(req *ErpOrderRetailDetailReq, c *gin.Context) (*Erp } if req.Salesman != 0 { // 销售员 qs = qs.Where("JSON_CONTAINS(salesman_list, ?)", fmt.Sprintf(`{"userId":%d}`, req.Salesman)) + totalPerQs = totalPerQs.Where("erp_order_sales.uid = ?", req.Salesman) } if req.StartTime != "" { // 审核开始时间 parse, err := time.Parse(QueryTimeFormat, req.StartTime) @@ -3193,6 +3287,7 @@ func queryRetailDetailCommon(req *ErpOrderRetailDetailReq, c *gin.Context) (*Erp logger.Errorf("err:", err) } qs = qs.Where("audit_time > ?", parse) + totalPerQs = totalPerQs.Where("audit_time > ?", parse) } if req.EndTime != "" { // 审核结束时间 parse, err := time.Parse(QueryTimeFormat, req.EndTime) @@ -3201,11 +3296,15 @@ func queryRetailDetailCommon(req *ErpOrderRetailDetailReq, c *gin.Context) (*Erp } //parse = parse.AddDate(0, 0, 1) qs = qs.Where("audit_time < ?", parse) + totalPerQs = totalPerQs.Where("audit_time < ?", parse) } } qs.Where("erp_order.pay_status = ? or (erp_order.retail_type = ? and erp_order.state != ?)", HavePaid, RetailTypeRejected, ErpOrderStateUnAudit) + totalPerQs.Where("erp_order.pay_status = ? or (erp_order.retail_type = ? and erp_order.state != ?)", + HavePaid, RetailTypeRejected, ErpOrderStateUnAudit) es := qs + rejectedTotalPerQs := totalPerQs // 销售订单的汇总数据 orderSumQs := qs @@ -3228,7 +3327,6 @@ func queryRetailDetailCommon(req *ErpOrderRetailDetailReq, c *gin.Context) (*Erp // 销售订单提成汇总 var totalPerData TotalPerData - totalPerQs := qs totalPerData, err = getTotalPerData(totalPerQs, RetailTypeSale) if err != nil { logger.Error("query erp_order_sales sum data err:", logger.Field("err", err)) @@ -3236,7 +3334,6 @@ func queryRetailDetailCommon(req *ErpOrderRetailDetailReq, c *gin.Context) (*Erp } // 退货订单提成汇总 var rejectedTotalPerData TotalPerData - rejectedTotalPerQs := qs rejectedTotalPerData, err = getTotalPerData(rejectedTotalPerQs, RetailTypeRejected) if err != nil { logger.Error("query erp_order_sales sum data err:", logger.Field("err", err)) @@ -3309,7 +3406,7 @@ func queryRetailDetailCommon(req *ErpOrderRetailDetailReq, c *gin.Context) (*Erp // 添加付款、销售员、商品信息 ErpOrderRetailDetailSetCommodity(orders) erpOrderListSetCashier(orders) - erpOrderListSetSalesman(orders) + erpOrderListSetSalesmanByRetailDetail(req.Salesman, orders) resp.List = orders @@ -3819,6 +3916,26 @@ func CheckUserStore(userStoreId uint32, sysUser *SysUser) bool { return false } +// AuthUserStore 校验是否有某个门店的权限 +func AuthUserStore(c *gin.Context, storeId uint32) error { + // 非管理员才判断所属门店 + if !(tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员") { + sysUser, err := GetSysUserByCtx(c) + if err != nil { + return err + } + + // 校验入参门店是否包含在用户所有门店中,是否过期 + if !(tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员") { + if !CheckUserStore(storeId, sysUser) { + return errors.New("操作失败:您没有该门店权限") + } + } + } + + return nil +} + // checkOrderData 校验订单数据 func checkOrderData(req *ErpOrderCreateReq, c *gin.Context) (*ErpOrder, error) { sysUser, err := GetSysUserByCtx(c) @@ -3832,6 +3949,7 @@ func checkOrderData(req *ErpOrderCreateReq, c *gin.Context) (*ErpOrder, error) { } } + var rejectedOrderSaleId uint32 if req.RetailType == RetailTypeSale { // 校验商品是否有库存,是否是对应门店库存商品 err = checkOrderCommodityStock(req) @@ -3839,7 +3957,7 @@ func checkOrderData(req *ErpOrderCreateReq, c *gin.Context) (*ErpOrder, error) { return nil, err } } else { // 零售退货单,需校验退货商品是否是本门店售卖商品,同一个退货单中只能添加同一销售订单的商品 - err = checkRejectedOrderRule(req) + rejectedOrderSaleId, err = checkRejectedOrderRule(req) if err != nil { return nil, err } @@ -3885,6 +4003,10 @@ func checkOrderData(req *ErpOrderCreateReq, c *gin.Context) (*ErpOrder, error) { VmCount: req.VmAmount, } + if req.RetailType == RetailTypeRejected { + erpOrder.SaleOrderId = rejectedOrderSaleId + } + commodityMap := make(map[uint32]ErpStockCommodity) imeiCommodityMap := make(map[string]ErpStockCommodity) if req.RetailType == RetailTypeSale { // 零售订单,查商品表信息 @@ -4038,16 +4160,16 @@ func checkOrderData(req *ErpOrderCreateReq, c *gin.Context) (*ErpOrder, error) { } req.ErpOrderCommodities[i].ID = 0 - req.ErpOrderCommodities[i].ErpCommodityId = v.ErpCommodityId // 商品id - req.ErpOrderCommodities[i].ErpCommodityName = v.ErpCommodityName // 商品名称 - req.ErpOrderCommodities[i].ErpCategoryId = v.ErpCategoryId // 分类id - req.ErpOrderCommodities[i].ErpCategoryName = v.ErpCategoryName // 分类名称 - req.ErpOrderCommodities[i].ErpSupplierId = v.ErpSupplierId // 供应商id - req.ErpOrderCommodities[i].ErpSupplierName = v.ErpSupplierName // 供应商名称 - req.ErpOrderCommodities[i].RetailPrice = v.RetailPrice // 指导零售价 - req.ErpOrderCommodities[i].MemberDiscount = v.MemberDiscount // 会员优惠 - req.ErpOrderCommodities[i].StaffCostPrice = int32(v.StaffCostPrice) // 员工成本价加价 - req.ErpOrderCommodities[i].WholesalePrice = int32(v.WholesalePrice) // 指导采购价 + req.ErpOrderCommodities[i].ErpCommodityId = v.ErpCommodityId // 商品id + req.ErpOrderCommodities[i].ErpCommodityName = v.ErpCommodityName // 商品名称 + req.ErpOrderCommodities[i].ErpCategoryId = v.ErpCategoryId // 分类id + req.ErpOrderCommodities[i].ErpCategoryName = v.ErpCategoryName // 分类名称 + req.ErpOrderCommodities[i].ErpSupplierId = v.ErpSupplierId // 供应商id + req.ErpOrderCommodities[i].ErpSupplierName = v.ErpSupplierName // 供应商名称 + req.ErpOrderCommodities[i].RetailPrice = v.RetailPrice // 指导零售价 + req.ErpOrderCommodities[i].MemberDiscount = v.MemberDiscount // 会员优惠 + req.ErpOrderCommodities[i].StaffCostPrice = v.StaffCostPrice // 员工成本价加价 + req.ErpOrderCommodities[i].WholesalePrice = v.WholesalePrice // 指导采购价 if req.ErpOrderCommodities[i].PresentType == 2 && v.MinRetailPrice != 0 { // 赠送类型商品进行校验,最低零售价为0才能赠送 logger.Error("PresentType is 2, MinRetailPrice no equal 0") @@ -4208,23 +4330,103 @@ func checkOrderCommodityStock(req *ErpOrderCreateReq) error { } // 退货校验 -// (1)校验商品是否是当前用户购买 -// (2)校验退货商品是否是本门店售卖商品 -// (3)同一个退货单中只能添加同一销售订单的商品 -func checkRejectedOrderRule(req *ErpOrderCreateReq) error { +// (1)校验退货商品销售时的手机号与当前填写的手机号是否相同,不匹配报错:所退商品的历史订单手机号与当前不符。 +// (2)校验商品是否是当前用户购买 +// (3)校验退货商品是否是本门店售卖商品 +// (4)同一个退货单中只能添加同一销售订单的商品 +func checkRejectedOrderRule(req *ErpOrderCreateReq) (uint32, error) { if req.RetailType != RetailTypeRejected { - return nil + return 0, errors.New("订单类型有误,非退货订单") } if len(req.ErpOrderCommodities) == 0 { - return errors.New("未添加退货商品") + return 0, errors.New("未添加退货商品") } - //for _, item := range req.ErpOrderCommodities { - // // 查询退货商品之前的销售情况 - //} + var salesId uint32 + rejectOrderSalesMap := make(map[string]bool) + for _, item := range req.ErpOrderCommodities { + // 查询退货商品之前的销售情况 + if item.IMEIType == NoIMEICommodity { //非串码商品 + var commodities []ErpOrderCommodity + err := orm.Eloquent.Table("erp_order_commodity"). + Joins("JOIN erp_order ON erp_order_commodity.erp_order_id = erp_order.id "). + Where("erp_order_commodity.erp_commodity_id = ? and erp_order.store_id = ? "+ + "and erp_order.retail_type = ? and erp_order.pay_status = ? and erp_order.tel = ?", + item.ErpCommodityId, req.StoreId, RetailTypeSale, HavePaid, req.Tel). + Find(&commodities).Order("audit_time DESC").Error + if err != nil { + logger.Error("query erp_order_commodity err:", logger.Field("err", err)) + return 0, errors.New("操作失败:" + err.Error()) + } - return nil + if len(commodities) == 0 { + return 0, errors.New(fmt.Sprintf("未查询到商品[%s]销售情况", item.ErpCommodityName)) + } + + var orderInfo ErpOrder + err = orm.Eloquent.Table("erp_order").Where("id = ?", commodities[0].ErpOrderId). + Find(&orderInfo).Error + if err != nil { + logger.Error("query erp_order err:", logger.Field("err", err)) + return 0, errors.New("操作失败:" + err.Error()) + } + if orderInfo.BillSn == "" { + return 0, errors.New(fmt.Sprintf("未查询到商品[%s]销售订单", item.ErpCommodityName)) + } + + rejectOrderSalesMap[orderInfo.BillSn] = true + if len(rejectOrderSalesMap) > 1 { + return 0, errors.New("只可添加相同零售订单的商品") + } + salesId = orderInfo.ID + } else { // 串码商品 + if item.IMEI == "" { + return 0, errors.New("退货商品串码为空") + } + var commodities []ErpOrderCommodity + err := orm.Eloquent.Table("erp_order_commodity"). + Joins("JOIN erp_order ON erp_order_commodity.erp_order_id = erp_order.id "). + Where("erp_order_commodity.imei = ? and erp_order.retail_type = ? and erp_order.pay_status = ?", + item.IMEI, RetailTypeSale, HavePaid). + Find(&commodities).Order("audit_time DESC").Error + if err != nil { + logger.Error("query erp_order_commodity err:", logger.Field("err", err)) + return 0, errors.New("操作失败:" + err.Error()) + } + + if len(commodities) == 0 { + return 0, errors.New(fmt.Sprintf("未查询到商品[%s]销售情况", item.ErpCommodityName)) + } + + var orderInfo ErpOrder + err = orm.Eloquent.Table("erp_order").Where("id = ?", commodities[0].ErpOrderId). + Find(&orderInfo).Error + if err != nil { + logger.Error("query erp_order err:", logger.Field("err", err)) + return 0, errors.New("操作失败:" + err.Error()) + } + if orderInfo.BillSn == "" { + return 0, errors.New(fmt.Sprintf("未查询到商品[%s]销售订单", item.ErpCommodityName)) + } + + if orderInfo.Tel != req.Tel { + return 0, errors.New(fmt.Sprintf("所退商品[%s]的历史订单手机号与当前不符", item.ErpCommodityName)) + } + + if orderInfo.StoreId != req.StoreId { + return 0, errors.New(fmt.Sprintf("[%s]非当前门店所售商品,需前往对应门店退货", item.ErpCommodityName)) + } + + rejectOrderSalesMap[orderInfo.BillSn] = true + if len(rejectOrderSalesMap) > 1 { + return 0, errors.New("只可添加相同零售订单的商品") + } + salesId = orderInfo.ID + } + } + + return salesId, nil } // updateCommodityData 更新订单商品信息 diff --git a/app/admin/models/game_card.go b/app/admin/models/game_card.go index da87171..23d47e4 100644 --- a/app/admin/models/game_card.go +++ b/app/admin/models/game_card.go @@ -2198,7 +2198,7 @@ func (m *CooperativeGameCardStockReq) List() (*CooperativeGameCardStockResp, err return resp, nil } -func GameCardStockList(name string, sortType, sortDirection, storeId, pageNum, pageSize uint32) (*GameCardStockListResp, error) { +func GameCardStockList(name string, sortType, sortDirection, storeId, pageNum, pageSize uint32, c *gin.Context) (*GameCardStockListResp, error) { resp := &GameCardStockListResp{PageIndex: pageNum} type GameCardCount struct { CountGame uint32 `json:"count_game"` @@ -2226,6 +2226,7 @@ func GameCardStockList(name string, sortType, sortDirection, storeId, pageNum, p if storeId != 0 { sqlStore = fmt.Sprintf(" AND store_id = %d", storeId) } + if name != "" { var gameCards []GameCard sqlName := "SELECT * FROM game_card WHERE `name` LIKE '%" + name + "%';" diff --git a/app/admin/models/inventory_allot.go b/app/admin/models/inventory_allot.go index 8f15556..25468af 100644 --- a/app/admin/models/inventory_allot.go +++ b/app/admin/models/inventory_allot.go @@ -3,8 +3,10 @@ package models import ( "errors" "fmt" + "github.com/gin-gonic/gin" orm "go-admin/common/global" "go-admin/logger" + "go-admin/tools" "gorm.io/gorm" "math/rand" "time" @@ -433,7 +435,7 @@ func updateAllotCommodityData(gdb *gorm.DB, orderId uint32, req *InventoryAllotE } // List 查询采购订单列表 -func (m *InventoryAllotListReq) List() (*InventoryAllotListResp, error) { +func (m *InventoryAllotListReq) List(c *gin.Context) (*InventoryAllotListResp, error) { resp := &InventoryAllotListResp{ PageIndex: m.PageIndex, PageSize: m.PageSize, @@ -446,6 +448,41 @@ func (m *InventoryAllotListReq) List() (*InventoryAllotListResp, error) { m.PageSize = 10 } qs := orm.Eloquent.Table("erp_inventory_allot_order") + + // 非管理员才判断所属门店 + if !(tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员") { + sysUser, err := GetSysUserByCtx(c) + if err != nil { + return nil, err + } + + // 返回sysUser未过期的门店id列表 + storeList := GetValidStoreIDs(sysUser.StoreData) + if m.DeliverStoreId != 0 || m.ReceiveStoreId != 0 { + if m.DeliverStoreId != 0 { + if !Contains(storeList, m.DeliverStoreId) { + return nil, errors.New("您没有该门店权限") + } + } + + if m.ReceiveStoreId != 0 { + if !Contains(storeList, m.ReceiveStoreId) { + return nil, errors.New("您没有该门店权限") + } + } + } else { + if len(storeList) > 0 { + if len(storeList) == 1 { + qs = qs.Where("deliver_store_id = ? or receive_store_id=?", storeList[0], storeList[0]) + } else { + qs = qs.Where("deliver_store_id IN (?) or receive_store_id IN (?)", storeList, storeList) + } + } else { + return nil, errors.New("用户未绑定门店") + } + } + } + if m.SerialNumber != "" { qs = qs.Where("serial_number=?", m.SerialNumber) } else { @@ -509,7 +546,7 @@ func (m *InventoryAllotListReq) List() (*InventoryAllotListResp, error) { } // AuditAllotInventory 审核库存调拨入库 state:1-审核,2-取消审核 -func AuditAllotInventory(req *InventoryAllotAuditReq, sysUser *SysUser) error { +func AuditAllotInventory(req *InventoryAllotAuditReq, c *gin.Context) error { // 查询订单信息 var inventoryAllotOrder ErpInventoryAllotOrder err := orm.Eloquent.Table("erp_inventory_allot_order").Where("serial_number = ?", req.SerialNumber). @@ -519,6 +556,19 @@ func AuditAllotInventory(req *InventoryAllotAuditReq, sysUser *SysUser) error { return err } + sysUser, err := GetSysUserByCtx(c) + if err != nil { + logger.Error("sys user err:", logger.Field("err", err)) + return err + } + + // 校验入参门店是否包含在用户所有门店中,是否过期 + if !(tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员") { + if !CheckUserStore(inventoryAllotOrder.DeliverStoreId, sysUser) { + return errors.New("操作失败:您没有该门店权限") + } + } + if inventoryAllotOrder.ID == 0 { return errors.New("未查询到订单信息") } @@ -889,7 +939,7 @@ func cancelAllotAuditAndUpdateStock(gdb *gorm.DB, allotOrder ErpInventoryAllotOr } // DeliverAllotInventory 调拨发货 -func DeliverAllotInventory(req *InventoryAllotDeliverReq) error { +func DeliverAllotInventory(req *InventoryAllotDeliverReq, c *gin.Context) error { // 查询订单信息 var inventoryAllotOrder ErpInventoryAllotOrder err := orm.Eloquent.Table("erp_inventory_allot_order").Where("serial_number = ?", req.SerialNumber). @@ -899,6 +949,19 @@ func DeliverAllotInventory(req *InventoryAllotDeliverReq) error { return err } + sysUser, err := GetSysUserByCtx(c) + if err != nil { + logger.Error("sys user err:", logger.Field("err", err)) + return err + } + + // 校验入参门店是否包含在用户所有门店中,是否过期 + if !(tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员") { + if !CheckUserStore(inventoryAllotOrder.DeliverStoreId, sysUser) { + return errors.New("操作失败:您没有该门店权限") + } + } + if inventoryAllotOrder.ID == 0 { return errors.New("未查询到订单信息") } @@ -923,7 +986,7 @@ func DeliverAllotInventory(req *InventoryAllotDeliverReq) error { } // ReceiveAllotInventory 调拨收货 -func ReceiveAllotInventory(req *InventoryAllotReceiveReq) error { +func ReceiveAllotInventory(req *InventoryAllotReceiveReq, c *gin.Context) error { // 查询订单信息 var inventoryAllotOrder ErpInventoryAllotOrder if err := orm.Eloquent.Table("erp_inventory_allot_order").Where("serial_number = ?", req.SerialNumber). @@ -931,6 +994,20 @@ func ReceiveAllotInventory(req *InventoryAllotReceiveReq) error { logger.Error("order err:", logger.Field("err", err)) return err } + + sysUser, err := GetSysUserByCtx(c) + if err != nil { + logger.Error("sys user err:", logger.Field("err", err)) + return err + } + + // 校验入参门店是否包含在用户所有门店中,是否过期 + if !(tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员") { + if !CheckUserStore(inventoryAllotOrder.ReceiveStoreId, sysUser) { + return errors.New("操作失败:您没有该门店权限") + } + } + if inventoryAllotOrder.ID == 0 { return errors.New("未查询到订单信息") } @@ -991,7 +1068,7 @@ func ReceiveAllotInventory(req *InventoryAllotReceiveReq) error { nowTime := time.Now() inventoryAllotOrder.State = ErpInventoryAllotOrderFinished inventoryAllotOrder.ReceiveTime = &nowTime - err := begin.Model(&ErpInventoryAllotOrder{}).Where("id = ?", inventoryAllotOrder.ID). + err = begin.Model(&ErpInventoryAllotOrder{}).Where("id = ?", inventoryAllotOrder.ID). Updates(inventoryAllotOrder).Error if err != nil { begin.Rollback() diff --git a/app/admin/models/inventory_change.go b/app/admin/models/inventory_change.go index aa3d955..b89bb8a 100644 --- a/app/admin/models/inventory_change.go +++ b/app/admin/models/inventory_change.go @@ -3,6 +3,7 @@ package models import ( "errors" "fmt" + "github.com/gin-gonic/gin" orm "go-admin/common/global" "go-admin/logger" "go-admin/tools" @@ -417,7 +418,7 @@ func updateChangeCommodityData(gdb *gorm.DB, orderId uint32, req *InventoryChang } // List 查询采购订单列表 -func (m *InventoryChangeListReq) List() (*InventoryChangeListResp, error) { +func (m *InventoryChangeListReq) List(c *gin.Context) (*InventoryChangeListResp, error) { resp := &InventoryChangeListResp{ PageIndex: m.PageIndex, PageSize: m.PageSize, @@ -430,6 +431,33 @@ func (m *InventoryChangeListReq) List() (*InventoryChangeListResp, error) { m.PageSize = 10 } qs := orm.Eloquent.Table("erp_inventory_change_order") + + // 非管理员才判断所属门店 + if !(tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员") { + sysUser, err := GetSysUserByCtx(c) + if err != nil { + return nil, err + } + + // 返回sysUser未过期的门店id列表 + storeList := GetValidStoreIDs(sysUser.StoreData) + if m.StoreId != 0 { + if !Contains(storeList, m.StoreId) { + return nil, errors.New("您没有该门店权限") + } + } else { + if len(storeList) > 0 { + if len(storeList) == 1 { + qs = qs.Where("store_id = ?", storeList[0]) + } else { + qs = qs.Where("store_id IN (?)", storeList) + } + } else { + return nil, errors.New("用户未绑定门店") + } + } + } + if m.SerialNumber != "" { qs = qs.Where("serial_number=?", m.SerialNumber) } else { @@ -493,7 +521,7 @@ func (m *InventoryChangeListReq) List() (*InventoryChangeListResp, error) { } // AuditChangeInventory 审核库存变动入库 state:1-审核,2-取消审核 -func AuditChangeInventory(req *InventoryChangeAuditReq, sysUser *SysUser) error { +func AuditChangeInventory(req *InventoryChangeAuditReq, c *gin.Context) error { // 查询订单信息 var inventoryChangeOrder ErpInventoryChangeOrder err := orm.Eloquent.Table("erp_inventory_change_order").Where("serial_number = ?", req.SerialNumber). @@ -503,6 +531,18 @@ func AuditChangeInventory(req *InventoryChangeAuditReq, sysUser *SysUser) error return err } + sysUser, err := GetSysUserByCtx(c) + if err != nil { + logger.Error("sys user err:", logger.Field("err", err)) + return err + } + + // 校验是否有入参门店权限 + err = AuthUserStore(c, inventoryChangeOrder.StoreId) + if err != nil { + return err + } + if inventoryChangeOrder.ID == 0 { return errors.New("未查询到订单信息") } diff --git a/app/admin/models/inventory_product.go b/app/admin/models/inventory_product.go index 1024246..ceb9465 100644 --- a/app/admin/models/inventory_product.go +++ b/app/admin/models/inventory_product.go @@ -3,6 +3,7 @@ package models import ( "errors" "fmt" + "github.com/gin-gonic/gin" orm "go-admin/common/global" "go-admin/logger" "go-admin/tools" @@ -430,7 +431,7 @@ func updateProductCommodityData(gdb *gorm.DB, orderId uint32, req *ProductInvent } // AuditProductInventory 审核产品入库 state:1-审核,2-取消审核 -func AuditProductInventory(req *ProductInventoryAuditReq, sysUser *SysUser) error { +func AuditProductInventory(req *ProductInventoryAuditReq, c *gin.Context) error { // 查询订单信息 var inventoryProductOrder ErpInventoryProductOrder err := orm.Eloquent.Table("erp_inventory_product_order").Where("serial_number = ?", req.SerialNumber). @@ -440,6 +441,17 @@ func AuditProductInventory(req *ProductInventoryAuditReq, sysUser *SysUser) erro return err } + sysUser, err := GetSysUserByCtx(c) + if err != nil { + return err + } + + // 校验是否有入参门店权限 + err = AuthUserStore(c, inventoryProductOrder.StoreId) + if err != nil { + return err + } + begin := orm.Eloquent.Begin() // 判断入参state:1-审核,2-取消审核 @@ -676,7 +688,7 @@ func productAuditAndUpdateStock(gdb *gorm.DB, productOrder ErpInventoryProductOr } // List 查询采购订单列表 -func (m *ProductInventoryListReq) List() (*ProductInventoryListResp, error) { +func (m *ProductInventoryListReq) List(c *gin.Context) (*ProductInventoryListResp, error) { resp := &ProductInventoryListResp{ PageIndex: m.PageIndex, PageSize: m.PageSize, @@ -689,6 +701,33 @@ func (m *ProductInventoryListReq) List() (*ProductInventoryListResp, error) { m.PageSize = 10 } qs := orm.Eloquent.Table("erp_inventory_product_order") + + // 非管理员才判断所属门店 + if !(tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员") { + sysUser, err := GetSysUserByCtx(c) + if err != nil { + return nil, err + } + + // 返回sysUser未过期的门店id列表 + storeList := GetValidStoreIDs(sysUser.StoreData) + if m.StoreId != 0 { + if !Contains(storeList, m.StoreId) { + return nil, errors.New("您没有该门店权限") + } + } else { + if len(storeList) > 0 { + if len(storeList) == 1 { + qs = qs.Where("store_id = ?", storeList[0]) + } else { + qs = qs.Where("store_id IN (?)", storeList) + } + } else { + return nil, errors.New("用户未绑定门店") + } + } + } + if m.SerialNumber != "" { qs = qs.Where("serial_number=?", m.SerialNumber) } else { diff --git a/app/admin/models/mall.go b/app/admin/models/mall.go index 6383220..e3adf5e 100644 --- a/app/admin/models/mall.go +++ b/app/admin/models/mall.go @@ -4,10 +4,12 @@ import ( "encoding/json" "errors" "fmt" + "github.com/gin-gonic/gin" "github.com/rs/zerolog/log" utils "go-admin/app/admin/models/tools" orm "go-admin/common/global" "go-admin/logger" + "go-admin/tools" "gorm.io/gorm" "sort" "strconv" @@ -1159,7 +1161,7 @@ func (r *GoodsOrderRefundSendReceiveReq) Receive() error { } if goodsOrder.Vm != 0 { - err = UserVmUpdate(nil, goodsOrder.Uid, int(goodsOrder.Vm), VmEventBuyGoods, "购买商品积分抵扣取消") + err = UserVmUpdate(nil, 0, goodsOrder.Uid, int(goodsOrder.Vm), VmEventBuyGoods, "购买商品积分抵扣取消") if err != nil { logger.Errorf("update user vm err:", err) return err @@ -1293,7 +1295,7 @@ type DeliverTaskReq struct { StoreId uint32 `json:"store_id"` } -func (m *DeliverTaskReq) List() ([]DeliverTask, int64, error) { +func (m *DeliverTaskReq) List(c *gin.Context) ([]DeliverTask, int64, error) { page := m.PageIdx - 1 if page < 0 { page = 0 @@ -1304,6 +1306,33 @@ func (m *DeliverTaskReq) List() ([]DeliverTask, int64, error) { var list []DeliverTask qs := orm.Eloquent.Table("deliver_task") + + // 非管理员才判断所属门店 + if !(tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员") { + sysUser, err := GetSysUserByCtx(c) + if err != nil { + return nil, 0, err + } + + // 返回sysUser未过期的门店id列表 + storeList := GetValidStoreIDs(sysUser.StoreData) + if m.StoreId != 0 { + if !Contains(storeList, uint32(m.StoreId)) { + return nil, 0, errors.New("您没有该门店权限") + } + } else { + if len(storeList) > 0 { + if len(storeList) == 1 { + qs = qs.Where("store_id = ?", storeList[0]) + } else { + qs = qs.Where("store_id IN (?)", storeList) + } + } else { + return nil, 0, errors.New("用户未绑定门店") + } + } + } + if m.State != "" { qs = qs.Where("state=?", m.State) } diff --git a/app/admin/models/menu.go b/app/admin/models/menu.go index 46aa915..e21116c 100644 --- a/app/admin/models/menu.go +++ b/app/admin/models/menu.go @@ -207,6 +207,25 @@ func (e *Menu) SetMenuRole(rolename string) (m []Menu, err error) { return } +func (e *Menu) SetAdminMenuRole() (m []Menu, err error) { + var menulist []Menu + table := orm.Eloquent.Table(e.TableName()).Select("sys_menu.*").Where("menu_type in ('M','C')") + if err = table.Order("sort").Find(&menulist).Error; err != nil { + return + } + + m = make([]Menu, 0) + for i := 0; i < len(menulist); i++ { + if menulist[i].ParentId != 0 { + continue + } + menusInfo := DiguiMenu(&menulist, menulist[i]) + + m = append(m, menusInfo) + } + return +} + func (e *MenuRole) Get() (Menus []MenuRole, err error) { table := orm.Eloquent.Table(e.TableName()) if e.MenuName != "" { diff --git a/app/admin/models/share_card.go b/app/admin/models/share_card.go index 2ba83d4..69fffa7 100644 --- a/app/admin/models/share_card.go +++ b/app/admin/models/share_card.go @@ -993,7 +993,7 @@ func ShareCardUserVmRecord() { shareCardDateVm.TotalVm += shareCardDateVm.Vm //fmt.Println("shareCardDateVm:", shareCardDateVm) - err = UserVmUpdate(nil, shareCardDateVm.Uid, int(shareCardDateVm.Vm), VmEventUserShareCard, "用户共享卡收益") + err = UserVmUpdate(nil, 0, shareCardDateVm.Uid, int(shareCardDateVm.Vm), VmEventUserShareCard, "用户共享卡收益") //err = UserVmUpdate(shareCardDateVm.Uid, int(shareCardDateVm.TotalVm), VmEventUserShareCard, "用户共享卡收益") if err != nil { logger.Error("user vm update err:", logger.Field("err", err)) diff --git a/app/admin/models/user_vm.go b/app/admin/models/user_vm.go index 0dbe1e2..17ea661 100644 --- a/app/admin/models/user_vm.go +++ b/app/admin/models/user_vm.go @@ -37,16 +37,17 @@ type UserVm struct { type UserVmRecord struct { Model - Uid uint32 `json:"uid" gorm:"column:uid;unique_index"` // 用户ID - BeforeVm uint32 `json:"before_vm"` // 变动前 - AfterVm uint32 `json:"after_vm"` // 变动后 - Alter int `json:"alter"` // 数值 - Event string `json:"event" gorm:"type:varchar(100)"` // 事件 - Describe string `json:"describe" gorm:"type:text"` // 描述 - User *UserInfo `json:"user,omitempty" gorm:"-"` + Uid uint32 `json:"uid" gorm:"column:uid;unique_index"` // 用户ID + BeforeVm uint32 `json:"before_vm"` // 变动前 + AfterVm uint32 `json:"after_vm"` // 变动后 + Alter int `json:"alter"` // 数值 + Event string `json:"event" gorm:"type:varchar(100)"` // 事件 + Describe string `json:"describe" gorm:"type:text"` // 描述 + ErpOrderId uint32 `json:"erp_order_id" gorm:"index"` // 零售订单id + User *UserInfo `json:"user,omitempty" gorm:"-"` } -func UserVmUpdate(gdb *gorm.DB, uid uint32, amount int, event, describe string) error { +func UserVmUpdate(gdb *gorm.DB, orderId, uid uint32, amount int, event, describe string) error { var userVm UserVm err := orm.Eloquent.Table("user_vm"). Where("uid=?", uid).Find(&userVm).Error