Explorar o código

feat:代码调整

fuwencai hai 5 meses
pai
achega
4229956dc5

+ 25 - 0
newuserGet/README.MD

@@ -21,3 +21,28 @@ tidb-jianyu
 - 匹配规则:new_user_send_rule
 - 发送内容:new_user_send_content
 - 匹配用户:new_user_send_log
+
+
+
+### 准备测试数据
+
+1. 注册时间  
+clickhouse: pub_tags=》dwd_d_tag   手动给标签添加对应的用户base_userid
+```sql
+alter table pub_tags.dwd_d_tag UPDATE bitobj = bitmapOr(bitobj,bitmapBuild([toUInt64(4085039)])) where id=2018
+
+```
+4085039替换为base_userid  2018替换为要刷的标签id
+(或者找王凯越跑一下程序,给用户刷进去)  
+2. 外呼状态
+测试环境: Call_Accounting_test.voice_record;
+新增通话记录用于模拟
+或者配置文件中数据库调整成用正式环境模拟-149:4000   Call_Accounting.voice_record;
+3. 销售进程
+jianyu_subjectdb_test ,可以往这个表添加信息模拟跟进状态:dwd_f_crm_clue_info
+或者通过系统维护
+4. 行为
+同注册时间
+5. 行业
+jianyu_subjectdb_test ,可以手动往这个表添加信息:dwd_f_crm_clue_info-industry字段
+或者通过系统维护改字段 

+ 1 - 1
newuserGet/hack/config.yaml

@@ -19,7 +19,7 @@ gfcli:
         group: call
       - link: "mysql:datagroup:Dgrpdb#2024@36@tcp(192.168.3.149:4000)/jianyu_subjectdb_test"
         descriptionTag: true
-        tables: "dwd_f_crm_clue_info,dwd_f_userbase_baseinfo"
+        tables: "dwd_f_crm_clue_info,dwd_f_userbase_baseinfo,d_scopeclass_code"
         group: crm
 
   docker:

+ 27 - 0
newuserGet/internal/dao/d_scopeclass_code.go

@@ -0,0 +1,27 @@
+// =================================================================================
+// This file is auto-generated by the GoFrame CLI tool. You may modify it as needed.
+// =================================================================================
+
+package dao
+
+import (
+	"newuserGet/internal/dao/internal"
+)
+
+// internalDScopeclassCodeDao is an internal type for wrapping the internal DAO implementation.
+type internalDScopeclassCodeDao = *internal.DScopeclassCodeDao
+
+// dScopeclassCodeDao is the data access object for the table d_scopeclass_code.
+// You can define custom methods on it to extend its functionality as needed.
+type dScopeclassCodeDao struct {
+	internalDScopeclassCodeDao
+}
+
+var (
+	// DScopeclassCode is a globally accessible object for table d_scopeclass_code operations.
+	DScopeclassCode = dScopeclassCodeDao{
+		internal.NewDScopeclassCodeDao(),
+	}
+)
+
+// Add your custom methods and functionality below.

+ 89 - 0
newuserGet/internal/dao/internal/d_scopeclass_code.go

@@ -0,0 +1,89 @@
+// ==========================================================================
+// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT.
+// ==========================================================================
+
+package internal
+
+import (
+	"context"
+
+	"github.com/gogf/gf/v2/database/gdb"
+	"github.com/gogf/gf/v2/frame/g"
+)
+
+// DScopeclassCodeDao is the data access object for the table d_scopeclass_code.
+type DScopeclassCodeDao struct {
+	table   string                 // table is the underlying table name of the DAO.
+	group   string                 // group is the database configuration group name of the current DAO.
+	columns DScopeclassCodeColumns // columns contains all the column names of Table for convenient usage.
+}
+
+// DScopeclassCodeColumns defines and stores column names for the table d_scopeclass_code.
+type DScopeclassCodeColumns struct {
+	Code    string // 分类代码
+	Pcode   string // 父级代码
+	Level   string // 分类级别
+	Name    string // 分类名称
+	Remark  string // 备注
+	SzLevel string //
+	SzLeaf  string //
+	SzPid0  string //
+	SzPid1  string //
+}
+
+// dScopeclassCodeColumns holds the columns for the table d_scopeclass_code.
+var dScopeclassCodeColumns = DScopeclassCodeColumns{
+	Code:    "code",
+	Pcode:   "pcode",
+	Level:   "level",
+	Name:    "name",
+	Remark:  "remark",
+	SzLevel: "SZ_LEVEL",
+	SzLeaf:  "SZ_LEAF",
+	SzPid0:  "SZ_PID0",
+	SzPid1:  "SZ_PID1",
+}
+
+// NewDScopeclassCodeDao creates and returns a new DAO object for table data access.
+func NewDScopeclassCodeDao() *DScopeclassCodeDao {
+	return &DScopeclassCodeDao{
+		group:   "crm",
+		table:   "d_scopeclass_code",
+		columns: dScopeclassCodeColumns,
+	}
+}
+
+// DB retrieves and returns the underlying raw database management object of the current DAO.
+func (dao *DScopeclassCodeDao) DB() gdb.DB {
+	return g.DB(dao.group)
+}
+
+// Table returns the table name of the current DAO.
+func (dao *DScopeclassCodeDao) Table() string {
+	return dao.table
+}
+
+// Columns returns all column names of the current DAO.
+func (dao *DScopeclassCodeDao) Columns() DScopeclassCodeColumns {
+	return dao.columns
+}
+
+// Group returns the database configuration group name of the current DAO.
+func (dao *DScopeclassCodeDao) Group() string {
+	return dao.group
+}
+
+// Ctx creates and returns a Model for the current DAO. It automatically sets the context for the current operation.
+func (dao *DScopeclassCodeDao) Ctx(ctx context.Context) *gdb.Model {
+	return dao.DB().Model(dao.table).Safe().Ctx(ctx)
+}
+
+// Transaction wraps the transaction logic using function f.
+// It rolls back the transaction and returns the error if function f returns a non-nil error.
+// It commits the transaction and returns nil if function f returns nil.
+//
+// Note: Do not commit or roll back the transaction in function f,
+// as it is automatically handled by this function.
+func (dao *DScopeclassCodeDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) {
+	return dao.Ctx(ctx).Transaction(ctx, f)
+}

+ 41 - 15
newuserGet/internal/logic/task.go

@@ -6,13 +6,32 @@ import (
 	"fmt"
 	"github.com/gogf/gf/v2/container/gset"
 	"github.com/gogf/gf/v2/frame/g"
+	"github.com/gogf/gf/v2/os/gctx"
 	"newuserGet/internal/dao"
 	"newuserGet/internal/model/entity"
 	"strings"
 	"time"
 )
 
+var IndustryMap map[string]string
+
+func init() {
+	IndustryMap = map[string]string{}
+	ctx := gctx.New()
+	industry := []entity.DScopeclassCode{}
+	err := dao.DScopeclassCode.Ctx(ctx).Fields("code,name").Where("level=?", 1).Scan(&industry)
+	if err != nil {
+		panic("初始化行业code信息异常")
+	}
+	for i := 0; i < len(industry); i++ {
+		IndustryMap[industry[i].Code] = industry[i].Name
+	}
+}
 func Task(ctx context.Context) {
+	// 是否仅保存测试用户数据
+	phones := g.Cfg().MustGet(ctx, "test.phone").Array()
+	testSet := gset.NewFrom(phones, true)
+	testSwitch := g.Cfg().MustGet(ctx, "test.switch").Bool()
 	start := time.Now()
 	defer func() {
 		g.Log().Info(ctx, "本轮完成", time.Since(start))
@@ -54,7 +73,10 @@ func Task(ctx context.Context) {
 		if rules[i].Trailstatus != "" || rules[i].Industry != "" {
 			userList = filterTrailStatus(ctx, rules[i], userList)
 		}
-
+		// 是否开启测试范围
+		if testSwitch {
+			userList = filterTest(ctx, testSet, userList)
+		}
 		if len(userList) > 0 {
 			// 保存用户
 			_, err = dao.NewUserSendLog.Ctx(ctx).Data(userList).Insert()
@@ -89,7 +111,7 @@ WHERE
 )
 
 // 通过时间和行为计算用户
-func getFromRegisterBehavior(ctx context.Context, rule entity.NewUserSendRule) (userList []*entity.NewUserSendLog, err error) {
+func getFromRegisterBehavior(ctx context.Context, rule entity.NewUserSendRule) (userList []entity.NewUserSendLog, err error) {
 	start := time.Now()
 	defer func() {
 		g.Log().Info(ctx, "getFromRegisterBehavior 耗时:", time.Since(start))
@@ -124,7 +146,7 @@ func getFromRegisterBehavior(ctx context.Context, rule entity.NewUserSendRule) (
 }
 
 // 外呼状态
-func filterCallState(ctx context.Context, rule entity.NewUserSendRule, userList []*entity.NewUserSendLog) (newUserList []*entity.NewUserSendLog, err error) {
+func filterCallState(ctx context.Context, rule entity.NewUserSendRule, userList []entity.NewUserSendLog) (newUserList []entity.NewUserSendLog, err error) {
 	start := time.Now()
 	defer func() {
 		g.Log().Info(ctx, "filterCallState 耗时:", time.Since(start))
@@ -184,7 +206,7 @@ func filterCallState(ctx context.Context, rule entity.NewUserSendRule, userList
 }
 
 // 跟进状态
-func filterTrailStatus(ctx context.Context, rule entity.NewUserSendRule, userList []*entity.NewUserSendLog) (newUserList []*entity.NewUserSendLog) {
+func filterTrailStatus(ctx context.Context, rule entity.NewUserSendRule, userList []entity.NewUserSendLog) (newUserList []entity.NewUserSendLog) {
 	start := time.Now()
 	defer func() {
 		g.Log().Info(ctx, "filterTrailStatus 耗时:", time.Since(start))
@@ -231,20 +253,24 @@ func filterTrailStatus(ctx context.Context, rule entity.NewUserSendRule, userLis
 		// 匹配行业
 		if flag {
 			if intersectSet.Size() > 0 {
-				intersectSet.Iterator(func(v string) bool {
-					newUserList = append(newUserList, &entity.NewUserSendLog{
-						Industry: v,
-						RuleId:   userList[i].RuleId,
-						Phone:    userList[i].Phone,
-						UserId:   userList[i].UserId,
-					})
-					return true
-				})
-			} else {
-				newUserList = append(newUserList, userList[i])
+				// 选一个行业存进去
+				industryName := IndustryMap[intersectSet.Pop()]
+				userList[i].Industry = industryName
 			}
+			newUserList = append(newUserList, userList[i])
 		}
 	}
 	g.Log().Info(ctx, "filterCallState 获得用户数量", len(userList))
 	return
 }
+
+func filterTest(ctx context.Context, testSet *gset.Set, userList []entity.NewUserSendLog) (newUserList []entity.NewUserSendLog) {
+	for i := 0; i < len(userList); i++ {
+		if testSet != nil && testSet.Contains(userList[i].Phone) {
+			newUserList = append(newUserList, userList[i])
+		} else {
+			g.Log().Info(ctx, "filterTest 不在测试范围内", userList[i])
+		}
+	}
+	return
+}

+ 23 - 0
newuserGet/internal/model/do/d_scopeclass_code.go

@@ -0,0 +1,23 @@
+// =================================================================================
+// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT.
+// =================================================================================
+
+package do
+
+import (
+	"github.com/gogf/gf/v2/frame/g"
+)
+
+// DScopeclassCode is the golang structure of table d_scopeclass_code for DAO operations like Where/Data.
+type DScopeclassCode struct {
+	g.Meta  `orm:"table:d_scopeclass_code, do:true"`
+	Code    interface{} // 分类代码
+	Pcode   interface{} // 父级代码
+	Level   interface{} // 分类级别
+	Name    interface{} // 分类名称
+	Remark  interface{} // 备注
+	SzLevel interface{} //
+	SzLeaf  interface{} //
+	SzPid0  interface{} //
+	SzPid1  interface{} //
+}

+ 18 - 0
newuserGet/internal/model/entity/d_scopeclass_code.go

@@ -0,0 +1,18 @@
+// =================================================================================
+// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT.
+// =================================================================================
+
+package entity
+
+// DScopeclassCode is the golang structure for table d_scopeclass_code.
+type DScopeclassCode struct {
+	Code    string `json:"code"    orm:"code"     description:"分类代码"` // 分类代码
+	Pcode   string `json:"pcode"   orm:"pcode"    description:"父级代码"` // 父级代码
+	Level   string `json:"level"   orm:"level"    description:"分类级别"` // 分类级别
+	Name    string `json:"name"    orm:"name"     description:"分类名称"` // 分类名称
+	Remark  string `json:"remark"  orm:"remark"   description:"备注"`   // 备注
+	SzLevel int64  `json:"sZLEVEL" orm:"SZ_LEVEL" description:""`     //
+	SzLeaf  int64  `json:"sZLEAF"  orm:"SZ_LEAF"  description:""`     //
+	SzPid0  string `json:"sZPID0"  orm:"SZ_PID0"  description:""`     //
+	SzPid1  string `json:"sZPID1"  orm:"SZ_PID1"  description:""`     //
+}

+ 5 - 6
newuserGet/main.go

@@ -2,10 +2,6 @@ package main
 
 import (
 	"context"
-	//"context"
-	//_ "getuser/internal/packed"
-	//"github.com/gogf/gf/v2/frame/g"
-	//"github.com/gogf/gf/v2/os/gcron"
 	_ "github.com/gogf/gf/contrib/drivers/clickhouse/v2"
 	_ "github.com/gogf/gf/contrib/drivers/mysql/v2"
 	"github.com/gogf/gf/v2/frame/g"
@@ -20,10 +16,12 @@ func main() {
 		err error
 		ctx = gctx.New()
 	)
-	//logic.Task(ctx)
-	//
 	taskRun := g.Cfg().MustGet(ctx, "task.taskRun").Bool()
+	firstRun := g.Cfg().MustGet(ctx, "task.firstRun").Bool()
 	if taskRun {
+		if firstRun {
+			logic.Task(ctx)
+		}
 		cronStr := g.Cfg().MustGet(ctx, "task.cron").String()
 		_, err = gcron.AddSingleton(ctx, cronStr, func(ctx context.Context) {
 			g.Log().Print(ctx, "doing start")
@@ -31,6 +29,7 @@ func main() {
 			g.Log().Print(ctx, "end")
 
 		})
+		g.Log().Print(ctx, "定时任务添加完成")
 		if err != nil {
 			panic(err)
 		}

+ 0 - 4
newuserSend/hack/config.yaml

@@ -7,10 +7,6 @@ gfcli:
       - link: "mysql:root:=PDT49#80Z!RVv52_z@tcp(192.168.3.14:4000)/jianyu"
         descriptionTag: true
         tables: "new_user_send_log,new_user_send_content"
-      - link: "mysql:datagroup:Dgrpdb#2024@36@tcp(192.168.3.149:4000)/jianyu_subjectdb_test"
-        descriptionTag: true
-        tables: "d_scopeclass_code"
-        group: crm
   docker:
     build: "-a amd64 -s linux -p temp -ew"
     tagPrefixes:

+ 6 - 5
newuserSend/internal/consts/consts.go

@@ -1,10 +1,11 @@
 package consts
 
 const (
-	SendChannelSMS     = 1         // 发送渠道短信
-	SendChannelSiteMsg = 2         // 发送渠道站内信
-	SmsVarMonth        = "month"   // 短信模板变量 当前月
-	SmsVarYear         = "year"    // 短信模板变量 当前年
-	SiteMsgMonth       = "#month#" // 发送渠道站内信
+	SendChannelSMS     = 1          // 发送渠道短信
+	SendChannelSiteMsg = 2          // 发送渠道站内信
+	SmsVarMonth        = "month"    // 短信模板变量 当前月
+	SmsVarYear         = "year"     // 短信模板变量 当前年
+	SmsVarIndustry     = "industry" // 短信模板变量 替换为对应行业
+	SiteMsgMonth       = "#month#"  // 发送渠道站内信
 
 )

+ 42 - 36
newuserSend/internal/logic/task.go

@@ -5,7 +5,6 @@ import (
 	"fmt"
 	"github.com/gogf/gf/v2/container/gset"
 	"github.com/gogf/gf/v2/frame/g"
-	"github.com/gogf/gf/v2/os/gctx"
 	"github.com/gogf/gf/v2/os/gtime"
 	"newuserSend/internal/consts"
 	"newuserSend/internal/dao"
@@ -17,28 +16,16 @@ import (
 )
 
 var nsm *utility.StationMessage
-var testSet *gset.Set
-var testSwitch bool
-var IndustryMap map[string]interface{}
+var industryUrlMap map[string]interface{}
 
-func init() {
-	ctx := gctx.New()
-	phones := g.Cfg().MustGet(ctx, "test.phone").Array()
-	testSet = gset.NewFrom(phones, true)
-	testSwitch = g.Cfg().MustGet(ctx, "test.switch").Bool()
-	industry := []entity.DScopeclassCode{}
-	err := dao.DScopeclassCode.Ctx(ctx).Fields("code,name").Where("level=?", 1).Scan(&industry)
-	if err != nil {
-		panic("初始化行业code信息异常")
-	}
-	for i := 0; i < len(industry); i++ {
-		IndustryMap[industry[i].Code] = industry[i].Name
-	}
-}
 func Task(ctx context.Context) {
+	phones := g.Cfg().MustGet(ctx, "test.phone").Array()
+	testSet := gset.NewFrom(phones, true)
+	testSwitch := g.Cfg().MustGet(ctx, "test.switch").Bool()
 	addr := g.Cfg().MustGet(ctx, "siteMsg.addr").String()
 	action := g.Cfg().MustGet(ctx, "siteMsg.action").String()
 	callplatform := g.Cfg().MustGet(ctx, "siteMsg.callPlatform").String()
+	industryUrlMap = g.Cfg().MustGet(ctx, "industryUrl").Map()
 	nsm = utility.NewStationMessage(addr, action, callplatform)
 	start := time.Now()
 	defer func() {
@@ -75,6 +62,10 @@ func Task(ctx context.Context) {
 				g.Log().Error(ctx, "获取待发送用户失败", sendContent[i].RuleId, err)
 				break
 			}
+			// 是否开启测试范围
+			if testSwitch {
+				userList = filterTest(ctx, testSet, userList)
+			}
 			// 发送消息
 			sendMsg(ctx, sendContent[i], userList)
 			g.Log().Infof(ctx, "发送第%v个发送规则:id-%v 内容id:%v 批次:%v-%v\n", i, sendContent[i].RuleId, sendContent[i].Id, j, j+200)
@@ -98,7 +89,7 @@ func sendMsg(ctx context.Context, content entity.NewUserSendContent, sendUserLis
 }
 
 func sms(ctx context.Context, content entity.NewUserSendContent, sendUserList []entity.NewUserSendLog) {
-    // todo 处理行业短信模板变量
+	//  处理行业短信模板变量
 	for i := 0; i < len(sendUserList); i++ {
 		smsIDIndex := content.SmsId
 		smsvar := content.SmsVar
@@ -115,19 +106,13 @@ func sms(ctx context.Context, content entity.NewUserSendContent, sendUserList []
 					vardata = append(vardata, fmt.Sprint(gtime.Now().Month()))
 				case consts.SmsVarYear:
 					vardata = append(vardata, fmt.Sprint(gtime.Now().Year()))
+				case consts.SmsVarIndustry:
+					vardata = append(vardata, sendUserList[i].Industry)
 				}
 			}
 		}
-		if testSwitch {
-			if testSet.Contains(sendUserList[i].Phone) {
-				utility.NewSMSDao(sendUserList[i].Phone, vardata, smsIDIndex).SendMsgBySMS(ctx)
-			} else {
-				g.Log().Info(ctx, "测试模式已开启-该手机号不在测试范围:", sendUserList[i].Phone)
+		utility.NewSMSDao(sendUserList[i].Phone, vardata, smsIDIndex).SendMsgBySMS(ctx)
 
-			}
-		} else {
-			utility.NewSMSDao(sendUserList[i].Phone, vardata, content.SmsId).SendMsgBySMS(ctx)
-		}
 	}
 	//g.Log().Info(ctx, "sms 发送完成:",sendUserList,content.RuleId)
 
@@ -141,7 +126,6 @@ func siteMsg(ctx context.Context, content entity.NewUserSendContent, sendUserLis
 	msgTitle = strings.ReplaceAll(msgTitle, consts.SiteMsgMonth, monthStr)
 	urls := strings.Split(content.MsgUrl, ",")
 	var pcUrl, androidUrl, iosUrl, weChatUrl string
-	// todo 区分行业跳转地址
 	if len(urls) > 0 {
 		if len(urls) != 4 {
 			pcUrl, androidUrl, iosUrl, weChatUrl = urls[0], urls[0], urls[0], urls[0]
@@ -153,16 +137,27 @@ func siteMsg(ctx context.Context, content entity.NewUserSendContent, sendUserLis
 	msgType := g.Cfg().MustGet(ctx, "siteMsg.msgType").Int()
 	mgoIds := []string{}
 	for i := 0; i < len(sendUserList); i++ {
+		// todo 处理行业跳转
+		industryPcUrl, industryAndroidUrl, industryIosUrl, industryWeChatUrl := pcUrl, androidUrl, iosUrl, weChatUrl
 		if sendUserList[i].Industry == "" {
 			mgoIds = append(mgoIds, sendUserList[i].UserId)
 		} else {
-			// todo 处理行业跳转
-			//industryUrl := content.IndustryMsgUrl
-			// 有行业的需要单独处理跳转地址
-			//newparm := utility.MessageParam{
-			//	UserIds: sendUserList[i].UserId, Title: msgTitle, Content: msgInfo, Link: pcUrl, AndroidUrl: androidUrl, IosUrl: iosUrl, WeChatUrl: weChatUrl, MsgType: msgType,
-			//}
-			//nsm.SendStationMessages(ctx, newparm)
+			//有行业的需要单独处理跳转地址
+			urlvar := industryUrlMap[sendUserList[i].Industry]
+			if urlvar != "" {
+				industryUrls := strings.Split(content.IndustryMsgUrl, ",")
+				if len(industryUrls) > 0 {
+					if len(industryUrls) != 4 {
+						industryPcUrl, industryAndroidUrl, industryIosUrl, industryWeChatUrl = industryUrls[0], industryUrls[0], industryUrls[0], industryUrls[0]
+					} else {
+						industryPcUrl, industryAndroidUrl, industryIosUrl, industryWeChatUrl = industryUrls[0], industryUrls[1], industryUrls[2], industryUrls[3]
+					}
+				}
+			}
+			newparm := utility.MessageParam{
+				UserIds: sendUserList[i].UserId, Title: msgTitle, Content: msgInfo, Link: industryPcUrl, AndroidUrl: industryAndroidUrl, IosUrl: industryIosUrl, WeChatUrl: industryWeChatUrl, MsgType: msgType,
+			}
+			nsm.SendStationMessages(ctx, newparm)
 		}
 	}
 	parm := utility.MessageParam{
@@ -182,3 +177,14 @@ func updateState(ctx context.Context, sendUserList []entity.NewUserSendLog) {
 		return
 	}
 }
+
+func filterTest(ctx context.Context, testSet *gset.Set, userList []entity.NewUserSendLog) (newUserList []entity.NewUserSendLog) {
+	for i := 0; i < len(userList); i++ {
+		if testSet != nil && testSet.Contains(userList[i].Phone) {
+			newUserList = append(newUserList, userList[i])
+		} else {
+			g.Log().Info(ctx, "filterTest 不在测试范围内", userList[i])
+		}
+	}
+	return
+}

+ 4 - 0
newuserSend/main.go

@@ -16,7 +16,11 @@ func main() {
 		ctx = gctx.New()
 	)
 	taskRun := g.Cfg().MustGet(ctx, "task.taskRun").Bool()
+	firstRun := g.Cfg().MustGet(ctx, "task.firstRun").Bool()
 	if taskRun {
+		if firstRun {
+			logic.Task(ctx)
+		}
 		cronStr := g.Cfg().MustGet(ctx, "task.cron").String()
 		_, err = gcron.AddSingleton(ctx, cronStr, func(ctx context.Context) {
 			g.Log().Print(ctx, "doing start")

+ 4 - 2
newuserSend/manifest/config/config.yaml

@@ -13,6 +13,8 @@ logger:
 database:
   default:
     link: "mysql:root:=PDT49#80Z!RVv52_z@tcp(192.168.3.14:4000)/jianyu"
+  crm:
+    link: "mysql:datagroup:Dgrpdb#2024@36@tcp(192.168.3.149:4000)/jianyu_subjectdb_test"
 siteMsg:
   addr: "https://web-qmx_admin.jydev.jianyu360.com/api/admin/"
   action: "/message/sendMessageApi"
@@ -28,6 +30,6 @@ sms:
   ProductId: 0
   rpc: "192.168.3.149:932"
 test:
-  switch: false # 是否仅发送测试手机号短信
+  switch: true # 是否仅发送测试手机号短信
   phone: [ "18238182402" ]
-#industry: {"":} #行业code对应的地址
+industryUrl: { "水利水电": "SHUILISHUIDIAN" } #行业对应的地址