scheduled.go 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969
  1. package api
  2. import (
  3. "bytes"
  4. "context"
  5. "encoding/json"
  6. "fmt"
  7. "io/ioutil"
  8. "log"
  9. "net/http"
  10. "os"
  11. "reflect"
  12. "strconv"
  13. "strings"
  14. "time"
  15. "../../pkg/app"
  16. "../../pkg/e"
  17. "../../pkg/logging"
  18. "../../pkg/setting"
  19. "../../routers/restful"
  20. "github.com/Anderson-Lu/gofasion/gofasion"
  21. "github.com/astaxie/beego/logs"
  22. "github.com/gin-gonic/gin"
  23. "github.com/robfig/cron"
  24. "github.com/xormplus/xorm"
  25. )
  26. func CronScheduled(ctx context.Context) {
  27. tx := restful.Engine.NewSession()
  28. defer tx.Close()
  29. pastureinfo := new(udPastureInfo)
  30. err := tx.SQL(`select column_default as pastureid from information_schema.COLUMNS
  31. WHERE table_name = 'recweight' AND table_schema = ? AND column_name = 'pastureid'`, setting.DatabaseSetting.Name).GetFirst(pastureinfo).Error
  32. if err != nil {
  33. logs.Error(err)
  34. return
  35. }
  36. // duetimecst, _ := time.ParseInLocation("15:04:05", "00:05:00", time.Local)
  37. // duetimecst1, _ := time.ParseInLocation("15:04:05", "00:00:00", time.Local)
  38. // spec := fmt.Sprintf("@every %v", duetimecst.Sub(duetimecst1))
  39. // c := cron.New()
  40. // c.AddFunc(spec, func() {
  41. // tx1 := restful.Engine.NewSession()
  42. // defer tx1.Close()
  43. // exist, err := tx1.Table("notice").Where("status = 1").And("content = ? ", "downloadedplan_log").Exist()
  44. // if err != nil {
  45. // logs.Error("CronScheduled-error-1:", err)
  46. // return
  47. // }
  48. // fmt.Println(exist)
  49. // if exist {
  50. // _, err := tx.SQL(`update notice set status = 0 where content = ? `, "downloadedplan_log").Execute()
  51. // if err != nil {
  52. // logs.Error("CronScheduled-error-2:", err)
  53. // return
  54. // }
  55. // Scheduled(ctx, tx1, pastureinfo)
  56. // }
  57. // })
  58. // c.Start()
  59. duetimecst2, _ := time.ParseInLocation("15:04:05", "00:00:30", time.Local)
  60. duetimecst3, _ := time.ParseInLocation("15:04:05", "00:00:00", time.Local)
  61. spec1 := fmt.Sprintf("@every %v", duetimecst2.Sub(duetimecst3))
  62. downloadplandtl1 := cron.New()
  63. downloadplandtl1.AddFunc(spec1, func() {
  64. dataList, err := tx.SQL(` select user,function,id from remind where pastureid = ? `, pastureinfo.Pastureid).Query().List()
  65. if err != nil {
  66. logs.Error("CronScheduled-error-3:", err)
  67. return
  68. }
  69. for _, data := range dataList {
  70. if data["function"].(string) == "processAnalysisEarlyWarning" {
  71. // user := strings.Split(data["user"].(string), ",")
  72. if len(data["user"].(string)) > 0 {
  73. var userids string
  74. for _, str := range strings.Split(data["user"].(string), ",") {
  75. if len(userids) <= 0 {
  76. userids = fmt.Sprintf("'%s'", str)
  77. } else {
  78. userids += fmt.Sprintf(",'%s'", str)
  79. }
  80. }
  81. sql := fmt.Sprintf(` select openid from user_wx where pastureid = ? and userid in(%s)`, userids)
  82. fmt.Println(sql)
  83. openidList, err := tx.SQL(sql, pastureinfo.Pastureid).Query().List()
  84. // openidList, err := tx.Table("user_wx").Where(" pastureid = ? ", pastureinfo.Pastureid).And("userid in (?)", data["user"].(string)).Query().List()
  85. if err != nil {
  86. logs.Error("CronScheduled-error-4:", err)
  87. return
  88. }
  89. var openIdList []string
  90. for _, open := range openidList {
  91. if open["openid"] != nil {
  92. openIdList = append(openIdList, open["openid"].(string))
  93. }
  94. }
  95. processAnalysisEarlyWarning(openIdList, pastureinfo.Pastureid, data["id"].(int64))
  96. }
  97. }
  98. }
  99. })
  100. downloadplandtl1.Start()
  101. }
  102. type ScheduledInfo struct {
  103. Id int64 `xorm:"id"`
  104. Sname string `xorm:"sname"`
  105. Action int64 `xorm:"action"`
  106. Childid int64 `xorm:"childid"`
  107. Times string `xorm:"times"`
  108. Enable string `xorm:"enable"`
  109. }
  110. type ScheduledUpInfo struct {
  111. Id int64 `xorm:"id"`
  112. Company string `xorm:"company"`
  113. Addres string `xorm:"addres"`
  114. Datatype int64 `xorm:"datatype"`
  115. Package string `xorm:"Package"`
  116. Datasql string `xorm:"datasql"`
  117. Automatic int64 `xorm:"automatic"`
  118. Manual int64 `xorm:"manual"`
  119. Targetdata string `xorm:"targetdata"`
  120. }
  121. type ScheduledDownInfo struct {
  122. Id int64 `xorm:"id"`
  123. Datatype int64 `xorm:"datatype"`
  124. Addres string `xorm:"addres"`
  125. Adressparam string `xorm:"adressparam"`
  126. Targetdata string `xorm:"targetdata"`
  127. Manual int64 `xorm:"manual"`
  128. Methods string `xorm:"methods"`
  129. }
  130. type ScheduledDownChildInfo struct {
  131. Id int64 `xorm:"id"`
  132. Parentid int64 `xorm:"parentid"`
  133. Fieldname string `xorm:"fieldname"`
  134. Checksql string `xorm:"checksql"`
  135. Dosql string `xorm:"dosql"`
  136. }
  137. func Scheduled(ctx context.Context, tx *xorm.Session, pastureinfo *udPastureInfo) {
  138. times := new(ScheduledInfo)
  139. err := tx.SQL(" select times from scheduled where action = 0 group by times").GetFirst(times).Error
  140. if err != nil {
  141. logs.Error(err)
  142. return
  143. }
  144. if times.Times == "0" {
  145. downloadedplanLogList, err := tx.SQL(` select id from downloadedplan_log where date = date_format(now(),'%Y-%m-%d') `).Query().List()
  146. if err != nil {
  147. logs.Error(err)
  148. return
  149. }
  150. ids := []string{}
  151. for _, item := range downloadedplanLogList {
  152. ids = append(ids, strconv.FormatInt(item["id"].(int64), 10))
  153. }
  154. fmt.Println(ids, time.Now())
  155. err = UpdatePush(ctx, tx, true, ids, pastureinfo, "")
  156. if err != nil {
  157. return
  158. }
  159. } else if times.Times == "1" {
  160. downloadedplanLogList, err := tx.SQL(` select times from downloadedplan_log where date = date_format(now(),'%Y-%m-%d') and status = 0 group by times`).Query().List()
  161. if err != nil {
  162. logs.Error(err)
  163. return
  164. }
  165. for _, item := range downloadedplanLogList {
  166. count, err := tx.SQL(` select count(1) from downloadedplan where pastureid = ? and mydate = date_format(now(),'%Y-%m-%d')
  167. and iscompleted = 0 and times = ? and enable = 1 `,
  168. pastureinfo.Pastureid, item["times"]).Count()
  169. if err != nil {
  170. logs.Error(err)
  171. return
  172. }
  173. if count == 0 {
  174. //推送
  175. downloadedplanLogList, err := tx.SQL(` select id from downloadedplan_log where date = date_format(now(),'%Y-%m-%d')
  176. and times = ? `, item["times"]).Query().List()
  177. if err != nil {
  178. logs.Error(err)
  179. return
  180. }
  181. ids := []string{}
  182. for _, item := range downloadedplanLogList {
  183. ids = append(ids, strconv.FormatInt(item["id"].(int64), 10))
  184. }
  185. err = UpdatePush(ctx, tx, true, ids, pastureinfo, "")
  186. if err != nil {
  187. return
  188. }
  189. }
  190. }
  191. } else if times.Times == "2" {
  192. count, err := tx.SQL(" select count(1) from downloadedplan where pastureid = ? and mydate = date_format(now(),'%Y-%m-%d') and iscompleted = 0 and enable = 1 ",
  193. pastureinfo.Pastureid).Count()
  194. if err != nil {
  195. logs.Error(err)
  196. return
  197. }
  198. if count == 0 {
  199. //推送
  200. downloadedplanLogList, err := tx.SQL(` select id from downloadedplan_log where date = date_format(now(),'%Y-%m-%d') `).Query().List()
  201. if err != nil {
  202. logs.Error(err)
  203. return
  204. }
  205. ids := []string{}
  206. for _, item := range downloadedplanLogList {
  207. ids = append(ids, strconv.FormatInt(item["id"].(int64), 10))
  208. }
  209. err = UpdatePush(ctx, tx, true, ids, pastureinfo, "")
  210. if err != nil {
  211. return
  212. }
  213. }
  214. }
  215. }
  216. func UpdateScheduledStatus(c *gin.Context) {
  217. appG := app.Gin{C: c}
  218. dataByte, _ := ioutil.ReadAll(c.Request.Body)
  219. fsion := gofasion.NewFasion(string(dataByte))
  220. idList := fsion.Get("id").Array()
  221. automatic := fsion.Get("automatic").ValueStr()
  222. manual := fsion.Get("manual").ValueStr()
  223. company := fsion.Get("company").ValueStr()
  224. //type 0 上传,1 下载
  225. typee := fsion.Get("type").ValueStr()
  226. ids := []string{}
  227. for _, item := range idList {
  228. ids = append(ids, item.ValueStr())
  229. }
  230. tx := restful.Engine.NewSession()
  231. defer tx.Close()
  232. tx.Begin()
  233. sqlstr := ""
  234. sqlstr1 := ""
  235. // var args []interface{}
  236. if typee == "0" {
  237. if len(ids) > 0 {
  238. sqlstr = `update scheduled s join scheduled_up su on su.id = s.childid set `
  239. sqlstr1 = `update scheduled s join scheduled_up su on su.id = s.childid set `
  240. if automatic != "" {
  241. sqlstr += " su.automatic = 1 "
  242. sqlstr1 += " su.automatic = 0 "
  243. } else if manual != "" {
  244. sqlstr += " su.manual = 1 "
  245. sqlstr1 += " su.manual = 0 "
  246. }
  247. id := strings.Join(ids, ",")
  248. sqlstr += fmt.Sprintf(" where s.id in (%s) and s.action = 0 and su.company = '%s' ", id, company)
  249. sqlstr1 += fmt.Sprintf(" where s.id not in (%s) and s.action = 0 and su.company ='%s' ", id, company)
  250. } else {
  251. sqlstr = `update scheduled s join scheduled_up su on su.id = s.childid set `
  252. if automatic != "" {
  253. sqlstr += " su.automatic = 0 "
  254. } else if manual != "" {
  255. sqlstr += " su.manual = 0 "
  256. }
  257. sqlstr += fmt.Sprintf(" where s.action = 0 and su.company = '%s' ", company)
  258. }
  259. } else {
  260. if len(ids) > 0 {
  261. sqlstr = `update scheduled s join scheduled_down sd on sd.id = s.childid set `
  262. sqlstr1 = `update scheduled s join scheduled_down sd on sd.id = s.childid set `
  263. sqlstr += " sd.manual = 1 "
  264. sqlstr1 += " sd.manual = 0 "
  265. id := strings.Join(ids, ",")
  266. sqlstr += fmt.Sprintf(" where s.id in (%s) and s.action = 1 and sd.company = '%s' ", id, company)
  267. sqlstr1 += fmt.Sprintf(" where s.id not in (%s) and s.action = 1 and sd.company = '%s' ", id, company)
  268. } else {
  269. sqlstr = `update scheduled s join scheduled_down sd on sd.id = s.childid set `
  270. sqlstr += " sd.manual = 0 "
  271. sqlstr += fmt.Sprintf(" where s.action = 1 and sd.company = '%s' ", company)
  272. }
  273. }
  274. _, err := tx.SQL(sqlstr).Execute()
  275. if err != nil {
  276. log.Println("UpdateScheduledStatus-error-1: ", err)
  277. appG.Response(http.StatusInternalServerError, e.ERROR, err)
  278. tx.Rollback()
  279. }
  280. if len(sqlstr1) > 0 {
  281. _, err = tx.SQL(sqlstr1).Execute()
  282. if err != nil {
  283. log.Println("UpdateScheduledStatus-error-2: ", err)
  284. appG.Response(http.StatusInternalServerError, e.ERROR, err)
  285. tx.Rollback()
  286. }
  287. }
  288. err = tx.Commit()
  289. if err != nil {
  290. log.Println("UpdateScheduledStatus-error-3: ", err)
  291. appG.Response(http.StatusInternalServerError, e.ERROR, err)
  292. tx.Rollback()
  293. }
  294. appG.Response(http.StatusOK, e.SUCCESS, true)
  295. }
  296. func SynchronizeNow(c *gin.Context) {
  297. appG := app.Gin{C: c}
  298. dataByte, _ := ioutil.ReadAll(c.Request.Body)
  299. fsion := gofasion.NewFasion(string(dataByte))
  300. company := fsion.Get("company").ValueStr()
  301. tx := restful.Engine.NewSession()
  302. defer tx.Close()
  303. pastureinfo := new(udPastureInfo)
  304. err := tx.SQL(`select column_default as pastureid from information_schema.COLUMNS
  305. WHERE table_name = 'recweight' AND table_schema = ? AND column_name = 'pastureid'`, setting.DatabaseSetting.Name).GetFirst(pastureinfo).Error
  306. if err != nil {
  307. appG.Response(http.StatusInternalServerError, e.ERROR, false)
  308. return
  309. }
  310. dataList, err := tx.SQL(`select id from downloadedplan_log where date = date_format(now(),'%Y-%m-%d') `).Query().List()
  311. if err != nil {
  312. appG.Response(http.StatusInternalServerError, e.ERROR, false)
  313. return
  314. }
  315. var idList []string
  316. for _, data := range dataList {
  317. idList = append(idList, strconv.FormatInt(data["id"].(int64), 10))
  318. }
  319. err = UpdatePush(c, tx, false, idList, pastureinfo, company)
  320. if err != nil {
  321. appG.Response(http.StatusInternalServerError, e.ERROR, false)
  322. return
  323. }
  324. UpdateDown(c, tx, nil, pastureinfo, company)
  325. if err != nil {
  326. appG.Response(http.StatusInternalServerError, e.ERROR, false)
  327. return
  328. }
  329. appG.Response(http.StatusOK, e.SUCCESS, true)
  330. }
  331. func UpdatePush(ctx context.Context, tx *xorm.Session, auto bool, idList []string, pastureinfo *udPastureInfo, company string) error {
  332. upList := make([]*ScheduledUpInfo, 0)
  333. up := tx.Table("scheduled_up")
  334. if company != "" {
  335. up.Where("company = ? ", company)
  336. }
  337. if auto {
  338. up.Where("automatic = 1")
  339. } else {
  340. up.Where("manual = 1")
  341. }
  342. err := up.Find(&upList)
  343. if err != nil {
  344. log.Println("UpdataPush-error-1: ", err)
  345. return err
  346. }
  347. for _, item := range upList {
  348. if item.Datasql != "" {
  349. if item.Datatype == 3 || item.Datatype == 4 {
  350. targetdataList := strings.Split(item.Targetdata, ",")
  351. var args []interface{}
  352. for _, targetdata := range targetdataList {
  353. if targetdata == "pastureid" {
  354. args = append(args, pastureinfo.Pastureid)
  355. } else if targetdata == "idlist" {
  356. // args = append(args, strings.Join(idList, ","))
  357. item.Datasql = strings.ReplaceAll(item.Datasql, "idlist", strings.Join(idList, ","))
  358. }
  359. }
  360. data, err := tx.SQL(item.Datasql, args...).Query().List()
  361. if err != nil {
  362. log.Println("UpdataPush-error-2: ", err)
  363. continue
  364. }
  365. if len(data) > 0 {
  366. databyte, err := json.Marshal(data)
  367. if err != nil {
  368. log.Println("UpdataPush-error-3: ", err)
  369. continue
  370. }
  371. var method string
  372. if item.Datatype == 4 {
  373. method = "uploadnewdiliverdata"
  374. }
  375. UDPostPush1(fmt.Sprintf(item.Package, string(databyte), len(data)), method)
  376. }
  377. if len(idList) > 0 {
  378. _, err := tx.SQL(fmt.Sprintf(" update downloadedplan_log set status = 1 where id in (%s)", strings.Join(idList, ","))).Execute()
  379. if err != nil {
  380. log.Println("UpdataPush-error-4: ", err)
  381. continue
  382. }
  383. }
  384. } else {
  385. targetdataList := strings.Split(item.Targetdata, ",")
  386. var args []interface{}
  387. for _, targetdata := range targetdataList {
  388. if targetdata == "pastureid" {
  389. args = append(args, pastureinfo.Pastureid)
  390. } else if targetdata == "idlist" {
  391. // args = append(args, strings.Join(idList, ","))
  392. item.Datasql = strings.ReplaceAll(item.Datasql, "idlist", strings.Join(idList, ","))
  393. }
  394. }
  395. data, err := tx.SQL(item.Datasql, args...).Query().List()
  396. if err != nil {
  397. log.Println("UpdataPush-error-5: ", err)
  398. // return err
  399. }
  400. if len(data) > 0 {
  401. databyte, err := json.Marshal(data)
  402. if err != nil {
  403. log.Println("UpdataPush-error-6: ", err)
  404. // return err
  405. continue
  406. }
  407. // d, err := OpenFile("a.txt")
  408. // d.WriteString()
  409. // UDPostPush(fmt.Sprintf(item.Package, string(databyte), len(data)), "application/json")
  410. UDPostPush1(fmt.Sprintf(item.Package, string(databyte), len(data)), "")
  411. }
  412. }
  413. }
  414. }
  415. return nil
  416. }
  417. // OpenFile 判断文件是否存在 存在则OpenFile 不存在则Create
  418. func OpenFile(filename string) (*os.File, error) {
  419. if _, err := os.Stat(filename); os.IsNotExist(err) {
  420. fmt.Println("文件不存在")
  421. return os.Create(filename) //创建文件
  422. }
  423. fmt.Println("文件存在")
  424. return os.OpenFile(filename, os.O_APPEND, 0666) //打开文件
  425. }
  426. func UpdateDown(ctx context.Context, tx *xorm.Session, idList []string, pastureinfo *udPastureInfo, company string) error {
  427. downList := make([]*ScheduledDownInfo, 0)
  428. down := tx.Table("scheduled_down")
  429. if company != "" {
  430. down.Where("company = ? ", company)
  431. }
  432. down.Where("manual = 1")
  433. err := down.Find(&downList)
  434. if err != nil {
  435. log.Println("UpdateDown-error-1: ", err)
  436. return err
  437. }
  438. for _, item := range downList {
  439. list := httpGetMC(item.Addres, item.Targetdata)
  440. if item.Methods != "" {
  441. s := ScheduledDown{}
  442. value := reflect.ValueOf(&s)
  443. f := value.MethodByName(item.Methods)
  444. f.Call([]reflect.Value{reflect.ValueOf(pastureinfo.Pastureid), reflect.ValueOf(list)})
  445. // value := reflect.ValueOf(&s)
  446. // f := value.MethodByName("Ccaa")
  447. // f.Call([]reflect.Value{reflect.ValueOf(list)})
  448. } else {
  449. childList := make([]*ScheduledDownChildInfo, 0)
  450. child := tx.Table("scheduled_down")
  451. child.Where("parentid = ? ", item.Id)
  452. err = child.Find(&childList)
  453. if err != nil {
  454. log.Println("UpdateDown-error-2: ", err)
  455. return err
  456. }
  457. if len(childList) > 0 {
  458. tx.Begin()
  459. for _, c := range childList {
  460. fieldnames := strings.Split(c.Fieldname, ",")
  461. for _, data := range list {
  462. var args []interface{}
  463. dataMap := data.(map[string]interface{})
  464. for _, fieldname := range fieldnames {
  465. args = append(args, dataMap[fieldname])
  466. }
  467. _, err = tx.SQL(c.Dosql, args...).Execute()
  468. if err != nil {
  469. tx.Rollback()
  470. log.Println("UpdateDown-error-3: ", err)
  471. return err
  472. }
  473. }
  474. }
  475. err := tx.Commit()
  476. if err != nil {
  477. tx.Rollback()
  478. log.Println("UpdateDown-error-4: ", err)
  479. return err
  480. }
  481. }
  482. }
  483. }
  484. return nil
  485. }
  486. func httpGetMC(url, targetdata string) []interface{} {
  487. // url := fmt.Sprintf("https://wdc.unidairy.cn/copartner_downloads/?farmId=%s&method=%s", farmId, method)
  488. res, err := http.Get(url)
  489. if err != nil {
  490. return nil
  491. }
  492. robots, err := ioutil.ReadAll(res.Body)
  493. res.Body.Close()
  494. if err != nil {
  495. return nil
  496. }
  497. var data map[string][]interface{}
  498. json.Unmarshal(robots, &data)
  499. return data[targetdata]
  500. }
  501. type ScheduledDown struct {
  502. }
  503. func (h *ScheduledDown) SyncFeed(pastureid string, feedList []interface{}) {
  504. tx := restful.Engine.NewSession()
  505. defer tx.Close()
  506. err := tx.Begin()
  507. if err != nil {
  508. tx.Rollback()
  509. logs.Error("syncFeed-error-1:", err)
  510. return
  511. }
  512. for _, f := range feedList {
  513. feed := f.(map[string]interface{})
  514. var feedcode, fname, fclass, fclassid, dry interface{}
  515. if _, ok := feed["feedcode"]; ok {
  516. feedcode = feed["feedcode"]
  517. }
  518. if _, ok := feed["feedname"]; ok {
  519. fname = feed["feedname"]
  520. }
  521. if _, ok := feed["feedclass"]; ok {
  522. fclass = feed["feedclass"]
  523. }
  524. if _, ok := feed["drymatter"]; ok {
  525. dry = feed["drymatter"]
  526. }
  527. fclassExist, err := tx.SQL(" select id from feedclass where pastureid = ? and fcname = ?", pastureid, fclass).Exist()
  528. if err != nil {
  529. tx.Rollback()
  530. logs.Error("syncFeed-error-2:", err)
  531. return
  532. }
  533. if fclassExist {
  534. fclassDataList, err := tx.SQL(" select id from feedclass where pastureid = ? and fcname = ?", pastureid, fclass).QueryString()
  535. if err != nil {
  536. tx.Rollback()
  537. logs.Error("syncFeed-error-3:", err)
  538. return
  539. }
  540. for _, fclassData := range fclassDataList {
  541. fclassid = fclassData["id"]
  542. }
  543. } else {
  544. ids, err := setting.SnowIds.NextId()
  545. if err != nil {
  546. ids = time.Now().UnixNano()
  547. logging.Info("create SnowIds err", err)
  548. }
  549. _, err = tx.SQL("insert into feedclass(id,pastureid,fccode,fcname,bigfeedclassname,bigfeedclassid,sort)VALUES(?,?,?,?,?,?,(select ifnull(max(f.sort),0) +1 from feedclass f where f.pastureid =? ))",
  550. ids, pastureid, fclass, fclass, fclass, ids, pastureid).Execute()
  551. if err != nil {
  552. tx.Rollback()
  553. logs.Error("syncFeed-error-4:", err)
  554. return
  555. }
  556. fclassid = ids
  557. }
  558. ids, err := setting.SnowIds.NextId()
  559. if err != nil {
  560. ids = time.Now().UnixNano()
  561. logging.Info("create SnowIds err", err)
  562. }
  563. insertSql := `insert into feed(id,pastureid,feedcode,fname,fclassid,fclass,dry)VALUES(?,?,?,?,?,?,?)
  564. ON DUPLICATE KEY UPDATE fname = ? ,dry = ? `
  565. _, err = tx.SQL(insertSql, ids, pastureid, feedcode, fname, fclassid, fclass, dry, fname, dry).Execute()
  566. if err != nil {
  567. tx.Rollback()
  568. logs.Error("syncFeed-error-5:", err)
  569. return
  570. }
  571. }
  572. err = tx.Commit()
  573. if err != nil {
  574. tx.Rollback()
  575. logs.Error("syncFeed-error-6:", err)
  576. return
  577. }
  578. return
  579. }
  580. func (h *ScheduledDown) SyncFeedp(pastureid string, feedpList []interface{}) error {
  581. tx := restful.Engine.NewSession()
  582. defer tx.Close()
  583. err := tx.Begin()
  584. if err != nil {
  585. logs.Error("syncFeedp-error-1:", err)
  586. return err
  587. }
  588. for _, f := range feedpList {
  589. feedp := f.(map[string]interface{})
  590. var barName, barCode, feedtempletCode, barId interface{}
  591. var ftId, tname interface{}
  592. var cowCount interface{}
  593. if _, ok := feedp["barname"]; ok {
  594. barName = feedp["barname"]
  595. }
  596. if _, ok := feedp["barcode"]; ok {
  597. barCode = feedp["barcode"]
  598. }
  599. if _, ok := feedp["cowcount"]; ok {
  600. cowCount = feedp["cowcount"]
  601. }
  602. if _, ok := feedp["feedtempletcode"]; ok {
  603. feedtempletCode = feedp["feedtempletCode"]
  604. }
  605. barCount, err := tx.SQL(" select count(1) from bar where pastureid = ? and bcode = ? ", pastureid, barCode).Count()
  606. if err != nil {
  607. tx.Rollback()
  608. logs.Error("syncFeedp-error-2:", err)
  609. return err
  610. }
  611. if barCount > 0 {
  612. barDataList, err := tx.SQL(" select id from bar where pastureid = ? and bcode = ?", pastureid, barCode).QueryString()
  613. if err != nil {
  614. tx.Rollback()
  615. logs.Error("syncFeedp-error-3:", err)
  616. return err
  617. }
  618. for _, barData := range barDataList {
  619. barId = barData["id"]
  620. }
  621. } else {
  622. barReq, err := tx.SQL("insert into bar(pastureid,bname,bcode)VALUES(?,?,?)", pastureid, barName, barCode).Execute()
  623. if err != nil {
  624. tx.Rollback()
  625. logs.Error("syncFeedp-error-4:", err)
  626. return err
  627. }
  628. id, err := barReq.LastInsertId()
  629. if err != nil {
  630. tx.Rollback()
  631. logs.Error("syncFeedp-error-5:", err)
  632. return err
  633. }
  634. barId = strconv.FormatInt(id, 10)
  635. }
  636. if feedtempletCode != "" {
  637. feedtempletDataList, err := tx.SQL(" select id,tname from feedtemplet where pastureid = ? and tcode = ?", pastureid, feedtempletCode).QueryString()
  638. if err != nil {
  639. tx.Rollback()
  640. logs.Error("syncFeedp-error-6:", err)
  641. return err
  642. }
  643. for _, feedtemplet := range feedtempletDataList {
  644. ftId = feedtemplet
  645. tname = feedtemplet
  646. }
  647. }
  648. insertSql := `insert into feedp(pastureid,barname,barid,ccount,ftid,ftname)VALUES(?,?,?,?,?,?)
  649. ON DUPLICATE KEY UPDATE ccount = ? ,ftid = ? ,ftname = ? `
  650. _, err = tx.SQL(insertSql, pastureid, barName, barId, cowCount, ftId, tname, cowCount, ftId, tname).Execute()
  651. if err != nil {
  652. tx.Rollback()
  653. logs.Error("syncFeedp-error-7:", err)
  654. return err
  655. }
  656. }
  657. err = tx.Commit()
  658. if err != nil {
  659. tx.Rollback()
  660. logs.Error("syncFeedp-error-8:", err)
  661. return err
  662. }
  663. return nil
  664. }
  665. func wxPush(target []string, content []interface{}, pastureId string, serviceId int64) {
  666. url := "http://tmrwatch.cn/notice/message"
  667. dataStr := `{
  668. "pasture_id":%s,
  669. "service_id":%d,
  670. "sys_name": "tmrWatch",
  671. "template_id": "BtkN1rWKOJtKP0C64lGxIrPzLRFsYFas-4gupX2-pFo",
  672. "target": %s,
  673. "miniprogram": {
  674. "appid": "wx9ab2b5b25701da0a",
  675. "pagepath": "pages/index/index?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IjAwMDI4IiwicGFzc3dvcmQiOiJlMTBhZGMzOTQ5YmE1OWFiYmU1NmUwNTdmMjBmODgzZSIsImV4cCI6MTY1NDIzMDMxMywiaXNzIjoiaHR0cHM6Ly9naXRodWIuY29tL2twdHl1bi9nby1hZG1pbi8ifQ.jKLR74kTy9tXqFH5OwlwK7zTGKvMVbrOecsaJpxbxq8"
  676. },
  677. "keys": [
  678. "first",
  679. "keyword1",
  680. "keyword2",
  681. "keyword3",
  682. "remark"
  683. ],
  684. "content":%s
  685. }`
  686. targetStr, _ := json.Marshal(target)
  687. contentStr, _ := json.Marshal(content)
  688. dataStr = fmt.Sprintf(dataStr, pastureId, serviceId, string(targetStr), string(contentStr))
  689. var jsonStr = []byte(dataStr)
  690. req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonStr))
  691. req.Header.Set("Content-Type", "application/json")
  692. client := &http.Client{}
  693. resp, err := client.Do(req)
  694. if err != nil {
  695. panic(err)
  696. }
  697. defer resp.Body.Close()
  698. body, _ := ioutil.ReadAll(resp.Body)
  699. fmt.Println(dataStr)
  700. fmt.Println("response Body:", string(body), "fasong")
  701. }
  702. func UDPostPush1(data, method string) {
  703. url := "https://wdc.unidairy.cn/copartner_uploads/"
  704. // 超时时间:5秒
  705. // fmt.Println(data)
  706. var jsonStr = []byte(data)
  707. req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonStr))
  708. req.Header.Set("Content-Type", "application/json")
  709. client := &http.Client{}
  710. resp, err := client.Do(req)
  711. if err != nil {
  712. logs.Error(err)
  713. }
  714. defer resp.Body.Close()
  715. body, _ := ioutil.ReadAll(resp.Body)
  716. fsion := gofasion.NewFasion(string(body))
  717. tx := restful.Engine.NewSession()
  718. defer tx.Close()
  719. if fsion.Get("status").ValueStr() != "ok" {
  720. _, err := tx.SQL(`update notice set status = 1 where content = ? `, "downloadedplan_log").Execute()
  721. if err != nil {
  722. return
  723. }
  724. }
  725. if method == "uploadnewdiliverdata" {
  726. _, err = tx.SQL(` insert into log(method,status,data,date)values(?,?,?,now())`, method, fsion.Get("status").ValueStr(), data).Execute()
  727. if err != nil {
  728. return
  729. }
  730. }
  731. fmt.Println("response Body:", string(body))
  732. }
  733. func processAnalysisEarlyWarning(target []string, pastureId string, serviceId int64) {
  734. tx2 := restful.Engine.NewSession()
  735. defer tx2.Close()
  736. exist, err := tx2.Table("notice").Where("status = 1").And("content = ? ", "downloadplandtl1").Exist()
  737. if err != nil {
  738. logs.Error("CronScheduled-error-4:", err)
  739. return
  740. }
  741. if exist {
  742. _, err := tx2.SQL(`update notice set status = 0 where content = ? `, "downloadplandtl1").Execute()
  743. if err != nil {
  744. logs.Error("CronScheduled-error-5:", err)
  745. return
  746. }
  747. dataList, err := tx2.SQL("select * from downloadplandtl1_log where date = date_format(now(),'%Y-%m-%d') ").Query().List()
  748. if err != nil {
  749. logs.Error("CronScheduled-error-6:", err)
  750. return
  751. }
  752. plandtl1SlIdMap := make(map[string][]int64, 0)
  753. // plandtl1HlIdMap := make(map[string][]string, 0)
  754. for _, data := range dataList {
  755. if data["type"].(int64) == 0 && data["plandtl1"] != nil {
  756. plandtl1SlIdMap["planid"] = append(plandtl1SlIdMap["planid"], data["plandtl1"].(int64))
  757. }
  758. }
  759. for _, data := range dataList {
  760. if data["type"].(int64) == 0 {
  761. plandtl1List, err := tx2.SQL(`select d1.fname,d.tmrtname,d1.intime,d1.id,d1.feedallowratio,abs(d1.actualweightminus -d1.lweight ) errorvalue ,d1.actualweightminus,d1.lweight,
  762. if(d1.actualweightminus <= d1.lweight,ROUND(d1.actualweightminus/d1.lweight* 100,2),ROUND(d1.lweight/d1.actualweightminus* 100,2) ) as accuracy from
  763. downloadplandtl1 d1
  764. join downloadedplan d on d.id = d1.pid
  765. where d1.pid = ? and d1.sort = ? and d1.pastureid = ? and d1.intime is not null and d1.type = 0 `,
  766. data["planid"], data["sort"], data["pastureid"]).Query().List()
  767. if err != nil {
  768. logs.Error("CronScheduled-error-7:", err)
  769. return
  770. }
  771. idexist := false
  772. for _, plandtl1 := range plandtl1List {
  773. //防止同顺序饲料多次推送
  774. for _, plandtl1Id := range plandtl1SlIdMap["planid"] {
  775. if plandtl1Id == plandtl1["id"].(int64) {
  776. idexist = true
  777. break
  778. }
  779. }
  780. if idexist {
  781. continue
  782. }
  783. errorvalue, _ := strconv.ParseFloat(plandtl1["errorvalue"].(string), 64)
  784. if plandtl1["feedallowratio"].(float64) < errorvalue {
  785. // if plandtl1["feedallowratio"].(float64) < plandtl1["errorvalue"].(float64) {
  786. fmt.Println(plandtl1, "推送")
  787. // target := []string{"13916925233"}
  788. var sendList []interface{}
  789. sendStr := fmt.Sprintf("tmr名称:%v\n饲料名称:%v\n计划重量(kg):%v\n实际重量(kg):%v\n误差值(kg):%v\n准确率:%v",
  790. plandtl1["tmrtname"], plandtl1["fname"], plandtl1["lweight"], plandtl1["actualweightminus"], plandtl1["errorvalue"], plandtl1["accuracy"])
  791. // content = append(content, "混料", plandtl1["begintime"], "kpt", sendStr, "搅拌预警")
  792. sendMap1 := make(map[string]interface{}, 0)
  793. sendMap1["value"] = "搅拌"
  794. sendMap1["color"] = "#173177"
  795. sendList = append(sendList, sendMap1)
  796. sendMap2 := make(map[string]interface{}, 0)
  797. sendMap2["value"] = plandtl1["intime"]
  798. sendMap2["color"] = "#173177"
  799. sendList = append(sendList, sendMap2)
  800. sendMap3 := make(map[string]interface{}, 0)
  801. sendMap3["value"] = "kpt"
  802. sendMap3["color"] = "#173177"
  803. sendList = append(sendList, sendMap3)
  804. sendMap4 := make(map[string]interface{}, 0)
  805. sendMap4["value"] = sendStr
  806. sendMap4["color"] = "#173177"
  807. sendList = append(sendList, sendMap4)
  808. sendMap5 := make(map[string]interface{}, 0)
  809. sendMap5["value"] = "搅拌预警"
  810. sendMap5["color"] = "#173177"
  811. sendList = append(sendList, sendMap5)
  812. wxPush(target, sendList, pastureId, serviceId)
  813. }
  814. plandtl1SlIdMap["planid"] = append(plandtl1SlIdMap["planid"], plandtl1["id"].(int64))
  815. _, err := tx2.SQL(" update downloadplandtl1_log set plandtl1 = ? where id = ? and type = 0 ", plandtl1["id"], data["id"]).Execute()
  816. if err != nil {
  817. logs.Error("CronScheduled-error-8:", err)
  818. return
  819. }
  820. }
  821. } else {
  822. plandtl1List, err := tx2.SQL(`select d2.fname,d.tmrtname,d2.id,ifnull(d2.allowratio,0) allowratio ,abs(d2.actualweightminus -d2.lweight ) errorvalue ,d2.intime,d2.actualweightminus,d2.lweight,
  823. if(d2.actualweightminus <= d2.lweight,ROUND(d2.actualweightminus/d2.lweight* 100,2),ROUND(d2.lweight/d2.actualweightminus* 100,2) ) as accuracy
  824. from downloadplandtl2 d2
  825. join downloadedplan d on d.id = d2.pid
  826. where d2.pid = ? and d2.sort = ? and d2.pastureid = ? and d2.intime is not null and d2.type = 0 `,
  827. data["planid"], data["sort"], data["pastureid"]).Query().List()
  828. // Where(" pid = ? ", data["planid"]).And("sort = ? ", data["sort"]).And(" pastureid = ? ", data["pastureid"]).And(" intime is not null").And("type = 0 ").Query().List()
  829. if err != nil {
  830. logs.Error("CronScheduled-error-7:", err)
  831. return
  832. }
  833. for _, plandtl1 := range plandtl1List {
  834. errorvalue, _ := strconv.ParseFloat(plandtl1["errorvalue"].(string), 64)
  835. if float64(plandtl1["allowratio"].(int64)) < errorvalue && float64(plandtl1["allowratio"].(int64)) != 0 {
  836. fmt.Println(plandtl1, "推送")
  837. // target := []string{"13916925233"}
  838. // var content []interface{}
  839. var sendList []interface{}
  840. sendStr := fmt.Sprintf("tmr名称:%v\n栏舍名称:%v\n计划重量(kg):%v\n实际重量(kg):%v\n误差值(kg):%v\n准确率:%v",
  841. plandtl1["tmrtname"], plandtl1["fname"], plandtl1["lweight"], plandtl1["actualweightminus"], plandtl1["errorvalue"], plandtl1["accuracy"])
  842. sendMap1 := make(map[string]interface{}, 0)
  843. sendMap1["value"] = "撒料"
  844. sendMap1["color"] = "#173177"
  845. sendList = append(sendList, sendMap1)
  846. sendMap2 := make(map[string]interface{}, 0)
  847. sendMap2["value"] = plandtl1["intime"]
  848. sendMap2["color"] = "#173177"
  849. sendList = append(sendList, sendMap2)
  850. sendMap3 := make(map[string]interface{}, 0)
  851. sendMap3["value"] = "kpt"
  852. sendMap3["color"] = "#173177"
  853. sendList = append(sendList, sendMap3)
  854. sendMap4 := make(map[string]interface{}, 0)
  855. sendMap4["value"] = sendStr
  856. sendMap4["color"] = "#173177"
  857. sendList = append(sendList, sendMap4)
  858. sendMap5 := make(map[string]interface{}, 0)
  859. sendMap5["value"] = "撒料预警"
  860. sendMap5["color"] = "#173177"
  861. sendList = append(sendList, sendMap5)
  862. wxPush(target, sendList, pastureId, serviceId)
  863. }
  864. plandtl1SlIdMap["planid"] = append(plandtl1SlIdMap["planid"], plandtl1["id"].(int64))
  865. _, err := tx2.SQL(" update downloadplandtl1_log set plandtl1 = ? where id = ? and type = 1 ", plandtl1["id"], data["id"]).Execute()
  866. if err != nil {
  867. logs.Error("CronScheduled-error-8:", err)
  868. return
  869. }
  870. }
  871. }
  872. }
  873. }
  874. }