From 4d605195acd412b217cf74cbb71eb3adfa7fedd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=B0=B9=E5=B2=9A?= <770236076@qq.com> Date: Fri, 1 Nov 2019 15:31:29 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E7=BB=9F=E8=AE=A1=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E4=BF=AE=E6=94=B9=EF=BC=8C=E5=AF=B9=E6=AF=94=E5=B7=AE?= =?UTF-8?q?=E5=BC=82=E7=A8=8B=E5=BA=8F=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/store_sku_check.go | 148 ++++++++++++++++++++++-- business/model/dao/report.go | 44 +++---- business/model/dao/sku.go | 3 +- business/model/sku.go | 7 +- business/partner/partner.go | 1 - business/partner/purchase/jd/sku.go | 29 ----- 6 files changed, 163 insertions(+), 69 deletions(-) diff --git a/business/jxstore/cms/store_sku_check.go b/business/jxstore/cms/store_sku_check.go index 81d5e930a..e9252e32e 100644 --- a/business/jxstore/cms/store_sku_check.go +++ b/business/jxstore/cms/store_sku_check.go @@ -6,6 +6,8 @@ import ( "sync" "time" + "git.rosy.net.cn/jx-callback/business/model/dao" + "git.rosy.net.cn/baseapi" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils" @@ -27,8 +29,12 @@ const ( ) const ( - DatAanalyse1 = "京东商品库直接创建,正常数据" - DatAanalyse2 = "(可能无经营许可)" + DatAanalyse1 = "京东商品库直接创建,正常数据 " + DatAanalyse2 = "京东商品库未创建成功(可能无经营许可等) " + DatAanalyse3 = "商品名不同 " + DatAanalyse4 = "商品可售状态不同 " + DatAanalyse5 = "京西商品库没有,平台商品库有 " + DatAanalyse6 = "京西商品库有,平台商品库没有" ) var ( @@ -55,6 +61,16 @@ var ( "平台可售状态", "数据分析", } + + deoptTitleList = []string{ + "SkuID", + "京西商品名", + "平台商品名", + "京西可售状态", + "平台可售状态", + "数据分析", + } + statisticTitleList = []string{ "京西和平台商品状态", "待创建", @@ -75,7 +91,8 @@ var ( {"京西有,平台有", "否", "下架"}, {"京西有,平台有", "否", "上架"}, } - diffData DiffDataLock + diffData DiffDataLock + depotDiffData DeoptDiffDataLock multiStoreAllSkuInfoMap map[int]map[int]*partner.SkuNameInfo multiStoreAllSkuInfoList map[int][]*partner.StoreSkuInfo @@ -88,6 +105,20 @@ type DiffDataLock struct { locker sync.RWMutex } +type DeoptDiffDataLock struct { + diffDataMap map[int][]DepotDiffData + locker sync.RWMutex +} + +type DepotDiffData struct { + SkuID string `json:"SkuID"` + JxSkuName string `json:"京西商品名"` + VendorSkuName string `json:"平台商品名"` + JxStatus string `json:"京西可售状态"` + VendorStatus string `json:"平台可售状态"` + DatAanalyse string `json:"数据分析"` +} + type DiffData struct { JxStoreID string `json:"京西门店ID"` VendorStoreID string `json:"平台门店ID"` @@ -111,6 +142,16 @@ type StatisticData struct { Percent string `json:"占比"` } +func (d *DeoptDiffDataLock) AppendData2(vendorID int, depotDiffData DepotDiffData) { + d.locker.Lock() + defer d.locker.Unlock() + d.diffDataMap[vendorID] = append(d.diffDataMap[vendorID], depotDiffData) +} + +func (d *DeoptDiffDataLock) InitData2() { + d.diffDataMap = make(map[int][]DepotDiffData) +} + func (d *DiffDataLock) AppendData(vendorID int, diffData DiffData) { d.locker.Lock() defer d.locker.Unlock() @@ -146,7 +187,7 @@ func GetMultiStoreAllSkuInfo(ctx *jxcontext.Context, vendorMap map[int]bool) { } if partner.IsMultiStore(vendorID) { multiHandler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IMultipleStoresHandler) - allSkuNameInfoList, err := multiHandler.GetSkusForCheck(ctx, 0, "", "") + allSkuNameInfoList, err := multiHandler.GetSkus(ctx, 0, "", "") if err != nil { baseapi.SugarLogger.Errorf("GetMultiStoreAllSkuInfo error:%v", err) } else { @@ -154,7 +195,10 @@ func GetMultiStoreAllSkuInfo(ctx *jxcontext.Context, vendorMap map[int]bool) { tempMap := make(map[int]*partner.SkuNameInfo) for _, value := range allSkuNameInfoList { for _, skuInfo := range value.SkuList { - filterCloseSkuIds = append(filterCloseSkuIds, skuInfo.SkuID) + //表示平台商品库未下架的 + if skuInfo.Status != 0 { + filterCloseSkuIds = append(filterCloseSkuIds, skuInfo.SkuID) + } tempMap[skuInfo.SkuID] = value } } @@ -186,6 +230,14 @@ func GetFilterVendorSkuInfoMap(vendorSkuInfoList []*partner.SkuNameInfo) map[int return filterVendorSkuInfoMap } +func GetFilterJxSkuInfoMap2(jxSkuInfoList []*model.SkuAndName) map[int]*model.SkuAndName { + filterVendorSkuInfoMap := make(map[int]*model.SkuAndName) + for _, value := range jxSkuInfoList { + filterVendorSkuInfoMap[value.ID] = value + } + return filterVendorSkuInfoMap +} + func GetFilterMultiStoreSkuInfoMap(vendorID int, skuInfoList []*partner.StoreSkuInfo) map[int]*partner.SkuNameInfo { allSkuInfoMap := GetMultiStoreAllSkuInfoMap(vendorID) filterSkuInfoMap := make(map[int]*partner.SkuNameInfo) @@ -318,6 +370,72 @@ func CompareJxAndVendor(vendorID int, storeIDStr, vendorStoreID, storeName strin } } +func CompareJxAndMultiVenderDepot(ctx *jxcontext.Context, vendorMap map[int]bool) { + db := dao.GetDB() + for vendorID, _ := range vendorNameList { + //filter for vendorID + if len(vendorMap) > 0 { + if _, ok := vendorMap[vendorID]; !ok { + continue + } + } + if partner.IsMultiStore(vendorID) { + multiHandler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IMultipleStoresHandler) + allSkuNameInfoList, _ := multiHandler.GetSkus(ctx, 0, "", "") + filterVendorSkuInfoMap := GetFilterVendorSkuInfoMap(allSkuNameInfoList) + skuList, _ := dao.GetSkus(db, []int{}, []int{}, []int{}, []int{}) + filterJxSkuInfoMap2 := GetFilterJxSkuInfoMap2(skuList) + for skuid, jxSkuInfo := range filterJxSkuInfoMap2 { + reason := `` + jxSkuDetailName := jxutils.ComposeSkuName(jxSkuInfo.Prefix, jxSkuInfo.Name, jxSkuInfo.Comment, jxSkuInfo.Unit, jxSkuInfo.SpecQuality, jxSkuInfo.SpecUnit, 0) + + vendorSkuInfoMap := filterVendorSkuInfoMap[skuid] + jxSkuSaleStatus := jxSkuInfo.Status + jxSkuSaleStatusName := GetSkuSaleStatusName(jxSkuSaleStatus) + skuIDStr := utils.Int2Str(skuid) + if vendorSkuInfoMap != nil { + vendorSkuSaleStatusName := GetSkuSaleStatusName(vendorSkuInfoMap.SkuList[0].Status) + vendorSkuDetailName := vendorSkuInfoMap.SkuList[0].SkuName + isSaleStatusDiff := jxSkuSaleStatusName != vendorSkuSaleStatusName + isNameDiff := strings.Compare(jxSkuDetailName, vendorSkuDetailName) != 0 + if isNameDiff || isSaleStatusDiff { + if isNameDiff { + reason += DatAanalyse3 + } + if isSaleStatusDiff { + reason += DatAanalyse4 + } + outPutData := DepotDiffData{skuIDStr, jxSkuDetailName, vendorSkuDetailName, jxSkuSaleStatusName, vendorSkuSaleStatusName, reason} + depotDiffData.AppendData2(vendorID, outPutData) + } + } else { + outPutData := DepotDiffData{skuIDStr, jxSkuDetailName, "", jxSkuSaleStatusName, "", DatAanalyse6} + depotDiffData.AppendData2(vendorID, outPutData) + } + } + for skuID, vendorSkuInfo := range filterVendorSkuInfoMap { + if vendorSkuInfo != nil { + if len(vendorSkuInfo.SkuList) > 0 { + skuIDStr := utils.Int2Str(skuID) + vendorSkuDetailName := vendorSkuInfo.SkuList[0].SkuName + vendorSkuSaleStatusName := GetSkuSaleStatusName(vendorSkuInfo.SkuList[0].Status) + + jxSkuInfo := filterJxSkuInfoMap2[skuID] + if jxSkuInfo == nil { + outPutData := DepotDiffData{skuIDStr, "", vendorSkuDetailName, "", vendorSkuSaleStatusName, DatAanalyse5} + depotDiffData.AppendData2(vendorID, outPutData) + } + } else { + globals.SugarLogger.Warnf("CompareJxAndMultiVenderDepot vendorSkuInfo.SkuList:%d is nil", skuID) + } + } else { + globals.SugarLogger.Warnf("CompareJxAndMultiVenderDepot skuID:%d is nil", skuID) + } + } + } + } +} + //入口函数,校验本地商品京西和其他平台的差异 func CheckSkuDiffBetweenJxAndVendor(ctx *jxcontext.Context, vendorIDList []int, storeIDList []int) { startProcessTime := time.Now().Unix() @@ -338,6 +456,10 @@ func CheckSkuDiffBetweenJxAndVendor(ctx *jxcontext.Context, vendorIDList []int, //2.为multiStoreAllSkuInfoList 和 multiStoreAllSkuInfoMap 赋值 GetMultiStoreAllSkuInfo(ctx, vendorMap) case 1: + //对比京西库和多门店平台的库的信息 + depotDiffData.InitData2() + CompareJxAndMultiVenderDepot(ctx, vendorMap) + case 2: //1.获取京西本地所有门店信息 store、place、user表联查 jxStoreInfoList //2.过滤所有门店信息,只留下传进来的vendorMap,storeIDMap中对应的平台和门台信息 filterStoreList //3.判断是否多平台门店,两种情况两种处理 @@ -398,8 +520,8 @@ func CheckSkuDiffBetweenJxAndVendor(ctx *jxcontext.Context, vendorIDList []int, baseapi.SugarLogger.Debugf("CheckSkuDiffBetweenJxAndVendor taskParallel error:%v", err) } } - case 2: - WriteToExcel(task, diffData.diffDataMap) + case 3: + WriteToExcel(task, diffData.diffDataMap, depotDiffData.diffDataMap) endProcessTime := time.Now().Unix() diff := endProcessTime - startProcessTime baseapi.SugarLogger.Debugf("CheckSkuDiffBetweenJxAndVendor end time: %v", time.Now()) @@ -407,7 +529,7 @@ func CheckSkuDiffBetweenJxAndVendor(ctx *jxcontext.Context, vendorIDList []int, } return result, err } - taskSeq := tasksch.NewSeqTask("京西和平台商品差异对比-序列任务", ctx, taskSeqFunc, 3) + taskSeq := tasksch.NewSeqTask("京西和平台商品差异对比-序列任务", ctx, taskSeqFunc, 4) tasksch.HandleTask(taskSeq, nil, true).Run() } @@ -472,10 +594,18 @@ func AddStatisticSheet(sheetName string, data []DiffData) (sheet *excel.Obj2Exce return sheet } -func WriteToExcel(task *tasksch.SeqTask, data map[int][]DiffData) { +func WriteToExcel(task *tasksch.SeqTask, data map[int][]DiffData, depotData map[int][]DepotDiffData) { var sheetList []*excel.Obj2ExcelSheetConfig for key, value := range data { sheetName := vendorNameList[key] + if partner.IsMultiStore(key) { + excelConfDepot := &excel.Obj2ExcelSheetConfig{ + Title: sheetName + "商品库与京西商品库对比", + Data: depotData[key], + CaptionList: deoptTitleList, + } + sheetList = append(sheetList, excelConfDepot) + } excelConf := &excel.Obj2ExcelSheetConfig{ Title: sheetName, Data: value, diff --git a/business/model/dao/report.go b/business/model/dao/report.go index 05b0fde9b..262ef3eda 100644 --- a/business/model/dao/report.go +++ b/business/model/dao/report.go @@ -1,8 +1,6 @@ package dao import ( - "fmt" - "strconv" "time" "git.rosy.net.cn/baseapi/utils" @@ -37,8 +35,6 @@ type StatisticsReportForOrdersList struct { //查询统计订单信息 func GetStatisticsReportForOrders(db *DaoDB, storeIDs []int, fromDate time.Time, toDate time.Time) (statisticsReportForOrdersList []*StatisticsReportForOrdersList, err error) { - //排除已取消的订单 - status := strconv.Itoa(model.OrderStatusCanceled) sql := ` SELECT c.id store_id, @@ -75,24 +71,24 @@ func GetStatisticsReportForOrders(db *DaoDB, storeIDs []int, fromDate time.Time, SUM(discount_money) discount_money, SUM(desired_fee) desired_fee, SUM(distance_freight_money) distance_freight_money, - SUM(waybill_tip_money) waybill_tip_money, + SUM(IF(a.vendor_id = a.waybill_vendor_id,waybill_tip_money,0)) waybill_tip_money, SUM(total_shop_money) total_shop_money, SUM(pm_subsidy_money) pm_subsidy_money, SUM(earning_price) earning_price, SUM(total_shop_money-earning_price-desired_fee-distance_freight_money-waybill_tip_money-80) total_gross_profit FROM goods_order a LEFT JOIN waybill b ON IF(a.waybill_vendor_id = -1,a.vendor_order_id,a.vendor_waybill_id) = b.vendor_waybill_id - WHERE a.status != ` + status + ` + WHERE a.status != ? ` - sqlParams := []interface{}{} + sqlParams := []interface{}{ + model.OrderStatusCanceled, //排除已取消的订单 + } if !utils.IsTimeZero(fromDate) && !utils.IsTimeZero(toDate) { - sql += `AND a.order_created_at BETWEEN ? AND ? - ` + sql += ` AND a.order_created_at BETWEEN ? AND ?` sqlParams = append(sqlParams, fromDate, toDate) } if len(storeIDs) > 0 { - sql += `AND a.store_id IN(` + GenQuestionMarks(len(storeIDs)) + `) - ` + sql += ` AND a.store_id IN(` + GenQuestionMarks(len(storeIDs)) + `)` sqlParams = append(sqlParams, storeIDs) } sql += ` @@ -101,8 +97,7 @@ func GetStatisticsReportForOrders(db *DaoDB, storeIDs []int, fromDate time.Time, ON s.store_id = c.id ` if len(storeIDs) > 0 { - sql += `WHERE c.id IN (` + GenQuestionMarks(len(storeIDs)) + `) - ` + sql += ` WHERE c.id IN (` + GenQuestionMarks(len(storeIDs)) + `)` sqlParams = append(sqlParams, storeIDs) } if err = GetRows(db, &statisticsReportForOrdersList, sql, sqlParams...); err == nil { @@ -113,8 +108,6 @@ func GetStatisticsReportForOrders(db *DaoDB, storeIDs []int, fromDate time.Time, //查询统计售后单信息 func GetGetStatisticsReportForAfsOrders(db *DaoDB, storeIDs []int, fromDate time.Time, toDate time.Time) (statisticsReportForOrdersList []*StatisticsReportForOrdersList, err error) { - //排除已取消的订单 - status := strconv.Itoa(model.OrderStatusCanceled) sql := ` SELECT c.id store_id, @@ -151,24 +144,23 @@ func GetGetStatisticsReportForAfsOrders(db *DaoDB, storeIDs []int, fromDate time SUM(discount_money) discount_money, SUM(afs_freight_money) desired_fee, SUM(distance_freight_money) distance_freight_money, - SUM(waybill_tip_money) waybill_tip_money, + SUM(IF(a.vendor_id = a.waybill_vendor_id,waybill_tip_money,0)) waybill_tip_money, SUM(total_shop_money) total_shop_money, SUM(b.pm_subsidy_money) pm_subsidy_money, SUM(earning_price) earning_price, SUM(total_shop_money-earning_price-afs_freight_money-distance_freight_money-waybill_tip_money-80) total_gross_profit - FROM goods_order a,afs_order b - WHERE a.vendor_order_id = b.vendor_order_id - AND a.status != ` + status + ` + FROM goods_order a JOIN afs_order b ON a.vendor_order_id = b.vendor_order_id + WHERE a.status != ? ` - sqlParams := []interface{}{} + sqlParams := []interface{}{ + model.OrderStatusCanceled, //排除已取消的订单 + } if !utils.IsTimeZero(fromDate) && !utils.IsTimeZero(toDate) { - sql += `AND a.order_created_at BETWEEN ? AND ? - ` + sql += ` AND a.order_created_at BETWEEN ? AND ?` sqlParams = append(sqlParams, fromDate, toDate) } if len(storeIDs) > 0 { - sql += `AND a.store_id IN(` + GenQuestionMarks(len(storeIDs)) + `) - ` + sql += ` AND a.store_id IN(` + GenQuestionMarks(len(storeIDs)) + `)` sqlParams = append(sqlParams, storeIDs) } sql += ` @@ -177,11 +169,9 @@ func GetGetStatisticsReportForAfsOrders(db *DaoDB, storeIDs []int, fromDate time ON s.store_id = c.id ` if len(storeIDs) > 0 { - sql += `WHERE c.id IN (` + GenQuestionMarks(len(storeIDs)) + `) - ` + sql += ` WHERE c.id IN (` + GenQuestionMarks(len(storeIDs)) + `)` sqlParams = append(sqlParams, storeIDs) } - fmt.Println(sql) if err = GetRows(db, &statisticsReportForOrdersList, sql, sqlParams...); err == nil { return statisticsReportForOrdersList, nil } diff --git a/business/model/dao/sku.go b/business/model/dao/sku.go index ef57e92b6..a942ad08d 100644 --- a/business/model/dao/sku.go +++ b/business/model/dao/sku.go @@ -51,7 +51,8 @@ func DeleteSkuNamePlace(db *DaoDB, nameID int, placeCodes []int) (num int64, err func GetSkus(db *DaoDB, skuIDs, nameIDs, statuss, catIDs []int) (skuList []*model.SkuAndName, err error) { sql := ` - SELECT t1.*, t2.name, t2.unit + SELECT t1.*, + t2.name, t2.unit,t2.spec_quality,t2.spec_unit,t2.prefix FROM sku t1 JOIN sku_name t2 ON t2.id = t1.name_id AND t2.deleted_at = ? ` diff --git a/business/model/sku.go b/business/model/sku.go index e1214522f..465d2407f 100644 --- a/business/model/sku.go +++ b/business/model/sku.go @@ -236,8 +236,11 @@ type Sku struct { type SkuAndName struct { Sku - Name string - Unit string + Name string + Unit string + SpecQuality float32 + SpecUnit string + Prefix string } // func (*Sku) TableUnique() [][]string { diff --git a/business/partner/partner.go b/business/partner/partner.go index 2d8423412..28dadcba3 100644 --- a/business/partner/partner.go +++ b/business/partner/partner.go @@ -173,7 +173,6 @@ type IMultipleStoresHandler interface { // RefreshAllSkusID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool) (hint string, err error) GetSkus(ctx *jxcontext.Context, skuID int, vendorSkuID, skuName string) (skuNameList []*SkuNameInfo, err error) - GetSkusForCheck(ctx *jxcontext.Context, skuID int, vendorSkuID, skuName string) (skuNameList []*SkuNameInfo, err error) } type ISingleStoreHandler interface { diff --git a/business/partner/purchase/jd/sku.go b/business/partner/purchase/jd/sku.go index abc0480e0..6b78f8b5a 100644 --- a/business/partner/purchase/jd/sku.go +++ b/business/partner/purchase/jd/sku.go @@ -604,35 +604,6 @@ func (p *PurchaseHandler) GetVendorCategories(ctx *jxcontext.Context) (vendorCat return vendorCats, err } -//为对比差异另创建了一个查询京东库的的方法,此方法不用查询图片路径,并且过滤掉了京东库上已下架的商品 -func (p *PurchaseHandler) GetSkusForCheck(ctx *jxcontext.Context, skuID int, vendorSkuID, skuName string) (skuNameList []*partner.SkuNameInfo, err error) { - param := &jdapi.QuerySkuParam{ - SkuID: utils.Str2Int64WithDefault(vendorSkuID, 0), - SkuName: skuName, - IsFilterDel: jdapi.IsFilterDelTrue, - PageNo: 1, - PageSize: jdapi.MaxSkuIDsCount4QueryListBySkuIds, - } - for { - skuList, _, err2 := getAPI("").QuerySkuInfos(param) - if err = err2; err != nil { - return nil, err - } - if len(skuList) > 0 { - for _, v := range skuList { - if v.FixedStatus != jdapi.SkuFixedStatusOffline { - skuNameList = append(skuNameList, vendorSku2Jx(v)) - } - } - } - if len(skuList) < param.PageSize { - break - } - param.PageNo++ - } - return skuNameList, err -} - func (p *PurchaseHandler) GetSkus(ctx *jxcontext.Context, skuID int, vendorSkuID, skuName string) (skuNameList []*partner.SkuNameInfo, err error) { param := &jdapi.QuerySkuParam{ SkuID: utils.Str2Int64WithDefault(vendorSkuID, 0),