1
This commit is contained in:
@@ -5,7 +5,6 @@ import (
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"git.rosy.net.cn/jx-callback/globals"
|
||||
"regexp"
|
||||
"strings"
|
||||
"time"
|
||||
@@ -286,7 +285,6 @@ func LoginInternal(ctx *Context, authType, authID, authIDType, authSecret string
|
||||
//如果是小程序
|
||||
if authType == AuthTypeWXMini { // || authType == AuthTypeWXApp 此处AuthTypeWXApp没用上
|
||||
appID := strings.Split(authSecret, ",")[0]
|
||||
globals.SugarLogger.Debugf("authSecret=%s,appID=%s", authSecret, appID)
|
||||
// 菜市商家 // // // 京西商城
|
||||
if appID == model.JXC4BusinessAppId || appID == "wx2d6949f724b2541d" || appID == "wx18111a41fd17f24f" || appID == model.JXC4AppId { //菜市或者果园
|
||||
if authInfo.AuthBindInfo.UserID != "" {
|
||||
|
||||
@@ -75,7 +75,7 @@ func Init() {
|
||||
riderListInfo = list
|
||||
}
|
||||
|
||||
// AutoSettingFakeDelivery 抖音自动设置骑手, 推送假订单
|
||||
// AutoSettingFakeDelivery 抖音自动设置骑手(饿百), 推送假订单
|
||||
func AutoSettingFakeDelivery() {
|
||||
db := dao.GetDB()
|
||||
|
||||
@@ -106,9 +106,17 @@ func AutoSettingFakeDelivery() {
|
||||
riderKey := ""
|
||||
if strings.Contains(v.ConsigneeAddress, "重庆") || strings.Contains(v.ConsigneeAddress, "上海") || strings.Contains(v.ConsigneeAddress, "北京") {
|
||||
riderKey = strings.Split(v.ConsigneeAddress, "市")[0]
|
||||
} else {
|
||||
} else if strings.Contains(v.ConsigneeAddress, "省") {
|
||||
riderKey = strings.Split(v.ConsigneeAddress, "省")[0]
|
||||
} else {
|
||||
storeDetail, _ := dao.GetStoreDetail(db, v.JxStoreID, 0, "")
|
||||
if strings.Contains(storeDetail.Address, "重庆") || strings.Contains(storeDetail.Address, "上海") || strings.Contains(storeDetail.Address, "北京") {
|
||||
riderKey = strings.Split(storeDetail.Address, "市")[0]
|
||||
} else {
|
||||
riderKey = strings.Split(storeDetail.Address, "省")[0]
|
||||
}
|
||||
}
|
||||
|
||||
if len(riderListInfo[riderKey]) == model.NO {
|
||||
// 骑手列表
|
||||
configRiderList, err := dao.QueryConfigs(db, "riderList", "Sys", "")
|
||||
@@ -121,7 +129,7 @@ func AutoSettingFakeDelivery() {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
globals.SugarLogger.Debugf("===============riderListInfo= : %s", riderKey)
|
||||
randNumber, _ := rand.Int(rand.Reader, big.NewInt(int64(len(riderListInfo[riderKey]))))
|
||||
randTime := randNumber.Int64()
|
||||
if randTime < 0 {
|
||||
@@ -130,7 +138,7 @@ func AutoSettingFakeDelivery() {
|
||||
if randTime >= int64(len(riderListInfo[riderKey])) {
|
||||
randTime = int64(len(riderListInfo[riderKey])) - 1
|
||||
}
|
||||
if v.PhoneAscription == "" || strings.Split(v.PhoneAscription, "-")[0] != model.PhoneAscriptionAddressYes {
|
||||
if (v.PhoneAscription == "" || strings.Split(v.PhoneAscription, "-")[0] != model.PhoneAscriptionAddressYes) && v.VendorID == model.VendorIDDD {
|
||||
continue
|
||||
}
|
||||
// 自动拣货
|
||||
@@ -148,7 +156,6 @@ func AutoSettingFakeDelivery() {
|
||||
break
|
||||
}
|
||||
for riderName, riderPhone := range riderListInfo[riderKey][randTime] {
|
||||
globals.SugarLogger.Debugf("SelfDeliveringAndUpdateStatus : %s", v.VendorOrderID)
|
||||
if err := defsch.FixedScheduler.SelfDeliveringAndUpdateStatus(jxcontext.AdminCtx, v.VendorOrderID, v.VendorID, jxcontext.AdminCtx.GetUserName(), riderName, riderPhone); err != nil {
|
||||
globals.SugarLogger.Errorf("自动发货错误:[%v]", err)
|
||||
break
|
||||
|
||||
@@ -66,7 +66,6 @@ func notifyWxNewFakeJdOrder(order *model.GoodsOrder, storeID int) (err error) {
|
||||
}
|
||||
title := fmt.Sprintf("你有到家菜市新订单%d", order.OrderSeq)
|
||||
content := sb.String()
|
||||
// globals.SugarLogger.Debugf("notifyWxNewFakeJdOrder, orderID:%s, content:%s", order.VendorOrderID, content)
|
||||
_, err = weixinmsg.SendStoreMessage(jxcontext.AdminCtx, title, content, []int{storeID}, nil, "", model.MessageTypeStore, true, true)
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -67,19 +67,22 @@ func (c *OrderManager) onAfsOrderNew(afsOrder *model.AfsOrder, orderStatus *mode
|
||||
panic(r)
|
||||
}
|
||||
}()
|
||||
|
||||
isDuplicated, err := addOrderOrWaybillStatus(orderStatus, db)
|
||||
if err != nil || isDuplicated {
|
||||
if err != nil || (isDuplicated && orderStatus.VendorID != model.VendorIDJX) {
|
||||
if err == nil {
|
||||
dao.Commit(db, txDB)
|
||||
}
|
||||
return err
|
||||
}
|
||||
var existAfsOrder *model.AfsOrder
|
||||
if existAfsOrder, err = c.loadAfsOrder(db, afsOrder.AfsOrderID, afsOrder.VendorID); err != nil {
|
||||
|
||||
existAfsOrder, err := c.loadAfsOrder(db, afsOrder.AfsOrderID, afsOrder.VendorID)
|
||||
if err != nil {
|
||||
if !dao.IsNoRowsError(err) {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if existAfsOrder != nil {
|
||||
// todo 可能导致状态回绕
|
||||
existAfsOrder.Status = afsOrder.Status
|
||||
@@ -327,8 +330,9 @@ func (c *OrderManager) updateAfsOrderOtherInfo(db *dao.DaoDB, afsOrder *model.Af
|
||||
afsOrder.JxStoreID = storeDetail.Store.ID
|
||||
}
|
||||
}
|
||||
order, err2 := c.LoadOrder(afsOrder.VendorOrderID, afsOrder.VendorID)
|
||||
if afsOrder.StoreID == 0 && afsOrder.JxStoreID == 0 {
|
||||
if order, err2 := c.LoadOrder(afsOrder.VendorOrderID, afsOrder.VendorID); err2 == nil {
|
||||
if err2 == nil {
|
||||
afsOrder.JxStoreID = order.JxStoreID
|
||||
if afsOrder.StoreID == 0 {
|
||||
afsOrder.StoreID = order.StoreID
|
||||
@@ -346,6 +350,9 @@ func (c *OrderManager) updateAfsOrderOtherInfo(db *dao.DaoDB, afsOrder *model.Af
|
||||
}
|
||||
if err = c.updateAfsOrderSkuOtherInfo(db, afsOrder); err == nil {
|
||||
jxutils.RefreshAfsOrderSkuRelated(afsOrder)
|
||||
if afsOrder.RefundType == model.AfsTypeFullRefund && afsOrder.VendorID == model.VendorIDJX && order.DeliveryType != model.OrderDeliveryTypeSelfTake {
|
||||
afsOrder.SkuUserMoney = order.ActualPayPrice
|
||||
}
|
||||
}
|
||||
}
|
||||
return err
|
||||
@@ -368,9 +375,9 @@ func (c *OrderManager) setAfsOrderID(db *dao.DaoDB, orderStatus *model.OrderStat
|
||||
list := strings.Split(afsOrderList[0].AfsOrderID, "-")
|
||||
if len(list) > 1 {
|
||||
index = int(utils.Str2Int64WithDefault(list[1], 0))
|
||||
if afsOrderList[0].Status >= model.AfsOrderStatusFinished {
|
||||
index++
|
||||
}
|
||||
//if afsOrderList[0].Status >= model.AfsOrderStatusFinished {
|
||||
index++
|
||||
//}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
||||
@@ -902,7 +902,7 @@ func (c *OrderManager) GetStoresOrderSaleInfoNew(ctx *jxcontext.Context, storeID
|
||||
|
||||
orderIDMap := make(map[string]struct{})
|
||||
var vendorOrderIDs []string
|
||||
orderSkuList, err := dao.GetStoreOrderSkuList(db, storeIDList, fromTime, toTime, statusList, true, isService)
|
||||
orderSkuList, err := dao.GetStoreOrderSkuList(db, storeIDList, fromTime, toTime, statusList, true, isService) // 所有的完成订单
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -1019,7 +1019,7 @@ func (c *OrderManager) GetStoresOrderSaleInfoNew(ctx *jxcontext.Context, storeID
|
||||
}
|
||||
return orderMap, orderSkuMap, saleInfoMap
|
||||
}
|
||||
_, _, saleInfoMap := orderSkuHandler(orderSkuList)
|
||||
_, _, saleInfoMap := orderSkuHandler(orderSkuList) // 所有订单的支付金额
|
||||
orderMap, orderSkuMap, _ := orderSkuHandler(orderSkuList4Afs)
|
||||
|
||||
afsOrderMap := make(map[string]*model.GoodsOrder)
|
||||
@@ -1074,6 +1074,23 @@ func (c *OrderManager) GetStoresOrderSaleInfoNew(ctx *jxcontext.Context, storeID
|
||||
saleInfo.Count++
|
||||
}
|
||||
for _, v := range saleInfoMap {
|
||||
if v.Status == model.OrderStatusFinished {
|
||||
// 计算平台计算
|
||||
settle, _ := dao.GetPlatformSettlement(db, storeIDList, fromTime, toTime)
|
||||
for _, s := range settle {
|
||||
if v.VendorID == s.VendorID {
|
||||
v.PlatformSettlement = s.TotalShopMoney
|
||||
}
|
||||
}
|
||||
|
||||
// 计算三方配送
|
||||
fee, _ := dao.GetPlatformDesiredFee(db, storeIDList, fromTime, toTime)
|
||||
for _, f := range fee {
|
||||
if v.VendorID == f.VendorID {
|
||||
v.ActualFee = f.ActualFee
|
||||
}
|
||||
}
|
||||
}
|
||||
saleInfoList = append(saleInfoList, v)
|
||||
}
|
||||
return saleInfoList, err
|
||||
|
||||
@@ -78,10 +78,12 @@ func (c *BaseScheduler) SelfDeliveredAndUpdateStatus(ctx *jxcontext.Context, ven
|
||||
err = c.Swtich2SelfDelivered(order, userName)
|
||||
}
|
||||
if err == nil {
|
||||
// order.Status = model.OrderStatusFinished // todo 是否需要强制设置完成状态?
|
||||
if err = dao.SetOrderFlag(dao.GetDB(), ctx.GetUserName(), order.VendorOrderID, order.VendorID, model.OrderFlagMaskSetDelivered); err == nil {
|
||||
order.Status = model.OrderStatusFinished // todo 是否需要强制设置完成状态?
|
||||
if err = dao.SetOrderFlag(dao.GetDB(), ctx.GetUserName(), order.VendorOrderID, order.VendorID, model.OrderFlagMaskSetDelivered); err != nil {
|
||||
return err
|
||||
}
|
||||
order.OrderFinishedAt = time.Now()
|
||||
dao.UpdateEntity(dao.GetDB(), order, "Status", "OrderFinishedAt")
|
||||
}
|
||||
}
|
||||
return err
|
||||
@@ -99,7 +101,7 @@ func (c *BaseScheduler) PickupGoodsAndUpdateStatus(ctx *jxcontext.Context, vendo
|
||||
err = c.PickupGoods(order, flag, userName)
|
||||
if err == nil {
|
||||
order.Status = model.OrderStatusFinishedPickup
|
||||
if err = partner.CurOrderManager.UpdateOrderStatusAndDeliveryFlag(order); err == nil {
|
||||
if err = partner.CurOrderManager.UpdateOrderStatusAndDeliveryFlag(order); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
@@ -108,7 +110,8 @@ func (c *BaseScheduler) PickupGoodsAndUpdateStatus(ctx *jxcontext.Context, vendo
|
||||
order.Status = model.OrderStatusFinished
|
||||
order.VendorStatus = utils.Int64ToStr(model.OrderStatusFinished)
|
||||
order.Flag = 128
|
||||
dao.UpdateEntity(dao.GetDB(), order, "Status", "VendorStatus", "Flag")
|
||||
order.OrderFinishedAt = time.Now()
|
||||
dao.UpdateEntity(dao.GetDB(), order, "Status", "VendorStatus", "Flag", "OrderFinishedAt")
|
||||
}
|
||||
}
|
||||
return err
|
||||
@@ -227,7 +230,7 @@ func (c *BaseScheduler) AgreeOrRefuseRefund(ctx *jxcontext.Context, afsOrderID s
|
||||
)
|
||||
waybills, _ := dao.GetWaybills(db, order.VendorOrderID)
|
||||
//美团的订单如果是同意全部退款,要取消所有三方运单并停止调度
|
||||
if order.VendorID == model.VendorIDMTWM {
|
||||
if order.VendorID == model.VendorIDMTWM || order.VendorID == model.VendorIDJX {
|
||||
var (
|
||||
afsCount, orderCount int
|
||||
)
|
||||
@@ -239,13 +242,19 @@ func (c *BaseScheduler) AgreeOrRefuseRefund(ctx *jxcontext.Context, afsOrderID s
|
||||
orderCount += v.Count
|
||||
}
|
||||
//如果售后退款的商品数等于订单商品数,我就当是全部退款了
|
||||
if afsCount == orderCount {
|
||||
if afsCount == orderCount && order.VendorID == model.VendorIDMTWM {
|
||||
order.DeliveryFlag |= model.OrderDeliveryFlagMaskScheduleDisabled
|
||||
partner.CurOrderManager.UpdateOrderFields(order, []string{"DeliveryFlag"})
|
||||
for _, v := range waybills {
|
||||
c.CancelWaybill(v, partner.CancelWaybillReasonOther, partner.CancelWaybillReasonStrActive)
|
||||
}
|
||||
}
|
||||
if afsCount == orderCount && order.VendorID == model.VendorIDJX {
|
||||
order.DeliveryFlag |= model.OrderDeliveryFlagMaskScheduleDisabled
|
||||
order.Status = model.OrderStatusCanceled
|
||||
order.VendorStatus = utils.Int2Str(model.OrderStatusCanceled)
|
||||
partner.CurOrderManager.UpdateOrderFields(order, []string{"DeliveryFlag", "Status", "VendorStatus"})
|
||||
}
|
||||
}
|
||||
if order.EarningType == model.EarningTypePoints {
|
||||
var (
|
||||
@@ -278,7 +287,7 @@ func (c *BaseScheduler) AgreeOrRefuseRefund(ctx *jxcontext.Context, afsOrderID s
|
||||
}
|
||||
}
|
||||
|
||||
if approveType != partner.AfsApproveTypeRefused {
|
||||
if approveType != partner.AfsApproveTypeRefused && err == nil {
|
||||
storeDetail, err := partner.CurOrderManager.LoadStoreDetail(afsOrder.StoreID, afsOrder.VendorID)
|
||||
if err != nil {
|
||||
return err
|
||||
|
||||
@@ -81,7 +81,7 @@ func (s *DefScheduler) SelfDeliveringAndUpdateStatus(ctx *jxcontext.Context, ven
|
||||
}
|
||||
|
||||
// 上面是真的转自送,支持美团,饿百,京东,如果时抖店,抖店暂时全部是自送的!但是有骑手信息时,就是一个白嫖单子!
|
||||
if order.VendorID == model.VendorIDDD && courierName != "" && courierMobile != "" && err == nil {
|
||||
if (order.VendorID == model.VendorIDDD || order.VendorID == model.VendorIDEBAI) && courierName != "" && courierMobile != "" && err == nil {
|
||||
timeNow := time.Now()
|
||||
rand.Seed(timeNow.UnixNano())
|
||||
randNumber := rand.Int63n(640)
|
||||
@@ -94,7 +94,7 @@ func (s *DefScheduler) SelfDeliveringAndUpdateStatus(ctx *jxcontext.Context, ven
|
||||
VendorWaybillID2: "",
|
||||
WaybillVendorID: model.VendorJXFakeWL,
|
||||
VendorOrderID: order.VendorOrderID,
|
||||
OrderVendorID: model.VendorIDDD,
|
||||
OrderVendorID: order.VendorID,
|
||||
CourierName: courierName,
|
||||
CourierMobile: courierMobile,
|
||||
Status: model.OrderStatusNew,
|
||||
@@ -108,7 +108,7 @@ func (s *DefScheduler) SelfDeliveringAndUpdateStatus(ctx *jxcontext.Context, ven
|
||||
WaybillFinishedAt: utils.DefaultTimeValue,
|
||||
StatusTime: timeNow.Add(randTime), // 下一状态时间
|
||||
OriginalData: "",
|
||||
Remark: "自定义物流单",
|
||||
Remark: "自定义物流单(抖音/饿了么)",
|
||||
VendorOrgCode: order.VendorOrgCode,
|
||||
}
|
||||
err = dao.CreateEntity(dao.GetDB(), bill)
|
||||
@@ -130,9 +130,9 @@ func (s *DefScheduler) canOrderCreateWaybillNormally(order *model.GoodsOrder, sa
|
||||
|
||||
func (s *DefScheduler) isPossibleSwitch2SelfDelivery(order *model.GoodsOrder) (err error) {
|
||||
//TODO 刷单用,之后不刷单了删除
|
||||
if order.VendorID == model.VendorIDDD {
|
||||
return nil
|
||||
}
|
||||
//if order.VendorID == model.VendorIDDD {
|
||||
// return nil
|
||||
//}
|
||||
|
||||
if model.IsOrderDeliveryByPlatform(order) {
|
||||
if order.Status < model.OrderStatusFinishedPickup {
|
||||
|
||||
@@ -2035,32 +2035,32 @@ func RrefreshMtwmVendorAct(ctx *jxcontext.Context) (err error) {
|
||||
}
|
||||
// 查询门店爆款商品,当门店存在爆款时,取消之前的力荐商品,将新的爆款设置为力荐商品
|
||||
// 商品为手动设置力荐或者爆款活动在取消力荐之前被删除,那么无法取消被力荐的商品!
|
||||
//if k == mtwmapi.RetailActTypeSecKill && len(actList) > 0 && storeMap.StoreID == 1 {
|
||||
// allActivitySkuIdList := make([]string, 0, 0) // 此门店全部的折扣(爆款)活动商品
|
||||
// activationActivitySkuIdList := make([]*partner.StoreSkuInfo, 0, 0) // 此门店正在进行的折扣(爆款)活动商品
|
||||
// loseActivitySkuIdList := make([]*partner.StoreSkuInfo, 0, 0) // 此门店已经结束的折扣(爆款)活动商品
|
||||
// for _, ac := range actList {
|
||||
// allActivitySkuIdList = append(allActivitySkuIdList, utils.Int64ToStr(ac.ItemID))
|
||||
// // 已经生效的爆款活动
|
||||
// if ac.Status == 1 && ac.SkuId != "" {
|
||||
// activationActivitySkuIdList = append(activationActivitySkuIdList, &partner.StoreSkuInfo{
|
||||
// SkuID: utils.Str2Int(ac.SkuId),
|
||||
// IsSpecialty: 1,
|
||||
// })
|
||||
// }
|
||||
// // 已经失效的爆款活动
|
||||
// if ac.Status == 0 && ac.SkuId != "" {
|
||||
// loseActivitySkuIdList = append(loseActivitySkuIdList, &partner.StoreSkuInfo{
|
||||
// SkuID: utils.Str2Int(ac.SkuId),
|
||||
// IsSpecialty: 0,
|
||||
// })
|
||||
// }
|
||||
// }
|
||||
// // 取消当前力荐商品
|
||||
// partner.GetPurchasePlatformFromVendorID(storeMap.VendorID).(partner.ISingleStoreStoreSkuHandler).UpdateStoreSkusSpecTag(ctx, storeMap.VendorOrgCode, storeMap.StoreID, storeMap.VendorStoreID, loseActivitySkuIdList)
|
||||
// // 重新推荐力荐商品
|
||||
// partner.GetPurchasePlatformFromVendorID(storeMap.VendorID).(partner.ISingleStoreStoreSkuHandler).UpdateStoreSkusSpecTag(ctx, storeMap.VendorOrgCode, storeMap.StoreID, storeMap.VendorStoreID, activationActivitySkuIdList)
|
||||
//}
|
||||
if k == mtwmapi.RetailActTypeSecKill && len(actList) > 0 && storeMap.VendorID == model.VendorIDMTWM {
|
||||
//allActivitySkuIdList := make([]string, 0, 0) // 此门店全部的折扣(爆款)活动商品
|
||||
//activationActivitySkuIdList := make([]*partner.StoreSkuInfo, 0, 0) // 此门店正在进行的折扣(爆款)活动商品
|
||||
//loseActivitySkuIdList := make([]*partner.StoreSkuInfo, 0, 0) // 此门店已经结束的折扣(爆款)活动商品
|
||||
//for _, ac := range actList {
|
||||
// allActivitySkuIdList = append(allActivitySkuIdList, utils.Int64ToStr(ac.ItemID))
|
||||
// // 已经生效的爆款活动
|
||||
// if ac.Status == 1 && ac.SkuId != "" {
|
||||
// activationActivitySkuIdList = append(activationActivitySkuIdList, &partner.StoreSkuInfo{
|
||||
// SkuID: utils.Str2Int(ac.SkuId),
|
||||
// IsSpecialty: 1,
|
||||
// })
|
||||
// }
|
||||
// // 已经失效的爆款活动
|
||||
// if ac.Status == 0 && ac.SkuId != "" {
|
||||
// loseActivitySkuIdList = append(loseActivitySkuIdList, &partner.StoreSkuInfo{
|
||||
// SkuID: utils.Str2Int(ac.SkuId),
|
||||
// IsSpecialty: 0,
|
||||
// })
|
||||
// }
|
||||
//}
|
||||
//// 取消当前力荐商品
|
||||
//partner.GetPurchasePlatformFromVendorID(storeMap.VendorID).(partner.ISingleStoreStoreSkuHandler).UpdateStoreSkusSpecTag(ctx, storeMap.VendorOrgCode, storeMap.StoreID, storeMap.VendorStoreID, loseActivitySkuIdList)
|
||||
//// 重新推荐力荐商品
|
||||
//partner.GetPurchasePlatformFromVendorID(storeMap.VendorID).(partner.ISingleStoreStoreSkuHandler).UpdateStoreSkusSpecTag(ctx, storeMap.VendorOrgCode, storeMap.StoreID, storeMap.VendorStoreID, activationActivitySkuIdList)
|
||||
}
|
||||
}
|
||||
return retVal, err
|
||||
}, storeMaps)
|
||||
|
||||
@@ -1194,7 +1194,7 @@ func getJDCategoryLoadingLocalCategoryReflex(jdCategoryId, jdsCategoryID, ebaiCa
|
||||
if mtwmCategoryID == "" && cats[0].MtwmCategoryID != 0 {
|
||||
mtwmCategoryID = utils.Int64ToStr(cats[0].MtwmCategoryID)
|
||||
}
|
||||
if jxCategoryId == 0 {
|
||||
if jxCategoryId == 0 || jxCategoryId == 291 {
|
||||
jxCategoryId = cats[0].ID
|
||||
}
|
||||
}
|
||||
@@ -1260,30 +1260,54 @@ func updateOrCreateSkuVendorCategoryMap(db *dao.DaoDB, ctx *jxcontext.Context, n
|
||||
}
|
||||
} else {
|
||||
if payload["jdCategoryID"] != nil {
|
||||
jdCategoryId = payload["jdCategoryID"].(string)
|
||||
} else {
|
||||
jdCategoryId = getCategoryByName(payload["name"].(string))
|
||||
value, ok := payload["jdCategoryID"].(string)
|
||||
if ok && value != "" && value != "0" {
|
||||
jdCategoryId = payload["jdCategoryID"].(string)
|
||||
} else {
|
||||
jdCategoryId = getCategoryByName(payload["name"].(string))
|
||||
}
|
||||
}
|
||||
|
||||
if payload["jdsCategoryID"] != nil {
|
||||
jdsCategoryID = payload["jdsCategoryID"].(string)
|
||||
value, ok := payload["jdCategoryID"].(string)
|
||||
if ok && value != "" && value != "0" {
|
||||
jdsCategoryID = payload["jdsCategoryID"].(string)
|
||||
}
|
||||
}
|
||||
if payload["ebaiCategoryID"] != nil {
|
||||
ebaiCategoryID = payload["ebaiCategoryID"].(string)
|
||||
value, ok := payload["ebaiCategoryID"].(string)
|
||||
if ok && value != "" && value != "0" {
|
||||
ebaiCategoryID = payload["ebaiCategoryID"].(string)
|
||||
}
|
||||
}
|
||||
if payload["mtwmCategoryID"] != nil {
|
||||
mtwmCategoryID = payload["mtwmCategoryID"].(string)
|
||||
value, ok := payload["mtwmCategoryID"].(string)
|
||||
if ok && value != "" && value != "0" {
|
||||
mtwmCategoryID = payload["mtwmCategoryID"].(string)
|
||||
}
|
||||
}
|
||||
if payload["categoryID2"] != nil && !utils.IsNil(payload["categoryID2"]) {
|
||||
jxCategoryIDNumber, err := payload["categoryID2"].(json.Number).Int64()
|
||||
if err != nil {
|
||||
return false
|
||||
var jxCategoryIDNumber int64
|
||||
if value, ok := payload["categoryID2"].(string); ok && value != "" {
|
||||
jxCategoryIDNumber = utils.Str2Int64(value)
|
||||
}
|
||||
if value, ok := payload["categoryID2"].(int64); ok && value != 0 {
|
||||
jxCategoryIDNumber = value
|
||||
}
|
||||
if value, ok := payload["categoryID2"].(json.Number); ok && value != "" {
|
||||
jxCategoryIDNumber, _ = value.Int64()
|
||||
}
|
||||
jxCategoryID = int(jxCategoryIDNumber)
|
||||
} else if payload["categoryID"] != nil && !utils.IsNil(payload["categoryID"]) {
|
||||
jxCategoryIDNumber, err := payload["categoryID"].(json.Number).Int64()
|
||||
if err != nil {
|
||||
return false
|
||||
var jxCategoryIDNumber int64
|
||||
if value, ok := payload["categoryID"].(string); ok && value != "" {
|
||||
jxCategoryIDNumber = utils.Str2Int64(value)
|
||||
}
|
||||
if value, ok := payload["categoryID"].(int64); ok && value != 0 {
|
||||
jxCategoryIDNumber = value
|
||||
}
|
||||
if value, ok := payload["categoryID"].(json.Number); ok && value != "" {
|
||||
jxCategoryIDNumber, _ = value.Int64()
|
||||
}
|
||||
jxCategoryID = int(jxCategoryIDNumber)
|
||||
} else {
|
||||
@@ -1295,7 +1319,9 @@ func updateOrCreateSkuVendorCategoryMap(db *dao.DaoDB, ctx *jxcontext.Context, n
|
||||
}
|
||||
|
||||
if payload["ddCategoryID"] != nil {
|
||||
ddCategoryID = payload["ddCategoryID"].(string)
|
||||
if value, ok := payload["ddCategoryID"].(string); ok && value != "" {
|
||||
ddCategoryID = value
|
||||
}
|
||||
} else {
|
||||
ddCategoryID = getCategoryByImg(payload["descImg"].(string), payload["img"].(string), payload["img2"].(string), payload["img3"].(string), payload["img4"].(string), payload["img5"].(string))
|
||||
}
|
||||
@@ -1321,6 +1347,10 @@ func updateOrCreateSkuVendorCategoryMap(db *dao.DaoDB, ctx *jxcontext.Context, n
|
||||
updateOrCreate(model.VendorIDJD, nameID, jdCategoryId)
|
||||
flag = true
|
||||
}
|
||||
if jxCategoryID != 0 && jxCategoryID != 291 {
|
||||
dao.ExecuteSQL(dao.GetDB(), `UPDATE sku_name SET category_id = ? WHERE id = ?`, []interface{}{jxCategoryID, nameID}...)
|
||||
flag = true
|
||||
}
|
||||
|
||||
}
|
||||
return flag
|
||||
@@ -2331,18 +2361,34 @@ func CreateUpcSkuByExcelBin(ctx *jxcontext.Context, reader io.Reader, categoryID
|
||||
if configs, err := dao.QueryConfigs(dao.GetDB(), "mtwmCookieStr", model.ConfigTypeCookie, ""); err == nil {
|
||||
api.MtwmAPI.SetCookieWithStr(configs[0].Value)
|
||||
}
|
||||
result, err := api.MtwmAPI.GetStandardProductListWithCond(*skuName.Upc)
|
||||
if result != nil {
|
||||
productInfo.OriginalName = result.Name
|
||||
productInfo.OriginalSpec = result.Spec
|
||||
productInfo.Name = result.Name
|
||||
productInfo.SpecUnit = result.SpecUnit
|
||||
productInfo.Unit = result.Unit
|
||||
productInfo.SpecQuality = float32(result.SpecNew)
|
||||
productInfo.ImgList = strings.Split(result.Pic, ",")
|
||||
productInfo.Weight = float32(result.Weight)
|
||||
productInfo.BrandName = result.BrandNamePath
|
||||
|
||||
//result, err := api.MtwmAPI.GetStandardProductListWithCond(*skuName.Upc)
|
||||
//if result != nil {
|
||||
result, err := api.JdAPI.GetJdUpcCodeByName("", *skuName.Upc, 1, 5)
|
||||
if result != nil && len(result) != 0 {
|
||||
productInfo.OriginalName = result[0].OriginalName
|
||||
productInfo.OriginalSpec = result[0].OriginalSpec
|
||||
productInfo.Name = result[0].Name
|
||||
productInfo.SpecUnit = result[0].SpecUnit
|
||||
productInfo.Unit = result[0].Unit
|
||||
productInfo.SpecQuality = result[0].SpecQuality
|
||||
productInfo.ImgList = result[0].ImgList
|
||||
if result[0].Img != "" {
|
||||
productInfo.ImgList = append(productInfo.ImgList, productInfo.Img)
|
||||
}
|
||||
productInfo.Weight = result[0].Weight
|
||||
productInfo.BrandName = result[0].BrandName
|
||||
setImgs(skuName, productInfo.ImgList)
|
||||
// productInfo.OriginalName = result.Name
|
||||
// productInfo.OriginalSpec = result.Spec
|
||||
// productInfo.Name = result.Name
|
||||
// productInfo.SpecUnit = result.SpecUnit
|
||||
// productInfo.Unit = result.Unit
|
||||
// productInfo.SpecQuality = float32(result.SpecNew)
|
||||
// productInfo.ImgList = strings.Split(result.Pic, ",")
|
||||
// productInfo.Weight = float32(result.Weight)
|
||||
// productInfo.BrandName = result.BrandNamePath
|
||||
// setImgs(skuName, productInfo.ImgList)
|
||||
} else {
|
||||
retVal = []*CreateUpcSkuByExcelErr{buildCreateUpcSkuByExcelErr(v, "美团cookie过期或者没查询到")}
|
||||
return retVal, err
|
||||
@@ -2505,16 +2551,48 @@ func CreateUpcSkuByExcelBin(ctx *jxcontext.Context, reader io.Reader, categoryID
|
||||
skuName.Img5 = downloadURL
|
||||
}
|
||||
}
|
||||
|
||||
// 标品不存在规格是默认为包
|
||||
if (skuName.Unit == "份" && *skuName.Upc != "") || skuName.Unit == "" {
|
||||
skuName.Unit = "包"
|
||||
}
|
||||
if !isUpdate {
|
||||
_, err = AddSkuName(ctx, skuName, ctx.GetUserName())
|
||||
} else {
|
||||
var data []*model.SkuVendorCategoryMap
|
||||
err = dao.GetRows(db, &data, `SELECT * FROM sku_vendor_category_map WHERE name_id = ? AND deleted_at = ?`, []interface{}{sku.ID, utils.DefaultTimeValue}...)
|
||||
|
||||
sku.Name = skuName.Name
|
||||
sku.Img = skuName.Img
|
||||
sku.Img2 = skuName.Img2
|
||||
sku.Img3 = skuName.Img3
|
||||
sku.Img4 = skuName.Img4
|
||||
sku.Img5 = skuName.Img5
|
||||
dao.UpdateEntity(db, sku, "Name", "Img", "Img2", "Img3", "Img4", "Img5")
|
||||
sku.Unit = skuName.Unit
|
||||
dao.UpdateEntity(db, sku, "Name", "Img", "Img2", "Img3", "Img4", "Img5", "Unit")
|
||||
payload := make(map[string]interface{}, 0)
|
||||
payload["categoryID2"] = utils.Int2Str(sku.CategoryID)
|
||||
payload["categoryID"] = utils.Int2Str(sku.CategoryID)
|
||||
payload["descImg"] = sku.DescImg
|
||||
payload["img"] = sku.Img
|
||||
payload["img2"] = sku.Img2
|
||||
payload["img3"] = sku.Img3
|
||||
payload["img4"] = sku.Img4
|
||||
payload["img5"] = sku.Img5
|
||||
for _, d := range data {
|
||||
switch d.VendorID {
|
||||
case model.VendorIDJD:
|
||||
payload["jdCategoryID"] = d.VendorCategoryID
|
||||
case model.VendorIDMTWM:
|
||||
payload["mtwmCategoryID"] = d.VendorCategoryID
|
||||
case model.VendorIDJDShop:
|
||||
case model.VendorIDDD:
|
||||
payload["ddCategoryID"] = d.VendorCategoryID
|
||||
case model.VendorIDEBAI:
|
||||
payload["ebaiCategoryID"] = d.VendorCategoryID
|
||||
}
|
||||
}
|
||||
updateOrCreateSkuVendorCategoryMap(db, ctx, sku.ID, payload, nil, false)
|
||||
}
|
||||
if err != nil {
|
||||
retVal = []*CreateUpcSkuByExcelErr{buildCreateUpcSkuByExcelErr(v, err.Error())}
|
||||
@@ -3303,7 +3381,7 @@ func setImgs2(v *model.SkuName, imgs []string) (err error) {
|
||||
return err
|
||||
}
|
||||
|
||||
func GetSkuNamesNew(ctx *jxcontext.Context, keyword string, skuIDs, skuNameIDs []int, categoryID, status int, isBySku bool, offset, pageSize int) (skuNamesInfo *SkuNamesInfo, err error) {
|
||||
func GetSkuNamesNew(ctx *jxcontext.Context, keyword string, skuIDs, skuNameIDs []int, categoryID, status int, isBySku bool, offset, pageSize, bestSeller int) (skuNamesInfo *SkuNamesInfo, err error) {
|
||||
var (
|
||||
db = dao.GetDB()
|
||||
sql = ""
|
||||
@@ -3408,6 +3486,10 @@ func GetSkuNamesNew(ctx *jxcontext.Context, keyword string, skuIDs, skuNameIDs [
|
||||
sql += " AND t2.id IN (" + dao.GenQuestionMarks(len(skuIDs)) + ")"
|
||||
sqlParams = append(sqlParams, skuIDs)
|
||||
}
|
||||
if bestSeller > 0 {
|
||||
sql += " AND t1.best_seller = ? "
|
||||
sqlParams = append(sqlParams, bestSeller)
|
||||
}
|
||||
if categoryID > 0 {
|
||||
cat := &model.SkuCategory{}
|
||||
cat.ID = categoryID
|
||||
@@ -3502,3 +3584,10 @@ func GetSkuNamesNew(ctx *jxcontext.Context, keyword string, skuIDs, skuNameIDs [
|
||||
}
|
||||
return skuNamesInfo, err
|
||||
}
|
||||
|
||||
func SetSkuNameSeller(nameIds []int64, bastSeller int) error {
|
||||
sql := ` UPDATE sku_name SET bast_seller = ? WHERE id IN (` + dao.GenQuestionMarks(len(nameIds)) + `)`
|
||||
param := []interface{}{bastSeller, nameIds}
|
||||
_, err := dao.ExecuteSQL(dao.GetDB(), sql, param...)
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -1125,10 +1125,56 @@ func UpdateStore(ctx *jxcontext.Context, storeID int, payload map[string]interfa
|
||||
}
|
||||
} else {
|
||||
globals.SugarLogger.Debugf("UpdateStore track:%s, store:%s", ctx.GetTrackInfo(), utils.Format4Output(store, true))
|
||||
}
|
||||
if status == -2 {
|
||||
|
||||
}
|
||||
return num, err
|
||||
}
|
||||
|
||||
//// updateVendorStoreStatusAndDeliveryStatus 当门店被禁用时,将三方平台和三方配送全部关闭
|
||||
//func updateVendorStoreStatusAndDeliveryStatus(ctx *jxcontext.Context, storeId int) error {
|
||||
// var (
|
||||
// db = dao.GetDB()
|
||||
// )
|
||||
// // 获取门店绑定三方平台列表
|
||||
// storeMap, err := dao.GetStoresMapList(db, nil, []int{storeId}, nil, 0, 0, "", "", "")
|
||||
// if err != nil {
|
||||
// return err
|
||||
// }
|
||||
// // 获取门店绑定的配送凭条
|
||||
// storeCouriers, err := dao.GetOpenedStoreCouriersByStoreID(db, storeId, -1)
|
||||
// if err != nil {
|
||||
// return err
|
||||
// }
|
||||
//
|
||||
// work := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||
// var errList []error
|
||||
// step := batchItemList[0].(int)
|
||||
// switch step {
|
||||
// case 0: // 同步修改门店营业撞他
|
||||
// // 京东关店,本地店铺状态修改
|
||||
// // 美团关店,本地店铺状态修改
|
||||
// // 饿百关店,本地店铺状态修改
|
||||
// // 抖音关店,本地店铺状态修改
|
||||
// case 1: // 同步修改门店配送状态
|
||||
// // 美团跑腿配送(没有门店状态修改,直接修改本店)
|
||||
// // 蜂鸟配送,关闭(有)
|
||||
// // 达达配送,关闭(有)
|
||||
// // uu跑腿,关闭(不涉及门店概念,直接本地取消绑定信息)
|
||||
// }
|
||||
// return errList, nil
|
||||
// }
|
||||
// tasksch.NewParallelTask(
|
||||
// "禁用门店,修改平台门店状态",
|
||||
// tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(false),
|
||||
// ctx,
|
||||
// work,
|
||||
// []int{0, 1},
|
||||
// )
|
||||
//
|
||||
//}
|
||||
|
||||
func notifyStoreOperatorChanged(ctx *jxcontext.Context, storeID int, operatorRoleName, phone string, newPhone interface{}) {
|
||||
if phone != "" && newPhone != nil {
|
||||
db := dao.GetDB()
|
||||
@@ -1780,6 +1826,7 @@ func UpdateStoreVendorMap(ctx *jxcontext.Context, db *dao.DaoDB, storeID, vendor
|
||||
dao.Rollback(db, txDB)
|
||||
return 0, err
|
||||
}
|
||||
isSyncStoreMapSku := false
|
||||
if num > 0 {
|
||||
if globals.IsAddEvent {
|
||||
mapBefore := refutil.FindMapAndStructMixed(valid, beforeStoreMap)
|
||||
@@ -1794,6 +1841,7 @@ func UpdateStoreVendorMap(ctx *jxcontext.Context, db *dao.DaoDB, storeID, vendor
|
||||
dao.Rollback(db, txDB)
|
||||
return 0, err
|
||||
}
|
||||
isSyncStoreMapSku = true
|
||||
}
|
||||
} else {
|
||||
if valid["pricePercentage"] != nil || valid["pricePercentagePack"] != nil {
|
||||
@@ -1804,7 +1852,27 @@ func UpdateStoreVendorMap(ctx *jxcontext.Context, db *dao.DaoDB, storeID, vendor
|
||||
dao.Commit(db, txDB)
|
||||
if isStoreMapNeedSync(vendorID, valid) {
|
||||
_, err = CurVendorSync.SyncStore(ctx, db, vendorID, storeID, false, userName)
|
||||
globals.SugarLogger.Debug("CurVendorSync.SyncStore:err======%v", err)
|
||||
}
|
||||
|
||||
// 更新商品
|
||||
if isSyncStoreMapSku {
|
||||
globals.SugarLogger.Debugf("修改门店调价包是同步门店商品价格=============: %v", err)
|
||||
singleStoreHandler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler)
|
||||
task := tasksch.NewParallelTask("修改门店调价包的时候,同时同步门店商品", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(true), ctx,
|
||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||
step := batchItemList[0].(int)
|
||||
switch step {
|
||||
case 1:
|
||||
if singleStoreHandler != nil {
|
||||
// 直接同步商品
|
||||
err = syncStoreSkuNew(ctx, task, 0, true, vendorID, storeID, "", nil, nil, nil, false, true)
|
||||
}
|
||||
}
|
||||
return retVal, err
|
||||
}, []int{1})
|
||||
tasksch.HandleTask(task, nil, true).Run()
|
||||
_, err = task.GetResult(0)
|
||||
return 0, err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3738,8 +3738,14 @@ func GetTopSkusByStoreIDs(ctx *jxcontext.Context, storeIDs []int) (storeSkuNameE
|
||||
return storeSkuNameExt2, err
|
||||
}
|
||||
|
||||
// GetTopSkusByCityCode 获取当前城市订单销量前一百的商品,排除掉商户已经可售的商品剩下的为热销推荐
|
||||
func GetTopSkusByCityCode(ctx *jxcontext.Context, cityCode, storeID int) (skuNameAndPlaceList []*dao.SkuNameAndPlace, err error) {
|
||||
db := dao.GetDB()
|
||||
store, err := dao.GetStoreDetail(db, storeID, -1, "")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
cityCode = store.CityCode
|
||||
orderCreate := time.Now().AddDate(0, -1, 0)
|
||||
var skuNameAndPlace []*dao.SkuNameAndPlace
|
||||
if cityCode > 0 {
|
||||
@@ -3779,10 +3785,7 @@ func GetTopSkusByCityCode(ctx *jxcontext.Context, cityCode, storeID int) (skuNam
|
||||
for _, v := range skuNameList {
|
||||
skuNameMap[v.ID] = v
|
||||
}
|
||||
store, err := dao.GetStoreDetail(db, storeID, -1, "")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var payPercentage int
|
||||
if store.PayPercentage < 50 {
|
||||
payPercentage = 70
|
||||
@@ -5889,14 +5892,13 @@ func doStoreSkuAudit(ctx *jxcontext.Context, storeIDs []int, skuBindInfos []*Sto
|
||||
}
|
||||
}
|
||||
for _, skuBindInfo := range skuBindInfos {
|
||||
globals.SugarLogger.Debugf("doStoreSkuAudit storeID: %v , nameID: %v", storeID, skuBindInfo.NameID)
|
||||
storeAudits, err := dao.GetStoreSkuAuditLight(db, []int{storeID}, []int{skuBindInfo.NameID}, model.StoreAuditStatusOnline)
|
||||
//取消关注,可售排除
|
||||
if skuBindInfo.IsFocus == -1 || skuBindInfo.IsSale != 0 || skuBindInfo.UnitPrice == 0 {
|
||||
return false, err
|
||||
}
|
||||
|
||||
if ctx.GetLoginType() != weixin.AuthTypeMP && ctx.GetLoginType() != weixin.AuthTypeMini && ctx.GetLoginType() != weixin.AuthTypeWxApp && ctx.GetLoginType() != weixin.AuthTypeWxAppCaishi && ctx.GetLoginType() != auth2.AuthTypeMobile {
|
||||
if ctx.GetLoginType() != weixin.AuthTypeMP && ctx.GetLoginType() != weixin.AuthTypeMini && ctx.GetLoginType() != weixin.AuthTypeWxApp && ctx.GetLoginType() != weixin.AuthTypeWxAppCaishi && ctx.GetLoginType() != auth2.AuthTypeMobile && ctx.GetLoginType() != auth2.AuthTypePassword {
|
||||
authInfo, err := ctx.GetV2AuthInfo()
|
||||
if err == nil && authInfo != nil && (ctx.GetFullUser().Type&model.UserTypeOperator) != 0 {
|
||||
if len(storeAudits) > 0 {
|
||||
|
||||
@@ -203,7 +203,6 @@ func SyncSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorIDs []int,
|
||||
}
|
||||
|
||||
if err == nil && len(skuList) > 0 {
|
||||
// todo 按vendorID orgCode合并操作SyncSkus=============
|
||||
task := tasksch.NewParallelTask(
|
||||
fmt.Sprintf("同步商品:%v,%v", nameIDs, skuIDs),
|
||||
tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx, cc, skuList)
|
||||
|
||||
158
business/jxstore/cms/system_store_sku.go
Normal file
158
business/jxstore/cms/system_store_sku.go
Normal file
@@ -0,0 +1,158 @@
|
||||
package cms
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||
"git.rosy.net.cn/jx-callback/business/partner"
|
||||
"git.rosy.net.cn/jx-callback/business/partner/purchase/mtwm"
|
||||
"git.rosy.net.cn/jx-callback/business/partner/putils"
|
||||
"time"
|
||||
)
|
||||
|
||||
// CopyOnStoreSkuToOther 将一个美团门店分类和商品复制到另一个门店
|
||||
func CopyOnStoreSkuToOther(ctx *jxcontext.Context, fromVendorStoreId, toStoreId int, isAsync bool) (hint string, err error) {
|
||||
var (
|
||||
db = dao.GetDB()
|
||||
)
|
||||
|
||||
// 门店api加载
|
||||
// fromStore, err := dao.GetStoreDetail(db, fromStoreId, model.VendorIDMTWM, "")
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
toStore, err := dao.GetStoreDetail(db, toStoreId, model.VendorIDMTWM, "")
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
//fromApi := partner.CurAPIManager.GetAPI(model.VendorIDMTWM, toStore.VendorOrgCode).(*mtwmapi.API)
|
||||
toApi := partner.CurAPIManager.GetAPI(model.VendorIDMTWM, toStore.VendorOrgCode).(*mtwmapi.API)
|
||||
|
||||
taskName := fmt.Sprintf("将平台门店[%d],分类和商品复制到[%d]", fromVendorStoreId, toStoreId)
|
||||
config := tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(false)
|
||||
work := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||
step := batchItemList[0].(int)
|
||||
switch step {
|
||||
case 1:
|
||||
// 1.加载门店商品,删除商品.当分类下没有商品时.删除分类
|
||||
errs := LoadingStoreSkuList(ctx, toApi, toStore.VendorStoreID)
|
||||
if errs != nil && len(errs) > 0 {
|
||||
return nil, errs[0]
|
||||
}
|
||||
case 2:
|
||||
// 同步分类
|
||||
fromCategoryList, err := toApi.RetailCatList(utils.Int2Str(fromVendorStoreId))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for _, v := range fromCategoryList {
|
||||
if err := toApi.RetailCatUpdate(toStore.VendorStoreID, v.Name, &mtwmapi.Param4UpdateCat{
|
||||
CategoryCode: v.Code,
|
||||
Sequence: v.Sequence,
|
||||
}); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if v.Children != nil && len(v.Children) != 0 {
|
||||
for _, c := range v.Children {
|
||||
if err := toApi.RetailCatUpdate(toStore.VendorStoreID, v.Name, &mtwmapi.Param4UpdateCat{
|
||||
CategoryCode: v.Code,
|
||||
SecondaryCategoryCode: c.Code,
|
||||
SecondaryCategoryName: c.Name,
|
||||
Sequence: c.Sequence,
|
||||
}); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
case 3:
|
||||
// 同步商品
|
||||
fromFoodList, err1 := toApi.RetailListAll(utils.Int2Str(fromVendorStoreId))
|
||||
if err1 != nil {
|
||||
return nil, err1
|
||||
}
|
||||
if err := BatchInitData(ctx, fromFoodList, toApi, toStore.VendorStoreID); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
task := tasksch.NewParallelTask(taskName, config, ctx, work, []int{1, 2, 3})
|
||||
tasksch.HandleTask(task, nil, true).Run()
|
||||
if !isAsync {
|
||||
_, err = task.GetResult(0)
|
||||
hint = "1"
|
||||
} else {
|
||||
hint = task.ID
|
||||
}
|
||||
return hint, err
|
||||
}
|
||||
|
||||
func LoadingStoreSkuList(ctx *jxcontext.Context, api *mtwmapi.API, poiCode string) (err []error) {
|
||||
foodList, err1 := api.RetailListAll(poiCode)
|
||||
if err1 != nil {
|
||||
return append(err, err1)
|
||||
}
|
||||
|
||||
i := 0
|
||||
for _, v := range foodList {
|
||||
err1 := api.RetailDelete(ctx.GetTrackInfo(), poiCode, v.AppFoodCode)
|
||||
if err1 != nil {
|
||||
err = append(err, err1)
|
||||
}
|
||||
if i%40 == 0 {
|
||||
time.Sleep(200 * time.Millisecond)
|
||||
}
|
||||
i++
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// BatchInitData 批量创建商品
|
||||
func BatchInitData(ctx *jxcontext.Context, fromSku []*mtwmapi.AppFood, toApi *mtwmapi.API, vendorStoreID string) error {
|
||||
foodDataList := make([]map[string]interface{}, len(fromSku))
|
||||
for i, storeSku := range fromSku {
|
||||
foodData := make(map[string]interface{})
|
||||
foodDataList[i] = foodData
|
||||
foodData[mtwmapi.KeyAppFoodCode] = storeSku.AppFoodCode
|
||||
foodData["skus"] = storeSku.Skus
|
||||
foodData["name"] = utils.LimitUTF8StringLen(storeSku.Name, mtwmapi.MaxSkuNameCharCount)
|
||||
foodData["description"] = storeSku.Description
|
||||
foodData["price"] = storeSku.Price
|
||||
if storeSku.MinOrderCount != 0 {
|
||||
foodData["min_order_count"] = storeSku.MinOrderCount
|
||||
} else {
|
||||
foodData["min_order_count"] = 1
|
||||
}
|
||||
foodData["unit"] = storeSku.Unit
|
||||
attr := mtwm.SwitchAttr(int64(storeSku.TagID))
|
||||
if attr != "" {
|
||||
foodData["common_attr_value"] = attr
|
||||
}
|
||||
foodData["category_code"] = storeSku.CategoryCode
|
||||
foodData["category_name"] = storeSku.CategoryName
|
||||
foodData["is_sold_out"] = storeSku.IsSoldOut
|
||||
foodData["picture"] = storeSku.Picture
|
||||
foodData["picture_contents"] = storeSku.PictureContents
|
||||
foodData["sequence"] = storeSku.Sequence
|
||||
foodData["tag_id"] = storeSku.TagID
|
||||
}
|
||||
|
||||
failedFoodList, err2 := toApi.RetailBatchInitData(ctx.GetTrackInfo(), vendorStoreID, foodDataList)
|
||||
if err := err2; err == nil {
|
||||
if err = putils.GenPartialFailedErr(failedFoodList, len(failedFoodList)); err != nil {
|
||||
return err
|
||||
}
|
||||
} else if err2 != nil && len(failedFoodList) == 0 {
|
||||
if errExt, ok := err2.(*utils.ErrorWithCode); ok {
|
||||
return utils.UnmarshalUseNumber([]byte(errExt.ErrMsg()), &failedFoodList)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -50,7 +50,7 @@ var (
|
||||
"21:30:00",
|
||||
}
|
||||
dailyWorkTimeList2 = []string{
|
||||
"2:00:00",
|
||||
"02:30:00",
|
||||
}
|
||||
priceReferTimeList = []string{
|
||||
"03:00:00",
|
||||
@@ -253,7 +253,7 @@ func Init() {
|
||||
orderman.FixedOrderManager.AmendMissingOrders(jxcontext.AdminCtx, []int{model.VendorIDJD, model.VendorIDMTWM, model.VendorIDEBAI, model.VendorIDDD}, 0, curDate, curDate, true, true)
|
||||
}, 5*time.Second, 10*time.Minute)
|
||||
|
||||
// 抖音更新门店商品
|
||||
// 抖音更新门店商品 ,接口收费暂不使用
|
||||
if beego.BConfig.RunMode != "jxgy" {
|
||||
ScheduleTimerFunc("RefreshSyncSkuList", func() {
|
||||
syncStoreSkuTiktok()
|
||||
@@ -368,10 +368,10 @@ func Init() {
|
||||
ScheduleTimerFunc("GetNewVendorPopActs", func() {
|
||||
act.GetNewVendorPopActs(jxcontext.AdminCtx)
|
||||
}, dailyHeartbeat)
|
||||
//企业微信群人数通告
|
||||
ScheduleTimerFunc("SendQywxPeopleCount", func() {
|
||||
cms.SendQywxPeopleCount(jxcontext.AdminCtx)
|
||||
}, dailyHeartbeat)
|
||||
//企业微信群人数通告(暂时取消)
|
||||
//ScheduleTimerFunc("SendQywxPeopleCount", func() {
|
||||
// cms.SendQywxPeopleCount(jxcontext.AdminCtx)
|
||||
//}, dailyHeartbeat)
|
||||
ScheduleTimerFunc("doDailyWork1", func() {
|
||||
//同步商品额外前缀和水印图(打标记)
|
||||
cms.SyncSkuExperfixAndWatermark(jxcontext.AdminCtx)
|
||||
|
||||
@@ -495,6 +495,8 @@ func GuessVendorIDFromVendorStoreID(vendorStoreID int64) (vendorID int) {
|
||||
// vendorID = model.VendorIDWSC
|
||||
} else if vendorStoreID > 123456 && vendorStoreID < 654321 { // 京西门店ID,6位
|
||||
vendorID = model.VendorIDJX
|
||||
} else if vendorStoreID >= 100000000 { // 饿百出现九未id
|
||||
vendorID = model.VendorIDEBAI
|
||||
}
|
||||
return vendorID
|
||||
}
|
||||
|
||||
@@ -17,12 +17,12 @@ func init() {
|
||||
}
|
||||
|
||||
func TestSendSMSMsg(t *testing.T) {
|
||||
err := SendVoiceMsg([]string{"18981810340"}, "tts_222871733", map[string]interface{}{
|
||||
"tel": "18981810340",
|
||||
})
|
||||
aa := map[string]interface{}{"tel": "13957767601"}
|
||||
//err := SendVoiceMsg([]string{"18981810340"}, "tts_222871733", map[string]interface{}{
|
||||
// "tel": "18981810340",
|
||||
//})
|
||||
aa := map[string]interface{}{"tel": "18981810340"}
|
||||
request := &dyvmsapiclient.SingleCallByTtsRequest{
|
||||
CalledNumber: tea.String("13957767601"),
|
||||
CalledNumber: tea.String("18981810340"),
|
||||
TtsCode: tea.String("tts_222871733"),
|
||||
TtsParam: tea.String(string(utils.MustMarshal(aa))),
|
||||
}
|
||||
|
||||
@@ -47,6 +47,7 @@ func NotifyNewOrder(order *model.GoodsOrder) {
|
||||
msg.OrderSqs = utils.Int2Str(order.OrderSeq)
|
||||
msg.StoreTitle = storeDetail.Name
|
||||
msg.Context = "老板,你有新的订单了!"
|
||||
msg.VendorOrderId = order.VendorOrderID
|
||||
context, _ := json.Marshal(msg)
|
||||
body := fmt.Sprintf(msg.Context+"(%s)", model.VendorChineseNames[order.VendorID]+"#"+msg.OrderSqs)
|
||||
pushMsgByUniApp(storeDetail.ID, storeDetail.Name, cid, string(context), body, SoundsFileNewOrder)
|
||||
@@ -175,11 +176,12 @@ func GetStoreBoosCID(storeId int) ([]string, error) {
|
||||
}
|
||||
|
||||
type MsgContext struct {
|
||||
MsgType string `json:"msg_type"` // 订单类型[新订单/售后单/取消单]
|
||||
StoreTitle string `json:"store_title"` // 门店名称
|
||||
Context string `json:"context"` // 消息文本
|
||||
VendorName string `json:"vendor_name"` // 平台名称
|
||||
OrderSqs string `json:"order_sqs"` // 订单流水号
|
||||
MsgType string `json:"msg_type"` // 订单类型[新订单/售后单/取消单]
|
||||
StoreTitle string `json:"store_title"` // 门店名称
|
||||
Context string `json:"context"` // 消息文本
|
||||
VendorName string `json:"vendor_name"` // 平台名称
|
||||
OrderSqs string `json:"order_sqs"` // 订单流水号
|
||||
VendorOrderId string `json:"vendor_order_id"` // 订单id
|
||||
}
|
||||
|
||||
func pushMsgByUniApp(storeId int, storeName string, cID []string, msg string, body string, soundsFileName string) {
|
||||
|
||||
@@ -68,6 +68,8 @@ type GoodsOrderExt struct {
|
||||
|
||||
OperatorPhone3 string `orm:"size(16)" json:"operatorPhone3"` // 饿百运营人电话
|
||||
OperatorName3 string `orm:"size(32)" json:"operatorName3"` // 饿百运营人组(角色)
|
||||
|
||||
VendorPayType string `json:"vendorPayType"` // 支付方式,当订单来源小程序时通过支付方式区分订单来源(w06微信/tt抖音/ks快手/支付宝)
|
||||
}
|
||||
|
||||
type OrderSkuExt struct {
|
||||
|
||||
@@ -25,7 +25,8 @@ const (
|
||||
VendorGoMei = 12 // 国美
|
||||
VendorIDTT = 13 // 抖音平台小程序
|
||||
VendorIDDD = 14 // 抖店
|
||||
VendorIDPurchaseEnd = 15
|
||||
VendorIDKS = 15 // 快手小程序
|
||||
VendorIDPurchaseEnd = 20
|
||||
|
||||
VendorIDWXPay = 51 // 微信支付
|
||||
|
||||
|
||||
@@ -567,7 +567,7 @@ func IsWaybillFinalStatus(status int) bool {
|
||||
const (
|
||||
JXC4AppId = "wx4b5930c13f8b1170" // 京西菜市appId type=weixinmini
|
||||
JXC4BusinessAppId = "wx08a5c2a8581414ff" // 京西商家appId type=weixinmini
|
||||
JXC4TiktokAppId = "tta6a1d01c399f264201" // 抖音appID
|
||||
JXC4TiktokAppId = "ttaceeda5333d7a7ab01" // 抖音appID
|
||||
|
||||
JXC4ClientAppID = "wxf3657c94aa01a3f0" //京西菜市客户端APP ID type="weixinapp"
|
||||
|
||||
|
||||
@@ -37,6 +37,9 @@ type StoresOrderSaleInfo struct {
|
||||
WaybillTipMoney int64 `json:"waybillTipMoney"` // 京西加的平台配送小费
|
||||
|
||||
RealEarningPrice int64 `json:"realEarningPrice"`
|
||||
|
||||
PlatformSettlement int64 `json:"platformSettlement"` // 真实订单的平台结算(无扣点)
|
||||
ActualFee int64 `json:"actualFee"` // 真三方运单配送费
|
||||
}
|
||||
|
||||
type OrderSkuWithActualPayPrice struct {
|
||||
@@ -411,6 +414,60 @@ func GetStoreOrderSkuList(db *DaoDB, storeIDs []int, finishedAtBegin, finishedAt
|
||||
return skuList, err
|
||||
}
|
||||
|
||||
type TotalShopMoney struct {
|
||||
TotalShopMoney int64 `json:"totalShopMoney"`
|
||||
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
|
||||
}
|
||||
|
||||
// GetPlatformSettlement 统计平台的结算信息
|
||||
func GetPlatformSettlement(db *DaoDB, storeIDs []int, finishedAtBegin, finishedAtEnd time.Time) ([]*TotalShopMoney, error) {
|
||||
sql := `
|
||||
SELECT SUM(t2.total_shop_money) total_shop_money,t2.vendor_id FROM goods_order t2 WHERE t2.order_finished_at >= ? AND t2.order_finished_at <= ?
|
||||
`
|
||||
sqlParams := []interface{}{
|
||||
finishedAtBegin,
|
||||
finishedAtEnd,
|
||||
}
|
||||
if len(storeIDs) > 0 {
|
||||
sql += " AND IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id) IN (" + GenQuestionMarks(len(storeIDs)) + ")"
|
||||
sqlParams = append(sqlParams, storeIDs)
|
||||
}
|
||||
sql += ` AND t2.status = ? GROUP BY t2.vendor_id`
|
||||
sqlParams = append(sqlParams, model.OrderStatusFinished)
|
||||
|
||||
var total []*TotalShopMoney
|
||||
err := GetRows(db, &total, sql, sqlParams...)
|
||||
return total, err
|
||||
}
|
||||
|
||||
type DeliveryFee struct {
|
||||
ActualFee int64 `json:"actualFee"`
|
||||
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
|
||||
}
|
||||
|
||||
// GetPlatformDesiredFee 统计平台的订单的配送费信息
|
||||
func GetPlatformDesiredFee(db *DaoDB, storeIDs []int, finishedAtBegin, finishedAtEnd time.Time) (fee []*DeliveryFee, err error) {
|
||||
sql := `
|
||||
SELECT sum(b.actual_fee) actual_fee,b.order_vendor_id vendor_id FROM goods_order t2
|
||||
RIGHT JOIN waybill b ON t2.vendor_order_id = b.vendor_order_id AND b.status IN (?,?) AND b.vendor_order_id <> b.vendor_waybill_id
|
||||
WHERE t2.order_finished_at >= ? AND t2.order_finished_at <= ?
|
||||
`
|
||||
sqlParams := []interface{}{
|
||||
model.WaybillStatusDelivered,
|
||||
110,
|
||||
finishedAtBegin,
|
||||
finishedAtEnd,
|
||||
}
|
||||
if len(storeIDs) > 0 {
|
||||
sql += " AND IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id) IN (" + GenQuestionMarks(len(storeIDs)) + ")"
|
||||
sqlParams = append(sqlParams, storeIDs)
|
||||
}
|
||||
|
||||
sql += ` GROUP BY b.order_vendor_id `
|
||||
err = GetRows(db, &fee, sql, sqlParams...)
|
||||
return
|
||||
}
|
||||
|
||||
func GetStoreOrderSkuList4Afs(db *DaoDB, storeIDs []int, finishedAtBegin, finishedAtEnd time.Time, isFinish bool) (skuList []*OrderSkuWithActualPayPrice, err error) {
|
||||
sql := `
|
||||
SELECT t1.*,
|
||||
@@ -458,6 +515,7 @@ func GetStoreOrderSkuList4Afs2(db *DaoDB, vendorOrderIDs []string) (skuList []*O
|
||||
`
|
||||
sqlParams = append(sqlParams, vendorOrderIDs)
|
||||
}
|
||||
|
||||
err = GetRows(db, &skuList, sql, sqlParams...)
|
||||
return skuList, err
|
||||
}
|
||||
@@ -502,6 +560,23 @@ func GetStoreAfsOrderSkuList2(db *DaoDB, vendorOrderIDs []string) (afsSkuList []
|
||||
sql += " AND t2.vendor_order_id IN (" + GenQuestionMarks(len(vendorOrderIDs)) + ")"
|
||||
sqlParams = append(sqlParams, vendorOrderIDs)
|
||||
}
|
||||
|
||||
err = GetRows(db, &afsSkuList, sql, sqlParams...)
|
||||
return afsSkuList, err
|
||||
}
|
||||
|
||||
func GetOrderRefundSkuList(db *DaoDB, vendorOrderIDs []string) (afsSkuList []*model.OrderSkuFinancial, err error) {
|
||||
sql := `
|
||||
SELECT t1.*
|
||||
FROM order_sku_financial t1
|
||||
JOIN afs_order t2 ON t2.vendor_order_id = t1.vendor_order_id AND t2.vendor_id = t1.vendor_id AND t2.afs_order_id = t1.afs_order_id
|
||||
WHERE t1.is_afs_order = 1
|
||||
`
|
||||
sqlParams := []interface{}{}
|
||||
if len(vendorOrderIDs) > 0 {
|
||||
sql += " AND t2.vendor_order_id IN (" + GenQuestionMarks(len(vendorOrderIDs)) + ")"
|
||||
sqlParams = append(sqlParams, vendorOrderIDs)
|
||||
}
|
||||
err = GetRows(db, &afsSkuList, sql, sqlParams...)
|
||||
return afsSkuList, err
|
||||
}
|
||||
@@ -826,7 +901,7 @@ func GetOrders(db *DaoDB, ids []int64, isIncludeSku, isIncludeFake bool, fromDat
|
||||
t5.pay_percentage, t5.comment ,t5.old_pay_percentage, t5.market_man_phone, tu.name market_man_name,
|
||||
t5.operator_phone, t5.operator_phone2, t5.operator_phone3, tu1.name operator_name, tu2.name operator_name2, tu3.name operator_name3,
|
||||
t6.vendor_pay_percentage,
|
||||
city.name city_name, district.name district_name,
|
||||
city.name city_name, district.name district_name,op.vendor_pay_type,
|
||||
ROUND(IF(t1.earning_type = 1, t1.total_shop_money-t1.earning_price-IFNULL(t2.desired_fee,0), t1.total_shop_money *(t1.order_pay_percentage/2)/100)) jx_income`, model.DefaultEarningPricePercentage)
|
||||
if isIncludeSku {
|
||||
sql += `,
|
||||
@@ -849,6 +924,7 @@ func GetOrders(db *DaoDB, ids []int64, isIncludeSku, isIncludeFake bool, fromDat
|
||||
LEFT JOIN user tu1 ON tu1.mobile = t5.operator_phone
|
||||
LEFT JOIN user tu2 ON tu2.mobile = t5.operator_phone2
|
||||
LEFT JOIN user tu3 ON tu3.mobile = t5.operator_phone3
|
||||
LEFT JOIN order_pay op ON op.vendor_order_id = t1.vendor_order_id
|
||||
-- LEFT JOIN (SELECT MAX(created_at), afs_order_id, vendor_order_id, vendor_id FROM afs_order WHERE status = 180 GROUP BY 2, 3, 4) t7 ON t7.vendor_order_id = t1.vendor_order_id AND t7.vendor_id = t1.vendor_id
|
||||
-- LEFT JOIN afs_order t8 ON t8.afs_order_id = t7.afs_order_id
|
||||
`
|
||||
@@ -943,7 +1019,6 @@ func GetOrders(db *DaoDB, ids []int64, isIncludeSku, isIncludeFake bool, fromDat
|
||||
} else {
|
||||
sqlWhere += " AND IF(t1.jx_store_id != 0, t1.jx_store_id, t1.store_id) IN (" + GenQuestionMarks(len(storeIDs)) + ")"
|
||||
sqlParams = append(sqlParams, storeIDs)
|
||||
//globals.SugarLogger.Debugf("sqlParams storeIDs========%d", storeIDs)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1821,8 +1896,8 @@ func GetOrderStoreIDs(db *DaoDB, beginAt, endAt time.Time, vendorID int) (storeI
|
||||
|
||||
// GetOrderListByStoreList 根据门店id获取正在刷单的门店商品
|
||||
func GetOrderListByStoreList(db *DaoDB, storeId []int64) (order []*model.GoodsOrder, err error) {
|
||||
sql := `SELECT * FROM goods_order g WHERE g.order_created_at >= ? AND g.order_created_at <= ? AND g.jx_store_id IN (` + GenQuestionMarks(len(storeId)) + `)` + `AND g.vendor_id = ? AND g.status < ?`
|
||||
sqlParam := []interface{}{time.Now().AddDate(0, 0, -5), time.Now().AddDate(0, 0, 1), storeId, model.VendorIDDD, model.OrderStatusDelivering}
|
||||
sql := `SELECT * FROM goods_order g WHERE g.order_created_at >= ? AND g.order_created_at <= ? AND g.jx_store_id IN (` + GenQuestionMarks(len(storeId)) + `)` + `AND g.vendor_id IN (` + GenQuestionMarks(2) + `)` + `AND g.status < ?`
|
||||
sqlParam := []interface{}{time.Now().AddDate(0, 0, -5), time.Now().AddDate(0, 0, 1), storeId, []int{model.VendorIDDD, model.VendorIDEBAI}, model.OrderStatusDelivering}
|
||||
|
||||
if err := GetRows(db, &order, sql, sqlParam...); err != nil {
|
||||
return nil, err
|
||||
|
||||
@@ -1285,7 +1285,7 @@ func GetTopSkusByCityCode(db *DaoDB, cityCode int, orderCreate time.Time) (skuNa
|
||||
AND b.sale_price > ?
|
||||
AND a.order_created_at BETWEEN ? and NOW()
|
||||
GROUP BY 2,3,4
|
||||
ORDER BY count DESC
|
||||
ORDER BY count DESC LIMIT 100
|
||||
`
|
||||
sqlParams := []interface{}{
|
||||
utils.DefaultTimeValue,
|
||||
|
||||
@@ -11,9 +11,10 @@ const (
|
||||
)
|
||||
|
||||
const (
|
||||
PayTypeWX = 1 // 微信支付
|
||||
PayTypeTL = 2 // 通联宝支付
|
||||
PayTypeTicTok = 3 // 抖音支付
|
||||
PayTypeWX = 1 // 微信支付
|
||||
PayTypeTL = 2 // 通联宝支付
|
||||
PayTypeTicTok = 3 // 抖音支付
|
||||
PayTypeKuaiShou = 4 // 快手支付
|
||||
|
||||
PayTypeTL_DiscountCard = 3 // 通联宝支付(会员折扣卡)
|
||||
PayTypeTL_StoreAcctPay = 4 // 通联宝支付(门店账户充值)
|
||||
@@ -135,32 +136,31 @@ type GoodsOrder struct {
|
||||
DeliveryType string `orm:"size(32)" json:"deliveryType"` // 订单配送方式,缺省是平台配送
|
||||
CreateDeliveryType int `orm:"default(0)" json:"createDeliveryType"` //默认0系统发单,1为门店发单
|
||||
|
||||
VendorWaybillID string `orm:"column(vendor_waybill_id);size(48)" json:"vendorWaybillID"`
|
||||
WaybillVendorID int `orm:"column(waybill_vendor_id)" json:"waybillVendorID"` // 表示当前承运商,-1表示还没有安排
|
||||
AdjustCount int8 `json:"adjustCount"` // 调整单(次数)
|
||||
DeliveryFlag int8 `json:"deliveryFlag"` // 第1位为1表示禁止调度器调度三方配送
|
||||
DuplicatedCount int `json:"-"` // 重复新订单消息数,这个一般不是由于消息重发造成的(消息重发由OrderStatus过滤),一般是业务逻辑造成的
|
||||
OrderCreatedAt time.Time `orm:"type(datetime);index" json:"orderCreatedAt"` // 这里记录的是订单生效时间,即用户支付完成(货到付款即为下单时间)
|
||||
OrderFinishedAt time.Time `orm:"type(datetime)" json:"orderFinishedAt"`
|
||||
StatusTime time.Time `orm:"type(datetime)" json:"statusTime"` // last status time
|
||||
PickDeadline time.Time `orm:"type(datetime);null" json:"pickDeadline"`
|
||||
DeliveryFeeFrom *time.Time `orm:"type(datetime);null" json:"deliveryFeeFrom,omitempty"` // 三方配置费计算的开始基准时间
|
||||
ModelTimeInfo `json:"-"`
|
||||
Flag int `json:"flag"` //非运单调整相关的其它状态
|
||||
|
||||
InvoiceTitle string `orm:"size(64)" json:"invoiceTitle"` // 发票抬头
|
||||
InvoiceTaxerID string `orm:"size(32);column(invoice_taxer_id)" json:"invoiceTaxerID"` // 发票纳税人识别码
|
||||
InvoiceEmail string `orm:"size(64)" json:"invoiceEmail"` // 发票邮箱
|
||||
VendorOrgCode string `orm:"size(64)" json:"vendorOrgCode"` // 同一平台下不同的商户代码,如果只有一个,可以为空
|
||||
FromStoreID int `orm:"column(from_store_id)" json:"fromStoreID"` //物料配送门店
|
||||
EclpOutID string `orm:"column(eclp_out_id)" json:"eclpOutID"` //物料配送的出库单号
|
||||
AddressID int64 `orm:"column(address_id)" json:"addressID"` //配送地址ID
|
||||
EarningType int `json:"earningType"` //订单结算方式,2为扣点,1为报价
|
||||
OrderType int `json:"orderType"` //订单类型,0为普通订单,1为物料订单,2为进货订单
|
||||
OrderPayPercentage int `json:"orderPayPercentage"`
|
||||
CouponIDs string `orm:"column(coupon_ids)" json:"couponIDs"` //优惠券IDs(京西商城)
|
||||
NotifyType int `json:"notifyType"` //0表示没有通知,1表示发的短信,2表示发的语音
|
||||
PhoneAscription string `orm:"column(phone_ascription)" json:"phoneAscription"` // 电话号码归属地
|
||||
VendorWaybillID string `orm:"column(vendor_waybill_id);size(48)" json:"vendorWaybillID"`
|
||||
WaybillVendorID int `orm:"column(waybill_vendor_id)" json:"waybillVendorID"` // 表示当前承运商,-1表示还没有安排
|
||||
AdjustCount int8 `json:"adjustCount"` // 调整单(次数)
|
||||
DeliveryFlag int8 `json:"deliveryFlag"` // 第1位为1表示禁止调度器调度三方配送
|
||||
DuplicatedCount int `json:"-"` // 重复新订单消息数,这个一般不是由于消息重发造成的(消息重发由OrderStatus过滤),一般是业务逻辑造成的
|
||||
OrderCreatedAt time.Time `orm:"type(datetime);index" json:"orderCreatedAt"` // 这里记录的是订单生效时间,即用户支付完成(货到付款即为下单时间)
|
||||
OrderFinishedAt time.Time `orm:"type(datetime)" json:"orderFinishedAt"`
|
||||
StatusTime time.Time `orm:"type(datetime)" json:"statusTime"` // last status time
|
||||
PickDeadline time.Time `orm:"type(datetime);null" json:"pickDeadline"`
|
||||
DeliveryFeeFrom *time.Time `orm:"type(datetime);null" json:"deliveryFeeFrom,omitempty"` // 三方配置费计算的开始基准时间
|
||||
ModelTimeInfo `json:"-"` // 1
|
||||
Flag int `json:"flag"` // 非运单调整相关的其它状态
|
||||
InvoiceTitle string `orm:"size(64)" json:"invoiceTitle"` // 发票抬头
|
||||
InvoiceTaxerID string `orm:"size(32);column(invoice_taxer_id)" json:"invoiceTaxerID"` // 发票纳税人识别码
|
||||
InvoiceEmail string `orm:"size(64)" json:"invoiceEmail"` // 发票邮箱
|
||||
VendorOrgCode string `orm:"size(64)" json:"vendorOrgCode"` // 同一平台下不同的商户代码,如果只有一个,可以为空
|
||||
FromStoreID int `orm:"column(from_store_id)" json:"fromStoreID"` // 物料配送门店
|
||||
EclpOutID string `orm:"column(eclp_out_id)" json:"eclpOutID"` // 物料配送的出库单号
|
||||
AddressID int64 `orm:"column(address_id)" json:"addressID"` // 配送地址ID
|
||||
EarningType int `json:"earningType"` // 订单结算方式,2为扣点,1为报价
|
||||
OrderType int `json:"orderType"` // 订单类型,0为普通订单,1为物料订单,2为进货订单
|
||||
OrderPayPercentage int `json:"orderPayPercentage"` // 调价包?
|
||||
CouponIDs string `orm:"column(coupon_ids)" json:"couponIDs"` // 优惠券IDs(京西商城)
|
||||
NotifyType int `json:"notifyType"` // 0表示没有通知,1表示发的短信,2表示发的语音
|
||||
PhoneAscription string `orm:"column(phone_ascription)" json:"phoneAscription"` // 电话号码归属地,{代表抖音号码归宿地[yes-四川成都]}
|
||||
|
||||
// 以下只是用于传递数据
|
||||
OriginalData string `orm:"-" json:"-"`
|
||||
@@ -244,7 +244,7 @@ type Waybill struct {
|
||||
ModelTimeInfo `json:"-"`
|
||||
OriginalData string `orm:"type(text)" json:"-"`
|
||||
Remark string `orm:"-" json:"-"` // 用于传递remark
|
||||
|
||||
//PunctualFee int64 `orm:"column(punctual_fee)" json:"punctualFee"` // 对应美团外卖运单的准时保险费
|
||||
VendorOrgCode string `orm:"size(64)" json:"vendorOrgCode"` // 同一平台下不同的商户代码,如果只有一个,可以为空
|
||||
}
|
||||
|
||||
|
||||
@@ -325,7 +325,7 @@ type Store struct {
|
||||
AutoEnableAt *time.Time `orm:"type(datetime);null" json:"autoEnableAt"` // 自动营业时间(临时休息用)
|
||||
ChangePriceType int8 `json:"changePriceType"` // 修改价格类型,即是否需要审核
|
||||
SMSNotify int8 `orm:"column(sms_notify);" json:"smsNotify"` // 是否通过短信接收订单消息(每天只推一条)
|
||||
SMSNotifyMark int8 `orm:"column(sms_notify_mark);" json:"smsNotifyMark"` //今天是否已经推送过订单消息
|
||||
SMSNotifyMark int8 `orm:"column(sms_notify_mark);" json:"smsNotifyMark"` // 今天是否已经推送过订单消息
|
||||
AutoReplyType int8 `json:"autoReplyType"` // 订单评价自动回复类型
|
||||
LinkStoreID int `orm:"column(link_store_id);default(0);index" json:"linkStoreID"` // 关联门店ID
|
||||
StoreLevel string `orm:"default(C);size(32)" json:"storeLevel"` // 门店等级(筛选用,京西的)
|
||||
|
||||
@@ -152,7 +152,6 @@ func GetMsg(ctx *jxcontext.Context, storeID int, lastOrderTime time.Time, lastOr
|
||||
}
|
||||
close(chan2Listen)
|
||||
} else {
|
||||
globals.SugarLogger.Debugf("GetMsg vendorOrderIDs:%s", utils.Format4Output(vendorOrderIDs, true))
|
||||
msg.MsgData = len(vendorOrderIDs)
|
||||
}
|
||||
storeMap, _ := permission.GetUserStoresResultMap(ctx.GetUserID())
|
||||
@@ -215,7 +214,6 @@ func OnNewWait4ApproveAfsOrder(order *model.AfsOrder) {
|
||||
}
|
||||
|
||||
func OnKeyAfsOrderStatusChanged(order *model.AfsOrder) {
|
||||
globals.SugarLogger.Debugf("msghub OnKeyAfsOrderStatusChanged, order:%s", utils.Format4Output(order, true))
|
||||
utils.CallFuncAsync(func() {
|
||||
msgChan <- &ServerMsg{
|
||||
Type: ServerMsgKeyAfsOrderStatusChanged,
|
||||
|
||||
@@ -199,7 +199,6 @@ func GetAndStoreCitiesShops(ctx *jxcontext.Context, vendorIDs []int, cityCodeLis
|
||||
}
|
||||
}()
|
||||
for _, v := range shopList {
|
||||
globals.SugarLogger.Debugf("GetAndStoreCitiesShops cityCode:%d, 平台:%s, shopID:%s, districtCode:%d", cityCode, model.VendorChineseNames[v.VendorID], v.VendorStoreID, v.DistrictCode)
|
||||
if v.DistrictCode > 0 {
|
||||
tmpShop := *v
|
||||
dao.DeleteEntity(db, &tmpShop, model.FieldVendorStoreID, model.FieldVendorID)
|
||||
|
||||
@@ -29,7 +29,6 @@ func CallCreateWaybillPolicy(deliveryFee, maxDeliveryFee int64, order *model.Goo
|
||||
if deliveryFee > maxDeliveryFee {
|
||||
errStr := fmt.Sprintf("超最高限价, 所需运费:%s, 最高限价:%s", jxutils.IntPrice2StandardCurrencyString(deliveryFee), jxutils.IntPrice2StandardCurrencyString(maxDeliveryFee))
|
||||
err = fmt.Errorf(errStr)
|
||||
globals.SugarLogger.Debugf("CallCreateWaybillPolicy orderID:%s, 平台:%s运单,创建出错:%s", order.VendorOrderID, model.VendorChineseNames[waybillVendorID], errStr)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -220,6 +220,52 @@ func UpdateOrder2Complete() {
|
||||
return
|
||||
}
|
||||
|
||||
func makeRiderInfo(fakeWayBill *model.Waybill, riderInfo *mtpsapi.RiderInfo) {
|
||||
switch fakeWayBill.Status {
|
||||
case 5: // 呼叫骑手
|
||||
riderInfo.LogisticsContext = "呼叫骑手,新建运单"
|
||||
riderInfo.LogisticsStatus = 0
|
||||
riderInfo.CourierName = ""
|
||||
riderInfo.CourierPhone = ""
|
||||
riderInfo.OpCode = tiktok_api.TiktokLogisticsStatusCALLRIDER
|
||||
|
||||
// 下一状态以及推送时间
|
||||
fakeWayBill.Status = model.WaybillStatusCourierAssigned
|
||||
fakeWayBill.VendorStatus = utils.Int64ToStr(model.WaybillStatusCourierAssigned)
|
||||
case 12: // 骑手接单
|
||||
riderInfo.LogisticsContext = model.RiderWaitGetGoods
|
||||
riderInfo.LogisticsStatus = 12
|
||||
riderInfo.OpCode = tiktok_api.TiktokLogisticsORDERRECEIVED
|
||||
// 下一状态以及推送时间
|
||||
fakeWayBill.Status = model.WaybillStatusCourierArrived
|
||||
fakeWayBill.VendorStatus = utils.Int64ToStr(model.WaybillStatusCourierArrived)
|
||||
case 15: // 到店
|
||||
riderInfo.LogisticsContext = model.RiderToStore
|
||||
riderInfo.LogisticsStatus = 15
|
||||
riderInfo.OpCode = tiktok_api.TiktokLogisticsRIDERARRIVED
|
||||
// 下一状态以及推送时间
|
||||
fakeWayBill.Status = model.WaybillStatusDelivering
|
||||
fakeWayBill.VendorStatus = utils.Int64ToStr(model.WaybillStatusDelivering)
|
||||
case 20: //配送中
|
||||
riderInfo.LogisticsContext = model.RiderGetOrderDelivering
|
||||
riderInfo.LogisticsStatus = 20
|
||||
riderInfo.OpCode = tiktok_api.TiktokLogisticsRIDERPICKUP
|
||||
// 下一状态以及推送时间
|
||||
fakeWayBill.Status = model.WaybillStatusDelivered
|
||||
fakeWayBill.VendorStatus = utils.Int64ToStr(model.WaybillStatusDelivered)
|
||||
case 105: // 完成
|
||||
riderInfo.LogisticsContext = model.RiderGetOrderDelivered
|
||||
riderInfo.LogisticsStatus = 40
|
||||
riderInfo.OpCode = tiktok_api.TiktokLogisticsDELIVERED
|
||||
// 下一状态以及推送时间
|
||||
fakeWayBill.Status = model.WaybillStatusFailed
|
||||
fakeWayBill.VendorStatus = utils.Int64ToStr(model.WaybillStatusFailed)
|
||||
default:
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// UpdateFakeWayBillToTiktok 轮询更新假订单到抖音
|
||||
func UpdateFakeWayBillToTiktok() {
|
||||
scheduleTimer, _ := rand.Int(rand.Reader, big.NewInt(1000))
|
||||
@@ -252,48 +298,7 @@ func UpdateFakeWayBillToTiktok() {
|
||||
LogisticsStatus: fakeWayBill[i].Status,
|
||||
}
|
||||
|
||||
switch fakeWayBill[i].Status {
|
||||
case 5: // 呼叫骑手
|
||||
riderInfo.LogisticsContext = "呼叫骑手,新建运单"
|
||||
riderInfo.LogisticsStatus = 0
|
||||
riderInfo.CourierName = ""
|
||||
riderInfo.CourierPhone = ""
|
||||
riderInfo.OpCode = tiktok_api.TiktokLogisticsStatusCALLRIDER
|
||||
|
||||
// 下一状态以及推送时间
|
||||
fakeWayBill[i].Status = model.WaybillStatusCourierAssigned
|
||||
fakeWayBill[i].VendorStatus = utils.Int64ToStr(model.WaybillStatusCourierAssigned)
|
||||
case 12: // 骑手接单
|
||||
riderInfo.LogisticsContext = model.RiderWaitGetGoods
|
||||
riderInfo.LogisticsStatus = 12
|
||||
riderInfo.OpCode = tiktok_api.TiktokLogisticsORDERRECEIVED
|
||||
// 下一状态以及推送时间
|
||||
fakeWayBill[i].Status = model.WaybillStatusCourierArrived
|
||||
fakeWayBill[i].VendorStatus = utils.Int64ToStr(model.WaybillStatusCourierArrived)
|
||||
case 15: // 到店
|
||||
riderInfo.LogisticsContext = model.RiderToStore
|
||||
riderInfo.LogisticsStatus = 15
|
||||
riderInfo.OpCode = tiktok_api.TiktokLogisticsRIDERARRIVED
|
||||
// 下一状态以及推送时间
|
||||
fakeWayBill[i].Status = model.WaybillStatusDelivering
|
||||
fakeWayBill[i].VendorStatus = utils.Int64ToStr(model.WaybillStatusDelivering)
|
||||
case 20: //配送中
|
||||
riderInfo.LogisticsContext = model.RiderGetOrderDelivering
|
||||
riderInfo.LogisticsStatus = 20
|
||||
riderInfo.OpCode = tiktok_api.TiktokLogisticsRIDERPICKUP
|
||||
// 下一状态以及推送时间
|
||||
fakeWayBill[i].Status = model.WaybillStatusDelivered
|
||||
fakeWayBill[i].VendorStatus = utils.Int64ToStr(model.WaybillStatusDelivered)
|
||||
case 105: // 完成
|
||||
riderInfo.LogisticsContext = model.RiderGetOrderDelivered
|
||||
riderInfo.LogisticsStatus = 40
|
||||
riderInfo.OpCode = tiktok_api.TiktokLogisticsDELIVERED
|
||||
// 下一状态以及推送时间
|
||||
fakeWayBill[i].Status = model.WaybillStatusFailed
|
||||
fakeWayBill[i].VendorStatus = utils.Int64ToStr(model.WaybillStatusFailed)
|
||||
default:
|
||||
continue
|
||||
}
|
||||
makeRiderInfo(fakeWayBill[i], riderInfo)
|
||||
|
||||
if riderInfo.LogisticsContext != model.RiderGetOrderDeliverFailed && riderInfo.LogisticsContext != model.RiderGetOrderDeliverOther && riderInfo.LogisticsContext != model.RiderWaitRider {
|
||||
riderInfo.LogisticsContext = fmt.Sprintf(riderInfo.LogisticsContext, riderInfo.CourierName, riderInfo.CourierPhone)
|
||||
@@ -301,7 +306,8 @@ func UpdateFakeWayBillToTiktok() {
|
||||
|
||||
// 推送骑手信息
|
||||
paramsMap := utils.Struct2Map(riderInfo, "", true)
|
||||
if handler := partner.GetPurchaseOrderHandlerFromVendorID(model.VendorIDDD); handler != nil {
|
||||
handler := partner.GetPurchaseOrderHandlerFromVendorID(fakeWayBill[i].OrderVendorID)
|
||||
if handler != nil {
|
||||
if err := handler.GetOrderRider(fakeWayBill[i].VendorOrgCode, "", paramsMap); err != nil {
|
||||
globals.SugarLogger.Errorf("Fake Pull Rider Info Err :%s--%s--%v", riderInfo.OrderId, riderInfo.ThirdCarrierOrderId, err)
|
||||
continue
|
||||
@@ -321,11 +327,27 @@ func UpdateFakeWayBillToTiktok() {
|
||||
}
|
||||
// 更新运单为完成状态
|
||||
if fakeWayBill[i].Status == model.WaybillStatusDelivered {
|
||||
order, err := partner.CurOrderManager.LoadOrder(fakeWayBill[i].VendorOrderID, fakeWayBill[i].OrderVendorID)
|
||||
if err != nil {
|
||||
globals.SugarLogger.Errorf("Loading order by wayBill vendorOrderID err := %v", err)
|
||||
continue
|
||||
}
|
||||
if order.Status == model.OrderStatusCanceled {
|
||||
continue
|
||||
}
|
||||
|
||||
sql := `UPDATE goods_order g SET g.status = ?,g.vendor_status = ?,g.order_finished_at = ? WHERE g.vendor_order_id = ? `
|
||||
_, err := dao.ExecuteSQL(dao.GetDB(), sql, []interface{}{model.OrderStatusFinished, model.OrderStatusFinished, time.Now(), fakeWayBill[i].VendorOrderID}...)
|
||||
_, err = dao.ExecuteSQL(dao.GetDB(), sql, []interface{}{model.OrderStatusFinished, model.OrderStatusFinished, time.Now(), fakeWayBill[i].VendorOrderID}...)
|
||||
if err != nil {
|
||||
globals.SugarLogger.Debugf("UPDATA goods_order Err :%s", err.Error())
|
||||
}
|
||||
// 饿百订单推送订单送达
|
||||
if fakeWayBill[i].OrderVendorID == model.VendorIDEBAI {
|
||||
if err := handler.Swtich2SelfDelivered(order, "JingXiAdmin"); err != nil {
|
||||
globals.SugarLogger.Errorf("Swtich2SelfDelivered err := %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -158,5 +158,36 @@ func (p *PurchaseHandler) GetVendorCategories(ctx *jxcontext.Context) (vendorCat
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) GetOrderRider(vendorOrgCode, vendorStoreID string, param map[string]interface{}) (err error) {
|
||||
return nil
|
||||
selfStatus := 0
|
||||
switch param["logistics_status"].(int) {
|
||||
case 0:
|
||||
selfStatus = 2 // 2:配送待分配
|
||||
case 12:
|
||||
selfStatus = 3 // 骑士接单
|
||||
case 15:
|
||||
selfStatus = 8 // 骑士到店
|
||||
case 20:
|
||||
selfStatus = 20 // 骑手送出
|
||||
case 40:
|
||||
selfStatus = 30 // 配送完成
|
||||
default:
|
||||
selfStatus = 7 // 配送异常
|
||||
}
|
||||
param2 := &ebaiapi.PushRiderInfo{
|
||||
DistributorId: 201,
|
||||
OrderId: param["order_id"].(string),
|
||||
State: 21,
|
||||
SelfStatus: selfStatus,
|
||||
SelfStatusDesc: param["logistics_context"].(string),
|
||||
DistributorInfoDTO: ebaiapi.DistributorInfoDTO{
|
||||
DistributorTypeId: "99999",
|
||||
DistributorName: "商家自行配送",
|
||||
},
|
||||
Knight: ebaiapi.Knight{
|
||||
Id: utils.Str2Int64(param["order_id"].(string)),
|
||||
Name: param["courier_name"].(string),
|
||||
Phone: param["courier_phone"].(string),
|
||||
},
|
||||
}
|
||||
return api.EbaiAPI.OrderselfDeliveryStateSync2(param2)
|
||||
}
|
||||
|
||||
@@ -522,6 +522,9 @@ func (c *PurchaseHandler) onOrderNew(msg *ebaiapi.CallbackMsg, orderStatus *mode
|
||||
})
|
||||
}
|
||||
}
|
||||
if handler := partner.GetPurchaseOrderHandlerFromVendorID(model.VendorIDEBAI); handler != nil {
|
||||
handler.AcceptOrRefuseOrder(order, true, "jxAdmin")
|
||||
}
|
||||
return api.EbaiAPI.Err2CallbackResponse(msg.Cmd, err, map[string]interface{}{
|
||||
"source_order_id": vendorOrderID,
|
||||
})
|
||||
|
||||
@@ -270,7 +270,6 @@ func (p *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName strin
|
||||
if err == nil {
|
||||
if shopID > 0 {
|
||||
err = p.UpdateStoreCustomID(jxcontext.AdminCtx, "", store.VendorStoreID, int64(shopID))
|
||||
globals.SugarLogger.Debugf("UpdateStore store.VendorStoreID====%s,shopID====%s", store.VendorStoreID, shopID)
|
||||
} else if shopID == 0 {
|
||||
// todo remove out shop id
|
||||
}
|
||||
@@ -346,7 +345,6 @@ func (p *PurchaseHandler) RefreshAllStoresID(ctx *jxcontext.Context, parentTask
|
||||
fBaiduIDs, fShopIDs, err1 := FilterStoreRel(baiduShopIDs)
|
||||
globals.SugarLogger.Debugf("RefreshAllStoresID FilterStoreRel fBaiduIDs====%d fShopIDs====%d err====%v", fBaiduIDs, fShopIDs, err1)
|
||||
err = api.EbaiAPI.ShopIDBatchUpdate(fBaiduIDs, fShopIDs)
|
||||
globals.SugarLogger.Debugf("RefreshAllStoresID baiduShopIDs====%s,shopIDs====%s", baiduShopIDs, shopIDs)
|
||||
}
|
||||
return nil, err
|
||||
}, stores)
|
||||
@@ -373,7 +371,6 @@ func FilterStoreRel(baiduShopIDs []string) (fBaiduShopIDs []string, fShopIDs []s
|
||||
return nil, nil, err
|
||||
}
|
||||
localRel, err := dao.GetStoreDetailByVendorStoreID(dao.GetDB(), k, model.VendorIDEBAI, "")
|
||||
globals.SugarLogger.Debugf("get localRel err===%v", err)
|
||||
if remoteRel.ShopID != utils.Int2Str(localRel.ID) {
|
||||
fBaiduShopIDs = append(fBaiduShopIDs, k)
|
||||
fShopIDs = append(fShopIDs, utils.Int2Str(localRel.ID))
|
||||
@@ -673,7 +670,6 @@ func (c *PurchaseHandler) UpdateStoreCustomID(ctx *jxcontext.Context, vendorOrgC
|
||||
if err1 != nil {
|
||||
globals.SugarLogger.Debugf("UpdateStoreCustomID err1====%v", err1)
|
||||
}
|
||||
globals.SugarLogger.Debugf("UpdateStoreCustomID fBaiduIDs====%s fShopIDs====%d err1", fBaiduIDs, fShopIDs)
|
||||
err = api.EbaiAPI.ShopIDBatchUpdate(fBaiduIDs, fShopIDs)
|
||||
//err = api.EbaiAPI.ShopIDBatchUpdate([]string{vendorStoreID}, []string{utils.Int64ToStr(storeID)})
|
||||
}
|
||||
|
||||
@@ -515,6 +515,9 @@ func genSkuParamsFromStoreSkuInfo2(storeSku *dao.StoreSkuSyncInfo, isCreate, isE
|
||||
if storeSku.MinOrderCount > 0 {
|
||||
params["minimum"] = utils.Int2Float64(storeSku.MinOrderCount)
|
||||
}
|
||||
if storeSku.MinOrderCount == 0 {
|
||||
params["minimum"] = utils.Int2Float64(1)
|
||||
}
|
||||
return params
|
||||
}
|
||||
|
||||
|
||||
@@ -108,10 +108,6 @@ func (p *PurchaseHandler) DeleteCategory2(ctx *jxcontext.Context, vendorOrgCode,
|
||||
func (p *PurchaseHandler) ReorderCategories2(ctx *jxcontext.Context, vendorOrgCode, vendorParentCatID string, vendorCatIDList []string) (err error) {
|
||||
if globals.EnableJdStoreWrite {
|
||||
err = getAPI(vendorOrgCode).ChangeShopCategoryOrder(utils.Str2Int64WithDefault(vendorParentCatID, 0), utils.StringSlice2Int64(vendorCatIDList))
|
||||
globals.SugarLogger.Debugf("vendorInfo.vendorOrgCode=== %s", vendorOrgCode)
|
||||
globals.SugarLogger.Debugf("vendorInfo.vendorParentCatID=== %s", vendorParentCatID)
|
||||
globals.SugarLogger.Debugf("vendorInfo.vendorCatIDList=== %s", vendorCatIDList)
|
||||
globals.SugarLogger.Debugf("ReorderCategories2 === %v", err)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -297,7 +297,6 @@ func (p *PurchaseHandler) CreateStoreSkus(ctx *jxcontext.Context, storeID int, v
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) UpdateStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*dao.StoreSkuSyncInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
|
||||
globals.SugarLogger.Debugf("是不是正儿八经的京东商城%s", "UpdateStoreSkus")
|
||||
if globals.EnableJdShopWrite && vendorStoreID == model.JdShopMainVendorStoreID {
|
||||
if vendorStoreID == model.JdShopMainVendorStoreID {
|
||||
for _, v := range storeSkuList {
|
||||
|
||||
191
business/partner/purchase/jx/localjx/kuaishou_pay.go
Normal file
191
business/partner/purchase/jx/localjx/kuaishou_pay.go
Normal file
@@ -0,0 +1,191 @@
|
||||
package localjx
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"git.rosy.net.cn/baseapi/platformapi/kuaishou_mini"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/business/auth2/authprovider/kuaishou"
|
||||
"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"
|
||||
)
|
||||
|
||||
func getOrderBriefKs(order *model.GoodsOrder) string {
|
||||
sku := make([]string, len(order.Skus))
|
||||
for _, v := range order.Skus {
|
||||
sku = append(sku, fmt.Sprintf("%s x %d件商品", v.SkuName, v.Count))
|
||||
}
|
||||
return strings.Join(sku, ",")
|
||||
}
|
||||
|
||||
func pay4OrderByKs(ctx *jxcontext.Context, order *model.GoodsOrder, vendorPayType, subAppID string) (orderPay *model.OrderPay, err error) {
|
||||
// 获取用户快手OpenId
|
||||
var (
|
||||
db = dao.GetDB()
|
||||
)
|
||||
authBindList, err := dao.GetUserBindAuthInfo(db, ctx.GetUserID(), model.AuthBindTypeAuth, []string{kuaishou.AuthTypeKuaiShouMini}, "", "", nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if len(authBindList) == model.NO {
|
||||
return nil, errors.New("用户未绑定快手,无法快手支付")
|
||||
}
|
||||
|
||||
param := &kuaishou_mini.PreCreateOrderReq{
|
||||
OutOrderNo: utils.Int64ToStr(GenPayOrderID(order)),
|
||||
OpenId: authBindList[0].AuthID,
|
||||
TotalAmount: order.ActualPayPrice,
|
||||
Subject: "蔬菜水果日用品",
|
||||
Detail: getOrderBriefKs(order),
|
||||
TypeDetail: 1832, // 蔬菜:费率2%,水果:1833%2
|
||||
ExpireTime: 60 * 10,
|
||||
Sign: "",
|
||||
Attach: "",
|
||||
NotifyUrl: "http://callback.jxc4.com/kuaishou/KuaiShouCallback",
|
||||
GoodsId: "",
|
||||
GoodsDetailUrl: "",
|
||||
MultiCopiesGoodsInfo: "",
|
||||
CancelOrder: 0,
|
||||
}
|
||||
|
||||
// 预下单
|
||||
prePayInfo, err := api.KuaiShouApi.PreCreateOrder(param)
|
||||
if err == nil {
|
||||
orderPay = &model.OrderPay{
|
||||
PayOrderID: order.VendorOrderID, // 抖音订单id
|
||||
PayType: model.PayTypeKuaiShou,
|
||||
VendorPayType: vendorPayType,
|
||||
VendorOrderID: order.VendorOrderID,
|
||||
VendorID: order.VendorID,
|
||||
Status: 0,
|
||||
PayCreatedAt: time.Now(),
|
||||
PrepayID: "",
|
||||
CodeURL: prePayInfo, // 抖音支付token
|
||||
TotalFee: int(order.ActualPayPrice),
|
||||
}
|
||||
}
|
||||
return orderPay, err
|
||||
}
|
||||
|
||||
func OnKSPayCallback(msg *kuaishou_mini.CallBackDetail, refund *kuaishou_mini.RefundCallBack, payType string) (err error) {
|
||||
switch payType {
|
||||
case kuaishou_mini.CallbackTypePay: // 支付回调
|
||||
err = onKSPayFinished(msg)
|
||||
case kuaishou_mini.CallbackTypeRefund: // 退款回调
|
||||
err = onKSPayRefund(refund)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func onKSPayFinished(msg *kuaishou_mini.CallBackDetail) (err error) {
|
||||
orderPay := &model.OrderPay{
|
||||
PayOrderID: msg.OutOrderNo,
|
||||
PayType: model.PayTypeTicTok,
|
||||
}
|
||||
orderPay.DeletedAt = utils.DefaultTimeValue
|
||||
db := dao.GetDB()
|
||||
if err = dao.GetEntity(db, orderPay, "PayOrderID", "PayType", "DeletedAt"); err == nil {
|
||||
orderPay.PayFinishedAt = utils.Time2Pointer(time.Now())
|
||||
orderPay.TransactionID = msg.TradeNo
|
||||
orderPay.OriginalData = utils.Format4Output(msg, true)
|
||||
switch msg.Status {
|
||||
case kuaishou_mini.OrderPayStatusHandleing:
|
||||
orderPay.Status = model.PayStatusNo
|
||||
case kuaishou_mini.OrderPayStatusSuccess:
|
||||
orderPay.Status = model.PayStatusYes
|
||||
case kuaishou_mini.OrderPayStatusFailed:
|
||||
orderPay.Status = model.PayStatusFailed
|
||||
}
|
||||
dao.UpdateEntity(db, orderPay)
|
||||
|
||||
if msg.Status == kuaishou_mini.OrderPayStatusSuccess {
|
||||
err = OnPayFinished(orderPay)
|
||||
}
|
||||
} else {
|
||||
globals.SugarLogger.Debugf("onKSPayFinished msg:%s, err:%v", utils.Format4Output(msg, true), err)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func onKSPayRefund(msg *kuaishou_mini.RefundCallBack) (err error) {
|
||||
orderPayRefund := &model.OrderPayRefund{
|
||||
RefundID: msg.OutRefundNo,
|
||||
}
|
||||
db := dao.GetDB()
|
||||
if err = dao.GetEntity(db, orderPayRefund, "RefundID"); err == nil {
|
||||
switch msg.Status {
|
||||
case kuaishou_mini.OrderPayStatusHandleing:
|
||||
orderPayRefund.Status = model.PayStatusNo
|
||||
case kuaishou_mini.OrderPayStatusSuccess:
|
||||
orderPayRefund.Status = model.PayStatusYes
|
||||
case kuaishou_mini.OrderPayStatusFailed:
|
||||
orderPayRefund.Status = model.PayStatusFailed
|
||||
}
|
||||
|
||||
orderPayRefund.OriginalData = utils.Format4Output(msg, true)
|
||||
dao.UpdateEntity(db, orderPayRefund)
|
||||
} else if dao.IsNoRowsError(err) {
|
||||
globals.SugarLogger.Warnf("收到异常的退款事件, msg:%s", utils.Format4Output(msg, true))
|
||||
}
|
||||
|
||||
orderPay := &model.OrderPay{
|
||||
VendorOrderID: orderPayRefund.VendorOrderID,
|
||||
VendorID: jxutils.GetPossibleVendorIDFromVendorOrderID(orderPayRefund.VendorOrderID),
|
||||
PayType: model.PayTypeKuaiShou,
|
||||
Status: model.PayStatusYes,
|
||||
}
|
||||
orderPay.DeletedAt = utils.DefaultTimeValue
|
||||
if err = dao.GetEntity(db, orderPay, "VendorOrderID", "VendorID", "PayType", "Status", "DeletedAt"); err == nil {
|
||||
orderPay.Status = model.PayStatusRefund
|
||||
dao.UpdateEntity(db, orderPay)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
// RefundOrderByKS 申请退款
|
||||
func RefundOrderByKS(ctx *jxcontext.Context, orderPay *model.OrderPay, refundID string, refundFee int, refundDesc string) (orderPayRefund *model.OrderPayRefund, err error) {
|
||||
|
||||
param := kuaishou_mini.RefundParam{
|
||||
OutOrderNo: orderPay.VendorOrderID,
|
||||
OutRefundNo: refundID,
|
||||
Reason: refundDesc,
|
||||
Attach: "",
|
||||
NotifyUrl: "http://callback.jxc4.com/kuaishou/kuaiShouCallback",
|
||||
RefundAmount: int64(orderPay.TotalFee),
|
||||
Sign: "",
|
||||
MultiCopiesGoodsInfo: "",
|
||||
}
|
||||
result, err := api.KuaiShouApi.RefundOrder(¶m)
|
||||
if err == nil {
|
||||
orderPayRefund = &model.OrderPayRefund{
|
||||
RefundID: refundID,
|
||||
VendorRefundID: result,
|
||||
VendorOrderID: orderPay.VendorOrderID,
|
||||
VendorID: orderPay.VendorID,
|
||||
Status: model.RefundStatusNo,
|
||||
TransactionID: orderPay.TransactionID,
|
||||
RefundFee: refundFee,
|
||||
RefundCreatedAt: time.Now(),
|
||||
}
|
||||
dao.WrapAddIDCULDEntity(orderPayRefund, ctx.GetUserName())
|
||||
db := dao.GetDB()
|
||||
if result != "" {
|
||||
orderPayRefund.Status = model.RefundStatusYes
|
||||
} else {
|
||||
orderPayRefund.Status = model.RefundStatusFailed
|
||||
}
|
||||
orderPayRefund.OriginalData = utils.Format4Output(result, true)
|
||||
dao.CreateEntity(db, orderPayRefund)
|
||||
|
||||
orderPay.Status = model.PayStatusRefund
|
||||
dao.UpdateEntity(db, orderPay)
|
||||
}
|
||||
return orderPayRefund, err
|
||||
}
|
||||
@@ -3,7 +3,6 @@ package localjx
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"git.rosy.net.cn/jx-callback/globals"
|
||||
"math"
|
||||
"regexp"
|
||||
"strings"
|
||||
@@ -252,7 +251,6 @@ func CreateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64,
|
||||
outJxOrder.OrderID = jxutils.GenOrderNo()
|
||||
}
|
||||
order, err2 := jxOrder2GoodsOrder(ctx, outJxOrder, deliveryAddress, "", IsDeliverySelf, couponIDs)
|
||||
globals.SugarLogger.Debugf("order order %s", utils.Format4Output(order, false))
|
||||
|
||||
if err = err2; err == nil {
|
||||
order.AddressID = addressID
|
||||
@@ -315,7 +313,6 @@ func Pay4Order(ctx *jxcontext.Context, orderID int64, payType int, vendorPayType
|
||||
db = dao.GetDB()
|
||||
)
|
||||
order, err := partner.CurOrderManager.LoadOrder(utils.Int64ToStr(orderID), model.VendorIDJX)
|
||||
globals.SugarLogger.Debugf("goodsorder := %s", utils.Format4Output(order, false))
|
||||
if err == nil {
|
||||
switch payType {
|
||||
case model.PayTypeWX:
|
||||
@@ -336,6 +333,11 @@ func Pay4Order(ctx *jxcontext.Context, orderID int64, payType int, vendorPayType
|
||||
dao.WrapAddIDCULDEntity(orderPay, ctx.GetUserName())
|
||||
err = dao.CreateEntity(dao.GetDB(), orderPay)
|
||||
}
|
||||
case model.PayTypeKuaiShou:
|
||||
if orderPay, err = pay4OrderByKs(ctx, order, vendorPayType, subAppID); err == nil && orderPay != nil {
|
||||
dao.WrapAddIDCULDEntity(orderPay, ctx.GetUserName())
|
||||
err = dao.CreateEntity(dao.GetDB(), orderPay)
|
||||
}
|
||||
default:
|
||||
err = fmt.Errorf("支付方式:%d当前不支持", payType)
|
||||
}
|
||||
@@ -839,7 +841,7 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64
|
||||
if jxOrder.OrderType != model.OrderTypeMatter || (jxOrder.OrderType == model.OrderTypeMatter && fromStoreID == -1) {
|
||||
outJxOrder.Skus = append(outJxOrder.Skus, jxSku)
|
||||
outJxOrder.OrderPrice += int64(jxSku.Count) * jxSku.SalePrice
|
||||
} else { //以下else为物料订单袋子金额和数量处理
|
||||
} else { //以下else为物料订单袋子金额和数量处理
|
||||
if !result.Flag { //只要flag是false就按原价申请,是true再按订单量
|
||||
outJxOrder.Skus = append(outJxOrder.Skus, jxSku)
|
||||
outJxOrder.OrderPrice += int64(jxSku.Count) * jxSku.SalePrice
|
||||
@@ -1028,6 +1030,11 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64
|
||||
if storeDetail.ID == 668470 || storeDetail.ID == 668469 {
|
||||
outJxOrder.FreightPrice = 1
|
||||
}
|
||||
|
||||
if IsDeliverySelf {
|
||||
outJxOrder.FreightPrice = 0
|
||||
}
|
||||
|
||||
if err == nil {
|
||||
if jxOrder.OrderType == model.OrderTypeNormal {
|
||||
outJxOrder.TotalPrice = outJxOrder.OrderPrice + outJxOrder.FreightPrice
|
||||
@@ -1394,7 +1401,8 @@ func CancelOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string)
|
||||
// refundID := utils.Int64ToStr(GenRefundID(order))
|
||||
refundID := order.VendorOrderID
|
||||
var orderPayRefund *model.OrderPayRefund
|
||||
if orderPay.PayType == model.PayTypeWX {
|
||||
switch orderPay.PayType {
|
||||
case model.PayTypeWX:
|
||||
orderPayRefund, err = refundOrderByWX(ctx, orderPay, refundID, orderPay.TotalFee, reason)
|
||||
if err == nil {
|
||||
dao.WrapAddIDCULDEntity(orderPayRefund, ctx.GetUserName())
|
||||
@@ -1402,17 +1410,23 @@ func CancelOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string)
|
||||
} else {
|
||||
errList.AddErr(err)
|
||||
}
|
||||
} else if orderPay.PayType == model.PayTypeTL {
|
||||
case model.PayTypeTL:
|
||||
orderPayRefund, err = RefundOrderByTL(ctx, orderPay, refundID, orderPay.TotalFee, reason)
|
||||
if err != nil {
|
||||
errList.AddErr(err)
|
||||
}
|
||||
} else if orderPay.PayType == model.PayTypeTicTok {
|
||||
case model.PayTypeTicTok:
|
||||
orderPayRefund, err = RefundOrderByTT(ctx, orderPay, refundID, orderPay.TotalFee, reason)
|
||||
if err != nil {
|
||||
errList.AddErr(err)
|
||||
}
|
||||
case model.PayTypeKuaiShou:
|
||||
orderPayRefund, err = RefundOrderByKS(ctx, orderPay, refundID, orderPay.TotalFee, reason)
|
||||
if err != nil {
|
||||
errList.AddErr(err)
|
||||
}
|
||||
}
|
||||
|
||||
if err == nil {
|
||||
//如果用了优惠券,状态要刷回去
|
||||
if order.CouponIDs != "" {
|
||||
|
||||
@@ -58,6 +58,7 @@ func getTikTok(appID string) (TikTokMini *tiktok.API) {
|
||||
}
|
||||
return TikTokMini
|
||||
}
|
||||
|
||||
func OnTTPayCallback(msg *tiktok.DetailCallBackMessage, refund *tiktok.DetailCallBackMessage2Refund, payType string) (err error) {
|
||||
switch payType {
|
||||
case tiktok.PayStatus: // 支付回调
|
||||
|
||||
@@ -47,6 +47,9 @@ func (c *PurchaseHandler) AgreeOrRefuseRefund(ctx *jxcontext.Context, order *mod
|
||||
if orderPays[0].PayType == model.PayTypeTicTok {
|
||||
_, err = localjx.RefundOrderByTT(ctx, orderPays[0], order.VendorOrderID, int(order.SkuUserMoney), reason)
|
||||
}
|
||||
if orderPays[0].PayType == model.PayTypeKuaiShou {
|
||||
_, err = localjx.RefundOrderByKS(ctx, orderPays[0], order.VendorOrderID, int(order.SkuUserMoney), reason)
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
} else {
|
||||
@@ -177,5 +180,11 @@ func isJxShop(appID string) bool {
|
||||
}
|
||||
|
||||
func (c *PurchaseHandler) GetOrderAfsInfo(ctx *jxcontext.Context, vendorOrderID, afsOrderID string) (orderAfsInfo *partner.OrderAfsInfo, err error) {
|
||||
orderAfsInfo = &partner.OrderAfsInfo{}
|
||||
|
||||
if order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, model.VendorIDJX); err == nil {
|
||||
orderAfsInfo.AfsTotalShopMoney = order.TotalShopMoney
|
||||
}
|
||||
orderAfsInfo.VendorOrderID = vendorOrderID
|
||||
return orderAfsInfo, err
|
||||
}
|
||||
|
||||
@@ -1,11 +1,14 @@
|
||||
package phpjx
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"git.rosy.net.cn/baseapi/platformapi/jdapi"
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
"git.rosy.net.cn/jx-callback/business/partner"
|
||||
)
|
||||
@@ -33,15 +36,58 @@ type Data4AfsOrder struct {
|
||||
}
|
||||
|
||||
func OnAfsOrderMsg(msg *CallbackMsg) (err error) {
|
||||
jxutils.CallMsgHandlerAsync(func() {
|
||||
err = onAfsOrderMsg(msg)
|
||||
}, jxutils.ComposeUniversalOrderID(msg.ThingID, model.VendorIDJX))
|
||||
//jxutils.CallMsgHandlerAsync(func() {
|
||||
err = onAfsOrderMsg(msg)
|
||||
//}, jxutils.ComposeUniversalOrderID(msg.ThingID, model.VendorIDJX))
|
||||
return err
|
||||
}
|
||||
|
||||
func CheckOrderSkuCanRefund(db *dao.DaoDB, afsOrder *Data4AfsOrder) error {
|
||||
// 获取此订单商品吃否存在售后单
|
||||
refundFinancial, err := dao.GetOrderRefundSkuList(db, []string{afsOrder.VendorOrderID})
|
||||
if err != nil && !strings.Contains(err.Error(), "no row found") {
|
||||
return nil
|
||||
}
|
||||
|
||||
if len(refundFinancial) == model.NO {
|
||||
return nil
|
||||
}
|
||||
|
||||
for _, r := range refundFinancial {
|
||||
for _, s := range afsOrder.Skus {
|
||||
if r.SkuID == utils.Str2Int(s.VendorSkuID) {
|
||||
return fmt.Errorf("商品:[%s],已经存在售后单无法重复申请", s.Name)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 获取用户下单商品列表
|
||||
skuList, err := dao.GetSimpleOrderSkus(dao.GetDB(), afsOrder.VendorOrderID, nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var really = make(map[int]bool, 0)
|
||||
for _, s := range skuList {
|
||||
really[s.SkuID] = true
|
||||
}
|
||||
for _, v := range afsOrder.Skus {
|
||||
if _, ok := really[utils.Str2Int(v.VendorSkuID)]; !ok {
|
||||
return fmt.Errorf("商品:[%s],不是购买商品", v.Name)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func buildAfsOrder(msg *CallbackMsg) (outAfsOrder *model.AfsOrder, err error) {
|
||||
var afsOrder *Data4AfsOrder
|
||||
var db = dao.GetDB()
|
||||
if err = utils.UnmarshalUseNumber([]byte(msg.Data), &afsOrder); err == nil {
|
||||
if err := CheckOrderSkuCanRefund(db, afsOrder); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
outAfsOrder = &model.AfsOrder{
|
||||
VendorID: model.VendorIDJX,
|
||||
AfsOrderID: afsOrder.AfsOrderID,
|
||||
@@ -61,17 +107,72 @@ func buildAfsOrder(msg *CallbackMsg) (outAfsOrder *model.AfsOrder, err error) {
|
||||
}
|
||||
outAfsOrder.Status = int(utils.Str2Int64WithDefault(afsOrder.VendorStatus, 0))
|
||||
|
||||
skuNumber := 0 // 申请退款商品种类个数
|
||||
skuCount := 0 // 申请商品退款总条数
|
||||
refundMoney := 0
|
||||
// 当前申请退款的商品
|
||||
for _, x := range afsOrder.Skus {
|
||||
orderSku := &model.OrderSkuFinancial{
|
||||
Count: x.Count,
|
||||
VendorSkuID: x.VendorSkuID,
|
||||
SkuID: int(utils.Str2Int64WithDefault(x.VendorSkuID, 0)),
|
||||
Name: x.Name,
|
||||
UserMoney: x.SalePrice * int64(x.Count),
|
||||
}
|
||||
if x.PromotionType != 0 && x.PromotionType != jdapi.PromotionTypeNormal {
|
||||
orderSku.StoreSubName = utils.Int2Str(x.PromotionType)
|
||||
}
|
||||
outAfsOrder.Skus = append(outAfsOrder.Skus, orderSku)
|
||||
skuCount += orderSku.Count
|
||||
skuNumber++
|
||||
refundMoney += x.Count * int(x.SalePrice)
|
||||
}
|
||||
// 已经退款商品
|
||||
refundFinancial, err := dao.GetStoreAfsOrderSkuList2(db, []string{afsOrder.VendorOrderID})
|
||||
if err != nil && !dao.IsNoRowsError(err) {
|
||||
return nil, err
|
||||
}
|
||||
for _, f := range refundFinancial {
|
||||
skuCount += f.Count
|
||||
skuNumber++
|
||||
refundMoney += f.Count * int(f.SalePrice)
|
||||
}
|
||||
|
||||
// 获取订单商品列表(所有的订单商品)
|
||||
skuList, err := dao.GetSimpleOrderSkus(dao.GetDB(), afsOrder.VendorOrderID, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
makeOrderSkuCount := 0
|
||||
afsOrderOrderSkuCount := 0
|
||||
refundFinacialSkuCount := 0
|
||||
for _, v := range skuList {
|
||||
makeOrderSkuCount += v.Count
|
||||
}
|
||||
for _, v := range afsOrder.Skus {
|
||||
afsOrderOrderSkuCount += v.Count
|
||||
}
|
||||
for _, v := range refundFinancial {
|
||||
refundFinacialSkuCount += v.Count
|
||||
}
|
||||
// 这么写主要是不想让满足条件一的进入条件三
|
||||
if makeOrderSkuCount == afsOrderOrderSkuCount && refundFinacialSkuCount == model.NO { // 整单退
|
||||
} else if makeOrderSkuCount-refundFinacialSkuCount == model.YES && makeOrderSkuCount == model.YES { // 整单退且只有一个商品
|
||||
} else if makeOrderSkuCount-refundFinacialSkuCount-afsOrderOrderSkuCount == model.NO && afsOrderOrderSkuCount > 0 { // 分单退最后一个,不给退
|
||||
return nil, errors.New("如需整单退款,请使用整单退,无法分批次整单退款")
|
||||
}
|
||||
|
||||
orderSkuNumber := 0
|
||||
orderSkuCount := 0
|
||||
for _, v := range skuList {
|
||||
orderSkuNumber++
|
||||
orderSkuCount += v.Count
|
||||
}
|
||||
if skuNumber == orderSkuNumber && skuCount == orderSkuCount {
|
||||
outAfsOrder.RefundType = model.AfsTypeFullRefund
|
||||
} else { // 部分退款,只退还商品部分
|
||||
outAfsOrder.RefundType = model.AfsTypePartRefund
|
||||
}
|
||||
}
|
||||
return outAfsOrder, err
|
||||
@@ -86,7 +187,7 @@ func callbackAfsMsg2Status(msg *CallbackMsg) *model.OrderStatus {
|
||||
RefVendorID: model.VendorIDJX,
|
||||
VendorStatus: msg.SubMsgType,
|
||||
Status: int(utils.Str2Int64WithDefault(msg.SubMsgType, 0)),
|
||||
StatusTime: utils.Timestamp2Time(msg.Timestamp),
|
||||
StatusTime: time.Now(),
|
||||
Remark: "",
|
||||
}
|
||||
return orderStatus
|
||||
|
||||
@@ -339,6 +339,7 @@ func (c *PurchaseHandler) onOrderMsg(msg *mtwmapi.CallbackMsg) (response *mtwmap
|
||||
var err error
|
||||
if c.isAfsMsg(msg) {
|
||||
response = c.OnAfsOrderMsg(msg)
|
||||
return response
|
||||
} else {
|
||||
status := c.callbackMsg2Status(msg)
|
||||
if partner.CurOrderManager.GetStatusDuplicatedCount(status) > 0 {
|
||||
|
||||
@@ -145,7 +145,15 @@ func (c *PurchaseHandler) onAfsOrderMsg(msg *mtwmapi.CallbackMsg) (retVal *mtwma
|
||||
err = partner.CurOrderManager.OnAfsOrderNew(afsOrder, orderStatus)
|
||||
}
|
||||
} else {
|
||||
err = partner.CurOrderManager.OnAfsOrderStatusChanged(orderStatus)
|
||||
if err := partner.CurOrderManager.OnAfsOrderStatusChanged(orderStatus); err == nil {
|
||||
// 订单回调全额退款接口时,将订单状态修改为取消
|
||||
refundData := msg.Data.(*mtwmapi.CallbackRefundInfo)
|
||||
if refundData.NotifyType == "agree" && msg.Cmd == mtwmapi.MsgTypeOrderRefund {
|
||||
order, _ := partner.CurOrderManager.LoadOrder(orderStatus.RefVendorOrderID, model.VendorIDMTWM)
|
||||
order.Status = model.OrderStatusCanceled
|
||||
dao.UpdateEntity(dao.GetDB(), order, "Status")
|
||||
}
|
||||
}
|
||||
}
|
||||
return mtwmapi.Err2CallbackResponse(err, "")
|
||||
}
|
||||
|
||||
@@ -323,7 +323,7 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI
|
||||
foodData["min_order_count"] = 1
|
||||
}
|
||||
foodData["unit"] = storeSku.Unit
|
||||
attr := switchAttr(storeSku.VendorVendorCatID)
|
||||
attr := SwitchAttr(storeSku.VendorVendorCatID)
|
||||
if attr != "" {
|
||||
foodData["common_attr_value"] = attr
|
||||
}
|
||||
@@ -452,7 +452,7 @@ func (p *PurchaseHandler) DeleteStoreSkus(ctx *jxcontext.Context, storeID int, v
|
||||
return failedList, err
|
||||
}
|
||||
|
||||
func switchAttr(vendorCatID int64) (attrs string) {
|
||||
func SwitchAttr(vendorCatID int64) (attrs string) {
|
||||
switch vendorCatID {
|
||||
case 200002727:
|
||||
return mtwmapi.MtwmSkuAttr200002727
|
||||
|
||||
@@ -49,11 +49,16 @@ func (c *PurchaseHandler) callbackMsg2Waybill(msg *mtwmapi.CallbackMsg) (retVal
|
||||
Status: c.GetWaybillStatusFromVendorStatus(vendorStatus),
|
||||
StatusTime: getTimeFromTimestamp(utils.Str2Int64(msg.FormData.Get("time"))),
|
||||
Remark: "",
|
||||
|
||||
VendorOrgCode: msg.AppID,
|
||||
VendorOrgCode: msg.AppID,
|
||||
}
|
||||
if retVal.StatusTime == utils.DefaultTimeValue {
|
||||
retVal.StatusTime = getTimeFromTimestamp(utils.Str2Int64(msg.FormData.Get("timestamp")))
|
||||
}
|
||||
|
||||
//if vendorStatus == "4" || vendorStatus == "8" { // 4:美团推送已经(确认骑手)订单 8:美团推送(骑手完成)订单
|
||||
// retVal.DesiredFee = utils.Float64TwoInt64(utils.Str2Float64WithDefault(msg.FormData.Get("shipping_fee"), 0)) // 订单优惠前的总费用
|
||||
// partner.CurOrderManager
|
||||
//}
|
||||
|
||||
return retVal
|
||||
}
|
||||
|
||||
@@ -28,7 +28,6 @@ const (
|
||||
func OnOrderMsg(msgId string, msg interface{}) (response *tiktokShop.CallbackResponse) {
|
||||
if CurPurchaseHandler != nil {
|
||||
orderId, shopId, _ := api.TiktokStore.GetCallbackOrderId(msgId, msg)
|
||||
globals.SugarLogger.Debugf("order_id %s,%d", orderId, shopId)
|
||||
orderDetail, err := GetTiktokApi(utils.Int64ToStr(shopId), 0, "").GetTiktokOrderDetail(orderId)
|
||||
if err != nil {
|
||||
return tiktokShop.Err2CallbackResponse(err, "")
|
||||
@@ -78,7 +77,6 @@ func HttpToGuoYuan(param map[string]interface{}, requestType string) (*http.Resp
|
||||
}
|
||||
}
|
||||
body := strings.NewReader(string(paramData))
|
||||
globals.SugarLogger.Debugf("HttpToGuoYuan paramData====%s", utils.Format4Output(paramData, false))
|
||||
url := ""
|
||||
switch requestType {
|
||||
case CaiShiPushGyTagOrder: // 订单相关
|
||||
|
||||
@@ -192,7 +192,6 @@ func (p *PurchaseHandler) getOrder(vendorOrgCode, vendorOrderID, vendorStoreID s
|
||||
// 预订单还是快速达
|
||||
localStore, err := dao.GetStoreDetailByVendorStoreID(dao.GetDB(), vendorStoreIdRelly, model.VendorIDDD, vendorOrgCode)
|
||||
if err != nil || localStore == nil || localStore.ID == 0 {
|
||||
globals.SugarLogger.Debugf("平台门店未绑定到京西系统 %s", err.Error())
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
|
||||
@@ -47,6 +47,7 @@ func (c *PurchaseHandler) OnAfsOrderMsg(msgId, orderId string, msg interface{})
|
||||
// todo 对于退款与部分退款,order.go与这个文件中对于状态的处理不一致
|
||||
func (c *PurchaseHandler) onAfsOrderMsg(msgId string, msg interface{}) (retVal *tiktokShop.CallbackResponse) {
|
||||
var err error
|
||||
var db = dao.GetDB()
|
||||
orderStatus, vendorOrgCode := c.callbackAfsMsg2Status(msgId, msg)
|
||||
if orderStatus == nil {
|
||||
return tiktokShop.Err2CallbackResponse(nil, "")
|
||||
@@ -115,14 +116,20 @@ func (c *PurchaseHandler) onAfsOrderMsg(msgId string, msg interface{}) (retVal *
|
||||
afsOrder.AfsFinishedAt = afsOrder.AfsCreatedAt
|
||||
}
|
||||
if msgId == tiktokShop.CallbackUpdateRefundOrderMsgTagId {
|
||||
_, err = dao.DeleteEntity(dao.GetDB(), afsOrder, "VendorOrderID", "VendorID")
|
||||
_, err = dao.DeleteEntity(db, afsOrder, "VendorOrderID", "VendorID")
|
||||
afsOrder.Skus[0].VendorOrderID = afsOrder.VendorOrderID
|
||||
_, err = dao.DeleteEntity(dao.GetDB(), afsOrder.Skus[0], "VendorOrderID")
|
||||
_, err = dao.DeleteEntity(db, afsOrder.Skus[0], "VendorOrderID")
|
||||
}
|
||||
err = partner.CurOrderManager.OnAfsOrderNew(afsOrder, orderStatus)
|
||||
}
|
||||
} else {
|
||||
err = partner.CurOrderManager.OnAfsOrderStatusChanged(orderStatus)
|
||||
if err == nil && msgId == tiktokShop.CallbackReturnRefundAgreedMsgTagId {
|
||||
goodsOrder, _ := partner.CurOrderManager.LoadOrder(orderStatus.RefVendorOrderID, orderStatus.VendorID)
|
||||
goodsOrder.Status = model.OrderStatusCanceled
|
||||
goodsOrder.VendorStatus = orderStatus.VendorStatus
|
||||
dao.UpdateEntity(db, goodsOrder, "Status", "VendorStatus")
|
||||
}
|
||||
}
|
||||
|
||||
return tiktokShop.Err2CallbackResponse(err, "")
|
||||
@@ -186,20 +193,20 @@ func (c *PurchaseHandler) callbackAfsMsg2Status(msgId string, msg interface{}) (
|
||||
RefVendorOrderID: utils.Int64ToStr(refundOrder.PId),
|
||||
RefVendorID: model.VendorIDDD,
|
||||
VendorStatus: fmt.Sprintf("%s:%s", "order", "refund_success"),
|
||||
Status: c.GetAfsStatusFromVendorStatus(refundOrder.AftersaleType, tiktokShop.CallbackUpdateRefundOrderMsgTagId),
|
||||
Status: c.GetAfsStatusFromVendorStatus(int(refundOrder.AftersaleType), tiktokShop.CallbackUpdateRefundOrderMsgTagId),
|
||||
StatusTime: utils.Timestamp2Time(int64(refundOrder.SuccessTime)),
|
||||
}
|
||||
if k, ok := ReasonCodeMap[refundOrder.ReasonCode]; ok {
|
||||
if k, ok := ReasonCodeMap[int(refundOrder.ReasonCode)]; ok {
|
||||
orderMsg.Remark = k
|
||||
} else {
|
||||
orderMsg.Remark = "退款成功回调,抖音reason_code对应reason不足,需要更新.code:" + utils.Int2Str(refundOrder.ReasonCode)
|
||||
orderMsg.Remark = "退款成功回调,抖音reason_code对应reason不足,需要更新.code:" + utils.Int64ToStr(refundOrder.ReasonCode)
|
||||
}
|
||||
if refundOrder.AftersaleId > 0 {
|
||||
orderMsg.VendorOrderID = utils.Int64ToStr(refundOrder.AftersaleId)
|
||||
} else {
|
||||
orderMsg.VendorOrderID = orderMsg.RefVendorOrderID
|
||||
}
|
||||
vendorOrgCode = refundOrder.ShopId
|
||||
vendorOrgCode = int(refundOrder.ShopId)
|
||||
orderStatus = orderMsg
|
||||
case tiktokShop.CallbackRefundOrderRefuseMsgTagId: // 拒绝退款消息
|
||||
refundOrder := msg.(tiktokShop.BusinessNotRefundRefusedData)
|
||||
|
||||
@@ -494,7 +494,6 @@ func CreateFreightTemplate(storeCode, deliveryFeeDeductionSill int) (int64, erro
|
||||
//},
|
||||
//}
|
||||
}
|
||||
globals.SugarLogger.Debugf("CreateFreightTemplate 直辖市code====%d", param.Template.ProductCity)
|
||||
if deliveryFeeDeductionSill != 0 {
|
||||
param.Template.TemplateName += "满减包邮模板"
|
||||
param.Columns = []freightTemplate_create_request.ColumnsItem{{
|
||||
@@ -601,7 +600,6 @@ func CreateBindFreeShipTemplate(vendorOrgCode string, storeID int, shipFee int64
|
||||
} else {
|
||||
param.Template.ProductCity = int64(storeDetail.CityCode)
|
||||
}
|
||||
globals.SugarLogger.Debugf("CreateBindFreeShipTemplate 直辖市code=%d", param.Template.ProductCity)
|
||||
if resp, err := getAPI(vendorOrgCode, 0, "").FreightTemplateCreate(param); err != nil {
|
||||
return errors.New(fmt.Sprintf("平台门店(%s) 京西门店(%d) 创建包邮模板失败:%v,根据提示处理", storeDetail.VendorStoreID, storeID, err))
|
||||
} else {
|
||||
|
||||
@@ -116,7 +116,6 @@ func (p *PurchaseHandler) DeleteStoreSkus(ctx *jxcontext.Context, storeID int, v
|
||||
if err = getAPI(storeSkuList[0].VendorOrgCode, storeID, vendorStoreID).DeleteStoreCommodity(utils.Str2Int64(v.VendorSkuID)); err != nil {
|
||||
failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "删除子商品")...)
|
||||
}
|
||||
dao.DeleteThingToTiktokMapList(model.VendorIDDD, v.VendorMainId, storeSkuList[0].SkuID)
|
||||
}
|
||||
}
|
||||
if len(failedList) > 0 {
|
||||
|
||||
@@ -226,6 +226,8 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI
|
||||
} else if localThing[0].SyncStatus == model.ThingTypeSyncSuccess {
|
||||
// 主商品存在,直接同步子商品
|
||||
childrenProductId, err := api.CreateSubProduct(utils.Str2Int64(localThing[0].VendorThingID), utils.Str2Int64(vendorStoreID))
|
||||
globals.SugarLogger.Debugf("==========:%s", localThing[0].VendorThingID)
|
||||
globals.SugarLogger.Debugf("==========:%v", err)
|
||||
if err != nil && strings.Contains(err.Error(), "2010004") { // 2010004:主商品非在线审核通过状态,不允许绑定子商品
|
||||
// 线上本地都存在,但是线上审核不成功,就去更新主商品
|
||||
mainOrderDetail = loadMainProductId(api, storeSku, localThing[0].VendorThingID)
|
||||
@@ -498,7 +500,6 @@ func makeMainProductSku(db *dao.DaoDB, api *tiktokShop.API, storeSku *dao.StoreS
|
||||
}
|
||||
|
||||
func getTiktokBrandId(api *tiktokShop.API, db *dao.DaoDB, upc, upcBrandName, upcTiktokBrandId string, categoryLeafId int64) (int64, error) {
|
||||
globals.SugarLogger.Debugf("upc:%s,upcBrandName:%s,upcTiktokBrandId:%s,categoryLeafId:%d", upc, upcBrandName, upcTiktokBrandId, categoryLeafId)
|
||||
if upc == "" { // 默认品牌京西菜市 596120136
|
||||
return 596120136, nil
|
||||
} else if upc != "" && upcBrandName != "" && upcTiktokBrandId != "" {
|
||||
|
||||
@@ -275,7 +275,6 @@ func (p *PurchaseHandler) setStoreOrderSeq(order *model.GoodsOrder) {
|
||||
db := dao.GetDB()
|
||||
if err := dao.GetRow(db, &count, sql, order.StoreID, dateBegin, model.VendorIDWSC); err == nil {
|
||||
order.OrderSeq = count + 1
|
||||
globals.SugarLogger.Debugf("setStoreOrderSeq orderID:%s, dateBegin:%s, orderSeq:%d", order.VendorOrderID, utils.Time2Str(dateBegin), order.OrderSeq)
|
||||
} else {
|
||||
globals.SugarLogger.Errorf("setStoreOrderSeq orderID:%s failed with error:%v", order.VendorOrderID, err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user