Merge remote-tracking branch 'origin/mark' into don

This commit is contained in:
Rosy-zhudan
2019-09-05 08:37:48 +08:00
47 changed files with 589 additions and 214 deletions

View File

@@ -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)
}

View File

@@ -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

View File

@@ -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,

View File

@@ -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
}

View File

@@ -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

View File

@@ -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
}

View File

@@ -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 {

View File

@@ -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{}{

View File

@@ -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

View File

@@ -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)

View File

@@ -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")
}

View File

@@ -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
}

View File

@@ -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)

View File

@@ -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")
}
}

View File

@@ -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
}

View File

@@ -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"`

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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)
}
}

View File

@@ -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)
}

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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)

View File

@@ -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{

View File

@@ -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),

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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)
}

View File

@@ -12,6 +12,6 @@ func TestOnFinancialMsg(t *testing.T) {
BillID: "907315020000322",
StatusID: "330902",
}
res := curPurchaseHandler.onFinancialMsg(msg)
res := CurPurchaseHandler.onFinancialMsg(msg)
fmt.Println(res)
}

View File

@@ -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)
}
}

View File

@@ -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
}

View File

@@ -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)
}

View File

@@ -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 {

View File

@@ -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,

View File

@@ -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
// }

View File

@@ -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())
}

View File

@@ -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())
}

View File

@@ -19,7 +19,8 @@ func init() {
globals.SugarLogger.Debug("init jx")
if true {
CurPurchaseHandler = new(PurchaseHandler)
partner.RegisterPurchasePlatform(CurPurchaseHandler)
// 不能注册京西
// partner.RegisterPurchasePlatform(CurPurchaseHandler)
}
}

View File

@@ -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

View File

@@ -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
}

View File

@@ -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, "")

View File

@@ -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

View File

@@ -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"

View File

@@ -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, "")
}

View File

@@ -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
})
}

View File

@@ -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",