1.库存详情接口商品名称支持复选;

2.零售订单表增加返回银联流水号字段bank_trx_no,查询零售订单列表/详情/零售明细时返回该字段;
3.订单支付记录表增加字段bank_trx_no;
4.零售明细支持银联流水号、收付款方式id的搜索查询;
5.优化店员绩效排序规则:月份时间距离近(date)>门店ID小;
6.每月1号新增店员本月绩效记录时,相关数据默认置为0,避免为null时sql执行+1不生效的问题;
This commit is contained in:
chenlin 2024-07-12 09:39:14 +08:00
parent b669654f7e
commit 17c8472e76
7 changed files with 176 additions and 33 deletions

View File

@ -308,7 +308,7 @@ func QueryName(c *gin.Context) {
}
var detailReq models.ErpStockCommodityListReq
detailReq.CommodityName = req.CommodityName
detailReq.CommodityName = append(detailReq.CommodityName, req.CommodityName)
detailReq.PageIndex = req.PageIndex
detailReq.PageSize = req.PageSize
detailReq.StoreId = req.StoreId

View File

@ -2261,7 +2261,7 @@ type ErpStockCommodityListReq struct {
ErpStockId uint32 `json:"erp_stock_id"` // 库存id
ErpCommodityId uint32 `json:"erp_commodity_id"` // 商品id
SerialNumber string `json:"serial_number"` // 商品编号
CommodityName string `json:"commodity_name"` // 商品名称
CommodityName []string `json:"commodity_name"` // 商品名称
ErpCategoryId uint32 `json:"erp_category_id"` // 商品分类Id
IsIMEI uint32 `json:"is_imei"` // 是否串码0-查全部 1-查串码类 2-查非串码
IMEI string `json:"imei"` // 串码
@ -2542,11 +2542,11 @@ func (m *ErpStockCommodityListReq) buildQueryConditions(qs *gorm.DB, nType uint3
qs = qs.Where("commodity_serial_number=?", m.SerialNumber)
}
if m.CommodityName != "" { //商品名称
if len(m.CommodityName) != 0 { //商品名称
if nType == 1 {
qs = qs.Where("erp_commodity_name = ?", m.CommodityName)
qs = qs.Where("erp_commodity_name IN (?)", m.CommodityName)
} else {
qs = qs.Where("erp_commodity_name like ?", "%"+m.CommodityName+"%")
qs = qs.Where("erp_commodity_name like ?", "%"+m.CommodityName[0]+"%")
}
}

View File

@ -83,6 +83,7 @@ type ErpOrder struct {
RejectedTotalCount uint32 `json:"rejected_total_count" gorm:"-"` // 订单总退货数量
StorePer float64 `json:"store_per"` // 门店提成订单总员工毛利X该门店设置好的提成比例保留到小数后两位多余舍去
TotalDiscount float64 `json:"total_discount"` // 订单总优惠:订单所有商品零售优惠+会员优惠+会员积分抵扣之和
BankTrxNo string `json:"bank_trx_no" gorm:"-"` // 银行流水号
Commodities []ErpOrderCommodity `json:"commodities" gorm:"-"` // 零售订单商品信息
Cashiers []ErpOrderCashier `json:"cashiers" gorm:"-"` // 收付款方式
Salesman []ErpOrderSales `json:"salesman" gorm:"-"` // 销售员信息
@ -162,6 +163,7 @@ type ErpOrderRecord struct {
OutOrderNo string `json:"out_order_no"` // 商户订单号
PlatTrxNo string `json:"plat_trx_no"` // 平台交易流水号
BankOrderNo string `json:"bank_order_no"` // 银行订单号
BankTrxNo string `json:"bank_trx_no"` // 银行流水号
TotalAmount float64 `json:"total_amount"` // 订单总金额
PayWay string `json:"pay_way"` // 支付方式
Status string `json:"status"` // 支付状态
@ -331,6 +333,8 @@ type ErpOrderRetailDetailReq struct {
IMEI string `json:"imei"` // 串码
StartTime string `json:"start_time"` // 开始时间
EndTime string `json:"end_time"` // 结束时间
BankTrxNo string `json:"bank_trx_no"` // 银联流水号
CashierId uint32 `json:"cashier_id"` // 收付款方式id
PageIndex int `json:"pageIndex"` // 页码
PageSize int `json:"pageSize"` // 页面条数
IsExport uint32 `json:"is_export"` // 1-导出
@ -594,6 +598,7 @@ func (m *ErpOrderListReq) List(c *gin.Context) (*ErpOrderListResp, error) {
erpOrderListSetCommodity(orders)
erpOrderListSetCashier(orders)
erpOrderListSetSalesman(orders)
erpOrderSetBankTrxNo(orders)
resp.List = orders
@ -1186,6 +1191,23 @@ func NewErpBillSn() string {
}
}
// 添加零售订单的银行流水号
func erpOrderSetBankTrxNo(list []ErpOrder) {
for i, _ := range list {
list[i].SetBankTrxNo()
}
}
func (m *ErpOrder) SetBankTrxNo() {
var orderPayWay ErpOrderRecord
err := orm.Eloquent.Table("erp_order_record").Where("bill_sn = ? and status = ?", m.BillSn, PayOk).Find(&orderPayWay).Error
if err != nil {
logger.Error("SetBankTrxNo query erp_order_record err:", logger.Field("err", err))
}
m.BankTrxNo = orderPayWay.BankTrxNo
}
// ErpOrderRetailDetailSetCommodity 添加零售明细中订单的商品信息
func ErpOrderRetailDetailSetCommodity(list []ErpOrder) {
for i, _ := range list {
@ -1939,6 +1961,7 @@ func ErpOrderPay(req *ErpOrderPayReq, c *gin.Context) (*ErpOrderPayResp, error)
updateInfo := map[string]interface{}{
"bank_order_no": hmPayResp.BankOrderNo,
"plat_trx_no": hmPayResp.PlatTrxNo,
"bank_trx_no": hmPayResp.BankTrxNo,
"total_amount": hmPayResp.TotalAmount,
"pay_way": hmPayResp.PayWay,
"status": payStatus,
@ -2030,6 +2053,7 @@ func QueryErpOrderPayStatus(billSn string) (*ErpOrderPayResp, error) {
updateInfo := map[string]interface{}{
"bank_order_no": hmQueryResp.BankOrderNo,
"plat_trx_no": hmQueryResp.PlatTrxNo,
"bank_trx_no": hmQueryResp.BankTrxNo,
"total_amount": hmQueryResp.TotalAmount,
"pay_way": hmQueryResp.PayWayCode,
"status": payStatus,
@ -2737,6 +2761,18 @@ func float64ToPercentage(value float64) string {
func QueryRetailDetail(req *ErpOrderRetailDetailReq, c *gin.Context) (*ErpOrderRetailDetailResp, error) {
resp := &ErpOrderRetailDetailResp{}
// 通过银行流水号查询
if req.BankTrxNo != "" {
var orderPayWay ErpOrderRecord
err := orm.Eloquent.Table("erp_order_record").Where("bank_trx_no = ? and status = ?",
req.BankTrxNo, PayOk).Find(&orderPayWay).Error
if err != nil {
logger.Error("query erp_order_record err:", logger.Field("err", err))
return nil, err
}
req.BillSn = orderPayWay.BillSn
}
var err error
if (req.ErpCategoryId != 0 || req.ErpCommodityName != "" || req.IMEI != "") && req.BillSn == "" { // 商品分类or商品名称不为空且订单编号为空
// 联表查询
@ -3027,7 +3063,7 @@ func retailDetailExport(list []ErpOrder, sumData RetailDetailTotalData) (string,
fileName := time.Now().Format(TimeFormat) + "零售明细" + ".xlsx"
fmt.Println("url fileName:", url+fileName)
title := []interface{}{"订单编号", "订单类型", "用户ID", "客户手机号", "审核时间", "店铺", "销售员", "商品分类", "商品名称",
title := []interface{}{"订单编号", "订单类型", "用户ID", "客户手机号", "审核时间", "店铺", "银联流水号", "销售员", "商品分类", "商品名称",
"供应商", "是否串码", "商品串码", "是否赠送", "销售数量", "指导零售价", "零售价", "零售优惠", "会员优惠", "实际零售价/退货价",
"采购单价", "员工成本价", "销售毛利", "员工毛利", "订单总指导零售价", "订单总优惠", "订单实收", "【扫码付", "现金收款", "pos机收款",
"商场积分抵扣", "其他付款方式】", "订单总销售毛利", "订单总员工毛利", "销售毛利提成", "员工毛利提成", "销售员提成", "门店提成", "备注"}
@ -3115,6 +3151,7 @@ func retailDetailExport(list []ErpOrder, sumData RetailDetailTotalData) (string,
list[i].Tel,
list[i].AuditTime,
list[i].StoreName,
list[i].BankTrxNo,
salesMan, //销售员
list[i].Commodities[rowId].ErpCategoryName,
list[i].Commodities[rowId].ErpCommodityName,
@ -3157,6 +3194,7 @@ func retailDetailExport(list []ErpOrder, sumData RetailDetailTotalData) (string,
"",
"",
"",
"",
list[i].Salesman[1].Name, //销售员
list[i].Commodities[rowId].ErpCategoryName,
list[i].Commodities[rowId].ErpCommodityName,
@ -3198,6 +3236,7 @@ func retailDetailExport(list []ErpOrder, sumData RetailDetailTotalData) (string,
"",
"",
"",
"",
"", //销售员
list[i].Commodities[rowId].ErpCategoryName,
list[i].Commodities[rowId].ErpCommodityName,
@ -3251,6 +3290,7 @@ func retailDetailExport(list []ErpOrder, sumData RetailDetailTotalData) (string,
"",
"",
"",
"",
list[i].Salesman[1].Name, //销售员
"",
"",
@ -3298,7 +3338,7 @@ func retailDetailExport(list []ErpOrder, sumData RetailDetailTotalData) (string,
}
totalData := "订单数:" + strconv.FormatInt(int64(len(list)), 10)
end := []interface{}{totalData, "", "", "", "", "", "", "", "", "", "", "", "",
end := []interface{}{totalData, "", "", "", "", "", "", "", "", "", "", "", "", "",
sumData.Count,
sumData.RetailPrice,
sumData.SalePrice,
@ -3343,15 +3383,15 @@ func retailDetailExport(list []ErpOrder, sumData RetailDetailTotalData) (string,
_ = file.SetCellStyle("Sheet1", "A1", endRow, style)
//需要自动换行的列
endRow1 := fmt.Sprintf("G%d", nExcelStartRow+2)
endRow2 := fmt.Sprintf("AH%d", nExcelStartRow+2)
endRow3 := fmt.Sprintf("AI%d", nExcelStartRow+2)
endRow4 := fmt.Sprintf("AJ%d", nExcelStartRow+2)
_ = file.SetCellStyle("Sheet1", "A1", "AL1", style1)
_ = file.SetCellStyle("Sheet1", "G2", endRow1, style1)
_ = file.SetCellStyle("Sheet1", "AH2", endRow2, style1)
_ = file.SetCellStyle("Sheet1", "AI2", endRow3, style1)
_ = file.SetCellStyle("Sheet1", "AJ2", endRow4, style1)
endRow1 := fmt.Sprintf("H%d", nExcelStartRow+2)
endRow2 := fmt.Sprintf("AI%d", nExcelStartRow+2)
endRow3 := fmt.Sprintf("AJ%d", nExcelStartRow+2)
endRow4 := fmt.Sprintf("AK%d", nExcelStartRow+2)
_ = file.SetCellStyle("Sheet1", "A1", "AM1", style1)
_ = file.SetCellStyle("Sheet1", "H2", endRow1, style1)
_ = file.SetCellStyle("Sheet1", "AI2", endRow2, style1)
_ = file.SetCellStyle("Sheet1", "AJ2", endRow3, style1)
_ = file.SetCellStyle("Sheet1", "AK2", endRow4, style1)
fmt.Println("save fileName:", config.ExportConfig.Path+fileName)
if err := file.SaveAs(config.ExportConfig.Path + fileName); err != nil {
@ -3554,6 +3594,25 @@ func queryRetailDetailByJoin(req *ErpOrderRetailDetailReq, c *gin.Context) (*Erp
logger.Error("query erp_order_pay_way sum data err:", logger.Field("err", err))
return resp, err
}
// 支付方式筛选
if req.CashierId != 0 {
var tempCashier TotalCashierData
switch req.CashierId {
case 1:
tempCashier.ScanAmount = cashier.ScanAmount
case 2:
tempCashier.CashAmount = cashier.CashAmount
case 3:
tempCashier.PosAmount = cashier.PosAmount
case 4:
tempCashier.StoreVmAmount = cashier.StoreVmAmount
default:
tempCashier = cashier
}
cashier = tempCashier
}
// 退货订单支付汇总:目前零售退货订单暂时不展示各个方式的付款金额
var rejectedCashier TotalCashierData
//rejectedCashierQs := qs
@ -3604,6 +3663,7 @@ func queryRetailDetailByJoin(req *ErpOrderRetailDetailReq, c *gin.Context) (*Erp
}
orders := packData(result)
erpOrderSetBankTrxNo(orders)
fileUrl, err := retailDetailExport(orders, sumData)
if err != nil {
logger.Error("retailDetailExport err:", logger.Field("err", err))
@ -3628,6 +3688,7 @@ func queryRetailDetailByJoin(req *ErpOrderRetailDetailReq, c *gin.Context) (*Erp
orders := packData(result)
erpOrderListSetCashier(orders)
erpOrderListSetSalesman(orders)
erpOrderSetBankTrxNo(orders)
pagedOrders := paginate(orders, page, req.PageSize)
resp.List = pagedOrders
@ -3850,6 +3911,10 @@ func queryRetailDetailCommon(req *ErpOrderRetailDetailReq, c *gin.Context) (*Erp
qs = qs.Where("JSON_CONTAINS(salesman_list, ?)", fmt.Sprintf(`{"userId":%d}`, req.Salesman))
totalPerQs = totalPerQs.Where("erp_order_sales.uid = ?", req.Salesman)
}
if req.CashierId != 0 { // 支付方式
qs = qs.Where("JSON_CONTAINS(cashier_list, ?)", fmt.Sprintf(`{"cashier_id":%d}`, req.CashierId))
//totalPerQs = totalPerQs.Where("erp_order_pay_way.cashier_id = ?", req.CashierId)
}
if req.StartTime != "" { // 审核开始时间
parse, err := time.Parse(QueryTimeFormat, req.StartTime)
if err != nil {
@ -3919,6 +3984,25 @@ func queryRetailDetailCommon(req *ErpOrderRetailDetailReq, c *gin.Context) (*Erp
logger.Error("query erp_order_pay_way sum data err:", logger.Field("err", err))
return resp, err
}
// 支付方式筛选
if req.CashierId != 0 {
var tempCashier TotalCashierData
switch req.CashierId {
case 1:
tempCashier.ScanAmount = cashier.ScanAmount
case 2:
tempCashier.CashAmount = cashier.CashAmount
case 3:
tempCashier.PosAmount = cashier.PosAmount
case 4:
tempCashier.StoreVmAmount = cashier.StoreVmAmount
default:
tempCashier = cashier
}
cashier = tempCashier
}
// 退货订单支付汇总:目前零售退货订单暂时不展示各个方式的付款金额
var rejectedCashier TotalCashierData
//rejectedCashierQs := qs
@ -3950,6 +4034,7 @@ func queryRetailDetailCommon(req *ErpOrderRetailDetailReq, c *gin.Context) (*Erp
}
ErpOrderRetailDetailSetCommodity(orders)
erpOrderListSetSalesman(orders)
erpOrderSetBankTrxNo(orders)
fileUrl, err := retailDetailExport(orders, sumData)
if err != nil {
@ -3976,6 +4061,7 @@ func queryRetailDetailCommon(req *ErpOrderRetailDetailReq, c *gin.Context) (*Erp
ErpOrderRetailDetailSetCommodity(orders)
erpOrderListSetSalesman(orders)
erpOrderListSetCashier(orders)
erpOrderSetBankTrxNo(orders)
//erpOrderListSetSalesmanByRetailDetail(req.Salesman, orders)
resp.List = orders

View File

@ -2773,18 +2773,34 @@ func (m *CooperativeBusiness) UserInviteReport(userInfo UserInfo) {
return
}
report := &InviteMemberReport{
Uid: userInfo.Uid,
StoreId: uint32(userInfo.StoreId),
GoldCount: 0,
PlatinumCount: 0,
BlackGoldCount: 0,
Date: reportTime,
DeductAmount: 0,
CooperativeBusinessId: userInfo.CooperativeBusinessId,
CooperativeName: userInfo.CooperativeName,
//GoldDeduct: m.CooperativeAssistantMemberDeduct.GoldDeduct,
//PlatinumDeduct: m.CooperativeAssistantMemberDeduct.PlatinumDeduct,
//BlackGoldDeduct: m.CooperativeAssistantMemberDeduct.BlackGoldDeduct,
Uid: userInfo.Uid,
StoreId: uint32(userInfo.StoreId),
GoldCount: 0,
GoldCountHalf: 0,
GoldCountQuarter: 0,
PlatinumCount: 0,
BlackGoldCount: 0,
Date: reportTime,
DeductAmount: 0,
CooperativeBusinessId: userInfo.CooperativeBusinessId,
CooperativeName: userInfo.CooperativeName,
GoldDeduct: m.CooperativeAssistantMemberDeduct.GoldDeduct,
PlatinumDeduct: m.CooperativeAssistantMemberDeduct.PlatinumDeduct,
BlackGoldDeduct: m.CooperativeAssistantMemberDeduct.BlackGoldDeduct,
RenewalGoldCount: 0,
RenewalGoldCountHalf: 0,
RenewalGoldCountQuarter: 0,
RenewalPlatinumCount: 0,
RenewalBlackGoldCount: 0,
UpgradeGoldToPlatinumCount: 0,
UpgradeGoldToBlackCount: 0,
UpgradePlatinumToBlackCount: 0,
InviteRenewalGoldCount: 0,
InviteRenewalPlatinumCount: 0,
InviteRenewalBlackGoldCount: 0,
InviteUpgradeGoldToPlatinumCount: 0,
InviteUpgradeGoldToBlackCount: 0,
InviteUpgradePlatinumToBlackCount: 0,
}
//for i, _ := range userInvites {
@ -2928,13 +2944,13 @@ func (m *AssistantInviteMemberReportReq) List(c *gin.Context) (*AssistantInviteM
//totalPage := int(count)/m.PageSize + 1
if m.IsExport == 1 { // 导出excel
err = qs.Order("store_id DESC,id DESC").Find(&memberReport).Error
err = qs.Order("STR_TO_DATE(date, '%Y-%m-%d') DESC, store_id ASC").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
err = qs.Order("STR_TO_DATE(date, '%Y-%m-%d') DESC, store_id ASC").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

View File

@ -8789,6 +8789,10 @@ const docTemplate = `{
"description": "审核人姓名",
"type": "string"
},
"bank_trx_no": {
"description": "银行流水号",
"type": "string"
},
"bill_sn": {
"description": "单据编号",
"type": "string"
@ -9436,10 +9440,18 @@ const docTemplate = `{
"models.ErpOrderRetailDetailReq": {
"type": "object",
"properties": {
"bank_trx_no": {
"description": "银行流水号",
"type": "string"
},
"bill_sn": {
"description": "单据编号",
"type": "string"
},
"cashier_id": {
"description": "收付款方式id",
"type": "integer"
},
"end_time": {
"description": "结束时间",
"type": "string"
@ -11110,7 +11122,10 @@ const docTemplate = `{
},
"commodity_name": {
"description": "商品名称",
"type": "string"
"type": "array",
"items": {
"type": "string"
}
},
"erp_category_id": {
"description": "商品分类Id",

View File

@ -8778,6 +8778,10 @@
"description": "审核人姓名",
"type": "string"
},
"bank_trx_no": {
"description": "银行流水号",
"type": "string"
},
"bill_sn": {
"description": "单据编号",
"type": "string"
@ -9425,10 +9429,18 @@
"models.ErpOrderRetailDetailReq": {
"type": "object",
"properties": {
"bank_trx_no": {
"description": "银行流水号",
"type": "string"
},
"bill_sn": {
"description": "单据编号",
"type": "string"
},
"cashier_id": {
"description": "收付款方式id",
"type": "integer"
},
"end_time": {
"description": "结束时间",
"type": "string"
@ -11099,7 +11111,10 @@
},
"commodity_name": {
"description": "商品名称",
"type": "string"
"type": "array",
"items": {
"type": "string"
}
},
"erp_category_id": {
"description": "商品分类Id",

View File

@ -1934,6 +1934,9 @@ definitions:
auditor_name:
description: 审核人姓名
type: string
bank_trx_no:
description: 银行流水号
type: string
bill_sn:
description: 单据编号
type: string
@ -2409,9 +2412,15 @@ definitions:
type: object
models.ErpOrderRetailDetailReq:
properties:
bank_trx_no:
description: 银行流水号
type: string
bill_sn:
description: 单据编号
type: string
cashier_id:
description: 收付款方式id
type: integer
end_time:
description: 结束时间
type: string
@ -3629,7 +3638,9 @@ definitions:
type: integer
commodity_name:
description: 商品名称
type: string
items:
type: string
type: array
erp_category_id:
description: 商品分类Id
type: integer