udservice.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. package gm
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "io/ioutil"
  7. "net/http"
  8. "strings"
  9. "time"
  10. "tmr-watch/conf/setting"
  11. "tmr-watch/http/handle/restful"
  12. "tmr-watch/pkg/logging"
  13. "github.com/astaxie/beego/logs"
  14. "github.com/xormplus/xorm"
  15. )
  16. // "../../../pkg/setting"
  17. // "../../../routers/restful"
  18. // http://172.16.86.95:8080/copartner_downloads?equipmentId=48ffa4de-7870-4b18-a052-9f8d3a46089a&farmId=ef275fb06fd847d88422517773e5a616&method=downloadpen
  19. func GmUdSync(pastureId, farmId string) {
  20. UdBarSync(pastureId, farmId)
  21. UdFeedSync(pastureId, farmId)
  22. UdFeedtempletPush(pastureId, farmId)
  23. UdUtirPush(pastureId, farmId, "")
  24. UdBarFeedRemainPush(pastureId, farmId, "")
  25. UdMaterialIssuePush(pastureId, farmId, "")
  26. }
  27. func UdBarSync(pastureId, farmId string) {
  28. url := fmt.Sprintf("http://172.16.86.95:8080/copartner_downloads?equipmentId=48ffa4de-7870-4b18-a052-9f8d3a46089a&farmId=%s&method=downloadpen", farmId)
  29. barByte := getPull(url)
  30. fmt.Println(string(barByte))
  31. barMap := make(map[string]interface{})
  32. json.Unmarshal(barByte, &barMap)
  33. tx := restful.Engine.NewSession()
  34. defer tx.Close()
  35. tx.Exec(` insert into saplog(pastureId,request,response,status,msgtext,createTime,msgtype,dataDate,url)
  36. values(?,?,?,?,?,now(),?,now(),?)`, pastureId, "", string(barByte), "", "", 3, url)
  37. if len(barMap) > 0 {
  38. if barMap["status"].(string) != "ok" {
  39. return
  40. }
  41. for _, item := range barMap["msg"].([]interface{}) {
  42. bar := item.(map[string]interface{})
  43. barname := bar["barname"].(string) + "_ud"
  44. count, _ := tx.Table("bar").Where("pastureId = ? ", pastureId).Count()
  45. barExist, _ := tx.SQL(` select count(1) from bar where bcode = ? `, bar["barcode"]).Exist()
  46. tx.Exec(`insert into bar(pastureid,bcode,bname,sort)values(?,?,?,?) ON DUPLICATE KEY UPDATE bname = ? `, pastureId, bar["barcode"], barname, count+1, barname)
  47. _, _ = tx.Exec(`insert into feedp(pastureid,barid,barname,softccount,ccount)values(?,(select id from bar where bcode= ? and pastureId = ? ),?,?,?)
  48. ON DUPLICATE KEY UPDATE softccount = ? `,
  49. pastureId, bar["barcode"], pastureId, barname, bar["cowcount"], bar["cowcount"], bar["cowcount"])
  50. fmt.Println(bar["barcode"], barname)
  51. if !barExist {
  52. tx.Exec(`insert into fpdetail(pastureId,barid,weight,ptsrate,times,barname) values(?,(select id from bar where bcode= ? and pastureId = ? ),0,0,?,?)`,
  53. pastureId, bar["barcode"], 1, barname)
  54. tx.Exec(`insert into fpdetail(pastureId,barid,weight,ptsrate,times,barname) values(?,(select id from bar where bcode= ? and pastureId = ? ),0,0,?,?)`,
  55. pastureId, bar["barcode"], 2, barname)
  56. tx.Exec(`insert into fpdetail(pastureId,barid,weight,ptsrate,times,barname) values(?,(select id from bar where bcode= ? and pastureId = ? ),0,0,?,?)`,
  57. pastureId, bar["barcode"], 3, barname)
  58. tx.Exec(`insert into fpdetail(pastureId,barid,weight,ptsrate,times,barname) values(?,(select id from bar where bcode= ? and pastureId = ? ),0,0,?,?)`,
  59. pastureId, bar["barcode"], 4, barname)
  60. tx.Exec(`insert into fpdetail(pastureId,barid,weight,ptsrate,times,barname) values(?,(select id from bar where bcode= ? and pastureId = ? ),0,0,?,?)`,
  61. pastureId, bar["barcode"], 5, barname)
  62. tx.Exec(`insert into fpdetail(pastureId,barid,weight,ptsrate,times,barname) values(?,(select id from bar where bcode= ? and pastureId = ? ),0,0,?,?)`,
  63. pastureId, bar["barcode"], 6, barname)
  64. }
  65. }
  66. }
  67. }
  68. func UdFeedSync(pastureId, farmId string) {
  69. url := fmt.Sprintf("http://172.16.86.95:8080/copartner_downloads?equipmentId=48ffa4de-7870-4b18-a052-9f8d3a46089a&farmId=%s&method=downloadmaterial", farmId)
  70. feedByte := getPull(url)
  71. fmt.Println(string(feedByte))
  72. tx := restful.Engine.NewSession()
  73. defer tx.Close()
  74. tx.Exec(` insert into saplog(pastureId,request,response,status,msgtext,createTime,msgtype,dataDate,url)
  75. values(?,?,?,?,?,now(),?,now(),?)`, pastureId, "", string(feedByte), "", "", 3, url)
  76. feedMap := make(map[string]interface{})
  77. json.Unmarshal(feedByte, &feedMap)
  78. if len(feedMap) > 0 {
  79. if feedMap["status"].(string) != "ok" {
  80. return
  81. }
  82. for _, item := range feedMap["msg"].([]interface{}) {
  83. fmt.Println(item)
  84. feed := item.(map[string]interface{})
  85. feedname := feed["feedname"].(string) + "_ud"
  86. feedClassExist, err := tx.Table("feedclass").Where("fccode = ? ", feed["feedclass"]).Where(" pastureId = ? ", pastureId).Exist()
  87. fmt.Println(err)
  88. if !feedClassExist {
  89. count, _ := tx.Table("feedclass").Where("pastureId = ? ", pastureId).Count()
  90. ids, err := setting.SnowIds.NextId()
  91. if err != nil {
  92. ids = time.Now().UnixNano()
  93. logging.Info("create SnowIds err", err)
  94. }
  95. _, err = tx.Exec(`insert into feedclass(id,pastureId,fcname,fccode,bigfeedclassname,sort,bigfeedclassid) values(?,?,?,?,?,?)`, ids,
  96. pastureId, feed["feedclass"], feed["feedclass"], feed["feedclass"], count+1, ids)
  97. fmt.Println(err)
  98. }
  99. ids, err := setting.SnowIds.NextId()
  100. if err != nil {
  101. ids = time.Now().UnixNano()
  102. logging.Info("create SnowIds err", err)
  103. }
  104. _, err = tx.Exec(`insert into feed(id,pastureId,feedcode,udname,fclassid,fclass,fname) values(?,?,?,?,(select id from feedclass where fccode = ? and pastureId = ? ),?,if(char_length(?) > 7, left(?,7),?) )
  105. ON DUPLICATE KEY UPDATE udname = ? ,fclassid = (select id from feedclass where fccode = ? and pastureId = ? ) ,fclass = ?`,
  106. ids, pastureId, feed["feedcode"], feedname, feed["feedclass"], pastureId, feed["feedclass"], feedname, feedname, feedname, feedname, feed["feedclass"], pastureId, feed["feedclass"])
  107. }
  108. }
  109. }
  110. func getPull(url string) []byte {
  111. forwardingReq := new(ForwardingReq)
  112. forwardingReq.Url = url
  113. forwardingReq.Method = "GET"
  114. jsonStr, _ := json.Marshal(forwardingReq)
  115. req, err := http.NewRequest("POST", setting.ServerSetting.UDForwardingSvc+":8080/forwarding", bytes.NewBuffer(jsonStr))
  116. if err != nil {
  117. logs.Error(err)
  118. // return nil
  119. }
  120. req.Header.Set("Content-Type", "application/json")
  121. client := &http.Client{}
  122. resp, err := client.Do(req)
  123. if err != nil {
  124. logs.Error(err)
  125. return nil
  126. }
  127. defer resp.Body.Close()
  128. body, _ := ioutil.ReadAll(resp.Body)
  129. if strings.Index(resp.Status, "200") > -1 {
  130. bodyData := make(map[string]string)
  131. json.Unmarshal(body, &bodyData)
  132. if _, ok := bodyData["data"]; ok {
  133. return []byte(bodyData["data"])
  134. }
  135. }
  136. return nil
  137. }
  138. //搅拌
  139. func UdUtirPush(pastureId, farmId, date string) error {
  140. tx := restful.Engine.NewSession()
  141. defer tx.Close()
  142. var now string
  143. if date != "" {
  144. now = date
  145. } else {
  146. now = time.Now().AddDate(0, 0, -1).Format("2006-01-02")
  147. }
  148. dataList, err := tx.SQL(`select date_format(d1.date,'%Y-%m-%d') loadDate,d.times loadShift,d.datacaptureno tmrNo,ft.id recipeId,ft.ccname recipeName,ifnull(ifnull(f.id,ftd.fid),0) ingId,d1.fname ingName,
  149. ifnull(ifnull(fc.fcname,(select fcname from feedclass fc1 join feed f1 on f1.fclassid = fc1.id where f1.id =ftd.fid )),'饲料') ingType,
  150. ifnull(f.dry * d1.actualweightminus,0) dmPct,d1.sort mixNo,ifnull(d1.feedallowratio,0) allowableError ,d1.lweight expWeight,d1.actualweightminus actualWeight,
  151. DATE_FORMAT(IFNULL((SELECT MAX(intime) FROM downloadplandtl1 d2
  152. WHERE d1.pid=d2.pid AND d1.pastureid = d2.pastureid AND d2.intime<d1.intime)
  153. , (SELECT MAX(intime) FROM downloadedplan d2
  154. WHERE d1.date=d2.mydate AND d1.pastureid = d2.pastureid AND d2.id=d1.pid)
  155. ), '%Y-%m-%d %H:%i:%s')
  156. startTime ,
  157. date_format(d1.intime,'%Y-%m-%d %H:%i:%s') endTime, d.tmrtname tmrName , d.pid id ,ifnull(ftd.sort,"") premixFeedSort ,
  158. ifnull( (select id from feed where id = ftd.fid),"") premixFeedId,ifnull(ftd.fname,"") premixFeedName,
  159. ifnull(ftd.fweight / (select sum(fweight) from ftdetaildate where date = d1.date and ftid = d1.fid ) * d1.actualweightminus,"") premixFeedWeight
  160. from downloadplandtl1 d1 join downloadedplan d on d.id = d1.pid
  161. left join feedtempletdate ft on ft.id = d.tempid and ft.date = d1.date
  162. left join feed f on f.feedcode = d1.feedcode
  163. left join feedclass fc on fc.id = f.fclassid
  164. left join ftdetaildate ftd on ftd.date = d1.date and ftd.ftid = d1.fid
  165. where d1.date = ?`, now).Query().List()
  166. if err != nil {
  167. logging.Error(err)
  168. return err
  169. }
  170. dataByte, _ := json.Marshal(&dataList)
  171. reqJson := `{
  172. "reqMethod": "PARTY",
  173. "param": {
  174. "code": "1",
  175. "method": "uploadadddata",
  176. "resultData": %s,
  177. "farmId": "%s",
  178. "rowCount": %d,
  179. "errMessage": ""
  180. },
  181. "regCode": "cpt180511",
  182. "command": "3d6e4752",
  183. "apiId": "getCptData"
  184. }`
  185. reqJson = fmt.Sprintf(reqJson, string(dataByte), farmId, len(dataList))
  186. postPush(reqJson, 0, tx, pastureId)
  187. fmt.Println(reqJson)
  188. return nil
  189. }
  190. func UdMaterialIssuePush(pastureId, farmId, date string) error {
  191. tx := restful.Engine.NewSession()
  192. defer tx.Close()
  193. var now string
  194. if date != "" {
  195. now = date
  196. } else {
  197. now = time.Now().AddDate(0, 0, -1).Format("2006-01-02")
  198. }
  199. dataList, err := tx.SQL(`SELECT dd.sort feedSort, ifnull((select id from feed where feedcode = dd.feedcode ),"") feedId,dd.fname feedName,
  200. d.id,IFNULL(ft.id,d2.feedtempletid ) recipeId,IFNULL(ft.id,d2.feedtempletid ) feedtempletId,ft.tname feedtempletName ,
  201. IFNULL(d.templetName,d2.feedtempletName ) recipeName,
  202. date_format(d.mydate,'%Y-%m-%d') as dropDate,ifnull((select sort from downloadedplan where pid=d.pid and lpplanType !=d.lpplanType and mydate=d.mydate),d.sort) as tmrNo,
  203. d.Times as dropShift,b.id as penId,d2.Fname as penName,fp.CCOUNT as cowCount, d2.SORT as feedingNo,
  204. ifnull(ROUND(d2.lweight * (dd.actualweightminus/ (select sum(actualweightminus) from downloadplandtl1 where pid = dd.pid and type = 0) ),2) ,0)as expWeight,
  205. ifnull(d2.ActualWeightMinus,0) as actualWeight, ifnull(date_format(timestamp(d2.InTime,CONCAT('-',d2.processTime)),'%Y-%m-%d %H:%i:%s'),d.mydate) as startTime,
  206. ifnull(date_format(d2.InTime,'%Y-%m-%d %H:%i:%s'),d.mydate) as endTime,ifnull((SELECT dr.driver FROM dutyrecord dr
  207. WHERE dr.pastureid = d.pastureid AND dr.eqid = d.tmrid AND dr.times= d.times AND dr.operatetime <=d.mydate
  208. ORDER BY dr.operatetime DESC LIMIT 1),"") as tmrName ,d.tmrtname equipmentId ,
  209. dd.fname,
  210. ifnull(TRIM(if(( select sum(dd2.actualweightminus) from downloadplandtl2 dd2 where dd2.pid = d2.pid) >0 , ROUND( d2.actualweightminus/( select sum(dd2.actualweightminus) from downloadplandtl2 dd2 where dd2.pid = d2.pid) * (dd.actualweightminus ),2), ROUND( d2.lweight/( select sum(dd2.lweight) from downloadplandtl2 dd2 where dd2.pid = d2.pid) * (dd.actualweightminus ),2))),0) feedWeight
  211. ,ifnull(ftd.sort,"") premixFeedSort ,
  212. ifnull((select id from feed where id = ftd.fid),"") premixFeedId,ifnull(ftd.fname,"") premixFeedName,
  213. ifnull(ftd.fweight / (select sum(fweight) from ftdetaildate where date = dd.date and ftid = dd.fid ) * dd.actualweightminus,"") premixFeedWeight
  214. from downloadedplan d
  215. LEFT JOIN downloadplandtl2 d2 on d.id=d2.PID
  216. LEFT JOIN (select dd.pid as lppid,dd1.* from downloadedplan dd join downloadplandtl1 dd1 on dd1.pid = dd.id and dd1.type = 0
  217. where dd.mydate= date_format(?,'%Y-%m-%d') and dd.lpplanType in (0,1) ) dd on dd.lppid = d.pid
  218. LEFT JOIN feedp fp on d2.FBarID=fp.barid
  219. left join bar b on fp.barid = b.id and d.pastureid = b.pastureid
  220. left JOIN feedtemplet ft on d.tempid=ft.id
  221. left join ftdetaildate ftd on ftd.date = dd.date and ftd.ftid = dd.fid
  222. where d.mydate= date_format(?,'%Y-%m-%d') and d.lpplanType!=1 and d.pastureid = ? and dd.fname is not null order by tmrno `, now, now, pastureId).Query().List()
  223. if err != nil {
  224. logging.Error(err)
  225. return err
  226. }
  227. dataByte, _ := json.Marshal(&dataList)
  228. reqJson := `{
  229. "reqMethod": "PARTY",
  230. "param": {
  231. "code": "1",
  232. "method": "uploaddiliverdata",
  233. "resultData": %s,
  234. "farmId": "%s",
  235. "rowCount": %d,
  236. "errMessage": ""
  237. },
  238. "regCode": "cpt180511",
  239. "command": "3d6e4752",
  240. "apiId": "getCptData"
  241. }`
  242. reqJson = fmt.Sprintf(reqJson, string(dataByte), farmId, len(dataList))
  243. // '0饲喂 1剩料 2原料 3栏舍 4配方 5栏舍牛头数 6库存',
  244. postPush(reqJson, 0, tx, pastureId)
  245. fmt.Println(reqJson)
  246. return nil
  247. }
  248. func UdBarFeedRemainPush(pastureId, farmId, date string) error {
  249. tx := restful.Engine.NewSession()
  250. defer tx.Close()
  251. var now string
  252. if date != "" {
  253. now = date
  254. } else {
  255. now = time.Now().AddDate(0, 0, -1).Format("2006-01-02")
  256. }
  257. dataList, err := tx.SQL(`SELECT
  258. '' startTime,
  259. '' endTime,
  260. br.RemainDate AS overplusDate,
  261. b.id AS penId,
  262. b.BNAME AS penName,
  263. br.Remain AS actualWeight
  264. FROM
  265. barfeedremain br
  266. LEFT JOIN feedp fp ON br.barid = fp.id
  267. left join bar b on b.id = fp.barid
  268. WHERE
  269. date_format( RemainDate, '%Y-%m-%d' ) =? `, now).Query().List()
  270. if err != nil {
  271. logging.Error(err)
  272. return err
  273. }
  274. dataByte, _ := json.Marshal(&dataList)
  275. reqJson := `{
  276. "reqMethod": "PARTY",
  277. "param": {
  278. "code": "1",
  279. "method": "uploadoverplusdata",
  280. "resultData": %s,
  281. "farmId":"%s",
  282. "rowCount": %d,
  283. "errMessage": ""
  284. },
  285. "regCode": "cpt180511",
  286. "command": "3d6e4752",
  287. "apiId": "getCptData"
  288. }`
  289. reqJson = fmt.Sprintf(reqJson, string(dataByte), farmId, len(dataList))
  290. // '0饲喂 1剩料 2原料 3栏舍 4配方 5栏舍牛头数 6库存',
  291. fmt.Println(reqJson)
  292. postPush(reqJson, 1, tx, pastureId)
  293. return nil
  294. }
  295. // method:
  296. // 配方 getfeedtempletinfo
  297. // 搅拌数据 uploadadddata
  298. // 撒料数据 uploaddiliverdata
  299. // 剩料 uploadoverplusdata
  300. func UdFeedtempletPush(pastureId, farmId string) error {
  301. tx := restful.Engine.NewSession()
  302. defer tx.Close()
  303. dataList, err := tx.SQL(`SELECT
  304. ft.ID AS recipeId,
  305. ft.TNAME AS recipeName,
  306. f.id AS ingId,
  307. f.FNAME AS ingName,
  308. round( f.dry * ftd.FWEIGHT, 2 ) AS dmQty,
  309. ftd.FWEIGHT AS afQty,
  310. ftd.SORT AS mixNo,
  311. round( f.Uprice * ftd.FWEIGHT, 2 ) AS recipeCost,
  312. fc.fcname AS ingType,
  313. f.AllowRatio AS allowableError ,fc.fcname ingType
  314. FROM
  315. feedtemplet ft
  316. JOIN ftdetail ftd ON ft.id = ftd.FTID
  317. JOIN feed f ON ftd.FID = f.id
  318. JOIN feedclass fc ON f.fclassid = fc.id
  319. WHERE
  320. ft.ENABLE = 1
  321. AND ft.isDelete != 1 `).Query().List()
  322. if err != nil {
  323. logging.Error(err)
  324. return err
  325. }
  326. dataByte, _ := json.Marshal(&dataList)
  327. reqJson := `{
  328. "reqMethod": "PARTY",
  329. "param": {
  330. "code": "1",
  331. "method": "getfeedtempletinfo",
  332. "resultData": %s,
  333. "farmId": "%s",
  334. "rowCount": %d,
  335. "errMessage": ""
  336. },
  337. "regCode": "cpt180511",
  338. "command": "3d6e4752",
  339. "apiId": "getCptData"
  340. }`
  341. reqJson = fmt.Sprintf(reqJson, string(dataByte), farmId, len(dataList))
  342. fmt.Println(reqJson)
  343. postPush(reqJson, 4, tx, pastureId)
  344. return nil
  345. }
  346. type ForwardingReq struct {
  347. Body string `json:"body"`
  348. Headers []*Headers `json:"headers"`
  349. Url string `json:"url"`
  350. Method string `json:"method"`
  351. }
  352. type Headers struct {
  353. Key string `json:"key"`
  354. Value string `json:"value"`
  355. }
  356. func postPush(data string, msgtype int, tx *xorm.Session, pastureId string) {
  357. forwardingReq := new(ForwardingReq)
  358. forwardingReq.Url = "http://172.16.86.95:8080/copartner_uploads/"
  359. forwardingReq.Method = "POST"
  360. forwardingReq.Body = data
  361. jsonStr, _ := json.Marshal(forwardingReq)
  362. fmt.Println(setting.ServerSetting.UDForwardingSvc)
  363. req, err := http.NewRequest("POST", setting.ServerSetting.UDForwardingSvc+":8080/forwarding", bytes.NewBuffer(jsonStr))
  364. if err != nil {
  365. logs.Error(err)
  366. // return nil
  367. }
  368. req.Header.Set("Content-Type", "application/json")
  369. client := &http.Client{}
  370. resp, err := client.Do(req)
  371. if err != nil {
  372. logs.Error(err)
  373. return
  374. }
  375. defer resp.Body.Close()
  376. body, _ := ioutil.ReadAll(resp.Body)
  377. fmt.Println(string(body))
  378. if strings.Index(resp.Status, "200") > -1 {
  379. bodyData := make(map[string]string)
  380. json.Unmarshal(body, &bodyData)
  381. if _, ok := bodyData["data"]; ok {
  382. tx.Exec(` insert into saplog(pastureId,request,response,status,msgtext,createTime,msgtype,dataDate,url)
  383. values(?,?,?,?,?,now(),?,now(),?)`, pastureId, data, bodyData["data"], "", "", msgtype, forwardingReq.Url)
  384. } else {
  385. tx.Exec(` insert into saplog(pastureId,request,response,status,msgtext,createTime,msgtype,dataDate,url)
  386. values(?,?,?,?,?,now(),?,now(),?)`, pastureId, data, string(body), "", "", msgtype, forwardingReq.Url)
  387. }
  388. } else {
  389. tx.Exec(` insert into saplog(pastureId,request,response,status,msgtext,createTime,msgtype,dataDate,url)
  390. values(?,?,?,?,?,now(),?,now(),?)`, pastureId, data, string(body), "", "", msgtype, forwardingReq.Url)
  391. }
  392. }