This commit is contained in:
richboo111
2023-06-28 11:39:41 +08:00
50 changed files with 2523 additions and 2391 deletions

View File

@@ -27,7 +27,7 @@ const (
)
func (c *BaseScheduler) CreateWaybillOnProviders(ctx *jxcontext.Context, order *model.GoodsOrder, courierVendorIDs, excludeCourierVendorIDs []int, maxDeliveryFee int64, createOnlyOne bool) (bills []*model.Waybill, err error) {
storeCourierList, err := dao.GetStoreCourierList2(dao.GetDB(), []int{jxutils.GetSaleStoreIDFromOrder(order)}, nil, model.StoreStatusOpened, []int{model.StoreAuditStatusOnline, model.StoreAuditStatusUpdated})
storeCourierList, err := dao.GetStoreCourierList2(dao.GetDB(), []int{jxutils.GetSaleStoreIDFromOrder(order)}, courierVendorIDs, model.StoreStatusOpened, []int{model.StoreAuditStatusOnline, model.StoreAuditStatusUpdated})
if err != nil {
return nil, err
}

View File

@@ -944,6 +944,7 @@ func (s *DefScheduler) createWaybillOn3rdProviders(savedOrderInfo *WatchOrderInf
//1表示为门店发单需要验证门店账户余额情况
_, err2 := s.CheckStoreBalance(jxcontext.AdminCtx, order, waybillVendorIDs)
// 检查是否有有效运单
if err == nil && err2 == nil {
// 1.检查门店三方配送配置,达达>蜂鸟>美团>顺丰>uu
// excludeVendorIDs 包括上面已经发送的平台id

View File

@@ -43,7 +43,7 @@ func (s *DefScheduler) SelfDeliveringAndUpdateStatus(ctx *jxcontext.Context, ven
phone = storeDetail.Tel1
}
err = s.SelfDeliverDelivering(order, phone) // 取消平台自配送
//s.CancelAll3rdWaybills(ctx, vendorOrderID, vendorID, true) // 取消三方平台配送以及调度
s.CancelAll3rdWaybills(ctx, vendorOrderID, vendorID, true) // 取消三方平台配送以及调度
}
} else {
if order.Status < model.OrderStatusDelivering {
@@ -159,6 +159,14 @@ func (s *DefScheduler) CreateWaybillOnProviders4SavedOrder(ctx *jxcontext.Contex
if !forceCreate {
err = s.canOrderCreateWaybillNormally(order, nil)
}
// 检查订单是否在配送状态
waybills, err := dao.GetWaybills(dao.GetDB(), order.VendorOrderID, nil)
for _, v := range waybills {
if v.Status >= model.OrderStatusDelivering {
err = fmt.Errorf("订单已经在配送中,无法创建运单,有疑问请联系管理员")
break
}
}
if err == nil {
if forceCreate {
maxDeliveryFee = math.MaxInt64

View File

@@ -177,6 +177,8 @@ func getVendorPriceFromStoreSkuBind(bind *model.StoreSkuBind, vendorID int) (ven
vendorPrice = bind.JxPrice
case model.VendorIDDD:
vendorPrice = bind.DdPrice
case model.VendorIDTaoVegetable:
vendorPrice = bind.TaoPrice
}
return vendorPrice
}

View File

@@ -451,6 +451,7 @@ func DeleteCategoryMap(ctx *jxcontext.Context, db *dao.DaoDB, categoryID int) (n
return dao.DeleteEntityLogically(db, catMap, map[string]interface{}{
model.FieldEbaiSyncStatus: model.SyncFlagDeletedMask,
model.FieldMtwmSyncStatus: model.SyncFlagDeletedMask,
model.FieldTaoSyncStatus: model.SyncFlagDeletedMask,
}, ctx.GetUserName(), map[string]interface{}{
model.FieldCategoryID: categoryID,
model.FieldDeletedAt: utils.DefaultTimeValue,
@@ -1188,10 +1189,10 @@ func getCategoryByImg(img ...string) string {
}
// 根据平台返回的分类id,获取本地绑定的映射分类id
func getJDCategoryLoadingLocalCategoryReflex(jdCategoryId, jdsCategoryID, ebaiCategoryID, mtwmCategoryID string, jxCategoryId int) (string, string, string, int) {
func getJDCategoryLoadingLocalCategoryReflex(jdCategoryId, jdsCategoryID, ebaiCategoryID, mtwmCategoryID, taoCategoryID string, jxCategoryId int) (string, string, string, string, int) {
cats, err := dao.GetCategoriesByName(dao.GetDB(), "", jdCategoryId)
if len(cats) == 0 || err != nil {
return jdsCategoryID, ebaiCategoryID, mtwmCategoryID, 0
return jdsCategoryID, ebaiCategoryID, mtwmCategoryID, taoCategoryID, 0
} else {
if jdsCategoryID == "" && cats[0].JdsCategoryID != 0 {
jdsCategoryID = utils.Int64ToStr(cats[0].JdsCategoryID)
@@ -1202,11 +1203,14 @@ func getJDCategoryLoadingLocalCategoryReflex(jdCategoryId, jdsCategoryID, ebaiCa
if mtwmCategoryID == "" && cats[0].MtwmCategoryID != 0 {
mtwmCategoryID = utils.Int64ToStr(cats[0].MtwmCategoryID)
}
if taoCategoryID == "" && cats[0].TaoCategoryID != 0 {
taoCategoryID = utils.Int64ToStr(cats[0].TaoCategoryID)
}
if jxCategoryId == 0 || jxCategoryId == 291 {
jxCategoryId = cats[0].ID
}
}
return jdsCategoryID, ebaiCategoryID, mtwmCategoryID, jxCategoryId
return jdsCategoryID, ebaiCategoryID, mtwmCategoryID, taoCategoryID, jxCategoryId
}
func updateOrCreateSkuVendorCategoryMap(db *dao.DaoDB, ctx *jxcontext.Context, nameID int, payload map[string]interface{}, skuNameExt *model.SkuNameExt, isDelete bool) (flag bool) {
@@ -1242,6 +1246,7 @@ func updateOrCreateSkuVendorCategoryMap(db *dao.DaoDB, ctx *jxcontext.Context, n
jdsCategoryID := ""
ebaiCategoryID := ""
mtwmCategoryID := ""
taoCategoryID := ""
ddCategoryID := ""
jxCategoryID := 0
if skuNameExt != nil {
@@ -1252,7 +1257,7 @@ func updateOrCreateSkuVendorCategoryMap(db *dao.DaoDB, ctx *jxcontext.Context, n
}
if jdCategoryId != "" && jdCategoryId != "0" {
jdsCategoryID, ebaiCategoryID, mtwmCategoryID, jxCategoryID = getJDCategoryLoadingLocalCategoryReflex(jdCategoryId, skuNameExt.JdsCategoryID, skuNameExt.EbaiCategoryID, skuNameExt.MtwmCategoryID, skuNameExt.CategoryID)
jdsCategoryID, ebaiCategoryID, mtwmCategoryID, taoCategoryID, jxCategoryID = getJDCategoryLoadingLocalCategoryReflex(jdCategoryId, skuNameExt.JdsCategoryID, skuNameExt.EbaiCategoryID, skuNameExt.MtwmCategoryID, skuNameExt.TaoCategoryID, skuNameExt.CategoryID)
} else {
jdsCategoryID = skuNameExt.JdsCategoryID
ebaiCategoryID = skuNameExt.EbaiCategoryID
@@ -1323,7 +1328,7 @@ func updateOrCreateSkuVendorCategoryMap(db *dao.DaoDB, ctx *jxcontext.Context, n
}
if jdCategoryId != "" {
jdsCategoryID, ebaiCategoryID, mtwmCategoryID, jxCategoryID = getJDCategoryLoadingLocalCategoryReflex(jdCategoryId, jdsCategoryID, ebaiCategoryID, mtwmCategoryID, jxCategoryID)
jdsCategoryID, ebaiCategoryID, mtwmCategoryID, taoCategoryID, jxCategoryID = getJDCategoryLoadingLocalCategoryReflex(jdCategoryId, jdsCategoryID, ebaiCategoryID, mtwmCategoryID, taoCategoryID, jxCategoryID)
}
if payload["ddCategoryID"] != nil {
@@ -1645,6 +1650,7 @@ func refreshStoreSkuPrice(ctx *jxcontext.Context, db *dao.DaoDB, skuID int) (err
storeSku.ID = v.BindID
storeSku.JdSyncStatus = v.JdSyncStatus | model.SyncFlagPriceMask
storeSku.MtwmSyncStatus = v.MtwmSyncStatus | model.SyncFlagPriceMask
storeSku.TaoSyncStatus = v.TaoSyncStatus | model.SyncFlagPriceMask
storeSku.EbaiSyncStatus = v.EbaiSyncStatus | model.SyncFlagPriceMask
storeSku.Price = jxutils.CaculateSkuPrice(int(v.UnitPrice), v.SpecQuality, v.SpecUnit, v.Unit)
storeSku.JxPrice = jxutils.CaculatePriceByPricePack(storeDetail.PricePercentagePackObj, int(storeDetail.PricePercentage), int(storeSku.Price))
@@ -1659,7 +1665,7 @@ func refreshStoreSkuPrice(ctx *jxcontext.Context, db *dao.DaoDB, skuID int) (err
}
}
}()
dao.UpdateEntity(db, storeSku, "Price", "JdSyncStatus", "MtwmSyncStatus", "EbaiSyncStatus", "JxPrice", "LastOperator")
dao.UpdateEntity(db, storeSku, "Price", "JdSyncStatus", "MtwmSyncStatus", "TaoSyncStatus", "EbaiSyncStatus", "JxPrice", "LastOperator")
dao.Commit(db, txDB)
return retVal, err
}, list)
@@ -1730,6 +1736,7 @@ func DeleteStoreSku(ctx *jxcontext.Context, db *dao.DaoDB, nameID, skuID int) (n
_, err = dao.DeleteEntityLogically(db, storeSkuBind, map[string]interface{}{
model.FieldJdSyncStatus: model.SyncFlagDeletedMask,
model.FieldMtwmSyncStatus: model.SyncFlagDeletedMask,
model.FieldTaoSyncStatus: model.SyncFlagDeletedMask,
model.FieldEbaiSyncStatus: model.SyncFlagDeletedMask,
model.FieldJdsSyncStatus: model.SyncFlagDeletedMask,
}, ctx.GetUserName(), map[string]interface{}{

View File

@@ -719,7 +719,7 @@ func getGetStoresSkusBaseSQL(db *dao.DaoDB, storeIDs, skuIDs []int, upcs []strin
sql += " AND t4.status >= ? AND t4.status <= ?"
sqlParams = append(sqlParams, fromStatus, toStatus)
}
if params["jdSyncStatus"] != nil || params["ebaiSyncStatus"] != nil || params["mtwmSyncStatus"] != nil {
if params["jdSyncStatus"] != nil || params["ebaiSyncStatus"] != nil || params["mtwmSyncStatus"] != nil || params["taoSyncStatus"] != nil {
realVendorMap, err2 := getValidStoreVendorMap(db, storeIDs)
if err = err2; err != nil {
return "", nil, err
@@ -741,6 +741,10 @@ func getGetStoresSkusBaseSQL(db *dao.DaoDB, storeIDs, skuIDs []int, upcs []strin
sql += " OR (t4.mtwm_sync_status & ? <> 0 AND NOT (t4.mtwm_sync_status & ? <> 0 AND (t4.status <> ? OR t2.status <> ?)) )"
sqlParams = append(sqlParams, params["mtwmSyncStatus"], model.SyncFlagNewMask, model.SkuStatusNormal, model.SkuStatusNormal)
}
if params["taoSyncStatus"] != nil && realVendorMap[model.VendorIDTaoVegetable] == 1 {
sql += " OR (t4.tao_sync_status & ? <> 0 AND NOT (t4.tao_sync_status & ? <> 0 AND (t4.status <> ? OR t2.status <> ?)) )"
sqlParams = append(sqlParams, params["taoSyncStatus"], model.SyncFlagNewMask, model.SkuStatusNormal, model.SkuStatusNormal)
}
sql += ")"
}
}
@@ -981,7 +985,7 @@ func getGetStoresSkusBaseSQL2(db *dao.DaoDB, storeIDs, skuIDs []int, upcs []stri
sql += " AND t4.status >= ? AND t4.status <= ?"
sqlParams = append(sqlParams, fromStatus, toStatus)
}
if params["jdSyncStatus"] != nil || params["ebaiSyncStatus"] != nil || params["mtwmSyncStatus"] != nil {
if params["jdSyncStatus"] != nil || params["ebaiSyncStatus"] != nil || params["mtwmSyncStatus"] != nil || params["taoSyncStatus"] != nil {
realVendorMap, err2 := getValidStoreVendorMap(db, storeIDs)
if err = err2; err != nil {
return "", nil, err
@@ -1003,6 +1007,10 @@ func getGetStoresSkusBaseSQL2(db *dao.DaoDB, storeIDs, skuIDs []int, upcs []stri
sql += " OR (t4.dd_sync_status & ? <> 0 AND NOT (t4.dd_sync_status & ? <> 0 AND (t4.status <> ? OR t2.status <> ?)) )"
sqlParams = append(sqlParams, params["ddSyncStatus"], model.SyncFlagNewMask, model.SkuStatusNormal, model.SkuStatusNormal)
}
if params["taoSyncStatus"] != nil && realVendorMap[model.VendorIDTaoVegetable] == 1 {
sql += " OR (t4.tao_sync_status & ? <> 0 AND NOT (t4.tao_sync_status & ? <> 0 AND (t4.status <> ? OR t2.status <> ?)) )"
sqlParams = append(sqlParams, params["taoSyncStatus"], model.SyncFlagNewMask, model.SkuStatusNormal, model.SkuStatusNormal)
}
sql += ")"
}
}
@@ -2066,6 +2074,7 @@ func updateStoresSkusWithoutSync(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs
skuBind.ID = deletedSku.ID
// vendorSkuID的赋值意义不大
skuBind.MtwmID = deletedSku.MtwmID
skuBind.TaoID = deletedSku.TaoID
skuBind.EbaiID = deletedSku.EbaiID
skuBind.JdsID = deletedSku.JdsID
skuBind.JdsWareID = deletedSku.JdsWareID
@@ -2125,6 +2134,7 @@ func updateStoresSkusWithoutSync(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs
model.FieldJdSyncStatus: model.SyncFlagDeletedMask,
model.FieldEbaiSyncStatus: model.SyncFlagDeletedMask,
model.FieldMtwmSyncStatus: model.SyncFlagDeletedMask,
model.FieldTaoSyncStatus: model.SyncFlagDeletedMask,
model.FieldYbSyncStatus: model.SyncFlagDeletedMask,
model.FieldJdsSyncStatus: model.SyncFlagDeletedMask,
model.FieldDdSyncStatus: model.SyncFlagDeletedMask,
@@ -2262,6 +2272,7 @@ func updateStoresSkusWithoutSync(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs
updateFieldMap[model.FieldJdSyncStatus] = 1
updateFieldMap[model.FieldEbaiSyncStatus] = 1
updateFieldMap[model.FieldMtwmSyncStatus] = 1
updateFieldMap[model.FieldTaoSyncStatus] = 1
updateFieldMap[model.FieldDdSyncStatus] = 1
updateFieldMap[model.FieldUpdatedAt] = 1
updateFieldMap[model.FieldLastOperator] = 1
@@ -2424,6 +2435,7 @@ func updateStoreSkusSaleWithoutSync(ctx *jxcontext.Context, storeID int, skuBind
model.FieldJdSyncStatus: skuBind.JdSyncStatus | model.SyncFlagSaleMask,
model.FieldEbaiSyncStatus: skuBind.EbaiSyncStatus | model.SyncFlagSaleMask,
model.FieldMtwmSyncStatus: skuBind.MtwmSyncStatus | model.SyncFlagSaleMask,
model.FieldTaoSyncStatus: skuBind.TaoSyncStatus | model.SyncFlagSaleMask,
model.FieldDdSyncStatus: skuBind.DdSyncStatus | model.SyncFlagSaleMask,
}
if utils.IsTimeZero(autoSaleTime) || skuBind.Status == model.SkuStatusNormal {
@@ -3195,6 +3207,7 @@ func setStoreSkuBindStatus(skuBind *model.StoreSkuBind, status int8) {
skuBind.JdSyncStatus |= status
skuBind.EbaiSyncStatus |= status
skuBind.MtwmSyncStatus |= status
skuBind.TaoSyncStatus |= status
skuBind.YbSyncStatus |= status
skuBind.JdsSyncStatus |= status
skuBind.DdSyncStatus |= status
@@ -5495,6 +5508,7 @@ func buildStoreSkuBindInfosAndFocus(ctx *jxcontext.Context, db *dao.DaoDB, store
JxPrice: jxPrice,
YbSyncStatus: 0,
MtwmSyncStatus: model.SyncFlagNewMask,
TaoSyncStatus: model.SyncFlagNewMask,
JdSyncStatus: model.SyncFlagNewMask,
EbaiSyncStatus: model.SyncFlagNewMask,
}

View File

@@ -397,6 +397,8 @@ func CompareJxAndVendor(vendorID int, storeIDStr, vendorStoreID, storeName strin
status = jxSkuInfo.Skus[0].EbaiSyncStatus
} else if vendorID == model.VendorIDJD {
status = jxSkuInfo.Skus[0].JdSyncStatus
} else if vendorID == model.VendorIDTaoVegetable {
status = jxSkuInfo.Skus[0].TaoSyncStatus
}
syncStatus := utils.Int2Str(int(status))
toBeCreate := GetBoolName(model.IsSyncStatusNeedCreate(status))

View File

@@ -69,6 +69,10 @@ func CreateStoreCategoryByStoreSku(ctx *jxcontext.Context, vendorID, storeID int
}
func SyncStoreCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID, storeID int, vendorStoreID string, nameIDs, skuIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) {
// 668594 正式服印象汇 668469 测试服芬姐
if storeID != 668594 && storeID != 668469 && vendorID == model.VendorIDTaoVegetable {
return "", nil
}
handler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler)
num := 0
db := dao.GetDB()
@@ -551,9 +555,7 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
}
} else {
if sku.MergedStatus == model.SkuStatusNormal {
if vendorID == model.VendorIDDD {
createList = append(createList, sku)
} else if dao.IsVendorThingIDEmpty(sku.VendorCatID) && !strings.Contains(sku.StoreName, model.ExdStoreName) && vendorID != model.VendorIDYB && vendorID != model.VendorIDJDShop {
if dao.IsVendorThingIDEmpty(sku.VendorCatID) && !strings.Contains(sku.StoreName, model.ExdStoreName) && vendorID != model.VendorIDYB && vendorID != model.VendorIDDD || vendorID != model.VendorIDJDShop {
globals.SugarLogger.Warnf("syncStoreSkuNew 创建门店:%d商品:%d但没有平台分类ID", storeID, sku.SkuID)
} else if dao.IsVendorThingIDEmpty(utils.Int64ToStr(sku.VendorVendorCatID)) && vendorID == model.VendorIDJDShop {
globals.SugarLogger.Warnf("syncStoreSkuNew 创建门店:%d商品:%d但没有映射的平台ID", storeID, sku.SkuID)

View File

@@ -104,12 +104,12 @@ var (
VendorIDYB: "Yb",
VendorIDJX: "Jx",
VendorIDJDShop: "Jds",
VendorIDTaoVegetable: "Tao",
VendorIDDada: "Dada",
VendorIDMTPS: "Mtps",
VendorIDFengNiao: "Fn",
VendorIDSFPS: "Sfps",
//VendorIDDYPS: "DYPS",
VendorIDUUPT: "UUPT",
VendorIDFeiE: "Feie",
@@ -140,6 +140,7 @@ var (
VendorIDJDShop: "京东商城",
VendorIDWSC: "微盟微商城",
VendorIDJX: "京西商城",
VendorIDTaoVegetable: "淘先达",
VendorIDDada: "达达众包",
VendorIDMTPS: "美团配送",

View File

@@ -28,6 +28,7 @@ var (
ShopChineseNames = map[int]string{
VendorIDJD: globals.StoreName,
VendorIDMTWM: globals.StoreNameMtwm,
VendorIDTaoVegetable: globals.StoreNameTao,
VendorIDELM: globals.StoreNameEbai,
VendorIDEBAI: globals.StoreNameEbai,
VendorIDJX: fmt.Sprintf("%s商城", globals.StoreName),
@@ -154,6 +155,7 @@ var (
VendorIDELM: 0,
VendorIDEBAI: 0,
VendorIDDD: 0,
VendorIDTaoVegetable: 0,
}
ZXCityCodeMap = map[int]string{
@@ -288,6 +290,8 @@ const (
OrderStatusEndEnd = 120
AfsOrderStatusWait4Approve = 155 // 待审核售后单
AfsOrderStatusCancelAfs = 156 // 用户取消售后
AfsOrderStatusOnSaleAfs = 157 // 用户售中取消
AfsOrderStatusNew = 160 // 已审核或不需要审核售后单
AfsOrderStatusWait4ReceiveGoods = 165 // 退款退货的,需要商家确认收到货
AfsOrderStatusReceivedGoods = 167 // 已确认收到货

View File

@@ -510,6 +510,7 @@ func AddStoreCategoryMap(db *DaoDB, storeID, categoryID int, vendorID int, vendo
StoreID: storeID,
CategoryID: categoryID,
MtwmSyncStatus: model.SyncFlagNewMask,
TaoSyncStatus: model.SyncFlagNewMask,
EbaiSyncStatus: model.SyncFlagNewMask,
DdSyncStatus: model.SyncFlagNewMask,
YbSyncStatus: model.SyncFlagNewMask,
@@ -533,6 +534,9 @@ func AddStoreCategoryMap(db *DaoDB, storeID, categoryID int, vendorID int, vendo
} else if vendorID == model.VendorIDDD {
storeCat.DdID = vendorCategoryID
storeCat.DdSyncStatus = status
} else if vendorID == model.VendorIDTaoVegetable {
storeCat.TaoID = vendorCategoryID
storeCat.TaoSyncStatus = status
} else {
panic("unsupported vendor")
}

View File

@@ -298,6 +298,7 @@ type StoreSkuExt struct {
JdSyncStatus int8 `orm:"default(2)" json:"jdSyncStatus"`
EbaiSyncStatus int8 `orm:"default(2)" json:"ebaiSyncStatus"`
MtwmSyncStatus int8 `orm:"default(2)" json:"mtwmSyncStatus"`
TaoSyncStatus int8 `orm:"default(2)" json:"taoSyncStatus"`
DdSyncStatus int8 `orm:"default(2)" json:"ddSyncStatus"`
YbSyncStatus int8 `orm:"default(2)" json:"ybSyncStatus"`
JdsSyncStatus int8 `orm:"default(2)" json:"jdsSyncStatus"` //京东商城
@@ -372,6 +373,7 @@ type StoreSkuAndName struct {
StoreSkuSyncInfo
JdSyncStatus int8 `orm:"default(2)"`
MtwmSyncStatus int8 `orm:"default(2)"`
TaoSyncStatus int8 `orm:"default(2)"`
EbaiSyncStatus int8 `orm:"default(2)"`
}
@@ -670,9 +672,6 @@ func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty boo
} else {
fmtParams = append(fmtParams, "''")
}
// if globals.IsStoreSkuAct {
// sql += " OR act.sync_status <> 0"
// }
sql += ")"
} else {
sql += " AND t1.deleted_at = ?"
@@ -682,11 +681,6 @@ func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty boo
sql += " AND t1.sku_id IN (" + GenQuestionMarks(len(skuIDs)) + ")"
sqlParams = append(sqlParams, skuIDs)
}
// 多门店平台没有成功创建的商品,不直接过滤,让上层同步时报错
// if !isSingleStorePF {
// sql += " AND t2.%s_id <> 0"
// fmtParams = append(fmtParams, fieldPrefix)
// }
sql = fmt.Sprintf(sql, fmtParams...)
sql += " ORDER BY t1.price"
if err = GetRows(db, &skus, sql, sqlParams...); err != nil {
@@ -1433,6 +1427,9 @@ func SetStoreSkuBindVendorPrice(storeSkuBind *model.StoreSkuBind, vendorID int,
case model.VendorIDDD:
storeSkuBind.DdPrice = vendorPrice
storeSkuBind.DdLockTime = pLockTime
case model.VendorIDTaoVegetable:
storeSkuBind.TaoPrice = vendorPrice
storeSkuBind.TaoLockTime = pLockTime
}
}
@@ -1448,6 +1445,8 @@ func GetStoreSkuBindVendorPrice(storeSkuBind *model.StoreSkuBind, vendorID int)
vendorPrice = storeSkuBind.JxPrice
case model.VendorIDDD:
vendorPrice = storeSkuBind.DdPrice
case model.VendorIDTaoVegetable:
vendorPrice = storeSkuBind.TaoPrice
}
return vendorPrice
}
@@ -1460,6 +1459,9 @@ func SetStoreSkuBindSyncStatus(storeSkuBind *model.StoreSkuBind, vendorID int, s
storeSkuBind.MtwmSyncStatus = syncStatus
case model.VendorIDEBAI:
storeSkuBind.EbaiSyncStatus = syncStatus
case model.VendorIDTaoVegetable:
storeSkuBind.TaoSyncStatus = syncStatus
}
}
@@ -1471,6 +1473,8 @@ func GetStoreSkuBindSyncStatus(storeSkuBind *model.StoreSkuBind, vendorID int) (
syncStatus = storeSkuBind.MtwmSyncStatus
case model.VendorIDEBAI:
syncStatus = storeSkuBind.EbaiSyncStatus
case model.VendorIDTaoVegetable:
syncStatus = storeSkuBind.TaoSyncStatus
}
return syncStatus
}
@@ -1481,6 +1485,8 @@ func SetStoreCatMapSyncStatus(storeCatMap *model.StoreSkuCategoryMap, vendorID i
storeCatMap.MtwmSyncStatus = syncStatus
case model.VendorIDEBAI:
storeCatMap.EbaiSyncStatus = syncStatus
case model.VendorIDTaoVegetable:
storeCatMap.TaoSyncStatus = syncStatus
}
}

View File

@@ -17,6 +17,7 @@ const (
// FieldElmSyncStatus = "ElmSyncStatus"
FieldEbaiSyncStatus = "EbaiSyncStatus"
FieldMtwmSyncStatus = "MtwmSyncStatus"
FieldTaoSyncStatus = "TaoSyncStatus"
FieldDdSyncStatus = "DdSyncStatus"
// FieldWscSyncStatus = "WscSyncStatus"
FieldYbSyncStatus = "YbSyncStatus"

View File

@@ -132,12 +132,11 @@ type SkuCategory struct {
EbaiCategoryID int64 `orm:"column(ebai_category_id)" json:"ebaiCategoryID"` // 这个是指对应的饿百商品类别
MtwmCategoryID int64 `orm:"column(mtwm_category_id)" json:"mtwmCategoryID"` // 这个是指对应的美团外卖商品类别
DdCategoryID int64 `orm:"column(dd_category_id)" json:"ddCategoryID"` // 这个是指对应的抖音外卖商品类别
TaoCategoryID int64 `orm:"column(tao_category_id)" json:"taoCategoryID"` // 这个是指对应的抖音外卖商品类别
YbCategoryID int64 `orm:"column(yb_category_id)" json:"ybCategoryID"` // 这个是指对应的银豹商品类别
JdsCategoryID int64 `orm:"column(jds_category_id)" json:"jdsCategoryID"` // 这个是指对应的京东商城类别
GoMeiCategoryID int64 `orm:"column(go_mei_category_id)" json:"goMeiCategoryID"` // 这个是指对应的国美商城类别
// ElmCategoryID int64 `orm:"column(elm_category_id)" json:"elmCategoryID"` // 这个是指对应的饿了么商品类别
// WscCategoryID int64 `orm:"column(wsc_category_id)" json:"wscCategoryID"` // 这个是指对应的美团外卖商品类别
Status int8 `orm:"default(1)" json:"status"` //分类状态0表示禁用1表示启用
Img string `orm:"size(512)" json:"img"` //分类图片
@@ -146,8 +145,6 @@ type SkuCategory struct {
IsExdSpec int `json:"isExdSpec"` //是否是饿鲜达特有新建的分类
IsExdSync int `json:"isExdSync"` //饿鲜达分类是否同步到平台
// JdID int64 `orm:"column(jd_id);index" json:"jdID"` // 这个是指商家自己的商品类别在京东平台上的ID
// JdSyncStatus int8 `orm:"default(2)" json:"jdSyncStatus"`
IsSync int `json:"isSync"` //是否同步到平台
}
@@ -210,7 +207,6 @@ func (*SkuName) TableIndex() [][]string {
type Sku struct {
ModelIDCULD
CategoryID int `orm:"column(category_id)" json:"categoryID"` // 特殊类别,一般用于秒杀,特价之类的特殊类别
NameID int `orm:"column(name_id)" json:"nameID"` // todo 这个索引应该要求唯一
SkuIndex int `json:"-"`
@@ -220,17 +216,12 @@ type Sku struct {
Weight int `json:"weight"` // 重量/质量单位为克当相应的SkuName的SpecUnit为g或kg时必须等于SpecQuality
Status int `json:"status"`
Seq int `json:"seq"`
ExdSkuID string `orm:"column(exd_sku_id)" json:"exdSkuID"` //饿鲜达商品ID
ExdCategoryThirdID int `orm:"column(exd_category_third_id)" json:"exdCategoryThirdID"`
EclpID string `orm:"column(eclp_id)" json:"eclpID"` //eclp物料商品ID
MinOrderCount int `json:"minOrderCount"` //最少起购份数,美团用
LadderBoxNum int `json:"ladderBoxNum"` //包装费x件 ,美团用
LadderBoxPrice int `json:"ladderBoxPrice"` //包装费y元 ,美团用
// JdID int64 `orm:"column(jd_id);null;index" json:"jdID"`
// JdSyncStatus int8 `orm:"default(2)" json:"jdSyncStatus"`
// LinkID int `orm:"column(link_id);null;index" json:"linkID"`
}
type SkuAndName struct {
@@ -291,6 +282,7 @@ type SkuNameExt struct {
JdsCategoryID string `json:"jdsCategoryID"`
EbaiCategoryID string `json:"ebaiCategoryID"`
MtwmCategoryID string `json:"mtwmCategoryID"`
TaoCategoryID string `json:"TaoCategoryID"`
DdCategoryID string `json:"ddCategoryID"`
}

View File

@@ -55,20 +55,18 @@ type StoreSkuCategoryMap struct {
StoreID int `orm:"column(store_id)"`
CategoryID int `orm:"column(category_id)"`
// ElmID int64 `orm:"column(elm_id);index"`
EbaiID int64 `orm:"column(ebai_id);index"`
MtwmID string `orm:"column(mtwm_id);index;size(16)"`
TaoID string `orm:"column(tao_id);index;size(16)"`
DdID string `orm:"column(dd_id);index;size(16)"`
// WscID int64 `orm:"column(wsc_id);index"`
YbID int64 `orm:"column(yb_id);index"`
JdsID int64 `orm:"column(jds_id);index"`
// ElmSyncStatus int8 `orm:"default(2)"`
EbaiSyncStatus int8 `orm:"default(2)"`
MtwmSyncStatus int8 `orm:"default(2)"`
TaoSyncStatus int8 `orm:"default(2)"`
DdSyncStatus int8 `orm:"default(2)"`
// WscSyncStatus int8 `orm:"default(2)"`
YbID int64 `orm:"column(yb_id);index"`
YbSyncStatus int8 `orm:"default(2)"`
JdsID int64 `orm:"column(jds_id);index"`
JdsSyncStatus int8 `orm:"default(2)"`
}
@@ -114,30 +112,27 @@ type StoreSkuBind struct {
// ElmID int64 `orm:"column(elm_id);index"`
MtwmID int64 `orm:"column(mtwm_id);index"`
TaoID int64 `orm:"column(tao_id);index"`
EbaiID int64 `orm:"column(ebai_id);index"`
YbID int64 `orm:"column(yb_id);index"`
JdsID int64 `orm:"column(jds_id);index"`
JdsWareID int64 `orm:"column(jds_ware_id)"`
// GmID string `orm:"column(gm_id)"`
// WscID int64 `orm:"column(wsc_id);index"` // 表示微盟skuId
// WscID2 int64 `orm:"column(wsc_id2);index"` // 表示微盟goodsId
DdID int64 `orm:"column(dd_id);index"` // 子品主商品id
VendorSonSkuID string `orm:"column(vendor_son_sku_id)"` // 子商品skuid
VendorSkuAttrId string `orm:"column(vendor_sku_attr_id)"` // 抖音需要,主品skuid
VendorMainId string `orm:"column(vendor_Main_id)"` // 抖音需要,商品主id
// ElmSyncStatus int8 `orm:"default(2)"`
JdSyncStatus int8 `orm:"default(2)"`
MtwmSyncStatus int8 `orm:"default(2)"`
TaoSyncStatus int8 `orm:"default(2)"`
DdSyncStatus int8 `orm:"default(2)"`
EbaiSyncStatus int8 `orm:"default(2)"`
YbSyncStatus int8 `orm:"default(2)"`
JdsSyncStatus int8 `orm:"default(2)"` //京东商城
//GmSyncStatus int8 `orm:"default(2)"` //京东商城
// WscSyncStatus int8 `orm:"default(2)"`
JdPrice int `json:"jdPrice"`
MtwmPrice int `json:"mtwmPrice"`
TaoPrice int `json:"taoPrice"`
EbaiPrice int `json:"ebaiPrice"`
JxPrice int `json:"jxPrice"`
DdPrice int `json:"ddPrice"`
@@ -148,6 +143,7 @@ type StoreSkuBind struct {
JdLockTime *time.Time `orm:"null" json:"jdLockTime"`
JdsLockTime *time.Time `orm:"null" json:"jdsLockTime"`
MtwmLockTime *time.Time `orm:"null" json:"mtwmLockTime"`
TaoLockTime *time.Time `orm:"null" json:"taoLockTime"`
EbaiLockTime *time.Time `orm:"null" json:"ebaiLockTime"`
JxLockTime *time.Time `orm:"null" json:"jxLockTime"`
YbLockTime *time.Time `orm:"null" json:"ybLockTime"`

View File

@@ -110,9 +110,21 @@ func (c *DeliveryHandler) onWaybillMsg(msg *dadaapi.CallbackMsg) (retVal *dadaap
default:
order.Status = model.WaybillStatusUnknown
}
err := dadaapi.Err2CallbackResponse(partner.CurOrderManager.OnWaybillStatusChanged(order), utils.Int2Str(order.Status))
defer delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID, order.Status) // 骑手位置更新
if order.OrderVendorID == model.VendorIDDD {
switch order.OrderVendorID {
case model.VendorIDDD:
tiktokStatusPush(order, msg.OrderStatus)
case model.VendorIDMTWM, model.VendorIDTaoVegetable:
delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID, order.Status) // 骑手位置更新
}
return err
}
// 抖音订单状态回传
func tiktokStatusPush(order *model.Waybill, status int) {
result := &mtpsapi.RiderInfo{
OrderId: order.VendorOrderID,
ThirdCarrierOrderId: order.VendorOrderID,
@@ -122,7 +134,7 @@ func (c *DeliveryHandler) onWaybillMsg(msg *dadaapi.CallbackMsg) (retVal *dadaap
LogisticsStatus: order.Status,
OpCode: "",
}
switch msg.OrderStatus {
switch status {
case dadaapi.OrderStatusWaitingForAccept: // 待接单,召唤骑手
result.LogisticsStatus = model.WaybillStatusNew
result.LogisticsContext = model.RiderWaitRider
@@ -158,8 +170,6 @@ func (c *DeliveryHandler) onWaybillMsg(msg *dadaapi.CallbackMsg) (retVal *dadaap
result.LogisticsContext = model.RiderGetOrderDeliverOther
}
delivery.PullTiktokRiderInfo(result)
}
return err
}
func (c *DeliveryHandler) callbackMsg2Waybill(msg *dadaapi.CallbackMsg) (retVal *model.Waybill, goods *model.GoodsOrder) {
@@ -604,32 +614,32 @@ func (c *DeliveryHandler) GetDeliverLiquidatedDamages(orderId string, deliverId
// 直接返回的 原因是,一个订单在达达发布多次运单时,QueryOrderInfo获取到的运单始终是最后一个运单的配送价格!所以直接返回算了!
return localPrice, nil
// 平台状态兑换金额
var vendorPrice int64 = 0
// 未接单不扣款
if dadaOrder.AcceptTime == "" {
vendorPrice = 0
}
// 有了接单时间,订单变成了待取货
if dadaOrder.AcceptTime != "" && dadaOrder.FetchTime == "" {
nowTime := time.Now().Unix()
fetchTime := utils.Str2Time(dadaOrder.AcceptTime).Unix()
timeDiffer := nowTime - fetchTime
if timeDiffer > 15*60 || timeDiffer < 60 {
vendorPrice = 0
}
vendorPrice = 200
}
// fetchTime 已经有时间了,代表已经取货.次数取消扣除此订单全部金额
// 达达存在多个订单的运单违约金额统计在一起的情况
if dadaOrder.FetchTime != "" {
vendorPrice = utils.Float64TwoInt64(dadaOrder.DeliveryFee * float64(100))
}
if localPrice > vendorPrice {
return localPrice, nil
}
return vendorPrice, nil
//// 平台状态兑换金额
//var vendorPrice int64 = 0
//// 未接单不扣款
//if dadaOrder.AcceptTime == "" {
// vendorPrice = 0
//}
//
//// 有了接单时间,订单变成了待取货
//if dadaOrder.AcceptTime != "" && dadaOrder.FetchTime == "" {
// nowTime := time.Now().Unix()
// fetchTime := utils.Str2Time(dadaOrder.AcceptTime).Unix()
// timeDiffer := nowTime - fetchTime
// if timeDiffer > 15*60 || timeDiffer < 60 {
// vendorPrice = 0
// }
// vendorPrice = 200
//}
//
//// fetchTime 已经有时间了,代表已经取货.次数取消扣除此订单全部金额
//// 达达存在多个订单的运单违约金额统计在一起的情况
//if dadaOrder.FetchTime != "" {
// vendorPrice = utils.Float64TwoInt64(dadaOrder.DeliveryFee * float64(100))
//}
//
//if localPrice > vendorPrice {
// return localPrice, nil
//}
//return vendorPrice, nil
}

View File

@@ -69,7 +69,6 @@ func (c *DeliveryHandler) CancelWaybill(bill *model.Waybill, cancelReasonID int,
}
parameter.PartnerOrderCode = bill.VendorOrderID
if err = api.FnAPI.CancelOrder(parameter); err != nil {
globals.SugarLogger.Debugf("============err := %v ", err)
if strings.Contains(err.Error(), "运单暂未生成") {
err = nil
}
@@ -122,11 +121,23 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee
}
// 重量超标减少配送费
weight := 4.9500
if utils.Int2Float64(order.Weight)/1000 >= weight {
reallyWeight := utils.Int2Float64(order.Weight) / 1000
if reallyWeight >= weight || reallyWeight <= model.NO {
parameter.GoodsWeight = weight
} else {
parameter.GoodsWeight = reallyWeight
}
var goodsList []*fnpsapi.GoodsItemsList
if len(order.Skus) == model.NO {
goodsList = append(goodsList, &fnpsapi.GoodsItemsList{
ItemName: "平台商品(本地暂无储存信息)",
ItemQuantity: model.YES,
ItemAmountCent: model.YES,
ItemActualAmountCent: model.YES,
ItemId: utils.Int2Str(9527),
})
} else {
for _, v := range order.Skus {
goodsList = append(goodsList, &fnpsapi.GoodsItemsList{
ItemName: v.SkuName,
@@ -136,6 +147,7 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee
ItemId: utils.Int2Str(v.SkuID),
})
}
}
parameter.GoodsItemList = goodsList
//要求饿百的订单要传来源
@@ -182,11 +194,23 @@ func (c *DeliveryHandler) GetWaybillFee(order *model.GoodsOrder) (deliveryFeeInf
}
// 重量超标减少配送费
weight := 4.9500
if utils.Int2Float64(order.Weight)/1000 >= weight {
reallyWeight := utils.Int2Float64(order.Weight) / 1000
if reallyWeight >= weight || reallyWeight <= model.NO {
preCreateOrder.GoodsWeight = weight
} else {
preCreateOrder.GoodsWeight = reallyWeight
}
var goodsList []*fnpsapi.GoodsItemsList
if len(order.Skus) == model.NO {
goodsList = append(goodsList, &fnpsapi.GoodsItemsList{
ItemName: "平台商品(本地暂无储存信息)",
ItemQuantity: model.YES,
ItemAmountCent: model.YES,
ItemActualAmountCent: model.YES,
ItemId: utils.Int2Str(9527),
})
} else {
for _, v := range order.Skus {
goodsList = append(goodsList, &fnpsapi.GoodsItemsList{
ItemName: v.SkuName,
@@ -196,6 +220,8 @@ func (c *DeliveryHandler) GetWaybillFee(order *model.GoodsOrder) (deliveryFeeInf
ItemId: utils.Int2Str(v.SkuID),
})
}
}
preCreateOrder.GoodsItemList = goodsList
deliveryFeeInfo = &partner.WaybillFeeInfo{}
@@ -280,7 +306,17 @@ func OnWaybillMsg(msg *fnpsapi.OrderStatusNottify, resultParam *fnpsapi.ShortSta
return fnpsapi.Err2CallbackResponse(err, "")
}
if order.OrderVendorID == model.VendorIDDD {
switch order.OrderVendorID {
case model.VendorIDDD:
tiktokStatusPush(order, orderStatus)
case model.VendorIDMTWM, model.VendorIDTaoVegetable:
delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID, order.Status) // 骑手位置更新
}
return fnpsapi.Err2CallbackResponse(nil, "")
}
// 抖音订单状态回传
func tiktokStatusPush(order *model.Waybill, orderStatus int64) {
result := &mtpsapi.RiderInfo{
OrderId: order.VendorOrderID,
ThirdCarrierOrderId: order.VendorOrderID,
@@ -317,10 +353,6 @@ func OnWaybillMsg(msg *fnpsapi.OrderStatusNottify, resultParam *fnpsapi.ShortSta
result.LogisticsContext = model.RiderGetOrderDeliverOther
}
delivery.PullTiktokRiderInfo(result)
}
defer delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID, order.Status) // 骑手位置更新
return fnpsapi.Err2CallbackResponse(nil, "")
}
// 异常报备

View File

@@ -104,7 +104,6 @@ func (c *DeliveryHandler) onWaybillMsg(msg *mtpsapi.CallbackOrderMsg) (retVal *m
if err != nil {
globals.SugarLogger.Debugf("获取运单信息错误,可能是果园运单:%s,%v", utils.Format4Output(msg, false), err)
break
//return mtpsapi.Err2CallbackResponse(err, fmt.Sprintf("%s", "获取订单状态错误"))
}
order.DesiredFee = utils.Float64TwoInt64(utils.MustInterface2Float64(data["delivery_fee"]) * 100)
order.ActualFee = utils.Float64TwoInt64(utils.MustInterface2Float64(data["pay_amount"]) * 100)
@@ -115,7 +114,6 @@ func (c *DeliveryHandler) onWaybillMsg(msg *mtpsapi.CallbackOrderMsg) (retVal *m
if err != nil {
globals.SugarLogger.Debugf("获取运单信息错误,可能是果园运单:%s,%v", utils.Format4Output(msg, false), err)
break
//return mtpsapi.Err2CallbackResponse(err, fmt.Sprintf("%s", "获取订单状态错误"))
}
order.DesiredFee = utils.Float64TwoInt64(utils.MustInterface2Float64(data["delivery_fee"]) * 100)
order.ActualFee = utils.Float64TwoInt64(utils.MustInterface2Float64(data["pay_amount"]) * 100)
@@ -132,13 +130,6 @@ func (c *DeliveryHandler) onWaybillMsg(msg *mtpsapi.CallbackOrderMsg) (retVal *m
return mtpsapi.SuccessResponse
}
//if msg.Status == mtpsapi.OrderStatusPickedUp {
// order.Status = model.WaybillStatusCourierArrived
// mtpsapi.Err2CallbackResponse(partner.CurOrderManager.OnWaybillStatusChanged(order), order.VendorStatus)
// delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID, order.Status) // 骑手位置更新
// msg.Status = mtpsapi.OrderStatusPickedUp
//}
order2, _ := partner.CurOrderManager.LoadOrder(order.VendorOrderID, order.OrderVendorID)
//查不到订单可能就是果园的订单
if order2 == nil && beego.BConfig.RunMode != "jxgy" {
@@ -148,9 +139,12 @@ func (c *DeliveryHandler) onWaybillMsg(msg *mtpsapi.CallbackOrderMsg) (retVal *m
// 加入调度器
err := mtpsapi.Err2CallbackResponse(partner.CurOrderManager.OnWaybillStatusChanged(order), order.VendorStatus)
defer delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID, order.Status) // 骑手位置更新
if order.OrderVendorID == model.VendorIDDD {
switch order.OrderVendorID {
case model.VendorIDDD:
pushMTPSToTiktok(msg.Status, order)
case model.VendorIDMTWM, model.VendorIDTaoVegetable:
delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID, order.Status) // 骑手位置更新
}
return err
@@ -276,7 +270,7 @@ func (c *DeliveryHandler) callbackMsg2Waybill(msg *mtpsapi.CallbackOrderMsg) (re
// return deliveryFeeInfo, err
//}
// 新方法平台返回
// GetWaybillFee 新方法平台返回(预下单)
func (c *DeliveryHandler) GetWaybillFee(order *model.GoodsOrder) (deliveryFeeInfo *partner.WaybillFeeInfo, err error) {
shopWeight := float64(order.Weight) / float64(order.Weight)
if shopWeight > 50 {
@@ -291,7 +285,7 @@ func (c *DeliveryHandler) GetWaybillFee(order *model.GoodsOrder) (deliveryFeeInf
return nil, err
}
deliveryFeeInfo.RefDeliveryFee, deliveryFeeInfo.RefAddFee, err = api.MtpsAPI.PreCreateByShop(&mtpsapi.PreCreateByShopParam{
param := &mtpsapi.PreCreateByShopParam{
DeliveryID: deliveryID,
OrderID: order.VendorOrderID,
ShopID: shopId,
@@ -306,13 +300,19 @@ func (c *DeliveryHandler) GetWaybillFee(order *model.GoodsOrder) (deliveryFeeInf
PayTypeCode: 0,
ExpectedDeliveryTime: mtpsapi.DeliveryServiceCodeRapid, // 4002飞速达,4011快速达,4012及时达,4013集中送
OuterOrderSourceDesc: "101",
})
}
if param.GoodsWidth <= model.NO {
param.GoodsWidth = model.YES
}
deliveryFeeInfo.RefDeliveryFee, deliveryFeeInfo.RefAddFee, err = api.MtpsAPI.PreCreateByShop(param)
deliveryFeeInfo.DeliveryFee = deliveryFeeInfo.RefDeliveryFee
return deliveryFeeInfo, err
}
// IDeliveryPlatformHandler(美团配送)
// CreateWaybill(美团配送)
func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee int64) (bill *model.Waybill, err error) {
db := dao.GetDB()
// 检查配送平台是否被禁用
@@ -324,16 +324,6 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee
return nil, fmt.Errorf("此平台配送已被系统关闭,暂不发配送 [%v]", vendorOrgCode[0].Comment)
}
// 自定义计算预估费用
//deliveryFee, _, err := delivery.CalculateOrderDeliveryFee(order, time.Now(), db)
//if err != nil {
// return nil, err
//}
// 运费预警
//if err = delivery.CallCreateWaybillPolicy(deliveryFee, maxDeliveryFee, order, model.VendorIDMTPS); err != nil {
// return nil, err
//}
// 忽略坐标转换错误,即使是转换出错,也只能当成转换成功来处理,底层会有错误日志输出
lngFloat, latFloat, _ := jxutils.IntCoordinate2MarsStandard(order.ConsigneeLng, order.ConsigneeLat, order.CoordinateType)
billParams := &mtpsapi.CreateOrderByShopParam{
@@ -350,6 +340,9 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee
// ExpectedDeliveryTime: order.ExpectedDeliveredTime.Unix(),
OrderType: mtpsapi.OrderTypeASAP,
}
if billParams.GoodsWidth <= model.NO {
billParams.GoodsWidth = model.YES
}
// 获取送货单id
billParams.DeliveryID = c.getDeliveryID(order)
@@ -363,6 +356,7 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee
Goods: []*mtpsapi.GoodsItem{},
}
goodItemMap := map[string]*mtpsapi.GoodsItem{}
if len(order.Skus) > model.NO {
for _, sku := range order.Skus {
goodItem := &mtpsapi.GoodsItem{
GoodCount: sku.Count,
@@ -377,6 +371,20 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee
item.GoodCount += goodItem.GoodCount
}
}
} else {
goodItem := &mtpsapi.GoodsItem{
GoodCount: model.YES,
GoodPrice: jxutils.IntPrice2Standard(model.YES),
}
goodItem.GoodName, goodItem.GoodUnit = jxutils.GetNameAndUnitFromSkuName("本地暂无商品信息 500g/份")
// 好像SKU名不能重复否则会报错尝试处理一下
if item, ok := goodItemMap[goodItem.GoodName]; !ok {
goods.Goods = append(goods.Goods, goodItem)
goodItemMap[goodItem.GoodName] = goodItem
} else {
item.GoodCount += goodItem.GoodCount
}
}
billParams.Note = utils.FilterMb4("客户电话:" + order.ConsigneeMobile + "," + order.BuyerComment + "配送遇到问题可联系18048531223取消配送单禁止未配送直接完成定单")
billParams.GoodsDetail = string(utils.MustMarshal(goods))

View File

@@ -3,7 +3,9 @@ package delivery
import (
"crypto/rand"
"fmt"
"git.rosy.net.cn/baseapi/platformapi/tao_vegetable"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/globals/api"
"math/big"
"time"
@@ -19,6 +21,7 @@ import (
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/business/partner"
utilsTao "git.rosy.net.cn/jx-callback/business/partner/purchase/tao_vegetable"
"git.rosy.net.cn/jx-callback/globals"
)
@@ -88,9 +91,6 @@ func GetOrderRiderInfoToPlatform(orderId string, wayBillStatus int) {
//3.当同一个订单已经上传了一次配送信息,如再次同步会更新配送信息,以最新的一次为准。
//4.如订单已完成、已取消等状态发货将失败。
for _, v := range orders {
//if v.Status >= model.OrderStatusFinished || v.Status < model.OrderStatusDelivering {
// continue
//}
if orderId == "" && v.VendorID == model.VendorIDDD { // 抖音门店订单除了三方配送回调时推送,不在主动推送配送消息
continue
}
@@ -134,6 +134,7 @@ func GetOrderRiderInfoToPlatform(orderId string, wayBillStatus int) {
riderInfo.LogisticsStatus = v.Status
}
taoDeliveryStatus := ""
switch riderInfo.LogisticsStatus {
case 5: // 呼叫骑手
riderInfo.LogisticsStatus = 0
@@ -147,12 +148,15 @@ func GetOrderRiderInfoToPlatform(orderId string, wayBillStatus int) {
case 20: //配送中
riderInfo.LogisticsStatus = 20
riderInfo.OpCode = tiktok_api.TiktokLogisticsRIDERPICKUP
taoDeliveryStatus = tao_vegetable.OrderStatusDelivery // 配送中
case 110: // 完成
riderInfo.LogisticsStatus = 40
riderInfo.OpCode = tiktok_api.TiktokLogisticsDELIVERED
taoDeliveryStatus = tao_vegetable.OrderStatusDeliveryOver // 完成
case 105: // 完成
riderInfo.LogisticsStatus = 40
riderInfo.OpCode = tiktok_api.TiktokLogisticsDELIVERED
taoDeliveryStatus = tao_vegetable.OrderStatusDeliveryOver // 完成
case 115: // 取消
riderInfo.CourierName = ""
riderInfo.CourierPhone = ""
@@ -161,24 +165,28 @@ func GetOrderRiderInfoToPlatform(orderId string, wayBillStatus int) {
case 22, 0, 120: // 异常配送
riderInfo.LogisticsStatus = 22
riderInfo.OpCode = tiktok_api.TiktokLogisticsINDDELIVERYEXCEPTION
taoDeliveryStatus = tao_vegetable.OrderStatusUserRejection // 完成
default:
continue
}
if riderInfo.Longitude == "" {
riderInfo.Longitude = utils.Float64ToStr(utils.Int2Float64(v.ConsigneeLng) / 1000000)
}
if riderInfo.Latitude == "" {
riderInfo.Latitude = utils.Float64ToStr(utils.Int2Float64(v.ConsigneeLat) / 1000000)
}
if riderInfo.CourierPhone == "" {
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), v.JxStoreID, 0, "")
if riderInfo.CourierPhone == "" {
if err == nil {
riderInfo.CourierPhone = storeDetail.Tel1
}
riderInfo.CourierName = "老板"
}
if riderInfo.Longitude == "" && riderInfo.LogisticsStatus != 105 {
riderInfo.Longitude = utils.Float64ToStr(utils.Int2Float64(storeDetail.Lng) / 1000000)
riderInfo.Latitude = utils.Float64ToStr(utils.Int2Float64(storeDetail.Lat) / 1000000)
}
if riderInfo.Longitude == "" && riderInfo.LogisticsStatus == 105 {
riderInfo.Longitude = utils.Float64ToStr(utils.Int2Float64(v.ConsigneeLng) / 1000000)
riderInfo.Latitude = utils.Float64ToStr(utils.Int2Float64(v.ConsigneeLat) / 1000000)
}
if riderInfo.CourierPhone == "" {
riderInfo.CourierName = "石锋"
riderInfo.CourierPhone = "18048531223"
@@ -186,6 +194,7 @@ func GetOrderRiderInfoToPlatform(orderId string, wayBillStatus int) {
if riderInfo.ThirdCarrierOrderId == "" {
riderInfo.ThirdCarrierOrderId = riderInfo.OrderId + "_fake"
}
// 目前只推送美团骑手信息
switch v.VendorID {
case model.VendorIDMTWM: // 美团订单
@@ -212,6 +221,20 @@ func GetOrderRiderInfoToPlatform(orderId string, wayBillStatus int) {
continue
case model.VendorIDJX: // 京西平台
continue
case model.VendorIDTaoVegetable: // 淘鲜达
// 定时任务刷新骑手坐标
if orderId == "" {
if handler := partner.GetPurchaseOrderHandlerFromVendorID(v.VendorID); handler != nil {
if err := handler.GetOrderRider(v.VendorOrgCode, v.VendorStoreID, utils.Struct2Map(riderInfo, "", true)); err != nil {
globals.SugarLogger.Errorf("Error pushing meituan rider information :%s--%s--%v", v.VendorOrderID, utils.Format4Output(riderInfo, false), err)
}
}
} else { // 订单状态改变 [配送中/用户签收/用户拒收]
param := utilsTao.OrderStatusChangeDelivery(&v.GoodsOrder, taoDeliveryStatus)
if err := api.TaoVegetableApi.DeliveryFinish(param); err != nil {
globals.SugarLogger.Debugf("淘先达运单状态推送错误运单状态[%s],错误:%s", taoDeliveryStatus, err.Error())
}
}
default:
globals.SugarLogger.Errorf("Order source error, non system order: %s", v.VendorOrderID)
continue

View File

@@ -90,7 +90,7 @@ func (d DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee i
weight int
productDetail []*sfps2.ProductDetail
)
if order.Weight >= 49500 {
if order.Weight >= 49500 || order.Weight <= model.NO {
weight = 49500
} else {
weight = order.Weight
@@ -127,12 +127,19 @@ func (d DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee i
},
}
if len(order.Skus) != model.NO {
for _, v := range order.Skus {
productDetail = append(productDetail, &sfps2.ProductDetail{
ProductName: v.SkuName,
ProductNum: int64(v.Count),
})
}
} else {
productDetail = append(productDetail, &sfps2.ProductDetail{
ProductName: "本地暂无商品储存信息",
ProductNum: int64(model.YES),
})
}
param.OrderDetail.ProductDetail = productDetail
sfOrderID, sfBillID, sfTotalPrice, sfReallyPrice, err := api.SfPsAPI.CreateOrder(param)
@@ -192,13 +199,15 @@ func (d DeliveryHandler) CancelWaybill(bill *model.Waybill, cancelReasonID int,
func (d DeliveryHandler) GetWaybillFee(order *model.GoodsOrder) (deliveryFeeInfo *partner.WaybillFeeInfo, err error) {
var (
weight int
//productDetail []*sfps2.ProductDetail
)
if order.Weight >= 49500 {
// 默认重量
if order.Weight >= 49500 || order.Weight <= 0 {
weight = 49500
} else {
weight = order.Weight
}
store, err := dao.GetStoreDetail(dao.GetDB(), getReallyStoreID(order.StoreID, order.JxStoreID), 0, "")
if err != nil {
return nil, err
@@ -382,12 +391,20 @@ func OnWaybillMsg(urlIndex string, msg interface{}) (resp *sfps2.CallbackRespons
globals.SugarLogger.Warnf("onWaybillMsg unknown msg:%v", msg)
}
globals.SugarLogger.Debugf("SFPS OnWaybillMsg order=%s", utils.Format4Output(order, false))
if err := partner.CurOrderManager.OnWaybillStatusChanged(order); err != nil {
return sfps2.Err2CallbackResponse(err)
}
if order.OrderVendorID == model.VendorIDDD {
switch order.OrderVendorID {
case model.VendorIDDD:
tiktokStatusPush(order, orderStatus)
case model.VendorIDTaoVegetable, model.VendorIDMTWM:
delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID, order.Status) // 骑手位置更新
}
return sfps2.Err2CallbackResponse(nil)
}
func tiktokStatusPush(order *model.Waybill, orderStatus int64) {
result := &mtpsapi.RiderInfo{
OrderId: order.VendorOrderID,
ThirdCarrierOrderId: order.VendorOrderID,
@@ -424,10 +441,6 @@ func OnWaybillMsg(urlIndex string, msg interface{}) (resp *sfps2.CallbackRespons
result.LogisticsContext = model.RiderGetOrderDeliverOther
}
delivery.PullTiktokRiderInfo(result)
}
defer delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID, order.Status) // 骑手位置更新
return sfps2.Err2CallbackResponse(nil)
}
// OnWaybillExceptSF 异常报备

View File

@@ -381,7 +381,16 @@ func OnWaybillMsg(req *uuptapi.WaybillCallbackParam) (resp *uuptapi.CallbackResp
return uuptapi.Err2CallbackResponse(err)
}
//推送抖音
if param.OrderVendorID == model.VendorIDDD {
switch param.OrderVendorID {
case model.VendorIDDD:
tiktokStatusPush(param, req.State)
case model.VendorIDMTWM, model.VendorIDTaoVegetable:
delivery.GetOrderRiderInfoToPlatform(param.VendorOrderID, param.Status) // 骑手位置更新
}
return uuptapi.Err2CallbackResponse(nil)
}
func tiktokStatusPush(param *model.Waybill, orderStatus string) {
result := &mtpsapi.RiderInfo{
OrderId: param.VendorOrderID,
ThirdCarrierOrderId: param.VendorOrderID,
@@ -391,7 +400,7 @@ func OnWaybillMsg(req *uuptapi.WaybillCallbackParam) (resp *uuptapi.CallbackResp
LogisticsStatus: param.Status,
OpCode: "",
}
switch req.State {
switch orderStatus {
case uuptapi.StateConfirmSuccess: //下单成功
result.LogisticsStatus = model.WaybillStatusNew
result.LogisticsContext = model.RiderWaitRider
@@ -418,9 +427,6 @@ func OnWaybillMsg(req *uuptapi.WaybillCallbackParam) (resp *uuptapi.CallbackResp
result.LogisticsContext = model.RiderGetOrderDeliverOther
}
delivery.PullTiktokRiderInfo(result)
}
defer delivery.GetOrderRiderInfoToPlatform(param.VendorOrderID, param.Status) // 骑手位置更新
return uuptapi.Err2CallbackResponse(nil)
}
//辅助函数

View File

@@ -53,3 +53,13 @@ func GetOrderIDFromMap(orderMap map[string]interface{}) string {
}
return ""
}
func GetAfsIDFromMap(orderMap map[string]interface{}) string {
if orderID := orderMap["refund_order_id"]; orderID != nil {
if tryOrderID, ok := orderID.(string); ok {
return tryOrderID
}
return utils.Int64ToStr(utils.MustInterface2Int64(orderID))
}
return ""
}

View File

@@ -115,7 +115,7 @@ func (p *PurchaseHandler) OrderFinancialDetail2Refund(orderFinancial *model.Orde
func (p *PurchaseHandler) AfsOrderDetail2Financial(orderData map[string]interface{}) (afsOrder *model.AfsOrder) {
afsOrder = &model.AfsOrder{
VendorID: model.VendorIDEBAI,
AfsOrderID: GetOrderIDFromMap(orderData),
AfsOrderID: GetAfsIDFromMap(orderData),
VendorOrderID: GetOrderIDFromMap(orderData),
}
order, err := partner.CurOrderManager.LoadOrder(afsOrder.VendorOrderID, afsOrder.VendorID)

View File

@@ -72,8 +72,6 @@ func pay4OrderByTL(ctx *jxcontext.Context, order *model.GoodsOrder, payType int,
err = api.TLpayAPI.CreateH5UnitorderOrder(param2)
} else {
result, err := api.TLpayAPI.CreateUnitorderOrder(param)
globals.SugarLogger.Debugf("===============result: %s", utils.Format4Output(result, false))
globals.SugarLogger.Debugf("===============result: %s", utils.Format4Output(err, false))
if err == nil {
var result2 tonglianpayapi.PayInfo
json.Unmarshal([]byte(result.PayInfo), &result2)

View File

@@ -93,12 +93,8 @@ func (p *PurchaseHandler) getOrder(vendorOrgCode, vendorOrderID, vendorStoreID s
return order, result, err
}
func (p *PurchaseHandler) getOrderRider(vendorOrgCode, vendorStoreID string, param map[string]interface{}) (err error) {
return getAPI(vendorOrgCode, 0, vendorStoreID).OrderStatusAndPsInfo(param)
}
func (p *PurchaseHandler) GetOrderRider(vendorOrgCode, vendorStoreID string, param map[string]interface{}) (err error) {
return p.getOrderRider(vendorOrgCode, vendorStoreID, param)
return getAPI(vendorOrgCode, 0, vendorStoreID).OrderStatusAndPsInfo(param)
}
func (p *PurchaseHandler) GetOrder(vendorOrgCode, vendorOrderID, vendorStoreID string) (order *model.GoodsOrder, err error) {
@@ -570,6 +566,7 @@ func (c *PurchaseHandler) SelfDeliverDelivering(order *model.GoodsOrder, userNam
return err
}
// SelfDeliverDelivered 自配送订单送达
func (c *PurchaseHandler) SelfDeliverDelivered(order *model.GoodsOrder, userName string) (err error) {
if globals.EnableMtwmStoreWrite {
err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").OrderArrived(utils.Str2Int64(order.VendorOrderID))

View File

@@ -744,6 +744,7 @@ func (p *PurchaseHandler) CancelActs(ctx *jxcontext.Context, vendorOrgCode strin
return cancelOneShopAct(putils.GetFixDirectDownAct(vendorOrgCode, storeID, 0), vendorStoreID, putils.StoreSku2ActStoreSku(model.SyncFlagDeletedMask, vendorStoreID, storeSkuList))
}
// UpdateStoreSkusSpecTag 更新限购
func (p *PurchaseHandler) UpdateStoreSkusSpecTag(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (err error) {
var foodDataList = []map[string]interface{}{}
for _, v := range storeSkuList {

View File

@@ -1,4 +1,4 @@
package mtwm
package tao_vegetable
import (
"fmt"
@@ -354,12 +354,12 @@ func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITa
return err
}
//func (c *PurchaseHandler) GetActAmple(ctx *jxcontext.Context, vendorStoreID, vendorOrgCode string) (ample int, err error) {
// for _, v := range mtwmapi.ActTypeList {
// //1表示进行中
// if actList, err := getAPI(vendorOrgCode, 0, vendorStoreID).GetByAppPoiCodeAndType(vendorOrgCode, 1, v); err == nil {
// ample += len(actList)
// }
// }
// return ample, err
//}
func (c *PurchaseHandler) GetActAmple(ctx *jxcontext.Context, vendorStoreID, vendorOrgCode string) (ample int, err error) {
//for _, v := range mtwmapi.ActTypeList {
// //1表示进行中
// if actList, err := getAPI(vendorOrgCode, 0, vendorStoreID).GetByAppPoiCodeAndType(vendorOrgCode, 1, v); err == nil {
// ample += len(actList)
// }
//}
return ample, err
}

View File

@@ -1,73 +1,29 @@
package mtwm
package tao_vegetable
import (
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
"git.rosy.net.cn/baseapi/platformapi/tao_vegetable"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
"git.rosy.net.cn/jx-callback/business/jxutils/netprinter"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/globals"
"net/http"
"strings"
)
// 美团回调接口
func OnCallbackMsg(msg *mtwmapi.CallbackMsg, msgType string) (response *mtwmapi.CallbackResponse) {
// 获取平台门店id
//_, err := dao.GetStoreDetailByVendorStoreID(dao.GetDB(), GetVendorStoreIDFromMsg(msg), model.VendorIDMTWM, GetVendorAppIdFromMsg(msg))
//if err != nil && strings.Contains(err.Error(), "no row found") {
// forwardOrderToGy(msg, msgType)
// return mtwmapi.SuccessResponse
//}
// OnCallbackMsg 淘宝回调接口
func OnCallbackMsg(orderStatus, orderId string, msg interface{}) (response *tao_vegetable.CallBackResult) {
if CurPurchaseHandler != nil {
if msg.Cmd == mtwmapi.MsgTypeStoreStatusChanged || msg.Cmd == mtwmapi.MsgTypeStoreAuditStatusChanged {
response = CurPurchaseHandler.onStoreStatusChanged(msg)
} else if msg.Cmd == mtwmapi.MsgTypePrivateNumberDowngrade {
response = CurPurchaseHandler.onNumberDowngrade(msg)
} else if msg.Cmd == mtwmapi.MsgTypeStoreBind {
// 门店授权发生变化 17,失去授权
vendorStoreID := msg.FormData.Get("app_poi_code")
storeDetail, _ := dao.GetStoreDetailByVendorStoreID(dao.GetDB(), vendorStoreID, model.VendorIDMTWM, "")
_, err := netprinter.PrintStoreStatus(jxcontext.AdminCtx, storeDetail, model.VendorIDMTWM, -9)
response = mtwmapi.Err2CallbackResponse(err, "")
} else {
if orderID := GetOrderIDFromMsg(msg); orderID != "" {
jxutils.CallMsgHandler(func() {
switch msg.Cmd {
case mtwmapi.MsgTypeWaybillStatus:
response = CurPurchaseHandler.onWaybillMsg(msg)
default:
response = CurPurchaseHandler.onOrderMsg(msg)
}
}, jxutils.ComposeUniversalOrderID(orderID, model.VendorIDMTWM))
}
/*if msg.Cmd == mtwmapi.MsgTypeOrderRefund || msg.Cmd == mtwmapi.MsgTypeOrderPartialRefund {
utils.CallFuncAsync(func() {
OnFinancialMsg(msg)
})
} */
}
response = CurPurchaseHandler.onOrderMsg(orderStatus, orderId, msg)
}, jxutils.ComposeUniversalOrderID(orderId, model.VendorIDTaoVegetable))
}
return response
}
func GetOrderIDFromMsg(msg *mtwmapi.CallbackMsg) string {
return msg.FormData.Get(mtwmapi.KeyOrderID)
}
func GetVendorStoreIDFromMsg(msg *mtwmapi.CallbackMsg) string {
return msg.FormData.Get(mtwmapi.KeyAppPoiCode)
}
func GetVendorAppIdFromMsg(msg *mtwmapi.CallbackMsg) string {
return msg.FormData.Get(mtwmapi.KeyAppID)
}
func forwardOrderToGy(msg *mtwmapi.CallbackMsg, msgType string) {
func forwardOrderToGy(msg *mtwmapi.CallbackMsg, orderStatus string) {
cl := http.Client{}
callbackUrl := GetMsgCallBackUrl(msgType, msg.AppID)
request, err := http.NewRequest(http.MethodPost, "http://callback-jxgy.jxc4.com/mtwm/"+callbackUrl, strings.NewReader(msg.FormData.Encode()))
callbackUrl := GetMsgCallBackUrl(orderStatus, msg.AppID)
request, err := http.NewRequest(http.MethodPost, "http://callback-jxgy.jxc4.com/taoBaoVegetable/"+callbackUrl, strings.NewReader(msg.FormData.Encode()))
if err != nil {
return
}
@@ -78,40 +34,14 @@ func forwardOrderToGy(msg *mtwmapi.CallbackMsg, msgType string) {
func GetMsgCallBackUrl(msgType, appId string) string {
interfaceUrl := ""
switch msgType {
case mtwmapi.MsgTypeWaybillStatus:
interfaceUrl = "/waybillStatus"
case mtwmapi.MsgTypeNewOrder:
interfaceUrl = "/newOrder"
case mtwmapi.MsgTypeOrderAccepted:
interfaceUrl = "/orderAccepted"
case mtwmapi.MsgTypeOrderFinished:
interfaceUrl = "/orderFinished"
case mtwmapi.MsgTypeOrderFinancial:
interfaceUrl = "/orderFinancial"
case mtwmapi.MsgTypeOrderCanceled:
interfaceUrl = "/orderCanceled"
case mtwmapi.MsgTypeUserUrgeOrder:
interfaceUrl = "/userUrgeOrder"
case mtwmapi.MsgTypePrivateNumberDowngrade:
interfaceUrl = "/numberDowngrade"
case mtwmapi.MsgTypeOrderModified:
interfaceUrl = "/orderModified"
case mtwmapi.MsgTypeOrderRefund:
interfaceUrl = "/orderRefund"
case mtwmapi.MsgTypeOrderPartialRefund:
interfaceUrl = "/orderPartialRefund"
case mtwmapi.MsgTypeOrderFinishedPickup:
interfaceUrl = "/orderFinishedPickup"
case mtwmapi.MsgTypeStoreStatusChanged:
interfaceUrl = "/storeStatusChanged"
case mtwmapi.MsgTypeStoreAuditStatusChanged:
interfaceUrl = "/storeAuditStatusChanged"
case mtwmapi.MsgTypeSkuDelete:
interfaceUrl = "/skuDelete"
case mtwmapi.MsgTypeStoreBind:
interfaceUrl = "/storeBind"
case tao_vegetable.OrderStatusApplyAfs:
interfaceUrl = "/applyCancelOrder "
case tao_vegetable.OrderStatusCancelAfs:
interfaceUrl = "/userCancelRefund"
case tao_vegetable.OrderStatusOnSaleCancel:
interfaceUrl = "/cancelOnSaleRefundOrder"
default:
globals.SugarLogger.Errorf("美团超市[app_id :=%s ,callbackUrl := %s ]回调推送到果园错误,回调地址不正确", appId, msgType)
globals.SugarLogger.Errorf("淘宝[app_id :=%s ,callbackUrl := %s ]回调推送到果园错误,回调地址不正确", appId, msgType)
}
return interfaceUrl
}

View File

@@ -1,9 +1,11 @@
package mtwm
package tao_vegetable
import (
"git.rosy.net.cn/baseapi/platformapi/tao_vegetable"
"net/url"
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
domain591 "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability591/domain"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/model"
@@ -131,17 +133,16 @@ func (p *PurchaseHandler) AfsOrderDetail2Financial(orderData url.Values) (afsOrd
}
// 存储美团正向订单结账信息
func (p *PurchaseHandler) OnOrderDetail(result map[string]interface{}, operation string) (err error) {
func (p *PurchaseHandler) OnOrderDetail(result *domain591.AlibabaAelophyOrderGetOrderResponse, operation string) (err error) {
err = partner.CurOrderManager.SaveOrderFinancialInfo(p.OrderDetail2Financial(result), operation)
return err
}
func (p *PurchaseHandler) OrderDetail2Financial(result map[string]interface{}) (orderFinancial *model.OrderFinancial) {
func (p *PurchaseHandler) OrderDetail2Financial(result *domain591.AlibabaAelophyOrderGetOrderResponse) (orderFinancial *model.OrderFinancial) {
orderFinancial = &model.OrderFinancial{
VendorID: model.VendorIDMTWM,
VendorOrderID: utils.Int64ToStr(utils.MustInterface2Int64(result["order_id"])),
VendorID: model.VendorIDTaoVegetable,
VendorOrderID: utils.Int64ToStr(*result.BizOrderId),
}
// orderFinancial.DeliveryConfirmTime = utils.Str2TimeWithDefault(utils.Interface2String(result["order_completed_time"]), utils.DefaultTimeValue)
order, err := partner.CurOrderManager.LoadOrder(orderFinancial.VendorOrderID, orderFinancial.VendorID)
jxStoreID := 0
if err == nil {
@@ -154,92 +155,58 @@ func (p *PurchaseHandler) OrderDetail2Financial(result map[string]interface{}) (
} else {
err = nil
}
if result["package_bag_money"] != nil {
orderFinancial.BoxMoney = utils.MustInterface2Int64(result["package_bag_money"])
}
detail := result["detail"]
if detail != nil {
var data []map[string]interface{}
utils.UnmarshalUseNumber([]byte(utils.Interface2String(detail)), &data)
for _, x := range data {
// 订单
for _, x := range *result.SubOrderResponseList {
orderSkuFinancial := &model.OrderSkuFinancial{
VendorID: orderFinancial.VendorID,
VendorOrderID: orderFinancial.VendorOrderID,
// OrderFinancialID: orderFinancial.VendorOrderID,
// ConfirmTime: utils.Str2TimeWithDefault(utils.Interface2String(result["ctime"]), utils.DefaultTimeValue),
VendorStoreID: result["app_poi_code"].(string),
VendorStoreID: *result.StoreId,
StoreID: 0,
JxStoreID: jxStoreID,
VendorSkuID: utils.Interface2String(x["sku_id"]),
SkuID: int(utils.Str2Int64WithDefault(utils.Interface2String(x["sku_id"]), 0)),
Name: utils.Interface2String(x["food_name"]),
SalePrice: jxutils.StandardPrice2Int(utils.MustInterface2Float64(x["price"])),
Count: int(utils.MustInterface2Int64(x["quantity"])),
SkuBoxMoney: jxutils.StandardPrice2Int(utils.MustInterface2Float64(x["box_price"])) * jxutils.StandardPrice2Int(utils.MustInterface2Float64(x["box_num"])),
VendorSkuID: utils.Int64ToStr(utils.MustInterface2Int64(x.SkuCode)),
SkuID: utils.Str2Int(*x.SkuCode),
Name: utils.Interface2String(x.SkuName),
SalePrice: *x.Price,
Count: utils.Str2Int(*x.BuySaleQuantity),
SkuBoxMoney: 0,
IsAfsOrder: 0,
}
orderFinancial.Skus = append(orderFinancial.Skus, orderSkuFinancial)
orderFinancial.SalePriceMoney += orderSkuFinancial.SalePrice * int64(orderSkuFinancial.Count)
orderFinancial.SkuBoxMoney += orderSkuFinancial.SkuBoxMoney
}
} else {
globals.SugarLogger.Warnf("mtwm OrderDetail2Financial, orderID:%s have no detail", orderFinancial.VendorOrderID)
}
extras := result["extras"]
if extras != nil {
var data []map[string]interface{}
utils.UnmarshalUseNumber([]byte(utils.Interface2String(extras)), &data)
for _, x := range data {
if x["rider_fee"] == nil {
// 活动
for _, v := range *x.Activitys {
activity := &model.OrderDiscountFinancial{
VendorID: orderFinancial.VendorID,
VendorOrderID: orderFinancial.VendorOrderID,
// ActivityName: utils.Interface2String(x["remark"]),
// ActivityMoney: jxutils.StandardPrice2Int(utils.MustInterface2Float64(x["reduce_fee"])),
// VendorActivityID: utils.Int64ToStr(utils.MustInterface2Int64(x["act_detail_id"])),
}
if x["act_detail_id"] != nil { // 容错处理
activity.VendorActivityID = utils.Int64ToStr(utils.MustInterface2Int64(x["act_detail_id"]))
if v.ChannelActivityId != nil {
activity.VendorActivityID = *v.ChannelActivityId
activity.Type = tao_vegetable.ActivityTypeChannel
}
if v.BizActivityId != nil {
activity.VendorActivityID = *v.BizActivityId
activity.Type = tao_vegetable.ActivityTypeBiz
}
if v.MerchantActivityId != nil {
activity.VendorActivityID = *v.MerchantActivityId
activity.Type = tao_vegetable.ActivityTypeMerchant
}
orderFinancial.Discounts = append(orderFinancial.Discounts, activity)
}
// 通过活动Id去取京西活动补贴
// orderFinancial.JxSubsidyMoney +=
}
}
}
poiReceiveDetail := result["poi_receive_detail"]
if poiReceiveDetail != nil {
var data map[string]interface{}
utils.UnmarshalUseNumber([]byte(utils.Interface2String(poiReceiveDetail)), &data)
orderFinancial.ReceivableFreight = utils.MustInterface2Int64(data["logisticsFee"])
orderFinancial.FreightMoney = utils.MustInterface2Int64(data["logisticsFee"])
orderFinancial.ActualPayMoney = utils.MustInterface2Int64(data["onlinePayment"])
orderFinancial.PmMoney = utils.MustInterface2Int64(data["foodShareFeeChargeByPoi"])
orderFinancial.ShopMoney = utils.MustInterface2Int64(data["wmPoiReceiveCent"])
for _, x := range data["actOrderChargeByMt"].([]interface{}) {
orderFinancial.TotalDiscountMoney += utils.MustInterface2Int64(x.(map[string]interface{})["moneyCent"])
orderFinancial.PmSubsidyMoney += utils.MustInterface2Int64(x.(map[string]interface{})["moneyCent"])
}
for _, x := range data["actOrderChargeByPoi"].([]interface{}) {
orderFinancial.TotalDiscountMoney += utils.MustInterface2Int64(x.(map[string]interface{})["moneyCent"])
}
} else {
globals.SugarLogger.Warnf("mtwm OrderDetail2Financial, orderID:%s have no poi_receive_detail", orderFinancial.VendorOrderID)
}
if utils.MustInterface2Int64(result["is_third_shipping"]) == SelfDeliveryCarrierNo { // is_third_shipping int 是否是第三方配送平台配送,0表否1表是
orderFinancial.SelfDeliveryDiscountMoney = orderFinancial.ReceivableFreight
orderFinancial.ReceivableFreight = *result.PostFee
orderFinancial.FreightMoney = 0
orderFinancial.ActualPayMoney = *result.PayFee
orderFinancial.PmMoney = 0 // 平台费
orderFinancial.ShopMoney = 0 // 应结金额
orderFinancial.TotalDiscountMoney = *result.DiscountFee // 订单优惠总金额
orderFinancial.PmSubsidyMoney = *result.PostDiscountPlatformFee // 平台活动补贴(订单主体活动补贴+订单单条sku补贴1+
orderFinancial.SelfDeliveryDiscountMoney = *result.SkuDiscountPlatformFee // 平台承担运费补贴(商家自送)+
orderFinancial.DistanceFreightMoney = 0
// 通过本地数据库去取是否转美团/达达,并计算运费
// wayBill, err := partner.CurOrderManager.LoadWaybill(orderFinancial.VendorOrderID, orderFinancial.VendorID)
// if err == nil {
// orderFinancial.JxFreightMoney = wayBill.DesiredFee
// }
}
// // 美团订单单独处理部分,美团正向订单接口推送时总结算金额没有计算公益捐款一分钱,是否在这里直接提前扣除?
// // 3/18之后的订单一直都不显示公益捐款金额而且结算现在结算到了3/18之后的订单没有的已经不计算了先注释
// // 2019-04-03 10.52 询问赵mf, 此计划是必须参加的,而且是长期的,每单固定扣除一分钱
orderFinancial.DonationMoney = PublicWelfareDonation
// 不应该对第三方结账金额做更改,就算有异常,也要保留异常,知道问题出在哪里
// orderFinancial.ShopMoney -= PublicWelfareDonation
return orderFinancial
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,13 +1,12 @@
package mtwm
package tao_vegetable
import (
"errors"
"fmt"
"git.rosy.net.cn/jx-callback/globals/api"
"net/url"
"strings"
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
"git.rosy.net.cn/baseapi/platformapi/tao_vegetable"
request3156 "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability3156/request"
domain591 "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability591/domain"
request591 "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability591/request"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
@@ -15,57 +14,39 @@ import (
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/business/partner"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"
)
var (
// AfsVendorStatus2StatusMap = map[int]int{
// mtwmapi.ResTypePending: model.AfsOrderStatusWait4Approve,
// mtwmapi.ResTypeMerchantRefused: model.AfsOrderStatusFailed,
// mtwmapi.ResTypeMerchantAgreed: model.AfsOrderStatusFinished,
// mtwmapi.ResTypeCSRefused: model.AfsOrderStatusFailed,
// mtwmapi.ResTypeCSAgreed: model.AfsOrderStatusFinished,
// mtwmapi.ResTypeTimeoutAutoAgreed: model.AfsOrderStatusFinished,
// mtwmapi.ResTypeAutoAgreed: model.AfsOrderStatusFinished,
// mtwmapi.ResTypeUserCancelApply: model.AfsOrderStatusFailed,
// mtwmapi.ResTypeUserCancelComplain: model.AfsOrderStatusFailed,
// }
AfsVendorStatus2StatusMap = map[string]int{
mtwmapi.NotifyTypeApply: model.AfsOrderStatusWait4Approve,
mtwmapi.NotifyTypePartyApply: model.AfsOrderStatusWait4Approve,
mtwmapi.NotifyTypeSuccess: model.AfsOrderStatusFinished,
mtwmapi.NotifyTypeReject: model.AfsOrderStatusFailed,
mtwmapi.NotifyTypeCancelRefund: model.AfsOrderStatusFailed,
mtwmapi.NotifyTypeCancelRefundComplaint: model.AfsOrderStatusFailed,
tao_vegetable.OrderStatusApplyAfs: model.AfsOrderStatusWait4Approve,
tao_vegetable.OrderStatusCancelAfs: model.AfsOrderStatusCancelAfs,
tao_vegetable.OrderStatusRefundSuccess: model.AfsOrderStatusFinished,
}
)
func (c *PurchaseHandler) isAfsMsg(msg *mtwmapi.CallbackMsg) bool {
if msg.Cmd == mtwmapi.MsgTypeOrderRefund || msg.Cmd == mtwmapi.MsgTypeOrderPartialRefund {
// refundData := msg.Data.(*mtwmapi.CallbackRefundInfo)
orderID := utils.Str2Int64(GetOrderIDFromMsg(msg))
order, _ := partner.CurOrderManager.LoadOrder(utils.Int64ToStr(orderID), model.VendorIDMTWM)
func (c *PurchaseHandler) isAfsMsg(orderStatus string, orderId string) bool {
if orderStatus == tao_vegetable.OrderStatusApplyAfs || orderStatus == tao_vegetable.OrderStatusCancelAfs || orderStatus == tao_vegetable.OrderStatusRefundSuccess {
order, _ := partner.CurOrderManager.LoadOrder(orderId, model.VendorIDTaoVegetable)
if order != nil {
//status, err := getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), order.VendorStoreID).OrderViewStatus(orderID)
//if err == nil {
//return utils.Int2Str(status) == mtwmapi.OrderStatusFinished
return true //TODO 有的美团订单售前退款,也当做售后处理试试
//}
return true
}
}
return false
}
func (c *PurchaseHandler) OnAfsOrderMsg(msg *mtwmapi.CallbackMsg) (retVal *mtwmapi.CallbackResponse) {
func (c *PurchaseHandler) OnAfsOrderMsg(orderId, status string, msg interface{}) (retVal *tao_vegetable.CallBackResult) {
jxutils.CallMsgHandlerAsync(func() {
retVal = c.onAfsOrderMsg(msg)
}, jxutils.ComposeUniversalOrderID(GetOrderIDFromMsg(msg), model.VendorIDMTWM))
retVal = c.onAfsOrderMsg(status, msg)
}, jxutils.ComposeUniversalOrderID(orderId, model.VendorIDTaoVegetable))
return retVal
}
// todo 对于退款与部分退款order.go与这个文件中对于状态的处理不一致
func (c *PurchaseHandler) onAfsOrderMsg(msg *mtwmapi.CallbackMsg) (retVal *mtwmapi.CallbackResponse) {
// todo 淘宝暂无部分退款,只有整单退款
func (c *PurchaseHandler) onAfsOrderMsg(status string, msg interface{}) (retVal *tao_vegetable.CallBackResult) {
var err error
orderStatus := c.callbackAfsMsg2Status(msg)
var db = dao.GetDB()
orderStatus := c.callbackAfsMsg2Status(status, msg)
needCallNew := orderStatus.Status == model.AfsOrderStatusWait4Approve || orderStatus.Status == model.AfsOrderStatusNew
if !needCallNew {
_, err := partner.CurOrderManager.LoadAfsOrder(orderStatus.VendorOrderID, orderStatus.VendorID)
@@ -73,74 +54,81 @@ func (c *PurchaseHandler) onAfsOrderMsg(msg *mtwmapi.CallbackMsg) (retVal *mtwma
if dao.IsNoRowsError(err) {
needCallNew = true
} else {
return mtwmapi.Err2CallbackResponse(err, "")
return tao_vegetable.CallBackResultInfo(err)
}
}
}
if needCallNew {
refundData := msg.(*tao_vegetable.UserApplyRefundCallBack)
var afsOrder *model.AfsOrder
refundData := msg.Data.(*mtwmapi.CallbackRefundInfo)
if msg.Cmd == mtwmapi.MsgTypeOrderPartialRefund {
afsOrder = &model.AfsOrder{
VendorID: model.VendorIDMTWM,
VendorID: model.VendorIDTaoVegetable,
AfsOrderID: orderStatus.VendorOrderID,
VendorOrderID: orderStatus.RefVendorOrderID,
VendorStoreID: "",
VendorStoreID: refundData.StoreId,
StoreID: 0,
AfsCreatedAt: utils.Timestamp2Time(refundData.Timestamp),
VendorAppealType: "",
AppealType: model.AfsAppealTypeRefund,
VendorReasonType: "",
ReasonType: model.AfsReasonNotOthers,
ReasonDesc: utils.LimitUTF8StringLen(refundData.Reason, 1024),
ReasonImgList: utils.LimitUTF8StringLen(strings.Join(refundData.PictureList, ","), 1024),
RefundType: model.AfsTypePartRefund,
AfsCreatedAt: orderStatus.StatusTime,
VendorOrgCode: msg.AppID,
// FreightUserMoney: afsInfo.OrderFreightMoney,
// AfsFreightMoney: afsInfo.AfsFreight,
// BoxMoney: afsInfo.PackagingMoney,
// TongchengFreightMoney: afsInfo.TongchengFreightMoney,
// SkuBoxMoney: afsInfo.MealBoxMoney,
VendorAppealType: status, // 原始售后方式
AppealType: model.AfsAppealTypeUserCancel, // 淘宝这个接口下发的只有用户取消
VendorReasonType: refundData.RefundReason,
ReasonType: 0,
ReasonDesc: refundData.RefundReason,
ReasonImgList: utils.LimitUTF8StringLen(refundData.RefundPictures, 1024),
RefundType: model.AfsTypeFullRefund,
VendorOrgCode: refundData.MerchantCode,
}
for _, sku := range refundData.FoodList {
refundIds := make([]int64, 0, 0)
bizOrderIds := make([]int64, len(refundData.SubRefundOrders))
for _, v := range refundData.SubRefundOrders {
bizOrderIds = append(bizOrderIds, utils.Str2Int64(v.OutSubOrderId))
}
refundIds = append(refundIds, utils.Str2Int64(refundData.BizRefundId))
taoAfsOrderDetail, err := getAPI(refundData.MerchantCode, 0, "").QueryAfsOrderDetail(&request591.AlibabaWdkOrderRefundGetRequest{
BizOrderIds: &bizOrderIds,
RefundIds: &refundIds,
OrderFrom: nil,
ShopId: nil,
StoreId: &refundData.StoreId,
})
if err != nil {
return tao_vegetable.CallBackResultInfo(err)
}
taoAfsOrder := *taoAfsOrderDetail.Orders
afsOrder.FreightUserMoney = *taoAfsOrder[0].RefundPostFee
afsOrder.AfsFreightMoney = *taoAfsOrder[0].RefundPostFee // 暂时未发现退货取件费用
afsOrder.BoxMoney = 0 // 餐盒费
afsOrder.TongchengFreightMoney = 0 // 同城配送费
afsOrder.SkuBoxMoney = 0 // 商品包装费
afsOrder.VendorStatus = orderStatus.VendorStatus // 退货状态
// 订单商品详细信息
skuList, err := getAPI(refundData.MerchantCode, 0, "").QueryOrderDetail(&request591.AlibabaAelophyOrderGetRequest{OrderGetRequest: &domain591.AlibabaAelophyOrderGetOrderGetRequest{
StoreId: utils.String2Pointer(refundData.StoreId),
BizOrderId: utils.Int64ToPointer(utils.Str2Int64(refundData.OutOrderId)),
}})
if err != nil {
return tao_vegetable.CallBackResultInfo(err)
}
for _, sku := range *skuList.SubOrderResponseList {
orderSku := &model.OrderSkuFinancial{
// VendorID: model.VendorIDMTWM,
AfsOrderID: afsOrder.AfsOrderID,
// VendorOrderID: afsOrder.VendorOrderID,
// VendorStoreID: afsOrder.VendorStoreID,
// StoreID: afsOrder.StoreID,
IsAfsOrder: 1,
Count: sku.Count,
// ConfirmTime: afsOrder.AfsCreateAt,
VendorSkuID: sku.SkuID,
SkuID: int(utils.Str2Int64WithDefault(sku.SkuID, 0)),
Name: sku.FoodName,
UserMoney: jxutils.StandardPrice2Int(sku.RefundPrice)*int64(sku.Count) + jxutils.StandardPrice2Int(sku.BoxPrice)*int64(sku.BoxNum),
}
if orderSku.VendorSkuID == "" || orderSku.VendorSkuID == "0" {
orderSku.VendorSkuID = sku.AppFoodCode
Count: utils.Str2Int(*sku.BuySaleQuantity),
VendorSkuID: *sku.SkuCode,
SkuID: utils.Str2Int(*sku.SkuCode),
Name: *sku.SkuName,
UserMoney: *sku.OriginalFee - *sku.DiscountFee,
PmSkuSubsidyMoney: *sku.DiscountPlatformFee, // 平台补贴商品
}
afsOrder.PmSkuSubsidyMoney += orderSku.PmSkuSubsidyMoney
afsOrder.SkuUserMoney += orderSku.UserMoney
afsOrder.Skus = append(afsOrder.Skus, orderSku)
}
//afsOrder.PmSubsidyMoney += afsOrder.RefundMoney - afsOrder.SkuUserMoney
} else {
if afsOrder = c.createAfsOrder(msg.FormData); afsOrder != nil {
// if orderFinancial, err2 := partner.CurOrderManager.LoadOrderFinancial(orderStatus.RefVendorOrderID, model.VendorIDMTWM); err2 == nil {
// afsOrder = c.OrderFinancialDetail2Refund(orderFinancial, msg.FormData)
afsOrder.AfsOrderID = orderStatus.VendorOrderID
afsOrder.RefundType = model.AfsTypeFullRefund
afsOrder.AppealType = model.AfsAppealTypeRefund
afsOrder.VendorReasonType = ""
afsOrder.ReasonType = model.AfsReasonNotOthers
afsOrder.ReasonDesc = utils.LimitUTF8StringLen(refundData.Reason, 1024)
afsOrder.ReasonImgList = utils.LimitUTF8StringLen(strings.Join(refundData.PictureList, ","), 1024)
}
}
if afsOrder != nil {
//直接就来一个新的售后单,并且还是售后完成的
if orderStatus.Status == model.AfsOrderStatusFinished {
@@ -149,70 +137,132 @@ func (c *PurchaseHandler) onAfsOrderMsg(msg *mtwmapi.CallbackMsg) (retVal *mtwma
err = partner.CurOrderManager.OnAfsOrderNew(afsOrder, orderStatus)
}
} else {
// 用户取消售后
if status == tao_vegetable.OrderStatusCancelAfs {
// 删除售后单
afsOrder, err := dao.GetAfsOrders(db, model.VendorIDTaoVegetable, orderStatus.RefVendorOrderID, orderStatus.VendorOrderID)
if err != nil || afsOrder == nil {
globals.SugarLogger.Debugf("用户取消售后单,获取之前生成的售后单失败")
return tao_vegetable.CallBackResultInfo(err)
}
if err = utils.CallFuncLogError(func() error {
_, err = dao.DeleteEntity(db, afsOrder[0], "VendorOrderID", "VendorID")
return err
}, "SaveAfsOrder delete AfsOrder, afsOrderID:%s", afsOrder[0].AfsOrderID); err != nil {
return tao_vegetable.CallBackResultInfo(err)
}
// 删除售后商品
if err = utils.CallFuncLogError(func() error {
_, err = dao.DeleteEntity(db, &model.OrderSkuFinancial{
VendorOrderID: afsOrder[0].VendorOrderID,
VendorID: afsOrder[0].VendorID,
IsAfsOrder: 1,
}, "VendorOrderID", "VendorID", "IsAfsOrder")
return err
}, "SaveAfsOrder delete OrderSkuFinancial, afsOrderID:%s", afsOrder[0].AfsOrderID); err != nil {
return tao_vegetable.CallBackResultInfo(err)
}
// 订单更改为待配送
goodsOrder, _ := partner.CurOrderManager.LoadOrder(orderStatus.RefVendorOrderID, model.VendorIDTaoVegetable)
goodsOrder.Status = model.OrderStatusFinishedPickup
goodsOrder.VendorStatus = status
dao.UpdateEntity(db, goodsOrder, "Status", "VendorStatus")
}
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")
if err == nil && status == tao_vegetable.OrderStatusRefundSuccess {
goodsOrder, _ := partner.CurOrderManager.LoadOrder(orderStatus.RefVendorOrderID, orderStatus.VendorID)
goodsOrder.Status = model.OrderStatusCanceled
goodsOrder.VendorStatus = orderStatus.VendorStatus
dao.UpdateEntity(db, goodsOrder, "Status", "VendorStatus")
}
}
}
return mtwmapi.Err2CallbackResponse(err, "")
return tao_vegetable.CallBackResultInfo(err)
}
func (p *PurchaseHandler) createAfsOrder(orderData url.Values) (afsOrder *model.AfsOrder) {
afsOrder, err := partner.CurOrderManager.CreateAfsOrderFromOrder(orderData.Get("order_id"), model.VendorIDMTWM)
if err == nil {
afsOrder.AfsOrderID = orderData.Get("refund_id")
afsOrder.AfsCreatedAt = utils.Timestamp2Time(utils.Str2Int64(orderData.Get("timestamp")))
if afsOrder.AfsOrderID == "" {
afsOrder.AfsOrderID = afsOrder.VendorOrderID
}
} else {
afsOrder = nil
}
return afsOrder
}
func (c *PurchaseHandler) callbackAfsMsg2Status(msg *mtwmapi.CallbackMsg) (orderStatus *model.OrderStatus) {
refundData := msg.Data.(*mtwmapi.CallbackRefundInfo)
func (c *PurchaseHandler) callbackAfsMsg2Status(status string, msg interface{}) (orderStatus *model.OrderStatus) {
orderStatus = &model.OrderStatus{
VendorID: model.VendorIDMTWM,
VendorID: model.VendorIDTaoVegetable,
OrderType: model.OrderTypeAfsOrder,
RefVendorOrderID: utils.Int64ToStr(refundData.OrderID),
RefVendorID: model.VendorIDMTWM,
VendorStatus: fmt.Sprintf("%s:%d", refundData.NotifyType, refundData.ResType),
Status: c.GetAfsStatusFromVendorStatus(refundData.ResType, refundData.NotifyType),
StatusTime: utils.Timestamp2Time(refundData.Timestamp),
Remark: refundData.Reason,
RefVendorID: model.VendorIDTaoVegetable,
}
if refundData.RefundID > 0 {
orderStatus.VendorOrderID = utils.Int64ToStr(refundData.RefundID)
} else {
switch status {
case tao_vegetable.OrderStatusApplyAfs:
refundData := msg.(*tao_vegetable.UserApplyRefundCallBack)
orderStatus.RefVendorOrderID = refundData.OutOrderId
orderStatus.VendorStatus = fmt.Sprintf("%s:%s", tao_vegetable.OrderStatusApplyAfs, "用户申请取消")
orderStatus.Status = c.GetAfsStatusFromVendorStatus(tao_vegetable.OrderStatusApplyAfs)
orderStatus.StatusTime = utils.Str2Time(refundData.Timestamp)
orderStatus.Remark = refundData.Remarks
orderStatus.VendorOrderID = refundData.BizRefundId
case tao_vegetable.OrderStatusCancelAfs:
refundData := msg.(*tao_vegetable.UserCancelRefundApply)
orderStatus.RefVendorOrderID = refundData.OutOrderId
orderStatus.VendorStatus = fmt.Sprintf("%s:%s", tao_vegetable.OrderStatusCancelAfs, "用户取消售后申请")
orderStatus.Status = c.GetAfsStatusFromVendorStatus(tao_vegetable.OrderStatusCancelAfs)
orderStatus.StatusTime = utils.Str2Time(refundData.Timestamp)
orderStatus.VendorOrderID = refundData.BizRefundId
//case tao_vegetable.OrderStatusOnSaleCancel:
// refundData := msg.(*tao_vegetable.OnSaleCancel)
// orderStatus.RefVendorOrderID = utils.Int64ToStr(refundData.BizOrderId)
// orderStatus.VendorStatus = fmt.Sprintf("%s:%s", tao_vegetable.OrderStatusOnSaleCancel, "用户售中取消")
// orderStatus.Status = c.GetAfsStatusFromVendorStatus(tao_vegetable.OrderStatusOnSaleCancel)
// orderStatus.StatusTime = utils.Str2Time(refundData.Timestamp)
// orderStatus.VendorOrderID = refundData.IdempotentId
case tao_vegetable.OrderStatusRefundSuccess:
refundData := msg.(*tao_vegetable.RefundOrderFinish)
orderStatus.RefVendorOrderID = refundData.OutMainRefundId
orderStatus.VendorStatus = fmt.Sprintf("%s:%s", tao_vegetable.OrderStatusRefundSuccess, "用户售后退款成功")
orderStatus.Status = c.GetAfsStatusFromVendorStatus(tao_vegetable.OrderStatusRefundSuccess)
orderStatus.StatusTime = utils.Str2Time(refundData.Timestamp)
orderStatus.VendorOrderID = refundData.BizSubRefundId
}
if orderStatus.VendorOrderID == "" {
orderStatus.VendorOrderID = orderStatus.RefVendorOrderID
}
return orderStatus
}
func (c *PurchaseHandler) GetAfsStatusFromVendorStatus(resType int, notifyType string) int {
func (c *PurchaseHandler) GetAfsStatusFromVendorStatus(notifyType string) int {
status := AfsVendorStatus2StatusMap[notifyType]
if status == model.AfsOrderStatusWait4Approve && resType != mtwmapi.ResTypePending {
status = model.AfsOrderStatusNew
}
//if status == model.AfsOrderStatusWait4Approve || status == model.AfsOrderStatusOnSaleAfs {
// status = model.AfsOrderStatusNew
//}
return status
}
// 审核售后单申请
func (c *PurchaseHandler) AgreeOrRefuseRefund(ctx *jxcontext.Context, order *model.AfsOrder, approveType int, reason string) (err error) {
if globals.EnableMtwmStoreWrite {
if approveType == partner.AfsApproveTypeRefused {
err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromAfsOrder(order), order.VendorStoreID).OrderRefundReject(utils.Str2Int64(order.VendorOrderID), reason)
param := &request3156.AlibabaTclsAelophyRefundAgreeRequest{
StoreId: utils.String2Pointer(order.VendorStoreID),
OutOrderId: utils.String2Pointer(order.VendorOrderID),
OrderFrom: utils.Int64ToPointer(utils.Str2Int64(tao_vegetable.TaoVegetableChannelCode)),
}
param.AuditMemo = utils.String2Pointer(fmt.Sprintf("商户同意退款"))
if reason != "" {
param.AuditMemo = utils.String2Pointer(*param.AuditMemo + fmt.Sprintf(",%s", reason))
}
err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromAfsOrder(order), order.VendorStoreID).AgreeUserCancel(param)
} else if approveType == partner.AfsApproveTypeRefusedToRefundMoney {
return errors.New("此平台暂时不支持")
} else {
err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromAfsOrder(order), order.VendorStoreID).OrderRefundAgree(utils.Str2Int64(order.VendorOrderID), reason)
param := &request3156.AlibabaTclsAelophyRefundDisagreeRequest{
RefundId: utils.String2Pointer(order.AfsOrderID),
RejectReason: utils.String2Pointer(reason),
OrderFrom: utils.Int64ToPointer(utils.Str2Int64(tao_vegetable.TaoVegetableChannelCode)),
}
err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromAfsOrder(order), order.VendorStoreID).DisAgreeUserCancel(param)
if err != nil {
order.Status = model.AfsOrderStatusFailed
order.VendorStatus = "老板拒绝"
order.ReasonDesc += reason + ","
dao.UpdateEntity(dao.GetDB(), order, "Status", "ReasonDesc", "VendorStatus")
}
}
return err

View File

@@ -1,19 +1,12 @@
package mtwm
package tao_vegetable
import (
"strings"
"time"
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
"git.rosy.net.cn/jx-callback/business/partner"
"git.rosy.net.cn/baseapi/utils"
"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"
)
const (
@@ -42,71 +35,73 @@ func formalizeTagList(mtwmTagList string) (outTagList string) {
return outTagList
}
// 获取评价信息
func (c *PurchaseHandler) RefreshComment(fromTime, toTime time.Time) (err error) {
//storeMapList, err2 := dao.GetStoresMapList(dao.GetDB(), []int{model.VendorIDMTWM}, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, "", "", "")
////storeMapList, err2 := dao.GetStoresMapList(dao.GetDB(), []int{model.VendorIDMTWM}, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, "", "", "")
////if err = err2; err != nil {
//// return err
////}
//endDateStr := time.Now().Add(-24 * time.Hour).Format("20060102")
//startDateStr := time.Now().Add(-RefreshCommentTime).Format("20060102")
//storeIDs, _ := dao.GetOrderStoreIDs(dao.GetDB(), fromTime, toTime, model.VendorIDMTWM)
//task := tasksch.NewParallelTask("mtwm RefreshComment", nil, jxcontext.AdminCtx,
// func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
// storeID := batchItemList[0].(int)
// storeDetail, _ := dao.GetStoreDetail(dao.GetDB(), storeID, model.VendorIDMTWM, "")
// commentList, err2 := getAPI(storeDetail.VendorOrgCode, storeID, storeDetail.VendorStoreID).CommentQuery(storeDetail.VendorStoreID, startDateStr, endDateStr, 0, 0, mtwmapi.CommentReplyStatusNotReplied)
// var orderCommentList []*model.OrderComment
// if err = err2; err != nil {
// return nil, err
// }
// for _, mtwmComment := range commentList {
// createdTime, err := utils.TryStr2Time(mtwmComment.CommentTime)
// if err == nil {
// orderComment := &model.OrderComment{
// VendorOrderID: utils.Int64ToStr(mtwmComment.CommentID), // 美团评价不能得到订单号以评价ID代替
// VendorID: model.VendorIDMTWM,
// UserCommentID: utils.Int64ToStr(mtwmComment.CommentID),
// VendorStoreID: storeDetail.VendorStoreID,
// TagList: formalizeTagList(mtwmComment.CommentLables),
// Score: int8(mtwmComment.FoodCommentScore),
// ModifyDuration: BAD_COMMENTS_MAX_MODIFY_TIME,
// OriginalMsg: string(utils.MustMarshal(mtwmComment)),
// IsReplied: int8(mtwmComment.ReplyStatus),
// StoreID: storeDetail.ID,
// }
// if orderComment.IsReplied == 0 {
// orderComment.Content = mtwmComment.CommentContent
// orderComment.CommentCreatedAt = createdTime
// } else {
// orderComment.Content = mtwmComment.AddComment
// if updatedTime, err := utils.TryStr2Time(mtwmComment.CommentTime); err == nil {
// orderComment.CommentCreatedAt = updatedTime
// }
// }
// orderCommentList = append(orderCommentList, orderComment)
// }
// }
// return orderCommentList, nil
// }, storeIDs)
//task.Run()
//resultList, err2 := task.GetResult(0)
//if err = err2; err != nil {
// return err
//}
endDateStr := time.Now().Add(-24 * time.Hour).Format("20060102")
startDateStr := time.Now().Add(-RefreshCommentTime).Format("20060102")
storeIDs, _ := dao.GetOrderStoreIDs(dao.GetDB(), fromTime, toTime, model.VendorIDMTWM)
task := tasksch.NewParallelTask("mtwm RefreshComment", nil, jxcontext.AdminCtx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
storeID := batchItemList[0].(int)
storeDetail, _ := dao.GetStoreDetail(dao.GetDB(), storeID, model.VendorIDMTWM, "")
commentList, err2 := getAPI(storeDetail.VendorOrgCode, storeID, storeDetail.VendorStoreID).CommentQuery(storeDetail.VendorStoreID, startDateStr, endDateStr, 0, 0, mtwmapi.CommentReplyStatusNotReplied)
var orderCommentList []*model.OrderComment
if err = err2; err != nil {
return nil, err
}
for _, mtwmComment := range commentList {
createdTime, err := utils.TryStr2Time(mtwmComment.CommentTime)
if err == nil {
orderComment := &model.OrderComment{
VendorOrderID: utils.Int64ToStr(mtwmComment.CommentID), // 美团评价不能得到订单号以评价ID代替
VendorID: model.VendorIDMTWM,
UserCommentID: utils.Int64ToStr(mtwmComment.CommentID),
VendorStoreID: storeDetail.VendorStoreID,
TagList: formalizeTagList(mtwmComment.CommentLables),
Score: int8(mtwmComment.FoodCommentScore),
ModifyDuration: BAD_COMMENTS_MAX_MODIFY_TIME,
OriginalMsg: string(utils.MustMarshal(mtwmComment)),
IsReplied: int8(mtwmComment.ReplyStatus),
StoreID: storeDetail.ID,
}
if orderComment.IsReplied == 0 {
orderComment.Content = mtwmComment.CommentContent
orderComment.CommentCreatedAt = createdTime
} else {
orderComment.Content = mtwmComment.AddComment
if updatedTime, err := utils.TryStr2Time(mtwmComment.CommentTime); err == nil {
orderComment.CommentCreatedAt = updatedTime
}
}
orderCommentList = append(orderCommentList, orderComment)
}
}
return orderCommentList, nil
}, storeIDs)
task.Run()
resultList, err2 := task.GetResult(0)
if err = err2; err != nil {
return err
}
var orderCommentList []*model.OrderComment
for _, result := range resultList {
orderComment := result.(*model.OrderComment)
orderCommentList = append(orderCommentList, orderComment)
}
if len(orderCommentList) > 0 {
err = partner.CurOrderManager.OnOrderComments(orderCommentList)
}
//var orderCommentList []*model.OrderComment
//for _, result := range resultList {
// orderComment := result.(*model.OrderComment)
// orderCommentList = append(orderCommentList, orderComment)
//}
//if len(orderCommentList) > 0 {
// err = partner.CurOrderManager.OnOrderComments(orderCommentList)
//}
return err
}
// ReplyOrderComment 评价回复
func (c *PurchaseHandler) ReplyOrderComment(ctx *jxcontext.Context, vendorOrgCode string, orderComment *model.OrderComment, replyComment string) (err error) {
if globals.EnableMtwmStoreWrite {
err = getAPI(vendorOrgCode, orderComment.StoreID, orderComment.VendorStoreID).CommentAddReply(orderComment.VendorStoreID, utils.Str2Int64(orderComment.UserCommentID), replyComment)
}
//if globals.EnableMtwmStoreWrite {
// err = getAPI(vendorOrgCode, orderComment.StoreID, orderComment.VendorStoreID).CommentAddReply(orderComment.VendorStoreID, utils.Str2Int64(orderComment.UserCommentID), replyComment)
//}
return err
}

View File

@@ -1,4 +1,4 @@
package mtwm
package tao_vegetable
import (
"testing"

View File

@@ -0,0 +1,199 @@
package tao_vegetable
import (
"fmt"
"git.rosy.net.cn/baseapi/platformapi/tao_vegetable"
domain3156 "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability3156/domain"
request3156 "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability3156/request"
domain591 "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability591/domain"
request591 "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability591/request"
"git.rosy.net.cn/baseapi/utils"
"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"
"time"
)
// orderStatusChangeNotice 拣货和通知发货状态变化接口
func orderStatusChangeNotice(order *model.GoodsOrder, orderStatus string) (*request591.AlibabaAelophyOrderWorkCallbackRequest, error) {
param := &request591.AlibabaAelophyOrderWorkCallbackRequest{}
param.WorkCallbackRequest = &domain591.AlibabaAelophyOrderWorkCallbackWorkCallbackRequest{
StoreId: utils.String2Pointer(order.VendorStoreID),
BizOrderId: utils.Int64ToPointer(utils.Str2Int64(order.VendorOrderID)),
Status: utils.String2Pointer(orderStatus),
}
workCallbackSubOrderInfoList := make([]domain591.AlibabaAelophyOrderWorkCallbackWorkCallbackSubOrderInfo, 0, 0)
skuList, err := dao.GetSimpleOrderSkus(dao.GetDB(), order.VendorOrderID, nil)
if err != nil {
return nil, err
}
if len(skuList) == model.NO {
return nil, fmt.Errorf("订单商品列表为零,请管理员检查")
}
for _, v := range skuList {
workCallbackSubOrderInfo := domain591.AlibabaAelophyOrderWorkCallbackWorkCallbackSubOrderInfo{
BizSubOrderId: nil,
SkuCode: utils.String2Pointer(v.VendorSkuID),
PickSaleQuantity: utils.String2Pointer(utils.Int2Str(v.Count)),
PickStockQuantity: utils.String2Pointer(fmt.Sprintf("%.2f", float64(v.Weight)/float64(1000)*float64(v.Count))),
}
workCallbackSubOrderInfoList = append(workCallbackSubOrderInfoList, workCallbackSubOrderInfo)
}
// 出库
param.WorkCallbackRequest.WorkCallbackSubOrderInfoList = &workCallbackSubOrderInfoList
return param, nil
}
// OrderStatusChangeDelivery 订单开始配送和送达通知接口
func OrderStatusChangeDelivery(order *model.GoodsOrder, orderStatus string) *request591.AlibabaAelophyOrderWorkCallbackRequest {
param := &request591.AlibabaAelophyOrderWorkCallbackRequest{}
param.WorkCallbackRequest = &domain591.AlibabaAelophyOrderWorkCallbackWorkCallbackRequest{
StoreId: utils.String2Pointer(order.VendorStoreID),
BizOrderId: utils.Int64ToPointer(utils.Str2Int64(order.VendorOrderID)),
Status: utils.String2Pointer(orderStatus),
}
bill, _ := partner.CurOrderManager.LoadWaybill(order.VendorWaybillID, order.WaybillVendorID)
param.WorkCallbackRequest.DelivererName = utils.String2Pointer(bill.CourierName)
param.WorkCallbackRequest.DelivererPhone = utils.String2Pointer(bill.CourierMobile)
if param.WorkCallbackRequest.DelivererName == nil || param.WorkCallbackRequest.DelivererPhone == nil {
param.WorkCallbackRequest.DelivererName = utils.String2Pointer("暂无")
param.WorkCallbackRequest.DelivererPhone = utils.String2Pointer("暂无")
}
return param
}
// getOrderCancelList 获取订单可取消的订单列表
func getOrderCancelList(api *tao_vegetable.API, order *model.GoodsOrder) (*domain3156.AlibabaTclsAelophyRefundCsapplyrenderRefundCsApplyRenderResponseDto, error) {
param := &request3156.AlibabaTclsAelophyRefundCsapplyrenderRequest{
RefundCsApplyRenderDTO: &domain3156.AlibabaTclsAelophyRefundCsapplyrenderRefundCsApplyRenderDto{
OutOrderId: utils.String2Pointer(order.VendorOrderID),
StoreId: utils.String2Pointer(order.VendorStoreID),
OutSubOrderIds: nil,
OrderFrom: utils.Int64ToPointer(utils.Str2Int64(tao_vegetable.TaoVegetableChannelCode)),
},
}
return api.PartialRefundReason(param)
}
func getTimeFromTimestamp(timeStamp int64) time.Time {
if timeStamp < 1538103149 { // 立即达订单给的是1而不是空01538103149不是特殊值只是一个任意之前的时间这样写可以处理
return utils.DefaultTimeValue
}
return utils.Timestamp2Time(timeStamp)
}
//
//func (p *PurchaseHandler) GetOrderConsigneeNumber(ctx *jxcontext.Context, storeID int, vendorStoreID string) (numberList []*partner.OrderPhoneNumberInfo, err error) {
// offset := 0
// for {
// store, _ := dao.GetStoreDetail(dao.GetDB(), storeID, model.VendorIDMTWM, "")
// result, err2 := getAPI(store.VendorOrgCode, storeID, "").OrderBatchPullPhoneNumber(vendorStoreID, offset, mtwmapi.MaxBatchPullPhoneNumberLimit)
// if err = err2; err == nil {
// for _, v := range result {
// v2 := &partner.OrderPhoneNumberInfo{
// VendorOrderID: utils.Int64ToStr(v.OrderID),
// PhoneNumber: v.RealPhoneNumber,
// }
// if v2.PhoneNumber == "" {
// v2.PhoneNumber = v.RealOrderPhoneNumber
// }
// numberList = append(numberList, v2)
// }
// if len(result) <= mtwmapi.MaxBatchPullPhoneNumberLimit {
// break
// }
// offset += mtwmapi.MaxBatchPullPhoneNumberLimit
// } else {
// break
// }
// }
// return numberList, err
//}
//
//func (p *PurchaseHandler) GetOrderCourierNumber(ctx *jxcontext.Context, storeID int, vendorStoreID string) (numberList []*partner.OrderPhoneNumberInfo, err error) {
// offset := 0
// for {
// store, _ := dao.GetStoreDetail(dao.GetDB(), storeID, model.VendorIDMTWM, "")
// result, err2 := getAPI(store.VendorOrgCode, 0, "").OrderGetRiderInfoPhoneNumber(vendorStoreID, offset, mtwmapi.MaxBatchPullPhoneNumberLimit)
// if err = err2; err == nil {
// for _, v := range result {
// numberList = append(numberList, &partner.OrderPhoneNumberInfo{
// VendorOrderID: utils.Int64ToStr(v.OrderID),
// PhoneNumber: v.RiderRealPhoneNumber,
// })
// }
// if len(result) <= mtwmapi.MaxBatchPullPhoneNumberLimit {
// break
// }
// offset += mtwmapi.MaxBatchPullPhoneNumberLimit
// } else {
// break
// }
// }
// return numberList, err
//}
//
//func (p *PurchaseHandler) onNumberDowngrade(msg *mtwmapi.CallbackMsg) (response *mtwmapi.CallbackResponse) {
// userNumberMap := make(map[string]*partner.OrderPhoneNumberInfo)
// courierNumberMap := make(map[string]*partner.OrderPhoneNumberInfo)
// orderMap := make(map[string]int)
// ctx := jxcontext.AdminCtx
// task := tasksch.NewParallelTask("美团外卖平台处理隐私号降级通知", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(true), ctx,
// func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
// step := batchItemList[0].(int)
// switch step {
// case 0:
// userNumberList, err2 := p.GetOrderConsigneeNumber(ctx, 0, "")
// if err = err2; err == nil {
// for _, v := range userNumberList {
// userNumberMap[v.VendorOrderID] = v
// orderMap[v.VendorOrderID] = 1
// }
// }
// case 1:
// courierNumberList, err2 := p.GetOrderCourierNumber(ctx, 0, "")
// if err = err2; err == nil {
// for _, v := range courierNumberList {
// courierNumberMap[v.VendorOrderID] = v
// orderMap[v.VendorOrderID] = 1
// }
// }
// case 2:
// orderList := jxutils.StringMap2List(orderMap)
// if len(orderList) > 0 {
// updateTask := tasksch.NewParallelTask("美团外卖平台处理隐私号降级通知/处理订单", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(true), ctx,
// func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
// vendorOrderID := batchItemList[0].(string)
// db := dao.GetDB()
// if userNumberMap[vendorOrderID] != nil {
// _, err = dao.UpdateEntityByKV(db, &model.GoodsOrder{}, map[string]interface{}{
// "ConsigneeMobile": userNumberMap[vendorOrderID].PhoneNumber,
// "ConsigneeMobile2": userNumberMap[vendorOrderID].PhoneNumber,
// }, map[string]interface{}{
// model.FieldVendorOrderID: vendorOrderID,
// model.FieldVendorID: model.VendorIDMTWM,
// })
// }
// if courierNumberMap[vendorOrderID] != nil {
// _, err = dao.UpdateEntityByKV(db, &model.Waybill{}, map[string]interface{}{
// "CourierMobile": courierNumberMap[vendorOrderID].PhoneNumber,
// }, map[string]interface{}{
// "VendorWaybillID": vendorOrderID,
// "WaybillVendorID": model.VendorIDMTWM,
// })
// }
// return retVal, err
// }, orderList)
// tasksch.HandleTask(updateTask, task, true).Run()
// _, err = updateTask.GetResult(0)
// }
// }
// return retVal, err
// }, []int{0, 1, 2})
// tasksch.HandleTask(task, nil, true).Run()
// return response
//}

View File

@@ -1,4 +1,4 @@
package mtwm
package tao_vegetable
import (
"encoding/json"
@@ -6,8 +6,6 @@ import (
"fmt"
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/baseapi/utils/errlist"
"git.rosy.net.cn/jx-callback/business/jxcallback/scheduler"
"git.rosy.net.cn/jx-callback/business/jxstore/event"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
@@ -15,8 +13,6 @@ import (
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/business/partner"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"
"math"
"regexp"
"strings"
@@ -62,58 +58,58 @@ type tEbaiStoreInfo struct {
}
func (p *PurchaseHandler) ReadStore(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID, vendorStoreName string) (retVal *dao.StoreDetail, err error) {
result, err := getAPIWithoutToken(vendorOrgCode).PoiGet(vendorStoreID)
if err == nil {
retVal = &dao.StoreDetail{
Store: model.Store{
Address: result.Address,
Tel1: result.Phone,
},
}
retVal.OriginalName = result.Name
_, retVal.Name = jxutils.SplitStoreName(retVal.OriginalName, partner.StoreNameSeparator, globals.StoreNameMtwm)
retVal.SetOpTime(openTimeMtwm2JX(result.ShippingTime))
retVal.Status = bizStatusMtwm2JX(result.OpenLevel, result.IsOnline)
tel2 := result.StandbyTel
if tel2 != "" && tel2 != retVal.Tel1 {
retVal.Tel2 = tel2
}
retVal.Lng = int(result.Longitude)
retVal.Lat = int(result.Latitude)
lng := jxutils.IntCoordinate2Standard(retVal.Lng)
lat := jxutils.IntCoordinate2Standard(retVal.Lat)
db := dao.GetDB()
retVal.DistrictCode = api.AutonaviAPI.GetCoordinateDistrictCode(lng, lat)
city, err := dao.GetPlaceByCode(db, result.CityID)
retVal.CityName = city.Name
retVal.CityCode = result.CityID
poiCode := result.AppPoiCode
retVal.VendorStoreID = vendorStoreID
retVal.ID = int(utils.Str2Int64WithDefault(poiCode, 0))
retVal.DeliveryRangeType = model.DeliveryRangeTypePolygon
var deliveryRangeInfo []map[string]interface{}
deliveryRangeInfo, err = getAPIWithoutToken(vendorOrgCode).ShippingFetch(poiCode)
if err != nil {
deliveryRangeInfo, err = getAPIWithoutToken(vendorOrgCode).ShippingList(poiCode)
}
if err == nil {
if len(deliveryRangeInfo) > 0 {
retVal.DeliveryRange = rangeMtwm2JX(deliveryRangeInfo[0]["area"].(string))
logisticsCode := utils.Interface2String(deliveryRangeInfo[0]["logistics_code"])
if logisticsCode == "" || logisticsCode == mtwmapi.PeiSongTypeSelf {
retVal.DeliveryType = scheduler.StoreDeliveryTypeByStore
} else {
retVal.DeliveryType = scheduler.StoreDeliveryTypeByPlatform
}
}
}
return retVal, nil
}
//result, err := getAPIWithoutToken(vendorOrgCode).PoiGet(vendorStoreID)
//if err == nil {
// retVal = &dao.StoreDetail{
// Store: model.Store{
// Address: result.Address,
// Tel1: result.Phone,
// },
// }
// retVal.OriginalName = result.Name
// _, retVal.Name = jxutils.SplitStoreName(retVal.OriginalName, partner.StoreNameSeparator, globals.StoreNameMtwm)
//
// retVal.SetOpTime(openTimeMtwm2JX(result.ShippingTime))
// retVal.Status = bizStatusMtwm2JX(result.OpenLevel, result.IsOnline)
//
// tel2 := result.StandbyTel
// if tel2 != "" && tel2 != retVal.Tel1 {
// retVal.Tel2 = tel2
// }
//
// retVal.Lng = int(result.Longitude)
// retVal.Lat = int(result.Latitude)
//
// lng := jxutils.IntCoordinate2Standard(retVal.Lng)
// lat := jxutils.IntCoordinate2Standard(retVal.Lat)
// db := dao.GetDB()
// retVal.DistrictCode = api.AutonaviAPI.GetCoordinateDistrictCode(lng, lat)
// city, err := dao.GetPlaceByCode(db, result.CityID)
// retVal.CityName = city.Name
// retVal.CityCode = result.CityID
//
// poiCode := result.AppPoiCode
// retVal.VendorStoreID = vendorStoreID
// retVal.ID = int(utils.Str2Int64WithDefault(poiCode, 0))
// retVal.DeliveryRangeType = model.DeliveryRangeTypePolygon
// var deliveryRangeInfo []map[string]interface{}
// deliveryRangeInfo, err = getAPIWithoutToken(vendorOrgCode).ShippingFetch(poiCode)
// if err != nil {
// deliveryRangeInfo, err = getAPIWithoutToken(vendorOrgCode).ShippingList(poiCode)
// }
// if err == nil {
// if len(deliveryRangeInfo) > 0 {
// retVal.DeliveryRange = rangeMtwm2JX(deliveryRangeInfo[0]["area"].(string))
// logisticsCode := utils.Interface2String(deliveryRangeInfo[0]["logistics_code"])
// if logisticsCode == "" || logisticsCode == mtwmapi.PeiSongTypeSelf {
// retVal.DeliveryType = scheduler.StoreDeliveryTypeByStore
// } else {
// retVal.DeliveryType = scheduler.StoreDeliveryTypeByPlatform
// }
// }
// }
// return retVal, nil
//}
return nil, err
}
func (p *PurchaseHandler) CreateStore(db *dao.DaoDB, storeID int, userName string) (err error) {
@@ -121,103 +117,103 @@ func (p *PurchaseHandler) CreateStore(db *dao.DaoDB, storeID int, userName strin
}
func (p *PurchaseHandler) CreateStore2(db *dao.DaoDB, storeID int, userName string, params map[string]interface{}, storeDetail *dao.StoreDetail) (vendorStoreID string, err error) {
vendorOrgCode := params["vendorOrgCode"].(string)
if vendorOrgCode == "" {
return "", fmt.Errorf("平台账号必传!")
}
cityName := storeDetail.CityName
if strings.Contains(cityName, "市") {
cityName = strings.Replace(cityName, "市", "", strings.LastIndex(cityName, "市"))
}
shippingTime := ""
if storeDetail.OpenTime1 != 0 && storeDetail.CloseTime1 != 0 {
shippingTime += jxutils.JxOperationTime2StrTime(storeDetail.OpenTime1)
shippingTime += "-"
shippingTime += jxutils.JxOperationTime2StrTime(storeDetail.CloseTime1)
if storeDetail.OpenTime2 != 0 && storeDetail.CloseTime2 != 0 {
shippingTime += ","
shippingTime += jxutils.JxOperationTime2StrTime(storeDetail.OpenTime2)
shippingTime += "-"
shippingTime += jxutils.JxOperationTime2StrTime(storeDetail.CloseTime2)
}
}
vendorInfoMap := storeVendorOrgCodeMap[vendorOrgCode]
poiSettleSaveParam := &mtwmapi.PoiSettleSaveParam{
Type: 1, //创建
ApplyInfos: []*mtwmapi.ApplyInfo{
&mtwmapi.ApplyInfo{
AppPoiCode: utils.Int2Str(storeDetail.ID),
SettlementID: utils.Str2Int(vendorInfoMap["settlementID"]), //结算ID暂时还没得
MultiPoiBasicInfo: &mtwmapi.MultiPoiBasicInfo{
Name: params["vendorStoreName"].(string),
City: cityName,
Address: storeDetail.Address,
Longitude: utils.Float64ToStr(jxutils.IntCoordinate2Standard(storeDetail.Lng)),
Latitude: utils.Float64ToStr(jxutils.IntCoordinate2Standard(storeDetail.Lat)),
FirstTag: vendorInfoMap["firstTag"],
CallCenter: storeDetail.Tel1,
ContactPhone: storeDetail.Tel1,
ContactName: storeDetail.IDName,
EcommerceAccountPhone: "18048531223", //石总的手机
ShippingTime: shippingTime,
},
MultiPoiShippingInfo: &mtwmapi.MultiPoiShippingInfo{
ShippingType: 5, //1:商家自配 5:美团专送,101:美团快送
//美团专送不需要输下面这俩
// MinPrice: params["minPrice"].(float64),
// ShippingFee: params["shippingFee"].(float64),
},
//资质
},
},
}
switchCertType := func(certType string) (licensePic, licenseSocialCreditCode, licenseNumber, licenseLegalPerson, licenseAddress, licenseValidStartDate, licenseValidity string, isLongTime int) {
switch certType {
case "1":
licensePic = storeDetail.StoreFrontPic
case "2":
licensePic = storeDetail.StoreInPic
case "5":
licensePic = storeDetail.Licence
licenseSocialCreditCode = storeDetail.LicenceCode
licenseNumber = storeDetail.LicenceCode
licenseLegalPerson = storeDetail.LicenceOwnerName
licenseAddress = storeDetail.LicenceAddress
licenseValidStartDate = storeDetail.LicenceValid
if storeDetail.LicenceExpire == "" {
isLongTime = 1
} else {
licenseValidity = storeDetail.LicenceExpire
}
case "6":
licensePic = storeDetail.Licence2Image
licenseSocialCreditCode = storeDetail.Licence2Code
licenseNumber = storeDetail.Licence2Code
licenseLegalPerson = storeDetail.LicenceOwnerName
licenseAddress = storeDetail.LicenceAddress
licenseValidStartDate = storeDetail.Licence2Valid
if storeDetail.Licence2Expire == "" {
isLongTime = 1
} else {
licenseValidity = storeDetail.Licence2Expire
}
}
return licensePic, licenseSocialCreditCode, licenseNumber, licenseLegalPerson, licenseAddress, licenseValidStartDate, licenseValidity, isLongTime
}
var certs []*mtwmapi.MultiPoiCertInfo
for _, v := range strings.Split(vendorInfoMap["poiCert"], ",") {
cert := &mtwmapi.MultiPoiCertInfo{
Type: utils.Str2Int(v),
LicenseName: poiCertMap[v],
}
cert.LicensePic, cert.LicenseSocialCreditCode, cert.LicenseNumber, cert.LicenseLegalPerson, cert.LicenseAddress, cert.LicenseValidStartDate, cert.LicenseValidity, cert.IsLongTime = switchCertType(v)
certs = append(certs, cert)
}
poiSettleSaveParam.ApplyInfos[0].MultiPoiCertInfos = certs
mtapi := getAPIWithoutToken(vendorOrgCode)
if vendorStoreID, err = mtapi.PoiSettleSave(poiSettleSaveParam); err == nil {
err = mtapi.PoiSettleAuditSubmit([]string{vendorStoreID})
}
//vendorOrgCode := params["vendorOrgCode"].(string)
//if vendorOrgCode == "" {
// return "", fmt.Errorf("平台账号必传!")
//}
//cityName := storeDetail.CityName
//if strings.Contains(cityName, "市") {
// cityName = strings.Replace(cityName, "市", "", strings.LastIndex(cityName, "市"))
//}
//shippingTime := ""
//if storeDetail.OpenTime1 != 0 && storeDetail.CloseTime1 != 0 {
// shippingTime += jxutils.JxOperationTime2StrTime(storeDetail.OpenTime1)
// shippingTime += "-"
// shippingTime += jxutils.JxOperationTime2StrTime(storeDetail.CloseTime1)
// if storeDetail.OpenTime2 != 0 && storeDetail.CloseTime2 != 0 {
// shippingTime += ","
// shippingTime += jxutils.JxOperationTime2StrTime(storeDetail.OpenTime2)
// shippingTime += "-"
// shippingTime += jxutils.JxOperationTime2StrTime(storeDetail.CloseTime2)
// }
//}
//vendorInfoMap := storeVendorOrgCodeMap[vendorOrgCode]
//poiSettleSaveParam := &mtwmapi.PoiSettleSaveParam{
// Type: 1, //创建
// ApplyInfos: []*mtwmapi.ApplyInfo{
// &mtwmapi.ApplyInfo{
// AppPoiCode: utils.Int2Str(storeDetail.ID),
// SettlementID: utils.Str2Int(vendorInfoMap["settlementID"]), //结算ID暂时还没得
// MultiPoiBasicInfo: &mtwmapi.MultiPoiBasicInfo{
// Name: params["vendorStoreName"].(string),
// City: cityName,
// Address: storeDetail.Address,
// Longitude: utils.Float64ToStr(jxutils.IntCoordinate2Standard(storeDetail.Lng)),
// Latitude: utils.Float64ToStr(jxutils.IntCoordinate2Standard(storeDetail.Lat)),
// FirstTag: vendorInfoMap["firstTag"],
// CallCenter: storeDetail.Tel1,
// ContactPhone: storeDetail.Tel1,
// ContactName: storeDetail.IDName,
// EcommerceAccountPhone: "18048531223", //石总的手机
// ShippingTime: shippingTime,
// },
// MultiPoiShippingInfo: &mtwmapi.MultiPoiShippingInfo{
// ShippingType: 5, //1:商家自配 5:美团专送,101:美团快送
// //美团专送不需要输下面这俩
// // MinPrice: params["minPrice"].(float64),
// // ShippingFee: params["shippingFee"].(float64),
// },
// //资质
// },
// },
//}
//switchCertType := func(certType string) (licensePic, licenseSocialCreditCode, licenseNumber, licenseLegalPerson, licenseAddress, licenseValidStartDate, licenseValidity string, isLongTime int) {
// switch certType {
// case "1":
// licensePic = storeDetail.StoreFrontPic
// case "2":
// licensePic = storeDetail.StoreInPic
// case "5":
// licensePic = storeDetail.Licence
// licenseSocialCreditCode = storeDetail.LicenceCode
// licenseNumber = storeDetail.LicenceCode
// licenseLegalPerson = storeDetail.LicenceOwnerName
// licenseAddress = storeDetail.LicenceAddress
// licenseValidStartDate = storeDetail.LicenceValid
// if storeDetail.LicenceExpire == "" {
// isLongTime = 1
// } else {
// licenseValidity = storeDetail.LicenceExpire
// }
// case "6":
// licensePic = storeDetail.Licence2Image
// licenseSocialCreditCode = storeDetail.Licence2Code
// licenseNumber = storeDetail.Licence2Code
// licenseLegalPerson = storeDetail.LicenceOwnerName
// licenseAddress = storeDetail.LicenceAddress
// licenseValidStartDate = storeDetail.Licence2Valid
// if storeDetail.Licence2Expire == "" {
// isLongTime = 1
// } else {
// licenseValidity = storeDetail.Licence2Expire
// }
// }
// return licensePic, licenseSocialCreditCode, licenseNumber, licenseLegalPerson, licenseAddress, licenseValidStartDate, licenseValidity, isLongTime
//}
//var certs []*mtwmapi.MultiPoiCertInfo
//for _, v := range strings.Split(vendorInfoMap["poiCert"], ",") {
// cert := &mtwmapi.MultiPoiCertInfo{
// Type: utils.Str2Int(v),
// LicenseName: poiCertMap[v],
// }
// cert.LicensePic, cert.LicenseSocialCreditCode, cert.LicenseNumber, cert.LicenseLegalPerson, cert.LicenseAddress, cert.LicenseValidStartDate, cert.LicenseValidity, cert.IsLongTime = switchCertType(v)
// certs = append(certs, cert)
//}
//poiSettleSaveParam.ApplyInfos[0].MultiPoiCertInfos = certs
//mtapi := getAPIWithoutToken(vendorOrgCode)
//if vendorStoreID, err = mtapi.PoiSettleSave(poiSettleSaveParam); err == nil {
// err = mtapi.PoiSettleAuditSubmit([]string{vendorStoreID})
//}
return vendorStoreID, err
}
@@ -226,75 +222,76 @@ func (p *PurchaseHandler) DeleteStore(db *dao.DaoDB, storeID int, userName strin
}
func (p *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName string) (err error) {
var name string
if db == nil {
db = dao.GetDB()
}
mtapi := getAPI(getStoreVendorOrgCode(storeID), storeID, "")
//获取本地store信息
storeDetail, err := dao.GetStoreDetail(db, storeID, model.VendorIDMTWM, "")
if err != nil {
return err
}
errList := errlist.New()
//获取平台store信息
remoteStoreInfo, err := mtapi.PoiGet(storeDetail.VendorStoreID)
if err != nil {
return err
}
mergedStoreStatus := jxutils.MergeStoreStatus(storeDetail.Status, storeDetail.VendorStatus)
name = remoteStoreInfo.Name
if storeDetail.SyncStatus&(model.SyncFlagNewMask|model.SyncFlagStoreName) != 0 {
if storeDetail.VendorStoreName != "" {
name = storeDetail.VendorStoreName
}
// else {
// name = jxutils.ComposeStoreName(storeDetail.Store.Name, model.VendorIDMTWM)
//var name string
//if db == nil {
// db = dao.GetDB()
//}
//mtapi := getAPI(getStoreVendorOrgCode(storeID), storeID, "")
////获取本地store信息
//storeDetail, err := dao.GetStoreDetail(db, storeID, model.VendorIDMTWM, "")
//if err != nil {
// return err
//}
//errList := errlist.New()
////获取平台store信息
//remoteStoreInfo, err := mtapi.PoiGet(storeDetail.VendorStoreID)
//if err != nil {
// return err
//}
//mergedStoreStatus := jxutils.MergeStoreStatus(storeDetail.Status, storeDetail.VendorStatus)
//name = remoteStoreInfo.Name
//if storeDetail.SyncStatus&(model.SyncFlagNewMask|model.SyncFlagStoreName) != 0 {
// if storeDetail.VendorStoreName != "" {
// name = storeDetail.VendorStoreName
// }
}
store := fmt.Sprintf("门店id:%d,门店名称:%s,第三方门店状态:%d,本地修改前门店状态%d,本地门店修改后状态:%d,第三方平台Id(美团):%s", storeID, remoteStoreInfo.Name, remoteStoreInfo.IsOnline, storeDetail.Status, mergedStoreStatus, storeDetail.VendorOrgCode)
event.AddOperateEvent(jxcontext.AdminCtx, jxcontext.AdminCtx.GetTrackInfo(), store, "", "", 10, "UpdateStore")
// openLevel, isOnline := bizStatusJX2Mtwm(mergedStoreStatus)
//TODO 美团暂时不用那个电话
phone := storeDetail.Tel1
// if storeDetail.MarketManPhone != "" {
// phone = storeDetail.MarketManPhone
// } else {
// phone = model.VendorStoreTel
// }
params := map[string]interface{}{
"name": name, //jxutils.ComposeStoreName(storeDetail.Store.Name, model.VendorIDMTWM),
"address": storeDetail.Address, // 美团好像地址也不能改的?
"longitude": jxutils.IntCoordinate2Standard(int(remoteStoreInfo.Longitude)),
"latitude": jxutils.IntCoordinate2Standard(int(remoteStoreInfo.Latitude)),
"phone": phone,
"shipping_fee": remoteStoreInfo.ShippingFee,
"shipping_time": remoteStoreInfo.ShippingTime,
"open_level": remoteStoreInfo.OpenLevel,
"is_online": remoteStoreInfo.IsOnline,
"third_tag_name": remoteStoreInfo.ThirdTagName,
"promotion_info": storeDetail.PromoteInfo,
}
if globals.EnableMtwmStoreWrite {
errList.AddErr(mtapi.PoiSave(storeDetail.VendorStoreID, params))
}
// PoiSave有时会报错商家已接入美团配送不可修改门店配送相关信息这里放弃信息修改
// if err != nil {
// if utils.IsErrMatch(err, utils.Int2Str(mtwmapi.ErrCodeCanNotModifyStoreDeliveryInfo), nil) {
// if storeDetail.SyncStatus&(model.SyncFlagNewMask|model.SyncFlagStoreStatus) != 0 {
// err = p.UpdateStoreStatus(jxcontext.AdminCtx, storeDetail.VendorOrgCode, storeID, storeDetail.VendorStoreID, mergedStoreStatus)
// } else {
// err = nil
// }
// }
// errList.AddErr(err)
// }
if storeDetail.SyncStatus&(model.SyncFlagNewMask|model.SyncFlagStoreStatus) != 0 {
errList.AddErr(p.UpdateStoreStatus(jxcontext.AdminCtx, storeDetail.VendorOrgCode, storeID, storeDetail.VendorStoreID, mergedStoreStatus))
}
errList.AddErr(p.UpdateStoreOpTime(jxcontext.AdminCtx, storeDetail.VendorOrgCode, storeID, storeDetail.VendorStoreID, storeDetail.GetOpTimeList()))
// errList.AddErr(p.UpdateStoreBoxFee(jxcontext.AdminCtx, storeDetail.VendorOrgCode, storeID, storeDetail.VendorStoreID))
return errList.GetErrListAsOne()
// // else {
// // name = jxutils.ComposeStoreName(storeDetail.Store.Name, model.VendorIDMTWM)
// // }
//}
//store := fmt.Sprintf("门店id:%d,门店名称:%s,第三方门店状态:%d,本地修改前门店状态%d,本地门店修改后状态:%d,第三方平台Id(美团):%s", storeID, remoteStoreInfo.Name, remoteStoreInfo.IsOnline, storeDetail.Status, mergedStoreStatus, storeDetail.VendorOrgCode)
//event.AddOperateEvent(jxcontext.AdminCtx, jxcontext.AdminCtx.GetTrackInfo(), store, "", "", 10, "UpdateStore")
//// openLevel, isOnline := bizStatusJX2Mtwm(mergedStoreStatus)
////TODO 美团暂时不用那个电话
//phone := storeDetail.Tel1
//// if storeDetail.MarketManPhone != "" {
//// phone = storeDetail.MarketManPhone
//// } else {
//// phone = model.VendorStoreTel
//// }
//params := map[string]interface{}{
// "name": name, //jxutils.ComposeStoreName(storeDetail.Store.Name, model.VendorIDMTWM),
// "address": storeDetail.Address, // 美团好像地址也不能改的?
// "longitude": jxutils.IntCoordinate2Standard(int(remoteStoreInfo.Longitude)),
// "latitude": jxutils.IntCoordinate2Standard(int(remoteStoreInfo.Latitude)),
// "phone": phone,
// "shipping_fee": remoteStoreInfo.ShippingFee,
// "shipping_time": remoteStoreInfo.ShippingTime,
// "open_level": remoteStoreInfo.OpenLevel,
// "is_online": remoteStoreInfo.IsOnline,
// "third_tag_name": remoteStoreInfo.ThirdTagName,
// "promotion_info": storeDetail.PromoteInfo,
//}
//if globals.EnableMtwmStoreWrite {
// errList.AddErr(mtapi.PoiSave(storeDetail.VendorStoreID, params))
//}
//// PoiSave有时会报错商家已接入美团配送不可修改门店配送相关信息这里放弃信息修改
//// if err != nil {
//// if utils.IsErrMatch(err, utils.Int2Str(mtwmapi.ErrCodeCanNotModifyStoreDeliveryInfo), nil) {
//// if storeDetail.SyncStatus&(model.SyncFlagNewMask|model.SyncFlagStoreStatus) != 0 {
//// err = p.UpdateStoreStatus(jxcontext.AdminCtx, storeDetail.VendorOrgCode, storeID, storeDetail.VendorStoreID, mergedStoreStatus)
//// } else {
//// err = nil
//// }
//// }
//// errList.AddErr(err)
//// }
//if storeDetail.SyncStatus&(model.SyncFlagNewMask|model.SyncFlagStoreStatus) != 0 {
// errList.AddErr(p.UpdateStoreStatus(jxcontext.AdminCtx, storeDetail.VendorOrgCode, storeID, storeDetail.VendorStoreID, mergedStoreStatus))
//}
//errList.AddErr(p.UpdateStoreOpTime(jxcontext.AdminCtx, storeDetail.VendorOrgCode, storeID, storeDetail.VendorStoreID, storeDetail.GetOpTimeList()))
//// errList.AddErr(p.UpdateStoreBoxFee(jxcontext.AdminCtx, storeDetail.VendorOrgCode, storeID, storeDetail.VendorStoreID))
//return errList.GetErrListAsOne()
return nil
}
func (p *PurchaseHandler) RefreshAllStoresID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool) (hint string, err error) {
@@ -357,10 +354,10 @@ func (p *PurchaseHandler) onStoreStatusChanged(msg *mtwmapi.CallbackMsg) (respon
}
func (p *PurchaseHandler) GetStoreStatus(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string) (storeStatus int, err error) {
result, err := getAPI(vendorOrgCode, storeID, "").PoiGet(vendorStoreID)
if err == nil {
return bizStatusMtwm2JX(result.OpenLevel, result.IsOnline), nil
}
//result, err := getAPI(vendorOrgCode, storeID, "").PoiGet(vendorStoreID)
//if err == nil {
// return bizStatusMtwm2JX(result.OpenLevel, result.IsOnline), nil
//}
return 0, err
}
@@ -369,30 +366,30 @@ func (p *PurchaseHandler) EnableAutoAcceptOrder(ctx *jxcontext.Context, vendorOr
}
func (c *PurchaseHandler) UpdateStoreStatus(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, status int) (err error) {
openLevel, isOnline := bizStatusJX2Mtwm(status)
if globals.EnableMtwmStoreWrite {
if isOnline != mtwmapi.PoiStatusOnline {
err = getAPI(vendorOrgCode, storeID, vendorStoreID).PoiOffline(vendorStoreID)
} else {
if err = getAPI(vendorOrgCode, storeID, vendorStoreID).PoiOnline(vendorStoreID); err == nil { // 这个函数成功返回也并不表示上线成功。。。
remoteStoreInfo, err2 := getAPI(vendorOrgCode, storeID, vendorStoreID).PoiGet(vendorStoreID)
if err = err2; err != nil {
return err
}
if remoteStoreInfo.IsOnline == mtwmapi.PoiStatusOnline {
if openLevel == mtwmapi.PoiOpenLevelHaveRest {
err = getAPI(vendorOrgCode, storeID, vendorStoreID).PoiClose(vendorStoreID)
} else {
err = getAPI(vendorOrgCode, storeID, vendorStoreID).PoiOpen(vendorStoreID)
}
} else {
err = errors.New("门店还未上线,不能修改营业状态")
}
store := fmt.Sprintf("美团外卖回调门店改变回调(营业状态/审核状态):门店id:%s,美团门店状态:%d.[121营业,120休息,18上线,19下线],本地修改后状态[%d]", vendorStoreID, remoteStoreInfo.OpenLevel, openLevel)
event.AddOperateEvent(ctx, ctx.GetTrackInfo(), store, "", "", 10, "UpdateStore")
}
}
}
//openLevel, isOnline := bizStatusJX2Mtwm(status)
//if globals.EnableMtwmStoreWrite {
// if isOnline != mtwmapi.PoiStatusOnline {
// err = getAPI(vendorOrgCode, storeID, vendorStoreID).PoiOffline(vendorStoreID)
// } else {
// if err = getAPI(vendorOrgCode, storeID, vendorStoreID).PoiOnline(vendorStoreID); err == nil { // 这个函数成功返回也并不表示上线成功。。。
// remoteStoreInfo, err2 := getAPI(vendorOrgCode, storeID, vendorStoreID).PoiGet(vendorStoreID)
// if err = err2; err != nil {
// return err
// }
// if remoteStoreInfo.IsOnline == mtwmapi.PoiStatusOnline {
// if openLevel == mtwmapi.PoiOpenLevelHaveRest {
// err = getAPI(vendorOrgCode, storeID, vendorStoreID).PoiClose(vendorStoreID)
// } else {
// err = getAPI(vendorOrgCode, storeID, vendorStoreID).PoiOpen(vendorStoreID)
// }
// } else {
// err = errors.New("门店还未上线,不能修改营业状态")
// }
// store := fmt.Sprintf("美团外卖回调门店改变回调(营业状态/审核状态):门店id:%s,美团门店状态:%d.[121营业,120休息,18上线,19下线],本地修改后状态[%d]", vendorStoreID, remoteStoreInfo.OpenLevel, openLevel)
// event.AddOperateEvent(ctx, ctx.GetTrackInfo(), store, "", "", 10, "UpdateStore")
// }
// }
//}
return err
}
@@ -440,24 +437,24 @@ func constrainOpTimeList(opTimeList, validOpTimeList []int16) (newOpTimeList []i
}
func (c *PurchaseHandler) UpdateStoreOpTime(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, opTimeList []int16) (err error) {
shippingTime := openTimeJX2Mtwm(opTimeList)
if globals.EnableMtwmStoreWrite {
err = getAPI(vendorOrgCode, storeID, vendorStoreID).PoiShipTimeUpdate(vendorStoreID, shippingTime)
if err != nil {
shippingTime = ""
if validOpTimeList := getOpTimeListFromErr(err); len(validOpTimeList) > 0 {
shippingTime = openTimeJX2Mtwm(constrainOpTimeList(opTimeList, validOpTimeList))
}
if shippingTime != "" {
err = getAPI(vendorOrgCode, storeID, vendorStoreID).PoiShipTimeUpdate(vendorStoreID, shippingTime)
}
}
}
//shippingTime := openTimeJX2Mtwm(opTimeList)
//if globals.EnableMtwmStoreWrite {
// err = getAPI(vendorOrgCode, storeID, vendorStoreID).PoiShipTimeUpdate(vendorStoreID, shippingTime)
// if err != nil {
// shippingTime = ""
// if validOpTimeList := getOpTimeListFromErr(err); len(validOpTimeList) > 0 {
// shippingTime = openTimeJX2Mtwm(constrainOpTimeList(opTimeList, validOpTimeList))
// }
// if shippingTime != "" {
// err = getAPI(vendorOrgCode, storeID, vendorStoreID).PoiShipTimeUpdate(vendorStoreID, shippingTime)
// }
// }
//}
return err
}
func (c *PurchaseHandler) GetAllStoresVendorID(ctx *jxcontext.Context, vendorOrgCode string) (vendorStoreIDs []string, err error) {
vendorStoreIDs, err = getAPIWithoutToken(vendorOrgCode).PoiGetIDs()
//vendorStoreIDs, err = getAPIWithoutToken(vendorOrgCode).PoiGetIDs()
return vendorStoreIDs, err
}
@@ -466,20 +463,20 @@ func (c *PurchaseHandler) UpdateStoreCustomID(ctx *jxcontext.Context, vendorOrgC
}
func (c *PurchaseHandler) UpdateStoreBoxFee(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string) (err error) {
boxFee, err := dao.GetSysConfigAsInt64(dao.GetDB(), model.ConfigSysMtwmBoxFee)
if err == nil {
if globals.EnableMtwmStoreWrite && globals.IsProductEnv() {
err = getAPI(vendorOrgCode, storeID, vendorStoreID).PackagePriceUpdate(vendorStoreID, 1, int(boxFee))
}
}
//boxFee, err := dao.GetSysConfigAsInt64(dao.GetDB(), model.ConfigSysMtwmBoxFee)
//if err == nil {
// if globals.EnableMtwmStoreWrite && globals.IsProductEnv() {
// err = getAPI(vendorOrgCode, storeID, vendorStoreID).PackagePriceUpdate(vendorStoreID, 1, int(boxFee))
// }
//}
return err
}
func (c *PurchaseHandler) UpdateStoreLineStatus(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, lineStatus int) (err error) {
if lineStatus == model.StoreStatusOpened {
err = getAPI(vendorOrgCode, storeID, vendorStoreID).PoiOnline(vendorStoreID)
} else {
err = getAPI(vendorOrgCode, storeID, vendorStoreID).PoiOffline(vendorStoreID)
}
//if lineStatus == model.StoreStatusOpened {
// err = getAPI(vendorOrgCode, storeID, vendorStoreID).PoiOnline(vendorStoreID)
//} else {
// err = getAPI(vendorOrgCode, storeID, vendorStoreID).PoiOffline(vendorStoreID)
//}
return err
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,4 @@
package mtwm
package tao_vegetable
import (
"testing"

View File

@@ -1,46 +0,0 @@
package mtwm
import (
"testing"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
// _ "git.rosy.net.cn/jx-callback/business/jxcallback/orderman"
)
// func TestSyncStoreCategory(t *testing.T) {
// hint, err := CurPurchaseHandler.SyncStoreCategory(jxcontext.AdminCtx, nil, testShopID, false)
// if err != nil {
// t.Fatal(err)
// }
// t.Log(hint)
// }
// func TestSyncLocalStoreCategory(t *testing.T) {
// hint, err := CurPurchaseHandler.SyncLocalStoreCategory(jxcontext.AdminCtx, nil, testShopID, true, nil)
// if err != nil {
// t.Fatal(err)
// }
// t.Log(hint)
// }
// func TestSyncStoreSkus(t *testing.T) {
// hint, err := CurPurchaseHandler.SyncStoreSkus(jxcontext.AdminCtx, nil, testShopID, nil, false, true)
// if err != nil {
// t.Fatal(err)
// }
// t.Log(hint)
// }
func TestDeleteRemoteSkus(t *testing.T) {
err := CurPurchaseHandler.DeleteStoreAllSkus(jxcontext.AdminCtx, nil, testShopID, testShopVendorID, true)
if err != nil {
t.Fatal(err)
}
}
func TestDeleteRemoteCategories(t *testing.T) {
err := CurPurchaseHandler.DeleteStoreAllCategories(jxcontext.AdminCtx, nil, testShopID, testShopVendorID, true)
if err != nil {
t.Fatal(err)
}
}

View File

@@ -1,43 +0,0 @@
package mtwm
import (
"testing"
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
"git.rosy.net.cn/baseapi/utils"
// _ "git.rosy.net.cn/jx-callback/business/jxcallback/orderman"
)
//func TestReadStore(t *testing.T) {
// store, err := CurPurchaseHandler.ReadStore(jxcontext.AdminCtx, "", "4351018")
// if err != nil {
// t.Fatal(err)
// }
// t.Log(utils.Format4Output(store, false))
//}
func TestUpdateStore(t *testing.T) {
err := CurPurchaseHandler.UpdateStore(nil, 100002, "test")
if err != nil {
t.Fatal(err)
}
}
func TestConstrainOpTimeList(t *testing.T) {
timeList := constrainOpTimeList([]int16{830, 1800}, []int16{
0,
200,
930,
1700,
})
t.Log(utils.Format4Output(timeList, false))
if timeList[0] != 930 || timeList[1] != 1700 {
t.Fatal("constrainOpTimeList failed")
}
}
func TestGetOpTimeListFromErr(t *testing.T) {
err := utils.NewErrorIntCode("当前配送营业时间为:07:00~24:00", mtwmapi.ErrCodeOpFailed)
list := getOpTimeListFromErr(err)
t.Log(list)
}

View File

@@ -1,4 +1,4 @@
package mtwm
package tao_vegetable
import (
"fmt"
@@ -6,8 +6,6 @@ import (
"strings"
"sync"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils"
@@ -32,7 +30,7 @@ type PurchaseHandler struct {
}
func init() {
if api.MtwmAPI != nil || api.Mtwm2API != nil {
if api.TaoVegetableApi != nil {
CurPurchaseHandler = New()
partner.RegisterPurchasePlatform(CurPurchaseHandler)
}
@@ -148,11 +146,11 @@ func bizStatusJX2Mtwm(status int) (openLevel, online int) {
return mtwmapi.PoiOpenLevelNormal, mtwmapi.PoiStatusOnline
}
func skuStatusJX2Mtwm(status int) int {
func skuStatusJX2Tao(status int) int64 {
if status == model.SkuStatusNormal {
return mtwmapi.SellStatusOnline
return tao_vegetable.CreateOnlineSaleFlag
}
return mtwmapi.SellStatusOffline
return tao_vegetable.CreateOfflineSaleFlag
}
func (p *PurchaseHandler) UploadImg(ctx *jxcontext.Context, vendorOrgCode, imgURL string, imgData []byte, imgName string, imgType int) (imgHint string, err error) {
@@ -215,23 +213,15 @@ func getAPI(appOrgCode string, storeID int, vendorStoreID string) (apiObj *tao_v
if appOrgCode == "" {
globals.SugarLogger.Debugf("getAPI appOrgCode is empty")
}
apiObj = partner.CurAPIManager.GetAPI(model.VendorIDTaoVegetable, appOrgCode).(*tao_vegetable.API)
var storeDetail *dao.StoreDetail
if storeID != model.NO {
storeDetail, _ = dao.GetStoreDetail(dao.GetDB(), storeID, model.VendorIDTaoVegetable, appOrgCode)
} else if vendorStoreID != "" {
storeDetail, _ = dao.GetStoreDetailByVendorStoreID(dao.GetDB(), vendorStoreID, model.VendorIDTaoVegetable, appOrgCode)
}
if storeDetail != nil {
apiObj.SetToken(storeDetail.MtwmToken)
}
//apiObj = partner.CurAPIManager.GetAPI(model.VendorIDTaoVegetable, appOrgCode).(*tao_vegetable.API)
//var storeDetail *dao.StoreDetail
//if storeID != model.NO {
// storeDetail, _ = dao.GetStoreDetail(dao.GetDB(), storeID, model.VendorIDTaoVegetable, appOrgCode)
//} else if vendorStoreID != "" {
// storeDetail, _ = dao.GetStoreDetailByVendorStoreID(dao.GetDB(), vendorStoreID, model.VendorIDTaoVegetable, appOrgCode)
//}
//if storeDetail != nil {
// apiObj.SetToken(storeDetail.MtwmToken)
//}
return apiObj
}
//
//func getAPIWithoutToken(appOrgCode string) (apiObj *mtwmapi.API) {
// if appOrgCode == "" {
// globals.SugarLogger.Warnf("getAPI appOrgCode is empty")
// }
// return partner.CurAPIManager.GetAPI(model.VendorIDTaoVegetable, appOrgCode).(*mtwmapi.API)
//}

View File

@@ -1,63 +0,0 @@
package mtwm
import (
"fmt"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"net/url"
"testing"
"time"
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/partner"
)
func TestOnFinancialMsg(t *testing.T) {
msg := &mtwmapi.CallbackMsg{
Cmd: "orderRefund",
FormData: url.Values{},
}
msg.FormData.Set("timestamp", utils.Int64ToStr(time.Now().Unix()))
msg.FormData.Set("order_id", "33762863167364867")
msg.FormData.Set("notify_type", "agree")
msg.FormData.Set("money", "23.56")
food := []map[string]interface{}{
map[string]interface{}{
"app_food_code": "123",
"food_name": "商品1",
"sku_id": "123",
"refund_price": 3.14,
"count": 2,
"box_num": 1,
"box_price": 1,
},
map[string]interface{}{
"app_food_code": "124",
"food_name": "商品2",
"sku_id": "124",
"refund_price": 3.15,
"count": 2,
"box_num": 1,
"box_price": 1,
},
}
msg.FormData.Set("food", string(utils.MustMarshal(food)))
res := CurPurchaseHandler.onAfsOrderMsg(msg)
fmt.Println(res)
}
func TestOnOrderDetail(t *testing.T) {
result := map[string]interface{}{
"app_order_code": "", "app_poi_code": "2828472", "avg_send_time": 2410, "backup_recipient_phone": "[\"13164714130_7645\"]", "caution": " 【如遇缺货】: 缺货时电话与我沟通 收餐人隐私号 13049813276_5307手机号 139****5027", "city_id": 440300, "ctime": 1555036346, "day_seq": 1, "delivery_time": 0, "detail": "[{\"app_food_code\":\"27262\",\"box_num\":0,\"box_price\":0,\"cart_id\":0,\"food_discount\":1,\"food_name\":\"红管鱿鱼约250g/份\",\"food_property\":\"\",\"price\":23.54,\"quantity\":1,\"sku_id\":\"27262\",\"spec\":\"250g\",\"unit\":\"份\"},{\"app_food_code\":\"24987\",\"box_num\":0,\"box_price\":0,\"cart_id\":0,\"food_discount\":1,\"food_name\":\"带皮猪梅花肉约250g/份\",\"food_property\":\"\",\"price\":15.84,\"quantity\":1,\"sku_id\":\"24987\",\"spec\":\"250g\",\"unit\":\"份\"},{\"app_food_code\":\"27179\",\"box_num\":0,\"box_price\":0,\"cart_id\":0,\"food_discount\":1,\"food_name\":\"[畅销]龙骨约250g/份\",\"food_property\":\"\",\"price\":18.59,\"quantity\":1,\"sku_id\":\"27179\",\"spec\":\"250g\",\"unit\":\"份\"}]", "dinners_number": 0, "expect_deliver_time": 0, "extras": "[{\"act_detail_id\":664795195,\"mt_charge\":0,\"poi_charge\":5,\"reduce_fee\":5,\"remark\":\"满46.0元减5.0元\",\"type\":2},{\"act_detail_id\":665051798,\"mt_charge\":0,\"poi_charge\":4,\"reduce_fee\":4,\"remark\":\"减配送费4.0元\",\"type\":25},{\"act_detail_id\":274839715,\"mt_charge\":0.5,\"poi_charge\":0,\"reduce_fee\":0.5,\"remark\":\"用户使用了支付红包减0.5元\",\"type\":9},{\"mt_charge\":0,\"poi_charge\":0,\"reduce_fee\":0,\"remark\":\"送30元商家代金券\",\"type\":100},{}]", "has_invoiced": 0, "invoice_title": "", "is_favorites": false, "is_poi_first_order": true, "is_pre": 0, "is_third_shipping": 0, "latitude": 22.530194, "logistics_code": "1001", "longitude": 114.08372, "order_id": 28284722536001020, "order_send_time": 1555036356, "original_price": 63.97, "package_bag_money": 0, "pay_type": 2, "pick_type": 0, "poi_receive_detail": "{\"actOrderChargeByMt\":[{\"comment\":\"活动款\",\"feeTypeDesc\":\"活动款\",\"feeTypeId\":10019,\"moneyCent\":50}],\"actOrderChargeByPoi\":[{\"comment\":\"满46.0元减5.0元\",\"feeTypeDesc\":\"活动款\",\"feeTypeId\":10019,\"moneyCent\":500},{\"comment\":\"减配送费4.0元\",\"feeTypeDesc\":\"活动款\",\"feeTypeId\":10019,\"moneyCent\":400}],\"foodShareFeeChargeByPoi\":490,\"logisticsFee\":600,\"onlinePayment\":5447,\"wmPoiReceiveCent\":4406}", "recipient_address": "汇港名苑 (南2区1005)@#广东省深圳市福田区滨河大道滨河大道3119号汇港名苑", "recipient_name": "颜(女士)", "recipient_phone": "13049813276_5307", "remark": "", "result": "ok", "shipper_phone": "", "shipping_fee": 6, "shipping_type": 0, "source_id": 3, "status": 2, "taxpayer_id": "", "total": 54.47, "utime": 1555036346, "wm_order_id_view": 28284722536001020, "wm_poi_address": "深圳市福田区南园街道南华社区滨河路2037号下小庙南区70栋101号滨河街市场", "wm_poi_id": 2828472, "wm_poi_name": "京西菜市(华强南店)", "wm_poi_phone": "13724313878",
}
err := new(PurchaseHandler).OnOrderDetail(result, partner.CreatedPeration)
fmt.Println(err)
}
func TestName(t *testing.T) {
store, err := dao.GetStoreDetailByVendorStoreID(dao.GetDB(), "1", model.VendorIDMTWM, "1")
fmt.Println(store)
fmt.Println(err)
}

View File

@@ -1,10 +1,8 @@
package mtwm
package tao_vegetable
import (
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/partner"
)
var (
@@ -27,37 +25,33 @@ func (p *PurchaseHandler) GetWaybillStatusFromVendorStatus(vendorStatus string)
}
func (c *PurchaseHandler) onWaybillMsg(msg *mtwmapi.CallbackMsg) (response *mtwmapi.CallbackResponse) {
waybill := c.callbackMsg2Waybill(msg)
err := partner.CurOrderManager.OnWaybillStatusChanged(waybill)
if err == nil && waybill.Status == model.WaybillStatusDelivering {
c.postFakeMsg(waybill.VendorOrderID, FakeMsgType, mtwmapi.OrderStatusDelivering)
}
return mtwmapi.Err2CallbackResponse(err, "")
//waybill := c.callbackMsg2Waybill(msg)
//err := partner.CurOrderManager.OnWaybillStatusChanged(waybill)
//if err == nil && waybill.Status == model.WaybillStatusDelivering {
// c.postFakeMsg(waybill.VendorOrderID, FakeMsgType, mtwmapi.OrderStatusDelivering)
//}
//return mtwmapi.Err2CallbackResponse(err, "")
return nil
}
func (c *PurchaseHandler) callbackMsg2Waybill(msg *mtwmapi.CallbackMsg) (retVal *model.Waybill) {
orderID := GetOrderIDFromMsg(msg)
vendorStatus := msg.FormData.Get("logistics_status")
retVal = &model.Waybill{
VendorOrderID: orderID,
OrderVendorID: model.VendorIDMTWM,
VendorWaybillID: orderID,
WaybillVendorID: model.VendorIDMTWM,
CourierName: msg.FormData.Get("dispatcher_name"),
CourierMobile: msg.FormData.Get("dispatcher_mobile"),
VendorStatus: vendorStatus,
Status: c.GetWaybillStatusFromVendorStatus(vendorStatus),
StatusTime: getTimeFromTimestamp(utils.Str2Int64(msg.FormData.Get("time"))),
Remark: "",
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
//orderID := GetOrderIDFromMsg(msg)
//vendorStatus := msg.FormData.Get("logistics_status")
//retVal = &model.Waybill{
// VendorOrderID: orderID,
// OrderVendorID: model.VendorIDMTWM,
// VendorWaybillID: orderID,
// WaybillVendorID: model.VendorIDMTWM,
// CourierName: msg.FormData.Get("dispatcher_name"),
// CourierMobile: msg.FormData.Get("dispatcher_mobile"),
// VendorStatus: vendorStatus,
// Status: c.GetWaybillStatusFromVendorStatus(vendorStatus),
// StatusTime: getTimeFromTimestamp(utils.Str2Int64(msg.FormData.Get("time"))),
// Remark: "",
// VendorOrgCode: msg.AppID,
//}
//if retVal.StatusTime == utils.DefaultTimeValue {
// retVal.StatusTime = getTimeFromTimestamp(utils.Str2Int64(msg.FormData.Get("timestamp")))
//}
return retVal

View File

@@ -119,6 +119,7 @@ func (p *PurchaseHandler) getOrder(vendorOrgCode, vendorOrderID, vendorStoreID s
if result.UserIdInfo != nil {
order.VendorUserID = result.UserIdInfo.IdCardNo
}
originalLng := utils.MustInterface2Float64(result.UserCoordinate.UserCoordinateLongitude)
originalLat := utils.MustInterface2Float64(result.UserCoordinate.UserCoordinateLatitude)
order.ConsigneeLng = jxutils.StandardCoordinate2Int(originalLng)
@@ -545,24 +546,6 @@ func (c *PurchaseHandler) postFakeMsg(vendorOrderID, cmd, VendorStatus, appOrgCo
// AcceptOrRefuseOrder 接单或者拒单(isAcceptIt:接单/拒单) 抖店暂无拒单
func (c *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool, userName string) (err error) {
//if isAcceptIt {
// if globals.EnableMtwmStoreWrite {
// err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").OrderConfirm(utils.Str2Int64(order.VendorOrderID))
// if err != nil {
// if utils.IsErrMatch(err, utils.Int2Str(mtwmapi.ErrCodeOpFailed), []string{
// "订单已经确认过了",
// }) {
// err = nil
// } else {
// globals.SugarLogger.Warnf("mtwm AcceptOrRefuseOrder orderID:%s failed with err:%v", order.VendorOrderID, err)
// }
// }
// }
//} else {
// if globals.EnableMtwmStoreWrite {
// err = c.CancelOrder(jxcontext.AdminCtx, order, "bu")
// }
//}
return err
}

View File

@@ -90,7 +90,7 @@ func (c *PurchaseHandler) onAfsOrderMsg(msgId string, msg interface{}) (retVal *
VendorOrgCode: utils.Int2Str(vendorOrgCode),
}
afsOrder.FreightUserMoney = tiktokAfsOrderDetail.Data.ProcessInfo.AfterSaleInfo.RefundPostAmount
afsOrder.AfsFreightMoney = 0 // 暂时未发现退货取件费用
afsOrder.AfsFreightMoney = tiktokAfsOrderDetail.Data.ProcessInfo.AfterSaleInfo.RefundPostAmount // 暂时未发现退货取件费用
afsOrder.BoxMoney = 0 // 餐盒费
afsOrder.TongchengFreightMoney = 0 // 同城配送费
afsOrder.SkuBoxMoney = 0 // 商品包装费

View File

@@ -296,6 +296,7 @@ func (p *PurchaseHandler) CancelActs(ctx *jxcontext.Context, vendorOrgCode strin
// return cancelOneShopAct(putils.GetFixDirectDownAct(vendorOrgCode, storeID, 0), vendorStoreID, putils.StoreSku2ActStoreSku(model.SyncFlagDeletedMask, vendorStoreID, storeSkuList))
}
// UpdateStoreSkusSpecTag 更新限购
func (p *PurchaseHandler) UpdateStoreSkusSpecTag(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (err error) {
//var foodDataList []map[string]interface{}
//for _, v := range storeSkuList {

View File

@@ -156,6 +156,7 @@ storeNameMtwm = "京西菜市"
storeNameEbai = "饿鲜达"
storeNameEbai2 = "好菜鲜生"
storeNameTiktok = "抖音小时购"
storeNameTao = "淘鲜达"
smsSignName = "京西菜市"
smsMobileVerifyTemplate = "SMS_175583158"

View File

@@ -46,6 +46,7 @@ type StoreSkuController struct {
// @Param jdSyncStatus query int false "京东同步标识"
// @Param ebaiSyncStatus query int false "饿百同步标识"
// @Param mtwmSyncStatus query int false "美团外卖同步标识"
// @Param taoSyncStatus query int false "淘先达同步标识"
// @Param lockTime query string false "价格锁定时间"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
@@ -88,6 +89,7 @@ func (c *StoreSkuController) GetStoreSkus() {
// @Param jdSyncStatus query int false "京东同步标识"
// @Param ebaiSyncStatus query int false "饿百同步标识"
// @Param mtwmSyncStatus query int false "美团外卖同步标识"
// @Param taoSyncStatus query int false "陶先达同步标识"
// @Param lockTime query string false "价格锁定时间"
// @Param isHighPrice query bool false "是否查过高价格商品,0是忽略1是高价-1是低价"
// @Param priceType query int false "是否查过高价格商品,0是忽略1是高价-1是低价"

View File

@@ -1,7 +1,12 @@
package controllers
import (
"git.rosy.net.cn/baseapi/platformapi/tao_vegetable"
"git.rosy.net.cn/baseapi/platformapi/tiktok_shop/tiktok_api"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxstore/common"
"git.rosy.net.cn/jx-callback/business/model"
taoVegetable "git.rosy.net.cn/jx-callback/business/partner/purchase/tao_vegetable"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"
"github.com/astaxie/beego/server/web"
@@ -13,14 +18,14 @@ type TaoBaoVegetableController struct {
web.Controller
}
// GetCode 淘菜菜获取商户授权code
// GetCode 淘菜菜获取商户授权code,这个code和token是门店层次的
func (c *TaoBaoVegetableController) GetCode() {
codeData := ""
if c.Ctx.Input.Method() == http.MethodPost {
body, err := ioutil.ReadAll(c.Ctx.Request.Body)
if err != nil {
globals.SugarLogger.Debugf("商户收取code获取:%s,%s", string(body), err.Error())
c.Data["json"] = MsgFail()
c.Data["json"] = tao_vegetable.CallBackResultInfo(err)
c.ServeJSON()
return
}
@@ -33,11 +38,114 @@ func (c *TaoBaoVegetableController) GetCode() {
tokenInfo, err := api.TaoVegetableApi.GetStoreToken(codeData, "")
if err != nil {
globals.SugarLogger.Debugf("获取门店token错误:%s", err.Error())
c.Data["json"] = MsgFail()
c.Data["json"] = tao_vegetable.CallBackResultInfo(err)
c.ServeJSON()
return
}
globals.SugarLogger.Debugf("token:%s", utils.Format4Output(tokenInfo, false))
// 创建storeMap门店信息
// 刷新token
// 创建或者更新账号token
param := &model.VendorOrgCode{
VendorID: model.VendorIDTaoVegetable,
VendorOrgCode: api.TaoVegetableApi.GetVendorOrgCode(),
Comment: tokenInfo.UserNick,
VendorType: "platform",
IsJxCat: 1,
IsOpen: 1,
EmpowerURL: "http://oauth.hemaos.com/authorize?\nresponse_type=code&sp=hema&op=topApp&client_id=" + api.TaoVegetableApi.GetVendorOrgCode(),
StoreBrandName: "自动更新(京西菜市)",
Token: utils.Format4Output(tokenInfo, false),
AppKey: api.TaoVegetableApi.GetVendorOrgCode(),
AppSecret: api.TaoVegetableApi.GetAppSecret(),
}
if err := common.AddVendorOrgCode(nil, param); err != nil {
c.Data["json"] = tiktok_api.CallbackResponse{Code: tiktok_api.CallbackFailCode, Msg: tiktok_api.CallbackFail}
c.ServeJSON()
return
}
c.Data["json"] = tao_vegetable.CallBackResultInfo(nil)
c.ServeJSON()
return
}
// OrderStatus 订单状态变化 [post]
func (c *TaoBaoVegetableController) OrderStatus() {
order, err := api.TaoVegetableApi.ReaderOrderInfo(c.Ctx.Request)
globals.SugarLogger.Debugf("OrderStatus := %s", utils.Format4Output(order, false))
if err != nil {
globals.SugarLogger.Debugf("订单状态变化:%s", err.Error())
c.Data["json"] = tao_vegetable.CallBackResultInfo(err)
c.ServeJSON()
return
}
callbackResponse := taoVegetable.OnCallbackMsg(tao_vegetable.OrderStatusChange, utils.Int64ToStr(order.BizOrderId), order)
c.Data["json"] = callbackResponse
c.ServeJSON()
return
}
// ApplyCancelOrder 用户发起售后申请
func (c *TaoBaoVegetableController) ApplyCancelOrder() {
afsOrder, err := api.TaoVegetableApi.UserApplyRefund(c.Ctx.Request)
globals.SugarLogger.Debugf("ApplyCancelOrder := %s", utils.Format4Output(afsOrder, false))
if err != nil {
globals.SugarLogger.Debugf("用户发起售后:%s", err.Error())
c.Data["json"] = tao_vegetable.CallBackResultInfo(err)
c.ServeJSON()
return
}
callbackResponse := taoVegetable.OnCallbackMsg(tao_vegetable.OrderStatusApplyAfs, afsOrder.OutOrderId, afsOrder)
c.Data["json"] = callbackResponse
c.ServeJSON()
return
}
// UserCancelRefund 用户取消售后
func (c *TaoBaoVegetableController) UserCancelRefund() {
afsOrder, err := api.TaoVegetableApi.UserCancelRefundApply(c.Ctx.Request)
globals.SugarLogger.Debugf("UserCancelRefund := %s", utils.Format4Output(afsOrder, false))
if err != nil {
globals.SugarLogger.Debugf("用户取消售后:%s", err.Error())
c.Data["json"] = tao_vegetable.CallBackResultInfo(err)
c.ServeJSON()
return
}
callbackResponse := taoVegetable.OnCallbackMsg(tao_vegetable.OrderStatusCancelAfs, afsOrder.OutOrderId, afsOrder)
c.Data["json"] = callbackResponse
c.ServeJSON()
return
}
// CancelOnSaleRefundOrder 用户售中取消(走订单取消流程)
func (c *TaoBaoVegetableController) CancelOnSaleRefundOrder() {
afsOrder, err := api.TaoVegetableApi.OnSaleRefundOrder(c.Ctx.Request)
globals.SugarLogger.Debugf("CancelOnSaleRefundOrder := %s", utils.Format4Output(afsOrder, false))
if err != nil {
globals.SugarLogger.Debugf("用户售中取消:%s", err.Error())
c.Data["json"] = tao_vegetable.CallBackResultInfo(err)
c.ServeJSON()
return
}
callbackResponse := taoVegetable.OnCallbackMsg(tao_vegetable.OrderStatusOnSaleCancel, utils.Int64ToStr(afsOrder.BizOrderId), afsOrder)
c.Data["json"] = callbackResponse
c.ServeJSON()
return
}
// RefundOrderSuccess 用户售后成功通知,只有退款成功了才会通知(商户拒绝退款,不会通知)
func (c *TaoBaoVegetableController) RefundOrderSuccess() {
refundSuccess, err := api.TaoVegetableApi.RefundOrderFinish(c.Ctx.Request)
globals.SugarLogger.Debugf("RefundOrderSuccess := %s", utils.Format4Output(refundSuccess, false))
if err != nil {
globals.SugarLogger.Debugf("用户售后成功消息通知:%s", err.Error())
c.Data["json"] = tao_vegetable.CallBackResultInfo(err)
c.ServeJSON()
return
}
callbackResponse := taoVegetable.OnCallbackMsg(tao_vegetable.OrderStatusRefundSuccess, refundSuccess.OutSubOrderId, refundSuccess)
c.Data["json"] = callbackResponse
c.ServeJSON()
return
}

View File

@@ -93,6 +93,11 @@ func (a *APIManager) GetAppOrgCodeList(vendorID int) (appOrgCodeList []string) {
for _, v := range vendorOrgCodes {
appOrgCodeList = append(appOrgCodeList, v.VendorOrgCode)
}
case model.VendorIDTaoVegetable:
vendorOrgCodes, _ := dao.GetVendorOrgCode(dao.GetDB(), model.VendorIDTaoVegetable, "", model.VendorOrgTypePlatform)
for _, v := range vendorOrgCodes {
appOrgCodeList = append(appOrgCodeList, v.VendorOrgCode)
}
case model.VendorIDMTWM:
appOrgCodeList = []string{api.MtwmAPI.GetAppID(), api.Mtwm2API.GetAppID()}
case model.VendorIDEBAI:

View File

@@ -47,6 +47,7 @@ var (
StoreNameTiktok string
StoreNameEbai string
StoreNameEbai2 string
StoreNameTao string
SMSSignName string
SMSMobileVerifyTemplate string
@@ -137,6 +138,7 @@ func Init() {
StoreName = web.AppConfig.DefaultString("storeName", "")
StoreNameMtwm = web.AppConfig.DefaultString("storeNameMtwm", "")
StoreNameTiktok = web.AppConfig.DefaultString("storeNameTiktok", "")
StoreNameTao = web.AppConfig.DefaultString("storeNameTao", "")
StoreNameEbai = web.AppConfig.DefaultString("storeNameEbai", "")
StoreNameEbai2 = web.AppConfig.DefaultString("storeNameEbai2", "")