scheduled.go 28 KB

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