diff --git a/app/admin/apis/erpordermanage/erp_order.go b/app/admin/apis/erpordermanage/erp_order.go index 28c8aea..182452d 100644 --- a/app/admin/apis/erpordermanage/erp_order.go +++ b/app/admin/apis/erpordermanage/erp_order.go @@ -189,7 +189,10 @@ func ErpOrderAudit(c *gin.Context) { switch req.State { case 1: // 审核 orderState = model.ErpOrderStateAudited - stockState = model.SoldOut // 库存-已售 + stockState = model.SoldOut // 库存-已售 + if erpOrder.RetailType == model.RetailTypeRejected { // 退货单 + stockState = model.InStock // 库存-在库 + } case 2: // 取消审核 orderState = model.ErpOrderStateUnAudit stockState = model.InStock // 库存-在库 @@ -257,7 +260,7 @@ func ErpOrderAudit(c *gin.Context) { } // 更新库存 - err = model.UpdateStock(begin, erpOrder, stockState, req.State) + err = model.UpdateStock(begin, erpOrder, stockState, nPayStatus, req.State) if err != nil { begin.Rollback() logger.Error("UpdateStock err:", logger.Field("err", err)) diff --git a/app/admin/models/commodity.go b/app/admin/models/commodity.go index 8282180..259d110 100644 --- a/app/admin/models/commodity.go +++ b/app/admin/models/commodity.go @@ -428,7 +428,7 @@ func (m *ErpCommodityListReq) List() (*ErpCommodityListResp, error) { m.PageSize = 10 } - qs := orm.Eloquent.Debug().Table("erp_commodity") + qs := orm.Eloquent.Table("erp_commodity") if m.SerialNumber != "" { qs = qs.Where("serial_number = ?", m.SerialNumber) } @@ -1923,8 +1923,8 @@ func (m *ErpStockListReq) stockIsEmptyList(c *gin.Context) (*ErpStockListResp, e CAST(SUBSTRING(e.commodity_serial_number, -4) AS SIGNED); ***/ - qs := orm.Eloquent.Debug().Table("erp_commodity") - es := orm.Eloquent.Debug().Table("erp_commodity") + qs := orm.Eloquent.Table("erp_commodity") + es := orm.Eloquent.Table("erp_commodity") // 非管理员才判断所属门店 var storeList []uint32 @@ -2139,8 +2139,8 @@ func (m *ErpStockListReq) stockNoEmptyList(c *gin.Context) (*ErpStockListResp, e CAST(SUBSTRING(ec.serial_number, -4) AS SIGNED); ***/ - qs := orm.Eloquent.Debug().Table("erp_commodity") - es := orm.Eloquent.Debug().Table("erp_commodity") + qs := orm.Eloquent.Table("erp_commodity") + es := orm.Eloquent.Table("erp_commodity") // 非管理员才判断所属门店 if !(tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员") { @@ -2332,8 +2332,8 @@ func (m *ErpStockListReq) allCommodityList(c *gin.Context) (*ErpStockListResp, e CAST(SUBSTRING(ec.serial_number, -4) AS SIGNED); ***/ - qs := orm.Eloquent.Debug().Table("erp_commodity") - es := orm.Eloquent.Debug().Table("erp_commodity") + qs := orm.Eloquent.Table("erp_commodity") + es := orm.Eloquent.Table("erp_commodity") if m.SerialNumber != "" { qs = qs.Where("erp_commodity.serial_number=?", m.SerialNumber) diff --git a/app/admin/models/decision.go b/app/admin/models/decision.go index e85cb10..442910f 100644 --- a/app/admin/models/decision.go +++ b/app/admin/models/decision.go @@ -117,7 +117,7 @@ func (m *ErpDecisionReportReq) DecisionReportList(c *gin.Context) (*ErpDecisionR m.PageSize = 10 } - qs := orm.Eloquent.Debug().Table("erp_stock") + qs := orm.Eloquent.Table("erp_stock") if len(m.StoreId) > 0 { // 门店复选 var storeIDs []uint32 diff --git a/app/admin/models/erp_order.go b/app/admin/models/erp_order.go index ed120f4..f9fdf44 100644 --- a/app/admin/models/erp_order.go +++ b/app/admin/models/erp_order.go @@ -93,40 +93,42 @@ type ErpOrder struct { type ErpOrderCommodity struct { Model - ErpOrderId uint32 `json:"erp_order_id" gorm:"index"` // 零售订单id(后端生成) - ErpCategoryId uint32 `json:"erp_category_id" gorm:"index"` // 分类id - ErpCategoryName string `json:"erp_category_name"` // 分类名称 - ErpCommodityId uint32 `json:"erp_commodity_id" gorm:"index"` // 商品id - ErpCommodityName string `json:"erp_commodity_name"` // 商品名称 - ErpSupplierId uint32 `json:"erp_supplier_id" gorm:"index"` // 主供应商id - ErpSupplierName string `json:"erp_supplier_name"` // 主供应商名称 - IMEIType uint32 `json:"imei_type"` // 1-无串码 2-串码 - IMEI string `json:"imei" gorm:"index"` // 串码 - PresentType uint32 `json:"present_type"` // 赠送类型:1-非赠送 2-赠送 - RetailPrice float64 `json:"retail_price"` // 指导零售价 - SalePrice float64 `json:"sale_price"` // 零售价 - Count int32 `json:"count"` // 销售数量 - SaleDiscount float64 `json:"sale_discount"` // 零售优惠 - MemberDiscount float64 `json:"member_discount"` // 会员优惠 - VmDiscount float64 `json:"vm_discount"` // 会员积分抵扣 - CouponID uint32 `json:"coupon_id"` // 优惠券ID - CouponDiscount float64 `json:"coupon_discount"` // 优惠券抵扣 - CouponCode string `json:"coupon_code"` // 优惠券券码 - CouponName string `json:"coupon_name"` // 优惠券名称 - Amount float64 `json:"amount"` // 实际零售价 - ReceivedAmount float64 `json:"received_amount"` // 商品实收金额 - Remark string `json:"remark"` // 销售备注 - RejectedRemark string `json:"rejected_remark"` // 退货备注 - RejectedPrice float64 `json:"rejected_price"` // 退货单价 - RejectedCount uint32 `json:"rejected_count"` // 退货数量 - RejectedAmount float64 `json:"rejected_amount"` // 退货金额 - RejectedOrderCommodityId uint32 `json:"rejected_order_commodity_id"` // 退货订单商品id - 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 float64 `json:"staff_price" gorm:"-"` // 员工成本价 + ErpOrderId uint32 `json:"erp_order_id" gorm:"index"` // 零售订单id(后端生成) + ErpCategoryId uint32 `json:"erp_category_id" gorm:"index"` // 分类id + ErpCategoryName string `json:"erp_category_name"` // 分类名称 + ErpCommodityId uint32 `json:"erp_commodity_id" gorm:"index"` // 商品id + ErpCommodityName string `json:"erp_commodity_name"` // 商品名称 + ErpSupplierId uint32 `json:"erp_supplier_id" gorm:"index"` // 主供应商id + ErpSupplierName string `json:"erp_supplier_name"` // 主供应商名称 + IMEIType uint32 `json:"imei_type"` // 1-无串码 2-串码 + IMEI string `json:"imei" gorm:"index"` // 串码 + PresentType uint32 `json:"present_type"` // 赠送类型:1-非赠送 2-赠送 + RetailPrice float64 `json:"retail_price"` // 指导零售价 + SalePrice float64 `json:"sale_price"` // 零售价 + Count int32 `json:"count"` // 销售数量 + SaleDiscount float64 `json:"sale_discount"` // 零售优惠 + MemberDiscount float64 `json:"member_discount"` // 会员优惠 + VmDiscount float64 `json:"vm_discount"` // 会员积分抵扣 + CouponID uint32 `json:"coupon_id"` // 优惠券ID + CouponDiscount float64 `json:"coupon_discount"` // 优惠券抵扣 + CouponCode string `json:"coupon_code"` // 优惠券券码 + CouponName string `json:"coupon_name"` // 优惠券名称 + Amount float64 `json:"amount"` // 实际零售价 + ReceivedAmount float64 `json:"received_amount"` // 商品实收金额 + Remark string `json:"remark"` // 销售备注 + RejectedRemark string `json:"rejected_remark"` // 退货备注 + RejectedPrice float64 `json:"rejected_price"` // 退货单价 + RejectedCount uint32 `json:"rejected_count"` // 退货数量 + RejectedAmount float64 `json:"rejected_amount"` // 退货金额 + RejectedOrderCommodityId uint32 `json:"rejected_order_commodity_id"` // 退货订单商品id + 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 float64 `json:"staff_price" gorm:"-"` // 员工成本价 + CommoditySerialNumber string `json:"commodity_serial_number" gorm:"-"` // 商品编号 + CategoryNumber string `json:"category_number" gorm:"-"` // 商品分类编号 } // ErpOrderCashier 订单收款方式 @@ -180,7 +182,7 @@ type ErpOrderCreateReq struct { StoreName string `json:"store_name" binding:"required"` // 门店名称 RetailType string `json:"retail_type" binding:"required"` // 销售类型:sale 零售销售; rejected 零售退货 Tel string `json:"tel"` // 会员手机号 - MemberType string `json:"member_type" binding:"required"` // 会员类型:general 普通; member 会员 + MemberType string `json:"member_type"` // 会员类型:general 普通; member 会员 TotalRetailPrice float64 `json:"total_retail_price"` // 订单总指导零售价:如果是赠送商品,金额可以为0 TotalAmount float64 `json:"total_amount"` // 订单实收金额:如果只有1个赠送商品,金额可以为0 TotalCount uint32 `json:"total_count" binding:"required"` // 订单商品数量 @@ -415,6 +417,7 @@ type ErpOrderReceiptDataResp struct { TotalNum uint32 `json:"totalNum"` // 数量合计 TotalAmount float64 `json:"totalAmount"` // 零售优惠总金额 MembersAmount float64 `json:"membersAmount"` // 会员优惠总金额 + CouponAmount float64 `json:"couponAmount"` // 优惠券优惠总金额 IntegrationAmount float64 `json:"integrationAmount"` // 积分抵扣总金额 ToDealWith float64 `json:"toDealWith"` // 零售价合计 - 零售优惠总额 - 会员优惠总和 - 积分抵扣总额 ModeOfPayment map[string]ErpOrderCashier `json:"modeOfPayment"` // 支付信息 @@ -893,7 +896,7 @@ func FindRightErpStockCommodityId(idList map[uint32][]uint32, commodityId uint32 // 有串码,通过串码查找库存详情表,然后更改对应库存的状态为"在库"; // 非串码,通过门店id、商品id、商品名称查找库存详情表,找到状态为"已售"且时间最近的单,将其状态改为"在库" // 同时扣减库存表对应的数量,+1 -func UpdateStock(gdb *gorm.DB, erpOrder ErpOrder, state, auditState int) error { +func UpdateStock(gdb *gorm.DB, erpOrder ErpOrder, state, payStatus, auditState int) error { var commodities []ErpOrderCommodity err := orm.Eloquent.Table("erp_order_commodity").Where("erp_order_id = ?", erpOrder.ID). Find(&commodities).Error @@ -1180,7 +1183,7 @@ func UpdateStock(gdb *gorm.DB, erpOrder ErpOrder, state, auditState int) error { // 更新用户积分 var vmCount int var describe, event string - if erpOrder.RetailType == RetailTypeSale && state == SoldOut { // 零售订单,而且订单已支付,更新用户积分 + if erpOrder.RetailType == RetailTypeSale && state == SoldOut && payStatus == HavePaid { // 零售订单,而且订单已支付,更新用户积分 if auditState == 2 { describe = "零售退货反审核获得积分" } else { @@ -1189,12 +1192,22 @@ func UpdateStock(gdb *gorm.DB, erpOrder ErpOrder, state, auditState int) error { event = VmEventErpOrderSale vmCount = tools.RoundFloat64(erpOrder.TotalAmount) + if vmCount == 0 { // 0元无需积分 + return nil + } } else if erpOrder.RetailType == RetailTypeRejected { // 退货订单,扣减用户积分(需校验购物时已积分,有则扣除) + // 查询退货订单对应销售订单信息 + var erpSaleOrder ErpOrder + err = orm.Eloquent.Table("erp_order").Where("id = ?", erpOrder.SaleOrderId).Find(&erpSaleOrder).Error + if err != nil { + logger.Errorf("query erpSaleOrder error, id is:", erpOrder.SaleOrderId) + } + var count int64 - err = orm.Eloquent.Table("user_vm_record").Where("erp_order_id = ?", erpOrder.SaleOrderId). + err = orm.Eloquent.Table("user_vm_record").Where("bill_sn = ?", erpSaleOrder.BillSn). Count(&count).Error if err != nil { - logger.Errorf("query user_vm_record error, erp_order_id is:", erpOrder.SaleOrderId) + logger.Errorf("query user_vm_record error, bill_sn is:", erpSaleOrder.BillSn) } // 积过分才扣除 @@ -1465,7 +1478,19 @@ func (m *ErpOrder) SetCommodity() { logger.Error("SetCommodity query erp_order_commodity err:", logger.Field("err", err)) } - m.Commodities = mergeOrderCommodities(orderCommodities) + commodities := mergeOrderCommodities(orderCommodities) + for i, _ := range commodities { + categoryInfo, _ := GetErpCategory(commodities[i].ErpCategoryId) + if categoryInfo != nil { + commodities[i].CategoryNumber = categoryInfo.Number + } + + commodityInfo, _ := GetCommodity(commodities[i].ErpCommodityId) + if categoryInfo != nil { + commodities[i].CommoditySerialNumber = commodityInfo.SerialNumber + } + } + m.Commodities = commodities } // 合并重复的商品数据 @@ -2158,6 +2183,34 @@ func ErpOrderPay(req *ErpOrderPayReq, c *gin.Context) (*ErpOrderPayResp, error) } resp.Status = payStatus + + // 判断用户是不是会员,只有会员才会积分,否则不积分 + userInfo, err := GetUserInfoByUid(uint32(orderInfo.Uid)) + if err != nil { + logger.Error("UpdateStock GetUserInfoByUid err:", logger.Field("err", err)) + } + + if IsInMemberLevels(userInfo.MemberLevel) { + // 更新用户积分 + var vmCount int + var describe, event string + if orderInfo.RetailType == RetailTypeSale { // 零售订单,而且订单已支付,更新用户积分 + describe = "零售销售获得积分" + event = VmEventErpOrderSale + vmCount = tools.RoundFloat64(orderInfo.TotalAmount) + if vmCount == 0 { // 0元无需积分 + return resp, nil + } + } else { + return resp, nil + } + + err = UserVmUpdate(nil, orderInfo.BillSn, uint32(orderInfo.Uid), vmCount, event, describe) + if err != nil { + logger.Errorf("UserVmUpdate err:", err) + } + } + return resp, nil } @@ -2281,7 +2334,7 @@ func updateErpStockCommodity(gdb *gorm.DB, billSn string) error { return errors.New("未查询到订单") } - err = UpdateStock(gdb, erpOrderInfo[0], SoldOut, 0) + err = UpdateStock(gdb, erpOrderInfo[0], SoldOut, HavePaid, 0) if err != nil { gdb.Rollback() logger.Error("updateErpStockCommodity UpdateStock err:", logger.Field("err", err)) @@ -5078,6 +5131,7 @@ func QueryReceiptData(req *ErpOrderDeleteReq, c *gin.Context) (*ErpOrderReceiptD resp.Time = orders[0].UpdatedAt resp.CollectS = order.MakerName + var totalCouponAmount float64 commodityMap := make(map[string]TableData, 0) for i, item := range order.Commodities { var tableData TableData @@ -5095,12 +5149,14 @@ func QueryReceiptData(req *ErpOrderDeleteReq, c *gin.Context) (*ErpOrderReceiptD if order.MemberType != ErpOrderMemberTypeGeneral { resp.MembersAmount += item.MemberDiscount } + totalCouponAmount += item.CouponDiscount } resp.ChandiseObj = commodityMap resp.TotalRetailP = order.TotalRetailPrice resp.TotalNum = uint32(order.TotalCount) resp.ToDealWith = order.TotalAmount + resp.CouponAmount = totalCouponAmount cashierMap := make(map[string]ErpOrderCashier, 0) for i, item := range order.Cashiers { @@ -5586,7 +5642,8 @@ func checkOrderData(req *ErpOrderCreateReq, c *gin.Context) (*ErpOrder, error) { logger.Error("SalePrice less than MinRetailPrice") return nil, errors.New("零售价不能低于最低零售价,请检查") } - if req.ErpOrderCommodities[i].PresentType == 1 { // 有非赠送商品 + if req.ErpOrderCommodities[i].PresentType == 1 && + req.ErpOrderCommodities[i].CouponDiscount < req.ErpOrderCommodities[i].Amount { // 有非赠送商品 bCheckFlag = true } @@ -5625,6 +5682,13 @@ func checkOrderData(req *ErpOrderCreateReq, c *gin.Context) (*ErpOrder, error) { // 单个商品实收金额 req.ErpOrderCommodities[i].ReceivedAmount = req.ErpOrderCommodities[i].ReceivedAmount / float64(req.ErpOrderCommodities[i].Count) + if req.ErpOrderCommodities[i].Amount == 0 && + req.ErpOrderCommodities[i].CouponDiscount > req.ErpOrderCommodities[i].SalePrice { // 实际零售金额为0且使用了优惠券 + req.ErpOrderCommodities[i].MemberDiscount = 0 + req.ErpOrderCommodities[i].SaleDiscount = 0 + req.ErpOrderCommodities[i].CouponDiscount = req.ErpOrderCommodities[i].SalePrice + } + for j := 0; j < int(req.ErpOrderCommodities[i].Count); j++ { temp := req.ErpOrderCommodities[i] temp.Count = 1 diff --git a/app/admin/models/menu.go b/app/admin/models/menu.go index 3e4518f..5f097ec 100644 --- a/app/admin/models/menu.go +++ b/app/admin/models/menu.go @@ -35,6 +35,12 @@ const ( DetailStaffProfitPerMenu = "erp:retail:reportForm:retailDetails:staffProfitPer" // 零售明细-员工毛利提成 DetailSalesmanPerMenu = "erp:retail:reportForm:retailDetails:salesmanPer" // 零售明细-销售员提成 DetailStorePerMenu = "erp:retail:reportForm:retailDetails:storePer" // 零售明细-门店提成 + + UserInfoListMenu = "user:export:tel" // 所有用户-手机号 + + PrivilegeMemberMenu = "user:exclusive:member:tel" // 零售尊享会员-手机号 + + InviteRecordListMenu = "user:member:invitation:tel" // 会员邀请记录-手机号 ) type Menu struct { diff --git a/app/admin/models/order.go b/app/admin/models/order.go index f1ccf59..b445090 100644 --- a/app/admin/models/order.go +++ b/app/admin/models/order.go @@ -1656,19 +1656,20 @@ func (m *FundRecordListReq) List() ([]FundRecord, int64, string, error) { // TranslateFundType 将fund_type转换为对应的字符 func TranslateFundType(fundType string) string { fundTypeMap := map[string]string{ - "member_fee": "会员费", - "buy_goods_refund": "商品退货", - "buy_goods": "商品购买", - "buy_goods_cancel": "商品取消", - "recycle_card": "回收卡带", - "postage_package_fee": "购买运费包", - "member_deposit": "押金", - "upgrade_member": "升级会员", - "member_expire_delay": "滞纳金", - "express_fee": "邮费", - "deposit_refund": "退押金", - "express_fee_refund": "退邮费", - "downgrade_renewal": "降级续费", + "member_fee": "会员费", + "buy_goods_refund": "商品退货", + "buy_goods": "商品购买", + "buy_goods_cancel": "商品取消", + "recycle_card": "回收卡带", + "postage_package_fee": "购买运费包", + "member_deposit": "押金", + "upgrade_member": "升级会员", + "member_expire_delay": "滞纳金", + "express_fee": "邮费", + "deposit_refund": "退押金", + "express_fee_refund": "退邮费", + "downgrade_renewal": "降级续费", + "privilege_member_fee": "尊享会员费", } if val, ok := fundTypeMap[fundType]; ok { diff --git a/app/admin/models/purchase.go b/app/admin/models/purchase.go index 87a0a70..b63aa85 100644 --- a/app/admin/models/purchase.go +++ b/app/admin/models/purchase.go @@ -27,6 +27,7 @@ const ( ErpPurchaseOrderWaitReject = 3 // 待退货 ErpPurchaseOrderFinished = 4 // 已完成 ErpPurchaseOrderEnd = 5 // 已终止 + ErpPurchaseOrderOperation = 6 // 操作中 ErpProcureOrder = "procure" // 采购入库订单 ErpRejectOrder = "reject" // 采购退货订单 @@ -52,7 +53,7 @@ type ErpPurchaseOrder struct { AuditTime *time.Time `json:"audit_time"` // 审核时间 AuditorId uint32 `json:"auditor_id" gorm:"index"` // 审核人id AuditorName string `json:"auditor_name"` // 审核人名称 - State uint32 `json:"state"` // 1-待审核 2-待入库 3-待退货 4-已完成 5-已终止 + State uint32 `json:"state"` // 1-待审核 2-待入库 3-待退货 4-已完成 5-已终止 6-操作中 RejectedSerialNumber string `json:"rejected_serial_number"` // 退货的采购订单单据编号 ErpCashierId uint32 `json:"erp_cashier_id"` // 付款方式/收款方式id ErpCashierName string `json:"erp_cashier_name"` // 付款方式/收款方式名称 @@ -1130,6 +1131,18 @@ func InventoryErpPurchase(req *ErpPurchaseInventoryReq, c *gin.Context) error { return err } + if purchaseOrder.PurchaseType == ErpProcureOrder { + if purchaseOrder.State != ErpPurchaseOrderWaitInventory { + return errors.New("操作失败:订单不是待入库状态") + } + } + + if purchaseOrder.PurchaseType == ErpRejectOrder { + if purchaseOrder.State != ErpPurchaseOrderWaitReject { + return errors.New("操作失败:订单不是待退货状态") + } + } + // 校验入参门店是否包含在用户所有门店中,是否过期 if !(tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员") { sysUser, err := GetSysUserByCtx(c) @@ -1238,8 +1251,22 @@ func CheckAndUpdatePurchaseOrderState(orderId uint32) error { } for _, commodity := range commodities { - if (order.PurchaseType == "procure" && commodity.Count != uint32(commodity.InventoryCount)) || - (order.PurchaseType == "reject" && commodity.RejectedCount != uint32(commodity.InventoryCount)) { + if order.PurchaseType == ErpProcureOrder && commodity.Count != uint32(commodity.InventoryCount) { + if err := orm.Eloquent.Model(&order).Updates(map[string]interface{}{ + "state": ErpPurchaseOrderWaitInventory, + "audit_time": time.Now(), + }).Error; err != nil { + return err + } + return nil + } + if order.PurchaseType == ErpRejectOrder && commodity.RejectedCount != uint32(commodity.InventoryCount) { + if err := orm.Eloquent.Model(&order).Updates(map[string]interface{}{ + "state": ErpPurchaseOrderWaitReject, + "audit_time": time.Now(), + }).Error; err != nil { + return err + } return nil // Order not completed, exit early } } diff --git a/app/admin/models/user.go b/app/admin/models/user.go index e293daf..971ee95 100644 --- a/app/admin/models/user.go +++ b/app/admin/models/user.go @@ -291,6 +291,7 @@ type NewUserListReq struct { SortField string `json:"sort_field"` // 排序字段:滞纳金传"forfeit_penalty" SortType string `json:"sort_type"` // 排序类型:desc 降序、asc 升序 IsExport uint32 `json:"is_export"` // 1-导出 + IsOrderQuery uint32 `json:"is_order_query"` // 1-新建零售订单时查询,不限制门店 } type NewUserListResp struct { @@ -328,29 +329,31 @@ func GetNewUserList(req *NewUserListReq, c *gin.Context) (*NewUserListResp, erro qs := orm.Eloquent.Model(&UserInfo{}).Debug() - // 非管理员才判断所属门店 - if !(tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员") { - sysUser, err := GetSysUserByCtx(c) - if err != nil { - return nil, err - } - - var storeList []uint32 - // 返回sysUser未过期的门店id列表 - storeList = GetValidStoreIDs(sysUser.StoreData) - if req.StoreId != 0 { - if !Contains(storeList, uint32(req.StoreId)) { - return nil, errors.New("您没有该门店权限") + if req.IsOrderQuery != 1 { // 不是新建零售订单,需要校验门店权限 + // 非管理员才判断所属门店 + if !(tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员") { + sysUser, err := GetSysUserByCtx(c) + if err != nil { + return nil, err } - } else { - if len(storeList) > 0 { - if len(storeList) == 1 { - qs = qs.Where("store_id = ?", storeList[0]) - } else { - qs = qs.Where("store_id IN (?)", storeList) + + var storeList []uint32 + // 返回sysUser未过期的门店id列表 + storeList = GetValidStoreIDs(sysUser.StoreData) + if req.StoreId != 0 { + if !Contains(storeList, uint32(req.StoreId)) { + return nil, errors.New("您没有该门店权限") } } else { - return nil, errors.New("用户未绑定门店") + 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("用户未绑定门店") + } } } } @@ -530,7 +533,7 @@ func GetNewUserList(req *NewUserListReq, c *gin.Context) (*NewUserListResp, erro } if req.IsExport == 1 { - exportFile, err := newUserListExport(users) + exportFile, err := newUserListExport(users, c) if err != nil { logger.Errorf("err:", logger.Field("err", err)) return nil, err @@ -789,7 +792,7 @@ func GetUserList(page, pageSize, uid, memberLevel, storeId, userType, cooperativ } // 导出所有用户excel -func newUserListExport(list []U) (string, error) { +func newUserListExport(list []U, c *gin.Context) (string, error) { file := excelize.NewFile() fSheet := "Sheet1" @@ -797,9 +800,20 @@ func newUserListExport(list []U) (string, error) { fileName := time.Now().Format(TimeFormat) + "所有会员" + ".xlsx" fmt.Println("url fileName:", url+fileName) - title := []interface{}{"用户ID", "手机号", "所属门店", "消费次数", "消费金额", "注册小程序时间", "首次零售开单时间", + // 判断是否有权限 + flag1, _ := checkRoleMenu(c, UserInfoListMenu) + + nEndCount := 0 + title := []interface{}{"用户ID"} + + if flag1 { // 手机号 + title = append(title, "手机号") + nEndCount += 1 + } + + title = append(title, "所属门店", "消费次数", "消费金额", "注册小程序时间", "首次零售开单时间", "首次开通租卡会员等级", "当前会员等级", "首次开通租卡会员时间", "租卡会员到期时间", "保证金", "租卡会员过期天数", "滞纳金", - "未归还卡带名称", "未归还卡带串码"} + "未归还卡带名称", "未归还卡带串码") for i, _ := range title { cell, _ := excelize.CoordinatesToCellName(1+i, 1) err := file.SetCellValue(fSheet, cell, title[i]) @@ -846,24 +860,28 @@ func newUserListExport(list []U) (string, error) { } row = []interface{}{ - list[i].Uid, // 用户ID - list[i].Tel, // 手机号 - storeMap[uint32(list[i].StoreId)], // 所属门店 - list[i].OrderCount, // 消费次数 - list[i].OrderAmount, // 消费金额 - tools.ConvertTimeToString(list[i].CreatedAt), // 注册小程序时间 - tools.ConvertTimeToStringByPoint(list[i].FirstRetailOrder), // 首次零售开单时间 - getMemberLevelChineseDescription(list[i].OpenMemberLevel), // 首次开通租卡会员等级 - getMemberLevelChineseDescription(list[i].MemberLevel), // 当前会员等级 - tools.ConvertTimeToStringByPoint(list[i].OpenMemberTime), // 首次开通租卡会员时间 - tools.ConvertTimeToStringByPoint(list[i].MemberExpire), // 租卡会员到期时间 - float32(list[i].Deposit) / 100, // 保证金(数据库存储的是分) - list[i].MemberExpireDays, // 租卡会员过期天数 - list[i].ForfeitPenalty, // 滞纳金 - cardNamesResult, // 未归还卡带名称 - cardNumsResult, // 未归还卡带串码 + list[i].Uid, // 用户ID } + if flag1 { // 手机号 + row = append(row, list[i].Tel) + } + + row = append(row, storeMap[uint32(list[i].StoreId)]) // 所属门店 + row = append(row, list[i].OrderCount) // 消费次数 + row = append(row, list[i].OrderAmount) // 消费金额 + row = append(row, tools.ConvertTimeToString(list[i].CreatedAt)) // 注册小程序时间 + row = append(row, tools.ConvertTimeToStringByPoint(list[i].FirstRetailOrder)) // 首次零售开单时间 + row = append(row, getMemberLevelChineseDescription(list[i].OpenMemberLevel)) // 首次开通租卡会员等级 + row = append(row, getMemberLevelChineseDescription(list[i].MemberLevel)) // 当前会员等级 + row = append(row, tools.ConvertTimeToStringByPoint(list[i].OpenMemberTime)) // 首次开通租卡会员时间 + row = append(row, tools.ConvertTimeToStringByPoint(list[i].MemberExpire)) // 租卡会员到期时间 + row = append(row, float32(list[i].Deposit)/100) // 保证金(数据库存储的是分) + row = append(row, list[i].MemberExpireDays) // 租卡会员过期天数 + row = append(row, list[i].ForfeitPenalty) // 滞纳金 + row = append(row, cardNamesResult) // 未归还卡带名称 + row = append(row, cardNumsResult) // 未归还卡带串码 + for j, _ := range row { cell, _ := excelize.CoordinatesToCellName(1+j, nExcelStartRow+2) err := file.SetCellValue(fSheet, cell, row[j]) @@ -888,13 +906,26 @@ func newUserListExport(list []U) (string, error) { {"type":"right","color":"000000","style":1}, {"type":"bottom","color":"000000","style":1}]}`) - endRow := fmt.Sprintf("P%d", nExcelStartRow+1) - // 应用样式到整个表格 - file.SetColWidth("Sheet1", "F", "F", 18) - file.SetColWidth("Sheet1", "G", "G", 18) - file.SetColWidth("Sheet1", "J", "J", 18) - file.SetColWidth("Sheet1", "K", "K", 18) - _ = file.SetCellStyle("Sheet1", "A1", "P1", style1) + var endRow string + switch nEndCount { + case 1: + endRow = fmt.Sprintf("P"+"%d", nExcelStartRow+1) + // 应用样式到整个表格 + file.SetColWidth("Sheet1", "F", "F", 18) + file.SetColWidth("Sheet1", "G", "G", 18) + file.SetColWidth("Sheet1", "J", "J", 18) + file.SetColWidth("Sheet1", "K", "K", 18) + _ = file.SetCellStyle("Sheet1", "A1", "P1", style1) + default: + endRow = fmt.Sprintf("O"+"%d", nExcelStartRow+1) + // 应用样式到整个表格 + file.SetColWidth("Sheet1", "E", "E", 18) + file.SetColWidth("Sheet1", "F", "F", 18) + file.SetColWidth("Sheet1", "I", "I", 18) + file.SetColWidth("Sheet1", "J", "J", 18) + _ = file.SetCellStyle("Sheet1", "A1", "O1", style1) + } + _ = file.SetCellStyle("Sheet1", "A2", endRow, style) fmt.Println("save fileName:", config.ExportConfig.Path+fileName) @@ -1739,7 +1770,7 @@ func (m *NewUserInviteRecordReq) NewList(c *gin.Context) (*UserInviteRecordListR } if m.IsExport == 1 { - fileName, err := userInviteRecordExport(listData) + fileName, err := userInviteRecordExport(listData, c) if err != nil { logger.Errorf("err:", logger.Field("err", err)) return nil, err @@ -1798,6 +1829,10 @@ func getMemberTypeChineseDescription(memberType MemberType) string { return "黄金→黑金(自动)" case UpgradePlatinumToBlackAuto: return "白金→黑金(自动)" + case OpenAnnualPrivilege: + return "开通尊享会员" + case RenewAnnualPrivilegeAuto: + return "续费尊享会员" default: return "" } @@ -1822,7 +1857,7 @@ func getMemberLevelChineseDescription(memberLevel uint32) string { } // 导出会员邀请记录excel -func userInviteRecordExport(list []UserInviteRecordListData) (string, error) { +func userInviteRecordExport(list []UserInviteRecordListData, c *gin.Context) (string, error) { file := excelize.NewFile() fSheet := "Sheet1" @@ -1830,8 +1865,17 @@ func userInviteRecordExport(list []UserInviteRecordListData) (string, error) { fileName := time.Now().Format(TimeFormat) + "会员邀请记录" + ".xlsx" fmt.Println("url fileName:", url+fileName) - title := []interface{}{"邀请人所属门店", "邀请人昵称", "邀请人ID", "用户ID", "手机号", "注册小程序时间", "记录类型", - "记录时间", "当前类型", "租卡会员到期时间"} + // 判断是否有权限 + flag1, _ := checkRoleMenu(c, InviteRecordListMenu) + + nEndCount := 0 + title := []interface{}{"邀请人所属门店", "邀请人昵称", "邀请人ID", "用户ID"} + if flag1 { // 手机号 + title = append(title, "手机号") + nEndCount += 1 + } + title = append(title, "注册小程序时间", "记录类型", "记录时间", "当前类型", "租卡会员到期时间") + for i, _ := range title { cell, _ := excelize.CoordinatesToCellName(1+i, 1) err := file.SetCellValue(fSheet, cell, title[i]) @@ -1849,14 +1893,19 @@ func userInviteRecordExport(list []UserInviteRecordListData) (string, error) { list[i].InviteUserName, // 邀请人昵称 list[i].InviteUid, // 邀请人ID list[i].UserUid, // 用户ID - list[i].UserTel, // 手机号 - tools.ConvertTimeToString(list[i].CreateTime), // 注册小程序时间 - getMemberTypeChineseDescription(MemberType(list[i].RecordType)), // 记录类型 - tools.ConvertTimeToString(list[i].RecordTime), // 记录时间 - getMemberLevelChineseDescription(list[i].MemberLevel), // 当前类型 - tools.ConvertTimeToString(list[i].MemberExpire), // 租卡会员到期时间 } + // 控制是否导出 + if flag1 { // 手机号 + row = append(row, list[i].UserTel) + } + + row = append(row, tools.ConvertTimeToString(list[i].CreateTime)) // 注册小程序时间 + row = append(row, getMemberTypeChineseDescription(MemberType(list[i].RecordType))) // 记录类型 + row = append(row, tools.ConvertTimeToString(list[i].RecordTime)) // 记录时间 + row = append(row, getMemberLevelChineseDescription(list[i].MemberLevel)) // 当前类型 + row = append(row, tools.ConvertTimeToString(list[i].MemberExpire)) // 租卡会员到期时间 + for j, _ := range row { cell, _ := excelize.CoordinatesToCellName(1+j, nExcelStartRow+2) err := file.SetCellValue(fSheet, cell, row[j]) @@ -1881,17 +1930,34 @@ func userInviteRecordExport(list []UserInviteRecordListData) (string, error) { {"type":"right","color":"000000","style":1}, {"type":"bottom","color":"000000","style":1}]}`) - endRow := fmt.Sprintf("J%d", nExcelStartRow+1) - // 设置单元格大小 - file.SetColWidth("Sheet1", "A", "A", 30) - file.SetColWidth("Sheet1", "B", "B", 12) - file.SetColWidth("Sheet1", "E", "E", 15) - file.SetColWidth("Sheet1", "F", "F", 20) - file.SetColWidth("Sheet1", "G", "G", 20) - file.SetColWidth("Sheet1", "H", "H", 20) - file.SetColWidth("Sheet1", "J", "J", 20) - // 应用样式到整个表格 - _ = file.SetCellStyle("Sheet1", "A1", "J1", style1) + var endRow string + switch nEndCount { + case 1: + endRow = fmt.Sprintf("J"+"%d", nExcelStartRow+1) + // 设置单元格大小 + file.SetColWidth("Sheet1", "A", "A", 30) + file.SetColWidth("Sheet1", "B", "B", 12) + file.SetColWidth("Sheet1", "E", "E", 15) + file.SetColWidth("Sheet1", "F", "F", 20) + file.SetColWidth("Sheet1", "G", "G", 20) + file.SetColWidth("Sheet1", "H", "H", 20) + file.SetColWidth("Sheet1", "J", "J", 20) + // 应用样式到整个表格 + _ = file.SetCellStyle("Sheet1", "A1", "J1", style1) + default: + endRow = fmt.Sprintf("I"+"%d", nExcelStartRow+1) + // 设置单元格大小 + file.SetColWidth("Sheet1", "A", "A", 30) + file.SetColWidth("Sheet1", "B", "B", 12) + file.SetColWidth("Sheet1", "D", "D", 15) + file.SetColWidth("Sheet1", "E", "E", 20) + file.SetColWidth("Sheet1", "F", "F", 20) + file.SetColWidth("Sheet1", "G", "G", 20) + file.SetColWidth("Sheet1", "I", "I", 20) + // 应用样式到整个表格 + _ = file.SetCellStyle("Sheet1", "A1", "I1", style1) + } + _ = file.SetCellStyle("Sheet1", "A2", endRow, style) fmt.Println("save fileName:", config.ExportConfig.Path+fileName) @@ -4278,7 +4344,7 @@ func (m *PrivilegeMemberListReq) PrivilegeMemberList(c *gin.Context) (*Privilege } if m.IsExport == 1 { - fileName, err := PrivilegeMemberExport(memberList) + fileName, err := PrivilegeMemberExport(memberList, c) if err != nil { logger.Error("err:", logger.Field("err", err)) return nil, err @@ -4295,7 +4361,7 @@ func (m *PrivilegeMemberListReq) PrivilegeMemberList(c *gin.Context) (*Privilege } // PrivilegeMemberExport 尊享会员导出excel -func PrivilegeMemberExport(list []PrivilegeMember) (string, error) { +func PrivilegeMemberExport(list []PrivilegeMember, c *gin.Context) (string, error) { file := excelize.NewFile() fSheet := "Sheet1" @@ -4303,10 +4369,18 @@ func PrivilegeMemberExport(list []PrivilegeMember) (string, error) { fileName := time.Now().Format(TimeFormat) + "零售尊享会员" + ".xlsx" fmt.Println("url fileName:", url+fileName) - //title := []interface{}{"用户ID", "手机号", "所属门店", "当前会员等级", "首次开通尊享会员时间", "尊享会员到期时间", "延保状态", - // "主机编码", "图片凭证", "审核人", "审核时间"} - title := []interface{}{"用户ID", "手机号", "所属门店", "当前会员等级", "首次开通尊享会员时间", "尊享会员到期时间", "延保状态", - "主机编码", "审核人", "审核时间"} + // 判断是否有权限 + flag1, _ := checkRoleMenu(c, PrivilegeMemberMenu) + + nEndCount := 0 + title := []interface{}{"用户ID"} + if flag1 { // 手机号 + title = append(title, "手机号") + nEndCount += 1 + } + + title = append(title, "所属门店", "当前会员等级", "首次开通尊享会员时间", "尊享会员到期时间", "延保状态", + "主机编码", "审核人", "审核时间") for i, _ := range title { cell, _ := excelize.CoordinatesToCellName(1+i, 1) err := file.SetCellValue(fSheet, cell, title[i]) @@ -4343,19 +4417,23 @@ func PrivilegeMemberExport(list []PrivilegeMember) (string, error) { default: strExtendStatus = "" } + row = []interface{}{ - list[i].Uid, // 用户ID - list[i].Tel, // 手机号 - storeMap[uint32(list[i].StoreId)], // 所属门店 - getMemberLevelChineseDescription(list[i].MemberLevel), // 当前会员等级 - tools.ConvertTimeToStringByPoint(list[i].OpenMemberTime), // 首次开通尊享会员时间 - tools.ConvertTimeToStringByPoint(list[i].MemberExpire), // 尊享会员到期时间 - strExtendStatus, // 延保状态 - list[i].HostCode, // 主机编码 - //list[i].Images, // 图片凭证 - list[i].AuditorName, // 审核人 - tools.ConvertTimeToStringByPoint(list[i].AuditTime), // 审核时间 + list[i].Uid, // 用户ID } + // 控制是否导出 + if flag1 { // 手机号 + row = append(row, list[i].Tel) + } + + row = append(row, storeMap[uint32(list[i].StoreId)]) // 所属门店 + row = append(row, getMemberLevelChineseDescription(list[i].MemberLevel)) // 当前会员等级 + row = append(row, tools.ConvertTimeToStringByPoint(list[i].OpenMemberTime)) // 首次开通尊享会员时间 + row = append(row, tools.ConvertTimeToStringByPoint(list[i].MemberExpire)) // 尊享会员到期时间 + row = append(row, strExtendStatus) // 延保状态 + row = append(row, list[i].HostCode) // 主机编码 + row = append(row, list[i].AuditorName) // 审核人 + row = append(row, tools.ConvertTimeToStringByPoint(list[i].AuditTime)) // 审核时间 for j, _ := range row { cell, _ := excelize.CoordinatesToCellName(1+j, nExcelStartRow+2) @@ -4381,19 +4459,37 @@ func PrivilegeMemberExport(list []PrivilegeMember) (string, error) { {"type":"right","color":"000000","style":1}, {"type":"bottom","color":"000000","style":1}]}`) - endRow := fmt.Sprintf("J%d", nExcelStartRow+1) - // 应用样式到整个表格 - file.SetColWidth("Sheet1", "A", "A", 12) - file.SetColWidth("Sheet1", "B", "B", 15) - file.SetColWidth("Sheet1", "C", "C", 30) - file.SetColWidth("Sheet1", "D", "D", 18) - file.SetColWidth("Sheet1", "F", "E", 18) - file.SetColWidth("Sheet1", "F", "F", 18) - file.SetColWidth("Sheet1", "G", "G", 15) - file.SetColWidth("Sheet1", "H", "H", 18) - file.SetColWidth("Sheet1", "I", "I", 15) - file.SetColWidth("Sheet1", "J", "J", 18) - _ = file.SetCellStyle("Sheet1", "A1", "J1", style1) + var endRow string + switch nEndCount { + case 1: + endRow = fmt.Sprintf("J"+"%d", nExcelStartRow+1) + // 应用样式到整个表格 + file.SetColWidth("Sheet1", "A", "A", 12) + file.SetColWidth("Sheet1", "B", "B", 15) + file.SetColWidth("Sheet1", "C", "C", 30) + file.SetColWidth("Sheet1", "D", "D", 18) + file.SetColWidth("Sheet1", "F", "E", 18) + file.SetColWidth("Sheet1", "F", "F", 18) + file.SetColWidth("Sheet1", "G", "G", 15) + file.SetColWidth("Sheet1", "H", "H", 18) + file.SetColWidth("Sheet1", "I", "I", 15) + file.SetColWidth("Sheet1", "J", "J", 18) + _ = file.SetCellStyle("Sheet1", "A1", "J1", style1) + default: + endRow = fmt.Sprintf("I"+"%d", nExcelStartRow+1) + // 应用样式到整个表格 + file.SetColWidth("Sheet1", "A", "A", 12) + file.SetColWidth("Sheet1", "B", "B", 30) + file.SetColWidth("Sheet1", "C", "C", 18) + file.SetColWidth("Sheet1", "D", "D", 18) + file.SetColWidth("Sheet1", "F", "E", 18) + file.SetColWidth("Sheet1", "F", "F", 15) + file.SetColWidth("Sheet1", "G", "G", 18) + file.SetColWidth("Sheet1", "H", "H", 15) + file.SetColWidth("Sheet1", "I", "I", 18) + _ = file.SetCellStyle("Sheet1", "A1", "I1", style1) + } + _ = file.SetCellStyle("Sheet1", "A2", endRow, style) fmt.Println("save fileName:", config.ExportConfig.Path+fileName) @@ -4502,14 +4598,16 @@ func (m *CancelPrivilegeMembersReq) CancelPrivilegeMembers() (*PrivilegeMember, } for i, _ := range userCoupon { - err = begin.Table("user_coupon").Where("id = ?", userCoupon[i].ID).Updates(map[string]interface{}{ - "state": 3, - "updated_at": time.Now(), - }).Error - if err != nil { - begin.Rollback() - logger.Error("UpdateCoupon err:", logger.Field("err", err)) - return nil, err + if userCoupon[i].State == 1 { // 只更新未使用的优惠券 + err = begin.Table("user_coupon").Where("id = ?", userCoupon[i].ID).Updates(map[string]interface{}{ + "state": 3, + "updated_at": time.Now(), + }).Error + if err != nil { + begin.Rollback() + logger.Error("UpdateCoupon err:", logger.Field("err", err)) + return nil, err + } } } diff --git a/docs/docs.go b/docs/docs.go index 51bb203..bad6d31 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -9224,6 +9224,14 @@ const docTemplate = `{ "description": "实际零售价", "type": "number" }, + "category_number": { + "description": "商品分类编号", + "type": "string" + }, + "commodity_serial_number": { + "description": "商品编号", + "type": "string" + }, "count": { "description": "销售数量", "type": "integer" @@ -9608,6 +9616,10 @@ const docTemplate = `{ "description": "收银人员:制单人", "type": "string" }, + "couponAmount": { + "description": "优惠券优惠总金额", + "type": "number" + }, "integrationAmount": { "description": "积分抵扣总金额", "type": "number" @@ -10625,7 +10637,7 @@ const docTemplate = `{ "type": "string" }, "state": { - "description": "1-待审核 2-待入库 3-待退货 4-已完成 5-已终止", + "description": "1-待审核 2-待入库 3-待退货 4-已完成 5-已终止 6-操作中", "type": "integer" }, "store_id": { @@ -13853,6 +13865,10 @@ const docTemplate = `{ "description": "1-导出", "type": "integer" }, + "is_order_query": { + "description": "1-新建零售订单时查询,不限制门店", + "type": "integer" + }, "member_level": { "description": "当前会员等级:10-普通用户 1-普通会员 2-黄金会员 4-白金会员 5-黑金会员", "type": "array", diff --git a/docs/swagger.json b/docs/swagger.json index bfbfbcc..d87dd06 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -9213,6 +9213,14 @@ "description": "实际零售价", "type": "number" }, + "category_number": { + "description": "商品分类编号", + "type": "string" + }, + "commodity_serial_number": { + "description": "商品编号", + "type": "string" + }, "count": { "description": "销售数量", "type": "integer" @@ -9597,6 +9605,10 @@ "description": "收银人员:制单人", "type": "string" }, + "couponAmount": { + "description": "优惠券优惠总金额", + "type": "number" + }, "integrationAmount": { "description": "积分抵扣总金额", "type": "number" @@ -10614,7 +10626,7 @@ "type": "string" }, "state": { - "description": "1-待审核 2-待入库 3-待退货 4-已完成 5-已终止", + "description": "1-待审核 2-待入库 3-待退货 4-已完成 5-已终止 6-操作中", "type": "integer" }, "store_id": { @@ -13842,6 +13854,10 @@ "description": "1-导出", "type": "integer" }, + "is_order_query": { + "description": "1-新建零售订单时查询,不限制门店", + "type": "integer" + }, "member_level": { "description": "当前会员等级:10-普通用户 1-普通会员 2-黄金会员 4-白金会员 5-黑金会员", "type": "array", diff --git a/docs/swagger.yaml b/docs/swagger.yaml index e9f343a..dd37889 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -2145,6 +2145,12 @@ definitions: amount: description: 实际零售价 type: number + category_number: + description: 商品分类编号 + type: string + commodity_serial_number: + description: 商品编号 + type: string count: description: 销售数量 type: integer @@ -2427,6 +2433,9 @@ definitions: collectS: description: 收银人员:制单人 type: string + couponAmount: + description: 优惠券优惠总金额 + type: number integrationAmount: description: 积分抵扣总金额 type: number @@ -3168,7 +3177,7 @@ definitions: description: 单据编号 type: string state: - description: 1-待审核 2-待入库 3-待退货 4-已完成 5-已终止 + description: 1-待审核 2-待入库 3-待退货 4-已完成 5-已终止 6-操作中 type: integer store_id: description: 门店id @@ -5492,6 +5501,9 @@ definitions: is_export: description: 1-导出 type: integer + is_order_query: + description: 1-新建零售订单时查询,不限制门店 + type: integer member_level: description: 当前会员等级:10-普通用户 1-普通会员 2-黄金会员 4-白金会员 5-黑金会员 items: