wxwork.go 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778
  1. package util
  2. import (
  3. "bytes"
  4. "crypto/sha1"
  5. "fmt"
  6. "github.com/faabiosr/cachego/file"
  7. "github.com/fastwego/dingding"
  8. "github.com/robfig/cron/v3"
  9. "html/template"
  10. "io/ioutil"
  11. "log"
  12. "net/http"
  13. "net/url"
  14. "os"
  15. "strconv"
  16. "strings"
  17. "time"
  18. "github.com/fastwego/offiaccount"
  19. template1 "github.com/fastwego/offiaccount/apis/message/template"
  20. "github.com/fastwego/offiaccount/apis/oauth"
  21. user1 "github.com/fastwego/offiaccount/apis/user"
  22. "github.com/fastwego/offiaccount/type/type_message"
  23. "github.com/fastwego/offiaccount/util"
  24. "github.com/fastwego/wxwork/corporation"
  25. "github.com/fastwego/wxwork/corporation/apis/external_contact/customer"
  26. message1 "github.com/fastwego/wxwork/corporation/apis/message"
  27. "github.com/gin-gonic/gin"
  28. "kpt.xdmy/apiserver/routers/restful"
  29. "kpt.xdmy/pkg/logging"
  30. "kpt.xdmy/pkg/setting"
  31. )
  32. // 企业微信
  33. var OffiAccount *offiaccount.OffiAccount
  34. var Corp *corporation.Corporation
  35. var App *corporation.App
  36. var MsgChan chan []map[string]string
  37. type UserMsg struct {
  38. Touser string `json:"touser"`
  39. Msgtype string `json:"msgtype"`
  40. Agentid string `json:"agentid"`
  41. Text interface{} `json:"text"`
  42. }
  43. func CronWXwork() {
  44. defer func() { // 必须要先声明defer
  45. if err := recover(); err != nil {
  46. fmt.Printf("CronTest pnic err%+v \n", err)
  47. logging.Error("panic recover err ", err)
  48. }
  49. }()
  50. //initWXwork()
  51. initDingDing()
  52. go SendRun()
  53. log.Println("Starting CronWXwork...")
  54. c := cron.New()
  55. _, err := c.AddFunc("00 00 06 * * *", Getuseinfor) //* * * * *, 从分钟开始
  56. if err != nil {
  57. println("cron4 err", err.Error())
  58. }
  59. GetMsg()
  60. _, err = c.AddFunc("@every 2m0s", GetMsg) //* * * * *, 从分钟开始
  61. _, err = c.AddFunc("00 00 07 * * *", GetPartsInfo) //* * * * *, 每天七点
  62. cronMaintainPush()
  63. c.AddFunc("@every 2m0s", cronMaintainPush)
  64. if err != nil {
  65. println("cron5 err", err.Error())
  66. }
  67. c.Start()
  68. }
  69. func Ceshi() {
  70. fmt.Println("sasdsdadasa")
  71. }
  72. func GetPartsInfo() {
  73. tx, err1 := restful.Dbs.Beginx()
  74. defer func() {
  75. switch {
  76. case err1 != nil:
  77. println("tx.Begin 事务启动失败__error:", err1.Error())
  78. if tx != nil {
  79. tx.Rollback()
  80. }
  81. default:
  82. if tx != nil {
  83. err1 = tx.Commit()
  84. }
  85. }
  86. }()
  87. query, err := restful.MapStrListTx(tx, "select count(*) success,(select count(*) from parts ps "+
  88. " where ps.chargeDate >= DATE_SUB(now(),INTERVAL 1 DAY) and ps.issync=0 ) woring "+
  89. " from parts where parts.chargeDate >= DATE_SUB(now(),INTERVAL 1 DAY) and parts.issync=1 ")
  90. query1, err := restful.MapStrListTx(tx, " select empid from user where id in(select user_id from user_role "+
  91. "where role_id in (select id from role where easInformationReception = 1))")
  92. if err != nil {
  93. logging.Error("获取备件同步成功与否__error:", err.Error())
  94. } else {
  95. if len(query1) > 0 && len(query) > 0 {
  96. for i := 0; i < len(query1); i++ {
  97. success := query[0]["success"]
  98. personId := query1[i]["empid"]
  99. woring := query[0]["woring"]
  100. _, err = tx.Exec("INSERT INTO wxworkmsg(date,userid,msg,formcode,type,note) VALUES(?,?,?,?,?,?)",
  101. time.Now().Format("2006-01-02"), personId, "【eas】同步成功"+success+"条"+"同步失败"+woring+"条",
  102. "eas", 0, nil)
  103. if err != nil {
  104. }
  105. }
  106. }
  107. if err != nil {
  108. logging.Error("插入eas同步信息到微信信息表__error:", err.Error())
  109. }
  110. }
  111. }
  112. func Getuseinfor1() {
  113. logging.Error("PostDataByNames========= ")
  114. }
  115. func Getuseinfor() {
  116. defer func() { // 必须要先声明defer
  117. if err := recover(); err != nil {
  118. logging.Error("Getuseinfor pnic err", err) // 这里的err其实就是panic传入的内容,55
  119. }
  120. }()
  121. value := make(url.Values, 1)
  122. value.Add("department_id", "1")
  123. value.Add("fetch_child", "1")
  124. msgmap := make(map[string]interface{})
  125. resp, err := customer.List(App, value)
  126. if err != nil {
  127. println("contact.UserList err", err.Error())
  128. }
  129. err = json.Unmarshal(resp, &msgmap)
  130. if err != nil {
  131. println("json.Unmarshal err", err.Error())
  132. }
  133. tx, err1 := restful.Dbs.Beginx()
  134. defer func() {
  135. switch {
  136. case err1 != nil:
  137. logging.Error("tx.Begin 事务启动失败__error:", err.Error())
  138. if tx != nil {
  139. tx.Rollback()
  140. }
  141. default:
  142. if tx != nil {
  143. err = tx.Commit()
  144. }
  145. }
  146. }()
  147. if _, ok := msgmap["userlist"]; ok {
  148. for _, value := range msgmap["userlist"].([]interface{}) {
  149. userid := value.(map[string]interface{})["userid"]
  150. name := value.(map[string]interface{})["name"]
  151. var department interface{}
  152. if len(value.(map[string]interface{})["department"].([]interface{})) > 0 {
  153. department = value.(map[string]interface{})["department"].([]interface{})[0]
  154. }
  155. var empcode interface{}
  156. if len(value.(map[string]interface{})["extattr"].(map[string]interface{})["attrs"].([]interface{})) == 1 {
  157. empcode = value.(map[string]interface{})["extattr"].(map[string]interface{})["attrs"].([]interface{})[0].(map[string]interface{})["value"]
  158. } else if len(value.(map[string]interface{})["extattr"].(map[string]interface{})["attrs"].([]interface{})) > 1 {
  159. for _, va := range value.(map[string]interface{})["extattr"].(map[string]interface{})["attrs"].([]interface{}) {
  160. if va.(map[string]interface{})["name"] == "工号" {
  161. empcode = va.(map[string]interface{})["value"]
  162. break
  163. }
  164. }
  165. }
  166. //jvalue,_ :=json.Marshal(value)
  167. _, err = tx.Exec("insert into wxworkuser(userid,name,department,empcode)values(?,?,?,?)ON DUPLICATE KEY UPDATE empcode =?,department=?", userid, name, department, empcode, empcode, department)
  168. //_,err =tx.Exec("insert into wxworkuser(userid,name,department,empcode,json)values(?,?,?,?,?)ON DUPLICATE KEY UPDATE empcode =?",userid,name,department,empcode,string(jvalue),empcode)
  169. if err != nil {
  170. logging.Error("insert into wxworkuser err ", err.Error())
  171. }
  172. }
  173. }
  174. logging.Info("update wxworkuser success ")
  175. }
  176. func SendRun() {
  177. defer func() {
  178. if err := recover(); err != nil {
  179. logging.Error("GetMsg pnic err", err)
  180. }
  181. }()
  182. for {
  183. msgs := <-MsgChan
  184. println(len(msgs))
  185. for _, value := range msgs {
  186. /*
  187. content := make(map[string]interface{})
  188. content["content"] = value["msg"]
  189. msg := UserMsg{
  190. Touser: value["userid"],
  191. Agentid: setting.ServerSetting.WXworkAgentid,
  192. Text: content,
  193. Msgtype: "text",
  194. }
  195. msgbyte, err := json.Marshal(msg)
  196. if err != nil {
  197. logging.Error("json.Marshal err ", err.Error())
  198. }
  199. _, err = message1.Send(App, msgbyte)
  200. if err != nil {
  201. logging.Error("message1.Send err ", err.Error())
  202. fmt.Println("message1.Send err", err.Error())
  203. } else {
  204. }
  205. */
  206. ///*
  207. if value["dingdingCode"] == "" {
  208. //restful.MapStr(` select`)
  209. params := url.Values{}
  210. params.Add("mobile", value["tel"])
  211. //params.Add("mobile", "18317742428")
  212. req, _ := http.NewRequest(http.MethodGet, "/user/get_by_mobile?"+params.Encode(), nil)
  213. resp, err := DingClient.Do(req)
  214. if err != nil {
  215. continue
  216. }
  217. fmt.Println(value["111"], value["userid"], value["empId"])
  218. dingTalkUser := new(dingTalkUserId)
  219. json.Unmarshal(resp, dingTalkUser)
  220. _, err = restful.Dbs.Exec(` update emp set dingdingCode = ? where (tel = ? ) `, dingTalkUser.Userid, value["tel"])
  221. if err != nil {
  222. continue
  223. }
  224. value["dingdingCode"] = dingTalkUser.Userid
  225. }
  226. fmt.Println(value["dingdingCode"])
  227. //306804033029907132
  228. //306804033029907132
  229. // 调用 api
  230. if value["dingdingCode"] == "" {
  231. continue
  232. }
  233. dingTalkSendReq := new(DingTalkSendReq)
  234. dingTalkSendReq.AgentId = setting.ServerSetting.DingTalkAgentid
  235. dingTalkSendReq.UseridList = value["dingdingCode"]
  236. dingTalkSendReq.Msg.Msgtype = "text"
  237. dingTalkSendReq.Msg.Text.Content = value["msg"]
  238. dingTalkSendReqByte, _ := json.Marshal(dingTalkSendReq)
  239. sendReq, _ := http.NewRequest(http.MethodPost, "/topapi/message/corpconversation/asyncsend_v2", bytes.NewBuffer(dingTalkSendReqByte))
  240. sendResp, err := DingClient.Do(sendReq)
  241. if err != nil {
  242. fmt.Println(err)
  243. continue
  244. }
  245. fmt.Println(dingTalkSendReqByte)
  246. _, err = restful.Dbs.Exec(` update wxworkmsg set statue = 1 ,pushTime = now() where id = ? `, value["wxworkmsgId"])
  247. if err != nil {
  248. fmt.Println(err)
  249. }
  250. fmt.Println(string(sendResp))
  251. //*/
  252. }
  253. }
  254. }
  255. func GetMsgv1() {
  256. go GetMsgv2()
  257. }
  258. func GetMsgv2() {
  259. defer func() { // 必须要先声明defer
  260. if err := recover(); err != nil {
  261. logging.Error("GetMsg pnic err", err) // 这里的err其实就是panic传入的内容,55
  262. }
  263. }()
  264. time.Sleep(time.Second)
  265. a := 0
  266. b := 1 / a
  267. println(b)
  268. }
  269. func GetMsg() {
  270. defer func() { // 必须要先声明defer
  271. if err := recover(); err != nil {
  272. logging.Error("GetMsg pnic err", err) // 这里的err其实就是panic传入的内容,55
  273. }
  274. }()
  275. tx, err1 := restful.Dbs.Beginx()
  276. defer func() {
  277. switch {
  278. case err1 != nil:
  279. println("tx.Begin 事务启动失败__error:", err1.Error())
  280. if tx != nil {
  281. tx.Rollback()
  282. }
  283. default:
  284. if tx != nil {
  285. err1 = tx.Commit()
  286. }
  287. }
  288. }()
  289. sqls, err := restful.MapStrListTx(tx, "select sqlstr from apisql where sqlname in ('getWXworkMsg','updateWXworkMsg') order by sqlname")
  290. if err != nil {
  291. logging.Error("select from sqls err ", err.Error())
  292. }
  293. if len(sqls) < 2 {
  294. return
  295. }
  296. sqlmsg := sqls[0]["sqlstr"]
  297. //sqlupdate := sqls[1]["sqlstr"]
  298. var query []map[string]string
  299. if len(sqls) > 0 {
  300. query, err = restful.MapStrListTx(tx, sqlmsg)
  301. if err != nil {
  302. logging.Error("select from wxworkmsg err ", err.Error(), len(query))
  303. } else {
  304. //_, err = tx.Exec(sqlupdate)
  305. //if err != nil {
  306. // logging.Error("update wxworkmsg err ", err.Error(), len(query))
  307. //}
  308. }
  309. }
  310. if len(query) > 0 {
  311. go func() {
  312. msgs := query
  313. MsgChan <- msgs
  314. }()
  315. }
  316. }
  317. func SendMsgtest() {
  318. message1.Send(App, []byte(`{
  319. "touser": "18322596935",
  320. "toparty": "PartyID1|PartyID2",
  321. "totag": "TagID1 | TagID2",
  322. "msgtype": "text",
  323. "agentid": 1000022,
  324. "text": {
  325. "content": "你的快递已到,请携带工卡前往邮件中心领取。\n出发前可查看<a href=\"http://work.weixin.qq.com\">邮件中心视频实况</a>,聪明避开排队。"
  326. },
  327. "safe": 0,
  328. "enable_id_trans": 0,
  329. "enable_duplicate_check": 0
  330. }`))
  331. }
  332. func initOffiAccount() {
  333. // 加载配置文件
  334. // 创建公众号实例
  335. OffiAccount = offiaccount.New(offiaccount.Config{
  336. // wxe1cc563ba393dd1a
  337. Appid: "wxe1cc563ba393dd1a",
  338. Secret: "25e56243da9581eab6f4d67a12ef4658",
  339. Token: "123",
  340. // 6yYJ4sS5y1hJgvIXEqavV2rmCutyXkywndxUQFgX54f
  341. EncodingAESKey: "6yYJ4sS5y1hJgvIXEqavV2rmCutyXkywndxUQFgX54f",
  342. })
  343. //payload := []byte(`
  344. //{
  345. // "button":[
  346. // {
  347. // "name":"菜单",
  348. // "sub_button":[
  349. // {
  350. // "type":"view",
  351. // "name":"搜索",
  352. // "url":"http://www.baidu.com/"
  353. // }]
  354. // }]
  355. //}`)
  356. //resp, err := menu.Create(OffiAccount, payload)
  357. //fmt.Println(resp, err)
  358. //guide.SetGuideConfig(OffiAccount,[]byte("欢迎关注"))
  359. }
  360. func initWXwork() {
  361. // 加载配置文件
  362. // 创建企业微信实例
  363. Corp = corporation.New(corporation.Config{Corpid: setting.ServerSetting.WXworkCorpid})
  364. App = Corp.NewApp(corporation.AppConfig{
  365. AgentId: setting.ServerSetting.WXworkAgentid,
  366. Secret: setting.ServerSetting.WXworkSecret,
  367. Token: "",
  368. EncodingAESKey: "",
  369. })
  370. MsgChan = make(chan []map[string]string, 100)
  371. }
  372. func initDingDing() {
  373. atm := &dingding.DefaultAccessTokenManager{
  374. Id: setting.ServerSetting.DingTalkAppKey,
  375. Name: "access_token",
  376. GetRefreshRequestFunc: func() *http.Request {
  377. params := url.Values{}
  378. params.Add("appkey", setting.ServerSetting.DingTalkAppKey)
  379. params.Add("appsecret", setting.ServerSetting.DingTalkAppSecret)
  380. req, _ := http.NewRequest(http.MethodGet, dingding.ServerUrl+"/gettoken?"+params.Encode(), nil)
  381. return req
  382. },
  383. Cache: file.New(os.TempDir()),
  384. }
  385. // 钉钉 客户端
  386. DingClient = dingding.NewClient(atm)
  387. MsgChan = make(chan []map[string]string, 100)
  388. }
  389. func InitRouter() *gin.Engine {
  390. r := gin.New()
  391. // ginpprof.Wrap(r)
  392. r.Use(gin.LoggerWithFormatter(func(param gin.LogFormatterParams) string {
  393. // 你的自定义格式
  394. return fmt.Sprintf(" %+v \n",
  395. param.Keys,
  396. )
  397. }))
  398. r.Use(gin.Logger()) // 日志
  399. //r.Use(Cors()) // 跨域请求rolemenus
  400. r.Use(gin.Recovery())
  401. r.GET("/", func(c *gin.Context) {
  402. //OffiAccount.Server.EchoStr(c.Writer, c.Request)
  403. config, err := jsapiConfig(c)
  404. if err != nil {
  405. fmt.Println("==========1", err)
  406. return
  407. }
  408. t1, err := template.ParseFiles("index.html")
  409. if err != nil {
  410. fmt.Println("==========2", err)
  411. return
  412. }
  413. println("===========", t1.Name())
  414. t1.Execute(c.Writer, config)
  415. })
  416. r.POST("/", HandleMessage)
  417. return r
  418. }
  419. func jsapiConfig(c *gin.Context) (config template.JS, err error) {
  420. // 优先从环缓存获取
  421. jsapi_ticket, err := OffiAccount.AccessToken.Cache.Fetch("jsapi_ticket:" + OffiAccount.Config.Appid)
  422. if len(jsapi_ticket) == 0 {
  423. var ttl int64
  424. jsapi_ticket, ttl, err = oauth.GetJSApiTicket(OffiAccount)
  425. if err != nil {
  426. return
  427. }
  428. err = OffiAccount.AccessToken.Cache.Save("jsapi_ticket:"+OffiAccount.Config.Appid, jsapi_ticket, time.Duration(ttl)*time.Second)
  429. if err != nil {
  430. return
  431. }
  432. }
  433. nonceStr := util.GetRandString(6)
  434. timestamp := strconv.FormatInt(time.Now().Unix(), 10)
  435. pageUrl := "http://" + c.Request.Host + c.Request.RequestURI
  436. plain := "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + nonceStr + "&timestamp=" + timestamp + "&url=" + pageUrl
  437. signature := fmt.Sprintf("%x", sha1.Sum([]byte(plain)))
  438. fmt.Println(plain, signature)
  439. configMap := map[string]string{
  440. "url": pageUrl,
  441. "nonceStr": nonceStr,
  442. "appid": OffiAccount.Config.Appid,
  443. "timestamp": timestamp,
  444. "signature": signature,
  445. }
  446. marshal, err := json.Marshal(configMap)
  447. if err != nil {
  448. return
  449. }
  450. return template.JS(marshal), nil
  451. }
  452. func HandleMessage(c *gin.Context) {
  453. // 区分不同账号
  454. //account := path.Base(c.Request.URL.Path)
  455. // 调用相应公众号服务
  456. body, _ := ioutil.ReadAll(c.Request.Body)
  457. log.Println(string(body))
  458. message, err := OffiAccount.Server.ParseXML(body)
  459. if err != nil {
  460. log.Println(err)
  461. }
  462. var output interface{}
  463. switch message.(type) {
  464. case type_message.MessageText: // 文本 消息
  465. msg := message.(type_message.MessageText)
  466. // 回复文本消息
  467. output = type_message.ReplyMessageText{
  468. ReplyMessage: type_message.ReplyMessage{
  469. ToUserName: type_message.CDATA(msg.FromUserName),
  470. FromUserName: type_message.CDATA(msg.ToUserName),
  471. CreateTime: strconv.FormatInt(time.Now().Unix(), 10),
  472. MsgType: type_message.ReplyMsgTypeText,
  473. },
  474. Content: type_message.CDATA(msg.Content),
  475. }
  476. resp, err := template1.Send(OffiAccount, []byte(`
  477. {
  478. "touser":"`+msg.FromUserName+`",
  479. "template_id":"BtkN1rWKOJtKP0C64lGxIrPzLRFsYFas-4gupX2-pFo",
  480. "data":{
  481. "first": {
  482. "value":"恭喜你购买成功!",
  483. "color":"#173177"
  484. },
  485. "keyword1":{
  486. "value":"巧克力",
  487. "color":"#173177"
  488. },
  489. "keyword2": {
  490. "value":"39.8元",
  491. "color":"#173177"
  492. },
  493. "keyword3": {
  494. "value":"2014年9月22日",
  495. "color":"#173177"
  496. },
  497. "remark":{
  498. "value":"欢迎再次购买!",
  499. "color":"#173177"
  500. }
  501. }
  502. }`))
  503. println("msg", resp, err, msg.FromUserName)
  504. }
  505. res, _ := user1.Get(OffiAccount, nil)
  506. println("res======", string(res))
  507. OffiAccount.Server.Response(c.Writer, c.Request, output)
  508. }
  509. func cronMaintainPush() {
  510. tx, err := restful.Dbs.Beginx()
  511. defer func() {
  512. switch {
  513. case err != nil:
  514. println("tx.Begin 事务启动失败__error:", err.Error())
  515. if tx != nil {
  516. tx.Rollback()
  517. }
  518. default:
  519. if tx != nil {
  520. err = tx.Commit()
  521. }
  522. }
  523. }()
  524. maintainList, err := restful.MapStrList("select m.id,m.repairCode,m.eqId,DATE_FORMAT(m.requestTime,'%Y-%m-%d %H:%i:%S') requestTime,e.purpose,e.eqCode,m.pickId,m.details,(select empname from emp where id = m.requesterId) as requestername " +
  525. "from maintain m join equipment e on e.id = m.eqid where m.stopTime is null and DATE_FORMAT(m.requestTime,'%Y-%m-%d') = DATE_FORMAT(now(),'%Y-%m-%d') ")
  526. if err != nil {
  527. log.Println(err)
  528. return
  529. }
  530. eqIdList := []string{}
  531. for _, main := range maintainList {
  532. fmt.Println(main["requestTime"])
  533. eqIdList = append(eqIdList, main["eqId"])
  534. }
  535. if len(eqIdList) == 0 {
  536. return
  537. }
  538. equipmentList, err := restful.MapStrList(fmt.Sprintf(" select levelone,leveltwo,levelthree,id, maintenance,(select empcode from emp where e.maintenance= id ) maintenancecode,"+
  539. "levelone, (select userid from wxworkuser where empCode = (select empcode from emp where e.levelone= id )) levelonecode,"+
  540. "(select userid from wxworkuser where empCode = (select empcode from emp where e.leveltwo= id )) leveltwocode,"+
  541. "levelthree ,(select userid from wxworkuser where empCode = (select empcode from emp where e.levelthree= id )) levelthreecode,"+
  542. " ifnull(leveloneTime,0) leveloneTime,ifnull(leveltwoTime,0) leveltwoTime,ifnull(levelthreeTime,0) levelthreeTime ,(select tel from emp where id = e.levelone ) onetel,(select tel from emp where id = e.leveltwo ) twotel,(select tel from emp where id = e.levelthree ) threetel,(select dingdingCode from emp where id = e.levelone ) onedingdingCode,(select dingdingCode from emp where id = e.leveltwo ) twodingdingCode,(select dingdingCode from emp where id = e.levelthree ) threedingdingCode from equipment e where e.id in(%s) ", strings.Join(eqIdList, ",")))
  543. if err != nil {
  544. log.Println(err)
  545. return
  546. }
  547. maintainpushList, err := restful.MapStrList("select id,maintainId,eqId,level,usercode,DATE_FORMAT(pushTime,'%Y-%m-%d %H:%i:%S') pushTime " +
  548. "from maintainpush where DATE_FORMAT(pushTime,'%Y-%m-%d') = DATE_FORMAT(now(),'%Y-%m-%d') order by pushTime desc ")
  549. if err != nil {
  550. log.Println(err)
  551. return
  552. }
  553. for _, main := range maintainList {
  554. var levelonecode, leveltwocode, levelthreecode, levelone, leveltwo, levelthree, onetel, twotel, threetel, onedingdingCode, twodingdingCode, threedingdingCode string
  555. var leveloneTime, leveltwoTime, levelthreeTime int
  556. requestTime, err := time.ParseInLocation("2006-01-02 15:04:05", main["requestTime"], time.Local)
  557. if err != nil {
  558. log.Println(err)
  559. return
  560. }
  561. for _, eq := range equipmentList {
  562. if eq["id"] == main["eqId"] {
  563. //maintenancecode = main["pickId"]
  564. levelonecode = eq["levelonecode"]
  565. leveltwocode = eq["leveltwocode"]
  566. levelthreecode = eq["levelthreecode"]
  567. leveloneTime, _ = strconv.Atoi(eq["leveloneTime"])
  568. leveltwoTime, _ = strconv.Atoi(eq["leveltwoTime"])
  569. levelthreeTime, _ = strconv.Atoi(eq["levelthreeTime"])
  570. levelone = eq["levelone"]
  571. leveltwo = eq["leveltwo"]
  572. levelthree = eq["levelthree"]
  573. onetel = eq["onetel"]
  574. twotel = eq["twotel"]
  575. threetel = eq["threetel"]
  576. onedingdingCode = eq["onedingdingCode"]
  577. twodingdingCode = eq["twodingdingCode"]
  578. threedingdingCode = eq["threedingdingCode"]
  579. //push, _ = strconv.ParseInt(eq["pushTime"], 10, 64)
  580. break
  581. }
  582. }
  583. if leveloneTime == 0 || leveltwoTime == 0 || levelthreeTime == 0 {
  584. continue
  585. }
  586. var onePushTime, twoPushTime, threePushTime string
  587. for _, maintainpush := range maintainpushList {
  588. if maintainpush["eqId"] == main["eqId"] && maintainpush["maintainId"] == main["id"] {
  589. mainLevel, _ := strconv.ParseInt(maintainpush["level"], 10, 64)
  590. if mainLevel == 1 && onePushTime == "" {
  591. onePushTime = maintainpush["pushTime"]
  592. } else if mainLevel == 2 && twoPushTime == "" {
  593. twoPushTime = maintainpush["pushTime"]
  594. } else if mainLevel == 3 && threePushTime == "" {
  595. threePushTime = maintainpush["pushTime"]
  596. }
  597. }
  598. }
  599. pushData := make([]map[string]string, 0)
  600. empList, err := restful.MapStrList(` select empname from emp where FIND_IN_SET(id,?) `, main["pickId"])
  601. if err != nil {
  602. log.Println(err)
  603. return
  604. }
  605. var empName []string
  606. for _, emp := range empList {
  607. empName = append(empName, emp["empname"])
  608. }
  609. if onePushTime != "" {
  610. lastPushTime, err := time.ParseInLocation("2006-01-02 15:04:05", onePushTime, time.Local)
  611. if err != nil {
  612. log.Println(err)
  613. return
  614. }
  615. minute := (time.Now().Unix() - lastPushTime.Unix()) / 60
  616. if minute >= int64((leveloneTime * 60)) {
  617. pushData = append(pushData, map[string]string{"userid": levelonecode, "empId": levelone, "tel": onetel, "dingdingCode": onedingdingCode,
  618. "msg": fmt.Sprintf("【维修督办】报修单号%s超时未维修完成。\n设备资产编号:%s\n用途:%s\n故障类型:%s\n报修时间:%s\n推送时间:%s\n维修人:%s\n报修人:%s\n设备主管督办提醒,请至设备管理平台操作(若已处理请忽略)",
  619. main["repairCode"], main["eqCode"], main["purpose"], main["details"], main["requestTime"], time.Now().Format("2006-01-02 15:04:05"), strings.Join(empName, ","), main["requestername"])})
  620. tx.Exec(` insert into maintainpush(eqId,level,usercode,pushTime,maintainId)values(?,?,?,now(),?)`, main["eqId"], 1, levelonecode, main["id"])
  621. }
  622. } else {
  623. minute := (time.Now().Unix() - requestTime.Unix()) / 60
  624. if minute >= int64((leveloneTime * 60)) {
  625. pushData = append(pushData, map[string]string{"userid": levelonecode, "empId": levelone, "tel": onetel, "dingdingCode": onedingdingCode,
  626. "msg": fmt.Sprintf("【维修督办】报修单号%s超时未维修完成。\n设备资产编号:%s\n用途:%s\n故障类型:%s\n报修时间:%s\n推送时间:%s\n维修人:%s\n报修人:%s\n设备主管督办提醒,请至设备管理平台操作(若已处理请忽略)",
  627. main["repairCode"], main["eqCode"], main["purpose"], main["details"], main["requestTime"], time.Now().Format("2006-01-02 15:04:05"), strings.Join(empName, ","), main["requestername"])})
  628. _, err := tx.Exec(` insert into maintainpush(eqId,level,usercode,pushTime,maintainId)values(?,?,?,now(),?)`, main["eqId"], 1, levelonecode, main["id"])
  629. fmt.Println(err)
  630. }
  631. }
  632. if twoPushTime != "" {
  633. lastPushTime, err := time.ParseInLocation("2006-01-02 15:04:05", twoPushTime, time.Local)
  634. if err != nil {
  635. log.Println(err)
  636. return
  637. }
  638. minute := (time.Now().Unix() - lastPushTime.Unix()) / 60
  639. if minute >= int64((leveltwoTime * 60)) {
  640. pushData = append(pushData, map[string]string{"userid": leveltwocode, "empId": leveltwo, "tel": twotel, "dingdingCode": twodingdingCode,
  641. "msg": fmt.Sprintf("【维修督办】报修单号%s超时未维修完成。\n设备资产编号:%s\n用途:%s\n故障类型:%s\n报修时间:%s\n推送时间:%s\n维修人:%s\n报修人:%s\n设备助理督办提醒,请至设备管理平台操作(若已处理请忽略)",
  642. main["repairCode"], main["eqCode"], main["purpose"], main["details"], main["requestTime"], time.Now().Format("2006-01-02 15:04:05"), strings.Join(empName, ","), main["requestername"])})
  643. tx.Exec(` insert into maintainpush(eqId,level,usercode,pushTime,maintainId)values(?,?,?,now(),?)`, main["eqId"], 2, leveltwocode, main["id"])
  644. }
  645. } else {
  646. minute := (time.Now().Unix() - requestTime.Unix()) / 60
  647. if minute >= int64((leveltwoTime * 60)) {
  648. pushData = append(pushData, map[string]string{"userid": leveltwocode, "empId": leveltwo, "tel": twotel, "dingdingCode": twodingdingCode,
  649. "msg": fmt.Sprintf("【维修督办】报修单号%s超时未维修完成。\n设备资产编号:%s\n用途:%s\n故障类型:%s\n报修时间:%s\n推送时间:%s\n维修人:%s\n报修人:%s\n设备助理督办提醒,请至设备管理平台操作(若已处理请忽略)",
  650. main["repairCode"], main["eqCode"], main["purpose"], main["details"], main["requestTime"], time.Now().Format("2006-01-02 15:04:05"), strings.Join(empName, ","), main["requestername"])})
  651. tx.Exec(` insert into maintainpush(eqId,level,usercode,pushTime,maintainId)values(?,?,?,now(),?)`, main["eqId"], 2, leveltwocode, main["id"])
  652. }
  653. }
  654. if threePushTime != "" {
  655. lastPushTime, err := time.ParseInLocation("2006-01-02 15:04:05", threePushTime, time.Local)
  656. if err != nil {
  657. log.Println(err)
  658. return
  659. }
  660. minute := (time.Now().Unix() - lastPushTime.Unix()) / 60
  661. if minute >= int64((levelthreeTime * 60)) {
  662. pushData = append(pushData, map[string]string{"userid": levelthreecode, "empId": levelthree, "tel": threetel, "dingdingCode": threedingdingCode,
  663. "msg": fmt.Sprintf("【维修督办】报修单号%s超时未完成维修。\n设备资产编号:%s\n用途:%s\n故障类型:%s\n报修时间:%s\n推送时间:%s\n维修人:%s\n报修人:%s\n牧场总经理督办提醒,请至设备管理平台操作(若已处理请忽略)",
  664. main["repairCode"], main["eqCode"], main["purpose"], main["details"], main["requestTime"], time.Now().Format("2006-01-02 15:04:05"), strings.Join(empName, ","), main["requestername"])})
  665. tx.Exec(` insert into maintainpush(eqId,level,usercode,pushTime,maintainId)values(?,?,?,now(),?)`, main["eqId"], 3, levelthreecode, main["id"])
  666. }
  667. } else {
  668. minute := (time.Now().Unix() - requestTime.Unix()) / 60
  669. if minute >= int64((levelthreeTime * 60)) {
  670. pushData = append(pushData, map[string]string{"userid": levelthreecode, "empId": levelthree, "tel": threetel, "dingdingCode": threedingdingCode,
  671. "msg": fmt.Sprintf("【维修督办】报修单号%s超时未完成维修。\n设备资产编号:%s\n用途:%s\n故障类型:%s\n报修时间:%s\n推送时间:%s\n维修人:%s\n报修人:%s\n牧场总经理督办提醒,请至设备管理平台操作(若已处理请忽略)",
  672. main["repairCode"], main["eqCode"], main["purpose"], main["details"], main["requestTime"], time.Now().Format("2006-01-02 15:04:05"), strings.Join(empName, ","), main["requestername"])})
  673. tx.Exec(` insert into maintainpush(eqId,level,usercode,pushTime,maintainId)values(?,?,?,now(),?)`, main["eqId"], 3, levelthreecode, main["id"])
  674. }
  675. }
  676. go func(pushData []map[string]string) {
  677. MsgChan <- pushData
  678. }(pushData)
  679. }
  680. }
  681. var DingClient *dingding.Client
  682. type DingTalkSendReq struct {
  683. AgentId string `json:"agent_id"`
  684. UseridList string `json:"userid_list"`
  685. Msg msgDingTalkSend `json:"msg"`
  686. }
  687. type msgDingTalkSend struct {
  688. Msgtype string `json:"msgtype"`
  689. Text textDingTalkSend `json:"text"`
  690. }
  691. type textDingTalkSend struct {
  692. Content string `json:"content"`
  693. }
  694. type dingTalkUserId struct {
  695. Userid string `json:"userid"`
  696. }