Accept Merge Request #42: (yonghui -> mark)

Merge Request: 查找京东用户
Created By: @苏尹岚
Accepted By: @苏尹岚
URL: https://rosydev.coding.net/p/jx-callback/d/jx-callback/git/merge/42
This commit is contained in:
苏尹岚
2019-11-28 14:26:10 +08:00
5 changed files with 286 additions and 7 deletions

View File

@@ -2,26 +2,35 @@ package tempop
import (
"bytes"
"errors"
"fmt"
"image"
"image/jpeg"
"image/png"
"io"
"mime/multipart"
"net/http"
"regexp"
"strings"
"sync"
"time"
"git.rosy.net.cn/jx-callback/business/jxutils/excel"
"git.rosy.net.cn/baseapi"
"git.rosy.net.cn/jx-callback/business/auth2/authprovider/weixin"
"git.rosy.net.cn/jx-callback/business/partner/delivery"
"github.com/360EntSecGroup-Skylar/excelize"
"git.rosy.net.cn/baseapi/platformapi/dingdingapi"
"git.rosy.net.cn/baseapi/platformapi/jdapi"
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/baseapi/utils/errlist"
"git.rosy.net.cn/jx-callback/business/jxstore/cms"
"git.rosy.net.cn/jx-callback/business/jxstore/yonghui"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/jxutils/ddmsg"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
"git.rosy.net.cn/jx-callback/business/model"
@@ -34,7 +43,24 @@ import (
"git.rosy.net.cn/jx-callback/globals/api"
)
var innerDataPat *regexp.Regexp
var (
innerDataPat *regexp.Regexp
jdUsersStruct GetJdUsersStruct
titleList = []string{
"用户名",
"关联门店",
}
)
type GetJdUsersStruct struct {
locker sync.RWMutex
userMap []JdUserStruct
}
type JdUserStruct struct {
UserName string `json:"用户名"`
StoreIDs string `json:"关联门店"`
}
func init() {
innerDataPat = regexp.MustCompile(`"result":(.*),"code":200`)
@@ -1359,3 +1385,172 @@ func JdStoreInfo1125() (hint string, err error) {
}
return hint, err
}
func JdStoreInfoCoordinateRecover(ctx *jxcontext.Context, files []*multipart.FileHeader) (err error) {
if len(files) == 0 {
return errors.New("没有文件上传!")
}
fileHeader := files[0]
file1, err := fileHeader.Open()
defer file1.Close()
db := dao.GetDB()
storeList, err := dao.GetStoresMapList(db, []int{model.VendorIDJD}, nil, model.StoreStatusAll, model.StoreIsSyncYes, "")
if err == nil {
var validStoreList []*dao.StoreDetail
for _, v := range storeList {
if v.Status != model.StoreStatusDisabled && v.CreatedAt.Sub(utils.Str2Time("2019-10-01")) > 0 {
storeInfo, err := api.JdAPI.GetStoreInfoByStationNo2(v.VendorStoreID)
if err == nil && storeInfo.CreateTime.GoTime().Sub(utils.Str2Time("2019-10-25")) > 0 {
if storeDetail, err := dao.GetStoreDetail(db, v.StoreID, v.VendorID); err == nil {
validStoreList = append(validStoreList, storeDetail)
}
}
}
}
getStoreList := func(lng, lat, lng2, lat2 int) (vendorStoreIDs []string) {
for _, v := range validStoreList {
if v.Lng >= lng && v.Lng <= lng2 && v.Lat >= lat && v.Lat <= lat2 {
vendorStoreIDs = append(vendorStoreIDs, v.VendorStoreID)
}
}
return vendorStoreIDs
}
sheetName := "老格明细"
file, err2 := excelize.OpenReader(file1)
if err = err2; err == nil {
rows, err2 := file.GetRows(sheetName)
if err = err2; err == nil {
str2Coords := func(str string) (lng, lat int) {
list := strings.Split(str, ",")
if len(list) >= 2 {
lng, lat = jxutils.StandardCoordinate2Int(utils.Str2Float64WithDefault(list[1], 0)), jxutils.StandardCoordinate2Int(utils.Str2Float64WithDefault(list[0], 0))
}
return lng, lat
}
for i := 1; i < len(rows); i++ {
lng, lat := str2Coords(rows[i][8])
lng2, lat2 := str2Coords(rows[i][7])
vendorStoreIDs := getStoreList(lng, lat, lng2, lat2)
countInfo := fmt.Sprintf("京西已拓%d", len(vendorStoreIDs))
axis, _ := excelize.CoordinatesToCellName(5, i+1)
file.SetCellStr(sheetName, axis, countInfo)
axis2, _ := excelize.CoordinatesToCellName(6, i+1)
file.SetCellStr(sheetName, axis2, strings.Join(vendorStoreIDs, ","))
}
filename := ExecuteFileName(fileHeader.Filename)
buf := bytes.NewBuffer(nil)
if _, err = io.Copy(buf, file1); err != nil {
return err
}
baseapi.SugarLogger.Debugf("WriteToExcel:save %s success", filename)
downloadURL, err := jxutils.UploadExportContent(buf.Bytes(), filename)
if err != nil {
baseapi.SugarLogger.Errorf("WriteToExcel:upload %s, failed error:%v", filename, err)
} else {
if authInfo, err := ctx.GetV2AuthInfo(); err == nil {
noticeMsg := fmt.Sprintf("path=%s\n", downloadURL)
ddmsg.SendUserMessage(dingdingapi.MsgTyeText, authInfo.UserID, "导出老格恢复拓店进度成功", noticeMsg)
}
baseapi.SugarLogger.Debugf("WriteToExcel:upload %s success, downloadURL:%s", filename, downloadURL)
}
}
}
}
return err
}
func ExecuteFileName(filename string) (name string) {
filePrefix := filename[strings.LastIndex(filename, "."):len(filename)]
fileRealName := filename[0:strings.LastIndex(filename, ".")]
name = fileRealName + utils.Int64ToStr(time.Now().Unix()) + filePrefix
return name
}
func GetJdUsers(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) (hint string, err error) {
var (
jxVendorIDsMap = make(map[string]string)
)
//获取京东有效的店
db := dao.GetDB()
storeMapList, err := dao.GetStoreMapsListWithoutDisabled(db, []int{model.VendorIDJD}, model.StoreStatusDisabled)
for _, v := range storeMapList {
jxVendorIDsMap[v.VendorStoreID] = v.VendorStoreID
}
//获取京东商城所有用户
storeUserList, err := api.JdAPI.PrivilegeSearchUserAll()
taskSeqFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
switch step {
case 0:
taskFunc := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
vv := batchItemList[0].(*jdapi.StoreUserInfo)
vendorStoreIDs, err := api.JdAPI.GetJdUserBindStoreIDs(vv.ID)
var vendorStoreIDsMap = make(map[string]string, len(vendorStoreIDs))
var vendorStoreIDsResult []string
for _, v := range vendorStoreIDs {
if jxVendorIDsMap[v] == "" {
continue
}
vendorStoreIDsMap[v] = v
}
if len(vendorStoreIDsMap) == 0 {
jdStruct := JdUserStruct{vv.LoginName, ""}
jdUsersStruct.AppendData(jdStruct)
} else {
for _, m := range vendorStoreIDsMap {
vendorStoreIDsResult = append(vendorStoreIDsResult, m)
}
jdStruct := JdUserStruct{vv.LoginName, strings.Join(vendorStoreIDsResult, ",")}
jdUsersStruct.AppendData(jdStruct)
}
return retVal, err
}
taskParallel := tasksch.NewParallelTask("获取京东商城用户列表", tasksch.NewParallelConfig(), ctx, taskFunc, storeUserList)
tasksch.HandleTask(taskParallel, task, true).Run()
_, err = taskParallel.GetResult(0)
case 1:
//写excel
WriteToExcel(task, jdUsersStruct.userMap)
}
return result, err
}
taskSeq := tasksch.NewSeqTask2("获取京东商城用户列表-序列任务", ctx, isContinueWhenError, taskSeqFunc, 2)
tasksch.HandleTask(taskSeq, nil, true).Run()
if !isAsync {
_, err = taskSeq.GetResult(0)
hint = "1"
} else {
hint = taskSeq.GetID()
}
return hint, err
}
func (d *GetJdUsersStruct) AppendData(jd JdUserStruct) {
d.locker.RLock()
defer d.locker.RUnlock()
d.userMap = append(d.userMap, jd)
}
func WriteToExcel(task *tasksch.SeqTask, jd []JdUserStruct) (err error) {
var sheetList []*excel.Obj2ExcelSheetConfig
var downloadURL, fileName string
excelConf := &excel.Obj2ExcelSheetConfig{
Title: "京东用户列表",
Data: jd,
CaptionList: titleList,
}
sheetList = append(sheetList, excelConf)
if excelConf != nil {
downloadURL, fileName, err = yonghui.UploadExeclAndPushMsg(sheetList, "京东用户列表")
} else {
baseapi.SugarLogger.Debug("WriteToExcel: JdUserStruct is nil!")
}
if err != nil {
baseapi.SugarLogger.Errorf("WriteToExcel:upload %s,failed error:%v", fileName, err)
} else {
noticeMsg := fmt.Sprintf("[详情点我]path=%s, \n", downloadURL)
task.SetNoticeMsg(noticeMsg)
baseapi.SugarLogger.Debugf("WriteToExcel:upload %s, success, downloadURL:%s", fileName, downloadURL)
}
return err
}

View File

@@ -539,7 +539,7 @@ func updateWeiMobGoods(costPrice, salePrice float64, unit string, isCompare bool
} else {
outPutData := DataSuccess{
NameID: goodsDetail.OuterGoodsCode,
Name: goodsDetail.Title,
Name: newSkuTitle,
Unit: unit,
OrgPrice: goodsDetail.SkuMap.SingleSku.SalePrice,
NowPrice: salePrice,
@@ -771,6 +771,7 @@ func UpdateJxPriceByWeimob(ctx *jxcontext.Context, storeIDs []int, isAsync, isCo
var (
storeSkuBindInfoList []interface{}
skuBindInfos []*cms.StoreSkuBindInfo
nameID int
)
db := dao.GetDB()
dataFailed.dataFailedList = dataFailed.dataFailedList[0:0]
@@ -793,9 +794,19 @@ func UpdateJxPriceByWeimob(ctx *jxcontext.Context, storeIDs []int, isAsync, isCo
if err != nil {
baseapi.SugarLogger.Errorf("QueryGoodsDetail error:%v", err)
}
nameID := int(utils.Str2Int64(goodsDetail.SkuMap.SingleSku.OuterSkuCode))
unitPrice := int(utils.Float64TwoInt64(goodsDetail.SkuMap.SingleSku.CostPrice * 100))
goodsID := goodsDetail.OuterGoodsCode
unitPrice := int(utils.Float64TwoInt64(goodsDetail.SkuMap.SingleSku.CostPrice * 100))
if goodsDetail.SkuMap.SingleSku.OuterSkuCode != "" {
nameID = int(utils.Str2Int64(goodsDetail.SkuMap.SingleSku.OuterSkuCode))
} else {
outPutData := DataFailed{
GoodsID: goodsID,
GoodsName: goodsDetail.Title,
Comment: "微盟上没有该商品的商品编码",
}
dataFailed.AppendData2(outPutData)
nameID = -1
}
skuList, err := dao.GetStoreSkusByNameIDs(db, storeIDs, nameID)
if len(skuList) > 0 {
if goodsDetail.OuterGoodsCode != "" {
@@ -1023,17 +1034,23 @@ func GetWeimobOrdersExcel(ctx *jxcontext.Context, OrderNo string) (result *Weimo
itemList := orderSingle.ItemList
for _, v := range itemList {
if v.GoodsCode != "" {
var goodsTile string
if v.GoodsTitle[0:1] == "(" {
goodsTile = v.GoodsTitle[strings.Index(v.GoodsTitle, ")")+1 : len(v.GoodsTitle)]
} else {
goodsTile = v.GoodsTitle
}
if v.GoodsCode[0:1] == "0" {
DataHairy := &Data{
GoodsID: v.GoodsCode,
GoodsName: v.GoodsTitle,
GoodsID: v.GoodsCode[1:len(v.GoodsCode)],
GoodsName: goodsTile,
GoodsNum: v.SkuNum,
}
DataHairyList = append(DataHairyList, DataHairy)
} else {
DataFine := &Data{
GoodsID: v.GoodsCode,
GoodsName: v.GoodsTitle,
GoodsName: goodsTile,
GoodsNum: v.SkuNum,
}
DataFineList = append(DataFineList, DataFine)

View File

@@ -441,3 +441,22 @@ func FreightDeductionPack2Obj(packStr string) (obj *model.FreightDeductionPack)
}
return obj
}
func GetStoreMapsListWithoutDisabled(db *DaoDB, vendorIDs []int, status int) (storeMapList []*model.StoreMap, err error) {
sql := `
SELECT *
FROM store_map
WHERE 1=1
`
sqlParams := []interface{}{}
if len(vendorIDs) > 0 {
sql += " AND vendor_id in (" + GenQuestionMarks(len(vendorIDs)) + ")"
sqlParams = append(sqlParams, vendorIDs)
}
if status != model.StoreStatusAll {
sql += " AND status != ?"
sqlParams = append(sqlParams, status)
}
err = GetRows(db, &storeMapList, sql, sqlParams...)
return storeMapList, err
}

View File

@@ -352,3 +352,33 @@ func (c *TempOpController) FixMtwmCategory() {
return retVal, "", err
})
}
// @Title 老格恢复拓店进度
// @Description 老格恢复拓店进度
// @Param token header string true "认证token"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /JdStoreInfoCoordinateRecover [post]
func (c *TempOpController) JdStoreInfoCoordinateRecover() {
c.callJdStoreInfoCoordinateRecover(func(params *tTempopJdStoreInfoCoordinateRecoverParams) (retVal interface{}, errCode string, err error) {
r := c.Ctx.Request
files := r.MultipartForm.File["userfiles"]
err = tempop.JdStoreInfoCoordinateRecover(params.Ctx, files)
return retVal, "", err
})
}
// @Title 查找京东用户
// @Description 查找京东用户
// @Param token header string true "认证token"
// @Param isAsync formData bool false "是否异步操作"
// @Param isContinueWhenError formData bool false "单个同步失败是否继续缺省false"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /GetJdUsers [post]
func (c *TempOpController) GetJdUsers() {
c.callGetJdUsers(func(params *tTempopGetJdUsersParams) (retVal interface{}, errCode string, err error) {
retVal, err = tempop.GetJdUsers(params.Ctx, params.IsAsync, params.IsContinueWhenError)
return retVal, "", err
})
}

View File

@@ -1809,6 +1809,24 @@ 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: "GetJdUsers",
Router: `/GetJdUsers`,
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: "JdStoreInfoCoordinateRecover",
Router: `/JdStoreInfoCoordinateRecover`,
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: "PrintMsg",