From 4d18ca04161e1de39ef99ecbd39485be455157d3 Mon Sep 17 00:00:00 2001 From: chenlin Date: Mon, 27 May 2024 11:08:39 +0800 Subject: [PATCH] =?UTF-8?q?1.=E4=BF=AE=E5=A4=8D=E7=BC=BA=E9=99=B7=EF=BC=8C?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81=EF=BC=9A=20=EF=BC=881?= =?UTF-8?q?=EF=BC=89=E4=BC=98=E5=8C=96=E5=BA=93=E5=AD=98=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2sql=EF=BC=8C=E8=A7=A3=E5=86=B3=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=87=8D=E5=A4=8D=E9=97=AE=E9=A2=98=EF=BC=9B=20?= =?UTF-8?q?=EF=BC=882=EF=BC=89=E6=8A=A5=E8=A1=A8=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E5=85=A5=E5=8F=82=E5=A2=9E=E5=8A=A0=E4=B8=B2=E7=A0=81=E7=AD=9B?= =?UTF-8?q?=E9=80=89=EF=BC=9B=20=EF=BC=883=EF=BC=89=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=91=98=E7=99=BB=E5=BD=95=E6=97=B6=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E6=89=80=E6=9C=89=E9=97=A8=E5=BA=97=E5=88=97=E8=A1=A8?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/admin/models/commodity.go | 105 ++++++++++++-------- app/admin/models/erp_order.go | 37 +++++-- app/admin/models/inventory_report.go | 55 ++++++++--- app/admin/models/purchase.go | 5 + app/admin/models/sysuser.go | 19 +++- app/admin/models/user.go | 142 +++++++-------------------- docs/docs.go | 16 +++ docs/swagger.json | 16 +++ docs/swagger.yaml | 12 +++ 9 files changed, 239 insertions(+), 168 deletions(-) diff --git a/app/admin/models/commodity.go b/app/admin/models/commodity.go index 4fb5265..386a008 100644 --- a/app/admin/models/commodity.go +++ b/app/admin/models/commodity.go @@ -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) " + "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 { // 没传门店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)") - } + } 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 erp_stock ON erp_commodity.id = erp_stock.erp_commodity_id"). + //Joins("LEFT JOIN erp_stock ON erp_commodity.id = erp_stock.erp_commodity_id"). + Joins("LEFT JOIN erp_category c ON erp_commodity.erp_category_id = c.id"). + 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) " + + "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 erp_stock ON erp_commodity.id = erp_stock.erp_commodity_id"). + //Joins("LEFT JOIN erp_stock ON erp_commodity.id = erp_stock.erp_commodity_id"). + Joins("LEFT JOIN erp_category c ON erp_commodity.erp_category_id = c.id"). + 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) " + + "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 { // 没传门店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 != "" { 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 - err := es.Count(&count).Error + err := orm.Eloquent.Debug().Table("(?) AS subquery", es).Count(&count).Error + //err := es.Count(&count).Error if err != nil { logger.Error("commodityList count err", logger.Field("err", err)) return resp, err diff --git a/app/admin/models/erp_order.go b/app/admin/models/erp_order.go index b444f53..802d150 100644 --- a/app/admin/models/erp_order.go +++ b/app/admin/models/erp_order.go @@ -326,6 +326,7 @@ type ErpOrderRetailDetailReq struct { ErpCategoryId uint32 `json:"erp_category_id"` // 分类id ErpCommodityName string `json:"erp_commodity_name"` // 商品名称 Salesman uint32 `json:"salesman"` // 销售人员ID + IMEI string `json:"imei"` // 串码 StartTime string `json:"start_time"` // 开始时间 EndTime string `json:"end_time"` // 结束时间 PageIndex int `json:"pageIndex"` // 页码 @@ -1301,7 +1302,8 @@ func erpOrderListSetCashier(list []ErpOrder) { } func (m *ErpOrder) SetErpCashier() { - if m.CashierList != "" && m.RetailType == RetailTypeSale { // 临时限制,退货订单不展示具体付款方式 + //if m.CashierList != "" && m.RetailType == RetailTypeSale { // 临时限制,退货订单不展示具体付款方式 + if m.CashierList != "" { var cashiers []ErpOrderCashier err := json.Unmarshal([]byte(m.CashierList), &cashiers) 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) var nCount int32 + var salesAmount, salesCost, salesMargin float64 if item.RetailType == RetailTypeRejected { nCount = -int32(item.Count) + salesAmount = -item.ReceivedAmount + salesCost = -float64(int32(item.WholesalePrice) * item.Count) + salesMargin = -(item.ReceivedAmount - float64(int32(item.WholesalePrice)*item.Count)) } else { 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 { // 如果存在,说明已经有数据,进行合并操作 existingData.Count += nCount - existingData.SalesAmount += item.ReceivedAmount - existingData.SalesCost += float64(int32(item.WholesalePrice) * item.Count) - existingData.SalesMargin = existingData.SalesAmount - existingData.SalesCost - existingData.GrossMargins = float64ToPercentage(existingData.SalesMargin / existingData.SalesAmount) + existingData.SalesAmount += salesAmount + existingData.SalesCost += salesCost + existingData.SalesMargin += salesMargin + + if existingData.SalesAmount == 0 { + existingData.GrossMargins = "--" + } else { + existingData.GrossMargins = float64ToPercentage(existingData.SalesMargin / existingData.SalesAmount) + } // 如果是拒绝的销售,进行相应的处理 if existingData.RetailType == RetailTypeRejected { @@ -2354,7 +2368,11 @@ func QueryRetailMargin(req *ErpOrderRetailMarginReq, c *gin.Context) (*ErpOrderR SalesAmount: item.ReceivedAmount, SalesCost: 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{} 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) } else { @@ -2762,6 +2780,11 @@ func queryRetailDetailByJoin(req *ErpOrderRetailDetailReq, c *gin.Context) (*Erp es = es.Where("erp_order.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) == "系统管理员") { sysUser, err := GetSysUserByCtx(c) diff --git a/app/admin/models/inventory_report.go b/app/admin/models/inventory_report.go index aae075c..9f6e875 100644 --- a/app/admin/models/inventory_report.go +++ b/app/admin/models/inventory_report.go @@ -111,6 +111,7 @@ type InventoryReportAllotDetailReq struct { ReceiveStoreId []uint32 `json:"receive_store_id"` // 调入门店id CommodityName []string `json:"commodity_name"` // 商品名称 CategoryID []uint32 `json:"category_id"` // 商品分类id + IMEI string `json:"imei"` // 串码 State uint32 `json:"state"` // 调拨状态:1-调拨中 2-已完成 AuditTimeStart string `json:"audit_time_start"` // 审核/发起开始时间 AuditTimeEnd string `json:"audit_time_end"` // 审核/发起结束时间 @@ -195,6 +196,7 @@ type InventoryReportOtherDetailReq struct { CommodityName []string `json:"commodity_name"` // 商品名称 CategoryID []uint32 `json:"category_id"` // 商品分类id Type uint32 `json:"type"` // 出入库方式:1-产品入库 2-盘点入库 3-系统出库 4-盘点出库 + IMEI string `json:"imei"` // 串码 StartTime string `json:"start_time"` // 开始时间/入库时间 EndTime string `json:"end_time"` // 结束时间/出库时间 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) } + 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 { // 调拨状态 switch m.State { case 1: // 调拨中 @@ -1566,23 +1573,43 @@ func (m *InventoryReportOtherDetailReq) ReportByOtherDetailList(c *gin.Context) allData[i].CategoryName = commodityInfo.ErpCategoryName } - if (len(m.SerialNumber) == 0 || data.SerialNumber == m.SerialNumber) && - (len(m.StoreId) == 0 || tools.Uint32SliceContains(m.StoreId, data.StoreId)) && - (len(m.CommodityName) == 0 || tools.StringSliceContains(m.CommodityName, data.CommodityName)) && - (len(m.CategoryID) == 0 || tools.Uint32SliceContains(m.CategoryID, allData[i].CategoryID)) && - (m.Type == 0 || m.Type == data.Type) && - ((m.StartTime == "" && m.EndTime == "") || (data.StockTime.After(startTime) && data.StockTime.Before(endTime))) { - if data.Type == 3 || data.Type == 4 { // 系统出库、盘点出库 - totalPurchasePrice -= allData[i].PurchasePrice - totalEmployeePrice -= allData[i].EmployeePrice + 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 + 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 { - totalPurchasePrice += allData[i].PurchasePrice - totalEmployeePrice += allData[i].EmployeePrice + continue + } + } else { + if (len(m.SerialNumber) == 0 || data.SerialNumber == m.SerialNumber) && + (len(m.StoreId) == 0 || tools.Uint32SliceContains(m.StoreId, data.StoreId)) && + (len(m.CommodityName) == 0 || tools.StringSliceContains(m.CommodityName, data.CommodityName)) && + (len(m.CategoryID) == 0 || tools.Uint32SliceContains(m.CategoryID, allData[i].CategoryID)) && + (m.Type == 0 || m.Type == data.Type) && + ((m.StartTime == "" && m.EndTime == "") || (data.StockTime.After(startTime) && data.StockTime.Before(endTime))) { + 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]) } - filteredData = append(filteredData, allData[i]) } } diff --git a/app/admin/models/purchase.go b/app/admin/models/purchase.go index bdb3dd7..27e1601 100644 --- a/app/admin/models/purchase.go +++ b/app/admin/models/purchase.go @@ -498,6 +498,7 @@ type ErpPurchaseReportDetailReq struct { ErpCommodityName string `json:"erp_commodity_name"` // 商品名称 ErpCategoryID uint32 `json:"erp_category_id"` // 商品分类id ErpSupplierId uint32 `json:"erp_supplier_id"` // 供应商id + IMEI string `json:"imei"` // 串码 StartTime string `json:"startTime"` // 入/出库,开始时间 EndTime string `json:"endTime"` // 入/出库,结束时间 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) 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 != "" { // 入/出库开始时间 parse, err := time.Parse(QueryTimeFormat, req.StartTime) if err != nil { diff --git a/app/admin/models/sysuser.go b/app/admin/models/sysuser.go index e5b03c6..eac1387 100644 --- a/app/admin/models/sysuser.go +++ b/app/admin/models/sysuser.go @@ -167,9 +167,24 @@ func (e *SysUser) Get() (SysUserView SysUserView, err error) { } SysUserView.Password = "" - if SysUserView.StoreData != "" { - SysUserView.StoreList = deserializeStoreData(SysUserView.StoreData) + 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 != "" { + SysUserView.StoreList = deserializeStoreData(SysUserView.StoreData) + } } + return } diff --git a/app/admin/models/user.go b/app/admin/models/user.go index 803b7c5..5148f7c 100644 --- a/app/admin/models/user.go +++ b/app/admin/models/user.go @@ -1486,15 +1486,17 @@ func (m *NewUserInviteRecordReq) NewList() (*UserInviteRecordListResp, error) { 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"). 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 { qs = qs.Where("store_id=?", m.StoreId) countQuery = countQuery.Where("store_id=?", m.StoreId) } if m.InviteUserName != "" { - qs = qs.Where("B1.Shop_assistant_name=?", m.InviteUserName) - countQuery = countQuery.Where("B1.Shop_assistant_name=?", m.InviteUserName) + qs = qs.Where("B1.nick_name=?", m.InviteUserName) + countQuery = countQuery.Where("B1.nick_name=?", m.InviteUserName) } if m.FromUid != 0 { 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) 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 { var recordTypeConditions []string 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"). 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"). - Order("action_time DESC"). + Group("user_invite_record.id"). + Order("MAX(user_invite_record.action_time) DESC"). Find(&records).Error if err != nil && err != RecordNotFound { 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"). 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"). - Order("action_time DESC"). + Group("user_invite_record.id"). + Order("MAX(user_invite_record.action_time) DESC"). Offset(page * pageSize). Limit(pageSize). Find(&records).Error @@ -1718,6 +1641,11 @@ func (m *NewUserInviteRecordReq) NewList() (*UserInviteRecordListResp, error) { MemberLevel: item.UserMemberLevel, MemberExpire: item.MemberExpire, } + + if item.FromUid == 0 { + data.InviteUserName = "" + } + listData = append(listData, data) } @@ -1887,6 +1815,14 @@ func CalculateMemberType(spendType, renewHide, memberGenre, memberLevel uint32) switch { case spendType == 1: 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: switch memberLevel { case 2: @@ -1934,14 +1870,6 @@ func CalculateMemberType(spendType, renewHide, memberGenre, memberLevel uint32) } 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 } @@ -2753,10 +2681,12 @@ func (m *CooperativeBusiness) InviteMemberReport() { } } +// UserInviteReport +// 每个月1号统计上个月的数据 func (m *CooperativeBusiness) UserInviteReport(userInfo UserInfo) { //end := InDayZero(1) //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 //qs := orm.Eloquent.Table("user_invite").Where("from_uid=?", userInfo.Uid). // Where("member_status=?", 2).Where("user_type=?", 2). @@ -2775,8 +2705,8 @@ func (m *CooperativeBusiness) UserInviteReport(userInfo UserInfo) { return } 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", - userInfo.CooperativeBusinessId, reportTime, userInfo.StoreId, userInfo.Uid)) + "SELECT * FROM invite_member_report WHERE cooperative_business_id=%d AND date='%s' AND uid=%d", + userInfo.CooperativeBusinessId, reportTime, userInfo.Uid)) if err != nil { logger.Error("cooperative member promotion record exist err:", logger.Field("err", err)) return @@ -2791,9 +2721,9 @@ func (m *CooperativeBusiness) UserInviteReport(userInfo UserInfo) { DeductAmount: 0, CooperativeBusinessId: userInfo.CooperativeBusinessId, CooperativeName: userInfo.CooperativeName, - GoldDeduct: m.CooperativeAssistantMemberDeduct.GoldDeduct, - PlatinumDeduct: m.CooperativeAssistantMemberDeduct.PlatinumDeduct, - BlackGoldDeduct: m.CooperativeAssistantMemberDeduct.BlackGoldDeduct, + //GoldDeduct: m.CooperativeAssistantMemberDeduct.GoldDeduct, + //PlatinumDeduct: m.CooperativeAssistantMemberDeduct.PlatinumDeduct, + //BlackGoldDeduct: m.CooperativeAssistantMemberDeduct.BlackGoldDeduct, } //for i, _ := range userInvites { @@ -2873,11 +2803,18 @@ func (m *AssistantInviteMemberReportReq) List() (*AssistantInviteMemberReportLis if len(m.RoleId) != 0 { 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 if err != nil { logger.Error("err:", logger.Field("err", err)) return nil, err } + if len(users) == 0 { + return &AssistantInviteMemberReportListResp{}, nil + } + ids := make(map[string]uint32, 0) sysUserMap := make(map[uint32]*SysUser, 0) var uidList []uint32 @@ -2910,9 +2847,6 @@ func (m *AssistantInviteMemberReportReq) List() (*AssistantInviteMemberReportLis if m.Uid != 0 { qs = qs.Where("uid=?", m.Uid) } - if m.StoreId != 0 { - qs = qs.Where("store_id=?", m.StoreId) - } if m.Date != "" { qs = qs.Where("date=?", m.Date) } diff --git a/docs/docs.go b/docs/docs.go index c775ad0..8954d12 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -9056,6 +9056,10 @@ const docTemplate = `{ "description": "商品名称", "type": "string" }, + "imei": { + "description": "串码", + "type": "string" + }, "is_export": { "description": "1-导出", "type": "integer" @@ -10369,6 +10373,10 @@ const docTemplate = `{ "description": "供应商id", "type": "integer" }, + "imei": { + "description": "串码", + "type": "string" + }, "is_export": { "description": "1-导出", "type": "integer" @@ -11739,6 +11747,10 @@ const docTemplate = `{ "type": "integer" } }, + "imei": { + "description": "串码", + "type": "string" + }, "is_export": { "description": "1-导出", "type": "integer" @@ -12101,6 +12113,10 @@ const docTemplate = `{ "description": "结束时间/出库时间", "type": "string" }, + "imei": { + "description": "串码", + "type": "string" + }, "is_export": { "description": "1-导出", "type": "integer" diff --git a/docs/swagger.json b/docs/swagger.json index 035fe99..c8ad721 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -9045,6 +9045,10 @@ "description": "商品名称", "type": "string" }, + "imei": { + "description": "串码", + "type": "string" + }, "is_export": { "description": "1-导出", "type": "integer" @@ -10358,6 +10362,10 @@ "description": "供应商id", "type": "integer" }, + "imei": { + "description": "串码", + "type": "string" + }, "is_export": { "description": "1-导出", "type": "integer" @@ -11728,6 +11736,10 @@ "type": "integer" } }, + "imei": { + "description": "串码", + "type": "string" + }, "is_export": { "description": "1-导出", "type": "integer" @@ -12090,6 +12102,10 @@ "description": "结束时间/出库时间", "type": "string" }, + "imei": { + "description": "串码", + "type": "string" + }, "is_export": { "description": "1-导出", "type": "integer" diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 18753d2..05739b8 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -2304,6 +2304,9 @@ definitions: erp_commodity_name: description: 商品名称 type: string + imei: + description: 串码 + type: string is_export: description: 1-导出 type: integer @@ -3258,6 +3261,9 @@ definitions: erp_supplier_id: description: 供应商id type: integer + imei: + description: 串码 + type: string is_export: description: 1-导出 type: integer @@ -4254,6 +4260,9 @@ definitions: items: type: integer type: array + imei: + description: 串码 + type: string is_export: description: 1-导出 type: integer @@ -4514,6 +4523,9 @@ definitions: end_time: description: 结束时间/出库时间 type: string + imei: + description: 串码 + type: string is_export: description: 1-导出 type: integer