1、提交尊享会员相关优化;

This commit is contained in:
chenlin 2024-09-26 11:43:52 +08:00
parent a2a2dbaf0b
commit ab027172e6
11 changed files with 420 additions and 177 deletions

View File

@ -189,7 +189,10 @@ func ErpOrderAudit(c *gin.Context) {
switch req.State { switch req.State {
case 1: // 审核 case 1: // 审核
orderState = model.ErpOrderStateAudited orderState = model.ErpOrderStateAudited
stockState = model.SoldOut // 库存-已售 stockState = model.SoldOut // 库存-已售
if erpOrder.RetailType == model.RetailTypeRejected { // 退货单
stockState = model.InStock // 库存-在库
}
case 2: // 取消审核 case 2: // 取消审核
orderState = model.ErpOrderStateUnAudit orderState = model.ErpOrderStateUnAudit
stockState = model.InStock // 库存-在库 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 { if err != nil {
begin.Rollback() begin.Rollback()
logger.Error("UpdateStock err:", logger.Field("err", err)) logger.Error("UpdateStock err:", logger.Field("err", err))

View File

@ -428,7 +428,7 @@ func (m *ErpCommodityListReq) List() (*ErpCommodityListResp, error) {
m.PageSize = 10 m.PageSize = 10
} }
qs := orm.Eloquent.Debug().Table("erp_commodity") qs := orm.Eloquent.Table("erp_commodity")
if m.SerialNumber != "" { if m.SerialNumber != "" {
qs = qs.Where("serial_number = ?", 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); CAST(SUBSTRING(e.commodity_serial_number, -4) AS SIGNED);
***/ ***/
qs := orm.Eloquent.Debug().Table("erp_commodity") qs := orm.Eloquent.Table("erp_commodity")
es := orm.Eloquent.Debug().Table("erp_commodity") es := orm.Eloquent.Table("erp_commodity")
// 非管理员才判断所属门店 // 非管理员才判断所属门店
var storeList []uint32 var storeList []uint32
@ -2139,8 +2139,8 @@ func (m *ErpStockListReq) stockNoEmptyList(c *gin.Context) (*ErpStockListResp, e
CAST(SUBSTRING(ec.serial_number, -4) AS SIGNED); CAST(SUBSTRING(ec.serial_number, -4) AS SIGNED);
***/ ***/
qs := orm.Eloquent.Debug().Table("erp_commodity") qs := orm.Eloquent.Table("erp_commodity")
es := orm.Eloquent.Debug().Table("erp_commodity") es := orm.Eloquent.Table("erp_commodity")
// 非管理员才判断所属门店 // 非管理员才判断所属门店
if !(tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员") { 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); CAST(SUBSTRING(ec.serial_number, -4) AS SIGNED);
***/ ***/
qs := orm.Eloquent.Debug().Table("erp_commodity") qs := orm.Eloquent.Table("erp_commodity")
es := orm.Eloquent.Debug().Table("erp_commodity") es := orm.Eloquent.Table("erp_commodity")
if m.SerialNumber != "" { if m.SerialNumber != "" {
qs = qs.Where("erp_commodity.serial_number=?", m.SerialNumber) qs = qs.Where("erp_commodity.serial_number=?", m.SerialNumber)

View File

@ -117,7 +117,7 @@ func (m *ErpDecisionReportReq) DecisionReportList(c *gin.Context) (*ErpDecisionR
m.PageSize = 10 m.PageSize = 10
} }
qs := orm.Eloquent.Debug().Table("erp_stock") qs := orm.Eloquent.Table("erp_stock")
if len(m.StoreId) > 0 { // 门店复选 if len(m.StoreId) > 0 { // 门店复选
var storeIDs []uint32 var storeIDs []uint32

View File

@ -93,40 +93,42 @@ type ErpOrder struct {
type ErpOrderCommodity struct { type ErpOrderCommodity struct {
Model Model
ErpOrderId uint32 `json:"erp_order_id" gorm:"index"` // 零售订单id后端生成 ErpOrderId uint32 `json:"erp_order_id" gorm:"index"` // 零售订单id后端生成
ErpCategoryId uint32 `json:"erp_category_id" gorm:"index"` // 分类id ErpCategoryId uint32 `json:"erp_category_id" gorm:"index"` // 分类id
ErpCategoryName string `json:"erp_category_name"` // 分类名称 ErpCategoryName string `json:"erp_category_name"` // 分类名称
ErpCommodityId uint32 `json:"erp_commodity_id" gorm:"index"` // 商品id ErpCommodityId uint32 `json:"erp_commodity_id" gorm:"index"` // 商品id
ErpCommodityName string `json:"erp_commodity_name"` // 商品名称 ErpCommodityName string `json:"erp_commodity_name"` // 商品名称
ErpSupplierId uint32 `json:"erp_supplier_id" gorm:"index"` // 主供应商id ErpSupplierId uint32 `json:"erp_supplier_id" gorm:"index"` // 主供应商id
ErpSupplierName string `json:"erp_supplier_name"` // 主供应商名称 ErpSupplierName string `json:"erp_supplier_name"` // 主供应商名称
IMEIType uint32 `json:"imei_type"` // 1-无串码 2-串码 IMEIType uint32 `json:"imei_type"` // 1-无串码 2-串码
IMEI string `json:"imei" gorm:"index"` // 串码 IMEI string `json:"imei" gorm:"index"` // 串码
PresentType uint32 `json:"present_type"` // 赠送类型:1-非赠送 2-赠送 PresentType uint32 `json:"present_type"` // 赠送类型:1-非赠送 2-赠送
RetailPrice float64 `json:"retail_price"` // 指导零售价 RetailPrice float64 `json:"retail_price"` // 指导零售价
SalePrice float64 `json:"sale_price"` // 零售价 SalePrice float64 `json:"sale_price"` // 零售价
Count int32 `json:"count"` // 销售数量 Count int32 `json:"count"` // 销售数量
SaleDiscount float64 `json:"sale_discount"` // 零售优惠 SaleDiscount float64 `json:"sale_discount"` // 零售优惠
MemberDiscount float64 `json:"member_discount"` // 会员优惠 MemberDiscount float64 `json:"member_discount"` // 会员优惠
VmDiscount float64 `json:"vm_discount"` // 会员积分抵扣 VmDiscount float64 `json:"vm_discount"` // 会员积分抵扣
CouponID uint32 `json:"coupon_id"` // 优惠券ID CouponID uint32 `json:"coupon_id"` // 优惠券ID
CouponDiscount float64 `json:"coupon_discount"` // 优惠券抵扣 CouponDiscount float64 `json:"coupon_discount"` // 优惠券抵扣
CouponCode string `json:"coupon_code"` // 优惠券券码 CouponCode string `json:"coupon_code"` // 优惠券券码
CouponName string `json:"coupon_name"` // 优惠券名称 CouponName string `json:"coupon_name"` // 优惠券名称
Amount float64 `json:"amount"` // 实际零售价 Amount float64 `json:"amount"` // 实际零售价
ReceivedAmount float64 `json:"received_amount"` // 商品实收金额 ReceivedAmount float64 `json:"received_amount"` // 商品实收金额
Remark string `json:"remark"` // 销售备注 Remark string `json:"remark"` // 销售备注
RejectedRemark string `json:"rejected_remark"` // 退货备注 RejectedRemark string `json:"rejected_remark"` // 退货备注
RejectedPrice float64 `json:"rejected_price"` // 退货单价 RejectedPrice float64 `json:"rejected_price"` // 退货单价
RejectedCount uint32 `json:"rejected_count"` // 退货数量 RejectedCount uint32 `json:"rejected_count"` // 退货数量
RejectedAmount float64 `json:"rejected_amount"` // 退货金额 RejectedAmount float64 `json:"rejected_amount"` // 退货金额
RejectedOrderCommodityId uint32 `json:"rejected_order_commodity_id"` // 退货订单商品id RejectedOrderCommodityId uint32 `json:"rejected_order_commodity_id"` // 退货订单商品id
StaffCostPrice float64 `json:"staff_cost_price"` // 员工成本价加价加价50不是加价后的价格 StaffCostPrice float64 `json:"staff_cost_price"` // 员工成本价加价加价50不是加价后的价格
WholesalePrice float64 `json:"wholesale_price"` // 指导采购价 WholesalePrice float64 `json:"wholesale_price"` // 指导采购价
SalesProfit float64 `json:"sales_profit"` // 销售毛利:实际零售价-采购单价;如果为退货订单,则为实际退货价-采购单价 SalesProfit float64 `json:"sales_profit"` // 销售毛利:实际零售价-采购单价;如果为退货订单,则为实际退货价-采购单价
StaffProfit float64 `json:"staff_profit"` // 员工毛利:实际零售价-员工成本价;如果为退货订单,则为实际退货价-员工成本价 StaffProfit float64 `json:"staff_profit"` // 员工毛利:实际零售价-员工成本价;如果为退货订单,则为实际退货价-员工成本价
ErpStockCommodityID string `json:"erp_stock_commodity_id"` // 库存商品表主键id ErpStockCommodityID string `json:"erp_stock_commodity_id"` // 库存商品表主键id
StaffPrice float64 `json:"staff_price" gorm:"-"` // 员工成本价 StaffPrice float64 `json:"staff_price" gorm:"-"` // 员工成本价
CommoditySerialNumber string `json:"commodity_serial_number" gorm:"-"` // 商品编号
CategoryNumber string `json:"category_number" gorm:"-"` // 商品分类编号
} }
// ErpOrderCashier 订单收款方式 // ErpOrderCashier 订单收款方式
@ -180,7 +182,7 @@ type ErpOrderCreateReq struct {
StoreName string `json:"store_name" binding:"required"` // 门店名称 StoreName string `json:"store_name" binding:"required"` // 门店名称
RetailType string `json:"retail_type" binding:"required"` // 销售类型sale 零售销售; rejected 零售退货 RetailType string `json:"retail_type" binding:"required"` // 销售类型sale 零售销售; rejected 零售退货
Tel string `json:"tel"` // 会员手机号 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 TotalRetailPrice float64 `json:"total_retail_price"` // 订单总指导零售价如果是赠送商品金额可以为0
TotalAmount float64 `json:"total_amount"` // 订单实收金额如果只有1个赠送商品金额可以为0 TotalAmount float64 `json:"total_amount"` // 订单实收金额如果只有1个赠送商品金额可以为0
TotalCount uint32 `json:"total_count" binding:"required"` // 订单商品数量 TotalCount uint32 `json:"total_count" binding:"required"` // 订单商品数量
@ -415,6 +417,7 @@ type ErpOrderReceiptDataResp struct {
TotalNum uint32 `json:"totalNum"` // 数量合计 TotalNum uint32 `json:"totalNum"` // 数量合计
TotalAmount float64 `json:"totalAmount"` // 零售优惠总金额 TotalAmount float64 `json:"totalAmount"` // 零售优惠总金额
MembersAmount float64 `json:"membersAmount"` // 会员优惠总金额 MembersAmount float64 `json:"membersAmount"` // 会员优惠总金额
CouponAmount float64 `json:"couponAmount"` // 优惠券优惠总金额
IntegrationAmount float64 `json:"integrationAmount"` // 积分抵扣总金额 IntegrationAmount float64 `json:"integrationAmount"` // 积分抵扣总金额
ToDealWith float64 `json:"toDealWith"` // 零售价合计 - 零售优惠总额 - 会员优惠总和 - 积分抵扣总额 ToDealWith float64 `json:"toDealWith"` // 零售价合计 - 零售优惠总额 - 会员优惠总和 - 积分抵扣总额
ModeOfPayment map[string]ErpOrderCashier `json:"modeOfPayment"` // 支付信息 ModeOfPayment map[string]ErpOrderCashier `json:"modeOfPayment"` // 支付信息
@ -893,7 +896,7 @@ func FindRightErpStockCommodityId(idList map[uint32][]uint32, commodityId uint32
// 有串码,通过串码查找库存详情表,然后更改对应库存的状态为"在库" // 有串码,通过串码查找库存详情表,然后更改对应库存的状态为"在库"
// 非串码通过门店id、商品id、商品名称查找库存详情表找到状态为"已售"且时间最近的单,将其状态改为"在库" // 非串码通过门店id、商品id、商品名称查找库存详情表找到状态为"已售"且时间最近的单,将其状态改为"在库"
// 同时扣减库存表对应的数量,+1 // 同时扣减库存表对应的数量,+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 var commodities []ErpOrderCommodity
err := orm.Eloquent.Table("erp_order_commodity").Where("erp_order_id = ?", erpOrder.ID). err := orm.Eloquent.Table("erp_order_commodity").Where("erp_order_id = ?", erpOrder.ID).
Find(&commodities).Error Find(&commodities).Error
@ -1180,7 +1183,7 @@ func UpdateStock(gdb *gorm.DB, erpOrder ErpOrder, state, auditState int) error {
// 更新用户积分 // 更新用户积分
var vmCount int var vmCount int
var describe, event string var describe, event string
if erpOrder.RetailType == RetailTypeSale && state == SoldOut { // 零售订单,而且订单已支付,更新用户积分 if erpOrder.RetailType == RetailTypeSale && state == SoldOut && payStatus == HavePaid { // 零售订单,而且订单已支付,更新用户积分
if auditState == 2 { if auditState == 2 {
describe = "零售退货反审核获得积分" describe = "零售退货反审核获得积分"
} else { } else {
@ -1189,12 +1192,22 @@ func UpdateStock(gdb *gorm.DB, erpOrder ErpOrder, state, auditState int) error {
event = VmEventErpOrderSale event = VmEventErpOrderSale
vmCount = tools.RoundFloat64(erpOrder.TotalAmount) vmCount = tools.RoundFloat64(erpOrder.TotalAmount)
if vmCount == 0 { // 0元无需积分
return nil
}
} else if erpOrder.RetailType == RetailTypeRejected { // 退货订单,扣减用户积分(需校验购物时已积分,有则扣除) } 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 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 Count(&count).Error
if err != nil { 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)) 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 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 return resp, nil
} }
@ -2281,7 +2334,7 @@ func updateErpStockCommodity(gdb *gorm.DB, billSn string) error {
return errors.New("未查询到订单") return errors.New("未查询到订单")
} }
err = UpdateStock(gdb, erpOrderInfo[0], SoldOut, 0) err = UpdateStock(gdb, erpOrderInfo[0], SoldOut, HavePaid, 0)
if err != nil { if err != nil {
gdb.Rollback() gdb.Rollback()
logger.Error("updateErpStockCommodity UpdateStock err:", logger.Field("err", err)) 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.Time = orders[0].UpdatedAt
resp.CollectS = order.MakerName resp.CollectS = order.MakerName
var totalCouponAmount float64
commodityMap := make(map[string]TableData, 0) commodityMap := make(map[string]TableData, 0)
for i, item := range order.Commodities { for i, item := range order.Commodities {
var tableData TableData var tableData TableData
@ -5095,12 +5149,14 @@ func QueryReceiptData(req *ErpOrderDeleteReq, c *gin.Context) (*ErpOrderReceiptD
if order.MemberType != ErpOrderMemberTypeGeneral { if order.MemberType != ErpOrderMemberTypeGeneral {
resp.MembersAmount += item.MemberDiscount resp.MembersAmount += item.MemberDiscount
} }
totalCouponAmount += item.CouponDiscount
} }
resp.ChandiseObj = commodityMap resp.ChandiseObj = commodityMap
resp.TotalRetailP = order.TotalRetailPrice resp.TotalRetailP = order.TotalRetailPrice
resp.TotalNum = uint32(order.TotalCount) resp.TotalNum = uint32(order.TotalCount)
resp.ToDealWith = order.TotalAmount resp.ToDealWith = order.TotalAmount
resp.CouponAmount = totalCouponAmount
cashierMap := make(map[string]ErpOrderCashier, 0) cashierMap := make(map[string]ErpOrderCashier, 0)
for i, item := range order.Cashiers { 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") logger.Error("SalePrice less than MinRetailPrice")
return nil, errors.New("零售价不能低于最低零售价,请检查") 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 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) 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++ { for j := 0; j < int(req.ErpOrderCommodities[i].Count); j++ {
temp := req.ErpOrderCommodities[i] temp := req.ErpOrderCommodities[i]
temp.Count = 1 temp.Count = 1

View File

@ -35,6 +35,12 @@ const (
DetailStaffProfitPerMenu = "erp:retail:reportForm:retailDetails:staffProfitPer" // 零售明细-员工毛利提成 DetailStaffProfitPerMenu = "erp:retail:reportForm:retailDetails:staffProfitPer" // 零售明细-员工毛利提成
DetailSalesmanPerMenu = "erp:retail:reportForm:retailDetails:salesmanPer" // 零售明细-销售员提成 DetailSalesmanPerMenu = "erp:retail:reportForm:retailDetails:salesmanPer" // 零售明细-销售员提成
DetailStorePerMenu = "erp:retail:reportForm:retailDetails:storePer" // 零售明细-门店提成 DetailStorePerMenu = "erp:retail:reportForm:retailDetails:storePer" // 零售明细-门店提成
UserInfoListMenu = "user:export:tel" // 所有用户-手机号
PrivilegeMemberMenu = "user:exclusive:member:tel" // 零售尊享会员-手机号
InviteRecordListMenu = "user:member:invitation:tel" // 会员邀请记录-手机号
) )
type Menu struct { type Menu struct {

View File

@ -1656,19 +1656,20 @@ func (m *FundRecordListReq) List() ([]FundRecord, int64, string, error) {
// TranslateFundType 将fund_type转换为对应的字符 // TranslateFundType 将fund_type转换为对应的字符
func TranslateFundType(fundType string) string { func TranslateFundType(fundType string) string {
fundTypeMap := map[string]string{ fundTypeMap := map[string]string{
"member_fee": "会员费", "member_fee": "会员费",
"buy_goods_refund": "商品退货", "buy_goods_refund": "商品退货",
"buy_goods": "商品购买", "buy_goods": "商品购买",
"buy_goods_cancel": "商品取消", "buy_goods_cancel": "商品取消",
"recycle_card": "回收卡带", "recycle_card": "回收卡带",
"postage_package_fee": "购买运费包", "postage_package_fee": "购买运费包",
"member_deposit": "押金", "member_deposit": "押金",
"upgrade_member": "升级会员", "upgrade_member": "升级会员",
"member_expire_delay": "滞纳金", "member_expire_delay": "滞纳金",
"express_fee": "邮费", "express_fee": "邮费",
"deposit_refund": "退押金", "deposit_refund": "退押金",
"express_fee_refund": "退邮费", "express_fee_refund": "退邮费",
"downgrade_renewal": "降级续费", "downgrade_renewal": "降级续费",
"privilege_member_fee": "尊享会员费",
} }
if val, ok := fundTypeMap[fundType]; ok { if val, ok := fundTypeMap[fundType]; ok {

View File

@ -27,6 +27,7 @@ const (
ErpPurchaseOrderWaitReject = 3 // 待退货 ErpPurchaseOrderWaitReject = 3 // 待退货
ErpPurchaseOrderFinished = 4 // 已完成 ErpPurchaseOrderFinished = 4 // 已完成
ErpPurchaseOrderEnd = 5 // 已终止 ErpPurchaseOrderEnd = 5 // 已终止
ErpPurchaseOrderOperation = 6 // 操作中
ErpProcureOrder = "procure" // 采购入库订单 ErpProcureOrder = "procure" // 采购入库订单
ErpRejectOrder = "reject" // 采购退货订单 ErpRejectOrder = "reject" // 采购退货订单
@ -52,7 +53,7 @@ type ErpPurchaseOrder struct {
AuditTime *time.Time `json:"audit_time"` // 审核时间 AuditTime *time.Time `json:"audit_time"` // 审核时间
AuditorId uint32 `json:"auditor_id" gorm:"index"` // 审核人id AuditorId uint32 `json:"auditor_id" gorm:"index"` // 审核人id
AuditorName string `json:"auditor_name"` // 审核人名称 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"` // 退货的采购订单单据编号 RejectedSerialNumber string `json:"rejected_serial_number"` // 退货的采购订单单据编号
ErpCashierId uint32 `json:"erp_cashier_id"` // 付款方式/收款方式id ErpCashierId uint32 `json:"erp_cashier_id"` // 付款方式/收款方式id
ErpCashierName string `json:"erp_cashier_name"` // 付款方式/收款方式名称 ErpCashierName string `json:"erp_cashier_name"` // 付款方式/收款方式名称
@ -1130,6 +1131,18 @@ func InventoryErpPurchase(req *ErpPurchaseInventoryReq, c *gin.Context) error {
return err 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) == "系统管理员") { if !(tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员") {
sysUser, err := GetSysUserByCtx(c) sysUser, err := GetSysUserByCtx(c)
@ -1238,8 +1251,22 @@ func CheckAndUpdatePurchaseOrderState(orderId uint32) error {
} }
for _, commodity := range commodities { for _, commodity := range commodities {
if (order.PurchaseType == "procure" && commodity.Count != uint32(commodity.InventoryCount)) || if order.PurchaseType == ErpProcureOrder && commodity.Count != uint32(commodity.InventoryCount) {
(order.PurchaseType == "reject" && commodity.RejectedCount != 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 return nil // Order not completed, exit early
} }
} }

View File

@ -291,6 +291,7 @@ type NewUserListReq struct {
SortField string `json:"sort_field"` // 排序字段:滞纳金传"forfeit_penalty" SortField string `json:"sort_field"` // 排序字段:滞纳金传"forfeit_penalty"
SortType string `json:"sort_type"` // 排序类型desc 降序、asc 升序 SortType string `json:"sort_type"` // 排序类型desc 降序、asc 升序
IsExport uint32 `json:"is_export"` // 1-导出 IsExport uint32 `json:"is_export"` // 1-导出
IsOrderQuery uint32 `json:"is_order_query"` // 1-新建零售订单时查询,不限制门店
} }
type NewUserListResp struct { type NewUserListResp struct {
@ -328,29 +329,31 @@ func GetNewUserList(req *NewUserListReq, c *gin.Context) (*NewUserListResp, erro
qs := orm.Eloquent.Model(&UserInfo{}).Debug() qs := orm.Eloquent.Model(&UserInfo{}).Debug()
// 非管理员才判断所属门店 if req.IsOrderQuery != 1 { // 不是新建零售订单,需要校验门店权限
if !(tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员") { // 非管理员才判断所属门店
sysUser, err := GetSysUserByCtx(c) if !(tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员") {
if err != nil { sysUser, err := GetSysUserByCtx(c)
return nil, err 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("您没有该门店权限")
} }
} else {
if len(storeList) > 0 { var storeList []uint32
if len(storeList) == 1 { // 返回sysUser未过期的门店id列表
qs = qs.Where("store_id = ?", storeList[0]) storeList = GetValidStoreIDs(sysUser.StoreData)
} else { if req.StoreId != 0 {
qs = qs.Where("store_id IN (?)", storeList) if !Contains(storeList, uint32(req.StoreId)) {
return nil, errors.New("您没有该门店权限")
} }
} else { } 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 { if req.IsExport == 1 {
exportFile, err := newUserListExport(users) exportFile, err := newUserListExport(users, c)
if err != nil { if err != nil {
logger.Errorf("err:", logger.Field("err", err)) logger.Errorf("err:", logger.Field("err", err))
return nil, err return nil, err
@ -789,7 +792,7 @@ func GetUserList(page, pageSize, uid, memberLevel, storeId, userType, cooperativ
} }
// 导出所有用户excel // 导出所有用户excel
func newUserListExport(list []U) (string, error) { func newUserListExport(list []U, c *gin.Context) (string, error) {
file := excelize.NewFile() file := excelize.NewFile()
fSheet := "Sheet1" fSheet := "Sheet1"
@ -797,9 +800,20 @@ func newUserListExport(list []U) (string, error) {
fileName := time.Now().Format(TimeFormat) + "所有会员" + ".xlsx" fileName := time.Now().Format(TimeFormat) + "所有会员" + ".xlsx"
fmt.Println("url fileName:", url+fileName) 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 { for i, _ := range title {
cell, _ := excelize.CoordinatesToCellName(1+i, 1) cell, _ := excelize.CoordinatesToCellName(1+i, 1)
err := file.SetCellValue(fSheet, cell, title[i]) err := file.SetCellValue(fSheet, cell, title[i])
@ -846,24 +860,28 @@ func newUserListExport(list []U) (string, error) {
} }
row = []interface{}{ row = []interface{}{
list[i].Uid, // 用户ID 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, // 未归还卡带串码
} }
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 { for j, _ := range row {
cell, _ := excelize.CoordinatesToCellName(1+j, nExcelStartRow+2) cell, _ := excelize.CoordinatesToCellName(1+j, nExcelStartRow+2)
err := file.SetCellValue(fSheet, cell, row[j]) err := file.SetCellValue(fSheet, cell, row[j])
@ -888,13 +906,26 @@ func newUserListExport(list []U) (string, error) {
{"type":"right","color":"000000","style":1}, {"type":"right","color":"000000","style":1},
{"type":"bottom","color":"000000","style":1}]}`) {"type":"bottom","color":"000000","style":1}]}`)
endRow := fmt.Sprintf("P%d", nExcelStartRow+1) var endRow string
// 应用样式到整个表格 switch nEndCount {
file.SetColWidth("Sheet1", "F", "F", 18) case 1:
file.SetColWidth("Sheet1", "G", "G", 18) endRow = fmt.Sprintf("P"+"%d", nExcelStartRow+1)
file.SetColWidth("Sheet1", "J", "J", 18) // 应用样式到整个表格
file.SetColWidth("Sheet1", "K", "K", 18) file.SetColWidth("Sheet1", "F", "F", 18)
_ = file.SetCellStyle("Sheet1", "A1", "P1", style1) 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) _ = file.SetCellStyle("Sheet1", "A2", endRow, style)
fmt.Println("save fileName:", config.ExportConfig.Path+fileName) fmt.Println("save fileName:", config.ExportConfig.Path+fileName)
@ -1739,7 +1770,7 @@ func (m *NewUserInviteRecordReq) NewList(c *gin.Context) (*UserInviteRecordListR
} }
if m.IsExport == 1 { if m.IsExport == 1 {
fileName, err := userInviteRecordExport(listData) fileName, err := userInviteRecordExport(listData, c)
if err != nil { if err != nil {
logger.Errorf("err:", logger.Field("err", err)) logger.Errorf("err:", logger.Field("err", err))
return nil, err return nil, err
@ -1798,6 +1829,10 @@ func getMemberTypeChineseDescription(memberType MemberType) string {
return "黄金→黑金(自动)" return "黄金→黑金(自动)"
case UpgradePlatinumToBlackAuto: case UpgradePlatinumToBlackAuto:
return "白金→黑金(自动)" return "白金→黑金(自动)"
case OpenAnnualPrivilege:
return "开通尊享会员"
case RenewAnnualPrivilegeAuto:
return "续费尊享会员"
default: default:
return "" return ""
} }
@ -1822,7 +1857,7 @@ func getMemberLevelChineseDescription(memberLevel uint32) string {
} }
// 导出会员邀请记录excel // 导出会员邀请记录excel
func userInviteRecordExport(list []UserInviteRecordListData) (string, error) { func userInviteRecordExport(list []UserInviteRecordListData, c *gin.Context) (string, error) {
file := excelize.NewFile() file := excelize.NewFile()
fSheet := "Sheet1" fSheet := "Sheet1"
@ -1830,8 +1865,17 @@ func userInviteRecordExport(list []UserInviteRecordListData) (string, error) {
fileName := time.Now().Format(TimeFormat) + "会员邀请记录" + ".xlsx" fileName := time.Now().Format(TimeFormat) + "会员邀请记录" + ".xlsx"
fmt.Println("url fileName:", url+fileName) 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 { for i, _ := range title {
cell, _ := excelize.CoordinatesToCellName(1+i, 1) cell, _ := excelize.CoordinatesToCellName(1+i, 1)
err := file.SetCellValue(fSheet, cell, title[i]) err := file.SetCellValue(fSheet, cell, title[i])
@ -1849,14 +1893,19 @@ func userInviteRecordExport(list []UserInviteRecordListData) (string, error) {
list[i].InviteUserName, // 邀请人昵称 list[i].InviteUserName, // 邀请人昵称
list[i].InviteUid, // 邀请人ID list[i].InviteUid, // 邀请人ID
list[i].UserUid, // 用户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 { for j, _ := range row {
cell, _ := excelize.CoordinatesToCellName(1+j, nExcelStartRow+2) cell, _ := excelize.CoordinatesToCellName(1+j, nExcelStartRow+2)
err := file.SetCellValue(fSheet, cell, row[j]) err := file.SetCellValue(fSheet, cell, row[j])
@ -1881,17 +1930,34 @@ func userInviteRecordExport(list []UserInviteRecordListData) (string, error) {
{"type":"right","color":"000000","style":1}, {"type":"right","color":"000000","style":1},
{"type":"bottom","color":"000000","style":1}]}`) {"type":"bottom","color":"000000","style":1}]}`)
endRow := fmt.Sprintf("J%d", nExcelStartRow+1) var endRow string
// 设置单元格大小 switch nEndCount {
file.SetColWidth("Sheet1", "A", "A", 30) case 1:
file.SetColWidth("Sheet1", "B", "B", 12) endRow = fmt.Sprintf("J"+"%d", nExcelStartRow+1)
file.SetColWidth("Sheet1", "E", "E", 15) // 设置单元格大小
file.SetColWidth("Sheet1", "F", "F", 20) file.SetColWidth("Sheet1", "A", "A", 30)
file.SetColWidth("Sheet1", "G", "G", 20) file.SetColWidth("Sheet1", "B", "B", 12)
file.SetColWidth("Sheet1", "H", "H", 20) file.SetColWidth("Sheet1", "E", "E", 15)
file.SetColWidth("Sheet1", "J", "J", 20) file.SetColWidth("Sheet1", "F", "F", 20)
// 应用样式到整个表格 file.SetColWidth("Sheet1", "G", "G", 20)
_ = file.SetCellStyle("Sheet1", "A1", "J1", style1) 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) _ = file.SetCellStyle("Sheet1", "A2", endRow, style)
fmt.Println("save fileName:", config.ExportConfig.Path+fileName) fmt.Println("save fileName:", config.ExportConfig.Path+fileName)
@ -4278,7 +4344,7 @@ func (m *PrivilegeMemberListReq) PrivilegeMemberList(c *gin.Context) (*Privilege
} }
if m.IsExport == 1 { if m.IsExport == 1 {
fileName, err := PrivilegeMemberExport(memberList) fileName, err := PrivilegeMemberExport(memberList, c)
if err != nil { if err != nil {
logger.Error("err:", logger.Field("err", err)) logger.Error("err:", logger.Field("err", err))
return nil, err return nil, err
@ -4295,7 +4361,7 @@ func (m *PrivilegeMemberListReq) PrivilegeMemberList(c *gin.Context) (*Privilege
} }
// PrivilegeMemberExport 尊享会员导出excel // PrivilegeMemberExport 尊享会员导出excel
func PrivilegeMemberExport(list []PrivilegeMember) (string, error) { func PrivilegeMemberExport(list []PrivilegeMember, c *gin.Context) (string, error) {
file := excelize.NewFile() file := excelize.NewFile()
fSheet := "Sheet1" fSheet := "Sheet1"
@ -4303,10 +4369,18 @@ func PrivilegeMemberExport(list []PrivilegeMember) (string, error) {
fileName := time.Now().Format(TimeFormat) + "零售尊享会员" + ".xlsx" fileName := time.Now().Format(TimeFormat) + "零售尊享会员" + ".xlsx"
fmt.Println("url fileName:", url+fileName) fmt.Println("url fileName:", url+fileName)
//title := []interface{}{"用户ID", "手机号", "所属门店", "当前会员等级", "首次开通尊享会员时间", "尊享会员到期时间", "延保状态", // 判断是否有权限
// "主机编码", "图片凭证", "审核人", "审核时间"} flag1, _ := checkRoleMenu(c, PrivilegeMemberMenu)
title := []interface{}{"用户ID", "手机号", "所属门店", "当前会员等级", "首次开通尊享会员时间", "尊享会员到期时间", "延保状态",
"主机编码", "审核人", "审核时间"} nEndCount := 0
title := []interface{}{"用户ID"}
if flag1 { // 手机号
title = append(title, "手机号")
nEndCount += 1
}
title = append(title, "所属门店", "当前会员等级", "首次开通尊享会员时间", "尊享会员到期时间", "延保状态",
"主机编码", "审核人", "审核时间")
for i, _ := range title { for i, _ := range title {
cell, _ := excelize.CoordinatesToCellName(1+i, 1) cell, _ := excelize.CoordinatesToCellName(1+i, 1)
err := file.SetCellValue(fSheet, cell, title[i]) err := file.SetCellValue(fSheet, cell, title[i])
@ -4343,19 +4417,23 @@ func PrivilegeMemberExport(list []PrivilegeMember) (string, error) {
default: default:
strExtendStatus = "" strExtendStatus = ""
} }
row = []interface{}{ row = []interface{}{
list[i].Uid, // 用户ID 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), // 审核时间
} }
// 控制是否导出
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 { for j, _ := range row {
cell, _ := excelize.CoordinatesToCellName(1+j, nExcelStartRow+2) cell, _ := excelize.CoordinatesToCellName(1+j, nExcelStartRow+2)
@ -4381,19 +4459,37 @@ func PrivilegeMemberExport(list []PrivilegeMember) (string, error) {
{"type":"right","color":"000000","style":1}, {"type":"right","color":"000000","style":1},
{"type":"bottom","color":"000000","style":1}]}`) {"type":"bottom","color":"000000","style":1}]}`)
endRow := fmt.Sprintf("J%d", nExcelStartRow+1) var endRow string
// 应用样式到整个表格 switch nEndCount {
file.SetColWidth("Sheet1", "A", "A", 12) case 1:
file.SetColWidth("Sheet1", "B", "B", 15) endRow = fmt.Sprintf("J"+"%d", nExcelStartRow+1)
file.SetColWidth("Sheet1", "C", "C", 30) // 应用样式到整个表格
file.SetColWidth("Sheet1", "D", "D", 18) file.SetColWidth("Sheet1", "A", "A", 12)
file.SetColWidth("Sheet1", "F", "E", 18) file.SetColWidth("Sheet1", "B", "B", 15)
file.SetColWidth("Sheet1", "F", "F", 18) file.SetColWidth("Sheet1", "C", "C", 30)
file.SetColWidth("Sheet1", "G", "G", 15) file.SetColWidth("Sheet1", "D", "D", 18)
file.SetColWidth("Sheet1", "H", "H", 18) file.SetColWidth("Sheet1", "F", "E", 18)
file.SetColWidth("Sheet1", "I", "I", 15) file.SetColWidth("Sheet1", "F", "F", 18)
file.SetColWidth("Sheet1", "J", "J", 18) file.SetColWidth("Sheet1", "G", "G", 15)
_ = file.SetCellStyle("Sheet1", "A1", "J1", style1) 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) _ = file.SetCellStyle("Sheet1", "A2", endRow, style)
fmt.Println("save fileName:", config.ExportConfig.Path+fileName) fmt.Println("save fileName:", config.ExportConfig.Path+fileName)
@ -4502,14 +4598,16 @@ func (m *CancelPrivilegeMembersReq) CancelPrivilegeMembers() (*PrivilegeMember,
} }
for i, _ := range userCoupon { for i, _ := range userCoupon {
err = begin.Table("user_coupon").Where("id = ?", userCoupon[i].ID).Updates(map[string]interface{}{ if userCoupon[i].State == 1 { // 只更新未使用的优惠券
"state": 3, err = begin.Table("user_coupon").Where("id = ?", userCoupon[i].ID).Updates(map[string]interface{}{
"updated_at": time.Now(), "state": 3,
}).Error "updated_at": time.Now(),
if err != nil { }).Error
begin.Rollback() if err != nil {
logger.Error("UpdateCoupon err:", logger.Field("err", err)) begin.Rollback()
return nil, err logger.Error("UpdateCoupon err:", logger.Field("err", err))
return nil, err
}
} }
} }

View File

@ -9224,6 +9224,14 @@ const docTemplate = `{
"description": "实际零售价", "description": "实际零售价",
"type": "number" "type": "number"
}, },
"category_number": {
"description": "商品分类编号",
"type": "string"
},
"commodity_serial_number": {
"description": "商品编号",
"type": "string"
},
"count": { "count": {
"description": "销售数量", "description": "销售数量",
"type": "integer" "type": "integer"
@ -9608,6 +9616,10 @@ const docTemplate = `{
"description": "收银人员:制单人", "description": "收银人员:制单人",
"type": "string" "type": "string"
}, },
"couponAmount": {
"description": "优惠券优惠总金额",
"type": "number"
},
"integrationAmount": { "integrationAmount": {
"description": "积分抵扣总金额", "description": "积分抵扣总金额",
"type": "number" "type": "number"
@ -10625,7 +10637,7 @@ const docTemplate = `{
"type": "string" "type": "string"
}, },
"state": { "state": {
"description": "1-待审核 2-待入库 3-待退货 4-已完成 5-已终止", "description": "1-待审核 2-待入库 3-待退货 4-已完成 5-已终止 6-操作中",
"type": "integer" "type": "integer"
}, },
"store_id": { "store_id": {
@ -13853,6 +13865,10 @@ const docTemplate = `{
"description": "1-导出", "description": "1-导出",
"type": "integer" "type": "integer"
}, },
"is_order_query": {
"description": "1-新建零售订单时查询,不限制门店",
"type": "integer"
},
"member_level": { "member_level": {
"description": "当前会员等级:10-普通用户 1-普通会员 2-黄金会员 4-白金会员 5-黑金会员", "description": "当前会员等级:10-普通用户 1-普通会员 2-黄金会员 4-白金会员 5-黑金会员",
"type": "array", "type": "array",

View File

@ -9213,6 +9213,14 @@
"description": "实际零售价", "description": "实际零售价",
"type": "number" "type": "number"
}, },
"category_number": {
"description": "商品分类编号",
"type": "string"
},
"commodity_serial_number": {
"description": "商品编号",
"type": "string"
},
"count": { "count": {
"description": "销售数量", "description": "销售数量",
"type": "integer" "type": "integer"
@ -9597,6 +9605,10 @@
"description": "收银人员:制单人", "description": "收银人员:制单人",
"type": "string" "type": "string"
}, },
"couponAmount": {
"description": "优惠券优惠总金额",
"type": "number"
},
"integrationAmount": { "integrationAmount": {
"description": "积分抵扣总金额", "description": "积分抵扣总金额",
"type": "number" "type": "number"
@ -10614,7 +10626,7 @@
"type": "string" "type": "string"
}, },
"state": { "state": {
"description": "1-待审核 2-待入库 3-待退货 4-已完成 5-已终止", "description": "1-待审核 2-待入库 3-待退货 4-已完成 5-已终止 6-操作中",
"type": "integer" "type": "integer"
}, },
"store_id": { "store_id": {
@ -13842,6 +13854,10 @@
"description": "1-导出", "description": "1-导出",
"type": "integer" "type": "integer"
}, },
"is_order_query": {
"description": "1-新建零售订单时查询,不限制门店",
"type": "integer"
},
"member_level": { "member_level": {
"description": "当前会员等级:10-普通用户 1-普通会员 2-黄金会员 4-白金会员 5-黑金会员", "description": "当前会员等级:10-普通用户 1-普通会员 2-黄金会员 4-白金会员 5-黑金会员",
"type": "array", "type": "array",

View File

@ -2145,6 +2145,12 @@ definitions:
amount: amount:
description: 实际零售价 description: 实际零售价
type: number type: number
category_number:
description: 商品分类编号
type: string
commodity_serial_number:
description: 商品编号
type: string
count: count:
description: 销售数量 description: 销售数量
type: integer type: integer
@ -2427,6 +2433,9 @@ definitions:
collectS: collectS:
description: 收银人员:制单人 description: 收银人员:制单人
type: string type: string
couponAmount:
description: 优惠券优惠总金额
type: number
integrationAmount: integrationAmount:
description: 积分抵扣总金额 description: 积分抵扣总金额
type: number type: number
@ -3168,7 +3177,7 @@ definitions:
description: 单据编号 description: 单据编号
type: string type: string
state: state:
description: 1-待审核 2-待入库 3-待退货 4-已完成 5-已终止 description: 1-待审核 2-待入库 3-待退货 4-已完成 5-已终止 6-操作中
type: integer type: integer
store_id: store_id:
description: 门店id description: 门店id
@ -5492,6 +5501,9 @@ definitions:
is_export: is_export:
description: 1-导出 description: 1-导出
type: integer type: integer
is_order_query:
description: 1-新建零售订单时查询,不限制门店
type: integer
member_level: member_level:
description: 当前会员等级:10-普通用户 1-普通会员 2-黄金会员 4-白金会员 5-黑金会员 description: 当前会员等级:10-普通用户 1-普通会员 2-黄金会员 4-白金会员 5-黑金会员
items: items: