sap.go 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656
  1. package sap
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "io/ioutil"
  7. "net/http"
  8. "time"
  9. "tmr-watch/conf/setting"
  10. "tmr-watch/http/handle/restful"
  11. "tmr-watch/models"
  12. "tmr-watch/pkg/app"
  13. "tmr-watch/pkg/e"
  14. "github.com/Anderson-Lu/gofasion/gofasion"
  15. "github.com/astaxie/beego/logs"
  16. "github.com/gin-gonic/gin"
  17. "github.com/xormplus/xorm"
  18. )
  19. func SyncMaterialOutbound() error {
  20. tx := restful.Engine.NewSession()
  21. defer tx.Close()
  22. pastureinfo := new(udPastureInfo)
  23. err := tx.SQL(`select column_default as pastureid from information_schema.COLUMNS
  24. WHERE table_name = 'recweight' AND table_schema = ? AND column_name = 'pastureid'`, setting.DatabaseSetting.Name).GetFirst(pastureinfo).Error
  25. if err != nil {
  26. logs.Error(err)
  27. return err
  28. }
  29. materialOutbound(pastureinfo.Pastureid, time.Now().AddDate(0, 0, -1).Format("2006-01-02"))
  30. return nil
  31. }
  32. func SyncSurplusOutbound() error {
  33. tx := restful.Engine.NewSession()
  34. defer tx.Close()
  35. pastureinfo := new(udPastureInfo)
  36. err := tx.SQL(`select column_default as pastureid from information_schema.COLUMNS
  37. WHERE table_name = 'recweight' AND table_schema = ? AND column_name = 'pastureid'`, setting.DatabaseSetting.Name).GetFirst(pastureinfo).Error
  38. if err != nil {
  39. logs.Error(err)
  40. return err
  41. }
  42. surplusOutbound(pastureinfo.Pastureid, time.Now().AddDate(0, 0, -1).Format("2006-01-02"))
  43. return nil
  44. }
  45. func SyncLeftoverEntry() error {
  46. tx := restful.Engine.NewSession()
  47. defer tx.Close()
  48. pastureinfo := new(udPastureInfo)
  49. err := tx.SQL(`select column_default as pastureid from information_schema.COLUMNS
  50. WHERE table_name = 'recweight' AND table_schema = ? AND column_name = 'pastureid'`, setting.DatabaseSetting.Name).GetFirst(pastureinfo).Error
  51. if err != nil {
  52. logs.Error(err)
  53. return err
  54. }
  55. leftoverEntry(pastureinfo.Pastureid, time.Now().AddDate(0, 0, -1).Format("2006-01-02"))
  56. return nil
  57. }
  58. func SyncSapBar(c *gin.Context) {
  59. appG := app.Gin{C: c}
  60. dataByte, _ := ioutil.ReadAll(c.Request.Body)
  61. fsion := gofasion.NewFasion(string(dataByte))
  62. start := fsion.Get("startTime").ValueStr()
  63. end := fsion.Get("endTime").ValueStr()
  64. pastureId := fsion.Get("pastureId").ValueStr()
  65. tx := restful.Engine.NewSession()
  66. defer tx.Close()
  67. pastureinfo := new(udPastureInfo)
  68. err := tx.SQL(`select * from pasture where pastureid = ?`, pastureId).GetFirst(pastureinfo).Error
  69. if err != nil {
  70. logs.Error(err)
  71. return
  72. }
  73. // year := time.Now().Year()
  74. data := `{
  75. "DATA": {
  76. "DIDAT": "%s",
  77. "DITIM": "%s",
  78. "WERKS": "%s"
  79. },
  80. "DEST": {
  81. "DEST_ID": "TMRWATCH",
  82. "BUSS_TP": "CO005"
  83. }
  84. }`
  85. startTime, _ := time.ParseInLocation("2006-01-02", start, time.Local)
  86. endTime, _ := time.ParseInLocation("2006-01-02", end, time.Local)
  87. url := "http://192.168.61.117/SAPP0/Feed/CO005/QueryCowsheds"
  88. data = fmt.Sprintf(data, startTime.Format("20060102"), endTime.Format("20060102"), pastureinfo.Werks)
  89. respmap, _ := postPush(url, data, 3, tx, pastureId)
  90. if respmap != nil {
  91. if _, ok := respmap.(map[string]interface{})["ZTCO_001"]; ok {
  92. for _, item := range respmap.(map[string]interface{})["ZTCO_001"].([]interface{}) {
  93. barMap := item.(map[string]interface{})
  94. _, err := tx.SQL(` insert into bar(pastureid,bcode,bname,sort,class,classcode,cattle,cattlecode,sapcode)
  95. values(?,?,?,(select max(sort)+1 from bar b where b.pastureid = ? ),
  96. (select distName from dist where distCode = ? and distType = '牛舍类型' ),?,
  97. (select distName from dist where distCode = ? and distType = '牛群类别'),?,?)
  98. ON DUPLICATE KEY UPDATE bname = ? ,
  99. class = (select distName from dist where distCode = ? and distType = '牛舍类型' ) ,classcode = ?,
  100. cattle = (select distName from dist where distCode = ? and distType = '牛群类别' ) ,cattlecode = ?
  101. `,
  102. pastureId, barMap["CHSNO"], fmt.Sprintf("%v_sap", barMap["CHSTX"]), pastureId, barMap["CHSTY"], barMap["CHSTY"],
  103. barMap["FCWTS"], barMap["FCWTS"], barMap["CHSNO"],
  104. fmt.Sprintf("%v_sap", barMap["CHSTX"]), barMap["CHSTY"], barMap["CHSTY"], barMap["FCWTS"], barMap["FCWTS"]).Execute()
  105. if err != nil {
  106. logs.Error(err)
  107. return
  108. }
  109. }
  110. }
  111. }
  112. appG.Response(http.StatusOK, e.SUCCESS, true)
  113. }
  114. type udPastureInfo struct {
  115. Werks string `xorm:"werks"`
  116. Pastureid string `xorm:"pastureid"`
  117. }
  118. func MaterialOutbound(c *gin.Context) {
  119. appG := app.Gin{C: c}
  120. dataByte, _ := ioutil.ReadAll(c.Request.Body)
  121. fsion := gofasion.NewFasion(string(dataByte))
  122. pastureId := fsion.Get("pastureid").ValueStr()
  123. date := fsion.Get("date").ValueStr()
  124. materialOutbound(pastureId, date)
  125. appG.Response(http.StatusOK, e.SUCCESS, true)
  126. }
  127. func SurplusOutbound(c *gin.Context) {
  128. appG := app.Gin{C: c}
  129. dataByte, _ := ioutil.ReadAll(c.Request.Body)
  130. fsion := gofasion.NewFasion(string(dataByte))
  131. pastureId := fsion.Get("pastureid").ValueStr()
  132. date := fsion.Get("date").ValueStr()
  133. surplusOutbound(pastureId, date)
  134. appG.Response(http.StatusOK, e.SUCCESS, true)
  135. }
  136. type feedPlanRecord struct {
  137. CHSNO string `xorm:"'CHSNO' varchar(50)" json:"CHSNO"` // 栏位SAP编码
  138. CHSTX string `xorm:"'CHSTX' varchar(100)" json:"CHSTX"` // 栏位名称
  139. FCWTS string `xorm:"'FCWTS' varchar(20)" json:"FCWTS"` // 牛群分类
  140. LGORT string `xorm:"'LGORT' varchar(50)" json:"LGORT"` // SAP库存地点
  141. MAKTX string `xorm:"'MAKTX' varchar(100)" json:"MAKTX"` // 饲料名称
  142. MATNR string `xorm:"'MATNR' varchar(50)" json:"MATNR"` // SAP物料编号
  143. MENGE float64 `xorm:"'MENGE' decimal(18,4)" json:"MENGE"` // 实际用量
  144. ZEILE int `xorm:"'ZEILE' int" json:"ZEILE"` // 行号
  145. Lweight float64 `xorm:"'lweight' decimal(18,4)" json:"lweight"` // 理论用量
  146. FeedId int64 `xorm:"'feedId' int" json:"feedId"`
  147. BarId int64 `xorm:"'fbarid' int" json:"fbarid"`
  148. }
  149. func materialOutbound(pastureId, date string) error {
  150. tx := restful.Engine.NewSession()
  151. defer tx.Close()
  152. pastureinfo := new(udPastureInfo)
  153. err := tx.SQL(`select * from pasture where pastureid = ?`, pastureId).GetFirst(pastureinfo).Error
  154. if err != nil {
  155. logs.Error(err)
  156. return err
  157. }
  158. dataList := make([]*feedPlanRecord, 0)
  159. err = tx.SQL(` SELECT tem.feedId,tem.fbarid,
  160. tem.sort ZEILE,
  161. tem.feedname MAKTX,
  162. sum(ifnull(ROUND(if(tem.lweight<0,0,tem.lweight),(select inforvalue from sysopt where inforname="decimalPlaces" and pastureid =? )),0))lweight,
  163. sum(ifnull(ROUND(tem.actualweightminus,(select inforvalue from sysopt where inforname="decimalPlaces" and pastureid = ?)),0)) MENGE
  164. ,tem.bname CHSTX,tem.sapcode CHSNO,tem.cattle FCWTS,tem.MATNR,tem.sapGoods LGORT
  165. FROM (
  166. (SELECT f.id feedId,
  167. d2.type,d2.fbarid,
  168. d2.fname,IFNULL(ftd.fname,d1.fname ) feedname,
  169. SUM(
  170. d2.lweight/(SELECT SUM(lweight) FROM downloadplandtl2 d2t WHERE d2t.pastureid = d2.pastureid AND d2t.flpid = d2.flpid AND d2t.type = 0 AND d2t.date = d2.date)*
  171. d1.lweight*IF(ftd.id IS NULL,1,ftd.fweight/(SELECT SUM(ftd2.fweight) FROM ftdetaildate ftd2 WHERE ftd2.pastureid =d1.pastureid AND ftd2.ftid = d1.fid and ftd2.date= ftp.date ))
  172. )lweight,
  173. d1.sort sort,
  174. SUM(
  175. if ( (SELECT SUM(actualweightminus) FROM downloadplandtl2 d2t WHERE d2t.pastureid = d2.pastureid AND d2t.flpid = d2.flpid AND d2t.type = 0 AND d2t.date = d2.date) > 0 ,
  176. d2.actualweightminus/(SELECT SUM(actualweightminus) FROM downloadplandtl2 d2t WHERE d2t.pastureid = d2.pastureid AND d2t.flpid = d2.flpid AND d2t.type = 0 AND d2t.date = d2.date)*
  177. d1.actualweightminus*IF(ftd.id IS NULL,1,ftd.fweight/(SELECT SUM(ftd2.fweight) FROM ftdetaildate ftd2 WHERE ftd2.pastureid =d1.pastureid AND ftd2.ftid = d1.fid and ftd2.date= ftp.date )),
  178. d2.lweight/(SELECT SUM(lweight) FROM downloadplandtl2 d2t WHERE d2t.pastureid = d2.pastureid AND d2t.flpid = d2.flpid AND d2t.type = 0 AND d2t.date = d2.date)*
  179. d1.actualweightminus*IF(ftd.id IS NULL,1,ftd.fweight/(SELECT SUM(ftd2.fweight) FROM ftdetaildate ftd2 WHERE ftd2.pastureid =d1.pastureid AND ftd2.ftid = d1.fid and ftd2.date= ftp.date ))
  180. )
  181. )actualweightminus,b.sort as d2sort,b.bname,b.sapcode, b.cattlecode ,f.sapCode MATNR,f.sapGoods ,(select cattle from feedtemplet where id = d.tempid) cattle
  182. FROM
  183. downloadedplan d
  184. JOIN downloadplandtl2 d2
  185. ON d.pastureid = d2.pastureid AND d2.pid = d.id and d2.type = 0
  186. JOIN downloadplandtl1 d1
  187. ON d.pastureid = d1.pastureid AND d1.flpid = d2.flpid AND d1.type = 0 AND d2.date = d1.date
  188. LEFT JOIN ftdetaildate ftd ON ftd.pastureid =d1.pastureid AND ftd.ftid = d1.fid AND d1.feedcode = '-1' AND ftd.date = d.mydate AND ftd.version = d.tversion
  189. left join bar b on b.pastureid =d1.pastureid and b.id = d2.fbarid
  190. left join feed f on f.id = d1.fid
  191. left join feedtempletdate ftp on ftp.id = d.tempid AND ftp.date = ftd.date
  192. WHERE d.pastureid = ? AND d.mydate = ? and d1.feedcode != -1 and b.sapCode is not null and f.sapCode is not null
  193. GROUP BY d2.fbarid,IFNULL(ftd.fname,d1.fname )
  194. HAVING d2.type = 0 order by b.sort,d2.fbarid)
  195. UNION
  196. (SELECT f.id feedId,
  197. d2.type,d2.fbarid,
  198. d2.fname,IFNULL(ftd.fname,d1.fname ) feedname,
  199. SUM(
  200. d2.lweight/(SELECT SUM(lweight) FROM downloadplandtl2 d2t WHERE d2t.pastureid = d2.pastureid AND d2t.flpid = d2.flpid AND d2t.type = 0 AND d2t.date = d2.date)*
  201. d1.lweight*IF(ftd.id IS NULL,1,ftd.fweight/(SELECT SUM(ftd2.fweight) FROM ftdetaildate ftd2 WHERE ftd2.pastureid =d1.pastureid AND ftd2.ftid = d1.fid and ftd2.date= ftd1.date ))
  202. )lweight,
  203. d1.sort sort,
  204. SUM(
  205. if ( (SELECT SUM(actualweightminus) FROM downloadplandtl2 d2t WHERE d2t.pastureid = d2.pastureid AND d2t.flpid = d2.flpid AND d2t.type = 0 AND d2t.date = d2.date) > 0 ,
  206. d2.actualweightminus/(SELECT SUM(actualweightminus) FROM downloadplandtl2 d2t WHERE d2t.pastureid = d2.pastureid AND d2t.flpid = d2.flpid AND d2t.type = 0 AND d2t.date = d2.date)*
  207. d1.actualweightminus*IF(ftd.id IS NULL,1,ftd.fweight/(SELECT SUM(ftd2.fweight) FROM ftdetaildate ftd2 WHERE ftd2.date = d1.date AND ftd2.version = ftd1.version and ftd2.pastureid =d1.pastureid AND ftd2.ftid = d1.fid )),
  208. d2.lweight/(SELECT SUM(lweight) FROM downloadplandtl2 d2t WHERE d2t.pastureid = d2.pastureid AND d2t.flpid = d2.flpid AND d2t.type = 0 AND d2t.date = d2.date)*
  209. d1.actualweightminus*IF(ftd.id IS NULL,1,ftd.fweight/(SELECT SUM(ftd2.fweight) FROM ftdetaildate ftd2 WHERE ftd2.date = d1.date AND ftd2.version = ftd1.version and ftd1.id = ftd2.ftid ))
  210. )
  211. )actualweightminus,b.sort as d2sort,b.bname,b.sapcode, b.cattlecode ,f.sapCode MATNR,f.sapGoods ,(select cattle from feedtemplet where id = d.tempid) cattle
  212. FROM
  213. downloadedplan d
  214. JOIN downloadplandtl2 d2
  215. ON d.pastureid = d2.pastureid AND d2.pid = d.id and d2.type = 0
  216. JOIN downloadplandtl1 d1
  217. ON d.pastureid = d1.pastureid AND d1.flpid = d2.flpid AND d1.type = 0 AND d2.date = d1.date
  218. left join bar b on b.pastureid =d1.pastureid and b.id = d2.fbarid
  219. left join feedtempletdate ftd1 on d1.feedcode = '-1' and ftd1.date = d1.date and ftd1.id = d1.fid
  220. LEFT JOIN ftdetaildate ftd ON ftd.pastureid =d1.pastureid AND ftd.ftid = ftd1.id AND d1.feedcode = '-1' AND ftd.date =d1.date AND ftd.version = ftd1.version
  221. left join feed f on f.id = ftd.fid
  222. WHERE d.pastureid = ? AND d.mydate = ? and d1.feedcode = -1 and b.sapCode is not null and f.sapCode is not null
  223. GROUP BY d2.fbarid,IFNULL(ftd.fname,d1.fname )
  224. HAVING d2.type = 0 order by b.sort,d2.fbarid)
  225. ) tem
  226. GROUP BY tem.fbarid,tem.feedname
  227. ORDER BY tem.d2sort,tem.feedname `, pastureId, pastureId, pastureId, date, pastureId, date).Find(&dataList)
  228. if err != nil {
  229. logs.Error(err)
  230. return err
  231. }
  232. wasteUseList := make([]*models.WasteUse, 0)
  233. err = tx.Table("wasteuse").Select("id,ftid,ftname,times,date,(select feedId from surplus where id = wasteuse.surplusId ) surplusId,surplus,pastureId,weight,barid,barname").Where("date = ? ", date).Where("pastureId = ? ", pastureId).Find(&wasteUseList)
  234. if err != nil {
  235. logs.Error(err)
  236. return err
  237. }
  238. for _, wasteUse := range wasteUseList {
  239. for _, data := range dataList {
  240. if data.FeedId == wasteUse.SurplusId && data.BarId == wasteUse.Barid {
  241. newWeight := data.MENGE - wasteUse.Weight
  242. if newWeight < 0 {
  243. wasteUse.Weight = wasteUse.Weight - data.MENGE
  244. data.MENGE = 0
  245. } else {
  246. data.MENGE = newWeight
  247. wasteUse.Weight = 0
  248. }
  249. }
  250. if wasteUse.Weight <= 0 {
  251. break
  252. }
  253. }
  254. }
  255. data := `{
  256. "DEST": {
  257. "DEST_ID": "TMRWATCH",
  258. "BUSS_TP": "MM016"
  259. },
  260. "DATA": {
  261. "BUDAT": "%s",
  262. "WERKS": "%s",
  263. "ITEMS": %s
  264. }
  265. }`
  266. databyte, _ := json.Marshal(dataList)
  267. now, _ := time.ParseInLocation("2006-01-02", date, time.Local)
  268. data = fmt.Sprintf(data, now.Format("20060102"), pastureinfo.Werks, string(databyte))
  269. url := "http://192.168.61.117/SAPP0/Feed/MM016/StockOut"
  270. postPush(url, data, 0, tx, pastureId)
  271. return nil
  272. }
  273. func postPush(url, data string, msgtype int, tx *xorm.Session, pastureId string) (interface{}, bool) {
  274. var jsonStr = []byte(data)
  275. fmt.Println(string(jsonStr))
  276. req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonStr))
  277. if err != nil {
  278. logs.Error(err)
  279. // return nil
  280. }
  281. // req.SetBasicAuth("zinf_TMR", "zinf_TMR@1234") //测试线密码
  282. req.SetBasicAuth("zinf_TMR", "$C2Cj$\\Uv#")
  283. req.Header.Set("Content-Type", "application/json")
  284. client := &http.Client{}
  285. resp, err := client.Do(req)
  286. if err != nil {
  287. logs.Error(err)
  288. // return nil
  289. }
  290. fmt.Println(resp.Body)
  291. defer resp.Body.Close()
  292. body, _ := ioutil.ReadAll(resp.Body)
  293. var respData map[string]interface{}
  294. tx.Exec(` insert into saplog(pastureId,request,response,status,msgtext,createTime,msgtype,dataDate,url)
  295. values(?,?,?,?,?,now(),?,now(),?)`, pastureId, data, string(body), "", "", msgtype, url)
  296. fmt.Println(string(body))
  297. err = json.Unmarshal(body, &respData)
  298. if err != nil {
  299. logs.Error(err)
  300. // return nil
  301. }
  302. if _, ok := respData["DATA"]; ok {
  303. if msgtype == 3 {
  304. if _, ok := respData["ZTCO_001"]; !ok {
  305. return respData["DATA"], false
  306. }
  307. return respData["DATA"], true
  308. }
  309. if _, ok := respData["DATA"]; !ok {
  310. return respData["DATA"], false
  311. }
  312. return respData["DATA"], true
  313. } else {
  314. return respData["DATA"], false
  315. }
  316. }
  317. func SyncSapFeed(c *gin.Context) {
  318. appG := app.Gin{C: c}
  319. dataByte, _ := ioutil.ReadAll(c.Request.Body)
  320. fsion := gofasion.NewFasion(string(dataByte))
  321. start := fsion.Get("startTime").ValueStr()
  322. end := fsion.Get("endTime").ValueStr()
  323. mtart := fsion.Get("mtart").ValueStr()
  324. pastureId := fsion.Get("pastureId").ValueStr()
  325. tx := restful.Engine.NewSession()
  326. defer tx.Close()
  327. data := `{
  328. "DEST": {
  329. "DEST_ID": "TMRWATCH",
  330. "BUSS_TP": "MM002"
  331. },
  332. "DATA": {
  333. "BUDAT_B": "%s",
  334. "BUDAT_E": "%s",
  335. "TMTART": {
  336. "MTART": "%s"
  337. },
  338. "TMATKL": []
  339. }
  340. }`
  341. startTime, _ := time.ParseInLocation("2006-01-02", start, time.Local)
  342. endTime, _ := time.ParseInLocation("2006-01-02", end, time.Local)
  343. data = fmt.Sprintf(data, startTime.Format("20060102"), endTime.Format("20060102"), mtart)
  344. // "https://app.modernfarming.cn:7443/sap/Common/MM002/QueryMaterial/"
  345. // http://192.168.61.117/SAPP0/Common/MM002/QueryMaterial
  346. url := "http://192.168.61.117/SAPP0/Common/MM002/QueryMaterial"
  347. respmap, success := postPush(url, data, 2, tx, pastureId)
  348. // var a interface{} = nil
  349. fmt.Println(respmap, success)
  350. if success == false {
  351. appG.Response(http.StatusOK, e.SUCCESS, true)
  352. } else {
  353. for _, item := range respmap.(map[string]interface{})["TMARA"].([]interface{}) {
  354. sapMap := item.(map[string]interface{})
  355. // fmt.Println(item)
  356. _, err := tx.SQL(` replace into feed_sap(MATNR,MTART,MATKL,MAKTX,MEINS,UMREZ,MEINH,UMREN,ZMINC,ZGUIG,LVORM,LAEDA)values(?,?,?,?,?,?,?,?,?,?,?,?)`,
  357. sapMap["MATNR"], sapMap["MTART"], sapMap["MATKL"], sapMap["MAKTX"], sapMap["MEINS"], sapMap["UMREZ"], sapMap["MEINH"],
  358. sapMap["UMREN"], sapMap["ZMINC"], sapMap["ZGUIG"], sapMap["LVORM"], sapMap["LAEDA"]).Execute()
  359. if err != nil {
  360. logs.Error(err)
  361. return
  362. }
  363. }
  364. appG.Response(http.StatusOK, e.SUCCESS, true)
  365. }
  366. // return
  367. }
  368. func surplusOutbound(pastureId, date string) error {
  369. tx := restful.Engine.NewSession()
  370. defer tx.Close()
  371. pastureinfo := new(udPastureInfo)
  372. err := tx.SQL(`select * from pasture where pastureid = ?`, pastureId).GetFirst(pastureinfo).Error
  373. if err != nil {
  374. logs.Error(err)
  375. return err
  376. }
  377. now, _ := time.ParseInLocation("2006-01-02", date, time.Local)
  378. dataList, err := tx.SQL(` SELECT
  379. tem.sort ZEILE,
  380. tem.feedname MAKTX,
  381. sum(ifnull(ROUND(if(tem.lweight<0,0,tem.lweight),(select inforvalue from sysopt where inforname="decimalPlaces" and pastureid =? )),0))lweight,
  382. sum(ifnull(ROUND(tem.actualweightminus,(select inforvalue from sysopt where inforname="decimalPlaces" and pastureid = ?)),0)) MENGE
  383. ,tem.bname CHSTX,tem.sapcode CHSNO,tem.cattle FCWTS,(select inforvalue from sysopt where inforname="excess" and pastureid = ?) MATNR,tem.sapGoods LGORT,
  384. ? WERKS , ? BUDAT
  385. FROM (
  386. (SELECT
  387. d2.type,d2.fbarid,
  388. d2.fname,IFNULL(ftd.fname,d1.fname ) feedname,
  389. SUM(
  390. d2.lweight/(SELECT SUM(lweight) FROM downloadplandtl2 d2t WHERE d2t.pastureid = d2.pastureid AND d2t.flpid = d2.flpid AND d2t.type = 0 AND d2t.date = d2.date)*
  391. d1.lweight*IF(ftd.id IS NULL,1,ftd.fweight/(SELECT SUM(ftd2.fweight) FROM ftdetaildate ftd2 WHERE ftd2.pastureid =d1.pastureid AND ftd2.ftid = d1.fid and ftd2.date= ftp.date ))
  392. )lweight,
  393. d1.sort sort,
  394. SUM(
  395. if ( (SELECT SUM(actualweightminus) FROM downloadplandtl2 d2t WHERE d2t.pastureid = d2.pastureid AND d2t.flpid = d2.flpid AND d2t.type = 0 AND d2t.date = d2.date) > 0 ,
  396. d2.actualweightminus/(SELECT SUM(actualweightminus) FROM downloadplandtl2 d2t WHERE d2t.pastureid = d2.pastureid AND d2t.flpid = d2.flpid AND d2t.type = 0 AND d2t.date = d2.date)*
  397. d1.actualweightminus*IF(ftd.id IS NULL,1,ftd.fweight/(SELECT SUM(ftd2.fweight) FROM ftdetaildate ftd2 WHERE ftd2.pastureid =d1.pastureid AND ftd2.ftid = d1.fid and ftd2.date= ftp.date )),
  398. d2.lweight/(SELECT SUM(lweight) FROM downloadplandtl2 d2t WHERE d2t.pastureid = d2.pastureid AND d2t.flpid = d2.flpid AND d2t.type = 0 AND d2t.date = d2.date)*
  399. d1.actualweightminus*IF(ftd.id IS NULL,1,ftd.fweight/(SELECT SUM(ftd2.fweight) FROM ftdetaildate ftd2 WHERE ftd2.pastureid =d1.pastureid AND ftd2.ftid = d1.fid and ftd2.date= ftp.date ))
  400. )
  401. )actualweightminus,b.sort as d2sort,b.bname,b.sapcode, b.cattlecode ,f.sapGoods ,(select cattle from feedtemplet where id = d.tempid) cattle
  402. FROM
  403. downloadedplan d
  404. JOIN downloadplandtl2 d2
  405. ON d.pastureid = d2.pastureid AND d2.pid = d.id and d2.type = 0
  406. JOIN downloadplandtl1 d1
  407. ON d.pastureid = d1.pastureid AND d1.flpid = d2.flpid AND d1.type = 0 AND d2.date = d1.date
  408. LEFT JOIN ftdetaildate ftd ON ftd.pastureid =d1.pastureid AND ftd.ftid = d1.fid AND d1.feedcode = '-1' AND ftd.date = d.mydate AND ftd.version = d.tversion
  409. left join bar b on b.pastureid =d1.pastureid and b.id = d2.fbarid
  410. left join feed f on f.id = d1.fid
  411. left join feedtempletdate ftp on ftp.id = d.tempid AND ftp.date = ftd.date
  412. WHERE d.pastureid = ? AND d.mydate = ? and d1.feedcode != -1 and b.sapCode is not null and d1.fname like concat('%','_剩料','%')
  413. GROUP BY d2.fbarid,IFNULL(ftd.fname,d1.fname )
  414. HAVING d2.type = 0 order by b.sort,d2.fbarid)
  415. UNION
  416. (SELECT
  417. d2.type,d2.fbarid,
  418. d2.fname,IFNULL(ftd.fname,d1.fname ) feedname,
  419. SUM(
  420. d2.lweight/(SELECT SUM(lweight) FROM downloadplandtl2 d2t WHERE d2t.pastureid = d2.pastureid AND d2t.flpid = d2.flpid AND d2t.type = 0 AND d2t.date = d2.date)*
  421. d1.lweight*IF(ftd.id IS NULL,1,ftd.fweight/(SELECT SUM(ftd2.fweight) FROM ftdetaildate ftd2 WHERE ftd2.pastureid =d1.pastureid AND ftd2.ftid = d1.fid and ftd2.date= ftd1.date ))
  422. )lweight,
  423. d1.sort sort,
  424. SUM(
  425. if ( (SELECT SUM(actualweightminus) FROM downloadplandtl2 d2t WHERE d2t.pastureid = d2.pastureid AND d2t.flpid = d2.flpid AND d2t.type = 0 AND d2t.date = d2.date) > 0 ,
  426. d2.actualweightminus/(SELECT SUM(actualweightminus) FROM downloadplandtl2 d2t WHERE d2t.pastureid = d2.pastureid AND d2t.flpid = d2.flpid AND d2t.type = 0 AND d2t.date = d2.date)*
  427. d1.actualweightminus*IF(ftd.id IS NULL,1,ftd.fweight/(SELECT SUM(ftd2.fweight) FROM ftdetail ftd2 WHERE ftd2.pastureid =d1.pastureid AND ftd2.ftid = d1.fid )),
  428. d2.lweight/(SELECT SUM(lweight) FROM downloadplandtl2 d2t WHERE d2t.pastureid = d2.pastureid AND d2t.flpid = d2.flpid AND d2t.type = 0 AND d2t.date = d2.date)*
  429. d1.actualweightminus*IF(ftd.id IS NULL,1,ftd.fweight/(SELECT SUM(ftd2.fweight) FROM ftdetaildate ftd2 WHERE ftd2.date = d1.date AND ftd2.version = ftd1.version and ftd1.id = ftd2.ftid ))
  430. )
  431. )actualweightminus,b.sort as d2sort,b.bname,b.sapcode, b.cattlecode ,f.sapGoods ,(select cattle from feedtemplet where id = d.tempid) cattle
  432. FROM
  433. downloadedplan d
  434. JOIN downloadplandtl2 d2
  435. ON d.pastureid = d2.pastureid AND d2.pid = d.id and d2.type = 0
  436. JOIN downloadplandtl1 d1
  437. ON d.pastureid = d1.pastureid AND d1.flpid = d2.flpid AND d1.type = 0 AND d2.date = d1.date
  438. left join bar b on b.pastureid =d1.pastureid and b.id = d2.fbarid
  439. left join feedtempletdate ftd1 on d1.feedcode = '-1' and ftd1.date = d1.date and ftd1.id = d1.fid
  440. LEFT JOIN ftdetaildate ftd ON ftd.pastureid =d1.pastureid AND ftd.ftid = ftd1.id AND d1.feedcode = '-1' AND ftd.date =d1.date AND ftd.version = ftd1.version
  441. left join feed f on f.id = ftd.fid
  442. WHERE d.pastureid = ? AND d.mydate = ? and d1.feedcode = -1 and b.sapCode is not null and d1.fname like concat('%','_剩料','%')
  443. GROUP BY d2.fbarid,IFNULL(ftd.fname,d1.fname )
  444. HAVING d2.type = 0 order by b.sort,d2.fbarid)
  445. ) tem
  446. GROUP BY tem.fbarid,tem.feedname
  447. ORDER BY tem.d2sort,tem.feedname `, pastureId, pastureId, pastureId, pastureinfo.Werks, now.Format("20060102"), pastureId, date, pastureId, date).Query().List()
  448. if err != nil {
  449. logs.Error(err)
  450. return err
  451. }
  452. data := `{
  453. "DEST": {
  454. "DEST_ID": "TMRWATCH",
  455. "BUSS_TP": "MM016"
  456. },
  457. "DATA": %s
  458. }`
  459. databyte, _ := json.Marshal(dataList)
  460. data = fmt.Sprintf(data, now.Format("20060102"), pastureinfo.Werks, string(databyte))
  461. url := "https://app.modernfarming.cn:7443/sap/QAS/Feed/MM032/LeftoverEntry"
  462. postPush(url, data, 0, tx, pastureId)
  463. return nil
  464. }
  465. //剩料使用
  466. func Wasteuse(c *gin.Context) {
  467. appG := app.Gin{C: c}
  468. dataByte, _ := ioutil.ReadAll(c.Request.Body)
  469. fsion := gofasion.NewFasion(string(dataByte))
  470. pastureId := fsion.Get("pastureId").ValueStr()
  471. date := fsion.Get("date").ValueStr()
  472. wasteuse(pastureId, date)
  473. appG.Response(http.StatusOK, e.SUCCESS, true)
  474. }
  475. func LeftoverEntry(c *gin.Context) {
  476. appG := app.Gin{C: c}
  477. dataByte, _ := ioutil.ReadAll(c.Request.Body)
  478. fsion := gofasion.NewFasion(string(dataByte))
  479. pastureId := fsion.Get("pastureId").ValueStr()
  480. date := fsion.Get("date").ValueStr()
  481. leftoverEntry(pastureId, date)
  482. appG.Response(http.StatusOK, e.SUCCESS, true)
  483. }
  484. //剩料使用
  485. func wasteuse(pastureId, date string) error {
  486. tx := restful.Engine.NewSession()
  487. defer tx.Close()
  488. pastureinfo := new(udPastureInfo)
  489. err := tx.SQL(`select * from pasture where pastureid = ?`, pastureId).GetFirst(pastureinfo).Error
  490. if err != nil {
  491. logs.Error(err)
  492. return err
  493. }
  494. now, _ := time.ParseInLocation("2006-01-02", date, time.Local)
  495. dataList, err := tx.SQL(`select ftd.cattle FCWTS,
  496. b.sapCode CHSNO ,b.bname CHSTX, '11.01.01.01.000094' MATNR,'系统剩料' MAKTX,w.weight MENGE,'' MEINS
  497. from wasteuse w join feedtemplet ftd on ftd.id = w.ftid join bar b on b.id = w.barid
  498. where w.date = ? and b.pastureid = ? `, date, pastureId).Query().List()
  499. if err != nil {
  500. logs.Error(err)
  501. return err
  502. }
  503. data := `{
  504. "DEST": {
  505. "DEST_ID": "TMRWATCH",
  506. "BUSS_TP": "MM016"
  507. },
  508. "DATA": {
  509. "BUDAT": "%s",
  510. "WERKS": "%s",
  511. "ITEMS": %s
  512. }
  513. }`
  514. for i, data := range dataList {
  515. data["ZEILE"] = i
  516. }
  517. databyte, _ := json.Marshal(dataList)
  518. // now, _ := time.ParseInLocation("2006-01-02", date, time.Local)
  519. data = fmt.Sprintf(data, now.Format("20060102"), pastureinfo.Werks, string(databyte))
  520. url := "http://192.168.61.117/SAPQ0/Feed/MM016/StockOut"
  521. postPush(url, data, 0, tx, pastureId)
  522. return nil
  523. }
  524. func leftoverEntry(pastureId, date string) error {
  525. tx := restful.Engine.NewSession()
  526. defer tx.Close()
  527. pastureinfo := new(udPastureInfo)
  528. err := tx.SQL(`select * from pasture where pastureid = ?`, pastureId).GetFirst(pastureinfo).Error
  529. if err != nil {
  530. logs.Error(err)
  531. return err
  532. }
  533. // now, _ := time.ParseInLocation("2006-01-02", date, time.Local)
  534. dataList, err := tx.SQL(` SELECT
  535. p.werks WERKS,
  536. DATE_FORMAT( b.date, '%Y%m%d' ) BUDAT,
  537. ft.cattle FCWTS,
  538. bar.sapCode CHSNO,
  539. bar.bname CHSTX,
  540. '11.01.01.01.000094' MATNR,
  541. '系统剩料' MAKTX,
  542. b.weight MENGE ,"KG" MEINS,ztbar.sapCode ZCHSNO,ztbar.bname ZCHSTX
  543. FROM
  544. wasteuse b
  545. JOIN pasture p ON b.pastureid = p.pastureid
  546. JOIN feedpdate fp ON fp.date = b.date
  547. AND fp.barid = b.barid
  548. JOIN bar ON bar.id = b.barid
  549. JOIN feedtemplet ft ON ft.id = fp.ftid
  550. left join bar ztbar on ztbar.id = b.barid
  551. where DATE_FORMAT( b.date, '%Y-%m-%d' ) = ? and b.pastureid = ? `, date, pastureId).Query().List()
  552. if err != nil {
  553. logs.Error(err)
  554. return err
  555. }
  556. for i, data := range dataList {
  557. data["ZEILE"] = i
  558. }
  559. data := `{"DEST": {"DEST_ID": "TMRWATCH","BUSS_TP": "MM032"},"DATA": %s} `
  560. databyte, _ := json.Marshal(dataList)
  561. data = fmt.Sprintf(data, string(databyte))
  562. url := "http://192.168.61.117/SAPP0/Feed/MM032/LeftoverEntry"
  563. postPush(url, data, 0, tx, pastureId)
  564. return nil
  565. }