1.修复缺陷,优化代码:

(1)优化库存列表查询sql,解决数据重复问题;
(2)报表查询入参增加串码筛选;
(3)系统管理员登录时返回所有门店列表;
This commit is contained in:
chenlin 2024-05-27 11:08:39 +08:00
parent c2c2782a7b
commit 4d18ca0416
9 changed files with 239 additions and 168 deletions

View File

@ -1506,47 +1506,69 @@ func (m *ErpStockListReq) stockIsEmptyList(c *gin.Context) (*ErpStockListResp, e
Order("CASE WHEN c.pid = 0 THEN CAST(c.number AS SIGNED) " + Order("CASE WHEN c.pid = 0 THEN CAST(c.number AS SIGNED) " +
"ELSE CAST(SUBSTRING(c.number, 1, 3) AS SIGNED) END, " + "ELSE CAST(SUBSTRING(c.number, 1, 3) AS SIGNED) END, " +
"CAST(c.pid AS SIGNED), CAST(SUBSTRING(erp_commodity.serial_number, -4) AS SIGNED)") "CAST(c.pid AS SIGNED), CAST(SUBSTRING(erp_commodity.serial_number, -4) AS SIGNED)")
} else { // 没传门店id则子查询先求库存表中erp_commodity_id相同的count之和
if len(storeList) == 0 {
qs = qs.Select("erp_commodity.*, COALESCE(erp_stock.count, 0) AS total_count, " +
"COALESCE(SUM(erp_stock.dispatch_count), 0) AS total_dispatch_count").
Joins("LEFT JOIN (SELECT erp_commodity_id, SUM(count) AS count, SUM(dispatch_count) AS dispatch_count FROM erp_stock GROUP BY erp_commodity_id) " +
"erp_stock ON erp_commodity.id = erp_stock.erp_commodity_id").
Joins("JOIN erp_category c ON erp_commodity.erp_category_id = c.id").
Where("erp_stock.count IS NULL OR erp_stock.count = 0").
Order("CASE WHEN c.pid = 0 THEN CAST(c.number AS SIGNED) " +
"ELSE CAST(SUBSTRING(c.number, 1, 3) AS SIGNED) END, " +
"CAST(c.pid AS SIGNED), CAST(SUBSTRING(erp_commodity.serial_number, -4) AS SIGNED)")
es = es.Select("erp_commodity.*, COALESCE(erp_stock.count, 0) AS total_count, " +
"COALESCE(SUM(erp_stock.dispatch_count), 0) AS total_dispatch_count").
Joins("LEFT JOIN (SELECT erp_commodity_id, SUM(count) AS count, SUM(dispatch_count) AS dispatch_count FROM erp_stock GROUP BY erp_commodity_id) " +
"erp_stock ON erp_commodity.id = erp_stock.erp_commodity_id").
Joins("JOIN erp_category c ON erp_commodity.erp_category_id = c.id").
Where("erp_stock.count IS NULL OR erp_stock.count = 0").
Order("CASE WHEN c.pid = 0 THEN CAST(c.number AS SIGNED) " +
"ELSE CAST(SUBSTRING(c.number, 1, 3) AS SIGNED) END, " +
"CAST(c.pid AS SIGNED), CAST(SUBSTRING(erp_commodity.serial_number, -4) AS SIGNED)")
} else { } else {
qs = qs.Select("erp_commodity.*, COALESCE(erp_stock.count, 0) AS total_count," + qs = qs.Select("erp_commodity.*, COALESCE(erp_stock.count, 0) AS total_count," +
"COALESCE(SUM(erp_stock.dispatch_count), 0) AS total_dispatch_count"). "COALESCE(SUM(erp_stock.dispatch_count), 0) AS total_dispatch_count").
Joins("LEFT JOIN (SELECT erp_commodity_id, SUM(count) AS count, SUM(dispatch_count) AS dispatch_count FROM erp_stock WHERE store_id IN (?) GROUP BY erp_commodity_id) "+ Joins("LEFT JOIN erp_stock ON erp_commodity.id = erp_stock.erp_commodity_id").
"erp_stock ON erp_commodity.id = erp_stock.erp_commodity_id", storeList). //Joins("LEFT JOIN erp_stock ON erp_commodity.id = erp_stock.erp_commodity_id").
Joins("JOIN erp_category c ON erp_commodity.erp_category_id = c.id"). Joins("LEFT JOIN erp_category c ON erp_commodity.erp_category_id = c.id").
Where("erp_stock.count IS NULL OR erp_stock.count = 0"). Group("erp_commodity.id").
//Where("erp_stock.count = 0 AND erp_stock.store_id = ?", m.StoreId).
Order("CASE WHEN c.pid = 0 THEN CAST(c.number AS SIGNED) " + Order("CASE WHEN c.pid = 0 THEN CAST(c.number AS SIGNED) " +
"ELSE CAST(SUBSTRING(c.number, 1, 3) AS SIGNED) END, " + "ELSE CAST(SUBSTRING(c.number, 1, 3) AS SIGNED) END, " +
"CAST(c.pid AS SIGNED), CAST(SUBSTRING(erp_commodity.serial_number, -4) AS SIGNED)") "CAST(c.pid AS SIGNED), CAST(SUBSTRING(erp_commodity.serial_number, -4) AS SIGNED)")
es = es.Select("erp_commodity.*, COALESCE(erp_stock.count, 0) AS total_count, " + es = es.Select("erp_commodity.*, COALESCE(erp_stock.count, 0) AS total_count, " +
"COALESCE(SUM(erp_stock.dispatch_count), 0) AS total_dispatch_count"). "COALESCE(SUM(erp_stock.dispatch_count), 0) AS total_dispatch_count").
Joins("LEFT JOIN (SELECT erp_commodity_id, SUM(count) AS count, SUM(dispatch_count) AS dispatch_count FROM erp_stock WHERE store_id IN (?) GROUP BY erp_commodity_id) "+ Joins("LEFT JOIN erp_stock ON erp_commodity.id = erp_stock.erp_commodity_id").
"erp_stock ON erp_commodity.id = erp_stock.erp_commodity_id", storeList). //Joins("LEFT JOIN erp_stock ON erp_commodity.id = erp_stock.erp_commodity_id").
Joins("JOIN erp_category c ON erp_commodity.erp_category_id = c.id"). Joins("LEFT JOIN erp_category c ON erp_commodity.erp_category_id = c.id").
Where("erp_stock.count IS NULL OR erp_stock.count = 0"). Group("erp_commodity.id").
//Where("erp_stock.count = 0 AND erp_stock.store_id = ?", m.StoreId).
Order("CASE WHEN c.pid = 0 THEN CAST(c.number AS SIGNED) " + Order("CASE WHEN c.pid = 0 THEN CAST(c.number AS SIGNED) " +
"ELSE CAST(SUBSTRING(c.number, 1, 3) AS SIGNED) END, " + "ELSE CAST(SUBSTRING(c.number, 1, 3) AS SIGNED) END, " +
"CAST(c.pid AS SIGNED), CAST(SUBSTRING(erp_commodity.serial_number, -4) AS SIGNED)") "CAST(c.pid AS SIGNED), CAST(SUBSTRING(erp_commodity.serial_number, -4) AS SIGNED)")
} }
} //} else { // 没传门店id则子查询先求库存表中erp_commodity_id相同的count之和
// if len(storeList) == 0 {
// qs = qs.Select("erp_commodity.*, COALESCE(erp_stock.count, 0) AS total_count, " +
// "COALESCE(SUM(erp_stock.dispatch_count), 0) AS total_dispatch_count").
// Joins("LEFT JOIN (SELECT erp_commodity_id, SUM(count) AS count, SUM(dispatch_count) AS dispatch_count FROM erp_stock GROUP BY erp_commodity_id) " +
// "erp_stock ON erp_commodity.id = erp_stock.erp_commodity_id").
// Joins("JOIN erp_category c ON erp_commodity.erp_category_id = c.id").
// Where("erp_stock.count IS NULL OR erp_stock.count = 0").
// Order("CASE WHEN c.pid = 0 THEN CAST(c.number AS SIGNED) " +
// "ELSE CAST(SUBSTRING(c.number, 1, 3) AS SIGNED) END, " +
// "CAST(c.pid AS SIGNED), CAST(SUBSTRING(erp_commodity.serial_number, -4) AS SIGNED)")
// es = es.Select("erp_commodity.*, COALESCE(erp_stock.count, 0) AS total_count, " +
// "COALESCE(SUM(erp_stock.dispatch_count), 0) AS total_dispatch_count").
// Joins("LEFT JOIN (SELECT erp_commodity_id, SUM(count) AS count, SUM(dispatch_count) AS dispatch_count FROM erp_stock GROUP BY erp_commodity_id) " +
// "erp_stock ON erp_commodity.id = erp_stock.erp_commodity_id").
// Joins("JOIN erp_category c ON erp_commodity.erp_category_id = c.id").
// Where("erp_stock.count IS NULL OR erp_stock.count = 0").
// Order("CASE WHEN c.pid = 0 THEN CAST(c.number AS SIGNED) " +
// "ELSE CAST(SUBSTRING(c.number, 1, 3) AS SIGNED) END, " +
// "CAST(c.pid AS SIGNED), CAST(SUBSTRING(erp_commodity.serial_number, -4) AS SIGNED)")
// } else {
// qs = qs.Select("erp_commodity.*, COALESCE(erp_stock.count, 0) AS total_count, "+
// "COALESCE(SUM(erp_stock.dispatch_count), 0) AS total_dispatch_count").
// Joins("LEFT JOIN (SELECT erp_commodity_id, SUM(count) AS count, SUM(dispatch_count) AS dispatch_count FROM erp_stock WHERE store_id IN (?) GROUP BY erp_commodity_id) "+
// "erp_stock ON erp_commodity.id = erp_stock.erp_commodity_id", storeList).
// Joins("JOIN erp_category c ON erp_commodity.erp_category_id = c.id").
// Where("erp_stock.count IS NULL OR erp_stock.count = 0").
// Order("CASE WHEN c.pid = 0 THEN CAST(c.number AS SIGNED) " +
// "ELSE CAST(SUBSTRING(c.number, 1, 3) AS SIGNED) END, " +
// "CAST(c.pid AS SIGNED), CAST(SUBSTRING(erp_commodity.serial_number, -4) AS SIGNED)")
// es = es.Select("erp_commodity.*, COALESCE(erp_stock.count, 0) AS total_count, "+
// "COALESCE(SUM(erp_stock.dispatch_count), 0) AS total_dispatch_count").
// Joins("LEFT JOIN (SELECT erp_commodity_id, SUM(count) AS count, SUM(dispatch_count) AS dispatch_count FROM erp_stock WHERE store_id IN (?) GROUP BY erp_commodity_id) "+
// "erp_stock ON erp_commodity.id = erp_stock.erp_commodity_id", storeList).
// Joins("JOIN erp_category c ON erp_commodity.erp_category_id = c.id").
// Where("erp_stock.count IS NULL OR erp_stock.count = 0").
// Order("CASE WHEN c.pid = 0 THEN CAST(c.number AS SIGNED) " +
// "ELSE CAST(SUBSTRING(c.number, 1, 3) AS SIGNED) END, " +
// "CAST(c.pid AS SIGNED), CAST(SUBSTRING(erp_commodity.serial_number, -4) AS SIGNED)")
// }
//}
if m.SerialNumber != "" { if m.SerialNumber != "" {
qs = qs.Where("erp_commodity.serial_number=?", m.SerialNumber) qs = qs.Where("erp_commodity.serial_number=?", m.SerialNumber)
@ -1924,7 +1946,8 @@ func (m *ErpStockListReq) allCommodityList(c *gin.Context) (*ErpStockListResp, e
} }
var count int64 var count int64
err := es.Count(&count).Error err := orm.Eloquent.Debug().Table("(?) AS subquery", es).Count(&count).Error
//err := es.Count(&count).Error
if err != nil { if err != nil {
logger.Error("commodityList count err", logger.Field("err", err)) logger.Error("commodityList count err", logger.Field("err", err))
return resp, err return resp, err

View File

@ -326,6 +326,7 @@ type ErpOrderRetailDetailReq struct {
ErpCategoryId uint32 `json:"erp_category_id"` // 分类id ErpCategoryId uint32 `json:"erp_category_id"` // 分类id
ErpCommodityName string `json:"erp_commodity_name"` // 商品名称 ErpCommodityName string `json:"erp_commodity_name"` // 商品名称
Salesman uint32 `json:"salesman"` // 销售人员ID Salesman uint32 `json:"salesman"` // 销售人员ID
IMEI string `json:"imei"` // 串码
StartTime string `json:"start_time"` // 开始时间 StartTime string `json:"start_time"` // 开始时间
EndTime string `json:"end_time"` // 结束时间 EndTime string `json:"end_time"` // 结束时间
PageIndex int `json:"pageIndex"` // 页码 PageIndex int `json:"pageIndex"` // 页码
@ -1301,7 +1302,8 @@ func erpOrderListSetCashier(list []ErpOrder) {
} }
func (m *ErpOrder) SetErpCashier() { func (m *ErpOrder) SetErpCashier() {
if m.CashierList != "" && m.RetailType == RetailTypeSale { // 临时限制,退货订单不展示具体付款方式 //if m.CashierList != "" && m.RetailType == RetailTypeSale { // 临时限制,退货订单不展示具体付款方式
if m.CashierList != "" {
var cashiers []ErpOrderCashier var cashiers []ErpOrderCashier
err := json.Unmarshal([]byte(m.CashierList), &cashiers) err := json.Unmarshal([]byte(m.CashierList), &cashiers)
if err != nil { if err != nil {
@ -2320,19 +2322,31 @@ func QueryRetailMargin(req *ErpOrderRetailMarginReq, c *gin.Context) (*ErpOrderR
key := fmt.Sprintf("%d_%d_%s", item.StoreID, item.ErpCommodityId, item.RetailType) key := fmt.Sprintf("%d_%d_%s", item.StoreID, item.ErpCommodityId, item.RetailType)
var nCount int32 var nCount int32
var salesAmount, salesCost, salesMargin float64
if item.RetailType == RetailTypeRejected { if item.RetailType == RetailTypeRejected {
nCount = -int32(item.Count) nCount = -int32(item.Count)
salesAmount = -item.ReceivedAmount
salesCost = -float64(int32(item.WholesalePrice) * item.Count)
salesMargin = -(item.ReceivedAmount - float64(int32(item.WholesalePrice)*item.Count))
} else { } else {
nCount = int32(item.Count) nCount = int32(item.Count)
salesAmount = item.ReceivedAmount
salesCost = float64(int32(item.WholesalePrice) * item.Count)
salesMargin = item.ReceivedAmount - float64(int32(item.WholesalePrice)*item.Count)
} }
// 检查是否已经处理过这个组合的数据 // 检查是否已经处理过这个组合的数据
if existingData, ok := processedData[key]; ok { if existingData, ok := processedData[key]; ok {
// 如果存在,说明已经有数据,进行合并操作 // 如果存在,说明已经有数据,进行合并操作
existingData.Count += nCount existingData.Count += nCount
existingData.SalesAmount += item.ReceivedAmount existingData.SalesAmount += salesAmount
existingData.SalesCost += float64(int32(item.WholesalePrice) * item.Count) existingData.SalesCost += salesCost
existingData.SalesMargin = existingData.SalesAmount - existingData.SalesCost existingData.SalesMargin += salesMargin
if existingData.SalesAmount == 0 {
existingData.GrossMargins = "--"
} else {
existingData.GrossMargins = float64ToPercentage(existingData.SalesMargin / existingData.SalesAmount) existingData.GrossMargins = float64ToPercentage(existingData.SalesMargin / existingData.SalesAmount)
}
// 如果是拒绝的销售,进行相应的处理 // 如果是拒绝的销售,进行相应的处理
if existingData.RetailType == RetailTypeRejected { if existingData.RetailType == RetailTypeRejected {
@ -2354,7 +2368,11 @@ func QueryRetailMargin(req *ErpOrderRetailMarginReq, c *gin.Context) (*ErpOrderR
SalesAmount: item.ReceivedAmount, SalesAmount: item.ReceivedAmount,
SalesCost: float64(int32(item.WholesalePrice) * item.Count), SalesCost: float64(int32(item.WholesalePrice) * item.Count),
SalesMargin: item.ReceivedAmount - float64(int32(item.WholesalePrice)*item.Count), SalesMargin: item.ReceivedAmount - float64(int32(item.WholesalePrice)*item.Count),
GrossMargins: float64ToPercentage((item.ReceivedAmount - float64(int32(item.WholesalePrice)*item.Count)) / item.ReceivedAmount), GrossMargins: "--",
//GrossMargins: float64ToPercentage((item.ReceivedAmount - float64(int32(item.WholesalePrice)*item.Count)) / item.ReceivedAmount),
}
if item.ReceivedAmount != 0 {
data.GrossMargins = float64ToPercentage((item.ReceivedAmount - float64(int32(item.WholesalePrice)*item.Count)) / item.ReceivedAmount)
} }
// 如果是拒绝的销售,进行相应的处理 // 如果是拒绝的销售,进行相应的处理
@ -2435,7 +2453,7 @@ func QueryRetailDetail(req *ErpOrderRetailDetailReq, c *gin.Context) (*ErpOrderR
resp := &ErpOrderRetailDetailResp{} resp := &ErpOrderRetailDetailResp{}
var err error var err error
if (req.ErpCategoryId != 0 || req.ErpCommodityName != "") && req.BillSn == "" { // 商品分类or商品名称不为空且订单编号为空 if (req.ErpCategoryId != 0 || req.ErpCommodityName != "" || req.IMEI != "") && req.BillSn == "" { // 商品分类or商品名称不为空且订单编号为空
// 联表查询 // 联表查询
resp, err = queryRetailDetailByJoin(req, c) resp, err = queryRetailDetailByJoin(req, c)
} else { } else {
@ -2762,6 +2780,11 @@ func queryRetailDetailByJoin(req *ErpOrderRetailDetailReq, c *gin.Context) (*Erp
es = es.Where("erp_order.store_id=?", req.StoreId) es = es.Where("erp_order.store_id=?", req.StoreId)
orderSumQs = orderSumQs.Where("eo.store_id=?", req.StoreId) orderSumQs = orderSumQs.Where("eo.store_id=?", req.StoreId)
} }
if req.IMEI != "" { // 串码
qs = qs.Where("erp_order_commodity.imei=?", req.IMEI)
es = es.Where("erp_order_commodity.imei=?", req.IMEI)
orderSumQs = orderSumQs.Where("oc.imei=?", req.IMEI)
}
// 非管理员才判断所属门店 // 非管理员才判断所属门店
if !(tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员") { if !(tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员") {
sysUser, err := GetSysUserByCtx(c) sysUser, err := GetSysUserByCtx(c)

View File

@ -111,6 +111,7 @@ type InventoryReportAllotDetailReq struct {
ReceiveStoreId []uint32 `json:"receive_store_id"` // 调入门店id ReceiveStoreId []uint32 `json:"receive_store_id"` // 调入门店id
CommodityName []string `json:"commodity_name"` // 商品名称 CommodityName []string `json:"commodity_name"` // 商品名称
CategoryID []uint32 `json:"category_id"` // 商品分类id CategoryID []uint32 `json:"category_id"` // 商品分类id
IMEI string `json:"imei"` // 串码
State uint32 `json:"state"` // 调拨状态1-调拨中 2-已完成 State uint32 `json:"state"` // 调拨状态1-调拨中 2-已完成
AuditTimeStart string `json:"audit_time_start"` // 审核/发起开始时间 AuditTimeStart string `json:"audit_time_start"` // 审核/发起开始时间
AuditTimeEnd string `json:"audit_time_end"` // 审核/发起结束时间 AuditTimeEnd string `json:"audit_time_end"` // 审核/发起结束时间
@ -195,6 +196,7 @@ type InventoryReportOtherDetailReq struct {
CommodityName []string `json:"commodity_name"` // 商品名称 CommodityName []string `json:"commodity_name"` // 商品名称
CategoryID []uint32 `json:"category_id"` // 商品分类id CategoryID []uint32 `json:"category_id"` // 商品分类id
Type uint32 `json:"type"` // 出入库方式1-产品入库 2-盘点入库 3-系统出库 4-盘点出库 Type uint32 `json:"type"` // 出入库方式1-产品入库 2-盘点入库 3-系统出库 4-盘点出库
IMEI string `json:"imei"` // 串码
StartTime string `json:"start_time"` // 开始时间/入库时间 StartTime string `json:"start_time"` // 开始时间/入库时间
EndTime string `json:"end_time"` // 结束时间/出库时间 EndTime string `json:"end_time"` // 结束时间/出库时间
IsExport uint32 `json:"is_export"` // 1-导出 IsExport uint32 `json:"is_export"` // 1-导出
@ -983,6 +985,11 @@ func (m *InventoryReportAllotDetailReq) ReportAllotDetailList(c *gin.Context) (*
countQuery = countQuery.Where("erp_inventory_allot_commodity.category_id IN (?)", categoryIDs) countQuery = countQuery.Where("erp_inventory_allot_commodity.category_id IN (?)", categoryIDs)
} }
if m.IMEI != "" {
qs = qs.Where("erp_inventory_allot_commodity.imei = ?", m.IMEI)
countQuery = countQuery.Where("erp_inventory_allot_commodity.imei = ?", m.IMEI)
}
if m.State != 0 { // 调拨状态 if m.State != 0 { // 调拨状态
switch m.State { switch m.State {
case 1: // 调拨中 case 1: // 调拨中
@ -1566,6 +1573,24 @@ func (m *InventoryReportOtherDetailReq) ReportByOtherDetailList(c *gin.Context)
allData[i].CategoryName = commodityInfo.ErpCategoryName allData[i].CategoryName = commodityInfo.ErpCategoryName
} }
if m.IMEI != "" {
if data.IMEI == m.IMEI {
if data.Type == 3 || data.Type == 4 { // 系统出库、盘点出库
totalPurchasePrice -= allData[i].PurchasePrice
totalEmployeePrice -= allData[i].EmployeePrice
allData[i].PurchasePrice = -allData[i].PurchasePrice
allData[i].EmployeePrice = -allData[i].EmployeePrice
} else {
totalPurchasePrice += allData[i].PurchasePrice
totalEmployeePrice += allData[i].EmployeePrice
}
filteredData = append(filteredData, allData[i])
break
} else {
continue
}
} else {
if (len(m.SerialNumber) == 0 || data.SerialNumber == m.SerialNumber) && if (len(m.SerialNumber) == 0 || data.SerialNumber == m.SerialNumber) &&
(len(m.StoreId) == 0 || tools.Uint32SliceContains(m.StoreId, data.StoreId)) && (len(m.StoreId) == 0 || tools.Uint32SliceContains(m.StoreId, data.StoreId)) &&
(len(m.CommodityName) == 0 || tools.StringSliceContains(m.CommodityName, data.CommodityName)) && (len(m.CommodityName) == 0 || tools.StringSliceContains(m.CommodityName, data.CommodityName)) &&
@ -1582,9 +1607,11 @@ func (m *InventoryReportOtherDetailReq) ReportByOtherDetailList(c *gin.Context)
totalPurchasePrice += allData[i].PurchasePrice totalPurchasePrice += allData[i].PurchasePrice
totalEmployeePrice += allData[i].EmployeePrice totalEmployeePrice += allData[i].EmployeePrice
} }
filteredData = append(filteredData, allData[i]) filteredData = append(filteredData, allData[i])
} }
} }
}
// 进行排序 // 进行排序
sort.Slice(filteredData, func(i, j int) bool { sort.Slice(filteredData, func(i, j int) bool {

View File

@ -498,6 +498,7 @@ type ErpPurchaseReportDetailReq struct {
ErpCommodityName string `json:"erp_commodity_name"` // 商品名称 ErpCommodityName string `json:"erp_commodity_name"` // 商品名称
ErpCategoryID uint32 `json:"erp_category_id"` // 商品分类id ErpCategoryID uint32 `json:"erp_category_id"` // 商品分类id
ErpSupplierId uint32 `json:"erp_supplier_id"` // 供应商id ErpSupplierId uint32 `json:"erp_supplier_id"` // 供应商id
IMEI string `json:"imei"` // 串码
StartTime string `json:"startTime"` // 入/出库,开始时间 StartTime string `json:"startTime"` // 入/出库,开始时间
EndTime string `json:"endTime"` // 入/出库,结束时间 EndTime string `json:"endTime"` // 入/出库,结束时间
IsExport uint32 `json:"is_export"` // 1-导出 IsExport uint32 `json:"is_export"` // 1-导出
@ -5309,6 +5310,10 @@ func GetReportDetail(req *ErpPurchaseReportDetailReq, c *gin.Context) (*ErpPurch
qs = qs.Where("erp_purchase_order.erp_supplier_id = ?", req.ErpSupplierId) qs = qs.Where("erp_purchase_order.erp_supplier_id = ?", req.ErpSupplierId)
countQuery = countQuery.Where("erp_purchase_order.erp_supplier_id = ?", req.ErpSupplierId) countQuery = countQuery.Where("erp_purchase_order.erp_supplier_id = ?", req.ErpSupplierId)
} }
if req.IMEI != "" {
qs = qs.Where("erp_purchase_inventory.imei = ?", req.IMEI)
countQuery = countQuery.Where("erp_purchase_inventory.imei = ?", req.IMEI)
}
if req.StartTime != "" { // 入/出库开始时间 if req.StartTime != "" { // 入/出库开始时间
parse, err := time.Parse(QueryTimeFormat, req.StartTime) parse, err := time.Parse(QueryTimeFormat, req.StartTime)
if err != nil { if err != nil {

View File

@ -167,9 +167,24 @@ func (e *SysUser) Get() (SysUserView SysUserView, err error) {
} }
SysUserView.Password = "" SysUserView.Password = ""
if SysUserView.RoleName == "系统管理员" {
// 查询组合所有门店数据
stores := make([]Store, 0)
orm.Eloquent.Table("store").Where("cooperative_business_id = ?", SysUserView.CooperativeBusinessId).Find(&stores)
for _, item := range stores {
storeInfo := StoreInfo{
StoreID: int(item.ID),
StoreName: item.Name,
ExpireTime: "2099.12.30",
}
SysUserView.StoreList = append(SysUserView.StoreList, storeInfo)
}
} else { // 普通用户
if SysUserView.StoreData != "" { if SysUserView.StoreData != "" {
SysUserView.StoreList = deserializeStoreData(SysUserView.StoreData) SysUserView.StoreList = deserializeStoreData(SysUserView.StoreData)
} }
}
return return
} }

View File

@ -1486,15 +1486,17 @@ func (m *NewUserInviteRecordReq) NewList() (*UserInviteRecordListResp, error) {
Select("user_invite_record.*, B1.nick_name AS InviteUserName, " + Select("user_invite_record.*, B1.nick_name AS InviteUserName, " +
"B2.tel AS UserTel, B2.created_at AS CreateTime, B2.member_expire AS MemberExpire, B2.member_level AS UserMemberLevel"). "B2.tel AS UserTel, B2.created_at AS CreateTime, B2.member_expire AS MemberExpire, B2.member_level AS UserMemberLevel").
Joins("JOIN sys_user B1 ON user_invite_record.from_uid = B1.uid"). Joins("JOIN sys_user B1 ON user_invite_record.from_uid = B1.uid").
Joins("JOIN user B2 ON user_invite_record.to_uid = B2.uid") Joins("JOIN user B2 ON user_invite_record.to_uid = B2.uid").
Group("user_invite_record.id").
Order("MAX(user_invite_record.action_time) DESC")
if m.StoreId != 0 { if m.StoreId != 0 {
qs = qs.Where("store_id=?", m.StoreId) qs = qs.Where("store_id=?", m.StoreId)
countQuery = countQuery.Where("store_id=?", m.StoreId) countQuery = countQuery.Where("store_id=?", m.StoreId)
} }
if m.InviteUserName != "" { if m.InviteUserName != "" {
qs = qs.Where("B1.Shop_assistant_name=?", m.InviteUserName) qs = qs.Where("B1.nick_name=?", m.InviteUserName)
countQuery = countQuery.Where("B1.Shop_assistant_name=?", m.InviteUserName) countQuery = countQuery.Where("B1.nick_name=?", m.InviteUserName)
} }
if m.FromUid != 0 { if m.FromUid != 0 {
qs = qs.Where("from_uid=?", m.FromUid) qs = qs.Where("from_uid=?", m.FromUid)
@ -1516,88 +1518,7 @@ func (m *NewUserInviteRecordReq) NewList() (*UserInviteRecordListResp, error) {
qs = qs.Where("B2.created_at < ?", m.CreateEndTime) qs = qs.Where("B2.created_at < ?", m.CreateEndTime)
countQuery = countQuery.Where("B2.created_at < ?", m.CreateEndTime) countQuery = countQuery.Where("B2.created_at < ?", m.CreateEndTime)
} }
//if len(m.RecordType) != 0 {
// for _, recordType := range m.RecordType {
// switch recordType {
// case 1: // 首次邀请
// qs = qs.Where("first=1").Where("spend_type=1")
// countQuery = countQuery.Where("first=1").Where("spend_type=1")
// case 2: // 开通年费黄金
// qs = qs.Where("user_invite_record.member_level=2").Where("spend_type=2")
// countQuery = countQuery.Where("user_invite_record.member_level=2").Where("spend_type=2")
// case 3: // 开通季度黄金
// qs = qs.Where("user_invite_record.member_level=2").Where("spend_type=2").Where("user_invite_record.member_genre=201")
// countQuery = countQuery.Where("user_invite_record.member_level=2").Where("spend_type=2").Where("user_invite_record.member_genre=201")
// case 4: // 开通半年黄金
// qs = qs.Where("user_invite_record.member_level=2").Where("spend_type=2").Where("user_invite_record.member_genre=202")
// countQuery = countQuery.Where("user_invite_record.member_level=2").Where("spend_type=2").Where("user_invite_record.member_genre=202")
// case 5: // 开通年费白金
// qs = qs.Where("user_invite_record.member_level=4").Where("spend_type=2")
// countQuery = countQuery.Where("user_invite_record.member_level=4").Where("spend_type=2")
// case 6: // 开通年费黑金
// qs = qs.Where("user_invite_record.member_level=5").Where("spend_type=2")
// countQuery = countQuery.Where("user_invite_record.member_level=5").Where("spend_type=2")
//
// case 7: // 续费年费黄金(干预)
// qs = qs.Where("user_invite_record.member_level=2").Where("spend_type=3").Where("renew_hide=0")
// countQuery = countQuery.Where("user_invite_record.member_level=2").Where("spend_type=3").Where("renew_hide=0")
// case 8: // 续费年费白金(干预)
// qs = qs.Where("user_invite_record.member_level=4").Where("spend_type=3").Where("renew_hide=0")
// countQuery = countQuery.Where("user_invite_record.member_level=4").Where("spend_type=3").Where("renew_hide=0")
// case 9: // 续费年费黑金(干预)
// qs = qs.Where("user_invite_record.member_level=5").Where("spend_type=3").Where("renew_hide=0")
// countQuery = countQuery.Where("user_invite_record.member_level=5").Where("spend_type=3").Where("renew_hide=0")
//
// case 10: // 续费年费黄金(自动)
// qs = qs.Where("user_invite_record.member_level=2").Where("spend_type=3").Where("renew_hide=1")
// countQuery = countQuery.Where("user_invite_record.member_level=2").Where("spend_type=3").Where("renew_hide=1")
// case 11: // 续费季度黄金(自动)
// qs = qs.Where("user_invite_record.member_level=2").Where("spend_type=3").Where("renew_hide=1").
// Where("user_invite_record.member_genre=201")
// countQuery = countQuery.Where("user_invite_record.member_level=2").Where("spend_type=3").Where("renew_hide=1").
// Where("user_invite_record.member_genre=201")
// case 12: // 续费半年黄金(自动)
// qs = qs.Where("user_invite_record.member_level=2").Where("spend_type=3").Where("renew_hide=1").
// Where("user_invite_record.member_genre=202")
// countQuery = countQuery.Where("user_invite_record.member_level=2").Where("spend_type=3").Where("renew_hide=1").
// Where("user_invite_record.member_genre=202")
// case 13: // 续费年费白金(自动)
// qs = qs.Where("user_invite_record.member_level=4").Where("spend_type=3").Where("renew_hide=1")
// countQuery = countQuery.Where("user_invite_record.member_level=4").Where("spend_type=3").Where("renew_hide=1")
// case 14: // 续费年费黑金(自动)
// qs = qs.Where("user_invite_record.member_level=5").Where("spend_type=3").Where("renew_hide=1")
// countQuery = countQuery.Where("user_invite_record.member_level=5").Where("spend_type=3").Where("renew_hide=1")
//
// case 15: //黄金→白金(干预)
// qs = qs.Where("user_invite_record.member_level=4").Where("spend_type=4").Where("renew_hide=0")
// countQuery = countQuery.Where("user_invite_record.member_level=4").Where("spend_type=4").Where("renew_hide=0")
// case 16: //黄金→黑金(干预)
// qs = qs.Where("user_invite_record.member_level=5").Where("spend_type=4").Where("renew_hide=0").
// Where("user_invite_record.member_genre in (200,201,202)")
// countQuery = countQuery.Where("user_invite_record.member_level=5").Where("spend_type=4").Where("renew_hide=0").
// Where("user_invite_record.member_genre in (200,201,202)")
// case 17: //白金→黑金(干预)
// qs = qs.Where("user_invite_record.member_level=5").Where("spend_type=4").Where("renew_hide=0").
// Where("user_invite_record.member_genre not in (200,201,202)")
// countQuery = countQuery.Where("user_invite_record.member_level=5").Where("spend_type=4").Where("renew_hide=0").
// Where("user_invite_record.member_genre not in (200,201,202)")
//
// case 18: //黄金→白金(自动)
// qs = qs.Where("user_invite_record.member_level=4").Where("spend_type=4").Where("renew_hide=1")
// countQuery = countQuery.Where("user_invite_record.member_level=4").Where("spend_type=4").Where("renew_hide=1")
// case 19: //黄金→黑金(自动)
// qs = qs.Where("user_invite_record.member_level=5").Where("spend_type=4").Where("renew_hide=1").
// Where("user_invite_record.member_genre in (200,201,202)")
// countQuery = countQuery.Where("user_invite_record.member_level=5").Where("spend_type=4").Where("renew_hide=1").
// Where("user_invite_record.member_genre in (200,201,202)")
// case 20: //白金→黑金(自动)
// qs = qs.Where("user_invite_record.member_level=5").Where("spend_type=4").Where("renew_hide=1").
// Where("user_invite_record.member_genre not in (200,201,202)")
// countQuery = countQuery.Where("user_invite_record.member_level=5").Where("spend_type=4").Where("renew_hide=1").
// Where("user_invite_record.member_genre not in (200,201,202)")
// }
// }
//}
if len(m.RecordType) != 0 { if len(m.RecordType) != 0 {
var recordTypeConditions []string var recordTypeConditions []string
for _, t := range m.RecordType { for _, t := range m.RecordType {
@ -1682,7 +1603,8 @@ func (m *NewUserInviteRecordReq) NewList() (*UserInviteRecordListResp, error) {
"B2.tel AS UserTel, B2.created_at AS CreateTime, B2.member_expire AS MemberExpire, B2.member_level AS UserMemberLevel"). "B2.tel AS UserTel, B2.created_at AS CreateTime, B2.member_expire AS MemberExpire, B2.member_level AS UserMemberLevel").
Joins("JOIN sys_user B1 ON user_invite_record.from_uid = B1.uid"). Joins("JOIN sys_user B1 ON user_invite_record.from_uid = B1.uid").
Joins("JOIN user B2 ON user_invite_record.to_uid = B2.uid"). Joins("JOIN user B2 ON user_invite_record.to_uid = B2.uid").
Order("action_time DESC"). Group("user_invite_record.id").
Order("MAX(user_invite_record.action_time) DESC").
Find(&records).Error Find(&records).Error
if err != nil && err != RecordNotFound { if err != nil && err != RecordNotFound {
logger.Errorf("err:", logger.Field("err", err)) logger.Errorf("err:", logger.Field("err", err))
@ -1693,7 +1615,8 @@ func (m *NewUserInviteRecordReq) NewList() (*UserInviteRecordListResp, error) {
"B2.tel AS UserTel, B2.created_at AS CreateTime, B2.member_expire AS MemberExpire, B2.member_level AS UserMemberLevel"). "B2.tel AS UserTel, B2.created_at AS CreateTime, B2.member_expire AS MemberExpire, B2.member_level AS UserMemberLevel").
Joins("JOIN sys_user B1 ON user_invite_record.from_uid = B1.uid"). Joins("JOIN sys_user B1 ON user_invite_record.from_uid = B1.uid").
Joins("JOIN user B2 ON user_invite_record.to_uid = B2.uid"). Joins("JOIN user B2 ON user_invite_record.to_uid = B2.uid").
Order("action_time DESC"). Group("user_invite_record.id").
Order("MAX(user_invite_record.action_time) DESC").
Offset(page * pageSize). Offset(page * pageSize).
Limit(pageSize). Limit(pageSize).
Find(&records).Error Find(&records).Error
@ -1718,6 +1641,11 @@ func (m *NewUserInviteRecordReq) NewList() (*UserInviteRecordListResp, error) {
MemberLevel: item.UserMemberLevel, MemberLevel: item.UserMemberLevel,
MemberExpire: item.MemberExpire, MemberExpire: item.MemberExpire,
} }
if item.FromUid == 0 {
data.InviteUserName = ""
}
listData = append(listData, data) listData = append(listData, data)
} }
@ -1887,6 +1815,14 @@ func CalculateMemberType(spendType, renewHide, memberGenre, memberLevel uint32)
switch { switch {
case spendType == 1: case spendType == 1:
return FirstInvite return FirstInvite
case spendType == 2 && memberLevel == 2 && memberGenre == 201:
return OpenQuarterGold
case spendType == 2 && memberLevel == 2 && memberGenre == 202:
return OpenHalfYearGold
case spendType == 3 && renewHide == 1 && memberLevel == 2 && memberGenre == 201:
return RenewQuarterGoldAuto
case spendType == 3 && renewHide == 1 && memberLevel == 2 && memberGenre == 202:
return RenewHalfYearGoldAuto
case spendType == 2: case spendType == 2:
switch memberLevel { switch memberLevel {
case 2: case 2:
@ -1934,14 +1870,6 @@ func CalculateMemberType(spendType, renewHide, memberGenre, memberLevel uint32)
} }
return UpgradePlatinumToBlackAuto return UpgradePlatinumToBlackAuto
} }
case spendType == 2 && memberLevel == 2 && memberGenre == 201:
return OpenQuarterGold
case spendType == 2 && memberLevel == 2 && memberGenre == 202:
return OpenHalfYearGold
case spendType == 3 && renewHide == 1 && memberLevel == 2 && memberGenre == 201:
return RenewQuarterGoldAuto
case spendType == 3 && renewHide == 1 && memberLevel == 2 && memberGenre == 202:
return RenewHalfYearGoldAuto
} }
return Unknown return Unknown
} }
@ -2753,10 +2681,12 @@ func (m *CooperativeBusiness) InviteMemberReport() {
} }
} }
// UserInviteReport
// 每个月1号统计上个月的数据
func (m *CooperativeBusiness) UserInviteReport(userInfo UserInfo) { func (m *CooperativeBusiness) UserInviteReport(userInfo UserInfo) {
//end := InDayZero(1) //end := InDayZero(1)
//start := end.AddDate(0, -1, 0) //start := end.AddDate(0, -1, 0)
reportTime := time.Now().AddDate(0, 0, 1).Format("2006-01") reportTime := time.Now().AddDate(0, -1, 0).Format("2006-01")
//var userInvites []UserInvite //var userInvites []UserInvite
//qs := orm.Eloquent.Table("user_invite").Where("from_uid=?", userInfo.Uid). //qs := orm.Eloquent.Table("user_invite").Where("from_uid=?", userInfo.Uid).
// Where("member_status=?", 2).Where("user_type=?", 2). // Where("member_status=?", 2).Where("user_type=?", 2).
@ -2775,8 +2705,8 @@ func (m *CooperativeBusiness) UserInviteReport(userInfo UserInfo) {
return return
} }
exist, err := QueryRecordExist(fmt.Sprintf( exist, err := QueryRecordExist(fmt.Sprintf(
"SELECT * FROM invite_member_report WHERE cooperative_business_id=%d AND date='%s' AND store_id=%d AND uid=%d", "SELECT * FROM invite_member_report WHERE cooperative_business_id=%d AND date='%s' AND uid=%d",
userInfo.CooperativeBusinessId, reportTime, userInfo.StoreId, userInfo.Uid)) userInfo.CooperativeBusinessId, reportTime, userInfo.Uid))
if err != nil { if err != nil {
logger.Error("cooperative member promotion record exist err:", logger.Field("err", err)) logger.Error("cooperative member promotion record exist err:", logger.Field("err", err))
return return
@ -2791,9 +2721,9 @@ func (m *CooperativeBusiness) UserInviteReport(userInfo UserInfo) {
DeductAmount: 0, DeductAmount: 0,
CooperativeBusinessId: userInfo.CooperativeBusinessId, CooperativeBusinessId: userInfo.CooperativeBusinessId,
CooperativeName: userInfo.CooperativeName, CooperativeName: userInfo.CooperativeName,
GoldDeduct: m.CooperativeAssistantMemberDeduct.GoldDeduct, //GoldDeduct: m.CooperativeAssistantMemberDeduct.GoldDeduct,
PlatinumDeduct: m.CooperativeAssistantMemberDeduct.PlatinumDeduct, //PlatinumDeduct: m.CooperativeAssistantMemberDeduct.PlatinumDeduct,
BlackGoldDeduct: m.CooperativeAssistantMemberDeduct.BlackGoldDeduct, //BlackGoldDeduct: m.CooperativeAssistantMemberDeduct.BlackGoldDeduct,
} }
//for i, _ := range userInvites { //for i, _ := range userInvites {
@ -2873,11 +2803,18 @@ func (m *AssistantInviteMemberReportReq) List() (*AssistantInviteMemberReportLis
if len(m.RoleId) != 0 { if len(m.RoleId) != 0 {
us = us.Where("role_id in (?)", m.RoleId) us = us.Where("role_id in (?)", m.RoleId)
} }
if m.StoreId != 0 {
us = us.Where("JSON_CONTAINS(store_data, ?)", fmt.Sprintf(`{"storeId":%d}`, m.StoreId))
}
err := us.Find(&users).Error err := us.Find(&users).Error
if err != nil { if err != nil {
logger.Error("err:", logger.Field("err", err)) logger.Error("err:", logger.Field("err", err))
return nil, err return nil, err
} }
if len(users) == 0 {
return &AssistantInviteMemberReportListResp{}, nil
}
ids := make(map[string]uint32, 0) ids := make(map[string]uint32, 0)
sysUserMap := make(map[uint32]*SysUser, 0) sysUserMap := make(map[uint32]*SysUser, 0)
var uidList []uint32 var uidList []uint32
@ -2910,9 +2847,6 @@ func (m *AssistantInviteMemberReportReq) List() (*AssistantInviteMemberReportLis
if m.Uid != 0 { if m.Uid != 0 {
qs = qs.Where("uid=?", m.Uid) qs = qs.Where("uid=?", m.Uid)
} }
if m.StoreId != 0 {
qs = qs.Where("store_id=?", m.StoreId)
}
if m.Date != "" { if m.Date != "" {
qs = qs.Where("date=?", m.Date) qs = qs.Where("date=?", m.Date)
} }

View File

@ -9056,6 +9056,10 @@ const docTemplate = `{
"description": "商品名称", "description": "商品名称",
"type": "string" "type": "string"
}, },
"imei": {
"description": "串码",
"type": "string"
},
"is_export": { "is_export": {
"description": "1-导出", "description": "1-导出",
"type": "integer" "type": "integer"
@ -10369,6 +10373,10 @@ const docTemplate = `{
"description": "供应商id", "description": "供应商id",
"type": "integer" "type": "integer"
}, },
"imei": {
"description": "串码",
"type": "string"
},
"is_export": { "is_export": {
"description": "1-导出", "description": "1-导出",
"type": "integer" "type": "integer"
@ -11739,6 +11747,10 @@ const docTemplate = `{
"type": "integer" "type": "integer"
} }
}, },
"imei": {
"description": "串码",
"type": "string"
},
"is_export": { "is_export": {
"description": "1-导出", "description": "1-导出",
"type": "integer" "type": "integer"
@ -12101,6 +12113,10 @@ const docTemplate = `{
"description": "结束时间/出库时间", "description": "结束时间/出库时间",
"type": "string" "type": "string"
}, },
"imei": {
"description": "串码",
"type": "string"
},
"is_export": { "is_export": {
"description": "1-导出", "description": "1-导出",
"type": "integer" "type": "integer"

View File

@ -9045,6 +9045,10 @@
"description": "商品名称", "description": "商品名称",
"type": "string" "type": "string"
}, },
"imei": {
"description": "串码",
"type": "string"
},
"is_export": { "is_export": {
"description": "1-导出", "description": "1-导出",
"type": "integer" "type": "integer"
@ -10358,6 +10362,10 @@
"description": "供应商id", "description": "供应商id",
"type": "integer" "type": "integer"
}, },
"imei": {
"description": "串码",
"type": "string"
},
"is_export": { "is_export": {
"description": "1-导出", "description": "1-导出",
"type": "integer" "type": "integer"
@ -11728,6 +11736,10 @@
"type": "integer" "type": "integer"
} }
}, },
"imei": {
"description": "串码",
"type": "string"
},
"is_export": { "is_export": {
"description": "1-导出", "description": "1-导出",
"type": "integer" "type": "integer"
@ -12090,6 +12102,10 @@
"description": "结束时间/出库时间", "description": "结束时间/出库时间",
"type": "string" "type": "string"
}, },
"imei": {
"description": "串码",
"type": "string"
},
"is_export": { "is_export": {
"description": "1-导出", "description": "1-导出",
"type": "integer" "type": "integer"

View File

@ -2304,6 +2304,9 @@ definitions:
erp_commodity_name: erp_commodity_name:
description: 商品名称 description: 商品名称
type: string type: string
imei:
description: 串码
type: string
is_export: is_export:
description: 1-导出 description: 1-导出
type: integer type: integer
@ -3258,6 +3261,9 @@ definitions:
erp_supplier_id: erp_supplier_id:
description: 供应商id description: 供应商id
type: integer type: integer
imei:
description: 串码
type: string
is_export: is_export:
description: 1-导出 description: 1-导出
type: integer type: integer
@ -4254,6 +4260,9 @@ definitions:
items: items:
type: integer type: integer
type: array type: array
imei:
description: 串码
type: string
is_export: is_export:
description: 1-导出 description: 1-导出
type: integer type: integer
@ -4514,6 +4523,9 @@ definitions:
end_time: end_time:
description: 结束时间/出库时间 description: 结束时间/出库时间
type: string type: string
imei:
description: 串码
type: string
is_export: is_export:
description: 1-导出 description: 1-导出
type: integer type: integer