From 0fbe4d7024d6b1f2618bc67d3c999265e784b30f Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 6 Sep 2019 10:16:09 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E6=96=B0=E8=AE=A2=E5=8D=95=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E5=8F=91=E9=80=81=E7=9F=AD=E4=BF=A1=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jxcallback/scheduler/defsch/defsch.go | 58 +++++++++--------- business/jxutils/smsmsg/smsmsg.go | 61 +++++++++++++++++++ business/jxutils/smsmsg/smsmsg_test.go | 21 +++++++ globals/api/api.go | 7 ++- 4 files changed, 116 insertions(+), 31 deletions(-) create mode 100644 business/jxutils/smsmsg/smsmsg.go create mode 100644 business/jxutils/smsmsg/smsmsg_test.go diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index 8f0965732..29e0b84b6 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -8,6 +8,7 @@ import ( "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/jxutils/smsmsg" "git.rosy.net.cn/jx-callback/business/msghub" "git.rosy.net.cn/baseapi/utils" @@ -184,10 +185,7 @@ func init() { } } if isAcceptIt { - utils.CallFuncAsync(func() { - netprinter.PrintOrderByOrder(jxcontext.AdminCtx, order) - weixinmsg.NotifyNewOrder(order) - }) + sch.notifyNewOrder(order) msghub.OnNewOrder(order) } else { partner.CurOrderManager.OnOrderMsg(order, "黑名单拒单", "") @@ -307,10 +305,7 @@ func (s *DefScheduler) OnOrderNew(order *model.GoodsOrder, isPending bool) (err if order.Status >= model.OrderStatusNew { s.resetTimer(savedOrderInfo, nil, isPending) if !isPending && order.Status >= model.OrderStatusAccepted { // 有订单消息错序,先收到接单消息,再收到新订单消息,导致接单TIMER不动作,这里补一下 - utils.CallFuncAsync(func() { - netprinter.PrintOrderByOrder(jxcontext.AdminCtx, order) - weixinmsg.NotifyNewOrder(order) - }) + s.notifyNewOrder(order) msghub.OnNewOrder(order) } } @@ -329,13 +324,6 @@ func (s *DefScheduler) OnOrderStatusChanged(order *model.GoodsOrder, status *mod savedOrderInfo := s.loadSavedOrderFromMap(status, false) savedOrderInfo.SetOrder(order) - // if status.Status == model.OrderStatusNew { - // if !isPending { - // utils.CallFuncAsync(func() { - // weixinmsg.NotifyNewOrder(savedOrderInfo.order) - // }) - // } - // } if (model.IsOrderUnlockStatus(status.Status)) || (order.LockStatus == model.OrderStatusUnknown && (status.Status > model.OrderStatusUnknown || status.Status == model.OrderStatusRefuseFailedGetGoods)) { // 只处理状态转换,一般消息不处理 if status.Status == model.OrderStatusRefuseFailedGetGoods && order.Status != model.OrderStatusFinishedPickup && !model.IsOrderFinalStatus(order.Status) { @@ -374,9 +362,7 @@ func (s *DefScheduler) OnOrderStatusChanged(order *model.GoodsOrder, status *mod status.Status == model.OrderStatusAgreeFailedGetGoods || status.Status == model.OrderStatusDeliverFailed { if status.Status == model.OrderStatusApplyCancel { - utils.CallFuncAsync(func() { - weixinmsg.NotifyUserApplyCancel(savedOrderInfo.order, status.Remark) - }) + s.notifyUserApplyCancel(savedOrderInfo.order, status.Remark) } msghub.OnKeyOrderStatusChanged(savedOrderInfo.order) } @@ -483,9 +469,7 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo if err := s.SelfDeliverDelivering(savedOrderInfo.order, bill.CourierMobile); err != nil { partner.CurOrderManager.OnOrderMsg(order, "自送出设置失败", err.Error()) } - utils.CallFuncAsync(func() { - weixinmsg.NotifyWaybillStatus(bill, order, isBillAlreadyCandidate) - }) + s.notify3rdPartyWaybill(order, bill, isBillAlreadyCandidate) } else { s.swtich2SelfDeliverWithRetry(savedOrderInfo, bill, 2, 10*time.Second) } @@ -496,9 +480,7 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo globals.SugarLogger.Infof("OnWaybillStatusChanged Accepted orderID:%s got multiple bill:%v", order.VendorOrderID, bill) } if isBillAlreadyCandidate && !s.isWaybillCourierSame(savedOrderInfo, bill) && !model.IsWaybillPlatformOwn(bill) { - utils.CallFuncAsync(func() { - weixinmsg.NotifyWaybillStatus(bill, order, isBillAlreadyCandidate) - }) + s.notify3rdPartyWaybill(order, bill, isBillAlreadyCandidate) } flag2Clear := model.WaybillVendorID2Mask(bill.WaybillVendorID) order.Flag &= ^model.OrderFlagMaskFailedGetGoods @@ -579,9 +561,7 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo } } if !isPending { - utils.CallFuncAsync(func() { - weixinmsg.NotifyWaybillStatus(bill, order, false) - }) + s.notify3rdPartyWaybill(order, bill, false) } // case model.WaybillStatusNeverSend: // 平台不配送,直接创建三方运单 // s.resetTimer(savedOrderInfo, bill, isPending) @@ -710,9 +690,7 @@ func (s *DefScheduler) swtich2SelfDeliverWithRetry(savedOrderInfo *WatchOrderInf partner.CurOrderManager.OnOrderMsg(order, "转商家自配送失败", errStr) } } else { - utils.CallFuncAsync(func() { - weixinmsg.NotifyWaybillStatus(bill, order, false) - }) + s.notify3rdPartyWaybill(order, bill, false) s.removeWaybillFromMap(savedOrderInfo, order.VendorID) partner.CurOrderManager.OnOrderMsg(order, "转自送成功", "") } @@ -1112,3 +1090,23 @@ func OnDefSchConfChanged(key, value string) { } } } + +func (s *DefScheduler) notifyNewOrder(order *model.GoodsOrder) { + utils.CallFuncAsync(func() { + netprinter.PrintOrderByOrder(jxcontext.AdminCtx, order) + weixinmsg.NotifyNewOrder(order) + smsmsg.NotifyNewOrder(order) + }) +} + +func (s *DefScheduler) notifyUserApplyCancel(order *model.GoodsOrder, cancelReason string) { + utils.CallFuncAsync(func() { + weixinmsg.NotifyUserApplyCancel(order, cancelReason) + }) +} + +func (s *DefScheduler) notify3rdPartyWaybill(order *model.GoodsOrder, bill *model.Waybill, isBillAlreadyCandidate bool) { + utils.CallFuncAsync(func() { + weixinmsg.NotifyWaybillStatus(bill, order, isBillAlreadyCandidate) + }) +} diff --git a/business/jxutils/smsmsg/smsmsg.go b/business/jxutils/smsmsg/smsmsg.go new file mode 100644 index 000000000..4f134ef66 --- /dev/null +++ b/business/jxutils/smsmsg/smsmsg.go @@ -0,0 +1,61 @@ +package smsmsg + +import ( + "fmt" + + aliyunsmsclient "github.com/KenmyZhang/aliyun-communicate" + + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/baseapi/utils/errlist" + "git.rosy.net.cn/jx-callback/business/jxutils" + "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" +) + +var ( + warningMap = map[string]int{ + "isv.AMOUNT_NOT_ENOUGH": 1, + "isv.ACCOUNT_ABNORMAL": 1, + "isv.OUT_OF_SERVICE": 1, + "isv.DAY_LIMIT_CONTROL": 1, + } +) + +func SendSMSMsg(mobileList []string, signName, templateCode string, templateParam map[string]interface{}) (err error) { + errList := errlist.New() + for _, mobileNum := range mobileList { + if mobileNum != "" { + globals.SugarLogger.Debugf("SendSMSMsg mobileNum:%s, templateCode:%s", mobileNum, templateCode) + if response, err := api.SMSClient.Execute(globals.AliKey, globals.AliSecret, mobileNum, signName, templateCode, string(utils.MustMarshal(templateParam))); err != nil { + globals.SugarLogger.Warnf("SendSMSMsg mobileNum:%s failed with error:%v", mobileNum, err) + errList.AddErr(err) + } else if response.Code != aliyunsmsclient.ResponseCodeOk { + errMsg := fmt.Sprintf("SendSMSMsg mobileNum:%s failed with response:%s", mobileNum, utils.Format4Output(response, false)) + errList.AddErr(fmt.Errorf(errMsg)) + if warningMap[response.Code] == 1 { + globals.SugarLogger.Warnf(errMsg) + } else { + globals.SugarLogger.Infof(errMsg) + } + } + } + } + return errList.GetErrListAsOne() +} + +func NotifyNewOrder(order *model.GoodsOrder) (err error) { + store := &model.Store{} + store.ID = jxutils.GetSaleStoreIDFromOrder(order) + if err = dao.GetEntity(dao.GetDB(), store); err == nil { + if store.SMSNotify != 0 { + err = SendSMSMsg([]string{store.Tel1, store.Tel2}, "京西菜市", "SMS_173477895", map[string]interface{}{ + "daySeq": order.OrderSeq, + "consigneeName": order.ConsigneeName, + "payMoney": order.ActualPayPrice, + }) + } + } + return err +} diff --git a/business/jxutils/smsmsg/smsmsg_test.go b/business/jxutils/smsmsg/smsmsg_test.go new file mode 100644 index 000000000..2dcf4c371 --- /dev/null +++ b/business/jxutils/smsmsg/smsmsg_test.go @@ -0,0 +1,21 @@ +package smsmsg + +import ( + "testing" + + "git.rosy.net.cn/jx-callback/globals/testinit" +) + +func init() { + testinit.Init() + // api2.Init() +} + +func TestSendSMSMsg(t *testing.T) { + err := SendSMSMsg([]string{"18180948107"}, "京西菜市", "SMS_84655036", map[string]interface{}{ + "code": 123456, + }) + if err != nil { + t.Fatal(err) + } +} diff --git a/globals/api/api.go b/globals/api/api.go index c94f55425..ff4a9529d 100644 --- a/globals/api/api.go +++ b/globals/api/api.go @@ -3,6 +3,8 @@ package api import ( "time" + aliyunsmsclient "github.com/KenmyZhang/aliyun-communicate" + "git.rosy.net.cn/baseapi/platformapi" "git.rosy.net.cn/baseapi/platformapi/autonavi" "git.rosy.net.cn/baseapi/platformapi/baidunavi" @@ -56,7 +58,8 @@ var ( YilianyunAPI2 *yilianyunapi.API ZhongwuAPI *zhongwuapi.API - Cacher cache.ICacher + Cacher cache.ICacher + SMSClient *aliyunsmsclient.SmsClient ) func init() { @@ -153,4 +156,6 @@ func Init() { YilianyunAPI = yilianyunapi.New(beego.AppConfig.DefaultString("yilianyunClientID", ""), beego.AppConfig.DefaultString("yilianyunClientSecret", "")) YilianyunAPI2 = yilianyunapi.New(beego.AppConfig.DefaultString("yilianyunClientID2", ""), beego.AppConfig.DefaultString("yilianyunClientSecret2", "")) ZhongwuAPI = zhongwuapi.New(beego.AppConfig.DefaultInt("zhongwuAppID", 0), beego.AppConfig.DefaultString("zhongwuAppSecret", "")) + + SMSClient = aliyunsmsclient.New("http://dysmsapi.aliyuncs.com/") }