1、提交尊享会员相关优化;
This commit is contained in:
parent
a2a2dbaf0b
commit
ab027172e6
|
@ -190,6 +190,9 @@ func ErpOrderAudit(c *gin.Context) {
|
|||
case 1: // 审核
|
||||
orderState = model.ErpOrderStateAudited
|
||||
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))
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -127,6 +127,8 @@ type ErpOrderCommodity struct {
|
|||
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
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -1669,6 +1669,7 @@ func TranslateFundType(fundType string) string {
|
|||
"deposit_refund": "退押金",
|
||||
"express_fee_refund": "退邮费",
|
||||
"downgrade_renewal": "降级续费",
|
||||
"privilege_member_fee": "尊享会员费",
|
||||
}
|
||||
|
||||
if val, ok := fundTypeMap[fundType]; ok {
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,6 +329,7 @@ func GetNewUserList(req *NewUserListReq, c *gin.Context) (*NewUserListResp, erro
|
|||
|
||||
qs := orm.Eloquent.Model(&UserInfo{}).Debug()
|
||||
|
||||
if req.IsOrderQuery != 1 { // 不是新建零售订单,需要校验门店权限
|
||||
// 非管理员才判断所属门店
|
||||
if !(tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员") {
|
||||
sysUser, err := GetSysUserByCtx(c)
|
||||
|
@ -354,6 +356,7 @@ func GetNewUserList(req *NewUserListReq, c *gin.Context) (*NewUserListResp, erro
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if req.Tel != "" {
|
||||
qs = qs.Where("user.tel", req.Tel)
|
||||
|
@ -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])
|
||||
|
@ -847,23 +861,27 @@ 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, // 未归还卡带串码
|
||||
}
|
||||
|
||||
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)
|
||||
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,7 +1930,10 @@ 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)
|
||||
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)
|
||||
|
@ -1892,6 +1944,20 @@ func userInviteRecordExport(list []UserInviteRecordListData) (string, error) {
|
|||
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), // 审核时间
|
||||
}
|
||||
// 控制是否导出
|
||||
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,7 +4459,10 @@ 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)
|
||||
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)
|
||||
|
@ -4394,6 +4475,21 @@ func PrivilegeMemberExport(list []PrivilegeMember) (string, error) {
|
|||
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,6 +4598,7 @@ func (m *CancelPrivilegeMembersReq) CancelPrivilegeMembers() (*PrivilegeMember,
|
|||
}
|
||||
|
||||
for i, _ := range userCoupon {
|
||||
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(),
|
||||
|
@ -4512,6 +4609,7 @@ func (m *CancelPrivilegeMembersReq) CancelPrivilegeMembers() (*PrivilegeMember,
|
|||
return nil, err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 更新用户积分
|
||||
err = UserVmUpdate(begin, "", uint32(m.Uid), -199, VmEventCancelPrivilegeMember,
|
||||
|
|
18
docs/docs.go
18
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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue
Block a user