baishaojie 1 tahun lalu
induk
melakukan
a08d4c2c3c

+ 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"]

+ 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

TEMPAT SAMPAH
TMRWatchComm.zip


TEMPAT SAMPAH
TMRWatchComm → __debug_bin.exe


+ 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

+ 5 - 5
conf/app.ini

@@ -48,8 +48,8 @@ Type = mysql
 User = root
 Password = root
 #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 = haiyuan
 #Password = root
 #Password = root
@@ -70,10 +70,10 @@ Host = 127.0.0.1:3316
 #Name = equipment
 #Name = eqdev
 #Name = eq0422
-#Name = tmrgo 
+#Name = tmrgo
 #Password = kepaiteng!QAZ
-#Host = 222.73.129.15:31306 
-Name = tmrwatch2
+#Host = 222.73.129.15:31306
+Name = yq
 TablePrefix =
 
 ShowXormlog = false

+ 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")

+ 2 - 2
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,7 +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 // 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

+ 2 - 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=

+ 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)
+}

+ 1 - 2
http/handle/api/scheduled.go

@@ -15,7 +15,6 @@ import (
 	"time"
 
 	"tmr-watch/conf/setting"
-	"tmr-watch/http/handle/gm"
 	"tmr-watch/http/handle/restful"
 	"tmr-watch/pkg/app"
 	"tmr-watch/pkg/e"
@@ -133,7 +132,7 @@ func CronScheduled(ctx context.Context) {
 	// udFeedSync(pastureinfo)
 	// //圣牧自动同步前天有进行中的任务
 	// manualUdData(pastureinfo)
-	gm.GmUdSync(pastureinfo.Pastureid, pastureinfo.Werks)
+	// gm.GmUdSync(pastureinfo.Pastureid, pastureinfo.Werks)
 	// xdmy := cron.New()
 	// err = xdmy.AddFunc("0 30 4 * * *", func() {
 	// 	//现代牧业sap同步

+ 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
+}

TEMPAT SAMPAH
uploads/file/导入导出模板/配方计划/栏舍配方导入模板.xlsx


TEMPAT SAMPAH
uploads/file/导入导出模板/配方计划/栏舍配方导出模板.xlsx


TEMPAT SAMPAH
uploads/file/导入导出模板/配方计划/配方模板导入模板.xlsx


TEMPAT SAMPAH
uploads/file/导入导出模板/配方计划/配方模板导出模板.xlsx