Accept Merge Request #205: (qidongsheng -> jdshop)

Merge Request: 京西库与各平台差异查询
Created By: @漆东升
Accepted By: @苏尹岚
URL: https://rosydev.coding.net/p/jx-callback/d/jx-callback/git/merge/205
This commit is contained in:
苏尹岚
2020-06-22 09:11:17 +08:00
8 changed files with 365 additions and 41 deletions

View File

@@ -4693,3 +4693,4 @@ func StoreSkuPriceAudit(ctx *jxcontext.Context, storeSkuAudits []*model.StoreSku
}
return hint, err
}

View File

@@ -2,6 +2,9 @@ package cms
import (
"fmt"
"git.rosy.net.cn/baseapi/platformapi/dingdingapi"
"git.rosy.net.cn/jx-callback/business/jxutils/ddmsg"
"github.com/astaxie/beego"
"strings"
"sync"
"time"
@@ -22,7 +25,7 @@ import (
const (
canWriteTolocal = false
needStatistic = true
needStatistic = false
isFilterToBeCreateAndNotSale = true
parallelCount = 5
fileExt = ".xlsx"
@@ -38,6 +41,7 @@ const (
DatAanalyse6 = "京西商品库有,平台商品库没有"
DatAanalyse7 = "同步状态异常"
DatAanalyse8 = "平台门店未关注或平台门店商品库存为0应添加对应的平台门店商品"
DatAanalyse9 = "平台门店价格与京西商品库价格不一致"
)
var (
@@ -62,6 +66,8 @@ var (
"平台商品名",
"京西可售状态",
"平台可售状态",
"京西价格",
"平台价格",
"数据分析",
}
@@ -136,6 +142,8 @@ type DiffData struct {
VendorSkuName string `json:"平台商品名"`
JxStatus string `json:"京西可售状态"`
VendorStatus string `json:"平台可售状态"`
JxSkuPrice string `json:"京西价格"` /*哇,不能小写,不然会搞事情*/
VendorPrice string `json:"平台价格"`
DatAanalyse string `json:"数据分析"`
}
@@ -216,7 +224,13 @@ func GetMultiStoreAllSkuInfo(ctx *jxcontext.Context, vendorMap map[int]bool) {
if err != nil {
baseapi.SugarLogger.Errorf("GetMultiStoreAllSkuInfo error:%v", err)
} else {
multiStoreAllSkuInfoList[vendorID][vendorOrgCode] = StoreSkuFullList2BareFilter(allSkuNameInfoList) //map[平台ID[]StoreSkuInfo1,StoreSkuInfo2...]
if multiStoreAllSkuInfoList[vendorID] != nil {
multiStoreAllSkuInfoList[vendorID][vendorOrgCode] = StoreSkuFullList2BareFilter(allSkuNameInfoList) //map[平台ID[]StoreSkuInfo1,StoreSkuInfo2...]
} else {
multiStoreAllSkuInfoList = make(map[int]map[string][]*partner.StoreSkuInfo)
multiStoreAllSkuInfoList[vendorID] = make(map[string][]*partner.StoreSkuInfo)
multiStoreAllSkuInfoList[vendorID][vendorOrgCode] = StoreSkuFullList2BareFilter(allSkuNameInfoList) //map[平台ID[]StoreSkuInfo1,StoreSkuInfo2...]
}
tempMap := make(map[int]*partner.SkuNameInfo)
for _, value := range allSkuNameInfoList {
for _, skuInfo := range value.SkuList {
@@ -334,8 +348,11 @@ func IsSkuCanSale(saleStatus int) bool {
//京西平台和其他平台商品的对比
//storeIDStr 京西商家id vendorStoreID 平台商家id
func CompareJxAndVendor(vendorID int, storeIDStr, vendorStoreID, storeName string, filterJxSkuInfoMap map[int]*dao.StoreSkuNameExt, filterVendorSkuInfoMap map[int]*partner.SkuNameInfo) {
//utils.Writelog("进入 CompareJxAndVendor 方法")
for skuID, jxSkuInfo := range filterJxSkuInfoMap {
skuIDStr := utils.Int2Str(skuID)
/*写京西skuIDStr*/
//utils.Writelog("skuIDStr" + skuIDStr)
var jxSkuDetailName string
//多规格商品不用比较数量单位
if jxSkuInfo.IsSpu == 0 {
@@ -345,11 +362,13 @@ func CompareJxAndVendor(vendorID int, storeIDStr, vendorStoreID, storeName strin
//jxSkuDetailName : 前缀 ([荐]) + 分类名(xxx水饺) + 数量单位(约..g/份) + 注释 (补充..)
jxSkuDetailName = jxutils.ComposeSkuNameOriginal(jxSkuInfo.SkuName.Prefix, jxSkuInfo.SkuName.Name, jxSkuInfo.Skus[0].Comment, "", jxSkuInfo.Skus[0].SkuSpecQuality, "", 0)
}
//utils.Writelog("jxSkuDetailName:" + jxSkuDetailName)
//jxSkuSaleStatus : 商品状态 skustatus 优先级高于 StoreSkuStatus
jxSkuSaleStatus := jxutils.MergeSkuStatus(jxSkuInfo.Skus[0].SkuStatus, jxSkuInfo.Skus[0].StoreSkuStatus)
jxSkuSaleStatusName := GetSkuSaleStatusName(jxSkuSaleStatus)
jxSkuSaleStatusName := GetSkuSaleStatusName(jxSkuSaleStatus + 3)
/*京西价格*/
jxSkuPrice := fmt.Sprintf("%.2f", float64(jxSkuInfo.Skus[0].JxPrice)/float64(100))
//jxSkuPrice := strconv.Itoa(jxSkuInfo.Skus[0].JxPrice)
vendorSkuInfo := filterVendorSkuInfoMap[skuID]
var status int8
if vendorID == model.VendorIDMTWM {
@@ -365,14 +384,19 @@ func CompareJxAndVendor(vendorID int, storeIDStr, vendorStoreID, storeName strin
if vendorSkuInfo != nil {
vendorSkuDetailName := vendorSkuInfo.SkuList[0].SkuName
vendorSkuSaleStatusName := GetSkuSaleStatusName(vendorSkuInfo.SkuList[0].Status)
vendorSkuSaleStatusName := GetSkuSaleStatusName(vendorSkuInfo.SkuList[0].Status + 3)
/* 供货商价格 */
vendorPrice := fmt.Sprintf("%.2f", float64(vendorSkuInfo.SkuList[0].StoreSkuInfo.VendorPrice)/float64(100))
isSaleStatusDiff := jxSkuSaleStatusName != vendorSkuSaleStatusName
isNameDiff := jxSkuDetailName != vendorSkuDetailName
/*比较价格*/
isPriceDiff := vendorPrice != jxSkuPrice
//utils.Writelog("isSaleStatusDiff:" + strconv.FormatBool(isSaleStatusDiff))
//utils.Writelog("isNameDiff:" + strconv.FormatBool(isNameDiff))
if jxSkuDetailName != "" && vendorSkuDetailName != "" && strings.Contains(jxSkuDetailName, vendorSkuDetailName) {
isNameDiff = false
}
if isSaleStatusDiff || isNameDiff {
if isSaleStatusDiff || isNameDiff || isPriceDiff {
reason := ""
if isNameDiff {
reason += DatAanalyse3
@@ -380,15 +404,18 @@ func CompareJxAndVendor(vendorID int, storeIDStr, vendorStoreID, storeName strin
if isSaleStatusDiff {
reason += DatAanalyse4
}
if isPriceDiff {
reason += DatAanalyse9
}
if status != model.SkuStatusDontSale {
reason += DatAanalyse7
}
outPutData := DiffData{storeIDStr, vendorStoreID, storeName, skuIDStr, syncStatus, toBeCreate, toBeDel, jxSkuDetailName, vendorSkuDetailName, jxSkuSaleStatusName, vendorSkuSaleStatusName, reason}
outPutData := DiffData{storeIDStr, vendorStoreID, storeName, skuIDStr, syncStatus, toBeCreate, toBeDel, jxSkuDetailName, vendorSkuDetailName, jxSkuSaleStatusName, vendorSkuSaleStatusName, jxSkuPrice, vendorPrice, reason}
diffData.AppendData(vendorID, outPutData)
}
if !isSaleStatusDiff && !isNameDiff {
if status != model.SkuStatusDontSale {
outPutData := DiffData{storeIDStr, vendorStoreID, storeName, skuIDStr, syncStatus, toBeCreate, toBeDel, jxSkuDetailName, vendorSkuDetailName, jxSkuSaleStatusName, vendorSkuSaleStatusName, DatAanalyse7}
outPutData := DiffData{storeIDStr, vendorStoreID, storeName, skuIDStr, syncStatus, toBeCreate, toBeDel, jxSkuDetailName, vendorSkuDetailName, jxSkuSaleStatusName, vendorSkuSaleStatusName, jxSkuPrice, vendorPrice, DatAanalyse7}
diffData.AppendData(vendorID, outPutData)
}
}
@@ -405,7 +432,7 @@ func CompareJxAndVendor(vendorID int, storeIDStr, vendorStoreID, storeName strin
if status != model.SkuStatusDontSale {
reason += DatAanalyse7
}
outPutData := DiffData{storeIDStr, vendorStoreID, storeName, skuIDStr, syncStatus, toBeCreate, toBeDel, jxSkuDetailName, "", jxSkuSaleStatusName, "", reason}
outPutData := DiffData{storeIDStr, vendorStoreID, storeName, skuIDStr, syncStatus, toBeCreate, toBeDel, jxSkuDetailName, "", jxSkuSaleStatusName, "", jxSkuPrice, "", reason}
diffData.AppendData(vendorID, outPutData)
}
}
@@ -414,11 +441,14 @@ func CompareJxAndVendor(vendorID int, storeIDStr, vendorStoreID, storeName strin
if len(vendorSkuInfo.SkuList) > 0 {
skuIDStr := utils.Int2Str(skuID)
vendorSkuDetailName := vendorSkuInfo.SkuList[0].SkuName
vendorSkuSaleStatusName := GetSkuSaleStatusName(vendorSkuInfo.SkuList[0].Status)
vendorSkuSaleStatusName := GetSkuSaleStatusName(vendorSkuInfo.SkuList[0].Status + 3)
/* 供货商价格 */
vendorPrice := fmt.Sprintf("%.2f", float64(vendorSkuInfo.SkuList[0].StoreSkuInfo.VendorPrice)/float64(100))
/* 供货商价格 */
jxSkuInfo := filterJxSkuInfoMap[skuID]
/*平台有,京西没有*/
if jxSkuInfo == nil {
outPutData := DiffData{storeIDStr, vendorStoreID, storeName, skuIDStr, "", "", "", "", vendorSkuDetailName, "", vendorSkuSaleStatusName, DatAanalyse1}
outPutData := DiffData{storeIDStr, vendorStoreID, storeName, skuIDStr, "", "", "", "", vendorSkuDetailName, "", vendorSkuSaleStatusName, "", vendorPrice, DatAanalyse1}
diffData.AppendData(vendorID, outPutData)
}
} else {
@@ -497,7 +527,7 @@ func CompareJxAndMultiVenderDepot(ctx *jxcontext.Context, vendorMap map[int]bool
if len(vendorSkuInfo.SkuList) > 0 {
skuIDStr := utils.Int2Str(skuID)
vendorSkuDetailName := vendorSkuInfo.SkuList[0].SkuName
vendorSkuSaleStatusName := GetSkuSaleStatusName(vendorSkuInfo.SkuList[0].Status)
vendorSkuSaleStatusName := GetSkuSaleStatusName(vendorSkuInfo.SkuList[0].Status + 3)
jxSkuInfo := filterJxSkuInfoMap2[skuID]
if jxSkuInfo == nil {
@@ -515,6 +545,259 @@ func CompareJxAndMultiVenderDepot(ctx *jxcontext.Context, vendorMap map[int]bool
}
}
func TestDiff(ctx *jxcontext.Context, vendorIDList []int, storeIDList []int) {
baseapi.SugarLogger.Debugf("CheckSkuDiffBetweenJxAndVendor start time: %v", time.Now())
startProcessTime := time.Now().Unix()
vendorMap := make(map[int]bool)
for _, vendorID := range vendorIDList {
vendorMap[vendorID] = true //map[平台ID:true]
}
storeIDMap := make(map[int]bool)
for _, storeID := range storeIDList {
storeIDMap[storeID] = true //map[门店ID:true]
}
/************************************************update**************************************************/
//自己存值
a := func() {
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)
for _, vendorOrgCode := range apimanager.CurAPIManager.GetAppOrgCodeList(vendorID) {
allSkuNameInfoList, err := multiHandler.GetSkus(ctx, vendorOrgCode, 0, "")
//获取单个表格对比的物品信息列表
skuNameInfoList = allSkuNameInfoList
if err != nil {
fmt.Println("allSkuNameInfoList赋值错误error信息" + err.Error())
continue
}
//*partner.StoreSkuInfo skuNameList []*SkuNameInfo
var bareStoreSkuList []*partner.StoreSkuInfo
for _, v := range allSkuNameInfoList {
for _, v2 := range v.SkuList {
if v2.Status > model.SkuStatusDontSale {
for _, v2 := range v.SkuList {
bareStoreSkuList = append(bareStoreSkuList, &v2.StoreSkuInfo)
}
}
}
}
//if multiStoreAllSkuInfoList[vendorID][vendorOrgCode] != nil && bareStoreSkuList != nil {
if multiStoreAllSkuInfoList[vendorID] != nil && bareStoreSkuList != nil {
multiStoreAllSkuInfoList[vendorID][vendorOrgCode] = bareStoreSkuList
//}else if multiStoreAllSkuInfoList[vendorID][vendorOrgCode] == nil{
} else if multiStoreAllSkuInfoList[vendorID] == nil {
multiStoreAllSkuInfoList = make(map[int]map[string][]*partner.StoreSkuInfo)
multiStoreAllSkuInfoList[vendorID] = make(map[string][]*partner.StoreSkuInfo)
multiStoreAllSkuInfoList[vendorID][vendorOrgCode] = bareStoreSkuList
}
tempMap := make(map[int]*partner.SkuNameInfo)
for _, value := range allSkuNameInfoList {
for _, skuInfo := range value.SkuList {
//表示平台商品库未下架的
if skuInfo.Status > model.SkuStatusDontSale {
filterVendorDepotUnSaleSkuIds = append(filterVendorDepotUnSaleSkuIds, skuInfo.SkuID)
tempMap[skuInfo.SkuID] = value
}
}
}
//商品信息
if multiStoreAllSkuInfoMap[vendorID] == nil {
multiStoreAllSkuInfoMap = make(map[int]map[string]map[int]*partner.SkuNameInfo)
multiStoreAllSkuInfoMap[vendorID] = make(map[string]map[int]*partner.SkuNameInfo)
//multiStoreAllSkuInfoMap[vendorID][vendorOrgCode] = make(map[int]*partner.SkuNameInfo)
multiStoreAllSkuInfoMap[vendorID][vendorOrgCode] = tempMap
} else {
multiStoreAllSkuInfoMap[vendorID][vendorOrgCode] = tempMap
}
}
}
}
}
/************************************************update****************************************************/
//1.获取京西本地所有门店信息 store、place、user表联查 jxStoreInfoList
//2.过滤所有门店信息只留下传进来的vendorMapstoreIDMap中对应的平台和门台信息 filterStoreList
//3.判断是否多平台门店,两种情况两种处理
b := func() {
jxStoreInfoList, err := GetStores(ctx, "", map[string]interface{}{}, 0, -1, utils.DefaultTimeValue, utils.DefaultTimeValue, 0, 0)
if err != nil {
baseapi.SugarLogger.Errorf("CheckSkuDiffBetweenJxAndVendor GetStores error:%v", err)
} else {
//获取总共几个门店任务
filterStoreList := GetFilterStoreList(jxStoreInfoList.Stores, vendorMap, storeIDMap)
diffData.InitData()
jxStoreInfoListValue := filterStoreList[0]
storeID := jxStoreInfoListValue.ID
storeIDStr := utils.Int2Str(storeID)
storeName := jxStoreInfoListValue.Name
jxSkuInfoDataSingle := &dao.StoreSkuNamesInfo{}
jxSkuInfoDataMulti := &dao.StoreSkuNamesInfo{}
if jxStoreInfoListValue.StoreMaps != nil {
var multiFlag = false
var singleFlag = false
var filterJxSkuInfoMapSingle map[int]*dao.StoreSkuNameExt
var filterJxSkuInfoMapMulti map[int]*dao.StoreSkuNameExt
for _, vendorListValue := range jxStoreInfoListValue.StoreMaps {
vendorID := vendorListValue.VendorID
if partner.IsMultiStore(vendorID) {
if multiFlag == false {
jxSkuInfoDataMulti, _ = GetStoreSkus(ctx, storeID, filterJxDepotUnSaleSkuIds, true, "", true, false, map[string]interface{}{}, 0, -1)
/*重新计算价格*/
SetJxPrice(jxSkuInfoDataMulti, storeID)
filterJxSkuInfoMapMulti = GetFilterJxSkuInfoMap(jxSkuInfoDataMulti.SkuNames) //map[京西商品ID:StoreSkuNameExt]
multiFlag = true
}
} else {
if singleFlag == false {
jxSkuInfoDataSingle, _ = GetStoreSkus(ctx, storeID, nil, true, "", true, false, map[string]interface{}{}, 0, -1)
filterJxSkuInfoMapSingle = GetFilterJxSkuInfoMap(jxSkuInfoDataSingle.SkuNames) //map[京西商品ID:StoreSkuNameExt]
singleFlag = true
}
}
vendorStoreID := vendorListValue.VendorStoreID
baseapi.SugarLogger.Debugf("CheckSkuDiffBetweenJxAndVendor storeID:%d vendorID:%d vendorStoreID:%s vendorListValue:%v", storeID, vendorID, vendorStoreID, vendorListValue)
if partner.IsMultiStore(vendorID) {
singleStoreHandler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IPurchasePlatformStoreSkuHandler)
allSkuInfoList := GetMultiStoreAllSkuInfoList(vendorID, vendorListValue.VendorOrgCode)
skuBareInfoList, err := singleStoreHandler.GetStoreSkusBareInfo(ctx, vendorListValue.VendorOrgCode, nil, storeID, vendorStoreID, allSkuInfoList)
if err != nil {
baseapi.SugarLogger.Infof("CheckSkuDiffBetweenJxAndVendor GetStoreSkusBareInfo error:%v", err)
} else if len(skuBareInfoList) > 0 {
//获取京东的商品
filterSkuInfoMap := GetFilterMultiStoreSkuInfoMap(vendorID, vendorListValue.VendorOrgCode, skuBareInfoList) //map[京东商品ID:SkuNameInfo]
CompareJxAndVendor(vendorID, storeIDStr, vendorStoreID, storeName, filterJxSkuInfoMapMulti, filterSkuInfoMap)
}
} else {
singleStoreHandler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler)
vendorSkuInfoList, err := singleStoreHandler.GetStoreSkusFullInfo(ctx, nil, storeID, vendorStoreID, nil)
if err != nil {
baseapi.SugarLogger.Infof("CheckSkuDiffBetweenJxAndVendor GetStoreSkusFullInfo error:%v", err)
} else if len(vendorSkuInfoList) > 0 {
//获取京东的商品
filterVendorSkuInfoMap := GetFilterVendorSkuInfoMap(vendorSkuInfoList) //map[平台商品ID:SkuNameInfo]
CompareJxAndVendor(vendorID, storeIDStr, vendorStoreID, storeName, filterJxSkuInfoMapSingle, filterVendorSkuInfoMap)
}
}
}
}
}
}
/********************************第三步****************************/
c := func(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,
CaptionList: titleList,
}
sheetList = append(sheetList, excelConf)
if needStatistic {
statisticSheet := AddStatisticSheet(sheetName, value)
sheetList = append(sheetList, statisticSheet)
}
baseapi.SugarLogger.Debugf("WriteToExcel:append:%s count:%d", sheetName, len(value))
}
if len(sheetList) > 0 {
excelBin := excel.Obj2Excel(sheetList)
sheetList = nil
timeStr := utils.Int64ToStr(time.Now().Unix())
diffFullFileName := diffFileName[IsJXCS()] + timeStr + fileExt
if canWriteTolocal {
jxutils.WriteFile(diffFullFileName, excelBin)
}
baseapi.SugarLogger.Debugf("WriteToExcel:save %s success", diffFullFileName)
//上传
downloadURL, err := jxutils.UploadExportContent(excelBin, diffFullFileName)
if err != nil {
baseapi.SugarLogger.Errorf("WriteToExcel:upload %s failed error:%v", diffFullFileName, err)
} else {
baseapi.SugarLogger.Debugf("WriteToExcel:upload %s success, downloadURL: %s", diffFullFileName, downloadURL)
/*************发送钉钉消息**************/
ddmsg.SendUserMessage(dingdingapi.MsgTyeText, "", "异步任务完成", "京西平台对比数据上传成功Excel下载地址是 "+downloadURL)
}
} else {
baseapi.SugarLogger.Debug("WriteToExcel:No diff data!!!")
}
//}
endProcessTime := time.Now().Unix()
diff := endProcessTime - startProcessTime
baseapi.SugarLogger.Debugf("CheckSkuDiffBetweenJxAndVendor end time: %v", time.Now())
baseapi.SugarLogger.Debugf("CheckSkuDiffBetweenJxAndVendor cost time: %d sec", diff)
}
apiover := make(chan int, 1)
compover := make(chan int, 1)
over := false
/********************************第三步****************************/
/*异步任务*/
/************************************************************************************/
go func() {
defer func() {
if recover() != nil {
beego.Info("执行任务失败")
panic("API调用失败")
}
}()
a()
depotDiffData.InitData2()
CompareJxAndMultiVenderDepot(ctx, vendorMap)
apiover <- 0
}()
/*a等待a现成执行完*/
go func() {
for !over {
select {
case <-apiover:
/*第二步 为了获取 filterJxDepotUnSaleSkuIds*/
go func() {
defer func() {
if recover() != nil {
beego.Info("比较任务失败")
panic("比较任务失败")
}
}()
b()
compover <- 0 //比较任务完成
}()
/*第二步*/
case <-compover:
go func() {
defer func() {
if recover() != nil {
beego.Info("写入任务失败")
panic("写入任务失败")
}
}()
c(diffData.diffDataMap, depotDiffData.diffDataMap)
fmt.Println("任务执行完成")
over = true
}()
break
}
}
}()
/************************************************************************************/
}
//入口函数,校验本地商品京西和其他平台的差异
func CheckSkuDiffBetweenJxAndVendor(ctx *jxcontext.Context, vendorIDList []int, storeIDList []int) {
startProcessTime := time.Now().Unix()
@@ -719,6 +1002,7 @@ func WriteToExcel(task *tasksch.SeqTask, data map[int][]DiffData, depotData map[
jxutils.WriteFile(diffFullFileName, excelBin)
}
baseapi.SugarLogger.Debugf("WriteToExcel:save %s success", diffFullFileName)
//上传
downloadURL, err := jxutils.UploadExportContent(excelBin, diffFullFileName)
if err != nil {
baseapi.SugarLogger.Errorf("WriteToExcel:upload %s failed error:%v", diffFullFileName, err)
@@ -731,3 +1015,20 @@ func WriteToExcel(task *tasksch.SeqTask, data map[int][]DiffData, depotData map[
baseapi.SugarLogger.Debug("WriteToExcel:No diff data!!!")
}
}
func SetJxPrice(jxSkuInfoDataMulti *dao.StoreSkuNamesInfo, storeId int) (err error) {
db := dao.GetDB()
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), storeId, model.VendorIDJX)
if err != nil {
dao.Rollback(db)
return err
}
/*重新计算京西价格*/
for _, values := range jxSkuInfoDataMulti.SkuNames {
for _, value := range values.Skus {
value.JxPrice = jxutils.CaculatePriceByPricePack(storeDetail.PricePercentagePackObj, int(storeDetail.PricePercentage), value.JxPrice)
}
}
/*重新计算京西价格*/
return nil
}

View File

@@ -1,13 +0,0 @@
package cms
import (
"testing"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
)
func TestCheckSkuDiffBetweenJxAndVendor(t *testing.T) {
vendorIDList := []int{}
storeIDList := []int{}
CheckSkuDiffBetweenJxAndVendor(jxcontext.AdminCtx, vendorIDList, storeIDList)
}

View File

@@ -3,12 +3,11 @@ package excel
import (
"bytes"
"fmt"
"io"
"reflect"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/globals"
"github.com/360EntSecGroup-Skylar/excelize"
"io"
"reflect"
)
type Obj2ExcelSheetConfig struct {
@@ -20,7 +19,8 @@ type Obj2ExcelSheetConfig struct {
func Obj2Excel(sheetList []*Obj2ExcelSheetConfig) []byte {
globals.SugarLogger.Debug("Obj2Excel")
excelFile := excelize.NewFile()
for sheetIndex, sheetConfig := range sheetList {
//for sheetIndex, sheetConfig := range sheetList {
for _, sheetConfig := range sheetList {
obj := sheetConfig.Data
typeInfo := reflect.TypeOf(obj)
@@ -39,12 +39,14 @@ func Obj2Excel(sheetList []*Obj2ExcelSheetConfig) []byte {
}
valueInfo := reflect.Indirect(reflect.ValueOf(obj))
if sheetIndex == 0 {
sheetName := excelFile.GetSheetName(1)
excelFile.SetSheetName(sheetName, sheetConfig.Title)
} else {
excelFile.NewSheet(sheetConfig.Title)
}
/*因爲默認是Sheet1所以直接賦值就叫sheet1然後再改名字就行了不然會默認多一頁空白頁為sheet1*/
//if sheetIndex == 0 {
index := excelFile.NewSheet("Sheet1")
// sheetName := excelFile.GetSheetName(1)
excelFile.SetSheetName("Sheet1", sheetConfig.Title)
//} else {
// excelFile.NewSheet(sheetConfig.Title)
//}
isMemberStruct := typeInfo.Kind() == reflect.Struct
colWithList := make([]float64, len(sheetConfig.CaptionList))
if isMemberStruct {
@@ -63,9 +65,9 @@ func Obj2Excel(sheetList []*Obj2ExcelSheetConfig) []byte {
for i := 0; i < valueInfo.Len(); i++ {
for col, index := range indexSlice {
str := fmt.Sprint(reflect.Indirect(valueInfo.Index(i)).FieldByIndex(index).Interface())
// if colWith := float64(len(str)); colWith > colWithList[col] {
// colWithList[col] = colWith
// }
//// if colWith := float64(len(str)); colWith > colWithList[col] {
//// colWithList[col] = colWith
//// }
excelFile.SetCellStr(sheetConfig.Title, genAxis(i+1, col), str)
}
}
@@ -104,6 +106,7 @@ func Obj2Excel(sheetList []*Obj2ExcelSheetConfig) []byte {
// colName, _ := excelize.ColumnNumberToName(col + 1)
// excelFile.SetColWidth(sheetConfig.Title, colName, colName, colWithList[col])
// }
excelFile.SetActiveSheet(index)
}
buf := &bytes.Buffer{}
excelFile.Write(buf)

View File

@@ -80,6 +80,7 @@ func NewParallelTask2(taskName string, config *ParallelConfig, ctx *jxcontext.Co
if config.ParallelCount > MaxParallelCount {
config.ParallelCount = MaxParallelCount
}
//??
realItemList := utils.Interface2Slice(itemList)
jobList := jxutils.SplitSlice(realItemList, config.BatchSize)
jobListLen := len(jobList)

View File

@@ -92,6 +92,9 @@ var (
SkuStatusDeleted: "删除",
SkuStatusDontSale: "下架",
SkuStatusNormal: "上架",
2: "删除",
3: "不可售",
4: "可售",
}
)

View File

@@ -292,6 +292,25 @@ func (c *TempOpController) CheckSkuDiffBetweenJxAndVendor() {
})
}
// @Title 京西平台和其他平台商品的对比Test
// @Description 对比Test
// @Param token header string true "认证token"
// @Param vendorIDs formData string false "运营商ID列表(京东0 美团1 饿百3)"
// @Param storeIDs formData string false "京西门店ID列表"
// @Success 200 {object} controllers.CallResult
// @Failure 404 User not found
// @router /StaticBlock [post]
func (c *TempOpController) StaticBlock() {
c.callCheckSkuDiffBetweenJxAndVendor(func(params *tTempopCheckSkuDiffBetweenJxAndVendorParams) (retVal interface{}, errCode string, err error) {
var vendorIDList []int
var storeIDList []int
if err = jxutils.Strings2Objs(params.VendorIDs, &vendorIDList, params.StoreIDs, &storeIDList); err == nil {
cms.TestDiff(params.Ctx, vendorIDList, storeIDList)
}
return retVal, "", err
})
}
// @Title 通过订单创建消费者用户
// @Description 通过订单创建消费者用户
// @Param token header string true "认证token"

View File

@@ -2520,6 +2520,15 @@ func init() {
Filters: nil,
Params: nil})
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TempOpController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TempOpController"],
beego.ControllerComments{
Method: "StaticBlock",
Router: `/StaticBlock`,
AllowHTTPMethods: []string{"post"},
MethodParams: param.Make(),
Filters: nil,
Params: nil})
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TempOpController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TempOpController"],
beego.ControllerComments{
Method: "TestIt",