- 门店状态变化添加发送微信通知消息
This commit is contained in:
@@ -196,7 +196,7 @@ func SendMsg2Somebody(ctx *jxcontext.Context, mobileNum, verifyCode, msgType, ms
|
||||
for _, v := range receiveMsgUsersMap[msgType] {
|
||||
user, err2 := dao.GetUserByID(db, "name", v)
|
||||
if err2 == nil {
|
||||
msg.SendUserMessage(dingdingapi.MsgTyeText, user.GetID(), msgType, msgContent)
|
||||
msg.SendUserMessage(dingdingapi.MsgTyeText, user, msgType, msgContent)
|
||||
} else if err == nil {
|
||||
err = err2
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"git.rosy.net.cn/jx-callback/business/auth2"
|
||||
"git.rosy.net.cn/jx-callback/business/authz/autils"
|
||||
|
||||
"git.rosy.net.cn/baseapi/platformapi/autonavi"
|
||||
"git.rosy.net.cn/baseapi/platformapi/baidunavi"
|
||||
@@ -99,14 +99,6 @@ var (
|
||||
"11:00:00",
|
||||
"15:00:00",
|
||||
}
|
||||
|
||||
mobileGroupMap = map[string]map[string]int{
|
||||
"18650801532": map[string]int{ // 陈磊
|
||||
"13540967462": 1, // 蒋龙丹
|
||||
"13708196093": 1, // 顾子杭
|
||||
"13980795039": 1, // 赵凌兰
|
||||
},
|
||||
}
|
||||
)
|
||||
|
||||
// todo 门店绑定信息可以考虑以数组形式返回,而不是现在这样
|
||||
@@ -1537,9 +1529,9 @@ func SendAlarmVendorSnapshot(ctx *jxcontext.Context, parentTask tasksch.ITask, p
|
||||
}
|
||||
curSnapshotMap := make(map[string]*model.VendorStoreSnapshot)
|
||||
curSnapshotMap2 := make(map[int]map[int]*model.VendorStoreSnapshot)
|
||||
alarmSnapshotMap := make(map[int][]*model.VendorStoreSnapshot)
|
||||
curSnapshotGroupMap := make(map[int][]*model.VendorStoreSnapshot)
|
||||
|
||||
alarmSnapshotMap := make(map[int][]*model.VendorStoreSnapshot)
|
||||
txtAlarmSnapshotMap := make(map[int][]*model.VendorStoreSnapshot)
|
||||
// 之前是开店当前是关店的,或营业时间缩短的
|
||||
for _, v := range curSnapshotList {
|
||||
@@ -1579,6 +1571,7 @@ func SendAlarmVendorSnapshot(ctx *jxcontext.Context, parentTask tasksch.ITask, p
|
||||
|
||||
db := dao.GetDB()
|
||||
storeDetailMap := make(map[int]*dao.StoreDetail)
|
||||
userMap2 := make(map[string]*model.User)
|
||||
userMap := make(map[string]map[int]int)
|
||||
userMapTxt := make(map[string][]*model.VendorStoreSnapshot)
|
||||
for storeID, list := range alarmSnapshotMap {
|
||||
@@ -1586,132 +1579,126 @@ func SendAlarmVendorSnapshot(ctx *jxcontext.Context, parentTask tasksch.ITask, p
|
||||
if storeDetail != nil {
|
||||
storeDetailMap[storeID] = storeDetail
|
||||
|
||||
// userList, _ := GetRoleUserList(ctx, autils.NewStoreBossRole(storeID))
|
||||
// for _, mobile := range []string{storeDetail.Tel1, storeDetail.MarketManPhone, storeDetail.OperatorPhone} {
|
||||
// if mobile != "" {
|
||||
// if user, err2 := dao.GetUserByID(db, "mobile", mobile); err2 == nil {
|
||||
// userList = append(userList, user.GetID())
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// for _, userID := range userList {
|
||||
// if userID != "" {
|
||||
// if userMap[userID] == nil {
|
||||
// userMap[userID] = make(map[int]int)
|
||||
// }
|
||||
// userMap[userID][storeID] = 1
|
||||
// if txtAlarmSnapshotMap[storeID] != nil {
|
||||
// userMapTxt[userID] = append(userMapTxt[userID], txtAlarmSnapshotMap[storeID]...)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
var userList []*model.User
|
||||
if roleUserIDList, err := GetRoleUserList(ctx, autils.NewStoreBossRole(storeID)); err == nil {
|
||||
userList, _, _ = dao.GetUsers(db, 0, "", roleUserIDList, "", "", 0, -1)
|
||||
}
|
||||
for _, mobile := range []string{storeDetail.Tel1, storeDetail.MarketManPhone, storeDetail.OperatorPhone} {
|
||||
if mobile != "" {
|
||||
if userMap[mobile] == nil {
|
||||
userMap[mobile] = make(map[int]int)
|
||||
if user, err2 := dao.GetUserByID(db, "mobile", mobile); err2 == nil {
|
||||
userList = append(userList, user)
|
||||
}
|
||||
userMap[mobile][storeID] = 1
|
||||
|
||||
}
|
||||
}
|
||||
processedUser := make(map[string]int)
|
||||
for _, user := range userList {
|
||||
userID := user.GetID()
|
||||
if processedUser[userID] == 0 {
|
||||
processedUser[userID] = 1
|
||||
if userMap[userID] == nil {
|
||||
userMap[userID] = make(map[int]int)
|
||||
userMap2[userID] = user
|
||||
}
|
||||
userMap[userID][storeID] = 1
|
||||
if txtAlarmSnapshotMap[storeID] != nil {
|
||||
userMapTxt[mobile] = append(userMapTxt[mobile], txtAlarmSnapshotMap[storeID]...)
|
||||
userMapTxt[userID] = append(userMapTxt[userID], txtAlarmSnapshotMap[storeID]...)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
var mobileList []string
|
||||
for mobile := range userMap {
|
||||
if mobile != "" && !shouldSkipMobile4SendStoreStatusInfo(mobile) {
|
||||
mobileList = append(mobileList, mobile)
|
||||
}
|
||||
var userList []*model.User
|
||||
for _, user := range userMap2 {
|
||||
userList = append(userList, user)
|
||||
}
|
||||
|
||||
if len(mobileList) > 0 {
|
||||
if len(userList) > 0 {
|
||||
const fixTitle = "门店状态变化"
|
||||
title := fmt.Sprintf("%s:%s-->%s", fixTitle, utils.Time2Str(prevSnapshotList[0].SnapshotAt), utils.Time2Str(curSnapshotList[0].SnapshotAt))
|
||||
task := tasksch.NewParallelTask("SendAlarmVendorSnapshot", tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx,
|
||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||
mobile := batchItemList[0].(string)
|
||||
var dataList []map[string]interface{}
|
||||
captionList := []string{"京西门店ID", "门店名", "城市"}
|
||||
isFirstRow := true
|
||||
for storeID := range userMap[mobile] {
|
||||
prevAlarmMap := prevSnapshotMap2[storeID]
|
||||
curAlarmMap := curSnapshotMap2[storeID]
|
||||
data := map[string]interface{}{
|
||||
"京西门店ID": storeID,
|
||||
"门店名": storeDetailMap[storeID].Store.Name,
|
||||
"城市": storeDetailMap[storeID].CityName,
|
||||
}
|
||||
for _, vendorID := range []int{model.VendorIDJD, model.VendorIDEBAI, model.VendorIDMTWM} {
|
||||
if isFirstRow {
|
||||
captionList = append(captionList, model.VendorChineseNames[vendorID]+"ID",
|
||||
model.VendorChineseNames[vendorID]+"之前状态", model.VendorChineseNames[vendorID]+"当前状态",
|
||||
model.VendorChineseNames[vendorID]+"之前营业时间", model.VendorChineseNames[vendorID]+"当前营业时间")
|
||||
user := batchItemList[0].(*model.User)
|
||||
var excelURL string
|
||||
if user.Type&model.UserTypeOperator != 0 {
|
||||
var dataList []map[string]interface{}
|
||||
captionList := []string{"京西门店ID", "门店名", "城市"}
|
||||
isFirstRow := true
|
||||
for storeID := range userMap[user.GetID()] {
|
||||
prevAlarmMap := prevSnapshotMap2[storeID]
|
||||
curAlarmMap := curSnapshotMap2[storeID]
|
||||
data := map[string]interface{}{
|
||||
"京西门店ID": storeID,
|
||||
"门店名": storeDetailMap[storeID].Store.Name,
|
||||
"城市": storeDetailMap[storeID].CityName,
|
||||
}
|
||||
if prevAlarmMap != nil {
|
||||
data[model.VendorChineseNames[vendorID]+"当前状态"] = ""
|
||||
data[model.VendorChineseNames[vendorID]+"当前营业时间"] = ""
|
||||
if prevSnapshot := prevAlarmMap[vendorID]; prevSnapshot != nil {
|
||||
data[model.VendorChineseNames[vendorID]+"ID"] = prevSnapshot.VendorStoreID
|
||||
data[model.VendorChineseNames[vendorID]+"之前状态"] = model.StoreStatusName[prevSnapshot.Status]
|
||||
data[model.VendorChineseNames[vendorID]+"之前营业时间"] = jxutils.OperationTimeStr4VendorStore(prevSnapshot)
|
||||
if snapshot := curSnapshotMap[prevSnapshot.GenMapKey()]; snapshot != nil {
|
||||
data[model.VendorChineseNames[vendorID]+"当前状态"] = model.StoreStatusName[snapshot.Status]
|
||||
data[model.VendorChineseNames[vendorID]+"当前营业时间"] = jxutils.OperationTimeStr4VendorStore(snapshot)
|
||||
}
|
||||
} else {
|
||||
data[model.VendorChineseNames[vendorID]+"ID"] = ""
|
||||
data[model.VendorChineseNames[vendorID]+"之前状态"] = ""
|
||||
data[model.VendorChineseNames[vendorID]+"之前营业时间"] = ""
|
||||
for _, vendorID := range []int{model.VendorIDJD, model.VendorIDEBAI, model.VendorIDMTWM} {
|
||||
if isFirstRow {
|
||||
captionList = append(captionList, model.VendorChineseNames[vendorID]+"ID",
|
||||
model.VendorChineseNames[vendorID]+"之前状态", model.VendorChineseNames[vendorID]+"当前状态",
|
||||
model.VendorChineseNames[vendorID]+"之前营业时间", model.VendorChineseNames[vendorID]+"当前营业时间")
|
||||
}
|
||||
} else if curAlarmMap != nil {
|
||||
data[model.VendorChineseNames[vendorID]+"之前状态"] = ""
|
||||
data[model.VendorChineseNames[vendorID]+"之前营业时间"] = ""
|
||||
if curSnapshot := curAlarmMap[vendorID]; curSnapshot != nil {
|
||||
data[model.VendorChineseNames[vendorID]+"ID"] = curSnapshot.VendorStoreID
|
||||
data[model.VendorChineseNames[vendorID]+"当前状态"] = model.StoreStatusName[curSnapshot.Status]
|
||||
data[model.VendorChineseNames[vendorID]+"当前营业时间"] = jxutils.OperationTimeStr4VendorStore(curSnapshot)
|
||||
} else {
|
||||
data[model.VendorChineseNames[vendorID]+"ID"] = ""
|
||||
if prevAlarmMap != nil {
|
||||
data[model.VendorChineseNames[vendorID]+"当前状态"] = ""
|
||||
data[model.VendorChineseNames[vendorID]+"当前营业时间"] = ""
|
||||
if prevSnapshot := prevAlarmMap[vendorID]; prevSnapshot != nil {
|
||||
data[model.VendorChineseNames[vendorID]+"ID"] = prevSnapshot.VendorStoreID
|
||||
data[model.VendorChineseNames[vendorID]+"之前状态"] = model.StoreStatusName[prevSnapshot.Status]
|
||||
data[model.VendorChineseNames[vendorID]+"之前营业时间"] = jxutils.OperationTimeStr4VendorStore(prevSnapshot)
|
||||
if snapshot := curSnapshotMap[prevSnapshot.GenMapKey()]; snapshot != nil {
|
||||
data[model.VendorChineseNames[vendorID]+"当前状态"] = model.StoreStatusName[snapshot.Status]
|
||||
data[model.VendorChineseNames[vendorID]+"当前营业时间"] = jxutils.OperationTimeStr4VendorStore(snapshot)
|
||||
}
|
||||
} else {
|
||||
data[model.VendorChineseNames[vendorID]+"ID"] = ""
|
||||
data[model.VendorChineseNames[vendorID]+"之前状态"] = ""
|
||||
data[model.VendorChineseNames[vendorID]+"之前营业时间"] = ""
|
||||
}
|
||||
} else if curAlarmMap != nil {
|
||||
data[model.VendorChineseNames[vendorID]+"之前状态"] = ""
|
||||
data[model.VendorChineseNames[vendorID]+"之前营业时间"] = ""
|
||||
if curSnapshot := curAlarmMap[vendorID]; curSnapshot != nil {
|
||||
data[model.VendorChineseNames[vendorID]+"ID"] = curSnapshot.VendorStoreID
|
||||
data[model.VendorChineseNames[vendorID]+"当前状态"] = model.StoreStatusName[curSnapshot.Status]
|
||||
data[model.VendorChineseNames[vendorID]+"当前营业时间"] = jxutils.OperationTimeStr4VendorStore(curSnapshot)
|
||||
} else {
|
||||
data[model.VendorChineseNames[vendorID]+"ID"] = ""
|
||||
data[model.VendorChineseNames[vendorID]+"当前状态"] = ""
|
||||
data[model.VendorChineseNames[vendorID]+"当前营业时间"] = ""
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
dataList = append(dataList, data)
|
||||
dataList = append(dataList, data)
|
||||
|
||||
isFirstRow = false
|
||||
}
|
||||
excelConf := &excel.Obj2ExcelSheetConfig{
|
||||
Title: fixTitle,
|
||||
Data: dataList,
|
||||
CaptionList: captionList,
|
||||
}
|
||||
excelBin := excel.Obj2Excel([]*excel.Obj2ExcelSheetConfig{excelConf})
|
||||
keyPart := []string{
|
||||
"store_status",
|
||||
mobile,
|
||||
time.Now().Format("20060102T150405") + ".xlsx",
|
||||
}
|
||||
key := "export/" + strings.Join(keyPart, "_")
|
||||
excelURL, err2 := jxutils.UploadExportContent(excelBin, key)
|
||||
if err2 != nil {
|
||||
globals.SugarLogger.Warnf("SendAlarmVendorSnapshot, send %s failed with error:%v", key, err2)
|
||||
}
|
||||
|
||||
var txtAlarm []string
|
||||
for _, v := range userMapTxt[mobile] {
|
||||
curSnapshot := curSnapshotMap[v.GenMapKey()]
|
||||
storeDetail := storeDetailMap[v.StoreID]
|
||||
curStoreStatus := "无店"
|
||||
curOpTimeStr := "无店"
|
||||
if curSnapshot != nil {
|
||||
curStoreStatus = model.StoreStatusName[curSnapshot.Status]
|
||||
curOpTimeStr = jxutils.OperationTimeStr4VendorStore(curSnapshot)
|
||||
isFirstRow = false
|
||||
}
|
||||
txtAlarm = append(txtAlarm, fmt.Sprintf(`## 门店: %s(%d)
|
||||
excelConf := &excel.Obj2ExcelSheetConfig{
|
||||
Title: fixTitle,
|
||||
Data: dataList,
|
||||
CaptionList: captionList,
|
||||
}
|
||||
excelBin := excel.Obj2Excel([]*excel.Obj2ExcelSheetConfig{excelConf})
|
||||
keyPart := []string{
|
||||
"store_status",
|
||||
user.GetMobile(),
|
||||
time.Now().Format("20060102T150405") + ".xlsx",
|
||||
}
|
||||
key := "export/" + strings.Join(keyPart, "_")
|
||||
excelURL, err = jxutils.UploadExportContent(excelBin, key)
|
||||
if err != nil {
|
||||
globals.SugarLogger.Warnf("SendAlarmVendorSnapshot, %s upload %s failed with error:%v", user.GetName(), key, err)
|
||||
}
|
||||
var txtAlarm []string
|
||||
|
||||
for _, v := range userMapTxt[user.GetID()] {
|
||||
curSnapshot := curSnapshotMap[v.GenMapKey()]
|
||||
storeDetail := storeDetailMap[v.StoreID]
|
||||
curStoreStatus := "无店"
|
||||
curOpTimeStr := "无店"
|
||||
if curSnapshot != nil {
|
||||
curStoreStatus = model.StoreStatusName[curSnapshot.Status]
|
||||
curOpTimeStr = jxutils.OperationTimeStr4VendorStore(curSnapshot)
|
||||
}
|
||||
txtAlarm = append(txtAlarm, fmt.Sprintf(`## 门店: %s(%d)
|
||||
- 城市: %s
|
||||
- 平台: %s
|
||||
- 平台ID: %s
|
||||
@@ -1720,33 +1707,33 @@ func SendAlarmVendorSnapshot(ctx *jxcontext.Context, parentTask tasksch.ITask, p
|
||||
- 之前营业时间: %s
|
||||
- 当前营业时间: %s
|
||||
`, storeDetail.Store.Name, v.StoreID, storeDetail.CityName, model.VendorChineseNames[v.VendorID], v.VendorStoreID, model.StoreStatusName[v.Status], curStoreStatus, jxutils.OperationTimeStr4VendorStore(v), curOpTimeStr))
|
||||
}
|
||||
alarmTextStr := "# " + title + " \n" + fmt.Sprintf("[详情点我](%s/billshow/?normal=true&path=%s) \n", globals.BackstageHost, excelURL) + strings.Join(txtAlarm, " \n")
|
||||
sendStoreStatusInfo2Mobile(user, dingdingapi.MsgTypeMarkdown, title, alarmTextStr)
|
||||
} else if len(userMapTxt[user.GetID()]) > 0 {
|
||||
var txtAlarm []string
|
||||
for _, v := range userMapTxt[user.GetID()] {
|
||||
curSnapshot := curSnapshotMap[v.GenMapKey()]
|
||||
// storeDetail := storeDetailMap[v.StoreID]
|
||||
curStoreStatus := "下线"
|
||||
if curSnapshot != nil && curSnapshot.Status == model.StoreStatusOpened {
|
||||
curStoreStatus = "上线"
|
||||
}
|
||||
txtAlarm = append(txtAlarm, fmt.Sprintf("您的门店:%s,平台:%s,%s了", v.StoreName, model.VendorChineseNames[v.VendorID], curStoreStatus))
|
||||
}
|
||||
alarmTextStr := strings.Join(txtAlarm, ",\n")
|
||||
sendStoreStatusInfo2Mobile(user, dingdingapi.MsgTyeText, title, alarmTextStr)
|
||||
}
|
||||
alarmTextStr := "# " + title + " \n" + fmt.Sprintf("[详情点我](%s/billshow/?normal=true&path=%s) \n", globals.BackstageHost, excelURL) + strings.Join(txtAlarm, " \n")
|
||||
sendStoreStatusInfo2Mobile(mobile, title, alarmTextStr)
|
||||
return nil, nil
|
||||
}, mobileList)
|
||||
}, userList)
|
||||
tasksch.HandleTask(task, parentTask, true).Run()
|
||||
_, err = task.GetResult(0)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func shouldSkipMobile4SendStoreStatusInfo(mobile string) bool {
|
||||
return userProvider.GetUser(mobile, auth2.AuthTypeMobile) == nil
|
||||
}
|
||||
|
||||
func sendStoreStatusInfo2Mobile(mobile, title, txtAlarm string) {
|
||||
mobileList := []string{mobile}
|
||||
for mobile := range mobileGroupMap[mobile] {
|
||||
mobileList = append(mobileList, mobile)
|
||||
}
|
||||
|
||||
for _, mobile := range mobileList {
|
||||
if user := userProvider.GetUser(mobile, auth2.AuthTypeMobile); user != nil {
|
||||
globals.SugarLogger.Debugf("sendStoreStatusInfo2Mobile %s, txtAlarm:\n%s", mobile, txtAlarm)
|
||||
msg.SendUserMessage(dingdingapi.MsgTypeMarkdown, user.GetID(), title, txtAlarm)
|
||||
}
|
||||
}
|
||||
func sendStoreStatusInfo2Mobile(user *model.User, msgType, title, txtAlarm string) {
|
||||
msg.SendUserMessage(msgType, user, title, txtAlarm)
|
||||
}
|
||||
|
||||
func SaveAndSendAlarmVendorSnapshot(ctx *jxcontext.Context, vendorIDs, storeIDs []int, isAsync bool) (err error) {
|
||||
|
||||
@@ -20,8 +20,8 @@ func TestGetStoresVendorSnapshot(t *testing.T) {
|
||||
|
||||
func TestSendAlarmVendorSnapshot(t *testing.T) {
|
||||
db := dao.GetDB()
|
||||
prevSnapshotList, _ := dao.GetVendorStoreSnapshot(db, utils.Str2Time("2019-07-16 10:00:00"))
|
||||
curSnapshotList, _ := dao.GetVendorStoreSnapshot(db, utils.Str2Time("2019-07-16 11:00:00"))
|
||||
prevSnapshotList, _ := dao.GetVendorStoreSnapshot(db, utils.Str2Time("2019-09-09 10:00:00"))
|
||||
curSnapshotList, _ := dao.GetVendorStoreSnapshot(db, utils.Str2Time("2019-09-09 11:00:00"))
|
||||
err := SendAlarmVendorSnapshot(jxcontext.AdminCtx, nil, prevSnapshotList, curSnapshotList)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
|
||||
Reference in New Issue
Block a user