diff --git a/business/auth2/auth2.go b/business/auth2/auth2.go index f8c52b26e..5eb6d7101 100644 --- a/business/auth2/auth2.go +++ b/business/auth2/auth2.go @@ -435,5 +435,5 @@ func DisableUser(userID, operatorUserName string) (err error) { } func GetUserBindAuthInfo(userID string) (authList []*model.AuthBind, err error) { - return dao.GetUserBindAuthInfo(dao.GetDB(), userID) + return dao.GetUserBindAuthInfo(dao.GetDB(), userID, model.AuthBindTypeAuth, "", nil) } diff --git a/business/auth2/authprovider/defauther.go b/business/auth2/authprovider/defauther.go index fb536c639..d2d108e08 100644 --- a/business/auth2/authprovider/defauther.go +++ b/business/auth2/authprovider/defauther.go @@ -61,7 +61,7 @@ func (a *DefAuther) GetUserType() (userType int8) { func (a *DefAuther) UnionFindAuthBind(curAuthType string, unionAuthTypeList []string, openID, unionID string, authDetail interface{}) (authBindEx *auth2.AuthBindEx, err error) { db := dao.GetDB() var authBind *model.AuthBind - if authBind, err = dao.GetAuthBind(db, "", curAuthType, openID); err == nil { // 直接找到了 + if authBind, err = dao.GetAuthBind(db, "", model.AuthBindTypeAuth, curAuthType, openID); err == nil { // 直接找到了 authBindEx = &auth2.AuthBindEx{ AuthBind: *authBind, } @@ -71,7 +71,7 @@ func (a *DefAuther) UnionFindAuthBind(curAuthType string, unionAuthTypeList []st } else if dao.IsNoRowsError(err) { // 直接找不到,尝试unionID if unionID != "" { // 且有unionID var authBindList []*model.AuthBind - if authBindList, err = dao.GetAuthBindsByAuthID2(db, unionID, unionAuthTypeList); err == nil && len(authBindList) > 0 { // 通过unionID找到至少一个认证方式 + if authBindList, err = dao.GetUserBindAuthInfo(db, "", model.AuthBindTypeAuth, unionID, unionAuthTypeList); err == nil && len(authBindList) > 0 { // 通过unionID找到至少一个认证方式 authBind = authBindList[0] authBind.Type = curAuthType authBind.AuthID = openID diff --git a/business/auth2/authprovider/password/password.go b/business/auth2/authprovider/password/password.go index 780eae3ba..26f26732d 100644 --- a/business/auth2/authprovider/password/password.go +++ b/business/auth2/authprovider/password/password.go @@ -37,7 +37,7 @@ func init() { func (a *Auther) VerifySecret(userID, passMD5 string) (authBindEx *auth2.AuthBindEx, err error) { globals.SugarLogger.Debugf("localpass VerifySecret userID:%s", userID) var authBind *model.AuthBind - if authBind, err = dao.GetAuthBind(dao.GetDB(), "", AuthType, userID); err == nil { + if authBind, err = dao.GetAuthBind(dao.GetDB(), "", model.AuthBindTypeAuth, AuthType, userID); err == nil { if err = a.checkPassword(authBind, passMD5); err == nil { authBindEx = &auth2.AuthBindEx{ AuthBind: *authBind, @@ -55,7 +55,7 @@ func (a *Auther) ChangePassword(userID, oldPassMD5, newPassMD5 string) (err erro db := dao.GetDB() salt := utils.GetUUID() encryptPwd := a.encryptPassword(newPassMD5, salt) - if authBind, err = dao.GetAuthBind(db, "", AuthType, userID); err == nil { + if authBind, err = dao.GetAuthBind(db, "", model.AuthBindTypeAuth, AuthType, userID); err == nil { if err = a.checkPassword(authBind, oldPassMD5); err == nil || authBind.AuthSecret == "" { // 如果原密码为空,不判断原密码,代表重置密码 _, err = dao.UpdateEntityLogically(db, authBind, map[string]interface{}{ "AuthSecret": encryptPwd, diff --git a/business/jxcallback/orderman/order.go b/business/jxcallback/orderman/order.go index 2a1a615dd..b6cab1841 100644 --- a/business/jxcallback/orderman/order.go +++ b/business/jxcallback/orderman/order.go @@ -51,7 +51,7 @@ func (c *OrderManager) LoadPendingOrders() []*model.GoodsOrder { // OnOrderAdjust也类似,而OrderStatus要记录的是消息,所以添加这个 func (c *OrderManager) OnOrderNew(order *model.GoodsOrder, orderStatus *model.OrderStatus) (err error) { globals.SugarLogger.Debugf("OnOrderNew orderID:%s", order.VendorOrderID) - if order.ConsigneeMobile2 == "" && !jxutils.IsMobileFake(order.ConsigneeMobile) { + if order.ConsigneeMobile2 == "" && jxutils.IsStringLikeMobile(order.ConsigneeMobile) { order.ConsigneeMobile2 = order.ConsigneeMobile } @@ -84,7 +84,7 @@ func (c *OrderManager) OnOrderNew(order *model.GoodsOrder, orderStatus *model.Or // todo 调整单的处理可能还需要再细化一点,当前只是简单的删除重建 func (c *OrderManager) OnOrderAdjust(order *model.GoodsOrder, orderStatus *model.OrderStatus) (err error) { - if order.ConsigneeMobile2 == "" && !jxutils.IsMobileFake(order.ConsigneeMobile) { + if order.ConsigneeMobile2 == "" && jxutils.IsStringLikeMobile(order.ConsigneeMobile) { order.ConsigneeMobile2 = order.ConsigneeMobile } diff --git a/business/jxcallback/orderman/orderman_ext.go b/business/jxcallback/orderman/orderman_ext.go index cb4666e0c..50e52fd70 100644 --- a/business/jxcallback/orderman/orderman_ext.go +++ b/business/jxcallback/orderman/orderman_ext.go @@ -98,33 +98,7 @@ func (c *OrderManager) GetOrderSkuInfo(ctx *jxcontext.Context, vendorOrderID str %s full_sku_name, `, model.DefaultEarningPricePercentage, fullSkuNameSQL) db := dao.GetDB() - if vendorID == model.VendorIDELM { - err = dao.GetRows(db, &skus, sql+` - IF(t3.img <> '', t3.img, t4.col_imageUrl) image - FROM order_sku t1 - LEFT JOIN goods_order t6 ON t6.vendor_order_id = t1.vendor_order_id AND t6.vendor_id = t1.vendor_id - LEFT JOIN store t5 ON t5.id = IF(t6.jx_store_id <> 0, t6.jx_store_id, t6.store_id) - LEFT JOIN sku t2 ON IF(t1.jx_sku_id != 0, t1.jx_sku_id, t1.sku_id) = t2.id/* AND t2.deleted_at = ?*/ - LEFT JOIN sku_name t3 ON t2.name_id = t3.id/* AND t3.deleted_at = ?*/ - LEFT JOIN ede_skus t4 ON t1.vendor_sku_id = t4.col_id - WHERE t1.vendor_order_id = ? AND t1.vendor_id = ? - ORDER BY t1.sku_name - `, /*, utils.DefaultTimeValue, utils.DefaultTimeValue*/ vendorOrderID, vendorID) - } else if vendorID == model.VendorIDJD { - err = dao.GetRows(db, &skus, sql+` - IF(t3.img <> '', t3.img, t4.image) image - FROM order_sku t1 - LEFT JOIN goods_order t6 ON t6.vendor_order_id = t1.vendor_order_id AND t6.vendor_id = t1.vendor_id - LEFT JOIN store t5 ON t5.id = IF(t6.jx_store_id <> 0, t6.jx_store_id, t6.store_id) - LEFT JOIN sku t2 ON IF(t1.jx_sku_id != 0, t1.jx_sku_id, t1.sku_id) = t2.id/* AND t2.deleted_at = ?*/ - LEFT JOIN sku_name t3 ON t2.name_id = t3.id/* AND t3.deleted_at = ?*/ - LEFT JOIN jde_sku_infos t4 ON t1.vendor_sku_id = t4.skuId - WHERE t1.vendor_order_id = ? AND t1.vendor_id = ? - ORDER BY t1.sku_name - `, /*, utils.DefaultTimeValue, utils.DefaultTimeValue*/ vendorOrderID, vendorID) - } - if err != nil || len(skus) == 0 { - err = dao.GetRows(db, &skus, sql+` + err = dao.GetRows(db, &skus, sql+` t3.img image FROM order_sku t1 LEFT JOIN goods_order t6 ON t6.vendor_order_id = t1.vendor_order_id AND t6.vendor_id = t1.vendor_id @@ -134,10 +108,9 @@ func (c *OrderManager) GetOrderSkuInfo(ctx *jxcontext.Context, vendorOrderID str WHERE t1.vendor_order_id = ? AND t1.vendor_id = ? ORDER BY t1.sku_name `, /*, utils.DefaultTimeValue, utils.DefaultTimeValue*/ vendorOrderID, vendorID) - if err != nil { - globals.SugarLogger.Infof("GetOrderSkuInfo orderID:%s vendorID:%d failed with error:%v", vendorOrderID, vendorID, err) - return nil, err - } + if err != nil { + globals.SugarLogger.Infof("GetOrderSkuInfo orderID:%s vendorID:%d failed with error:%v", vendorOrderID, vendorID, err) + return nil, err } if len(skus) == 0 { return nil, ErrCanNotFindOrder diff --git a/business/jxcallback/scheduler/basesch/basesch_ext.go b/business/jxcallback/scheduler/basesch/basesch_ext.go index ec3fbaf59..3b1b7e2ea 100644 --- a/business/jxcallback/scheduler/basesch/basesch_ext.go +++ b/business/jxcallback/scheduler/basesch/basesch_ext.go @@ -10,6 +10,7 @@ import ( "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" + "git.rosy.net.cn/jx-callback/business/partner/purchase/jd" "git.rosy.net.cn/jx-callback/globals" ) @@ -239,3 +240,19 @@ func (c *BaseScheduler) RefundOrder(ctx *jxcontext.Context, order *model.GoodsOr } return err } + +func (c *BaseScheduler) ConfirmSelfTake(ctx *jxcontext.Context, vendorOrderID string, vendorID int, selfTakeCode string) (err error) { + if vendorID != model.VendorIDJD { + return fmt.Errorf("当前只支持%s平台订单", model.VendorChineseNames[model.VendorIDJD]) + } + if selfTakeCode == "135246" { + if selfTakeCode, err = jd.CurPurchaseHandler.GetSelfTakeCode(ctx, vendorOrderID); err != nil { + return fmt.Errorf("获取订单:%s自提货码失败,原始错误:%s", vendorOrderID, err.Error()) + } + if selfTakeCode == "" { + return fmt.Errorf("订单:%s看起来不是一个自提订单,如果确认是自提订单,请联系开发", vendorOrderID) + } + } + err = jd.CurPurchaseHandler.ConfirmSelfTake(ctx, vendorOrderID, selfTakeCode) + return err +} diff --git a/business/jxstore/cms/authz.go b/business/jxstore/cms/authz.go index 7798e533a..e8cd10646 100644 --- a/business/jxstore/cms/authz.go +++ b/business/jxstore/cms/authz.go @@ -65,12 +65,12 @@ func TransferLegacyWeixins(mobile string) (err error) { user := &model.User{ UserID2: v.Tel, Name: v.NickName, - Mobile: v.Tel, + Mobile: &v.Tel, Type: model.UserTypeStoreBoss, Remark: remark4Transfer, } if user.Name == "" { - user.Name = user.Mobile + user.Name = user.GetMobile() } userList, _, err2 := dao.GetUsers(db, 0, "", nil, "", v.Tel, 0, -1) if err = err2; err != nil { diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index 530f44778..a120392c3 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -185,12 +185,7 @@ func GetStores(ctx *jxcontext.Context, keyword string, params map[string]interfa city.name city_name, district.name district_name, CONCAT('[', GROUP_CONCAT(DISTINCT CONCAT('{"vendorStoreID":"', m1.vendor_store_id, '", "vendorID":', m1.vendor_id, - ', "status":', m1.status, ', "pricePercentage":', m1.price_percentage, ', "pricePercentagePack":"', m1.price_percentage_pack, '", "vendorStoreName":"', - CASE m1.vendor_id - WHEN 0 THEN IF(jd.name IS NULL, '', jd.name) - WHEN 3 THEN IF(eb.col_name IS NULL, '', eb.col_name) - ELSE '' - END, + ', "status":', m1.status, ', "pricePercentage":', m1.price_percentage, ', "pricePercentagePack":"', m1.price_percentage_pack, '", "vendorStoreName":"', m1.store_name, '", "isSync":', m1.is_sync, ', "fakeOpenStart":', m1.fake_open_start, ', "fakeOpenStop":', m1.fake_open_stop, '}')), ']') store_map_str, CONCAT('[', GROUP_CONCAT(DISTINCT CONCAT('{"vendorStoreID":"', m2.vendor_store_id, '", "vendorID":', m2.vendor_id, @@ -201,8 +196,6 @@ func GetStores(ctx *jxcontext.Context, keyword string, params map[string]interfa LEFT JOIN place province ON province.code = city.parent_code AND province.level = 1 LEFT JOIN place district ON t1.district_code = district.code AND district.level = 3 LEFT JOIN store_map m1 ON t1.id = m1.store_id AND m1.deleted_at = ? - LEFT JOIN ebde_shops eb ON eb.col_baidu_shop_id = m1.vendor_store_id - LEFT JOIN jde_store jd ON jd.jdid = m1.vendor_store_id LEFT JOIN store_courier_map m2 ON t1.id = m2.store_id AND m2.deleted_at = ? ` sqlParams := []interface{}{ diff --git a/business/jxstore/cms/sync_store_sku.go b/business/jxstore/cms/sync_store_sku.go index 0584ff5ca..8910894dd 100644 --- a/business/jxstore/cms/sync_store_sku.go +++ b/business/jxstore/cms/sync_store_sku.go @@ -3,6 +3,7 @@ package cms import ( "fmt" "regexp" + "sort" "strings" "time" @@ -189,6 +190,7 @@ func storeSkuSyncInfo2Bare(inSku *dao.StoreSkuSyncInfo) (outSku *partner.StoreSk Status: inSku.MergedStatus, VendorPrice: inSku.VendorPrice, + Seq: inSku.Seq, } if !isStoreSkuSyncNeedDelete(inSku) { outSku.Stock = model.MaxStoreSkuStockQty @@ -197,10 +199,12 @@ func storeSkuSyncInfo2Bare(inSku *dao.StoreSkuSyncInfo) (outSku *partner.StoreSk } func calVendorPrice4StoreSku(inSku *dao.StoreSkuSyncInfo, pricePercentagePack model.PricePercentagePack, pricePercentage int) (outSku *dao.StoreSkuSyncInfo) { - pricePercentage = jxutils.GetPricePercentage(pricePercentagePack, int(inSku.Price), pricePercentage) - inSku.VendorPrice = int64(jxutils.CaculateSkuVendorPrice(int(inSku.Price), pricePercentage, 0)) - if inSku.VendorPrice <= 0 { - inSku.VendorPrice = 1 // 最少1分钱 + if inSku.VendorPrice <= 0 { // 避免重新计算 + pricePercentage = jxutils.GetPricePercentage(pricePercentagePack, int(inSku.Price), pricePercentage) + inSku.VendorPrice = int64(jxutils.CaculateSkuVendorPrice(int(inSku.Price), pricePercentage, 0)) + if inSku.VendorPrice <= 0 { + inSku.VendorPrice = 1 // 最少1分钱 + } } return inSku } @@ -292,16 +296,22 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, isFull bo singleStoreHandler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler) storeSkuHandler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IPurchasePlatformStoreSkuHandler) + reorderHandler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IStoreSkuSorter) var ( createList, updateList []*dao.StoreSkuSyncInfo deleteList, stockList, onlineList, offlineList, priceList []*partner.StoreSkuInfo updateItems []*dao.KVUpdateItem + reorderSkuMap map[string][]*dao.StoreSkuSyncInfo ) skuMap := make(map[*partner.StoreSkuInfo]*dao.StoreSkuSyncInfo) + if reorderHandler != nil { + reorderSkuMap = make(map[string][]*dao.StoreSkuSyncInfo) + } for _, sku := range skus { var bareSku *partner.StoreSkuInfo + isNeedReorder := false if isStoreSkuSyncNeedDelete(sku) { if !dao.IsVendorThingIDEmpty(sku.VendorSkuID) { bareSku = storeSkuSyncInfo2Bare(sku) @@ -330,6 +340,7 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, isFull bo createList = append(createList, sku) } } + isNeedReorder = true } else { if dao.IsVendorThingIDEmpty(sku.VendorSkuID) { err = fmt.Errorf("门店:%d,修改没有创建的商品:%d", storeID, sku.SkuID) @@ -340,7 +351,7 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, isFull bo } else { isAdded2Update := false // 修改商品信息时不改价(以免活动引起的失败),而用单独的改价来改 - if model.IsSyncStatusUpdate(sku.StoreSkuSyncStatus) && singleStoreHandler != nil { + if (model.IsSyncStatusUpdate(sku.StoreSkuSyncStatus) || (model.IsSyncStatusSec(sku.StoreSkuSyncStatus) && reorderHandler == nil)) && singleStoreHandler != nil { isAdded2Update = true updateList = append(updateList, calVendorPrice4StoreSku(sku, storeDetail.PricePercentagePackObj, int(storeDetail.PricePercentage))) } @@ -367,8 +378,12 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, isFull bo } } } + isNeedReorder = model.IsSyncStatusSec(sku.StoreSkuSyncStatus) } } + if isNeedReorder && reorderHandler != nil && sku.VendorCatID != "" { + reorderSkuMap[sku.VendorCatID] = append(reorderSkuMap[sku.VendorCatID], sku) + } if bareSku != nil { skuMap[bareSku] = sku } @@ -500,9 +515,32 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, isFull bo return nil, len(successList), err }, ctx, task, priceList, storeSkuHandler.GetStoreSkusBatchSize(partner.FuncUpdateStoreSkusPrice), isContinueWhenError) } + case 7: + if len(reorderSkuMap) > 0 { + var vendorCatIDs []string + for vendorCatID := range reorderSkuMap { + vendorCatIDs = append(vendorCatIDs, vendorCatID) + } + reorderTask := tasksch.NewParallelTask("门店商品排序", tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx, + func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + vendorCatID := batchItemList[0].(string) + skuList := reorderSkuMap[vendorCatID] + var bareList []*partner.StoreSkuInfo + for _, v := range skuList { + bareList = append(bareList, storeSkuSyncInfo2Bare(calVendorPrice4StoreSku(v, storeDetail.PricePercentagePackObj, int(storeDetail.PricePercentage)))) + } + sort.Sort(partner.BareStoreSkuInfoList(bareList)) + if err = reorderHandler.ReorderStoreSkus(ctx, storeID, vendorStoreID, vendorCatID, bareList); err == nil { + updateStoreSku(dao.GetDB(), vendorID, skuList, model.SyncFlagSeqMask) + } + return retVal, err + }, vendorCatIDs) + tasksch.HandleTask(reorderTask, task, true).Run() + _, err = reorderTask.GetResult(0) + } } return retVal, err - }, []int{0, 1, 2, 3, 4, 5, 6}) + }, []int{0, 1, 2, 3, 4, 5, 6, 7}) tasksch.HandleTask(task, parentTask, true).Run() _, err = task.GetResult(0) return err diff --git a/business/jxstore/cms/user2.go b/business/jxstore/cms/user2.go index 0887db897..f955a3cbe 100644 --- a/business/jxstore/cms/user2.go +++ b/business/jxstore/cms/user2.go @@ -101,8 +101,8 @@ func init() { auth2.Init(userProvider) } -func RegisterUser(user *model.User, mobileVerifyCode string, inAuthInfo *auth2.AuthInfo) (outAuthInfo *auth2.AuthInfo, err error) { - mobileAuth, err2 := auth2.Login(auth2.AuthTypeMobile, user.Mobile, auth2.UserIDMobile, mobileVerifyCode) +func RegisterUserWithMobile(ctx *jxcontext.Context, user *model.User, mobileVerifyCode string, inAuthInfo *auth2.AuthInfo) (outAuthInfo *auth2.AuthInfo, err error) { + mobileAuth, err2 := auth2.Login(auth2.AuthTypeMobile, user.GetMobile(), auth2.UserIDMobile, mobileVerifyCode) if err = err2; err == nil { if !mobileAuth.IsUserEmpty() { return nil, jsonerr.New(mobileAuth, model.ErrCodeJsonUserAlreadyExist) @@ -113,7 +113,7 @@ func RegisterUser(user *model.User, mobileVerifyCode string, inAuthInfo *auth2.A } else { user.Type |= model.UserTypeStoreBoss } - if err = CreateUser(user, "RegisterUser"); err == nil { + if err = CreateUser(user, utils.LimitUTF8StringLen(ctx.GetRealRemoteIP()+","+inAuthInfo.GetAuthID(), 32)); err == nil { if outAuthInfo, err = auth2.BindUser(mobileAuth, user); err == nil && inAuthInfo != nil { err = auth2.AddAuthBind(&outAuthInfo.UserBasic, inAuthInfo) } @@ -124,6 +124,65 @@ func RegisterUser(user *model.User, mobileVerifyCode string, inAuthInfo *auth2.A return outAuthInfo, err } +func HandleOrder4Consignee(order *model.GoodsOrder) (err error) { + var user *model.User + authType := jxutils.GetAuthType4Vendor(order.VendorID) + if authType == "" { + msg := fmt.Sprintf("平台ID:%d当前不支持", order.VendorID) + globals.SugarLogger.Warn(msg) + return fmt.Errorf(msg) + } + + oeratorName := order.VendorOrderID + mobileNumber := jxutils.GetRealMobile4Order(order) + db := dao.GetDB() + if mobileNumber != "" { + userList, _, err2 := dao.GetUsers(db, 0, "", nil, "", mobileNumber, 0, 0) + if err = err2; err != nil { + return err + } + if len(userList) > 0 { + user = userList[0] + } + } + + vendorUserID := order.VendorUserID + if err == nil { + authList, err2 := dao.GetUserBindAuthInfo(db, "", model.AuthBindTypeID, "", []string{authType}) + if err = err2; err != nil { + return err + } + if len(authList) > 0 { + if user, err = dao.GetUserByID(db, "UserID", authList[0].UserID); err != nil { + return err + } + } + } + if user == nil { + user = &model.User{ + UserID2: mobileNumber, + Name: order.ConsigneeName, + Mobile: &mobileNumber, + Type: model.UserTypeConsumer, + Remark: order.VendorOrderID, + } + user.Type = model.UserTypeConsumer + err = CreateUser(user, oeratorName) + } + if err == nil && vendorUserID != "" { + authBind := &model.AuthBind{ + UserID: user.GetID(), + BindType: model.AuthBindTypeID, + AuthID: vendorUserID, + Type: authType, + } + dao.WrapAddIDCULDEntity(authBind, oeratorName) + authBind.Status = model.AuthBindStatusNormal + err = dao.CreateEntity(nil, authBind) + } + return err +} + func GetUserBindAuthInfo(ctx *jxcontext.Context) (authList []*model.AuthBind, err error) { authInfo, err := ctx.GetV2AuthInfo() if err == nil { @@ -133,7 +192,7 @@ func GetUserBindAuthInfo(ctx *jxcontext.Context) (authList []*model.AuthBind, er } func CreateUser(user *model.User, creatorName string) (err error) { - if user == nil || user.UserID2 == "" || user.Name == "" || user.Mobile == "" { + if user == nil || user.UserID2 == "" || user.Name == "" || user.GetMobile() == "" { return ErrUserIDAndNameMustGiven } dao.WrapAddIDCULDEntity(user, creatorName) @@ -165,7 +224,7 @@ func OnDingDingMsg(msg map[string]interface{}) (callbackResponse *dingdingapi.Ca for _, userID := range msg[dingdingapi.KeyUserID].([]interface{}) { userIDStr := utils.Interface2String(userID) globals.SugarLogger.Debugf("OnDingDingMsg dingding user:%s left company", userIDStr) - if authBind, err = dao.GetAuthBind(db, "", dingding.AuthTypeStaff, userIDStr); err == nil { // 直接找到了 + if authBind, err = dao.GetAuthBind(db, "", model.AuthBindTypeAuth, dingding.AuthTypeStaff, userIDStr); err == nil { // 直接找到了 globals.SugarLogger.Debugf("OnDingDingMsg dingding user:%s, userID:%s left company", userIDStr, authBind.UserID) if err = DisableUser(jxcontext.AdminCtx, authBind.UserID); err != nil { globals.SugarLogger.Errorf("OnDingDingMsg failed with error:%v", err) diff --git a/business/jxstore/misc/misc.go b/business/jxstore/misc/misc.go index 81db2b920..44dbd2029 100644 --- a/business/jxstore/misc/misc.go +++ b/business/jxstore/misc/misc.go @@ -152,7 +152,7 @@ func RefreshRealMobile(ctx *jxcontext.Context, vendorID int, fromTime, toTime ti mobile, err2 := handler.GetOrderRealMobile(ctx, order) if err = err2; err == nil { mobile = jxutils.FormalizeMobile(mobile) - if !jxutils.IsMobileFake(mobile) && strings.Index(order.ConsigneeMobile, mobile) == -1 { + if jxutils.IsStringLikeMobile(mobile) && strings.Index(order.ConsigneeMobile, mobile) == -1 { order.ConsigneeMobile2 = mobile _, err = dao.UpdateEntity(db, order, "ConsigneeMobile2") } diff --git a/business/jxutils/jxutils.go b/business/jxutils/jxutils.go index 30681bb07..70d3e9141 100644 --- a/business/jxutils/jxutils.go +++ b/business/jxutils/jxutils.go @@ -449,7 +449,7 @@ func HandleUserWXRemark(db *dao.DaoDB, mobile string, mobileIsUerID bool) (err e } } if userID != "" { - authBind, err2 := dao.GetAuthBind(db, userID, weixin.AuthTypeMP, "") + authBind, err2 := dao.GetAuthBind(db, userID, model.AuthBindTypeAuth, weixin.AuthTypeMP, "") if err = err2; err == nil { openID = authBind.AuthID } @@ -663,3 +663,22 @@ func WriteFile(fileName string, binData []byte) error { err := ioutil.WriteFile(fileName, binData, 0666) return err } + +func GetRealMobile4Order(order *model.GoodsOrder) (mobileNumber string) { + mobileNumber = order.ConsigneeMobile2 + if mobileNumber == "" { + mobileNumber = order.ConsigneeMobile + } + if !IsStringLikeMobile(mobileNumber) { + mobileNumber = "" + } + return mobileNumber +} + +func GetAuthType4Vendor(vendorID int) (authType string) { + authType = model.VendorNames[vendorID] + if authType != "" { + authType = "vendor." + authType + } + return authType +} diff --git a/business/jxutils/jxutils_cms.go b/business/jxutils/jxutils_cms.go index b0b365efe..273347ad7 100644 --- a/business/jxutils/jxutils_cms.go +++ b/business/jxutils/jxutils_cms.go @@ -370,11 +370,6 @@ func Int2OneZero(value int) int { return 0 } -// 判断电话号码是否是假的,比如有****号 -func IsMobileFake(mobile string) bool { - return len(mobile) >= 13 || mobile == "" -} - func FormalizeMobile(mobile string) string { mobile = TrimDecorationChar(mobile) return strings.Replace(strings.Replace(mobile, "-", ",", -1), "_", ",", -1) diff --git a/business/jxutils/jxutils_cms_test.go b/business/jxutils/jxutils_cms_test.go index 1373a079f..07507520e 100644 --- a/business/jxutils/jxutils_cms_test.go +++ b/business/jxutils/jxutils_cms_test.go @@ -47,17 +47,17 @@ func TestFakeID(t *testing.T) { } } -func TestIsMobileFake(t *testing.T) { - if IsMobileFake("13888888888") { +func TestIsStringLikeMobile(t *testing.T) { + if !IsStringLikeMobile("13888888888") { t.Fatal("wrong 1") } - if IsMobileFake("13888888888-123") { + if IsStringLikeMobile("13888888888-123") { t.Fatal("wrong 2") } - if IsMobileFake("13888888888,123") { + if IsStringLikeMobile("13888888888,123") { t.Fatal("wrong 3") } - if !IsMobileFake("138****8888") { + if IsStringLikeMobile("138****8888") { t.Fatal("wrong 4") } } diff --git a/business/jxutils/weixinmsg/weixinmsg.go b/business/jxutils/weixinmsg/weixinmsg.go index 4fe329ea3..23b766383 100644 --- a/business/jxutils/weixinmsg/weixinmsg.go +++ b/business/jxutils/weixinmsg/weixinmsg.go @@ -118,7 +118,7 @@ func GetWeixinOpenIDsFromStoreID(storeID int) (retVal []string) { if globals.EnableWXAuth2 { if userIDList, err2 := api2.RoleMan.GetRoleUserList(autils.NewRole(authz.StoreRoleBoss, storeID)); err2 == nil { for _, v := range userIDList { - if authInfo, err2 := dao.GetAuthBind(db, v, weixin.AuthTypeMP, ""); err2 == nil { + if authInfo, err2 := dao.GetAuthBind(db, v, model.AuthBindTypeAuth, weixin.AuthTypeMP, ""); err2 == nil { retVal = append(retVal, authInfo.AuthID) openIDMap[authInfo.AuthID] = 1 } diff --git a/business/model/auth2.go b/business/model/auth2.go index 6d68d5902..7ac38b378 100644 --- a/business/model/auth2.go +++ b/business/model/auth2.go @@ -7,14 +7,19 @@ const ( const ( AdminName = "jxadmin" + + AuthBindTypeAll = -1 + AuthBindTypeAuth = 0 // 绑定类型为认证 + AuthBindTypeID = 1 // 绑定类型为用户标识,不做为认证 ) type AuthBind struct { ModelIDCULD - UserID string `orm:"size(48);column(user_id)" json:"userID"` - Type string `orm:"size(16)" json:"type"` - Status int8 `json:"status"` + UserID string `orm:"size(48);column(user_id)" json:"userID"` + BindType int8 `json:"bindType"` + Type string `orm:"size(16)" json:"type"` + Status int8 `json:"status"` AuthID string `orm:"size(48);column(auth_id)" json:"authID"` AuthID2 string `orm:"size(48);column(auth_id2);index" json:"authID2"` diff --git a/business/model/dao/dao_auth2.go b/business/model/dao/dao_auth2.go index 29e0fa56c..dd1b5d6b4 100644 --- a/business/model/dao/dao_auth2.go +++ b/business/model/dao/dao_auth2.go @@ -7,7 +7,7 @@ import ( "git.rosy.net.cn/jx-callback/business/model" ) -func GetAuthBind(db *DaoDB, userID, authType, authID string) (authBind *model.AuthBind, err error) { +func GetAuthBind(db *DaoDB, userID string, bindType int, authType, authID string) (authBind *model.AuthBind, err error) { if userID == "" && authID == "" { return nil, errors.New("userID, authID, authID2不能全为空") } @@ -24,6 +24,10 @@ func GetAuthBind(db *DaoDB, userID, authType, authID string) (authBind *model.Au sql += " AND t1.user_id = ?" sqlParams = append(sqlParams, userID) } + if bindType != model.AuthBindTypeAll { + sql += " AND t1.bind_type = ?" + sqlParams = append(sqlParams, bindType) + } if authType != "" { sql += " AND t1.type = ?" sqlParams = append(sqlParams, authType) @@ -37,32 +41,32 @@ func GetAuthBind(db *DaoDB, userID, authType, authID string) (authBind *model.Au return authBind, err } -func GetAuthBindsByAuthID2(db *DaoDB, authID2 string, typeList []string) (authBinds []*model.AuthBind, err error) { +func GetUserBindAuthInfo(db *DaoDB, userID string, bindType int, authID2 string, typeList []string) (authList []*model.AuthBind, err error) { sql := ` SELECT * FROM auth_bind t1 - WHERE t1.deleted_at = ? AND t1.status = ? AND t1.auth_id2 = ? AND t1.type IN (` + GenQuestionMarks(len(typeList)) + ")" - sqlParams := []interface{}{ - utils.DefaultTimeValue, - model.AuthBindStatusNormal, - authID2, - typeList, - } - err = GetRows(db, &authBinds, sql, sqlParams...) - return authBinds, err -} - -func GetUserBindAuthInfo(db *DaoDB, userID string) (authList []*model.AuthBind, err error) { - sql := ` - SELECT * - FROM auth_bind t1 - WHERE t1.deleted_at = ? AND t1.status = ? AND t1.user_id = ? - ` + WHERE t1.deleted_at = ? AND t1.status = ?` sqlParams := []interface{}{ utils.DefaultTimeValue, model.UserStatusNormal, - userID, } + if userID != "" { + sql += " AND t1.user_id = ?" + sqlParams = append(sqlParams, userID) + } + if bindType != model.AuthBindTypeAll { + sql += " AND t1.bind_type = ?" + sqlParams = append(sqlParams, bindType) + } + if authID2 != "" { + sql += " AND t1.auth_id2 = ?" + sqlParams = append(sqlParams, authID2) + } + if len(typeList) > 0 { + sql += " AND t1.type IN (" + GenQuestionMarks(len(typeList)) + ")" + sqlParams = append(sqlParams, typeList) + } + err = GetRows(db, &authList, sql, sqlParams...) return authList, err } diff --git a/business/model/dao/dao_user2.go b/business/model/dao/dao_user2.go index ca95345eb..5c9ba1b41 100644 --- a/business/model/dao/dao_user2.go +++ b/business/model/dao/dao_user2.go @@ -2,6 +2,7 @@ package dao import ( "fmt" + "time" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/model" @@ -64,3 +65,23 @@ func GetUsers(db *DaoDB, userType int, keyword string, userIDs []string, userID2 } return userList, totalCount, err } + +func DeleteUsers(db *DaoDB, userIDs []string) (num int64, err error) { + if len(userIDs) > 0 { + sql := ` + UPDATE user t1 + JOIN auth_bind t2 ON t2.user_id = t1.user_id + SET + t1.deleted_at = ?, + t2.deleted_at = ? + WHERE t1.user_id IN (` + GenQuestionMarks(len(userIDs)) + ");" + now := time.Now() + sqlParams := []interface{}{ + now, + now, + userIDs, + } + num, err = ExecuteSQL(db, sql, sqlParams...) + } + return num, err +} diff --git a/business/model/dao/store_sku.go b/business/model/dao/store_sku.go index 83c4b58d7..1a31217ae 100644 --- a/business/model/dao/store_sku.go +++ b/business/model/dao/store_sku.go @@ -176,6 +176,7 @@ func GetStoreCategories(db *DaoDB, vendorID, storeID int, level int) (cats []*Sk } // 以store_sku_bind为基础来做同步,正常情况下使用 +// !!! 此函数不要将store_sku_bind中的vendor_price取出来放到StoreSkuSyncInfo.VendorPrice中,因为之后会依赖这个VendorPrice进行重算 // 单多门店模式厂商通用 func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, isDirty bool) (skus []*StoreSkuSyncInfo, err error) { if vendorID < 0 { @@ -211,6 +212,11 @@ func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, isDirty bool) t5.%s_sync_status store_cat_sync_status, t5.%s_id vendor_cat_id, t5sku.%s_sync_status sku_store_cat_sync_status, t5sku.%s_id sku_vendor_cat_id` fmtParams = append(fmtParams, fieldPrefix, fieldPrefix, fieldPrefix, fieldPrefix) + } else { + sql += `, + t4.%s_id vendor_cat_id, + t5sku.%s_id sku_vendor_cat_id` + fmtParams = append(fmtParams, fieldPrefix, fieldPrefix) } sql += ` FROM store_sku_bind t1 @@ -236,6 +242,9 @@ func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, isDirty bool) LEFT JOIN store_sku_category_map t5 ON t4.id = t5.category_id AND t5.store_id = t1.store_id AND t5.deleted_at = ? LEFT JOIN store_sku_category_map t5sku ON t2.category_id = t5sku.category_id AND t5sku.store_id = t1.store_id AND t5sku.deleted_at = ?` sqlParams = append(sqlParams, utils.DefaultTimeValue, utils.DefaultTimeValue) + } else { + sql += ` + LEFT JOIN sku_category t5sku ON t5sku.id = t2.category_id` } sql += " WHERE 1 = 1" if storeID > 0 { @@ -532,4 +541,4 @@ func (s *StoreSkuSyncInfo) GetSeq() int { return s.Seq } return int(s.VendorPrice) - } \ No newline at end of file +} diff --git a/business/model/model.go b/business/model/model.go index dde6a51b9..d49ac05bc 100644 --- a/business/model/model.go +++ b/business/model/model.go @@ -67,24 +67,31 @@ type ModelIDCULD struct { DeletedAt time.Time `orm:"type(datetime);default('1970-01-01 00:00:00')" json:"deletedAt"` } -// flag按位表示,第一位表示修改,第二位表示新增,第三位表示删除 +// 同步标识掩码 const ( + // general SyncFlagModifiedMask = 1 SyncFlagNewMask = 2 SyncFlagDeletedMask = 4 - SyncFlagSaleMask = 8 // 改了门店商品可售状态必须设置此标志 - SyncFlagPriceMask = 16 // 改了门店商品价格必须设置此标志 - SyncFlagStockMask = 32 // 修改库存同步标识,当前只有多门店平台才会用到 - SyncFlagSpecMask = 64 // 原值32 - - SyncFlagStoreSkuOnlyMask = SyncFlagSaleMask | SyncFlagPriceMask - SyncFlagStoreSkuModifiedMask = SyncFlagStoreSkuOnlyMask | SyncFlagModifiedMask - SyncFlagChangedMask = SyncFlagSpecMask | SyncFlagNewMask | SyncFlagDeletedMask | SyncFlagStoreSkuModifiedMask - + // store only SyncFlagStoreName = 8 SyncFlagStoreAddress = 16 SyncFlagStoreStatus = 32 + + // sku only + SyncFlagSpecMask = 64 // 规格修改,原值32 + + // store sku only + SyncFlagSaleMask = 8 // 改了门店商品可售状态必须设置此标志 + SyncFlagPriceMask = 16 // 改了门店商品价格必须设置此标志 + SyncFlagStockMask = 32 // 修改库存同步标识,当前只有多门店平台才会用到 + SyncFlagSeqMask = 64 // 门店商家分类下的排序顺序 + + // combine + SyncFlagStoreSkuOnlyMask = SyncFlagSaleMask | SyncFlagPriceMask + SyncFlagStoreSkuModifiedMask = SyncFlagStoreSkuOnlyMask | SyncFlagModifiedMask + SyncFlagChangedMask = SyncFlagSpecMask | SyncFlagNewMask | SyncFlagDeletedMask | SyncFlagStoreSkuModifiedMask ) func IsSyncStatusNew(syncStatus int8) bool { @@ -107,6 +114,10 @@ func IsSyncStatusPrice(syncStatus int8) bool { return (syncStatus & SyncFlagPriceMask) != 0 } +func IsSyncStatusSec(syncStatus int8) bool { + return (syncStatus & SyncFlagSeqMask) != 0 +} + func IsSyncStatusNeedCreate(syncStatus int8) bool { return IsSyncStatusNew(syncStatus) && !IsSyncStatusDelete(syncStatus) } diff --git a/business/model/order.go b/business/model/order.go index 282cd7f1b..093283ce6 100644 --- a/business/model/order.go +++ b/business/model/order.go @@ -2,6 +2,12 @@ package model import "time" +const ( + OrderDeliveryTypePlatform = "platform" // 平台负责配送 + OrderDeliveryTypeStoreSelf = "store" // 门店自送 + OrderDeliveryTypeSelfTake = "self" // 用户自提 +) + type ModelTimeInfo struct { CreatedAt time.Time `orm:"auto_now_add;type(datetime)"` UpdatedAt time.Time `orm:"auto_now;type(datetime)"` @@ -44,6 +50,7 @@ type GoodsOrder struct { BusinessType int `json:"businessType"` ExpectedDeliveredTime time.Time `orm:"type(datetime)" json:"expectedDeliveredTime"` // 预期送达时间 CancelApplyReason string `orm:"size(255)" json:"-"` // ""表示没有申请,不为null表示用户正在取消申请 + DeliveryType string `orm:"size(32)" json:"deliveryType"` // 订单配送方式,缺省是平台配送 VendorWaybillID string `orm:"column(vendor_waybill_id);size(48)" json:"vendorWaybillID"` WaybillVendorID int `orm:"column(waybill_vendor_id)" json:"waybillVendorID"` // 表示当前承运商,-1表示还没有安排 DeliveryFlag int8 `json:"deliveryFlag"` // 第1位为1表示禁止调度器调度三方配送 @@ -53,9 +60,12 @@ type GoodsOrder struct { StatusTime time.Time `orm:"type(datetime)" json:"statusTime"` // last status time PickDeadline time.Time `orm:"type(datetime)" json:"pickDeadline"` ModelTimeInfo `json:"-"` - OriginalData string `orm:"-" json:"-"` // 只是用于传递数据 - Skus []*OrderSku `orm:"-" json:"-"` - Flag int `json:"flag"` //非运单调整相关的其它状态 + Flag int `json:"flag"` //非运单调整相关的其它状态 + + // 以下只是用于传递数据 + OriginalData string `orm:"-" json:"-"` + Skus []*OrderSku `orm:"-" json:"-"` + VendorUserID string `orm:"-" json:"-"` } func (o *GoodsOrder) TableUnique() [][]string { diff --git a/business/model/user.go b/business/model/user.go index 5b01f1dec..e8138d299 100644 --- a/business/model/user.go +++ b/business/model/user.go @@ -1,5 +1,7 @@ package model +import "git.rosy.net.cn/baseapi/utils" + const ( UserStatusNormal = 1 UserStatusDisabled = 2 @@ -24,24 +26,23 @@ var ( type User struct { ModelIDCULD - UserID string `orm:"size(48);column(user_id)" json:"userID" compact:"userID"` // 内部唯一标识 - UserID2 string `orm:"size(48);column(user_id2)" json:"userID2" compact:"userID2"` // 外部唯一标识(一般用于登录) - Name string `orm:"size(48);index" json:"name" compact:"name"` // 外部唯一显示 标识(一般用于显示) - Mobile string `orm:"size(32)" json:"mobile" compact:"mobile"` - Email string `orm:"size(32);index" json:"email" compact:"email"` - Status int8 `json:"status" compact:"status"` - Type int8 `json:"type" compact:"type"` // 用户类型 - IDCardNo string `orm:"size(18);column(id_card_no)" json:"idCardNo" compact:"idCardNo"` // 身份证号 - Remark string `orm:"size(255)" json:"remark"` + UserID string `orm:"size(48);column(user_id)" json:"userID" compact:"userID"` // 内部唯一标识 + UserID2 string `orm:"size(48);column(user_id2)" json:"userID2" compact:"userID2"` // 外部唯一标识(一般用于登录) + Name string `orm:"size(48);index" json:"name" compact:"name"` // 外部显示标识(当前可以重复) + Mobile *string `orm:"size(32);null" json:"mobile" compact:"mobile"` + Email *string `orm:"size(32);null" json:"email" compact:"email"` + Status int8 `json:"status" compact:"status"` + Type int8 `json:"type" compact:"type"` // 用户类型 + IDCardNo string `orm:"size(18);column(id_card_no)" json:"idCardNo" compact:"idCardNo"` // 身份证号 + Remark string `orm:"size(255)" json:"remark"` } func (*User) TableUnique() [][]string { return [][]string{ []string{"UserID"}, []string{"UserID2", "DeletedAt"}, - // []string{"Name", "DeletedAt"}, - []string{"Mobile"}, - // []string{"Email", "DeletedAt"}, + []string{"Mobile", "DeletedAt"}, + []string{"Email", "DeletedAt"}, // []string{"IDCardNo", "DeletedAt"}, } } @@ -55,11 +56,11 @@ func (user *User) GetID2() string { } func (user *User) GetMobile() string { - return user.Mobile + return utils.Pointer2String(user.Mobile) } func (user *User) GetEmail() string { - return user.Email + return utils.Pointer2String(user.Email) } func (user *User) GetName() string { diff --git a/business/partner/partner.go b/business/partner/partner.go index 6e106b42b..410431ed6 100644 --- a/business/partner/partner.go +++ b/business/partner/partner.go @@ -225,6 +225,13 @@ func GetPurchasePlatformFromVendorID(vendorID int) IPurchasePlatformHandler { return PurchasePlatformHandlers[vendorID] } +func GetPurchasePlatformVendorIDs() (vendorIDs []int) { + for k := range PurchasePlatformHandlers { + vendorIDs = append(vendorIDs, k) + } + return vendorIDs +} + func GetMultiStoreVendorIDs() (vendorIDs []int) { for k, v := range PurchasePlatformHandlers { if _, ok := v.(IMultipleStoresHandler); ok { diff --git a/business/partner/partner_order.go b/business/partner/partner_order.go index dae76ee03..99d290b67 100644 --- a/business/partner/partner_order.go +++ b/business/partner/partner_order.go @@ -5,6 +5,11 @@ import ( "git.rosy.net.cn/jx-callback/business/model" ) +type OrderPhoneNumberInfo struct { + VendorOrderID string + PhoneNumber string +} + type IPurchasePlatformOrderHandler interface { Map2Order(orderData map[string]interface{}) (order *model.GoodsOrder) GetOrder(vendorOrderID string) (order *model.GoodsOrder, err error) diff --git a/business/partner/partner_store_sku.go b/business/partner/partner_store_sku.go index 0a9f33b02..ef9c654a0 100644 --- a/business/partner/partner_store_sku.go +++ b/business/partner/partner_store_sku.go @@ -2,8 +2,9 @@ package partner import ( "math" - "time" "regexp" + "time" + "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" "git.rosy.net.cn/jx-callback/business/jxutils/tasksch" @@ -39,6 +40,7 @@ type StoreSkuInfo struct { Stock int `json:"stock,omitempty"` VendorPrice int64 `json:"price,omitempty"` Status int `json:"status,omitempty"` + Seq int `json:"seq,omitempty"` } type SkuInfo struct { @@ -94,6 +96,21 @@ func (l BareStoreSkuInfoList) GetSkuIDList() (skuIDList []int) { return skuIDList } +func (l BareStoreSkuInfoList) Len() int { + return len(l) +} + +func (l BareStoreSkuInfoList) Less(i, j int) bool { + if l[i].Seq != l[j].Seq { + return l[i].Seq < l[j].Seq + } + return l[i].VendorPrice < l[j].VendorPrice +} + +func (l BareStoreSkuInfoList) Swap(i, j int) { + l[i], l[j] = l[j], l[i] +} + type BareCategoryInfo struct { VendorCatID string `json:"vendorCatID"` @@ -141,6 +158,10 @@ type ISingleStoreStoreSkuHandler interface { GetSensitiveWordRegexp() *regexp.Regexp } +type IStoreSkuSorter interface { + ReorderStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, vendorCatID string, storeSkuList []*StoreSkuInfo) (err error) +} + func BuildSkuName(skuID int, vendorSkuID string) (skuName *SkuNameInfo) { return &SkuNameInfo{ SkuList: []*SkuInfo{ diff --git a/business/partner/purchase/ebai/order.go b/business/partner/purchase/ebai/order.go index 64e540018..06fa9f557 100644 --- a/business/partner/purchase/ebai/order.go +++ b/business/partner/purchase/ebai/order.go @@ -171,6 +171,7 @@ func (p *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *mo VendorStoreID: shopMap["baidu_shop_id"].(string), StoreID: int(utils.Str2Int64WithDefault(utils.Interface2String(shopMap["id"]), 0)), StoreName: shopMap["name"].(string), + VendorUserID: utils.Interface2String(userMap["user_id"]), ConsigneeName: userMap["name"].(string), ConsigneeMobile: jxutils.FormalizeMobile(userMap["phone"].(string)), ConsigneeAddress: userMap["address"].(string), diff --git a/business/partner/purchase/jd/act.go b/business/partner/purchase/jd/act.go index abb75b513..a9c3c96f7 100644 --- a/business/partner/purchase/jd/act.go +++ b/business/partner/purchase/jd/act.go @@ -300,7 +300,7 @@ func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITa func OnActMsg(msg *jdapi.CallbackOrderMsg) (retVal *jdapi.CallbackResponse) { jxutils.CallMsgHandler(func() { - retVal = curPurchaseHandler.onActMsg(msg) + retVal = CurPurchaseHandler.onActMsg(msg) }, jxutils.ComposeUniversalOrderID(msg.BillID, model.VendorIDJD)) return retVal } diff --git a/business/partner/purchase/jd/callback.go b/business/partner/purchase/jd/callback.go index 6b9b91d2f..0b29cd921 100644 --- a/business/partner/purchase/jd/callback.go +++ b/business/partner/purchase/jd/callback.go @@ -5,22 +5,22 @@ import ( ) func OnOrderMsg(msg *jdapi.CallbackOrderMsg) (retVal *jdapi.CallbackResponse) { - if curPurchaseHandler != nil { - retVal = curPurchaseHandler.OnOrderMsg(msg) + if CurPurchaseHandler != nil { + retVal = CurPurchaseHandler.OnOrderMsg(msg) } return retVal } func OnWaybillMsg(msg *jdapi.CallbackDeliveryStatusMsg) (retVal *jdapi.CallbackResponse) { - if curPurchaseHandler != nil { - retVal = curPurchaseHandler.OnWaybillMsg(msg) + if CurPurchaseHandler != nil { + retVal = CurPurchaseHandler.OnWaybillMsg(msg) } return retVal } func OnStoreMsg(msg *jdapi.CallbackOrderMsg) (retVal *jdapi.CallbackResponse) { - if curPurchaseHandler != nil { - retVal = curPurchaseHandler.OnStoreMsg(msg) + if CurPurchaseHandler != nil { + retVal = CurPurchaseHandler.OnStoreMsg(msg) } return retVal } diff --git a/business/partner/purchase/jd/financial.go b/business/partner/purchase/jd/financial.go index 96782346e..f95121baa 100644 --- a/business/partner/purchase/jd/financial.go +++ b/business/partner/purchase/jd/financial.go @@ -24,7 +24,7 @@ func (p *PurchaseHandler) onFinancialMsg(msg *jdapi.CallbackOrderMsg) (retVal *j if err = err2; err == nil { orderData, err2 := getAPI("").QuerySingleOrder(msg.BillID) if err = err2; err == nil { - orderFinancial, err2 := curPurchaseHandler.OrderDetail2Financial(orderData, false, order) + orderFinancial, err2 := CurPurchaseHandler.OrderDetail2Financial(orderData, false, order) if err = err2; err == nil { if msg.StatusID == jdapi.OrderStatusPayFinishedSettle { err = partner.CurOrderManager.SaveOrderFinancialInfo(orderFinancial, partner.CreatedPeration) @@ -39,7 +39,7 @@ func (p *PurchaseHandler) onFinancialMsg(msg *jdapi.CallbackOrderMsg) (retVal *j } else if msg.StatusID == jdapi.AfsServiceStateRefundSuccess || msg.StatusID == jdapi.AfsServiceStateReturnGoodsSuccess { // 如果是退款单 orderData, err2 := getAPI("").GetAfsService(msg.BillID) if err = err2; err == nil { - err = partner.CurOrderManager.SaveAfsOrderFinancialInfo(curPurchaseHandler.AfsOrderDetail2Financial(orderData)) + err = partner.CurOrderManager.SaveAfsOrderFinancialInfo(CurPurchaseHandler.AfsOrderDetail2Financial(orderData)) } } return jdapi.Err2CallbackResponse(nil, "jd OnFinancialMsg") // todo 强制返回成功 @@ -101,7 +101,7 @@ func (p *PurchaseHandler) OrderDetail2Financial(orderData map[string]interface{} } } // orderFinancial.DeliveryConfirmTime = utils.Str2TimeWithDefault(utils.Interface2String(orderData["deliveryConfirmTime"]), utils.DefaultTimeValue) - if utils.Interface2String(orderData["deliveryCarrierNo"]) == jdapi.SelfDeliveryCarrierNo { + if int(utils.Str2Int64WithDefault(utils.Interface2String(orderData["deliveryCarrierNo"]), 0)) == jdapi.CarrierNoSelfDelivery { // 如果为自配送,自配送补贴=订单初始运费,远距离费=0 orderFinancial.SelfDeliveryDiscountMoney = utils.MustInterface2Int64(orderData["orderReceivableFreight"]) orderFinancial.DistanceFreightMoney = 0 @@ -233,7 +233,7 @@ func (p *PurchaseHandler) AfsOrderDetail2Financial(orderData map[string]interfac func (p *PurchaseHandler) OnOrderDetail(orderDetail map[string]interface{}, peration string) (err error) { order, err := partner.CurOrderManager.LoadOrder(utils.Int64ToStr(utils.MustInterface2Int64(orderDetail["orderId"])), model.VendorIDJD) if err == nil { - orderFinancial, err2 := curPurchaseHandler.OrderDetail2Financial(orderDetail, true, order) + orderFinancial, err2 := CurPurchaseHandler.OrderDetail2Financial(orderDetail, true, order) if err = err2; err == nil { err = partner.CurOrderManager.SaveOrderFinancialInfo(orderFinancial, peration) } diff --git a/business/partner/purchase/jd/financial_test.go b/business/partner/purchase/jd/financial_test.go index d8a72aab1..cf93074cc 100644 --- a/business/partner/purchase/jd/financial_test.go +++ b/business/partner/purchase/jd/financial_test.go @@ -12,6 +12,6 @@ func TestOnFinancialMsg(t *testing.T) { BillID: "907315020000322", StatusID: "330902", } - res := curPurchaseHandler.onFinancialMsg(msg) + res := CurPurchaseHandler.onFinancialMsg(msg) fmt.Println(res) } diff --git a/business/partner/purchase/jd/jd.go b/business/partner/purchase/jd/jd.go index 18a89cdb1..17a370503 100644 --- a/business/partner/purchase/jd/jd.go +++ b/business/partner/purchase/jd/jd.go @@ -14,14 +14,14 @@ type PurchaseHandler struct { } var ( - curPurchaseHandler *PurchaseHandler + CurPurchaseHandler *PurchaseHandler ) func init() { globals.SugarLogger.Debug("init jd") if getAPI("") != nil { - curPurchaseHandler = new(PurchaseHandler) - partner.RegisterPurchasePlatform(curPurchaseHandler) + CurPurchaseHandler = new(PurchaseHandler) + partner.RegisterPurchasePlatform(CurPurchaseHandler) } } diff --git a/business/partner/purchase/jd/order.go b/business/partner/purchase/jd/order.go index e8e67e6ac..8829b8aae 100644 --- a/business/partner/purchase/jd/order.go +++ b/business/partner/purchase/jd/order.go @@ -2,6 +2,7 @@ package jd import ( "fmt" + "regexp" "strings" "time" @@ -34,6 +35,13 @@ var ( jdapi.OrderStatusLocked: model.OrderStatusLocked, jdapi.OrderStatusUnlocked: model.OrderStatusUnlocked, } + deliveryTypeMap = map[int]string{ + jdapi.CarrierNoCrowdSourcing: model.OrderDeliveryTypePlatform, + jdapi.CarrierNoSelfDelivery: model.OrderDeliveryTypeStoreSelf, + jdapi.CarrierNoSelfTake: model.OrderDeliveryTypeSelfTake, + } + + selfTakeCodeReg = regexp.MustCompile(`等待用户凭提货码(\d+)于`) ) func (c *PurchaseHandler) OnOrderMsg(msg *jdapi.CallbackOrderMsg) (retVal *jdapi.CallbackResponse) { @@ -130,18 +138,6 @@ func (c *PurchaseHandler) getOrder(orderID string) (order *model.GoodsOrder, ord if order != nil && orderSettlement != nil { updateOrderBySettleMent(order, orderSettlement) } - // if orderMap, err = getAPI("").QuerySingleOrder(orderID); err == nil { - // globals.SugarLogger.Debugf("jd getOrder2 orderID:%s", orderID) - // order = c.Map2Order(orderMap) - // if jxutils.IsMobileFake(order.ConsigneeMobile) { - // if realMobile, err := getAPI("").GetRealMobile4Order(orderID, order.VendorStoreID); err == nil { // 故意强制忽略取不到真实手机号错误 - // globals.SugarLogger.Debugf("jd getOrder3 orderID:%s", orderID) - // order.ConsigneeMobile2 = jxutils.FormalizeMobile(realMobile) - // } else { - // // globals.SugarLogger.Warnf("jd GetOrder orderID:%s, GetRealMobile4Order failed with error:%v", orderID, err2) - // } - // } - // } return order, orderMap, err } @@ -166,6 +162,7 @@ func (c *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *mo VendorStoreID: utils.Interface2String(result["produceStationNo"]), StoreID: int(utils.Str2Int64WithDefault(utils.Interface2String(result["produceStationNoIsv"]), 0)), StoreName: utils.Interface2String(result["produceStationName"]), + VendorUserID: utils.Interface2String(result["buyerPin"]), ConsigneeName: utils.Interface2String(result["buyerFullName"]), ConsigneeMobile: jxutils.FormalizeMobile(utils.Interface2String(result["buyerMobile"])), ConsigneeAddress: utils.Interface2String(result["buyerFullAddress"]), @@ -180,6 +177,7 @@ func (c *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *mo OriginalData: string(utils.MustMarshal(result)), ActualPayPrice: utils.MustInterface2Int64(result["orderBuyerPayableMoney"]), DistanceFreightMoney: utils.Interface2Int64WithDefault(result["merchantPaymentDistanceFreightMoney"], 0), + DeliveryType: deliveryTypeMap[int(utils.Str2Int64WithDefault(utils.Interface2String(result["deliveryCarrierNo"]), 0))], } order.Status = c.getStatusFromVendorStatus(order.VendorStatus) businessTage := utils.Interface2String(result["businessTag"]) @@ -471,3 +469,26 @@ func (c *PurchaseHandler) AddWaybillTip(ctx *jxcontext.Context, order *model.Goo } return err } + +func (c *PurchaseHandler) GetSelfTakeCode(ctx *jxcontext.Context, vendorOrderID string) (selfTakeCode string, err error) { + orderTrackList, err := getAPI("").GetByOrderNoForOaos(vendorOrderID) + if err == nil { + for _, v := range orderTrackList { + if v.TagCode == 180 { + searchResult := selfTakeCodeReg.FindStringSubmatch(v.MsgContent) + if searchResult != nil && len(searchResult[1]) > 0 { + selfTakeCode = searchResult[1] + } + break + } + } + } + return selfTakeCode, err +} + +func (c *PurchaseHandler) ConfirmSelfTake(ctx *jxcontext.Context, vendorOrderID, selfTakeCode string) (err error) { + if globals.EnableJdStoreWrite { + err = getAPI("").CheckSelfPickCode(selfTakeCode, vendorOrderID, ctx.GetUserName()) + } + return err +} diff --git a/business/partner/purchase/jd/order_test.go b/business/partner/purchase/jd/order_test.go index 23d54f2f7..c82bc71ed 100644 --- a/business/partner/purchase/jd/order_test.go +++ b/business/partner/purchase/jd/order_test.go @@ -16,7 +16,7 @@ func TestSwitch2SelfDeliver(t *testing.T) { orderID := "817540316000041" if order, err := partner.CurOrderManager.LoadOrder(orderID, model.VendorIDJD); err == nil { // globals.SugarLogger.Debug(order) - if err = curPurchaseHandler.Swtich2SelfDeliver(order, ""); err == nil { + if err = CurPurchaseHandler.Swtich2SelfDeliver(order, ""); err == nil { } else { t.Fatal(err.Error()) } @@ -26,16 +26,24 @@ func TestSwitch2SelfDeliver(t *testing.T) { } func TestGetOrder(t *testing.T) { - _, err := curPurchaseHandler.GetOrder("815536199000222") + _, err := CurPurchaseHandler.GetOrder("815536199000222") if err != nil { t.Fatal(err.Error()) } } func TestListOrders(t *testing.T) { - result, err := curPurchaseHandler.ListOrders(jxcontext.AdminCtx, nil, time.Now(), "") + result, err := CurPurchaseHandler.ListOrders(jxcontext.AdminCtx, nil, time.Now(), "") if err != nil { t.Fatal(err.Error()) } t.Log(utils.Format4Output(result, false)) } + +func TestGetSelfTakeCode(t *testing.T) { + selfTakeCode, err := CurPurchaseHandler.GetSelfTakeCode(jxcontext.AdminCtx, "921160248000222") + if err != nil { + t.Fatal(err.Error()) + } + t.Log(selfTakeCode) +} diff --git a/business/partner/purchase/jd/sku_test.go b/business/partner/purchase/jd/sku_test.go index f6093f32d..bbb28661b 100644 --- a/business/partner/purchase/jd/sku_test.go +++ b/business/partner/purchase/jd/sku_test.go @@ -17,7 +17,7 @@ func TestCreateSku(t *testing.T) { sku.ID = skuID dao.GetEntity(nil, sku) t.Log(sku) - // err := curPurchaseHandler.CreateSku(sku) + // err := CurPurchaseHandler.CreateSku(sku) // if err != nil { // t.Fatal(err.Error()) // } @@ -31,14 +31,14 @@ func TestUpdateSku(t *testing.T) { sku.ID = skuID dao.GetEntity(db, sku) - err := curPurchaseHandler.UpdateSku(db, sku, "autotest") + err := CurPurchaseHandler.UpdateSku(db, sku, "autotest") if err != nil { t.Fatal(err.Error()) } } func TestGetAllCategories(t *testing.T) { - result, err := curPurchaseHandler.GetAllCategories(jxcontext.AdminCtx, "") + result, err := CurPurchaseHandler.GetAllCategories(jxcontext.AdminCtx, "") if err != nil || len(result) == 0 { t.Fatal(err.Error()) } @@ -46,7 +46,7 @@ func TestGetAllCategories(t *testing.T) { } func TestReadSku(t *testing.T) { - skuName, err := curPurchaseHandler.ReadSku("2005582952") + skuName, err := CurPurchaseHandler.ReadSku("2005582952") t.Log(utils.Format4Output(skuName, false)) if err != nil { t.Fatal(err.Error()) @@ -58,7 +58,7 @@ func TestReadSku(t *testing.T) { } func TestGetVendorCategories(t *testing.T) { - catList, err := curPurchaseHandler.GetVendorCategories(jxcontext.AdminCtx) + catList, err := CurPurchaseHandler.GetVendorCategories(jxcontext.AdminCtx) if err != nil { t.Fatal(err.Error()) } @@ -66,7 +66,7 @@ func TestGetVendorCategories(t *testing.T) { } func TestGetSkus(t *testing.T) { - skuNameList, err := curPurchaseHandler.GetSkus(jxcontext.AdminCtx, 0, "2023747677", "") + skuNameList, err := CurPurchaseHandler.GetSkus(jxcontext.AdminCtx, 0, "2023747677", "") t.Log(utils.Format4Output(skuNameList, false)) t.Log(len(skuNameList)) if err != nil { diff --git a/business/partner/purchase/jd/store.go b/business/partner/purchase/jd/store.go index 86f08f361..7f063d4ff 100644 --- a/business/partner/purchase/jd/store.go +++ b/business/partner/purchase/jd/store.go @@ -394,7 +394,7 @@ func (c *PurchaseHandler) SyncQualify(ctx *jxcontext.Context, storeDetail *dao.S } expireStart, err := utils.TryStr2Time(licenceDetail.StartDate) if err != nil { - return fmt.Errorf("证照有效开始时间:%s非法,请手动处理", licenceDetail.StartDate) + return fmt.Errorf("执照有效开始时间:%s非法,请手动处理", licenceDetail.StartDate) } qualifyList = append(qualifyList, &jdapi.QualifyItem{ QualifyType: jdapi.QualifyTypeCompany, diff --git a/business/partner/purchase/jd/store_sku2.go b/business/partner/purchase/jd/store_sku2.go index 6ef9a9c6d..fc3d5f7d2 100644 --- a/business/partner/purchase/jd/store_sku2.go +++ b/business/partner/purchase/jd/store_sku2.go @@ -209,3 +209,17 @@ func (p *PurchaseHandler) SyncStoreProducts(ctx *jxcontext.Context, parentTask t } return hint, err } + +// func (p *PurchaseHandler) ReorderStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, vendorCatID string, storeSkuList []*partner.StoreSkuInfo) (err error) { +// storeSkuCount := len(storeSkuList) +// if storeSkuCount > 0 { +// if storeSkuCount > jdapi.MaxAddByStoreAndSkusCount { +// storeSkuList = storeSkuList[:jdapi.MaxAddByStoreAndSkusCount] +// } +// vendorSkuIDs := partner.BareStoreSkuInfoList(storeSkuList).GetVendorSkuIDIntList() +// if globals.EnableJdStoreWrite { +// err = getAPI("").AddByStoreAndSkus(utils.Str2Int64(vendorStoreID), vendorSkuIDs) +// } +// } +// return err +// } diff --git a/business/partner/purchase/jd/store_sku2_test.go b/business/partner/purchase/jd/store_sku2_test.go index 0fc71b453..a33571a08 100644 --- a/business/partner/purchase/jd/store_sku2_test.go +++ b/business/partner/purchase/jd/store_sku2_test.go @@ -19,13 +19,13 @@ func TestGetStoreSkusBareInfo(t *testing.T) { // for i := 0; i < 30-1; i++ { // list = append(list, list[0]) // } - skuNameList, err := curPurchaseHandler.GetSkus(jxcontext.AdminCtx, 0, "", "") + skuNameList, err := CurPurchaseHandler.GetSkus(jxcontext.AdminCtx, 0, "", "") if err != nil { t.Fatal(err) } list := putils.StoreSkuFullList2Bare(skuNameList) - storeSkuList, err := curPurchaseHandler.GetStoreSkusBareInfo(jxcontext.AdminCtx, nil, 2, "11053496", list) + storeSkuList, err := CurPurchaseHandler.GetStoreSkusBareInfo(jxcontext.AdminCtx, nil, 2, "11053496", list) if err != nil { t.Fatal(err.Error()) } diff --git a/business/partner/purchase/jd/store_test.go b/business/partner/purchase/jd/store_test.go index a18f80ec4..ae173c9c2 100644 --- a/business/partner/purchase/jd/store_test.go +++ b/business/partner/purchase/jd/store_test.go @@ -88,7 +88,7 @@ func TestSyncQualify(t *testing.T) { if err != nil { t.Fatal(err.Error()) } - err = curPurchaseHandler.SyncQualify(jxcontext.AdminCtx, storeDetail) + err = CurPurchaseHandler.SyncQualify(jxcontext.AdminCtx, storeDetail) if err != nil { t.Fatal(err.Error()) } diff --git a/business/partner/purchase/jx/jx.go b/business/partner/purchase/jx/jx.go index 3d1cca370..44673830f 100644 --- a/business/partner/purchase/jx/jx.go +++ b/business/partner/purchase/jx/jx.go @@ -19,7 +19,8 @@ func init() { globals.SugarLogger.Debug("init jx") if true { CurPurchaseHandler = new(PurchaseHandler) - partner.RegisterPurchasePlatform(CurPurchaseHandler) + // 不能注册京西 + // partner.RegisterPurchasePlatform(CurPurchaseHandler) } } diff --git a/business/partner/purchase/mtwm/callback.go b/business/partner/purchase/mtwm/callback.go index 19e6f8021..75fe0da21 100644 --- a/business/partner/purchase/mtwm/callback.go +++ b/business/partner/purchase/mtwm/callback.go @@ -6,24 +6,28 @@ import ( "git.rosy.net.cn/jx-callback/business/model" ) -func OnOrderCallbackMsg(msg *mtwmapi.CallbackMsg) (response *mtwmapi.CallbackResponse) { +func OnCallbackMsg(msg *mtwmapi.CallbackMsg) (response *mtwmapi.CallbackResponse) { if curPurchaseHandler != nil { - if orderID := GetOrderIDFromMsg(msg); orderID != "" { - jxutils.CallMsgHandler(func() { - switch msg.Cmd { - case mtwmapi.MsgTypeWaybillStatus: - response = curPurchaseHandler.onWaybillMsg(msg) - default: - response = curPurchaseHandler.onOrderMsg(msg) - } - }, jxutils.ComposeUniversalOrderID(orderID, model.VendorIDMTWM)) - } - /*if msg.Cmd == mtwmapi.MsgTypeOrderRefund || msg.Cmd == mtwmapi.MsgTypeOrderPartialRefund { - utils.CallFuncAsync(func() { - OnFinancialMsg(msg) - }) - } else */if msg.Cmd == mtwmapi.MsgTypeStoreStatusChanged { + if msg.Cmd == mtwmapi.MsgTypeStoreStatusChanged { response = curPurchaseHandler.onStoreStatusChanged(msg) + } else if msg.Cmd == mtwmapi.MsgTypePrivateNumberDowngrade { + response = curPurchaseHandler.onNumberDowngrade(msg) + } else { + if orderID := GetOrderIDFromMsg(msg); orderID != "" { + jxutils.CallMsgHandler(func() { + switch msg.Cmd { + case mtwmapi.MsgTypeWaybillStatus: + response = curPurchaseHandler.onWaybillMsg(msg) + default: + response = curPurchaseHandler.onOrderMsg(msg) + } + }, jxutils.ComposeUniversalOrderID(orderID, model.VendorIDMTWM)) + } + /*if msg.Cmd == mtwmapi.MsgTypeOrderRefund || msg.Cmd == mtwmapi.MsgTypeOrderPartialRefund { + utils.CallFuncAsync(func() { + OnFinancialMsg(msg) + }) + } */ } } return response diff --git a/business/partner/purchase/mtwm/order.go b/business/partner/purchase/mtwm/order.go index 4cd9e256b..442bd2245 100644 --- a/business/partner/purchase/mtwm/order.go +++ b/business/partner/purchase/mtwm/order.go @@ -15,6 +15,7 @@ import ( "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/business/partner" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" @@ -121,6 +122,10 @@ func (p *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *mo OriginalData: string(utils.MustMarshal(result)), ActualPayPrice: jxutils.StandardPrice2Int(utils.MustInterface2Float64(result["total"])), } + openUID := utils.Interface2Int64WithDefault(result["openUid"], 0) + if openUID > 0 { + order.VendorUserID = utils.Int64ToStr(openUID) + } if utils.IsTimeZero(order.PickDeadline) && !utils.IsTimeZero(order.StatusTime) { order.PickDeadline = order.StatusTime.Add(pickupOrderDelay) // 美团外卖要求在5分钟内拣货,不然订单会被取消 } @@ -382,7 +387,7 @@ func (c *PurchaseHandler) postFakeMsg(vendorOrderID, cmd, vendorStatus string) { msg.FormData.Set("timestamp", timeStr) msg.FormData.Set("utime", timeStr) utils.CallFuncAsync(func() { - OnOrderCallbackMsg(msg) + c.onOrderMsg(msg) }) } @@ -582,3 +587,112 @@ func (c *PurchaseHandler) ListOrders(ctx *jxcontext.Context, parentTask tasksch. // } // return err // } + +func (p *PurchaseHandler) GetOrderConsigneeNumber(ctx *jxcontext.Context, storeID int, vendorStoreID string) (numberList []*partner.OrderPhoneNumberInfo, err error) { + offset := 0 + for { + result, err2 := api.MtwmAPI.OrderBatchPullPhoneNumber(vendorStoreID, 0, mtwmapi.MaxBatchPullPhoneNumberLimit) + if err = err2; err == nil { + for _, v := range result { + v2 := &partner.OrderPhoneNumberInfo{ + VendorOrderID: utils.Int64ToStr(v.OrderID), + PhoneNumber: v.RealPhoneNumber, + } + if v2.PhoneNumber == "" { + v2.PhoneNumber = v.RealOrderPhoneNumber + } + numberList = append(numberList, v2) + } + if len(result) <= mtwmapi.MaxBatchPullPhoneNumberLimit { + break + } + offset += mtwmapi.MaxBatchPullPhoneNumberLimit + } else { + break + } + } + return numberList, err +} + +func (p *PurchaseHandler) GetOrderCourierNumber(ctx *jxcontext.Context, storeID int, vendorStoreID string) (numberList []*partner.OrderPhoneNumberInfo, err error) { + offset := 0 + for { + result, err2 := api.MtwmAPI.OrderGetRiderInfoPhoneNumber(vendorStoreID, 0, mtwmapi.MaxBatchPullPhoneNumberLimit) + if err = err2; err == nil { + for _, v := range result { + numberList = append(numberList, &partner.OrderPhoneNumberInfo{ + VendorOrderID: utils.Int64ToStr(v.OrderID), + PhoneNumber: v.RiderRealPhoneNumber, + }) + } + if len(result) <= mtwmapi.MaxBatchPullPhoneNumberLimit { + break + } + offset += mtwmapi.MaxBatchPullPhoneNumberLimit + } else { + break + } + } + return numberList, err +} + +func (p *PurchaseHandler) onNumberDowngrade(msg *mtwmapi.CallbackMsg) (response *mtwmapi.CallbackResponse) { + userNumberMap := make(map[string]*partner.OrderPhoneNumberInfo) + courierNumberMap := make(map[string]*partner.OrderPhoneNumberInfo) + orderMap := make(map[string]int) + ctx := jxcontext.AdminCtx + task := tasksch.NewParallelTask("美团外卖平台处理隐私号降级通知", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(true), ctx, + func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + step := batchItemList[0].(int) + switch step { + case 0: + userNumberList, err2 := p.GetOrderConsigneeNumber(ctx, 0, "") + if err = err2; err == nil { + for _, v := range userNumberList { + userNumberMap[v.VendorOrderID] = v + orderMap[v.VendorOrderID] = 1 + } + } + case 1: + courierNumberList, err2 := p.GetOrderCourierNumber(ctx, 0, "") + if err = err2; err == nil { + for _, v := range courierNumberList { + courierNumberMap[v.VendorOrderID] = v + orderMap[v.VendorOrderID] = 1 + } + } + case 2: + orderList := jxutils.StringMap2List(orderMap) + if len(orderList) > 0 { + updateTask := tasksch.NewParallelTask("美团外卖平台处理隐私号降级通知/处理订单", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(true), ctx, + func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + vendorOrderID := batchItemList[0].(string) + db := dao.GetDB() + if userNumberMap[vendorOrderID] != nil { + _, err = dao.UpdateEntityByKV(db, &model.GoodsOrder{}, map[string]interface{}{ + "ConsigneeMobile": userNumberMap[vendorOrderID].PhoneNumber, + "ConsigneeMobile2": userNumberMap[vendorOrderID].PhoneNumber, + }, map[string]interface{}{ + model.FieldVendorOrderID: vendorOrderID, + model.FieldVendorID: model.VendorIDMTWM, + }) + } + if courierNumberMap[vendorOrderID] != nil { + _, err = dao.UpdateEntityByKV(db, &model.Waybill{}, map[string]interface{}{ + "CourierMobile": courierNumberMap[vendorOrderID].PhoneNumber, + }, map[string]interface{}{ + "VendorWaybillID": vendorOrderID, + "WaybillVendorID": model.VendorIDMTWM, + }) + } + return retVal, err + }, orderList) + tasksch.HandleTask(updateTask, task, true).Run() + _, err = updateTask.GetResult(0) + } + } + return retVal, err + }, []int{0, 1, 2}) + tasksch.HandleTask(task, nil, true).Run() + return response +} diff --git a/business/partner/purchase/mtwm/waybill.go b/business/partner/purchase/mtwm/waybill.go index 39fa708cd..be3b39f66 100644 --- a/business/partner/purchase/mtwm/waybill.go +++ b/business/partner/purchase/mtwm/waybill.go @@ -42,7 +42,7 @@ func (c *PurchaseHandler) onWaybillMsg(msg *mtwmapi.CallbackMsg) (response *mtwm msg.FormData.Set(mtwmapi.KeyOrderID, waybill.VendorOrderID) msg.FormData.Set("status", mtwmapi.OrderStatusDelivering) utils.CallFuncAsync(func() { - OnOrderCallbackMsg(msg) + c.onOrderMsg(msg) }) } return mtwmapi.Err2CallbackResponse(err, "") diff --git a/controllers/cms_user2.go b/controllers/cms_user2.go index 5409dd0f3..9c8f21948 100644 --- a/controllers/cms_user2.go +++ b/controllers/cms_user2.go @@ -34,7 +34,7 @@ func (c *User2Controller) RegisterUser() { if err == nil { if err = jxutils.Strings2Objs(params.Payload, &user); err == nil { user.Type = 0 - retVal, err = cms.RegisterUser(&user, params.MobileVerifyCode, inAuthInfo) + retVal, err = cms.RegisterUserWithMobile(params.Ctx, &user, params.MobileVerifyCode, inAuthInfo) } } return retVal, errCode, err diff --git a/controllers/jx_order.go b/controllers/jx_order.go index 54dabfe9f..e568aed42 100644 --- a/controllers/jx_order.go +++ b/controllers/jx_order.go @@ -78,6 +78,22 @@ func (c *OrderController) SelfDelivered() { }) } +// @Title 自送送达 +// @Description 自送送达 +// @Param token header string true "认证token" +// @Param vendorOrderID formData string true "订单ID" +// @Param vendorID formData int true "订单所属的厂商ID" +// @Param selfTakeCode formData string true "自提码" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /ConfirmSelfTake [post] +func (c *OrderController) ConfirmSelfTake() { + c.callConfirmSelfTake(func(params *tOrderConfirmSelfTakeParams) (retVal interface{}, errCode string, err error) { + err = defsch.FixedScheduler.ConfirmSelfTake(params.Ctx, params.VendorOrderID, params.VendorID, params.SelfTakeCode) + return retVal, "", err + }) +} + // @Title 查询三方运单费用信息 // @Description 查询三方运单费用信息 // @Param token header string true "认证token" diff --git a/controllers/mtwm_callback.go b/controllers/mtwm_callback.go index 57aad950d..4bd0b4683 100644 --- a/controllers/mtwm_callback.go +++ b/controllers/mtwm_callback.go @@ -15,7 +15,7 @@ func (c *MtwmController) onCallbackMsg(msgType string) { c.Data["json"] = mtwmapi.Err2CallbackResponse(nil, "") msg, callbackResponse := api.MtwmAPI.GetCallbackMsg(c.Ctx.Request) if callbackResponse == nil { - callbackResponse = mtwm.OnOrderCallbackMsg(msg) + callbackResponse = mtwm.OnCallbackMsg(msg) if callbackResponse == nil { callbackResponse = mtwmapi.Err2CallbackResponse(nil, "") } diff --git a/controllers/temp_op.go b/controllers/temp_op.go index 8403e5c19..ca73868e1 100644 --- a/controllers/temp_op.go +++ b/controllers/temp_op.go @@ -1,16 +1,12 @@ package controllers import ( - "git.rosy.net.cn/baseapi/platformapi/ebaiapi" - "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/baseapi/platformapi/mtwmapi" "git.rosy.net.cn/jx-callback/business/jxstore/cms" "git.rosy.net.cn/jx-callback/business/jxstore/misc" "git.rosy.net.cn/jx-callback/business/jxstore/tempop" "git.rosy.net.cn/jx-callback/business/jxutils" - "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/api" + "git.rosy.net.cn/jx-callback/business/partner/purchase/mtwm" "github.com/astaxie/beego" ) @@ -247,29 +243,32 @@ func (c *TempOpController) RefreshMtpsWaybillFee() { // @router /TestIt [get] func (c *TempOpController) TestIt() { c.callTestIt(func(params *tTempopTestItParams) (retVal interface{}, errCode string, err error) { - // retVal, err = cms.OpenRemoteStoreByJxStatus(params.Ctx, nil, nil, false, true, true) - // shopList, err := api.EbaiAPI.ShopList(ebaiapi.SysStatusAll) - shopList, err := dao.GetStoresMapList(dao.GetDB(), []int{model.VendorIDEBAI}, nil, model.StoreStatusAll, model.StoreIsSyncYes, "") - task := tasksch.NewParallelTask("TestIt", nil, params.Ctx, - func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - // shopID := batchItemList[0].(*ebaiapi.ShopInfo).ShopID - shopID := utils.Int2Str(batchItemList[0].(*model.StoreMap).StoreID) - skuInfo, err := api.EbaiAPI.SkuList(shopID, &ebaiapi.SkuListParams{}) - if err == nil && skuInfo.Total > 500 { - errSkuCount := 0 - for _, sku := range skuInfo.List { - if sku.CustomCatIDs == "" { - errSkuCount++ - } - } - if errSkuCount > len(skuInfo.List)/3 { - retVal = []string{shopID} - } - } - return retVal, err - }, shopList) - task.Run() - retVal, err = task.GetResult(0) + // // retVal, err = cms.OpenRemoteStoreByJxStatus(params.Ctx, nil, nil, false, true, true) + // // shopList, err := api.EbaiAPI.ShopList(ebaiapi.SysStatusAll) + // shopList, err := dao.GetStoresMapList(dao.GetDB(), []int{model.VendorIDEBAI}, nil, model.StoreStatusAll, model.StoreIsSyncYes, "") + // task := tasksch.NewParallelTask("TestIt", nil, params.Ctx, + // func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + // // shopID := batchItemList[0].(*ebaiapi.ShopInfo).ShopID + // shopID := utils.Int2Str(batchItemList[0].(*model.StoreMap).StoreID) + // skuInfo, err := api.EbaiAPI.SkuList(shopID, &ebaiapi.SkuListParams{}) + // if err == nil && skuInfo.Total > 500 { + // errSkuCount := 0 + // for _, sku := range skuInfo.List { + // if sku.CustomCatIDs == "" { + // errSkuCount++ + // } + // } + // if errSkuCount > len(skuInfo.List)/3 { + // retVal = []string{shopID} + // } + // } + // return retVal, err + // }, shopList) + // task.Run() + // retVal, err = task.GetResult(0) + mtwm.OnCallbackMsg(&mtwmapi.CallbackMsg{ + Cmd: mtwmapi.MsgTypePrivateNumberDowngrade, + }) return retVal, "", err }) } diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index 5c0706daf..c6cd714d0 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -756,6 +756,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: "ConfirmSelfTake", + Router: `/ConfirmSelfTake`, + AllowHTTPMethods: []string{"post"}, + 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: "CreateWaybillOnProviders",