diff --git a/business/auth2/auth2.go b/business/auth2/auth2.go index 1afde6854..f653406be 100644 --- a/business/auth2/auth2.go +++ b/business/auth2/auth2.go @@ -243,7 +243,7 @@ func LoginInternal(ctx *Context, authType, authID, authIDType, authSecret string realAuthID = user.GetID() } if authBindEx, err = handler.VerifySecret(realAuthID, authSecret); err == nil { - // globals.SugarLogger.Debugf("auth2 Login authBindEx:%s", utils.Format4Output(authBindEx, false)) + globals.SugarLogger.Debugf("testttttttttttttttttttttttttttttttttttt", utils.Format4Output(authBindEx, false)) if authBindEx == nil { // mobile, email会返回nil(表示不会新建AuthBind实体) user = userProvider.GetUser(authID, authIDType) authBindEx = &AuthBindEx{ diff --git a/business/jxcallback/orderman/order.go b/business/jxcallback/orderman/order.go index e3d5a191b..1db00161e 100644 --- a/business/jxcallback/orderman/order.go +++ b/business/jxcallback/orderman/order.go @@ -1212,7 +1212,7 @@ func result2Orders(ctx *jxcontext.Context, result *jdshopapi.AllOrdersResult) (o continue } //有可能是库里已经有这个订单了 - orderE, err := partner.CurOrderManager.LoadOrder(utils.Int64ToStr(jdsOrder.OrderID)+"01", model.VendorIDJDShop) + orderE, err := partner.CurOrderManager.LoadOrder(utils.Int64ToStr(jdsOrder.OrderID)+"000001", model.VendorIDJDShop) if orderE != nil { continue } @@ -1500,8 +1500,8 @@ func TransferJdsOrder(ctx *jxcontext.Context, vendorOrderID string, storeID int) if order.Status >= model.OrderStatusDelivering && order.Status != model.OrderStatusCanceled { return "", fmt.Errorf("暂不支持此状态的订单进行转移!") } - if order.VendorID != model.VendorIDJDShop { - return "", fmt.Errorf("暂不支持非京狗的订单进行转移!") + if order.VendorID != model.VendorIDJDShop && order.VendorID != model.VendorIDJX { + return "", fmt.Errorf("暂不支持该平台的订单进行转移!") } skus, err := dao.GetSimpleOrderSkus(db, vendorOrderID, nil) if err != nil || order == nil { @@ -1519,26 +1519,20 @@ func TransferJdsOrder(ctx *jxcontext.Context, vendorOrderID string, storeID int) } } if waybill != nil { - if waybill.WaybillVendorID != model.VendorIDJDWL { - if handler := partner.GetDeliveryPlatformFromVendorID(waybill.WaybillVendorID); handler != nil { - err = handler.Handler.CancelWaybill(waybill, 0, "订单转移被取消") - } + if handler := partner.GetDeliveryPlatformFromVendorID(waybill.WaybillVendorID); handler != nil { + err = handler.Handler.CancelWaybill(waybill, 0, "订单转移被取消") } } } - err = jdshop.ChangeOrderStatus(vendorOrderID, model.OrderStatusCanceled, "订单转移被取消") - if err != nil { - return "", err - } //重新构建order的数据 storeMaps, err := dao.GetStoresMapList(db, []int{order.VendorID}, []int{storeID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "") if err != nil || len(storeMaps) == 0 { - return "", fmt.Errorf("该门店未绑定京狗平台,请先绑定后再转移!门店:[%v]", storeID) + return "", fmt.Errorf("该门店未绑定平台,请先绑定后再转移!门店:[%v]", storeID) } stores, err := dao.GetStoreList(db, []int{storeID}, nil, nil, nil, "") if len(storeMaps) > 0 && len(stores) > 0 { if storeMaps[0].VendorStoreID == "" { - return "", fmt.Errorf("该门店未绑定京狗平台,或绑定有误,请联系技术部!门店:[%v]", storeID) + return "", fmt.Errorf("该门店未绑定平台,或绑定有误,请联系技术部!门店:[%v]", storeID) } order.StoreID = storeID order.StoreName = stores[0].Name @@ -1558,6 +1552,9 @@ func TransferJdsOrder(ctx *jxcontext.Context, vendorOrderID string, storeID int) if store.OpenTime1 == 0 || store.CloseTime1 == 0 { return "", fmt.Errorf("该门店没有营业时间,不能接单!门店:[%v]", storeID) } + if closetime1.Sub(opentime1) <= time.Hour { + return "", fmt.Errorf("该门店营业时间间隔过小,请确认!门店:[%v]", storeID) + } if !(orderCreatedAt.Sub(opentime1) >= 0 && orderCreatedAt.Sub(closetime1) <= 0) { if store.OpenTime2 != 0 && store.CloseTime2 != 0 { if !(orderCreatedAt.Sub(opentime2) >= 0 && orderCreatedAt.Sub(closetime2) <= 0) { @@ -1592,35 +1589,63 @@ func TransferJdsOrder(ctx *jxcontext.Context, vendorOrderID string, storeID int) } else { return "", fmt.Errorf("未查询到该门店对应的平台信息!门店:[%v]", order.StoreID) } - if len(order.VendorOrderID) > 12 { - var goodsOrders []*model.GoodsOrder - sql := ` - SELECT * FROM goods_order WHERE vendor_order_id2 = ? ORDER BY vendor_order_id DESC - ` - sqlParams := []interface{}{order.VendorOrderID2} - err = dao.GetRows(db, &goodsOrders, sql, sqlParams) - if goodsOrders[0].Status != model.OrderStatusCanceled { - err = jdshop.ChangeOrderStatus(goodsOrders[0].VendorOrderID, model.OrderStatusCanceled, "订单转移被取消") + if order.VendorID == model.VendorIDJDShop { + if len(order.VendorOrderID) > 12 { + var goodsOrders []*model.GoodsOrder + sql := ` + SELECT * FROM goods_order WHERE vendor_order_id2 = ? ORDER BY vendor_order_id DESC + ` + sqlParams := []interface{}{order.VendorOrderID2} + err = dao.GetRows(db, &goodsOrders, sql, sqlParams) + if goodsOrders[0].Status != model.OrderStatusCanceled { + err = jdshop.ChangeOrderStatus(goodsOrders[0].VendorOrderID, model.OrderStatusCanceled, "订单转移被取消") + } + // suffix := utils.Str2Int(goodsOrders[0].VendorOrderID[12:len(goodsOrders[0].VendorOrderID)]) + // suffix++ + if len(order.VendorOrderID2) > 18 { + order.VendorOrderID2 = order.VendorOrderID2[0:12] + } + order.VendorOrderID = utils.Int64ToStr(utils.Str2Int64(order.VendorOrderID2)*10000) + utils.Int2Str(time.Now().Second()) + if len(order.VendorOrderID) < 18 { + order.VendorOrderID = order.VendorOrderID + "0" + } } - // suffix := utils.Str2Int(goodsOrders[0].VendorOrderID[12:len(goodsOrders[0].VendorOrderID)]) - // suffix++ - if len(order.VendorOrderID2) > 18 { - order.VendorOrderID2 = order.VendorOrderID2[0:12] + if storeID != model.JdShopMainStoreID { + order.DeliveryFlag = model.NO } - order.VendorOrderID = utils.Int64ToStr(utils.Str2Int64(order.VendorOrderID2)*10000) + utils.Int2Str(time.Now().Second()) - if len(order.VendorOrderID) < 18 { - order.VendorOrderID = order.VendorOrderID + "0" + err = jdshop.ChangeOrderStatus(vendorOrderID, model.OrderStatusCanceled, "订单转移被取消") + if err != nil { + return "", err } + order.Status = model.OrderStatusNew + } else { + order.VendorOrderID2 = order.VendorOrderID + order.VendorOrderID = utils.Int64ToStr(jxutils.GenOrderNo()) + order.DeliveryFlag = model.NO + orderStatus := &model.OrderStatus{ + VendorOrderID: vendorOrderID, + VendorID: model.VendorIDJX, + OrderType: model.OrderTypeOrder, + RefVendorOrderID: vendorOrderID, + RefVendorID: model.VendorIDJX, + VendorStatus: utils.Int2Str(model.OrderStatusCanceled), + Status: model.OrderStatusCanceled, + StatusTime: time.Now(), + Remark: "订单转移被取消", + } + jxutils.CallMsgHandlerAsync(func() { + err = partner.CurOrderManager.OnOrderStatusChanged("", orderStatus) + }, jxutils.ComposeUniversalOrderID(vendorOrderID, model.VendorIDJX)) + if err != nil { + return "", err + } + order.Status = model.OrderStatusAccepted } for _, sku := range skus { sku.VendorOrderID = order.VendorOrderID sku.ID = 0 order.Skus = append(order.Skus, sku) } - if storeID != model.JdShopMainStoreID { - order.DeliveryFlag = model.NO - } - order.Status = model.OrderStatusNew setJdsOrderSeq(order) err = partner.CurOrderManager.OnOrderNew(order, model.Order2Status(order)) vendorOrderIDJds = order.VendorOrderID @@ -1776,6 +1801,10 @@ func UpdateWaybillDesiredFee(ctx *jxcontext.Context, vendorOrderID string, desir } else { bill.DesiredFee = int64(desiredFee) _, err = dao.UpdateEntity(db, bill, "DesiredFee") + if order.EarningType == model.EarningTypePoints { + order.NewEarningPrice = order.NewEarningPrice - int64(desiredFee) + _, err = dao.UpdateEntity(db, order, "NewEarningPrice") + } } return err } @@ -1831,3 +1860,26 @@ func RefreshJdsOrderConsigneeInfo(ctx *jxcontext.Context, vendorOrderID string) partner.CurOrderManager.UpdateOrderFields(order, []string{"ConsigneeAddress", "ConsigneeName", "ConsigneeMobile", "ConsigneeMobile2", "BuyerComment", "ConsigneeLng", "ConsigneeLat"}) return err } + +func UpdateOrderInfo(ctx *jxcontext.Context, vendorOrderID string, vendorID int, payload map[string]interface{}) (num int64, err error) { + var ( + db = dao.GetDB() + ) + order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, vendorID) + valid := dao.StrictMakeMapByStructObject(payload, order, ctx.GetUserName()) + if len(valid) > 0 { + dao.Begin(db) + defer func() { + if r := recover(); r != nil { + dao.Rollback(db) + panic(r) + } + }() + if num, err = dao.UpdateEntityByKV(db, order, valid, nil); err != nil { + dao.Rollback(db) + return 0, err + } + } + dao.Commit(db) + return num, err +} diff --git a/business/jxcallback/orderman/orderman_ext.go b/business/jxcallback/orderman/orderman_ext.go index 9f0de1131..8fa33571c 100644 --- a/business/jxcallback/orderman/orderman_ext.go +++ b/business/jxcallback/orderman/orderman_ext.go @@ -159,7 +159,7 @@ func (c *OrderManager) GetOrderInfo(ctx *jxcontext.Context, vendorOrderID string // 这里用QueryRows而不用QueryRow的原因是用QueryRow在这种情况下不能将数据读出,很奇怪。大概的原因是QueryRow对于GoodsOrderExt这种有嵌入的struct处理有问题 num, err := db.Raw(` - SELECT t3.*,ROUND(t3.shop_sum_price/t3.count) avg_price, t1.*, t2.status waybill_status, t2.courier_name, t2.courier_mobile + SELECT t3.*,ROUND(t3.shop_sum_price/t3.count) avg_price, t1.*, t2.status waybill_status, t2.courier_name, t2.courier_mobile, t2.desired_fee FROM goods_order t1 LEFT JOIN waybill t2 ON t1.vendor_waybill_id = t2.vendor_waybill_id AND t1.waybill_vendor_id = t2.waybill_vendor_id JOIN ( diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index cc627e6a8..88c29c18d 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -378,6 +378,7 @@ func (s *DefScheduler) OnOrderNew(order *model.GoodsOrder, isPending bool) (err savedOrderInfo.SetOrder(order) if order.Status == model.OrderStatusWaitAccepted { s.resetTimer(savedOrderInfo, nil, isPending) + push.NotifyNewOrder(order) } if order.Status >= model.OrderStatusNew { s.resetTimer(savedOrderInfo, nil, isPending) @@ -1471,7 +1472,9 @@ func (s *DefScheduler) notifyNewOrder(order *model.GoodsOrder) { smsmsg.NotifyNewOrder(order) smsmsg.NotifyNewUserOrder(order) } - push.NotifyNewOrder(order) + if order.VendorID != model.VendorIDEBAI { + push.NotifyNewOrder(order) + } }) } } @@ -1489,6 +1492,7 @@ func (s *DefScheduler) notifyOrderCanceled(order *model.GoodsOrder) { order = setFakeActualPayPrice(order) weixinmsg.NotifyOrderCanceled(order) smsmsg.NotifyOrderCanceled(order) + push.NotifyOrderCanceled(order) }) } } diff --git a/business/jxcallback/scheduler/defsch/defsch_afs.go b/business/jxcallback/scheduler/defsch/defsch_afs.go index f8a00c562..260aec703 100644 --- a/business/jxcallback/scheduler/defsch/defsch_afs.go +++ b/business/jxcallback/scheduler/defsch/defsch_afs.go @@ -3,6 +3,7 @@ package defsch import ( "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" + push "git.rosy.net.cn/jx-callback/business/jxutils/unipush" "git.rosy.net.cn/jx-callback/business/jxutils/weixinmsg" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/msghub" @@ -31,6 +32,7 @@ func (s *DefScheduler) OnAfsOrderNew(order *model.AfsOrder, isPending bool) (err } msghub.OnNewWait4ApproveAfsOrder(order) weixinmsg.NotifyAfsOrderStatus(order) + push.NotifyAfsOrder(order) } } return err diff --git a/business/jxstore/cms/cms.go b/business/jxstore/cms/cms.go index c7a0603de..da514bc19 100644 --- a/business/jxstore/cms/cms.go +++ b/business/jxstore/cms/cms.go @@ -222,6 +222,11 @@ func GetCoordinateDistrictCode(ctx *jxcontext.Context, lng, lat float64) (code i return api.AutonaviAPI.GetCoordinateDistrictCode(lng, lat), nil } +func GetCoordinateCityInfo(ctx *jxcontext.Context, lng, lat float64) (name string, err error) { + name, _ = api.AutonaviAPI.GetCoordinateCityInfo(lng, lat) + return name, err +} + func SendMsg2Somebody(ctx *jxcontext.Context, mobileNum, verifyCode, msgType, msgContent string) (err error) { if needConfirmRequestMap[msgType] == 1 { if _, err = mobile.AutherObj.VerifySecret(mobileNum, verifyCode); err != nil { diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index e64f152fb..b84544e4c 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -3570,6 +3570,19 @@ func CreateStoreAudit(ctx *jxcontext.Context, storeAudit *model.StoreAudit) (err if len(storeAudits) > 0 { return fmt.Errorf("您已申请过入驻,请不要重复申请!") } + if storeAudit.Address == "" { + return fmt.Errorf("门店地址必填!") + } + if storeAudit.Lng == 0 || storeAudit.Lat == 0 { + lng, lat, _ := api.AutonaviAPI.GetCoordinateFromAddressByPage(storeAudit.Address) + if lng != 0 && lat != 0 { + storeAudit.Lng = jxutils.StandardCoordinate2Int(lng) + storeAudit.Lat = jxutils.StandardCoordinate2Int(lat) + } else { + return fmt.Errorf("请填写正确的门店地址!") + } + } + if storeAudit.UserID == "" { storeAudit.UserID = ctx.GetUserID() } @@ -3601,7 +3614,7 @@ func GetStoreAudit(ctx *jxcontext.Context, statuss []int, keyword, applyTimeStar func StoreAudit(ctx *jxcontext.Context, storeAudits []*model.StoreAudit, status int) (err error) { db := dao.GetDB() - if status == model.StoreAuditStatusOnline { + if status != model.StoreAuditStatusCreated && status != model.StoreAuditStatusRejected { return fmt.Errorf("审核标志不正确!") } task := tasksch.NewParallelTask("StoreAudit", tasksch.NewParallelConfig().SetParallelCount(5).SetIsContinueWhenError(true), ctx, @@ -3619,7 +3632,13 @@ func StoreAudit(ctx *jxcontext.Context, storeAudits []*model.StoreAudit, status storeAudits[0].AuditStatus = model.StoreAuditStatusCreated //添加门店 storeExt := &StoreExt{} - utils.Map2StructByJson(utils.Struct2MapByJson(&storeAudit), &storeExt, false) + if data, err := json.Marshal(&storeAudits[0]); err == nil { + utils.UnmarshalUseNumber(data, &storeExt) + } + storeExt.ID = 0 + storeExt.Store.StoreLevel = "C" + storeExt.FloatLng = jxutils.IntCoordinate2Standard(utils.Float64TwoInt(storeExt.FloatLng)) + storeExt.FloatLat = jxutils.IntCoordinate2Standard(utils.Float64TwoInt(storeExt.FloatLat)) storeID, err := CreateStore(ctx, storeExt, ctx.GetUserName()) if err != nil { return retVal, fmt.Errorf(err.Error()) @@ -3629,13 +3648,13 @@ func StoreAudit(ctx *jxcontext.Context, storeAudits []*model.StoreAudit, status return retVal, fmt.Errorf(err.Error()) } } else if status == model.StoreAuditStatusRejected { - storeAudits[0].Status = model.StoreAuditStatusRejected + storeAudits[0].AuditStatus = model.StoreAuditStatusRejected } else { return retVal, fmt.Errorf("审核标志不正确!") } storeAudits[0].LastOperator = ctx.GetUserName() storeAudits[0].Remark = storeAudit.Remark - _, err = dao.UpdateEntity(db, storeAudits[0], "UserID", "Status", "Remark") + _, err = dao.UpdateEntity(db, storeAudits[0], "LastOperator", "AuditStatus", "Remark") //是否推送app消息 if err == nil { diff --git a/business/jxstore/cms/sync2.go b/business/jxstore/cms/sync2.go index 54546dcf3..9bbd8aef8 100644 --- a/business/jxstore/cms/sync2.go +++ b/business/jxstore/cms/sync2.go @@ -147,6 +147,9 @@ func SyncSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorIDs []int, if skuVendorInfo.ExdSkuID != "" { return nil, err } + if skuVendorInfo.SkuVendorMapCatID != "" { + skuVendorInfo.VendorVendorCatID = utils.Str2Int64(skuVendorInfo.SkuVendorMapCatID) + } skuVendorInfo.SkuName = jxutils.ComposeSkuNameSync(skuVendorInfo.Prefix, skuVendorInfo.Name, skuVendorInfo.Comment, skuVendorInfo.Unit, skuVendorInfo.SpecQuality, skuVendorInfo.SpecUnit, 0, skuVendorInfo.ExPrefix, skuVendorInfo.ExPrefixBegin, skuVendorInfo.ExPrefixEnd) skuVendorInfo.SkuNameOrigin = jxutils.ComposeSkuNameOriginal(skuVendorInfo.Prefix, skuVendorInfo.Name, skuVendorInfo.Comment, skuVendorInfo.Unit, skuVendorInfo.SpecQuality, skuVendorInfo.SpecUnit, 0) if skuVendorInfo.ImgWatermark != "" { diff --git a/business/jxstore/cms/sync_store_sku.go b/business/jxstore/cms/sync_store_sku.go index ff48de932..32c9c8364 100644 --- a/business/jxstore/cms/sync_store_sku.go +++ b/business/jxstore/cms/sync_store_sku.go @@ -301,9 +301,10 @@ func formalizeStoreSkuList(inSkuList []*dao.StoreSkuSyncInfo) []*dao.StoreSkuSyn skuItem.SkuName = jxutils.ComposeSkuNameSync(skuItem.Prefix, skuItem.Name, skuItem.Comment, skuItem.Unit, skuItem.SpecQuality, skuItem.SpecUnit, 0, skuItem.ExPrefix, skuItem.ExPrefixBegin, skuItem.ExPrefixEnd) skuItem.SkuNameOrigin = jxutils.ComposeSkuNameOriginal(skuItem.Prefix, skuItem.Name, skuItem.Comment, skuItem.Unit, skuItem.SpecQuality, skuItem.SpecUnit, 0) if skuItem.ImgWatermark != "" && model.IsSyncStatusUpdate(skuItem.SkuSyncStatus) && skuItem.VendorID != model.VendorIDJD { - if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*skuItem.ExPrefixBegin) >= 0 && utils.Time2Date(time.Now()).Sub(*skuItem.ExPrefixEnd) <= 0 { - downLoad, _ := uploadImgStandard(skuItem.ImgWatermark) - skuItem.ImgMix = jxutils.MixWatermarkImg(downLoad, skuItem.ImgOrigin, skuItem.ExPrefixBegin, skuItem.ExPrefixEnd) + if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*skuItem.ExPrefixBegin) == 0 { + // if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*skuItem.ExPrefixBegin) >= 0 && utils.Time2Date(time.Now()).Sub(*skuItem.ExPrefixEnd) <= 0 { + // downLoad, _ := uploadImgStandard(skuItem.ImgWatermark) + skuItem.ImgMix = jxutils.MixWatermarkImg(skuItem.ImgWatermark, skuItem.ImgOrigin, skuItem.ExPrefixBegin, skuItem.ExPrefixEnd) } if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*skuItem.ExPrefixEnd) > 0 { skuItem.ImgMix = "" diff --git a/business/jxutils/jxutils.go b/business/jxutils/jxutils.go index c578cd043..2fe3d5aa0 100644 --- a/business/jxutils/jxutils.go +++ b/business/jxutils/jxutils.go @@ -4,6 +4,7 @@ import ( "bytes" "context" "crypto/aes" + "crypto/md5" "encoding/base64" "fmt" "io/ioutil" @@ -26,9 +27,10 @@ import ( ) var ( - routinePool *routinepool.Pool - skuNamePat *regexp.Regexp - emailPat *regexp.Regexp + routinePool *routinepool.Pool + skuNamePat *regexp.Regexp + emailPat *regexp.Regexp + orderNoBeginTimestamp int64 resourceTypeMap = map[int][]string{ model.VendorIDQiNiuCloud: []string{ @@ -75,6 +77,7 @@ func init() { // https://stackoverflow.com/questions/38933898/error-parsing-regexp-invalid-or-unsupported-perl-syntax skuNamePat = regexp.MustCompile(`([\((\[【][^\((\[【\))\]】]*[\))\]】])?(.*?)([((].*[))])?\s*约?([1-9][\d\.]*)(g|G|kg|kG|Kg|KG|l|L|ml|mL|Ml|ML|克)\s*([((].*[))])?\s*(?:\/|/|)\s*([^\s()()]{0,2})(\s.*)?$\s*([((].*[))])?$`) emailPat = regexp.MustCompile(`[A-Za-z0-9_\-.]+@(?:[A-Za-z0-9_\-]+\.)+[A-Za-z]+`) + orderNoBeginTimestamp = utils.Str2Time("2010-01-01 00:00:00").Unix() } func getJxStoreIDFromOrder(order *model.GoodsOrder) (retVal int) { @@ -168,6 +171,36 @@ func GetPossibleVendorIDFromVendorOrderID(vendorOrderID string) (vendorID int) { return vendorID } +func GenOrderNo() (orderNo int64) { + const prefix = 88 + const randPartNum = 1000 + orderNo = time.Now().Unix() - orderNoBeginTimestamp + orderNo = orderNo * randPartNum + md5Bytes := md5.Sum([]byte(utils.GetUUID())) + randPart := 0 + for k, v := range md5Bytes { + randPart += int(v) << ((k % 3) * 8) + } + orderNo += int64(randPart % randPartNum) + orderNo += int64(math.Pow10(int(math.Log10(float64(orderNo)))+1)) * prefix + return orderNo +} + +func GenAfsOrderNo() (orderNo int64) { + const prefix = 80 + const randPartNum = 100 + orderNo = time.Now().Unix() - orderNoBeginTimestamp + orderNo = orderNo * randPartNum + md5Bytes := md5.Sum([]byte(utils.GetUUID())) + randPart := 0 + for k, v := range md5Bytes { + randPart += int(v) << ((k % 3) * 8) + } + orderNo += int64(randPart % randPartNum) + orderNo += int64(math.Pow10(int(math.Log10(float64(orderNo)))+1)) * prefix + return orderNo +} + func GetPossibleVendorIDFromAfsOrderID(afsOrderID string) (vendorID int) { vendorID = model.VendorIDUnknown if afsOrderIDInt64 := utils.Str2Int64WithDefault(afsOrderID, 0); afsOrderIDInt64 > 0 { diff --git a/business/jxutils/unipush/push.go b/business/jxutils/unipush/push.go index 288bc68e3..acd099a4d 100644 --- a/business/jxutils/unipush/push.go +++ b/business/jxutils/unipush/push.go @@ -1,6 +1,7 @@ package push import ( + "fmt" "strings" "git.rosy.net.cn/baseapi/platformapi/unipushapi" @@ -13,24 +14,22 @@ import ( "github.com/astaxie/beego" ) -func NotifyNewOrder(order *model.GoodsOrder) { +func pushToSingle(content, title string, storeID int) { var ( db = dao.GetDB() ) - globals.SugarLogger.Debugf("NotifyNewOrder push begin orderID :[%v]", order.VendorOrderID) - storePushs, err := dao.GetStorePushClient(db, jxutils.GetSaleStoreIDFromOrder(order), "") + if !globals.IsProductEnv() { + return + } + storePushs, err := dao.GetStorePushClient(db, storeID, "") if err != nil { return } for _, v := range storePushs { - sb := new(strings.Builder) - sb.WriteString("老板,") - sb.WriteString(order.ConsigneeName) - sb.WriteString("购买了商品") - sb.WriteString(getOrderDetailBrief(order)) + status, err2 := api.PushAPI.PushToSingle(v.ClientID, false, &unipushapi.Notification{ - Title: "京西菜市新订单推送", - Body: sb.String(), + Title: title, + Body: content, }) if err = err2; err != nil { globals.SugarLogger.Debugf("NotifyNewOrder push error: [%v]", err) @@ -38,7 +37,7 @@ func NotifyNewOrder(order *model.GoodsOrder) { } if status == unipushapi.SuccessOffLine { _, err = api.PushAPI.PushToSingle(v.ClientID, true, &unipushapi.Notification{ - Body: sb.String(), + Body: content, }) if err != nil { globals.SugarLogger.Debugf("NotifyNewOrder push2 error: [%v]", err) @@ -49,6 +48,16 @@ func NotifyNewOrder(order *model.GoodsOrder) { } } +func NotifyNewOrder(order *model.GoodsOrder) { + globals.SugarLogger.Debugf("NotifyNewOrder push begin orderID :[%v]", order.VendorOrderID) + sb := new(strings.Builder) + sb.WriteString("老板,") + sb.WriteString(order.ConsigneeName) + sb.WriteString("购买了商品") + sb.WriteString(getOrderDetailBrief(order)) + pushToSingle(sb.String(), "京西菜市新订单推送", jxutils.GetSaleStoreIDFromOrder(order)) +} + func getOrderDetailBrief(order *model.GoodsOrder) (brief string) { sb := new(strings.Builder) sb.WriteString(order.Skus[0].SkuName) @@ -72,3 +81,15 @@ func getOrderDetailBrief(order *model.GoodsOrder) (brief string) { sb.WriteString("元") return sb.String() } + +func NotifyAfsOrder(afsOrder *model.AfsOrder) (err error) { + globals.SugarLogger.Debugf("NotifyAfsOrder push begin orderID :[%v]", afsOrder.VendorOrderID) + pushToSingle("老板,您有新的售后单,请尽快处理!", "京西菜市售后单推送", jxutils.GetSaleStoreIDFromAfsOrder(afsOrder)) + return err +} + +func NotifyOrderCanceled(order *model.GoodsOrder) (err error) { + title := fmt.Sprintf("老板,您的订单%s第%d号订单, %s被取消了!", model.VendorChineseNames[order.VendorID], order.OrderSeq, order.VendorOrderID) + pushToSingle(title, "京西菜市取消单推送", jxutils.GetSaleStoreIDFromOrder(order)) + return err +} diff --git a/business/model/dao/dao_order.go b/business/model/dao/dao_order.go index e95398189..c46002c47 100644 --- a/business/model/dao/dao_order.go +++ b/business/model/dao/dao_order.go @@ -1266,12 +1266,12 @@ func GetWaybills(db *DaoDB, vendorOrderID string) (waybills []*model.Waybill, er func GetMatterChildOrders(db *DaoDB, vendorOrderID string) (goods []*model.GoodsOrder, err error) { sql := `SELECT * FROM goods_order - WHERE vendor_order_id LIKE ? OR vendor_order_id LIKE ? + WHERE vendor_order_id LIKE ? OR vendor_order_id LIKE ? OR vendor_order_id LIKE ? AND vendor_id = ? ORDER BY vendor_order_id DESC ` sqlParams := []interface{}{ - vendorOrderID + "0%", vendorOrderID + "1%", + vendorOrderID + "0%", vendorOrderID + "1%", vendorOrderID + "2%", model.VendorIDJX, } err = GetRows(db, &goods, sql, sqlParams) diff --git a/business/model/dao/sku.go b/business/model/dao/sku.go index 0b511a55c..ada9feefe 100644 --- a/business/model/dao/sku.go +++ b/business/model/dao/sku.go @@ -260,7 +260,8 @@ func GetSkusWithVendor(db *DaoDB, vendorIDs []int, appOrgCodes []string, nameIDs t3.jd_category_id vendor_vendor_cat_id, tsu.ex_prefix, tsu.begin_at ex_prefix_begin, tsu.end_at ex_prefix_end, tsu.img_watermark, t3m.sync_status cat_sync_status, - t3m.vendor_thing_id vendor_cat_id + t3m.vendor_thing_id vendor_cat_id, + tsy.vendor_category_id sku_vendor_map_cat_id FROM sku t1 LEFT JOIN thing_map t1m ON t1m.thing_id = t1.id AND t1m.thing_type = ? AND t1m.deleted_at = ?` @@ -286,9 +287,10 @@ func GetSkusWithVendor(db *DaoDB, vendorIDs []int, appOrgCodes []string, nameIDs LEFT JOIN data_resource t11 ON t11.main_url = t2.img LEFT JOIN data_resource t12 ON t12.main_url = t2.img2 LEFT JOIN sku_exinfo_map tsu ON tsu.name_id = t2.id AND tsu.deleted_at = ? AND tsu.vendor_id = t1m.vendor_id + LEFT JOIN sku_vendor_category_map tsy ON tsy.name_id = t2.id AND tsy.vendor_id = ? AND tsy.deleted_at = ? WHERE 1 = 1 ` - sqlParams = append(sqlParams, model.ThingTypeCategory, utils.DefaultTimeValue, utils.DefaultTimeValue) + sqlParams = append(sqlParams, model.ThingTypeCategory, utils.DefaultTimeValue, utils.DefaultTimeValue, model.VendorIDJD, utils.DefaultTimeValue) if mustDirty { sql += " AND t1m.sync_status IS NOT NULL AND t1m.sync_status <> 0" } else { diff --git a/business/model/order.go b/business/model/order.go index 4c6eeb301..99cc1a475 100644 --- a/business/model/order.go +++ b/business/model/order.go @@ -28,10 +28,11 @@ const ( ) const ( - OrderTypeNormal = 0 //普通订单 - OrderTypeMatter = 1 //物料订单 - OrderTypeSupplyGoods = 2 //进货订单 - OrderTypeDefendPrice = 3 //守价订单 + OrderTypeAddressErr = -1 //地址异常订单 + OrderTypeNormal = 0 //普通订单 + OrderTypeMatter = 1 //物料订单 + OrderTypeSupplyGoods = 2 //进货订单 + OrderTypeDefendPrice = 3 //守价订单 ) var ( diff --git a/business/model/store.go b/business/model/store.go index b995d813e..8b513e42a 100644 --- a/business/model/store.go +++ b/business/model/store.go @@ -711,8 +711,8 @@ type StoreAudit struct { CloseTime1 int16 `json:"closeTime1" validate:"max=2359,min=1` // 格式同上 OpenTime2 int16 `json:"openTime2" validate:"max=2359,min=1,ltfield=CloseTime2"` // 格式同上 CloseTime2 int16 `json:"closeTime2" validate:"max=2359,min=1` // 格式同上 - Lng int `json:"-"` // 乘了10的6次方 - Lat int `json:"-"` // 乘了10的6次方 + Lng int `json:"lng"` // 乘了10的6次方 + Lat int `json:"lat"` // 乘了10的6次方 DeliveryRangeType int8 `json:"deliveryRangeType"` // 参见相关常量定义 DeliveryRange string `orm:"type(text)" json:"deliveryRange"` // 如果DeliveryRangeType为DeliveryRangeTypePolygon,则为逗号分隔坐标,分号分隔的坐标点(坐标与Lng和Lat一样,都是整数),比如 121361504,31189308;121420555,31150238。否则为半径,单位为米 Status int `json:"status"` diff --git a/business/partner/delivery/mtps/store.go b/business/partner/delivery/mtps/store.go index e38939f23..9664c736e 100644 --- a/business/partner/delivery/mtps/store.go +++ b/business/partner/delivery/mtps/store.go @@ -44,36 +44,38 @@ func (c *DeliveryHandler) OnStoreStatus(msg *mtpsapi.CallbackShopStatusMsg) (ret } func (c *DeliveryHandler) CreateStore(ctx *jxcontext.Context, storeDetail *dao.StoreDetail2) (vendorStoreID string, status int, err error) { - businessHours := []*mtpsapi.BusinessHour{ - &mtpsapi.BusinessHour{ - BeginTime: "06:00", - EndTime: "22:00", - }, - } - shopInfo := &mtpsapi.ShopInfo{ - ShopID: storeDetail.VendorStoreID, - ShopName: storeDetail.Name, - Category: mtpsapi.ShopCategoryFruit, - SecondCategory: mtpsapi.ShopCategoryFruitFruit, - ContactName: storeDetail.PayeeName, - ContactPhone: storeDetail.Tel1, - ContactEmail: fakeContactEmail, - ShopAddress: storeDetail.Address, - ShopLng: storeDetail.Lng, - ShopLat: storeDetail.Lat, - CoordinateType: mtpsapi.CoordinateTypeMars, - BusinessHours: string(utils.MustMarshal(businessHours)), - } - shopStatus := mtpsapi.ShopStatusAuditCreated if globals.EnableStoreWrite { - shopStatus, err = api.MtpsAPI.ShopCreate(shopInfo) - if err == nil { - vendorStoreID = shopInfo.ShopID - status = getAuditStatus(shopStatus) + businessHours := []*mtpsapi.BusinessHour{ + &mtpsapi.BusinessHour{ + BeginTime: "06:00", + EndTime: "22:00", + }, + } + shopInfo := &mtpsapi.ShopInfo{ + ShopID: storeDetail.VendorStoreID, + ShopName: storeDetail.Name, + Category: mtpsapi.ShopCategoryFruit, + SecondCategory: mtpsapi.ShopCategoryFruitFruit, + ContactName: storeDetail.PayeeName, + ContactPhone: storeDetail.Tel1, + ContactEmail: fakeContactEmail, + ShopAddress: storeDetail.Address, + ShopLng: storeDetail.Lng, + ShopLat: storeDetail.Lat, + CoordinateType: mtpsapi.CoordinateTypeMars, + BusinessHours: string(utils.MustMarshal(businessHours)), + } + shopStatus := mtpsapi.ShopStatusAuditCreated + if globals.EnableStoreWrite { + shopStatus, err = api.MtpsAPI.ShopCreate(shopInfo) + if err == nil { + vendorStoreID = shopInfo.ShopID + status = getAuditStatus(shopStatus) + } + } else { + vendorStoreID = utils.Int64ToStr(jxutils.GenFakeID()) + status = model.StoreAuditStatusOnline } - } else { - vendorStoreID = utils.Int64ToStr(jxutils.GenFakeID()) - status = model.StoreAuditStatusOnline } return vendorStoreID, status, err } diff --git a/business/partner/purchase/jd/sku2.go b/business/partner/purchase/jd/sku2.go index f9da68b38..c6593b44a 100644 --- a/business/partner/purchase/jd/sku2.go +++ b/business/partner/purchase/jd/sku2.go @@ -114,7 +114,7 @@ func (p *PurchaseHandler) ReorderCategories2(ctx *jxcontext.Context, vendorOrgCo func (p *PurchaseHandler) getVendorCategories(level int, pid int64) (vendorCats []*model.SkuVendorCategory, err error) { // 得到平台的分类,不需要指定分账号 - cats, err := api.Jd2API.QueryChildCategoriesForOP(pid) + cats, err := api.JdAPI.QueryChildCategoriesForOP(pid) if err != nil { return nil, err } diff --git a/business/partner/purchase/jdshop/callback.go b/business/partner/purchase/jdshop/callback.go index 9abdee29e..8664854eb 100644 --- a/business/partner/purchase/jdshop/callback.go +++ b/business/partner/purchase/jdshop/callback.go @@ -70,13 +70,11 @@ func SaveJdsOrders(msg *jdshopapi.CallBackResult) (err error) { if err != nil || order == nil { return err } - // order.StoreID = 102919 - // order.JxStoreID = 102919 - // order.StoreName = "商城模板(成都发货)" - // order.VendorStoreID = model.JdShopMainVendorStoreID - // order.DeliveryFlag = model.OrderDeliveryFlagMaskScheduleDisabled partner.CurOrderManager.OnOrderNew(order, model.Order2Status(order)) noticeMsg := fmt.Sprintf("京东商城新订单,订单号:[%v] ,将要发到的门店id:[%v] , 门店名:[%v]", order.VendorOrderID, order.StoreID, order.StoreName) + if order.OrderType == model.OrderTypeAddressErr { + noticeMsg += " 此订单地址有问题,需要矫正坐标!" + } ddmsg.SendUserMessage(dingdingapi.MsgTyeText, "DDC5657B43EE11E9A9FF525400E86DC0", "京东商城来新订单了!", noticeMsg) ddmsg.SendUserMessage(dingdingapi.MsgTyeText, "1439B3E07D3911EA881A525400E86DC0", "京东商城来新订单了!", noticeMsg) return err @@ -114,9 +112,22 @@ func result2Orders(msg *jdshopapi.CallBackResult) (order *model.GoodsOrder, err order.TotalShopMoney = 100 } if order.ConsigneeAddress != "" { - lng, lat, _ := api.AutonaviAPI.GetCoordinateFromAddress(order.ConsigneeAddress, "") - order.ConsigneeLng = jxutils.StandardCoordinate2Int(lng) - order.ConsigneeLat = jxutils.StandardCoordinate2Int(lat) + lng, lat, err2 := api.AutonaviAPI.GetCoordinateFromAddressByPage(order.ConsigneeAddress) + if err = err2; err != nil { + globals.SugarLogger.Infof("高德page err: %v", err) + } + lng2, lat2, _ := api.AutonaviAPI.GetCoordinateFromAddress(order.ConsigneeAddress, "") + distance := jxutils.EarthDistance(lng, lat, lng2, lat2) + if distance > 1 { + order.OrderType = model.OrderTypeAddressErr + } + if err == nil && lng != 0 && lat != 0 { + order.ConsigneeLng = jxutils.StandardCoordinate2Int(lng) + order.ConsigneeLat = jxutils.StandardCoordinate2Int(lat) + } else { + order.ConsigneeLng = jxutils.StandardCoordinate2Int(lng2) + order.ConsigneeLat = jxutils.StandardCoordinate2Int(lat2) + } order.CoordinateType = model.CoordinateTypeMars } for _, v := range msg.ItemInfoList { @@ -163,8 +174,10 @@ func result2Orders(msg *jdshopapi.CallBackResult) (order *model.GoodsOrder, err ) for _, sku := range order.Skus { storeSkuList, _ := dao.GetStoresSkusInfo(dao.GetDB(), []int{order.StoreID}, []int{sku.SkuID}) - if len(storeSkuList) > 0 && storeSkuList[0].Status == model.StoreSkuBindStatusNormal { - saleNormalSum += 1 + if len(storeSkuList) > 0 { + if storeSkuList[0].Status == model.StoreSkuBindStatusNormal { + saleNormalSum += 1 + } shopPriceSum += storeSkuList[0].Price * sku.Count } } @@ -202,8 +215,8 @@ func result2Orders(msg *jdshopapi.CallBackResult) (order *model.GoodsOrder, err // 如果是暂停,表示是预订单g if msg.OrderState == jdshopapi.OrderStatusPause || msg.OrderState == jdshopapi.OrderStatusPopPause { order.BusinessType = model.BusinessTypeDingshida - if time, err := api.JdShopAPI.GetOrderExtInfoByOrderId(order.VendorOrderID2); err == nil { - order.ExpectedDeliveredTime = utils.Str2Time(time) + if time2, err := api.JdShopAPI.GetOrderExtInfoByOrderId(order.VendorOrderID2); err == nil { + order.ExpectedDeliveredTime = utils.Str2Time(time2).Add(-time.Minute * 30) } order.PickDeadline = order.ExpectedDeliveredTime.Add(-time.Hour) } else if msg.OrderState == jdshopapi.OrderStatusWait { @@ -214,12 +227,15 @@ func result2Orders(msg *jdshopapi.CallBackResult) (order *model.GoodsOrder, err return nil, err } if msg.IDSopShipmenttype == jdshopapi.IdSopShipmenttypeTC { - if time, err := api.JdShopAPI.GetOrderExtInfoByOrderId(order.VendorOrderID2); err == nil { + if time2, err := api.JdShopAPI.GetOrderExtInfoByOrderId(order.VendorOrderID2); err == nil { order.BusinessType = model.BusinessTypeDingshida - order.ExpectedDeliveredTime = utils.Str2Time(time) + order.ExpectedDeliveredTime = utils.Str2Time(time2).Add(-time.Minute * 30) } } setJdsOrderSeq(order) + if order.OrderType == model.OrderTypeAddressErr { + buildOrderTo102919(order) + } return order, err } diff --git a/business/partner/purchase/jx/localjx/order.go b/business/partner/purchase/jx/localjx/order.go index 4f3435750..c8ea6f4e6 100644 --- a/business/partner/purchase/jx/localjx/order.go +++ b/business/partner/purchase/jx/localjx/order.go @@ -1,7 +1,6 @@ package localjx import ( - "crypto/md5" "fmt" "math" "regexp" @@ -140,8 +139,6 @@ type MatterOrderStatus struct { } var ( - orderNoBeginTimestamp int64 - weekdayMap = map[int]string{ 1: "一", 2: "二", @@ -174,7 +171,6 @@ var ( ) func init() { - orderNoBeginTimestamp = utils.Str2Time("2010-01-01 00:00:00").Unix() } func GetMyOrders(ctx *jxcontext.Context, fromDateStr, toDateStr string, params map[string]interface{}, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) { @@ -250,7 +246,7 @@ func CreateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64, if jxOrder.IsPriceDefend == model.YES { outJxOrder.OrderID = jxOrder.OrderID } else { - outJxOrder.OrderID = GenOrderNo(ctx) + outJxOrder.OrderID = jxutils.GenOrderNo() } order, err2 := jxOrder2GoodsOrder(ctx, outJxOrder, deliveryAddress, "", IsDeliverySelf) if err = err2; err == nil { @@ -273,7 +269,7 @@ func buildDefendPriceOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, address ) issue = jxutils.GetDefendPriceIssue() priceDefendOrder := &model.PriceDefendOrder{ - VendorOrderID: utils.Int64ToStr(GenOrderNo(ctx)), + VendorOrderID: utils.Int64ToStr(jxutils.GenOrderNo()), StoreID: jxOrder.StoreID, SkuID: jxOrder.Skus[0].SkuID, AddressID: addressID, @@ -543,37 +539,6 @@ func OnPayFinished(orderPay *model.OrderPay) (err error) { return err } -func GenOrderNo(ctx *jxcontext.Context) (orderNo int64) { - const prefix = 88 - const randPartNum = 1000 - orderNo = time.Now().Unix() - orderNoBeginTimestamp - // fmt.Println(orderNo) - orderNo = orderNo * randPartNum - md5Bytes := md5.Sum([]byte(utils.GetUUID())) - randPart := 0 - for k, v := range md5Bytes { - randPart += int(v) << ((k % 3) * 8) - } - orderNo += int64(randPart % randPartNum) - orderNo += int64(math.Pow10(int(math.Log10(float64(orderNo)))+1)) * prefix - return orderNo -} - -func GenAfsOrderNo(ctx *jxcontext.Context) (orderNo int64) { - const prefix = 80 - const randPartNum = 100 - orderNo = time.Now().Unix() - orderNoBeginTimestamp - orderNo = orderNo * randPartNum - md5Bytes := md5.Sum([]byte(utils.GetUUID())) - randPart := 0 - for k, v := range md5Bytes { - randPart += int(v) << ((k % 3) * 8) - } - orderNo += int64(randPart % randPartNum) - orderNo += int64(math.Pow10(int(math.Log10(float64(orderNo)))+1)) * prefix - return orderNo -} - func GenPayOrderID(order *model.GoodsOrder) (payOrderID int64) { return utils.Str2Int64(order.VendorOrderID) } @@ -1219,6 +1184,7 @@ func orderSolutionForWuLiao(order *model.GoodsOrder) (err error) { checkMatterDeliveryAddress(deliveryAddress) order2, err2 := jxOrder2GoodsOrder(jxcontext.AdminCtx, outJxOrder, deliveryAddress, order.UserID, false) if err = err2; err == nil { + order2.FromStoreID = v.FromStoreID order2.AddressID = order.AddressID order2.Status = model.OrderStatusDelivering err = partner.CurOrderManager.OnOrderNew(order2, model.Order2Status(order2)) @@ -1970,6 +1936,7 @@ func SendFailedMatterOrder(ctx *jxcontext.Context, vendorOrderID string) (err er if order == nil || order.StoreID != model.MatterStoreID || order.FromStoreID == 0 { return fmt.Errorf("只允许物料店重发物料订单调用此接口!") } + err = CancelMatterOrder(db, order, cancelMatterOrderReason) // queryOrderStatus, err := api.JdEclpAPI.QueryOrderStatus(order.EclpOutID) // if len(queryOrderStatus.OrderStatusList) > 0 { // code := queryOrderStatus.OrderStatusList[len(queryOrderStatus.OrderStatusList)-1].SoStatusCode @@ -1980,7 +1947,6 @@ func SendFailedMatterOrder(ctx *jxcontext.Context, vendorOrderID string) (err er globals.SugarLogger.Debugf("SendFailedMatterOrder err : [%v]", err) return err } - err = CancelMatterOrder(db, order, cancelMatterOrderReason) changeOrderStatus(order.VendorOrderID, model.OrderStatusCanceled, cancelMatterOrderReason) for _, v := range order.Skus { cms.RefreshMatterStock(jxcontext.AdminCtx, v.SkuID) @@ -1997,13 +1963,12 @@ func SendFailedMatterOrder(ctx *jxcontext.Context, vendorOrderID string) (err er return err } suffix := utils.Str2Int64(cOrder.VendorOrderID[len(cOrder.VendorOrderID)-2:]) + int64(len(goodsList)) - _, err = createMatterOrder(buildJxOrderInfo(cOrder, cOrder.Skus), cOrder, suffix) + _, err = createMatterOrder(buildJxOrderInfo(cOrder, cOrder.Skus), order, suffix) for _, v := range cOrder.Skus { cms.RefreshMatterStock(jxcontext.AdminCtx, v.SkuID) } } } - // err = CancelMatterOrder(db, order, cancelMatterOrderReason) changeOrderStatus(order.VendorOrderID, model.OrderStatusCanceled, cancelMatterOrderReason) } else if len(order.VendorOrderID) == 16 && order.EclpOutID != "" { // 这是分包的子订单 return fmt.Errorf("请重发主订单!主订单号:[%v]", order.VendorOrderID[len(order.VendorOrderID)-2:]) @@ -2101,7 +2066,7 @@ func CreateOrderByPriceDefend(ctx *jxcontext.Context) (err error) { BuyerComment: "守价订单", StoreID: vv[0].StoreID, IsPriceDefend: model.YES, - OrderID: GenOrderNo(ctx), + OrderID: jxutils.GenOrderNo(), UserID: address.UserID, } for _, priceDefend := range vv { diff --git a/business/partner/purchase/jx/localjx/user.go b/business/partner/purchase/jx/localjx/user.go new file mode 100644 index 000000000..5a4f39d82 --- /dev/null +++ b/business/partner/purchase/jx/localjx/user.go @@ -0,0 +1,60 @@ +package localjx + +import ( + "git.rosy.net.cn/jx-callback/business/model/dao" + "git.rosy.net.cn/jx-callback/globals/api" + + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxutils" + "git.rosy.net.cn/jx-callback/business/model" + + "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" +) + +type GetJxShopUsersResult struct { + model.User + BuyCount int `json:"buyCount"` + ActualPayPrice int `json:"actualPayPrice"` + GoodCommentCount int `json:"goodCommentCount"` + BadCommentCount int `json:"badCommentCount"` + UserMembers []*model.UserMember `json:"userMembers"` +} + +func GetJxShopUsers(ctx *jxcontext.Context, keyword string, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) { + var ( + requestList []*GetJxShopUsersResult + db = dao.GetDB() + ) + sql := ` + SELECT SQL_CALC_FOUND_ROWS DISTINCT a.*, b.buy_count, b.actual_pay_price + FROM user a, + (SELECT a.user_id, COUNT(*) buy_count, SUM(c.actual_pay_price) actual_pay_price + FROM user a + JOIN auth_bind b ON b.user_id = a.user_id AND b.deleted_at = ? AND b.type_id = ? + JOIN goods_order c ON c.user_id = a.user_id AND c.status <> ? + WHERE a.deleted_at = ? + GROUP BY 1) b + WHERE a.user_id = b.user_id + ` + sqlParams := []interface{}{ + utils.DefaultTimeValue, api.WeixinMiniAppID2, + model.OrderStatusCanceled, + utils.DefaultTimeValue, + } + if keyword != "" { + sql += " AND (a.user_id LIKE ? OR a.name LIKE ? OR a.moblie LIKE ? OR a.user_id2 LIKE ?)" + sqlParams = append(sqlParams, "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%") + } + sql += "LIMIT ? OFFSET ?" + pageSize = jxutils.FormalizePageSize(pageSize) + sqlParams = append(sqlParams, pageSize, offset) + dao.Begin(db) + defer dao.Commit(db) + if err = dao.GetRows(db, &requestList, sql, sqlParams...); err == nil { + return &model.PagedInfo{ + TotalCount: dao.GetLastTotalRowCount(db), + Data: requestList, + }, nil + } + return pagedInfo, err +} diff --git a/business/partner/purchase/jx/order_afs.go b/business/partner/purchase/jx/order_afs.go index 757c6ec44..c67602161 100644 --- a/business/partner/purchase/jx/order_afs.go +++ b/business/partner/purchase/jx/order_afs.go @@ -5,6 +5,8 @@ import ( "strings" "time" + "git.rosy.net.cn/jx-callback/business/jxutils" + "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/business/model/dao" @@ -142,7 +144,7 @@ func (c *PurchaseHandler) PartRefundOrder(ctx *jxcontext.Context, order *model.G func buildOrderStatus(ctx *jxcontext.Context, order *model.GoodsOrder, reason string, isJxShop bool) (orderStatus *model.OrderStatus) { orderStatus = &model.OrderStatus{ - VendorOrderID: utils.Int64ToStr(localjx.GenAfsOrderNo(ctx)), // 是售后单ID,不是订单ID,订单ID在RefVendorOrderID中 + VendorOrderID: utils.Int64ToStr(jxutils.GenAfsOrderNo()), // 是售后单ID,不是订单ID,订单ID在RefVendorOrderID中 VendorID: order.VendorID, OrderType: model.OrderTypeAfsOrder, RefVendorOrderID: order.VendorOrderID, diff --git a/business/partner/purchase/mtwm/order.go b/business/partner/purchase/mtwm/order.go index 28b16a250..14cdc26b4 100644 --- a/business/partner/purchase/mtwm/order.go +++ b/business/partner/purchase/mtwm/order.go @@ -254,13 +254,19 @@ func (p *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *mo if skuBenefitDetailMap != nil && skuBenefitDetailMap[sku.VendorSkuID] != nil && ignoreSkuMap[sku.SkuID] == 0 /* && sku.Count == 1 */ { for _, v := range skuBenefitDetailMap[sku.VendorSkuID].WmAppOrderActDetails { if /*skuActTypeMap[v.Type] == 1 && */ strings.Index(v.Remark, skuName) >= 0 && sku.Count == v.Count { - ignoreSkuMap[sku.SkuID] = 1 - sku.SalePrice -= jxutils.StandardPrice2Int(v.MtCharge + v.PoiCharge) + if sku.SalePrice-jxutils.StandardPrice2Int(v.MtCharge+v.PoiCharge) < 0 { + continue + } else { + ignoreSkuMap[sku.SkuID] = 1 + sku.SalePrice -= jxutils.StandardPrice2Int(v.MtCharge + v.PoiCharge) + } sku.StoreSubName = utils.Int2Str(v.Type) } } } - + if sku.SalePrice < 0 { + sku.SalePrice = jxutils.StandardPrice2Int(utils.MustInterface2Float64(product["price"])) + } // if product["isGift"].(bool) { // sku.SkuType = 1 // } diff --git a/controllers/cms.go b/controllers/cms.go index a323bb673..5c4294fde 100644 --- a/controllers/cms.go +++ b/controllers/cms.go @@ -139,6 +139,21 @@ func (c *CmsController) GetCoordinateDistrictCode() { }) } +// @Title 根据坐标得到城市 +// @Description 根据坐标得到城市 +// @Param token header string true "认证token" +// @Param lng query number true "经度" +// @Param lat query number true "纬度" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /GetCoordinateCityInfo [get] +func (c *CmsController) GetCoordinateCityInfo() { + c.callGetCoordinateCityInfo(func(params *tCmsGetCoordinateCityInfoParams) (retVal interface{}, errCode string, err error) { + retVal, err = cms.GetCoordinateCityInfo(params.Ctx, params.Lng, params.Lat) + return retVal, "", err + }) +} + // @Title 得到配置参数 // @Description 得到配置参数 // @Param token header string true "认证token" diff --git a/controllers/cms_store.go b/controllers/cms_store.go index 1d10c0ec6..da28300eb 100644 --- a/controllers/cms_store.go +++ b/controllers/cms_store.go @@ -889,7 +889,7 @@ func (c *StoreController) GetStoreAudit() { // @Title 门店审核 // @Description 门店审核 // @Param token header string true "认证token" -// @Param payload fomData string true "json数据,storeaudit对象" +// @Param payload formData string true "json数据,storeaudit对象" // @Param status formData int false "审核标志,1通过,-1 不通过" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult diff --git a/controllers/cms_user2.go b/controllers/cms_user2.go index a52dbf392..702ea35fa 100644 --- a/controllers/cms_user2.go +++ b/controllers/cms_user2.go @@ -12,6 +12,7 @@ import ( "git.rosy.net.cn/jx-callback/business/jxutils/jsonerr" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/model/dao" + "git.rosy.net.cn/jx-callback/business/partner/purchase/jx/localjx" "github.com/astaxie/beego" ) @@ -533,3 +534,19 @@ func (c *User2Controller) GetUserAgreement() { return retVal, "", err }) } + +// @Title 查询京西商城用户信息 +// @Description 查询京西商城用户信息 +// @Param token header string true "认证token" +// @Param keyword query string false "关键字" +// @Param offset query int false "结果起始序号(以0开始,缺省为0)" +// @Param pageSize query int false "结果页大小(缺省为50,-1表示全部)" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /GetJxShopUsers [get] +func (c *User2Controller) GetJxShopUsers() { + c.callGetJxShopUsers(func(params *tUser2GetJxShopUsersParams) (retVal interface{}, errCode string, err error) { + retVal, err = localjx.GetJxShopUsers(params.Ctx, params.Keyword, params.Offset, params.PageSize) + return retVal, "", err + }) +} diff --git a/controllers/jx_order.go b/controllers/jx_order.go index d88564eae..952722fed 100644 --- a/controllers/jx_order.go +++ b/controllers/jx_order.go @@ -1182,3 +1182,22 @@ func (c *OrderController) RefreshJdsOrderConsigneeInfo() { return retVal, "", err }) } + +// @Title 修改订单信息 +// @Description 修改订单信息 +// @Param token header string true "认证token" +// @Param vendorOrderID formData string true "订单号" +// @Param vendorID formData int true "平台ID" +// @Param payload formData string true "json数据,格式为goodsOrder" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /UpdateOrderInfo [put] +func (c *OrderController) UpdateOrderInfo() { + c.callUpdateOrderInfo(func(params *tOrderUpdateOrderInfoParams) (retVal interface{}, errCode string, err error) { + payload := make(map[string]interface{}) + if err = utils.UnmarshalUseNumber([]byte(params.Payload), &payload); err == nil { + retVal, err = orderman.UpdateOrderInfo(params.Ctx, params.VendorOrderID, params.VendorID, payload) + } + return retVal, "", err + }) +} diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index 43e739309..ef9ee799b 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -277,6 +277,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:CmsController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:CmsController"], + beego.ControllerComments{ + Method: "GetCoordinateCityInfo", + Router: `/GetCoordinateCityInfo`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:CmsController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:CmsController"], beego.ControllerComments{ Method: "GetCoordinateDistrictCode", @@ -1386,6 +1395,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"], + beego.ControllerComments{ + Method: "UpdateOrderInfo", + Router: `/UpdateOrderInfo`, + AllowHTTPMethods: []string{"put"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"], beego.ControllerComments{ Method: "UpdateOrderWaybillTip", @@ -2925,6 +2943,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:User2Controller"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:User2Controller"], + beego.ControllerComments{ + Method: "GetJxShopUsers", + Router: `/GetJxShopUsers`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:User2Controller"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:User2Controller"], beego.ControllerComments{ Method: "GetMyJxStoreList",