瀏覽代碼

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

baishaojie 1 年之前
父節點
當前提交
4c23a8bf79

+ 18 - 17
.drone.yml → .drone-bak.yml

@@ -1,18 +1,10 @@
 kind: pipeline
 type: docker
-name: kpt-tmr
+name: test
 
-clone:
-  depth: 1
-  disable: true
 steps:
-  - name: clone
-    image: alpine/git
-    commands:
-     - git clone -b develop http://192.168.1.8:3000/baishaojie/tmrgo.git
-     - cp -R tmrgo/* ./
   - name: build
-    image: plugins/docker:20.14.2
+    image: plugins/docker
     volumes:
       - name: hosts
         path: /etc/hosts
@@ -21,23 +13,32 @@ steps:
       - name: docker-sock
         path: /var/run/docker.sock
     settings:
-      dockerfile: /drone/src/tmrgo/Dockerfile
+      dockerfile: /drone/src/Dockerfile
       username:
         from_secret: aliyun_name
       password:
         from_secret: aliyun_password
-      repo: registry.cn-hangzhou.aliyuncs.com/kpt-event/kpt-tmr
+      repo: registry.cn-hangzhou.aliyuncs.com/kpt-event/kpt-tmr-sheep
       registry: registry.cn-hangzhou.aliyuncs.com
-      tags: [ 1.0.3,latest ]
-
+      tags: [test]
+  - name: ssh commands
+    image: appleboy/drone-ssh
+    settings:
+      host: 192.168.1.70
+      username: tmrwatch
+      password:
+        from_secret: ssh_password
+      port: 22
+      script:
+        - cd /data/docker-compose/kpt-tmr-sheep/
+        - echo "123456" | ./restart.sh
 trigger:
   branch:
     include:
-      - develop
+      - feature/*
   event:
     include:
       - push
-
 volumes:
   - name: host
     host:
@@ -47,4 +48,4 @@ volumes:
       path: /ect/docker
   - name: docker-sock
     host:
-      path: /var/run/docker.sock
+      path: /var/run/docker.sock

+ 9 - 9
Dockerfile

@@ -1,6 +1,6 @@
 FROM golang:1.17-alpine as build
 
-WORKDIR /app/kpt-tmr
+WORKDIR /app/kpt-tmr-sheep
 
 COPY . .
 
@@ -11,25 +11,25 @@ RUN go env -w GO111MODULE=on && \
     go env -w CGO_ENABLED=0 && \
     go env -w GOARCH=amd64 && \
     go env -w GOOS=linux && \
-    go build -o ./bin/kptTmr -ldflags "-X kpt.kptyun.cn:3000/kpt-event/kpt-tmr/pod.appVersion=tmr" main.go
+    go build -o ./bin/kptTmrSheep -ldflags "-X kpt.kptyun.cn:3000/kpt-event/kpt-tmr-sheep/pod.appVersion=tmr" main.go
 
 
 FROM alpine:latest
-LABEL name="kpt-tmr" \
+LABEL name="kpt-tmr-sheep" \
 description="pt service" \
 owner="yiping.xu"
 
-WORKDIR /app/kpt-tmr
+WORKDIR /app/kpt-tmr-sheep
 
 RUN apk update && apk add tzdata
 RUN ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
 && echo "Asia/Shanghai" > /etc/timezone \
 
-COPY --from=0 /app/kpt-tmr/conf/ /app/kpt-tmr/bin/conf/
-COPY --from=0 /app/kpt-tmr/uploads /app/kpt-tmr/bin/uploads
-COPY --from=0  /app/kpt-tmr/bin/kptTmr /app/kpt-tmr/bin/kptTmr
+COPY --from=0 /app/kpt-tmr-sheep/conf/ /app/kpt-tmr-sheep/bin/conf/
+COPY --from=0 /app/kpt-tmr-sheep/uploads /app/kpt-tmr-sheep/bin/uploads
+COPY --from=0  /app/kpt-tmr-sheep/bin/kptTmr /app/kpt-tmr-sheep/bin/kptTmr
 
 EXPOSE 8081
-VOLUME ["/app/kpt-tmr/logger","/app/kpt-tmr/bin/conf/"]
+VOLUME ["/app/kpt-tmr-sheep/logger","/app/kpt-tmr-sheep/bin/conf/"]
 
-CMD ["/app/kpt-tmr/bin/kptTmr"]
+CMD ["/app/kpt-tmr-sheep/bin/kptTmrSheep"]

二進制
__debug_bin.exe → KPTAdmin64.exe


+ 1 - 1
Makefile

@@ -18,4 +18,4 @@ lint:
 build:
 	rm -rf bin
 	mkdir -p bin
-	GOARCH=amd64 GOOS=linux CGO_ENABLED=0 go build -o bin/kptTmr -ldflags "-X kpt.kptyun.cn:3000/kpt-event/kpt-tmr/pod.appVersion=${version}" main.go
+	GOARCH=amd64 GOOS=linux CGO_ENABLED=0 go build -o bin/kptTmrSheep -ldflags "-X kpt.kptyun.cn:3000/kpt-event/kpt-tmr-sheep/pod.appVersion=${version}" main.go

+ 4 - 4
conf/app-develop.ini

@@ -21,7 +21,7 @@ TimeFormat = 20060102-150405
 #debug or release
 #RunMode = debug
 RunMode = release
-HttpPort = 8082
+HttpPort = 8081
 ReadTimeout = 60
 WriteTimeout = 60
 NoAuth = 1
@@ -41,9 +41,9 @@ Description = tmrgo
 [database]
 Type = mysql
 User = root
-Password = 123456
-Host = 192.168.1.70:3306
-Name = tmrwatch2
+Password = root
+Host = 192.168.1.93:3326
+Name = yq
 TablePrefix =
 
 ShowXormlog = false

+ 19 - 12
conf/app.ini

@@ -21,7 +21,7 @@ TimeFormat = 20060102-150405
 #debug or release
 #RunMode = debuggit 
 RunMode = release
-HttpPort = 8081
+HttpPort = 80
 ReadTimeout = 60
 WriteTimeout = 60
 NoAuth = 1
@@ -58,22 +58,22 @@ Host = 192.168.1.93:3326
 #Password = root123456
 #Password = keep
 
-#Password = kptzhu@163.com
+
 #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 
+#Name = tmrgo
 #Password = kepaiteng!QAZ
-#Host = 222.73.129.15:31306 
-Name = sfmc1
+#Host = 222.73.129.15:31306
+Name = bmsm8
 TablePrefix =
 
 ShowXormlog = false
@@ -83,7 +83,7 @@ CacheApiSql = false
 
 [sqlserver]
 #Host = "sqlserver://sa:Password@@localhost?database=SysData&connection+timeout=30"
-##张北乐源
+##张北乐源 
 Host = 
 User = 
 Password = 
@@ -91,11 +91,12 @@ Name =
 
 
 [yyn]
-FarmId = ""
-ProductKey = ""
-DeviceName = ""
-DeviceSecret = ""
-HeartBeat = ""
+FarmId = "1830004776"
+ProductKey = "k03txxLKFae"
+DeviceName = "04776_p_breed"
+DeviceSecret = "e1fdb50556b13afe896e738fdcb25bf3"
+HeartBeat = "Tmr183000477604776_p_breed"
+
 
 [comm]
 PortName =
@@ -106,6 +107,12 @@ ParityMode = 0    #PARITY_NONE  0	PARITY_ODD  1	PARITY_EVEN  2
 InterCharacterTimeout = 100
 MinimumReadSize = 0
 
+; product_key =k03txxLKFae device_name =4623_p_breed 
+; device_secret =d06ababb2b10ba25bca3041e35ac604d
+;  host = iot-010a5xth.mqtt.iothub.aliyuncs.com 
+;  farmId=1830004623 
+;  heartBeat=18300046234623_p_breed 
+;  TopicName=/k03txxLKFae/4623_p_breed/user/heatwatch/tmrBreed/post
 
 
 

+ 1 - 1
conf/setting/setting.go

@@ -115,7 +115,7 @@ func Setup() {
 	switch appEnv {
 	case "test":
 		cfg, err = ini.Load(CurrentPath + "conf/app-test.ini")
-	case "develop":
+	case "development":
 		cfg, err = ini.Load(CurrentPath + "conf/app-develop.ini")
 	default:
 		cfg, err = ini.Load(CurrentPath + "conf/app.ini")

File diff suppressed because it is too large
+ 0 - 0
dist/index.html


File diff suppressed because it is too large
+ 0 - 0
dist/static/css/app.005b8c7f.css


File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-libs.f403b559.css


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/app.a193431d.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/app.efd6406b.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-libs.90e56fea.js


+ 2 - 1
go.mod

@@ -3,7 +3,7 @@ module tmr-watch
 go 1.16
 
 require (
-	gitee.com/xuyiping_admin/go_proto v0.0.0-20231020024751-e01ca61df346
+	gitee.com/xuyiping_admin/go_proto v0.0.0-20240418053639-07f97848df89
 	gitee.com/xuyiping_admin/pkg v0.0.0-20230816061144-c1f079802584
 	github.com/360EntSecGroup-Skylar/excelize v1.4.1
 	github.com/Anderson-Lu/gofasion v0.0.0-20190530065914-6a05b679ee48
@@ -44,6 +44,7 @@ require (
 	github.com/agrison/mxj v0.0.0-20160310142625-1269f8afb3b4 // indirect
 	github.com/bndr/gotabulate v1.1.2 // indirect
 	github.com/clbanning/mxj v1.8.4 // indirect
+	github.com/qichengzx/coordtransform v0.0.0-20220708113031-010878418826
 	github.com/recoilme/pudge v1.0.3 // indirect
 	github.com/syndtr/goleveldb v1.0.0 // indirect
 	github.com/xormplus/builder v0.0.0-20200331055651-240ff40009be // indirect

+ 4 - 2
go.sum

@@ -725,8 +725,8 @@ git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3p
 gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:lSA0F4e9A2NcQSqGqTOXqu2aRi/XEQxDCBwM8yJtE6s=
 gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:EXuID2Zs0pAQhH8yz+DNjUbjppKQzKFAn28TMYPB6IU=
 gitee.com/xuyiping_admin/go_proto v0.0.0-20230802054950-77dee3d12065/go.mod h1:cxbPefIf1o+cyQwvFaM3ndaoUeaK5aWzPV/eZQGJPgE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20231020024751-e01ca61df346 h1:XZR4WvMVxk6fNbraGsReW7onWxR5O6TMLTAmPWnphm8=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20231020024751-e01ca61df346/go.mod h1:x47UOU+lOkZnrtAENAsOGd7mZ5I8D2JRkMKMqLLRlVw=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240418053639-07f97848df89 h1:dTMfNlgg0JslPWpWusZcV6aRN1dQAGHnVEELS1/XcoQ=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240418053639-07f97848df89/go.mod h1:x47UOU+lOkZnrtAENAsOGd7mZ5I8D2JRkMKMqLLRlVw=
 gitee.com/xuyiping_admin/pkg v0.0.0-20230816061144-c1f079802584 h1:5RE5yrMMvnDITrnoX821mFl7dNYfsFA1osDobUV/TDo=
 gitee.com/xuyiping_admin/pkg v0.0.0-20230816061144-c1f079802584/go.mod h1:VQ7WztVDQRlXE1dUu/Yqo3ZdhKsfv7IGJtV+vqNqJVw=
 github.com/360EntSecGroup-Skylar/excelize v1.4.1 h1:l55mJb6rkkaUzOpSsgEeKYtS6/0gHwBYyfo5Jcjv/Ks=
@@ -1419,6 +1419,8 @@ github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1
 github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=
 github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg=
 github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM=
+github.com/qichengzx/coordtransform v0.0.0-20220708113031-010878418826 h1:xRzV3Mycb7VUY9QSs03UZbmgf7Og7RHEwF2zaHGyTXg=
+github.com/qichengzx/coordtransform v0.0.0-20220708113031-010878418826/go.mod h1:hrRiFtqNSi8E6C+3JsbPGjtCfyS9QFz90IORo3H6mts=
 github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
 github.com/recoilme/pudge v1.0.3 h1:h/9dEv5fRqtzM4lnO69kUoN+k7ukxxrW9NGb9ug0grM=
 github.com/recoilme/pudge v1.0.3/go.mod h1:VMvxBLVkrSStldckzCsETBXox3pfovfrnEchafXk8qA=

+ 6 - 5
http/handle/api/chart.go

@@ -1526,13 +1526,14 @@ func GetAccuracyAllLS(c *gin.Context) {
 	startDate := parammaps.Get("startTime").ValueStr()
 	endDate := parammaps.Get("stopTime").ValueStr()
 	pastureId := parammaps.Get("pastureid").ValueStr()
+	ftId := parammaps.Get("ftId").ValueStr()
 	tx := restful.Engine.NewSession()
 	defer tx.Close()
 
 	var sqlStr = `SELECT concat(de.fname,'-',d.times,'班') 名称,de.fname,%s 日期, 
 	IFNULL(DATE_FORMAT(de.intime,'%%H.%%i'),'')   准确率  --  撒料时间
 	FROM downloadedplan d right JOIN downloadplandtl2 de ON  d.pastureid = de.pastureid and d.id=de.pid 
-	WHERE d.mydate  BETWEEN ? AND ?  AND  d.pastureid=?  AND d.lpplantype  IN (0,1,2,5) AND de.type = 0
+	WHERE d.mydate  BETWEEN ? AND ?  AND  d.pastureid=?  AND d.lpplantype  IN (0,1,2,5) AND de.type = 0    and (? ='' or   FIND_IN_SET(d.tempid ,?))
 	-- 加上就是不含取消操作
 	-- AND ((ABS(de.actualweightminus-de.lweight)/de.lweight)<=3 OR (de.lweight <30 AND de.actualweightminus <30 )) 
 	GROUP BY d.times,日期,de.fname
@@ -1544,7 +1545,7 @@ func GetAccuracyAllLS(c *gin.Context) {
 		sqlStr = fmt.Sprintf(sqlStr, " DATE_FORMAT(d.Mydate, '%Y-%m-%d') ")
 
 		// sqlStr += "  GROUP BY 日期 "
-		data, err = tx.SQL(sqlStr, startDate, endDate, pastureId).Query().List()
+		data, err = tx.SQL(sqlStr, startDate, endDate, pastureId, ftId, ftId).Query().List()
 		if err != nil {
 			logs.Error(sqlName, " : ", err)
 			appG.Response(http.StatusInternalServerError, e.ERROR, err)
@@ -1565,7 +1566,7 @@ func GetAccuracyAllLS(c *gin.Context) {
 		sqlStr = fmt.Sprintf(sqlStr, "FLOOR( ((DATEDIFF(d.Mydate,'"+startDate+"') +"+strconv.Itoa(week)+")/7)+1)")
 
 		// sqlStr += "  GROUP BY 日期 "
-		data, err = tx.SQL(sqlStr, startDate, endDate, pastureId).Query().List()
+		data, err = tx.SQL(sqlStr, startDate, endDate, pastureId, ftId, ftId).Query().List()
 		if err != nil {
 			logs.Error(sqlName, " : ", err)
 			appG.Response(http.StatusInternalServerError, e.ERROR, err)
@@ -1581,7 +1582,7 @@ func GetAccuracyAllLS(c *gin.Context) {
 		// end, _ := time.ParseInLocation(timeTemplate, endDate, time.Local)
 		// endDate = end.AddDate(0, 1, -1).Format(timeTemplate)
 
-		data, err = tx.SQL(sqlStr, startDate, endDate, pastureId).Query().List()
+		data, err = tx.SQL(sqlStr, startDate, endDate, pastureId, ftId, ftId).Query().List()
 		if err != nil {
 			logs.Error(sqlName, " : ", err)
 			appG.Response(http.StatusInternalServerError, e.ERROR, err)
@@ -1589,7 +1590,7 @@ func GetAccuracyAllLS(c *gin.Context) {
 
 		// appG.Response(http.StatusOK, e.SUCCESS, data)
 	}
-	if status == "1" {
+	if status == "0" {
 		queryData, _ := getAccuracy(data, "2006-01-02")
 		appG.Response(http.StatusOK, e.SUCCESS, queryData)
 	} else {

+ 6 - 0
http/handle/api/grfdApi.go

@@ -147,6 +147,12 @@ func GetDormBar(pastureid string) error {
 				}
 				//首先将所有栏舍禁用
 
+				_, err = tx.Exec("update bar set bname = ? where bcode = ?",
+					penName, penId)
+				if err != nil {
+					return err
+				}
+
 				_, err = tx.Exec("insert into bar(id,pastureid,bcode,backup1,backup2,bname,enable) "+
 					" values(?,?,?,?,?,?,1)"+
 					" ON DUPLICATE KEY UPDATE bcode=?,backup2=?,enable=if(enable = 2,0,1)",

+ 133 - 93
http/handle/api/mqtt.go

@@ -19,6 +19,7 @@ import (
 
 	"github.com/astaxie/beego/logs"
 	MQTT "github.com/eclipse/paho.mqtt.golang"
+	mqtt "github.com/eclipse/paho.mqtt.golang"
 	"github.com/robfig/cron"
 )
 
@@ -27,14 +28,23 @@ func InitMqttClient() {
 		c, pubTopic := MqttClient()
 		deviceHeartbeat(c, pubTopic)
 
+		// now := time.Now().AddDate(0, 0, -5).Format("2006-01-02")
+		// stirPush(c, pubTopic, now)
+		// dustingPush(c, pubTopic, now)
+		// equipmentAccuracyPush(c, pubTopic, now)
+		// finishedWeightPush(c, pubTopic, now)
+		// feedtempletPush(c, pubTopic)
+		// CompletedTrainNumberPush(c, pubTopic, now)
+
 		mqttCron := cron.New()
 		mqttCron.AddFunc("10 06 * * *", func() {
+			now := time.Now().AddDate(0, 0, -1).Format("2006-01-02")
+			stirPush(c, pubTopic, now)
+			dustingPush(c, pubTopic, now)
+			equipmentAccuracyPush(c, pubTopic, now)
+			finishedWeightPush(c, pubTopic, now)
 			feedtempletPush(c, pubTopic)
-			stirPush(c, pubTopic)
-			dustingPush(c, pubTopic)
-			equipmentAccuracyPush(c, pubTopic)
-			finishedWeightPush(c, pubTopic)
-			CompletedTrainNumberPush(c, pubTopic)
+			CompletedTrainNumberPush(c, pubTopic, now)
 		})
 		mqttCron.Start()
 	}
@@ -53,17 +63,23 @@ func MqttClient() (MQTT.Client, string) {
 	var deviceName string = setting.YynserverSetting.DeviceName
 	var deviceSecret string = setting.YynserverSetting.DeviceSecret
 
-	// set timestamp, clientid, subscribe topic and publish topic
+	// product_key =k03txxLKFae
+	// device_name =4623_p_breed
+	// device_secret =d06ababb2b10ba25bca3041e35ac604d
+	// host = iot-010a5xth.mqtt.iothub.aliyuncs.com
+	// farmId=1830004623
+	// heartBeat=18300046234623_p_breed
+	// TopicName=/k03txxLKFae/4623_p_breed/user/heatwatch/tmrBreed/post
+
 	var timeStamp string = strconv.FormatInt(time.Now().UnixNano(), 10)
-	var clientId string = "go_device_id_0001"
+	var clientId string = "go" + setting.YynserverSetting.FarmId
 	var subTopic string = "/" + productKey + "/" + deviceName + "/user/heatwatch/tmrBreed/get"
 	var pubTopic string = "/" + productKey + "/" + deviceName + "/user/heatwatch/tmrBreed/post"
 
 	// set the login broker url
 	var raw_broker bytes.Buffer
-	raw_broker.WriteString("tls://")
-	raw_broker.WriteString(productKey)
-	raw_broker.WriteString(".iot-as-mqtt.cn-shanghai.aliyuncs.com:1883")
+	raw_broker.WriteString("tcp://")
+	raw_broker.WriteString("iot-010a5xth.mqtt.iothub.aliyuncs.com:1883")
 	opts := MQTT.NewClientOptions().AddBroker(raw_broker.String())
 
 	// calculate the login auth info, and set it into the connection options
@@ -82,39 +98,15 @@ func MqttClient() (MQTT.Client, string) {
 		}
 	}
 
-	// create and start a client using the above ClientOptions
-	c := MQTT.NewClient(opts)
-	if token := c.Connect(); token.Wait() && token.Error() != nil {
-		logging.Error("mqtt Connect err: ", token.Error())
+	c := mqtt.NewClient(opts)
 
+	if token := c.Connect(); token.Wait() && token.Error() != nil {
+		fmt.Println(token.Error())
+		os.Exit(1)
 	}
-	fmt.Print("Connect aliyun IoT Cloud Sucess\n")
-
-	// if token := c.Subscribe(subTopic, 0, feedHeatwatch); token.Wait() && token.Error() != nil {
-	// 	fmt.Println(token.Error())
-	// 	os.Exit(1)
-	// }
-	// subscribe to subTopic("/a1Zd7n5yTt8/deng/user/get") and request messages to be delivered
-
-	// fmt.Println("Subscribe topic "+subTopic+" success\n", c.IsConnected())
 
-	// publish 5 messages to pubTopic("/a1Zd7n5yTt8/deng/user/update")
-	// for i := 0; i < 50; i++ {
-	// 	fmt.Println("publish msg:", i)
-	// 	text := fmt.Sprintf("ABC #%d", i)
-	// 	token := c.Publish(pubTopic, 0, false, text)
-	// 	fmt.Println("publish msg: ", text)
-	// 	token.Wait()
-
-	// 	time.Sleep(2 * time.Second)
-	// }
-	// unsubscribe from subTopic("/a1Zd7n5yTt8/deng/user/get")
-	// if token := c.Unsubscribe(subTopic); token.Wait() && token.Error() != nil {
-	// 	fmt.Println(token.Error())
-	// 	os.Exit(1)
-	// }
+	fmt.Print("Connect aliyun IoT Cloud Sucess\n")
 
-	// c.Disconnect(250)
 	return c, pubTopic
 }
 
@@ -191,10 +183,27 @@ func feedtempletPush(c MQTT.Client, pubTopic string) {
 	tx := restful.Engine.NewSession()
 	defer tx.Close()
 
-	dataList, err := tx.SQL(`select f.id  as recipeId , f.tname recipeName,ft.id ingId,ft.fname ingName,ft.fweight  afQty,
-	ft.sort mixNo,fd.allowratio allowableError ,fd.fclass ingType, ft.fweight * ( fd.dry /100 )  dmQty,null recipeCost 
-	 from feedtemplet  f   join ftdetail ft  on ft.ftid = f.id  join feed fd on fd.id = ft.fid	
-	`).Query().List()
+	dataList, err := tx.SQL(`SELECT 
+	f.id AS recipeId,
+	f.tname recipeName,
+	ft.id ingId,
+	ifnull(fd.fname,fdy.fname) ingName,
+	if(fd.fname is not null, ft.fweight,fty.fweight) afQty,
+	ft.sort mixNo,
+	ifnull(fd.allowratio,fdy.allowratio) allowableError,
+	ifnull(fd.fclass,fdy.fclass) ingType,
+		if(fd.fname is not null,ft.fweight * ( fd.dry / 100 ), fty.fweight * ( fdy.dry / 100 )) dmQty,
+	'' recipeCost 
+FROM
+	feedtemplet f
+	JOIN ftdetail ft ON ft.ftid = f.id
+	 left JOIN feed fd ON fd.id = ft.fid
+	 left join feedtemplet fy  on fy.id = ft.preftid
+ left join ftdetail fty on fty.ftid = fy.id
+ left JOIN feed fdy ON fdy.id = fty.fid
+	 
+
+	`).QueryString()
 	if err != nil {
 		logs.Error("feedtempletPush-error-1:", err)
 		return
@@ -203,7 +212,7 @@ func feedtempletPush(c MQTT.Client, pubTopic string) {
 	pushStr := `{
 		"apiId": "getKPTData", 
 		"param": {
-		"farmId": %s, 
+		"farmId": "%s", 
 				  "method":"getfeedtempletinfo",
 				  "rowCount": "1",
 		"resultData":%s
@@ -220,33 +229,36 @@ func feedtempletPush(c MQTT.Client, pubTopic string) {
 	}
 }
 
-func stirPush(c MQTT.Client, pubTopic string) {
+func stirPush(c MQTT.Client, pubTopic, date string) {
 	tx := restful.Engine.NewSession()
 	defer tx.Close()
 
 	dataList, err := tx.SQL(`SELECT
-	d.mydate dropDate,
-	d.projname tmrNo,
+	DATE_FORMAT(d.mydate,'%Y-%m-%d')  loadDate,
+	d.sort tmrNo,
 	d.times loadShift,
 	d.tempid recipeId,
 	d.templetname recipeName,
 	f.feedcode ingId,
 	d1.fname ingName,
-	f.fclass ingType,
+	12 ingType,
 	f.dry dmPct,
 	d1.sort mixNo,
-	d1.feedallowratio allowableError,
+	d1.feedallowratio allowable_error,
 	d1.lweight expWeight,
 	d1.actualweightminus actualWeight,
-	d1.begintime startTime,
-	d1.intime endTime 
+	 	if((select  count(1) from downloadplandtl1  where pid = d.id and sort < d1.sort order by sort desc) >0 ,(select  DATE_FORMAT(intime,'%Y-%m-%d %H:%i:%s') from downloadplandtl1  where pid = d.id and sort < d1.sort order by sort desc limit 1),DATE_FORMAT(d.intime,'%Y-%m-%d %H:%i:%s')  )   startTime,
+	 DATE_FORMAT(d1.intime,'%Y-%m-%d %H:%i:%s')  endTime ,	ifnull(if(d.driverId !=0 ,(select drivername from driver where id = d.driverId),(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)),'')tmrName 
 FROM
 	downloadedplan d
 	JOIN downloadplandtl1 d1 ON d1.pid = d.id
 	JOIN feed f ON f.feedcode = d1.feedcode 
 	AND f.pastureid = d.pastureid 
 WHERE
-	DATE_FORMAT( d.mydate ,'%Y-%m-%d' ) = DATE_FORMAT(subdate(now(),1) ,'%Y-%m-%d' )`).Query().List()
+	DATE_FORMAT( d.mydate ,'%Y-%m-%d' ) = ?
+	`, date).QueryString()
 	if err != nil {
 		logs.Error("feedtempletPush-error-1:", err)
 		return
@@ -255,16 +267,17 @@ WHERE
 	pushStr := `{
 		"apiId": "getKPTData", 
 	   "param": {
-	   "farmId": %s, 
+	   "farmId":  "%s", 
 				 "method":"uploadadddata",
-				"rowCount": "1",
+				"rowCount": "%d",
 	   "resultData":%s
 		}
 	   }`
 	if len(dataList) > 0 {
 		b, _ := json.Marshal(dataList)
-		pushStr = fmt.Sprintf(pushStr, setting.YynserverSetting.FarmId, string(b))
+		pushStr = fmt.Sprintf(pushStr, setting.YynserverSetting.FarmId, len(dataList), string(b))
 		token := c.Publish(pubTopic, 2, false, pushStr)
+
 		fmt.Println("publish msg: ", pushStr, token.Error())
 		// token.Wait()
 		// time.Sleep(2 * time.Second)
@@ -272,28 +285,34 @@ WHERE
 }
 
 // 撒料信息
-func dustingPush(c MQTT.Client, pubTopic string) {
+func dustingPush(c MQTT.Client, pubTopic, date string) {
 	tx := restful.Engine.NewSession()
 	defer tx.Close()
 
 	dataList, err := tx.SQL(`SELECT
-	d.mydate dropDate,
-	d.projname tmrNo,
-	d.times loadShift,
-  d2.fbarid  penId,
-  b.bcode penName,
-	d2.cowcount cowCount,
-	d2.sort feedingNo,
-	d2.lweight expWeight,
-	d2.actualweightminus actualWeight,
-	d2.begintime startTime,
-	d2.intime endTime
-FROM
-	downloadedplan d
-	JOIN downloadplandtl2 d2 ON d2.pid = d.id
-	JOIN bar b ON b.id = d2.fbarid 
-WHERE
-	DATE_FORMAT( d.mydate ,'%Y-%m-%d' ) = DATE_FORMAT(subdate(now(),1) ,'%Y-%m-%d' )`).Query().List()
+	ifnull(if(d.driverId !=0 ,(select drivername from driver where id = d.driverId),(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)),'')tmrName ,
+		DATE_FORMAT(d.mydate,'%Y-%m-%d')   dropDate,
+		d.sort tmrNo,
+		d.times dropShift,
+	  d2.fbarid  penId,
+	  b.bname penName,
+		fp.ccount cowCount,
+		d2.sort feedingNo,
+		d2.lweight expWeight,
+		d2.actualweightminus actualWeight,
+		if((select  count(1) from downloadplandtl2  where pid = d.id and sort < d2.sort order by sort desc) >0 ,(select  DATE_FORMAT(intime,'%Y-%m-%d %H:%i:%s') from downloadplandtl2  where pid = d.id and sort < d2.sort order by sort desc limit 1),  (select DATE_FORMAT(intime,'%Y-%m-%d %H:%i:%s') from downloadplandtl1  where pid = d.id order by sort desc limit 1) )  startTime,
+		  DATE_FORMAT(d2.intime,'%Y-%m-%d %H:%i:%s') endTime
+	FROM
+		downloadedplan d
+		JOIN downloadplandtl2 d2 ON d2.pid = d.id
+		JOIN bar b ON b.id = d2.fbarid 
+		join feedp fp on fp.barid = b.id
+		join tmr t on t.id = d.tmrid 
+		left join driver on driver.drivercode = t.eqcode
+	WHERE
+		DATE_FORMAT( d.mydate ,'%Y-%m-%d' ) = ? `, date).QueryString()
 	if err != nil {
 		logs.Error("feedtempletPush-error-1:", err)
 		return
@@ -302,15 +321,15 @@ WHERE
 	pushStr := `{
 		"apiId": "getKPTData", 
 		"param": {
-		"farmId": %s, 
+		"farmId":  "%s", 
 				  "method":"uploaddiliverdata",
-				  "rowCount": "1",
+				  "rowCount": "%d",
 		"resultData":%s
 		 }
 		}`
 	if len(dataList) > 0 {
 		b, _ := json.Marshal(dataList)
-		pushStr = fmt.Sprintf(pushStr, setting.YynserverSetting.FarmId, string(b))
+		pushStr = fmt.Sprintf(pushStr, setting.YynserverSetting.FarmId, len(dataList), string(b))
 		token := c.Publish(pubTopic, 2, false, pushStr)
 		fmt.Println("publish msg: ", pushStr, token.Error())
 		// token.Wait()
@@ -333,7 +352,7 @@ func deviceHeartbeat(c MQTT.Client, pubTopic string) {
 	device := cron.New()
 	device.AddFunc(spec1, func() {
 		token := c.Publish(pubTopic, 2, false, pushStr)
-		fmt.Println("publish msg: ", pushStr, token.Error())
+		fmt.Println("publish msg: ", pushStr, token.Error(), time.Now())
 		// token.Wait()
 	})
 	// }
@@ -342,13 +361,24 @@ func deviceHeartbeat(c MQTT.Client, pubTopic string) {
 }
 
 // 准确率
-func equipmentAccuracyPush(c MQTT.Client, pubTopic string) {
+func equipmentAccuracyPush(c MQTT.Client, pubTopic, date string) {
 	tx := restful.Engine.NewSession()
 	defer tx.Close()
 
-	dataList, err := tx.SQL(`select t.tname tname,1-abs(sum(d1.actualweightminus)- sum(d1.lweight))/sum(d1.lweight) rate ,d.mydate rateDate  from downloadedplan d join downloadplandtl1 d1 on d1.pid = d.id  join tmr t on t.datacaptureno = d.datacaptureno 
-	where DATE_FORMAT( d.mydate ,'%Y-%m-%d' ) = DATE_FORMAT(subdate(now(),1) ,'%Y-%m-%d' )
-	 group by d.datacaptureno`).Query().List()
+	dataList, err := tx.SQL(`SELECT
+	t.tname Name,
+	1-abs (
+	sum( d1.actualweightminus )- sum( d1.lweight ))/ sum( d1.lweight ) Rate,
+	d.mydate RateDate ,  DATE_FORMAT(d.intime,'%Y-%m-%d %H:%i:%s') startTime,
+	(select DATE_FORMAT(intime,'%Y-%m-%d %H:%i:%s')  from downloadplandtl2  where pid = d.id  order by sort desc limit 1) endTime
+FROM
+	downloadedplan d
+	JOIN downloadplandtl1 d1 ON d1.pid = d.id
+	JOIN tmr t ON t.datacaptureno = d.datacaptureno 
+WHERE
+	DATE_FORMAT( d.mydate, '%Y-%m-%d' ) = ?   and d.lpplantype in(0,1)
+GROUP BY
+	d.datacaptureno`, date).QueryString()
 	if err != nil {
 		logs.Error("feedtempletPush-error-1:", err)
 		return
@@ -358,7 +388,7 @@ func equipmentAccuracyPush(c MQTT.Client, pubTopic string) {
 		"apiId": "getKPTData",
 		"param": {
 			"resultData": %s,
-			"farmId": %s,         
+			"farmId":  "%s",        
 			"method": "uploadrate",          
 			"rowCount": %d                  
 		}
@@ -374,13 +404,21 @@ func equipmentAccuracyPush(c MQTT.Client, pubTopic string) {
 }
 
 // 完成重量
-func finishedWeightPush(c MQTT.Client, pubTopic string) {
+func finishedWeightPush(c MQTT.Client, pubTopic, date string) {
 	tx := restful.Engine.NewSession()
 	defer tx.Close()
 
-	dataList, err := tx.SQL(`select  sum(d1.actualweightminus) CompleteWeught,sum(d1.lweight) planWeight,d.mydate weightDate 
-	 from downloadedplan d join downloadplandtl1 d1 on d1.pid = d.id  join tmr t on t.datacaptureno = d.datacaptureno 
-	where DATE_FORMAT( d.mydate ,'%Y-%m-%d' ) = DATE_FORMAT(subdate(now(),1),'%Y-%m-%d' )`).Query().List()
+	dataList, err := tx.SQL(`SELECT
+	sum( d1.actualweightminus ) completeWeight,
+	sum( d1.lweight ) planWeight,
+	d.mydate weightDate ,  DATE_FORMAT(d.intime,'%Y-%m-%d %H:%i:%s') startTime,
+	(select DATE_FORMAT(intime,'%Y-%m-%d %H:%i:%s')  from downloadedplan  where mydate = d.mydate and intime is not null order by sort desc limit 1) endTime
+FROM
+	downloadedplan d
+	JOIN downloadplandtl1 d1 ON d1.pid = d.id
+	JOIN tmr t ON t.datacaptureno = d.datacaptureno 
+WHERE
+	DATE_FORMAT( d.mydate, '%Y-%m-%d' ) =  ?   and lpplantype in(0,1)`, date).QueryString()
 	if err != nil {
 		logs.Error("feedtempletPush-error-1:", err)
 		return
@@ -390,7 +428,7 @@ func finishedWeightPush(c MQTT.Client, pubTopic string) {
 		"apiId": "getKPTData",
 		"param": {
 			"resultData": %s,
-			"farmId": %s,          
+			"farmId": "%s",          
 			"method": "uploadweight",
 			"rowCount": "1"                 
 		}
@@ -406,14 +444,16 @@ func finishedWeightPush(c MQTT.Client, pubTopic string) {
 }
 
 // 完成车次
-func CompletedTrainNumberPush(c MQTT.Client, pubTopic string) {
+func CompletedTrainNumberPush(c MQTT.Client, pubTopic, date string) {
 	tx := restful.Engine.NewSession()
 	defer tx.Close()
 
-	dataList, err := tx.SQL(`select (select count(1) from downloadedplan  where  DATE_FORMAT(mydate ,'%Y-%m-%d' ) =  DATE_FORMAT(subdate(now(),1),'%Y-%m-%d' )  )  planCar, 
-	(select count(1) from downloadedplan  where  DATE_FORMAT(mydate ,'%Y-%m-%d' ) =  DATE_FORMAT(subdate(now(),1),'%Y-%m-%d' ) and iscompleted = 1 ) CompleteCar ,
-	DATE_FORMAT(subdate(now(),1),'%Y-%m-%d' ) carDate
-	`).Query().List()
+	dataList, err := tx.SQL(`	select (select count(1) from downloadedplan  where  DATE_FORMAT(mydate ,'%Y-%m-%d' ) =  ? and lpplantype in(0,1) )  planCar, 
+	(select count(1) from downloadedplan  where  DATE_FORMAT(mydate ,'%Y-%m-%d' ) =  ? and iscompleted = 1 and lpplantype in(0,1)) CompleteCar ,
+	? carDate,
+	(select   DATE_FORMAT(intime,'%Y-%m-%d %H:%i:%s')  from downloadedplan  where  DATE_FORMAT(mydate ,'%Y-%m-%d' ) =  ? and iscompleted = 1 and lpplantype in(0,1)  order by intime asc limit 1 ) startTime,
+		(select   DATE_FORMAT(intime,'%Y-%m-%d %H:%i:%s')  from downloadedplan  where  DATE_FORMAT(mydate ,'%Y-%m-%d' ) =  ? and iscompleted = 1 and lpplantype in(0,1) and intime is not null order by intime desc limit 1 ) endTime
+	`, date, date, date, date, date).QueryString()
 	if err != nil {
 		logs.Error("feedtempletPush-error-1:", err)
 		return
@@ -423,7 +463,7 @@ func CompletedTrainNumberPush(c MQTT.Client, pubTopic string) {
 		"apiId": "getKPTData",
 		"param": {
 			"resultData": %s,
-			"farmId": %s,       
+			"farmId":  "%s",      
 			"method": "uploadcarnumber",
 			"rowCount": "1"             
 		}

+ 54 - 0
http/handle/api/new_api.go

@@ -5,6 +5,7 @@ import (
 	"strconv"
 	"tmr-watch/middleware"
 	"tmr-watch/service/group"
+	"tmr-watch/service/sheep"
 
 	operationPb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/operation"
 	feedPb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/pasture"
@@ -89,3 +90,56 @@ func FeetTemplateUpgradeNewVersion(c *gin.Context) {
 		Data: &operationPb.Success{Success: true},
 	})
 }
+
+// UpdateTmrGear 更新tmr_gear表数据
+func UpdateTmrGear(c *gin.Context) {
+	var req operationPb.UpdateOrCreateTmrGearRequest
+	if err := ginutil.BindProto(c, &req); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
+
+	if err := valid.ValidateStruct(&req,
+		valid.Field(&req.TmrId, valid.Required),
+		valid.Field(&req.Params, valid.Required),
+	); err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+
+	if err := sheep.UpdateOrCreateTmrGear(c, &req); err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+
+	ginutil.JSONResp(c, &operationPb.CommonOK{
+		Code: http.StatusOK,
+		Msg:  "ok",
+		Data: &operationPb.Success{Success: true},
+	})
+}
+
+func UseGear(c *gin.Context) {
+	var req operationPb.UseGearRequest
+	if err := ginutil.BindProto(c, &req); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
+
+	if err := valid.ValidateStruct(&req,
+		valid.Field(&req.TmrId, valid.Required),
+		valid.Field(&req.Id, valid.Required),
+		valid.Field(&req.TmrId, valid.Required),
+	); err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+
+	data, err := sheep.UseGear(c, &req)
+	if err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+
+	ginutil.JSONResp(c, data)
+}

+ 359 - 16
http/handle/api/ops.go

@@ -28,6 +28,7 @@ import (
 	"github.com/Anderson-Lu/gofasion/gofasion"
 	"github.com/astaxie/beego/logs"
 	"github.com/gin-gonic/gin"
+	"github.com/qichengzx/coordtransform"
 	"github.com/tealeg/xlsx"
 	"github.com/xormplus/xorm"
 )
@@ -705,6 +706,7 @@ func GetReportform(c *gin.Context) {
 	pagecount := fsion.Get("pagecount").ValueDefaultInt(0)
 	parammaps := fsion.Get("parammaps")
 	typea := parammaps.Get("typea").ValueDefaultInt(0) //0 全部  1 理论, 2实际
+	mode := parammaps.Get("mode").ValueDefaultInt(0)
 	logging.Info("GetReportform ", c.Keys, sqlnamestr, parammaps)
 	tx := restful.Engine.NewSession()
 	err := tx.Begin()
@@ -724,7 +726,7 @@ func GetReportform(c *gin.Context) {
 		}
 	}()
 
-	queryData, err := praseReportform(sqlnamestr, parammaps, tx, checked, offset, pagecount, typea)
+	queryData, err := praseReportform(sqlnamestr, parammaps, tx, checked, offset, pagecount, typea, mode)
 	if err != nil {
 		appG.Response(http.StatusOK, e.ERROR, err.Error())
 	} else {
@@ -1144,15 +1146,15 @@ func GetRJSBData(c *gin.Context) {
 				arr, _ := tx.SQL(sql1, s_params1...).QueryString() //获取
 				queryData.(map[string]interface{})["list"].([]map[string]interface{})[index]["arrList"] = arr
 			}
-			// var wg sync.WaitGroup
-			// for _, value := range queryData.(map[string]interface{})["list"].([]map[string]interface{}) {
-			// 	wg.Add(1)
-			// 	go func(value map[string]interface{}) {
-			// 		defer wg.Done()
-			// 		_, err = tx.SQL(`update downloadedplan set  havebutton = 1 where id = ? and pastureid = ? `, value["projuctid"], value["pastureid"]).Execute()
-			// 	}(value)
-			// }
-			// wg.Wait()
+			var wg sync.WaitGroup
+			for _, value := range queryData.(map[string]interface{})["list"].([]map[string]interface{}) {
+				wg.Add(1)
+				go func(value map[string]interface{}) {
+					defer wg.Done()
+					_, err = tx.SQL(`update downloadedplan set  artificial = 2 where id = ? and pastureid = ? `, value["projuctid"], value["pastureid"]).Execute()
+				}(value)
+			}
+			wg.Wait()
 			appG.Response(http.StatusOK, e.SUCCESS, queryData)
 		}
 	} else {
@@ -1203,7 +1205,8 @@ func PostRJSBData(c *gin.Context) {
 	if err != nil {
 		logging.Error("PostRJSBData  err: ", err)
 		msg := geterrmsg(err.Error())
-		appG.Response(http.StatusOK, e.ERROR, msg)
+		// appG.Response(http.StatusOK, e.ERROR, msg)
+		appG.Response(http.StatusOK, e.SUCCESS, msg)
 		return
 	}
 
@@ -1327,6 +1330,11 @@ func PostRJSBDatas(c *gin.Context) {
 			return
 		}
 		parammaps := fsion.Get("parammaps")
+		ID := parammaps.Get("ID").ValueStr()
+		if ID == "" {
+			continue
+		}
+
 		s_params := make([]interface{}, 0)
 		paramslist := strings.Split(p, ",")
 		if len(paramslist) > 0 && p != "" {
@@ -1339,7 +1347,8 @@ func PostRJSBDatas(c *gin.Context) {
 		if err != nil {
 			logging.Error("PostRJSBData  err: ", err)
 			msg := geterrmsg(err.Error())
-			appG.Response(http.StatusOK, e.ERROR, msg)
+			// appG.Response(http.StatusOK, e.ERROR, msg)
+			appG.Response(http.StatusOK, e.SUCCESS, msg)
 			return
 		}
 
@@ -5718,7 +5727,7 @@ join lpplan lpp on lpp.id = lppland.lppid  where lppland.barname = ? and lppland
 					for _, history1 := range historyList {
 						if history1["createdate"].(string) == nextcreatedate && history1["id"].(int64) == history["id"].(int64) &&
 							history1["times"].(int64) == history["times"].(int64) {
-							data[fmt.Sprintf("a%d", times[history["times"]])] = fmt.Sprintf("%v/%v", data[fmt.Sprintf("a%d", times[history["times"]])], history["lweight"])
+							data[fmt.Sprintf("a%d", times[history["times"]])] = fmt.Sprintf("%v/%v", history1["lweight"], history["lweight"])
 							break
 							// exist = true
 						}
@@ -6715,6 +6724,19 @@ func UpdateDailyData(c *gin.Context) {
 
 	tx := restful.Engine.NewSession()
 	defer tx.Close()
+
+	count, err := tx.SQL(`select  count(1)  from  downloadedplan where pid in(select  pid from  downloadedplan where id= ? )  and havebutton = 1   and mydate = ?`, pid, date).Count()
+	if err != nil {
+		logs.Error("UpdateDailyData-error-0:", err)
+		appG.Response(http.StatusOK, e.ERROR, fmt.Sprintf("该计划已开始执行,禁止修改!"))
+		return
+	}
+
+	if count > 0 {
+		appG.Response(http.StatusOK, e.ERROR, fmt.Sprintf("该计划已开始执行,禁止修改!"))
+		return
+	}
+
 	tx.Begin()
 
 	if location == 0 {
@@ -7007,7 +7029,7 @@ func UpdateDailyData(c *gin.Context) {
 
 	}
 
-	err := tx.Commit()
+	err = tx.Commit()
 	if err != nil {
 		logs.Error("UpdateDailyData-error-20:", err)
 		tx.Rollback()
@@ -8521,8 +8543,27 @@ func checkPlan(tx *xorm.Session, fasion map[string]interface{}, CommonParamMap m
 	data := fasion["parammaps"].(map[string]interface{})
 	plancount, err := tx.Table("downloadedplan").Where(" mydate  = ? ", data["startTime"]).Where(" havebutton = 0 ").Where(" lpplantype in(0,1,2) ").Count()
 	fmt.Println(err)
-	plancount1, err := tx.SQL(`select count(1) from (select d.id from downloadedplan d join  downloadplandtl1 d1 on d1.pid = d.id  
-		join downloadplandtl1_exec d1e on d1e.pid = d.id join downloadplandtl2 d2 on d2.pid = d.id  where d.mydate = ? and d.havebutton = 0 and lpplantype in(0,1,2) group by d.id )d `,
+	plancount1, err := tx.SQL(`SELECT
+	count( 1 ) 
+FROM
+	(
+	SELECT
+		d.id 
+	FROM
+		downloadedplan d
+		JOIN downloadplandtl1 d1 ON d1.pid = d.id
+		JOIN downloadplandtl1_exec d1e ON d1e.pid = d.id
+		JOIN downloadplandtl2 d2 ON d2.pid = d.id 
+	WHERE
+		d.mydate = ?
+		AND d.havebutton = 0 
+		AND lpplantype IN ( 0, 1, 2 ) 
+		AND ( SELECT count( 1 ) FROM downloadplandtl2 dd2 WHERE dd2.pid = d.id ) = 
+		( SELECT count( 1 ) FROM downloadplandtl2 dd2   WHERE dd2.pid = d.pid  and (select count(1) from downloadplandtl2  where pid = dd2.pid  and fname = dd2.fname   ) = 1 )
+	GROUP BY
+	d.id 
+	) d 
+	 `,
 		data["startTime"]).Count()
 	fmt.Println(err)
 	if plancount != plancount1 && number < 10 {
@@ -8531,3 +8572,305 @@ func checkPlan(tx *xorm.Session, fasion map[string]interface{}, CommonParamMap m
 		checkPlan(tx, fasion, CommonParamMap, ParamMap, number)
 	}
 }
+
+func EditPlanSort(c *gin.Context) {
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsions := gofasion.NewFasion(string(dataByte))
+	planIdStr := fsions.Get("planId").ValueStr()
+	mydate := fsions.Get("mydate").ValueStr()
+	sort := fsions.Get("sort").ValueStr()
+
+	tx := restful.Engine.NewSession()
+	defer tx.Close()
+
+	tx.Begin()
+
+	type downloadedplan struct {
+		Id   int64 `xorm:"id"`
+		Sort int   `xorm:"sort"`
+		Pid  int64 `xorm:"pid"`
+	}
+	planInfo := new(downloadedplan)
+	err := tx.SQL(`select d.id,d.sort,d.pid from downloadedplan d   where d.id = ? `, planIdStr).GetFirst(planInfo).Error
+	if err != nil {
+		logs.Error(err)
+		appG.Response(http.StatusOK, e.ERROR, "调整计划顺序失败!"+err.Error())
+		tx.Rollback()
+		return
+	}
+	sort1, _ := strconv.Atoi(sort)
+	if sort1 == planInfo.Sort {
+		appG.Response(http.StatusOK, e.ERROR, "计划顺序一致修改失败!")
+		tx.Rollback()
+		return
+	}
+
+	count1, err := tx.SQL(` select count(1) from downloadedplan  where pid =  (select pid from downloadedplan  where sort = ? and mydate = ? )  and mydate = ?    `, sort, mydate, mydate).Count()
+	if err != nil {
+		logs.Error(err)
+		appG.Response(http.StatusOK, e.ERROR, "调整计划顺序失败!"+err.Error())
+		tx.Rollback()
+		return
+	}
+
+	if count1 == 0 {
+		tx.Rollback()
+		logs.Error(err)
+		appG.Response(http.StatusOK, e.ERROR, "您所排序的数值不存在!")
+		return
+	}
+
+	count, err := tx.SQL(` select count(1) from downloadedplan  where pid =  (select pid from downloadedplan  where sort = ? and mydate = ? )  and havebutton = 1  and mydate = ?    `, sort, mydate, mydate).Count()
+	if err != nil {
+		logs.Error(err)
+		appG.Response(http.StatusOK, e.ERROR, "调整计划顺序失败!"+err.Error())
+		tx.Rollback()
+		return
+	}
+
+	if count > 0 {
+		tx.Rollback()
+		logs.Error(err)
+		appG.Response(http.StatusOK, e.ERROR, "调整计划顺序失败,该计划已执行!")
+		return
+	}
+
+	if planInfo.Sort > sort1 {
+		minSortList, err := tx.SQL(`select min(d.sort) sort from downloadedplan d   where d.mydate = ?  and d.pid = (select pid from downloadedplan  where sort = ? and mydate = ? ) `, mydate, sort, mydate).QueryString()
+		if err != nil {
+			logs.Error(err)
+			appG.Response(http.StatusOK, e.ERROR, "调整计划顺序失败!"+err.Error())
+			tx.Rollback()
+			return
+		}
+		var minSort, pidCount int
+		for _, sort := range minSortList {
+			minSort, _ = strconv.Atoi(sort["sort"])
+		}
+
+		planList := make([]*downloadedplan, 0)
+		err = tx.SQL(`select id,d.sort sort,d.pid from downloadedplan d   where d.mydate = ? and  sort >= ? order by sort`, mydate, minSort).Find(&planList)
+		if err != nil {
+			logs.Error(err)
+			appG.Response(http.StatusOK, e.ERROR, "调整计划顺序失败!"+err.Error())
+			tx.Rollback()
+			return
+		}
+
+		planPid := planInfo.Pid
+		planList1 := make([]*downloadedplan, 0)
+		planList2 := make([]*downloadedplan, 0)
+
+		for _, plan := range planList {
+			if plan.Pid == planPid {
+				pidCount++
+				planList1 = append(planList1, plan)
+			} else {
+				planList2 = append(planList2, plan)
+			}
+		}
+		planList1 = append(planList1, planList2...)
+
+		for i, plan := range planList1 {
+			_, err := tx.Exec(` update downloadedplan set sort = ? where id = ? `, minSort+i, plan.Id)
+			if err != nil {
+				logs.Error(err)
+				appG.Response(http.StatusOK, e.ERROR, "修改计划顺序失败!"+err.Error())
+				tx.Rollback()
+				return
+			}
+		}
+	} else {
+		maxSortList, err := tx.SQL(`select max(d.sort) sort from downloadedplan d   where d.mydate = ?  and d.pid = (select pid from downloadedplan  where sort = ? and mydate = ? ) `, mydate, sort, mydate).QueryString()
+		if err != nil {
+			logs.Error(err)
+			appG.Response(http.StatusOK, e.ERROR, "调整计划顺序失败!"+err.Error())
+			tx.Rollback()
+			return
+		}
+		var maxSort int
+		for _, sort := range maxSortList {
+			maxSort, _ = strconv.Atoi(sort["sort"])
+		}
+
+		planList := make([]*downloadedplan, 0)
+		err = tx.SQL(`select id,d.sort sort,d.pid from downloadedplan d   where d.mydate = ? and  sort <= ? order by sort`, mydate, maxSort).Find(&planList)
+		if err != nil {
+			logs.Error(err)
+			appG.Response(http.StatusOK, e.ERROR, "调整计划顺序失败!"+err.Error())
+			tx.Rollback()
+			return
+		}
+
+		planPid := planInfo.Pid
+		planList1 := make([]*downloadedplan, 0)
+		planList2 := make([]*downloadedplan, 0)
+
+		for _, plan := range planList {
+			if plan.Pid == planPid {
+				// pidCount++
+				planList1 = append(planList1, plan)
+			} else {
+				planList2 = append(planList2, plan)
+			}
+		}
+		planList2 = append(planList2, planList1...)
+
+		for i, plan := range planList2 {
+			_, err := tx.Exec(` update downloadedplan set sort = ? where id = ? `, i+1, plan.Id)
+			if err != nil {
+				logs.Error(err)
+				appG.Response(http.StatusOK, e.ERROR, "修改计划顺序失败!"+err.Error())
+				tx.Rollback()
+				return
+			}
+		}
+	}
+
+	err = tx.Commit()
+	if err != nil {
+		logs.Error(err)
+		appG.Response(http.StatusOK, e.ERROR, "修改计划顺序失败!"+err.Error())
+		tx.Rollback()
+		return
+	}
+
+	appG.Response(http.StatusOK, e.SUCCESS, "ok")
+}
+
+func EditDownloadedplanArtificial(c *gin.Context) {
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsions := gofasion.NewFasion(string(dataByte))
+	planIdStr := fsions.Get("planId").ValueStr()
+
+	tx := restful.Engine.NewSession()
+	defer tx.Close()
+	tx.Begin()
+
+	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)
+		if err != nil {
+			logs.Error(err)
+			appG.Response(http.StatusOK, e.ERROR, "修改计划状态失败!"+err.Error())
+			tx.Rollback()
+			return
+		}
+	}
+
+	err := tx.Commit()
+	if err != nil {
+		logs.Error(err)
+		appG.Response(http.StatusOK, e.ERROR, "修改计划状态失败!"+err.Error())
+		tx.Rollback()
+		return
+	}
+
+	appG.Response(http.StatusOK, e.SUCCESS, "ok")
+}
+
+type PlanRFID struct {
+	RFID    string `json:"RFID"`
+	Lweight string `json:"lweight"`
+	Gear    string `json:"gear"`
+	Speed   string `json:"speed"`
+}
+
+func GetPlanRFID(c *gin.Context) {
+	appG := app.Gin{C: c}
+	RFIDStr := c.Query("RFID")
+
+	planRFIDList := make([]*PlanRFID, 0)
+	planRFIDList = append(planRFIDList, &PlanRFID{
+		RFID:    RFIDStr,
+		Lweight: "1411.1",
+		Gear:    "1",
+		Speed:   "10",
+	})
+
+	planRFIDList = append(planRFIDList, &PlanRFID{
+		RFID:    RFIDStr,
+		Lweight: "1322.1",
+		Gear:    "1",
+		Speed:   "10",
+	})
+	planRFIDList = append(planRFIDList, &PlanRFID{
+		RFID:    RFIDStr,
+		Lweight: "1904.1",
+		Gear:    "1",
+		Speed:   "10",
+	})
+	planRFIDList = append(planRFIDList, &PlanRFID{
+		RFID:    RFIDStr,
+		Lweight: "1870.1",
+		Gear:    "1",
+		Speed:   "10",
+	})
+	planRFIDList = append(planRFIDList, &PlanRFID{
+		RFID:    RFIDStr,
+		Lweight: "2041.1",
+		Gear:    "1",
+		Speed:   "10",
+	})
+	appG.Response(http.StatusOK, e.SUCCESS, planRFIDList)
+}
+
+type tmrEquipmentMuster struct {
+	A string
+	N string
+}
+
+func GetTmrEquipmentMuster(c *gin.Context) {
+	appG := app.Gin{C: c}
+	id := c.Query("id")
+
+	tx := restful.Engine.NewSession()
+	defer tx.Close()
+
+	dataList, err := tx.SQL(`  select *  from tmr_equipment_muster where pid = ?  `, id).QueryString()
+	if err != nil {
+		logs.Error(err)
+		appG.Response(http.StatusOK, e.ERROR, err.Error())
+
+		return
+	}
+
+	tmrEquipmentMusterList := make([]*tmrEquipmentMuster, 0)
+
+	for _, data := range dataList {
+		json.Unmarshal([]byte(data["gptjson"]), &tmrEquipmentMusterList)
+		for _, g := range tmrEquipmentMusterList {
+			a, _ := strconv.ParseFloat(g.A, 64)
+			n, _ := strconv.ParseFloat(g.N, 64)
+			a1, n1 := ddmmtoddd(a, n)
+			g.A = fmt.Sprintf("%f", n1)
+			g.N = fmt.Sprintf("%f", a1)
+		}
+	}
+
+	appG.Response(http.StatusOK, e.SUCCESS, tmrEquipmentMusterList)
+}
+
+func ddmmtoddd(lng, lat float64) (float64, float64) {
+	lngDegree := fmt.Sprintf("%f", lng/100)
+	lngDegreefloat, _ := strconv.ParseFloat(strings.Split(lngDegree, ".")[1], 64)
+
+	lngDegreeInt := int(lngDegreefloat * 1000000)
+	dd := lngDegreeInt / 100 * 100 / 60
+	fmt.Println(dd)
+	lngStr := strings.Split(lngDegree, ".")[0] + "." + strings.Replace(fmt.Sprintf("%d", lngDegreeInt/100*100/60), ".", "", 0)
+
+	latDegree := fmt.Sprintf("%f", lat/100)
+	// latDegreeInt, _ := strconv.ParseInt(strings.Split(latDegree, ".")[1], 10, 64)
+
+	latDegreefloat, _ := strconv.ParseFloat(strings.Split(latDegree, ".")[1], 64)
+	latDegreeInt := int(latDegreefloat * 1000000)
+	latStr := strings.Split(latDegree, ".")[0] + "." + strings.Replace(fmt.Sprintf("%d", latDegreeInt/100*100/60), ".", "", 0)
+
+	a, _ := strconv.ParseFloat(lngStr, 64)
+	b, _ := strconv.ParseFloat(latStr, 64)
+	return coordtransform.WGS84toGCJ02(b, a)
+}

+ 1 - 1
http/handle/api/pusher.go

@@ -89,7 +89,7 @@ func GetPusherList(c *gin.Context) {
 		tmr.Date = fmt.Sprintf("%s %s", date, tmr.Date)
 		var barNameList []string
 		for _, bar := range barList {
-			barNameList = append(barNameList, bar.BName+"→")
+			barNameList = append(barNameList, bar.BName)
 		}
 		tmr.BarName = strings.Join(barNameList, ",")
 	}

+ 153 - 3
http/handle/api/report.go

@@ -3,6 +3,7 @@ package api
 import (
 	"encoding/json"
 	"fmt"
+	"math"
 	"sort"
 	"strconv"
 	"strings"
@@ -15,7 +16,7 @@ import (
 )
 
 //包含报表模块前端需要的各种数据格式转换
-func praseReportform(sqlnamestr string, parammaps *gofasion.Fasion, tx *xorm.Session, checked string, offset, count, typea int) (queryData map[string]interface{}, err error) {
+func praseReportform(sqlnamestr string, parammaps *gofasion.Fasion, tx *xorm.Session, checked string, offset, count, typea, mode int) (queryData map[string]interface{}, err error) {
 
 	sql, p := restful.GetSqlByNameDBT(sqlnamestr, tx)
 	s_params := make([]interface{}, 0)
@@ -41,6 +42,7 @@ func praseReportform(sqlnamestr string, parammaps *gofasion.Fasion, tx *xorm.Ses
 	}
 	queryList2, err := tx.SQL(sql2, s_params2...).Query().List()
 	var feednamesort []string
+	var feedcodelist []string
 	if len(queryList2) > 0 {
 		for i := 0; i < len(queryList2); i++ {
 			feednamesort = append(feednamesort, queryList2[i]["fname"].(string))
@@ -59,7 +61,7 @@ func praseReportform(sqlnamestr string, parammaps *gofasion.Fasion, tx *xorm.Ses
 		}
 	}
 	// var queryList3 []map[string]interface{}
-	// queryList3 = make([]map[string]interface{}, 0)
+	feedDataList := make([]map[string]interface{}, 0)
 	var feednamesort3 []string
 	if sql3 != "" {
 		queryList3, err := tx.SQL(sql3, s_params3...).Query().List()
@@ -70,7 +72,9 @@ func praseReportform(sqlnamestr string, parammaps *gofasion.Fasion, tx *xorm.Ses
 		if len(queryList3) > 0 {
 			for z := 0; z < len(queryList3); z++ {
 				feednamesort3 = append(feednamesort3, queryList3[z]["feedname"].(string))
+				feedcodelist = append(feedcodelist, queryList3[z]["feedcode"].(string))
 			}
+			feedDataList = append(feedDataList, queryList3...)
 		}
 	}
 
@@ -125,7 +129,13 @@ func praseReportform(sqlnamestr string, parammaps *gofasion.Fasion, tx *xorm.Ses
 			}
 		}
 		queryListSum, _ := tx.SQL(sql1, s_params1...).Query().List()
-		queryData, err = getAccuracyV4(queryList, queryListSum, checked, feednamesort3, typea)
+		if mode == 0 {
+			queryData, err = getAccuracyV4(queryList, queryListSum, checked, feednamesort3, typea)
+		} else {
+			queryData, _ = getAccuracyV41(queryList, queryListSum, checked, feednamesort3, typea, feedDataList)
+		}
+		queryData["feedcode"] = feedcodelist
+
 	case "getPriceAn":
 		queryData, err = getAccuracyV5(queryList)
 	case "getJT1Accu":
@@ -1255,3 +1265,143 @@ func GetprocessAnalysisTB(parammaps *gofasion.Fasion, tx *xorm.Session, quertDat
 	query1["realWandT"] = realWandT
 	return query1, nil
 }
+
+type Columns struct {
+	Prop  string `json:"prop"`
+	Label string `json:"label"`
+}
+
+func getAccuracyV41(queryList []map[string]interface{}, queryListSum []map[string]interface{}, checked string, feednamesort3 []string, typea int, feednameCodes []map[string]interface{}) (map[string]interface{}, error) {
+	columns := make([]*Columns, 0)
+	columns = append(columns, &Columns{
+		Prop:  "A",
+		Label: "饲料编码",
+	})
+	columns = append(columns, &Columns{
+		Prop:  "B",
+		Label: "饲料名称",
+	})
+
+	label := "类别"
+
+	// column1 := new(Columns)
+
+	columns1 := make([]*Columns, 0)
+	dataList := make([]map[string]interface{}, 0)
+
+	for i := 0; i < len(queryList); i++ {
+		label = queryList[i]["typestr"].(string)
+		exist1 := false
+		for _, data := range dataList {
+			if data["B"].(string) == queryList[i]["feedname"].(string) {
+				exist1 = true
+			}
+		}
+
+		if !exist1 {
+			data1 := make(map[string]interface{}, 0)
+			data2 := make(map[string]interface{}, 0)
+			for _, v := range feednameCodes {
+				if v["feedname"].(string) == queryList[i]["feedname"].(string) {
+					data1["A"] = v["feedcode"]
+					data2["A"] = v["feedcode"]
+					break
+				}
+			}
+			data1["B"] = queryList[i]["feedname"]
+			data1["C"] = "理论"
+			// data1[queryList[i]["fname"].(string)] = 0
+			dataList = append(dataList, data1)
+			data2["B"] = queryList[i]["feedname"]
+			data2["C"] = "实际"
+			// data2[queryList[i]["fname"].(string)] = 0
+			dataList = append(dataList, data2)
+		}
+
+		column := new(Columns)
+		column.Prop = queryList[i]["fname"].(string)
+		column.Label = queryList[i]["fname"].(string)
+
+		exist := false
+		for _, c := range columns1 {
+			if c.Prop == queryList[i]["fname"].(string) {
+				exist = true
+			}
+		}
+		if exist {
+			continue
+		}
+		columns1 = append(columns1, column)
+	}
+
+	for _, data := range dataList {
+		for _, c := range columns1 {
+			data[c.Prop] = 0
+		}
+	}
+
+	data1 := make(map[string]interface{}, 0)
+	data2 := make(map[string]interface{}, 0)
+	data1["B"] = "合计"
+	data1["C"] = "理论"
+	data2["B"] = "合计"
+	data2["C"] = "实际"
+
+	for _, c := range columns1 {
+		if c.Prop != "合计" {
+			data1[c.Prop] = 0.0
+			data2[c.Prop] = 0.0
+		}
+	}
+
+	columns = append(columns, &Columns{
+		Prop:  "C",
+		Label: label,
+	})
+
+	columns = append(columns, columns1...)
+	for _, data := range dataList {
+		for i := 0; i < len(queryList); i++ {
+			if queryList[i]["feedname"].(string) == data["B"] {
+				if data["C"].(string) == "理论" {
+					f1, _ := strconv.ParseFloat(fmt.Sprintf("%v", queryList[i]["lweight"]), 64)
+					data[queryList[i]["fname"].(string)] = Round(f1, 2)
+				} else {
+					if queryList[i]["actualweightminus"] == nil {
+						data[queryList[i]["fname"].(string)] = 0.0
+					} else {
+						f1, _ := strconv.ParseFloat(fmt.Sprintf("%v", queryList[i]["actualweightminus"]), 64)
+						data[queryList[i]["fname"].(string)] = Round(f1, 2)
+					}
+				}
+			}
+		}
+	}
+
+	for _, data := range dataList {
+		for _, c := range columns1 {
+			if c.Prop != "合计" {
+				if data["C"].(string) == "理论" {
+					f1, _ := strconv.ParseFloat(fmt.Sprintf("%v", data1[c.Prop]), 64)
+					f2, _ := strconv.ParseFloat(fmt.Sprintf("%v", data[c.Prop]), 64)
+					data1[c.Prop] = Round(f1+f2, 2)
+				} else {
+					f1, _ := strconv.ParseFloat(fmt.Sprintf("%v", data2[c.Prop]), 64)
+					f2, _ := strconv.ParseFloat(fmt.Sprintf("%v", data[c.Prop]), 64)
+					data2[c.Prop] = Round(f1+f2, 2)
+				}
+			}
+		}
+	}
+	dataList = append(dataList, data1)
+	dataList = append(dataList, data2)
+
+	respData := make(map[string]interface{})
+	respData["data"] = dataList
+	respData["columns"] = columns
+	return respData, nil
+}
+
+func Round(number float64, size int) float64 {
+	return math.Round(number*100) / 100
+}

+ 39 - 8
http/handle/api/scheduled.go

@@ -129,20 +129,20 @@ func CronScheduled(ctx context.Context) {
 		}
 	})
 	dayCron.Start()
-
+	// udFeedSync(pastureinfo)
 	// //圣牧自动同步前天有进行中的任务
-	manualUdData(pastureinfo)
-
+	// manualUdData(pastureinfo)
+	// gm.GmUdSync(pastureinfo.Pastureid, pastureinfo.Werks)
 	// xdmy := cron.New()
-	// err = xdmy.AddFunc("0 10 4 * * *", func() {
-	// 	//现代牧业sap同步
+	// err = xdmy.AddFunc("0 30 8 * * *", func() {
+	// 	// 	//现代牧业sap同步
 	// 	// sap.SyncMaterialOutbound()
-	// 	// 光明ud同步
-	// 	fmt.Println(time.Now())
+	// 	// 	// 光明ud同步
+	// 	// 	fmt.Println(time.Now())
 	// 	gm.GmUdSync(pastureinfo.Pastureid, pastureinfo.Werks)
 	// })
 	// xdmy.Start()
-
+	// InitMqttClient()
 }
 
 type ScheduledInfo struct {
@@ -657,6 +657,7 @@ func (h *ScheduledDown) SyncFeed(pastureid string, feedList []interface{}) {
 		insertSql := `insert into feed(id,pastureid,feedcode,fname,fclassid,fclass,dry)VALUES(?,?,?,?,?,?,?) 
 		ON DUPLICATE KEY UPDATE fname = ? ,dry = ? `
 		_, err = tx.SQL(insertSql, ids, pastureid, feedcode, fname, fclassid, fclass, dry, fname, dry).Execute()
+		fmt.Println(feedcode, fname, fclassid)
 		if err != nil {
 			tx.Rollback()
 			logs.Error("syncFeed-error-5:", err)
@@ -1130,6 +1131,7 @@ func manualUdData(pastureinfo *udPastureInfo) {
 	c3 := cron.New()
 	c3.AddFunc("59 23 * * *", func() {
 		udFeedpSync(pastureinfo)
+		udFeedSync(pastureinfo)
 	})
 	c3.Start()
 
@@ -1799,3 +1801,32 @@ func UdFeedpSync(c *gin.Context) {
 	appG.Response(http.StatusOK, e.SUCCESS, true)
 	// return
 }
+
+func udFeedSync(pastureinfo *udPastureInfo) error {
+	tx := restful.Engine.NewSession()
+	defer tx.Close()
+
+	downList := make([]*ScheduledDownInfo, 0)
+	down := tx.Table("scheduled_down")
+
+	down.Where("company = ? ", "ud")
+	down.Where("methods = ? ", "SyncFeed")
+	err := down.Find(&downList)
+	if err != nil {
+		log.Println("UpdateDown-error-1: ", err)
+		return err
+	}
+
+	for _, item := range downList {
+		list := httpGetMC(item.Addres, item.Targetdata)
+		if item.Methods != "" {
+			s := ScheduledDown{}
+			value := reflect.ValueOf(&s)
+			f := value.MethodByName(item.Methods)
+			f.Call([]reflect.Value{reflect.ValueOf(pastureinfo.Pastureid), reflect.ValueOf(list)})
+
+		}
+
+	}
+	return nil
+}

+ 24 - 19
http/handle/gm/udservice.go

@@ -20,13 +20,13 @@ import (
 // "../../../routers/restful"
 // http://172.16.86.95:8080/copartner_downloads?equipmentId=48ffa4de-7870-4b18-a052-9f8d3a46089a&farmId=ef275fb06fd847d88422517773e5a616&method=downloadpen
 func GmUdSync(pastureId, farmId string) {
-	UdBarSync(pastureId, farmId)
-	UdFeedSync(pastureId, farmId)
-
+	UdMaterialIssuePush(pastureId, farmId, "")
 	UdFeedtempletPush(pastureId, farmId, "")
 	UdUtirPush(pastureId, farmId, "")
 	UdBarFeedRemainPush(pastureId, farmId, "")
-	UdMaterialIssuePush(pastureId, farmId, "")
+
+	UdBarSync(pastureId, farmId)
+	UdFeedSync(pastureId, farmId)
 }
 
 func UdBarSync(pastureId, farmId string) {
@@ -49,11 +49,13 @@ func UdBarSync(pastureId, farmId string) {
 			barname := bar["barname"].(string)
 			count, _ := tx.Table("bar").Where("pastureId = ? ", pastureId).Count()
 			barExist, _ := tx.SQL(` select count(1) from bar where bcode = ? `, bar["barcode"]).Exist()
-			tx.Exec(`insert into bar(pastureid,bcode,bname,sort)values(?,?,?,?)   ON DUPLICATE KEY UPDATE  bname = ? `, pastureId, bar["barcode"], barname, count+1, barname)
-			_, _ = tx.Exec(`insert into feedp(pastureid,barid,barname,softccount,ccount,udcode,udname)values(?,(select id from bar where bcode=  ? and pastureId = ? ),?,?,?,?,?)
-		 ON DUPLICATE KEY UPDATE  softccount = ? , udcode =? ,udname =?`,
-				pastureId, bar["barcode"], pastureId, barname, bar["cowcount"], bar["cowcount"], bar["barcode"], barname, bar["cowcount"], bar["barcode"], barname)
-			fmt.Println(bar["barcode"], barname)
+			_, err := tx.Exec(`insert into bar(pastureid,bcode,bname,sort)values(?,?,?,?)   ON DUPLICATE KEY UPDATE  bname = ?,udname = ?  `, pastureId, bar["barcode"], barname, count+1, barname, barname)
+			_, err = tx.Exec(`insert into feedp(pastureid,barid,barname,softccount,ccount)values(?,(select id from bar where bcode=  concat(?) and pastureId = ? ),?,?,?)
+		 ON DUPLICATE KEY UPDATE  softccount = ?  `,
+				//  tx.Exec(`update bar  `, pastureId, bar["barcode"], barname, count+1, barname, barname)
+
+				pastureId, bar["barcode"], pastureId, barname, bar["cowcount"], bar["cowcount"], bar["cowcount"])
+			fmt.Println(bar["barcode"], barname, bar["cowcount"], pastureId, err)
 			if !barExist {
 				tx.Exec(`insert into fpdetail(pastureId,barid,weight,ptsrate,times,barname) values(?,(select id from bar where bcode=  ? and pastureId = ? ),0,0,?,?)`,
 					pastureId, bar["barcode"], 1, barname)
@@ -164,24 +166,26 @@ func UdUtirPush(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')  loadDate,d.times loadShift,d.datacaptureno  tmrNo,ft.tcode recipeId,ft.ccname recipeName,if(d1.feedcode = -1 ,d1.fid,f.feedcode) ingId,ifnull(ifnull(f.udname,f.fname),d1.fname)  ingName,
+	dataList, err := tx.SQL(`select date_format(d1.date,'%Y-%m-%d')  dropDate,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,
 	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 ,ifnull(d1.lweight,'') expWeight,ifnull(d1.actualweightminus,'') actualWeight,
+	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,
 	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 
 WHERE  d1.date=d2.mydate AND d1.pastureid = d2.pastureid AND d2.id=d1.pid)
 ), '%Y-%m-%d %H:%i:%s') 
    startTime  ,
-	 date_format(d1.intime,'%Y-%m-%d %H:%i:%s')   endTime, d.tmrtname tmrName , d.pid id ,ifnull(ftd.sort,"") premixFeedSort ,
-	ifnull( (select id from feed where id = ftd.fid),"") premixFeedId,ifnull(ftd.fname,"")  premixFeedName,
-	ifnull(ftd.fweight / (select sum(fweight)  from ftdetaildate  where  date =  d1.date and ftid = d1.fid ) *  d1.actualweightminus,"") premixFeedWeight
+	 date_format(d1.intime,'%Y-%m-%d %H:%i:%s')   endTime, driver.drivername tmrName ,d1.feedallowratio allowable_error
 	from downloadplandtl1  d1 join  downloadedplan d on d.id = d1.pid
 	left join feedtempletdate ft  on ft.id = d.tempid  and ft.date = d1.date
 	left join feed f on f.feedcode  = d1.feedcode
 	left join feedclass fc on fc.id = f.fclassid
 	left join ftdetaildate  ftd  on  ftd.date =  d1.date and ftd.ftid = d1.fid
-	where d1.date = ?  and d.havebutton = 1`, now).Query().List()
+	join tmr t on t.id = d.tmrid 
+	left driver on driver.drivercode = t.eqcode
+	where d1.date = DATE_FORMAT(subdate(now(),1) ,'%Y-%m-%d' ) and d.havebutton = 1 and d1.type = 0 `, now).Query().List()
 	if err != nil {
 		logging.Error(err)
 		return err
@@ -222,7 +226,7 @@ func UdMaterialIssuePush(pastureId, farmId, date string) error {
 	}
 
 	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,ft.tname feedtempletName ,
+	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,
@@ -252,7 +256,7 @@ 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')
   premixFeedWeight
 	
 	from  downloadedplan d
@@ -263,8 +267,9 @@ d1.actualweightminus*IF(ftd.id IS NULL,1,ftd.fweight/(SELECT SUM(ftd2.fweight) F
 	LEFT JOIN feedp fp on d2.FBarID=fp.barid
 	left 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           
-		left join ftdetaildate  ftd  on  ftd.date =  d1.date and ftd.ftid = d1.fid
+	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 d.havebutton = 1  and d.pastureid = ?  and d1.fname is not null  order by tmrno   `, now, now, pastureId).Query().List()
 	if err != nil {

+ 8 - 0
http/routers/app_api.go

@@ -226,6 +226,11 @@ func AppAPI(opts ...func(engine *gin.Engine)) func(s *gin.Engine) {
 
 			apiV1.POST("/feedtemplet/del", api.DelFeedTemplet)
 
+			apiV1.POST("/plan/sort/edit", api.EditPlanSort)
+			//日执行计划修改为完成
+			apiV1.POST("/plan/artificial/edit", api.EditDownloadedplanArtificial)
+
+			apiV1.GET("/equipment/muster", api.GetTmrEquipmentMuster)
 		}
 
 		//不需要登录验证的接口
@@ -242,6 +247,9 @@ func AppAPI(opts ...func(engine *gin.Engine)) func(s *gin.Engine) {
 			apiV3.GET("/pusher/list", api.GetPusherList)
 			apiV3.POST("/pusher/edit", api.EditPusherGPS)
 
+			//羊圈通过RFID 需要传输的值:
+			apiV3.GET("/plan/rfid", api.GetPlanRFID)
+
 		}
 
 		apiV4 := s.Group("/customreport") // restful  接口 tablename 是 表名字

+ 2 - 0
http/routers/new_api.go

@@ -15,5 +15,7 @@ func NewAPI(opts ...func(engine *gin.Engine)) func(s *gin.Engine) {
 		newApiGroup.POST("feet_template/list", api.SearchFeetTemplateList)
 		newApiGroup.POST("feet_template/version", api.GetFeetTemplateVersion)
 		newApiGroup.POST("feet_template/upgrade", api.FeetTemplateUpgradeNewVersion)
+		newApiGroup.POST("tmr/gear", api.UpdateTmrGear)
+		newApiGroup.POST("user/gear", api.UseGear)
 	}
 }

+ 153 - 0
migration/v0002_yq_bar.sql

@@ -0,0 +1,153 @@
+# 新增圈舍名称字段pen和长度length字段
+UPDATE apisql SET sqlstr = 'SELECT
+bcode,bname,allowratio,autozone,autosecond,isstart,
+begintag,endtag,sort,enable,autosecondname,length,pen,
+TRIM(id) id,
+TRIM(pastureid)pastureid,
+udcode,udname
+FROM
+  bar
+WHERE pastureid = ?
+ AND ( bname LIKE CONCAT(''%'',?,''%'')  OR ? = '''')
+ AND ( bcode LIKE CONCAT(''%'',?,''%'')  OR ? = '''')
+ AND ( pen LIKE CONCAT(''%'',?,''%'')  OR ? = '''')
+ AND (allowratio = ? OR ? = '''')
+ AND (enable =? OR ? = '''')
+ AND (autozone= ? OR ? = '''')
+ AND (autosecond = ? OR ? = '''')
+ORDER BY sort ',
+params = 'pastureid,bname,bname,bcode ,bcode,pen,pen ,allowratio ,allowratio ,enable ,enable,autozone,autozone,autosecond,autosecond'
+where sqlname = 'getBarList' and enable = 1;
+
+
+# 新增圈舍名称字段pen和长度length字段
+UPDATE apisql SET sqlstr = '
+update bar set bcode=? ,bname=?,allowratio=? ,autozone=?,autosecond=?,autosecondname=?,isstart=? ,enable=?,AUFNR = ?,pen = ?,length = ?
+where pastureid=? and id=?',
+params = 'bcode,bname,allowratio,autozone,autosecond,autosecondname,isstart,enable,AUFNR,pen,length,pastureid,id'
+where sqlname = 'updateBar' and enable = 1;
+
+# 新增speend 车速字段
+UPDATE apisql SET sqlstr ="SELECT 0 islock,
+eqcode,tname,datacaptureno,trim(tclassid) tclassid,
+(SELECT dictlist.label FROM dictlist JOIN dict ON dict.id=dictlist.pid WHERE dict.name='TMR设备类型' AND dict.ENABLE=1  and dictlist .enable=1  and value = tclassid) as tclassname,
+maxstirfeed,remark,enable,TRIM(id) id,TRIM(pastureid)pastureid,
+tcolor,imei,ifnull(datainterface,1),autozone,autosecond,if(autosecondname= '' or autosecondname is null,'禁用',autosecondname ) autosecondname,(select pasture_name from pasture where pastureid = tmr.pastureid) as pasturename,
+ifnull(gps,'')  gps ,volume,speed,
+TRIM(TRAILING ''.'' FROM TRIM(TRAILING ''0'' FROM FORMAT(volume_rate, 20))) AS volume_rate
+FROM
+  tmr
+WHERE pastureid = ?  and  if(?=0,tclassid in (0,6,7),tclassid in (1,2,3,4))
+  AND (tmr.eqcode LIKE CONCAT('%',?,'%')  OR ? = '')
+ AND (tmr.tclassname =? OR ? = '')
+AND (tmr.tname =? OR ? = '')
+  AND (tmr.enable =? OR ? = '')  AND (tmr.imei =? OR ? = '')
+ORDER BY tmr.id DESC",params = 'pastureid,eqtype,eqcode,eqcode,classname,classname,tname,tname,enable,enable,imei,imei'
+where sqlname = 'getTmrList' and enable = 1;
+
+# 新增speend 车速字段
+update  apisql SET sqlstr ="update tmr join dictlist  JOIN `dict` ON `dict`.`id`=dictlist.`pid` set eqcode=? ,tname=? ,datacaptureno=?,tclassid=?,tclassname=? ,maxstirfeed=?,tmr.enable=?,remark=? ,tcolor = ?,imei=?,datainterface=?,autozone=if(?='',null,?),autosecond=if(?='',null,?),  autosecondname=dictlist.label,gps = ?,volume = ?,speed = ifnull(?,0), volume_rate = ? where tmr.pastureid=? and tmr.id= ? and `dict`.`name`='跳转延时' AND `dict`.ENABLE=1  and dictlist.enable=1 and  dictlist.`value` =? ",
+params = 'eqcode,tname,datacaptureno,tclassid,tclassname,maxstirfeed,enable,remark,tcolor,imei,datainterface,autozone,autozone,autosecond,autosecond,gps,volume,speed,volume_rate,pastureid,id,autosecond'
+where sqlname = 'updateTMR' and enable = 1;
+
+# 新增TMR设备撒料档位操作
+insert into apisql(sqlname,sqlstr,params) values ('getTmrGearList','select * from tmr_gear where tmr_id = ? order by rev', 'tmrId');
+
+# 新增圈舍下拉框列表数据
+insert into apisql(sqlname,sqlstr,params) values ('getPenList','select id,pen from bar where pastureid = ? and enable = 1 and isdelete = 0 and pen is not null group by pen order by sort', 'pastureid');
+
+ALTER TABLE `tmr`  ADD COLUMN `volume_rate` decimal(12,5) NOT NULL COMMENT '撒料机每转体积';
+
+# 新增圈舍
+update apisql SET sqlstr = "INSERT INTO bar
+(pastureid,bcode,bname,allowratio,autozone,autosecond,autosecondname,isstart,enable,sort,AUFNR,pen,length)
+VALUES (?,?,?,?,?,?,?,?,?,( select max(b.sort) + 1 from bar b where b.pastureid = ? ),?,?,?)",
+params = 'pastureid,bcode,bname,allowratio,autozone,autosecond,autosecondname,isstart,enable,pastureid,AUFNR,pen,length'
+where sqlname = 'insertBar' and enable = 1;
+
+# 修改栏舍索引
+delete table from bar;
+
+# 新建栏舍表
+CREATE TABLE `bar` (
+    `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '栏舍id',
+    `pastureid` BIGINT(20) UNSIGNED NOT NULL COMMENT '牧场id',
+    `bcode` VARCHAR(50) DEFAULT NULL COMMENT '栏舍编号',
+    `bname` VARCHAR(200) NOT NULL COMMENT '栏舍名称',
+    `allowratio` INT(11) DEFAULT 0 COMMENT '允许误差数',
+    `autozone` INT(11) DEFAULT 0 COMMENT '跳转重量域(kg)',
+    `autosecond` INT(4) DEFAULT 0 COMMENT '跳转延时值',
+    `autosecondname` VARCHAR(50) DEFAULT NULL COMMENT '跳转延时名称',
+    `isstart` TINYINT(1) DEFAULT 1 COMMENT '确认开始',
+    `begintag` INT(11) DEFAULT NULL,
+    `endtag` INT(11) DEFAULT NULL,
+    `sort` INT(11) DEFAULT 0 COMMENT '排序',
+    `enable` TINYINT(1) DEFAULT 1 COMMENT '是否启用',
+    `isdelete` TINYINT(1) DEFAULT 0 COMMENT '是否删除(0为未删除,1为伪删除)',
+    `backup1` VARCHAR(255) DEFAULT NULL COMMENT '备用1',
+    `backup2` VARCHAR(255) DEFAULT NULL COMMENT '备用2',
+    `AUFNR` VARCHAR(50) DEFAULT NULL COMMENT 'sap牛群订单行号',
+    `class` VARCHAR(50) DEFAULT NULL COMMENT '牛舍类型',
+    `classcode` VARCHAR(50) DEFAULT NULL COMMENT '牛舍类型编码',
+    `cattle` VARCHAR(50) DEFAULT NULL COMMENT '牛群',
+    `cattlecode` VARCHAR(50) DEFAULT NULL COMMENT '牛群编码',
+    `sapCode` VARCHAR(50) DEFAULT NULL,
+    `udcode` VARCHAR(50) DEFAULT NULL,
+    `udname` VARCHAR(50) DEFAULT NULL,
+    `length` DECIMAL(12,0) NOT NULL DEFAULT 0 COMMENT '栏舍长度',
+    `pen` VARCHAR(30) DEFAULT NULL COMMENT '圈舍',
+    PRIMARY KEY (`id`) USING BTREE,
+    UNIQUE KEY `ind_pastureId_bname` (`pastureid`,`bname`)
+) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb3 ROW_FORMAT=DYNAMIC COMMENT='栏舍';
+
+# 删除tmr表
+delete table from tmr;
+
+CREATE TABLE `tmr` (
+    `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'tmr',
+    `pastureid` BIGINT(20) UNSIGNED NOT NULL,
+    `eqcode` CHAR(20) DEFAULT NULL COMMENT 'tmr设备编号',
+    `tname` VARCHAR(20) NOT NULL COMMENT 'tmr车名称',
+    `datacaptureno` INT(11) NOT NULL DEFAULT 0 COMMENT '数据采集卡编号',
+    `tclassid` BIGINT(20) NOT NULL COMMENT 'tmr设备类型',
+    `tclassname` VARCHAR(50) DEFAULT NULL,
+    `ttype` TINYINT(4) DEFAULT NULL COMMENT '设备类型 0铲车,1tmr,3撒料设备,4小料',
+    `maxstirfeed` INT(11) DEFAULT 0 COMMENT '最大搅料量(kg)(默认0)',
+    `sort` INT(11) NOT NULL DEFAULT 0 COMMENT '顺序',
+    `enable` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '启用',
+    `inorout` SMALLINT(1) NOT NULL DEFAULT 0 COMMENT '当前是否撒料(默认2车不在使用,1撒料,0是做料)',
+    `projid` BIGINT(20) DEFAULT 0 COMMENT '当前执行计划',
+    `lastsort` VARCHAR(20) DEFAULT NULL COMMENT '上一个料',
+    `lastweight` DECIMAL(20,3) DEFAULT NULL COMMENT '上次目标重量',
+    `lastbuttontime` DATETIME DEFAULT NULL COMMENT '上次执行时间',
+    `nextsort` BIGINT(20) DEFAULT 0 COMMENT '下一个料',
+    `nextweight` DECIMAL(20,3) DEFAULT NULL COMMENT '下次目标重量',
+    `issounding` INT(11) DEFAULT 0,
+    `tcolor` VARCHAR(50) DEFAULT '#ccc',
+    `remark` VARCHAR(255) DEFAULT NULL COMMENT '备注',
+    `imei` VARCHAR(255) DEFAULT NULL COMMENT 'imei唯一标识',
+    `datainterface` VARCHAR(255) DEFAULT NULL COMMENT '数据接口',
+    `autozone` INT(11) DEFAULT NULL COMMENT '跳转重量(kg',
+    `autosecond` INT(11) DEFAULT NULL COMMENT '跳转延时值',
+    `autosecondname` VARCHAR(50) DEFAULT NULL COMMENT '跳转延时名称',
+    `lastinorout` INT(1) DEFAULT 0,
+    `gps` VARCHAR(50) DEFAULT NULL,
+    `volume` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '容积',
+    `speed` DECIMAL(12,0) NOT NULL DEFAULT 0 COMMENT '速度',
+    `volume_rate` DECIMAL(12,5) NOT NULL COMMENT '撒料机每转体积',
+    PRIMARY KEY (`id`) USING BTREE,
+    UNIQUE KEY `tmr_datacaptureno` (`datacaptureno`,`pastureid`) USING BTREE,
+    UNIQUE KEY `tmr_tname` (`pastureid`,`tname`,`ttype`) USING BTREE,
+    UNIQUE KEY `tmr_eqcode` (`pastureid`,`eqcode`,`ttype`) USING BTREE
+) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb3 COMMENT='TMR设备表';
+
+# 新增TMR 栏舍表
+update apisql SET sqlstr = "INSERT INTO tmr(pastureid,eqcode,tname,datacaptureno,tclassid,tclassname,maxstirfeed,
+                `enable`,remark,ttype,tcolor,imei,datainterface,autozone,autosecond,autosecondname,gps,volume,speed,volume_rate)
+VALUES (?,?,?,?,?,?,?,?,?,if(?<>0,1,0),?,if(?='''',null,?),?,if(?='''',null,?),if(?='''',null,?),?,?,?,ifnull(?,0),?)",
+params = 'pastureid,eqcode,tname,datacaptureno,tclassid,tclassname,maxstirfeed,enable,remark,tclassid,tcolor,imei,imei,datainterface,autozone,autozone,autosecond,autosecond,autosecondname,gps,volume,speed,volume_rate'
+where sqlname = 'insertTmr' and enable = 1;
+
+update apisql SET sqlstr = "SELECT bname,TRIM(id) id FROM bar WHERE pastureid = ? and pen = ? and enable=1 ORDER BY id DESC",
+                  params = "pastureid,pen"
+where sqlname = 'getBarListEnable' and enable = 1;

+ 52 - 0
models/tmr_gear.go

@@ -0,0 +1,52 @@
+package models
+
+import (
+	"fmt"
+	operationPb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/operation"
+	"sort"
+	"time"
+)
+
+type TmrGear struct {
+	Id        int64  `json:"id"`
+	TmrId     int64  `json:"tmr_id"`
+	Gear      string `json:"name"`
+	Rev       int64  `json:"rev"`
+	CreatedAt int64  `json:"created_at"`
+	UpdatedAt int64  `json:"updated_at"`
+}
+
+func (t *TmrGear) TableName() string {
+	return "tmr_gear"
+}
+
+func NewTmrGearList(tmrId int64, req *operationPb.UpdateOrCreateTmrGearRequest) []*TmrGear {
+	sort.Slice(req.Params, func(i, j int) bool {
+		return req.Params[i].Rev < req.Params[j].Rev
+	})
+	res := make([]*TmrGear, len(req.Params))
+	for i, v := range req.Params {
+		res[i] = &TmrGear{
+			TmrId:     tmrId,
+			Gear:      fmt.Sprintf("%d", i+1),
+			Rev:       int64(v.Rev),
+			CreatedAt: time.Now().Unix(),
+			UpdatedAt: time.Now().Unix(),
+		}
+	}
+	return res
+}
+
+type TmrGearDetail struct {
+	BCode    string  `json:"bcode"`
+	CCount   int32   `json:"ccount"`
+	FName    string  `json:"fname"`
+	GearRate float64 `json:"gear_rate"`
+	Length   int32   `json:"length"`
+	Sort     int32   `json:"sort"`
+	Speed    float64 `json:"speed"`
+	UseInBar string  `json:"useinbar"`
+	Weight   float64 `json:"weight"`
+	Pid      int64   `json:"pid"`
+	FBarid   int64   `json:"fbarid"`
+}

+ 131 - 0
module/sheep.go

@@ -0,0 +1,131 @@
+package module
+
+import (
+	"context"
+	"errors"
+	"fmt"
+	operationPb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/operation"
+	"gitee.com/xuyiping_admin/pkg/xerr"
+	"github.com/xormplus/xorm"
+	"go.uber.org/zap"
+	"strconv"
+	"tmr-watch/http/handle/restful"
+	"tmr-watch/models"
+	"tmr-watch/pkg/logger/zaplog"
+)
+
+// SearchTrmGearByTmrId 查询撒料电机档位数据
+func SearchTrmGearByTmrId(ctx context.Context, tmrId int64) ([]*models.TmrGear, error) {
+	res := make([]*models.TmrGear, 0)
+	if err := restful.Engine.NewSession().Table(new(models.TmrGear).TableName()).
+		Where("tmr_id = ?", tmrId).Find(&res); err != nil {
+		if !errors.Is(err, xorm.ErrNotExist) {
+			return nil, err
+		}
+	}
+	return res, nil
+}
+
+func CreateOrUpdateTmrGear(ctx context.Context, req *operationPb.UpdateOrCreateTmrGearRequest) error {
+	tmrId, _ := strconv.ParseInt(req.TmrId, 10, 64)
+	tmrGearList, err := SearchTrmGearByTmrId(ctx, tmrId)
+	if err != nil {
+		return xerr.WithStack(err)
+	}
+
+	tx := restful.Engine.NewSession()
+	defer tx.Close()
+
+	if err = tx.Begin(); err != nil {
+		return xerr.WithStack(err)
+	}
+
+	if len(tmrGearList) >= 1 {
+		if _, err = tx.Table(new(models.TmrGear).TableName()).Where("tmr_id = ?", req.TmrId).Delete(new(models.TmrGear)); err != nil {
+			tx.Rollback()
+			return xerr.WithStack(err)
+		}
+	}
+
+	newTmrGearList := models.NewTmrGearList(tmrId, req)
+	if _, err = tx.Table(new(models.TmrGear).TableName()).Insert(newTmrGearList); err != nil {
+		tx.Rollback()
+		return xerr.WithStack(err)
+	}
+	return tx.Commit()
+}
+
+func UseTmrGear(ctx context.Context, req *operationPb.UseGearRequest) ([]*models.TmrGearDetail, error) {
+	sqlName := fmt.Sprintf(
+		`SELECT sort,fname,weight,length,bcode,ccount,speed,gear_rate,useinbar,pid,fbarid FROM 
+		(SELECT a.sort,a.fname,a.lweight weight,a.fpid, IF(a.useinbartype=0,'转投剩料', IF(a.useinbartype=1,'撒','继续饲喂') ) useinbar, 
+		CONCAT(a.fbarid) fbarid,
+		CONCAT(a.pid) pid,
+		b.bcode,
+		b.length,
+		c.cowcount AS ccount,
+		ROUND( c.ccountradio * c.cowcount / 100, 2 ) ccountratio,
+		d.speed,
+		(((a.lweight /  b.length) * f.volume) / d.volume_rate) / (1 / (d.speed * 1000 / 3600)) * 60  AS gear_rate 
+		FROM  downloadplandtl2 a  
+		JOIN bar b ON a.fbarid = b.id  
+		JOIN fpdetaildate c ON c.barid = a.fbarid  
+		JOIN downloadedplan g ON a.pid = g.id  
+		JOIN tmr d ON d.id = g.tmrid  
+		JOIN feedtemplet f ON a.feedtempletid = f.id
+		WHERE a.pastureid = %s
+		AND a.pid= %s
+		AND d.id = %d
+        GROUP BY a.sort
+		ORDER BY a.sort
+	) AS B`, req.PastureId, req.Id, req.TmrId)
+
+	tx := restful.Engine.NewSession()
+	defer tx.Close()
+
+	resultList, err := tx.QueryString(sqlName)
+	if err != nil {
+		return nil, xerr.WithStack(err)
+	}
+
+	zaplog.Info("UseTmrGear", zap.Any("resultList", resultList), zap.Any("sqlName", sqlName))
+
+	tmrGearDetailList := make([]*models.TmrGearDetail, 0)
+	for _, v := range resultList {
+		sort, _ := strconv.ParseInt(v["sort"], 10, 64)
+		fname := v["fname"]
+		bcode := v["bcode"]
+		weight, _ := strconv.ParseFloat(v["weight"], 64)
+		length, _ := strconv.ParseInt(v["length"], 10, 64)
+		ccount, _ := strconv.ParseInt(v["ccount"], 10, 64)
+		speed, _ := strconv.ParseFloat(v["speed"], 64)
+		gearRate, _ := strconv.ParseFloat(v["gear_rate"], 64)
+		pid, _ := strconv.ParseInt(v["pid"], 10, 64)
+		fbarid, _ := strconv.ParseInt(v["fbarid"], 10, 64)
+		tmrGearDetailList = append(tmrGearDetailList, &models.TmrGearDetail{
+			Sort:     int32(sort),
+			FName:    fname,
+			Weight:   weight,
+			Length:   int32(length),
+			BCode:    bcode,
+			CCount:   int32(ccount),
+			Speed:    speed,
+			GearRate: gearRate,
+			Pid:      pid,
+			FBarid:   fbarid,
+		})
+	}
+
+	return tmrGearDetailList, nil
+}
+
+func TmrGearListByTmrId(tmrId int64) ([]*models.TmrGear, error) {
+	tmrGearList := make([]*models.TmrGear, 0)
+	tx := restful.Engine.NewSession()
+	defer tx.Close()
+	err := tx.Table(new(models.TmrGear).TableName()).Where("tmr_id = ?", tmrId).Select("*").Find(&tmrGearList)
+	if err != nil {
+		return nil, xerr.WithStack(err)
+	}
+	return tmrGearList, nil
+}

+ 84 - 0
service/sheep/tmr_gear.go

@@ -0,0 +1,84 @@
+package sheep
+
+import (
+	"context"
+	operationPb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/operation"
+	"gitee.com/xuyiping_admin/pkg/xerr"
+	"net/http"
+	"tmr-watch/module"
+)
+
+func UpdateOrCreateTmrGear(ctx context.Context, req *operationPb.UpdateOrCreateTmrGearRequest) error {
+	if len(req.Params) <= 0 {
+		return xerr.Customf("参数错误: params")
+	}
+
+	if len(req.TmrId) <= 0 {
+		return xerr.Customf("参数错误: tmr_id")
+	}
+	revList := make(map[int32]struct{})
+	for _, v := range req.Params {
+		if _, ok := revList[v.Rev]; ok {
+			return xerr.Customf("不能出现同样转速的数据")
+		}
+		revList[v.Rev] = struct{}{}
+	}
+
+	if err := module.CreateOrUpdateTmrGear(ctx, req); err != nil {
+		return xerr.WithStack(err)
+	}
+	return nil
+}
+
+func UseGear(ctx context.Context, req *operationPb.UseGearRequest) (*operationPb.UseGearResponse, error) {
+	list, err := module.UseTmrGear(ctx, req)
+	if err != nil {
+		return nil, xerr.WithStack(err)
+	}
+
+	tmrGearList, err := module.TmrGearListByTmrId(int64(req.TmrId))
+	if err != nil {
+		return nil, xerr.WithStack(err)
+	}
+
+	gear := "0"
+	useGearDataList := make([]*operationPb.UseGearDataList, 0)
+	for _, v := range list {
+		if len(tmrGearList) > 0 {
+			for i := 0; i < len(tmrGearList)-1; i++ {
+				if v.GearRate > float64(tmrGearList[i].Rev) && v.GearRate <= float64(tmrGearList[i+1].Rev) {
+					gear = tmrGearList[i+1].Gear
+				}
+			}
+
+			if v.GearRate <= float64(tmrGearList[0].Rev) {
+				gear = tmrGearList[0].Gear
+			}
+			if v.GearRate >= float64(tmrGearList[len(tmrGearList)-1].Rev) {
+				gear = tmrGearList[len(tmrGearList)-1].Gear
+			}
+		}
+
+		newData := &operationPb.UseGearDataList{
+			Bcode:    v.BCode,
+			Fname:    v.FName,
+			Length:   v.Length,
+			Sort:     v.Sort,
+			Speed:    float32(v.Speed),
+			Useinbar: v.UseInBar,
+			Weight:   float32(v.Weight),
+			Gear:     gear,
+			Ccount:   v.CCount,
+			GearRate: float32(v.GearRate),
+			Pid:      v.Pid,
+			Fbarid:   v.FBarid,
+		}
+		useGearDataList = append(useGearDataList, newData)
+	}
+
+	return &operationPb.UseGearResponse{
+		Code: http.StatusOK,
+		Msg:  "ok",
+		Data: &operationPb.UseGearData{List: useGearDataList},
+	}, nil
+}

二進制
uploads/file/导入导出模板/配方计划/栏舍配方导入模板.xlsx


二進制
uploads/file/导入导出模板/配方计划/栏舍配方导出模板.xlsx


二進制
uploads/file/导入导出模板/配方计划/配方模板导入模板.xlsx


二進制
uploads/file/导入导出模板/配方计划/配方模板导出模板.xlsx


Some files were not shown because too many files changed in this diff