Files
jx-callback/business/jxutils/unipush/push.go
richboo111 4b3201c807 1
2023-07-17 09:28:45 +08:00

267 lines
8.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package push
import (
"encoding/json"
"errors"
"fmt"
"log"
"time"
"git.rosy.net.cn/jx-callback/business/authz/autils"
"git.rosy.net.cn/jx-callback/globals/api2"
"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/globals"
"git.rosy.net.cn/jx-callback/globals/api"
)
const (
SoundsFileNewOrder = "newOrder.caf"
SoundsFileNewAfsOrder = "afsOrder.caf"
SoundsFileNewCancelOrder = "cancelOrder.caf"
SoundsFileNewImMsg = "newMsg.caf"
FlagOrder = 1 //订单渠道
FlagIm = 2 //消息类型
)
// NotifyNewOrder 推送新订单
func NotifyNewOrder(order *model.GoodsOrder) {
storeId := order.StoreID
if storeId <= model.NO {
storeId = order.JxStoreID
}
msg := MsgContext{}
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), storeId, 0, "")
if err != nil || storeDetail == nil {
return
}
cid, err := GetStoreBoosCID(storeId)
if err != nil {
globals.SugarLogger.Errorf("新订单推送,获取门店老板CID错误:%v", err)
return
}
msg.MsgType = "newOrder"
msg.VendorName = model.VendorChineseNames[order.VendorID]
msg.OrderSqs = utils.Int2Str(order.OrderSeq)
msg.StoreTitle = storeDetail.Name
msg.Context = "老板,你有新的订单了!"
msg.VendorOrderId = order.VendorOrderID
context, _ := json.Marshal(msg)
body := fmt.Sprintf(msg.Context+"(%s)", model.VendorChineseNames[order.VendorID]+"#"+msg.OrderSqs+"号订单")
pushMsgByUniApp(storeDetail.ID, storeDetail.Name, cid, string(context), body, SoundsFileNewOrder, FlagOrder)
}
func NotifyAfsOrder(afsOrder *model.AfsOrder) (err error) {
storeId := afsOrder.StoreID
if storeId <= model.NO {
storeId = afsOrder.JxStoreID
}
msg := MsgContext{}
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), storeId, 0, "")
if err != nil || storeDetail == nil {
return
}
cid, err := GetStoreBoosCID(storeId)
if err != nil {
globals.SugarLogger.Errorf("售后单,获取门店老板CID错误:%v", err)
return
}
msg.MsgType = "newAfsOrder"
msg.VendorName = model.VendorChineseNames[afsOrder.VendorID]
msg.OrderSqs = afsOrder.VendorOrderID
msg.StoreTitle = storeDetail.Name
msg.Context = "老板订单申请退款了!"
context, _ := json.Marshal(msg)
body := fmt.Sprintf(msg.Context+"(%s)", model.VendorChineseNames[afsOrder.VendorID]+"#"+msg.OrderSqs+"号订单")
pushMsgByUniApp(storeDetail.ID, storeDetail.Name, cid, string(context), body, SoundsFileNewAfsOrder, FlagOrder)
return err
}
func NotifyOrderCanceled(order *model.GoodsOrder) (err error) {
storeId := order.StoreID
if storeId <= model.NO {
storeId = order.JxStoreID
}
msg := MsgContext{}
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), storeId, 0, "")
if err != nil || storeDetail == nil {
return
}
cid, err := GetStoreBoosCID(storeId)
if err != nil {
globals.SugarLogger.Errorf("取消单,获取门店老板CID错误:%v", err)
return
}
msg.MsgType = "newCancelOrder"
msg.VendorName = model.VendorChineseNames[order.VendorID]
msg.OrderSqs = utils.Int2Str(order.OrderSeq)
msg.StoreTitle = storeDetail.Name
msg.Context = "老板订单被取消了!"
context, _ := json.Marshal(msg)
body := fmt.Sprintf(msg.Context+"(%s)", model.VendorChineseNames[order.VendorID]+"#"+msg.OrderSqs+"号订单")
pushMsgByUniApp(storeDetail.ID, storeDetail.Name, cid, string(context), body, SoundsFileNewCancelOrder, FlagOrder)
return err
}
// NotifyImNewMessage IM 新消息通知
func NotifyImNewMessage(vendorStoreID string, vendorID int, offMsg string) error {
if len(vendorStoreID) == 0 {
return nil
}
var msg = MsgContext{}
store, err := dao.GetStoreBaseByVendorStoreID(vendorStoreID, vendorID)
if err != nil {
return fmt.Errorf("未查到此门店/门店未与平台正常绑定:%s", vendorStoreID)
}
cid, err := GetStoreBoosCID(store.ID)
if err != nil {
globals.SugarLogger.Errorf("IM消息推送,获取门店老板CID错误 %v", err)
return err
}
fmt.Print(cid)
msg.MsgType = "newImMsg"
msg.VendorName = model.VendorChineseNames[vendorID]
msg.StoreTitle = store.Name
msg.Context = offMsg
context, _ := json.Marshal(msg)
body := fmt.Sprintf("老板,你有新的用户消息,请及时查看!"+"(%s)", model.VendorChineseNames[vendorID])
pushMsgByUniApp(store.ID, store.Name, cid, string(context), body, SoundsFileNewImMsg, FlagIm)
return err
}
// GetStoreBoosCID /************************************************************/
func GetStoreBoosCID(storeId int) ([]string, error) {
// 根据订单获取门店的老板cid
userIDList, err2 := api2.RoleMan.GetRoleUserList(autils.NewStoreBossRole(storeId))
if err2 != nil {
return nil, err2
}
userList, _, err := dao.GetUsers(dao.GetDB(), 0, "", userIDList, nil, nil, 0, 100)
if err != nil || len(userList) <= model.NO {
return nil, errors.New("门店老板信息获取异常")
}
var cId = make([]string, 0, len(userList))
for _, v := range userList {
if v.CID != "" {
cId = append(cId, v.CID)
}
}
if len(cId) <= model.NO {
return nil, fmt.Errorf("门店[%d],暂无CID,无法使用UniApp推送", storeId)
}
return cId, nil
}
type MsgContext struct {
MsgType string `json:"msg_type"` // 订单类型[新订单/售后单/取消单]
StoreTitle string `json:"store_title"` // 门店名称
Context string `json:"context"` // 消息文本
VendorName string `json:"vendor_name"` // 平台名称
OrderSqs string `json:"order_sqs"` // 订单流水号
VendorOrderId string `json:"vendor_order_id"` // 订单id
}
func pushMsgByUniApp(storeId int, storeName string, cID []string, msg string, body string, soundsFileName string, flag int) {
var (
errs []error
options = make(map[string]interface{}, 0)
)
if flag == FlagOrder {
options = map[string]interface{}{
"XM": map[string]interface{}{
"/extra.channel_id": "108892", // 订单类填写108892消息通知类填写108898
},
"HW": map[string]interface{}{
"/message/android/category": "WORK", // 订单类填写WORK消息通知类填写IM
},
"OP": map[string]interface{}{
"/channel_id": "10110", // 订单类填写10110消息通知类填写10111
},
"VV": map[string]interface{}{
"/category": "ORDER", // 订单类填写ORDER消息通知类填写IM
},
}
} else if flag == FlagIm {
options = map[string]interface{}{
"XM": map[string]interface{}{
"/extra.channel_id": "108898", // 订单类填写108892消息通知类填写108898
},
"HW": map[string]interface{}{
"/message/android/category": "IM", // 订单类填写WORK消息通知类填写IM
},
"OP": map[string]interface{}{
"/channel_id": "10111", // 订单类填写10110消息通知类填写10111
},
"VV": map[string]interface{}{
"/category": "IM", // 订单类填写ORDER消息通知类填写IM
},
}
}
for _, v := range cID {
param := map[string]interface{}{
"request_id": utils.Int64ToStr(time.Now().Unix()) + "_" + utils.Int2Str(storeId),
"settings": map[string]interface{}{
"ttl": 7200000,
},
"audience": map[string]interface{}{
"cid": []string{v},
},
"push_message": map[string]interface{}{
"transmission": msg,
},
"push_channel": map[string]interface{}{
"android": map[string]interface{}{
"ups": map[string]interface{}{
"notification": map[string]interface{}{
"title": storeName,
"body": body,
"click_type": "startapp",
"notify_id": time.Now().Unix(), // 每次通知需要不一样 范围0-2147483647
},
"options": options,
},
},
"ios": map[string]interface{}{
"type": "notify",
"payload": msg,
"aps": map[string]interface{}{
"alert": map[string]interface{}{
"title": storeName,
"body": body,
},
"content-available": 0,
"sound": soundsFileName,
},
"auto_badge": "+1",
},
},
}
if err := api.UniAppApi.SendMsgByUinApp(param); err != nil {
errs = append(errs, err)
}
}
if len(errs) != 0 {
log.Printf("uinapp 消息推送错误:%s", utils.Format4Output(errs, false))
}
}