瀏覽代碼

Merge branch 'feature/new-scheduled' of baishaojie/tmrgo into develop

剩料定时任务
baishaojie 5 月之前
父節點
當前提交
aacf497936

二進制
KPTAdmin64.exe


二進制
TMRWatchComm


二進制
TMR计划执行情况.xlsx


+ 58 - 5
conf/app-test.ini

@@ -19,13 +19,13 @@ TimeFormat = 20060102-150405
 
 [server]
 #debug or release
-#RunMode = debug
+#RunMode = debuggit 
 RunMode = release
 HttpPort = 8081
 ReadTimeout = 60
 WriteTimeout = 60
 NoAuth = 1
-Mdns_servicename = kptadmin
+Mdns_servicename = TMRWATCH
 Mdns_serviceport = 5354
 # 0 http 1 https 2 http & https 不填 http
 Https = 2
@@ -37,12 +37,46 @@ KeyPath = conf/ssl.key
 ServerName = tmrgo
 DisplayName = tmrgo
 Description = tmrgo
+UDForwardingSvc = "http://192.168.8.250"
+# 0 无同步 1 圣牧+云养牛mqtt 2 现代牧业+云养牛mqtt 3 新希望 4 乐源 5 光明ud 6 多语言京鹏ud 7 一牧云 8 云养牛mqtt
+SyncStatus = 0
+# 对接
+GRFD = 1
+#GRFDURL = http://120.48.30.31:88
+GRFDURL = http://172.16.40.20:10001
+
 
 [database]
 Type = mysql
 User = root
-Password = 123456
-Host = 192.168.1.70:3306
+#Password = root
+#Password = kepaiteng!QAZ
+#Host = 8.130.17.8:3306
+#Host = 192.168.1.93:3326
+Host = 127.0.0.1:3316
+Name = root
+Password = root
+#Password = root
+#Password = kptzhu@163.com
+#Host = 192.168.1.50:3326
+#Password = root123456
+#Password = keep
+#Host=210.16.187.191:3306
+
+#Password = kpt123456*
+#Password = kepaiteng!QAZ
+#Host = 47.92.52.73:3306
+#Host = 127.0.0.1:3306
+#Host = 210.16.186.252:3326
+#Password = kptzhu@163.com
+#Host = 210.16.186.252:3326
+#Host = 127.0.0.1:3309
+#Name = equipment
+#Name = eqdev
+#Name = eq0422
+#Name = tmrgo
+#Password = kepaiteng!QAZ
+#Host = 222.73.129.15:31306
 Name = tmrwatch2
 TablePrefix =
 
@@ -51,6 +85,24 @@ ShowGetSqllog = false
 CacheApiSql = false
 
 
+[sqlserver]
+#Host = "sqlserver://sa:Password@@localhost?database=SysData&connection+timeout=30"
+##张北乐源 
+Host = 
+User = 
+Password = 
+Name = 
+
+
+
+[yyn]
+FarmId = "1830005373"
+ProductKey = "k03txxLKFae"
+DeviceName = "05373_p_breed"
+DeviceSecret = "c67a1996c9aa40732753de57c67a8c69"
+HeartBeat = "Tmr183000537305373_p_breed"
+
+
 [comm]
 PortName =
 BaudRate = 9600
@@ -58,4 +110,5 @@ DataBits = 8
 StopBits = 1
 ParityMode = 0    #PARITY_NONE  0	PARITY_ODD  1	PARITY_EVEN  2
 InterCharacterTimeout = 100
-MinimumReadSize = 0
+MinimumReadSize = 0
+

+ 11 - 11
conf/app.ini

@@ -38,7 +38,8 @@ ServerName = tmrgo
 DisplayName = tmrgo
 Description = tmrgo
 UDForwardingSvc = "http://192.168.8.250"
-
+# 0 无同步 1 圣牧+云养牛mqtt 2 现代牧业+云养牛mqtt 3 新希望 4 乐源 5 光明ud 6 多语言京鹏ud 7 一牧云 8 云养牛mqtt
+SyncStatus = 0
 # 对接
 GRFD = 1
 #GRFDURL = http://120.48.30.31:88
@@ -51,8 +52,8 @@ User = root
 #Password = root
 #Password = kepaiteng!QAZ
 #Host = 8.130.17.8:3306
-Host = 192.168.1.93:3326
-#Host = 127.0.0.1:3316
+#Host = 192.168.1.93:3326
+Host = 127.0.0.1:3316
 Name = root
 Password = root
 #Password = root
@@ -76,7 +77,7 @@ Password = root
 #Name = tmrgo
 #Password = kepaiteng!QAZ
 #Host = 222.73.129.15:31306
-Name = nxzwnk
+Name = tmrwatch
 TablePrefix =
 
 ShowXormlog = false
@@ -92,15 +93,14 @@ User =
 Password = 
 Name = 
 
-[yyn]
-#蓝浩
-FarmId = "1830004776"
-ProductKey = "k03txxLKFae"
-DeviceName = "04776_p_breed"
-DeviceSecret = "e1fdb50556b13afe896e738fdcb25bf3"
-HeartBeat = "Tmr183000477604776_p_breed"
 
 
+[yyn]
+FarmId = "1830005373"
+ProductKey = "k03txxLKFae"
+DeviceName = "05373_p_breed"
+DeviceSecret = "c67a1996c9aa40732753de57c67a8c69"
+HeartBeat = "Tmr183000537305373_p_breed"
 
 
 [comm]

+ 1 - 0
conf/setting/setting.go

@@ -74,6 +74,7 @@ type Server struct {
 	GRFD             string
 	GRFDURL          string
 	UDForwardingSvc  string
+	SyncStatus       int
 }
 
 type Database struct {

+ 0 - 1
http/handle/api/mqtt.go

@@ -62,7 +62,6 @@ func InitMqttClient() {
 		// feedtempletPush(c, pubTopic)
 		// CompletedTrainNumberPush(c, pubTopic, now)
 		// stirPush(c, pubTopic, "2024-07-01")
-		// dustingPush(c, pubTopic, "2024-07-01")
 		// equipmentAccuracyPush(c, pubTopic, "2024-07-01")
 		// finishedWeightPush(c, pubTopic, "2024-07-01")
 		// feedtempletPush(c, pubTopic)

+ 437 - 3
http/handle/api/ops.go

@@ -20,6 +20,7 @@ import (
 	"tmr-watch/conf/setting"
 	"tmr-watch/http/handle/jpud"
 	"tmr-watch/http/handle/restful"
+	"tmr-watch/http/handle/ymy"
 	"tmr-watch/models"
 	"tmr-watch/module"
 	"tmr-watch/pkg/app"
@@ -1096,7 +1097,7 @@ func GetRJSBData(c *gin.Context) {
 	returntype := fsion.Get("returntype").ValueDefaultStr("map")
 	month := fsion.Get("month").ValueDefaultStr("map")
 	logging.Info("GetUpkeepPlan ", c.Keys, sqlnamestr, month)
-	pagecount = 1
+	// pagecount = 1
 	tx := restful.Engine.NewSession()
 	err := tx.Begin()
 	defer func() {
@@ -6261,6 +6262,19 @@ func GetTMRListEnableTypeAll(c *gin.Context) {
 		data["enable"] = 1
 		data["id"] = fmt.Sprintf("%d", id)
 		data["pastureid"] = pastureid
+
+		// data := make(map[string]interface{}, 0)
+		// data["eqcode"] = fmt.Sprintf("AnyCar%d", n)
+		// data["tname"] = fmt.Sprintf("AnyCar%d", n)
+		// data["datacaptureno"] = -2
+		// data["tclassid"] = -2
+		// data["tmrmix"] = fmt.Sprintf("AnyCar%d", n)
+		// data["tclassname"] = fmt.Sprintf("AnyCar%d", n)
+		// data["maxstirfeed"] = 100000
+		// data["remark"] = fmt.Sprintf("AnyCar%d", n)
+		// data["enable"] = 1
+		// data["id"] = fmt.Sprintf("%d", id)
+		// data["pastureid"] = pastureid
 		dataList = append(dataList, data)
 	}
 	// UNION ALL
@@ -9314,7 +9328,7 @@ func UdFeedSync(c *gin.Context) {
 	}
 
 	// gm.UdFeedSync(pastureid, pastureinfo.Werks)
-	jpud.UdBarSync(pastureid, pastureinfo.Werks)
+	jpud.UdFeedSync(pastureid, pastureinfo.Werks)
 	appG.Response(http.StatusOK, e.SUCCESS, "ok")
 }
 
@@ -9405,6 +9419,103 @@ func UdMaterialIssuePush(c *gin.Context) {
 	appG.Response(http.StatusOK, e.SUCCESS, "ok")
 }
 
+//搅拌
+func YmyUtirPush(c *gin.Context) {
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsions := gofasion.NewFasion(string(dataByte))
+	pastureid := fsions.Get("pastureId").ValueStr()
+	date := fsions.Get("date").ValueStr()
+	tx := restful.Engine.NewSession()
+	defer tx.Close()
+
+	pastureinfo := new(udPastureInfo)
+	err := tx.SQL(`select werks from pasture where pastureid = ?`, pastureid).GetFirst(pastureinfo).Error
+	if err != nil {
+		logs.Error(err)
+		return
+	}
+
+	ymy.YmyUtirPush(pastureid, pastureinfo.Werks, date)
+	appG.Response(http.StatusOK, e.SUCCESS, "ok")
+}
+
+//撒料
+func YmyMaterialIssuePush(c *gin.Context) {
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsions := gofasion.NewFasion(string(dataByte))
+	pastureid := fsions.Get("pastureId").ValueStr()
+	date := fsions.Get("date").ValueStr()
+	tx := restful.Engine.NewSession()
+	defer tx.Close()
+
+	pastureinfo := new(udPastureInfo)
+	err := tx.SQL(`select werks from pasture where pastureid = ?`, pastureid).GetFirst(pastureinfo).Error
+	if err != nil {
+		logs.Error(err)
+		return
+	}
+
+	ymy.YmyMaterialIssuePush(pastureid, pastureinfo.Werks, date)
+	appG.Response(http.StatusOK, e.SUCCESS, "ok")
+}
+
+func YmyFeedtempletPush(c *gin.Context) {
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsions := gofasion.NewFasion(string(dataByte))
+	pastureid := fsions.Get("pastureId").ValueStr()
+	date := fsions.Get("date").ValueStr()
+	tx := restful.Engine.NewSession()
+	defer tx.Close()
+
+	pastureinfo := new(udPastureInfo)
+	err := tx.SQL(`select werks from pasture where pastureid = ?`, pastureid).GetFirst(pastureinfo).Error
+	if err != nil {
+		logs.Error(err)
+		return
+	}
+
+	ymy.YmyFeedtempletPush(pastureid, pastureinfo.Werks, date)
+	appG.Response(http.StatusOK, e.SUCCESS, "ok")
+}
+
+//饲料
+func YmySyncFeed(c *gin.Context) {
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsions := gofasion.NewFasion(string(dataByte))
+	pastureid := fsions.Get("pastureId").ValueStr()
+	// date := fsions.Get("date").ValueStr()
+	tx := restful.Engine.NewSession()
+	defer tx.Close()
+
+	ymy.YmySyncFeed(pastureid)
+	appG.Response(http.StatusOK, e.SUCCESS, "ok")
+}
+
+// 栏舍
+func YmySyncBar(c *gin.Context) {
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsions := gofasion.NewFasion(string(dataByte))
+	pastureid := fsions.Get("pastureId").ValueStr()
+	// date := fsions.Get("date").ValueStr()
+	tx := restful.Engine.NewSession()
+	defer tx.Close()
+
+	pastureinfo := new(udPastureInfo)
+	err := tx.SQL(`select werks from pasture where pastureid = ?`, pastureid).GetFirst(pastureinfo).Error
+	if err != nil {
+		logs.Error(err)
+		return
+	}
+
+	ymy.YmySyncBar(pastureinfo.Werks, pastureid)
+	appG.Response(http.StatusOK, e.SUCCESS, "ok")
+}
+
 func DelFeedTemplet(c *gin.Context) {
 	appG := app.Gin{C: c}
 	dataByte, _ := ioutil.ReadAll(c.Request.Body)
@@ -9725,7 +9836,7 @@ func EditDownloadedplanArtificial(c *gin.Context) {
 	planIdList := strings.Split(planIdStr, ",")
 
 	for _, planId := range planIdList {
-		_, err := tx.Exec(` update downloadedplan set artificial = 1 ,havebutton = 1,iscompleted = 1  where id = ?  and havebutton != 1`, planId)
+		_, err := tx.Exec(` update downloadedplan set artificial = 1 ,havebutton = 1,iscompleted = 1  where id = ?  `, planId)
 		if err != nil {
 			logs.Error(err)
 			appG.Response(http.StatusOK, e.ERROR, "修改计划状态失败!"+err.Error())
@@ -11693,3 +11804,326 @@ select pastureid,(select id from feedtemplet where tcode = ? ),fid,fname,lweight
 
 	appG.Response(http.StatusOK, e.SUCCESS, true)
 }
+
+func Test(c *gin.Context) {
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	appG.Response(http.StatusOK, e.SUCCESS, string(dataByte))
+}
+
+func GetPlanDry(c *gin.Context) {
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	date := fsion.Get("date").ValueStr()
+
+	tx := restful.Engine.NewSession()
+	defer tx.Close()
+
+	dataList, err := tx.SQL(`SELECT 
+t.feedtempletName,
+ifnull(t.feedtempletPrice,0)feedtempletPrice,
+ifnull(t.feedtempletWeight,0)feedtempletWeight,
+ifnull(t.feedtempletDryWeight,0)feedtempletDryWeight,
+    t.tmrno,
+    t.bname,
+    t.barid,
+    t.dry,
+    t.actualweightminus,
+    t.mydate,
+    t.pasturename,
+    t.endDate,
+    t.startDate,
+    t.times,
+    -- 计算startDate和endDate的中间时间
+    ifnull(DATE_FORMAT(
+        DATE_ADD(
+            t.startDate, 
+            INTERVAL TIMESTAMPDIFF(SECOND, t.startDate, t.endDate)/2 SECOND
+        ), 
+        '%Y-%m-%d %H:%i:%s'
+    ),'') AS midTime
+FROM (
+    SELECT  
+        (SELECT sort FROM downloadedplan WHERE pid = d.pid AND mydate = d.mydate AND lpplantype IN (0,1)) tmrno,
+        b.bname,
+        b.id barid,
+        ROUND(IF(IFNULL(d2.actualweightminus,0) < 0, d2.lweight/(select sum(lweight) from downloadplandtl2 where pid = d2.pid  )*(select sum(dd1.actualweightminus) from downloadplandtl1 dd1 join downloadedplan dd on dd1.pid = dd.id  where dd.pid = d.pid and dd.mydate = d.mydate and dd.lpplantype in(0,1) ) , d2.actualweightminus/(select sum(lweight) from downloadplandtl2 where pid = d2.pid  )*(select sum(dd1.actualweightminus) from downloadplandtl1 dd1 join downloadedplan dd on dd1.pid = dd.id  where dd.pid = d.pid and dd.mydate = d.mydate and dd.lpplantype in(0,1) )  )*((SELECT IFNULL(AVG(dry),0) FROM downloadedplan dd 
+            JOIN downloadplandtl1 dd1 ON dd.id = dd1.pid   
+            JOIN feednur fn ON fn.fid = dd1.fid 
+            WHERE dd.pid = d.pid AND dd.mydate = d.mydate AND lpplantype IN (0,1,4))/100),2) dry,
+       IF(IFNULL(d2.actualweightminus,0) < 0, d2.lweight/(select sum(lweight) from downloadplandtl2 where pid = d2.pid  )*(select sum(dd1.actualweightminus) from downloadplandtl1 dd1 join downloadedplan dd on dd1.pid = dd.id  where dd.pid = d.pid and dd.mydate = d.mydate and dd.lpplantype in(0,1) ) , d2.actualweightminus/(select sum(actualweightminus) from downloadplandtl2 where pid = d2.pid  )*(select sum(dd1.actualweightminus) from downloadplandtl1 dd1 join downloadedplan dd on dd1.pid = dd.id  where dd.pid = d.pid and dd.mydate = d.mydate and dd.lpplantype in(0,1) )  ) actualweightminus,
+        DATE_FORMAT(d.mydate,'%Y-%m-%d') mydate,
+        p.pasture_name pastureName,
+        DATE_FORMAT(d2.intime,'%Y-%m-%d %H:%i:%s') endDate,
+        DATE_FORMAT(IFNULL(
+            (SELECT MAX(intime) FROM downloadplandtl2 d1
+            WHERE d1.pid=d2.pid AND d1.pastureid = d2.pastureid AND d1.intime<d2.intime),
+            (SELECT MAX(intime) FROM downloadplandtl1_exec de
+            WHERE de.date=d2.date AND de.pastureid = d2.pastureid AND de.pid=d2.pid)
+        ), '%Y-%m-%d %H:%i:%s') startDate,
+        d.times ,
+				( SELECT 
+
+round(SUM(
+IF(ftd.preftid<>0,
+ ftd.fweight*IFNULL((SELECT SUM(ftd1.fweight*f1.dry/100)/SUM(ftd1.fweight) FROM ftdetaildate ftd1
+JOIN feednur f1 ON f1.fid= ftd1.fid  AND f1.pastureid = ftd1.pastureid
+WHERE ftd1.pastureid = ftd.pastureid AND ftd1.ftid = ftd.preftid and ftd1.date = d2.date ),0),
+ftd.fweight*f.dry/100)) ,2)
+dryweight
+ FROM ftdetaildate ftd
+LEFT JOIN feednur f ON f.fid= ftd.fid  AND f.pastureid = ftd.pastureid
+WHERE  ftd.ftid = d.tempid  and ftd.date = d2.date  ) feedtempletDryWeight,(
+select 
+sum(ftd.fweight)
+FROM ftdetaildate ftd 
+WHERE  ftd.ftid = d.tempid  and ftd.date = d2.date ) feedtempletWeight,
+( SELECT 
+
+round(SUM(
+IF(ftd.preftid<>0,
+IFNULL((SELECT SUM(ftd1.fweight*f1.uprice) FROM ftdetaildate ftd1
+JOIN feed f1 ON f1.id= ftd1.fid  AND f1.pastureid = ftd1.pastureid
+WHERE ftd1.pastureid = ftd.pastureid AND ftd1.ftid = ftd.preftid and ftd1.date = d2.date ),0),
+ftd.fweight*f.uprice)) ,2)
+dryweight
+ FROM ftdetaildate ftd
+LEFT JOIN feed f ON f.id= ftd.fid  AND f.pastureid = ftd.pastureid
+WHERE  ftd.ftid = d.tempid  and ftd.date = d2.date  )
+ feedtempletPrice,d.templetname  feedtempletName
+
+
+    FROM downloadedplan d
+    JOIN downloadplandtl2 d2 ON d.id=d2.PID
+    JOIN bar b ON b.id = d2.fbarid
+    JOIN pasture p ON p.pastureid = d.pastureid 
+    WHERE d.mydate = DATE_FORMAT(?,'%Y-%m-%d') 
+    AND d2.type = 0   
+    AND d.havebutton = 1
+) t 
+WHERE 1=1   `, date).QueryString()
+	if err != nil {
+		logs.Error(err)
+		appG.Response(http.StatusOK, e.ERROR, "查询失败")
+		return
+	}
+
+	appG.Response(http.StatusOK, e.SUCCESS, dataList)
+}
+
+func GetBar(c *gin.Context) {
+	appG := app.Gin{C: c}
+
+	tx := restful.Engine.NewSession()
+	defer tx.Close()
+
+	pastureinfo := new(udPastureInfo)
+	err := tx.SQL(`select column_default  as pastureid,(select werks from pasture where pastureid = column_default)  werks  from    information_schema.COLUMNS
+	WHERE table_name = 'recweight' AND table_schema = ? AND column_name = 'pastureid'`, setting.DatabaseSetting.Name).GetFirst(pastureinfo).Error
+	if err != nil {
+		logs.Error(err)
+		return
+	}
+
+	dataList, err := tx.SQL(` select id,bname from bar where pastureid = ?`, pastureinfo.Pastureid).QueryString()
+	if err != nil {
+		logs.Error(err)
+		appG.Response(http.StatusOK, e.ERROR, "查询失败")
+		return
+	}
+
+	appG.Response(http.StatusOK, e.SUCCESS, dataList)
+}
+
+func GetHomepage(c *gin.Context) {
+	appG := app.Gin{C: c}
+
+	tx := restful.Engine.NewSession()
+	defer tx.Close()
+	dataList, err := tx.SQL(` SELECT 
+		ifnull((SELECT CONCAT(ROUND(if(SUM(lweight) <= SUM(iweight),SUM(lweight)/SUM(iweight),SUM(iweight)/SUM(lweight))*100,2),'%') yesRateHL
+		FROM downloadedplan dt WHERE dt.pastureid = d.pastureid 
+		AND dt.mydate=DATE_FORMAT(DATE_SUB(d.mydate,INTERVAL 1 DAY),'%Y-%m-%d')  and dt.lpplantype in(0,1) ),'0.00%')yesRateHL, -- 昨日混料准确率
+		(SELECT CONCAT(ROUND(SUM(iweight)/SUM(lweight)*100,2),'%') yesRateHL
+		FROM downloadedplan dt WHERE dt.pastureid = d.pastureid  
+		AND dt.mydate BETWEEN DATE_FORMAT(DATE_SUB(d.mydate,INTERVAL 31 DAY),'%Y-%m-%d') AND DATE_FORMAT(DATE_SUB(d.mydate,INTERVAL 1 DAY),'%Y-%m-%d')  and dt.lpplantype in(0,1) )monRateHL , -- 近30日混料准确率
+		
+		ifnull((SELECT CONCAT(ROUND(SUM(oweight)/SUM(lweight)*100,2),'%')  yesRateSL
+		FROM downloadedplan dt WHERE dt.pastureid = d.pastureid  
+		AND dt.mydate=DATE_FORMAT(DATE_SUB(d.mydate,INTERVAL 1 DAY),'%Y-%m-%d') and dt.lpplantype in(0,2) ),'0.00%')yesRateSL,	-- 昨日撒料准确率
+		
+		(SELECT CONCAT(ROUND(SUM(oweight)/SUM(lweight)*100,2),'%')  yesRateSL
+		FROM downloadedplan dt WHERE dt.pastureid = d.pastureid  
+		AND dt.mydate BETWEEN DATE_FORMAT(DATE_SUB(d.mydate,INTERVAL 31 DAY),'%Y-%m-%d') AND DATE_FORMAT(DATE_SUB(d.mydate,INTERVAL 1 DAY),'%Y-%m-%d')  and dt.lpplantype in(0,2) )monRateSL, -- 进30日撒料准确率
+
+		ifnull((SELECT CONCAT(ROUND(IF(COUNT(de.id)>0,SUM(IF(ABS(de.actualweightminus-de.lweight)<=de.allowratio,1,0))/COUNT(de.id),0)*100,2),'%')  -- 正确率
+		FROM downloadedplan dt JOIN downloadplandtl2 de ON dt.id=de.pid AND dt.pastureid = de.pastureid
+		WHERE dt.pastureid = d.pastureid  AND dt.mydate=DATE_FORMAT(DATE_SUB(d.mydate,INTERVAL 1 DAY),'%Y-%m-%d')),'0.00%') yesRateSLR, -- 昨日正确率
+
+		(SELECT CONCAT(ROUND(IF(COUNT(de.id)>0,SUM(IF(ABS(de.actualweightminus-de.lweight)<=de.allowratio,1,0))/COUNT(de.id),0)*100,2),'%')  -- 正确率
+		FROM downloadedplan dt JOIN downloadplandtl2 de ON dt.id=de.pid AND dt.pastureid = de.pastureid
+		WHERE dt.pastureid = d.pastureid  
+		AND dt.mydate BETWEEN DATE_FORMAT(DATE_SUB(d.mydate,INTERVAL 31 DAY),'%Y-%m-%d') AND DATE_FORMAT(DATE_SUB(d.mydate,INTERVAL 1 DAY),'%Y-%m-%d')) monRateSLR, -- 近30日正确率
+
+		(SELECT COUNT(*)FROM downloadedplan dt WHERE dt.pastureid=  d.pastureid AND dt.mydate = d.mydate and dt.iscompleted=1 and if ( 0 = 0 ,1=1, if(0 = 1 ,dt.lpplantype in(0,1), dt.lpplantype in(0,2) ) )) doneTimes,
+		(SELECT COUNT(*)FROM downloadedplan dt WHERE dt.pastureid= d.pastureid AND dt.mydate = d.mydate and if ( 0 = 0 ,1=1, if(0 = 1 ,dt.lpplantype in(0,1), dt.lpplantype in(0,2) ) ) ) planTimes,
+		ifnull((SELECT SUM(dc.actualweightminus) FROM downloadplandtl1_exec dc join downloadedplan dt on dt.id = dc.pid WHERE dc.pastureid = 0 AND dc.date = d.mydate and  if ( 0 = 0 ,1=1, if(0 = 1 ,dt.lpplantype in(0,1), dt.lpplantype in(0,2) ) ) ),0) doneWeight,
+		ifnull((SELECT SUM(dc.lweight ) FROM downloadplandtl1_exec dc join downloadedplan dt on dt.id = dc.pid  WHERE dc.pastureid = 0 AND dc.date = d.mydate  and  if ( 0 = 0 ,1=1, if(0 = 1 ,dt.lpplantype in(0,1), dt.lpplantype in(0,2) ) ) ),0) planWeight,
+		ifnull(round(getSLtimeDiffSINGEL(d.pastureid,d.mydate),2),0.00) temtime,
+		ifnull(round(getSLtimeDiffMonth(d.pastureid) ,2),0.00) montime
+		FROM 
+		(SELECT (select column_default  as pastureid  from    information_schema.COLUMNS
+			WHERE table_name = 'recweight'   AND table_schema = ?  AND column_name = 'pastureid') as pastureid,date_format(now(),'%Y-%m-%d') mydate) d `, setting.DatabaseSetting.Name).QueryString()
+	if err != nil {
+		logs.Error(err)
+		appG.Response(http.StatusOK, e.ERROR, "查询失败")
+		return
+	}
+
+	dataList1, err := tx.SQL(`select
+		ifnull(round(sum(if(d1.feedcode = '-1', d1.actualweightminus * (ftd.fweight/(SELECT SUM(ftd2.fweight) FROM ftdetail ftd2 WHERE ftd2.ftid = d1.fid ))* f.uprice,f.uprice * d1.actualweightminus )) / (select sum(ccount)  from downloadplandtl2  d2 join bar b on b.id = d2.fbarid  join feedp fp on fp.barid = b.id  where date = d1.date),2),0)  cost   , ifnull(round(sum(if(d1.feedcode = '-1', d1.actualweightminus * (ftd.fweight/(SELECT SUM(ftd2.fweight) FROM ftdetail ftd2 WHERE ftd2.ftid = d1.fid ))* f.uprice,f.uprice * d1.actualweightminus )),2),0) totalCost  from downloadplandtl1 d1
+	LEFT JOIN ftdetail ftd ON  ftd.pastureid =d1.pastureid AND ftd.ftid = d1.fid AND d1.feedcode = '-1'
+	join feed f on f.id = ifnull(ftd.fid,d1.fid)  where d1.date = date_format(now(),'%Y-%m-%d')    `).QueryString()
+	if err != nil {
+		logs.Error(err)
+		appG.Response(http.StatusOK, e.ERROR, "查询失败")
+		return
+	}
+
+	for _, data := range dataList {
+		for _, data1 := range dataList1 {
+			data["totalCost"] = data1["totalCost"]
+			data["cost"] = data1["cost"]
+		}
+	}
+
+	appG.Response(http.StatusOK, e.SUCCESS, dataList)
+}
+
+func GetFeedingManagement(c *gin.Context) {
+	appG := app.Gin{C: c}
+
+	typea := c.Query("typea") // 0 栏舍 1 日期
+	startDate := c.Query("startdate")
+	endDate := c.Query("enddate")
+	tx := restful.Engine.NewSession()
+	defer tx.Close()
+
+	if typea == "0" {
+		dataList, err := tx.SQL(`select t.bname typea ,round(t.actualweightminus,2) actualweightminus ,round(t.dryweight,2) dryweight ,round(t.priceweight,2) totalcost ,round(t.priceweight / t.ccount,2) cost,t.ccount  from (SELECT 
+  SUM(
+	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 ,
+  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)*
+  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 )),
+	
+	 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)*
+  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  ))
+	)
+ )actualweightminus ,
+  SUM(
+	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 ,
+  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)*
+  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 )),
+	
+	 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)*
+  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  ))
+	) * ifnull(fn.dry,0)
+ ) dryweight ,   SUM(
+	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 ,
+  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)*
+  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 )),
+	
+	 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)*
+  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  ))
+	) * ifnull(f.uprice,0)
+ )  priceweight
+ ,(select  ccount from feedpdate where date = d1.date and barid = d2.fbarid) ccount,b.bname 
+ 
+ FROM 
+downloadedplan d
+
+JOIN downloadplandtl2 d2
+ON d.pastureid = d2.pastureid AND d2.pid = d.id   and d2.type = 0
+JOIN downloadplandtl1 d1
+ON d.pastureid = d1.pastureid AND d1.flpid = d2.flpid AND d1.type = 0 AND d2.date = d1.date
+left join feedtempletdate  ftd1 on   d1.feedcode = '-1'  and ftd1.date = d1.date and ftd1.id = d1.fid  
+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
+left join bar b  on b.pastureid =d1.pastureid and b.id = d2.fbarid 
+join feed f on f.id = if(d1.feedcode = '-1' , ftd.fid,d1.fid)
+left join feednur fn on fn.fid = f.id 
+
+WHERE  d.mydate BETWEEN ? AND ?  GROUP BY   d2.fbarid ) t  `, startDate, endDate).QueryString()
+		if err != nil {
+			logs.Error(err)
+			appG.Response(http.StatusOK, e.ERROR, "查询失败")
+			return
+		}
+
+		appG.Response(http.StatusOK, e.SUCCESS, dataList)
+	} else {
+		dataList, err := tx.SQL(`select date_format(t.date ,'%Y-%m-%d')  typea ,round(t.actualweightminus,2) actualweightminus ,round(t.dryweight,2) dryweight ,round(t.priceweight,2) totalcost ,round(t.priceweight / (select  sum(ccount) from feedpdate fp  where fp.date =  t.date and fp.barid in(select fbarid from downloadplandtl2  where date =  t.date and type = 0)  ) ,2) cost,(select  sum(ccount) from feedpdate fp  where fp.date =  t.date and fp.barid in(select fbarid from downloadplandtl2  where date =  t.date and type = 0)  )  ccount  from (SELECT 
+  SUM(
+	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 ,
+  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)*
+  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 )),
+	
+	 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)*
+  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  ))
+	)
+ )actualweightminus ,
+  SUM(
+	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 ,
+  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)*
+  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 )),
+	
+	 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)*
+  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  ))
+	) * ifnull(fn.dry,0)
+ ) dryweight ,   SUM(
+	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 ,
+  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)*
+  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 )),
+	
+	 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)*
+  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  ))
+	) * ifnull(f.uprice,0)
+ )  priceweight
+ ,(select  sum(ccount) from feedpdate fp join downloadplandtl2 dd2 on dd2.fbarid = fp.barid where fp.date =  d2.date and  dd2.date = d2.date ) ccount,d2.date 
+ 
+ FROM 
+downloadedplan d
+
+JOIN downloadplandtl2 d2
+ON d.pastureid = d2.pastureid AND d2.pid = d.id   and d2.type = 0
+JOIN downloadplandtl1 d1
+ON d.pastureid = d1.pastureid AND d1.flpid = d2.flpid AND d1.type = 0 AND d2.date = d1.date
+left join feedtempletdate  ftd1 on   d1.feedcode = '-1'  and ftd1.date = d1.date and ftd1.id = d1.fid  
+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
+left join bar b  on b.pastureid =d1.pastureid and b.id = d2.fbarid 
+join feed f on f.id = if(d1.feedcode = '-1' , ftd.fid,d1.fid)
+left join feednur fn on fn.fid = f.id 
+WHERE  d.mydate BETWEEN ? AND ?
+GROUP BY  d.mydate) t `, startDate, endDate).QueryString()
+		if err != nil {
+			logs.Error(err)
+			appG.Response(http.StatusOK, e.ERROR, "查询失败")
+			return
+		}
+
+		appG.Response(http.StatusOK, e.SUCCESS, dataList)
+	}
+}
+
+// doneTimes		完成计划
+// doneWeight		完成重量
+// monRateHL		近三十天混料准确率
+// monRateSL		近三十天撒料准确率
+// monRateSLR		近30天撒料正确率
+// montime			近30天撒料偏差
+// planTimes		计划车次
+// planWeight		计划重量
+// temtime			撒料偏差
+// yesRateHL		混料准确率
+// yesRateSL		撒料准确率
+// yesRateSLR       撒料正确率

+ 18 - 2
http/handle/api/report.go

@@ -916,7 +916,7 @@ func getAccuracyV5(queryList []map[string]interface{}, typea int) (map[string]in
 	}
 
 	for i := 0; i < len(queryList); i++ {
-		a = mapc2[queryList[i]["feedname"]].(int) * 2
+		a = mapc2[queryList[i]["feedname"]].(int) * 4
 		if i == 0 {
 			datamap2["label"] = "饲料名称"
 			switch queryList[i]["typestr"].(type) {
@@ -956,6 +956,20 @@ func getAccuracyV5(queryList []map[string]interface{}, typea int) (map[string]in
 				datamap2child = make(map[string]interface{})
 			}
 
+			if typea == 0 || typea == 3 {
+				datamap2child["label"] = "理论重量"
+				datamap2child["prop"] = "a" + strconv.Itoa(a+2)
+				data3 = append(data3, datamap2child)
+				datamap2child = make(map[string]interface{})
+			}
+
+			if typea == 0 || typea == 4 {
+				datamap2child["label"] = "实际重量"
+				datamap2child["prop"] = "a" + strconv.Itoa(a+3)
+				data3 = append(data3, datamap2child)
+				datamap2child = make(map[string]interface{})
+			}
+
 			// datamap2child["label"] = "理论"
 			// datamap2child["prop"] = "a" + strconv.Itoa(a)
 			// data3 = append(data3, datamap2child)
@@ -976,8 +990,10 @@ func getAccuracyV5(queryList []map[string]interface{}, typea int) (map[string]in
 		datamap1["A"] = queryList[i]["fname"]
 		datamap1["a"+strconv.Itoa(a)] = queryList[i]["lweight"]
 		datamap1["a"+strconv.Itoa(a+1)] = queryList[i]["actualweightminus"]
+		datamap1["a"+strconv.Itoa(a+2)] = queryList[i]["lweight1"]
+		datamap1["a"+strconv.Itoa(a+3)] = queryList[i]["actualweightminus1"]
 		datamap2["label"] = queryList[i]["饲料名称"]
-		a = a + 2
+		a = a + 4
 
 	}
 

+ 250 - 147
http/handle/api/scheduled.go

@@ -15,7 +15,11 @@ import (
 	"time"
 
 	"tmr-watch/conf/setting"
+	"tmr-watch/http/handle/gm"
+	"tmr-watch/http/handle/jpud"
 	"tmr-watch/http/handle/restful"
+	"tmr-watch/http/handle/sap"
+	"tmr-watch/http/handle/ymy"
 	"tmr-watch/pkg/app"
 	"tmr-watch/pkg/e"
 	"tmr-watch/pkg/logging"
@@ -130,26 +134,84 @@ func CronScheduled(ctx context.Context) {
 	})
 	dayCron.Start()
 
-	// jpud.JPUDUdSync(pastureinfo.Pastureid, pastureinfo.Werks)
-	// udFeedSync(pastureinfo)
+	// 0 无同步 1 圣牧 2 现代牧业 3 新希望 4 乐源 5 光明ud 6 多语言京鹏ud 7 一牧云
+	if setting.ServerSetting.SyncStatus == 1 {
+		// 圣牧
+		manualUdData(pastureinfo)
+		InitMqttClient()
+	} else if setting.ServerSetting.SyncStatus == 2 {
+		xdmy := cron.New()
+		err = xdmy.AddFunc("0 05 7 * * *", func() {
+			// 现代牧业sap同步
+			sap.SyncMaterialOutbound()
+			sap.SyncSurplusOutbound()
+			sap.SyncLeftoverEntry()
+			// sap.SyncWasteuse()
+		})
+		xdmy.Start()
+		InitMqttClient()
+	} else if setting.ServerSetting.SyncStatus == 3 {
+		duetimecst4, _ := time.ParseInLocation("15:04:05", "00:01:00", time.Local)
+		duetimecst5, _ := time.ParseInLocation("15:04:05", "00:00:00", time.Local)
+		spec2 := fmt.Sprintf("@every %v", duetimecst4.Sub(duetimecst5))
+		xxw := cron.New()
+		xxw.AddFunc(spec2, func() {
+			XxwFeedtemplet(pastureinfo.Pastureid)
+			xxwFeedpSync(pastureinfo.Pastureid)
+		})
+		xxw.Start()
+	} else if setting.ServerSetting.SyncStatus == 4 {
+		duetimecst4, _ := time.ParseInLocation("15:04:05", "00:01:00", time.Local)
+		duetimecst5, _ := time.ParseInLocation("15:04:05", "00:00:00", time.Local)
+		spec2 := fmt.Sprintf("@every %v", duetimecst4.Sub(duetimecst5))
+		ly := cron.New()
+		ly.AddFunc(spec2, func() {
+			XxwFeedtemplet(pastureinfo.Pastureid)
+			xxwFeedpSync(pastureinfo.Pastureid)
+		})
+		ly.Start()
+	} else if setting.ServerSetting.SyncStatus == 5 {
+		gmud := cron.New()
+		err = gmud.AddFunc("0 05 7 * * *", func() {
+			gm.GmUdSync(pastureinfo.Pastureid, pastureinfo.Werks)
+		})
+		gmud.Start()
+	} else if setting.ServerSetting.SyncStatus == 6 {
+		jp := cron.New()
+		err = jp.AddFunc("0 05 7 * * *", func() {
+			jpud.JPUDUdSync(pastureinfo.Pastureid, pastureinfo.Werks)
+		})
+		jp.Start()
+	} else if setting.ServerSetting.SyncStatus == 7 {
+		c := cron.New()
+		err = c.AddFunc("0 05 7 * * *", func() {
+			ymy.YmyCron(pastureinfo.Werks, pastureinfo.Pastureid)
+		})
+		c.Start()
+	} else if setting.ServerSetting.SyncStatus == 8 {
+		InitMqttClient()
+	}
+	// manualUdData(pastureinfo)
+	// ymy.YmyCron(pastureinfo.Werks, pastureinfo.Pastureid)
 	// //圣牧自动同步前天有进行中的任务
-	manualUdData(pastureinfo)
+	// manualUdData(pastureinfo)
 	// gm.GmUdSync(pastureinfo.Pastureid, pastureinfo.Werks)
 	// jpud.UdBarSync(pastureinfo.Pastureid, pastureinfo.Werks)
 	// jpud.UdFeedSync(pastureinfo.Pastureid, pastureinfo.Werks)
 	// xdmy := cron.New()
 	// err = xdmy.AddFunc("0 05 7 * * *", func() {
 	// 	// 	// 	// 	//现代牧业sap同步
-	// 	// sap.SyncMaterialOutbound()
-	// 	// sap.SyncSurplusOutbound()
-	// 	// sap.SyncLeftoverEntry()
+	// sap.SyncMaterialOutbound()
+	// 	sap.SyncSurplusOutbound()
+	// 	sap.SyncLeftoverEntry()
+	// 	sap.SyncWasteuse()
 	// 	// 	// 	// 	// 光明ud同步
 	// 	// 	// 	fmt.Println(time.Now())
 	// 	// gm.GmUdSync(pastureinfo.Pastureid, pastureinfo.Werks)
-	// 	jpud.JPUDUdSync(pastureinfo.Pastureid, pastureinfo.Werks)
+	// 	// jpud.JPUDUdSync(pastureinfo.Pastureid, pastureinfo.Werks)
 	// })
 	// xdmy.Start()
-	InitMqttClient()
+	// InitMqttClient()
 	// yq.YqCron()
 	//新希望配方同步定时任务
 
@@ -165,8 +227,6 @@ func CronScheduled(ctx context.Context) {
 	// })
 	// xxw.Start()
 
-	// ymy.YmySyncFeed(pastureinfo.Werks, pastureinfo.Pastureid)
-
 }
 
 type ScheduledInfo struct {
@@ -1069,76 +1129,76 @@ func processAnalysisEarlyWarning(target []string, pastureId string, serviceId in
 }
 
 func manualUdData(pastureinfo *udPastureInfo) {
-	// 	c := cron.New()
-	// 	c.AddFunc("10 06 * * *", func() {
-	tx := restful.Engine.NewSession()
-	defer tx.Close()
-	now := time.Now().AddDate(0, 0, -1).Format("2006-01-02")
-	// now := "2023-02-22"
-	dataList, err := tx.SQL(" select id  from downloadedplan where mydate = ? ", now).QueryString()
-	if err != nil {
-		logging.Error("manualUdData-error-1:", err)
-		return
-	}
-	var idList []string
-	for _, data := range dataList {
-		idList = append(idList, data["id"])
-	}
+	c := cron.New()
+	c.AddFunc("10 06 * * *", func() {
+		tx := restful.Engine.NewSession()
+		defer tx.Close()
+		now := time.Now().AddDate(0, 0, -1).Format("2006-01-02")
+		// now := "2023-02-22"
+		dataList, err := tx.SQL(" select id  from downloadedplan where mydate = ? ", now).QueryString()
+		if err != nil {
+			logging.Error("manualUdData-error-1:", err)
+			return
+		}
+		var idList []string
+		for _, data := range dataList {
+			idList = append(idList, data["id"])
+		}
 
-	upList := make([]*ScheduledUpInfo, 0)
-	up := tx.Table("scheduled_up")
+		upList := make([]*ScheduledUpInfo, 0)
+		up := tx.Table("scheduled_up")
 
-	up.Where("company = ? ", "ud")
-	up.Where("datatype in (3,4,1)")
-	up.Where("automatic = 1")
-	err = up.Find(&upList)
-	if err != nil {
-		logging.Error("manualUdData-error-2: ", err)
-		return
-	}
+		up.Where("company = ? ", "ud")
+		up.Where("datatype in (3,4,1)")
+		up.Where("automatic = 1")
+		err = up.Find(&upList)
+		if err != nil {
+			logging.Error("manualUdData-error-2: ", err)
+			return
+		}
 
-	for _, item := range upList {
-		if item.Datasql != "" {
-			// if item.Datatype == 4 {
-			targetdataList := strings.Split(item.Targetdata, ",")
-			var args []interface{}
-			for _, targetdata := range targetdataList {
-				if targetdata == "pastureid" {
-					args = append(args, pastureinfo.Pastureid)
-				} else if targetdata == "idlist" {
-					item.Datasql = strings.ReplaceAll(item.Datasql, "idlist", strings.Join(idList, ","))
-				} else if targetdata == "date" {
-					args = append(args, now)
+		for _, item := range upList {
+			if item.Datasql != "" {
+				// if item.Datatype == 4 {
+				targetdataList := strings.Split(item.Targetdata, ",")
+				var args []interface{}
+				for _, targetdata := range targetdataList {
+					if targetdata == "pastureid" {
+						args = append(args, pastureinfo.Pastureid)
+					} else if targetdata == "idlist" {
+						item.Datasql = strings.ReplaceAll(item.Datasql, "idlist", strings.Join(idList, ","))
+					} else if targetdata == "date" {
+						args = append(args, now)
+					}
 				}
-			}
-			data, err := tx.SQL(item.Datasql, args...).Query().List()
-			if err != nil {
-				logging.Error("manualUdData-error-3: ", err)
-				continue
-			}
-			if len(data) > 0 {
-				databyte, err := json.Marshal(data)
+				data, err := tx.SQL(item.Datasql, args...).Query().List()
 				if err != nil {
-					logging.Error("manualUdData-error-4: ", err)
-					continue
-				}
-				exist, err := tx.SQL(`select * from saplog where pastureId = ? and msgtype = ? and date_format(dataDate ,'%Y-%m-%d') = ?  `,
-					pastureinfo.Pastureid, item.Datatype, now).Exist()
-				if exist {
+					logging.Error("manualUdData-error-3: ", err)
 					continue
 				}
+				if len(data) > 0 {
+					databyte, err := json.Marshal(data)
+					if err != nil {
+						logging.Error("manualUdData-error-4: ", err)
+						continue
+					}
+					exist, err := tx.SQL(`select * from saplog where pastureId = ? and msgtype = ? and date_format(dataDate ,'%Y-%m-%d') = ?  `,
+						pastureinfo.Pastureid, item.Datatype, now).Exist()
+					if exist {
+						continue
+					}
 
-				tx.Exec(` insert into saplog(pastureId,request,response,status,msgtext,createTime,msgtype,dataDate,url)
+					tx.Exec(` insert into saplog(pastureId,request,response,status,msgtext,createTime,msgtype,dataDate,url)
 					values(?,?,?,?,?,now(),?,?,?)`, pastureinfo.Pastureid, string(databyte), "", "", "", item.Datatype, now, "https://wdc.unidairy.cn/copartner_uploads/")
 
-				var method string
-				UDPostPush1(fmt.Sprintf(item.Package, string(databyte), len(data)), method)
+					var method string
+					UDPostPush1(fmt.Sprintf(item.Package, string(databyte), len(data)), method)
+				}
+				// }
 			}
-			// }
 		}
-	}
-	// })
-	// c.Start()
+	})
+	c.Start()
 
 	c1 := cron.New()
 	c1.AddFunc("01 18 * * *", func() {
@@ -1865,6 +1925,46 @@ func XxwFeedtemplet(pastureId string) {
 	// pastureId = "1725428057"
 	if count == 1 {
 
+		tx.Exec(` delete  from ftdetail_sync `)
+		tx.Exec(` INSERT INTO ftdetail_sync (
+	id,
+	pastureid,
+	ftid,
+	fid,
+	fname,
+	lweight,
+	fweight,
+	islockcount,
+	isfg,
+	sort,
+	feedgroup,
+	preftid,
+	autosecond,
+	autosecondname,
+	splitftpreid,
+	deviation,
+	is_show 
+) SELECT
+id,
+pastureid,
+ftid,
+fid,
+fname,
+lweight,
+fweight,
+islockcount,
+isfg,
+sort,
+feedgroup,
+preftid,
+ifnull(autosecond,0),
+autosecondname,
+splitftpreid,
+deviation,
+is_show
+FROM
+	ftdetail`)
+
 		ftList, err := tx.SQL(` SELECT
     IFNULL(recipeId, '') AS recipeId,
     IFNULL(fodderId, '') AS fodderId,
@@ -1905,79 +2005,79 @@ FROM
 				ids = time.Now().UnixNano()
 				logging.Info("create SnowIds err", err)
 			}
+			/*
+				if item["mergerFodderId"] == "" {
+					_, err = tx.Exec("insert into feedtemplet(id,pastureid,ccid,tcode,tname,fttypeid,fttype,xxwTempletCode)  "+
+						"values(?,?,(select id from cowclass where pastureid = ? limit 1),?,?,1,'饲喂配方',?) "+
+						" ON DUPLICATE KEY UPDATE owner ='丰顿下发' ", ids, pastureId, pastureId, item["recipeId"], item["recipeId"], item["recipeId"])
+					if err != nil {
+						log.Println("XxwFeedtemplet-error-2: ", err)
+						return
+					}
+				}
+			*/
 			// /*
 			if item["mergerFodderId"] == "" {
 				_, err = tx.Exec("insert into feedtemplet(id,pastureid,ccid,tcode,tname,fttypeid,fttype,xxwTempletCode)  "+
 					"values(?,?,(select id from cowclass where pastureid = ? limit 1),?,?,1,'饲喂配方',?) "+
-					" ON DUPLICATE KEY UPDATE owner ='丰顿下发' ", ids, pastureId, pastureId, item["recipeId"], item["recipeId"], item["recipeId"])
+					" ON DUPLICATE KEY UPDATE owner ='丰顿下发' ", ids, pastureId, pastureId, item["recipeId"],
+					item["recipeId"], item["recipeId"])
 				if err != nil {
 					log.Println("XxwFeedtemplet-error-2: ", err)
 					return
 				}
+
+				_, err = tx.Exec(` update feedtemplet f set  tcode = (select if(left((select max(tcode) from
+					feedtemplet where pastureid = ?),8) = (select DATE_FORMAT(now(),"%Y%m%d")),
+					(select max(tcode)+1 from feedtemplet where pastureid = ?),
+					(select concat(DATE_FORMAT(now(),"%Y%m%d"),"001"))))
+					 where xxwTempletCode = ? and tcode is null  `, pastureId, pastureId, item["recipeId"])
+				if err != nil {
+					log.Println("XxwFeedtemplet-error-3: ", err)
+					return
+				}
+				// */
+			} else {
+				_, err = tx.Exec(`insert into feedtemplet(id,pastureid,ccid,tname,fttypeid,fttype,xxwTempletCode)
+						values(?,?,(select id from cowclass where pastureid = ? limit 1),?,2,'预混配方',?)
+						 ON DUPLICATE KEY UPDATE owner ='丰顿下发' `, ids, pastureId, pastureId,
+					item["mergerFodderName"]+item["recipeId"], item["mergerFodderId"])
+				if err != nil {
+					log.Println("XxwFeedtemplet-error-3: ", err)
+					return
+				}
+
+				_, err = tx.Exec(` update feedtemplet f set  tcode = (select if(left((select max(tcode) from
+					feedtemplet where pastureid = ?),8) = (select DATE_FORMAT(now(),"%Y%m%d")),
+					(select max(tcode)+1 from feedtemplet where pastureid = ?),
+					(select concat(DATE_FORMAT(now(),"%Y%m%d"),"001"))))
+					 where xxwTempletCode = ? and tcode is null  `, pastureId, pastureId, item["mergerFodderId"])
+				if err != nil {
+					log.Println("XxwFeedtemplet-error-3: ", err)
+					return
+				}
+
+				tx.Exec(` update feedtemplet f set  ccname = (select classname from cowclass  where id = f.ccid )
+					 where xxwTempletCode = ?  and tcode is null  `, item["mergerFodderId"])
+
+				ids, err := setting.SnowIds.NextId()
+				if err != nil {
+					ids = time.Now().UnixNano()
+					logging.Info("create SnowIds err", err)
+				}
+				_, err = tx.Exec(`insert into ftdetail(id,pastureid,ftid,fid,fname,fweight,sort,autosecond,autosecondname,feedgroup,preftid,version)
+				 values(?,?,(select id from feedtemplet where pastureid=? and xxwTempletCode=? limit 1),
+					(select id from feedtemplet where pastureid=? and xxwTempletCode=? limit 1)   ,?,?,?,0,'',?,
+					(select id from feedtemplet where pastureid=? and xxwTempletCode =? limit 1),
+					(select version from feedtemplet where pastureid=? and xxwTempletCode=? limit 1)) `,
+					ids, pastureId, pastureId, item["recipeId"], pastureId, item["mergerFodderId"], item["mergerFodderName"]+item["recipeId"], item["autoWeight"],
+					item["orderNum"], item["mergerFodderName"], pastureId, item["mergerFodderId"], pastureId, item["recipeId"])
+				if err != nil {
+					log.Println("XxwFeedtemplet-error-4: ", err)
+					return
+				}
+
 			}
-			// */
-			// /*
-			// 	if item["mergerFodderId"] == "" {
-			// 		_, err = tx.Exec("insert into feedtemplet(id,pastureid,ccid,tcode,tname,fttypeid,fttype,xxwTempletCode)  "+
-			// 			"values(?,?,(select id from cowclass where pastureid = ? limit 1),?,?,1,'饲喂配方',?) "+
-			// 			" ON DUPLICATE KEY UPDATE owner ='丰顿下发' ", ids, pastureId, pastureId, item["recipeId"],
-			// 			item["recipeId"], item["recipeId"])
-			// 		if err != nil {
-			// 			log.Println("XxwFeedtemplet-error-2: ", err)
-			// 			return
-			// 		}
-
-			// 		_, err = tx.Exec(` update feedtemplet f set  tcode = (select if(left((select max(tcode) from
-			// 		feedtemplet where pastureid = ?),8) = (select DATE_FORMAT(now(),"%Y%m%d")),
-			// 		(select max(tcode)+1 from feedtemplet where pastureid = ?),
-			// 		(select concat(DATE_FORMAT(now(),"%Y%m%d"),"001"))))
-			// 		 where xxwTempletCode = ? and tcode is null  `, pastureId, pastureId, item["recipeId"])
-			// 		if err != nil {
-			// 			log.Println("XxwFeedtemplet-error-3: ", err)
-			// 			return
-			// 		}
-			// 		// */
-			// 	} else {
-			// 		_, err = tx.Exec(`insert into feedtemplet(id,pastureid,ccid,tname,fttypeid,fttype,xxwTempletCode)
-			// 			values(?,?,(select id from cowclass where pastureid = ? limit 1),?,2,'预混配方',?)
-			// 			 ON DUPLICATE KEY UPDATE owner ='丰顿下发' `, ids, pastureId, pastureId,
-			// 			item["mergerFodderName"]+item["recipeId"], item["mergerFodderId"])
-			// 		if err != nil {
-			// 			log.Println("XxwFeedtemplet-error-3: ", err)
-			// 			return
-			// 		}
-
-			// 		_, err = tx.Exec(` update feedtemplet f set  tcode = (select if(left((select max(tcode) from
-			// 		feedtemplet where pastureid = ?),8) = (select DATE_FORMAT(now(),"%Y%m%d")),
-			// 		(select max(tcode)+1 from feedtemplet where pastureid = ?),
-			// 		(select concat(DATE_FORMAT(now(),"%Y%m%d"),"001"))))
-			// 		 where xxwTempletCode = ? and tcode is null  `, pastureId, pastureId, item["mergerFodderId"])
-			// 		if err != nil {
-			// 			log.Println("XxwFeedtemplet-error-3: ", err)
-			// 			return
-			// 		}
-
-			// 		tx.Exec(` update feedtemplet f set  ccname = (select classname from cowclass  where id = f.ccid )
-			// 		 where xxwTempletCode = ?  and tcode is null  `, item["mergerFodderId"])
-
-			// 		ids, err := setting.SnowIds.NextId()
-			// 		if err != nil {
-			// 			ids = time.Now().UnixNano()
-			// 			logging.Info("create SnowIds err", err)
-			// 		}
-			// 		_, err = tx.Exec(`insert into ftdetail(id,pastureid,ftid,fid,fname,fweight,sort,autosecond,autosecondname,feedgroup,preftid,version)
-			// 	 values(?,?,(select id from feedtemplet where pastureid=? and xxwTempletCode=? limit 1),
-			// 		(select id from feedtemplet where pastureid=? and xxwTempletCode=? limit 1)   ,?,?,?,0,'',?,
-			// 		(select id from feedtemplet where pastureid=? and xxwTempletCode =? limit 1),
-			// 		(select version from feedtemplet where pastureid=? and xxwTempletCode=? limit 1)) `,
-			// 			ids, pastureId, pastureId, item["recipeId"], pastureId, item["mergerFodderId"], item["mergerFodderName"]+item["recipeId"], item["autoWeight"],
-			// 			item["orderNum"], item["mergerFodderName"], pastureId, item["mergerFodderId"], pastureId, item["recipeId"])
-			// 		if err != nil {
-			// 			log.Println("XxwFeedtemplet-error-4: ", err)
-			// 			return
-			// 		}
-
-			// 	}
 		}
 
 		for _, item := range dataList {
@@ -2000,32 +2100,35 @@ FROM
 				}
 
 			} else {
-				/*
-					_, err = tx.Exec("insert into ftdetail(id,pastureid,ftid,fid,fname,fweight,sort,autosecond,autosecondname,feedgroup,version)  "+
-						" values(?,?,(select id from feedtemplet where pastureid=? and xxwTempletCode=? limit 1),"+
-						" (select id from feed where pastureid=? and xxwFeedCode=? limit 1)   ,?,?,?,0,'',?,(select version from feedtemplet where pastureid=? and xxwTempletCode=? limit 1))   ON DUPLICATE KEY UPDATE pastureid = ?  ",
-						ids, pastureId, pastureId, item["mergerFodderId"], pastureId, item["fodderId"], item["fodderName"], item["autoWeight"],
-						item["orderNum"], item["fodderName"], pastureId, item["mergerFodderId"], pastureId)
-					if err != nil {
-						log.Println("XxwFeedtemplet-error-6: ", err)
-						return
-					}
-				*/
 				// /*
 				_, err = tx.Exec("insert into ftdetail(id,pastureid,ftid,fid,fname,fweight,sort,autosecond,autosecondname,feedgroup,version)  "+
 					" values(?,?,(select id from feedtemplet where pastureid=? and xxwTempletCode=? limit 1),"+
-					" (select id from feed where pastureid=? and xxwFeedCode=? limit 1)   ,?,?,?,0,'',?,(select version from feedtemplet where pastureid=? and xxwTempletCode=? limit 1)) ",
-					ids, pastureId, pastureId, item["recipeId"], pastureId, item["fodderId"], item["fodderName"], item["autoWeight"],
-					item["orderNum"], item["mergerFodderName"], pastureId, item["recipeId"])
+					" (select id from feed where pastureid=? and xxwFeedCode=? limit 1)   ,?,?,?,0,'',?,(select version from feedtemplet where pastureid=? and xxwTempletCode=? limit 1))   ON DUPLICATE KEY UPDATE pastureid = ?  ",
+					ids, pastureId, pastureId, item["mergerFodderId"], pastureId, item["fodderId"], item["fodderName"], item["autoWeight"],
+					item["orderNum"], item["fodderName"], pastureId, item["mergerFodderId"], pastureId)
 				if err != nil {
-					log.Println("XxwFeedtemplet-error-7: ", err)
+					log.Println("XxwFeedtemplet-error-6: ", err)
 					return
 				}
 				// */
+				/*
+					_, err = tx.Exec("insert into ftdetail(id,pastureid,ftid,fid,fname,fweight,sort,autosecond,autosecondname,feedgroup,version)  "+
+						" values(?,?,(select id from feedtemplet where pastureid=? and xxwTempletCode=? limit 1),"+
+						" (select id from feed where pastureid=? and xxwFeedCode=? limit 1)   ,?,?,?,0,'',?,(select version from feedtemplet where pastureid=? and xxwTempletCode=? limit 1)) ",
+						ids, pastureId, pastureId, item["recipeId"], pastureId, item["fodderId"], item["fodderName"], item["autoWeight"],
+						item["orderNum"], item["mergerFodderName"], pastureId, item["recipeId"])
+					if err != nil {
+						log.Println("XxwFeedtemplet-error-7: ", err)
+						return
+					}
+				*/
 			}
 
 		}
 
+		tx.Exec(`update ftdetail f  set autosecond = (select autosecond from ftdetail_sync where ftid = f.ftid  and fid = f.fid ) ,
+		autosecondname = (select autosecondname from ftdetail_sync where ftid = f.ftid  and fid = f.fid ) `)
+
 		feedingList, err := tx.SQL(` SELECT
     IFNULL(recipeId, '') AS recipeId
 	

+ 57 - 47
http/handle/api/surplus.go

@@ -1,13 +1,13 @@
 package api
 
 import (
-	"fmt"
 	"io/ioutil"
 	"log"
 	"net/http"
 	"time"
 	"tmr-watch/conf/setting"
 	"tmr-watch/http/handle/restful"
+	"tmr-watch/models"
 	"tmr-watch/pkg/app"
 	"tmr-watch/pkg/e"
 	"tmr-watch/pkg/logging"
@@ -27,7 +27,7 @@ func AddSurplus(c *gin.Context) {
 	appG := app.Gin{C: c}
 	s := new(surplus)
 	if err := c.ShouldBind(&s); err != nil {
-		appG.Response(500, e.ERROR, "数据格式不正确!")
+		appG.Response(500, e.ERROR, "数据格 式不正确!")
 		return
 	}
 
@@ -35,64 +35,66 @@ func AddSurplus(c *gin.Context) {
 	defer tx.Close()
 	tx.Begin()
 
-	if s.Id > 0 {
-		_, err := tx.Exec(` update surplus set surplus = ?,feedId = ?   where id = ? `, s.Surplus, s.FeedId, s.Id)
+	if s.Surplus != "日粮" {
+		feed := new(models.Feed)
+		err := tx.Table("feed").Where(" pastureId = ? ", s.PastureId).Where(" id = ? ", s.FeedId).GetFirst(feed).Error
 		if err != nil {
-			log.Println("AddSurplus-error-5: ", err)
+			log.Println("AddSurplus-error-3: ", err)
 			tx.Rollback()
-			appG.Response(http.StatusOK, e.ERROR, "该剩料已存在!")
+			appG.Response(http.StatusOK, e.ERROR, err)
 			return
 		}
-		_, err = tx.Exec(` update feed set feedcode = ?, fname = ? where backup3 = ? `, s.Surplus+"_剩料", s.Surplus+"_剩料", fmt.Sprintf("%d", s.Id))
+
+		ids, err := setting.SnowIds.NextId()
+		if err != nil {
+			ids = time.Now().UnixNano()
+			logging.Info("create SnowIds err", err)
+		}
+		_, err = tx.Exec(`insert into feed(id,pastureid,feedcode,fname,fclass,fclassid,is_surplus)values(?,?,?,?,?,
+		(select id from feedclass where pastureid = ? and fcname = ? ),1)`,
+			ids, s.PastureId, feed.FName+"_剩料", feed.FName+"_剩料", "剩料", s.PastureId, "剩料")
 		if err != nil {
-			log.Println("AddSurplus-error-6: ", err)
+			log.Println("AddSurplus-error-4: ", err)
 			tx.Rollback()
 			appG.Response(http.StatusOK, e.ERROR, err)
 			return
 		}
-		err = tx.Commit()
+
+		_, err = tx.Exec(` insert into surplus(pastureId,surplus,feedId,alternativefeed)values(?,(select fname from feed where id = ? ),?,?)`, s.PastureId, ids, ids, s.FeedId)
+		// _, err := tx.Table("surplus").Insert(s)
 		if err != nil {
-			log.Println("AddSurplus-error-8: ", err)
-			appG.Response(http.StatusOK, e.ERROR, err)
+			log.Println("AddSurplus-error-2: ", err)
 			tx.Rollback()
+			appG.Response(http.StatusOK, e.ERROR, "该剩料已存在!")
 			return
 		}
-		appG.Response(http.StatusOK, e.SUCCESS, true)
-		return
-	}
-	_, err := tx.Table("surplus").Insert(s)
-	if err != nil {
-		log.Println("AddSurplus-error-2: ", err)
-		tx.Rollback()
-		appG.Response(http.StatusOK, e.ERROR, "该剩料已存在!")
-		return
-	}
+	} else {
+		ids, err := setting.SnowIds.NextId()
+		if err != nil {
+			ids = time.Now().UnixNano()
+			logging.Info("create SnowIds err", err)
+		}
 
-	s1 := new(surplus)
-	err = tx.Table("surplus").Where(" pastureId = ? ", s.PastureId).Where(" surplus = ? ", s.Surplus).GetFirst(s1).Error
-	if err != nil {
-		log.Println("AddSurplus-error-3: ", err)
-		tx.Rollback()
-		appG.Response(http.StatusOK, e.ERROR, err)
-		return
-	}
+		_, err = tx.Exec(`insert into feed(id,pastureid,feedcode,fname,fclass,fclassid,is_surplus)values(?,?,?,?,?,
+		(select id from feedclass where pastureid = ? and fcname = ? ),1)`,
+			ids, s.PastureId, "日粮"+"_剩料", "日粮"+"_剩料", "剩料", s.PastureId, "剩料")
+		if err != nil {
+			log.Println("AddSurplus-error-4: ", err)
+			tx.Rollback()
+			appG.Response(http.StatusOK, e.ERROR, err)
+			return
+		}
 
-	ids, err := setting.SnowIds.NextId()
-	if err != nil {
-		ids = time.Now().UnixNano()
-		logging.Info("create SnowIds err", err)
-	}
-	_, err = tx.Exec(`insert into feed(id,pastureid,feedcode,fname,fclass,fclassid,backup3,is_surplus)values(?,?,?,?,?,
-		(select id from feedclass where pastureid = ? and fcname = ? ),?,1)`,
-		ids, s.PastureId, s.Surplus+"_剩料", s.Surplus+"_剩料", "剩料", s.PastureId, "剩料", s1.Id)
-	if err != nil {
-		log.Println("AddSurplus-error-4: ", err)
-		tx.Rollback()
-		appG.Response(http.StatusOK, e.ERROR, err)
-		return
+		_, err = tx.Exec(` insert into surplus(pastureId,surplus,feedId)values(?,(select fname from feed where id = ? ),?)`, s.PastureId, ids, ids)
+		if err != nil {
+			log.Println("AddSurplus-error-2: ", err)
+			tx.Rollback()
+			appG.Response(http.StatusOK, e.ERROR, "该剩料已存在!")
+			return
+		}
 	}
 
-	err = tx.Commit()
+	err := tx.Commit()
 	if err != nil {
 		log.Println("AddSurplus-error-7: ", err)
 		appG.Response(http.StatusOK, e.ERROR, err)
@@ -113,16 +115,17 @@ func DelSurplus(c *gin.Context) {
 	defer tx.Close()
 	tx.Begin()
 
-	_, err := tx.Exec(` delete from surplus where id = ?  `, id)
+	_, err := tx.Exec(` delete from feed where id = (select feedId from surplus where id = ? )  `, id)
 	if err != nil {
-		log.Println("DelSurplus-error-1: ", err)
+		log.Println("DelSurplus-error-2: ", err)
 		tx.Rollback()
 		appG.Response(http.StatusOK, e.ERROR, err)
 		return
 	}
-	_, err = tx.Exec(` delete from feed where backup3 = ?  `, id)
+
+	_, err = tx.Exec(` delete from surplus where id = ?  `, id)
 	if err != nil {
-		log.Println("DelSurplus-error-2: ", err)
+		log.Println("DelSurplus-error-1: ", err)
 		tx.Rollback()
 		appG.Response(http.StatusOK, e.ERROR, err)
 		return
@@ -146,6 +149,13 @@ func GetelSurplus(c *gin.Context) {
 	tx := restful.Engine.NewSession()
 	defer tx.Close()
 
+	// type surplus1 struct {
+	// 	Id        string `xorm:"id" json:"id"`
+	// 	PastureId string `xorm:"pastureId" json:"pastureId"`
+	// 	Surplus   string `xorm:"surplus" json:"surplus"`
+	// 	FeedId    string `xorm:"feedId" json:"feedId"`
+	// }
+
 	surplusList := make([]*surplus, 0)
 	err := tx.Table("surplus").Where("pastureId = ? ", pastureId).Find(&surplusList)
 	if err != nil {

+ 71 - 29
http/handle/jpud/udservice.go

@@ -58,7 +58,7 @@ func UdBarSync(pastureId, farmId string) {
 	url := fmt.Sprintf("https://fnhbdairyfarmlive.fn.com.my:8380/copartner_downloads?equipmentId=48ffa4de-7870-4b18-a052-9f8d3a46089a&farmId=%s&method=downloadpen", farmId)
 	barByte := getPull(url)
 	fmt.Println(string(barByte))
-	barMap := make([]interface{}, 0)
+	barMap := make(map[string]interface{})
 	json.Unmarshal(barByte, &barMap)
 
 	tx := restful.Engine.NewSession()
@@ -66,10 +66,10 @@ func UdBarSync(pastureId, farmId string) {
 	tx.Exec(` insert into saplog(pastureId,request,response,status,msgtext,createTime,msgtype,dataDate,url)
 	values(?,?,?,?,?,now(),?,now(),?)`, pastureId, "", string(barByte), "", "", 3, url)
 	if len(barMap) > 0 {
-		// if barMap["status"].(string) != "ok" {
-		// 	return
-		// }
-		for _, item := range barMap {
+		if barMap["status"].(string) != "ok" {
+			return
+		}
+		for _, item := range barMap["msg"].([]interface{}) {
 			bar := item.(map[string]interface{})
 			barname := bar["barname"].(string)
 			count, _ := tx.Table("bar").Where("pastureId = ? ", pastureId).Count()
@@ -108,14 +108,14 @@ func UdFeedSync(pastureId, farmId string) {
 	tx.Exec(` insert into saplog(pastureId,request,response,status,msgtext,createTime,msgtype,dataDate,url)
 	values(?,?,?,?,?,now(),?,now(),?)`, pastureId, "", string(feedByte), "", "", 3, url)
 
-	feedMap := make([]interface{}, 0)
+	feedMap := make(map[string]interface{})
 	json.Unmarshal(feedByte, &feedMap)
 	fmt.Println(string(feedByte))
 	if len(feedMap) > 0 {
-		// if feedMap["status"].(string) != "ok" {
-		// 	return
-		// }
-		for _, item := range feedMap {
+		if feedMap["status"].(string) != "ok" {
+			return
+		}
+		for _, item := range feedMap["msg"].([]interface{}) {
 			fmt.Println(item)
 			feed := item.(map[string]interface{})
 			feedname := feed["feedname"].(string)
@@ -188,22 +188,17 @@ func getPull(url string) []byte {
 	fmt.Println(string(body))
 	// fmt.Println(err)
 	// if strings.Index(resp.Status, "200") > -1 {
-	var response Response
-	err = json.Unmarshal(body, &response)
-	if err != nil {
-		fmt.Println("Error unmarshalling JSON:", err)
-		return nil
-	}
-
-	fmt.Println(response)
-	msgBytes, err := json.Marshal(response.Msg)
-	if err != nil {
-		fmt.Println("Error marshalling msg to bytes:", err)
-		return nil
+	// body, err := ioutil.ReadAll(resp.Body)
+	// fmt.Println(string(body))
+	fmt.Println(err)
+	if strings.Index(resp.Status, "200") > -1 {
+		bodyData := make(map[string]string)
+		json.Unmarshal(body, &bodyData)
+		if _, ok := bodyData["data"]; ok {
+			return []byte(bodyData["data"])
+		}
 	}
-
-	return msgBytes
-
+	return nil
 }
 
 //搅拌
@@ -276,7 +271,7 @@ func UdMaterialIssuePush(pastureId, farmId, date string) error {
 		now = time.Now().AddDate(0, 0, -1).Format("2006-01-02")
 	}
 	fmt.Println(now, pastureId)
-	dataList, err := tx.SQL(`SELECT  d1.sort feedSort, ifnull(f.feedcode,d1.fid) feedId,ifnull(ifnull(f.udname,f.fname),d1.fname) feedName,
+	dataList, err := tx.SQL(`SELECT  d1.sort feedSort, ifnull(f.feedcode,d1.fid) feedId,ifnull(ifnull(f.udname,f.fname),'') feedName,
 	d.id,IFNULL(ft.tcode,d2.feedtempletid ) recipeId,IFNULL(ft.tcode,d2.feedtempletid ) feedtempletId,ifnull(ft.tname,d.templetName) feedtempletName ,
 	IFNULL(d.templetName,d2.feedtempletName ) recipeName,
 	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 and lpplanType in(0,1) ),d.sort) as tmrNo,
@@ -294,9 +289,55 @@ d1.actualweightminus*IF(ftd.id IS NULL,1,ftd.fweight/(SELECT SUM(ftd2.fweight) F
    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)*
 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 = ftd.version  AND ftd2.ftid = d1.fid  ))
   ),'')),0) feedWeight
+	,ifnull(ftd.sort,"") premixFeedSort ,
+	 ifnull((select feedcode from feed where id = ftd.fid),"") premixFeedId,ifnull(ftd.fname,"")  premixFeedName,
+	 
+ 
+ 	ifnull(if(d1.feedcode = '-1', 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 ,
+  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)*
+  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 = ftd.version  AND ftd2.ftid = d1.fid  )),
+	
+	 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)*
+  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 = ftd.version  AND ftd2.ftid = d1.fid  ))
+	),''),'0')
+  premixFeedWeight
+	
+	from  downloadedplan d
+	LEFT JOIN downloadplandtl2 d2 on  ((d.id=d2.PID and d.lpplantype != 5  ) or (d.lpplantype = 5 and d2.pid = (select id from downloadedplan  where pid = d.pid and mydate = d.mydate and lpplantype in(0,2)))) 
+	LEFT JOIN (select dd.pid as lppid,dd1.* from downloadedplan dd join downloadplandtl1  dd1 on dd1.pid = dd.id and dd1.type = 0
+		where dd.mydate= date_format(?,'%Y-%m-%d')  and dd.lpplanType in (0,1) ) d1 on d1.lppid = d.pid and if(d.lpplantype = 5 , d1.pid = d.id,1=1 )
+
+	LEFT JOIN feedp fp on d2.FBarID=fp.barid
+	join bar b on fp.barid = b.id and d.pastureid = b.pastureid
+	left join feed f   on f.feedcode  = d1.feedcode
+	left JOIN feedtempletdate ft on d.tempid=ft.id and  ft.date =  d1.date   and d.tversion = ft.version           
+	left join feedtempletdate  ft1 on   d1.feedcode = '-1'  and ft1.date = d1.date and ft1.id = d1.fid 
+	left join ftdetaildate  ftd  on  ftd.date =  d1.date and ftd.ftid = d1.fid AND d1.feedcode = '-1'  and ftd.version = ft1.version
 
+	where d.mydate= date_format(?,'%Y-%m-%d')  and d2.type = 0 and d1.type = 0     and d1.fname is not null 
+	
+	
+UNION all 
 
+
+SELECT  d1.sort feedSort, ifnull(f.feedcode,d1.fid) feedId,ifnull(ifnull(f.udname,f.fname),'') feedName,
+	d.id,IFNULL(ft.tcode,d2.feedtempletid ) recipeId,IFNULL(ft.tcode,d2.feedtempletid ) feedtempletId,ifnull(ft.tname,d.templetName) feedtempletName ,
+	IFNULL(d.templetName,d2.feedtempletName ) recipeName,
+	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 and lpplanType in(0,1) ),d.sort) as tmrNo,
+	d.Times as dropShift,ifnull(b.bcode,b.id) as penId,b.bname as penName,fp.CCOUNT as cowCount, d2.SORT as feedingNo,
+ifnull(ROUND(d2.lweight * (d1.actualweightminus/ (select sum(actualweightminus) from downloadplandtl1 where pid = d1.pid and type = 0) ),2) ,0)as expWeight,
+	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,
+	ifnull(date_format(d2.InTime,'%Y-%m-%d %H:%i:%s'),d.mydate) as endTime,ifnull((SELECT dr.driver FROM dutyrecord dr
+WHERE dr.pastureid = d.pastureid AND dr.eqid = d.tmrid AND dr.times= d.times  AND dr.operatetime <=d.mydate
+ORDER BY dr.operatetime DESC LIMIT 1),"") as tmrName ,d.tmrtname equipmentId ,
+d1.fname,
+ifnull(TRIM(if(d1.feedcode != '-1', 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 ,
+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)*
+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 = ftd.version  AND ftd2.ftid = d1.fid  )),
   
+   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)*
+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 = ftd.version  AND ftd2.ftid = d1.fid  ))
+  ),'')),0) feedWeight
 	,ifnull(ftd.sort,"") premixFeedSort ,
 	 ifnull((select feedcode from feed where id = ftd.fid),"") premixFeedId,ifnull(ftd.fname,"")  premixFeedName,
 	 
@@ -311,9 +352,9 @@ d1.actualweightminus*IF(ftd.id IS NULL,1,ftd.fweight/(SELECT SUM(ftd2.fweight) F
   premixFeedWeight
 	
 	from  downloadedplan d
-	LEFT JOIN downloadplandtl2 d2 on d.id=d2.PID
+	LEFT JOIN downloadplandtl2 d2 on  ((d.id=d2.PID and d.lpplantype != 5  ) or (d.lpplantype = 5 and d2.pid = (select id from downloadedplan  where pid = d.pid and mydate = d.mydate and lpplantype in(0,2)))) 
 	LEFT JOIN (select dd.pid as lppid,dd1.* from downloadedplan dd join downloadplandtl1  dd1 on dd1.pid = dd.id and dd1.type = 0
-		where dd.mydate= date_format(?,'%Y-%m-%d')  and dd.lpplanType in (0,1) ) d1 on d1.lppid = d.pid
+		where dd.mydate= date_format(?,'%Y-%m-%d')  and dd.lpplanType in (5) ) d1 on d1.lppid = d.pid and if(d.lpplantype = 5 , d1.pid = d.id,1=1 )
 
 	LEFT JOIN feedp fp on d2.FBarID=fp.barid
 	join bar b on fp.barid = b.id and d.pastureid = b.pastureid
@@ -322,7 +363,8 @@ d1.actualweightminus*IF(ftd.id IS NULL,1,ftd.fweight/(SELECT SUM(ftd2.fweight) F
 	left join feedtempletdate  ft1 on   d1.feedcode = '-1'  and ft1.date = d1.date and ft1.id = d1.fid 
 	left join ftdetaildate  ftd  on  ftd.date =  d1.date and ftd.ftid = d1.fid AND d1.feedcode = '-1'  and ftd.version = ft1.version
 
-	where d.mydate= date_format(?,'%Y-%m-%d')  and d2.type = 0    and d.pastureid = ?  and d1.fname is not null  order by tmrno   `, now, now, pastureId).Query().List()
+	where d.mydate= date_format(?,'%Y-%m-%d')  and d2.type = 0 and d1.type = 0 and d.lpplanType = 5   and d1.fname is not null  
+	   `, now, now, now, now).Query().List()
 	if err != nil {
 		logging.Error(err)
 		return err

+ 70 - 5
http/handle/sap/sap.go

@@ -62,6 +62,23 @@ func SyncLeftoverEntry() error {
 		return err
 	}
 	leftoverEntry(pastureinfo.Pastureid, time.Now().AddDate(0, 0, -1).Format("2006-01-02"))
+
+	return nil
+}
+
+func SyncWasteuse() error {
+	tx := restful.Engine.NewSession()
+	defer tx.Close()
+
+	pastureinfo := new(udPastureInfo)
+	err := tx.SQL(`select column_default  as pastureid   from    information_schema.COLUMNS
+	WHERE table_name = 'recweight' AND table_schema = ? AND column_name = 'pastureid'`, setting.DatabaseSetting.Name).GetFirst(pastureinfo).Error
+	if err != nil {
+		logs.Error(err)
+		return err
+	}
+
+	wasteuse(pastureinfo.Pastureid, time.Now().AddDate(0, 0, -1).Format("2006-01-02"))
 	return nil
 }
 
@@ -268,6 +285,32 @@ left join feed f on f.id = ftd.fid
 		logs.Error(err)
 		return err
 	}
+
+	wasteUseDataList := make([]*feedPlanRecord, 0)
+
+	err = tx.SQL(`   SELECT
+	p.werks WERKS,
+	DATE_FORMAT( b.date, '%Y%m%d' ) BUDAT,
+	ft.cattle FCWTS,
+	bar.sapCode CHSNO,
+	bar.bname CHSTX,
+	 '11.01.01.01.000094' MATNR,
+	'系统剩料' MAKTX,
+	b.weight  MENGE ,"KG" MEINS,ztbar.sapCode ZCHSNO,ztbar.bname ZCHSTX
+	FROM
+	wasteuse b
+	JOIN pasture p ON b.pastureid = p.pastureid
+	JOIN feedpdate fp ON fp.date = b.date 
+	AND fp.barid = b.barid
+	JOIN bar ON bar.id = b.barid
+	JOIN feedtemplet ft ON ft.id = fp.ftid
+	left join bar ztbar on ztbar.id  = b.barid
+	where  DATE_FORMAT( b.date, '%Y-%m-%d' ) = ?  and b.pastureid = ?  `, date, pastureId).Find(&dataList)
+	if err != nil {
+		logs.Error(err)
+		return err
+	}
+
 	wasteUseList := make([]*models.WasteUse, 0)
 
 	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)
@@ -294,6 +337,10 @@ left join feed f on f.id = ftd.fid
 		}
 	}
 
+	for _, w := range wasteUseDataList {
+		dataList = append(dataList, w)
+	}
+
 	data := `{
 		"DEST": {
 		  "DEST_ID": "TMRWATCH",
@@ -573,10 +620,28 @@ func wasteuse(pastureId, date string) error {
 	}
 	now, _ := time.ParseInLocation("2006-01-02", date, time.Local)
 
-	dataList, err := tx.SQL(`select  ftd.cattle FCWTS,
-b.sapCode CHSNO ,b.bname CHSTX, '11.01.01.01.000094' MATNR,'系统剩料' MAKTX,w.weight MENGE,'' MEINS
-from  wasteuse w join feedtemplet ftd on ftd.id = w.ftid   join bar b on b.id = w.barid 
-where w.date = ? and  b.pastureid = ? `, date, pastureId).Query().List()
+	// 	dataList, err := tx.SQL(`select  ftd.cattle FCWTS,
+	// b.sapCode CHSNO ,b.bname CHSTX, '11.01.01.01.000094' MATNR,'系统剩料' MAKTX,w.weight MENGE,'' MEINS
+	// from  wasteuse w join feedtemplet ftd on ftd.id = w.ftid   join bar b on b.id = w.barid
+	// where w.date = ? and  b.pastureid = ? `, date, pastureId).Query().List()
+	dataList, err := tx.SQL(`   SELECT
+p.werks WERKS,
+DATE_FORMAT( b.date, '%Y%m%d' ) BUDAT,
+ft.cattle FCWTS,
+bar.sapCode CHSNO,
+bar.bname CHSTX,
+ '11.01.01.01.000094' MATNR,
+'系统剩料' MAKTX,
+b.weight  MENGE ,"KG" MEINS,ztbar.sapCode ZCHSNO,ztbar.bname ZCHSTX
+FROM
+wasteuse b
+JOIN pasture p ON b.pastureid = p.pastureid
+JOIN feedpdate fp ON fp.date = b.date 
+AND fp.barid = b.barid
+JOIN bar ON bar.id = b.barid
+JOIN feedtemplet ft ON ft.id = fp.ftid
+left join bar ztbar on ztbar.id  = b.barid
+where  DATE_FORMAT( b.date, '%Y-%m-%d' ) = ?  and b.pastureid = ?  `, date, pastureId).Query().List()
 	if err != nil {
 		logs.Error(err)
 		return err
@@ -602,7 +667,7 @@ where w.date = ? and  b.pastureid = ? `, date, pastureId).Query().List()
 	// now, _ := time.ParseInLocation("2006-01-02", date, time.Local)
 
 	data = fmt.Sprintf(data, now.Format("20060102"), pastureinfo.Werks, string(databyte))
-	url := "http://192.168.61.117/SAPQ0/Feed/MM016/StockOut"
+	url := "http://192.168.61.117/SAPP0/Feed/MM016/StockOut"
 	postPush(url, data, 0, tx, pastureId)
 
 	return nil

+ 74 - 121
http/handle/ymy/ymy.go

@@ -18,14 +18,14 @@ import (
 	"github.com/xormplus/xorm"
 )
 
-func YmyCron() {
-	// pastureinfo := new(udPastureInfo)
-	// err := tx.SQL(`select column_default  as pastureid   from    information_schema.COLUMNS
-	// WHERE table_name = 'recweight' AND table_schema = ? AND column_name = 'pastureid'`, setting.DatabaseSetting.Name).GetFirst(pastureinfo).Error
-	// if err != nil {
-	// 	logs.Error(err)
-	// 	return err
-	// }
+func YmyCron(farmId, pastureId string) {
+	date := time.Now().AddDate(0, 0, -1).Format("2006-01-02")
+	// date := "2025-05-11"
+	YmyUtirPush(pastureId, farmId, date)
+	YmyMaterialIssuePush(pastureId, farmId, date)
+	YmySyncBar(farmId, pastureId)
+	YmySyncFeed(pastureId)
+	YmyFeedtempletPush(pastureId, farmId, date)
 }
 
 func YmySyncBar(farmId, pastureId string) {
@@ -74,12 +74,13 @@ func barPull(url, data string, msgtype int, tx *xorm.Session, pastureId string)
 		values(?,?,?,?,?,now(),?,now(),?)`, pastureId, data, string(body), "", "", msgtype, url)
 
 	for _, v := range respData.Result {
+		fmt.Println(v)
 		count, _ := tx.Table("bar").Where("pastureId = ? ", pastureId).Count()
 		tx.Exec(`insert into bar(pastureid,bcode,bname,sort)values(?,?,?,?)   ON DUPLICATE KEY UPDATE  bname = ?  `, pastureId, v.PenId, v.PenName, count+1, v.PenName)
 	}
 }
 
-func YmySyncFeed(farmId, pastureId string) {
+func YmySyncFeed(pastureId string) {
 	tx := restful.Engine.NewSession()
 	defer tx.Close()
 
@@ -88,12 +89,10 @@ func YmySyncFeed(farmId, pastureId string) {
     "page": "0",
     "size": "1000",
     "modifiedAfter":"2025-01-01 00:00:00",
-    "MATERIAL_BASIC_CLASSIFICATION_CODE":"",
+    "MATERIAL_BASIC_CLASSIFICATION_CODE":"",    
     "MATERIAL_CODE": ""
   }}`
-
-	// reqJson = fmt.Sprintf(reqJson, time.Now().Format("2006-01-02 15:04:05"))
-	feedPull("http://113.250.182.238:9000/ierp/kapi/v2/iscb/route/script_cusapi_deepexi_material_query", reqJson, 2, tx, pastureId, getApiToken())
+	feedPull("http://219.151.177.119:9000/ierp/kapi/v2/iscb/route/script_cusapi_deepexi_material_query", reqJson, 2, tx, pastureId, getApiToken())
 }
 
 type udPastureInfo struct {
@@ -137,13 +136,13 @@ AND column_name = 'pastureid' `, setting.DatabaseSetting.Name).GetFirst(pasturei
     "client_id": "Cosmic_deepexi_user",
     "client_secret": "Cosmic_zkm_deepexi_openapi@user01",
     "username": "dipujiekouyonghu",
-    "accountId": "2174058657413595136",
+    "accountId": "1986218827033083904",
     "nonce": "a42c1a91-56ad-4c6d-95d1-40bcb8b5ec89",
     "timestamp": "%s",
     "language": "zh_CN"
 }`
 	reqJson = fmt.Sprintf(reqJson, time.Now().Format("2006-01-02 15:04:05"))
-	req, err := http.NewRequest("POST", "http://113.250.182.238:9000/ierp/kapi/oauth2/getToken", bytes.NewBuffer([]byte(reqJson)))
+	req, err := http.NewRequest("POST", "http://219.151.177.119:9000/ierp/kapi/oauth2/getToken", bytes.NewBuffer([]byte(reqJson)))
 	if err != nil {
 		logs.Error(err)
 	}
@@ -235,44 +234,42 @@ func YmyFeedtempletPush(pastureId, farmId, date string) error {
 	ft.tcode AS recipeId,
 	ft.TNAME AS recipeName,
 	f.feedcode   AS ingId,
+		f.feedcode   AS feedCode,
 	ifnull(f.udname,f.fname) AS ingName,
-	round( f.dry * ftd.FWEIGHT, 2 ) AS dmQty,
+	round( fn.dry * ftd.FWEIGHT, 2 ) AS dmQty,
 	ftd.FWEIGHT AS afQty,
 	ftd.SORT AS mixNo,
 	round( f.Uprice * ftd.FWEIGHT, 2 ) AS recipeCost,
-	fc.fcname AS ingType,
-	f.AllowRatio AS allowableError ,fc.fcname ingType
+	ifnull(fc.fcname,'饲料') AS ingType,
+	f.AllowRatio AS allowableError 
 FROM
 	feedtempletdate ft 
 	 JOIN ftdetaildate ftd ON ft.id = ftd.FTID  and ft.date = ftd.date
 	 JOIN feed f ON ftd.FID = f.id
-	 JOIN feedclass fc ON f.fclassid = fc.id 
+	 left join feednur fn on fn.fid = f.id 
+	 left JOIN feedclass fc ON f.fclassid = fc.id 
 WHERE
 	ft.ENABLE = 1 
-	AND ft.isDelete != 1  and ft.date = ?  `, now).Query().List()
+	AND ft.isDelete != 1  and ft.date = ?   `, now).Query().List()
 	if err != nil {
 		logging.Error(err)
 		return err
 	}
 
 	dataByte, _ := json.Marshal(&dataList)
-
-	reqJson := `{
-    "reqMethod": "getfeedtempletinfo",
-    "platForm": "EYIMU",
-    "regCode": "123543",
-    "command ": "202cb962ac590",
-    "apiId": "getCptData ",
-    "param": {
+	reqJson := `
+	{"param": {
+         "method": "getfeedtempletinfo",
+        "resultData": %s,
         "farmId": "%s",
-        "method": "getfeedtempletinfo ",
-        "code": "1",
-        "errMessage": "",
-        "rowCount": %d,
-        "resultData": %s
-    }
-}`
-	reqJson = fmt.Sprintf(reqJson, farmId, len(dataList), string(dataByte))
+        "parlorType": "CPT",
+        "account":"CPT"
+    },
+    "platform": "CPT",
+    "regCode": "cpt180511",
+    "secret": "67a74fd5748054ac67b6fc433e9249b0",
+    "methodKey": "pushCptData"}`
+	reqJson = fmt.Sprintf(reqJson, string(dataByte), farmId)
 	fmt.Println(reqJson)
 	postPush(reqJson, 4, tx, pastureId)
 	return nil
@@ -289,11 +286,11 @@ func YmyUtirPush(pastureId, farmId, date string) error {
 		now = time.Now().AddDate(0, 0, -1).Format("2006-01-02")
 	}
 
-	dataList, err := tx.SQL(`select date_format(d1.date,'%Y-%m-%d')  dropDate,date_format(d1.date,'%Y-%m-%d')  loadDate,d.times loadShift,d.datacaptureno  tmrNo,ft.tcode recipeId,ft.ccname recipeName,if(d1.feedcode = -1 ,d1.fid,f.feedcode) ingId,ifnull(f.fname,ftd.fname)  ingName,
+	dataList, err := tx.SQL(`select  MD5(CONCAT(d.pid, d.mydate)) loadId , date_format(d1.date,'%Y-%m-%d')  dropDate,date_format(d1.date,'%Y-%m-%d')  loadDate,d.times loadShift,d.id  tmrNo,ft.tcode recipeId,ft.ccname recipeName,if(d1.feedcode = -1 ,d1.feedcode,f.feedcode) ingId,if(d1.feedcode = -1 ,d1.feedcode,f.feedcode) feedCode ,ifnull(f.fname,ftd.fname)  ingName,
 	ifnull(ifnull(fc.fcname,(select fcname from feedclass fc1 join feed f1 on f1.fclassid = fc1.id where f1.id =ftd.fid )),'饲料') ingType,
 	ifnull(f.dry * d1.actualweightminus,0)  dmPct,d1.sort mixNo,ifnull(d1.feedallowratio,0) allowableError , if(f.fname is not null, ifnull(d1.lweight,''),	ifnull(ftd.fweight / (select sum(fweight)  from ftdetaildate  where  date =  d1.date and ftid = d1.fid ) *  d1.lweight,"") )  expWeight,
 	
-	if(f.fname is not null, ifnull(d1.actualweightminus,''),	ifnull(ftd.fweight / (select sum(fweight)  from ftdetaildate  where  date =  d1.date and ftid = d1.fid ) *  d1.actualweightminus,"") ) actualWeight,
+	if(f.fname is not null, ifnull(d1.actualweightminus,''),ifnull(ftd.fweight / (select sum(fweight)  from ftdetaildate  where  date =  d1.date and ftid = d1.fid ) *  d1.actualweightminus,"") ) actualWeight,
 	DATE_FORMAT(IFNULL((SELECT MAX(intime) FROM downloadplandtl1 d2 
 WHERE  d1.pid=d2.pid AND d1.pastureid = d2.pastureid AND d2.intime<d1.intime)
 , (SELECT MAX(intime) FROM downloadedplan d2 
@@ -308,7 +305,7 @@ WHERE  d1.date=d2.mydate AND d1.pastureid = d2.pastureid AND d2.id=d1.pid)
 	left join ftdetaildate  ftd  on  ftd.date =  d1.date and ftd.ftid = d1.fid
 	join tmr t on t.id = d.tmrid 
 	left join driver on driver.drivercode = t.eqcode 
-	where d1.date = ? and d.havebutton = 1 and d1.type = 0  `, now).Query().List()
+	where d1.date = ? and d.havebutton = 1 and d1.type = 0   `, now).Query().List()
 	if err != nil {
 		logging.Error(err)
 		return err
@@ -316,23 +313,19 @@ WHERE  d1.date=d2.mydate AND d1.pastureid = d2.pastureid AND d2.id=d1.pid)
 
 	dataByte, _ := json.Marshal(&dataList)
 
-	reqJson := `{
-					"reqMethod": "uploadadddata",
-					"platform": "EYIMU",
-					"regCode": "123543",
-					"command": "202cb962ac590",
-					"apiId": "getCptData",
-					"param": {
-						"farmId": '%s',
-						"method": "uploadadddata",
-						"code": "1",
-						"errMessage": "",
-						"rowCount": %d,
-						"resultData": %s
-					}
-				}`
-
-	reqJson = fmt.Sprintf(reqJson, farmId, len(dataList), string(dataByte))
+	reqJson := `{"param": {
+			"method": "uploadadddata",
+			"resultData": %s,
+			"farmId": "%s",
+			"parlorType": "CPT",
+			"account":"CPT"
+		},
+		"platform": "CPT",
+		"regCode": "cpt180511",
+		"secret": "67a74fd5748054ac67b6fc433e9249b0",
+		"methodKey": "pushCptData"} `
+
+	reqJson = fmt.Sprintf(reqJson, string(dataByte), farmId)
 	postPush(reqJson, 0, tx, pastureId)
 	fmt.Println(reqJson)
 	return nil
@@ -349,75 +342,35 @@ func YmyMaterialIssuePush(pastureId, farmId, date string) error {
 		now = time.Now().AddDate(0, 0, -1).Format("2006-01-02")
 	}
 
-	dataList, err := tx.SQL(`SELECT  d1.sort feedSort, ifnull(f.feedcode,d1.fid) feedId,ifnull(ifnull(f.udname,f.fname),d1.fname) feedName,
-	d.id,IFNULL(ft.tcode,d2.feedtempletid ) recipeId,IFNULL(ft.tcode,d2.feedtempletid ) feedtempletId,ifnull(ft.tname,d.templetName) feedtempletName ,
-	IFNULL(d.templetName,d2.feedtempletName ) recipeName,
-	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,
-	d.Times as dropShift,ifnull(b.bcode,b.id) as penId,b.bname as penName,fp.CCOUNT as cowCount, d2.SORT as feedingNo,
-ifnull(ROUND(d2.lweight * (d1.actualweightminus/ (select sum(actualweightminus) from downloadplandtl1 where pid = d1.pid and type = 0) ),2) ,0)as expWeight,
-	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,
-	ifnull(date_format(d2.InTime,'%Y-%m-%d %H:%i:%s'),d.mydate) as endTime,ifnull((SELECT dr.driver FROM dutyrecord dr
+	dataList, err := tx.SQL(`SELECT  MD5(CONCAT(d.pid, d.mydate)) loadId ,d2.sort feedingNo,ifnull((SELECT dr.driver FROM dutyrecord dr
 WHERE dr.pastureid = d.pastureid AND dr.eqid = d.tmrid AND dr.times= d.times  AND dr.operatetime <=d.mydate
-ORDER BY dr.operatetime DESC LIMIT 1),"") as tmrName ,d.tmrtname equipmentId ,
-d1.fname,
-ifnull(TRIM(if(d1.feedcode != '-1', 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 ,
-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)*
-d1.lweight*IF(ftd.id IS NULL,1,ftd.fweight/(SELECT SUM(ftd2.fweight) FROM ftdetaildate ftd2 WHERE  ftd2.date = d1.date AND ftd2.version = ftd.version  AND ftd2.ftid = d1.fid  )),
-  
-   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)*
-d1.lweight*IF(ftd.id IS NULL,1,ftd.fweight/(SELECT SUM(ftd2.fweight) FROM ftdetaildate ftd2 WHERE  ftd2.date = d1.date AND ftd2.version = ftd.version  AND ftd2.ftid = d1.fid  ))
-  ),'')),0) feedWeight
-
-
-  
-	,ifnull(ftd.sort,"") premixFeedSort ,
-	 ifnull((select feedcode from feed where id = ftd.fid),"") premixFeedId,ifnull(ftd.fname,"")  premixFeedName,
-	 
- 
-  	ifnull(if(d1.feedcode = '-1', 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 ,
-  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)*
-  d1.lweight*IF(ftd.id IS NULL,1,ftd.fweight/(SELECT SUM(ftd2.fweight) FROM ftdetaildate ftd2 WHERE  ftd2.date = d1.date AND ftd2.version = ftd.version  AND ftd2.ftid = d1.fid  )),
-	
-	 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)*
-  d1.lweight*IF(ftd.id IS NULL,1,ftd.fweight/(SELECT SUM(ftd2.fweight) FROM ftdetaildate ftd2 WHERE  ftd2.date = d1.date AND ftd2.version = ftd.version  AND ftd2.ftid = d1.fid  ))
-	),''),'0')
-  premixFeedWeight
-	
+ORDER BY dr.operatetime DESC LIMIT 1),"") as tmrName,d.tmrtname equipmentId,fp.ccount cowCount,b.bname penName,date_format(d2.date,'%Y-%m-%d')  dropDate,d2.lweight expWeight ,d2.actualweightminus actualWeight, ifnull(date_format(timestamp(d2.InTime,CONCAT('-',d2.processTime)),'%Y-%m-%d %H:%i:%s'),d.mydate) as startTime,
+	ifnull(date_format(d2.InTime,'%Y-%m-%d %H:%i:%s'),d.mydate) as endTime
 	from  downloadedplan d
 	LEFT JOIN downloadplandtl2 d2 on d.id=d2.PID
-	LEFT JOIN (select dd.pid as lppid,dd1.* from downloadedplan dd join downloadplandtl1  dd1 on dd1.pid = dd.id and dd1.type = 0
-		where dd.mydate= date_format(?,'%Y-%m-%d')  and dd.lpplanType in (0,1) ) d1 on d1.lppid = d.pid
-
-	LEFT JOIN feedp fp on d2.FBarID=fp.barid
-	join bar b on fp.barid = b.id and d.pastureid = b.pastureid
-	left join feed f   on f.feedcode  = d1.feedcode
-	left JOIN feedtempletdate ft on d.tempid=ft.id and  ft.date =  d1.date   and d.tversion = ft.version           
-	left join feedtempletdate  ft1 on   d1.feedcode = '-1'  and ft1.date = d1.date and ft1.id = d1.fid 
-	left join ftdetaildate  ftd  on  ftd.date =  d1.date and ftd.ftid = d1.fid AND d1.feedcode = '-1'  and ftd.version = ft1.version
+	left join bar b on b.id = d2.fbarid
+	left join feedpdate fp on d2.date =fp.date and fp.barid = b.id 
 
-	where d.mydate= date_format(?,'%Y-%m-%d')  and d2.type = 0   and d.havebutton = 1  and d.pastureid = ?  and d1.fname is not null  order by tmrno    `, now, now, pastureId).Query().List()
+	where d.mydate= date_format(?,'%Y-%m-%d')  and d2.type = 0   and d.havebutton = 1    `, now).Query().List()
 	if err != nil {
 		logging.Error(err)
 		return err
 	}
 
 	dataByte, _ := json.Marshal(&dataList)
-	reqJson := `{
-					"reqMethod": "uploaddiliverdata",
-					"platForm": "EYIMU",
-					"regCode": "123543",
-					"command": "202cb962ac590",
-					"apiId": "uploaddiliverdata",
-					"param": {
-						"farmId": "%s",
-						"method": "getCptData",
-						"code": "1",
-						"errMessage": "",
-						"rowCount": %d,
-						"resultData": %s
-					}
-				}`
-	reqJson = fmt.Sprintf(reqJson, farmId, len(dataList), string(dataByte))
+	reqJson := `	{"param": {
+					"method": "uploaddiliverdata",
+					"resultData": %s,
+					"farmId": "%s",
+					"parlorType": "CPT",
+					"account":"CPT"
+				},
+				"platform": "CPT",
+				"regCode": "cpt180511",
+				"secret": "67a74fd5748054ac67b6fc433e9249b0",
+				"methodKey": "pushCptData"} `
+
+	reqJson = fmt.Sprintf(reqJson, string(dataByte), farmId)
 	//  '0饲喂  1剩料  2原料  3栏舍  4配方 5栏舍牛头数 6库存',
 	postPush(reqJson, 0, tx, pastureId)
 	fmt.Println(reqJson)
@@ -427,13 +380,13 @@ d1.lweight*IF(ftd.id IS NULL,1,ftd.fweight/(SELECT SUM(ftd2.fweight) FROM ftdeta
 func postPush(data string, msgtype int, tx *xorm.Session, pastureId string) {
 
 	// forwardingReq := new(ForwardingReq)
-	// forwardingReq.Url = "https://fnhbdairyfarmlive.fn.com.my:8380/copartner_uploads/"
+	url := "http://dairy.yimucloud.com/dairy/external/api"
 	// forwardingReq.Method = "POST"
 	// forwardingReq.Body = data
 	// jsonStr, _ := json.Marshal(forwardingReq)
 	// fmt.Println(setting.ServerSetting.UDForwardingSvc)
 	// req, err := http.NewRequest("POST", setting.ServerSetting.UDForwardingSvc+":8080/forwarding", bytes.NewBuffer(jsonStr))
-	req, err := http.NewRequest("POST", "http://dapp-web.yimucloud.com:8080/webapps/api.html", bytes.NewBuffer([]byte(data)))
+	req, err := http.NewRequest("POST", url, bytes.NewBuffer([]byte(data)))
 	if err != nil {
 		logs.Error(err)
 		// return nil
@@ -441,7 +394,7 @@ func postPush(data string, msgtype int, tx *xorm.Session, pastureId string) {
 
 	req.Header.Set("Content-Type", "application/json")
 	tr := &http.Transport{
-		TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
+		// TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
 	}
 	client := &http.Client{Transport: tr}
 
@@ -460,14 +413,14 @@ func postPush(data string, msgtype int, tx *xorm.Session, pastureId string) {
 		json.Unmarshal(body, &bodyData)
 		if _, ok := bodyData["data"]; ok {
 			tx.Exec(` insert into saplog(pastureId,request,response,status,msgtext,createTime,msgtype,dataDate,url)
-			values(?,?,?,?,?,now(),?,now(),?)`, pastureId, data, bodyData["data"], "", "", msgtype, forwardingReq.Url)
+			values(?,?,?,?,?,now(),?,now(),?)`, pastureId, data, bodyData["data"], "", "", msgtype, url)
 		} else {
 			tx.Exec(` insert into saplog(pastureId,request,response,status,msgtext,createTime,msgtype,dataDate,url)
-			values(?,?,?,?,?,now(),?,now(),?)`, pastureId, data, string(body), "", "", msgtype, forwardingReq.Url)
+			values(?,?,?,?,?,now(),?,now(),?)`, pastureId, data, string(body), "", "", msgtype, url)
 		}
 	} else {
 		tx.Exec(` insert into saplog(pastureId,request,response,status,msgtext,createTime,msgtype,dataDate,url)
-		values(?,?,?,?,?,now(),?,now(),?)`, pastureId, data, string(body), "", "", msgtype, forwardingReq.Url)
+		values(?,?,?,?,?,now(),?,now(),?)`, pastureId, data, string(body), "", "", msgtype, url)
 	}
 
 }

+ 18 - 2
http/routers/app_api.go

@@ -52,6 +52,11 @@ func AppAPI(opts ...func(engine *gin.Engine)) func(s *gin.Engine) {
 		s.POST("/userwxopenid/binding", api.UserWXOpenIDBinding)
 		s.POST("/admin/special/restartMqtt.html", api.RestartMqtt)
 
+		s.POST("/test", api.Test)
+
+		s.GET("feeding/tmrdata", api.GetHomepage)
+		s.GET("feeding/management", api.GetFeedingManagement)
+
 		apiV1 := s.Group("/authdata")
 		apiV1.Use(jwt.JWT()) // token 验证
 		{
@@ -59,7 +64,7 @@ func AppAPI(opts ...func(engine *gin.Engine)) func(s *gin.Engine) {
 			apiV1.GET("/userinfo", api.GetUserinfo)
 			apiV1.POST("/logout", api.UserLogout)
 
-			apiV1.POST("/GetRecuDataByName", api.GetRecuDataByName) ////
+			apiV1.POST("/GetRecuDataByName", api.GetRecuDataByName)
 
 			apiV1.POST("/GetDataByName", api.GetDataByName)
 			apiV1.POST("/GetDataBySqlIN", api.GetDataBySqlIN)
@@ -253,12 +258,19 @@ func AppAPI(opts ...func(engine *gin.Engine)) func(s *gin.Engine) {
 			// 云养牛撒料上传
 			apiV1.POST("/dusting/yyn/upload", api.LabourDustingPush)
 
-			apiV1.POST("/xdmy/sap/wasteuse", sap.LeftoverEntry)
+			apiV1.POST("/xdmy/sap/wasteuse", sap.Wasteuse)
 			apiV1.POST("/xdmy/sap/leftoverEntry", sap.LeftoverEntry)
 			apiV1.POST("/process/excel", api.ProcessExcel)
 			apiV1.POST("/FtImportExcel", api.FtImportExcel)
 
 			apiV1.POST("/feedtemplet/copy", api.CopyFeedtemplet)
+
+			apiV1.POST("/ymy/utirpush", api.YmyUtirPush)
+			apiV1.POST("/ymy/materialissuepush", api.YmyMaterialIssuePush)
+			apiV1.POST("/ymy/feedtemplet", api.YmyFeedtempletPush)
+
+			apiV1.POST("/ymy/syncfeed", api.YmySyncFeed)
+			apiV1.POST("/ymy/syncbar", api.YmySyncBar)
 		}
 
 		//不需要登录验证的接口
@@ -279,6 +291,9 @@ func AppAPI(opts ...func(engine *gin.Engine)) func(s *gin.Engine) {
 			apiV3.GET("/plan/rfid", api.GetPlanRFID)
 			apiV3.POST("/lyfd/sync", api.LYFDSync)
 
+			apiV3.POST("/plan/dry", api.GetPlanDry)
+			apiV3.GET("/bar/list", api.GetBar)
+
 		}
 
 		apiV4 := s.Group("/customreport") // restful  接口 tablename 是 表名字
@@ -286,6 +301,7 @@ func AppAPI(opts ...func(engine *gin.Engine)) func(s *gin.Engine) {
 			apiV4.POST("/createchart", api.Createchart)
 			apiV4.POST("/PostDataByName", api.PostDataByName)
 		}
+
 	}
 
 }

二進制
tmr-watch.exe


+ 4 - 1
update.sql

@@ -403,4 +403,7 @@ ADD COLUMN `useinbar` varchar(50) NULL AFTER `useinbarid`;
 
   ALTER TABLE pasture
 ADD COLUMN `token` varchar(200) NULL AFTER `werks`,
-ADD COLUMN `updatedate` datetime NULL AFTER `token`
+ADD COLUMN `updatedate` datetime NULL AFTER `token`
+
+ALTER TABLE `tn`.`feed` 
+ADD COLUMN `is_replace` tinyint(1) NOT NULL DEFAULT 0 COMMENT ' 0 不替换 1 替换剩料' AFTER `is_surplus`

+ 121 - 120
新建文本文档.txt

@@ -1,120 +1,121 @@
-[canal]
-# MySQL host
-host = mariadb
-# MySQL port
-port = 3306
-# MySQL user, must have replication privilege
-user = root
-# MySQL password
-password = root
-# Flavor: mysql or mariadb
-flavor = mariadb
-# Unique Server ID
-serverID = 101
-# mysqldump execution path
-mysqldump = mysqldump
-# dump tables, seperated by comma, will overwrite dbs
-tables = ftdetaildate,feedtemplet,feed,barfeedremain,barmilk,templetdry,downloadedplan,downloadplandtl1,downloadplandtl1_exec,downloadplandtl2
-# ,recweight
-# database for dump tables, seperated by comma, will overwrite dbs
-tableDB = tmrwatch2
-# ignore tables, must be database.table format, separated by comma
-ignoreTables = 
-# start sync from binlog name
-startName = 
-# start sync from binlog position of
-startPos = 
-# master heartbeat period(*time.Second)
-heartbeatPeriod = 60
-# connection read timeout(*time.Second)
-readTimeout = 90
-# nodename  key name intpastureid
-nodename = pasturecode
-# nodevalue value
-nodevalue = lymy_czly
-# showlog
-showlog = 0
-onetimerows = 50
-
-[kafka]
-# enable kafka
-kafkaEnable = false
-Offset = 
-kafka_host = www.kptyun.com
-kafka_port = 9092
-kafka_topic = tmrwatch_uploaddata_
-saslEnable = false
-username = root
-saslpassword = root
-tlsEnable = false
-clientcert = 
-clientkey = 
-cacert = 
-
-[mqtt]
-# enable kafka
-mqttEnable = true
-topic = TMR/LYMY/kptmqtt/lymy_czly/czly
-qos = 1
-CleanSession = true
-host = mq.heatwatch.cn
-port = 1983
-path = 
-#host = auuhfh5e8d294-ats.iot.us-east-2.amazonaws.com
-#port = 8883
-#path = /MyIotThing
-saslEnable = true
-username = kptmqtt
-saslpassword = kepaiteng
-tlsEnable = false
-clientcert = pem/bbbc7ee0f6-certificate.pem.crt
-clientkey = pem/bbbc7ee0f6-private.pem.key
-cacert = 
-
-[Service]
-ServiceName = KPTCanalService
-ServiceDisplayName = KPTCanalService
-ServiceDescription = ����������ͬ������
-
-
-
-[barfeedremain]
-barname = ztFeedpName
-deleteField = pastureid,operatetime,emp,pid,times,dry
-
-
-[barmilk]
-barname = feedpbname
-deleteField = pastureid,avgmonthage,bw,dayw,fetal,dayspre,pro,lactose,tem,cowsum,cowclass,cowclassid,bigcowclass,emp
-
-
-
-[downloadedplan]
-deleteField = pastureid,plantime,outitems,ptstempid,ptstempletname,thoweight,fpweight,lweight,iweight,oweight,tversion,ptversion,enable,isUse,completedtime,oldtmrid,artificial,driverId
-,remark
- 
-
-[downloadplandtl1]
-flpid = FPointID
-dryfeed = Dry
-pricefeed = UPrice
-deleteField = pastureid,begintime,optdevice,outweight,date,deviation,xxwFeedCode
-
-
-
-[downloadplandtl1_exec]
-deleteField = pastureid,flpid,begintime,optdevice,date,deviation,xxwFeedCode,type
-,surplus
-
-[downloadplandtl2]
-allowratio = feedpallowratio
-deleteField = pastureid,lweighthis,remainleftw,allowrw,begintime,begintag,endtag,optdevice,bigcowname,priceweight,fpid,useinbartype,date,type
-
-[recweight]
-deleteField = pastureid
-
-[feedtemplet]
-deleteField = issueversion,issueid,backup1,backup2,cattle,volume,is_modify,group_data_id,group_version,autozone,surplus
-
-[feed]
-deleteField = is_surplus
+version: "3.9"
+services:
+  ## 注意 旧版本是tomcat 新版本是tmrgo,两个只能存在一个
+  tmrgo:
+    image: registry.cn-hangzhou.aliyuncs.com/kptyun/tmrwatchcomm_amd64:latest
+    ports:
+      - "80:8081"
+    volumes:
+       - /home/tmrwatch/tmrgo:/opt/TMRWatchComm
+    depends_on:
+      - mariadb  
+    extra_hosts:
+      - "host.docker.internal:host-gateway"
+    deploy:
+      restart_policy:
+        condition: unless-stopped
+    logging:
+      driver: json-file
+      options:
+        max-size: 30m
+        max-file: 2
+  tmrwatchcomm:
+    image: registry.cn-hangzhou.aliyuncs.com/kptyun/tmrwatchcomm_amd64:latest
+    volumes:
+       - /home/tmrwatch/TMRWatch:/opt/TMRWatchComm
+    depends_on:
+      - mariadb
+    network_mode: "host"
+    devices:
+      - "/dev/ttyUSB0:/dev/ttyS0"
+    deploy:
+      restart_policy:
+        condition: on-failure
+        delay: 5s
+        max_attempts: 30
+    logging:
+      driver: json-file
+      options:
+        max-size: 30m
+        max-file: 2
+  dataservice:
+    image: registry.cn-hangzhou.aliyuncs.com/kptyun/tmrwatchcomm_amd64:latest
+    volumes:
+       - /home/tmrwatch/TMRWatch/dataservice:/opt/TMRWatchComm
+    depends_on:
+      - mariadb
+    deploy:
+      restart_policy:
+        condition: on-failure
+        delay: 5s
+        max_attempts: 30
+    logging:
+      driver: json-file
+      options:
+        max-size: 30m
+        max-file: 2
+  download:
+    image: registry.cn-hangzhou.aliyuncs.com/kptyun/tmrwatchcomm_amd64:latest
+    volumes:
+       - /home/tmrwatch/TMRWatch/download:/opt/TMRWatchComm
+    depends_on:
+      - mariadb
+    deploy:
+      restart_policy:
+        condition: on-failure
+        delay: 5s
+        max_attempts: 30
+    logging:
+      driver: json-file
+      options:
+        max-size: 30m
+        max-file: 2
+  mariadb:
+    image: registry.cn-hangzhou.aliyuncs.com/kptyun/kptmysql_amd64:latest
+    ports:
+      - "3326:3306"
+    volumes:
+      - /home/tmrwatch/TMRWatch/data:/data
+    deploy:
+      restart_policy:
+        condition: on-failure
+        delay: 5s
+        max_attempts: 30
+    logging:
+      driver: json-file
+      options:
+        max-size: 30m
+        max-file: 2
+  frpc:
+    image: registry.cn-hangzhou.aliyuncs.com/kptyun/frpc37_amd64:latest
+    environment:
+      - FRP_LOCAL_IP_STCP1=127.0.0.1
+      - FRP_LOCAL_PORT_STCP1=3326
+      - FRP_STCP_SK1=123456
+      - FRP_LOCAL_IP_STCP=127.0.0.1
+      - FRP_LOCAL_PORT_STCP=22
+      - FRP_STCP_SK=123456
+      - FRP_LOCAL_IP_TCP=127.0.0.1
+      - FRP_LOCAL_PORT_TCP=8888
+      - FRP_LOCAL_IP_XTCP1=127.0.0.1
+      - FRP_LOCAL_PORT_XTCP1=9999
+      - FRP_LOCAL_IP_XTCP=127.0.0.1
+      - FRP_LOCAL_PORT_XTCP=9999
+      - FRP_LOCAL_IP_HTTP=127.0.0.1
+      - FRP_LOCAL_PORT_HTTP=80
+      - FRP_PRIVILEGE_TOKEN=TMRWatch
+      - FRP_SERVER_ADDR=kptyun.com
+      - FRP_SERVER_PORT=7000
+      - FRP_START=stcp,stcp1,web
+      - FRP_USER=lyahtc
+    network_mode: "host"
+    deploy:
+      restart_policy:
+        condition: on-failure
+        delay: 5s
+        max_attempts: 30
+    logging:
+      driver: json-file
+      options:
+        max-size: 30m
+        max-file: 2