parent
							
								
									e22669ae05
								
							
						
					
					
						commit
						adca8e6148
					
				|  | @ -43,3 +43,6 @@ functions: | ||||||
|   - name: task-request |   - name: task-request | ||||||
|     dataTag : 12 |     dataTag : 12 | ||||||
|     mqType: 1 |     mqType: 1 | ||||||
|  |   - name: task-log | ||||||
|  |     dataTag: 28 | ||||||
|  |     mqType: 2 | ||||||
							
								
								
									
										25
									
								
								go.mod
								
								
								
								
							
							
						
						
									
										25
									
								
								go.mod
								
								
								
								
							|  | @ -5,7 +5,9 @@ go 1.18 | ||||||
| require ( | require ( | ||||||
| 	git.hpds.cc/Component/gin_valid v0.0.0-20230104142509-f956bce255b6 | 	git.hpds.cc/Component/gin_valid v0.0.0-20230104142509-f956bce255b6 | ||||||
| 	git.hpds.cc/Component/logging v0.0.0-20230106105738-e378e873921b | 	git.hpds.cc/Component/logging v0.0.0-20230106105738-e378e873921b | ||||||
| 	git.hpds.cc/pavement/hpds_node v0.0.0-20230402152619-41414aafa930 | 	git.hpds.cc/Component/network v0.0.0-20230405135741-a4ea724bab76 | ||||||
|  | 	git.hpds.cc/pavement/hpds_node v0.0.0-20230405153516-9403c4d01e12 | ||||||
|  | 	github.com/360EntSecGroup-Skylar/excelize v1.4.1 | ||||||
| 	github.com/dgrijalva/jwt-go v3.2.0+incompatible | 	github.com/dgrijalva/jwt-go v3.2.0+incompatible | ||||||
| 	github.com/gin-contrib/zap v0.1.0 | 	github.com/gin-contrib/zap v0.1.0 | ||||||
| 	github.com/gin-gonic/gin v1.8.2 | 	github.com/gin-gonic/gin v1.8.2 | ||||||
|  | @ -17,6 +19,7 @@ require ( | ||||||
| 	github.com/spf13/cobra v0.0.3 | 	github.com/spf13/cobra v0.0.3 | ||||||
| 	github.com/spf13/viper v1.14.0 | 	github.com/spf13/viper v1.14.0 | ||||||
| 	go.uber.org/zap v1.24.0 | 	go.uber.org/zap v1.24.0 | ||||||
|  | 	golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8 | ||||||
| 	gopkg.in/yaml.v3 v3.0.1 | 	gopkg.in/yaml.v3 v3.0.1 | ||||||
| 	xorm.io/xorm v1.3.2 | 	xorm.io/xorm v1.3.2 | ||||||
| ) | ) | ||||||
|  | @ -27,7 +30,6 @@ require ( | ||||||
| 	cloud.google.com/go/compute/metadata v0.2.1 // indirect | 	cloud.google.com/go/compute/metadata v0.2.1 // indirect | ||||||
| 	cloud.google.com/go/firestore v1.8.0 // indirect | 	cloud.google.com/go/firestore v1.8.0 // indirect | ||||||
| 	git.hpds.cc/Component/mq_coder v0.0.0-20221010064749-174ae7ae3340 // indirect | 	git.hpds.cc/Component/mq_coder v0.0.0-20221010064749-174ae7ae3340 // indirect | ||||||
| 	git.hpds.cc/Component/network v0.0.0-20230326151855-3c157f531d86 // indirect |  | ||||||
| 	github.com/armon/go-metrics v0.4.0 // indirect | 	github.com/armon/go-metrics v0.4.0 // indirect | ||||||
| 	github.com/coreos/go-semver v0.3.0 // indirect | 	github.com/coreos/go-semver v0.3.0 // indirect | ||||||
| 	github.com/coreos/go-systemd/v22 v22.3.2 // indirect | 	github.com/coreos/go-systemd/v22 v22.3.2 // indirect | ||||||
|  | @ -45,6 +47,7 @@ require ( | ||||||
| 	github.com/golang/protobuf v1.5.2 // indirect | 	github.com/golang/protobuf v1.5.2 // indirect | ||||||
| 	github.com/golang/snappy v0.0.4 // indirect | 	github.com/golang/snappy v0.0.4 // indirect | ||||||
| 	github.com/google/go-cmp v0.5.9 // indirect | 	github.com/google/go-cmp v0.5.9 // indirect | ||||||
|  | 	github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect | ||||||
| 	github.com/google/uuid v1.3.0 // indirect | 	github.com/google/uuid v1.3.0 // indirect | ||||||
| 	github.com/googleapis/enterprise-certificate-proxy v0.2.0 // indirect | 	github.com/googleapis/enterprise-certificate-proxy v0.2.0 // indirect | ||||||
| 	github.com/googleapis/gax-go/v2 v2.6.0 // indirect | 	github.com/googleapis/gax-go/v2 v2.6.0 // indirect | ||||||
|  | @ -60,10 +63,7 @@ require ( | ||||||
| 	github.com/klauspost/compress v1.15.9 // indirect | 	github.com/klauspost/compress v1.15.9 // indirect | ||||||
| 	github.com/klauspost/cpuid/v2 v2.1.0 // indirect | 	github.com/klauspost/cpuid/v2 v2.1.0 // indirect | ||||||
| 	github.com/leodido/go-urn v1.2.1 // indirect | 	github.com/leodido/go-urn v1.2.1 // indirect | ||||||
| 	github.com/lucas-clemente/quic-go v0.29.1 // indirect |  | ||||||
| 	github.com/magiconair/properties v1.8.6 // indirect | 	github.com/magiconair/properties v1.8.6 // indirect | ||||||
| 	github.com/marten-seemann/qtls-go1-18 v0.1.2 // indirect |  | ||||||
| 	github.com/marten-seemann/qtls-go1-19 v0.1.0 // indirect |  | ||||||
| 	github.com/matoous/go-nanoid/v2 v2.0.0 // indirect | 	github.com/matoous/go-nanoid/v2 v2.0.0 // indirect | ||||||
| 	github.com/mattn/go-colorable v0.1.12 // indirect | 	github.com/mattn/go-colorable v0.1.12 // indirect | ||||||
| 	github.com/mattn/go-isatty v0.0.16 // indirect | 	github.com/mattn/go-isatty v0.0.16 // indirect | ||||||
|  | @ -73,11 +73,15 @@ require ( | ||||||
| 	github.com/mitchellh/mapstructure v1.5.0 // indirect | 	github.com/mitchellh/mapstructure v1.5.0 // indirect | ||||||
| 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect | 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect | ||||||
| 	github.com/modern-go/reflect2 v1.0.2 // indirect | 	github.com/modern-go/reflect2 v1.0.2 // indirect | ||||||
| 	github.com/nxadm/tail v1.4.8 // indirect | 	github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect | ||||||
| 	github.com/onsi/ginkgo v1.16.4 // indirect | 	github.com/onsi/ginkgo v1.16.4 // indirect | ||||||
|  | 	github.com/onsi/ginkgo/v2 v2.2.0 // indirect | ||||||
| 	github.com/pelletier/go-toml v1.9.5 // indirect | 	github.com/pelletier/go-toml v1.9.5 // indirect | ||||||
| 	github.com/pelletier/go-toml/v2 v2.0.6 // indirect | 	github.com/pelletier/go-toml/v2 v2.0.6 // indirect | ||||||
| 	github.com/pkg/errors v0.9.1 // indirect | 	github.com/pkg/errors v0.9.1 // indirect | ||||||
|  | 	github.com/quic-go/qtls-go1-19 v0.2.1 // indirect | ||||||
|  | 	github.com/quic-go/qtls-go1-20 v0.1.1 // indirect | ||||||
|  | 	github.com/quic-go/quic-go v0.33.0 // indirect | ||||||
| 	github.com/rs/xid v1.4.0 // indirect | 	github.com/rs/xid v1.4.0 // indirect | ||||||
| 	github.com/sagikazarmark/crypt v0.8.0 // indirect | 	github.com/sagikazarmark/crypt v0.8.0 // indirect | ||||||
| 	github.com/sirupsen/logrus v1.9.0 // indirect | 	github.com/sirupsen/logrus v1.9.0 // indirect | ||||||
|  | @ -97,16 +101,16 @@ require ( | ||||||
| 	go.opentelemetry.io/otel/trace v1.10.0 // indirect | 	go.opentelemetry.io/otel/trace v1.10.0 // indirect | ||||||
| 	go.uber.org/atomic v1.9.0 // indirect | 	go.uber.org/atomic v1.9.0 // indirect | ||||||
| 	go.uber.org/multierr v1.8.0 // indirect | 	go.uber.org/multierr v1.8.0 // indirect | ||||||
| 	golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa // indirect | 	golang.org/x/crypto v0.4.0 // indirect | ||||||
| 	golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect | 	golang.org/x/exp v0.0.0-20221205204356-47842c84f3db // indirect | ||||||
| 	golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect | 	golang.org/x/mod v0.6.0 // indirect | ||||||
| 	golang.org/x/net v0.4.0 // indirect | 	golang.org/x/net v0.4.0 // indirect | ||||||
| 	golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 // indirect | 	golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 // indirect | ||||||
| 	golang.org/x/sync v0.1.0 // indirect | 	golang.org/x/sync v0.1.0 // indirect | ||||||
| 	golang.org/x/sys v0.3.0 // indirect | 	golang.org/x/sys v0.3.0 // indirect | ||||||
| 	golang.org/x/text v0.5.0 // indirect | 	golang.org/x/text v0.5.0 // indirect | ||||||
| 	golang.org/x/time v0.0.0-20220609170525-579cf78fd858 // indirect | 	golang.org/x/time v0.0.0-20220609170525-579cf78fd858 // indirect | ||||||
| 	golang.org/x/tools v0.1.12 // indirect | 	golang.org/x/tools v0.2.0 // indirect | ||||||
| 	golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect | 	golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect | ||||||
| 	google.golang.org/api v0.102.0 // indirect | 	google.golang.org/api v0.102.0 // indirect | ||||||
| 	google.golang.org/appengine v1.6.7 // indirect | 	google.golang.org/appengine v1.6.7 // indirect | ||||||
|  | @ -115,7 +119,6 @@ require ( | ||||||
| 	google.golang.org/protobuf v1.28.1 // indirect | 	google.golang.org/protobuf v1.28.1 // indirect | ||||||
| 	gopkg.in/ini.v1 v1.67.0 // indirect | 	gopkg.in/ini.v1 v1.67.0 // indirect | ||||||
| 	gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect | 	gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect | ||||||
| 	gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect |  | ||||||
| 	gopkg.in/yaml.v2 v2.4.0 // indirect | 	gopkg.in/yaml.v2 v2.4.0 // indirect | ||||||
| 	xorm.io/builder v0.3.11-0.20220531020008-1bd24a7dc978 // indirect | 	xorm.io/builder v0.3.11-0.20220531020008-1bd24a7dc978 // indirect | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | @ -63,3 +63,18 @@ func (s HandlerService) ImportDataset(c *gin.Context) (data interface{}, err err | ||||||
| 	go s.SaveLog("导入数据集", "Dataset", "", "", ToString(data), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | 	go s.SaveLog("导入数据集", "Dataset", "", "", ToString(data), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
| 	return | 	return | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func (s HandlerService) DatasetInfo(c *gin.Context) (data interface{}, err error) { | ||||||
|  | 	repo := service.NewDatasetService(s.AppConfig, s.Engine, s.Logger) | ||||||
|  | 	us, _ := c.Get("operatorUser") | ||||||
|  | 	userInfo := us.(*model.SystemUser) | ||||||
|  | 	var req proto.DatasetItemRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("DatasetInfo", "Dataset", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.DatasetInfo(c, req) | ||||||
|  | 	go s.SaveLog("获取数据集详情", "Dataset", "", "", ToString(data), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -37,3 +37,27 @@ func (s HandlerService) UploadFile(c *gin.Context) (data interface{}, err error) | ||||||
| 	go s.SaveLog("文件上传", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | 	go s.SaveLog("文件上传", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
| 	return | 	return | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func (s HandlerService) FileList(c *gin.Context) (data interface{}, err error) { | ||||||
|  | 	repo := service.NewFileService(s.AppConfig, s.Engine, s.Logger) | ||||||
|  | 	us, _ := c.Get("operatorUser") | ||||||
|  | 	userInfo := us.(*model.SystemUser) | ||||||
|  | 	var req proto.DatasetItemRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("FileList", "FileManage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	if req.Size < 1 { | ||||||
|  | 		req.Size = 20 | ||||||
|  | 	} | ||||||
|  | 	if req.Size > 1000 { | ||||||
|  | 		req.Size = 1000 | ||||||
|  | 	} | ||||||
|  | 	if req.Page < 1 { | ||||||
|  | 		req.Page = 1 | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.FileList(c, req) | ||||||
|  | 	go s.SaveLog("获取数据集详情", "FileManage", "", "", ToString(data), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -122,6 +122,20 @@ func (s HandlerService) ProjectList(c *gin.Context) (data interface{}, err error | ||||||
| 	return | 	return | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (s HandlerService) ProjectInfo(c *gin.Context) (data interface{}, err error) { | ||||||
|  | 	repo := service.NewManageService(s.AppConfig, s.Engine, s.Logger) | ||||||
|  | 	us, _ := c.Get("operatorUser") | ||||||
|  | 	userInfo := us.(*model.SystemUser) | ||||||
|  | 	var req proto.ProjectItemRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("ProjectInfo", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.ProjectInfo(c, req) | ||||||
|  | 	go s.SaveLog("获取项目信息", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
| func (s HandlerService) AddProject(c *gin.Context) (data interface{}, err error) { | func (s HandlerService) AddProject(c *gin.Context) (data interface{}, err error) { | ||||||
| 	repo := service.NewManageService(s.AppConfig, s.Engine, s.Logger) | 	repo := service.NewManageService(s.AppConfig, s.Engine, s.Logger) | ||||||
| 	us, _ := c.Get("operatorUser") | 	us, _ := c.Get("operatorUser") | ||||||
|  |  | ||||||
|  | @ -0,0 +1,47 @@ | ||||||
|  | package handler | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"github.com/gin-gonic/gin" | ||||||
|  | 	"hpds-iot-web/internal/proto" | ||||||
|  | 	"hpds-iot-web/internal/service" | ||||||
|  | 	"hpds-iot-web/model" | ||||||
|  | 	e "hpds-iot-web/pkg/err" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func (s HandlerService) ReportList(c *gin.Context) (data interface{}, err error) { | ||||||
|  | 	repo := service.NewReportService(s.Engine, s.Logger) | ||||||
|  | 	us, _ := c.Get("operatorUser") | ||||||
|  | 	userInfo := us.(*model.SystemUser) | ||||||
|  | 	var req proto.ReportRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("ReportList", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.ReportList(c, req) | ||||||
|  | 	go s.SaveLog("报表列表", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s HandlerService) GenerateReport(c *gin.Context) (data interface{}, err error) { | ||||||
|  | 	repo := service.NewReportService(s.Engine, s.Logger) | ||||||
|  | 	us, _ := c.Get("operatorUser") | ||||||
|  | 	userInfo := us.(*model.SystemUser) | ||||||
|  | 	var req proto.ReportRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("GenerateReport", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	xlsx, err := repo.GenerateReport(c, req) | ||||||
|  | 	if err != nil { | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | 	c.Header("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") | ||||||
|  | 	c.Header("Content-Disposition", "attachment; filename=模型报表.xlsx") | ||||||
|  | 	//c.Header("")
 | ||||||
|  | 	c.Header("Content-Transfer-Encoding", "binary") | ||||||
|  | 	err = xlsx.Write(c.Writer) | ||||||
|  | 	return nil, err | ||||||
|  | } | ||||||
|  | @ -19,6 +19,15 @@ func (s HandlerService) TaskList(c *gin.Context) (data interface{}, err error) { | ||||||
| 		go s.SaveLog("TaskList", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | 		go s.SaveLog("TaskList", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
| 		return nil, e.NewValidErr(err) | 		return nil, e.NewValidErr(err) | ||||||
| 	} | 	} | ||||||
|  | 	if req.Size < 1 { | ||||||
|  | 		req.Size = 20 | ||||||
|  | 	} | ||||||
|  | 	if req.Size > 1000 { | ||||||
|  | 		req.Size = 1000 | ||||||
|  | 	} | ||||||
|  | 	if req.Page < 1 { | ||||||
|  | 		req.Page = 1 | ||||||
|  | 	} | ||||||
| 	data, err = repo.TaskList(c, req) | 	data, err = repo.TaskList(c, req) | ||||||
| 	go s.SaveLog("任务列表", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | 	go s.SaveLog("任务列表", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
| 	return | 	return | ||||||
|  | @ -38,3 +47,71 @@ func (s HandlerService) AddTask(c *gin.Context) (data interface{}, err error) { | ||||||
| 	go s.SaveLog("新增任务", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | 	go s.SaveLog("新增任务", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
| 	return | 	return | ||||||
| } | } | ||||||
|  | func (s HandlerService) ReRunTask(c *gin.Context) (data interface{}, err error) { | ||||||
|  | 	repo := service.NewTaskService(s.Engine, s.Logger) | ||||||
|  | 	us, _ := c.Get("operatorUser") | ||||||
|  | 	userInfo := us.(*model.SystemUser) | ||||||
|  | 	var req proto.TaskItemRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("ReRunTask", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.ReRunTask(c, req) | ||||||
|  | 	go s.SaveLog("重新执行任务", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s HandlerService) TaskInfo(c *gin.Context) (data interface{}, err error) { | ||||||
|  | 	repo := service.NewTaskService(s.Engine, s.Logger) | ||||||
|  | 	us, _ := c.Get("operatorUser") | ||||||
|  | 	userInfo := us.(*model.SystemUser) | ||||||
|  | 	var req proto.TaskItemRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("TaskInfo", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.TaskInfo(c, req) | ||||||
|  | 	go s.SaveLog("获取任务信息", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s HandlerService) TaskResult(c *gin.Context) (data interface{}, err error) { | ||||||
|  | 	repo := service.NewTaskService(s.Engine, s.Logger) | ||||||
|  | 	us, _ := c.Get("operatorUser") | ||||||
|  | 	userInfo := us.(*model.SystemUser) | ||||||
|  | 	var req proto.ReportRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("TaskResult", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	if req.Size < 1 { | ||||||
|  | 		req.Size = 20 | ||||||
|  | 	} | ||||||
|  | 	if req.Size > 1000 { | ||||||
|  | 		req.Size = 1000 | ||||||
|  | 	} | ||||||
|  | 	if req.Page < 1 { | ||||||
|  | 		req.Page = 1 | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.TaskResult(c, req) | ||||||
|  | 	go s.SaveLog("获取任务结果信息", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s HandlerService) TaskLog(c *gin.Context) (data interface{}, err error) { | ||||||
|  | 	repo := service.NewTaskService(s.Engine, s.Logger) | ||||||
|  | 	us, _ := c.Get("operatorUser") | ||||||
|  | 	userInfo := us.(*model.SystemUser) | ||||||
|  | 	var req proto.TaskItemRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("TaskLog", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.TaskLog(c, req) | ||||||
|  | 	go s.SaveLog("获取任务日志信息", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -33,7 +33,6 @@ func (s HandlerService) AddUser(c *gin.Context) (data interface{}, err error) { | ||||||
| 	data, err = repo.AddUser(c, req) | 	data, err = repo.AddUser(c, req) | ||||||
| 	go s.SaveLog("新增用户", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | 	go s.SaveLog("新增用户", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
| 	return | 	return | ||||||
| 	return |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (s HandlerService) EditUser(c *gin.Context) (data interface{}, err error) { | func (s HandlerService) EditUser(c *gin.Context) (data interface{}, err error) { | ||||||
|  | @ -49,7 +48,6 @@ func (s HandlerService) EditUser(c *gin.Context) (data interface{}, err error) { | ||||||
| 	data, err = repo.EditUser(c, req) | 	data, err = repo.EditUser(c, req) | ||||||
| 	go s.SaveLog("修改用户信息", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | 	go s.SaveLog("修改用户信息", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
| 	return | 	return | ||||||
| 	return |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (s HandlerService) GetUserInfo(c *gin.Context) (data interface{}, err error) { | func (s HandlerService) GetUserInfo(c *gin.Context) (data interface{}, err error) { | ||||||
|  | @ -80,5 +78,10 @@ func (s HandlerService) MenuList(c *gin.Context) (data interface{}, err error) { | ||||||
| 	us, _ := c.Get("operatorUser") | 	us, _ := c.Get("operatorUser") | ||||||
| 	userinfo := us.(*model.SystemUser) | 	userinfo := us.(*model.SystemUser) | ||||||
| 	data, err = repo.MenuList(c, userinfo.UserId) | 	data, err = repo.MenuList(c, userinfo.UserId) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("GetUserList", "Manage", "", "", userinfo.ToString(), fmt.Sprintf("%d", userinfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	go s.SaveLog("获取用户菜单列表", "Manage", "", "", "", fmt.Sprintf("%d", userinfo.UserId), c.Request.RemoteAddr, "") | ||||||
| 	return | 	return | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -70,7 +70,7 @@ func JwtAuthMiddleware(logger *zap.Logger) gin.HandlerFunc { | ||||||
| 		) | 		) | ||||||
| 		token := c.GetHeader("Authorization") | 		token := c.GetHeader("Authorization") | ||||||
| 		// 这里可以过滤不需要进行验证的接口
 | 		// 这里可以过滤不需要进行验证的接口
 | ||||||
| 		if path == "/api/user/login" || path == "/api/health" { | 		if path == "/api/user/login" || path == "/api/health" || path == "/api/task/event" { | ||||||
| 			goto Return | 			goto Return | ||||||
| 		} | 		} | ||||||
| 		if len(token) == 0 { | 		if len(token) == 0 { | ||||||
|  |  | ||||||
|  | @ -428,6 +428,11 @@ type UploadFileRequest struct { | ||||||
| 	Scene     string                  `json:"scene"` | 	Scene     string                  `json:"scene"` | ||||||
| 	Files     []*multipart.FileHeader `json:"files"` | 	Files     []*multipart.FileHeader `json:"files"` | ||||||
| 	DatasetId int64                   `json:"datasetId"` | 	DatasetId int64                   `json:"datasetId"` | ||||||
|  | 	DataType  int                     `json:"dataType"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type FileList struct { | ||||||
|  | 	DatasetId int64 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type BrandRequest struct { | type BrandRequest struct { | ||||||
|  | @ -513,11 +518,11 @@ func (p OwnerProjectRequest) ToString() string { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type DatasetRequest struct { | type DatasetRequest struct { | ||||||
| 	OwnerId     int64  `json:"ownerId"` | 	OwnerId     int64   `json:"ownerId"` | ||||||
| 	ProjectId   int64  `json:"projectId"` | 	ProjectId   []int64 `json:"projectId"` | ||||||
| 	DatasetName string `json:"datasetName"` | 	DatasetName string  `json:"datasetName"` | ||||||
| 	StartTime   string `json:"startTime"` | 	StartTime   string  `json:"startTime"` | ||||||
| 	EndTime     string `json:"endTime"` | 	EndTime     string  `json:"endTime"` | ||||||
| 	BasePageList | 	BasePageList | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -529,6 +534,20 @@ func (p DatasetRequest) ToString() string { | ||||||
| 	return string(data) | 	return string(data) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | type DatasetItemRequest struct { | ||||||
|  | 	DatasetId int64 `json:"datasetId"` | ||||||
|  | 	DataType  int   `json:"dataType"` | ||||||
|  | 	BasePageList | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (p DatasetItemRequest) ToString() string { | ||||||
|  | 	data, err := json.Marshal(p) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  | 	return string(data) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| type ImportDatasetRequest struct { | type ImportDatasetRequest struct { | ||||||
| 	DatasetId   int64  `json:"datasetId"` | 	DatasetId   int64  `json:"datasetId"` | ||||||
| 	CategoryId  int    `json:"categoryId"` | 	CategoryId  int    `json:"categoryId"` | ||||||
|  | @ -655,3 +674,17 @@ func (p TaskItemRequest) ToString() string { | ||||||
| 	} | 	} | ||||||
| 	return string(data) | 	return string(data) | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | type ReportRequest struct { | ||||||
|  | 	ReportId int64 `json:"reportId,omitempty"` | ||||||
|  | 	TaskId   int64 `json:"taskId,omitempty"` | ||||||
|  | 	BasePageList | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (p ReportRequest) ToString() string { | ||||||
|  | 	data, err := json.Marshal(p) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  | 	return string(data) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -121,3 +121,23 @@ type TaskDetail struct { | ||||||
| 	CreateAt        int64  `xorm:"created" json:"createAt"` | 	CreateAt        int64  `xorm:"created" json:"createAt"` | ||||||
| 	UpdateAt        int64  `xorm:"updated" json:"updateAt"` | 	UpdateAt        int64  `xorm:"updated" json:"updateAt"` | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | type TaskResultItem struct { | ||||||
|  | 	FileId              int64   `json:"fileId"` | ||||||
|  | 	FileName            string  `json:"fileName"` | ||||||
|  | 	SrcFile             string  `json:"srcFile"` | ||||||
|  | 	DistFile            string  `json:"distFile"` | ||||||
|  | 	DiseaseType         int     `json:"diseaseType"` | ||||||
|  | 	DiseaseTypeName     string  `json:"diseaseTypeName"` | ||||||
|  | 	DiseaseLevel        int     `json:"diseaseLevel"` | ||||||
|  | 	DiseaseLevelName    string  `json:"diseaseLevelName"` | ||||||
|  | 	KPile               string  `json:"KPile"` | ||||||
|  | 	UpDown              int     `json:"upDown"` | ||||||
|  | 	LineNum             int     `json:"lineNum"` | ||||||
|  | 	Length              float64 `json:"length"` | ||||||
|  | 	Width               float64 `json:"width"` | ||||||
|  | 	Area                float64 `json:"area"` | ||||||
|  | 	HorizontalPositions float64 `json:"horizontalPositions"` | ||||||
|  | 	Memo                string  `json:"memo"` | ||||||
|  | 	Stat                bool    `json:"stat"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -1,12 +1,15 @@ | ||||||
| package router | package router | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
|  | 	"fmt" | ||||||
| 	"git.hpds.cc/Component/logging" | 	"git.hpds.cc/Component/logging" | ||||||
| 	ginzap "github.com/gin-contrib/zap" | 	ginzap "github.com/gin-contrib/zap" | ||||||
| 	"github.com/gin-gonic/gin" | 	"github.com/gin-gonic/gin" | ||||||
| 	"hpds-iot-web/config" | 	"hpds-iot-web/config" | ||||||
| 	"hpds-iot-web/internal/handler" | 	"hpds-iot-web/internal/handler" | ||||||
| 	"hpds-iot-web/internal/middleware" | 	"hpds-iot-web/internal/middleware" | ||||||
|  | 	"hpds-iot-web/mq" | ||||||
|  | 	"net/http" | ||||||
| 	"xorm.io/xorm" | 	"xorm.io/xorm" | ||||||
| 
 | 
 | ||||||
| 	e "hpds-iot-web/pkg/err" | 	e "hpds-iot-web/pkg/err" | ||||||
|  | @ -48,6 +51,7 @@ func InitRouter(cfg *config.WebConfig, logger *logging.Logger, engine *xorm.Engi | ||||||
| 			project := manage.Group("/project") | 			project := manage.Group("/project") | ||||||
| 			{ | 			{ | ||||||
| 				project.POST("/list", e.ErrorWrapper(hs.ProjectList)) | 				project.POST("/list", e.ErrorWrapper(hs.ProjectList)) | ||||||
|  | 				project.POST("/info", e.ErrorWrapper(hs.ProjectInfo)) | ||||||
| 				project.POST("/add", e.ErrorWrapper(hs.AddProject)) | 				project.POST("/add", e.ErrorWrapper(hs.AddProject)) | ||||||
| 				project.POST("/edit", e.ErrorWrapper(hs.EditProject)) | 				project.POST("/edit", e.ErrorWrapper(hs.EditProject)) | ||||||
| 				project.POST("/delete", e.ErrorWrapper(hs.DelProject)) | 				project.POST("/delete", e.ErrorWrapper(hs.DelProject)) | ||||||
|  | @ -135,6 +139,7 @@ func InitRouter(cfg *config.WebConfig, logger *logging.Logger, engine *xorm.Engi | ||||||
| 		{ | 		{ | ||||||
| 			file.Use(middleware.JwtAuthMiddleware(logger.Logger)) | 			file.Use(middleware.JwtAuthMiddleware(logger.Logger)) | ||||||
| 			file.POST("/upload", e.ErrorWrapper(hs.UploadFile)) | 			file.POST("/upload", e.ErrorWrapper(hs.UploadFile)) | ||||||
|  | 			file.POST("/list", e.ErrorWrapper(hs.FileList)) | ||||||
| 		} | 		} | ||||||
| 		system := r.Group("/system") | 		system := r.Group("/system") | ||||||
| 		{ | 		{ | ||||||
|  | @ -163,6 +168,34 @@ func InitRouter(cfg *config.WebConfig, logger *logging.Logger, engine *xorm.Engi | ||||||
| 			task.Use(middleware.JwtAuthMiddleware(logger.Logger)) | 			task.Use(middleware.JwtAuthMiddleware(logger.Logger)) | ||||||
| 			task.POST("/list", e.ErrorWrapper(hs.TaskList)) | 			task.POST("/list", e.ErrorWrapper(hs.TaskList)) | ||||||
| 			task.POST("/add", e.ErrorWrapper(hs.AddTask)) | 			task.POST("/add", e.ErrorWrapper(hs.AddTask)) | ||||||
|  | 			task.POST("/reRun", e.ErrorWrapper(hs.ReRunTask)) | ||||||
|  | 			task.POST("/info", e.ErrorWrapper(hs.TaskInfo)) | ||||||
|  | 			task.POST("/result", e.ErrorWrapper(hs.TaskResult)) | ||||||
|  | 			task.POST("/log", e.ErrorWrapper(hs.TaskLog)) | ||||||
|  | 			task.GET("/event", func(c *gin.Context) { | ||||||
|  | 				//us, _ := c.Get("operatorUser")
 | ||||||
|  | 				//userInfo := us.(*m.SystemUser)
 | ||||||
|  | 
 | ||||||
|  | 				mq.AddChannel(fmt.Sprintf("%d", 1)) | ||||||
|  | 				c.Writer.Header().Set("Content-Type", "text/event-stream") | ||||||
|  | 				c.Writer.Header().Set("Cache-Control", "no-cache") | ||||||
|  | 				c.Writer.Header().Set("Connection", "keep-alive") | ||||||
|  | 				w := c.Writer | ||||||
|  | 				flusher, _ := w.(http.Flusher) | ||||||
|  | 				closeNotify := c.Request.Context().Done() | ||||||
|  | 				go func() { | ||||||
|  | 					<-closeNotify | ||||||
|  | 					delete(mq.ChannelsMap, fmt.Sprintf("%d", 1)) | ||||||
|  | 					logging.L().Info("SSE close for user = " + fmt.Sprintf("%d", 1)) | ||||||
|  | 					return | ||||||
|  | 				}() | ||||||
|  | 				_, _ = fmt.Fprintf(w, "data: %s\n\n", "--ping--") | ||||||
|  | 				flusher.Flush() | ||||||
|  | 				for msg := range mq.ChannelsMap[fmt.Sprintf("%d", 1)] { | ||||||
|  | 					_, _ = fmt.Fprintf(w, "data: %s\n\n", msg) | ||||||
|  | 					flusher.Flush() | ||||||
|  | 				} | ||||||
|  | 			}) | ||||||
| 		} | 		} | ||||||
| 		disease := r.Group("/disease") | 		disease := r.Group("/disease") | ||||||
| 		{ | 		{ | ||||||
|  | @ -183,6 +216,15 @@ func InitRouter(cfg *config.WebConfig, logger *logging.Logger, engine *xorm.Engi | ||||||
| 
 | 
 | ||||||
| 			dataset.POST("/list", e.ErrorWrapper(hs.DatasetList)) | 			dataset.POST("/list", e.ErrorWrapper(hs.DatasetList)) | ||||||
| 			dataset.POST("/import", e.ErrorWrapper(hs.ImportDataset)) | 			dataset.POST("/import", e.ErrorWrapper(hs.ImportDataset)) | ||||||
|  | 			dataset.POST("/info", e.ErrorWrapper(hs.DatasetInfo)) | ||||||
|  | 
 | ||||||
|  | 		} | ||||||
|  | 		report := r.Group("/report") | ||||||
|  | 		{ | ||||||
|  | 			report.Use(middleware.JwtAuthMiddleware(logger.Logger)) | ||||||
|  | 			report.POST("/list", e.ErrorWrapper(hs.ReportList)) | ||||||
|  | 			report.POST("/generate", e.ErrorWrapper(hs.GenerateReport)) | ||||||
|  | 			//report.POST("/view", e.ErrorWrapper(hs.ViewReport))
 | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	return root | 	return root | ||||||
|  |  | ||||||
|  | @ -16,6 +16,7 @@ type DatasetService interface { | ||||||
| 	GetOwnerProjectList(ctx context.Context, req proto.OwnerProjectRequest) (rsp *proto.BaseResponse, err error) | 	GetOwnerProjectList(ctx context.Context, req proto.OwnerProjectRequest) (rsp *proto.BaseResponse, err error) | ||||||
| 	DatasetList(ctx context.Context, req proto.DatasetRequest) (rsp *proto.BaseResponse, err error) | 	DatasetList(ctx context.Context, req proto.DatasetRequest) (rsp *proto.BaseResponse, err error) | ||||||
| 	ImportDataset(ctx context.Context, req proto.ImportDatasetRequest) (rsp *proto.BaseResponse, err error) | 	ImportDataset(ctx context.Context, req proto.ImportDatasetRequest) (rsp *proto.BaseResponse, err error) | ||||||
|  | 	DatasetInfo(ctx context.Context, req proto.DatasetItemRequest) (rsp *proto.BaseResponse, err error) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func NewDatasetService(cfg *config.WebConfig, engine *xorm.Engine, logger *logging.Logger) DatasetService { | func NewDatasetService(cfg *config.WebConfig, engine *xorm.Engine, logger *logging.Logger) DatasetService { | ||||||
|  | @ -86,24 +87,27 @@ func (rp *repo) DatasetList(ctx context.Context, req proto.DatasetRequest) (rsp | ||||||
| 		return rsp, ctx.Err() | 		return rsp, ctx.Err() | ||||||
| 	default: | 	default: | ||||||
| 		list := make([]model.Dataset, 0) | 		list := make([]model.Dataset, 0) | ||||||
| 		count, err := rp.engine.Where("(? = '' or dataset_name like ?)", req.DatasetName, "%"+req.DatasetName+"%"). | 		st := rp.engine.Where("(? = '' or dataset_name like ?)", req.DatasetName, "%"+req.DatasetName+"%"). | ||||||
| 			And("(? = '' or create_at >= ?)", req.StartTime, req.StartTime). | 			And("(? = '' or create_at >= ?)", req.StartTime, req.StartTime). | ||||||
| 			And("(? = '' or create_at < ?)", req.EndTime, req.EndTime). | 			And("(? = '' or create_at < ?)", req.EndTime, req.EndTime). | ||||||
| 			And("(? = 0 or owner_id = ?)", req.OwnerId, req.OwnerId). | 			And("(? = 0 or owner_id = ?)", req.OwnerId, req.OwnerId). | ||||||
| 			And("(? = 0 or project_id = ?)", req.ProjectId, req.ProjectId). | 			And("status = 1") | ||||||
| 			And("status = 1").FindAndCount(&list) | 		if len(req.ProjectId) > 0 { | ||||||
|  | 			st.In("project_id", req.ProjectId) | ||||||
|  | 		} | ||||||
|  | 		count, err := st.Limit(int(req.Size), int(((req.Page)-1)*req.Size)).FindAndCount(&list) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			goto ReturnPoint | 			goto ReturnPoint | ||||||
| 		} | 		} | ||||||
| 		data := make([]proto.DatasetItem, len(list)) | 		data := make([]proto.DatasetItem, len(list)) | ||||||
| 		for k, v := range list { | 		for k, v := range list { | ||||||
| 			detailList := make([]model.FileManager, 0) | 			detailList := make([]model.FileManager, 0) | ||||||
| 			datasetCount, err := rp.engine.Where("dataset_id = ?", v.DatasetId).FindAndCount(&detailList) | 			datasetCount, err := rp.engine.Where("dataset_id = ?", v.DatasetId).And("data_type=1").FindAndCount(&detailList) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				goto ReturnPoint | 				goto ReturnPoint | ||||||
| 			} | 			} | ||||||
| 			fm := new(model.FileManager) | 			fm := new(model.FileManager) | ||||||
| 			datasetSize, err := rp.engine.Where("dataset_id = ?", v.DatasetId).SumInt(fm, "file_size") | 			datasetSize, err := rp.engine.Where("dataset_id = ?", v.DatasetId).And("data_type=1").SumInt(fm, "file_size") | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				goto ReturnPoint | 				goto ReturnPoint | ||||||
| 			} | 			} | ||||||
|  | @ -181,3 +185,42 @@ ReturnPoint: | ||||||
| 	} | 	} | ||||||
| 	return rsp, err | 	return rsp, err | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func (rp *repo) DatasetInfo(ctx context.Context, req proto.DatasetItemRequest) (rsp *proto.BaseResponse, err error) { | ||||||
|  | 	rsp = new(proto.BaseResponse) | ||||||
|  | 	select { | ||||||
|  | 	case <-ctx.Done(): | ||||||
|  | 		err = fmt.Errorf("超时/取消") | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Message = "超时/取消" | ||||||
|  | 		rsp.Err = ctx.Err() | ||||||
|  | 		return rsp, ctx.Err() | ||||||
|  | 	default: | ||||||
|  | 		item := new(model.Dataset) | ||||||
|  | 		var b bool | ||||||
|  | 		b, err = rp.engine.ID(req.DatasetId).Get(item) | ||||||
|  | 		if err != nil { | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		if !b { | ||||||
|  | 			err = fmt.Errorf("未能找到对应的数据集") | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		rsp.Code = http.StatusOK | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusOK) | ||||||
|  | 		rsp.Message = "成功" | ||||||
|  | 		rsp.Err = err | ||||||
|  | 		rsp.Data = item | ||||||
|  | 		return rsp, err | ||||||
|  | 	} | ||||||
|  | ReturnPoint: | ||||||
|  | 	if err != nil { | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Err = err | ||||||
|  | 		rsp.Message = "失败" | ||||||
|  | 	} | ||||||
|  | 	return rsp, err | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -22,7 +22,8 @@ import ( | ||||||
| 
 | 
 | ||||||
| type FileService interface { | type FileService interface { | ||||||
| 	UploadFile(ctx context.Context, req proto.UploadFileRequest) (rsp *proto.BaseResponse, err error) | 	UploadFile(ctx context.Context, req proto.UploadFileRequest) (rsp *proto.BaseResponse, err error) | ||||||
| 	UploadFileToMinIo(ctx context.Context, srcFile *multipart.FileHeader, scene string, datasetId, creator int64) (data *model.FileManager, err error) | 	UploadFileToMinIo(ctx context.Context, srcFile *multipart.FileHeader, scene string, datasetId, creator int64, dataType int) (data *model.FileManager, err error) | ||||||
|  | 	FileList(ctx context.Context, req proto.DatasetItemRequest) (rsp *proto.BaseResponse, err error) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func NewFileService(cfg *config.WebConfig, engine *xorm.Engine, logger *logging.Logger) FileService { | func NewFileService(cfg *config.WebConfig, engine *xorm.Engine, logger *logging.Logger) FileService { | ||||||
|  | @ -47,7 +48,7 @@ func (rp *repo) UploadFile(ctx context.Context, req proto.UploadFileRequest) (rs | ||||||
| 		list := make([]*model.FileManager, len(req.Files)) | 		list := make([]*model.FileManager, len(req.Files)) | ||||||
| 		fileUrl := make([]string, len(req.Files)) | 		fileUrl := make([]string, len(req.Files)) | ||||||
| 		for k := range req.Files { | 		for k := range req.Files { | ||||||
| 			fileItem, err := rp.UploadFileToMinIo(ctx, req.Files[k], req.Scene, req.DatasetId, req.Creator) | 			fileItem, err := rp.UploadFileToMinIo(ctx, req.Files[k], req.Scene, req.DatasetId, req.Creator, req.DataType) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				goto ReturnPoint | 				goto ReturnPoint | ||||||
| 			} | 			} | ||||||
|  | @ -76,7 +77,7 @@ ReturnPoint: | ||||||
| 	return rsp, err | 	return rsp, err | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (rp *repo) UploadFileToMinIo(ctx context.Context, srcFile *multipart.FileHeader, scene string, datasetId, creator int64) (data *model.FileManager, err error) { | func (rp *repo) UploadFileToMinIo(ctx context.Context, srcFile *multipart.FileHeader, scene string, datasetId, creator int64, dataType int) (data *model.FileManager, err error) { | ||||||
| 	file, err := srcFile.Open() | 	file, err := srcFile.Open() | ||||||
| 	defer func(file multipart.File) { | 	defer func(file multipart.File) { | ||||||
| 		_ = file.Close() | 		_ = file.Close() | ||||||
|  | @ -126,9 +127,47 @@ func (rp *repo) UploadFileToMinIo(ctx context.Context, srcFile *multipart.FileHe | ||||||
| 	data.Scene = scene | 	data.Scene = scene | ||||||
| 	data.AccessUrl = accessUrl | 	data.AccessUrl = accessUrl | ||||||
| 	data.FileSize = srcFile.Size | 	data.FileSize = srcFile.Size | ||||||
|  | 	data.DataType = dataType | ||||||
|  | 	data.DatasetId = datasetId | ||||||
| 	data.Creator = creator | 	data.Creator = creator | ||||||
| 	data.FileMd5 = hex.EncodeToString(md5hash.Sum(nil)) | 	data.FileMd5 = hex.EncodeToString(md5hash.Sum(nil)) | ||||||
| 	data.CreateAt = time.Now().Unix() | 	data.CreateAt = time.Now().Unix() | ||||||
| 	data.UpdateAt = time.Now().Unix() | 	data.UpdateAt = time.Now().Unix() | ||||||
| 	return data, nil | 	return data, nil | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func (rp *repo) FileList(ctx context.Context, req proto.DatasetItemRequest) (rsp *proto.BaseResponse, err error) { | ||||||
|  | 	rsp = new(proto.BaseResponse) | ||||||
|  | 	select { | ||||||
|  | 	case <-ctx.Done(): | ||||||
|  | 		err = fmt.Errorf("超时/取消") | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Message = "超时/取消" | ||||||
|  | 		rsp.Err = ctx.Err() | ||||||
|  | 		return rsp, ctx.Err() | ||||||
|  | 	default: | ||||||
|  | 		data := make([]model.FileManager, 0) | ||||||
|  | 		count, err := rp.engine.Where("(? = 0 or dataset_id = ?)", req.DatasetId, req.DatasetId). | ||||||
|  | 			And("(? = 0 or data_type = ?)", req.DataType, req.DataType). | ||||||
|  | 			Limit(int(req.Size), int(((req.Page)-1)*req.Size)). | ||||||
|  | 			FindAndCount(&data) | ||||||
|  | 		if err != nil { | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		rsp.Code = http.StatusOK | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusOK) | ||||||
|  | 		rsp.Message = "成功" | ||||||
|  | 		rsp = FillPaging(count, req.Page, req.Size, data, rsp) | ||||||
|  | 		rsp.Err = err | ||||||
|  | 		return rsp, err | ||||||
|  | 	} | ||||||
|  | ReturnPoint: | ||||||
|  | 	if err != nil { | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Err = err | ||||||
|  | 		rsp.Message = "失败" | ||||||
|  | 	} | ||||||
|  | 	return rsp, err | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -24,6 +24,7 @@ type ManageService interface { | ||||||
| 
 | 
 | ||||||
| 	ProjectList(ctx context.Context, req proto.ProjectRequest) (rsp *proto.BaseResponse, err error) | 	ProjectList(ctx context.Context, req proto.ProjectRequest) (rsp *proto.BaseResponse, err error) | ||||||
| 	GetLngLat(ctx context.Context, mileagePile string) (lng, lat float64, err error) | 	GetLngLat(ctx context.Context, mileagePile string) (lng, lat float64, err error) | ||||||
|  | 	ProjectInfo(ctx context.Context, req proto.ProjectItemRequest) (rsp *proto.BaseResponse, err error) | ||||||
| 	AddProject(ctx context.Context, req proto.ProjectItemRequest) (rsp *proto.BaseResponse, err error) | 	AddProject(ctx context.Context, req proto.ProjectItemRequest) (rsp *proto.BaseResponse, err error) | ||||||
| 	EditProject(ctx context.Context, req proto.ProjectItemRequest) (rsp *proto.BaseResponse, err error) | 	EditProject(ctx context.Context, req proto.ProjectItemRequest) (rsp *proto.BaseResponse, err error) | ||||||
| 	DelProject(ctx context.Context, req proto.ProjectItemRequest) (rsp *proto.BaseResponse, err error) | 	DelProject(ctx context.Context, req proto.ProjectItemRequest) (rsp *proto.BaseResponse, err error) | ||||||
|  | @ -321,6 +322,44 @@ ReturnPoint: | ||||||
| 	return rsp, err | 	return rsp, err | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (rp *repo) ProjectInfo(ctx context.Context, req proto.ProjectItemRequest) (rsp *proto.BaseResponse, err error) { | ||||||
|  | 	rsp = new(proto.BaseResponse) | ||||||
|  | 	select { | ||||||
|  | 	case <-ctx.Done(): | ||||||
|  | 		err = fmt.Errorf("超时/取消") | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Message = "超时/取消" | ||||||
|  | 		rsp.Err = ctx.Err() | ||||||
|  | 		return rsp, ctx.Err() | ||||||
|  | 	default: | ||||||
|  | 		var h bool | ||||||
|  | 		item := new(model.Project) | ||||||
|  | 		h, err = rp.engine.ID(req.ProjectId).Get(item) | ||||||
|  | 		if err != nil { | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		if !h { | ||||||
|  | 			err = fmt.Errorf("未能找到对应的项目") | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		rsp.Code = http.StatusOK | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusOK) | ||||||
|  | 		rsp.Message = "成功" | ||||||
|  | 		rsp.Data = item | ||||||
|  | 		rsp.Err = err | ||||||
|  | 		return rsp, err | ||||||
|  | 	} | ||||||
|  | ReturnPoint: | ||||||
|  | 	if err != nil { | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Err = err | ||||||
|  | 		rsp.Message = "失败" | ||||||
|  | 	} | ||||||
|  | 	return rsp, err | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (rp *repo) AddProject(ctx context.Context, req proto.ProjectItemRequest) (rsp *proto.BaseResponse, err error) { | func (rp *repo) AddProject(ctx context.Context, req proto.ProjectItemRequest) (rsp *proto.BaseResponse, err error) { | ||||||
| 	rsp = new(proto.BaseResponse) | 	rsp = new(proto.BaseResponse) | ||||||
| 	select { | 	select { | ||||||
|  | @ -378,6 +417,7 @@ ReturnPoint: | ||||||
| 	} | 	} | ||||||
| 	return rsp, err | 	return rsp, err | ||||||
| } | } | ||||||
|  | 
 | ||||||
| func (rp *repo) GetLngLat(ctx context.Context, mileagePile string) (lng, lat float64, err error) { | func (rp *repo) GetLngLat(ctx context.Context, mileagePile string) (lng, lat float64, err error) { | ||||||
| 	mine := minedata.NewMineData(rp.AppConfig.MineData.AccessKey) | 	mine := minedata.NewMineData(rp.AppConfig.MineData.AccessKey) | ||||||
| 	//正里程桩
 | 	//正里程桩
 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,187 @@ | ||||||
|  | package service | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 	"fmt" | ||||||
|  | 	"git.hpds.cc/Component/logging" | ||||||
|  | 	"hpds-iot-web/internal/proto" | ||||||
|  | 	"hpds-iot-web/model" | ||||||
|  | 	"net/http" | ||||||
|  | 	"xorm.io/xorm" | ||||||
|  | 
 | ||||||
|  | 	"github.com/360EntSecGroup-Skylar/excelize" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type ReportService interface { | ||||||
|  | 	ReportList(ctx context.Context, req proto.ReportRequest) (rsp *proto.BaseResponse, err error) | ||||||
|  | 	GenerateReport(ctx context.Context, req proto.ReportRequest) (rsp *excelize.File, err error) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewReportService(engine *xorm.Engine, logger *logging.Logger) ReportService { | ||||||
|  | 	return &repo{ | ||||||
|  | 		engine: engine, | ||||||
|  | 		logger: logger, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (rp *repo) ReportList(ctx context.Context, req proto.ReportRequest) (rsp *proto.BaseResponse, err error) { | ||||||
|  | 	rsp = new(proto.BaseResponse) | ||||||
|  | 	select { | ||||||
|  | 	case <-ctx.Done(): | ||||||
|  | 		err = fmt.Errorf("超时/取消") | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Message = "超时/取消" | ||||||
|  | 		rsp.Err = ctx.Err() | ||||||
|  | 		return rsp, ctx.Err() | ||||||
|  | 	default: | ||||||
|  | 		data := make([]model.Report, 0) | ||||||
|  | 		count, err := rp.engine. | ||||||
|  | 			Where("(? = 0 or m.report_id = ?)", req.ReportId, req.ReportId). | ||||||
|  | 			And("t.status > 0").Limit(int(req.Size), int(((req.Page)-1)*req.Size)). | ||||||
|  | 			FindAndCount(&data) | ||||||
|  | 		if err != nil { | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		rsp.Code = http.StatusOK | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusOK) | ||||||
|  | 		rsp.Message = "成功" | ||||||
|  | 		rsp = FillPaging(count, req.Page, req.Size, data, rsp) | ||||||
|  | 		rsp.Err = err | ||||||
|  | 		return rsp, err | ||||||
|  | 	} | ||||||
|  | ReturnPoint: | ||||||
|  | 	if err != nil { | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Err = err | ||||||
|  | 		rsp.Message = "失败" | ||||||
|  | 	} | ||||||
|  | 	return rsp, err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (rp *repo) GenerateReport(ctx context.Context, req proto.ReportRequest) (rsp *excelize.File, err error) { | ||||||
|  | 	//rsp = new(proto.BaseResponse)
 | ||||||
|  | 	select { | ||||||
|  | 	case <-ctx.Done(): | ||||||
|  | 		err = fmt.Errorf("超时/取消") | ||||||
|  | 		//rsp.Code = http.StatusInternalServerError
 | ||||||
|  | 		//rsp.Status = http.StatusText(http.StatusInternalServerError)
 | ||||||
|  | 		//rsp.Message = "超时/取消"
 | ||||||
|  | 		//rsp.Err = ctx.Err()
 | ||||||
|  | 		return rsp, ctx.Err() | ||||||
|  | 	default: | ||||||
|  | 		//data := make([]model.Report, 0)
 | ||||||
|  | 		//_, err = rp.engine.
 | ||||||
|  | 		//	Where("(? = 0 or m.report_id = ?)", req.ReportId, req.ReportId).
 | ||||||
|  | 		//	And("t.status > 0").Limit(int(req.Size), int(((req.Page)-1)*req.Size)).
 | ||||||
|  | 		//	FindAndCount(&data)
 | ||||||
|  | 		//if err != nil {
 | ||||||
|  | 		//	goto ReturnPoint
 | ||||||
|  | 		//}
 | ||||||
|  | 		list := make([]proto.TaskResultItem, 2) | ||||||
|  | 
 | ||||||
|  | 		list[0] = proto.TaskResultItem{ | ||||||
|  | 			FileId:              147, | ||||||
|  | 			FileName:            "Y016   2.844 I 1 06272008 Color.jpg", | ||||||
|  | 			SrcFile:             "http://127.0.0.1:9000/jky-data/road/test_dataset/Y016   2.844 I 1 06272008 Color.jpg", | ||||||
|  | 			DistFile:            "http://127.0.0.1:9000/jky-data/road/test_dataset/Y016   2.844 I 1 06272008 Color.jpg", | ||||||
|  | 			DiseaseType:         4, | ||||||
|  | 			DiseaseLevel:        2, | ||||||
|  | 			KPile:               "K229+778", | ||||||
|  | 			UpDown:              1, | ||||||
|  | 			LineNum:             2, | ||||||
|  | 			Length:              0.5, | ||||||
|  | 			Width:               1, | ||||||
|  | 			Area:                0.5, | ||||||
|  | 			HorizontalPositions: 0.5, | ||||||
|  | 			Memo:                "有裂缝", | ||||||
|  | 		} | ||||||
|  | 		list[1] = proto.TaskResultItem{ | ||||||
|  | 			FileId:              149, | ||||||
|  | 			FileName:            "C279   0.132 I 1 06272008 Color.jpg", | ||||||
|  | 			SrcFile:             "http://127.0.0.1:9000/jky-data/road/test_dataset/cba/C279   0.132 I 1 06272008 Color.jpg", | ||||||
|  | 			DistFile:            "http://127.0.0.1:9000/jky-data/road/test_dataset/cba/C279   0.132 I 1 06272008 Color.jpg", | ||||||
|  | 			DiseaseType:         0, | ||||||
|  | 			DiseaseLevel:        0, | ||||||
|  | 			KPile:               "", | ||||||
|  | 			UpDown:              0, | ||||||
|  | 			LineNum:             0, | ||||||
|  | 			Length:              0, | ||||||
|  | 			Width:               0, | ||||||
|  | 			Area:                0, | ||||||
|  | 			HorizontalPositions: 0, | ||||||
|  | 		} | ||||||
|  | 		disTypeList := make([]model.DiseaseType, 0) | ||||||
|  | 		err = model.DB.Find(&disTypeList) | ||||||
|  | 		if err != nil { | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		diseaseTypeList := make(map[int64]string) | ||||||
|  | 		for _, v := range disTypeList { | ||||||
|  | 			diseaseTypeList[v.TypeId] = v.TypeName | ||||||
|  | 		} | ||||||
|  | 		diseaseLevelList := make(map[int]string) | ||||||
|  | 		diseaseLevelList[1] = "一级" | ||||||
|  | 		diseaseLevelList[2] = "二级" | ||||||
|  | 		diseaseLevelList[3] = "三级" | ||||||
|  | 
 | ||||||
|  | 		xlsx := excelize.NewFile() | ||||||
|  | 		xlsx.MergeCell("Sheet1", "A1", "L1") | ||||||
|  | 		xlsx.MergeCell("Sheet1", "A2", "L2") | ||||||
|  | 		xlsx.MergeCell("Sheet1", "A3", "L3") | ||||||
|  | 		xlsx.MergeCell("Sheet1", "A4", "L4") | ||||||
|  | 		xlsx.SetCellValue("Sheet1", "A4", "病害明细") | ||||||
|  | 		//序号	路线编码	方向	桩号	车道	病害名称	程度	长度(m)	宽度(m)	面积(㎡)	横向位置	备注
 | ||||||
|  | 
 | ||||||
|  | 		xlsx.SetCellValue("Sheet1", "A5", "序号") | ||||||
|  | 		xlsx.SetCellValue("Sheet1", "B5", "路线编码") | ||||||
|  | 		xlsx.SetCellValue("Sheet1", "C5", "方向") | ||||||
|  | 		xlsx.SetCellValue("Sheet1", "D5", "桩号") | ||||||
|  | 		xlsx.SetCellValue("Sheet1", "E5", "车道") | ||||||
|  | 		xlsx.SetCellValue("Sheet1", "F5", "病害名称") | ||||||
|  | 		xlsx.SetCellValue("Sheet1", "G5", "程度") | ||||||
|  | 		xlsx.SetCellValue("Sheet1", "H5", "长度(m)") | ||||||
|  | 		xlsx.SetCellValue("Sheet1", "I5", "宽度(m)") | ||||||
|  | 		xlsx.SetCellValue("Sheet1", "J5", "面积(㎡)") | ||||||
|  | 		xlsx.SetCellValue("Sheet1", "K5", "横向位置") | ||||||
|  | 		xlsx.SetCellValue("Sheet1", "L5", "备注") | ||||||
|  | 		for k, v := range list { | ||||||
|  | 			xlsx.SetCellValue("Sheet1", fmt.Sprintf("A%d", k+6), k+1) | ||||||
|  | 			xlsx.SetCellValue("Sheet1", fmt.Sprintf("B%d", k+6), v.KPile) | ||||||
|  | 			switch v.UpDown { | ||||||
|  | 			case 1: | ||||||
|  | 				xlsx.SetCellValue("Sheet1", fmt.Sprintf("C%d", k+6), "上行") | ||||||
|  | 			case 2: | ||||||
|  | 				xlsx.SetCellValue("Sheet1", fmt.Sprintf("C%d", k+6), "下行") | ||||||
|  | 			} | ||||||
|  | 			xlsx.SetCellValue("Sheet1", fmt.Sprintf("D%d", k+6), v.KPile) | ||||||
|  | 			xlsx.SetCellValue("Sheet1", fmt.Sprintf("E%d", k+6), v.LineNum) | ||||||
|  | 			xlsx.SetCellValue("Sheet1", fmt.Sprintf("F%d", k+6), diseaseTypeList[int64(v.DiseaseType)]) | ||||||
|  | 
 | ||||||
|  | 			xlsx.SetCellValue("Sheet1", fmt.Sprintf("G%d", k+6), diseaseLevelList[v.DiseaseLevel]) | ||||||
|  | 			xlsx.SetCellValue("Sheet1", fmt.Sprintf("H%d", k+6), v.Length) | ||||||
|  | 			xlsx.SetCellValue("Sheet1", fmt.Sprintf("I%d", k+6), v.Width) | ||||||
|  | 			xlsx.SetCellValue("Sheet1", fmt.Sprintf("J%d", k+6), v.Area) | ||||||
|  | 			xlsx.SetCellValue("Sheet1", fmt.Sprintf("K%d", k+6), v.HorizontalPositions) | ||||||
|  | 			xlsx.SetCellValue("Sheet1", fmt.Sprintf("K%d", k+6), v.Memo) | ||||||
|  | 
 | ||||||
|  | 		} | ||||||
|  | 		//rsp = xlsx
 | ||||||
|  | 		//rsp.Code = http.StatusOK
 | ||||||
|  | 		//rsp.Status = http.StatusText(http.StatusOK)
 | ||||||
|  | 		//rsp.Message = "成功"
 | ||||||
|  | 		//rsp.Data = xlsx
 | ||||||
|  | 		//rsp.Err = err
 | ||||||
|  | 		return xlsx, err | ||||||
|  | 	} | ||||||
|  | ReturnPoint: | ||||||
|  | 	if err != nil { | ||||||
|  | 		rsp = nil | ||||||
|  | 		//rsp.Code = http.StatusInternalServerError
 | ||||||
|  | 		//rsp.Status = http.StatusText(http.StatusInternalServerError)
 | ||||||
|  | 		//rsp.Err = err
 | ||||||
|  | 		//rsp.Message = "失败"
 | ||||||
|  | 	} | ||||||
|  | 	return rsp, err | ||||||
|  | } | ||||||
|  | @ -411,7 +411,7 @@ func (rp *repo) NodeState(ctx context.Context, req proto.NodeInfoRequest) (rsp * | ||||||
| 		return rsp, ctx.Err() | 		return rsp, ctx.Err() | ||||||
| 	default: | 	default: | ||||||
| 		list := make([]model.NodeState, 0) | 		list := make([]model.NodeState, 0) | ||||||
| 		err = rp.engine.Where("node_name = ?", req.NodeGuid). | 		err = rp.engine.Where("node_guid = ?", req.NodeGuid). | ||||||
| 			And(" uptime > UNIX_TIMESTAMP(DATE_ADD(NOW(),INTERVAL -24 HOUR))"). | 			And(" uptime > UNIX_TIMESTAMP(DATE_ADD(NOW(),INTERVAL -24 HOUR))"). | ||||||
| 			Find(&list) | 			Find(&list) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
|  |  | ||||||
|  | @ -1,7 +1,9 @@ | ||||||
| package service | package service | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
|  | 	"bytes" | ||||||
| 	"context" | 	"context" | ||||||
|  | 	"encoding/base64" | ||||||
| 	"encoding/json" | 	"encoding/json" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"git.hpds.cc/Component/logging" | 	"git.hpds.cc/Component/logging" | ||||||
|  | @ -9,15 +11,21 @@ import ( | ||||||
| 	"hpds-iot-web/internal/proto" | 	"hpds-iot-web/internal/proto" | ||||||
| 	"hpds-iot-web/model" | 	"hpds-iot-web/model" | ||||||
| 	"hpds-iot-web/mq" | 	"hpds-iot-web/mq" | ||||||
|  | 	"image" | ||||||
| 	"net/http" | 	"net/http" | ||||||
|  | 	"strconv" | ||||||
| 	"time" | 	"time" | ||||||
| 	"xorm.io/xorm" | 	"xorm.io/xorm" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type TaskService interface { | type TaskService interface { | ||||||
| 	TaskList(ctx context.Context, req proto.TaskRequest) (rsp *proto.BaseResponse, err error) | 	TaskList(ctx context.Context, req proto.TaskRequest) (rsp *proto.BaseResponse, err error) | ||||||
|  | 	TaskInfo(ctx context.Context, req proto.TaskItemRequest) (rsp *proto.BaseResponse, err error) | ||||||
| 	AddTask(ctx context.Context, req proto.TaskItemRequest) (rsp *proto.BaseResponse, err error) | 	AddTask(ctx context.Context, req proto.TaskItemRequest) (rsp *proto.BaseResponse, err error) | ||||||
|  | 	ReRunTask(ctx context.Context, req proto.TaskItemRequest) (rsp *proto.BaseResponse, err error) | ||||||
| 	//EditTask(ctx context.Context, req proto.ModelItemRequest) (rsp *proto.BaseResponse, err error)
 | 	//EditTask(ctx context.Context, req proto.ModelItemRequest) (rsp *proto.BaseResponse, err error)
 | ||||||
|  | 	TaskResult(ctx context.Context, req proto.ReportRequest) (rsp *proto.BaseResponse, err error) | ||||||
|  | 	TaskLog(ctx context.Context, req proto.TaskItemRequest) (rsp *proto.BaseResponse, err error) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func NewTaskService(engine *xorm.Engine, logger *logging.Logger) TaskService { | func NewTaskService(engine *xorm.Engine, logger *logging.Logger) TaskService { | ||||||
|  | @ -48,6 +56,7 @@ func (rp *repo) TaskList(ctx context.Context, req proto.TaskRequest) (rsp *proto | ||||||
| 			And("t.start_time >= unix_timestamp(?)", req.StartTime). | 			And("t.start_time >= unix_timestamp(?)", req.StartTime). | ||||||
| 			And("? = 0 or t.start_time <= unix_timestamp(?)", req.FinishTime, req.FinishTime). | 			And("? = 0 or t.start_time <= unix_timestamp(?)", req.FinishTime, req.FinishTime). | ||||||
| 			And("t.status > 0").Limit(int(req.Size), int(((req.Page)-1)*req.Size)). | 			And("t.status > 0").Limit(int(req.Size), int(((req.Page)-1)*req.Size)). | ||||||
|  | 			Desc("start_time"). | ||||||
| 			FindAndCount(&data) | 			FindAndCount(&data) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			goto ReturnPoint | 			goto ReturnPoint | ||||||
|  | @ -92,7 +101,7 @@ func (rp *repo) AddTask(ctx context.Context, req proto.TaskItemRequest) (rsp *pr | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		ds := new(model.Dataset) | 		ds := new(model.Dataset) | ||||||
| 		h, err = rp.engine.ID(req.ModelId).Get(ds) | 		h, err = rp.engine.ID(req.DatasetArr).Get(ds) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			goto ReturnPoint | 			goto ReturnPoint | ||||||
| 		} | 		} | ||||||
|  | @ -100,6 +109,18 @@ func (rp *repo) AddTask(ctx context.Context, req proto.TaskItemRequest) (rsp *pr | ||||||
| 			err = fmt.Errorf("未能找到对应的数据集") | 			err = fmt.Errorf("未能找到对应的数据集") | ||||||
| 			goto ReturnPoint | 			goto ReturnPoint | ||||||
| 		} | 		} | ||||||
|  | 		var node *model.Node | ||||||
|  | 		if req.NodeId > 0 { | ||||||
|  | 			node = new(model.Node) | ||||||
|  | 			h, err = rp.engine.ID(req.NodeId).Get(node) | ||||||
|  | 			if err != nil { | ||||||
|  | 				goto ReturnPoint | ||||||
|  | 			} | ||||||
|  | 			if !h { | ||||||
|  | 				err = fmt.Errorf("未能找到对应的节点") | ||||||
|  | 				goto ReturnPoint | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
| 
 | 
 | ||||||
| 		item := &model.Task{ | 		item := &model.Task{ | ||||||
| 			ModelId:         req.ModelId, | 			ModelId:         req.ModelId, | ||||||
|  | @ -143,6 +164,9 @@ func (rp *repo) AddTask(ctx context.Context, req proto.TaskItemRequest) (rsp *pr | ||||||
| 		payload["modelVersion"] = m.ModelVersion | 		payload["modelVersion"] = m.ModelVersion | ||||||
| 		payload["modelCommand"] = m.ModelCommand | 		payload["modelCommand"] = m.ModelCommand | ||||||
| 		payload["nodeId"] = item.NodeId | 		payload["nodeId"] = item.NodeId | ||||||
|  | 		if item.NodeId > 0 && node != nil { | ||||||
|  | 			payload["nodeGuid"] = node.NodeGuid | ||||||
|  | 		} | ||||||
| 		payload["inPath"] = m.InPath | 		payload["inPath"] = m.InPath | ||||||
| 		payload["outPath"] = m.OutPath | 		payload["outPath"] = m.OutPath | ||||||
| 		payload["httpUrl"] = m.HttpUrl | 		payload["httpUrl"] = m.HttpUrl | ||||||
|  | @ -153,6 +177,11 @@ func (rp *repo) AddTask(ctx context.Context, req proto.TaskItemRequest) (rsp *pr | ||||||
| 		payload["subDataTag"] = item.SubDataTag | 		payload["subDataTag"] = item.SubDataTag | ||||||
| 		payload["workflow"] = m.Workflow | 		payload["workflow"] = m.Workflow | ||||||
| 
 | 
 | ||||||
|  | 		issue := new(model.IssueModel) | ||||||
|  | 		h, _ = model.DB.Where("model_id=? and node_id =?", req.ModelId, item.NodeId).Get(issue) | ||||||
|  | 		if h { | ||||||
|  | 			payload["issueResult"] = issue.IssueResult | ||||||
|  | 		} | ||||||
| 		mqClient := mq.GetMqClient("task-request", 1) | 		mqClient := mq.GetMqClient("task-request", 1) | ||||||
| 		mqPayload := &mq.InstructionReq{ | 		mqPayload := &mq.InstructionReq{ | ||||||
| 			Command: mq.TaskAdd, | 			Command: mq.TaskAdd, | ||||||
|  | @ -176,3 +205,473 @@ ReturnPoint: | ||||||
| 	} | 	} | ||||||
| 	return rsp, err | 	return rsp, err | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func (rp *repo) ReRunTask(ctx context.Context, req proto.TaskItemRequest) (rsp *proto.BaseResponse, err error) { | ||||||
|  | 	rsp = new(proto.BaseResponse) | ||||||
|  | 	select { | ||||||
|  | 	case <-ctx.Done(): | ||||||
|  | 		err = fmt.Errorf("超时/取消") | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Message = "超时/取消" | ||||||
|  | 		rsp.Err = ctx.Err() | ||||||
|  | 		return rsp, ctx.Err() | ||||||
|  | 	default: | ||||||
|  | 		item := new(model.Task) | ||||||
|  | 		var h bool | ||||||
|  | 		h, err = rp.engine.ID(req.TaskId).Get(item) | ||||||
|  | 		if err != nil { | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		if !h { | ||||||
|  | 			err = fmt.Errorf("未能找到任务") | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		m := new(model.Model) | ||||||
|  | 		h, err = rp.engine.ID(item.ModelId).Get(m) | ||||||
|  | 		if err != nil { | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		if !h { | ||||||
|  | 			err = fmt.Errorf("未能找到对应的模型") | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		ds := new(model.Dataset) | ||||||
|  | 		h, err = rp.engine.ID(item.DatasetArr).Get(ds) | ||||||
|  | 		if err != nil { | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		if !h { | ||||||
|  | 			err = fmt.Errorf("未能找到对应的数据集") | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		var node *model.Node | ||||||
|  | 		if item.NodeId > 0 { | ||||||
|  | 			node = new(model.Node) | ||||||
|  | 			h, err = rp.engine.ID(item.NodeId).Get(node) | ||||||
|  | 			if err != nil { | ||||||
|  | 				goto ReturnPoint | ||||||
|  | 			} | ||||||
|  | 			if !h { | ||||||
|  | 				err = fmt.Errorf("未能找到对应的节点") | ||||||
|  | 				goto ReturnPoint | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		payload := make(map[string]interface{}) | ||||||
|  | 		payload["taskId"] = item.TaskId | ||||||
|  | 		payload["modelId"] = item.ModelId | ||||||
|  | 		payload["modelVersion"] = m.ModelVersion | ||||||
|  | 		payload["modelCommand"] = m.ModelCommand | ||||||
|  | 		payload["nodeId"] = item.NodeId | ||||||
|  | 		if item.NodeId > 0 && node != nil { | ||||||
|  | 			payload["nodeGuid"] = node.NodeGuid | ||||||
|  | 		} | ||||||
|  | 		payload["inPath"] = m.InPath | ||||||
|  | 		payload["outPath"] = m.OutPath | ||||||
|  | 		payload["httpUrl"] = m.HttpUrl | ||||||
|  | 		payload["datasetArr"] = item.DatasetArr | ||||||
|  | 		payload["datasetPath"] = ds.StoreName | ||||||
|  | 		payload["datasetName"] = ds.DatasetName | ||||||
|  | 		payload["subDataset"] = item.SubDataset | ||||||
|  | 		payload["subDataTag"] = item.SubDataTag | ||||||
|  | 		payload["workflow"] = m.Workflow | ||||||
|  | 
 | ||||||
|  | 		issue := new(model.IssueModel) | ||||||
|  | 		h, _ = model.DB.Where("model_id=? and node_id =?", req.ModelId, item.NodeId).Get(issue) | ||||||
|  | 		if h { | ||||||
|  | 			payload["issueResult"] = issue.IssueResult | ||||||
|  | 		} | ||||||
|  | 		mqClient := mq.GetMqClient("task-request", 1) | ||||||
|  | 		mqPayload := &mq.InstructionReq{ | ||||||
|  | 			Command: mq.TaskAdd, | ||||||
|  | 			Payload: payload, | ||||||
|  | 		} | ||||||
|  | 		pData, _ := json.Marshal(mqPayload) | ||||||
|  | 		err = mq.GenerateAndSendData(mqClient.EndPoint.(hpds_node.AccessPoint), pData, rp.logger) | ||||||
|  | 		if err != nil { | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		rsp.Code = http.StatusOK | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusOK) | ||||||
|  | 		rsp.Message = "重新任务成功" | ||||||
|  | 		rsp.Err = ctx.Err() | ||||||
|  | 		rsp.Data = item | ||||||
|  | 		return rsp, err | ||||||
|  | 	} | ||||||
|  | ReturnPoint: | ||||||
|  | 	if err != nil { | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Err = err | ||||||
|  | 		rsp.Message = "失败" | ||||||
|  | 	} | ||||||
|  | 	return rsp, err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (rp *repo) TaskInfo(ctx context.Context, req proto.TaskItemRequest) (rsp *proto.BaseResponse, err error) { | ||||||
|  | 	rsp = new(proto.BaseResponse) | ||||||
|  | 	select { | ||||||
|  | 	case <-ctx.Done(): | ||||||
|  | 		err = fmt.Errorf("超时/取消") | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Message = "超时/取消" | ||||||
|  | 		rsp.Err = ctx.Err() | ||||||
|  | 		return rsp, ctx.Err() | ||||||
|  | 	default: | ||||||
|  | 		item := new(model.Task) | ||||||
|  | 		var b bool | ||||||
|  | 		b, err = rp.engine.ID(req.TaskId).Get(item) | ||||||
|  | 		if err != nil { | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		if !b { | ||||||
|  | 			err = fmt.Errorf("未能找到对应的任务") | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		rsp.Code = http.StatusOK | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusOK) | ||||||
|  | 		rsp.Message = "成功" | ||||||
|  | 		rsp.Err = err | ||||||
|  | 		rsp.Data = item | ||||||
|  | 		return rsp, err | ||||||
|  | 	} | ||||||
|  | ReturnPoint: | ||||||
|  | 	if err != nil { | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Err = err | ||||||
|  | 		rsp.Message = "失败" | ||||||
|  | 	} | ||||||
|  | 	return rsp, err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (rp *repo) TaskResult(ctx context.Context, req proto.ReportRequest) (rsp *proto.BaseResponse, err error) { | ||||||
|  | 	rsp = new(proto.BaseResponse) | ||||||
|  | 	select { | ||||||
|  | 	case <-ctx.Done(): | ||||||
|  | 		err = fmt.Errorf("超时/取消") | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Message = "超时/取消" | ||||||
|  | 		rsp.Err = ctx.Err() | ||||||
|  | 		return rsp, ctx.Err() | ||||||
|  | 	default: | ||||||
|  | 		taskResultList := make([]model.TaskResult, 0) | ||||||
|  | 		err = rp.engine.Where("task_id = ?", req.TaskId). | ||||||
|  | 			Limit(int(req.Size), int(((req.Page)-1)*req.Size)). | ||||||
|  | 			Find(&taskResultList) | ||||||
|  | 		if err != nil { | ||||||
|  | 			err = fmt.Errorf("未能找到对应的结果") | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		list := make([]proto.TaskResultItem, 0) | ||||||
|  | 		for _, v := range taskResultList { | ||||||
|  | 			var h bool | ||||||
|  | 			file := new(model.FileManager) | ||||||
|  | 			h, err = rp.engine.ID(v.FileId).Get(file) | ||||||
|  | 			if err != nil || !h { | ||||||
|  | 				continue | ||||||
|  | 			} | ||||||
|  | 			md := new(model.Model) | ||||||
|  | 			h, err = rp.engine.ID(v.ModelId).Get(md) | ||||||
|  | 			if err != nil || !h { | ||||||
|  | 				continue | ||||||
|  | 			} | ||||||
|  | 			var ( | ||||||
|  | 				mr               mq.ModelResult | ||||||
|  | 				mrList           []string | ||||||
|  | 				fileDiscern      string | ||||||
|  | 				memo             string | ||||||
|  | 				diseaseType      int64 | ||||||
|  | 				diseaseLevel     int | ||||||
|  | 				length           float64 | ||||||
|  | 				area             float64 | ||||||
|  | 				width            float64 | ||||||
|  | 				diseaseTypeName  string | ||||||
|  | 				diseaseLevelName string | ||||||
|  | 			) | ||||||
|  | 			if len(v.Result) > 0 && v.Result[0] == '[' { | ||||||
|  | 				mrList = make([]string, 0) | ||||||
|  | 				if err := json.Unmarshal([]byte(v.Result), &mrList); err != nil { | ||||||
|  | 					continue | ||||||
|  | 				} | ||||||
|  | 				for _, str := range mrList { | ||||||
|  | 					if err := json.Unmarshal([]byte(str), &mr); err != nil { | ||||||
|  | 						continue | ||||||
|  | 					} | ||||||
|  | 					switch mr.Code { | ||||||
|  | 					case 0: //轻量化模型返回
 | ||||||
|  | 						lr := new(mq.LightweightResult) | ||||||
|  | 						if err := json.Unmarshal([]byte(v.Result), lr); err != nil { | ||||||
|  | 							continue | ||||||
|  | 						} | ||||||
|  | 						//for _, val := range lrList {
 | ||||||
|  | 						if lr.Crack || lr.Pothole { | ||||||
|  | 							if lr.Crack { | ||||||
|  | 								memo = "检测到裂缝" | ||||||
|  | 							} else { | ||||||
|  | 								memo = "检测到坑洼" | ||||||
|  | 							} | ||||||
|  | 							fileDiscern = lr.ImgDiscern | ||||||
|  | 							diseaseLevel = 3 | ||||||
|  | 							diseaseLevelName = "重度" | ||||||
|  | 							switch md.BizType { | ||||||
|  | 							case 2: | ||||||
|  | 								diseaseType = 8 | ||||||
|  | 								diseaseTypeName = "结构裂缝" | ||||||
|  | 							case 3: | ||||||
|  | 								diseaseType = 15 | ||||||
|  | 								diseaseTypeName = "衬砌裂缝" | ||||||
|  | 							default: | ||||||
|  | 								diseaseType = 4 | ||||||
|  | 								diseaseTypeName = "横向裂缝" | ||||||
|  | 							} | ||||||
|  | 						} | ||||||
|  | 						fn, _ := base64.StdEncoding.DecodeString(fileDiscern) | ||||||
|  | 						buff := bytes.NewBuffer(fn) | ||||||
|  | 						_, imgType, _ := image.Decode(buff) | ||||||
|  | 						fileDiscern = fmt.Sprintf("data:image/%s;base64,%s", imgType, fileDiscern) | ||||||
|  | 						item := proto.TaskResultItem{ | ||||||
|  | 							FileId:              v.FileId, | ||||||
|  | 							FileName:            v.SrcPath, | ||||||
|  | 							SrcFile:             file.AccessUrl, | ||||||
|  | 							DistFile:            fileDiscern, | ||||||
|  | 							DiseaseType:         int(diseaseType), | ||||||
|  | 							DiseaseTypeName:     diseaseTypeName, | ||||||
|  | 							DiseaseLevel:        diseaseLevel, | ||||||
|  | 							DiseaseLevelName:    diseaseLevelName, | ||||||
|  | 							KPile:               "", | ||||||
|  | 							UpDown:              0, | ||||||
|  | 							LineNum:             0, | ||||||
|  | 							Length:              length, | ||||||
|  | 							Width:               width, | ||||||
|  | 							Area:                area, | ||||||
|  | 							HorizontalPositions: 0, | ||||||
|  | 							Memo:                memo, | ||||||
|  | 							Stat:                false, | ||||||
|  | 						} | ||||||
|  | 						list = append(list, item) | ||||||
|  | 						//}
 | ||||||
|  | 					case 2000: | ||||||
|  | 						ir := new(mq.InsigmaResult) | ||||||
|  | 						if err := json.Unmarshal([]byte(str), &ir); err != nil { | ||||||
|  | 							continue | ||||||
|  | 						} | ||||||
|  | 						fileDiscern = ir.Image | ||||||
|  | 						fn, _ := base64.StdEncoding.DecodeString(fileDiscern) | ||||||
|  | 						buff := bytes.NewBuffer(fn) | ||||||
|  | 						_, imgType, _ := image.Decode(buff) | ||||||
|  | 						fileDiscern = fmt.Sprintf("data:image/%s;base64,%s", imgType, fileDiscern) | ||||||
|  | 						item := proto.TaskResultItem{ | ||||||
|  | 							FileId:              v.FileId, | ||||||
|  | 							FileName:            v.SrcPath, | ||||||
|  | 							SrcFile:             file.AccessUrl, | ||||||
|  | 							DistFile:            fileDiscern, | ||||||
|  | 							DiseaseType:         int(diseaseType), | ||||||
|  | 							DiseaseTypeName:     diseaseTypeName, | ||||||
|  | 							DiseaseLevel:        diseaseLevel, | ||||||
|  | 							DiseaseLevelName:    diseaseLevelName, | ||||||
|  | 							KPile:               "", | ||||||
|  | 							UpDown:              0, | ||||||
|  | 							LineNum:             0, | ||||||
|  | 							Length:              length, | ||||||
|  | 							Width:               width, | ||||||
|  | 							Area:                area, | ||||||
|  | 							HorizontalPositions: 0, | ||||||
|  | 							Memo:                memo, | ||||||
|  | 							Stat:                false, | ||||||
|  | 						} | ||||||
|  | 						list = append(list, item) | ||||||
|  | 
 | ||||||
|  | 					case 2001: | ||||||
|  | 						ir := new(mq.InsigmaResult) | ||||||
|  | 						if err := json.Unmarshal([]byte(str), &ir); err != nil { | ||||||
|  | 							continue | ||||||
|  | 						} | ||||||
|  | 						fileDiscern = ir.Image | ||||||
|  | 						for _, value := range ir.Diseases { | ||||||
|  | 							diseaseType = model.GetDiseaseType(value.Type, md.BizType) | ||||||
|  | 							if len(value.Param.MaxWidth) > 0 && width == 0 { | ||||||
|  | 								width, _ = strconv.ParseFloat(value.Param.MaxWidth, 64) | ||||||
|  | 							} | ||||||
|  | 							length = value.Param.Length | ||||||
|  | 							area = value.Param.Area | ||||||
|  | 							diseaseLevelName = value.Level | ||||||
|  | 							diseaseTypeName = value.Type | ||||||
|  | 							switch value.Level { | ||||||
|  | 							case "重度": | ||||||
|  | 								diseaseLevel = 3 | ||||||
|  | 							case "中度": | ||||||
|  | 								diseaseLevel = 2 | ||||||
|  | 							case "轻度": | ||||||
|  | 								diseaseLevel = 1 | ||||||
|  | 							} | ||||||
|  | 							memo += fmt.Sprintf("发现[%s],等级[%s],长度[%f],最大宽度[%s],面积[%f];\n", value.Type, value.Level, value.Param.Length, value.Param.MaxWidth, value.Param.Area) | ||||||
|  | 						} | ||||||
|  | 						fn, _ := base64.StdEncoding.DecodeString(fileDiscern) | ||||||
|  | 						buff := bytes.NewBuffer(fn) | ||||||
|  | 						_, imgType, _ := image.Decode(buff) | ||||||
|  | 						fileDiscern = fmt.Sprintf("data:image/%s;base64,%s", imgType, fileDiscern) | ||||||
|  | 						item := proto.TaskResultItem{ | ||||||
|  | 							FileId:              v.FileId, | ||||||
|  | 							FileName:            v.SrcPath, | ||||||
|  | 							SrcFile:             file.AccessUrl, | ||||||
|  | 							DistFile:            fileDiscern, | ||||||
|  | 							DiseaseType:         int(diseaseType), | ||||||
|  | 							DiseaseTypeName:     diseaseTypeName, | ||||||
|  | 							DiseaseLevel:        diseaseLevel, | ||||||
|  | 							DiseaseLevelName:    diseaseLevelName, | ||||||
|  | 							KPile:               "", | ||||||
|  | 							UpDown:              0, | ||||||
|  | 							LineNum:             0, | ||||||
|  | 							Length:              length, | ||||||
|  | 							Width:               width, | ||||||
|  | 							Area:                area, | ||||||
|  | 							HorizontalPositions: 0, | ||||||
|  | 							Memo:                memo, | ||||||
|  | 							Stat:                false, | ||||||
|  | 						} | ||||||
|  | 						list = append(list, item) | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 			} else { | ||||||
|  | 				if err := json.Unmarshal([]byte(v.Result), &mr); err != nil { | ||||||
|  | 					continue | ||||||
|  | 				} | ||||||
|  | 				switch mr.Code { | ||||||
|  | 				case 0: //轻量化模型返回
 | ||||||
|  | 					lr := new(mq.LightweightResult) | ||||||
|  | 					if err := json.Unmarshal([]byte(v.Result), &lr); err != nil { | ||||||
|  | 						continue | ||||||
|  | 					} | ||||||
|  | 					if lr.Crack || lr.Pothole { | ||||||
|  | 						if lr.Crack { | ||||||
|  | 							memo = "检测到裂缝" | ||||||
|  | 						} else { | ||||||
|  | 							memo = "检测到坑洼" | ||||||
|  | 						} | ||||||
|  | 						fileDiscern = lr.ImgDiscern | ||||||
|  | 						diseaseLevel = 3 | ||||||
|  | 						diseaseLevelName = "重度" | ||||||
|  | 						switch md.BizType { | ||||||
|  | 						case 2: | ||||||
|  | 							diseaseType = 8 | ||||||
|  | 							diseaseTypeName = "结构裂缝" | ||||||
|  | 						case 3: | ||||||
|  | 							diseaseType = 15 | ||||||
|  | 							diseaseTypeName = "衬砌裂缝" | ||||||
|  | 						default: | ||||||
|  | 							diseaseType = 4 | ||||||
|  | 							diseaseTypeName = "横向裂缝" | ||||||
|  | 						} | ||||||
|  | 					} | ||||||
|  | 					//
 | ||||||
|  | 				case 2000: //网新返回没有病害
 | ||||||
|  | 					ir := new(mq.InsigmaResult) | ||||||
|  | 					if err := json.Unmarshal([]byte(v.Result), &ir); err != nil { | ||||||
|  | 						continue | ||||||
|  | 					} | ||||||
|  | 					fileDiscern = ir.Image | ||||||
|  | 				case 2001: //网新返回有病害
 | ||||||
|  | 					ir := new(mq.InsigmaResult) | ||||||
|  | 					if err := json.Unmarshal([]byte(v.Result), &ir); err != nil { | ||||||
|  | 						continue | ||||||
|  | 					} | ||||||
|  | 					fileDiscern = ir.Image | ||||||
|  | 					for _, val := range ir.Diseases { | ||||||
|  | 						diseaseType = model.GetDiseaseType(val.Type, md.BizType) | ||||||
|  | 						if len(val.Param.MaxWidth) > 0 && width == 0 { | ||||||
|  | 							width, _ = strconv.ParseFloat(val.Param.MaxWidth, 64) | ||||||
|  | 						} | ||||||
|  | 						length = val.Param.Length | ||||||
|  | 						area = val.Param.Area | ||||||
|  | 						diseaseLevelName = val.Level | ||||||
|  | 						diseaseTypeName = val.Type | ||||||
|  | 						switch val.Level { | ||||||
|  | 						case "重度": | ||||||
|  | 							diseaseLevel = 3 | ||||||
|  | 						case "中度": | ||||||
|  | 							diseaseLevel = 2 | ||||||
|  | 						case "轻度": | ||||||
|  | 							diseaseLevel = 1 | ||||||
|  | 						} | ||||||
|  | 						memo += fmt.Sprintf("发现[%s],等级[%s],长度[%f],最大宽度[%s],面积[%f];\n", val.Type, val.Level, val.Param.Length, val.Param.MaxWidth, val.Param.Area) | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 				fn, _ := base64.StdEncoding.DecodeString(fileDiscern) | ||||||
|  | 				buff := bytes.NewBuffer(fn) | ||||||
|  | 				_, imgType, _ := image.Decode(buff) | ||||||
|  | 				fileDiscern = fmt.Sprintf("data:image/%s;base64,%s", imgType, fileDiscern) | ||||||
|  | 				item := proto.TaskResultItem{ | ||||||
|  | 					FileId:              v.FileId, | ||||||
|  | 					FileName:            v.SrcPath, | ||||||
|  | 					SrcFile:             file.AccessUrl, | ||||||
|  | 					DistFile:            fileDiscern, | ||||||
|  | 					DiseaseType:         int(diseaseType), | ||||||
|  | 					DiseaseTypeName:     diseaseTypeName, | ||||||
|  | 					DiseaseLevel:        diseaseLevel, | ||||||
|  | 					DiseaseLevelName:    diseaseLevelName, | ||||||
|  | 					KPile:               "", | ||||||
|  | 					UpDown:              0, | ||||||
|  | 					LineNum:             0, | ||||||
|  | 					Length:              length, | ||||||
|  | 					Width:               width, | ||||||
|  | 					Area:                area, | ||||||
|  | 					HorizontalPositions: 0, | ||||||
|  | 					Memo:                memo, | ||||||
|  | 					Stat:                false, | ||||||
|  | 				} | ||||||
|  | 				list = append(list, item) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		rsp.Code = http.StatusOK | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusOK) | ||||||
|  | 		rsp.Message = "成功" | ||||||
|  | 		rsp.Err = err | ||||||
|  | 		rsp.Data = list | ||||||
|  | 		return rsp, err | ||||||
|  | 	} | ||||||
|  | ReturnPoint: | ||||||
|  | 	if err != nil { | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Err = err | ||||||
|  | 		rsp.Message = "失败" | ||||||
|  | 	} | ||||||
|  | 	return rsp, err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (rp *repo) TaskLog(ctx context.Context, req proto.TaskItemRequest) (rsp *proto.BaseResponse, err error) { | ||||||
|  | 	rsp = new(proto.BaseResponse) | ||||||
|  | 	select { | ||||||
|  | 	case <-ctx.Done(): | ||||||
|  | 		err = fmt.Errorf("超时/取消") | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Message = "超时/取消" | ||||||
|  | 		rsp.Err = ctx.Err() | ||||||
|  | 		return rsp, ctx.Err() | ||||||
|  | 	default: | ||||||
|  | 		list := make([]model.TaskLog, 0) | ||||||
|  | 		err = rp.engine.Where("task_id = ?", req.TaskId).Find(&list) | ||||||
|  | 		if err != nil { | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		rsp.Code = http.StatusOK | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusOK) | ||||||
|  | 		rsp.Message = "成功" | ||||||
|  | 		rsp.Err = err | ||||||
|  | 		rsp.Data = list | ||||||
|  | 		return rsp, err | ||||||
|  | 	} | ||||||
|  | ReturnPoint: | ||||||
|  | 	if err != nil { | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Err = err | ||||||
|  | 		rsp.Message = "失败" | ||||||
|  | 	} | ||||||
|  | 	return rsp, err | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -0,0 +1,14 @@ | ||||||
|  | package model | ||||||
|  | 
 | ||||||
|  | type TaskLog struct { | ||||||
|  | 	TaskLogId int64  `xorm:"not null pk autoincr BIGINT(11)" json:"taskLogId"` | ||||||
|  | 	TaskId    int64  `xorm:"INT(11) index" json:"taskId"` | ||||||
|  | 	NodeId    int64  `xorm:"INT(11) index" json:"nodeId"` | ||||||
|  | 	Content   string `xorm:"LANGTEXT" json:"content"` | ||||||
|  | 	CreateAt  int64  `xorm:"created" json:"createAt"` | ||||||
|  | 	UpdateAt  int64  `xorm:"updated" json:"updateAt"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func InsertLog(taskLog *TaskLog) { | ||||||
|  | 	_, _ = DB.Insert(taskLog) | ||||||
|  | } | ||||||
|  | @ -9,3 +9,15 @@ type DiseaseType struct { | ||||||
| 	CreateAt   int64  `xorm:"created" json:"createAt"` | 	CreateAt   int64  `xorm:"created" json:"createAt"` | ||||||
| 	UpdateAt   int64  `xorm:"updated" json:"updateAt"` | 	UpdateAt   int64  `xorm:"updated" json:"updateAt"` | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func GetDiseaseType(name string, categoryId int) int64 { | ||||||
|  | 	item := new(DiseaseType) | ||||||
|  | 	h, err := DB.Where("type_name like ?", "%"+name+"%"). | ||||||
|  | 		And("category_id = ?", categoryId). | ||||||
|  | 		And("status = 1").Get(item) | ||||||
|  | 	if err != nil || !h { | ||||||
|  | 		return 0 | ||||||
|  | 	} | ||||||
|  | 	return item.TypeId | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -5,6 +5,7 @@ type FileManager struct { | ||||||
| 	FileName  string `xorm:"VARCHAR(200)" json:"fileName"`               //文件名
 | 	FileName  string `xorm:"VARCHAR(200)" json:"fileName"`               //文件名
 | ||||||
| 	AccessUrl string `xorm:"VARCHAR(400)" json:"url"`                    //访问路径
 | 	AccessUrl string `xorm:"VARCHAR(400)" json:"url"`                    //访问路径
 | ||||||
| 	Scene     string `xorm:"VARCHAR(40)" json:"scene"`                   //应用场景,0 : 其他, 1: 道路; 2: 桥梁; 3:隧道; 4: 边坡
 | 	Scene     string `xorm:"VARCHAR(40)" json:"scene"`                   //应用场景,0 : 其他, 1: 道路; 2: 桥梁; 3:隧道; 4: 边坡
 | ||||||
|  | 	DataType  int    `xorm:"TINYINT index default 0" json:"dataType"`    //数据类型,1:数据集;2:病害库;3:应用;0:其他
 | ||||||
| 	DatasetId int64  `xorm:"INT(11) index default 0" json:"datasetId"`   //数据集
 | 	DatasetId int64  `xorm:"INT(11) index default 0" json:"datasetId"`   //数据集
 | ||||||
| 	FileSize  int64  `xorm:"BIGINT" json:"fileSize"`                     //文件大小
 | 	FileSize  int64  `xorm:"BIGINT" json:"fileSize"`                     //文件大小
 | ||||||
| 	FileMd5   string `xorm:"VARCHAR(64)" json:"fileMd5"`                 //文件MD5
 | 	FileMd5   string `xorm:"VARCHAR(64)" json:"fileMd5"`                 //文件MD5
 | ||||||
|  |  | ||||||
|  | @ -59,6 +59,7 @@ func New(driveName, dsn string, showSql bool) { | ||||||
| 		&SystemUser{}, | 		&SystemUser{}, | ||||||
| 		&SystemUserRole{}, | 		&SystemUserRole{}, | ||||||
| 		&Task{}, | 		&Task{}, | ||||||
|  | 		&TaskLog{}, | ||||||
| 		&TaskResult{}, | 		&TaskResult{}, | ||||||
| 	) | 	) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|  |  | ||||||
|  | @ -3,7 +3,8 @@ package model | ||||||
| // NodeState 节点状态信息
 | // NodeState 节点状态信息
 | ||||||
| type NodeState struct { | type NodeState struct { | ||||||
| 	Uptime         uint64  `xorm:"BIGINT pk" json:"uptime,omitempty"` | 	Uptime         uint64  `xorm:"BIGINT pk" json:"uptime,omitempty"` | ||||||
| 	NodeName       string  `xorm:"varchar(100) pk" json:"nodeName"` | 	NodeGuid       string  `xorm:"varchar(100) pk" json:"nodeGuid,omitempty"` | ||||||
|  | 	NodeName       string  `xorm:"varchar(100)" json:"nodeName"` | ||||||
| 	CPU            float64 `xorm:"DECIMAL(18,4)" json:"cpu,omitempty"` | 	CPU            float64 `xorm:"DECIMAL(18,4)" json:"cpu,omitempty"` | ||||||
| 	MemUsed        uint64  `xorm:"BIGINT" json:"memUsed,omitempty"` | 	MemUsed        uint64  `xorm:"BIGINT" json:"memUsed,omitempty"` | ||||||
| 	SwapUsed       uint64  `xorm:"BIGINT" json:"swapUsed,omitempty"` | 	SwapUsed       uint64  `xorm:"BIGINT" json:"swapUsed,omitempty"` | ||||||
|  |  | ||||||
|  | @ -0,0 +1,9 @@ | ||||||
|  | package model | ||||||
|  | 
 | ||||||
|  | type Report struct { | ||||||
|  | 	ReportId int64 `xorm:"not null pk autoincr INT(11)" json:"reportId"` | ||||||
|  | 	TaskId   int64 `xorm:"INT(11) index" json:"taskId"` | ||||||
|  | 	Status   int   `xorm:"TINYINT  default 1" json:"status"` | ||||||
|  | 	CreateAt int64 `xorm:"created" json:"createAt"` | ||||||
|  | 	UpdateAt int64 `xorm:"updated" json:"updateAt"` | ||||||
|  | } | ||||||
|  | @ -0,0 +1,13 @@ | ||||||
|  | package model | ||||||
|  | 
 | ||||||
|  | type ReportDetail struct { | ||||||
|  | 	DetailId   int64  `xorm:"not null pk autoincr INT(11)" json:"detailId"` | ||||||
|  | 	ReportId   int64  `xorm:"INT(11) index" json:"reportId"` | ||||||
|  | 	FileId     int64  `xorm:"INT(11) index" json:"fileId"` | ||||||
|  | 	FieldName  string `xorm:"VARCHAR(100)" json:"fieldName"` | ||||||
|  | 	FieldValue string `xorm:"LONGTEXT" json:"fieldValue"` | ||||||
|  | 	Status     int    `xorm:"TINYINT default 1" json:"status"` | ||||||
|  | 	CreateAt   int64  `xorm:"created" json:"createAt"` | ||||||
|  | 	UpdateAt   int64  `xorm:"updated" json:"updateAt"` | ||||||
|  | 	DeleteAt   int64  `xorm:"deleted" json:"deleteAt"` | ||||||
|  | } | ||||||
|  | @ -12,6 +12,10 @@ type Task struct { | ||||||
| 	AppointmentTime string `xorm:"VARCHAR(30)" json:"appointmentTime"` | 	AppointmentTime string `xorm:"VARCHAR(30)" json:"appointmentTime"` | ||||||
| 	StartTime       int64  `xorm:"BIGINT" json:"startTime"` | 	StartTime       int64  `xorm:"BIGINT" json:"startTime"` | ||||||
| 	FinishTime      int64  `xorm:"BIGINT" json:"finishTime"` | 	FinishTime      int64  `xorm:"BIGINT" json:"finishTime"` | ||||||
|  | 	TotalCount      int64  `xorm:"INT" json:"totalCount"` | ||||||
|  | 	FailingCount    int64  `xorm:"INT" json:"failingCount"` | ||||||
|  | 	CompletedCount  int64  `xorm:"INT" json:"completedCount"` | ||||||
|  | 	UnfinishedCount int64  `xorm:"INT" json:"unfinishedCount"` | ||||||
| 	Status          int    `xorm:"not null SMALLINT default 0" json:"status"` // 1:等待执行; 2:执行中; 3:执行完成; 4:任务分配失败; 5:任务执行失败
 | 	Status          int    `xorm:"not null SMALLINT default 0" json:"status"` // 1:等待执行; 2:执行中; 3:执行完成; 4:任务分配失败; 5:任务执行失败
 | ||||||
| 	CreateAt        int64  `xorm:"created" json:"createAt"` | 	CreateAt        int64  `xorm:"created" json:"createAt"` | ||||||
| 	UpdateAt        int64  `xorm:"updated" json:"updateAt"` | 	UpdateAt        int64  `xorm:"updated" json:"updateAt"` | ||||||
|  |  | ||||||
|  | @ -11,5 +11,6 @@ type TaskResult struct { | ||||||
| 	SubDataset string `xorm:"varchar(200)" json:"subDataset"` | 	SubDataset string `xorm:"varchar(200)" json:"subDataset"` | ||||||
| 	DatasetId  int64  `xorm:"INT(11)" json:"datasetId"` | 	DatasetId  int64  `xorm:"INT(11)" json:"datasetId"` | ||||||
| 	SrcPath    string `xorm:"varchar(500)" json:"srcPath"` | 	SrcPath    string `xorm:"varchar(500)" json:"srcPath"` | ||||||
| 	Result     string `xorm:"TEXT" json:"result"` | 	Result     string `xorm:"LONGTEXT" json:"result"` | ||||||
|  | 	FileId     int64  `xorm:"BIGINT" json:"fileId"` | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										49
									
								
								mq/index.go
								
								
								
								
							
							
						
						
									
										49
									
								
								mq/index.go
								
								
								
								
							|  | @ -1,8 +1,10 @@ | ||||||
| package mq | package mq | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
|  | 	"encoding/json" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"git.hpds.cc/Component/logging" | 	"git.hpds.cc/Component/logging" | ||||||
|  | 	"git.hpds.cc/Component/network/frame" | ||||||
| 	"go.uber.org/zap" | 	"go.uber.org/zap" | ||||||
| 	"hpds-iot-web/config" | 	"hpds-iot-web/config" | ||||||
| 	"os" | 	"os" | ||||||
|  | @ -20,6 +22,23 @@ type HpdsMqNode struct { | ||||||
| 	EndPoint interface{} | 	EndPoint interface{} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | var ifChannelsMapInit = false | ||||||
|  | 
 | ||||||
|  | var ChannelsMap = map[string]chan string{} | ||||||
|  | 
 | ||||||
|  | func initChannelsMap() { | ||||||
|  | 	ChannelsMap = make(map[string]chan string) | ||||||
|  | } | ||||||
|  | func AddChannel(userId string) { | ||||||
|  | 	if !ifChannelsMapInit { | ||||||
|  | 		initChannelsMap() | ||||||
|  | 		ifChannelsMapInit = true | ||||||
|  | 	} | ||||||
|  | 	var newChannel = make(chan string) | ||||||
|  | 	ChannelsMap[userId] = newChannel | ||||||
|  | 	logging.L().Info("Build SSE connection for user = " + userId) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func must(logger *logging.Logger, err error) { | func must(logger *logging.Logger, err error) { | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		if logger != nil { | 		if logger != nil { | ||||||
|  | @ -39,7 +58,7 @@ func NewMqClient(funcs []config.FuncConfig, node config.HpdsNode, logger *loggin | ||||||
| 			sf := hpds_node.NewStreamFunction( | 			sf := hpds_node.NewStreamFunction( | ||||||
| 				v.Name, | 				v.Name, | ||||||
| 				hpds_node.WithMqAddr(fmt.Sprintf("%s:%d", node.Host, node.Port)), | 				hpds_node.WithMqAddr(fmt.Sprintf("%s:%d", node.Host, node.Port)), | ||||||
| 				hpds_node.WithObserveDataTags(v.DataTag), | 				hpds_node.WithObserveDataTags(frame.Tag(v.DataTag)), | ||||||
| 				hpds_node.WithCredential(node.Token), | 				hpds_node.WithCredential(node.Token), | ||||||
| 			) | 			) | ||||||
| 			err = sf.Connect() | 			err = sf.Connect() | ||||||
|  | @ -50,6 +69,12 @@ func NewMqClient(funcs []config.FuncConfig, node config.HpdsNode, logger *loggin | ||||||
| 				EndPoint: sf, | 				EndPoint: sf, | ||||||
| 			} | 			} | ||||||
| 			must(logger, err) | 			must(logger, err) | ||||||
|  | 			switch v.Name { | ||||||
|  | 			case "task-log": | ||||||
|  | 				_ = sf.SetHandler(TaskLogNotificationHandler) | ||||||
|  | 			default: | ||||||
|  | 
 | ||||||
|  | 			} | ||||||
| 			mqList = append(mqList, nodeInfo) | 			mqList = append(mqList, nodeInfo) | ||||||
| 		default: | 		default: | ||||||
| 			ap := hpds_node.NewAccessPoint( | 			ap := hpds_node.NewAccessPoint( | ||||||
|  | @ -65,7 +90,7 @@ func NewMqClient(funcs []config.FuncConfig, node config.HpdsNode, logger *loggin | ||||||
| 				EndPoint: ap, | 				EndPoint: ap, | ||||||
| 			} | 			} | ||||||
| 			must(logger, err) | 			must(logger, err) | ||||||
| 			ap.SetDataTag(v.DataTag) | 			ap.SetDataTag(frame.Tag(v.DataTag)) | ||||||
| 			mqList = append(mqList, nodeInfo) | 			mqList = append(mqList, nodeInfo) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | @ -91,3 +116,23 @@ func GenerateAndSendData(stream hpds_node.AccessPoint, data []byte, logger *logg | ||||||
| 	time.Sleep(1000 * time.Millisecond) | 	time.Sleep(1000 * time.Millisecond) | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func TaskLogNotificationHandler(data []byte) (frame.Tag, []byte) { | ||||||
|  | 	logging.L().Info("任务日志", zap.String("接收数据", string(data))) | ||||||
|  | 	cmd := new(InstructionReq) | ||||||
|  | 	err := json.Unmarshal(data, cmd) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return 0x0B, []byte(err.Error()) | ||||||
|  | 	} | ||||||
|  | 	str, _ := json.Marshal(cmd.Payload) | ||||||
|  | 	for key := range ChannelsMap { | ||||||
|  | 		//if strings.Contains(key, userEmail) {
 | ||||||
|  | 		//	channel := channelsMap[key]
 | ||||||
|  | 		//	channel <- string(msgBytes)
 | ||||||
|  | 		//}
 | ||||||
|  | 
 | ||||||
|  | 		channel := ChannelsMap[key] | ||||||
|  | 		channel <- string(str) | ||||||
|  | 	} | ||||||
|  | 	return 0x0B, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -9,3 +9,35 @@ type InstructionReq struct { | ||||||
| 	Command int         `json:"command"` | 	Command int         `json:"command"` | ||||||
| 	Payload interface{} `json:"payload"` | 	Payload interface{} `json:"payload"` | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | type ModelResult struct { | ||||||
|  | 	Code int `json:"code"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type LightweightResult struct { | ||||||
|  | 	Code       int    `json:"code"` | ||||||
|  | 	Crack      bool   `json:"crack"` | ||||||
|  | 	ImgDiscern string `json:"img_discern"` | ||||||
|  | 	ImgSrc     string `json:"img_src"` | ||||||
|  | 	Pothole    bool   `json:"pothole"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type InsigmaResult struct { | ||||||
|  | 	Code          int            `json:"code"` | ||||||
|  | 	NumOfDiseases int            `json:"num_of_diseases"` | ||||||
|  | 	Diseases      []DiseasesInfo `json:"diseases"` | ||||||
|  | 	Image         string         `json:"image"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type DiseasesInfo struct { | ||||||
|  | 	Id    int           `json:"id"` | ||||||
|  | 	Type  string        `json:"type"` | ||||||
|  | 	Level string        `json:"level"` | ||||||
|  | 	Param DiseasesParam `json:"param"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type DiseasesParam struct { | ||||||
|  | 	Length   float64 `json:"length"` | ||||||
|  | 	Area     float64 `json:"area"` | ||||||
|  | 	MaxWidth string  `json:"max_width"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -0,0 +1,131 @@ | ||||||
|  | package utils | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"bytes" | ||||||
|  | 	"encoding/base64" | ||||||
|  | 	"golang.org/x/image/bmp" | ||||||
|  | 	"golang.org/x/image/tiff" | ||||||
|  | 	"image" | ||||||
|  | 	"image/color" | ||||||
|  | 	"image/jpeg" | ||||||
|  | 	"image/png" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func BuffToImage(in []byte) image.Image { | ||||||
|  | 	buff := bytes.NewBuffer(in) | ||||||
|  | 	m, _, _ := image.Decode(buff) | ||||||
|  | 	return m | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Clip 图片裁剪
 | ||||||
|  | func Clip(in []byte, wi, hi int, equalProportion bool) (out image.Image, imageType string, err error) { | ||||||
|  | 	buff := bytes.NewBuffer(in) | ||||||
|  | 	m, imgType, _ := image.Decode(buff) | ||||||
|  | 	rgbImg := m.(*image.YCbCr) | ||||||
|  | 	if equalProportion { | ||||||
|  | 		w := m.Bounds().Max.X | ||||||
|  | 		h := m.Bounds().Max.Y | ||||||
|  | 		if w > 0 && h > 0 && wi > 0 && hi > 0 { | ||||||
|  | 			wi, hi = fixSize(w, h, wi, hi) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return rgbImg.SubImage(image.Rect(0, 0, wi, hi)), imgType, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func fixSize(img1W, img2H, wi, hi int) (new1W, new2W int) { | ||||||
|  | 	var ( //为了方便计算,将图片的宽转为 float64
 | ||||||
|  | 		imgWidth, imgHeight = float64(img1W), float64(img2H) | ||||||
|  | 		ratio               float64 | ||||||
|  | 	) | ||||||
|  | 	if imgWidth >= imgHeight { | ||||||
|  | 		ratio = imgWidth / float64(wi) | ||||||
|  | 		return int(imgWidth * ratio), int(imgHeight * ratio) | ||||||
|  | 	} | ||||||
|  | 	ratio = imgHeight / float64(hi) | ||||||
|  | 	return int(imgWidth * ratio), int(imgHeight * ratio) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func Gray(in []byte) (out image.Image, err error) { | ||||||
|  | 	m := BuffToImage(in) | ||||||
|  | 	bounds := m.Bounds() | ||||||
|  | 	dx := bounds.Dx() | ||||||
|  | 	dy := bounds.Dy() | ||||||
|  | 	newRgba := image.NewRGBA(bounds) | ||||||
|  | 	for i := 0; i < dx; i++ { | ||||||
|  | 		for j := 0; j < dy; j++ { | ||||||
|  | 			colorRgb := m.At(i, j) | ||||||
|  | 			_, g, _, a := colorRgb.RGBA() | ||||||
|  | 			gUint8 := uint8(g >> 8) | ||||||
|  | 			aUint8 := uint8(a >> 8) | ||||||
|  | 			newRgba.SetRGBA(i, j, color.RGBA{R: gUint8, G: gUint8, B: gUint8, A: aUint8}) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	r := image.Rect(0, 0, dx, dy) | ||||||
|  | 	return newRgba.SubImage(r), nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func Rotate90(in []byte) image.Image { | ||||||
|  | 	m := BuffToImage(in) | ||||||
|  | 	rotate90 := image.NewRGBA(image.Rect(0, 0, m.Bounds().Dy(), m.Bounds().Dx())) | ||||||
|  | 	// 矩阵旋转
 | ||||||
|  | 	for x := m.Bounds().Min.Y; x < m.Bounds().Max.Y; x++ { | ||||||
|  | 		for y := m.Bounds().Max.X - 1; y >= m.Bounds().Min.X; y-- { | ||||||
|  | 			//  设置像素点
 | ||||||
|  | 			rotate90.Set(m.Bounds().Max.Y-x, y, m.At(y, x)) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return rotate90 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Rotate180 旋转180度
 | ||||||
|  | func Rotate180(in []byte) image.Image { | ||||||
|  | 	m := BuffToImage(in) | ||||||
|  | 	rotate180 := image.NewRGBA(image.Rect(0, 0, m.Bounds().Dx(), m.Bounds().Dy())) | ||||||
|  | 	// 矩阵旋转
 | ||||||
|  | 	for x := m.Bounds().Min.X; x < m.Bounds().Max.X; x++ { | ||||||
|  | 		for y := m.Bounds().Min.Y; y < m.Bounds().Max.Y; y++ { | ||||||
|  | 			//  设置像素点
 | ||||||
|  | 			rotate180.Set(m.Bounds().Max.X-x, m.Bounds().Max.Y-y, m.At(x, y)) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return rotate180 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Rotate270 旋转270度
 | ||||||
|  | func Rotate270(in []byte) image.Image { | ||||||
|  | 	m := BuffToImage(in) | ||||||
|  | 	rotate270 := image.NewRGBA(image.Rect(0, 0, m.Bounds().Dy(), m.Bounds().Dx())) | ||||||
|  | 	// 矩阵旋转
 | ||||||
|  | 	for x := m.Bounds().Min.Y; x < m.Bounds().Max.Y; x++ { | ||||||
|  | 		for y := m.Bounds().Max.X - 1; y >= m.Bounds().Min.X; y-- { | ||||||
|  | 			// 设置像素点
 | ||||||
|  | 			rotate270.Set(x, m.Bounds().Max.X-y, m.At(y, x)) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return rotate270 | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func ImageToBase64(img image.Image, imgType string) string { | ||||||
|  | 	buff := ImageToBuff(img, imgType) | ||||||
|  | 	return base64.StdEncoding.EncodeToString(buff.Bytes()) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func ImageToBuff(img image.Image, imgType string) *bytes.Buffer { | ||||||
|  | 	buff := bytes.NewBuffer(nil) | ||||||
|  | 	switch imgType { | ||||||
|  | 	case "bmp": | ||||||
|  | 		imgType = "bmp" | ||||||
|  | 		_ = bmp.Encode(buff, img) | ||||||
|  | 	case "png": | ||||||
|  | 		imgType = "png" | ||||||
|  | 		_ = png.Encode(buff, img) | ||||||
|  | 	case "tiff": | ||||||
|  | 		imgType = "tiff" | ||||||
|  | 		_ = tiff.Encode(buff, img, nil) | ||||||
|  | 	default: | ||||||
|  | 		imgType = "jpeg" | ||||||
|  | 		_ = jpeg.Encode(buff, img, nil) | ||||||
|  | 	} | ||||||
|  | 	return buff | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue