Merge remote-tracking branch 'origin/mark' into don
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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{}{
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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"`
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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{
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -12,6 +12,6 @@ func TestOnFinancialMsg(t *testing.T) {
|
||||
BillID: "907315020000322",
|
||||
StatusID: "330902",
|
||||
}
|
||||
res := curPurchaseHandler.onFinancialMsg(msg)
|
||||
res := CurPurchaseHandler.onFinancialMsg(msg)
|
||||
fmt.Println(res)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
// }
|
||||
|
||||
@@ -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())
|
||||
}
|
||||
|
||||
@@ -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())
|
||||
}
|
||||
|
||||
@@ -19,7 +19,8 @@ func init() {
|
||||
globals.SugarLogger.Debug("init jx")
|
||||
if true {
|
||||
CurPurchaseHandler = new(PurchaseHandler)
|
||||
partner.RegisterPurchasePlatform(CurPurchaseHandler)
|
||||
// 不能注册京西
|
||||
// partner.RegisterPurchasePlatform(CurPurchaseHandler)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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, "")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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, "")
|
||||
}
|
||||
|
||||
@@ -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
|
||||
})
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user