129 lines
5.0 KiB
Go
129 lines
5.0 KiB
Go
package cs
|
||
|
||
import (
|
||
"git.rosy.net.cn/baseapi/platformapi/weimobapi"
|
||
"git.rosy.net.cn/baseapi/utils"
|
||
"git.rosy.net.cn/jx-callback/business/authz/autils"
|
||
"git.rosy.net.cn/jx-callback/business/jxstore/cms"
|
||
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||
"git.rosy.net.cn/jx-callback/business/model"
|
||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||
"git.rosy.net.cn/jx-callback/globals"
|
||
"git.rosy.net.cn/jx-callback/globals/api"
|
||
)
|
||
|
||
const (
|
||
minCSOrderPayment = 0 // 供货订单的最小金额(单位为元)
|
||
maxUnitPrice = 3000 // 为防止误填单价,限制单价最高(单位为分)
|
||
)
|
||
|
||
func OnCallbackMsg(msg *weimobapi.CallbackMsg) (response *weimobapi.CallbackResponse) {
|
||
orderID := utils.Int64ToStr(msg.OrderNo)
|
||
jxutils.CallMsgHandler(func() {
|
||
response = onOrderMsg(msg)
|
||
}, jxutils.ComposeUniversalOrderID(orderID, model.VendorIDWSC))
|
||
return response
|
||
}
|
||
|
||
func onOrderMsg(msg *weimobapi.CallbackMsg) (response *weimobapi.CallbackResponse) {
|
||
globals.SugarLogger.Debugf("onOrderMsg:%s", utils.Format4Output(msg, true))
|
||
if msg.Event == weimobapi.MsgEventOrderStatusChange {
|
||
if utils.ForceInterface2Int64(msg.MsgBody["orderStatus"]) == weimobapi.MsgOrderStatusFinished {
|
||
if orderDetail, err := api.WeimobAPI.QueryOrderDetail2(msg.OrderNo, false); err == nil {
|
||
if orderDetail.OrderStatus == weimobapi.OrderStatusFinished && orderDetail.PaymentAmount >= minCSOrderPayment {
|
||
changeStoreSkusByOrder(orderDetail)
|
||
}
|
||
} else {
|
||
globals.SugarLogger.Debugf("onOrderMsg order:%s failed with err:%v", msg.OrderNo, err)
|
||
response = weimobapi.Err2CallbackResponse(err, "")
|
||
}
|
||
}
|
||
}
|
||
return response
|
||
}
|
||
|
||
func changeStoreSkusByOrder(order *weimobapi.OrderDetail) {
|
||
globals.SugarLogger.Debugf("changeStoreSkusByOrder order:%s", utils.Format4Output(order, true))
|
||
receiverMobile := order.DeliveryDetail.LogisticsDeliveryDetail.ReceiverMobile
|
||
ctx := jxcontext.NewWithUserName(nil, utils.LimitStringLen(utils.Int64ToStr(order.OrderNo), 32), nil, nil)
|
||
if storeList, err := GetStoreList4Mobile(dao.GetDB(), []string{receiverMobile}); err == nil {
|
||
if len(storeList) >= 1 {
|
||
var skuBindInfos []*cms.StoreSkuBindInfo
|
||
storeID := storeList[0].ID
|
||
globals.SugarLogger.Debugf("changeStoreSkusByOrder storeID:%d", storeID)
|
||
for _, v := range order.ItemList {
|
||
nameID := int(utils.Str2Int64WithDefault(v.SkuCode, 0))
|
||
unitPrice := v.CostPrice
|
||
if nameID > 0 && (unitPrice > 0 && unitPrice < maxUnitPrice) {
|
||
skuBindInfos = append(skuBindInfos, &cms.StoreSkuBindInfo{
|
||
StoreID: storeID,
|
||
NameID: nameID,
|
||
UnitPrice: int(jxutils.StandardPrice2Int(unitPrice)),
|
||
IsFocus: 1,
|
||
IsSale: 1,
|
||
})
|
||
} else {
|
||
globals.SugarLogger.Infof("[运营],微商城订单:%d,商品:%s没有设置正确的SkuName编码或单价,当前商家编码:%s,市场价:%s", order.OrderNo, v.SkuNum, v.SkuCode, jxutils.IntPrice2StandardString(jxutils.StandardPrice2Int(unitPrice)))
|
||
}
|
||
}
|
||
if len(skuBindInfos) > 0 {
|
||
var nameIDs []int
|
||
for _, v := range skuBindInfos {
|
||
nameIDs = append(nameIDs, v.NameID)
|
||
}
|
||
if skuNamesInfo, err := cms.GetSkuNames(ctx, "", false, false, map[string]interface{}{
|
||
"nameIDs": string(utils.MustMarshal(nameIDs)),
|
||
}, 0, 0); err == nil {
|
||
for _, skuName := range skuNamesInfo.SkuNames {
|
||
if skuName.Status != model.SkuStatusNormal {
|
||
cms.UpdateSkuName(ctx, skuName.ID, map[string]interface{}{
|
||
"status": model.SkuStatusNormal,
|
||
}, false)
|
||
}
|
||
for _, sku := range skuName.Skus {
|
||
if sku.Status != model.SkuStatusNormal {
|
||
cms.UpdateSku(ctx, sku.ID, map[string]interface{}{
|
||
"status": model.SkuStatusNormal,
|
||
})
|
||
}
|
||
}
|
||
}
|
||
}
|
||
cms.UpdateStoreSkus(ctx, 0, storeID, skuBindInfos, true, true)
|
||
} else {
|
||
globals.SugarLogger.Debugf("changeStoreSkusByOrder orderID:%d, storeID:%d is empty", order.OrderNo, storeID)
|
||
}
|
||
} else {
|
||
globals.SugarLogger.Infof("[运营],微商城订单:%d,手机:%s找不到唯一一个本地门店%d", order.OrderNo, receiverMobile, len(storeList))
|
||
}
|
||
} else {
|
||
globals.SugarLogger.Warnf("changeStoreSkusByOrder orderNo:%d, receiverMobile:%s failed with err:%v", order.OrderNo, receiverMobile, err)
|
||
}
|
||
}
|
||
|
||
func GetStoreList4Mobile(db *dao.DaoDB, mobileList []string) (storeList []*model.Store, err error) {
|
||
sql := `
|
||
SELECT t1.*
|
||
FROM store t1
|
||
WHERE t1.deleted_at = ? /*AND t1.change_price_type = ?*/`
|
||
sqlParams := []interface{}{
|
||
utils.DefaultTimeValue,
|
||
// model.StoreChangePriceTypeBossDisabled,
|
||
}
|
||
if len(mobileList) > 0 {
|
||
questionMarks := dao.GenQuestionMarks(len(mobileList))
|
||
sql += " AND (t1.tel1 IN (" + questionMarks + ") OR t1.tel2 IN (" + questionMarks + `)
|
||
OR (SELECT
|
||
COUNT(*)
|
||
FROM casbin_rule t2
|
||
JOIN user t3 ON t3.user_id = t2.v0 AND t3.mobile IN (` + questionMarks + `)
|
||
WHERE t2.v1 = CONCAT(?, t1.id)
|
||
) > 0)
|
||
`
|
||
sqlParams = append(sqlParams, mobileList, mobileList, mobileList, autils.NewStoreBossRole(-1).GetFullName())
|
||
}
|
||
err = dao.GetRows(db, &storeList, sql, sqlParams...)
|
||
return storeList, err
|
||
}
|