diff --git a/config/config-prod.yaml b/config/config-prod.yaml index 32779ba..9e01303 100644 --- a/config/config-prod.yaml +++ b/config/config-prod.yaml @@ -20,6 +20,7 @@ minio: endpoint: 127.0.0.1:9000 accessKeyId: root secretAccessKey: OIxv7QptYBO3 + bucket: jky-data consul: host: http://consul.hpds.cc port: 80 @@ -27,12 +28,21 @@ consul: timeout: 5 deregister: 1 db: - conn: root:OIxv7QptYBO3@tcp(114.55.236.153:23306)/diagnostic_platform?charset=utf8mb4 + conn: root:OIxv7QptYBO3@tcp(192.168.53.10:3306)/diagnosis?charset=utf8mb4 drive_name: mysql cache: host: 127.0.0.1 port: 6379 db: 0 pool_size: 10 +node: + host: 127.0.0.1 + port: 27188 + token: 06d36c6f5705507dae778fdce90d0767 functions: - - name: web-sf \ No newline at end of file + - name: task-request + dataTag : 12 + mqType: 1 + - name: task-log + dataTag: 28 + mqType: 2 \ No newline at end of file diff --git a/go.mod b/go.mod index ab985fc..2178b8a 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module hpds-iot-web -go 1.18 +go 1.19 require ( git.hpds.cc/Component/gin_valid v0.0.0-20230104142509-f956bce255b6 @@ -8,31 +8,29 @@ require ( 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/gin-contrib/zap v0.1.0 github.com/gin-gonic/gin v1.8.2 github.com/go-redis/redis v6.15.9+incompatible github.com/go-sql-driver/mysql v1.6.0 github.com/goccy/go-json v0.9.11 + github.com/golang-jwt/jwt v3.2.2+incompatible github.com/hashicorp/consul/api v1.15.3 github.com/minio/minio-go/v7 v7.0.46 github.com/spf13/cobra v0.0.3 - github.com/spf13/viper v1.14.0 + github.com/spf13/viper v1.8.1 go.uber.org/zap v1.24.0 - golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8 + golang.org/x/image v0.1.0 gopkg.in/yaml.v3 v3.0.1 xorm.io/xorm v1.3.2 ) require ( - cloud.google.com/go v0.104.0 // indirect - cloud.google.com/go/compute v1.12.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 v0.81.0 // indirect + cloud.google.com/go/firestore v1.5.0 // indirect git.hpds.cc/Component/mq_coder v0.0.0-20221010064749-174ae7ae3340 // indirect github.com/armon/go-metrics v0.4.0 // indirect + github.com/bketelsen/crypt v0.0.4 // indirect github.com/coreos/go-semver v0.3.0 // indirect - github.com/coreos/go-systemd/v22 v22.3.2 // indirect github.com/dustin/go-humanize v1.0.0 // indirect github.com/fatih/color v1.13.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect @@ -41,7 +39,6 @@ require ( github.com/go-playground/universal-translator v0.18.0 // indirect github.com/go-playground/validator/v10 v10.11.1 // indirect github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect - github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/mock v1.6.0 // indirect github.com/golang/protobuf v1.5.2 // indirect @@ -49,8 +46,7 @@ require ( 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/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.0.5 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-hclog v1.2.0 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect @@ -60,6 +56,7 @@ require ( github.com/hashicorp/serf v0.9.8 // indirect github.com/inconshreveable/mousetrap v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect + github.com/jstemmer/go-junit-report v0.9.1 // indirect github.com/klauspost/compress v1.15.9 // indirect github.com/klauspost/cpuid/v2 v2.1.0 // indirect github.com/leodido/go-urn v1.2.1 // indirect @@ -78,12 +75,10 @@ require ( github.com/onsi/ginkgo/v2 v2.2.0 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.0.6 // 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/sagikazarmark/crypt v0.8.0 // indirect github.com/sirupsen/logrus v1.9.0 // indirect github.com/spf13/afero v1.9.2 // indirect github.com/spf13/cast v1.5.0 // indirect @@ -95,7 +90,6 @@ require ( go.etcd.io/etcd/api/v3 v3.5.5 // indirect go.etcd.io/etcd/client/pkg/v3 v3.5.5 // indirect go.etcd.io/etcd/client/v2 v2.305.5 // indirect - go.etcd.io/etcd/client/v3 v3.5.5 // indirect go.opencensus.io v0.23.0 // indirect go.opentelemetry.io/otel v1.10.0 // indirect go.opentelemetry.io/otel/trace v1.10.0 // indirect @@ -103,16 +97,14 @@ require ( go.uber.org/multierr v1.8.0 // indirect golang.org/x/crypto v0.4.0 // indirect golang.org/x/exp v0.0.0-20221205204356-47842c84f3db // indirect + golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect golang.org/x/mod v0.6.0 // indirect - golang.org/x/net v0.4.0 // indirect - golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 // indirect - golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.3.0 // indirect - golang.org/x/text v0.5.0 // indirect - golang.org/x/time v0.0.0-20220609170525-579cf78fd858 // indirect + golang.org/x/net v0.5.0 // indirect + golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c // indirect + golang.org/x/sys v0.4.0 // indirect + golang.org/x/text v0.6.0 // indirect golang.org/x/tools v0.2.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.102.0 // indirect + google.golang.org/api v0.47.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e // indirect google.golang.org/grpc v1.50.1 // indirect diff --git a/internal/handler/dataset.go b/internal/handler/dataset.go index 91294dc..c727687 100644 --- a/internal/handler/dataset.go +++ b/internal/handler/dataset.go @@ -78,3 +78,19 @@ func (s HandlerService) DatasetInfo(c *gin.Context) (data interface{}, err error go s.SaveLog("获取数据集详情", "Dataset", "", "", ToString(data), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") return } + +func (s HandlerService) CreateTraining(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.TrainDatasetRequest + err = c.ShouldBindJSON(&req) + if err != nil { + go s.SaveLog("CreateTraining", "Training", "", "", ToString(req), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") + return nil, e.NewValidErr(err) + } + req.UserId = userInfo.UserId + data, err = repo.CreateTraining(c, req) + go s.SaveLog("创建训练数据集", "Training", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") + return +} diff --git a/internal/handler/task.go b/internal/handler/task.go index 536daab..e66a04c 100644 --- a/internal/handler/task.go +++ b/internal/handler/task.go @@ -105,7 +105,7 @@ 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 + var req proto.TaskLogItem err = c.ShouldBindJSON(&req) if err != nil { go s.SaveLog("TaskLog", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") diff --git a/internal/handler/user.go b/internal/handler/user.go index 069088b..07dcaff 100644 --- a/internal/handler/user.go +++ b/internal/handler/user.go @@ -85,3 +85,59 @@ func (s HandlerService) MenuList(c *gin.Context) (data interface{}, err error) { go s.SaveLog("获取用户菜单列表", "Manage", "", "", "", fmt.Sprintf("%d", userinfo.UserId), c.Request.RemoteAddr, "") return } + +func (s HandlerService) GetRoleList(c *gin.Context) (data interface{}, err error) { + repo := service.NewUserService(s.Engine, s.Logger) + us, _ := c.Get("operatorUser") + userinfo := us.(*model.SystemUser) + var req proto.RoleRequest + err = c.ShouldBindJSON(&req) + if err != nil { + go s.SaveLog("GetRoleList", "Manage", "", "", userinfo.ToString(), fmt.Sprintf("%d", userinfo.UserId), c.Request.RemoteAddr, "") + return nil, e.NewValidErr(err) + } + data, err = repo.GetRoleList(c, req) + if err != nil { + go s.SaveLog("GetRoleList", "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 +} + +func (s HandlerService) AddRole(c *gin.Context) (data interface{}, err error) { + repo := service.NewUserService(s.Engine, s.Logger) + us, _ := c.Get("operatorUser") + userinfo := us.(*model.SystemUser) + var req proto.RoleItemRequest + err = c.ShouldBindJSON(&req) + if err != nil { + go s.SaveLog("AddRole", "Manage", "", "", userinfo.ToString(), fmt.Sprintf("%d", userinfo.UserId), c.Request.RemoteAddr, "") + return nil, e.NewValidErr(err) + } + data, err = repo.AddRole(c, req) + if err != nil { + go s.SaveLog("AddRole", "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 +} +func (s HandlerService) EditRole(c *gin.Context) (data interface{}, err error) { + repo := service.NewUserService(s.Engine, s.Logger) + us, _ := c.Get("operatorUser") + userinfo := us.(*model.SystemUser) + var req proto.RoleItemRequest + err = c.ShouldBindJSON(&req) + if err != nil { + go s.SaveLog("GetRoleList", "Manage", "", "", userinfo.ToString(), fmt.Sprintf("%d", userinfo.UserId), c.Request.RemoteAddr, "") + return nil, e.NewValidErr(err) + } + data, err = repo.EditRole(c, req) + if err != nil { + go s.SaveLog("EditRole", "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 +} diff --git a/internal/middleware/jwt.go b/internal/middleware/jwt.go index 6caf7f0..3da705d 100644 --- a/internal/middleware/jwt.go +++ b/internal/middleware/jwt.go @@ -8,8 +8,8 @@ import ( "net/http" "time" - "github.com/dgrijalva/jwt-go" "github.com/gin-gonic/gin" + "github.com/golang-jwt/jwt" "go.uber.org/zap" ) diff --git a/internal/proto/request.go b/internal/proto/request.go index 831a431..34c6e17 100644 --- a/internal/proto/request.go +++ b/internal/proto/request.go @@ -24,11 +24,12 @@ func (us UserLogin) ToString() string { } type UserRequestItem struct { - RealName string `json:"realName"` - Phone string `json:"phone"` - Password string `json:"password"` - Desc string `json:"desc"` - Status int `json:"status"` + RealName string `json:"realName"` + Phone string `json:"phone"` + RoleId []int64 `json:"roleId"` + Password string `json:"password"` + Desc string `json:"desc"` + Status int `json:"status"` } func (us UserRequestItem) ToString() string { @@ -53,6 +54,37 @@ func (us UserRequest) ToString() string { return string(data) } +type RoleRequest struct { + RoleName string `json:"roleName"` + Status int `json:"status"` + BasePageList +} + +func (us RoleRequest) ToString() string { + data, err := json.Marshal(us) + if err != nil { + return "" + } + return string(data) +} + +type RoleItemRequest struct { + RoleId int64 `json:"roleId"` + RoleName string `json:"roleName"` + RoleValue string `json:"roleValue"` + AliasName string `json:"aliasName"` + Description string `json:"description"` + Status int `json:"status"` +} + +func (us RoleItemRequest) ToString() string { + data, err := json.Marshal(us) + if err != nil { + return "" + } + return string(data) +} + type OwnerRequest struct { OwnerName string `json:"ownerName"` BasePageList @@ -675,6 +707,19 @@ func (p TaskItemRequest) ToString() string { return string(data) } +type TaskLogItem struct { + TaskId int64 `json:"taskId"` + LogId int64 `json:"logId"` +} + +func (p TaskLogItem) ToString() string { + data, err := json.Marshal(p) + if err != nil { + return "" + } + return string(data) +} + type ReportRequest struct { ReportId int64 `json:"reportId,omitempty"` TaskId int64 `json:"taskId,omitempty"` @@ -688,3 +733,15 @@ func (p ReportRequest) ToString() string { } return string(data) } + +type TrainDatasetRequest struct { + DatasetId int64 `json:"datasetId"` + TrainName string `json:"trainName"` + TrainDesc string `json:"trainDesc"` + TargetData int `json:"targetData"` + TrainNumber int64 `json:"trainNumber"` + ValidationNumber int64 `json:"validationNumber"` + TestNumber int64 `json:"testNumber"` + SplitMethod int `json:"splitMethod"` + UserId int64 `json:"userId"` +} diff --git a/internal/proto/response.go b/internal/proto/response.go index 5f83a6d..e678315 100644 --- a/internal/proto/response.go +++ b/internal/proto/response.go @@ -141,3 +141,30 @@ type TaskResultItem struct { Memo string `json:"memo"` Stat bool `json:"stat"` } + +// MessageEvent 定义SSE事件 +type MessageEvent struct { + TaskId int64 + EventId int64 + Data interface{} +} + +type TaskLogProgress struct { + PayloadType int `json:"payloadType"` + TaskId int64 `json:"taskId"` + TotalCount int64 `json:"totalCount"` + CompletedCount int64 `json:"completedCount"` + FailingCount int64 `json:"failingCount"` + UnfinishedCount int64 `json:"unfinishedCount"` +} + +type TaskLogPayload struct { + PayloadType int `json:"payloadType"` + TaskId int64 `json:"taskId"` + TaskCode string `json:"taskCode"` + NodeId int64 `json:"nodeId"` + NodeGuid string `json:"nodeGuid"` + TaskContent string `json:"taskContent"` + Status int `json:"status"` //1:执行成功;2:执行失败 + EventTime int64 `json:"eventTime"` +} diff --git a/internal/router/router.go b/internal/router/router.go index f71e233..6abe464 100644 --- a/internal/router/router.go +++ b/internal/router/router.go @@ -12,6 +12,7 @@ import ( "net/http" "xorm.io/xorm" + m "hpds-iot-web/model" e "hpds-iot-web/pkg/err" ) @@ -37,6 +38,13 @@ func InitRouter(cfg *config.WebConfig, logger *logging.Logger, engine *xorm.Engi menu.GET("/list", e.ErrorWrapper(hs.MenuList)) } } + role := r.Group("/role") + { + role.Use(middleware.JwtAuthMiddleware(logger.Logger)) + role.POST("/list", e.ErrorWrapper(hs.GetRoleList)) + role.POST("/edit", e.ErrorWrapper(hs.EditRole)) + role.POST("/add", e.ErrorWrapper(hs.AddRole)) + } manage := r.Group("/manage") { manage.Use(middleware.JwtAuthMiddleware(logger.Logger)) @@ -175,26 +183,42 @@ func InitRouter(cfg *config.WebConfig, logger *logging.Logger, engine *xorm.Engi 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") + us, _ := c.Get("operatorUser") + if us == nil { + + return + } + userInfo := us.(*m.SystemUser) + mq.AddChannel(fmt.Sprintf("%d", userInfo.UserId)) w := c.Writer - flusher, _ := w.(http.Flusher) + //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)) + delete(mq.ChannelsMap, fmt.Sprintf("%d", userInfo.UserId)) + logger.Info("SSE close for user = " + fmt.Sprintf("%d", userInfo.UserId)) 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() + // 循环监听 SSE 事件通道 + for { + // 从通道中读取事件 + message := <-mq.ChannelsMap[fmt.Sprintf("%d", userInfo.UserId)] + + // 向客户端发送 SSE 事件 + _, _ = fmt.Fprintf(w, "%s", &message) + + // 刷新 response buffer + w.(http.Flusher).Flush() } + //_, _ = fmt.Fprintf(w, "data: %s\n\n", "--ping--") + //flusher.Flush() + //for msg := range mq.ChannelsMap[fmt.Sprintf("%d", userInfo.UserId)] { + // _, _ = fmt.Fprintf(w, "data: %s\n\n", msg) + // flusher.Flush() + //} }) } disease := r.Group("/disease") @@ -219,6 +243,19 @@ func InitRouter(cfg *config.WebConfig, logger *logging.Logger, engine *xorm.Engi dataset.POST("/info", e.ErrorWrapper(hs.DatasetInfo)) } + training := r.Group("/training") + { + training.Use(middleware.JwtAuthMiddleware(logger.Logger)) + training.POST("/create", e.ErrorWrapper(hs.CreateTraining)) + //training.POST("/list", e.ErrorWrapper(hs.TrainingList)) + //training.POST("/info", e.ErrorWrapper(hs.TrainingInfo)) + } + label := r.Group("/label") + { + label.Use(middleware.JwtAuthMiddleware(logger.Logger)) + //label.POST("/info", e.ErrorWrapper(hs.LabelInfo)) + } + report := r.Group("/report") { report.Use(middleware.JwtAuthMiddleware(logger.Logger)) diff --git a/internal/service/dataset.go b/internal/service/dataset.go index 0ca415d..46949b8 100644 --- a/internal/service/dataset.go +++ b/internal/service/dataset.go @@ -7,6 +7,8 @@ import ( "hpds-iot-web/config" "hpds-iot-web/internal/proto" "hpds-iot-web/model" + "math" + "math/rand" "net/http" "time" "xorm.io/xorm" @@ -17,6 +19,8 @@ type DatasetService interface { DatasetList(ctx context.Context, req proto.DatasetRequest) (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) + + CreateTraining(ctx context.Context, req proto.TrainDatasetRequest) (rsp *proto.BaseResponse, err error) } func NewDatasetService(cfg *config.WebConfig, engine *xorm.Engine, logger *logging.Logger) DatasetService { @@ -224,3 +228,126 @@ ReturnPoint: } return rsp, err } + +func (rp *repo) CreateTraining(ctx context.Context, req proto.TrainDatasetRequest) (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 + trainFileList []model.FileManager + valFileList []model.FileManager + testFileList []model.FileManager + //wg sync.WaitGroup + ) + log := new(model.DatasetOperationLog) + dataset := new(model.Dataset) + h, err = rp.engine.ID(req.DatasetId).Get(dataset) + if err != nil { + goto ReturnPoint + } + if !h { + err = fmt.Errorf("未能找到对应的采集数据集") + goto ReturnPoint + } + fileList := make([]model.FileManager, 0) + err = rp.engine.Where("dataset_id = ?", req.DatasetId).Find(&fileList) + if err != nil { + goto ReturnPoint + } + if req.TargetData == 0 { + req.TargetData = len(fileList) + } + if req.TargetData > len(fileList) { + err = fmt.Errorf("超出现有数据集数量") + goto ReturnPoint + } + if req.SplitMethod == 1 { //随机 + rand.Seed(time.Now().UnixNano()) + rand.Shuffle(len(fileList), func(i, j int) { + fileList[i], fileList[j] = fileList[j], fileList[i] + }) + } + trainNumber := int(math.Floor(float64(int64(req.TargetData)*req.TrainNumber) / 100)) + valNumber := int(math.Floor(float64(int64(req.TargetData)*req.ValidationNumber) / 100)) + testNumber := req.TargetData - trainNumber - valNumber + trainFileList = fileList[:trainNumber-1] + valFileList = fileList[trainNumber : valNumber-1] + testFileList = fileList[valNumber:] + + train := new(model.TrainingDataset) + h, err = rp.engine.Where("name = ?", req.TrainName).Get(train) + if err != nil { + goto ReturnPoint + } + if !h { + train.Name = req.TrainName + train.DatasetDesc = req.TrainDesc + train.DatasetId = req.DatasetId + train.CategoryId = dataset.CategoryId + _, err = rp.engine.Insert(train) + if err != nil { + goto ReturnPoint + } + } + log.TargetData = int64(req.TargetData) + log.DatasetId = req.DatasetId + log.TrainingDatasetId = train.DatasetId + log.SplitMethod = req.SplitMethod + log.TrainNumber = int64(trainNumber) + log.ValidationNumber = int64(valNumber) + log.TestNumber = int64(testNumber) + log.Creator = req.UserId + _, err = rp.engine.Insert(log) + if err != nil { + goto ReturnPoint + } + //wg.Add(3) + go BatchCopyData(trainFileList, train.DatasetId, log.LogId, req.UserId, 1, rp.engine) //, &wg + go BatchCopyData(valFileList, train.DatasetId, log.LogId, req.UserId, 2, rp.engine) //, &wg + go BatchCopyData(testFileList, train.DatasetId, log.LogId, req.UserId, 3, rp.engine) //, &wg + //wg.Wait() + rsp.Code = http.StatusOK + rsp.Status = http.StatusText(http.StatusOK) + rsp.Message = "成功" + rsp.Err = err + rsp.Data = log + 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 BatchCopyData(list []model.FileManager, trainId, logId, userId int64, categoryId int, engine *xorm.Engine) { //, wg *sync.WaitGroup + batchList := make([]model.TrainingDatasetDetail, len(list)) + for k, v := range list { + item := model.TrainingDatasetDetail{ + FileName: v.FileName, + FilePath: v.AccessUrl, + DatasetId: trainId, + CategoryId: categoryId, + FileSize: v.FileSize, + FileMd5: v.FileMd5, + OperationLogId: logId, + Creator: userId, + CreateAt: time.Now().Unix(), + UpdateAt: time.Now().Unix(), + } + batchList[k] = item + } + _, _ = engine.Insert(batchList) + //wg.Done() +} diff --git a/internal/service/index.go b/internal/service/index.go index 57e51ae..c229033 100644 --- a/internal/service/index.go +++ b/internal/service/index.go @@ -54,6 +54,9 @@ type UserService interface { GetUserList(ctx context.Context, req proto.UserRequest) (rsp *proto.BaseResponse, err error) AddUser(ctx context.Context, req proto.UserRequestItem) (rsp *proto.BaseResponse, err error) EditUser(ctx context.Context, req proto.UserRequestItem) (rsp *proto.BaseResponse, err error) + GetRoleList(ctx context.Context, req proto.RoleRequest) (rsp *proto.BaseResponse, err error) + AddRole(ctx context.Context, req proto.RoleItemRequest) (rsp *proto.BaseResponse, err error) + EditRole(ctx context.Context, req proto.RoleItemRequest) (rsp *proto.BaseResponse, err error) } func NewUserService(engine *xorm.Engine, logger *logging.Logger) UserService { @@ -261,14 +264,35 @@ func (rp *repo) GetUserList(ctx context.Context, req proto.UserRequest) (rsp *pr rsp.Err = ctx.Err() return rsp, ctx.Err() default: - data := make([]model.SystemUser, 0) + userList := make([]model.SystemUser, 0) count, err := rp.engine.Where("(? = '' or phone like ?)", req.Phone, "%"+req.Phone+"%"). And("(? = '' or real_name like ?)", req.RealName, req.RealName). And("status = 1").Limit(int(req.Size), int(((req.Page)-1)*req.Size)). - FindAndCount(&data) + FindAndCount(&userList) if err != nil { goto ReturnPoint } + data := make([]proto.UserLoginResponse, len(userList)) + for k, v := range userList { + roleList := model.GetRolesByUserId(v.UserId) + roles := make([]proto.RoleItem, len(roleList)) + for key, val := range roleList { + roles[key] = proto.RoleItem{ + RoleId: val.RoleId, + RoleName: val.RoleName, + Value: val.RoleValue, + } + } + data[k] = proto.UserLoginResponse{ + UserId: v.UserId, + RealName: v.RealName, + UserName: v.Phone, + Roles: roles, + Avatar: v.Avatar, + Desc: v.Desc, + HomePath: v.HomePath, + } + } rsp.Code = http.StatusOK rsp.Status = http.StatusText(http.StatusOK) rsp.Message = "成功" @@ -303,16 +327,38 @@ func (rp *repo) AddUser(ctx context.Context, req proto.UserRequestItem) (rsp *pr goto ReturnPoint } if !b { + sess := rp.engine.NewSession() + item.Status = req.Status item.Phone = req.Phone item.RealName = req.RealName + //item.RoleId = req.RoleId item.Desc = req.Desc item.CreateAt = time.Now().Unix() item.UpdateAt = time.Now().Unix() item.Salt = utils.RandomString(16, 3) item.Pass = utils.GetUserSha1Pass(req.Password, item.Salt) - _, err = rp.engine.Insert(item) + _, err = sess.Insert(item) if err != nil { + _ = sess.Rollback() + goto ReturnPoint + } + if len(req.RoleId) > 0 { + for _, v := range req.RoleId { + role := new(model.SystemUserRole) + role.RoleId = v + role.UserId = item.UserId + role.Status = 1 + _, err = sess.Insert(role) + if err != nil { + _ = sess.Rollback() + goto ReturnPoint + } + } + } + err = sess.Commit() + if err != nil { + _ = sess.Rollback() goto ReturnPoint } } else { @@ -348,7 +394,7 @@ func (rp *repo) EditUser(ctx context.Context, req proto.UserRequestItem) (rsp *p return rsp, ctx.Err() default: item := new(model.SystemUser) - b, err := rp.engine.Where("phone = ?)", req.Phone). + b, err := rp.engine.Where("phone = ?", req.Phone). Get(item) if err != nil { goto ReturnPoint @@ -357,6 +403,7 @@ func (rp *repo) EditUser(ctx context.Context, req proto.UserRequestItem) (rsp *p err = fmt.Errorf("未能找到对应的用户") goto ReturnPoint } else { + sess := rp.engine.NewSession() item.Status = req.Status if len(item.Phone) > 0 { item.Phone = req.Phone @@ -372,6 +419,185 @@ func (rp *repo) EditUser(ctx context.Context, req proto.UserRequestItem) (rsp *p item.Pass = utils.GetUserSha1Pass(req.Password, item.Salt) } item.UpdateAt = time.Now().Unix() + _, err = sess.AllCols().Update(item) + if err != nil { + _ = sess.Rollback() + goto ReturnPoint + } + role := new(model.SystemUserRole) + role.UserId = item.UserId + role.Status = 0 + _, err = sess.Where("user_id = ?", item.UserId).AllCols().Update(role) + if err != nil { + _ = sess.Rollback() + goto ReturnPoint + } + if len(req.RoleId) > 0 { + for _, v := range req.RoleId { + role := new(model.SystemUserRole) + b, err = sess.Where("user_id = ?", item.UserId).And("role_id=?", v).Get(role) + if err != nil { + _ = sess.Rollback() + goto ReturnPoint + } + if b { + role.Status = 1 + _, err = sess.ID(role.UserRoleId).Update(role) + } else { + role.RoleId = v + role.UserId = item.UserId + role.Status = 1 + _, err = sess.Insert(role) + } + if err != nil { + _ = sess.Rollback() + goto ReturnPoint + } + } + } + err = sess.Commit() + if err != nil { + _ = sess.Rollback() + 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) GetRoleList(ctx context.Context, req proto.RoleRequest) (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.SystemRole, 0) + count, err := rp.engine.Where("(? = '' or role_name like ?)", req.RoleName, "%"+req.RoleName+"%"). + And("(? = 0 or status = ?)", req.Status, req.Status).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) AddRole(ctx context.Context, req proto.RoleItemRequest) (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.SystemRole) + b, err := rp.engine.Where("role_value = ?", req.RoleValue). + Get(item) + if err != nil { + goto ReturnPoint + } + if b { + err = fmt.Errorf("已经存在相同值的角色") + goto ReturnPoint + } else { + item.AliasName = req.AliasName + item.Description = req.Description + item.RoleName = req.RoleName + item.RoleValue = req.RoleValue + item.Status = req.Status + item.CreateAt = time.Now().Unix() + item.UpdateAt = time.Now().Unix() + _, err = rp.engine.Insert(item) + 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) EditRole(ctx context.Context, req proto.RoleItemRequest) (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.SystemRole) + b, err := rp.engine.Where("role_id = ?", req.RoleId). + Get(item) + if err != nil { + goto ReturnPoint + } + if !b { + err = fmt.Errorf("未能找到对应的用户") + goto ReturnPoint + } else { + if len(req.AliasName) > 0 && item.AliasName != req.AliasName { + item.AliasName = req.AliasName + } + if len(req.Description) > 0 && item.Description != req.Description { + item.Description = req.Description + } + if len(req.RoleName) > 0 && item.RoleName != req.RoleName { + item.RoleName = req.RoleName + } + if len(req.RoleValue) > 0 && item.RoleValue != req.RoleValue { + item.RoleValue = req.RoleValue + } + item.Status = req.Status + item.UpdateAt = time.Now().Unix() _, err = rp.engine.AllCols().Update(item) if err != nil { goto ReturnPoint diff --git a/internal/service/report.go b/internal/service/report.go index 67ccc6c..566a71e 100644 --- a/internal/service/report.go +++ b/internal/service/report.go @@ -1,12 +1,18 @@ package service import ( + "bytes" "context" + "encoding/base64" + "encoding/json" "fmt" "git.hpds.cc/Component/logging" "hpds-iot-web/internal/proto" "hpds-iot-web/model" + "hpds-iot-web/mq" + "image" "net/http" + "strconv" "xorm.io/xorm" "github.com/360EntSecGroup-Skylar/excelize" @@ -71,46 +77,273 @@ func (rp *repo) GenerateReport(ctx context.Context, req proto.ReportRequest) (rs //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: "有裂缝", + taskResultList := make([]model.TaskResult, 0) + err = rp.engine.Where("task_id = ?", req.TaskId). + Find(&taskResultList) + if err != nil { + err = fmt.Errorf("未能找到对应的结果") + goto ReturnPoint } - 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, + 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) + } } disTypeList := make([]model.DiseaseType, 0) err = model.DB.Find(&disTypeList) @@ -122,9 +355,9 @@ func (rp *repo) GenerateReport(ctx context.Context, req proto.ReportRequest) (rs diseaseTypeList[v.TypeId] = v.TypeName } diseaseLevelList := make(map[int]string) - diseaseLevelList[1] = "一级" - diseaseLevelList[2] = "二级" - diseaseLevelList[3] = "三级" + diseaseLevelList[1] = "轻度" + diseaseLevelList[2] = "中度" + diseaseLevelList[3] = "重度" xlsx := excelize.NewFile() xlsx.MergeCell("Sheet1", "A1", "L1") diff --git a/internal/service/task.go b/internal/service/task.go index 4fceb45..968bd1e 100644 --- a/internal/service/task.go +++ b/internal/service/task.go @@ -25,7 +25,7 @@ type TaskService interface { ReRunTask(ctx context.Context, req proto.TaskItemRequest) (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) + TaskLog(ctx context.Context, req proto.TaskLogItem) (rsp *proto.BaseResponse, err error) } func NewTaskService(engine *xorm.Engine, logger *logging.Logger) TaskService { @@ -131,7 +131,7 @@ func (rp *repo) AddTask(ctx context.Context, req proto.TaskItemRequest) (rsp *pr SubDataset: req.SubDataset, SubDataTag: req.SubDataTag, AppointmentTime: req.AppointmentTime, - Status: 1, + Status: 2, CreateAt: time.Now().Unix(), UpdateAt: time.Now().Unix(), } @@ -143,8 +143,10 @@ func (rp *repo) AddTask(ctx context.Context, req proto.TaskItemRequest) (rsp *pr goto ReturnPoint } item.StartTime = appTime.Unix() + item.Status = 1 } else { item.StartTime = time.Now().Unix() + item.Status = 2 } _, err = rp.engine.Insert(item) if err != nil { @@ -643,7 +645,7 @@ ReturnPoint: return rsp, err } -func (rp *repo) TaskLog(ctx context.Context, req proto.TaskItemRequest) (rsp *proto.BaseResponse, err error) { +func (rp *repo) TaskLog(ctx context.Context, req proto.TaskLogItem) (rsp *proto.BaseResponse, err error) { rsp = new(proto.BaseResponse) select { case <-ctx.Done(): @@ -655,7 +657,7 @@ func (rp *repo) TaskLog(ctx context.Context, req proto.TaskItemRequest) (rsp *pr return rsp, ctx.Err() default: list := make([]model.TaskLog, 0) - err = rp.engine.Where("task_id = ?", req.TaskId).Find(&list) + err = rp.engine.Where("task_id = ?", req.TaskId).And("task_log_id>?", req.LogId).Find(&list) if err != nil { goto ReturnPoint } diff --git a/model/datasetOperationLog.go b/model/datasetOperationLog.go new file mode 100644 index 0000000..d90d895 --- /dev/null +++ b/model/datasetOperationLog.go @@ -0,0 +1,15 @@ +package model + +type DatasetOperationLog struct { + LogId int64 `xorm:"not null pk autoincr INT(11)" json:"logId"` + DatasetId int64 `xorm:"INT(11) index" json:"datasetId"` + TrainingDatasetId int64 `xorm:"INT(11) index" json:"trainingDatasetId"` + TargetData int64 `xorm:"INT(11) default 0" json:"targetData"` //目标数据, 0:全量数据; n:指定数据量 + TrainNumber int64 `xorm:"INT(11)" json:"trainNumber"` //训练集数量 + ValidationNumber int64 `xorm:"INT(11)" json:"validationNumber"` //检验集数量 + TestNumber int64 `xorm:"INT(11)" json:"testNumber"` //测试集数量 + SplitMethod int `xorm:"SMALLINT default 1" json:"splitMethod"` //分割方式,1:随机分割;2:顺序分割 + Creator int64 `xorm:"INT(11) index" json:"creator"` //创建人 + CreateAt int64 `xorm:"created" json:"createAt"` //创建时间 + UpdateAt int64 `xorm:"updated" json:"updateAt"` //更新时间 +} diff --git a/model/index.go b/model/index.go index 6efd47e..082b868 100644 --- a/model/index.go +++ b/model/index.go @@ -29,6 +29,7 @@ func New(driveName, dsn string, showSql bool) { &Brand{}, &Dataset{}, &DatasetDetail{}, + &DatasetOperationLog{}, &DetectionTask{}, &Device{}, &DeviceType{}, @@ -61,6 +62,8 @@ func New(driveName, dsn string, showSql bool) { &Task{}, &TaskLog{}, &TaskResult{}, + &TrainingDataset{}, + &TrainingDatasetDetail{}, ) if err != nil { zap.L().Error("同步数据库表结构", zap.Error(err)) diff --git a/model/systemRoles.go b/model/systemRoles.go index 5310360..4bd1c53 100644 --- a/model/systemRoles.go +++ b/model/systemRoles.go @@ -2,12 +2,22 @@ package model // SystemRole 系统角色表 type SystemRole struct { - RoleId int64 `xorm:"not null pk autoincr INT(11)" json:"roleId"` //角色ID - RoleName string `xorm:"VARCHAR(32)" json:"roleName"` //角色名 - RoleValue string `xorm:"VARCHAR(32)" json:"roleValue"` //角色值 - AliasName string `xorm:"VARCHAR(32)" json:"aliasName"` //简称 - Description string `xorm:"VARCHAR(32)" json:"description"` //说明 - Status int `xorm:"int not null default 1" json:"status"` //状态 0禁用 1启用 - CreateAt int64 `xorm:"created" json:"createAt"` //创建时间 - UpdateAt int64 `xorm:"updated" json:"updateAt"` //更新时间 + RoleId int64 `xorm:"not null pk autoincr INT(11)" json:"roleId"` //角色ID + RoleName string `xorm:"VARCHAR(32)" json:"roleName"` //角色名 + RoleValue string `xorm:"VARCHAR(32)" json:"roleValue"` //角色值 + AliasName string `xorm:"VARCHAR(32)" json:"aliasName"` //简称 + DataRange []int64 `xorm:"VARCHAR(100)" json:"dataRange"` //数据范围 + Description string `xorm:"VARCHAR(32)" json:"description"` //说明 + Status int `xorm:"int not null default 1" json:"status"` //状态 0禁用 1启用 + CreateAt int64 `xorm:"created" json:"createAt"` //创建时间 + UpdateAt int64 `xorm:"updated" json:"updateAt"` //更新时间 +} + +func GetRole(id int64) *SystemRole { + item := new(SystemRole) + h, err := DB.ID(id).Get(item) + if err != nil || !h { + return nil + } + return item } diff --git a/model/trainingDataset.go b/model/trainingDataset.go new file mode 100644 index 0000000..34b2e35 --- /dev/null +++ b/model/trainingDataset.go @@ -0,0 +1,11 @@ +package model + +type TrainingDataset struct { + DatasetId int64 `xorm:"not null pk autoincr INT(11)" json:"datasetId"` + Name string `xorm:"VARCHAR(200)" json:"name"` + CategoryId int `xorm:"not null SMALLINT default 1" json:"categoryId"` //业务分类, 1:道路 2:桥梁 3:隧道 4:边坡 + DatasetDesc string `xorm:"varchar(200)" json:"datasetDesc"` + StoreName string `xorm:"varchar(200)" json:"storeName"` //存储路径 + CreateAt int64 `xorm:"created" json:"createAt"` + UpdateAt int64 `xorm:"updated" json:"updateAt"` +} diff --git a/model/trainingDatasetDetail.go b/model/trainingDatasetDetail.go new file mode 100644 index 0000000..7c4b75e --- /dev/null +++ b/model/trainingDatasetDetail.go @@ -0,0 +1,15 @@ +package model + +type TrainingDatasetDetail struct { + DetailId int64 `xorm:"not null pk autoincr INT(11)" json:"detailId"` + FileName string `xorm:"VARCHAR(200)" json:"fileName"` + FilePath string `xorm:"VARCHAR(1000)" json:"filePath"` + DatasetId int64 `xorm:"INT(11) index default 0" json:"datasetId"` //训练数据集 + CategoryId int `xorm:"not null SMALLINT default 1" json:"categoryId"` //训练集分类,1:训练集;2:测试集;3:验证集 + FileSize int64 `xorm:"BININT" json:"fileSize"` //文件大小 + FileMd5 string `xorm:"VARCHAR(64)" json:"fileMd5"` //文件MD5 + OperationLogId int64 `xorm:"INT(11) index" json:"operationLogId"` //操作日志编号 + Creator int64 `xorm:"INT(11) index" json:"creator"` //上传人 + CreateAt int64 `xorm:"created" json:"createAt"` //上传时间 + UpdateAt int64 `xorm:"updated" json:"updateAt"` //更新时间 +} diff --git a/mq/index.go b/mq/index.go index 4e77b09..6f1f57f 100644 --- a/mq/index.go +++ b/mq/index.go @@ -124,13 +124,13 @@ func TaskLogNotificationHandler(data []byte) (frame.Tag, []byte) { if err != nil { return 0x0B, []byte(err.Error()) } - str, _ := json.Marshal(cmd.Payload) + payload := cmd.Payload.(map[string]interface{}) + str, _ := json.Marshal(payload) for key := range ChannelsMap { //if strings.Contains(key, userEmail) { // channel := channelsMap[key] // channel <- string(msgBytes) //} - channel := ChannelsMap[key] channel <- string(str) }