Compare commits

...

2 Commits

Author SHA1 Message Date
171ac9bb5e 1.完善店员绩效导出excel功能;
2.归还订单时如果物流订单号不为空则记录;
2024-02-01 18:11:22 +08:00
d5d52321cc 1.新增店员绩效导出excel功能; 2024-02-01 16:19:23 +08:00
7 changed files with 268 additions and 87 deletions

View File

@ -654,19 +654,13 @@ func AssistantInviteMemberReportList(c *gin.Context) {
req.SysUser = sysUser
//req.CooperativeBusinessId = sysUser.CooperativeBusinessId
list, count, err := req.List()
ret, err := req.List()
if err != nil {
logger.Errorf("err:", err)
app.Error(c, http.StatusInternalServerError, err, "查询失败")
return
}
ret := models.AssistantInviteMemberReportListResp{
List: list,
CurPage: req.Page,
Count: count,
}
app.OK(c, ret, "")
return
}

View File

@ -289,7 +289,7 @@ type ErpCommodityListResp struct {
Total int `json:"count"` // 数据总条数
PageIndex int `json:"pageIndex"` // 页码
PageSize int `json:"pageSize"` // 每页展示条数
ExportUrl string `json:"export_url"` // 1-导出
ExportUrl string `json:"export_url"` // 文件路径
}
func (m *ErpCommodityListReq) List() (*ErpCommodityListResp, error) {

View File

@ -1163,16 +1163,31 @@ func (m *Order) Revert() error {
return nil
})
eg.Go(func() error {
err := begin.Table("order_card").Where("id=?", orderCard.ID).Updates(&map[string]interface{}{
//"store_id": m.StoreId,
"card_status": OrderCardStatusCompleted,
"revert_store_id": m.RevertStoreId,
"revert_time": time.Now(),
"revert_shopper_code": m.RevertShopperCode,
}).Error
if err != nil {
logger.Errorf("err:", logger.Field("err", err))
return err
if m.RevertExpressNo != "" { // 物流单号不为空则记录到数据库2024/2/1 产品新需求,解决用户物流归还但小程序不提交归还信息,店员要输入手机号的问题
err = begin.Table("order_card").Where("id=?", orderCard.ID).Updates(&map[string]interface{}{
//"store_id": m.StoreId,
"card_status": OrderCardStatusCompleted,
"revert_store_id": m.RevertStoreId,
"revert_time": time.Now(),
"revert_shopper_code": m.RevertShopperCode,
"revert_express_no": m.RevertExpressNo,
}).Error
if err != nil {
logger.Errorf("err:", logger.Field("err", err))
return err
}
} else {
err = begin.Table("order_card").Where("id=?", orderCard.ID).Updates(&map[string]interface{}{
//"store_id": m.StoreId,
"card_status": OrderCardStatusCompleted,
"revert_store_id": m.RevertStoreId,
"revert_time": time.Now(),
"revert_shopper_code": m.RevertShopperCode,
}).Error
if err != nil {
logger.Errorf("err:", logger.Field("err", err))
return err
}
}
var count int64
err = orm.Eloquent.Table("order_card").Where("order_id=?", orderCard.OrderId).

View File

@ -813,11 +813,13 @@ func (m *UserAddress) TableName() string {
type InviteMemberReport struct {
Model
Uid uint32 `json:"uid" gorm:"index"` // 店员uid
StoreId uint32 `json:"store_id" gorm:"index"` // 门店id
GoldCount uint32 `json:"gold_count"` // 黄金数量
PlatinumCount uint32 `json:"platinum_count"` // 白金数量
BlackGoldCount uint32 `json:"black_gold_count"` // 黑金数量
Uid uint32 `json:"uid" gorm:"index"` // 店员uid
StoreId uint32 `json:"store_id" gorm:"index"` // 门店id
GoldCount uint32 `json:"gold_count"` // 黄金数量
GoldCountHalf uint32 `json:"gold_count_half"` // 半年黄金数量
GoldCountQuarter uint32 `json:"gold_count_quarter"` // 季度黄金数量
PlatinumCount uint32 `json:"platinum_count"` // 白金数量
BlackGoldCount uint32 `json:"black_gold_count"` // 黑金数量
//ReportTime string `json:"report_time" gorm:"index"` // 业绩时间
Date string `json:"date" gorm:"index"` // 业绩时间
DeductAmount uint32 `json:"deduct_amount"` // 店员提成
@ -826,7 +828,9 @@ type InviteMemberReport struct {
GoldDeduct uint32 `json:"gold_deduct"` // 黄金会员提成
PlatinumDeduct uint32 `json:"platinum_deduct"` // 白金会员提成
BlackGoldDeduct uint32 `json:"black_gold_deduct"` // 黑金会员提成
RenewalGoldCount uint32 `json:"renewal_gold_count"` // 续费黄金会员数量(自动)
RenewalGoldCount uint32 `json:"renewal_gold_count"` // 续费年度黄金会员数量(自动)
RenewalGoldCountHalf uint32 `json:"renewal_gold_count_half"` // 续费半年黄金会员数量(自动)
RenewalGoldCountQuarter uint32 `json:"renewal_gold_count_quarter"` // 续费季度黄金会员数量(自动)
RenewalPlatinumCount uint32 `json:"renewal_platinum_count"` // 续费白金会员数量(自动)
RenewalBlackGoldCount uint32 `json:"renewal_black_gold_count"` // 续费黑金会员数量(自动)
UpgradeGoldToPlatinumCount uint32 `json:"upgrade_gold_to_platinum_count" gorm:"default:0"` // 升级:黄金->白金数量(自动)
@ -2565,29 +2569,35 @@ func GetSysUser(suid interface{}) (SysUser, error) {
type AssistantInviteMemberReportReq struct {
CooperativeBusinessId uint32 `json:"cooperative_business_id"` // 合作商id
StoreId uint32 `json:"store_id"` // 门店id
SysUser SysUser `json:"sys_user"`
Date string `json:"date"` // 日期
Page int `json:"pageIndex"` // 页码
PageSize int `json:"pageSize"` // 每页数量
Uid uint32 `json:"uid"` // 店员小程序id
InviteName string `json:"invite_name"` // 邀请人昵称
Date string `json:"date"` // 日期
PageIndex int `json:"pageIndex"` // 页码
PageSize int `json:"pageSize"` // 每页数量
IsExport uint32 `json:"is_export"` // 1-导出
SysUser SysUser `json:"sys_user"` //
}
type AssistantInviteMemberReportListResp struct {
Count int64 `json:"count"`
List []InviteMemberReport `json:"list"`
CurPage int `json:"cur_page"`
List []InviteMemberReport `json:"list"`
Total int64 `json:"count"` // 数据总条数
PageIndex int `json:"pageIndex"` // 页码
PageSize int `json:"pageSize"` // 每页展示条数
ExportUrl string `json:"export_url"` // 导出excel地址
}
func (m *AssistantInviteMemberReportReq) List() ([]InviteMemberReport, int64, error) {
func (m *AssistantInviteMemberReportReq) List() (*AssistantInviteMemberReportListResp, error) {
resp := new(AssistantInviteMemberReportListResp)
var memberReport []InviteMemberReport
var users []UserInfo
err := orm.Eloquent.Table("user").Where("user_type=2").Where("shop_assistant_name=''").Find(&users).Error
err := orm.Eloquent.Table("user").Where("user_type=2").Find(&users).Error
if err != nil {
logger.Error("err:", logger.Field("err", err))
return memberReport, 0, err
return nil, err
}
uids := make([]uint32, 0, len(users))
uids := make(map[string]uint32, 0)
for i, _ := range users {
uids = append(uids, users[i].Uid)
uids[users[i].ShopAssistantName] = users[i].Uid
}
qs := orm.Eloquent.Table("invite_member_report")
@ -2596,8 +2606,14 @@ func (m *AssistantInviteMemberReportReq) List() ([]InviteMemberReport, int64, er
} else {
qs = qs.Where("cooperative_business_id=?", m.CooperativeBusinessId)
}
if len(uids) > 0 {
qs = qs.Where("uid NOT IN (?)", uids)
//if len(uids) > 0 {
// qs = qs.Where("uid NOT IN (?)", uids)
//}
if m.InviteName != "" {
m.Uid = uids[m.InviteName]
}
if m.Uid != 0 {
qs = qs.Where("uid=?", m.Uid)
}
if m.StoreId != 0 {
qs = qs.Where("store_id=?", m.StoreId)
@ -2610,9 +2626,9 @@ func (m *AssistantInviteMemberReportReq) List() ([]InviteMemberReport, int64, er
err = qs.Count(&count).Error
if err != nil {
logger.Error("count err:", logger.Field("err", err))
return memberReport, 0, err
return nil, err
}
page := m.Page - 1
page := m.PageIndex - 1
if page < 0 {
page = 0
}
@ -2621,10 +2637,18 @@ func (m *AssistantInviteMemberReportReq) List() ([]InviteMemberReport, int64, er
}
//totalPage := int(count)/m.PageSize + 1
err = qs.Order("store_id DESC,id DESC").Offset(page * m.PageSize).Limit(m.PageSize).Find(&memberReport).Error
if err != nil && err != RecordNotFound {
logger.Error("err:", logger.Field("err", err))
return memberReport, count, err
if m.IsExport == 1 { // 导出excel
err = qs.Order("store_id DESC,id DESC").Find(&memberReport).Error
if err != nil && err != RecordNotFound {
logger.Error("err:", logger.Field("err", err))
return nil, err
}
} else {
err = qs.Order("store_id DESC,id DESC").Offset(page * m.PageSize).Limit(m.PageSize).Find(&memberReport).Error
if err != nil && err != RecordNotFound {
logger.Error("err:", logger.Field("err", err))
return nil, err
}
}
//assistant := GetUserByUid(m.Uid)
@ -2645,7 +2669,23 @@ func (m *AssistantInviteMemberReportReq) List() ([]InviteMemberReport, int64, er
// memberReport[len(memberReport)-1].DeductAmount += report.BlackGoldCount * report.BlackGoldDeduct
//}
memberReport = InviteMemberReportListSetUser(memberReport)
return memberReport, count, nil
memberReport = InviteMemberReportListSetStore(memberReport)
if m.IsExport == 1 {
fileName, err := inviteMemberReport(memberReport)
if err != nil {
logger.Error("err:", logger.Field("err", err))
return nil, err
}
resp.ExportUrl = fileName
} else {
resp.List = memberReport
resp.Total = count
resp.PageSize = m.PageSize
resp.PageIndex = m.PageIndex
}
return resp, nil
}
// 店员绩效导出excel
@ -2657,18 +2697,18 @@ func inviteMemberReport(list []InviteMemberReport) (string, error) {
fileName := time.Now().Format(TimeFormat) + "店员绩效" + ".xlsx"
fmt.Println("url fileName:", url+fileName)
title1 := []interface{}{"昵称", "小程序ID", "合作商", "门店",
title1 := []interface{}{"昵称", "小程序ID", "合作商", "门店", "月份",
"开通会员数", "开通会员数", "开通会员数", "开通会员数", "开通会员数",
"续费会员数(干预)", "续费会员数(干预)", "续费会员数(干预)",
"升级会员数(干预)", "升级会员数(干预)", "升级会员数(干预)",
"续费会员数(自动)", "续费会员数(自动)", "续费会员数(自动)", "续费会员数(自动)", "续费会员数(自动)",
"升级会员数(自动)", "升级会员数(自动)", "升级会员数(自动)"}
title2 := []interface{}{"昵称", "小程序ID", "合作商", "门店",
"年费黄金会员_数量", "半年黄金", "季度黄金", "年费白金会员_数量", "年费黑金会员_数量",
title2 := []interface{}{"昵称", "小程序ID", "合作商", "门店", "月份",
"年费黄金", "半年黄金", "季度黄金", "年费白金", "年费黑金",
"年费黄金", "年费白金", "年费黑金",
"黄金->白金", "黄金->黑金", "白金->黑金",
"续费会员数(自动)", "续费会员数(自动)", "续费会员数(自动)", "续费会员数(自动)", "续费会员数(自动)",
"升级会员数(自动)", "升级会员数(自动)", "升级会员数(自动)"}
"年费黄金", "半年黄金", "季度黄金", "年费白金", "年费黑金",
"黄金->白金", "黄金->黑金", "白金->黑金"}
for i, _ := range title1 {
cell, _ := excelize.CoordinatesToCellName(1+i, 1)
err := file.SetCellValue(fSheet, cell, title1[i])
@ -2689,19 +2729,44 @@ func inviteMemberReport(list []InviteMemberReport) (string, error) {
nExcelStartRow := 0
for i := 0; i < len(list); i++ {
storeName := ""
if list[i].Store != nil {
storeName = list[i].Store.Name
}
shopAssistantName := ""
if list[i].User != nil {
shopAssistantName = list[i].User.ShopAssistantName
}
row = []interface{}{
list[i].CooperativeName, // 合作商
list[i].Store.Name, // 门店名称
list[i].GoldCount, // 开通会员:黄金会员数量
list[i].PlatinumCount, // 开通会员:白金会员数量
list[i].BlackGoldCount, // 开通会员:黑金会员数量
list[i].RenewalGoldCount, // 续费会员:黄金会员数量
list[i].RenewalPlatinumCount, // 续费会员:白金会员数量
list[i].RenewalBlackGoldCount, // 续费会员:黑金会员数量
list[i].UpgradeGoldToPlatinumCount, // 升级:黄金->白金数量
list[i].UpgradeGoldToBlackCount, // 升级:黄金->黑金数量
list[i].UpgradePlatinumToBlackCount, // 升级:白金->黑金数量
list[i].Date,
shopAssistantName, // 昵称
list[i].Uid, // 小程序ID
list[i].CooperativeName, // 合作商名称
storeName, // 门店名称
list[i].Date, // 月份
list[i].GoldCount, // 开通会员:年费黄金
list[i].GoldCountHalf, //开通会员:半年黄金
list[i].GoldCountQuarter, //开通会员:季度黄金
list[i].PlatinumCount, // 开通会员:年费白金
list[i].BlackGoldCount, // 开通会员:年费黑金
list[i].InviteRenewalGoldCount, // 续费会员(干预):年费黄金
list[i].InviteRenewalPlatinumCount, // 续费会员(干预):白金
list[i].InviteRenewalBlackGoldCount, // 续费会员(干预):黑金
list[i].InviteUpgradeGoldToPlatinumCount, // 升级(干预):黄金->白金数量
list[i].InviteUpgradeGoldToBlackCount, // 升级(干预):黄金->黑金数量
list[i].InviteUpgradePlatinumToBlackCount, // 升级(干预):白金->黑金数量
list[i].RenewalGoldCount, // 续费会员(自动):年费黄金
list[i].RenewalGoldCountHalf, // 续费会员(自动):半年黄金
list[i].RenewalGoldCountQuarter, // 续费会员(自动):季度黄金
list[i].RenewalPlatinumCount, // 续费会员(自动):白金
list[i].RenewalBlackGoldCount, // 续费会员(自动):黑金
list[i].UpgradeGoldToPlatinumCount, // 升级(自动):黄金->白金数量
list[i].UpgradeGoldToBlackCount, // 升级(自动):黄金->黑金数量
list[i].UpgradePlatinumToBlackCount, // 升级(自动):白金->黑金数量
}
for j, _ := range row {
@ -2728,27 +2793,29 @@ func inviteMemberReport(list []InviteMemberReport) (string, error) {
{"type":"right","color":"000000","style":1},
{"type":"bottom","color":"000000","style":1}]}`)
endRow := fmt.Sprintf("L%d", nExcelStartRow+2)
endRow := fmt.Sprintf("X%d", nExcelStartRow+2)
// 合并单元格
_ = file.MergeCell(fSheet, "A1", "A2")
_ = file.MergeCell(fSheet, "B1", "B2")
_ = file.MergeCell(fSheet, "C1", "E1")
_ = file.MergeCell(fSheet, "F1", "H1")
_ = file.MergeCell(fSheet, "I1", "K1")
_ = file.MergeCell(fSheet, "L1", "L2")
_ = file.MergeCell(fSheet, "C1", "C2")
_ = file.MergeCell(fSheet, "D1", "D2")
_ = file.MergeCell(fSheet, "E1", "E2")
_ = file.MergeCell(fSheet, "F1", "J1")
_ = file.MergeCell(fSheet, "K1", "M1")
_ = file.MergeCell(fSheet, "N1", "P1")
_ = file.MergeCell(fSheet, "Q1", "U1")
_ = file.MergeCell(fSheet, "V1", "X1")
//设置单元格高度
file.SetRowHeight("Sheet1", 1, 18)
file.SetRowHeight("Sheet1", 2, 18)
// 设置单元格大小
file.SetColWidth("Sheet1", "A", "A", 15)
file.SetColWidth("Sheet1", "B", "B", 20)
file.SetRowHeight("Sheet1", 1, 20)
file.SetRowHeight("Sheet1", 2, 20)
// 从列 C 到列 K逐一设置宽度为 20
for col := 'C'; col <= 'K'; col++ {
for col := 'F'; col <= 'X'; col++ {
colName := string(col)
file.SetColWidth("Sheet1", colName, colName, 12)
file.SetColWidth("Sheet1", colName, colName, 9)
}
// 应用样式到整个表格
_ = file.SetCellStyle("Sheet1", "A1", "L1", style1)
_ = file.SetCellStyle("Sheet1", "A1", "X1", style1)
_ = file.SetCellStyle("Sheet1", "A2", endRow, style)
fmt.Println("save fileName:", config.ExportConfig.Path+fileName)

View File

@ -4903,16 +4903,26 @@ const docTemplate = `{
"type": "object",
"properties": {
"count": {
"description": "数据总条数",
"type": "integer"
},
"cur_page": {
"type": "integer"
"export_url": {
"description": "导出excel地址",
"type": "string"
},
"list": {
"type": "array",
"items": {
"$ref": "#/definitions/models.InviteMemberReport"
}
},
"pageIndex": {
"description": "页码",
"type": "integer"
},
"pageSize": {
"description": "每页展示条数",
"type": "integer"
}
}
},
@ -4927,6 +4937,14 @@ const docTemplate = `{
"description": "日期",
"type": "string"
},
"invite_name": {
"description": "邀请人昵称",
"type": "string"
},
"is_export": {
"description": "1-导出",
"type": "integer"
},
"pageIndex": {
"description": "页码",
"type": "integer"
@ -4941,6 +4959,10 @@ const docTemplate = `{
},
"sys_user": {
"$ref": "#/definitions/models.SysUser"
},
"uid": {
"description": "店员小程序id",
"type": "integer"
}
}
},
@ -5882,7 +5904,7 @@ const docTemplate = `{
"type": "integer"
},
"export_url": {
"description": "1-导出",
"description": "文件路径",
"type": "string"
},
"list": {
@ -7399,6 +7421,14 @@ const docTemplate = `{
"description": "黄金数量",
"type": "integer"
},
"gold_count_half": {
"description": "半年黄金数量",
"type": "integer"
},
"gold_count_quarter": {
"description": "季度黄金数量",
"type": "integer"
},
"gold_deduct": {
"description": "黄金会员提成",
"type": "integer"
@ -7444,7 +7474,15 @@ const docTemplate = `{
"type": "integer"
},
"renewal_gold_count": {
"description": "续费黄金会员数量(自动)",
"description": "续费年度黄金会员数量(自动)",
"type": "integer"
},
"renewal_gold_count_half": {
"description": "续费半年黄金会员数量(自动)",
"type": "integer"
},
"renewal_gold_count_quarter": {
"description": "续费季度黄金会员数量(自动)",
"type": "integer"
},
"renewal_platinum_count": {

View File

@ -4892,16 +4892,26 @@
"type": "object",
"properties": {
"count": {
"description": "数据总条数",
"type": "integer"
},
"cur_page": {
"type": "integer"
"export_url": {
"description": "导出excel地址",
"type": "string"
},
"list": {
"type": "array",
"items": {
"$ref": "#/definitions/models.InviteMemberReport"
}
},
"pageIndex": {
"description": "页码",
"type": "integer"
},
"pageSize": {
"description": "每页展示条数",
"type": "integer"
}
}
},
@ -4916,6 +4926,14 @@
"description": "日期",
"type": "string"
},
"invite_name": {
"description": "邀请人昵称",
"type": "string"
},
"is_export": {
"description": "1-导出",
"type": "integer"
},
"pageIndex": {
"description": "页码",
"type": "integer"
@ -4930,6 +4948,10 @@
},
"sys_user": {
"$ref": "#/definitions/models.SysUser"
},
"uid": {
"description": "店员小程序id",
"type": "integer"
}
}
},
@ -5871,7 +5893,7 @@
"type": "integer"
},
"export_url": {
"description": "1-导出",
"description": "文件路径",
"type": "string"
},
"list": {
@ -7388,6 +7410,14 @@
"description": "黄金数量",
"type": "integer"
},
"gold_count_half": {
"description": "半年黄金数量",
"type": "integer"
},
"gold_count_quarter": {
"description": "季度黄金数量",
"type": "integer"
},
"gold_deduct": {
"description": "黄金会员提成",
"type": "integer"
@ -7433,7 +7463,15 @@
"type": "integer"
},
"renewal_gold_count": {
"description": "续费黄金会员数量(自动)",
"description": "续费年度黄金会员数量(自动)",
"type": "integer"
},
"renewal_gold_count_half": {
"description": "续费半年黄金会员数量(自动)",
"type": "integer"
},
"renewal_gold_count_quarter": {
"description": "续费季度黄金会员数量(自动)",
"type": "integer"
},
"renewal_platinum_count": {

View File

@ -420,13 +420,21 @@ definitions:
models.AssistantInviteMemberReportListResp:
properties:
count:
description: 数据总条数
type: integer
cur_page:
type: integer
export_url:
description: 导出excel地址
type: string
list:
items:
$ref: '#/definitions/models.InviteMemberReport'
type: array
pageIndex:
description: 页码
type: integer
pageSize:
description: 每页展示条数
type: integer
type: object
models.AssistantInviteMemberReportReq:
properties:
@ -436,6 +444,12 @@ definitions:
date:
description: 日期
type: string
invite_name:
description: 邀请人昵称
type: string
is_export:
description: 1-导出
type: integer
pageIndex:
description: 页码
type: integer
@ -447,6 +461,9 @@ definitions:
type: integer
sys_user:
$ref: '#/definitions/models.SysUser'
uid:
description: 店员小程序id
type: integer
type: object
models.BatchPrintInfo:
properties:
@ -1129,7 +1146,7 @@ definitions:
description: 数据总条数
type: integer
export_url:
description: 1-导出
description: 文件路径
type: string
list:
items:
@ -2238,6 +2255,12 @@ definitions:
gold_count:
description: 黄金数量
type: integer
gold_count_half:
description: 半年黄金数量
type: integer
gold_count_quarter:
description: 季度黄金数量
type: integer
gold_deduct:
description: 黄金会员提成
type: integer
@ -2272,7 +2295,13 @@ definitions:
description: 续费黑金会员数量(自动)
type: integer
renewal_gold_count:
description: 续费黄金会员数量(自动)
description: 续费年度黄金会员数量(自动)
type: integer
renewal_gold_count_half:
description: 续费半年黄金会员数量(自动)
type: integer
renewal_gold_count_quarter:
description: 续费季度黄金会员数量(自动)
type: integer
renewal_platinum_count:
description: 续费白金会员数量(自动)