订单统计接口修改,对比差异程序修改

This commit is contained in:
苏尹岚
2019-11-01 15:31:29 +08:00
parent c30cd01756
commit 4d605195ac
6 changed files with 163 additions and 69 deletions

View File

@@ -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.过滤所有门店信息只留下传进来的vendorMapstoreIDMap中对应的平台和门台信息 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,

View File

@@ -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
}

View File

@@ -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 = ?
`

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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),