Merge remote-tracking branch 'origin/mark' into su
This commit is contained in:
@@ -1201,10 +1201,11 @@ func GetMatterStoreOrderCount(ctx *jxcontext.Context, storeID int) (result *Orde
|
|||||||
WHERE IF(a.store_id = 0, a.jx_store_id, a.store_id) = 666666
|
WHERE IF(a.store_id = 0, a.jx_store_id, a.store_id) = 666666
|
||||||
AND a.from_store_id = ?
|
AND a.from_store_id = ?
|
||||||
AND a.status >= ? AND a.status <> ?
|
AND a.status >= ? AND a.status <> ?
|
||||||
|
AND b.status = ?
|
||||||
ORDER BY b.pay_finished_at DESC
|
ORDER BY b.pay_finished_at DESC
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
`
|
`
|
||||||
sqlParams := []interface{}{storeID, model.OrderStatusDelivering, model.OrderStatusCanceled}
|
sqlParams := []interface{}{storeID, model.OrderStatusDelivering, model.OrderStatusCanceled, model.PayStatusYes}
|
||||||
err = dao.GetRows(db, &orderPays, sql, sqlParams)
|
err = dao.GetRows(db, &orderPays, sql, sqlParams)
|
||||||
if len(orderPays) != 0 {
|
if len(orderPays) != 0 {
|
||||||
orderPay := orderPays[0]
|
orderPay := orderPays[0]
|
||||||
|
|||||||
@@ -1120,34 +1120,39 @@ func UpdateSku(ctx *jxcontext.Context, skuID int, payload map[string]interface{}
|
|||||||
}
|
}
|
||||||
|
|
||||||
func refreshStoreSkuPrice(ctx *jxcontext.Context, db *dao.DaoDB, skuID int) (err error) {
|
func refreshStoreSkuPrice(ctx *jxcontext.Context, db *dao.DaoDB, skuID int) (err error) {
|
||||||
dao.Begin(db)
|
|
||||||
defer func() {
|
|
||||||
if r := recover(); r != nil || err != nil {
|
|
||||||
dao.Rollback(db)
|
|
||||||
if r != nil {
|
|
||||||
panic(r)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
list, err := dao.GetStoreSkusAndSkuName(db, nil, []int{skuID}, nil)
|
list, err := dao.GetStoreSkusAndSkuName(db, nil, []int{skuID}, nil)
|
||||||
for _, v := range list {
|
task := tasksch.NewParallelTask("refreshStoreSkuPrice", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(true), ctx,
|
||||||
storeID := v.StoreID
|
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||||
storeDetail, err := dao.GetStoreDetail(db, storeID, model.VendorIDJX)
|
v := batchItemList[0].(*dao.StoreSkuAndName)
|
||||||
if err != nil {
|
storeID := v.StoreID
|
||||||
return err
|
storeDetail, _ := dao.GetStoreDetail(db, storeID, model.VendorIDJX)
|
||||||
}
|
if storeDetail == nil {
|
||||||
storeSku := &model.StoreSkuBind{}
|
return retVal, err
|
||||||
storeSku.ID = v.BindID
|
}
|
||||||
storeSku.JdSyncStatus = v.JdSyncStatus | model.SyncFlagPriceMask
|
storeSku := &model.StoreSkuBind{}
|
||||||
storeSku.MtwmSyncStatus = v.MtwmSyncStatus | model.SyncFlagPriceMask
|
storeSku.ID = v.BindID
|
||||||
storeSku.EbaiSyncStatus = v.EbaiSyncStatus | model.SyncFlagPriceMask
|
storeSku.JdSyncStatus = v.JdSyncStatus | model.SyncFlagPriceMask
|
||||||
storeSku.Price = jxutils.CaculateSkuPrice(int(v.UnitPrice), v.SpecQuality, v.SpecUnit, v.Unit)
|
storeSku.MtwmSyncStatus = v.MtwmSyncStatus | model.SyncFlagPriceMask
|
||||||
storeSku.JxPrice = jxutils.CaculatePriceByPricePack(storeDetail.PricePercentagePackObj, int(storeDetail.PricePercentage), int(storeSku.Price))
|
storeSku.EbaiSyncStatus = v.EbaiSyncStatus | model.SyncFlagPriceMask
|
||||||
storeSku.LastOperator = ctx.GetUserName()
|
storeSku.Price = jxutils.CaculateSkuPrice(int(v.UnitPrice), v.SpecQuality, v.SpecUnit, v.Unit)
|
||||||
storeSku.UpdatedAt = time.Now()
|
storeSku.JxPrice = jxutils.CaculatePriceByPricePack(storeDetail.PricePercentagePackObj, int(storeDetail.PricePercentage), int(storeSku.Price))
|
||||||
dao.UpdateEntity(db, storeSku, "Price", "JdSyncStatus", "MtwmSyncStatus", "EbaiSyncStatus", "JxPrice")
|
storeSku.LastOperator = ctx.GetUserName()
|
||||||
}
|
storeSku.UpdatedAt = time.Now()
|
||||||
dao.Commit(db)
|
dao.Begin(db)
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil || err != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
if r != nil {
|
||||||
|
panic(r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
dao.UpdateEntity(db, storeSku, "Price", "JdSyncStatus", "MtwmSyncStatus", "EbaiSyncStatus", "JxPrice")
|
||||||
|
dao.Commit(db)
|
||||||
|
return retVal, err
|
||||||
|
}, list)
|
||||||
|
tasksch.HandleTask(task, nil, true).Run()
|
||||||
|
_, err = task.GetResult(0)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3210,6 +3210,9 @@ func AutoFocusStoreSkusForTopSkus(ctx *jxcontext.Context, isAsync, isContinueWhe
|
|||||||
skuName []*model.SkuName
|
skuName []*model.SkuName
|
||||||
skuNameMap = make(map[int]int)
|
skuNameMap = make(map[int]int)
|
||||||
)
|
)
|
||||||
|
if v.ID == model.MatterStoreID {
|
||||||
|
return retVal, err
|
||||||
|
}
|
||||||
sql := `
|
sql := `
|
||||||
SELECT DISTINCT a.name_id id
|
SELECT DISTINCT a.name_id id
|
||||||
FROM sku a
|
FROM sku a
|
||||||
|
|||||||
@@ -321,7 +321,7 @@ func doDailyWork() {
|
|||||||
cms.CurVendorSync.SyncStore2(jxcontext.AdminCtx, dao.GetDB(), nil, nil, true, true)
|
cms.CurVendorSync.SyncStore2(jxcontext.AdminCtx, dao.GetDB(), nil, nil, true, true)
|
||||||
|
|
||||||
syncStoreSku()
|
syncStoreSku()
|
||||||
localjx.RefreshAllMatterOrderStatus()
|
localjx.RefreshAllMatterOrderStatus(jxcontext.AdminCtx)
|
||||||
InitEx()
|
InitEx()
|
||||||
|
|
||||||
// 每天补全前一天与当天的订单
|
// 每天补全前一天与当天的订单
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ var (
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
func SendSMSMsg(mobileList []string, signName, templateCode string, templateParam map[string]interface{}) (err error) {
|
func SendSMSMsg(mobileList []string, signName, templateCode string, templateParam map[string]interface{}, order *model.GoodsOrder) (err error) {
|
||||||
if len(mobileList) > 0 {
|
if len(mobileList) > 0 {
|
||||||
errList := errlist.New()
|
errList := errlist.New()
|
||||||
mobileList = jxutils.StringMap2List(jxutils.StringList2Map(mobileList))
|
mobileList = jxutils.StringMap2List(jxutils.StringList2Map(mobileList))
|
||||||
@@ -42,6 +42,8 @@ func SendSMSMsg(mobileList []string, signName, templateCode string, templatePara
|
|||||||
} else {
|
} else {
|
||||||
globals.SugarLogger.Infof(errMsg)
|
globals.SugarLogger.Infof(errMsg)
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
err = updateStoreSMSNotifyMark(order)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -56,11 +58,13 @@ func getOrderNotifyPhone(order *model.GoodsOrder) (phoneList []string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func NotifyNewOrder(order *model.GoodsOrder) (err error) {
|
func NotifyNewOrder(order *model.GoodsOrder) (err error) {
|
||||||
err = SendSMSMsg(getOrderNotifyPhone(order), globals.SMSSignName, globals.SMSNewOrderTemplate, map[string]interface{}{
|
if isPushSMS(order) {
|
||||||
"daySeq": order.OrderSeq,
|
err = SendSMSMsg(getOrderNotifyPhone(order), globals.SMSSignName, globals.SMSNewOrderTemplate, map[string]interface{}{
|
||||||
"consigneeName": order.ConsigneeName,
|
"daySeq": order.OrderSeq,
|
||||||
"payMoney": jxutils.IntPrice2StandardString(order.ActualPayPrice),
|
"consigneeName": order.ConsigneeName,
|
||||||
})
|
"payMoney": jxutils.IntPrice2StandardString(order.ActualPayPrice),
|
||||||
|
}, order)
|
||||||
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,6 +73,29 @@ func NotifyOrderCanceled(order *model.GoodsOrder) (err error) {
|
|||||||
"vendorName": model.VendorChineseNames[order.VendorID],
|
"vendorName": model.VendorChineseNames[order.VendorID],
|
||||||
"seq": order.OrderSeq,
|
"seq": order.OrderSeq,
|
||||||
"orderID": order.VendorOrderID,
|
"orderID": order.VendorOrderID,
|
||||||
})
|
}, order)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func isPushSMS(order *model.GoodsOrder) bool {
|
||||||
|
stores, _ := dao.GetStoreList(dao.GetDB(), []int{order.StoreID}, nil, nil, nil, "")
|
||||||
|
if len(stores) > 0 {
|
||||||
|
if stores[0].SMSNotifyMark == model.NO {
|
||||||
|
return true
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func updateStoreSMSNotifyMark(order *model.GoodsOrder) (err error) {
|
||||||
|
var db = dao.GetDB()
|
||||||
|
stores, _ := dao.GetStoreList(db, []int{order.StoreID}, nil, nil, nil, "")
|
||||||
|
if len(stores) > 0 {
|
||||||
|
stores[0].SMSNotifyMark = model.YES
|
||||||
|
_, err = dao.UpdateEntity(db, stores[0], "SMSNotifyMark")
|
||||||
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1234,3 +1234,28 @@ func GetOrdersForJxPay(db *DaoDB, finishTimeBegin, finishTimeEnd time.Time) (goo
|
|||||||
err = GetRows(db, &goods, sql, sqlParams...)
|
err = GetRows(db, &goods, sql, sqlParams...)
|
||||||
return goods, err
|
return goods, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetWaybills(db *DaoDB, vendorOrderID string) (waybills []*model.Waybill, err error) {
|
||||||
|
sql := `SELECT *
|
||||||
|
FROM waybill
|
||||||
|
WHERE vendor_order_id = ?
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{vendorOrderID}
|
||||||
|
err = GetRows(db, &waybills, sql, sqlParams)
|
||||||
|
return waybills, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetMatterChildOrders(db *DaoDB, vendorOrderID string) (goods []*model.GoodsOrder, err error) {
|
||||||
|
sql := `SELECT *
|
||||||
|
FROM goods_order
|
||||||
|
WHERE vendor_order_id LIKE ? OR vendor_order_id LIKE ?
|
||||||
|
AND vendor_id = ?
|
||||||
|
ORDER BY vendor_order_id DESC
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{
|
||||||
|
vendorOrderID + "0%", vendorOrderID + "1%",
|
||||||
|
model.VendorIDJX,
|
||||||
|
}
|
||||||
|
err = GetRows(db, &goods, sql, sqlParams)
|
||||||
|
return goods, err
|
||||||
|
}
|
||||||
|
|||||||
@@ -56,7 +56,8 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
ExdStoreName = "饿鲜达"
|
ExdStoreName = "饿鲜达"
|
||||||
|
MatterStoreID = 666666
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -278,7 +279,8 @@ type Store struct {
|
|||||||
Status int `json:"status"`
|
Status int `json:"status"`
|
||||||
AutoEnableAt *time.Time `orm:"type(datetime);null" json:"autoEnableAt"` // 自动营业时间(临时休息用)
|
AutoEnableAt *time.Time `orm:"type(datetime);null" json:"autoEnableAt"` // 自动营业时间(临时休息用)
|
||||||
ChangePriceType int8 `json:"changePriceType"` // 修改价格类型,即是否需要审核
|
ChangePriceType int8 `json:"changePriceType"` // 修改价格类型,即是否需要审核
|
||||||
SMSNotify int8 `orm:"column(sms_notify);" json:"smsNotify"` // 是否通过短信接收订单消息
|
SMSNotify int8 `orm:"column(sms_notify);" json:"smsNotify"` // 是否通过短信接收订单消息(每天只推一条)
|
||||||
|
SMSNotifyMark int8 `orm:"column(sms_notify_mark);" json:"smsNotifyMark"` //今天是否已经推送过订单消息
|
||||||
AutoReplyType int8 `json:"autoReplyType"` // 订单评价自动回复类型
|
AutoReplyType int8 `json:"autoReplyType"` // 订单评价自动回复类型
|
||||||
LinkStoreID int `orm:"column(link_store_id);default(0);index" json:"linkStoreID"` // 关联门店ID
|
LinkStoreID int `orm:"column(link_store_id);default(0);index" json:"linkStoreID"` // 关联门店ID
|
||||||
|
|
||||||
|
|||||||
@@ -45,7 +45,8 @@ const (
|
|||||||
|
|
||||||
wxAppID = "wx4b5930c13f8b1170"
|
wxAppID = "wx4b5930c13f8b1170"
|
||||||
|
|
||||||
autoCancelOrderReason = "支付超时,系统自动取消!"
|
autoCancelOrderReason = "支付超时,系统自动取消!"
|
||||||
|
cancelMatterOrderReason = "失败重发!"
|
||||||
)
|
)
|
||||||
|
|
||||||
type JxSkuInfo struct {
|
type JxSkuInfo struct {
|
||||||
@@ -198,6 +199,9 @@ func CreateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64,
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
if fromStoreID != 0 {
|
||||||
|
checkMatterDeliveryAddress(deliveryAddress)
|
||||||
|
}
|
||||||
if createType != OrderCreateTypePre {
|
if createType != OrderCreateTypePre {
|
||||||
if outJxOrder.TotalPrice != jxOrder.TotalPrice {
|
if outJxOrder.TotalPrice != jxOrder.TotalPrice {
|
||||||
return nil, fmt.Errorf("商品或配送信息发生改变,请重新下单")
|
return nil, fmt.Errorf("商品或配送信息发生改变,请重新下单")
|
||||||
@@ -775,6 +779,7 @@ func jxOrder2GoodsOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, deliveryAd
|
|||||||
order.FromStoreID = jxOrder.FromStoreID
|
order.FromStoreID = jxOrder.FromStoreID
|
||||||
order.WaybillVendorID = model.VendorIDJDWL
|
order.WaybillVendorID = model.VendorIDJDWL
|
||||||
order.DeliveryFlag = model.OrderDeliveryFlagMaskScheduleDisabled
|
order.DeliveryFlag = model.OrderDeliveryFlagMaskScheduleDisabled
|
||||||
|
order.ConsigneeAddress = deliveryAddress.Address
|
||||||
order.Flag = 1
|
order.Flag = 1
|
||||||
}
|
}
|
||||||
return order, err
|
return order, err
|
||||||
@@ -863,23 +868,7 @@ func orderSolutionForWuLiao(order *model.GoodsOrder) (err error) {
|
|||||||
}
|
}
|
||||||
dao.CreateEntity(db, waybill)
|
dao.CreateEntity(db, waybill)
|
||||||
} else { //如果重量超过5kg则需要进行拆单分包,商品分包规则。最后一个包不超过5kg,其他包不超过3kg
|
} else { //如果重量超过5kg则需要进行拆单分包,商品分包规则。最后一个包不超过5kg,其他包不超过3kg
|
||||||
jxOrder := &JxOrderInfo{}
|
outOrders, _, _ := tryToSplitMatterOrder(buildJxOrderInfo(order, orderSkus))
|
||||||
jxOrder.StoreID = order.StoreID
|
|
||||||
weight := 0
|
|
||||||
var skus []*JxSkuInfo
|
|
||||||
for _, v := range orderSkus {
|
|
||||||
weight += v.Weight * v.Count
|
|
||||||
sku := &JxSkuInfo{}
|
|
||||||
sku.SkuID = v.SkuID
|
|
||||||
sku.SalePrice = v.SalePrice
|
|
||||||
sku.Name = v.SkuName
|
|
||||||
sku.Weight = v.Weight
|
|
||||||
sku.Count = v.Count
|
|
||||||
skus = append(skus, sku)
|
|
||||||
}
|
|
||||||
jxOrder.Skus = skus
|
|
||||||
jxOrder.Weight = weight
|
|
||||||
outOrders, _, _ := tryToSplitMatterOrder(jxOrder)
|
|
||||||
//以下为仿照CreateOrder,改了一些参数
|
//以下为仿照CreateOrder,改了一些参数
|
||||||
for k, v := range outOrders {
|
for k, v := range outOrders {
|
||||||
outJxOrder, deliveryAddress, err := generateOrder(jxcontext.AdminCtx, v, order.AddressID, order.FromStoreID, order.UserID)
|
outJxOrder, deliveryAddress, err := generateOrder(jxcontext.AdminCtx, v, order.AddressID, order.FromStoreID, order.UserID)
|
||||||
@@ -888,6 +877,7 @@ func orderSolutionForWuLiao(order *model.GoodsOrder) (err error) {
|
|||||||
}
|
}
|
||||||
//分包后的子订单ID默认是后面加两位(目前的规则),要改的话要注意取消订单那的判断
|
//分包后的子订单ID默认是后面加两位(目前的规则),要改的话要注意取消订单那的判断
|
||||||
outJxOrder.OrderID = utils.Str2Int64(order.VendorOrderID)*100 + int64(k+1)
|
outJxOrder.OrderID = utils.Str2Int64(order.VendorOrderID)*100 + int64(k+1)
|
||||||
|
checkMatterDeliveryAddress(deliveryAddress)
|
||||||
order2, err2 := jxOrder2GoodsOrder(jxcontext.AdminCtx, outJxOrder, deliveryAddress, order.UserID)
|
order2, err2 := jxOrder2GoodsOrder(jxcontext.AdminCtx, outJxOrder, deliveryAddress, order.UserID)
|
||||||
if err = err2; err == nil {
|
if err = err2; err == nil {
|
||||||
order2.AddressID = order.AddressID
|
order2.AddressID = order.AddressID
|
||||||
@@ -976,10 +966,7 @@ func CancelMatterOrder(db *dao.DaoDB, order *model.GoodsOrder, reason string) (e
|
|||||||
}
|
}
|
||||||
_, err = api.JdEclpAPI.CancelOrder(order.EclpOutID)
|
_, err = api.JdEclpAPI.CancelOrder(order.EclpOutID)
|
||||||
} else {
|
} else {
|
||||||
var goodsList []*model.GoodsOrder
|
goodsList, err := dao.GetMatterChildOrders(db, order.VendorOrderID)
|
||||||
sql := "SELECT * FROM goods_order WHERE vendor_order_id LIKE ? OR vendor_order_id LIKE ? AND vendor_id = ?"
|
|
||||||
sqlParams := []interface{}{order.VendorOrderID + "0%", order.VendorOrderID + "1%", model.VendorIDJX}
|
|
||||||
err = dao.GetRows(db, &goodsList, sql, sqlParams)
|
|
||||||
if err == nil && len(goodsList) > 0 {
|
if err == nil && len(goodsList) > 0 {
|
||||||
for _, v := range goodsList {
|
for _, v := range goodsList {
|
||||||
_, err = api.JdEclpAPI.CancelOrder(v.EclpOutID)
|
_, err = api.JdEclpAPI.CancelOrder(v.EclpOutID)
|
||||||
@@ -1230,49 +1217,58 @@ func GetHalfHoursList() (strs []string) {
|
|||||||
return strs
|
return strs
|
||||||
}
|
}
|
||||||
|
|
||||||
func RefreshAllMatterOrderStatus() (err error) {
|
func RefreshAllMatterOrderStatus(ctx *jxcontext.Context) (err error) {
|
||||||
var (
|
var (
|
||||||
db = dao.GetDB()
|
db = dao.GetDB()
|
||||||
goodsList []*model.GoodsOrder
|
goodsList []*model.GoodsOrder
|
||||||
realTime time.Time
|
realTime time.Time
|
||||||
)
|
)
|
||||||
realTime = time.Now().AddDate(0, 0, -3)
|
realTime = time.Now().AddDate(0, 0, -7)
|
||||||
|
//有分包的主订单
|
||||||
sql := `
|
sql := `
|
||||||
SELECT * FROM goods_order WHERE store_id = 666666 AND order_created_at >= ? AND status <> ? AND vendor_id = ? AND eclp_out_id = '' AND LENGTH(vendor_order_id) = 14
|
SELECT * FROM goods_order WHERE store_id = 666666 AND order_created_at >= ? AND status <> ? AND vendor_id = ? AND LENGTH(vendor_order_id) = 14
|
||||||
`
|
`
|
||||||
sqlParams := []interface{}{realTime, model.OrderStatusFinished, model.VendorIDJX}
|
sqlParams := []interface{}{realTime, model.OrderStatusFinished, model.VendorIDJX}
|
||||||
err = dao.GetRows(db, &goodsList, sql, sqlParams)
|
err = dao.GetRows(db, &goodsList, sql, sqlParams)
|
||||||
for _, v := range goodsList {
|
for _, v := range goodsList {
|
||||||
var (
|
if v.EclpOutID == "" {
|
||||||
goodsList2 []*model.GoodsOrder
|
var (
|
||||||
finishedCount int
|
goodsList2 []*model.GoodsOrder
|
||||||
)
|
cancelCount int
|
||||||
sql2 := "SELECT * FROM goods_order WHERE vendor_order_id LIKE ? OR vendor_order_id LIKE ? AND vendor_id = ? AND eclp_out_id <> '' AND LENGTH(vendor_order_id) = 16"
|
deliveringCount int
|
||||||
sqlParams2 := []interface{}{v.VendorOrderID + "0%", v.VendorOrderID + "1%", model.VendorIDJX}
|
)
|
||||||
err = dao.GetRows(db, &goodsList2, sql2, sqlParams2)
|
sql2 := "SELECT * FROM goods_order WHERE vendor_order_id LIKE ? OR vendor_order_id LIKE ? AND vendor_id = ? AND eclp_out_id <> '' AND LENGTH(vendor_order_id) = 16"
|
||||||
for _, vv := range goodsList2 {
|
sqlParams2 := []interface{}{v.VendorOrderID + "0%", v.VendorOrderID + "1%", model.VendorIDJX}
|
||||||
if vv.Status != model.OrderStatusFinished {
|
err = dao.GetRows(db, &goodsList2, sql2, sqlParams2)
|
||||||
queryOrderStatus, _ := api.JdEclpAPI.QueryOrderStatus(vv.EclpOutID)
|
for _, vv := range goodsList2 {
|
||||||
if len(queryOrderStatus.OrderStatusList) > 0 {
|
if vv.Status < model.OrderStatusFinished {
|
||||||
if queryOrderStatus.OrderStatusList[len(queryOrderStatus.OrderStatusList)-1].SoStatusCode == jdeclpapi.SoStatusCode10034 {
|
queryOrderStatus, _ := api.JdEclpAPI.QueryOrderStatus(vv.EclpOutID)
|
||||||
dao.Begin(db)
|
if len(queryOrderStatus.OrderStatusList) > 0 {
|
||||||
defer func() {
|
if queryOrderStatus.OrderStatusList[len(queryOrderStatus.OrderStatusList)-1].SoStatusCode == jdeclpapi.SoStatusCode10034 {
|
||||||
if r := recover(); r != nil {
|
dao.Begin(db)
|
||||||
dao.Rollback(db)
|
defer func() {
|
||||||
panic(r)
|
if r := recover(); r != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
panic(r)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
vv.Status = model.OrderStatusFinished
|
||||||
|
dao.UpdateEntity(db, vv, "Status")
|
||||||
|
waybills, err := dao.GetWaybills(db, vv.VendorOrderID)
|
||||||
|
if err == nil && len(waybills) > 0 {
|
||||||
|
waybills[0].Status = model.WaybillStatusDelivered
|
||||||
|
dao.UpdateEntity(db, waybills[0], "Status")
|
||||||
}
|
}
|
||||||
}()
|
dao.Commit(db)
|
||||||
vv.Status = model.OrderStatusFinished
|
changeOrderStatus(vv.VendorOrderID, model.OrderStatusFinished, "")
|
||||||
dao.UpdateEntity(db, vv, "Status")
|
} else {
|
||||||
finishedCount++
|
deliveringCount++
|
||||||
dao.Commit(db)
|
}
|
||||||
}
|
}
|
||||||
|
} else if vv.Status == model.OrderStatusCanceled {
|
||||||
|
cancelCount++
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
finishedCount++
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if finishedCount == len(goodsList2) {
|
|
||||||
dao.Begin(db)
|
dao.Begin(db)
|
||||||
defer func() {
|
defer func() {
|
||||||
if r := recover(); r != nil {
|
if r := recover(); r != nil {
|
||||||
@@ -1280,9 +1276,38 @@ func RefreshAllMatterOrderStatus() (err error) {
|
|||||||
panic(r)
|
panic(r)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
v.Status = model.OrderStatusFinished
|
if deliveringCount == 0 {
|
||||||
|
v.Status = model.OrderStatusFinished
|
||||||
|
} else {
|
||||||
|
if cancelCount == len(goodsList2) {
|
||||||
|
v.Status = model.OrderStatusCanceled
|
||||||
|
}
|
||||||
|
}
|
||||||
dao.UpdateEntity(db, v, "Status")
|
dao.UpdateEntity(db, v, "Status")
|
||||||
dao.Commit(db)
|
dao.Commit(db)
|
||||||
|
changeOrderStatus(v.VendorOrderID, v.Status, "")
|
||||||
|
} else {
|
||||||
|
queryOrderStatus, _ := api.JdEclpAPI.QueryOrderStatus(v.EclpOutID)
|
||||||
|
if len(queryOrderStatus.OrderStatusList) > 0 {
|
||||||
|
if queryOrderStatus.OrderStatusList[len(queryOrderStatus.OrderStatusList)-1].SoStatusCode == jdeclpapi.SoStatusCode10034 {
|
||||||
|
dao.Begin(db)
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
panic(r)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
v.Status = model.OrderStatusFinished
|
||||||
|
dao.UpdateEntity(db, v, "Status")
|
||||||
|
waybills, err := dao.GetWaybills(db, v.VendorOrderID)
|
||||||
|
if err == nil && len(waybills) > 0 {
|
||||||
|
waybills[0].Status = model.WaybillStatusDelivered
|
||||||
|
dao.UpdateEntity(db, waybills[0], "Status")
|
||||||
|
}
|
||||||
|
dao.Commit(db)
|
||||||
|
changeOrderStatus(v.VendorOrderID, model.OrderStatusFinished, "")
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
@@ -1342,7 +1367,13 @@ func GetMatterOrderStatus(ctx *jxcontext.Context, vendorOrderID string) (result
|
|||||||
}()
|
}()
|
||||||
order.Status = model.OrderStatusFinished
|
order.Status = model.OrderStatusFinished
|
||||||
dao.UpdateEntity(db, order, "Status")
|
dao.UpdateEntity(db, order, "Status")
|
||||||
|
waybills, err := dao.GetWaybills(db, vendorOrderID)
|
||||||
|
if err == nil && len(waybills) > 0 {
|
||||||
|
waybills[0].Status = model.WaybillStatusDelivered
|
||||||
|
dao.UpdateEntity(db, waybills[0], "Status")
|
||||||
|
}
|
||||||
dao.Commit(db)
|
dao.Commit(db)
|
||||||
|
changeOrderStatus(vendorOrderID, model.OrderStatusFinished, "")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if len(getTrackMessagePlusByOrderResult.ResultData) > 0 {
|
if len(getTrackMessagePlusByOrderResult.ResultData) > 0 {
|
||||||
@@ -1360,9 +1391,7 @@ func GetMatterOrderStatus(ctx *jxcontext.Context, vendorOrderID string) (result
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sql := "SELECT * FROM waybill WHERE vendor_order_id = ?"
|
waybills, err = dao.GetWaybills(db, vendorOrderID)
|
||||||
sqlParams := []interface{}{vendorOrderID}
|
|
||||||
err = dao.GetRows(db, &waybills, sql, sqlParams)
|
|
||||||
if len(waybills) > 0 {
|
if len(waybills) > 0 {
|
||||||
waybills[0].VendorWaybillID = waybillCode
|
waybills[0].VendorWaybillID = waybillCode
|
||||||
waybills[0].CourierName = cName
|
waybills[0].CourierName = cName
|
||||||
@@ -1486,3 +1515,110 @@ func buildOutOrderSkus(weightp *JxSkuInfo2, outOrder *JxOrderInfo) {
|
|||||||
outOrder.Skus = append(outOrder.Skus, jxOrderChange(weightp))
|
outOrder.Skus = append(outOrder.Skus, jxOrderChange(weightp))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func checkMatterDeliveryAddress(deliveryAddress *dao.UserDeliveryAddressEx) {
|
||||||
|
var (
|
||||||
|
db = dao.GetDB()
|
||||||
|
)
|
||||||
|
if !strings.Contains(deliveryAddress.Address, "区") {
|
||||||
|
deliveryAddress.Address = deliveryAddress.DistrictName + deliveryAddress.Address
|
||||||
|
}
|
||||||
|
if !strings.Contains(deliveryAddress.Address, "市") {
|
||||||
|
deliveryAddress.Address = deliveryAddress.CityName + deliveryAddress.Address
|
||||||
|
}
|
||||||
|
if !strings.Contains(deliveryAddress.Address, "省") {
|
||||||
|
if place1, err := dao.GetPlaceByCode(db, deliveryAddress.CityCode); err == nil {
|
||||||
|
if place2, err2 := dao.GetPlaceByCode(db, place1.ParentCode); err2 == nil {
|
||||||
|
deliveryAddress.Address = place2.Name + deliveryAddress.Address
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func SendFailedMatterOrder(ctx *jxcontext.Context, vendorOrderID string) (err error) {
|
||||||
|
var (
|
||||||
|
db = dao.GetDB()
|
||||||
|
)
|
||||||
|
order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, model.VendorIDJX)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if order == nil || order.StoreID != model.MatterStoreID || order.FromStoreID == 0 {
|
||||||
|
return fmt.Errorf("只允许物料店重发物料订单调用此接口!")
|
||||||
|
}
|
||||||
|
queryOrderStatus, err := api.JdEclpAPI.QueryOrderStatus(order.EclpOutID)
|
||||||
|
if len(queryOrderStatus.OrderStatusList) > 0 {
|
||||||
|
if queryOrderStatus.OrderStatusList[len(queryOrderStatus.OrderStatusList)-1].SoStatusCode == jdeclpapi.SoStatusCode10022 { //表示该订单在京东物流为暂停
|
||||||
|
if len(order.VendorOrderID) == 14 && order.EclpOutID != "" { //这是不分包的订单
|
||||||
|
_, err = createMatterOrder(buildJxOrderInfo(order, order.Skus), order, int64(00))
|
||||||
|
err = CancelMatterOrder(db, order, cancelMatterOrderReason)
|
||||||
|
changeOrderStatus(order.VendorOrderID, model.OrderStatusCanceled, cancelMatterOrderReason)
|
||||||
|
for _, v := range order.Skus {
|
||||||
|
cms.RefreshMatterStock(jxcontext.AdminCtx, v.SkuID)
|
||||||
|
}
|
||||||
|
} else if len(order.VendorOrderID) == 14 && order.EclpOutID == "" { //这是分包的主订单
|
||||||
|
goodsList, err := dao.GetMatterChildOrders(db, order.VendorOrderID)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if len(goodsList) > 0 {
|
||||||
|
for _, v := range goodsList {
|
||||||
|
cOrder, err := partner.CurOrderManager.LoadOrder(v.VendorOrderID, model.VendorIDJX)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
suffix := utils.Str2Int64(cOrder.VendorOrderID[len(cOrder.VendorOrderID)-2:]) + int64(len(goodsList))
|
||||||
|
_, err = createMatterOrder(buildJxOrderInfo(cOrder, cOrder.Skus), cOrder, suffix)
|
||||||
|
for _, v := range cOrder.Skus {
|
||||||
|
cms.RefreshMatterStock(jxcontext.AdminCtx, v.SkuID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
err = CancelMatterOrder(db, order, cancelMatterOrderReason)
|
||||||
|
changeOrderStatus(order.VendorOrderID, model.OrderStatusCanceled, cancelMatterOrderReason)
|
||||||
|
} else if len(order.VendorOrderID) == 16 && order.EclpOutID != "" { // 这是分包的子订单
|
||||||
|
return fmt.Errorf("请重发主订单!主订单号:[%v]", order.VendorOrderID[len(order.VendorOrderID)-2:])
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("只允许物流订单为暂停才能调用此接口!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func createMatterOrder(jxOrder *JxOrderInfo, order *model.GoodsOrder, newOrderIDSuffix int64) (order2 *model.GoodsOrder, err error) {
|
||||||
|
outJxOrder, deliveryAddress, err := generateOrder(jxcontext.AdminCtx, jxOrder, order.AddressID, order.FromStoreID, order.UserID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
outJxOrder.OrderID = utils.Str2Int64(order.VendorOrderID)*100 + newOrderIDSuffix
|
||||||
|
checkMatterDeliveryAddress(deliveryAddress)
|
||||||
|
order2, err2 := jxOrder2GoodsOrder(jxcontext.AdminCtx, outJxOrder, deliveryAddress, order.UserID)
|
||||||
|
if err = err2; err == nil {
|
||||||
|
order2.AddressID = order.AddressID
|
||||||
|
order2.Status = model.OrderStatusDelivering
|
||||||
|
err = partner.CurOrderManager.OnOrderNew(order2, model.Order2Status(order2))
|
||||||
|
err = orderSolutionForWuLiao(order2)
|
||||||
|
}
|
||||||
|
return order2, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildJxOrderInfo(order *model.GoodsOrder, orderSkus []*model.OrderSku) (jxOrder *JxOrderInfo) {
|
||||||
|
jxOrder = &JxOrderInfo{}
|
||||||
|
jxOrder.StoreID = order.StoreID
|
||||||
|
weight := 0
|
||||||
|
var skus []*JxSkuInfo
|
||||||
|
for _, v := range orderSkus {
|
||||||
|
weight += v.Weight * v.Count
|
||||||
|
sku := &JxSkuInfo{}
|
||||||
|
sku.SkuID = v.SkuID
|
||||||
|
sku.SalePrice = v.SalePrice
|
||||||
|
sku.Name = v.SkuName
|
||||||
|
sku.Weight = v.Weight
|
||||||
|
sku.Count = v.Count
|
||||||
|
skus = append(skus, sku)
|
||||||
|
}
|
||||||
|
jxOrder.Skus = skus
|
||||||
|
jxOrder.Weight = weight
|
||||||
|
return jxOrder
|
||||||
|
}
|
||||||
|
|||||||
@@ -174,3 +174,30 @@ func (c *JxOrderController) GetMatterOrderStatus() {
|
|||||||
return retVal, "", err
|
return retVal, "", err
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @Title 刷新所有物料订单状态
|
||||||
|
// @Description 刷新所有物料订单状态
|
||||||
|
// @Param token header string true "认证token"
|
||||||
|
// @Success 200 {object} controllers.CallResult
|
||||||
|
// @Failure 200 {object} controllers.CallResult
|
||||||
|
// @router /RefreshAllMatterOrderStatus [put]
|
||||||
|
func (c *JxOrderController) RefreshAllMatterOrderStatus() {
|
||||||
|
c.callRefreshAllMatterOrderStatus(func(params *tJxorderRefreshAllMatterOrderStatusParams) (retVal interface{}, errCode string, err error) {
|
||||||
|
err = localjx.RefreshAllMatterOrderStatus(params.Ctx)
|
||||||
|
return retVal, "", err
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Title 重发物料订单
|
||||||
|
// @Description 重发物料订单
|
||||||
|
// @Param token header string true "认证token"
|
||||||
|
// @Param vendorOrderID formData string true "订单ID"
|
||||||
|
// @Success 200 {object} controllers.CallResult
|
||||||
|
// @Failure 200 {object} controllers.CallResult
|
||||||
|
// @router /SendFailedMatterOrder [post]
|
||||||
|
func (c *JxOrderController) SendFailedMatterOrder() {
|
||||||
|
c.callSendFailedMatterOrder(func(params *tJxorderSendFailedMatterOrderParams) (retVal interface{}, errCode string, err error) {
|
||||||
|
err = localjx.SendFailedMatterOrder(params.Ctx, params.VendorOrderID)
|
||||||
|
return retVal, "", err
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|||||||
@@ -709,6 +709,24 @@ func init() {
|
|||||||
Filters: nil,
|
Filters: nil,
|
||||||
Params: nil})
|
Params: nil})
|
||||||
|
|
||||||
|
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JxOrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JxOrderController"],
|
||||||
|
beego.ControllerComments{
|
||||||
|
Method: "RefreshAllMatterOrderStatus",
|
||||||
|
Router: `/RefreshAllMatterOrderStatus`,
|
||||||
|
AllowHTTPMethods: []string{"put"},
|
||||||
|
MethodParams: param.Make(),
|
||||||
|
Filters: nil,
|
||||||
|
Params: nil})
|
||||||
|
|
||||||
|
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JxOrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JxOrderController"],
|
||||||
|
beego.ControllerComments{
|
||||||
|
Method: "SendFailedMatterOrder",
|
||||||
|
Router: `/SendFailedMatterOrder`,
|
||||||
|
AllowHTTPMethods: []string{"post"},
|
||||||
|
MethodParams: param.Make(),
|
||||||
|
Filters: nil,
|
||||||
|
Params: nil})
|
||||||
|
|
||||||
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JxShopController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JxShopController"],
|
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JxShopController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JxShopController"],
|
||||||
beego.ControllerComments{
|
beego.ControllerComments{
|
||||||
Method: "JxMsg",
|
Method: "JxMsg",
|
||||||
|
|||||||
Reference in New Issue
Block a user