tijiao
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1,3 +1,5 @@
|
||||
*.code-workspace
|
||||
|
||||
jx-callback
|
||||
*.tmp
|
||||
swagger/
|
||||
|
||||
@@ -288,6 +288,7 @@ func BindUser(inauthInfo *AuthInfo, user IUser) (outauthInfo *AuthInfo, err erro
|
||||
|
||||
// 添加新绑定
|
||||
func AddAuthBind(user IUser, newAuthInfo *AuthInfo) (err error) {
|
||||
globals.SugarLogger.Debugf("AddAuthBind user:%s, newAuthInfo:%s", utils.Format4Output(user, true), utils.Format4Output(newAuthInfo, true))
|
||||
if user == nil || newAuthInfo == nil {
|
||||
return ErrInternalErrror
|
||||
}
|
||||
@@ -312,6 +313,7 @@ func AddAuthBind(user IUser, newAuthInfo *AuthInfo) (err error) {
|
||||
}
|
||||
|
||||
func UnbindAuth(userID, authType, userName string) (err error) {
|
||||
globals.SugarLogger.Debugf("UnbindAuth userID:%s, authType:%s, userName:%s", userID, authType, userName)
|
||||
if handler := authers[authType]; handler != nil {
|
||||
err = handler.UnbindAuth(userID, authType, userName)
|
||||
} else {
|
||||
|
||||
@@ -36,6 +36,7 @@ func (a *DefAuther) AddAuthBind(authBindEx *auth2.AuthBindEx, userName string) (
|
||||
}
|
||||
|
||||
func (a *DefAuther) UnbindAuth(userID, authType, userName string) (err error) {
|
||||
globals.SugarLogger.Debugf("DefAuther.UnbindAuth userID:%s, authType:%s, userName:%s", userID, authType, userName)
|
||||
_, err = dao.DeleteEntityLogically(nil, &model.AuthBind{}, nil, userName, map[string]interface{}{
|
||||
"UserID": userID,
|
||||
"Type": authType,
|
||||
@@ -59,6 +60,8 @@ func (a *DefAuther) GetUserType() (userType int8) {
|
||||
|
||||
// 此函数用于联合(通过unionID)查找用户
|
||||
func (a *DefAuther) UnionFindAuthBind(curAuthType string, unionAuthTypeList []string, openID, unionID string, authDetail interface{}) (authBindEx *auth2.AuthBindEx, err error) {
|
||||
globals.SugarLogger.Debugf("UnionFindAuthBind curAuthType:%s, unionAuthTypeList:%v, openID:%s, unionID:%s, authDetail:%s",
|
||||
curAuthType, unionAuthTypeList, openID, unionID, utils.Format4Output(authDetail, true))
|
||||
db := dao.GetDB()
|
||||
var authBind *model.AuthBind
|
||||
if authBind, err = dao.GetAuthBind(db, model.AuthBindTypeAuth, curAuthType, openID); err == nil { // 直接找到了
|
||||
|
||||
68
business/cs/weimob_order.go
Normal file
68
business/cs/weimob_order.go
Normal file
@@ -0,0 +1,68 @@
|
||||
package cs
|
||||
|
||||
import (
|
||||
"git.rosy.net.cn/baseapi/platformapi/weimobapi"
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/business/jxstore/cms"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||
"git.rosy.net.cn/jx-callback/globals"
|
||||
"git.rosy.net.cn/jx-callback/globals/api"
|
||||
)
|
||||
|
||||
const (
|
||||
minCSOrderPayment = 0 // 供货订单的最小金额
|
||||
maxUnitPrice = 3000 // 为防止误填单价,限制单价最高
|
||||
)
|
||||
|
||||
func OnCallbackMsg(msg *weimobapi.CallbackMsg) (response *weimobapi.CallbackResponse) {
|
||||
orderID := utils.Int64ToStr(msg.OrderNo)
|
||||
jxutils.CallMsgHandler(func() {
|
||||
response = onOrderMsg(msg)
|
||||
}, jxutils.ComposeUniversalOrderID(orderID, model.VendorIDWSC))
|
||||
return response
|
||||
}
|
||||
|
||||
func onOrderMsg(msg *weimobapi.CallbackMsg) (response *weimobapi.CallbackResponse) {
|
||||
if msg.Event == weimobapi.MsgEventOrderStatusChange {
|
||||
if orderDetail, err := api.WeimobAPI.QueryOrderDetail2(msg.OrderNo, false); err == nil {
|
||||
if orderDetail.OrderStatus == weimobapi.OrderStatusFinished && orderDetail.PaymentAmount >= minCSOrderPayment {
|
||||
changeStoreSkusByOrder(orderDetail)
|
||||
}
|
||||
}
|
||||
}
|
||||
return response
|
||||
}
|
||||
|
||||
func changeStoreSkusByOrder(order *weimobapi.OrderDetail) {
|
||||
receiverMobile := order.DeliveryDetail.LogisticsDeliveryDetail.ReceiverMobile
|
||||
storeList, err := dao.GetStoreList(dao.GetDB(), nil, []string{receiverMobile}, "")
|
||||
if err != nil {
|
||||
if len(storeList) == 1 {
|
||||
var skuBindInfos []*cms.StoreSkuBindInfo
|
||||
storeID := storeList[0].ID
|
||||
for _, v := range order.ItemList {
|
||||
nameID := int(utils.Str2Int64WithDefault(v.SkuCode, 0))
|
||||
unitPrice := v.OriginalPrice
|
||||
if nameID > 0 && (unitPrice > 0 && unitPrice < maxUnitPrice) {
|
||||
skuBindInfos = append(skuBindInfos, &cms.StoreSkuBindInfo{
|
||||
StoreID: storeID,
|
||||
NameID: nameID,
|
||||
UnitPrice: int(jxutils.StandardPrice2Int(unitPrice)),
|
||||
IsFocus: 1,
|
||||
IsSale: 1,
|
||||
})
|
||||
} else {
|
||||
globals.SugarLogger.Infof("[运营],微商城订单:%s,商品:%s没有设置正确的SkuName编码或单价,当前商家编码:%s,市场价:%s", order.OrderNo, v.SkuNum, v.SkuCode, jxutils.IntPrice2StandardString(jxutils.StandardPrice2Int(unitPrice)))
|
||||
}
|
||||
}
|
||||
if len(skuBindInfos) > 0 {
|
||||
cms.UpdateStoreSkus(jxcontext.NewWithUserName(nil, utils.LimitStringLen(utils.Int64ToStr(order.OrderNo), 32), nil, nil), storeID, skuBindInfos, true, true)
|
||||
}
|
||||
} else {
|
||||
globals.SugarLogger.Infof("[运营],微商城订单:%s,手机:%s找不到唯一一个京西门店%d", order.OrderNo, receiverMobile, len(storeList))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -11,6 +11,7 @@ import (
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||||
"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"
|
||||
"github.com/astaxie/beego/orm"
|
||||
)
|
||||
@@ -151,6 +152,17 @@ func (c *OrderManager) OnOrderAdjust(order *model.GoodsOrder, orderStatus *model
|
||||
}
|
||||
|
||||
func (c *OrderManager) OnOrderStatusChanged(orderStatus *model.OrderStatus) (err error) {
|
||||
// 有些平台(比如美团外卖),在新订单事件没有成功返回,但在重发订单消息前,订单状态转换,则不会再重发新订单事件,特殊处理一下
|
||||
if orderStatus.Status == model.OrderStatusAccepted {
|
||||
if _, err2 := c.LoadOrder(orderStatus.VendorOrderID, orderStatus.VendorID); err2 == ErrCanNotFindOrder {
|
||||
if handler := partner.GetPurchaseOrderHandlerFromVendorID(orderStatus.VendorID); handler != nil {
|
||||
if order, err2 := handler.GetOrder(orderStatus.VendorOrderID); err2 == nil {
|
||||
c.OnOrderNew(order, orderStatus)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
db := dao.GetDB()
|
||||
dao.Begin(db)
|
||||
defer func() {
|
||||
@@ -385,37 +397,19 @@ func (c *OrderManager) updateOrderOtherInfo(order *model.GoodsOrder, db *dao.Dao
|
||||
globals.SugarLogger.Debugf("updateOrderOtherInfo orderID:%s, VendorStoreID:%s", order.VendorOrderID, order.VendorStoreID)
|
||||
|
||||
payPercentage := 0
|
||||
if order.VendorID != model.VendorIDJX {
|
||||
storeDetail, err := dao.GetStoreDetailByVendorStoreID(db, order.VendorStoreID, order.VendorID)
|
||||
if err != nil {
|
||||
if !dao.IsNoRowsError(err) {
|
||||
globals.SugarLogger.Warnf("updateOrderOtherInfo GetStoreDetailByVendorStoreID orderID:%s, VendorStoreID:%s, error:%v", order.VendorOrderID, order.VendorStoreID, err)
|
||||
return err
|
||||
}
|
||||
if time.Now().Sub(order.OrderCreatedAt) < 1*time.Hour {
|
||||
globals.SugarLogger.Infof("updateOrderOtherInfo [运营]订单在京西与平台都找不到京西门店信息,订单:%s,平台门店ID:%s,平台:%s", order.VendorOrderID, order.VendorStoreID, model.VendorChineseNames[order.VendorID])
|
||||
}
|
||||
err = nil
|
||||
} else {
|
||||
order.JxStoreID = storeDetail.Store.ID
|
||||
payPercentage = storeDetail.PayPercentage
|
||||
storeDetail, err := dao.GetStoreDetailByVendorStoreID(db, order.VendorStoreID, order.VendorID)
|
||||
if err != nil {
|
||||
if !dao.IsNoRowsError(err) {
|
||||
globals.SugarLogger.Warnf("updateOrderOtherInfo GetStoreDetailByVendorStoreID orderID:%s, VendorStoreID:%s, error:%v", order.VendorOrderID, order.VendorStoreID, err)
|
||||
return err
|
||||
}
|
||||
if time.Now().Sub(order.OrderCreatedAt) < 1*time.Hour {
|
||||
globals.SugarLogger.Infof("updateOrderOtherInfo [运营]订单在京西与平台都找不到京西门店信息,订单:%s,平台门店ID:%s,平台:%s", order.VendorOrderID, order.VendorStoreID, model.VendorChineseNames[order.VendorID])
|
||||
}
|
||||
err = nil
|
||||
} else {
|
||||
store := &model.Store{}
|
||||
store.ID = order.StoreID
|
||||
if err = dao.GetEntity(dao.GetDB(), store); err != nil {
|
||||
if !dao.IsNoRowsError(err) {
|
||||
globals.SugarLogger.Warnf("updateOrderOtherInfo GetEntity orderID:%s, VendorStoreID:%s, error:%v", order.VendorOrderID, order.VendorStoreID, err)
|
||||
return err
|
||||
}
|
||||
if time.Now().Sub(order.OrderCreatedAt) < 1*time.Hour {
|
||||
globals.SugarLogger.Infof("updateOrderOtherInfo b, [运营]订单在京西与平台都找不到京西门店信息,订单:%s,平台门店ID:%s,平台:%s", order.VendorOrderID, order.VendorStoreID, model.VendorChineseNames[order.VendorID])
|
||||
}
|
||||
err = nil
|
||||
} else {
|
||||
payPercentage = store.PayPercentage
|
||||
}
|
||||
order.JxStoreID = order.StoreID
|
||||
order.JxStoreID = storeDetail.Store.ID
|
||||
payPercentage = storeDetail.PayPercentage
|
||||
}
|
||||
if err = c.updateOrderSkuOtherInfo(order, db, payPercentage); err == nil {
|
||||
jxutils.RefreshOrderSkuRelated(order)
|
||||
|
||||
@@ -96,7 +96,7 @@ func (c *OrderManager) GetOrderSkuInfo(ctx *jxcontext.Context, vendorOrderID str
|
||||
IF(t1.shop_price = 0, t1.sale_price, t1.shop_price) shop_price,
|
||||
t1.sale_price,
|
||||
t1.earning_price,
|
||||
CAST(IF(t1.earning_price <> 0, t1.earning_price, IF(t1.shop_price <> 0 && t1.shop_price < t1.sale_price, t1.shop_price, t1.sale_price) * IF(t5.pay_percentage > 0, t5.pay_percentage, %d) / 100) AS SIGNED) real_earning_price,
|
||||
CAST(IF(t1.earning_price <> 0, t1.earning_price, IF(t1.shop_price <> 0 && t1.shop_price < t1.sale_price, t1.shop_price, t1.sale_price) * IF(t5.pay_percentage > 0, t5.pay_percentage, ?) / 100) AS SIGNED) real_earning_price,
|
||||
t1.weight,
|
||||
t1.sku_type,
|
||||
t1.promotion_type,
|
||||
@@ -105,18 +105,17 @@ func (c *OrderManager) GetOrderSkuInfo(ctx *jxcontext.Context, vendorOrderID str
|
||||
t1.store_sub_name,
|
||||
t1.vendor_price,
|
||||
%s full_sku_name,
|
||||
`, model.DefaultEarningPricePercentage, fullSkuNameSQL)
|
||||
db := dao.GetDB()
|
||||
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
|
||||
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 = ?*/
|
||||
WHERE t1.vendor_order_id = ? AND t1.vendor_id = ?
|
||||
ORDER BY t1.sku_name
|
||||
`, /*, utils.DefaultTimeValue, utils.DefaultTimeValue*/ vendorOrderID, vendorID)
|
||||
t2.name_id,
|
||||
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
|
||||
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 = ?*/
|
||||
WHERE t1.vendor_order_id = ? AND t1.vendor_id = ?
|
||||
ORDER BY t1.sku_name
|
||||
`, fullSkuNameSQL)
|
||||
err = dao.GetRows(dao.GetDB(), &skus, sql /*, utils.DefaultTimeValue, utils.DefaultTimeValue*/, model.DefaultEarningPricePercentage, vendorOrderID, vendorID)
|
||||
if err != nil {
|
||||
globals.SugarLogger.Infof("GetOrderSkuInfo orderID:%s vendorID:%d failed with error:%v", vendorOrderID, vendorID, err)
|
||||
return nil, err
|
||||
|
||||
@@ -174,12 +174,14 @@ func init() {
|
||||
partner.CurOrderManager.OnOrderMsg(order, "自动接单失败", err.Error())
|
||||
// 为了解决京东新消息与接单消息乱序的问题
|
||||
if errWithCode, ok := err.(*utils.ErrorWithCode); ok && errWithCode.Level() == 1 && errWithCode.IntCode() == -1 {
|
||||
if order2, err2 := partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID).GetOrder(order.VendorOrderID); err2 == nil && order2.Status > order.Status {
|
||||
order.Status = order2.Status
|
||||
jxutils.CallMsgHandlerAsync(func() {
|
||||
sch.OnOrderStatusChanged(order, model.Order2Status(order2), false)
|
||||
}, jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID))
|
||||
err = nil
|
||||
if order2, err2 := partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID).GetOrder(order.VendorOrderID); err2 == nil {
|
||||
if order2.Status > order.Status {
|
||||
order.Status = order2.Status
|
||||
jxutils.CallMsgHandlerAsync(func() {
|
||||
sch.OnOrderStatusChanged(order, model.Order2Status(order2), false)
|
||||
}, jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID))
|
||||
err = nil
|
||||
}
|
||||
} else {
|
||||
err = err2
|
||||
}
|
||||
|
||||
@@ -94,7 +94,7 @@ func (s *DefScheduler) isPossibleSwitch2SelfDelivery(order *model.GoodsOrder) (e
|
||||
if scheduler.StoreDeliveryTypeByStore != s.GetStoreDeliveryType(order, nil) {
|
||||
if order.Status < model.OrderStatusFinishedPickup {
|
||||
err = fmt.Errorf("拣货完成后才能转自配送")
|
||||
} else if order.Status >= model.OrderStatusFinishedPickup && order.Status < model.OrderStatusDelivering {
|
||||
} else if order.Status == model.OrderStatusFinishedPickup {
|
||||
if time.Now().Sub(order.StatusTime) < minMinute2Schedule3rdCarrier*time.Minute {
|
||||
err = fmt.Errorf("非自配送门店转3方配送至少要求拣货完成后%d分钟才能操作", minMinute2Schedule3rdCarrier)
|
||||
}
|
||||
@@ -102,7 +102,7 @@ func (s *DefScheduler) isPossibleSwitch2SelfDelivery(order *model.GoodsOrder) (e
|
||||
if model.IsOrderHaveOwnWaybill(order) {
|
||||
err = fmt.Errorf("%s物流已在配送中,不能转自配送", jxutils.GetVendorName(order.VendorID))
|
||||
}
|
||||
} else {
|
||||
} else if order.Status >= model.OrderStatusEndBegin {
|
||||
err = fmt.Errorf("订单%s已经结束,请刷新状态", order.VendorOrderID)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ import (
|
||||
const (
|
||||
DefActSkuStock = 200 // 缺省活动库存
|
||||
|
||||
maxDiscount4SkuSecKill = 99
|
||||
maxDiscount4SkuSecKill = 80
|
||||
minDiscount4SkuDirectDown = 0
|
||||
)
|
||||
|
||||
|
||||
@@ -298,14 +298,22 @@ func CompareJxAndVendor(vendorID int, storeIDStr, vendorStoreID, storeName strin
|
||||
}
|
||||
}
|
||||
for skuID, vendorSkuInfo := range filterVendorSkuInfoMap {
|
||||
skuIDStr := utils.Int2Str(skuID)
|
||||
vendorSkuDetailName := vendorSkuInfo.SkuList[0].SkuName
|
||||
vendorSkuSaleStatusName := GetSkuSaleStatusName(vendorSkuInfo.SkuList[0].Status)
|
||||
if vendorSkuInfo != nil {
|
||||
if len(vendorSkuInfo.SkuList) > 0 {
|
||||
skuIDStr := utils.Int2Str(skuID)
|
||||
vendorSkuDetailName := vendorSkuInfo.SkuList[0].SkuName
|
||||
vendorSkuSaleStatusName := GetSkuSaleStatusName(vendorSkuInfo.SkuList[0].Status)
|
||||
|
||||
jxSkuInfo := filterJxSkuInfoMap[skuID]
|
||||
if jxSkuInfo == nil {
|
||||
outPutData := DiffData{storeIDStr, vendorStoreID, storeName, skuIDStr, "", "", "", "", vendorSkuDetailName, "", vendorSkuSaleStatusName, DatAanalyse1}
|
||||
diffData.AppendData(vendorID, outPutData)
|
||||
jxSkuInfo := filterJxSkuInfoMap[skuID]
|
||||
if jxSkuInfo == nil {
|
||||
outPutData := DiffData{storeIDStr, vendorStoreID, storeName, skuIDStr, "", "", "", "", vendorSkuDetailName, "", vendorSkuSaleStatusName, DatAanalyse1}
|
||||
diffData.AppendData(vendorID, outPutData)
|
||||
}
|
||||
} else {
|
||||
globals.SugarLogger.Warnf("CompareJxAndVendor vendorSkuInfo.SkuList:%d is nil", skuID)
|
||||
}
|
||||
} else {
|
||||
globals.SugarLogger.Warnf("CompareJxAndVendor skuID:%d is nil", skuID)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -364,7 +372,7 @@ func CheckSkuDiffBetweenJxAndVendor(ctx *jxcontext.Context, vendorIDList []int,
|
||||
allSkuInfoList := GetMultiStoreAllSkuInfoList(vendorID)
|
||||
skuBareInfoList, err := singleStoreHandler.GetStoreSkusBareInfo(ctx, task, storeID, vendorStoreID, allSkuInfoList)
|
||||
if err != nil {
|
||||
baseapi.SugarLogger.Errorf("CheckSkuDiffBetweenJxAndVendor GetStoreSkusBareInfo error:%v", err)
|
||||
baseapi.SugarLogger.Infof("CheckSkuDiffBetweenJxAndVendor GetStoreSkusBareInfo error:%v", err)
|
||||
} else if len(skuBareInfoList) > 0 {
|
||||
filterSkuInfoMap := GetFilterMultiStoreSkuInfoMap(vendorID, skuBareInfoList) //map[京东商品ID:SkuNameInfo]
|
||||
CompareJxAndVendor(vendorID, storeIDStr, vendorStoreID, storeName, filterJxSkuInfoMap, filterSkuInfoMap)
|
||||
@@ -373,7 +381,7 @@ func CheckSkuDiffBetweenJxAndVendor(ctx *jxcontext.Context, vendorIDList []int,
|
||||
singleStoreHandler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler)
|
||||
vendorSkuInfoList, err := singleStoreHandler.GetStoreSkusFullInfo(ctx, task, storeID, vendorStoreID, nil)
|
||||
if err != nil {
|
||||
baseapi.SugarLogger.Errorf("CheckSkuDiffBetweenJxAndVendor GetStoreSkusFullInfo error:%v", err)
|
||||
baseapi.SugarLogger.Infof("CheckSkuDiffBetweenJxAndVendor GetStoreSkusFullInfo error:%v", err)
|
||||
} else if len(vendorSkuInfoList) > 0 {
|
||||
filterVendorSkuInfoMap := GetFilterVendorSkuInfoMap(vendorSkuInfoList) //map[平台商品ID:SkuNameInfo]
|
||||
CompareJxAndVendor(vendorID, storeIDStr, vendorStoreID, storeName, filterJxSkuInfoMap, filterVendorSkuInfoMap)
|
||||
|
||||
@@ -232,7 +232,7 @@ func (v *VendorSync) SyncSku(ctx *jxcontext.Context, db *dao.DaoDB, nameID, skuI
|
||||
|
||||
func (v *VendorSync) SyncSkus(ctx *jxcontext.Context, db *dao.DaoDB, nameIDs []int, skuIDs []int, isAsync, isContinueWhenError bool, userName string) (hint string, err error) {
|
||||
globals.SugarLogger.Debugf("SyncSku trackInfo:%s, nameIDs:%v, skuIDs:%v, userName:%s", ctx.GetTrackInfo(), nameIDs, skuIDs, userName)
|
||||
isManagedIt := len(nameIDs) > 1 || len(nameIDs) == 0 || len(skuIDs) > 1 || len(skuIDs) == 0
|
||||
isManagedIt := !(len(nameIDs) > 0 && len(nameIDs) <= 2 || len(skuIDs) > 0 && len(skuIDs) < 8)
|
||||
return v.LoopMultiStoresVendors(ctx, db, fmt.Sprintf("同步商品信息, nameIDs:%v, skuIDs:%v", nameIDs, skuIDs), isAsync, isManagedIt,
|
||||
func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) {
|
||||
var resultList []interface{}
|
||||
@@ -358,7 +358,7 @@ func (v *VendorSync) SyncStoresCategory(ctx *jxcontext.Context, db *dao.DaoDB, v
|
||||
}
|
||||
|
||||
//
|
||||
func (v *VendorSync) SyncStoresSkus2(ctx *jxcontext.Context, db *dao.DaoDB, vendorIDs []int, storeIDs, skuIDs, excludeSkuIDs []int, setSyncStatus int, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||
func (v *VendorSync) SyncStoresSkus2(ctx *jxcontext.Context, db *dao.DaoDB, vendorIDs []int, storeIDs []int, syncDisabled bool, skuIDs, excludeSkuIDs []int, setSyncStatus int, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||
globals.SugarLogger.Debug("SyncStoresSkus2")
|
||||
isManageIt := len(storeIDs) != 1 || len(skuIDs) == 0 || len(skuIDs) > 8
|
||||
task, hint, err := v.LoopStoresMap2(ctx, db, fmt.Sprintf("同步门店商品信息:%v", storeIDs), isAsync, isManageIt, vendorIDs, storeIDs,
|
||||
@@ -373,11 +373,13 @@ func (v *VendorSync) SyncStoresSkus2(ctx *jxcontext.Context, db *dao.DaoDB, vend
|
||||
tasksch.NewParallelConfig().SetParallelCount(parallelCount).SetIsContinueWhenError(isContinueWhenError), ctx,
|
||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||
storeMap := batchItemList[0].(*model.StoreMap)
|
||||
if setSyncStatus != 0 {
|
||||
dao.SetStoreSkuSyncStatus(db, storeMap.VendorID, []int{storeMap.StoreID}, skuIDs, setSyncStatus)
|
||||
}
|
||||
if _, err = v.proxySyncStoreSku(ctx, task, storeMap, nil, skuIDs, excludeSkuIDs, false, isContinueWhenError); err != nil {
|
||||
globals.SugarLogger.Debugf("SyncStoresSkus2 failed2 store:%d failed with error:%v", storeMap.StoreID, err)
|
||||
if syncDisabled || storeMap.Status > model.StoreStatusDisabled {
|
||||
if setSyncStatus != 0 {
|
||||
dao.SetStoreSkuSyncStatus(db, storeMap.VendorID, []int{storeMap.StoreID}, skuIDs, setSyncStatus)
|
||||
}
|
||||
if _, err = v.proxySyncStoreSku(ctx, task, storeMap, nil, skuIDs, excludeSkuIDs, false, isContinueWhenError); err != nil {
|
||||
globals.SugarLogger.Debugf("SyncStoresSkus2 failed2 store:%d failed with error:%v", storeMap.StoreID, err)
|
||||
}
|
||||
}
|
||||
return nil, err
|
||||
}, loopMapInfo.StoreMapList)
|
||||
@@ -387,18 +389,6 @@ func (v *VendorSync) SyncStoresSkus2(ctx *jxcontext.Context, db *dao.DaoDB, vend
|
||||
return nil, partner.AddVendorInfo2Err(err, loopMapInfo.VendorID)
|
||||
}, isContinueWhenError)
|
||||
if task != nil {
|
||||
// if vendorErr := partner.IsErrChangePriceFailed(task.GetOriginalErr()); vendorErr != nil {
|
||||
// platformList := make([]string, len(task.GetDetailErrList()))
|
||||
// for k, v := range task.GetDetailErrList() {
|
||||
// if vendorErr := partner.IsErrVendorError(v); vendorErr != nil {
|
||||
// platformList[k] = model.VendorChineseNames[vendorErr.VendorID()]
|
||||
// } else {
|
||||
// platformList[k] = "未知"
|
||||
// }
|
||||
// }
|
||||
// err = fmt.Errorf("同步价格失败\n失败平台:%s", strings.Join(platformList, ","))
|
||||
// } else {
|
||||
// }
|
||||
err = makeSyncError(err)
|
||||
}
|
||||
return hint, err
|
||||
@@ -409,36 +399,22 @@ func (v *VendorSync) SyncStoresSkus(ctx *jxcontext.Context, db *dao.DaoDB, vendo
|
||||
if isForce {
|
||||
setSyncStatus = model.SyncFlagStoreSkuModifiedMask
|
||||
}
|
||||
return v.SyncStoresSkus2(ctx, db, vendorIDs, storeIDs, skuIDs, nil, setSyncStatus, isAsync, isContinueWhenError)
|
||||
return v.SyncStoresSkus2(ctx, db, vendorIDs, storeIDs, true, skuIDs, nil, setSyncStatus, isAsync, isContinueWhenError)
|
||||
}
|
||||
|
||||
// func isUseOldSyncLogic(storeMap *model.StoreMap) bool {
|
||||
// return false
|
||||
// return globals.IsProductEnv() && storeMap.StoreID != 102652 // 绿城四季鲜店
|
||||
// }
|
||||
|
||||
func (v *VendorSync) proxySyncStoreCategory(ctx *jxcontext.Context, parentTask tasksch.ITask, storeMap *model.StoreMap, nameIDs, skuIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||
// if isUseOldSyncLogic(storeMap) {
|
||||
// return v.GetStoreHandler(storeMap.VendorID).(partner.ISingleStoreHandler).SyncStoreCategory(ctx, parentTask, storeMap.StoreID, isAsync)
|
||||
// }
|
||||
return SyncStorCategories(ctx, parentTask, storeMap.VendorID, storeMap.StoreID, storeMap.VendorStoreID, nil, skuIDs, isAsync, isContinueWhenError)
|
||||
}
|
||||
|
||||
func (v *VendorSync) proxySyncStoreSku(ctx *jxcontext.Context, parentTask tasksch.ITask, storeMap *model.StoreMap, nameIDs, skuIDs, excludeSkuIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||
// if isUseOldSyncLogic(storeMap) {
|
||||
// return v.GetStoreHandler(storeMap.VendorID).SyncStoreSkus(ctx, parentTask, storeMap.StoreID, skuIDs, isAsync, isContinueWhenError)
|
||||
// }
|
||||
return SyncStoreSkuNew(ctx, parentTask, storeMap.VendorID, storeMap.StoreID, storeMap.VendorStoreID, nil, skuIDs, excludeSkuIDs, isAsync, isContinueWhenError)
|
||||
}
|
||||
|
||||
func (v *VendorSync) proxyFullSyncStoreSku(ctx *jxcontext.Context, parentTask tasksch.ITask, storeMap *model.StoreMap, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||
// if isUseOldSyncLogic(storeMap) {
|
||||
// return v.GetStoreHandler(storeMap.VendorID).FullSyncStoreSkus(ctx, parentTask, storeMap.StoreID, isAsync, isContinueWhenError)
|
||||
// }
|
||||
return FullSyncStoreSkuNew(ctx, parentTask, storeMap.VendorID, storeMap.StoreID, storeMap.VendorStoreID, isAsync, isContinueWhenError)
|
||||
}
|
||||
|
||||
func (v *VendorSync) FullSyncStoresSkus(ctx *jxcontext.Context, db *dao.DaoDB, vendorIDs []int, storeIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||
func (v *VendorSync) FullSyncStoresSkus(ctx *jxcontext.Context, db *dao.DaoDB, vendorIDs []int, storeIDs []int, syncDisabled, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||
globals.SugarLogger.Debug("FullSyncStoresSkus")
|
||||
hint, err = v.LoopStoresMap(ctx, db, fmt.Sprintf("初始化门店商品信息:%v", storeIDs), isAsync, true, vendorIDs, storeIDs,
|
||||
func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) {
|
||||
@@ -452,8 +428,10 @@ func (v *VendorSync) FullSyncStoresSkus(ctx *jxcontext.Context, db *dao.DaoDB, v
|
||||
tasksch.NewParallelConfig().SetParallelCount(parallelCount).SetIsContinueWhenError(isContinueWhenError), ctx,
|
||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||
storeMap := batchItemList[0].(*model.StoreMap)
|
||||
if _, err = v.proxyFullSyncStoreSku(ctx, task, storeMap, false, isContinueWhenError); err != nil {
|
||||
globals.SugarLogger.Debugf("FullSyncStoresSkus failed2 store:%d failed with error:%v", storeMap.StoreID, err)
|
||||
if syncDisabled || storeMap.Status > model.StoreStatusDisabled {
|
||||
if _, err = v.proxyFullSyncStoreSku(ctx, task, storeMap, false, isContinueWhenError); err != nil {
|
||||
globals.SugarLogger.Debugf("FullSyncStoresSkus failed2 store:%d failed with error:%v", storeMap.StoreID, err)
|
||||
}
|
||||
}
|
||||
return nil, err
|
||||
}, loopMapInfo.StoreMapList)
|
||||
|
||||
@@ -22,9 +22,9 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
AmmendPruneOnlyAmend = 1
|
||||
AmmendPruneOnlyPrune = 2
|
||||
AmmendPruneAll = 3
|
||||
AmendPruneOnlyAmend = 1
|
||||
AmendPruneOnlyPrune = 2
|
||||
AmendPruneAll = 3
|
||||
)
|
||||
|
||||
var (
|
||||
@@ -82,7 +82,7 @@ func SyncStorCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendor
|
||||
storeCatMap.ID = catInfo.MapID
|
||||
if model.IsSyncStatusDelete(catInfo.StoreCatSyncStatus) { // 删除
|
||||
if model.IsSyncStatusDelete(catInfo.StoreCatSyncStatus) && !dao.IsVendorThingIDEmpty(catInfo.VendorCatID) {
|
||||
err = handler.DeleteStoreCategory(ctx, storeID, vendorStoreID, catInfo.VendorCatID)
|
||||
err = handler.DeleteStoreCategory(ctx, storeID, vendorStoreID, catInfo.VendorCatID, level)
|
||||
if err != nil && handler.IsErrCategoryNotExist(err) {
|
||||
err = nil
|
||||
}
|
||||
@@ -97,6 +97,10 @@ func SyncStorCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendor
|
||||
}
|
||||
if err == nil {
|
||||
updateFields = append(updateFields, idFieldName)
|
||||
if vendorID == model.VendorIDMTWM {
|
||||
storeCatMap.LastOperator = utils.Time2Str(time.Now())
|
||||
updateFields = append(updateFields, model.FieldLastOperator)
|
||||
}
|
||||
}
|
||||
} else if model.IsSyncStatusUpdate(catInfo.StoreCatSyncStatus) { // 修改
|
||||
if err = handler.UpdateStoreCategory(ctx, storeID, vendorStoreID, catInfo); err == nil {
|
||||
@@ -163,7 +167,8 @@ func FullSyncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, vendo
|
||||
switch step {
|
||||
case 0:
|
||||
if singleStoreHandler != nil {
|
||||
_, err = ClearRemoteStoreStuffAndSetNew(ctx, task, vendorID, storeID, vendorStoreID, false, isContinueWhenError)
|
||||
// _, err = ClearRemoteStoreStuffAndSetNew(ctx, task, vendorID, storeID, vendorStoreID, false, isContinueWhenError)
|
||||
_, err = amendAndPruneStoreStuff(ctx, parentTask, vendorID, storeID, vendorStoreID, false, isContinueWhenError, AmendPruneAll, true)
|
||||
} else {
|
||||
_, err = dao.SetStoreSkuSyncStatus(dao.GetDB(), vendorID, []int{storeID}, nil, model.SyncFlagStoreSkuOnlyMask)
|
||||
}
|
||||
@@ -568,30 +573,29 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, isFull bo
|
||||
return err
|
||||
}
|
||||
|
||||
func checkRemoteCatExist(localCatMap map[string]*dao.SkuStoreCatInfo, catList []*partner.BareCategoryInfo) (cat2Delete []*partner.BareCategoryInfo) {
|
||||
for _, v := range catList {
|
||||
if localCatMap[v.VendorCatID] == nil && localCatMap[v.Name] == nil {
|
||||
func checkRemoteCatExist(outRemoteCatMap map[string]int, localCatMap map[string]*dao.SkuStoreCatInfo, remoteCatList []*partner.BareCategoryInfo) (cat2Delete []*partner.BareCategoryInfo) {
|
||||
for _, v := range remoteCatList {
|
||||
localCat := localCatMap[v.VendorCatID]
|
||||
// if localCat == nil {
|
||||
// localCat = localCatMap[v.Name]
|
||||
// }
|
||||
if localCat == nil || v.Level != int(localCat.Level) {
|
||||
cat2Delete = append(cat2Delete, v)
|
||||
} else {
|
||||
outRemoteCatMap[v.VendorCatID] = 1
|
||||
}
|
||||
cat2Delete = append(cat2Delete, checkRemoteCatExist(localCatMap, v.Children)...)
|
||||
cat2Delete = append(cat2Delete, checkRemoteCatExist(outRemoteCatMap, localCatMap, v.Children)...)
|
||||
}
|
||||
return cat2Delete
|
||||
}
|
||||
|
||||
func fillRemoteCatMap(catList []*partner.BareCategoryInfo, catMap map[string]int) {
|
||||
for _, v := range catList {
|
||||
catMap[v.VendorCatID] = 1
|
||||
fillRemoteCatMap(v.Children, catMap)
|
||||
}
|
||||
}
|
||||
|
||||
// 清除京西没有,平台有的商品与商家分类
|
||||
// todo !!!,因为美团外卖分类当前是用的名字关联的,所以改名后如果没有及时同步,这个函数会导致美团平台的分类被误删
|
||||
func PruneMissingStoreSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID, storeID int, vendorStoreID string, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||
return ammendAndPruneStoreStuff(ctx, parentTask, vendorID, storeID, vendorStoreID, isAsync, isContinueWhenError, AmmendPruneOnlyPrune)
|
||||
return amendAndPruneStoreStuff(ctx, parentTask, vendorID, storeID, vendorStoreID, isAsync, isContinueWhenError, AmendPruneOnlyPrune, false)
|
||||
}
|
||||
|
||||
func ammendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID, storeID int, vendorStoreID string, isAsync, isContinueWhenError bool, opType int) (hint string, err error) {
|
||||
func amendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID, storeID int, vendorStoreID string, isAsync, isContinueWhenError bool, opType int, isForceUpdate bool) (hint string, err error) {
|
||||
handler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler)
|
||||
if handler == nil {
|
||||
return "", fmt.Errorf("平台:%s不支持此操作", model.VendorChineseNames[vendorID])
|
||||
@@ -600,8 +604,7 @@ func ammendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask,
|
||||
|
||||
var sku2Delete []*partner.StoreSkuInfo
|
||||
var cat2Delete []*partner.BareCategoryInfo
|
||||
var storeSkuBindIDs, storeCatBindIDs []int
|
||||
task := tasksch.NewParallelTask(fmt.Sprintf("修补平台:%s上的门店商品与分类", model.VendorChineseNames[vendorID]),
|
||||
task := tasksch.NewParallelTask(fmt.Sprintf("修补门店:%d,平台:%s上的商品与商家分类", storeID, model.VendorChineseNames[vendorID]),
|
||||
tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError), ctx,
|
||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||
step := batchItemList[0].(int)
|
||||
@@ -611,41 +614,50 @@ func ammendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask,
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
localSkuMap := make(map[int]*dao.StoreSkuSyncInfo)
|
||||
localSkuMap := make(map[string]*dao.StoreSkuSyncInfo)
|
||||
for _, v := range localSkuList {
|
||||
localSkuMap[v.SkuID] = v
|
||||
localSkuMap[v.VendorSkuID] = v
|
||||
}
|
||||
|
||||
remoteSkuList, err2 := handler.GetStoreSkusFullInfo(ctx, task, storeID, vendorStoreID, nil)
|
||||
if err = err2; err == nil {
|
||||
remoteSkuMap := make(map[int]int)
|
||||
remoteSkuMap := make(map[string]int)
|
||||
for _, v := range remoteSkuList {
|
||||
remoteSkuMap[v.SkuList[0].SkuID] = 1
|
||||
if localSkuMap[v.SkuList[0].SkuID] == nil {
|
||||
sku2Delete = append(sku2Delete, &partner.StoreSkuInfo{
|
||||
SkuID: v.SkuList[0].SkuID,
|
||||
VendorSkuID: v.SkuList[0].VendorSkuID,
|
||||
})
|
||||
if vendorSkuID := v.SkuList[0].VendorSkuID; vendorSkuID != "" {
|
||||
if localSkuMap[vendorSkuID] == nil ||
|
||||
remoteSkuMap[vendorSkuID] == 1 /*skuID在平台重复,典型的是美团可能会出现此类情况*/ {
|
||||
sku2Delete = append(sku2Delete, &partner.StoreSkuInfo{
|
||||
SkuID: v.SkuList[0].SkuID,
|
||||
VendorSkuID: vendorSkuID,
|
||||
})
|
||||
} else {
|
||||
remoteSkuMap[vendorSkuID] = 1
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for _, v := range localSkuList {
|
||||
if remoteSkuMap[v.SkuID] == 0 && !model.IsSyncStatusNew(v.StoreSkuSyncStatus) && !model.IsSyncStatusDelete(v.StoreSkuSyncStatus) && v.BindID != 0 {
|
||||
storeSkuBindIDs = append(storeSkuBindIDs, v.BindID)
|
||||
if opType == AmendPruneOnlyAmend || opType == AmendPruneAll {
|
||||
for _, v := range localSkuList {
|
||||
if !model.IsSyncStatusDelete(v.StoreSkuSyncStatus) && v.BindID != 0 {
|
||||
syncStatus := 0
|
||||
if remoteSkuMap[v.VendorSkuID] == 0 {
|
||||
if !model.IsSyncStatusNew(v.StoreSkuSyncStatus) {
|
||||
syncStatus = model.SyncFlagNewMask
|
||||
}
|
||||
} else if isForceUpdate {
|
||||
syncStatus = model.SyncFlagStoreSkuModifiedMask
|
||||
}
|
||||
if syncStatus != 0 {
|
||||
skuBind := &model.StoreSkuBind{}
|
||||
skuBind.ID = v.BindID
|
||||
dao.UpdateEntityLogicallyAndUpdateSyncStatus(db, skuBind, nil, ctx.GetUserName(), nil, dao.GetSyncStatusStructField(model.VendorNames[vendorID]), syncStatus)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
case 1:
|
||||
if (opType == AmmendPruneOnlyAmend || opType == AmmendPruneAll) && len(storeSkuBindIDs) > 0 {
|
||||
for _, bindID := range storeSkuBindIDs {
|
||||
fieldStatus := dao.GetSyncStatusStructField(model.VendorNames[vendorID])
|
||||
skuBind := &model.StoreSkuBind{}
|
||||
skuBind.ID = bindID
|
||||
dao.UpdateEntityLogicallyAndUpdateSyncStatus(db, skuBind, nil, ctx.GetUserName(), nil, fieldStatus, model.SyncFlagNewMask)
|
||||
}
|
||||
}
|
||||
|
||||
if (opType == AmmendPruneOnlyPrune || opType == AmmendPruneAll) && len(sku2Delete) > 0 {
|
||||
if (opType == AmendPruneOnlyPrune || opType == AmendPruneAll) && len(sku2Delete) > 0 {
|
||||
_, err = putils.FreeBatchStoreSkuInfo("删除门店商品", func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) {
|
||||
_, err = handler.DeleteStoreSkus(ctx, storeID, vendorStoreID, batchedStoreSkuList)
|
||||
return nil, 0, err
|
||||
@@ -666,27 +678,29 @@ func ammendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask,
|
||||
|
||||
remoteCatList, err2 := handler.GetStoreAllCategories(ctx, storeID, vendorStoreID)
|
||||
if err = err2; err == nil {
|
||||
cat2Delete = checkRemoteCatExist(localCatMap, remoteCatList)
|
||||
|
||||
remoteCatMap := make(map[string]int)
|
||||
fillRemoteCatMap(remoteCatList, remoteCatMap)
|
||||
cat2Delete = checkRemoteCatExist(remoteCatMap, localCatMap, remoteCatList)
|
||||
|
||||
for _, v := range localCatList {
|
||||
if remoteCatMap[v.VendorCatID] == 0 && !model.IsSyncStatusNew(v.StoreCatSyncStatus) && !model.IsSyncStatusDelete(v.StoreCatSyncStatus) && v.MapID != 0 {
|
||||
storeCatBindIDs = append(storeCatBindIDs, v.MapID)
|
||||
if !model.IsSyncStatusDelete(v.StoreCatSyncStatus) && v.MapID != 0 {
|
||||
syncStatus := 0
|
||||
if remoteCatMap[v.VendorCatID] == 0 {
|
||||
if !model.IsSyncStatusNew(v.StoreCatSyncStatus) {
|
||||
syncStatus = model.SyncFlagNewMask
|
||||
}
|
||||
} else if isForceUpdate && !model.IsSyncStatusUpdate(v.StoreCatSyncStatus) {
|
||||
syncStatus = model.SyncFlagModifiedMask
|
||||
}
|
||||
if syncStatus != 0 {
|
||||
catBind := &model.StoreSkuCategoryMap{}
|
||||
catBind.ID = v.MapID
|
||||
dao.UpdateEntityLogicallyAndUpdateSyncStatus(db, catBind, nil, ctx.GetUserName(), nil, dao.GetSyncStatusStructField(model.VendorNames[vendorID]), syncStatus)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
case 3:
|
||||
if (opType == AmmendPruneOnlyAmend || opType == AmmendPruneAll) && len(storeCatBindIDs) > 0 {
|
||||
for _, bindID := range storeCatBindIDs {
|
||||
fieldStatus := dao.GetSyncStatusStructField(model.VendorNames[vendorID])
|
||||
catBind := &model.StoreSkuCategoryMap{}
|
||||
catBind.ID = bindID
|
||||
dao.UpdateEntityLogicallyAndUpdateSyncStatus(db, catBind, nil, ctx.GetUserName(), nil, fieldStatus, model.SyncFlagNewMask)
|
||||
}
|
||||
}
|
||||
|
||||
if (opType == AmmendPruneOnlyPrune || opType == AmmendPruneAll) && len(cat2Delete) > 0 {
|
||||
if (opType == AmendPruneOnlyPrune || opType == AmendPruneAll) && len(cat2Delete) > 0 {
|
||||
for i := 0; i < 2; i++ {
|
||||
level := 2 - i
|
||||
var levelCat2Delete []*partner.BareCategoryInfo
|
||||
@@ -696,10 +710,10 @@ func ammendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask,
|
||||
}
|
||||
}
|
||||
if len(levelCat2Delete) > 0 {
|
||||
task4Delete := tasksch.NewParallelTask(fmt.Sprintf("删除本地不存在的远程分类,level:%d", level), tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx,
|
||||
task4Delete := tasksch.NewParallelTask(fmt.Sprintf("删除商家分类,level:%d", level), tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx,
|
||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||
cat := batchItemList[0].(*partner.BareCategoryInfo)
|
||||
err = handler.DeleteStoreCategory(ctx, storeID, vendorStoreID, cat.VendorCatID)
|
||||
err = handler.DeleteStoreCategory(ctx, storeID, vendorStoreID, cat.VendorCatID, level)
|
||||
return nil, err
|
||||
}, levelCat2Delete)
|
||||
tasksch.HandleTask(task4Delete, task, true).Run()
|
||||
@@ -712,65 +726,18 @@ func ammendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask,
|
||||
return nil, err
|
||||
}, []int{0, 1, 2, 3})
|
||||
tasksch.HandleTask(task, parentTask, true).Run()
|
||||
if isAsync {
|
||||
hint = task.GetID()
|
||||
} else {
|
||||
if !isAsync {
|
||||
_, err = task.GetResult(0)
|
||||
hint = "1"
|
||||
} else {
|
||||
hint = task.ID
|
||||
}
|
||||
return hint, err
|
||||
}
|
||||
|
||||
// 把京西有,平台无且没有待创建标记的商品加上待创建标记
|
||||
func AddCreateFlagForJxStoreSku(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID, storeID int, vendorStoreID string, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||
return ammendAndPruneStoreStuff(ctx, parentTask, vendorID, storeID, vendorStoreID, isAsync, isContinueWhenError, AmmendPruneOnlyAmend)
|
||||
// handler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler)
|
||||
// if handler == nil {
|
||||
// return "", fmt.Errorf("平台:%s不支持此操作", model.VendorChineseNames[vendorID])
|
||||
// }
|
||||
// db := dao.GetDB()
|
||||
|
||||
// var storeSkuBindIDs []int
|
||||
// seqTaskFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
|
||||
// switch step {
|
||||
// case 0:
|
||||
// localSkuList, err2 := dao.GetStoreSkus2(db, vendorID, storeID, nil, false)
|
||||
// if err = err2; err != nil {
|
||||
// return nil, err
|
||||
// }
|
||||
// remoteSkuList, err2 := handler.GetStoreSkusFullInfo(ctx, task, storeID, vendorStoreID, nil)
|
||||
// if err = err2; err == nil {
|
||||
// remoteSkuMap := make(map[int]int)
|
||||
// for _, value := range remoteSkuList {
|
||||
// for _, skuInfo := range value.SkuList {
|
||||
// remoteSkuMap[skuInfo.SkuID] = 1
|
||||
// }
|
||||
// }
|
||||
// for _, v := range localSkuList {
|
||||
// if remoteSkuMap[v.SkuID] == 0 && !model.IsSyncStatusNew(v.StoreSkuSyncStatus) && !model.IsSyncStatusDelete(v.StoreSkuSyncStatus) && v.BindID != 0 {
|
||||
// storeSkuBindIDs = append(storeSkuBindIDs, v.BindID)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// case 1:
|
||||
// if len(storeSkuBindIDs) > 0 {
|
||||
// for _, bindID := range storeSkuBindIDs {
|
||||
// fieldStatus := dao.GetSyncStatusStructField(model.VendorNames[vendorID])
|
||||
// skuBind := &model.StoreSkuBind{}
|
||||
// skuBind.ID = bindID
|
||||
// dao.UpdateEntityLogicallyAndUpdateSyncStatus(db, skuBind, nil, ctx.GetUserName(), nil, fieldStatus, model.SyncFlagNewMask)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// return nil, err
|
||||
// }
|
||||
// task := tasksch.NewSeqTask(fmt.Sprintf("处理京西门店商品加待创建标记:%s", model.VendorChineseNames[vendorID]), ctx, seqTaskFunc, 2)
|
||||
// tasksch.HandleTask(task, parentTask, true).Run()
|
||||
// if isAsync {
|
||||
// hint = task.GetID()
|
||||
// } else {
|
||||
// _, err = task.GetResult(0)
|
||||
// }
|
||||
// return hint, err
|
||||
return amendAndPruneStoreStuff(ctx, parentTask, vendorID, storeID, vendorStoreID, isAsync, isContinueWhenError, AmendPruneOnlyAmend, false)
|
||||
}
|
||||
|
||||
func ClearRemoteStoreStuffAndSetNew(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID, storeID int, vendorStoreID string, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||
@@ -782,35 +749,30 @@ func ClearRemoteStoreStuffAndSetNew(ctx *jxcontext.Context, parentTask tasksch.I
|
||||
}
|
||||
|
||||
db := dao.GetDB()
|
||||
var errDeleteSku error
|
||||
rootTask := tasksch.NewSeqTask(fmt.Sprintf("ClearRemoteStoreStuffAndSetNew:%s", model.VendorChineseNames[vendorID]), ctx,
|
||||
func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
|
||||
task := tasksch.NewParallelTask(fmt.Sprintf("删除门店:%d,平台:%s上的商品与商家分类", storeID, model.VendorChineseNames[vendorID]),
|
||||
tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError), ctx,
|
||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||
step := batchItemList[0].(int)
|
||||
switch step {
|
||||
case 0:
|
||||
err = handler.DeleteStoreAllSkus(ctx, rootTask, storeID, vendorStoreID, isContinueWhenError)
|
||||
errDeleteSku = err
|
||||
// 强制忽略删除SKU错误
|
||||
if isContinueWhenError {
|
||||
err = nil
|
||||
}
|
||||
if err == nil {
|
||||
_, err = dao.SetStoreSkuSyncStatus(db, vendorID, []int{storeID}, nil, model.SyncFlagNewMask)
|
||||
}
|
||||
err = handler.DeleteStoreAllSkus(ctx, task, storeID, vendorStoreID, isContinueWhenError)
|
||||
case 1:
|
||||
if err = handler.DeleteStoreAllCategories(ctx, rootTask, storeID, vendorStoreID, isContinueWhenError); err == nil {
|
||||
_, err = dao.SetStoreCategorySyncStatus(db, vendorID, []int{storeID}, nil, model.SyncFlagNewMask)
|
||||
}
|
||||
_, err = dao.SetStoreSkuSyncStatus(db, vendorID, []int{storeID}, nil, model.SyncFlagNewMask)
|
||||
case 2:
|
||||
err = handler.DeleteStoreAllCategories(ctx, task, storeID, vendorStoreID, isContinueWhenError)
|
||||
case 3:
|
||||
_, err = dao.SetStoreCategorySyncStatus(db, vendorID, []int{storeID}, nil, model.SyncFlagNewMask)
|
||||
}
|
||||
return nil, err
|
||||
}, 2)
|
||||
tasksch.AddChild(parentTask, rootTask).Run()
|
||||
}, []int{0, 1, 2, 3})
|
||||
tasksch.HandleTask(task, parentTask, true).Run()
|
||||
if !isAsync {
|
||||
_, err = rootTask.GetResult(0)
|
||||
_, err = task.GetResult(0)
|
||||
hint = "1"
|
||||
} else {
|
||||
hint = task.ID
|
||||
}
|
||||
if err == nil {
|
||||
err = errDeleteSku
|
||||
}
|
||||
return rootTask.ID, err
|
||||
return hint, err
|
||||
}
|
||||
|
||||
func GetSensitiveWord(singleStoreHandler partner.ISingleStoreStoreSkuHandler, str string) string {
|
||||
|
||||
@@ -680,20 +680,25 @@ func SaveUserCart(ctx *jxcontext.Context, userID string, storeID int, cartItems
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = dao.CreateMultiEntities(dao.GetDB(), cartItems)
|
||||
if len(cartItems) > 0 {
|
||||
err = dao.CreateMultiEntities(db, cartItems)
|
||||
}
|
||||
if err == nil {
|
||||
dao.Commit(db)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func LoadUserCart(ctx *jxcontext.Context, userID string, storeID int) (cartItems []*model.UserCartItem, err error) {
|
||||
if userID == "" || storeID == 0 {
|
||||
func LoadUserCart(ctx *jxcontext.Context, userID string, storeIDs []int) (cartItems []*model.UserCartItem, err error) {
|
||||
if userID == "" || len(storeIDs) == 0 {
|
||||
return nil, fmt.Errorf("用户与门店必须要指定")
|
||||
}
|
||||
sql := `
|
||||
SELECT t1.*
|
||||
FROM user_cart_item t1
|
||||
WHERE t1.user_id = ? AND t1.store_id = ?
|
||||
WHERE t1.user_id = ? AND t1.store_id IN (` + dao.GenQuestionMarks(len(storeIDs)) + `)
|
||||
ORDER BY t1.sku_id
|
||||
`
|
||||
err = dao.GetRows(dao.GetDB(), &cartItems, sql, userID, storeID)
|
||||
err = dao.GetRows(dao.GetDB(), &cartItems, sql, userID, storeIDs)
|
||||
return cartItems, err
|
||||
}
|
||||
|
||||
@@ -243,42 +243,58 @@ func InitSkuName(ctx *jxcontext.Context, isForce, isAsync, isContinueWhenError b
|
||||
return hint, err
|
||||
}
|
||||
|
||||
func InitVendorCategory(ctx *jxcontext.Context, vendorID int) (num int64, err error) {
|
||||
func InitVendorCategory(ctx *jxcontext.Context, vendorID int, isAsync bool) (hint string, err error) {
|
||||
if handler := partner.GetPurchasePlatformFromVendorID(vendorID); handler != nil {
|
||||
cats, err2 := handler.GetVendorCategories(ctx)
|
||||
if err2 != nil {
|
||||
return num, err2
|
||||
}
|
||||
db := dao.GetDB()
|
||||
dao.Begin(db)
|
||||
defer func() {
|
||||
if r := recover(); r != nil || err != nil {
|
||||
dao.Rollback(db)
|
||||
if r != nil {
|
||||
panic(r)
|
||||
var cats []*model.SkuVendorCategory
|
||||
rootTask := tasksch.NewSeqTask(fmt.Sprintf("创建%s的平台分类", model.VendorChineseNames[vendorID]), ctx,
|
||||
func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
|
||||
switch step {
|
||||
case 0:
|
||||
cats, err = handler.GetVendorCategories(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
case 1:
|
||||
db := dao.GetDB()
|
||||
dao.Begin(db)
|
||||
defer func() {
|
||||
if r := recover(); r != nil || err != nil {
|
||||
dao.Rollback(db)
|
||||
if r != nil {
|
||||
panic(r)
|
||||
}
|
||||
}
|
||||
}()
|
||||
sql := `
|
||||
DELETE
|
||||
FROM sku_vendor_category
|
||||
WHERE vendor_id = ?
|
||||
`
|
||||
if _, err = dao.ExecuteSQL(db, sql, vendorID); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for _, cat := range cats {
|
||||
dao.WrapAddIDCULEntity(cat, ctx.GetUserName())
|
||||
if err = dao.CreateEntity(db, cat); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
dao.Commit(db)
|
||||
}
|
||||
return nil, err
|
||||
}, 2)
|
||||
tasksch.HandleTask(rootTask, nil, true).Run()
|
||||
if !isAsync {
|
||||
if _, err = rootTask.GetResult(0); err == nil {
|
||||
hint = utils.Int2Str(len(cats))
|
||||
}
|
||||
}()
|
||||
sql := `
|
||||
DELETE
|
||||
FROM sku_vendor_category
|
||||
WHERE vendor_id = ?
|
||||
`
|
||||
if _, err = dao.ExecuteSQL(db, sql, vendorID); err != nil {
|
||||
return num, err
|
||||
} else {
|
||||
hint = rootTask.ID
|
||||
}
|
||||
for _, cat := range cats {
|
||||
dao.WrapAddIDCULEntity(cat, ctx.GetUserName())
|
||||
if err = dao.CreateEntity(db, cat); err != nil {
|
||||
return num, err
|
||||
}
|
||||
}
|
||||
dao.Commit(db)
|
||||
num = int64(len(cats))
|
||||
} else {
|
||||
err = fmt.Errorf("找不到平台:%d", vendorID)
|
||||
}
|
||||
return num, err
|
||||
return hint, err
|
||||
}
|
||||
|
||||
func UploadImg4Vendors(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||
|
||||
@@ -124,12 +124,12 @@ func doDailyWork() {
|
||||
globals.SugarLogger.Debug("doDailyWork")
|
||||
cms.SyncStoresCourierInfo(jxcontext.AdminCtx, nil, false, true)
|
||||
netprinter.RebindAllPrinters(jxcontext.AdminCtx, false, true)
|
||||
// cms.CurVendorSync.FullSyncStoresSkus(jxcontext.AdminCtx, dao.GetDB(), []int{model.VendorIDJD}, nil, true, true)
|
||||
// cms.CurVendorSync.FullSyncStoresSkus(jxcontext.AdminCtx, dao.GetDB(), []int{model.VendorIDJD}, nil, false, true, true)
|
||||
|
||||
cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, dao.GetDB(), []int{model.VendorIDJD}, nil, nil, []int{27379}, model.SyncFlagSaleMask|model.SyncFlagPriceMask, true, true)
|
||||
cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, dao.GetDB(), []int{model.VendorIDJD}, nil, false, nil, []int{27379}, model.SyncFlagSaleMask|model.SyncFlagPriceMask, true, true)
|
||||
|
||||
SaveImportantTaskID(TaskNameSyncStoreSku, SpecialTaskID)
|
||||
taskID, _ := cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, dao.GetDB(), []int{model.VendorIDEBAI, model.VendorIDMTWM}, nil, nil, nil, model.SyncFlagSaleMask|model.SyncFlagPriceMask, true, true)
|
||||
taskID, _ := cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, dao.GetDB(), []int{model.VendorIDEBAI, model.VendorIDMTWM}, nil, false, nil, nil, model.SyncFlagSaleMask|model.SyncFlagPriceMask, true, true)
|
||||
SaveImportantTaskID(TaskNameSyncStoreSku, taskID)
|
||||
|
||||
InitEx()
|
||||
|
||||
@@ -43,7 +43,6 @@ type EventInfo struct {
|
||||
|
||||
type tRegisterInfo struct {
|
||||
notifyChan chan *EventInfo
|
||||
eventCategory string
|
||||
eventTypeList []string
|
||||
criteria interface{}
|
||||
}
|
||||
@@ -177,8 +176,7 @@ func (e *EventHub) registerConsumer(eventCategory string, eventTypeList []string
|
||||
realEventTypeList[index] = composeEventType(eventCategory, eventType)
|
||||
}
|
||||
info := &tRegisterInfo{
|
||||
eventCategory: eventCategory,
|
||||
eventTypeList: eventTypeList,
|
||||
eventTypeList: realEventTypeList,
|
||||
notifyChan: make(chan *EventInfo, 1),
|
||||
criteria: criteria,
|
||||
}
|
||||
|
||||
@@ -13,7 +13,9 @@ import (
|
||||
const (
|
||||
EventCategory = "sys"
|
||||
|
||||
EventTypeWXToken = "wxtoken"
|
||||
EventTypeWXToken = "wxToken"
|
||||
EventTypeYLYToken = "ylyToken"
|
||||
EventTypeWeimobToken = "weimobToken"
|
||||
)
|
||||
|
||||
type Hub struct {
|
||||
@@ -23,7 +25,7 @@ type Hub struct {
|
||||
type Criteria struct {
|
||||
}
|
||||
|
||||
type WXTokenInfo struct {
|
||||
type TokenInfo struct {
|
||||
IsNew bool `json:"isNew"`
|
||||
Token string `json:"token"`
|
||||
}
|
||||
@@ -55,22 +57,58 @@ func (h *Hub) OnNewWXToken(token string) {
|
||||
})
|
||||
}
|
||||
|
||||
func (h *Hub) GetWXToken(oldToken string, waitTime time.Duration) (tokenInfo *WXTokenInfo) {
|
||||
token := api.WeixinAPI.CBGetToken()
|
||||
func (h *Hub) OnNewYLYToken(token string) {
|
||||
h.eventHub.PostNewEvent(EventCategory, &eventhub.EventInfo{
|
||||
Type: EventTypeYLYToken,
|
||||
Data: token,
|
||||
})
|
||||
}
|
||||
|
||||
func (h *Hub) OnNewWeimobToken(token string) {
|
||||
h.eventHub.PostNewEvent(EventCategory, &eventhub.EventInfo{
|
||||
Type: EventTypeWeimobToken,
|
||||
Data: token,
|
||||
})
|
||||
}
|
||||
|
||||
func (h *Hub) GetToken(tokenType, oldToken string, waitTime time.Duration) (tokenInfo *TokenInfo) {
|
||||
var token string
|
||||
switch tokenType {
|
||||
case EventTypeWXToken:
|
||||
token = api.WeixinAPI.CBGetToken()
|
||||
case EventTypeYLYToken:
|
||||
token = api.YilianyunAPI.GetToken()
|
||||
case EventTypeWeimobToken:
|
||||
if weimobToken := api.WeimobAPI.GetToken(); weimobToken != nil {
|
||||
token = string(utils.MustMarshal(weimobToken))
|
||||
}
|
||||
}
|
||||
if token != oldToken {
|
||||
tokenInfo = &WXTokenInfo{
|
||||
tokenInfo = &TokenInfo{
|
||||
IsNew: false,
|
||||
Token: token,
|
||||
}
|
||||
} else {
|
||||
eventInfo, err := h.eventHub.GetEvent(EventCategory, []string{EventTypeWXToken}, nil, waitTime)
|
||||
eventInfo, err := h.eventHub.GetEvent(EventCategory, []string{tokenType}, nil, waitTime)
|
||||
if err == nil && eventInfo != nil {
|
||||
tokenInfo = &WXTokenInfo{
|
||||
tokenInfo = &TokenInfo{
|
||||
IsNew: true,
|
||||
Token: eventInfo.Data.(string),
|
||||
}
|
||||
}
|
||||
}
|
||||
globals.SugarLogger.Debugf("GetWXToken tokenInfo:%s", utils.Format4Output(tokenInfo, true))
|
||||
globals.SugarLogger.Debugf("GetToken tokenType:%s tokenInfo:%s", tokenType, utils.Format4Output(tokenInfo, true))
|
||||
return tokenInfo
|
||||
}
|
||||
|
||||
func (h *Hub) GetWXToken(oldToken string, waitTime time.Duration) (tokenInfo *TokenInfo) {
|
||||
return h.GetToken(EventTypeWXToken, oldToken, waitTime)
|
||||
}
|
||||
|
||||
func (h *Hub) GetYLYToken(oldToken string, waitTime time.Duration) (tokenInfo *TokenInfo) {
|
||||
return h.GetToken(EventTypeYLYToken, oldToken, waitTime)
|
||||
}
|
||||
|
||||
func (h *Hub) GetWeimobToken(oldToken string, waitTime time.Duration) (tokenInfo *TokenInfo) {
|
||||
return h.GetToken(EventTypeWeimobToken, oldToken, waitTime)
|
||||
}
|
||||
|
||||
@@ -144,7 +144,7 @@ func GetPossibleVendorIDFromVendorOrderID(vendorOrderID string) (vendorID int) {
|
||||
// 改造点:
|
||||
// 1、订单号位数变化,由原有15位数增加1位数调整为16位数,对接商家需检查是否有对订单号位数做长度校验。
|
||||
// 2、第一位数字发生变化,由原来9开头调整为当年年份后两位数如:2020年订单开头为20;
|
||||
if orderIDLen == len("925265130002541") || orderIDLen == len("1925265130002541")+1 {
|
||||
if orderIDLen == len("925265130002541") || orderIDLen == len("1925265130002541") {
|
||||
vendorID = model.VendorIDJD
|
||||
} else if orderIDLen == len("3022716176275221584") {
|
||||
// vendorID = model.VendorIDELM
|
||||
|
||||
@@ -26,7 +26,6 @@ import (
|
||||
const (
|
||||
weixinTokenExpires = 7200 * time.Second
|
||||
dingdingTokenExpires = 7200 * time.Second
|
||||
elmTokenExpires = 20 * 24 * 3600 * time.Second
|
||||
weimobTokenExpires = 7200 * time.Second
|
||||
yilianyunTokenExpires = 30 * 24 * 3600 * time.Second
|
||||
|
||||
@@ -35,16 +34,6 @@ const (
|
||||
minRefreshGap = 1 * time.Second
|
||||
)
|
||||
|
||||
type ElmTokenForCompatible struct {
|
||||
Error string `json:"error"`
|
||||
ErrorDescription string `json:"error_description"`
|
||||
AccessToken string `json:"accessToken"`
|
||||
TokenType string `json:"tokenType"`
|
||||
Expires int `json:"expires"`
|
||||
RefreshToken string `json:"refreshToken"`
|
||||
Success bool `json:"success"`
|
||||
}
|
||||
|
||||
type CallResult struct {
|
||||
Code string `json:"code"`
|
||||
Desc string `json:"desc"`
|
||||
@@ -126,19 +115,17 @@ func RefreshWeixinToken() (err error) {
|
||||
if api.WeixinAPI != nil {
|
||||
err = RefreshConfig("wechat", weixinTokenExpires, func() (token string, expireTimeStr string) {
|
||||
globals.SugarLogger.Debugf("RefreshWeixinToken RunMode:%s", beego.BConfig.RunMode)
|
||||
if globals.IsProductEnv() || beego.BConfig.RunMode == "alpha" {
|
||||
if globals.IsMainProductEnv() {
|
||||
if tokenInfo, err := api.WeixinAPI.CBRetrieveToken(); err == nil {
|
||||
globals.SugarLogger.Debugf("RefreshWeixinToken tokenInfo:%s", utils.Format4Output(tokenInfo, true))
|
||||
token = tokenInfo.AccessToken
|
||||
} else {
|
||||
globals.SugarLogger.Errorf("RefreshWeixinToken RefreshToken failed with error:%v", err)
|
||||
}
|
||||
if globals.IsMainProductEnv() {
|
||||
if tokenInfo, err := api.WeixinAPI.CBRetrieveToken(); err == nil {
|
||||
globals.SugarLogger.Debugf("RefreshWeixinToken tokenInfo:%s", utils.Format4Output(tokenInfo, true))
|
||||
token = tokenInfo.AccessToken
|
||||
} else {
|
||||
if tokenInfo := getWXTokenFromRemote(api.WeixinAPI.CBGetToken()); tokenInfo != nil {
|
||||
expireTimeStr = utils.Time2Str(time.Now().Add(-weixinTokenExpires))
|
||||
token = tokenInfo.Token
|
||||
}
|
||||
globals.SugarLogger.Errorf("RefreshWeixinToken RefreshToken failed with error:%v", err)
|
||||
}
|
||||
} else {
|
||||
if tokenInfo := getWXTokenFromRemote(api.WeixinAPI.CBGetToken()); tokenInfo != nil {
|
||||
expireTimeStr = utils.Time2Str(time.Now().Add(-weixinTokenExpires))
|
||||
token = tokenInfo.Token
|
||||
}
|
||||
}
|
||||
return token, expireTimeStr
|
||||
@@ -151,48 +138,30 @@ func RefreshWeixinToken() (err error) {
|
||||
return err
|
||||
}
|
||||
|
||||
func RefreshElmToken() (err error) {
|
||||
if api.ElmAPI != nil {
|
||||
err = RefreshConfig("eleme", elmTokenExpires, func() (string, string) {
|
||||
if globals.IsProductEnv() {
|
||||
if tokenInfo, err := api.ElmAPI.RefreshTokenIndividual(); err == nil {
|
||||
tokenInfo2 := &ElmTokenForCompatible{
|
||||
Error: "",
|
||||
ErrorDescription: "",
|
||||
AccessToken: tokenInfo.AccessToken,
|
||||
TokenType: tokenInfo.TokenType,
|
||||
Expires: tokenInfo.ExpiresIn,
|
||||
RefreshToken: "",
|
||||
Success: true,
|
||||
}
|
||||
return string(utils.MustMarshal(tokenInfo2)), ""
|
||||
}
|
||||
}
|
||||
return "", ""
|
||||
}, func(value string) {
|
||||
var tokenInfo ElmTokenForCompatible
|
||||
err := utils.UnmarshalUseNumber([]byte(value), &tokenInfo)
|
||||
if err == nil {
|
||||
api.ElmAPI.SetToken(tokenInfo.AccessToken)
|
||||
}
|
||||
})
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func RefreshWeimobToken() (err error) {
|
||||
if api.WeimobAPI != nil {
|
||||
err = RefreshConfig("weimob", weimobTokenExpires, func() (string, string) {
|
||||
if globals.IsProductEnv() {
|
||||
err = RefreshConfig("weimob", weimobTokenExpires, func() (token string, expireTimeStr string) {
|
||||
globals.SugarLogger.Debugf("RefreshWeimobToken RunMode:%s", beego.BConfig.RunMode)
|
||||
if globals.IsMainProductEnv() {
|
||||
if tokenInfo, err := api.WeimobAPI.RefreshTokenByRefreshToken(); err == nil {
|
||||
return string(utils.MustMarshal(tokenInfo)), utils.Time2Str(time.Now().Add((time.Duration(tokenInfo.ExpiresIn) - weimobTokenExpires/time.Second) * time.Second))
|
||||
}
|
||||
} else {
|
||||
curToken := ""
|
||||
if tokenInfo := api.WeimobAPI.GetToken(); tokenInfo != nil {
|
||||
curToken = string(utils.MustMarshal(tokenInfo))
|
||||
}
|
||||
if tokenInfo := getWeimobTokenFromRemote(curToken); tokenInfo != nil {
|
||||
expireTimeStr = utils.Time2Str(time.Now().Add(-weimobTokenExpires))
|
||||
token = tokenInfo.Token
|
||||
}
|
||||
}
|
||||
return "", ""
|
||||
return token, expireTimeStr
|
||||
}, func(value string) {
|
||||
var tokenInfo *weimobapi.TokenInfo
|
||||
err := utils.UnmarshalUseNumber([]byte(value), &tokenInfo)
|
||||
if err == nil {
|
||||
syseventhub.SysEventHub.OnNewWeimobToken(string(utils.MustMarshal(tokenInfo)))
|
||||
api.WeimobAPI.SetToken(tokenInfo)
|
||||
}
|
||||
})
|
||||
@@ -230,66 +199,98 @@ func SaveWeimobToken(token *weimobapi.TokenInfo) (err error) {
|
||||
}
|
||||
|
||||
func RefreshYilianyunToken() (err error) {
|
||||
return RefreshConfig("yilianyun", yilianyunTokenExpires, func() (string, string) {
|
||||
return RefreshConfig("yilianyun", yilianyunTokenExpires, func() (token string, expireTimeStr string) {
|
||||
globals.SugarLogger.Debugf("RefreshYilianyunToken RunMode:%s", beego.BConfig.RunMode)
|
||||
if globals.IsProductEnv() {
|
||||
if globals.IsMainProductEnv() { // 只有京西菜市刷新易联云key
|
||||
if tokenInfo, err := api.YilianyunAPI.RetrieveToken(); err == nil {
|
||||
return string(utils.MustMarshal(tokenInfo)), ""
|
||||
} else {
|
||||
globals.SugarLogger.Errorf("RefreshYilianyunToken RefreshToken failed with error:%v", err)
|
||||
}
|
||||
if globals.IsMainProductEnv() { // 只有京西菜市刷新易联云key
|
||||
if tokenInfo, err := api.YilianyunAPI.RetrieveToken(); err == nil {
|
||||
token = string(utils.MustMarshal(tokenInfo))
|
||||
} else {
|
||||
globals.SugarLogger.Errorf("RefreshYilianyunToken RefreshToken failed with error:%v", err)
|
||||
}
|
||||
} else {
|
||||
if tokenInfo := getYLYTokenFromRemote(api.YilianyunAPI.GetToken()); tokenInfo != nil {
|
||||
expireTimeStr = utils.Time2Str(time.Now().Add(-yilianyunTokenExpires))
|
||||
token = tokenInfo.Token
|
||||
}
|
||||
}
|
||||
return "", ""
|
||||
return token, expireTimeStr
|
||||
}, func(value string) {
|
||||
token := value
|
||||
var tokenInfo *yilianyunapi.TokenInfo
|
||||
err := utils.UnmarshalUseNumber([]byte(value), &tokenInfo)
|
||||
if err == nil {
|
||||
api.YilianyunAPI.SetToken(tokenInfo.AccessToken)
|
||||
if err := utils.TryUnmarshalUseNumber([]byte(value), &tokenInfo); err == nil {
|
||||
token = tokenInfo.AccessToken
|
||||
}
|
||||
syseventhub.SysEventHub.OnNewYLYToken(token)
|
||||
api.YilianyunAPI.SetToken(token)
|
||||
})
|
||||
}
|
||||
|
||||
func getWXTokenFromRemote(oldToken string) (tokenInfo *syseventhub.WXTokenInfo) {
|
||||
if IsGetWXTokenFromRemote() {
|
||||
for {
|
||||
waitSecond := 5 * 60
|
||||
globals.SugarLogger.Debugf("getWXTokenFromProd1")
|
||||
response, err := http.Get(fmt.Sprintf("%s?accessKey=%s&oldToken=%s&waitSecond=%d", globals.GetWeixinTokenURL, globals.GetWeixinTokenKey, oldToken, waitSecond))
|
||||
globals.SugarLogger.Debugf("getWXTokenFromProd2 error:%v", err)
|
||||
if err == nil {
|
||||
defer response.Body.Close()
|
||||
if response.StatusCode == http.StatusOK {
|
||||
data, err2 := ioutil.ReadAll(response.Body)
|
||||
if err = err2; err == nil {
|
||||
var result CallResult
|
||||
if err = utils.UnmarshalUseNumber(data, &result); err == nil {
|
||||
if result.Code == "0" {
|
||||
if result.Data != "" {
|
||||
if err = utils.UnmarshalUseNumber([]byte(result.Data), &tokenInfo); err == nil && tokenInfo != nil {
|
||||
globals.SugarLogger.Debugf("getWXTokenFromProd:%s", utils.Format4Output(tokenInfo, false))
|
||||
break
|
||||
}
|
||||
func PollingRemotEvent(remoteURL string, waitSecond int, params map[string]interface{}) (tokenInfo *syseventhub.TokenInfo) {
|
||||
if waitSecond == 0 {
|
||||
waitSecond = 5 * 60
|
||||
}
|
||||
params2 := utils.MergeMaps(params, map[string]interface{}{
|
||||
"accessKey": globals.GetWeixinTokenKey,
|
||||
"waitSecond": waitSecond,
|
||||
})
|
||||
for {
|
||||
globals.SugarLogger.Debugf("PollingRemotEvent %s", remoteURL)
|
||||
response, err := http.Get(utils.GenerateGetURL(remoteURL, "", params2))
|
||||
globals.SugarLogger.Debugf("PollingRemotEvent2 %s error:%v", remoteURL, err)
|
||||
if err == nil {
|
||||
defer response.Body.Close()
|
||||
if response.StatusCode == http.StatusOK {
|
||||
data, err2 := ioutil.ReadAll(response.Body)
|
||||
if err = err2; err == nil {
|
||||
var result CallResult
|
||||
if err = utils.UnmarshalUseNumber(data, &result); err == nil {
|
||||
if result.Code == "0" {
|
||||
if result.Data != "" {
|
||||
if err = utils.UnmarshalUseNumber([]byte(result.Data), &tokenInfo); err == nil && tokenInfo != nil {
|
||||
globals.SugarLogger.Debugf("PollingRemotEvent %s:%s", remoteURL, utils.Format4Output(tokenInfo, false))
|
||||
break
|
||||
}
|
||||
} else {
|
||||
err = fmt.Errorf("return code is:%s", result.Code)
|
||||
}
|
||||
} else {
|
||||
err = fmt.Errorf("PollingRemotEvent %s return code is:%s", remoteURL, result.Code)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
err = platformapi.ErrHTTPCodeIsNot200
|
||||
}
|
||||
} else {
|
||||
err = platformapi.ErrHTTPCodeIsNot200
|
||||
}
|
||||
globals.SugarLogger.Infof("getWXTokenFromProd failed with error:%v", err)
|
||||
if err != nil {
|
||||
time.Sleep(errRefreshGap)
|
||||
}
|
||||
}
|
||||
globals.SugarLogger.Infof("PollingRemotEvent %s failed with error:%v", remoteURL, err)
|
||||
if err != nil {
|
||||
time.Sleep(errRefreshGap)
|
||||
}
|
||||
}
|
||||
return tokenInfo
|
||||
}
|
||||
|
||||
func IsGetWXTokenFromRemote() bool {
|
||||
return !globals.IsMainProductEnv() && globals.GetWeixinTokenKey != "" && globals.GetWeixinTokenURL != ""
|
||||
func getWXTokenFromRemote(oldToken string) (tokenInfo *syseventhub.TokenInfo) {
|
||||
if !globals.IsMainProductEnv() && globals.GetWeixinTokenKey != "" && globals.GetWeixinTokenURL != "" {
|
||||
tokenInfo = PollingRemotEvent(globals.GetWeixinTokenURL, 0, map[string]interface{}{
|
||||
"oldToken": oldToken,
|
||||
})
|
||||
}
|
||||
return tokenInfo
|
||||
}
|
||||
|
||||
func getYLYTokenFromRemote(oldToken string) (tokenInfo *syseventhub.TokenInfo) {
|
||||
if !globals.IsMainProductEnv() && globals.GetWeixinTokenKey != "" && globals.GetYLYTokenURL != "" {
|
||||
tokenInfo = PollingRemotEvent(globals.GetYLYTokenURL, 0, map[string]interface{}{
|
||||
"oldToken": oldToken,
|
||||
})
|
||||
}
|
||||
return tokenInfo
|
||||
}
|
||||
|
||||
func getWeimobTokenFromRemote(oldToken string) (tokenInfo *syseventhub.TokenInfo) {
|
||||
if !globals.IsMainProductEnv() && globals.GetWeixinTokenKey != "" && globals.GetWeimobTokenURL != "" {
|
||||
tokenInfo = PollingRemotEvent(globals.GetWeimobTokenURL, 0, map[string]interface{}{
|
||||
"oldToken": oldToken,
|
||||
})
|
||||
}
|
||||
return tokenInfo
|
||||
}
|
||||
|
||||
@@ -59,7 +59,7 @@ type Act struct {
|
||||
Status int `json:"status"`
|
||||
LimitUser int `json:"limitUser"` // 是否按用户限制
|
||||
LimitDaily int `json:"limitDaily"` // 每日限购单数
|
||||
LimitCount int `json:"limitCount"` // 第单限购数量
|
||||
LimitCount int `json:"limitCount"` // 每单限购数量
|
||||
Source string `orm:"size(255)" json:"source"`
|
||||
CreateType int `json:"createType"`
|
||||
PricePercentage int `json:"pricePercentage"` // 单品级活动才有效
|
||||
|
||||
@@ -36,6 +36,7 @@ type GoodsOrderExt struct {
|
||||
|
||||
type OrderSkuExt struct {
|
||||
OrderSku
|
||||
NameID int `orm:"column(name_id)" json:"nameID"`
|
||||
FullSkuName string `json:"fullSkuName"`
|
||||
Image string `json:"image"`
|
||||
RealEarningPrice int64 `json:"realEarningPrice"` // 实际单品结算给门店老板钱
|
||||
|
||||
@@ -101,6 +101,10 @@ func getStoreDetail(db *DaoDB, storeID, vendorID int, vendorStoreID string) (sto
|
||||
if err = GetRow(db, storeDetail, sql, sqlParams...); err == nil {
|
||||
storeDetail.PricePercentagePackObj = PricePercentagePack2Obj(storeDetail.PricePercentagePackStr)
|
||||
storeDetail.FreightDeductionPackObj = FreightDeductionPack2Obj(storeDetail.FreightDeductionPackStr)
|
||||
if vendorID == model.VendorIDJX {
|
||||
storeDetail.VendorStatus = storeDetail.Status
|
||||
storeDetail.PricePercentage = 100
|
||||
}
|
||||
return storeDetail, nil
|
||||
}
|
||||
return nil, err
|
||||
@@ -114,16 +118,8 @@ func GetStoreDetailByVendorStoreID(db *DaoDB, vendorStoreID string, vendorID int
|
||||
if vendorID != model.VendorIDJX {
|
||||
return getStoreDetail(db, 0, vendorID, vendorStoreID)
|
||||
}
|
||||
store := &model.Store{}
|
||||
store.ID = int(utils.Str2Int64WithDefault(vendorStoreID, 0))
|
||||
if err = GetEntity(db, store); err == nil {
|
||||
// todo 还要补全其它参数
|
||||
storeDetail = &StoreDetail{
|
||||
Store: *store,
|
||||
VendorStoreID: vendorStoreID,
|
||||
VendorStatus: store.Status,
|
||||
PricePercentage: 100,
|
||||
}
|
||||
if storeDetail, err = getStoreDetail(db, int(utils.Str2Int64WithDefault(vendorStoreID, 0)), vendorID, ""); err == nil {
|
||||
storeDetail.VendorStoreID = vendorStoreID
|
||||
}
|
||||
return storeDetail, err
|
||||
}
|
||||
|
||||
@@ -164,7 +164,7 @@ func GetSkusCategories(db *DaoDB, vendorID, storeID int, skuIDs []int, level int
|
||||
|
||||
// 单门店模式厂商适用
|
||||
// 单纯的从已经创建的store_sku_category_map中,得到相关的同步信息
|
||||
func GetStoreCategories(db *DaoDB, vendorID, storeID int, level int, isDirty bool) (cats []*SkuStoreCatInfo, err error) {
|
||||
func GetStoreCategories(db *DaoDB, vendorID, storeID int, level int, mustDirty bool) (cats []*SkuStoreCatInfo, err error) {
|
||||
fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[vendorID])
|
||||
sql := `
|
||||
SELECT t4.*,
|
||||
@@ -183,7 +183,7 @@ func GetStoreCategories(db *DaoDB, vendorID, storeID int, level int, isDirty boo
|
||||
storeID,
|
||||
utils.DefaultTimeValue,
|
||||
}
|
||||
if isDirty {
|
||||
if mustDirty {
|
||||
sql += " AND t5.%s_sync_status <> 0"
|
||||
fieldPrefixParams = append(fieldPrefixParams, fieldPrefix)
|
||||
}
|
||||
@@ -204,7 +204,7 @@ func GetDirtyStoreCategories(db *DaoDB, vendorID, storeID int, level int) (cats
|
||||
// 以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) {
|
||||
func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty bool) (skus []*StoreSkuSyncInfo, err error) {
|
||||
if vendorID < 0 {
|
||||
panic("vendorID<0")
|
||||
}
|
||||
@@ -275,7 +275,7 @@ func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, isDirty bool)
|
||||
sql += " AND t1.store_id = ?"
|
||||
sqlParams = append(sqlParams, storeID)
|
||||
}
|
||||
if isDirty {
|
||||
if mustDirty {
|
||||
sql += " AND (t1.%s_sync_status <> 0 OR (%s.%s_id <> 0 AND t3.id IS NULL))"
|
||||
fmtParams = append(fmtParams, fieldPrefix, tableName, fieldPrefix)
|
||||
} else {
|
||||
|
||||
@@ -116,9 +116,10 @@ type UserDeliveryAddress struct {
|
||||
Tag string `orm:"size(32)" json:"tag"`
|
||||
ConsigneeName string `orm:"size(32)" json:"consigneeName"`
|
||||
ConsigneeMobile string `orm:"size(32)" json:"consigneeMobile"`
|
||||
Address string `orm:"size(255)" json:"address"` // 这个是用户手输入的详细地址
|
||||
Lng float64 `orm:"digits(10);decimals(6)" json:"lng"` // 乘了10的6次方
|
||||
Lat float64 `orm:"digits(10);decimals(6)" json:"lat"` // 乘了10的6次方
|
||||
Address string `orm:"size(255)" json:"address"` // 地址(区县以下,门牌号以上的地址信息)
|
||||
DetailAddress string `orm:"size(255)" json:"detailAddress"` // 门牌号
|
||||
Lng float64 `orm:"digits(10);decimals(6)" json:"lng"`
|
||||
Lat float64 `orm:"digits(10);decimals(6)" json:"lat"`
|
||||
|
||||
AutoAddress string `orm:"size(255)" json:"autoAddress"` // 这个是通过坐标自动获取的结构化的地址
|
||||
CityCode int `orm:"default(0);null" json:"cityCode"` // 根据坐标获得
|
||||
@@ -142,11 +143,12 @@ type UserCartItem struct {
|
||||
|
||||
UserID string `orm:"size(48);column(user_id)" json:"userID"`
|
||||
StoreID int `orm:"column(store_id)" json:"storeID"`
|
||||
SkuID int `orm:"column(sku_id)"`
|
||||
SkuID int `orm:"column(sku_id)" json:"skuID"`
|
||||
ActID int `orm:"column(act_id)" json:"actID"`
|
||||
|
||||
Count int `json:"count"`
|
||||
Price int `json:"price"`
|
||||
Count int `json:"count"`
|
||||
Price int `json:"price"`
|
||||
IsChecked int8 `json:"isChecked"`
|
||||
}
|
||||
|
||||
func (*UserCartItem) TableUnique() [][]string {
|
||||
|
||||
@@ -149,7 +149,7 @@ type ISingleStoreStoreSkuHandler interface {
|
||||
GetStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID, catName string) (cat *BareCategoryInfo, err error)
|
||||
CreateStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeCat *dao.SkuStoreCatInfo) (err error)
|
||||
UpdateStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeCat *dao.SkuStoreCatInfo) (err error)
|
||||
DeleteStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID, vendorCatID string) (err error)
|
||||
DeleteStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID, vendorCatID string, level int) (err error)
|
||||
DeleteStoreAllCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, vendorStoreID string, isContinueWhenError bool) (err error)
|
||||
|
||||
IsErrCategoryExist(err error) (isExist bool)
|
||||
|
||||
@@ -17,12 +17,11 @@ import (
|
||||
"git.rosy.net.cn/jx-callback/globals/api"
|
||||
)
|
||||
|
||||
const (
|
||||
defVendorCatID = 201222934 // 其他蔬菜
|
||||
)
|
||||
|
||||
var (
|
||||
defCatMap = map[int]int64{
|
||||
1: 151301831158987, // 休闲食品
|
||||
2: 15347484581335, // 蔬菜类
|
||||
3: 15347484581339, // 其他蔬菜类休闲食品
|
||||
}
|
||||
sensitiveWordRegexp = regexp.MustCompile(`商品名称中含有敏感词(\[.*\])`)
|
||||
)
|
||||
|
||||
@@ -95,7 +94,7 @@ func (p *PurchaseHandler) UpdateStoreCategory(ctx *jxcontext.Context, storeID in
|
||||
return err
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) DeleteStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID, vendorCatID string) (err error) {
|
||||
func (p *PurchaseHandler) DeleteStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID, vendorCatID string, level int) (err error) {
|
||||
if globals.EnableEbaiStoreWrite {
|
||||
err = api.EbaiAPI.ShopCategoryDelete(utils.Int2Str(storeID), utils.Str2Int64WithDefault(vendorCatID, 0))
|
||||
}
|
||||
@@ -252,11 +251,9 @@ func genSkuParamsFromStoreSkuInfo2(storeSku *dao.StoreSkuSyncInfo, isCreate bool
|
||||
"left_num": model.MaxStoreSkuStockQty,
|
||||
"category_id": utils.Str2Int64(storeSku.VendorCatID),
|
||||
"predict_cat": 0, // 不使用推荐类目
|
||||
// "cat1_id": getEbaiCat(storeSku.VendorVendorCatID3, 1),
|
||||
// "cat2_id": getEbaiCat(storeSku.VendorVendorCatID2, 2),
|
||||
"cat3_id": getEbaiCat(storeSku.VendorVendorCatID, 3),
|
||||
"weight": storeSku.Weight,
|
||||
"photos": photos,
|
||||
"cat3_id": getEbaiCat(storeSku.VendorVendorCatID),
|
||||
"weight": storeSku.Weight,
|
||||
"photos": photos,
|
||||
}
|
||||
if storeSku.DescImg != "" {
|
||||
params["rtf"] = storeSku.DescImg
|
||||
@@ -292,9 +289,9 @@ func jxSkuStatus2Ebai(status int) int {
|
||||
return ebaiapi.SkuStatusOnline
|
||||
}
|
||||
|
||||
func getEbaiCat(catID int64, level int) int64 {
|
||||
func getEbaiCat(catID int64) int64 {
|
||||
if catID == 0 {
|
||||
return defCatMap[level]
|
||||
return defVendorCatID
|
||||
}
|
||||
return catID
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package mtwm
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"math"
|
||||
"net/url"
|
||||
"regexp"
|
||||
"strings"
|
||||
@@ -571,19 +572,29 @@ func (c *PurchaseHandler) ListOrders(ctx *jxcontext.Context, parentTask tasksch.
|
||||
vendorStoreID := batchItemList[0].(string)
|
||||
var orderIDs []string
|
||||
seqStart := 1
|
||||
i := 0
|
||||
for {
|
||||
seqEnd := seqStart + mtwmapi.MaxGap4GetOrderIdByDaySeq - 1
|
||||
tmpOrderIDs, err2 := api.MtwmAPI.GetOrderIdByDaySeq(vendorStoreID, queryDate, seqStart, seqEnd)
|
||||
batchSize := int(math.Min(math.Pow(2, float64(i*3)), float64(mtwmapi.MaxGap4GetOrderIdByDaySeq)))
|
||||
seqEnd := seqStart + batchSize - 1
|
||||
var tmpOrderIDs []int64
|
||||
if seqStart == seqEnd {
|
||||
if vendorOderID, err2 := api.MtwmAPI.GetOrderIdByDaySeqSingle(vendorStoreID, queryDate, seqStart); err2 == nil {
|
||||
tmpOrderIDs = []int64{vendorOderID}
|
||||
}
|
||||
} else {
|
||||
tmpOrderIDs, err = api.MtwmAPI.GetOrderIdByDaySeq(vendorStoreID, queryDate, seqStart, seqEnd)
|
||||
}
|
||||
if len(tmpOrderIDs) > 0 {
|
||||
for _, v := range tmpOrderIDs {
|
||||
orderIDs = append(orderIDs, utils.Int64ToStr(v))
|
||||
}
|
||||
}
|
||||
if err = err2; err != nil || len(tmpOrderIDs) == 0 {
|
||||
if err != nil || len(tmpOrderIDs) < batchSize {
|
||||
err = nil
|
||||
break
|
||||
}
|
||||
seqStart = seqEnd + 1
|
||||
i++
|
||||
}
|
||||
retVal = orderIDs
|
||||
return retVal, nil
|
||||
@@ -609,7 +620,7 @@ func (c *PurchaseHandler) ListOrders(ctx *jxcontext.Context, parentTask tasksch.
|
||||
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)
|
||||
result, err2 := api.MtwmAPI.OrderBatchPullPhoneNumber(vendorStoreID, offset, mtwmapi.MaxBatchPullPhoneNumberLimit)
|
||||
if err = err2; err == nil {
|
||||
for _, v := range result {
|
||||
v2 := &partner.OrderPhoneNumberInfo{
|
||||
@@ -635,7 +646,7 @@ func (p *PurchaseHandler) GetOrderConsigneeNumber(ctx *jxcontext.Context, storeI
|
||||
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)
|
||||
result, err2 := api.MtwmAPI.OrderGetRiderInfoPhoneNumber(vendorStoreID, offset, mtwmapi.MaxBatchPullPhoneNumberLimit)
|
||||
if err = err2; err == nil {
|
||||
for _, v := range result {
|
||||
numberList = append(numberList, &partner.OrderPhoneNumberInfo{
|
||||
|
||||
@@ -37,8 +37,10 @@ func (p *PurchaseHandler) GetStoreSkusBatchSize(funcID int) (batchSize int) {
|
||||
batchSize = mtwmapi.MaxStoreSkuBatchSize
|
||||
case partner.FuncDeleteStoreSkus:
|
||||
batchSize = 1 // 可考虑用批量操作
|
||||
case partner.FuncCreateStoreSkus, partner.FuncUpdateStoreSkus:
|
||||
case partner.FuncCreateStoreSkus:
|
||||
batchSize = 1 // 可考虑用批量操作
|
||||
case partner.FuncUpdateStoreSkus:
|
||||
batchSize = mtwmapi.MaxStoreSkuBatchSize
|
||||
case partner.FuncGetStoreSkusFullInfo:
|
||||
batchSize = 1
|
||||
}
|
||||
@@ -162,9 +164,23 @@ func (p *PurchaseHandler) UpdateStoreCategory(ctx *jxcontext.Context, storeID in
|
||||
return p.CreateStoreCategory(ctx, storeID, vendorStoreID, storeCat)
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) DeleteStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID, vendorCatID string) (err error) {
|
||||
if globals.EnableMtwmStoreWrite {
|
||||
err = api.MtwmAPI.RetailCatDelete(vendorStoreID, tryCatName2Code(vendorCatID), vendorCatID)
|
||||
func (p *PurchaseHandler) DeleteStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID, vendorCatID string, level int) (err error) {
|
||||
if false {
|
||||
if globals.EnableMtwmStoreWrite {
|
||||
err = api.MtwmAPI.RetailCatDelete(vendorStoreID, tryCatName2Code(vendorCatID), vendorCatID)
|
||||
}
|
||||
} else {
|
||||
var catCodes []string
|
||||
if catCode := tryCatName2Code(vendorCatID); catCode != "" {
|
||||
catCodes = []string{catCode}
|
||||
}
|
||||
if globals.EnableMtwmStoreWrite {
|
||||
if level == 1 {
|
||||
err = api.MtwmAPI.RetailCatSkuBatchDelete2(ctx.GetTrackInfo(), vendorStoreID, catCodes, []string{vendorCatID}, nil, nil, nil)
|
||||
} else {
|
||||
err = api.MtwmAPI.RetailCatSkuBatchDelete2(ctx.GetTrackInfo(), vendorStoreID, nil, nil, catCodes, []string{vendorCatID}, nil)
|
||||
}
|
||||
}
|
||||
}
|
||||
return err
|
||||
}
|
||||
@@ -292,6 +308,8 @@ func storeSku2Mtwm(storeSkuList []*partner.StoreSkuInfo, updateType int) (skuLis
|
||||
skuInfo.Skus[0].Stock = stockCount2Mtwm(storeSku.Stock)
|
||||
} else if updateType == updateTypePrice {
|
||||
skuInfo.Skus[0].Price = jxutils.IntPrice2StandardString(storeSku.VendorPrice)
|
||||
} else {
|
||||
skuInfo.Skus = nil
|
||||
}
|
||||
skuList = append(skuList, skuInfo)
|
||||
}
|
||||
|
||||
@@ -64,7 +64,7 @@ func (p *PurchaseHandler) UpdateStoreCategory(ctx *jxcontext.Context, vendorStor
|
||||
return err
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) DeleteStoreCategory(ctx *jxcontext.Context, vendorStoreID, vendorCatID string) (err error) {
|
||||
func (p *PurchaseHandler) DeleteStoreCategory(ctx *jxcontext.Context, vendorStoreID, vendorCatID string, level int) (err error) {
|
||||
if globals.EnableWscStoreWrite {
|
||||
err = api.WeimobAPI.UpdateClassify(utils.Str2Int64WithDefault(vendorCatID, 0), composeFakeDelName(vendorCatID), "")
|
||||
}
|
||||
|
||||
@@ -58,7 +58,7 @@ func (p *DefSingleStorePlatform) DeleteStoreAllCategories(ctx *jxcontext.Context
|
||||
vendorCatIDs[k] = v.VendorCatID
|
||||
}
|
||||
err = FreeBatchCategoryIDOp(func(vendorCatID string) (err error) {
|
||||
return p.DeleteStoreCategory(ctx, storeID, vendorStoreID, vendorCatID)
|
||||
return p.DeleteStoreCategory(ctx, storeID, vendorStoreID, vendorCatID, step)
|
||||
}, ctx, task, vendorCatIDs, isContinueWhenError)
|
||||
return nil, err
|
||||
}, len(levelList))
|
||||
|
||||
@@ -118,7 +118,8 @@ weixinToken = "17_roSCZgkCxhRnyFVtei0KdfHwdGP8PmLzJFhCieka4_X4_d-lgfaTxF6oIS6FE5
|
||||
|
||||
dbConnectStr = "root:WebServer@1@tcp(127.0.0.1:3306)/jxd_dev_0?charset=utf8mb4&loc=Local&parseTime=true"
|
||||
|
||||
getWeixinTokenURL = "http://beta.jxc4.com/v2/sys/GetWXToken"
|
||||
getWeixinTokenURL = "http://www.jxc4.com/v2/sys/GetWXToken"
|
||||
getYLYTokenURL = "http://www.jxc4.com/v2/sys/GetYLYToken"
|
||||
|
||||
[prod]
|
||||
EnableDocs = false
|
||||
@@ -155,6 +156,7 @@ enableEbaiStoreWrite = true
|
||||
enableMtwmStoreWrite = true
|
||||
enableWscStoreWrite = true
|
||||
|
||||
disableWeimob = false
|
||||
weimobCallbackURL = "http://callback.jxc4.com/weimob"
|
||||
|
||||
dingdingAgentID = 239461075
|
||||
@@ -214,6 +216,8 @@ dingdingQRCodeSecret = "N9dyC9qB84sauQPs4_JYrILMsG5Krqm9-PSSVJ8t9hb87rrHiFUirISx
|
||||
dingdingCallbackURL = "http://callback-jxgy.jxc4.com/dingding/msg"
|
||||
|
||||
getWeixinTokenURL = "http://www.jxc4.com/v2/sys/GetWXToken"
|
||||
getYLYTokenURL = "http://www.jxc4.com/v2/sys/GetYLYToken"
|
||||
|
||||
storeName = "京西果园"
|
||||
|
||||
[test]
|
||||
@@ -306,6 +310,8 @@ weixinSecret = "6bbbed1443cc062c20a015a64c07a531"
|
||||
weixinMiniAppID2 = "wx4b5930c13f8b1170"
|
||||
weixinMiniSecret2 = "2a57228a716ce991a52739f0ff41111d"
|
||||
|
||||
disableWeimob = false
|
||||
getWeixinTokenURL = "http://www.jxc4.com/v2/sys/GetWXToken"
|
||||
getWeimobTokenURL = "http://www.jxc4.com/v2/sys/GetWeimobToken"
|
||||
|
||||
dbConnectStr = "root:WebServer@1@tcp(127.0.0.1:3306)/jxd_dev_0?charset=utf8mb4&loc=Local&parseTime=true"
|
||||
|
||||
@@ -115,7 +115,7 @@ func (c *SyncController) FullSyncStoresSkus() {
|
||||
if err = jxutils.Strings2Objs(params.StoreIDs, &storeIDs, params.VendorIDs, &vendorIDs); err != nil {
|
||||
return retVal, "", err
|
||||
}
|
||||
retVal, err = cms.CurVendorSync.FullSyncStoresSkus(params.Ctx, db, vendorIDs, storeIDs, params.IsAsync, params.IsContinueWhenError)
|
||||
retVal, err = cms.CurVendorSync.FullSyncStoresSkus(params.Ctx, db, vendorIDs, storeIDs, true, params.IsAsync, params.IsContinueWhenError)
|
||||
return retVal, "", err
|
||||
})
|
||||
}
|
||||
|
||||
@@ -255,19 +255,19 @@ func (c *User2Controller) TransferLegacyWeixins() {
|
||||
// @Param token header string true "认证token"
|
||||
// @Param consigneeName formData string true "收货人"
|
||||
// @Param consigneeMobile formData string true "收货人手机"
|
||||
// @Param address formData string true "详细地址"
|
||||
// @Param address formData string false "地址(区县以下,门牌号以上的地址信息)"
|
||||
// @Param detailAddress formData string false "门牌号"
|
||||
// @Param lng formData float64 true "经度"
|
||||
// @Param lat formData float64 true "纬度"
|
||||
// @Param tag formData string false "标签"
|
||||
// @Param remark formData string false "备注"
|
||||
// @Param isDefault formData bool false "是否是默认"
|
||||
// @Param isDefault formData int false "是否是默认"
|
||||
// @Success 200 {object} controllers.CallResult
|
||||
// @Failure 200 {object} controllers.CallResult
|
||||
// @router /AddMyDeliveryAddress [post]
|
||||
func (c *User2Controller) AddMyDeliveryAddress() {
|
||||
c.callAddMyDeliveryAddress(func(params *tUser2AddMyDeliveryAddressParams) (retVal interface{}, errCode string, err error) {
|
||||
var address *model.UserDeliveryAddress
|
||||
params.MapData["isDefault"] = utils.Bool2Int(params.IsDefault)
|
||||
if err = utils.Map2StructByJson(params.MapData, &address, true); err == nil {
|
||||
retVal, err = cms.AddMyDeliveryAddress(params.Ctx, address)
|
||||
}
|
||||
@@ -278,13 +278,13 @@ func (c *User2Controller) AddMyDeliveryAddress() {
|
||||
// @Title 用户自己删除配送地址
|
||||
// @Description 用户自己删除送地址
|
||||
// @Param token header string true "认证token"
|
||||
// @Param addressID query int true "地址ID"
|
||||
// @Param id query int true "地址ID"
|
||||
// @Success 200 {object} controllers.CallResult
|
||||
// @Failure 200 {object} controllers.CallResult
|
||||
// @router /DeleteMyDeliveryAddress [delete]
|
||||
func (c *User2Controller) DeleteMyDeliveryAddress() {
|
||||
c.callDeleteMyDeliveryAddress(func(params *tUser2DeleteMyDeliveryAddressParams) (retVal interface{}, errCode string, err error) {
|
||||
err = cms.DeleteMyDeliveryAddress(params.Ctx, params.AddressID)
|
||||
err = cms.DeleteMyDeliveryAddress(params.Ctx, params.Id)
|
||||
return retVal, "", err
|
||||
})
|
||||
}
|
||||
@@ -292,10 +292,11 @@ func (c *User2Controller) DeleteMyDeliveryAddress() {
|
||||
// @Title 用户自己修改配送地址
|
||||
// @Description 用户自己修改配送地址
|
||||
// @Param token header string true "认证token"
|
||||
// @Param addressID formData int true "地址ID"
|
||||
// @Param id formData int true "地址ID"
|
||||
// @Param consigneeName formData string false "收货人"
|
||||
// @Param consigneeMobile formData string false "收货人手机"
|
||||
// @Param address formData string false "详细地址"
|
||||
// @Param address formData string false "地址(区县以下,门牌号以上的地址信息)"
|
||||
// @Param detailAddress formData string false "门牌号"
|
||||
// @Param lng formData float64 false "经度"
|
||||
// @Param lat formData float64 false "纬度"
|
||||
// @Param tag formData string false "标签"
|
||||
@@ -306,7 +307,7 @@ func (c *User2Controller) DeleteMyDeliveryAddress() {
|
||||
// @router /UpdateMyDeliveryAddress [put]
|
||||
func (c *User2Controller) UpdateMyDeliveryAddress() {
|
||||
c.callUpdateMyDeliveryAddress(func(params *tUser2UpdateMyDeliveryAddressParams) (retVal interface{}, errCode string, err error) {
|
||||
err = cms.UpdateMyDeliveryAddress(params.Ctx, params.AddressID, params.MapData)
|
||||
err = cms.UpdateMyDeliveryAddress(params.Ctx, params.Id, params.MapData)
|
||||
return retVal, "", err
|
||||
})
|
||||
}
|
||||
@@ -327,14 +328,17 @@ func (c *User2Controller) QueryMyDeliveryAddress() {
|
||||
// @Title 得到用户指定门店的购物车信息
|
||||
// @Description 得到用户指定门店的购物车信息
|
||||
// @Param token header string true "认证token"
|
||||
// @Param storeID query int true "门店ID"
|
||||
// @Param storeIDs query string true "门店ID"
|
||||
// @Success 200 {object} controllers.CallResult
|
||||
// @Failure 200 {object} controllers.CallResult
|
||||
// @router /LoadMyCart [get]
|
||||
func (c *User2Controller) LoadMyCart() {
|
||||
c.callLoadMyCart(func(params *tUser2LoadMyCartParams) (retVal interface{}, errCode string, err error) {
|
||||
_, userID := params.Ctx.GetMobileAndUserID()
|
||||
retVal, err = cms.LoadUserCart(params.Ctx, userID, params.StoreID)
|
||||
var storeIDs []int
|
||||
if err = jxutils.Strings2Objs(params.StoreIDs, &storeIDs); err == nil {
|
||||
retVal, err = cms.LoadUserCart(params.Ctx, userID, storeIDs)
|
||||
}
|
||||
return retVal, "", err
|
||||
})
|
||||
}
|
||||
@@ -343,7 +347,7 @@ func (c *User2Controller) LoadMyCart() {
|
||||
// @Description 存储用户指定门店的购物车信息
|
||||
// @Param token header string true "认证token"
|
||||
// @Param storeID formData int true "门店ID"
|
||||
// @Param payload formData string true "完整的购物车商品列表"
|
||||
// @Param payload formData string false "完整的购物车商品列表"
|
||||
// @Success 200 {object} controllers.CallResult
|
||||
// @Failure 200 {object} controllers.CallResult
|
||||
// @router /SaveMyCart [post]
|
||||
|
||||
@@ -42,12 +42,13 @@ func (c *InitDataController) InitSkuName() {
|
||||
// @Description 初始化vendor category(当前只有美团外卖的通过这个设置)
|
||||
// @Param token header string true "认证token"
|
||||
// @Param vendorID formData int true "厂商ID"
|
||||
// @Param isAsync formData bool false "是否异步操作"
|
||||
// @Success 200 {object} controllers.CallResult
|
||||
// @Failure 200 {object} controllers.CallResult
|
||||
// @router /InitVendorCategory [post]
|
||||
func (c *InitDataController) InitVendorCategory() {
|
||||
c.callInitVendorCategory(func(params *tInitdataInitVendorCategoryParams) (retVal interface{}, errCode string, err error) {
|
||||
retVal, err = initdata.InitVendorCategory(params.Ctx, params.VendorID)
|
||||
retVal, err = initdata.InitVendorCategory(params.Ctx, params.VendorID, params.IsAsync)
|
||||
return retVal, "", err
|
||||
})
|
||||
}
|
||||
|
||||
@@ -283,7 +283,7 @@ func (c *OrderController) ExportMTWaybills() {
|
||||
// @Param pageSize query int false "结果页大小(缺省为50,-1表示全部)"
|
||||
// @Success 200 {object} controllers.CallResult
|
||||
// @Failure 200 {object} controllers.CallResult
|
||||
// @router /GetOrders [get]
|
||||
// @router /GetOrders [get,post]
|
||||
func (c *OrderController) GetOrders() {
|
||||
c.callGetOrders(func(params *tOrderGetOrdersParams) (retVal interface{}, errCode string, err error) {
|
||||
var skuIDs []int
|
||||
@@ -335,7 +335,7 @@ func (c *OrderController) ExportOrders() {
|
||||
// @Param pageSize query int false "结果页大小(缺省为50,-1表示全部)"
|
||||
// @Success 200 {object} controllers.CallResult
|
||||
// @Failure 200 {object} controllers.CallResult
|
||||
// @router /GetAfsOrders [get]
|
||||
// @router /GetAfsOrders [get,post]
|
||||
func (c *OrderController) GetAfsOrders() {
|
||||
c.callGetAfsOrders(func(params *tOrderGetAfsOrdersParams) (retVal interface{}, errCode string, err error) {
|
||||
timeList, err := jxutils.BatchStr2Time(params.FromTime, params.ToTime)
|
||||
|
||||
@@ -20,8 +20,8 @@ type SysController struct {
|
||||
beego.Controller
|
||||
}
|
||||
|
||||
// @Title 得到京西门店信息
|
||||
// @Description 得到京西门店信息,如下条件之间是与的关系
|
||||
// @Title 得到微信token
|
||||
// @Description 得到微信token
|
||||
// @Param accessKey query string true "假token"
|
||||
// @Param oldToken query string false "之前的token"
|
||||
// @Param waitSecond query int false "等待秒数"
|
||||
@@ -37,6 +37,40 @@ func (c *SysController) GetWXToken() {
|
||||
})
|
||||
}
|
||||
|
||||
// @Title 得到易联云token
|
||||
// @Description 得到易联云token
|
||||
// @Param accessKey query string true "假token"
|
||||
// @Param oldToken query string false "之前的token"
|
||||
// @Param waitSecond query int false "等待秒数"
|
||||
// @Success 200 {object} controllers.CallResult
|
||||
// @Failure 200 {object} controllers.CallResult
|
||||
// @router /GetYLYToken [get]
|
||||
func (c *SysController) GetYLYToken() {
|
||||
c.callGetYLYToken(func(params *tSysGetYLYTokenParams) (retVal interface{}, errCode string, err error) {
|
||||
if params.AccessKey == globals.GetWeixinTokenKey {
|
||||
retVal = syseventhub.SysEventHub.GetYLYToken(params.OldToken, time.Duration(params.WaitSecond)*time.Second)
|
||||
}
|
||||
return retVal, "", err
|
||||
})
|
||||
}
|
||||
|
||||
// @Title 得到微盟token
|
||||
// @Description 得到微盟token
|
||||
// @Param accessKey query string true "假token"
|
||||
// @Param oldToken query string false "之前的token"
|
||||
// @Param waitSecond query int false "等待秒数"
|
||||
// @Success 200 {object} controllers.CallResult
|
||||
// @Failure 200 {object} controllers.CallResult
|
||||
// @router /GetWeimobToken [get]
|
||||
func (c *SysController) GetWeimobToken() {
|
||||
c.callGetWeimobToken(func(params *tSysGetWeimobTokenParams) (retVal interface{}, errCode string, err error) {
|
||||
if params.AccessKey == globals.GetWeixinTokenKey {
|
||||
retVal = syseventhub.SysEventHub.GetWeimobToken(params.OldToken, time.Duration(params.WaitSecond)*time.Second)
|
||||
}
|
||||
return retVal, "", err
|
||||
})
|
||||
}
|
||||
|
||||
// @Title 得到饿百RTF转换内容
|
||||
// @Description 得到饿百RTF转换内容
|
||||
// @Param imgListStr query string true "逗号分隔的图片列表可以是转义后的"
|
||||
|
||||
@@ -3,6 +3,7 @@ package controllers
|
||||
import (
|
||||
"git.rosy.net.cn/baseapi/platformapi/weimobapi"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/tasks"
|
||||
"git.rosy.net.cn/jx-callback/business/cs"
|
||||
"git.rosy.net.cn/jx-callback/globals"
|
||||
"git.rosy.net.cn/jx-callback/globals/api"
|
||||
"github.com/astaxie/beego"
|
||||
@@ -15,10 +16,11 @@ type WeimobController struct {
|
||||
func (c *WeimobController) onCallbackMsg() {
|
||||
if true { //c.Ctx.Input.Method() == http.MethodPost {
|
||||
callbackResponse := weimobapi.SuccessResponse
|
||||
// msg, callbackResponse := api.WeimobAPI.GetCallbackMsg(c.Ctx.Input.RequestBody)
|
||||
// if callbackResponse == nil {
|
||||
// callbackResponse = wsc.OnCallbackMsg(msg)
|
||||
// }
|
||||
msg, callbackResponse := api.WeimobAPI.GetCallbackMsg(c.Ctx.Input.RequestBody)
|
||||
if callbackResponse == nil {
|
||||
// callbackResponse = wsc.OnCallbackMsg(msg)
|
||||
callbackResponse = cs.OnCallbackMsg(msg)
|
||||
}
|
||||
c.Data["json"] = callbackResponse
|
||||
c.ServeJSON()
|
||||
} else {
|
||||
|
||||
26
controllers/wxpay_callback.go
Normal file
26
controllers/wxpay_callback.go
Normal file
@@ -0,0 +1,26 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"git.rosy.net.cn/baseapi/platformapi/wxpay"
|
||||
"github.com/astaxie/beego"
|
||||
)
|
||||
|
||||
type WXPayController struct {
|
||||
beego.Controller
|
||||
}
|
||||
|
||||
func (c *WXPayController) Msg() {
|
||||
if c.Ctx.Input.Method() == http.MethodPost {
|
||||
var callbackResponse *wxpay.CallbackResponse
|
||||
|
||||
if callbackResponse == nil {
|
||||
callbackResponse = wxpay.SuccessResponse
|
||||
}
|
||||
c.Data["xml"] = callbackResponse
|
||||
c.ServeXML()
|
||||
} else {
|
||||
c.Abort("404")
|
||||
}
|
||||
}
|
||||
@@ -40,6 +40,8 @@ var (
|
||||
|
||||
GetWeixinTokenURL string
|
||||
GetWeixinTokenKey string
|
||||
GetYLYTokenURL string
|
||||
GetWeimobTokenURL string
|
||||
|
||||
StoreName string
|
||||
|
||||
@@ -82,6 +84,8 @@ func Init() {
|
||||
WxBackstageHost = beego.AppConfig.DefaultString("wxBackstageHost", "")
|
||||
|
||||
GetWeixinTokenURL = beego.AppConfig.DefaultString("getWeixinTokenURL", "")
|
||||
GetYLYTokenURL = beego.AppConfig.DefaultString("getYLYTokenURL", "")
|
||||
GetWeimobTokenURL = beego.AppConfig.DefaultString("getWeimobTokenURL", "")
|
||||
GetWeixinTokenKey = beego.AppConfig.DefaultString("getWeixinTokenKey", "")
|
||||
|
||||
StoreName = beego.AppConfig.DefaultString("storeName", "京西菜市")
|
||||
|
||||
12
main.go
12
main.go
@@ -118,14 +118,10 @@ func main() {
|
||||
globals.SugarLogger.Errorf("RefreshWeixinToken failed with error:%s", err)
|
||||
return
|
||||
}
|
||||
// if err := tasks.RefreshElmToken(); err != nil {
|
||||
// globals.SugarLogger.Errorf("RefreshElmToken failed with error:%s", err)
|
||||
// return
|
||||
// }
|
||||
// if err := tasks.RefreshWeimobToken(); err != nil {
|
||||
// globals.SugarLogger.Errorf("RefreshWeimobToken failed with error:%s", err)
|
||||
// return
|
||||
// }
|
||||
if err := tasks.RefreshWeimobToken(); err != nil {
|
||||
globals.SugarLogger.Errorf("RefreshWeimobToken failed with error:%s", err)
|
||||
return
|
||||
}
|
||||
if err := tasks.RefreshYilianyunToken(); err != nil {
|
||||
globals.SugarLogger.Errorf("RefreshYilianyunToken failed with error:%s", err)
|
||||
return
|
||||
|
||||
@@ -796,7 +796,7 @@ func init() {
|
||||
beego.ControllerComments{
|
||||
Method: "GetAfsOrders",
|
||||
Router: `/GetAfsOrders`,
|
||||
AllowHTTPMethods: []string{"get"},
|
||||
AllowHTTPMethods: []string{"get","post"},
|
||||
MethodParams: param.Make(),
|
||||
Filters: nil,
|
||||
Params: nil})
|
||||
@@ -841,7 +841,7 @@ func init() {
|
||||
beego.ControllerComments{
|
||||
Method: "GetOrders",
|
||||
Router: `/GetOrders`,
|
||||
AllowHTTPMethods: []string{"get"},
|
||||
AllowHTTPMethods: []string{"get","post"},
|
||||
MethodParams: param.Make(),
|
||||
Filters: nil,
|
||||
Params: nil})
|
||||
@@ -1647,6 +1647,24 @@ func init() {
|
||||
Filters: nil,
|
||||
Params: nil})
|
||||
|
||||
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SysController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SysController"],
|
||||
beego.ControllerComments{
|
||||
Method: "GetWeimobToken",
|
||||
Router: `/GetWeimobToken`,
|
||||
AllowHTTPMethods: []string{"get"},
|
||||
MethodParams: param.Make(),
|
||||
Filters: nil,
|
||||
Params: nil})
|
||||
|
||||
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SysController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SysController"],
|
||||
beego.ControllerComments{
|
||||
Method: "GetYLYToken",
|
||||
Router: `/GetYLYToken`,
|
||||
AllowHTTPMethods: []string{"get"},
|
||||
MethodParams: param.Make(),
|
||||
Filters: nil,
|
||||
Params: nil})
|
||||
|
||||
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TaskController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TaskController"],
|
||||
beego.ControllerComments{
|
||||
Method: "CancelTask",
|
||||
|
||||
@@ -138,6 +138,7 @@ func init() {
|
||||
beego.AutoRouter(&controllers.WeimobController{})
|
||||
beego.AutoRouter(&controllers.WeixinController{})
|
||||
beego.AutoRouter(&controllers.DingDingController{})
|
||||
beego.AutoRouter(&controllers.WXPayController{})
|
||||
|
||||
// 如下都是用于检测存活的空接口
|
||||
beego.Any("/", func(ctx *beecontext.Context) {
|
||||
|
||||
Reference in New Issue
Block a user