scheduled.go 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980
  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:10: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:01:00", 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, "", time.Now().Format("2022-01-02"))
  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, "", time.Now().Format("2022-01-02"))
  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, "", time.Now().Format("2022-01-02"))
  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. date := fsion.Get("date").ValueStr()
  302. tx := restful.Engine.NewSession()
  303. defer tx.Close()
  304. pastureinfo := new(udPastureInfo)
  305. err := tx.SQL(`select column_default as pastureid from information_schema.COLUMNS
  306. WHERE table_name = 'recweight' AND table_schema = ? AND column_name = 'pastureid'`, setting.DatabaseSetting.Name).GetFirst(pastureinfo).Error
  307. if err != nil {
  308. appG.Response(http.StatusInternalServerError, e.ERROR, false)
  309. return
  310. }
  311. dataList, err := tx.SQL(`select id from downloadedplan_log where date = date_format(?,'%Y-%m-%d') `, date).Query().List()
  312. if err != nil {
  313. appG.Response(http.StatusInternalServerError, e.ERROR, false)
  314. return
  315. }
  316. var idList []string
  317. for _, data := range dataList {
  318. idList = append(idList, strconv.FormatInt(data["id"].(int64), 10))
  319. }
  320. err = UpdatePush(c, tx, false, idList, pastureinfo, company, date)
  321. if err != nil {
  322. appG.Response(http.StatusInternalServerError, e.ERROR, false)
  323. return
  324. }
  325. UpdateDown(c, tx, nil, pastureinfo, company)
  326. if err != nil {
  327. appG.Response(http.StatusInternalServerError, e.ERROR, false)
  328. return
  329. }
  330. appG.Response(http.StatusOK, e.SUCCESS, true)
  331. }
  332. func UpdatePush(ctx context.Context, tx *xorm.Session, auto bool, idList []string, pastureinfo *udPastureInfo, company, date string) error {
  333. upList := make([]*ScheduledUpInfo, 0)
  334. up := tx.Table("scheduled_up")
  335. if company != "" {
  336. up.Where("company = ? ", company)
  337. }
  338. if auto {
  339. up.Where("automatic = 1")
  340. } else {
  341. up.Where("manual = 1")
  342. }
  343. err := up.Find(&upList)
  344. if err != nil {
  345. log.Println("UpdataPush-error-1: ", err)
  346. return err
  347. }
  348. for _, item := range upList {
  349. if item.Datasql != "" {
  350. if item.Datatype == 3 || item.Datatype == 4 {
  351. targetdataList := strings.Split(item.Targetdata, ",")
  352. var args []interface{}
  353. for _, targetdata := range targetdataList {
  354. if targetdata == "pastureid" {
  355. args = append(args, pastureinfo.Pastureid)
  356. } else if targetdata == "idlist" {
  357. // args = append(args, strings.Join(idList, ","))
  358. item.Datasql = strings.ReplaceAll(item.Datasql, "idlist", strings.Join(idList, ","))
  359. } else if targetdata == "date" {
  360. args = append(args, date)
  361. }
  362. }
  363. fmt.Println(item.Datasql)
  364. data, err := tx.SQL(item.Datasql, args...).Query().List()
  365. if err != nil {
  366. log.Println("UpdataPush-error-2: ", err)
  367. continue
  368. }
  369. if len(data) > 0 {
  370. databyte, err := json.Marshal(data)
  371. if err != nil {
  372. log.Println("UpdataPush-error-3: ", err)
  373. continue
  374. }
  375. var method string
  376. if item.Datatype == 4 {
  377. method = "uploadnewdiliverdata"
  378. }
  379. UDPostPush1(fmt.Sprintf(item.Package, string(databyte), len(data)), method)
  380. }
  381. if len(idList) > 0 {
  382. _, err := tx.SQL(fmt.Sprintf(" update downloadedplan_log set status = 1 where id in (%s)", strings.Join(idList, ","))).Execute()
  383. if err != nil {
  384. log.Println("UpdataPush-error-4: ", err)
  385. continue
  386. }
  387. }
  388. } else {
  389. targetdataList := strings.Split(item.Targetdata, ",")
  390. var args []interface{}
  391. for _, targetdata := range targetdataList {
  392. if targetdata == "pastureid" {
  393. args = append(args, pastureinfo.Pastureid)
  394. } else if targetdata == "idlist" {
  395. // args = append(args, strings.Join(idList, ","))
  396. item.Datasql = strings.ReplaceAll(item.Datasql, "idlist", strings.Join(idList, ","))
  397. }
  398. }
  399. data, err := tx.SQL(item.Datasql, args...).Query().List()
  400. if err != nil {
  401. log.Println("UpdataPush-error-5: ", err)
  402. // return err
  403. }
  404. if len(data) > 0 {
  405. databyte, err := json.Marshal(data)
  406. if err != nil {
  407. log.Println("UpdataPush-error-6: ", err)
  408. // return err
  409. continue
  410. }
  411. // d, err := OpenFile("a.txt")
  412. // d.WriteString()
  413. // UDPostPush(fmt.Sprintf(item.Package, string(databyte), len(data)), "application/json")
  414. UDPostPush1(fmt.Sprintf(item.Package, string(databyte), len(data)), "")
  415. }
  416. }
  417. }
  418. }
  419. return nil
  420. }
  421. // OpenFile 判断文件是否存在 存在则OpenFile 不存在则Create
  422. func OpenFile(filename string) (*os.File, error) {
  423. if _, err := os.Stat(filename); os.IsNotExist(err) {
  424. fmt.Println("文件不存在")
  425. return os.Create(filename) //创建文件
  426. }
  427. fmt.Println("文件存在")
  428. return os.OpenFile(filename, os.O_APPEND, 0666) //打开文件
  429. }
  430. func UpdateDown(ctx context.Context, tx *xorm.Session, idList []string, pastureinfo *udPastureInfo, company string) error {
  431. downList := make([]*ScheduledDownInfo, 0)
  432. down := tx.Table("scheduled_down")
  433. if company != "" {
  434. down.Where("company = ? ", company)
  435. }
  436. down.Where("manual = 1")
  437. err := down.Find(&downList)
  438. if err != nil {
  439. log.Println("UpdateDown-error-1: ", err)
  440. return err
  441. }
  442. for _, item := range downList {
  443. list := httpGetMC(item.Addres, item.Targetdata)
  444. if item.Methods != "" {
  445. s := ScheduledDown{}
  446. value := reflect.ValueOf(&s)
  447. f := value.MethodByName(item.Methods)
  448. f.Call([]reflect.Value{reflect.ValueOf(pastureinfo.Pastureid), reflect.ValueOf(list)})
  449. // value := reflect.ValueOf(&s)
  450. // f := value.MethodByName("Ccaa")
  451. // f.Call([]reflect.Value{reflect.ValueOf(list)})
  452. } else {
  453. childList := make([]*ScheduledDownChildInfo, 0)
  454. child := tx.Table("scheduled_down")
  455. child.Where("parentid = ? ", item.Id)
  456. err = child.Find(&childList)
  457. if err != nil {
  458. log.Println("UpdateDown-error-2: ", err)
  459. return err
  460. }
  461. if len(childList) > 0 {
  462. tx.Begin()
  463. for _, c := range childList {
  464. fieldnames := strings.Split(c.Fieldname, ",")
  465. for _, data := range list {
  466. var args []interface{}
  467. dataMap := data.(map[string]interface{})
  468. for _, fieldname := range fieldnames {
  469. args = append(args, dataMap[fieldname])
  470. }
  471. _, err = tx.SQL(c.Dosql, args...).Execute()
  472. if err != nil {
  473. tx.Rollback()
  474. log.Println("UpdateDown-error-3: ", err)
  475. return err
  476. }
  477. }
  478. }
  479. err := tx.Commit()
  480. if err != nil {
  481. tx.Rollback()
  482. log.Println("UpdateDown-error-4: ", err)
  483. return err
  484. }
  485. }
  486. }
  487. }
  488. return nil
  489. }
  490. func httpGetMC(url, targetdata string) []interface{} {
  491. // url := fmt.Sprintf("https://wdc.unidairy.cn/copartner_downloads/?farmId=%s&method=%s", farmId, method)
  492. res, err := http.Get(url)
  493. if err != nil {
  494. return nil
  495. }
  496. robots, err := ioutil.ReadAll(res.Body)
  497. res.Body.Close()
  498. if err != nil {
  499. return nil
  500. }
  501. var data map[string][]interface{}
  502. json.Unmarshal(robots, &data)
  503. return data[targetdata]
  504. }
  505. type ScheduledDown struct {
  506. }
  507. func (h *ScheduledDown) SyncFeed(pastureid string, feedList []interface{}) {
  508. tx := restful.Engine.NewSession()
  509. defer tx.Close()
  510. err := tx.Begin()
  511. if err != nil {
  512. tx.Rollback()
  513. logs.Error("syncFeed-error-1:", err)
  514. return
  515. }
  516. for _, f := range feedList {
  517. feed := f.(map[string]interface{})
  518. var feedcode, fname, fclass, fclassid, dry interface{}
  519. if _, ok := feed["feedcode"]; ok {
  520. feedcode = feed["feedcode"]
  521. }
  522. if _, ok := feed["feedname"]; ok {
  523. fname = feed["feedname"]
  524. }
  525. if _, ok := feed["feedclass"]; ok {
  526. fclass = feed["feedclass"]
  527. }
  528. if _, ok := feed["drymatter"]; ok {
  529. dry = feed["drymatter"]
  530. }
  531. fclassExist, err := tx.SQL(" select id from feedclass where pastureid = ? and fcname = ?", pastureid, fclass).Exist()
  532. if err != nil {
  533. tx.Rollback()
  534. logs.Error("syncFeed-error-2:", err)
  535. return
  536. }
  537. if fclassExist {
  538. fclassDataList, err := tx.SQL(" select id from feedclass where pastureid = ? and fcname = ?", pastureid, fclass).QueryString()
  539. if err != nil {
  540. tx.Rollback()
  541. logs.Error("syncFeed-error-3:", err)
  542. return
  543. }
  544. for _, fclassData := range fclassDataList {
  545. fclassid = fclassData["id"]
  546. }
  547. } else {
  548. ids, err := setting.SnowIds.NextId()
  549. if err != nil {
  550. ids = time.Now().UnixNano()
  551. logging.Info("create SnowIds err", err)
  552. }
  553. _, 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 =? ))",
  554. ids, pastureid, fclass, fclass, fclass, ids, pastureid).Execute()
  555. if err != nil {
  556. tx.Rollback()
  557. logs.Error("syncFeed-error-4:", err)
  558. return
  559. }
  560. fclassid = ids
  561. }
  562. ids, err := setting.SnowIds.NextId()
  563. if err != nil {
  564. ids = time.Now().UnixNano()
  565. logging.Info("create SnowIds err", err)
  566. }
  567. insertSql := `insert into feed(id,pastureid,feedcode,fname,fclassid,fclass,dry)VALUES(?,?,?,?,?,?,?)
  568. ON DUPLICATE KEY UPDATE fname = ? ,dry = ? `
  569. _, err = tx.SQL(insertSql, ids, pastureid, feedcode, fname, fclassid, fclass, dry, fname, dry).Execute()
  570. if err != nil {
  571. tx.Rollback()
  572. logs.Error("syncFeed-error-5:", err)
  573. return
  574. }
  575. }
  576. err = tx.Commit()
  577. if err != nil {
  578. tx.Rollback()
  579. logs.Error("syncFeed-error-6:", err)
  580. return
  581. }
  582. return
  583. }
  584. func (h *ScheduledDown) SyncFeedp(pastureid string, feedpList []interface{}) error {
  585. tx := restful.Engine.NewSession()
  586. defer tx.Close()
  587. err := tx.Begin()
  588. if err != nil {
  589. logs.Error("syncFeedp-error-1:", err)
  590. return err
  591. }
  592. for _, f := range feedpList {
  593. feedp := f.(map[string]interface{})
  594. var barName, barCode, feedtempletCode, barId interface{}
  595. var ftId, tname interface{}
  596. var cowCount interface{}
  597. if _, ok := feedp["barname"]; ok {
  598. barName = feedp["barname"]
  599. }
  600. if _, ok := feedp["barcode"]; ok {
  601. barCode = feedp["barcode"]
  602. }
  603. if _, ok := feedp["cowcount"]; ok {
  604. cowCount = feedp["cowcount"]
  605. }
  606. if _, ok := feedp["feedtempletcode"]; ok {
  607. feedtempletCode = feedp["feedtempletCode"]
  608. }
  609. barCount, err := tx.SQL(" select count(1) from bar where pastureid = ? and bcode = ? ", pastureid, barCode).Count()
  610. if err != nil {
  611. tx.Rollback()
  612. logs.Error("syncFeedp-error-2:", err)
  613. return err
  614. }
  615. if barCount > 0 {
  616. barDataList, err := tx.SQL(" select id from bar where pastureid = ? and bcode = ?", pastureid, barCode).QueryString()
  617. if err != nil {
  618. tx.Rollback()
  619. logs.Error("syncFeedp-error-3:", err)
  620. return err
  621. }
  622. for _, barData := range barDataList {
  623. barId = barData["id"]
  624. }
  625. } else {
  626. barReq, err := tx.SQL("insert into bar(pastureid,bname,bcode)VALUES(?,?,?)", pastureid, barName, barCode).Execute()
  627. if err != nil {
  628. tx.Rollback()
  629. logs.Error("syncFeedp-error-4:", err)
  630. return err
  631. }
  632. id, err := barReq.LastInsertId()
  633. if err != nil {
  634. tx.Rollback()
  635. logs.Error("syncFeedp-error-5:", err)
  636. return err
  637. }
  638. barId = strconv.FormatInt(id, 10)
  639. }
  640. if feedtempletCode != "" {
  641. feedtempletDataList, err := tx.SQL(" select id,tname from feedtemplet where pastureid = ? and tcode = ?", pastureid, feedtempletCode).QueryString()
  642. if err != nil {
  643. tx.Rollback()
  644. logs.Error("syncFeedp-error-6:", err)
  645. return err
  646. }
  647. for _, feedtemplet := range feedtempletDataList {
  648. ftId = feedtemplet
  649. tname = feedtemplet
  650. }
  651. }
  652. insertSql := `insert into feedp(pastureid,barname,barid,ccount,ftid,ftname)VALUES(?,?,?,?,?,?)
  653. ON DUPLICATE KEY UPDATE ccount = ? ,ftid = ? ,ftname = ? `
  654. _, err = tx.SQL(insertSql, pastureid, barName, barId, cowCount, ftId, tname, cowCount, ftId, tname).Execute()
  655. if err != nil {
  656. tx.Rollback()
  657. logs.Error("syncFeedp-error-7:", err)
  658. return err
  659. }
  660. }
  661. err = tx.Commit()
  662. if err != nil {
  663. tx.Rollback()
  664. logs.Error("syncFeedp-error-8:", err)
  665. return err
  666. }
  667. return nil
  668. }
  669. func wxPush(target []string, content []interface{}, pastureId string, serviceId int64) {
  670. url := "http://tmrwatch.cn/notice/message"
  671. dataStr := `{
  672. "pasture_id":%s,
  673. "service_id":%d,
  674. "sys_name": "tmrWatch",
  675. "target": %s,
  676. "miniprogram": {
  677. "appid": "wx9ab2b5b25701da0a",
  678. "pagepath": "pages/login/login"
  679. },
  680. "keys": [
  681. "first",
  682. "keyword1",
  683. "keyword2",
  684. "remark"
  685. ],
  686. "content":%s
  687. }`
  688. targetStr, _ := json.Marshal(target)
  689. contentStr, _ := json.Marshal(content)
  690. dataStr = fmt.Sprintf(dataStr, pastureId, serviceId, string(targetStr), string(contentStr))
  691. var jsonStr = []byte(dataStr)
  692. req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonStr))
  693. req.Header.Set("Content-Type", "application/json")
  694. client := &http.Client{}
  695. resp, err := client.Do(req)
  696. if err != nil {
  697. logs.Error(err)
  698. }
  699. defer resp.Body.Close()
  700. body, _ := ioutil.ReadAll(resp.Body)
  701. fmt.Println(dataStr)
  702. fmt.Println("response Body:", string(body), "fasong")
  703. }
  704. func UDPostPush1(data, method string) {
  705. url := "https://wdc.unidairy.cn/copartner_uploads/"
  706. // 超时时间:5秒
  707. // fmt.Println(data)
  708. var jsonStr = []byte(data)
  709. req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonStr))
  710. req.Header.Set("Content-Type", "application/json")
  711. client := &http.Client{}
  712. resp, err := client.Do(req)
  713. if err != nil {
  714. logs.Error(err)
  715. }
  716. defer resp.Body.Close()
  717. body, _ := ioutil.ReadAll(resp.Body)
  718. fsion := gofasion.NewFasion(string(body))
  719. tx := restful.Engine.NewSession()
  720. defer tx.Close()
  721. if fsion.Get("status").ValueStr() != "ok" {
  722. _, err := tx.SQL(`update notice set status = 1 where content = ? `, "downloadedplan_log").Execute()
  723. if err != nil {
  724. return
  725. }
  726. }
  727. if method == "uploadnewdiliverdata" {
  728. _, err = tx.SQL(` insert into log(method,status,data,date)values(?,?,?,now())`, method, fsion.Get("status").ValueStr(), data).Execute()
  729. if err != nil {
  730. return
  731. }
  732. }
  733. fmt.Println("response Body:", string(body))
  734. }
  735. func processAnalysisEarlyWarning(target []string, pastureId string, serviceId int64) {
  736. tx2 := restful.Engine.NewSession()
  737. defer tx2.Close()
  738. exist, err := tx2.Table("notice").Where("status = 1").And("content = ? ", "downloadplandtl1").Exist()
  739. if err != nil {
  740. logs.Error("CronScheduled-error-4:", err)
  741. return
  742. }
  743. if exist {
  744. _, err := tx2.SQL(`update notice set status = 0 where content = ? `, "downloadplandtl1").Execute()
  745. if err != nil {
  746. logs.Error("CronScheduled-error-5:", err)
  747. return
  748. }
  749. dataList, err := tx2.SQL("select * from downloadplandtl1_log where date = date_format(now(),'%Y-%m-%d') ").Query().List()
  750. if err != nil {
  751. logs.Error("CronScheduled-error-6:", err)
  752. return
  753. }
  754. plandtl1SlIdMap := make(map[string][]int64, 0)
  755. // plandtl1HlIdMap := make(map[string][]string, 0)
  756. for _, data := range dataList {
  757. if data["type"].(int64) == 0 && data["plandtl1"] != nil {
  758. plandtl1SlIdMap["planid"] = append(plandtl1SlIdMap["planid"], data["plandtl1"].(int64))
  759. }
  760. }
  761. for _, data := range dataList {
  762. if data["type"].(int64) == 0 {
  763. plandtl1List, err := tx2.SQL(`select d.projname,d1.fname,d.tmrtname,DATE_FORMAT(d1.intime, '%Y-%m-%d %H:%i:%S') as intime,d1.id,d1.feedallowratio,abs(d1.actualweightminus -d1.lweight ) errorvalue ,d1.actualweightminus,d1.lweight,
  764. if(d1.actualweightminus <= d1.lweight,ROUND(d1.actualweightminus/d1.lweight* 100,2),ROUND(d1.lweight/d1.actualweightminus* 100,2) ) as accuracy from
  765. downloadplandtl1 d1
  766. join downloadedplan d on d.id = d1.pid
  767. where d1.pid = ? and d1.sort = ? and d1.pastureid = ? and d1.intime is not null and d1.type = 0 `,
  768. data["planid"], data["sort"], data["pastureid"]).Query().List()
  769. if err != nil {
  770. logs.Error("CronScheduled-error-7:", err)
  771. return
  772. }
  773. idexist := false
  774. for _, plandtl1 := range plandtl1List {
  775. //防止同顺序饲料多次推送
  776. for _, plandtl1Id := range plandtl1SlIdMap["planid"] {
  777. if plandtl1Id == plandtl1["id"].(int64) {
  778. idexist = true
  779. break
  780. }
  781. }
  782. if idexist {
  783. continue
  784. }
  785. errorvalue, _ := strconv.ParseFloat(plandtl1["errorvalue"].(string), 64)
  786. if plandtl1["feedallowratio"].(float64) < errorvalue {
  787. // if plandtl1["feedallowratio"].(float64) < plandtl1["errorvalue"].(float64) {
  788. fmt.Println(plandtl1, "推送")
  789. // target := []string{"13916925233"}
  790. var sendList []interface{}
  791. sendStr := fmt.Sprintf("操作编号:%v\nTMR名称:%v\n饲料名称:%v\n计划重量(kg):%v\n实际重量(kg):%v\n误差值(kg):%v\n准确率(%%):%v",
  792. plandtl1["projname"], plandtl1["tmrtname"], plandtl1["fname"], plandtl1["lweight"], plandtl1["actualweightminus"], plandtl1["errorvalue"], plandtl1["accuracy"])
  793. // content = append(content, "混料", plandtl1["begintime"], "kpt", sendStr, "搅拌预警")
  794. sendMap1 := make(map[string]interface{}, 0)
  795. sendMap1["value"] = "混料准确率异常"
  796. sendMap1["color"] = "#173177"
  797. sendList = append(sendList, sendMap1)
  798. sendMap4 := make(map[string]interface{}, 0)
  799. sendMap4["value"] = sendStr
  800. sendMap4["color"] = "#173177"
  801. sendList = append(sendList, sendMap4)
  802. sendMap2 := make(map[string]interface{}, 0)
  803. sendMap2["value"] = plandtl1["intime"]
  804. sendMap2["color"] = "#173177"
  805. sendList = append(sendList, sendMap2)
  806. // sendMap3 := make(map[string]interface{}, 0)
  807. // sendMap3["value"] = "kpt"
  808. // sendMap3["color"] = "#173177"
  809. // sendList = append(sendList, sendMap3)
  810. sendMap5 := make(map[string]interface{}, 0)
  811. sendMap5["value"] = "感谢您支持科湃腾"
  812. sendMap5["color"] = "#173177"
  813. sendList = append(sendList, sendMap5)
  814. wxPush(target, sendList, pastureId, serviceId)
  815. }
  816. plandtl1SlIdMap["planid"] = append(plandtl1SlIdMap["planid"], plandtl1["id"].(int64))
  817. _, err := tx2.SQL(" update downloadplandtl1_log set plandtl1 = ? where id = ? and type = 0 ", plandtl1["id"], data["id"]).Execute()
  818. if err != nil {
  819. logs.Error("CronScheduled-error-8:", err)
  820. return
  821. }
  822. }
  823. } else {
  824. plandtl1List, err := tx2.SQL(`select d.projname,d2.fname,d.tmrtname,d2.id,ifnull(d2.allowratio,0) allowratio ,abs(d2.actualweightminus -d2.lweight ) errorvalue ,DATE_FORMAT(d2.intime, '%Y-%m-%d %H:%i:%S') as intime ,d2.actualweightminus,d2.lweight,
  825. if(d2.actualweightminus <= d2.lweight,ROUND(d2.actualweightminus/d2.lweight* 100,2),ROUND(d2.lweight/d2.actualweightminus* 100,2) ) as accuracy
  826. from downloadplandtl2 d2
  827. join downloadedplan d on d.id = d2.pid
  828. where d2.pid = ? and d2.sort = ? and d2.pastureid = ? and d2.intime is not null and d2.type = 0 `,
  829. data["planid"], data["sort"], data["pastureid"]).Query().List()
  830. // Where(" pid = ? ", data["planid"]).And("sort = ? ", data["sort"]).And(" pastureid = ? ", data["pastureid"]).And(" intime is not null").And("type = 0 ").Query().List()
  831. if err != nil {
  832. logs.Error("CronScheduled-error-7:", err)
  833. return
  834. }
  835. for _, plandtl1 := range plandtl1List {
  836. errorvalue, _ := strconv.ParseFloat(plandtl1["errorvalue"].(string), 64)
  837. if float64(plandtl1["allowratio"].(int64)) < errorvalue && float64(plandtl1["allowratio"].(int64)) != 0 {
  838. fmt.Println(plandtl1, "推送")
  839. // target := []string{"13916925233"}
  840. // var content []interface{}
  841. var sendList []interface{}
  842. sendStr := fmt.Sprintf("操作编号:%v\nTMR名称:%v\n栏舍名称:%v\n计划重量(kg):%v\n实际重量(kg):%v\n误差值(kg):%v\n准确率(%%):%v",
  843. plandtl1["projname"], plandtl1["tmrtname"], plandtl1["fname"], plandtl1["lweight"], plandtl1["actualweightminus"], plandtl1["errorvalue"], plandtl1["accuracy"])
  844. sendMap1 := make(map[string]interface{}, 0)
  845. sendMap1["value"] = "撒料准确率异常"
  846. sendMap1["color"] = "#173177"
  847. sendList = append(sendList, sendMap1)
  848. sendMap4 := make(map[string]interface{}, 0)
  849. sendMap4["value"] = sendStr
  850. sendMap4["color"] = "#173177"
  851. sendList = append(sendList, sendMap4)
  852. sendMap2 := make(map[string]interface{}, 0)
  853. sendMap2["value"] = plandtl1["intime"]
  854. sendMap2["color"] = "#173177"
  855. sendList = append(sendList, sendMap2)
  856. // sendMap3 := make(map[string]interface{}, 0)
  857. // sendMap3["value"] = "kpt"
  858. // sendMap3["color"] = "#173177"
  859. // sendList = append(sendList, sendMap3)
  860. sendMap5 := make(map[string]interface{}, 0)
  861. sendMap5["value"] = "感谢您支持科湃腾"
  862. sendMap5["color"] = "#173177"
  863. sendList = append(sendList, sendMap5)
  864. wxPush(target, sendList, pastureId, serviceId)
  865. }
  866. plandtl1SlIdMap["planid"] = append(plandtl1SlIdMap["planid"], plandtl1["id"].(int64))
  867. _, err := tx2.SQL(" update downloadplandtl1_log set plandtl1 = ? where id = ? and type = 1 ", plandtl1["id"], data["id"]).Execute()
  868. if err != nil {
  869. logs.Error("CronScheduled-error-8:", err)
  870. return
  871. }
  872. }
  873. }
  874. }
  875. }
  876. }