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

@ -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))

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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 {

View File

@ -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 {

View File

@ -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
}
}

View File

@ -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,

View File

@ -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",

View File

@ -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",

View File

@ -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: