220 lines
8.0 KiB
Go
220 lines
8.0 KiB
Go
package weixinmsg
|
||
|
||
import (
|
||
"fmt"
|
||
"strings"
|
||
"time"
|
||
|
||
"git.rosy.net.cn/baseapi/utils"
|
||
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||
"git.rosy.net.cn/jx-callback/business/model"
|
||
"git.rosy.net.cn/jx-callback/globals"
|
||
"git.rosy.net.cn/jx-callback/globals/api"
|
||
"github.com/astaxie/beego/orm"
|
||
)
|
||
|
||
const (
|
||
WX_TO_ORDER_PAGE_URL = "http://www.jx.scaqda.com/jx/h5/#/?jxStoreId="
|
||
WX_TO_SHOW_COMMENTS_DETAIL_URL = "http://www.jx.scaqda.com/jx/h5/#/assess-list?jxStoreId=" //展示差评详情的页面
|
||
//新订单模板消息文字颜色
|
||
WX_NEW_ORDER_TEMPLATE_COLOR = "#173177"
|
||
WX_HIGHLEVEL_TEMPLATE_COLOR = "#FF0000" //红色
|
||
WX_TEMPLATE_VENDERCOLOR_JDDJ = "#47B34F"
|
||
WX_TEMPLATE_VENDERCOLOR_MT = "#F4A800"
|
||
WX_TEMPLATE_VENDERCOLOR_ELM = "#0191EA" //蓝色
|
||
WX_TEMPLATE_VENDERCOLOR_BAD_COMMENTS = "#4F4DA0"
|
||
|
||
WX_NEWORDER_TEMPLATE_ID = "_DtNGwmOeR6TkkTVUblxLIlkV2MAPOX57TkvfdqG6nY" //微信新订单推送
|
||
WX_MTPS_DELIVERY_GRABDONE_TEMPLATE_ID = "h4dkON6AgnHz1XmaksEUB_8Bcir4V8MSexUhC149pPE" //微信美团配送员接单推送
|
||
WX_MTPS_DELIVERY_DONE_TEMPLATE_ID = "YXdCrQAHZlcZX1htYUiarrLmtkmKAjp7rynjwObgODo" //微信美团配送员配送完成推送
|
||
WX_MTPS_UNABLE_DELIVER_TEMPLATE_ID = "ZFph5Hp7oLlrzVRXbsKIC_StmaBeB9Dlp4tlHeAmUQ8" //微信美团配送配送能力不足推送
|
||
WX_MTPS_DELIVERY_EXCEPTION_TEMPLATE_ID = "RkfOFHgR1N75L4-a6Gv0DljpCsVfOHhLm_vyXh8MR-w" //微信美团配送异常推送
|
||
WX_BAD_COMMENT_PUSH_TEMPLATE_ID = "zMZH5Ek0k1OHlWnsDb98UaHEOlkJZYok2QOJUfwfJWs" //微信差评消息推送
|
||
|
||
WX_DADA_DELIVERY_GRABDONE_TEMPLATE_ID = "h4dkON6AgnHz1XmaksEUB_8Bcir4V8MSexUhC149pPE" //微信达达众包配送员接单推送
|
||
WX_DADA_DELIVERY_DONE_TEMPLATE_ID = "YXdCrQAHZlcZX1htYUiarrLmtkmKAjp7rynjwObgODo" //微信达达众包配送员配送完成推送
|
||
)
|
||
|
||
var (
|
||
venderColors = map[int]string{
|
||
model.VendorIDJD: WX_TEMPLATE_VENDERCOLOR_JDDJ,
|
||
model.VendorIDMTWM: WX_TEMPLATE_VENDERCOLOR_MT,
|
||
model.VendorIDELM: WX_TEMPLATE_VENDERCOLOR_ELM,
|
||
model.VendorIDEBAI: WX_TEMPLATE_VENDERCOLOR_ELM,
|
||
}
|
||
)
|
||
|
||
func GetWeixinOpenIDsFromStoreID(storeID int) (retVal []string) {
|
||
db := orm.NewOrm()
|
||
var lists []orm.ParamsList
|
||
num, err := db.Raw(`
|
||
SELECT openid
|
||
FROM weixins t1
|
||
JOIN
|
||
(SELECT id
|
||
FROM weixins
|
||
WHERE jxstoreid = ? AND parentid = -1) t2 ON t2.id = t1.parentid
|
||
WHERE openid IS NOT NULL
|
||
UNION
|
||
SELECT openid
|
||
FROM weixins
|
||
WHERE jxstoreid = ? AND parentid = -1 AND openid IS NOT NULL
|
||
`, storeID, storeID).ValuesList(&lists)
|
||
if err != nil || num == 0 {
|
||
globals.SugarLogger.Infof("GetWeixinOpenIDsFromStoreID can not find openid for store:%d, num:%d, error:%v", storeID, num, err)
|
||
return retVal
|
||
}
|
||
for _, v := range lists {
|
||
retVal = append(retVal, v[0].(string))
|
||
}
|
||
if !globals.ReallyCallPlatformAPI {
|
||
// todo,调试,只发给我
|
||
globals.SugarLogger.Debugf("GetWeixinOpenIDsFromStoreID store:%d, openids:%v", storeID, retVal)
|
||
if storeID == 100146 {
|
||
retVal = []string{"oYN_ust9hXKEvEv0X6Mq6nlAWs_E"}
|
||
} else {
|
||
retVal = nil
|
||
}
|
||
}
|
||
return retVal
|
||
}
|
||
|
||
func SendMsgToStore(storeID int, templateID, downloadURL string, data interface{}) (err error) {
|
||
if globals.ReallySendWeixinMsg {
|
||
openIDs := GetWeixinOpenIDsFromStoreID(storeID)
|
||
successCount := 0
|
||
for _, openID := range openIDs {
|
||
if err2 := api.WeixinAPI.MessageTemplateSend(openID, templateID, downloadURL, nil, data); err2 == nil {
|
||
successCount++
|
||
} else {
|
||
err = err2
|
||
}
|
||
}
|
||
if successCount > 0 {
|
||
err = nil // 只要成功一个都当成成功
|
||
}
|
||
if err != nil {
|
||
globals.SugarLogger.Debugf("SendMsgToStore all failed storeID:%d, templateID:%s, error:%v", storeID, templateID, err)
|
||
}
|
||
}
|
||
return err
|
||
}
|
||
|
||
func NotifyNewOrder(order *model.GoodsOrder) (err error) {
|
||
globals.SugarLogger.Debugf("NotifyNewOrder orderID:%s", order.VendorOrderID)
|
||
if !model.IsOrderSolid(order) {
|
||
globals.SugarLogger.Infof("NotifyNewOrder orderID:%s is not solid", order.VendorOrderID)
|
||
return nil
|
||
}
|
||
sb := new(strings.Builder)
|
||
sb.WriteString("老板,")
|
||
sb.WriteString(order.ConsigneeName)
|
||
sb.WriteString("购买了商品")
|
||
sb.WriteString(order.Skus[0].SkuName)
|
||
sb.WriteString("共")
|
||
sb.WriteString(utils.Int2Str(order.Skus[0].Count))
|
||
sb.WriteString("份(")
|
||
sb.WriteString(jxutils.IntPrice2StandardString(order.Skus[0].SalePrice))
|
||
sb.WriteString("元/份)等,共支付了")
|
||
sb.WriteString(jxutils.IntPrice2StandardString(order.ActualPayPrice))
|
||
sb.WriteString("元")
|
||
data := map[string]interface{}{
|
||
"first": map[string]interface{}{
|
||
"value": sb.String(),
|
||
"color": WX_NEW_ORDER_TEMPLATE_COLOR,
|
||
},
|
||
"Day": map[string]interface{}{
|
||
"value": FormatDeliveryTime(order),
|
||
"color": WX_NEW_ORDER_TEMPLATE_COLOR,
|
||
},
|
||
"orderId": map[string]interface{}{
|
||
"value": order.VendorOrderID,
|
||
"color": WX_NEW_ORDER_TEMPLATE_COLOR,
|
||
},
|
||
"orderType": map[string]interface{}{
|
||
"value": fmt.Sprintf("%s 第%d号订单", model.VendorChineseNames[order.VendorID], order.OrderSeq),
|
||
"color": venderColors[order.VendorID],
|
||
},
|
||
"customerName": map[string]interface{}{
|
||
"value": order.ConsigneeName,
|
||
"color": WX_NEW_ORDER_TEMPLATE_COLOR,
|
||
},
|
||
"customerPhone": map[string]interface{}{
|
||
"value": order.ConsigneeMobile,
|
||
"color": WX_NEW_ORDER_TEMPLATE_COLOR,
|
||
},
|
||
}
|
||
storeID := jxutils.GetJxStoreIDFromOrder(order)
|
||
return SendMsgToStore(storeID, WX_NEWORDER_TEMPLATE_ID, fmt.Sprintf("%s%d", WX_TO_ORDER_PAGE_URL, storeID), data)
|
||
}
|
||
|
||
func NotifyWaybillStatus(bill *model.Waybill, order *model.GoodsOrder) error {
|
||
globals.SugarLogger.Debugf("NotifyWaybillStatus orderID:%s bill:%v", order.VendorOrderID, bill)
|
||
if !model.IsOrderSolid(order) {
|
||
globals.SugarLogger.Infof("NotifyWaybillStatus orderID:%s is not solid", order.VendorOrderID)
|
||
return nil
|
||
}
|
||
var title string
|
||
templateID := ""
|
||
remark := ""
|
||
titleColor := ""
|
||
switch bill.Status {
|
||
case model.WaybillStatusAccepted:
|
||
if bill.WaybillVendorID == model.VendorIDMTPS {
|
||
templateID = WX_MTPS_DELIVERY_GRABDONE_TEMPLATE_ID
|
||
} else if bill.WaybillVendorID == model.VendorIDDada {
|
||
templateID = WX_DADA_DELIVERY_GRABDONE_TEMPLATE_ID
|
||
}
|
||
titleColor = WX_HIGHLEVEL_TEMPLATE_COLOR
|
||
remark = FormatDeliveryTime(order)
|
||
title = fmt.Sprintf("%s 第%d号订单长时间无人配送,我们已安排%s配送员%s电话号码%s负责配送。^_^", model.VendorChineseNames[bill.OrderVendorID], order.OrderSeq, model.VendorChineseNames[bill.WaybillVendorID], bill.CourierName, bill.CourierMobile)
|
||
case model.WaybillStatusDelivered:
|
||
if bill.WaybillVendorID == model.VendorIDMTPS {
|
||
templateID = WX_MTPS_DELIVERY_DONE_TEMPLATE_ID
|
||
} else if bill.WaybillVendorID == model.VendorIDDada {
|
||
templateID = WX_DADA_DELIVERY_DONE_TEMPLATE_ID
|
||
}
|
||
titleColor = venderColors[bill.OrderVendorID]
|
||
title = fmt.Sprintf("%s 第%d号订单的配送完成", model.VendorChineseNames[bill.OrderVendorID], order.OrderSeq)
|
||
}
|
||
if templateID != "" {
|
||
data := map[string]interface{}{
|
||
"first": map[string]interface{}{
|
||
"value": title,
|
||
"color": titleColor,
|
||
},
|
||
"keyword1": map[string]interface{}{
|
||
"value": bill.VendorOrderID,
|
||
"color": WX_NEW_ORDER_TEMPLATE_COLOR,
|
||
},
|
||
"keyword2": map[string]interface{}{
|
||
"value": fmt.Sprintf("%s(%s)", bill.CourierName, model.VendorChineseNames[bill.WaybillVendorID]),
|
||
"color": WX_NEW_ORDER_TEMPLATE_COLOR,
|
||
},
|
||
"keyword3": map[string]interface{}{
|
||
"value": bill.CourierMobile,
|
||
"color": WX_NEW_ORDER_TEMPLATE_COLOR,
|
||
},
|
||
"remark": map[string]interface{}{
|
||
"value": remark,
|
||
"color": WX_NEW_ORDER_TEMPLATE_COLOR,
|
||
},
|
||
}
|
||
return SendMsgToStore(jxutils.GetJxStoreIDFromOrder(order), templateID, "", data)
|
||
}
|
||
return nil
|
||
}
|
||
|
||
func FormatDeliveryTime(order *model.GoodsOrder) string {
|
||
var tmpTime time.Time
|
||
if order.ExpectedDeliveredTime == utils.DefaultTimeValue {
|
||
tmpTime = order.OrderCreatedAt.Add(1 * time.Hour)
|
||
} else {
|
||
tmpTime = order.ExpectedDeliveredTime
|
||
}
|
||
left := tmpTime.Sub(time.Now()) / time.Minute
|
||
leftHours := left / 60
|
||
leftMinutes := left % 60
|
||
return fmt.Sprintf("请于%s前送达(剩余时间%d小时%d分钟)", utils.Time2Str(tmpTime), leftHours, leftMinutes)
|
||
}
|