From 8eef3288db5f7acd0fd415cab63b54ac215e4708 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=B0=B9=E5=B2=9A?= <770236076@qq.com> Date: Tue, 26 Nov 2019 09:36:46 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E5=BE=AE=E7=9B=9F=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/yonghui/yonghui.go | 293 ++++++++++++++++++++++---- controllers/yonghui.go | 30 +++ routers/commentsRouter_controllers.go | 27 +++ 3 files changed, 309 insertions(+), 41 deletions(-) diff --git a/business/jxstore/yonghui/yonghui.go b/business/jxstore/yonghui/yonghui.go index 803460015..1fea6c740 100644 --- a/business/jxstore/yonghui/yonghui.go +++ b/business/jxstore/yonghui/yonghui.go @@ -15,12 +15,16 @@ import ( "git.rosy.net.cn/baseapi/utils" "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/weimobapi" + "git.rosy.net.cn/jx-callback/business/jxstore/cms" "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/excel" "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" "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/globals" @@ -63,12 +67,24 @@ type DataFailed struct { Comment string `json:"备注"` } +type Data struct { + GoodsID string `json:"商品编码"` + GoodsName string `json:"商品名称"` + GoodsNum int `json:"订货数量"` +} + type ExcelParam struct { SpuCode string Name string Price float64 } +type OrderList struct { + Name string `json:"name"` + Phone string `json:"phone"` + OrderNo int64 `json:"orderNo"` +} + var ( sheetMap = map[string]*SheetParam{ "蔬菜": &SheetParam{ @@ -142,6 +158,11 @@ var ( "商品名称", "备注", } + titleList = []string{ + "商品编码", + "商品名称", + "订货数量", + } dataSuccess DataSuccessLock dataFailed DataFailedLock ) @@ -711,46 +732,236 @@ func UploadExeclAndPushMsg(sheetList []*excel.Obj2ExcelSheetConfig, name string) } func UpdateJxPriceByWeimob(ctx *jxcontext.Context, storeIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) { - //获取微盟所有商品 - // param := &weimobapi.QueryGoodsListParam{ - // GoodsStatus: 0, - // PageNum: 1, - // PageSize: jdapi.MaxSkuIDsCount4QueryListBySkuIds, - // } - // goodsList, err := GetWeiMobGoodsList(param) - // if err != nil { - // baseapi.SugarLogger.Errorf("GetWeiMobGoodsList error:%v", err) - // } - // 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) { - // v := batchItemList[0].(*weimobapi.GoodsInfo) - // goodsDetail, err := api.WeimobAPI.QueryGoodsDetail(v.GoodsID) - // if err != nil { - // baseapi.SugarLogger.Errorf("QueryGoodsDetail error:%v", err) - // } - // storeSkuBindInfo := &cms.StoreSkuBindInfo{ - // NameID: goodsDetail.SkuMap.SingleSku.OuterSkuCode, - // UnitPrice: goodsDetail.SkuMap.SingleSku.CostPrice, - // } - // retVal = - // return retVal, err - // } - // taskParallel := tasksch.NewParallelTask("获取微盟商品", tasksch.NewParallelConfig().SetParallelCount(parallelCount), ctx, taskFunc, goodsList) - // tasksch.HandleTask(taskParallel, task, true).Run() - // _, err = taskParallel.GetResult(0) - // case 1: - // cms.UpdateStoresSkus(ctx, storeIDs, skuBindInfos, isAsync, isContinueWhenError) - // } - // } - // 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() - // } + var ( + storeSkuBindInfoList []interface{} + skuBindInfos []*cms.StoreSkuBindInfo + ) + //获取微盟所有上架商品 + queryParameter := &weimobapi.QueryGoodsListRequestVo{ + GoodsStatus: weimobapi.GoodsTypeNormal, + } + param := &weimobapi.QueryGoodsListParam{ + PageNum: 1, + PageSize: jdapi.MaxSkuIDsCount4QueryListBySkuIds, + QueryParameter: queryParameter, + } + goodsList, err := GetWeiMobGoodsList(param) + if err != nil { + baseapi.SugarLogger.Errorf("GetWeiMobGoodsList error:%v", err) + } + 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) { + v := batchItemList[0].(*weimobapi.GoodsInfo) + goodsDetail, err := api.WeimobAPI.QueryGoodsDetail(v.GoodsID) + if err != nil { + baseapi.SugarLogger.Errorf("QueryGoodsDetail error:%v", err) + } + if goodsDetail.OuterGoodsCode != "" && goodsDetail.IsPutAway == weimobapi.GoodsTypeNormal { + nameID := int(utils.Str2Int64(goodsDetail.SkuMap.SingleSku.OuterSkuCode)) + unitPrice := int(utils.Float64TwoInt64(goodsDetail.SkuMap.SingleSku.CostPrice * 100)) + storeSkuBindInfo := &cms.StoreSkuBindInfo{ + NameID: nameID, + UnitPrice: unitPrice, + } + retVal = []*cms.StoreSkuBindInfo{storeSkuBindInfo} + } + return retVal, err + } + taskParallel := tasksch.NewParallelTask("获取微盟商品", tasksch.NewParallelConfig().SetParallelCount(parallelCount), ctx, taskFunc, goodsList) + tasksch.HandleTask(taskParallel, task, true).Run() + storeSkuBindInfoList, err = taskParallel.GetResult(0) + case 1: + for _, v := range storeSkuBindInfoList { + skuBindInfos = append(skuBindInfos, v.(*cms.StoreSkuBindInfo)) + } + cms.UpdateStoresSkus(ctx, storeIDs, skuBindInfos, isAsync, isContinueWhenError) + } + 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 GetWeimobOrders(ctx *jxcontext.Context, fromTime, toTime string, params map[string]interface{}) (result []*OrderList, err error) { + if fromTime != "" && toTime != "" { + fromTimeParam := utils.Str2Time(fromTime).UnixNano() / 1e6 + toTimeParam := utils.Str2Time(toTime).UnixNano() / 1e6 + if params["keyword"] != nil { + if jxutils.GetPossibleVendorIDFromVendorOrderID(params["keyword"].(string)) > model.VendorIDUnknown { + resultList, err := GetSingleOrderResultList(params) + result = append(result, resultList...) + return result, err + } else { + orderList, err := GetWeimobOrdersList(fromTimeParam, toTimeParam, params["keyword"].(string)) + return orderList, err + } + } else { + orderList, err := GetWeimobOrdersList(fromTimeParam, toTimeParam, "") + return orderList, err + } + } + if fromTime == "" && toTime == "" && params["keyword"] != nil { + if jxutils.GetPossibleVendorIDFromVendorOrderID(params["keyword"].(string)) > model.VendorIDUnknown { + resultList, err := GetSingleOrderResultList(params) + result = append(result, resultList...) + return result, err + } else { + orderList, err := GetWeimobOrdersList(0, 0, params["keyword"].(string)) + return orderList, err + } + } + return result, err +} + +func GetWeimobOrdersList(fromTimeParam, toTimeParam int64, keyword string) (aList []*OrderList, err error) { + var queryParameter *weimobapi.MerchantOrderListQueryParameter + if fromTimeParam == 0 && toTimeParam == 0 { + queryParameter = &weimobapi.MerchantOrderListQueryParameter{ + CreateStartTime: time.Now().AddDate(0, -2, 0).UnixNano() / 1e6, + CreateEndTime: time.Now().UnixNano() / 1e6, + } + } else { + queryParameter = &weimobapi.MerchantOrderListQueryParameter{ + CreateStartTime: fromTimeParam, + CreateEndTime: toTimeParam, + } + } + param := &weimobapi.QueryOrdersListParam{ + PageNum: 1, + PageSize: weimobapi.QueryOrdersListPageSize, + QueryParameter: queryParameter, + } + for { + orderList, _, err2 := api.WeimobAPI.QueryOrdersList(param) + err = err2 + if len(orderList) > 0 { + if keyword != "" { + for _, v := range orderList { + if ContainsKeyword(v, keyword) { + var aOrder = &OrderList{ + Name: v.ReceiverName, + OrderNo: v.OrderNo, + Phone: v.ReceiverMobile, + } + aList = append(aList, aOrder) + } + } + } else { + for _, v := range orderList { + var aOrder = &OrderList{ + Name: v.ReceiverName, + OrderNo: v.OrderNo, + Phone: v.ReceiverMobile, + } + aList = append(aList, aOrder) + } + } + } + if len(orderList) < param.PageSize { + break + } + param.PageNum++ + } + return aList, err +} + +func GetWeimobOrderDetail(orderNo int64) (order *weimobapi.OrderDetail, err error) { + return api.WeimobAPI.QueryOrderDetail2(orderNo, false) +} + +func GetSingleOrderResultList(params map[string]interface{}) (result []*OrderList, err error) { + weimobOrderID := params["keyword"].(string) + orderSingle, err := GetWeimobOrderDetail(utils.Str2Int64(weimobOrderID)) + orderList := &OrderList{ + Name: orderSingle.DeliveryDetail.LogisticsDeliveryDetail.ReceiverName, + Phone: orderSingle.DeliveryDetail.LogisticsDeliveryDetail.ReceiverMobile, + OrderNo: orderSingle.OrderNo, + } + result = append(result, orderList) + return result, err +} + +func ContainsKeyword(v *weimobapi.OrderInfo, keyword string) bool { + return strings.Contains(v.ReceiverName, keyword) || strings.Contains(utils.Int64ToStr(v.OrderNo), keyword) || strings.Contains(v.ReceiverMobile, keyword) +} + +func GetWeimobOrdersExcel(ctx *jxcontext.Context, OrderNo string) (err error) { + var ( + DataFineList []*Data //精品 + DataHairyList []*Data //毛菜 + ) + orderSingle, err := GetWeimobOrderDetail(utils.Str2Int64(OrderNo)) + itemList := orderSingle.ItemList + for _, v := range itemList { + if v.GoodsCode[0:1] == "0" { + DataHairy := &Data{ + GoodsID: v.GoodsCode, + GoodsName: v.GoodsTitle, + GoodsNum: v.SkuNum, + } + DataHairyList = append(DataHairyList, DataHairy) + } else { + DataFine := &Data{ + GoodsID: v.GoodsCode, + GoodsName: v.GoodsTitle, + GoodsNum: v.SkuNum, + } + DataFineList = append(DataFineList, DataFine) + } + } + WriteToExcel2(ctx, DataFineList, DataHairyList) + return err +} + +func WriteToExcel2(ctx *jxcontext.Context, DataFineList, DataHairyList []*Data) (err error) { + var ( + sheetList1 []*excel.Obj2ExcelSheetConfig + sheetList2 []*excel.Obj2ExcelSheetConfig + downloadURL1, downloadURL2 string + fileName1, fileName2 string + noticeMsg string + ) + excelConf1 := &excel.Obj2ExcelSheetConfig{ + Title: "sheet1", + Data: DataFineList, + CaptionList: titleList, + } + sheetList1 = append(sheetList1, excelConf1) + excelConf2 := &excel.Obj2ExcelSheetConfig{ + Title: "sheet1", + Data: DataHairyList, + CaptionList: titleList, + } + sheetList2 = append(sheetList2, excelConf2) + noticeMsg += "[详情点我]" + if len(DataFineList) > 0 { + downloadURL1, fileName1, err = UploadExeclAndPushMsg(sheetList1, "京西采购_精品") + noticeMsg += "path1=" + downloadURL1 + " " + } else { + baseapi.SugarLogger.Debug("WriteToExcel: DataFineList is nil!") + } + if len(DataHairyList) > 0 { + downloadURL2, fileName2, err = UploadExeclAndPushMsg(sheetList2, "京西采购_毛菜") + noticeMsg += "path2=" + downloadURL2 + } else { + baseapi.SugarLogger.Debug("WriteToExcel: DataHairyList is nil!") + } + if err != nil { + baseapi.SugarLogger.Errorf("WriteToExcel:upload %s , %s failed error:%v", fileName1, fileName2, err) + } else { + if authInfo, err := ctx.GetV2AuthInfo(); err == nil { + ddmsg.SendUserMessage(dingdingapi.MsgTyeText, authInfo.UserID, "导出微盟订单商品成功", noticeMsg) + baseapi.SugarLogger.Debugf("WriteToExcel:upload %s ,%s success, downloadURL1:%s ,downloadURL2:%s", fileName1, fileName2, downloadURL1, downloadURL2) + } + } + return err +} diff --git a/controllers/yonghui.go b/controllers/yonghui.go index 64e43583f..31dc0ce62 100644 --- a/controllers/yonghui.go +++ b/controllers/yonghui.go @@ -62,3 +62,33 @@ func (c *YongHuiController) UpdateJxPriceByWeimob() { return retVal, "", err }) } + +// @Title 查询微盟订单 +// @Description 查询微盟订单 +// @Param token header string true "认证token" +// @Param keyword query string false "查询关键字" +// @Param fromTime formData string false "订单起始时间 (yyyy-mm-dd 00:00:00)" +// @Param toTime formData string false "订单结束时间 (yyyy-mm-dd 00:00:00)" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /GetWeimobOrders [post] +func (c *YongHuiController) GetWeimobOrders() { + c.callGetWeimobOrders(func(params *tYonghuiGetWeimobOrdersParams) (retVal interface{}, errCode string, err error) { + retVal, err = yonghui.GetWeimobOrders(params.Ctx, params.FromTime, params.ToTime, params.MapData) + return retVal, "", err + }) +} + +// @Title 根据微盟订单号生成Excel +// @Description 根据微盟订单号生成Excel +// @Param token header string true "认证token" +// @Param orderNo formData string true "订单号" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /GetWeimobOrdersExcel [post] +func (c *YongHuiController) GetWeimobOrdersExcel() { + c.callGetWeimobOrdersExcel(func(params *tYonghuiGetWeimobOrdersExcelParams) (retVal interface{}, errCode string, err error) { + err = yonghui.GetWeimobOrdersExcel(params.Ctx, params.OrderNo) + return retVal, "", err + }) +} diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index 175ed53e9..a36fc41ca 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -2016,6 +2016,24 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:YongHuiController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:YongHuiController"], + beego.ControllerComments{ + Method: "GetWeimobOrders", + Router: `/GetWeimobOrders`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:YongHuiController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:YongHuiController"], + beego.ControllerComments{ + Method: "GetWeimobOrdersExcel", + Router: `/GetWeimobOrdersExcel`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:YongHuiController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:YongHuiController"], beego.ControllerComments{ Method: "LoadExcelByYongHui", @@ -2025,4 +2043,13 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:YongHuiController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:YongHuiController"], + beego.ControllerComments{ + Method: "UpdateJxPriceByWeimob", + Router: `/UpdateJxPriceByWeimob`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + }