Jelajahi Sumber

fit: init project

gaoyagang 1 tahun lalu
induk
melakukan
94d8eabe3d
100 mengubah file dengan 5940 tambahan dan 9 penghapusan
  1. TEMPAT SAMPAH
      .DS_Store
  2. 8 0
      .idea/.gitignore
  3. 9 0
      .idea/GtDataStore.iml
  4. 8 0
      .idea/modules.xml
  5. 6 0
      .idea/vcs.xml
  6. 67 9
      README.md
  7. 0 0
      app/cmd/cleansing/cleansing.py
  8. 0 0
      app/cmd/cleansing/models/__init__.py
  9. 0 0
      app/cmd/cleansing/models/data_center/Base.py
  10. 0 0
      app/cmd/cleansing/models/data_center/models.py
  11. 0 0
      app/cmd/cleansing/models/source/mgj.py
  12. 0 0
      app/cmd/cleansing/models/source/opc.py
  13. 0 0
      app/cmd/cleansing/services/__init__.py
  14. 0 0
      app/cmd/cleansing/services/clean_items/__init__.py
  15. 0 0
      app/cmd/cleansing/services/clean_items/dispatcher.py
  16. 0 0
      app/cmd/cleansing/services/clean_items/items.py
  17. 0 0
      app/cmd/cleansing/services/jobs/__init__.py
  18. 0 0
      app/cmd/cleansing/services/jobs/data_center_set.py
  19. 0 0
      app/cmd/cleansing/services/jobs/job.py
  20. 0 0
      app/cmd/cleansing/services/jobs/source_data_set.py
  21. 28 0
      app/cmd/events/etc/events.yaml
  22. 54 0
      app/cmd/events/events.go
  23. 9 0
      app/cmd/events/events.proto
  24. 28 0
      app/cmd/events/events/events.go
  25. 18 0
      app/cmd/events/internal/config/config.go
  26. 16 0
      app/cmd/events/internal/logic/handler/event.go
  27. 28 0
      app/cmd/events/internal/logic/handler/multi.go
  28. 80 0
      app/cmd/events/internal/logic/handler/single.go
  29. 47 0
      app/cmd/events/internal/logic/handler/vars.go
  30. 221 0
      app/cmd/events/internal/logic/job/job.go
  31. 149 0
      app/cmd/events/internal/logic/job/task.go
  32. 21 0
      app/cmd/events/internal/server/eventsServer.go
  33. 24 0
      app/cmd/events/internal/svc/serviceContext.go
  34. 23 0
      app/cmd/events/internal/svc/vars.go
  35. 61 0
      app/cmd/events/pb/events.pb.go
  36. 65 0
      app/cmd/events/pb/events_grpc.pb.go
  37. 28 0
      app/cmd/organization/etc/organization.yaml
  38. 15 0
      app/cmd/organization/internal/config/config.go
  39. 74 0
      app/cmd/organization/internal/logic/handler/chest.go
  40. 93 0
      app/cmd/organization/internal/logic/handler/mf.go
  41. 113 0
      app/cmd/organization/internal/logic/handler/nf.go
  42. 77 0
      app/cmd/organization/internal/logic/handler/pump.go
  43. 113 0
      app/cmd/organization/internal/logic/handler/ro.go
  44. 93 0
      app/cmd/organization/internal/logic/handler/uf.go
  45. 73 0
      app/cmd/organization/internal/logic/handler/valve.go
  46. 39 0
      app/cmd/organization/internal/logic/handler/vars.go
  47. 221 0
      app/cmd/organization/internal/logic/job/job.go
  48. 149 0
      app/cmd/organization/internal/logic/job/task.go
  49. 20 0
      app/cmd/organization/internal/server/organizationServer.go
  50. 23 0
      app/cmd/organization/internal/svc/serviceContext.go
  51. 31 0
      app/cmd/organization/internal/svc/vars.go
  52. 60 0
      app/cmd/organization/organization.go
  53. 9 0
      app/cmd/organization/organization.proto
  54. 23 0
      app/cmd/organization/organization/organization.go
  55. 62 0
      app/cmd/organization/pb/organization.pb.go
  56. 65 0
      app/cmd/organization/pb/organization_grpc.pb.go
  57. 387 0
      app/model/GtDataStore.sql
  58. 24 0
      app/model/dcAlarmBindModel.go
  59. 99 0
      app/model/dcAlarmBindModel_gen.go
  60. 24 0
      app/model/dcAlarmListModel.go
  61. 99 0
      app/model/dcAlarmListModel_gen.go
  62. 24 0
      app/model/dcCleanBindModel.go
  63. 116 0
      app/model/dcCleanBindModel_gen.go
  64. 24 0
      app/model/dcCleanQualityModel.go
  65. 111 0
      app/model/dcCleanQualityModel_gen.go
  66. 24 0
      app/model/dcDeviceBindModel.go
  67. 128 0
      app/model/dcDeviceBindModel_gen.go
  68. 24 0
      app/model/dcDeviceRelationModel.go
  69. 110 0
      app/model/dcDeviceRelationModel_gen.go
  70. 24 0
      app/model/dcEventBindModel.go
  71. 145 0
      app/model/dcEventBindModel_gen.go
  72. 24 0
      app/model/dcEventListModel.go
  73. 99 0
      app/model/dcEventListModel_gen.go
  74. 24 0
      app/model/dcEventRuleModel.go
  75. 110 0
      app/model/dcEventRuleModel_gen.go
  76. 24 0
      app/model/dcItemDataModel.go
  77. 96 0
      app/model/dcItemDataModel_gen.go
  78. 24 0
      app/model/dcItemMapModel.go
  79. 110 0
      app/model/dcItemMapModel_gen.go
  80. 24 0
      app/model/dcProjectConfigModel.go
  81. 144 0
      app/model/dcProjectConfigModel_gen.go
  82. 24 0
      app/model/dcWorkingChestModel.go
  83. 117 0
      app/model/dcWorkingChestModel_gen.go
  84. 24 0
      app/model/dcWorkingMfModel.go
  85. 137 0
      app/model/dcWorkingMfModel_gen.go
  86. 24 0
      app/model/dcWorkingNfModel.go
  87. 156 0
      app/model/dcWorkingNfModel_gen.go
  88. 24 0
      app/model/dcWorkingPumpModel.go
  89. 121 0
      app/model/dcWorkingPumpModel_gen.go
  90. 24 0
      app/model/dcWorkingRoModel.go
  91. 156 0
      app/model/dcWorkingRoModel_gen.go
  92. 24 0
      app/model/dcWorkingUfModel.go
  93. 137 0
      app/model/dcWorkingUfModel_gen.go
  94. 24 0
      app/model/dcWorkingValveModel.go
  95. 117 0
      app/model/dcWorkingValveModel_gen.go
  96. 21 0
      app/model/vars.go
  97. TEMPAT SAMPAH
      common/.DS_Store
  98. 312 0
      common/envitem/func.go
  99. 57 0
      common/envitem/func_test.go
  100. 48 0
      common/envitem/types.go

TEMPAT SAMPAH
.DS_Store


+ 8 - 0
.idea/.gitignore

@@ -0,0 +1,8 @@
+# 默认忽略的文件
+/shelf/
+/workspace.xml
+# 基于编辑器的 HTTP 客户端请求
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml

+ 9 - 0
.idea/GtDataStore.iml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="WEB_MODULE" version="4">
+  <component name="Go" enabled="true" />
+  <component name="NewModuleRootManager">
+    <content url="file://$MODULE_DIR$" />
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>

+ 8 - 0
.idea/modules.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/GtDataStore.iml" filepath="$PROJECT_DIR$/.idea/GtDataStore.iml" />
+    </modules>
+  </component>
+</project>

+ 6 - 0
.idea/vcs.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="" vcs="Git" />
+  </component>
+</project>

+ 67 - 9
README.md

@@ -1,13 +1,14 @@
-a. 统一采集和存储水厂数据
-b. 数据加工、清洗在数据中心完成,保持数据完整性和统一性
-c. 提供高效的数据查询服务,以满足各业务对数据的需求
-d. 提供数据展示层,以图表形式呈现数据
-e. 将数据抽象成事件,并提供数据事件订阅服务
-f. 数据预警事件,提供事件订阅服务
+### 项目目标:
+* 统一采集和存储水厂数据
+* 数据加工、清洗在数据中心完成,保持数据完整性和统一性
+* 提供高效的数据查询服务,以满足各业务对数据的需求
+* 提供数据展示层,以图表形式呈现数据
+* 将数据抽象成事件,并提供数据事件订阅服务
+* 数据预警事件,提供事件订阅服务
 
 
 
-目录结构:
+### 项目目录结构:
     .
     ├── app                                        应用目录
     │   ├── alarms                                 报警
@@ -21,8 +22,65 @@ f. 数据预警事件,提供事件订阅服务
     └── deploy                                     部署相关
 
 
+### 数据清洗 tag 的相关订阅
+#### python依赖安装
+> pip3 install psycopg2 schedule pandas sshtunnel sqlalchemy pymysql redis
 
+#### 1. 待处理的事件队列 tag
+> MQ: Redis
+>
+> key: data-center:mq:event
+>
+> value: ${tag}
+>
+> type: List
+>
+> blpop + rpush
+>
 
+#### 2. 事件通知订阅
+> MQ: Redis
+>
+> key: data-center:notice:event:${project_id}:${item}
+>
+> value: {"event_name": ${event_name},"project_id": ${project_id},"payload": {"item_name": ${item_name}, "item_val": ${item_val},......}}
+>
+> type: SubPub
+>
 
-python 依赖安装:
-    pip install psycopg2 schedule pandas sshtunnel sqlalchemy pymysql redis
+#### 3. 待处理的报警队列 tag
+> MQ: Redis
+>
+> key: data-center:mq:alarm
+>
+> value: ${tag}
+>
+> type: List
+>
+> blpop + rpush
+>
+
+#### 4. 报警通知订阅
+> MQ: Redis
+>
+> key: data-center:notice:alarm
+>
+> value: {"alarm_name": ${alarm_name},"project_id": ${project_id},"payload": {"item_name": ${item_name}, "item_val": ${item_val},......}}
+>
+> type: SubPub
+>
+
+#### 5. 待整理的异构数据队列 tag
+> MQ: Redis
+>
+> key: data-center:mq:isomerism
+>
+> value: ${tag}
+>
+> type: List
+>
+> blpop + rpush
+>
+
+
+### 部署

+ 0 - 0
app/cleansing/cleansing.py → app/cmd/cleansing/cleansing.py


+ 0 - 0
app/cleansing/models/__init__.py → app/cmd/cleansing/models/__init__.py


+ 0 - 0
app/cleansing/models/data_center/Base.py → app/cmd/cleansing/models/data_center/Base.py


+ 0 - 0
app/cleansing/models/data_center/models.py → app/cmd/cleansing/models/data_center/models.py


+ 0 - 0
app/cleansing/models/source/mgj.py → app/cmd/cleansing/models/source/mgj.py


+ 0 - 0
app/cleansing/models/source/opc.py → app/cmd/cleansing/models/source/opc.py


+ 0 - 0
app/cleansing/services/__init__.py → app/cmd/cleansing/services/__init__.py


+ 0 - 0
app/cleansing/services/clean_items/__init__.py → app/cmd/cleansing/services/clean_items/__init__.py


+ 0 - 0
app/cleansing/services/clean_items/dispatcher.py → app/cmd/cleansing/services/clean_items/dispatcher.py


+ 0 - 0
app/cleansing/services/clean_items/items.py → app/cmd/cleansing/services/clean_items/items.py


+ 0 - 0
app/cleansing/services/jobs/__init__.py → app/cmd/cleansing/services/jobs/__init__.py


+ 0 - 0
app/cleansing/services/jobs/data_center_set.py → app/cmd/cleansing/services/jobs/data_center_set.py


+ 0 - 0
app/cleansing/services/jobs/job.py → app/cmd/cleansing/services/jobs/job.py


+ 0 - 0
app/cleansing/services/jobs/source_data_set.py → app/cmd/cleansing/services/jobs/source_data_set.py


+ 28 - 0
app/cmd/events/etc/events.yaml

@@ -0,0 +1,28 @@
+Name: events.rpc
+ListenOn: 0.0.0.0:8080
+
+Timeout: 0
+Mode: test
+
+Log:
+  ServiceName: events-rpc
+  Mode: console
+  Level: info
+
+#双胞胎服务
+GtServerIp: 47.96.12.136:8788
+
+DtDataStoreDB:
+  DataSource: ws_data:c712f89fc4f8edaf30e41b828f4e3d26@tcp(192.168.60.201:4000)/ws_data?charset=utf8mb4&parseTime=True&loc=&loc=Asia%2FShanghai
+
+Redis:
+  Host: 47.96.12.136:6379
+  Key: dc:events
+  Type: node
+  Pass:
+
+Cache:
+  - Host: 47.96.12.136:6379
+    Key: dc:events:cache
+    Type: node
+    Pass:

+ 54 - 0
app/cmd/events/events.go

@@ -0,0 +1,54 @@
+package main
+
+import (
+	"GtDataStore/app/cmd/events/internal/logic/handler"
+	"GtDataStore/app/cmd/events/internal/logic/job"
+	"GtDataStore/common/envitem"
+	"flag"
+	"fmt"
+
+	"GtDataStore/app/cmd/events/internal/config"
+	"GtDataStore/app/cmd/events/internal/server"
+	"GtDataStore/app/cmd/events/internal/svc"
+	"GtDataStore/app/cmd/events/pb"
+
+	"github.com/zeromicro/go-zero/core/conf"
+	"github.com/zeromicro/go-zero/core/service"
+	"github.com/zeromicro/go-zero/zrpc"
+	"google.golang.org/grpc"
+	"google.golang.org/grpc/reflection"
+)
+
+var configFile = flag.String("f", "etc/events.yaml", "the config file")
+
+func main() {
+	flag.Parse()
+
+	var c config.Config
+	conf.MustLoad(*configFile, &c)
+	ctx := svc.NewServiceContext(c)
+
+	s := zrpc.MustNewServer(c.RpcServerConf, func(grpcServer *grpc.Server) {
+		pb.RegisterEventsServer(grpcServer, server.NewEventsServer(ctx))
+
+		if c.Mode == service.DevMode || c.Mode == service.TestMode {
+			reflection.Register(grpcServer)
+		}
+	})
+	defer s.Stop()
+
+	if c.Mode != "dev" {
+		envitem.SetOptions(envitem.Options{GtServerIp: c.GtServerIp})
+
+		go func() {
+			defer func() {
+				fmt.Print("async events job stop.....\n")
+			}()
+			j := job.NewJob(1, "events", ctx, handler.EventHandlerTable, handler.EventIntervalTable)
+			j.Run()
+		}()
+	}
+
+	fmt.Printf("Starting rpc server at %s...\n", c.ListenOn)
+	s.Start()
+}

+ 9 - 0
app/cmd/events/events.proto

@@ -0,0 +1,9 @@
+syntax = "proto3";
+
+package pb;
+option go_package = "./pb";
+
+
+service events {
+
+}

+ 28 - 0
app/cmd/events/events/events.go

@@ -0,0 +1,28 @@
+// Code generated by goctl. DO NOT EDIT.
+// Source: events.proto
+
+package events
+
+import (
+	"context"
+
+	"GtDataStore/app/cmd/events/pb"
+
+	"github.com/zeromicro/go-zero/zrpc"
+	"google.golang.org/grpc"
+)
+
+type (
+	Events interface {
+	}
+
+	defaultEvents struct {
+		cli zrpc.Client
+	}
+)
+
+func NewEvents(cli zrpc.Client) Events {
+	return &defaultEvents{
+		cli: cli,
+	}
+}

+ 18 - 0
app/cmd/events/internal/config/config.go

@@ -0,0 +1,18 @@
+package config
+
+import (
+	"github.com/zeromicro/go-zero/core/stores/cache"
+	"github.com/zeromicro/go-zero/zrpc"
+)
+
+type Config struct {
+	zrpc.RpcServerConf
+
+	DtDataStoreDB struct {
+		DataSource string
+	}
+
+	Cache cache.CacheConf
+
+	GtServerIp string
+}

+ 16 - 0
app/cmd/events/internal/logic/handler/event.go

@@ -0,0 +1,16 @@
+package handler
+
+import (
+	"GtDataStore/app/cmd/events/internal/logic/job"
+	"context"
+)
+
+func handlerEvent(ctx context.Context, task *job.Task, technologyName string) error {
+	queue := task.Job.SvcCtx.Cache
+
+	for info := range eventChan {
+
+	}
+
+	return nil
+}

+ 28 - 0
app/cmd/events/internal/logic/handler/multi.go

@@ -0,0 +1,28 @@
+package handler
+
+import (
+	"GtDataStore/app/cmd/events/internal/logic/job"
+	"GtDataStore/app/cmd/events/internal/svc"
+	"GtDataStore/app/model"
+	"context"
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+func EventMulti(ctx context.Context, task *job.Task, technologyName string) error {
+	// 1. 查询所有的设备
+	_, err := findMultiRecord(task.Job.SvcCtx, int64(task.Id))
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func findMultiRecord(svcCtx *svc.ServiceContext, projectId int64) ([]model.DcEventBind, error) {
+	if records, err := svcCtx.DcEventBind.FindByProjectIdRuleFlag(context.Background(), projectId, EVENT_MULTI_ITEM); err != nil {
+		logx.Infof("findMultiRecord not found record")
+		return nil, err
+	} else {
+		return records, nil
+	}
+}

+ 80 - 0
app/cmd/events/internal/logic/handler/single.go

@@ -0,0 +1,80 @@
+package handler
+
+import (
+	"GtDataStore/app/cmd/events/internal/logic/job"
+	"GtDataStore/app/cmd/events/internal/svc"
+	"GtDataStore/app/model"
+	"GtDataStore/common/envitem"
+	"GtDataStore/common/identify"
+	"context"
+	"errors"
+	"github.com/zeromicro/go-zero/core/logx"
+	"sync"
+)
+
+func EventSingle(ctx context.Context, task *job.Task, technologyName string) error {
+	// 1. 查询所有的设备
+	binds, err := findSingleRecord(task.Job.SvcCtx, int64(task.Id))
+	if err != nil {
+		return err
+	}
+
+	// 2. 从记录中提取点位,并合并成MultiEventItems
+	MultiEvents := mergeToMultiEventItems(binds)
+	if len(MultiEvents) == 0 {
+		return errors.New("mergeToMultiEventItems not found envitems")
+	}
+
+	// 2. 获得点位信息
+	err = MultiEvents.FillCurrentValue()
+	if err != nil {
+		return err
+	}
+
+	// 3. 识别事件
+	var wg sync.WaitGroup
+	wg.Add(len(binds))
+	for _, bind := range binds {
+		item := MultiEvents[bind.Item]
+		ov := item.GetItemPrevStringVal()
+		nv := item.GetItemStringVal()
+
+		checker := identify.NewSingleCheck(map[string]identify.Rule{bind.Name: bind.Config})
+		if name := checker.Check(ov, nv); name != "" {
+			eventChan <- eventInfo{
+				ProjectId:  bind.ProjectId,
+				DeviceCode: bind.DeviceCode,
+				Item:       bind.Item,
+				EventName:  name,
+				OldValue:   ov,
+				NewValue:   nv,
+				Time:       *item.GetItemHtime(),
+			}
+		}
+	}
+
+	wg.Wait()
+
+	return nil
+}
+
+func findSingleRecord(svcCtx *svc.ServiceContext, projectId int64) ([]model.DcEventBind, error) {
+	if binds, err := svcCtx.DcEventBind.FindByProjectIdRuleFlag(context.Background(), projectId, EVENT_SINGLE_ITEM); err != nil {
+		logx.Infof("findSingleRecord not found record")
+		return nil, err
+	} else {
+		return binds, nil
+	}
+}
+
+func mergeToMultiEventItems(binds []model.DcEventBind) envitem.MultiEnvItem {
+	me := make(envitem.MultiEnvItem)
+	for _, bind := range binds {
+		me[bind.Item] = &envitem.EnvItem{
+			ProjectId: bind.ProjectId,
+			Item:      bind.Item,
+		}
+	}
+
+	return me
+}

+ 47 - 0
app/cmd/events/internal/logic/handler/vars.go

@@ -0,0 +1,47 @@
+package handler
+
+import (
+	"GtDataStore/app/cmd/events/internal/logic/job"
+	"context"
+	"time"
+)
+
+const (
+	EVENT_NOTIFY      = "EVENT_NOTIFY"
+	EVENT_SINGLE_ITEM = "SINGLE_ITEM_EVENT" // 单点位值事件
+	EVENT_MULTI_ITEM  = "MULTI_ITEM_EVENT"  // 多点位值事件
+
+)
+
+type (
+	// 事件信息
+	eventInfo struct {
+		ProjectId  int64
+		DeviceCode string
+		Item       string
+		EventName  string
+		OldValue   string
+		NewValue   string
+		Time       time.Time
+	}
+)
+
+var (
+	eventChan chan eventInfo
+
+	EventIntervalTable = map[string]time.Duration{
+		EVENT_SINGLE_ITEM: 60 * time.Second,
+		EVENT_MULTI_ITEM:  60 * time.Second,
+		EVENT_NOTIFY:      50 * time.Second,
+	}
+
+	EventHandlerTable = map[string]func(ctx context.Context, task *job.Task, technologyName string) error{
+		EVENT_SINGLE_ITEM: EventSingle,
+		EVENT_MULTI_ITEM:  EventMulti,
+		EVENT_NOTIFY:      handlerEvent,
+	}
+)
+
+func init() {
+	eventChan = make(chan eventInfo, 50)
+}

+ 221 - 0
app/cmd/events/internal/logic/job/job.go

@@ -0,0 +1,221 @@
+package job
+
+import (
+	"GtDataStore/app/cmd/events/internal/svc"
+	"GtDataStore/app/model"
+	"context"
+	"fmt"
+	"github.com/go-redis/redis/v8"
+	"github.com/zeromicro/go-zero/core/logx"
+	"strconv"
+	"sync"
+	"time"
+)
+
+// 负责仿真模拟的数据生产工作 异步执行
+// 1. 读取可用项目,每个项目生成一个新的 Job -> J1
+// 2. J1中检查项目对应的设备或工艺项目
+// 		a. 没有查询到则退出
+//      b. 检查到的项注册到全局记录 G1 中
+// 3. 从 G1 中读取到项目信息及项,项中包含执行时间间隔 interval
+// 4. 将项目信息 P 及项信息 D,注入 task,生成一个新的任务。时间随 interval 到来执行
+// 		a. 间隔清理task
+
+type Partition struct {
+	N     int64 // 有几个Job
+	Pn    int64 // 区号, 决定选取哪页数据段
+	Total int64 // 数据总量
+	limit int64 // 数据页大小 = Total / N
+}
+
+type Job struct {
+	Id            uint32 `json:"id"`
+	Name          string `json:"name"`
+	Ctx           context.Context
+	SvcCtx        *svc.ServiceContext
+	CheckInterval time.Duration
+	StartInterval time.Duration
+	Partition     Partition
+	syncClient    *redis.Client
+
+	pts                  map[uint32]*Task
+	ptsLock              sync.RWMutex
+	handlerTable         map[string]func(ctx context.Context, task *Task, technologyName string) error
+	handlerIntervalTable map[string]time.Duration
+}
+
+func NewJob(id uint32, name string, svc *svc.ServiceContext, handlerTable map[string]func(ctx context.Context, task *Task, technologyName string) error, handlerIntervalTable map[string]time.Duration) *Job {
+	return &Job{
+		Id:                   id,
+		Name:                 name,
+		Ctx:                  context.Background(),
+		SvcCtx:               svc,
+		CheckInterval:        120 * time.Second,
+		StartInterval:        127 * time.Second,
+		syncClient:           redis.NewClient(&redis.Options{Addr: svc.Config.Redis.Host, Password: svc.Config.Redis.Pass, MaxRetries: 5}),
+		pts:                  make(map[uint32]*Task),
+		handlerTable:         handlerTable,
+		handlerIntervalTable: handlerIntervalTable,
+	}
+}
+
+func (j *Job) Run() error {
+	defer func() {
+		if err := recover(); err != nil {
+			fmt.Printf("Job quit by error")
+		}
+	}()
+
+	// 检测新任务及更新任务状态,或退出不需要的任务
+	go j.checkProjectTask()
+
+	// 启动待执行的任务
+	go j.startProjectTask()
+
+	// 启动同步
+	go j.syncPartition()
+
+	select {}
+}
+
+func (j *Job) startProjectTask() {
+	tk := time.NewTicker(j.StartInterval)
+	for {
+		select {
+		case <-tk.C:
+			for _, task := range j.pts {
+				if task.IsRun() == false {
+					if te := task.Test(); te != nil {
+						logx.Errorf("start project task error: test fail, %s", te.Error())
+						continue
+					}
+
+					task.Start("")
+				}
+			}
+		}
+	}
+}
+
+func (j *Job) checkProjectTask() {
+	tk := time.NewTicker(j.CheckInterval)
+	for {
+		select {
+		case <-tk.C:
+			j.checkProject()
+		}
+	}
+}
+
+func (j *Job) checkProject() {
+	// 对 pts加锁,防止在注册新任务或任务状态改变时,出现任务调度不一致的情况
+	j.ptsLock.Lock()
+	defer func() {
+		j.ptsLock.Unlock()
+	}()
+
+	limit := j.Partition.partitionLimit()
+	ps, err := j.SvcCtx.ProjectConfig.FindAllByPage(j.Ctx, (j.Partition.Pn-1)*limit, limit)
+	if err != nil {
+		logx.Errorf("not found project config")
+	}
+
+	for _, p := range ps {
+		jid := uint32(p.ProjectId)
+		if _, ok := j.pts[jid]; !ok {
+			if p.IsEnabled() {
+				if npt, err := j.createProjectTask(p); err == nil {
+					j.pts[jid] = npt
+				} else {
+					logx.Errorf("create new project task error: %s", err.Error())
+				}
+			}
+		} else {
+			if p.IsEnabled() == false {
+				if t, ok := j.pts[jid]; ok {
+					t.Quit()
+					delete(j.pts, jid)
+				}
+			}
+		}
+	}
+
+	// todo: pts 中会存在数据表中已经删除的项目,也要定时清理
+}
+
+func (j *Job) createProjectTask(model model.DcProjectConfig) (*Task, error) {
+	fmt.Printf("check new project task: %d\n", model.ProjectId)
+	return NewProjectTask(uint32(model.ProjectId), fmt.Sprintf("project-%d", model.ProjectId), j, model), nil
+}
+
+func (j *Job) ClearTask() {
+	j.ptsLock.Lock()
+	defer j.ptsLock.Unlock()
+	for _, task := range j.pts {
+		if task.IsRun() == true {
+			task.Quit()
+			delete(j.pts, task.Id)
+		}
+	}
+}
+
+func (j *Job) setPartition(partition Partition) {
+	j.Partition = partition
+}
+
+func (p *Partition) partitionLimit() int64 {
+	if p.N == 0 {
+		return 1
+	}
+	total := p.Total
+	if p.Total%2 == 1 {
+		total++
+	}
+	return total / p.N
+}
+
+func (j *Job) syncPartition() {
+	tk := time.NewTicker(60 * time.Second)
+
+	go func() {
+		for {
+			message, err := j.syncClient.Subscribe(j.Ctx, "simulation-job-"+j.Name).ReceiveMessage(j.Ctx)
+			if err != nil {
+				time.Sleep(5 * time.Second)
+				continue
+			}
+
+			if total, err := strconv.ParseInt(message.Payload, 10, 64); err == nil {
+				ic := j.syncClient.Incr(j.Ctx, "simulation-job-n-"+j.Name)
+				j.Partition.Total = total
+				j.Partition.Pn = ic.Val()
+				j.Partition.N = 1
+
+				time.Sleep(3 * time.Second)
+				n := j.syncClient.Get(j.Ctx, "simulation-job-n-"+j.Name)
+				j.syncClient.Expire(j.Ctx, "simulation-job-n-"+j.Name, 10*time.Second)
+
+				if n, err := n.Int64(); err == nil {
+					j.Partition.N = n
+				}
+
+				j.ClearTask()
+			}
+		}
+	}()
+
+	for {
+		select {
+		case <-tk.C:
+			ps, err := j.SvcCtx.ProjectConfig.FindAll(j.Ctx)
+			if err != nil {
+				logx.Errorf("not found project config")
+			}
+
+			if len(ps) != int(j.Partition.Total) {
+				// 发布一条消息
+				j.syncClient.Publish(j.Ctx, "simulation-job-"+j.Name, len(ps))
+			}
+		}
+	}
+}

+ 149 - 0
app/cmd/events/internal/logic/job/task.go

@@ -0,0 +1,149 @@
+package job
+
+import (
+	"GtDataStore/app/model"
+	"context"
+	"errors"
+	"fmt"
+	"github.com/zeromicro/go-zero/core/logx"
+	"time"
+)
+
+// Task 提供项目的状态、信息,为子任务提供共享空间
+type Task struct {
+	Id      uint32                 `json:"id"`
+	Name    string                 `json:"name"`
+	Model   *model.DcProjectConfig `json:"model"`
+	handler func(ctx context.Context, task *Task) error
+
+	Job      *Job
+	sigStart chan string
+
+	status     uint8 // 运行状态 0:未运行 1:运行中 2:待退出
+	ctx        context.Context
+	cancelFunc context.CancelFunc
+}
+
+func NewProjectTask(id uint32, name string, job *Job, model model.DcProjectConfig) *Task {
+	ctx, cancelFunc := context.WithCancel(context.Background())
+	np := &Task{
+		Id:         id,
+		Name:       name,
+		Model:      &model,
+		Job:        job,
+		handler:    Handler,
+		status:     0,
+		sigStart:   make(chan string),
+		ctx:        ctx,
+		cancelFunc: cancelFunc,
+	}
+
+	// 等待开始信号
+	go np.run()
+
+	return np
+}
+
+func (p *Task) run() error {
+	select {
+	case <-p.sigStart:
+		p.status = 1
+	}
+
+	err := p.handler(p.ctx, p)
+	if err != nil {
+		logx.Infof("project task simulations %d, %s, %s", p.Id, p.Name, err.Error())
+	}
+	return err
+}
+
+func (p *Task) Start(msg string) {
+	p.sigStart <- msg
+}
+
+func (p *Task) Quit() {
+	p.status = 2
+	p.cancelFunc()
+}
+
+func (p *Task) IsRun() bool {
+	return p.status == 1
+}
+
+func (p *Task) Test() error {
+	if p.Job == nil {
+		return errors.New("not found Job")
+	}
+
+	if p.Model == nil {
+		return errors.New("not found project model")
+	}
+
+	if p.handler == nil {
+		return errors.New("not set simulations")
+	}
+
+	if len(p.Model.Technologys) == 0 {
+		return errors.New("not set technologys list, modify technologys field for mysql cd_project_config")
+	}
+
+	for _, technology := range p.Model.Technologys {
+		if _, ok := p.Job.handlerTable[technology]; !ok {
+			fmt.Printf("project: %d, %s no support", p.Id, technology)
+			continue
+			//return errors.New(fmt.Sprintf("project: %d, %s no support", p.Id, technology))
+		}
+	}
+
+	return nil
+}
+
+func Handler(ctx context.Context, task *Task) error {
+	for {
+		select {
+		case <-ctx.Done():
+			return nil
+		default:
+			return distribute(ctx, task)
+		}
+	}
+}
+
+// 将一个项目需要处理的所有工艺进行分发
+func distribute(ctx context.Context, task *Task) error {
+	fmt.Printf("distribute task for: %+v", task.Model.Technologys)
+	for _, technology := range task.Model.Technologys {
+		interval, ok := task.Job.handlerIntervalTable[technology]
+		if !ok {
+			fmt.Printf("project: %d, %s no support", task.Id, technology)
+			continue
+			//return errors.New(fmt.Sprintf("project: %d, %s no support", task.Id, technology))
+		}
+
+		f, ok := task.Job.handlerTable[technology]
+		if !ok {
+			return errors.New(fmt.Sprintf("project: %d, %s no bind simulations", task.Id, technology))
+		}
+
+		technologyName := technology
+		go func(interval time.Duration, call func(ctx context.Context, task *Task, technologyName string) error) {
+			tk := time.NewTicker(interval)
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-tk.C:
+					// 这里是同步执行的,避免并发问题
+					err := call(ctx, task, technologyName)
+					if err != nil {
+						fmt.Printf("distribute.call error: %s\n", err.Error())
+					}
+					//} else {
+					//	fmt.Print("distribute.call finish\n")
+					//}
+				}
+			}
+		}(interval, f)
+	}
+	return nil
+}

+ 21 - 0
app/cmd/events/internal/server/eventsServer.go

@@ -0,0 +1,21 @@
+// Code generated by goctl. DO NOT EDIT.
+// Source: events.proto
+
+package server
+
+import (
+	"GtDataStore/app/cmd/events/internal/logic"
+	"GtDataStore/app/cmd/events/internal/svc"
+	"GtDataStore/app/cmd/events/pb"
+)
+
+type EventsServer struct {
+	svcCtx *svc.ServiceContext
+	pb.UnimplementedEventsServer
+}
+
+func NewEventsServer(svcCtx *svc.ServiceContext) *EventsServer {
+	return &EventsServer{
+		svcCtx: svcCtx,
+	}
+}

+ 24 - 0
app/cmd/events/internal/svc/serviceContext.go

@@ -0,0 +1,24 @@
+package svc
+
+import (
+	"GtDataStore/app/cmd/events/internal/config"
+	"github.com/go-redis/redis/v8"
+)
+
+type ServiceContext struct {
+	Config config.Config
+	Cache  *redis.Client
+
+	modelList
+}
+
+func NewServiceContext(c config.Config) *ServiceContext {
+	svc := &ServiceContext{
+		Config: c,
+		Cache:  redis.NewClient(&redis.Options{Addr: c.Cache[0].Host, Password: c.Cache[0].Pass, MaxRetries: 5}),
+	}
+
+	initModel(svc)
+
+	return svc
+}

+ 23 - 0
app/cmd/events/internal/svc/vars.go

@@ -0,0 +1,23 @@
+package svc
+
+import (
+	"GtDataStore/app/model"
+	"github.com/zeromicro/go-zero/core/stores/sqlx"
+)
+
+type modelList struct {
+	ProjectConfig model.DcProjectConfigModel
+	DcEventBind   model.DcEventBindModel
+	DcEventRule   model.DcEventRuleModel
+	DcEventList   model.DcEventListModel
+	DcItemData    model.DcItemDataModel
+}
+
+func initModel(svc *ServiceContext) {
+	mysql := sqlx.NewMysql(svc.Config.DtDataStoreDB.DataSource)
+	svc.DcEventRule = model.NewDcEventRuleModel(mysql)
+	svc.DcEventList = model.NewDcEventListModel(mysql)
+	svc.DcEventBind = model.NewDcEventBindModel(mysql)
+	svc.DcItemData = model.NewDcItemDataModel(mysql)
+	svc.ProjectConfig = model.NewDcProjectConfigModel(mysql)
+}

+ 61 - 0
app/cmd/events/pb/events.pb.go

@@ -0,0 +1,61 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.28.0
+// 	protoc        v4.23.4
+// source: events.proto
+
+package pb
+
+import (
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+var File_events_proto protoreflect.FileDescriptor
+
+var file_events_proto_rawDesc = []byte{
+	0x0a, 0x0c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x02,
+	0x70, 0x62, 0x32, 0x08, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x42, 0x06, 0x5a, 0x04,
+	0x2e, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var file_events_proto_goTypes = []interface{}{}
+var file_events_proto_depIdxs = []int32{
+	0, // [0:0] is the sub-list for method output_type
+	0, // [0:0] is the sub-list for method input_type
+	0, // [0:0] is the sub-list for extension type_name
+	0, // [0:0] is the sub-list for extension extendee
+	0, // [0:0] is the sub-list for field type_name
+}
+
+func init() { file_events_proto_init() }
+func file_events_proto_init() {
+	if File_events_proto != nil {
+		return
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_events_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   0,
+			NumExtensions: 0,
+			NumServices:   1,
+		},
+		GoTypes:           file_events_proto_goTypes,
+		DependencyIndexes: file_events_proto_depIdxs,
+	}.Build()
+	File_events_proto = out.File
+	file_events_proto_rawDesc = nil
+	file_events_proto_goTypes = nil
+	file_events_proto_depIdxs = nil
+}

+ 65 - 0
app/cmd/events/pb/events_grpc.pb.go

@@ -0,0 +1,65 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.2.0
+// - protoc             v4.23.4
+// source: events.proto
+
+package pb
+
+import (
+	grpc "google.golang.org/grpc"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+// EventsClient is the client API for Events service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type EventsClient interface {
+}
+
+type eventsClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewEventsClient(cc grpc.ClientConnInterface) EventsClient {
+	return &eventsClient{cc}
+}
+
+// EventsServer is the server API for Events service.
+// All implementations must embed UnimplementedEventsServer
+// for forward compatibility
+type EventsServer interface {
+	mustEmbedUnimplementedEventsServer()
+}
+
+// UnimplementedEventsServer must be embedded to have forward compatible implementations.
+type UnimplementedEventsServer struct {
+}
+
+func (UnimplementedEventsServer) mustEmbedUnimplementedEventsServer() {}
+
+// UnsafeEventsServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to EventsServer will
+// result in compilation errors.
+type UnsafeEventsServer interface {
+	mustEmbedUnimplementedEventsServer()
+}
+
+func RegisterEventsServer(s grpc.ServiceRegistrar, srv EventsServer) {
+	s.RegisterService(&Events_ServiceDesc, srv)
+}
+
+// Events_ServiceDesc is the grpc.ServiceDesc for Events service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var Events_ServiceDesc = grpc.ServiceDesc{
+	ServiceName: "pb.events",
+	HandlerType: (*EventsServer)(nil),
+	Methods:     []grpc.MethodDesc{},
+	Streams:     []grpc.StreamDesc{},
+	Metadata:    "events.proto",
+}

+ 28 - 0
app/cmd/organization/etc/organization.yaml

@@ -0,0 +1,28 @@
+Name: organization.rpc
+ListenOn: 0.0.0.0:8080
+
+Timeout: 0
+Mode: test
+
+Log:
+  ServiceName: organization-rpc
+  Mode: console
+  Level: info
+
+#双胞胎服务
+GtServerIp: 47.96.12.136:8788
+
+DtDataStoreDB:
+  DataSource: ws_data:c712f89fc4f8edaf30e41b828f4e3d26@tcp(192.168.60.201:4000)/ws_data?charset=utf8mb4&parseTime=True&loc=&loc=Asia%2FShanghai
+
+Redis:
+  Host: 47.96.12.136:6379
+  Key: dc:organization
+  Type: node
+  Pass:
+
+Cache:
+  - Host: 47.96.12.136:6379
+    Key: dc:organization:cache
+    Type: node
+    Pass:

+ 15 - 0
app/cmd/organization/internal/config/config.go

@@ -0,0 +1,15 @@
+package config
+
+import "github.com/zeromicro/go-zero/zrpc"
+import "github.com/zeromicro/go-zero/core/stores/cache"
+
+type Config struct {
+	zrpc.RpcServerConf
+	DtDataStoreDB struct {
+		DataSource string
+	}
+
+	Cache cache.CacheConf
+
+	GtServerIp string
+}

+ 74 - 0
app/cmd/organization/internal/logic/handler/chest.go

@@ -0,0 +1,74 @@
+package handler
+
+import (
+	"GtDataStore/app/cmd/organization/internal/logic/job"
+	"GtDataStore/app/cmd/organization/internal/svc"
+	"GtDataStore/app/model"
+	"context"
+	"github.com/zeromicro/go-zero/core/logx"
+	"sync"
+	"time"
+)
+
+func DeviceChest(ctx context.Context, task *job.Task, technologyName string) error {
+	// 1. 查询所有的设备
+	devices, err := findDeviceChest(task.Job.SvcCtx, int64(task.Id))
+	if err != nil {
+		return err
+	}
+	// 2. 获得点位信息
+	var wg sync.WaitGroup
+	wg.Add(len(devices))
+	for _, device := range devices {
+		device := device
+		go func() {
+			defer wg.Done()
+			if err := device.Items.FillCurrentValue(); err != nil {
+				logx.Errorf("DeviceChest device.Items.FillCurrentValue error: %s", err.Error())
+			}
+		}()
+	}
+
+	wg.Wait()
+
+	// 3. 转换为存储对象
+	workings, err := transDeviceChestData(devices)
+	if err != nil {
+		return err
+	}
+	// 4. 批量入库
+	if _, err := task.Job.SvcCtx.WorkingChest.MultiInsert(context.Background(), workings); err != nil {
+		logx.Errorf("DeviceChest task.Job.SvcCtx.WorkingChest.MultiInsert error: %s", err.Error())
+	}
+
+	return nil
+}
+
+func findDeviceChest(svcCtx *svc.ServiceContext, projectId int64) ([]model.DcDeviceBind, error) {
+	if devices, err := svcCtx.DeviceBind.FindByProjectIdDeviceType(context.Background(), projectId, DEVICE_CHEST); err != nil {
+		logx.Infof("findDeviceChest not found devices")
+		return nil, err
+	} else {
+		return devices, nil
+	}
+}
+
+func transDeviceChestData(datas []model.DcDeviceBind) ([]model.DcWorkingChest, error) {
+	ts := make([]model.DcWorkingChest, len(datas))
+
+	for i, data := range datas {
+		ts[i] = model.DcWorkingChest{
+			Id:                  0,
+			ProjectId:           data.ProjectId,
+			DeviceCode:          data.DeviceCode,
+			Switch:              data.Items.GetItemInt64Value("switch"),
+			Level:               data.Items.GetItemFloat64Value("level"),
+			AgitatorStatus:      data.Items.GetItemInt64Value("level"),
+			AgitatorDuration:    data.Items.GetItemInt64Value("level"),
+			AgitatorFaultStatus: data.Items.GetItemInt64Value("level"),
+			CTime:               time.Now(),
+		}
+	}
+
+	return ts, nil
+}

+ 93 - 0
app/cmd/organization/internal/logic/handler/mf.go

@@ -0,0 +1,93 @@
+package handler
+
+import (
+	"GtDataStore/app/cmd/organization/internal/logic/job"
+	"GtDataStore/app/cmd/organization/internal/svc"
+	"GtDataStore/app/model"
+	"context"
+	"github.com/zeromicro/go-zero/core/logx"
+	"sync"
+	"time"
+)
+
+func DeviceMf(ctx context.Context, task *job.Task, technologyName string) error {
+	// 1. 查询所有的设备
+	devices, err := findDeviceMf(task.Job.SvcCtx, int64(task.Id))
+	if err != nil {
+		return err
+	}
+	// 2. 获得点位信息
+	var wg sync.WaitGroup
+	wg.Add(len(devices))
+	for _, device := range devices {
+		device := device
+		go func() {
+			defer wg.Done()
+			if err := device.Items.FillCurrentValue(); err != nil {
+				logx.Errorf("DeviceMf device.Items.FillCurrentValue error: %s", err.Error())
+			}
+		}()
+	}
+
+	wg.Wait()
+
+	// 3. 转换为存储对象
+	workings, err := transDeviceMfData(devices)
+	if err != nil {
+		return err
+	}
+	// 4. 批量入库
+	if _, err := task.Job.SvcCtx.WorkingMf.MultiInsert(context.Background(), workings); err != nil {
+		logx.Errorf("DeviceMf task.Job.SvcCtx.WorkingMf.MultiInsert error: %s", err.Error())
+	}
+
+	return nil
+}
+
+func findDeviceMf(svcCtx *svc.ServiceContext, projectId int64) ([]model.DcDeviceBind, error) {
+	if devices, err := svcCtx.DeviceBind.FindByProjectIdDeviceType(context.Background(), projectId, DEVICE_UF); err != nil {
+		logx.Infof("findDeviceMf not found devices")
+		return nil, err
+	} else {
+		return devices, nil
+	}
+}
+
+func transDeviceMfData(datas []model.DcDeviceBind) ([]model.DcWorkingMf, error) {
+	ts := make([]model.DcWorkingMf, len(datas))
+
+	for i, data := range datas {
+		ts[i] = model.DcWorkingMf{
+			ProjectId:        data.ProjectId,
+			DeviceCode:       data.DeviceCode,
+			WaterTemperature: data.Items.GetItemFloat64Value("water_temperature"),
+			FeedFlow:         data.Items.GetItemFloat64Value("feed_flow"),
+			ConFlow:          data.Items.GetItemFloat64Value("con_flow"),
+			ProductFlow:      data.Items.GetItemFloat64Value("product_flow"),
+			FeedPressure:     data.Items.GetItemFloat64Value("feed_pressure"),
+			ConPressure:      data.Items.GetItemFloat64Value("con_pressure"),
+			ProductPressure:  data.Items.GetItemFloat64Value("product_pressure"),
+			Tmp:              data.Items.GetItemFloat64Value("tmp"),
+			Flux:             data.Items.GetItemFloat64Value("flux"),
+			FeedWqTurbidity:  data.Items.GetItemFloat64Value("feed_wq_turbidity"),
+			FeedWqPh:         data.Items.GetItemInt64Value("feed_wq_ph"),
+			ProductWqPh:      data.Items.GetItemInt64Value("product_wq_ph"),
+			FeedWqAl:         data.Items.GetItemFloat64Value("feed_wq_al"),
+			ProductWqAl:      data.Items.GetItemFloat64Value("product_wq_al"),
+			FeedWqFe:         data.Items.GetItemFloat64Value("feed_wq_fe"),
+			ProductWqFe:      data.Items.GetItemFloat64Value("product_wq_fe"),
+			FeedWqMn:         data.Items.GetItemFloat64Value("feed_wq_mn"),
+			ProductWqMn:      data.Items.GetItemFloat64Value("product_wq_mn"),
+			FeedWqSio2:       data.Items.GetItemFloat64Value("feed_wq_sio2"),
+			ProductWqSio2:    data.Items.GetItemFloat64Value("product_wq_sio2"),
+			FeedWqCod:        data.Items.GetItemFloat64Value("feed_wq_cod"),
+			ProductWqCod:     data.Items.GetItemFloat64Value("product_wq_cod"),
+			FeedWqP:          data.Items.GetItemFloat64Value("feed_wq_p"),
+			ProductWqP:       data.Items.GetItemFloat64Value("product_wq_p"),
+			Step:             data.Items.GetItemInt64Value("step"),
+			CTime:            time.Now(),
+		}
+	}
+
+	return ts, nil
+}

+ 113 - 0
app/cmd/organization/internal/logic/handler/nf.go

@@ -0,0 +1,113 @@
+package handler
+
+import (
+	"GtDataStore/app/cmd/organization/internal/logic/job"
+	"GtDataStore/app/cmd/organization/internal/svc"
+	"GtDataStore/app/model"
+	"context"
+	"github.com/zeromicro/go-zero/core/logx"
+	"sync"
+	"time"
+)
+
+func DeviceNf(ctx context.Context, task *job.Task, technologyName string) error {
+	// 1. 查询所有的设备
+	devices, err := findDeviceNf(task.Job.SvcCtx, int64(task.Id))
+	if err != nil {
+		return err
+	}
+	// 2. 获得点位信息
+	var wg sync.WaitGroup
+	wg.Add(len(devices))
+	for _, device := range devices {
+		device := device
+		go func() {
+			defer wg.Done()
+			if err := device.Items.FillCurrentValue(); err != nil {
+				logx.Errorf("DeviceNf device.Items.FillCurrentValue error: %s", err.Error())
+			}
+		}()
+	}
+
+	wg.Wait()
+
+	// 3. 转换为存储对象
+	workings, err := transDeviceNfData(devices)
+	if err != nil {
+		return err
+	}
+	// 4. 批量入库
+	if _, err := task.Job.SvcCtx.WorkingNf.MultiInsert(context.Background(), workings); err != nil {
+		logx.Errorf("DeviceNf task.Job.SvcCtx.WorkingNf.MultiInsert error: %s", err.Error())
+	}
+
+	return nil
+}
+
+func findDeviceNf(svcCtx *svc.ServiceContext, projectId int64) ([]model.DcDeviceBind, error) {
+	if devices, err := svcCtx.DeviceBind.FindByProjectIdDeviceType(context.Background(), projectId, DEVICE_UF); err != nil {
+		logx.Infof("findDeviceNf not found devices")
+		return nil, err
+	} else {
+		return devices, nil
+	}
+}
+
+func transDeviceNfData(datas []model.DcDeviceBind) ([]model.DcWorkingNf, error) {
+	ts := make([]model.DcWorkingNf, len(datas))
+
+	for i, data := range datas {
+		ts[i] = model.DcWorkingNf{
+			Id:                 0,
+			ProjectId:          data.ProjectId,
+			DeviceCode:         data.DeviceCode,
+			WaterTemperature:   data.Items.GetItemFloat64Value("water_temperature"),
+			FeedFlow1St:        data.Items.GetItemFloat64Value("feed_wq_turbidity"),
+			ConFlow1St:         data.Items.GetItemFloat64Value("feed_wq_turbidity"),
+			ProductFlow1St:     data.Items.GetItemFloat64Value("feed_wq_turbidity"),
+			FeedPressure1St:    data.Items.GetItemFloat64Value("feed_wq_turbidity"),
+			ConPressure1St:     data.Items.GetItemFloat64Value("feed_wq_turbidity"),
+			ProductPressure1St: data.Items.GetItemFloat64Value("feed_wq_turbidity"),
+			Tmp1St:             data.Items.GetItemFloat64Value("feed_wq_turbidity"),
+			Flux1St:            data.Items.GetItemFloat64Value("feed_wq_turbidity"),
+			Permeability1St:    data.Items.GetItemFloat64Value("feed_wq_turbidity"),
+			FeedFlow2Nd:        data.Items.GetItemFloat64Value("feed_wq_turbidity"),
+			ConFlow2Nd:         data.Items.GetItemFloat64Value("feed_wq_turbidity"),
+			ProductFlow2Nd:     data.Items.GetItemFloat64Value("feed_wq_turbidity"),
+			FeedPressure2Nd:    data.Items.GetItemFloat64Value("feed_wq_turbidity"),
+			ConPressure2Nd:     data.Items.GetItemFloat64Value("feed_wq_turbidity"),
+			ProductPressure2Nd: data.Items.GetItemFloat64Value("feed_wq_turbidity"),
+			Tmp2Nd:             data.Items.GetItemFloat64Value("feed_wq_turbidity"),
+			Flux2Nd:            data.Items.GetItemFloat64Value("feed_wq_turbidity"),
+			Permeability2Nd:    data.Items.GetItemFloat64Value("feed_wq_turbidity"),
+			FeedFlow3Th:        data.Items.GetItemFloat64Value("feed_wq_turbidity"),
+			ConFlow3Th:         data.Items.GetItemFloat64Value("feed_wq_turbidity"),
+			ProductFlow3Th:     data.Items.GetItemFloat64Value("feed_wq_turbidity"),
+			FeedPressure3Th:    data.Items.GetItemFloat64Value("feed_wq_turbidity"),
+			ConPressure3Th:     data.Items.GetItemFloat64Value("feed_wq_turbidity"),
+			ProductPressure3Th: data.Items.GetItemFloat64Value("feed_wq_turbidity"),
+			Tmp3Th:             data.Items.GetItemFloat64Value("feed_wq_turbidity"),
+			Flux3Th:            data.Items.GetItemFloat64Value("feed_wq_turbidity"),
+			Permeability3Th:    data.Items.GetItemFloat64Value("feed_wq_turbidity"),
+			FeedWqTurbidity:    data.Items.GetItemFloat64Value("feed_wq_turbidity"),
+			FeedWqPh:           data.Items.GetItemInt64Value("feed_wq_ph"),
+			ProductWqPh:        data.Items.GetItemInt64Value("product_wq_ph"),
+			FeedWqAl:           data.Items.GetItemFloat64Value("feed_wq_al"),
+			ProductWqAl:        data.Items.GetItemFloat64Value("product_wq_al"),
+			FeedWqFe:           data.Items.GetItemFloat64Value("feed_wq_fe"),
+			ProductWqFe:        data.Items.GetItemFloat64Value("product_wq_fe"),
+			FeedWqMn:           data.Items.GetItemFloat64Value("feed_wq_mn"),
+			ProductWqMn:        data.Items.GetItemFloat64Value("product_wq_mn"),
+			FeedWqSio2:         data.Items.GetItemFloat64Value("feed_wq_sio2"),
+			ProductWqSio2:      data.Items.GetItemFloat64Value("product_wq_sio2"),
+			FeedWqCod:          data.Items.GetItemFloat64Value("feed_wq_cod"),
+			ProductWqCod:       data.Items.GetItemFloat64Value("product_wq_cod"),
+			FeedWqP:            data.Items.GetItemFloat64Value("feed_wq_p"),
+			ProductWqP:         data.Items.GetItemFloat64Value("product_wq_p"),
+			Step:               data.Items.GetItemInt64Value("step"),
+			CTime:              time.Now(),
+		}
+	}
+
+	return ts, nil
+}

+ 77 - 0
app/cmd/organization/internal/logic/handler/pump.go

@@ -0,0 +1,77 @@
+package handler
+
+import (
+	"GtDataStore/app/cmd/organization/internal/logic/job"
+	"GtDataStore/app/cmd/organization/internal/svc"
+	"GtDataStore/app/model"
+	"context"
+	"github.com/zeromicro/go-zero/core/logx"
+	"sync"
+	"time"
+)
+
+func DevicePump(ctx context.Context, task *job.Task, technologyName string) error {
+	// 1. 查询所有的设备
+	devices, err := findDevicePump(task.Job.SvcCtx, int64(task.Id))
+	if err != nil {
+		return err
+	}
+	// 2. 获得点位信息
+	var wg sync.WaitGroup
+	wg.Add(len(devices))
+	for _, device := range devices {
+		device := device
+		go func() {
+			defer wg.Done()
+			if err := device.Items.FillCurrentValue(); err != nil {
+				logx.Errorf("DevicePump device.Items.FillCurrentValue error: %s", err.Error())
+			}
+		}()
+	}
+
+	wg.Wait()
+
+	// 3. 转换为存储对象
+	workings, err := transDevicePumpData(devices)
+	if err != nil {
+		return err
+	}
+	// 4. 批量入库
+	if _, err := task.Job.SvcCtx.WorkingPump.MultiInsert(context.Background(), workings); err != nil {
+		logx.Errorf("DevicePump task.Job.SvcCtx.WorkingPump.MultiInsert error: %s", err.Error())
+	}
+
+	return nil
+}
+
+func findDevicePump(svcCtx *svc.ServiceContext, projectId int64) ([]model.DcDeviceBind, error) {
+	if devices, err := svcCtx.DeviceBind.FindByProjectIdDeviceType(context.Background(), projectId, DEVICE_UF); err != nil {
+		logx.Infof("findDevicePump not found devices")
+		return nil, err
+	} else {
+		return devices, nil
+	}
+}
+
+func transDevicePumpData(datas []model.DcDeviceBind) ([]model.DcWorkingPump, error) {
+	ts := make([]model.DcWorkingPump, len(datas))
+
+	for i, data := range datas {
+		ts[i] = model.DcWorkingPump{
+			ProjectId:    data.ProjectId,
+			DeviceCode:   data.DeviceCode,
+			FeedPressure: data.Items.GetItemFloat64Value("FeedPressure"),
+			OutPressure:  data.Items.GetItemFloat64Value("FeedPressure"),
+			Duration:     data.Items.GetItemInt64Value("FeedPressure"),
+			Current:      data.Items.GetItemFloat64Value("FeedPressure"),
+			Frequency:    data.Items.GetItemFloat64Value("FeedPressure"),
+			Lift:         data.Items.GetItemFloat64Value("FeedPressure"),
+			Efficiency:   data.Items.GetItemFloat64Value("FeedPressure"),
+			RunStatus:    data.Items.GetItemInt64Value("FeedPressure"),
+			FaultStatus:  data.Items.GetItemInt64Value("FeedPressure"),
+			CTime:        time.Now(),
+		}
+	}
+
+	return ts, nil
+}

+ 113 - 0
app/cmd/organization/internal/logic/handler/ro.go

@@ -0,0 +1,113 @@
+package handler
+
+import (
+	"GtDataStore/app/cmd/organization/internal/logic/job"
+	"GtDataStore/app/cmd/organization/internal/svc"
+	"GtDataStore/app/model"
+	"context"
+	"github.com/zeromicro/go-zero/core/logx"
+	"sync"
+	"time"
+)
+
+func DeviceRo(ctx context.Context, task *job.Task, technologyName string) error {
+	// 1. 查询所有的设备
+	devices, err := findDeviceRo(task.Job.SvcCtx, int64(task.Id))
+	if err != nil {
+		return err
+	}
+	// 2. 获得点位信息
+	var wg sync.WaitGroup
+	wg.Add(len(devices))
+	for _, device := range devices {
+		device := device
+		go func() {
+			defer wg.Done()
+			if err := device.Items.FillCurrentValue(); err != nil {
+				logx.Errorf("DeviceRo device.Items.FillCurrentValue error: %s", err.Error())
+			}
+		}()
+	}
+
+	wg.Wait()
+
+	// 3. 转换为存储对象
+	workings, err := transDeviceRoData(devices)
+	if err != nil {
+		return err
+	}
+	// 4. 批量入库
+	if _, err := task.Job.SvcCtx.WorkingRo.MultiInsert(context.Background(), workings); err != nil {
+		logx.Errorf("DeviceRo task.Job.SvcCtx.WorkingRo.MultiInsert error: %s", err.Error())
+	}
+
+	return nil
+}
+
+func findDeviceRo(svcCtx *svc.ServiceContext, projectId int64) ([]model.DcDeviceBind, error) {
+	if devices, err := svcCtx.DeviceBind.FindByProjectIdDeviceType(context.Background(), projectId, DEVICE_RO); err != nil {
+		logx.Infof("findDeviceRo not found devices")
+		return nil, err
+	} else {
+		return devices, nil
+	}
+}
+
+func transDeviceRoData(datas []model.DcDeviceBind) ([]model.DcWorkingRo, error) {
+	ts := make([]model.DcWorkingRo, len(datas))
+
+	for i, data := range datas {
+		ts[i] = model.DcWorkingRo{
+			Id:                 0,
+			ProjectId:          data.ProjectId,
+			DeviceCode:         data.DeviceCode,
+			WaterTemperature:   data.Items.GetItemFloat64Value("water_temperature"),
+			FeedFlow1St:        data.Items.GetItemFloat64Value("water_temperature"),
+			ConFlow1St:         data.Items.GetItemFloat64Value("water_temperature"),
+			ProductFlow1St:     data.Items.GetItemFloat64Value("water_temperature"),
+			FeedPressure1St:    data.Items.GetItemFloat64Value("water_temperature"),
+			ConPressure1St:     data.Items.GetItemFloat64Value("water_temperature"),
+			ProductPressure1St: data.Items.GetItemFloat64Value("water_temperature"),
+			Tmp1St:             data.Items.GetItemFloat64Value("water_temperature"),
+			Flux1St:            data.Items.GetItemFloat64Value("water_temperature"),
+			Permeability1St:    data.Items.GetItemFloat64Value("water_temperature"),
+			FeedFlow2Nd:        data.Items.GetItemFloat64Value("water_temperature"),
+			ConFlow2Nd:         data.Items.GetItemFloat64Value("water_temperature"),
+			ProductFlow2Nd:     data.Items.GetItemFloat64Value("water_temperature"),
+			FeedPressure2Nd:    data.Items.GetItemFloat64Value("water_temperature"),
+			ConPressure2Nd:     data.Items.GetItemFloat64Value("water_temperature"),
+			ProductPressure2Nd: data.Items.GetItemFloat64Value("water_temperature"),
+			Tmp2Nd:             data.Items.GetItemFloat64Value("water_temperature"),
+			Flux2Nd:            data.Items.GetItemFloat64Value("water_temperature"),
+			Permeability2Nd:    data.Items.GetItemFloat64Value("water_temperature"),
+			FeedFlow3Th:        data.Items.GetItemFloat64Value("water_temperature"),
+			ConFlow3Th:         data.Items.GetItemFloat64Value("water_temperature"),
+			ProductFlow3Th:     data.Items.GetItemFloat64Value("water_temperature"),
+			FeedPressure3Th:    data.Items.GetItemFloat64Value("water_temperature"),
+			ConPressure3Th:     data.Items.GetItemFloat64Value("water_temperature"),
+			ProductPressure3Th: data.Items.GetItemFloat64Value("water_temperature"),
+			Tmp3Th:             data.Items.GetItemFloat64Value("water_temperature"),
+			Flux3Th:            data.Items.GetItemFloat64Value("water_temperature"),
+			Permeability3Th:    data.Items.GetItemFloat64Value("water_temperature"),
+			FeedWqTurbidity:    data.Items.GetItemFloat64Value("feed_wq_turbidity"),
+			FeedWqPh:           data.Items.GetItemInt64Value("feed_wq_ph"),
+			ProductWqPh:        data.Items.GetItemInt64Value("product_wq_ph"),
+			FeedWqAl:           data.Items.GetItemFloat64Value("feed_wq_al"),
+			ProductWqAl:        data.Items.GetItemFloat64Value("product_wq_al"),
+			FeedWqFe:           data.Items.GetItemFloat64Value("feed_wq_fe"),
+			ProductWqFe:        data.Items.GetItemFloat64Value("product_wq_fe"),
+			FeedWqMn:           data.Items.GetItemFloat64Value("feed_wq_mn"),
+			ProductWqMn:        data.Items.GetItemFloat64Value("product_wq_mn"),
+			FeedWqSio2:         data.Items.GetItemFloat64Value("feed_wq_sio2"),
+			ProductWqSio2:      data.Items.GetItemFloat64Value("product_wq_sio2"),
+			FeedWqCod:          data.Items.GetItemFloat64Value("feed_wq_cod"),
+			ProductWqCod:       data.Items.GetItemFloat64Value("product_wq_cod"),
+			FeedWqP:            data.Items.GetItemFloat64Value("feed_wq_p"),
+			ProductWqP:         data.Items.GetItemFloat64Value("product_wq_p"),
+			Step:               data.Items.GetItemInt64Value("step"),
+			CTime:              time.Now(),
+		}
+	}
+
+	return ts, nil
+}

+ 93 - 0
app/cmd/organization/internal/logic/handler/uf.go

@@ -0,0 +1,93 @@
+package handler
+
+import (
+	"GtDataStore/app/cmd/organization/internal/logic/job"
+	"GtDataStore/app/cmd/organization/internal/svc"
+	"GtDataStore/app/model"
+	"context"
+	"github.com/zeromicro/go-zero/core/logx"
+	"sync"
+	"time"
+)
+
+func DeviceUf(ctx context.Context, task *job.Task, technologyName string) error {
+	// 1. 查询所有的设备
+	devices, err := findDeviceUf(task.Job.SvcCtx, int64(task.Id))
+	if err != nil {
+		return err
+	}
+	// 2. 获得点位信息
+	var wg sync.WaitGroup
+	wg.Add(len(devices))
+	for _, device := range devices {
+		device := device
+		go func() {
+			defer wg.Done()
+			if err := device.Items.FillCurrentValue(); err != nil {
+				logx.Errorf("DeviceUf device.Items.FillCurrentValue error: %s", err.Error())
+			}
+		}()
+	}
+
+	wg.Wait()
+
+	// 3. 转换为存储对象
+	workings, err := transDeviceUfData(devices)
+	if err != nil {
+		return err
+	}
+	// 4. 批量入库
+	if _, err := task.Job.SvcCtx.WorkingUf.MultiInsert(context.Background(), workings); err != nil {
+		logx.Errorf("DeviceUf task.Job.SvcCtx.WorkingUf.MultiInsert error: %s", err.Error())
+	}
+
+	return nil
+}
+
+func findDeviceUf(svcCtx *svc.ServiceContext, projectId int64) ([]model.DcDeviceBind, error) {
+	if devices, err := svcCtx.DeviceBind.FindByProjectIdDeviceType(context.Background(), projectId, DEVICE_UF); err != nil {
+		logx.Infof("findDeviceUf not found devices")
+		return nil, err
+	} else {
+		return devices, nil
+	}
+}
+
+func transDeviceUfData(datas []model.DcDeviceBind) ([]model.DcWorkingUf, error) {
+	ts := make([]model.DcWorkingUf, len(datas))
+
+	for i, data := range datas {
+		ts[i] = model.DcWorkingUf{
+			ProjectId:        data.ProjectId,
+			DeviceCode:       data.DeviceCode,
+			WaterTemperature: data.Items.GetItemFloat64Value("water_temperature"),
+			FeedFlow:         data.Items.GetItemFloat64Value("feed_flow"),
+			ConFlow:          data.Items.GetItemFloat64Value("con_flow"),
+			ProductFlow:      data.Items.GetItemFloat64Value("product_flow"),
+			FeedPressure:     data.Items.GetItemFloat64Value("feed_pressure"),
+			ConPressure:      data.Items.GetItemFloat64Value("con_pressure"),
+			ProductPressure:  data.Items.GetItemFloat64Value("product_pressure"),
+			Tmp:              data.Items.GetItemFloat64Value("tmp"),
+			Flux:             data.Items.GetItemFloat64Value("flux"),
+			FeedWqTurbidity:  data.Items.GetItemFloat64Value("feed_wq_turbidity"),
+			FeedWqPh:         data.Items.GetItemInt64Value("feed_wq_ph"),
+			ProductWqPh:      data.Items.GetItemInt64Value("product_wq_ph"),
+			FeedWqAl:         data.Items.GetItemFloat64Value("feed_wq_al"),
+			ProductWqAl:      data.Items.GetItemFloat64Value("product_wq_al"),
+			FeedWqFe:         data.Items.GetItemFloat64Value("feed_wq_fe"),
+			ProductWqFe:      data.Items.GetItemFloat64Value("product_wq_fe"),
+			FeedWqMn:         data.Items.GetItemFloat64Value("feed_wq_mn"),
+			ProductWqMn:      data.Items.GetItemFloat64Value("product_wq_mn"),
+			FeedWqSio2:       data.Items.GetItemFloat64Value("feed_wq_sio2"),
+			ProductWqSio2:    data.Items.GetItemFloat64Value("product_wq_sio2"),
+			FeedWqCod:        data.Items.GetItemFloat64Value("feed_wq_cod"),
+			ProductWqCod:     data.Items.GetItemFloat64Value("product_wq_cod"),
+			FeedWqP:          data.Items.GetItemFloat64Value("feed_wq_p"),
+			ProductWqP:       data.Items.GetItemFloat64Value("product_wq_p"),
+			Step:             data.Items.GetItemInt64Value("step"),
+			CTime:            time.Now(),
+		}
+	}
+
+	return ts, nil
+}

+ 73 - 0
app/cmd/organization/internal/logic/handler/valve.go

@@ -0,0 +1,73 @@
+package handler
+
+import (
+	"GtDataStore/app/cmd/organization/internal/logic/job"
+	"GtDataStore/app/cmd/organization/internal/svc"
+	"GtDataStore/app/model"
+	"context"
+	"github.com/zeromicro/go-zero/core/logx"
+	"sync"
+	"time"
+)
+
+func DeviceValve(ctx context.Context, task *job.Task, technologyName string) error {
+	// 1. 查询所有的设备
+	devices, err := findDeviceValve(task.Job.SvcCtx, int64(task.Id))
+	if err != nil {
+		return err
+	}
+	// 2. 获得点位信息
+	var wg sync.WaitGroup
+	wg.Add(len(devices))
+	for _, device := range devices {
+		device := device
+		go func() {
+			defer wg.Done()
+			if err := device.Items.FillCurrentValue(); err != nil {
+				logx.Errorf("DeviceValve device.Items.FillCurrentValue error: %s", err.Error())
+			}
+		}()
+	}
+
+	wg.Wait()
+
+	// 3. 转换为存储对象
+	workings, err := transDeviceValveData(devices)
+	if err != nil {
+		return err
+	}
+	// 4. 批量入库
+	if _, err := task.Job.SvcCtx.WorkingValve.MultiInsert(context.Background(), workings); err != nil {
+		logx.Errorf("DeviceValve task.Job.SvcCtx.WorkingValve.MultiInsert error: %s", err.Error())
+	}
+
+	return nil
+}
+
+func findDeviceValve(svcCtx *svc.ServiceContext, projectId int64) ([]model.DcDeviceBind, error) {
+	if devices, err := svcCtx.DeviceBind.FindByProjectIdDeviceType(context.Background(), projectId, DEVICE_UF); err != nil {
+		logx.Infof("findDeviceValve not found devices")
+		return nil, err
+	} else {
+		return devices, nil
+	}
+}
+
+func transDeviceValveData(datas []model.DcDeviceBind) ([]model.DcWorkingValve, error) {
+	ts := make([]model.DcWorkingValve, len(datas))
+
+	for i, data := range datas {
+		ts[i] = model.DcWorkingValve{
+			ProjectId:   data.ProjectId,
+			DeviceCode:  data.DeviceCode,
+			Adjust:      data.Items.GetItemInt64Value("adjust"),
+			Opening:     data.Items.GetItemFloat64Value("adjust"),
+			Closed:      data.Items.GetItemInt64Value("adjust"),
+			Opened:      data.Items.GetItemInt64Value("adjust"),
+			FaultStatus: data.Items.GetItemInt64Value("adjust"),
+			CTime:       time.Now(),
+		}
+	}
+
+	return ts, nil
+}

+ 39 - 0
app/cmd/organization/internal/logic/handler/vars.go

@@ -0,0 +1,39 @@
+package handler
+
+import (
+	"GtDataStore/app/cmd/organization/internal/logic/job"
+	"context"
+	"time"
+)
+
+const (
+	DEVICE_UF    = "uf"
+	DEVICE_MF    = "mf"
+	DEVICE_NF    = "nf"
+	DEVICE_RO    = "ro"
+	DEVICE_VALVE = "valve"
+	DEVICE_PUMP  = "pump"
+	DEVICE_CHEST = "chest"
+)
+
+var (
+	DeviceIntervalTable = map[string]time.Duration{
+		DEVICE_UF:    60 * time.Second,
+		DEVICE_MF:    60 * time.Second,
+		DEVICE_NF:    60 * time.Second,
+		DEVICE_RO:    60 * time.Second,
+		DEVICE_VALVE: 60 * time.Second,
+		DEVICE_PUMP:  60 * time.Second,
+		DEVICE_CHEST: 60 * time.Second,
+	}
+
+	DeviceHandlerTable = map[string]func(ctx context.Context, task *job.Task, technologyName string) error{
+		DEVICE_UF:    DeviceUf,
+		DEVICE_MF:    DeviceMf,
+		DEVICE_NF:    DeviceNf,
+		DEVICE_RO:    DeviceRo,
+		DEVICE_VALVE: DeviceValve,
+		DEVICE_PUMP:  DevicePump,
+		DEVICE_CHEST: DeviceChest,
+	}
+)

+ 221 - 0
app/cmd/organization/internal/logic/job/job.go

@@ -0,0 +1,221 @@
+package job
+
+import (
+	"GtDataStore/app/cmd/organization/internal/svc"
+	"GtDataStore/app/model"
+	"context"
+	"fmt"
+	"github.com/go-redis/redis/v8"
+	"github.com/zeromicro/go-zero/core/logx"
+	"strconv"
+	"sync"
+	"time"
+)
+
+// 负责仿真模拟的数据生产工作 异步执行
+// 1. 读取可用项目,每个项目生成一个新的 Job -> J1
+// 2. J1中检查项目对应的设备或工艺项目
+// 		a. 没有查询到则退出
+//      b. 检查到的项注册到全局记录 G1 中
+// 3. 从 G1 中读取到项目信息及项,项中包含执行时间间隔 interval
+// 4. 将项目信息 P 及项信息 D,注入 task,生成一个新的任务。时间随 interval 到来执行
+// 		a. 间隔清理task
+
+type Partition struct {
+	N     int64 // 有几个Job
+	Pn    int64 // 区号, 决定选取哪页数据段
+	Total int64 // 数据总量
+	limit int64 // 数据页大小 = Total / N
+}
+
+type Job struct {
+	Id            uint32 `json:"id"`
+	Name          string `json:"name"`
+	Ctx           context.Context
+	SvcCtx        *svc.ServiceContext
+	CheckInterval time.Duration
+	StartInterval time.Duration
+	Partition     Partition
+	syncClient    *redis.Client
+
+	pts                  map[uint32]*Task
+	ptsLock              sync.RWMutex
+	handlerTable         map[string]func(ctx context.Context, task *Task, technologyName string) error
+	handlerIntervalTable map[string]time.Duration
+}
+
+func NewJob(id uint32, name string, svc *svc.ServiceContext, handlerTable map[string]func(ctx context.Context, task *Task, technologyName string) error, handlerIntervalTable map[string]time.Duration) *Job {
+	return &Job{
+		Id:                   id,
+		Name:                 name,
+		Ctx:                  context.Background(),
+		SvcCtx:               svc,
+		CheckInterval:        120 * time.Second,
+		StartInterval:        127 * time.Second,
+		syncClient:           redis.NewClient(&redis.Options{Addr: svc.Config.Redis.Host, Password: svc.Config.Redis.Pass, MaxRetries: 5}),
+		pts:                  make(map[uint32]*Task),
+		handlerTable:         handlerTable,
+		handlerIntervalTable: handlerIntervalTable,
+	}
+}
+
+func (j *Job) Run() error {
+	defer func() {
+		if err := recover(); err != nil {
+			fmt.Printf("Job quit by error")
+		}
+	}()
+
+	// 检测新任务及更新任务状态,或退出不需要的任务
+	go j.checkProjectTask()
+
+	// 启动待执行的任务
+	go j.startProjectTask()
+
+	// 启动同步
+	go j.syncPartition()
+
+	select {}
+}
+
+func (j *Job) startProjectTask() {
+	tk := time.NewTicker(j.StartInterval)
+	for {
+		select {
+		case <-tk.C:
+			for _, task := range j.pts {
+				if task.IsRun() == false {
+					if te := task.Test(); te != nil {
+						logx.Errorf("start project task error: test fail, %s", te.Error())
+						continue
+					}
+
+					task.Start("")
+				}
+			}
+		}
+	}
+}
+
+func (j *Job) checkProjectTask() {
+	tk := time.NewTicker(j.CheckInterval)
+	for {
+		select {
+		case <-tk.C:
+			j.checkProject()
+		}
+	}
+}
+
+func (j *Job) checkProject() {
+	// 对 pts加锁,防止在注册新任务或任务状态改变时,出现任务调度不一致的情况
+	j.ptsLock.Lock()
+	defer func() {
+		j.ptsLock.Unlock()
+	}()
+
+	limit := j.Partition.partitionLimit()
+	ps, err := j.SvcCtx.ProjectConfig.FindAllByPage(j.Ctx, (j.Partition.Pn-1)*limit, limit)
+	if err != nil {
+		logx.Errorf("not found project config")
+	}
+
+	for _, p := range ps {
+		jid := uint32(p.ProjectId)
+		if _, ok := j.pts[jid]; !ok {
+			if p.IsEnabled() {
+				if npt, err := j.createProjectTask(p); err == nil {
+					j.pts[jid] = npt
+				} else {
+					logx.Errorf("create new project task error: %s", err.Error())
+				}
+			}
+		} else {
+			if p.IsEnabled() == false {
+				if t, ok := j.pts[jid]; ok {
+					t.Quit()
+					delete(j.pts, jid)
+				}
+			}
+		}
+	}
+
+	// todo: pts 中会存在数据表中已经删除的项目,也要定时清理
+}
+
+func (j *Job) createProjectTask(model model.DcProjectConfig) (*Task, error) {
+	fmt.Printf("check new project task: %d\n", model.ProjectId)
+	return NewProjectTask(uint32(model.ProjectId), fmt.Sprintf("project-%d", model.ProjectId), j, model), nil
+}
+
+func (j *Job) ClearTask() {
+	j.ptsLock.Lock()
+	defer j.ptsLock.Unlock()
+	for _, task := range j.pts {
+		if task.IsRun() == true {
+			task.Quit()
+			delete(j.pts, task.Id)
+		}
+	}
+}
+
+func (j *Job) setPartition(partition Partition) {
+	j.Partition = partition
+}
+
+func (p *Partition) partitionLimit() int64 {
+	if p.N == 0 {
+		return 1
+	}
+	total := p.Total
+	if p.Total%2 == 1 {
+		total++
+	}
+	return total / p.N
+}
+
+func (j *Job) syncPartition() {
+	tk := time.NewTicker(60 * time.Second)
+
+	go func() {
+		for {
+			message, err := j.syncClient.Subscribe(j.Ctx, "simulation-job-"+j.Name).ReceiveMessage(j.Ctx)
+			if err != nil {
+				time.Sleep(5 * time.Second)
+				continue
+			}
+
+			if total, err := strconv.ParseInt(message.Payload, 10, 64); err == nil {
+				ic := j.syncClient.Incr(j.Ctx, "simulation-job-n-"+j.Name)
+				j.Partition.Total = total
+				j.Partition.Pn = ic.Val()
+				j.Partition.N = 1
+
+				time.Sleep(3 * time.Second)
+				n := j.syncClient.Get(j.Ctx, "simulation-job-n-"+j.Name)
+				j.syncClient.Expire(j.Ctx, "simulation-job-n-"+j.Name, 10*time.Second)
+
+				if n, err := n.Int64(); err == nil {
+					j.Partition.N = n
+				}
+
+				j.ClearTask()
+			}
+		}
+	}()
+
+	for {
+		select {
+		case <-tk.C:
+			ps, err := j.SvcCtx.ProjectConfig.FindAll(j.Ctx)
+			if err != nil {
+				logx.Errorf("not found project config")
+			}
+
+			if len(ps) != int(j.Partition.Total) {
+				// 发布一条消息
+				j.syncClient.Publish(j.Ctx, "simulation-job-"+j.Name, len(ps))
+			}
+		}
+	}
+}

+ 149 - 0
app/cmd/organization/internal/logic/job/task.go

@@ -0,0 +1,149 @@
+package job
+
+import (
+	"GtDataStore/app/model"
+	"context"
+	"errors"
+	"fmt"
+	"github.com/zeromicro/go-zero/core/logx"
+	"time"
+)
+
+// Task 提供项目的状态、信息,为子任务提供共享空间
+type Task struct {
+	Id      uint32                 `json:"id"`
+	Name    string                 `json:"name"`
+	Model   *model.DcProjectConfig `json:"model"`
+	handler func(ctx context.Context, task *Task) error
+
+	Job      *Job
+	sigStart chan string
+
+	status     uint8 // 运行状态 0:未运行 1:运行中 2:待退出
+	ctx        context.Context
+	cancelFunc context.CancelFunc
+}
+
+func NewProjectTask(id uint32, name string, job *Job, model model.DcProjectConfig) *Task {
+	ctx, cancelFunc := context.WithCancel(context.Background())
+	np := &Task{
+		Id:         id,
+		Name:       name,
+		Model:      &model,
+		Job:        job,
+		handler:    Handler,
+		status:     0,
+		sigStart:   make(chan string),
+		ctx:        ctx,
+		cancelFunc: cancelFunc,
+	}
+
+	// 等待开始信号
+	go np.run()
+
+	return np
+}
+
+func (p *Task) run() error {
+	select {
+	case <-p.sigStart:
+		p.status = 1
+	}
+
+	err := p.handler(p.ctx, p)
+	if err != nil {
+		logx.Infof("project task simulations %d, %s, %s", p.Id, p.Name, err.Error())
+	}
+	return err
+}
+
+func (p *Task) Start(msg string) {
+	p.sigStart <- msg
+}
+
+func (p *Task) Quit() {
+	p.status = 2
+	p.cancelFunc()
+}
+
+func (p *Task) IsRun() bool {
+	return p.status == 1
+}
+
+func (p *Task) Test() error {
+	if p.Job == nil {
+		return errors.New("not found Job")
+	}
+
+	if p.Model == nil {
+		return errors.New("not found project model")
+	}
+
+	if p.handler == nil {
+		return errors.New("not set simulations")
+	}
+
+	if len(p.Model.Technologys) == 0 {
+		return errors.New("not set technologys list, modify technologys field for mysql cd_project_config")
+	}
+
+	for _, technology := range p.Model.Technologys {
+		if _, ok := p.Job.handlerTable[technology]; !ok {
+			fmt.Printf("project: %d, %s no support", p.Id, technology)
+			continue
+			//return errors.New(fmt.Sprintf("project: %d, %s no support", p.Id, technology))
+		}
+	}
+
+	return nil
+}
+
+func Handler(ctx context.Context, task *Task) error {
+	for {
+		select {
+		case <-ctx.Done():
+			return nil
+		default:
+			return distribute(ctx, task)
+		}
+	}
+}
+
+// 将一个项目需要处理的所有工艺进行分发
+func distribute(ctx context.Context, task *Task) error {
+	fmt.Printf("distribute task for: %+v", task.Model.Technologys)
+	for _, technology := range task.Model.Technologys {
+		interval, ok := task.Job.handlerIntervalTable[technology]
+		if !ok {
+			fmt.Printf("project: %d, %s no support", task.Id, technology)
+			continue
+			//return errors.New(fmt.Sprintf("project: %d, %s no support", task.Id, technology))
+		}
+
+		f, ok := task.Job.handlerTable[technology]
+		if !ok {
+			return errors.New(fmt.Sprintf("project: %d, %s no bind simulations", task.Id, technology))
+		}
+
+		technologyName := technology
+		go func(interval time.Duration, call func(ctx context.Context, task *Task, technologyName string) error) {
+			tk := time.NewTicker(interval)
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-tk.C:
+					// 这里是同步执行的,避免并发问题
+					err := call(ctx, task, technologyName)
+					if err != nil {
+						fmt.Printf("distribute.call error: %s\n", err.Error())
+					}
+					//} else {
+					//	fmt.Print("distribute.call finish\n")
+					//}
+				}
+			}
+		}(interval, f)
+	}
+	return nil
+}

+ 20 - 0
app/cmd/organization/internal/server/organizationServer.go

@@ -0,0 +1,20 @@
+// Code generated by goctl. DO NOT EDIT.
+// Source: organization.proto
+
+package server
+
+import (
+	"GtDataStore/app/cmd/organization/internal/svc"
+	"GtDataStore/app/cmd/organization/pb"
+)
+
+type OrganizationServer struct {
+	svcCtx *svc.ServiceContext
+	pb.UnimplementedOrganizationServer
+}
+
+func NewOrganizationServer(svcCtx *svc.ServiceContext) *OrganizationServer {
+	return &OrganizationServer{
+		svcCtx: svcCtx,
+	}
+}

+ 23 - 0
app/cmd/organization/internal/svc/serviceContext.go

@@ -0,0 +1,23 @@
+package svc
+
+import (
+	"GtDataStore/app/cmd/organization/internal/config"
+	"github.com/zeromicro/go-zero/core/stores/redis"
+)
+
+type ServiceContext struct {
+	Config config.Config
+	Cache  *redis.Redis
+	modelList
+}
+
+func NewServiceContext(c config.Config) *ServiceContext {
+	svc := &ServiceContext{
+		Config: c,
+		Cache:  c.Redis.NewRedis(),
+	}
+
+	initModel(svc)
+
+	return svc
+}

+ 31 - 0
app/cmd/organization/internal/svc/vars.go

@@ -0,0 +1,31 @@
+package svc
+
+import (
+	"GtDataStore/app/model"
+	"github.com/zeromicro/go-zero/core/stores/sqlx"
+)
+
+type modelList struct {
+	DeviceBind    model.DcDeviceBindModel
+	ProjectConfig model.DcProjectConfigModel
+	WorkingUf     model.DcWorkingUfModel
+	WorkingMf     model.DcWorkingMfModel
+	WorkingNf     model.DcWorkingNfModel
+	WorkingRo     model.DcWorkingRoModel
+	WorkingPump   model.DcWorkingPumpModel
+	WorkingValve  model.DcWorkingValveModel
+	WorkingChest  model.DcWorkingChestModel
+}
+
+func initModel(svc *ServiceContext) {
+	mysql := sqlx.NewMysql(svc.Config.DtDataStoreDB.DataSource)
+	svc.DeviceBind = model.NewDcDeviceBindModel(mysql)
+	svc.ProjectConfig = model.NewDcProjectConfigModel(mysql)
+	svc.WorkingUf = model.NewDcWorkingUfModel(mysql)
+	svc.WorkingMf = model.NewDcWorkingMfModel(mysql)
+	svc.WorkingNf = model.NewDcWorkingNfModel(mysql)
+	svc.WorkingRo = model.NewDcWorkingRoModel(mysql)
+	svc.WorkingPump = model.NewDcWorkingPumpModel(mysql)
+	svc.WorkingChest = model.NewDcWorkingChestModel(mysql)
+	svc.WorkingValve = model.NewDcWorkingValveModel(mysql)
+}

+ 60 - 0
app/cmd/organization/organization.go

@@ -0,0 +1,60 @@
+package main
+
+import (
+	"GtDataStore/app/cmd/organization/internal/config"
+	"GtDataStore/app/cmd/organization/internal/logic/handler"
+	"GtDataStore/app/cmd/organization/internal/logic/job"
+	"GtDataStore/app/cmd/organization/internal/server"
+	"GtDataStore/app/cmd/organization/pb"
+	"github.com/zeromicro/go-zero/core/service"
+	"github.com/zeromicro/go-zero/zrpc"
+	"google.golang.org/grpc"
+	"google.golang.org/grpc/reflection"
+
+	//"GtDataStore/app/cmd/organization/internal/server"
+	"GtDataStore/app/cmd/organization/internal/svc"
+	//"GtDataStore/app/cmd/organization/pb"
+	"GtDataStore/common/envitem"
+	"flag"
+	"fmt"
+
+	"github.com/zeromicro/go-zero/core/conf"
+	//"github.com/zeromicro/go-zero/core/service"
+	//"github.com/zeromicro/go-zero/zrpc"
+	//"google.golang.org/grpc"
+	//"google.golang.org/grpc/reflection"
+)
+
+var configFile = flag.String("f", "etc/organization.yaml", "the config file")
+
+func main() {
+	flag.Parse()
+
+	var c config.Config
+	conf.MustLoad(*configFile, &c)
+	ctx := svc.NewServiceContext(c)
+
+	s := zrpc.MustNewServer(c.RpcServerConf, func(grpcServer *grpc.Server) {
+		pb.RegisterOrganizationServer(grpcServer, server.NewOrganizationServer(ctx))
+
+		if c.Mode == service.DevMode || c.Mode == service.TestMode {
+			reflection.Register(grpcServer)
+		}
+	})
+	defer s.Stop()
+
+	if c.Mode != "dev" {
+		envitem.SetOptions(envitem.Options{GtServerIp: c.GtServerIp})
+
+		go func() {
+			defer func() {
+				fmt.Print("async organization job stop.....\n")
+			}()
+			j := job.NewJob(1, "organization", ctx, handler.DeviceHandlerTable, handler.DeviceIntervalTable)
+			j.Run()
+		}()
+	}
+
+	fmt.Printf("Starting rpc server at %s...\n", c.ListenOn)
+	s.Start()
+}

+ 9 - 0
app/cmd/organization/organization.proto

@@ -0,0 +1,9 @@
+syntax = "proto3";
+
+package pb;
+option go_package = "./pb";
+
+
+service Organization {
+
+}

+ 23 - 0
app/cmd/organization/organization/organization.go

@@ -0,0 +1,23 @@
+// Code generated by goctl. DO NOT EDIT.
+// Source: organization.proto
+
+package organization
+
+import (
+	"github.com/zeromicro/go-zero/zrpc"
+)
+
+type (
+	Organization interface {
+	}
+
+	defaultOrganization struct {
+		cli zrpc.Client
+	}
+)
+
+func NewOrganization(cli zrpc.Client) Organization {
+	return &defaultOrganization{
+		cli: cli,
+	}
+}

+ 62 - 0
app/cmd/organization/pb/organization.pb.go

@@ -0,0 +1,62 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.28.0
+// 	protoc        v4.23.4
+// source: organization.proto
+
+package pb
+
+import (
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+var File_organization_proto protoreflect.FileDescriptor
+
+var file_organization_proto_rawDesc = []byte{
+	0x0a, 0x12, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x12, 0x02, 0x70, 0x62, 0x32, 0x0e, 0x0a, 0x0c, 0x4f, 0x72, 0x67, 0x61,
+	0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x06, 0x5a, 0x04, 0x2e, 0x2f, 0x70, 0x62,
+	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var file_organization_proto_goTypes = []interface{}{}
+var file_organization_proto_depIdxs = []int32{
+	0, // [0:0] is the sub-list for method output_type
+	0, // [0:0] is the sub-list for method input_type
+	0, // [0:0] is the sub-list for extension type_name
+	0, // [0:0] is the sub-list for extension extendee
+	0, // [0:0] is the sub-list for field type_name
+}
+
+func init() { file_organization_proto_init() }
+func file_organization_proto_init() {
+	if File_organization_proto != nil {
+		return
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_organization_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   0,
+			NumExtensions: 0,
+			NumServices:   1,
+		},
+		GoTypes:           file_organization_proto_goTypes,
+		DependencyIndexes: file_organization_proto_depIdxs,
+	}.Build()
+	File_organization_proto = out.File
+	file_organization_proto_rawDesc = nil
+	file_organization_proto_goTypes = nil
+	file_organization_proto_depIdxs = nil
+}

+ 65 - 0
app/cmd/organization/pb/organization_grpc.pb.go

@@ -0,0 +1,65 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.2.0
+// - protoc             v4.23.4
+// source: organization.proto
+
+package pb
+
+import (
+	grpc "google.golang.org/grpc"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+// OrganizationClient is the client API for Organization service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type OrganizationClient interface {
+}
+
+type organizationClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewOrganizationClient(cc grpc.ClientConnInterface) OrganizationClient {
+	return &organizationClient{cc}
+}
+
+// OrganizationServer is the server API for Organization service.
+// All implementations must embed UnimplementedOrganizationServer
+// for forward compatibility
+type OrganizationServer interface {
+	mustEmbedUnimplementedOrganizationServer()
+}
+
+// UnimplementedOrganizationServer must be embedded to have forward compatible implementations.
+type UnimplementedOrganizationServer struct {
+}
+
+func (UnimplementedOrganizationServer) mustEmbedUnimplementedOrganizationServer() {}
+
+// UnsafeOrganizationServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to OrganizationServer will
+// result in compilation errors.
+type UnsafeOrganizationServer interface {
+	mustEmbedUnimplementedOrganizationServer()
+}
+
+func RegisterOrganizationServer(s grpc.ServiceRegistrar, srv OrganizationServer) {
+	s.RegisterService(&Organization_ServiceDesc, srv)
+}
+
+// Organization_ServiceDesc is the grpc.ServiceDesc for Organization service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var Organization_ServiceDesc = grpc.ServiceDesc{
+	ServiceName: "pb.Organization",
+	HandlerType: (*OrganizationServer)(nil),
+	Methods:     []grpc.MethodDesc{},
+	Streams:     []grpc.StreamDesc{},
+	Metadata:    "organization.proto",
+}

+ 387 - 0
app/model/GtDataStore.sql

@@ -0,0 +1,387 @@
+-- Create syntax for TABLE 'dc_alarm_bind'
+CREATE TABLE `dc_alarm_bind` (
+                                 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+                                 `project_id` int(11) NOT NULL,
+                                 `device_code` int(11) NOT NULL,
+                                 `item` int(11) NOT NULL,
+                                 `threshold` varchar(20) DEFAULT NULL COMMENT '阈值配置 [min,max,连续采样次数], 为 null 表示不设置',
+                                 `slope` varchar(20) DEFAULT NULL COMMENT '斜率变化配置 [数据量,阈值,连续采样次数], 为 null 表示不设置',
+                                 `na` varchar(20) DEFAULT NULL COMMENT 'na报警 [数据量, na数据量,连续采样次数], 为 null 表示不设置',
+                                 `interval` int(11) NOT NULL DEFAULT '0' COMMENT '检测周期 时间 s',
+                                 `c_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+                                 PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,
+                                 KEY `project_id` (`project_id`,`device_code`,`item`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
+
+-- Create syntax for TABLE 'dc_alarm_list'
+CREATE TABLE `dc_alarm_list` (
+                                 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+                                 `project_id` int(11) NOT NULL,
+                                 `device_code` varchar(50) NOT NULL DEFAULT '',
+                                 `item` varchar(50) NOT NULL DEFAULT '',
+                                 `val` varchar(20) NOT NULL DEFAULT '' COMMENT '报警发生时,点位的值',
+                                 `alarm_id` int(11) NOT NULL COMMENT '报警 ID dc_alarm_bind.id',
+                                 `title` varchar(100) NOT NULL DEFAULT '' COMMENT '报警标题',
+                                 `context` varchar(255) NOT NULL DEFAULT '' COMMENT '报警内容',
+                                 `c_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+                                 PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,
+                                 KEY `project_id` (`project_id`,`device_code`,`item`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![ttl] TTL=`c_time` + INTERVAL 3 MONTH */ /*T![ttl] TTL_ENABLE='ON' */ /*T![ttl] TTL_JOB_INTERVAL='1h' */;
+
+-- Create syntax for TABLE 'dc_clean_bind'
+CREATE TABLE `dc_clean_bind` (
+                                 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+                                 `project_id` int(11) NOT NULL,
+                                 `device_code` varchar(50) NOT NULL DEFAULT '',
+                                 `item` varchar(50) NOT NULL DEFAULT '',
+                                 `range_na` varchar(100) NOT NULL DEFAULT '' COMMENT '被当做 na 的值范围,使用逗号分隔多个值 例: '''', ''-'', ''null''',
+                                 `dropna` tinyint(1) NOT NULL COMMENT '为 na 时,是否进行删除操作 0: 否 1: 是',
+                                 `fillna` tinyint(1) NOT NULL COMMENT '为 na 时,是否进行数据填充 0:  否 1: 是',
+                                 `fillna_way` char(10) NOT NULL DEFAULT '' COMMENT '当 fillna 为 1 时, 为数据指定填充方式 【默认值 | 中位数 | 众数 | 平均数 | 自定义】',
+                                 `drop_solitude` int(11) NOT NULL DEFAULT '0' COMMENT '是否删除离群点',
+                                 `duplicate` tinyint(1) NOT NULL COMMENT '是否进行去重复操作 0:  否 1: 是',
+                                 `c_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+                                 PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,
+                                 UNIQUE KEY `project_id` (`project_id`,`item`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=30002;
+
+-- Create syntax for TABLE 'dc_clean_quality'
+CREATE TABLE `dc_clean_quality` (
+                                    `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+                                    `project_id` int(11) NOT NULL,
+                                    `tag` varchar(20) NOT NULL DEFAULT '' COMMENT '清洗批次',
+                                    `item` varchar(50) NOT NULL DEFAULT '' COMMENT '点位名',
+                                    `describe` varchar(512) NOT NULL DEFAULT '' COMMENT '数据质量描述',
+                                    `c_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+                                    PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,
+                                    UNIQUE KEY `project_id` (`project_id`,`tag`,`item`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=690001 COMMENT='清洗数据的质量统计' /*T![ttl] TTL=`c_time` + INTERVAL 60 DAY */ /*T![ttl] TTL_ENABLE='ON' */ /*T![ttl] TTL_JOB_INTERVAL='1h' */;
+
+-- Create syntax for TABLE 'dc_device_bind'
+CREATE TABLE `dc_device_bind` (
+                                  `id` int(11) NOT NULL AUTO_INCREMENT,
+                                  `project_id` int(11) NOT NULL,
+                                  `name` varchar(50) NOT NULL DEFAULT '' COMMENT '关系名',
+                                  `device_code` varchar(50) NOT NULL DEFAULT '' COMMENT '关键设备指标',
+                                  `device_type` varchar(20) NOT NULL DEFAULT '' COMMENT '设备类型',
+                                  `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '当前状态 0: 禁用 1: 正常',
+                                  `items` text NOT NULL COMMENT '相关点位集合',
+                                  `target_table` varchar(50) NOT NULL DEFAULT '' COMMENT '数据存入目标表名',
+                                  PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,
+                                  UNIQUE KEY `project_id` (`project_id`,`device_code`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=30001 COMMENT='相关点位绑定表';
+
+-- Create syntax for TABLE 'dc_device_relation'
+CREATE TABLE `dc_device_relation` (
+                                      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+                                      `project_id` int(11) NOT NULL,
+                                      `device_code` varchar(20) NOT NULL DEFAULT '',
+                                      `chest` json NOT NULL COMMENT '与之相关的 chest 设备',
+                                      `pump` json NOT NULL COMMENT '与之相关的 pump 设备',
+                                      `value` json NOT NULL COMMENT '与之相关的 value 设备',
+                                      PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,
+                                      UNIQUE KEY `project_id` (`project_id`,`device_code`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
+
+-- Create syntax for TABLE 'dc_event_bind'
+CREATE TABLE `dc_event_bind` (
+                                 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+                                 `project_id` int(11) NOT NULL COMMENT '项目 ID',
+                                 `device_code` varchar(50) NOT NULL DEFAULT '' COMMENT '设备位号',
+                                 `name` varchar(20) NOT NULL DEFAULT '' COMMENT '事件名称',
+                                 `item` varchar(50) NOT NULL DEFAULT '' COMMENT '点位名称',
+                                 `rule_flag` varchar(20) NOT NULL DEFAULT '' COMMENT '绑定的事件引擎',
+                                 `config` varchar(1024) NOT NULL DEFAULT '' COMMENT '事件配置 一个 json 配置,用于',
+                                 `interval` int(11) NOT NULL DEFAULT '0' COMMENT '检测时间间隔',
+                                 `c_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+                                 PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,
+                                 UNIQUE KEY `project_id` (`project_id`,`item`,`name`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=60001;
+
+-- Create syntax for TABLE 'dc_event_list'
+CREATE TABLE `dc_event_list` (
+                                 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+                                 `project_id` int(11) NOT NULL,
+                                 `device_code` varchar(50) NOT NULL DEFAULT '',
+                                 `item` varchar(50) NOT NULL DEFAULT '',
+                                 `val` varchar(20) NOT NULL DEFAULT '' COMMENT '事件发生时,点位的值',
+                                 `event_id` int(11) NOT NULL COMMENT '事件 ID dc_event_bind.id',
+                                 `title` varchar(100) NOT NULL DEFAULT '' COMMENT '事件标题',
+                                 `context` varchar(255) NOT NULL DEFAULT '' COMMENT '事件内容',
+                                 `c_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+                                 PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,
+                                 KEY `project_id` (`project_id`,`device_code`,`item`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=30001 /*T![ttl] TTL=`c_time` + INTERVAL 3 MONTH */ /*T![ttl] TTL_ENABLE='ON' */ /*T![ttl] TTL_JOB_INTERVAL='1h' */;
+
+-- Create syntax for TABLE 'dc_event_rule'
+CREATE TABLE `dc_event_rule` (
+                                 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+                                 `name` varchar(20) NOT NULL DEFAULT '' COMMENT '识别事件的处理名称',
+                                 `flag` varchar(20) NOT NULL DEFAULT '' COMMENT '唯一标识,应该被程序定义为常量',
+                                 `remark` varchar(255) NOT NULL DEFAULT '' COMMENT '说明信息',
+                                 `c_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+                                 PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,
+                                 UNIQUE KEY `flag` (`flag`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=30001;
+
+-- Create syntax for TABLE 'dc_item_data'
+CREATE TABLE `dc_item_data` (
+                                `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+                                `project_id` int(11) NOT NULL,
+                                `item` varchar(50) NOT NULL DEFAULT '',
+                                `val` varchar(30) NOT NULL DEFAULT '',
+                                `htime` timestamp NOT NULL,
+                                `tag` varchar(20) NOT NULL DEFAULT '',
+                                PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,
+                                KEY `project_id` (`project_id`,`item`),
+                                KEY `tag` (`tag`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=44424777 /*T![ttl] TTL=`htime` + INTERVAL 60 DAY */ /*T![ttl] TTL_ENABLE='ON' */ /*T![ttl] TTL_JOB_INTERVAL='1h' */;
+
+-- Create syntax for TABLE 'dc_item_map'
+CREATE TABLE `dc_item_map` (
+                               `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+                               `project_id` int(11) NOT NULL COMMENT '项目 ID',
+                               `device_code` varchar(20) NOT NULL DEFAULT '' COMMENT '设备位号',
+                               `source_item` varchar(50) NOT NULL DEFAULT '' COMMENT '来源 item 名',
+                               `target_item` varchar(50) NOT NULL DEFAULT '' COMMENT '目标item 名,也就是数据中心的 item 名',
+                               `alias` varchar(255) NOT NULL DEFAULT '' COMMENT '点位名描述',
+                               PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,
+                               UNIQUE KEY `project_id` (`project_id`,`source_item`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=60001;
+
+-- Create syntax for TABLE 'dc_working_chest'
+CREATE TABLE `dc_working_chest` (
+                                    `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+                                    `project_id` int(11) NOT NULL,
+                                    `device_code` varchar(20) NOT NULL DEFAULT '',
+                                    `switch` tinyint(4) NOT NULL DEFAULT '0' COMMENT '药箱液位开关 0: 关 1: 开',
+                                    `level` decimal(6,4) NOT NULL DEFAULT '0' COMMENT '液位高度',
+                                    `agitator_status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '搅拌器运行状态 0: 未运行 1:运行中',
+                                    `agitator_duration` int(11) NOT NULL DEFAULT '0' COMMENT '搅拌器运行时长',
+                                    `agitator_fault_status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '搅拌器故障状态 0:正常 1:故障',
+                                    `c_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+                                    PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,
+                                    KEY `project_id` (`project_id`,`device_code`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=30001 COMMENT='药箱液位' /*T![ttl] TTL=`c_time` + INTERVAL 3 MONTH */ /*T![ttl] TTL_ENABLE='ON' */ /*T![ttl] TTL_JOB_INTERVAL='1h' */;
+
+-- Create syntax for TABLE 'dc_working_mf'
+CREATE TABLE `dc_working_mf` (
+                                 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+                                 `project_id` int(11) NOT NULL,
+                                 `device_code` varchar(20) NOT NULL DEFAULT '',
+                                 `water_temperature` decimal(4,2) NOT NULL DEFAULT '0' COMMENT '水温 摄氏度',
+                                 `feed_flow` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '进水流量',
+                                 `con_flow` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '浓水流量',
+                                 `product_flow` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '产水流量',
+                                 `feed_pressure` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '进水压力',
+                                 `con_pressure` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '浓水压力',
+                                 `product_pressure` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '产水压力',
+                                 `tmp` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '跨膜压差',
+                                 `flux` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '膜通量',
+                                 `feed_wq_turbidity` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '进水浊度',
+                                 `feed_wq_ph` tinyint(4) NOT NULL DEFAULT '0' COMMENT '进水 PH 值',
+                                 `product_wq_ph` tinyint(4) NOT NULL DEFAULT '0' COMMENT '产水 PH 值',
+                                 `feed_wq_al` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '进水水质:铝',
+                                 `product_wq_al` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '产水水质:铝',
+                                 `feed_wq_fe` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '进水水质:铁',
+                                 `product_wq_fe` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '产水水质:铁',
+                                 `feed_wq_mn` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '进水水质:锰',
+                                 `product_wq_mn` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '产水水质:锰',
+                                 `feed_wq_sio2` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '进水水质:二氧化硅',
+                                 `product_wq_sio2` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '产水水质:二氧化硅',
+                                 `feed_wq_cod` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '进水水质:COD',
+                                 `product_wq_cod` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '产水水质:COD',
+                                 `feed_wq_p` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '进水水质:磷',
+                                 `product_wq_p` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '产水水质:磷',
+                                 `step` int(11) DEFAULT NULL COMMENT '设备当前步序值',
+                                 `c_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+                                 PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,
+                                 KEY `project_id` (`project_id`,`device_code`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='微滤' /*T![ttl] TTL=`c_time` + INTERVAL 3 MONTH */ /*T![ttl] TTL_ENABLE='ON' */ /*T![ttl] TTL_JOB_INTERVAL='1h' */;
+
+-- Create syntax for TABLE 'dc_working_nf'
+CREATE TABLE `dc_working_nf` (
+                                 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+                                 `project_id` int(11) NOT NULL,
+                                 `device_code` varchar(20) NOT NULL DEFAULT '',
+                                 `water_temperature` decimal(4,2) NOT NULL DEFAULT '0' COMMENT '水温 摄氏度',
+                                 `feed_flow_1st` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '一段进水流量',
+                                 `con_flow_1st` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '一段浓水流量',
+                                 `product_flow_1st` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '一段产水流量',
+                                 `feed_pressure_1st` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '一段进水压力',
+                                 `con_pressure_1st` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '一段浓水压力',
+                                 `product_pressure_1st` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '一段产水压力',
+                                 `tmp_1st` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '一段跨膜压差',
+                                 `flux_1st` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '一段膜通量',
+                                 `permeability_1st` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '一段渗透率',
+                                 `feed_flow_2nd` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '二段进水流量',
+                                 `con_flow_2nd` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '二段浓水流量',
+                                 `product_flow_2nd` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '二段产水流量',
+                                 `feed_pressure_2nd` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '二段进水压力',
+                                 `con_pressure_2nd` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '二段浓水压力',
+                                 `product_pressure_2nd` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '二段产水压力',
+                                 `tmp_2nd` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '二段压差',
+                                 `flux_2nd` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '二段通量',
+                                 `permeability_2nd` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '二段渗透率',
+                                 `feed_flow_3th` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '三段进水流量',
+                                 `con_flow_3th` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '三段浓水流量',
+                                 `product_flow_3th` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '三段产水流量',
+                                 `feed_pressure_3th` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '三段进水压力',
+                                 `con_pressure_3th` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '三段浓水压力',
+                                 `product_pressure_3th` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '三段产水压力',
+                                 `tmp_3th` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '三段压差',
+                                 `flux_3th` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '三段通量',
+                                 `permeability_3th` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '三段渗透率',
+                                 `feed_wq_turbidity` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '进水浊度',
+                                 `feed_wq_ph` tinyint(4) NOT NULL DEFAULT '0' COMMENT '进水 PH 值',
+                                 `product_wq_ph` tinyint(4) NOT NULL DEFAULT '0' COMMENT '产水 PH 值',
+                                 `feed_wq_al` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '进水水质:铝',
+                                 `product_wq_al` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '产水水质:铝',
+                                 `feed_wq_fe` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '进水水质:铁',
+                                 `product_wq_fe` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '产水水质:铁',
+                                 `feed_wq_mn` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '进水水质:锰',
+                                 `product_wq_mn` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '产水水质:锰',
+                                 `feed_wq_sio2` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '进水水质:二氧化硅',
+                                 `product_wq_sio2` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '产水水质:二氧化硅',
+                                 `feed_wq_cod` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '进水水质:COD',
+                                 `product_wq_cod` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '产水水质:COD',
+                                 `feed_wq_p` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '进水水质:磷',
+                                 `product_wq_p` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '产水水质:磷',
+                                 `step` int(11) DEFAULT NULL COMMENT '设备当前步序值',
+                                 `c_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+                                 PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,
+                                 KEY `project_id` (`project_id`,`device_code`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='纳滤' /*T![ttl] TTL=`c_time` + INTERVAL 3 MONTH */ /*T![ttl] TTL_ENABLE='ON' */ /*T![ttl] TTL_JOB_INTERVAL='1h' */;
+
+-- Create syntax for TABLE 'dc_working_pump'
+CREATE TABLE `dc_working_pump` (
+                                   `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+                                   `project_id` int(11) NOT NULL,
+                                   `device_code` varchar(20) NOT NULL DEFAULT '',
+                                   `feed_pressure` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '进水压力',
+                                   `out_pressure` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '出水压力',
+                                   `duration` int(11) NOT NULL DEFAULT '0' COMMENT '运行时长 单位 s',
+                                   `current` decimal(5,2) NOT NULL DEFAULT '0' COMMENT '运行电流 ',
+                                   `frequency` decimal(4,2) NOT NULL DEFAULT '0' COMMENT '运行频率',
+                                   `lift` decimal(5,2) NOT NULL DEFAULT '0' COMMENT '工作扬程',
+                                   `efficiency` decimal(4,2) NOT NULL DEFAULT '0' COMMENT '运行效率',
+                                   `run_status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '运行状态 0: 停机 1: 运行正常',
+                                   `fault_status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '故障状态 0: 正常 1: 故障',
+                                   `c_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+                                   PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,
+                                   KEY `project_id` (`project_id`,`device_code`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=30001 COMMENT='水泵' /*T![ttl] TTL=`c_time` + INTERVAL 3 MONTH */ /*T![ttl] TTL_ENABLE='ON' */ /*T![ttl] TTL_JOB_INTERVAL='1h' */;
+
+-- Create syntax for TABLE 'dc_working_ro'
+CREATE TABLE `dc_working_ro` (
+                                 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+                                 `project_id` int(11) NOT NULL,
+                                 `device_code` varchar(20) NOT NULL DEFAULT '',
+                                 `water_temperature` decimal(4,2) NOT NULL DEFAULT '0' COMMENT '水温 摄氏度',
+                                 `feed_flow_1st` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '一段进水流量',
+                                 `con_flow_1st` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '一段浓水流量',
+                                 `product_flow_1st` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '一段产水流量',
+                                 `feed_pressure_1st` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '一段进水压力',
+                                 `con_pressure_1st` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '一段浓水压力',
+                                 `product_pressure_1st` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '一段产水压力',
+                                 `tmp_1st` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '一段跨膜压差',
+                                 `flux_1st` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '一段膜通量',
+                                 `permeability_1st` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '一段渗透率',
+                                 `feed_flow_2nd` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '二段进水流量',
+                                 `con_flow_2nd` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '二段浓水流量',
+                                 `product_flow_2nd` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '二段产水流量',
+                                 `feed_pressure_2nd` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '二段进水压力',
+                                 `con_pressure_2nd` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '二段浓水压力',
+                                 `product_pressure_2nd` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '二段产水压力',
+                                 `tmp_2nd` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '二段压差',
+                                 `flux_2nd` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '二段通量',
+                                 `permeability_2nd` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '二段渗透率',
+                                 `feed_flow_3th` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '三段进水流量',
+                                 `con_flow_3th` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '三段浓水流量',
+                                 `product_flow_3th` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '三段产水流量',
+                                 `feed_pressure_3th` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '三段进水压力',
+                                 `con_pressure_3th` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '三段浓水压力',
+                                 `product_pressure_3th` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '三段产水压力',
+                                 `tmp_3th` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '三段压差',
+                                 `flux_3th` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '三段通量',
+                                 `permeability_3th` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '三段渗透率',
+                                 `feed_wq_turbidity` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '进水浊度',
+                                 `feed_wq_ph` tinyint(4) NOT NULL DEFAULT '0' COMMENT '进水 PH 值',
+                                 `product_wq_ph` tinyint(4) NOT NULL DEFAULT '0' COMMENT '产水 PH 值',
+                                 `feed_wq_al` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '进水水质:铝',
+                                 `product_wq_al` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '产水水质:铝',
+                                 `feed_wq_fe` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '进水水质:铁',
+                                 `product_wq_fe` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '产水水质:铁',
+                                 `feed_wq_mn` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '进水水质:锰',
+                                 `product_wq_mn` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '产水水质:锰',
+                                 `feed_wq_sio2` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '进水水质:二氧化硅',
+                                 `product_wq_sio2` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '产水水质:二氧化硅',
+                                 `feed_wq_cod` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '进水水质:COD',
+                                 `product_wq_cod` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '产水水质:COD',
+                                 `feed_wq_p` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '进水水质:磷',
+                                 `product_wq_p` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '产水水质:磷',
+                                 `step` int(11) DEFAULT NULL COMMENT '设备当前步序值',
+                                 `c_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+                                 PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,
+                                 KEY `project_id` (`project_id`,`device_code`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=30001 COMMENT='反渗透' /*T![ttl] TTL=`c_time` + INTERVAL 3 MONTH */ /*T![ttl] TTL_ENABLE='ON' */ /*T![ttl] TTL_JOB_INTERVAL='1h' */;
+
+-- Create syntax for TABLE 'dc_working_uf'
+CREATE TABLE `dc_working_uf` (
+                                 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+                                 `project_id` int(11) NOT NULL,
+                                 `device_code` varchar(20) NOT NULL DEFAULT '',
+                                 `water_temperature` decimal(4,2) NOT NULL DEFAULT '0' COMMENT '水温 摄氏度',
+                                 `feed_flow` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '进水流量',
+                                 `con_flow` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '浓水流量',
+                                 `product_flow` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '产水流量',
+                                 `feed_pressure` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '进水压力',
+                                 `con_pressure` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '浓水压力',
+                                 `product_pressure` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '产水压力',
+                                 `tmp` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '跨膜压差',
+                                 `flux` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '膜通量',
+                                 `feed_wq_turbidity` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '进水浊度',
+                                 `feed_wq_ph` tinyint(4) NOT NULL DEFAULT '0' COMMENT '进水 PH 值',
+                                 `product_wq_ph` tinyint(4) NOT NULL DEFAULT '0' COMMENT '产水 PH 值',
+                                 `feed_wq_al` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '进水水质:铝',
+                                 `product_wq_al` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '产水水质:铝',
+                                 `feed_wq_fe` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '进水水质:铁',
+                                 `product_wq_fe` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '产水水质:铁',
+                                 `feed_wq_mn` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '进水水质:锰',
+                                 `product_wq_mn` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '产水水质:锰',
+                                 `feed_wq_sio2` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '进水水质:二氧化硅',
+                                 `product_wq_sio2` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '产水水质:二氧化硅',
+                                 `feed_wq_cod` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '进水水质:COD',
+                                 `product_wq_cod` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '产水水质:COD',
+                                 `feed_wq_p` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '进水水质:磷',
+                                 `product_wq_p` decimal(8,4) NOT NULL DEFAULT '0' COMMENT '产水水质:磷',
+                                 `step` int(11) DEFAULT NULL COMMENT '设备当前步序值',
+                                 `c_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+                                 PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,
+                                 KEY `project_id` (`project_id`,`device_code`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=30001 COMMENT='超滤' /*T![ttl] TTL=`c_time` + INTERVAL 3 MONTH */ /*T![ttl] TTL_ENABLE='ON' */ /*T![ttl] TTL_JOB_INTERVAL='1h' */;
+
+-- Create syntax for TABLE 'dc_working_valve'
+CREATE TABLE `dc_working_valve` (
+                                    `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+                                    `project_id` int(11) NOT NULL,
+                                    `device_code` varchar(20) NOT NULL DEFAULT '',
+                                    `adjust` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否为调节阀门 0: 否 1: 是',
+                                    `opening` decimal(8,2) NOT NULL DEFAULT '0' COMMENT '当前阀门的开度',
+                                    `closed` tinyint(1) NOT NULL DEFAULT '0' COMMENT '关到位 全关  0: 否 1: 是',
+                                    `opened` tinyint(1) NOT NULL DEFAULT '0' COMMENT '开到位 开到 设置的开度 0: 否 1: 是',
+                                    `fault_status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否故障 0: 否 1: 是',
+                                    `c_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+                                    PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,
+                                    KEY `project_id` (`project_id`,`device_code`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=30001 COMMENT='阀门' /*T![ttl] TTL=`c_time` + INTERVAL 3 MONTH */ /*T![ttl] TTL_ENABLE='ON' */ /*T![ttl] TTL_JOB_INTERVAL='1h' */;
+
+CREATE TABLE `dc_project_config` (
+                                     `id` int unsigned NOT NULL AUTO_INCREMENT,
+                                     `project_id` int NOT NULL,
+                                     `technologys` varchar(1024) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '该项目中要使用的项目 ["A","B"]',
+                                     `status` tinyint NOT NULL DEFAULT '0' COMMENT '项目状态  0:禁用 1: 正常',
+                                     `m_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+                                     PRIMARY KEY (`id`),
+                                     UNIQUE KEY `project_id` (`project_id`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

+ 24 - 0
app/model/dcAlarmBindModel.go

@@ -0,0 +1,24 @@
+package model
+
+import "github.com/zeromicro/go-zero/core/stores/sqlx"
+
+var _ DcAlarmBindModel = (*customDcAlarmBindModel)(nil)
+
+type (
+	// DcAlarmBindModel is an interface to be customized, add more methods here,
+	// and implement the added methods in customDcAlarmBindModel.
+	DcAlarmBindModel interface {
+		dcAlarmBindModel
+	}
+
+	customDcAlarmBindModel struct {
+		*defaultDcAlarmBindModel
+	}
+)
+
+// NewDcAlarmBindModel returns a model for the database table.
+func NewDcAlarmBindModel(conn sqlx.SqlConn) DcAlarmBindModel {
+	return &customDcAlarmBindModel{
+		defaultDcAlarmBindModel: newDcAlarmBindModel(conn),
+	}
+}

+ 99 - 0
app/model/dcAlarmBindModel_gen.go

@@ -0,0 +1,99 @@
+// Code generated by goctl. DO NOT EDIT.
+
+package model
+
+import (
+	"context"
+	"database/sql"
+	"fmt"
+	"strings"
+	"time"
+
+	"github.com/zeromicro/go-zero/core/stores/builder"
+	"github.com/zeromicro/go-zero/core/stores/sqlc"
+	"github.com/zeromicro/go-zero/core/stores/sqlx"
+	"github.com/zeromicro/go-zero/core/stringx"
+)
+
+var (
+	dcAlarmBindFieldNames          = builder.RawFieldNames(&DcAlarmBind{})
+	dcAlarmBindRows                = strings.Join(dcAlarmBindFieldNames, ",")
+	dcAlarmBindRowsExpectAutoSet   = strings.Join(stringx.Remove(dcAlarmBindFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), ",")
+	dcAlarmBindRowsWithPlaceHolder = strings.Join(stringx.Remove(dcAlarmBindFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), "=?,") + "=?"
+)
+
+type (
+	dcAlarmBindModel interface {
+		Insert(ctx context.Context, data *DcAlarmBind) (sql.Result, error)
+		FindOne(ctx context.Context, id int64) (*DcAlarmBind, error)
+		Update(ctx context.Context, data *DcAlarmBind) error
+		Delete(ctx context.Context, id int64) error
+	}
+
+	defaultDcAlarmBindModel struct {
+		conn  sqlx.SqlConn
+		table string
+	}
+
+	DcAlarmBind struct {
+		Id         int64          `db:"id"`
+		ProjectId  int64          `db:"project_id"`
+		DeviceCode int64          `db:"device_code"`
+		Item       int64          `db:"item"`
+		Threshold  sql.NullString `db:"threshold"` // 阈值配置 [min,max,连续采样次数], 为 null 表示不设置
+		Slope      sql.NullString `db:"slope"`     // 斜率变化配置 [数据量,阈值,连续采样次数], 为 null 表示不设置
+		Na         sql.NullString `db:"na"`        // na报警 [数据量, na数据量,连续采样次数], 为 null 表示不设置
+		Interval   int64          `db:"interval"`  // 检测周期 时间 s
+		CTime      time.Time      `db:"c_time"`
+	}
+)
+
+func newDcAlarmBindModel(conn sqlx.SqlConn) *defaultDcAlarmBindModel {
+	return &defaultDcAlarmBindModel{
+		conn:  conn,
+		table: "`dc_alarm_bind`",
+	}
+}
+
+func (m *defaultDcAlarmBindModel) withSession(session sqlx.Session) *defaultDcAlarmBindModel {
+	return &defaultDcAlarmBindModel{
+		conn:  sqlx.NewSqlConnFromSession(session),
+		table: "`dc_alarm_bind`",
+	}
+}
+
+func (m *defaultDcAlarmBindModel) Delete(ctx context.Context, id int64) error {
+	query := fmt.Sprintf("delete from %s where `id` = ?", m.table)
+	_, err := m.conn.ExecCtx(ctx, query, id)
+	return err
+}
+
+func (m *defaultDcAlarmBindModel) FindOne(ctx context.Context, id int64) (*DcAlarmBind, error) {
+	query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", dcAlarmBindRows, m.table)
+	var resp DcAlarmBind
+	err := m.conn.QueryRowCtx(ctx, &resp, query, id)
+	switch err {
+	case nil:
+		return &resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultDcAlarmBindModel) Insert(ctx context.Context, data *DcAlarmBind) (sql.Result, error) {
+	query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?)", m.table, dcAlarmBindRowsExpectAutoSet)
+	ret, err := m.conn.ExecCtx(ctx, query, data.ProjectId, data.DeviceCode, data.Item, data.Threshold, data.Slope, data.Na, data.Interval, data.CTime)
+	return ret, err
+}
+
+func (m *defaultDcAlarmBindModel) Update(ctx context.Context, data *DcAlarmBind) error {
+	query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, dcAlarmBindRowsWithPlaceHolder)
+	_, err := m.conn.ExecCtx(ctx, query, data.ProjectId, data.DeviceCode, data.Item, data.Threshold, data.Slope, data.Na, data.Interval, data.CTime, data.Id)
+	return err
+}
+
+func (m *defaultDcAlarmBindModel) tableName() string {
+	return m.table
+}

+ 24 - 0
app/model/dcAlarmListModel.go

@@ -0,0 +1,24 @@
+package model
+
+import "github.com/zeromicro/go-zero/core/stores/sqlx"
+
+var _ DcAlarmListModel = (*customDcAlarmListModel)(nil)
+
+type (
+	// DcAlarmListModel is an interface to be customized, add more methods here,
+	// and implement the added methods in customDcAlarmListModel.
+	DcAlarmListModel interface {
+		dcAlarmListModel
+	}
+
+	customDcAlarmListModel struct {
+		*defaultDcAlarmListModel
+	}
+)
+
+// NewDcAlarmListModel returns a model for the database table.
+func NewDcAlarmListModel(conn sqlx.SqlConn) DcAlarmListModel {
+	return &customDcAlarmListModel{
+		defaultDcAlarmListModel: newDcAlarmListModel(conn),
+	}
+}

+ 99 - 0
app/model/dcAlarmListModel_gen.go

@@ -0,0 +1,99 @@
+// Code generated by goctl. DO NOT EDIT.
+
+package model
+
+import (
+	"context"
+	"database/sql"
+	"fmt"
+	"strings"
+	"time"
+
+	"github.com/zeromicro/go-zero/core/stores/builder"
+	"github.com/zeromicro/go-zero/core/stores/sqlc"
+	"github.com/zeromicro/go-zero/core/stores/sqlx"
+	"github.com/zeromicro/go-zero/core/stringx"
+)
+
+var (
+	dcAlarmListFieldNames          = builder.RawFieldNames(&DcAlarmList{})
+	dcAlarmListRows                = strings.Join(dcAlarmListFieldNames, ",")
+	dcAlarmListRowsExpectAutoSet   = strings.Join(stringx.Remove(dcAlarmListFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), ",")
+	dcAlarmListRowsWithPlaceHolder = strings.Join(stringx.Remove(dcAlarmListFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), "=?,") + "=?"
+)
+
+type (
+	dcAlarmListModel interface {
+		Insert(ctx context.Context, data *DcAlarmList) (sql.Result, error)
+		FindOne(ctx context.Context, id int64) (*DcAlarmList, error)
+		Update(ctx context.Context, data *DcAlarmList) error
+		Delete(ctx context.Context, id int64) error
+	}
+
+	defaultDcAlarmListModel struct {
+		conn  sqlx.SqlConn
+		table string
+	}
+
+	DcAlarmList struct {
+		Id         int64     `db:"id"`
+		ProjectId  int64     `db:"project_id"`
+		DeviceCode string    `db:"device_code"`
+		Item       string    `db:"item"`
+		Val        string    `db:"val"`      // 报警发生时,点位的值
+		AlarmId    int64     `db:"alarm_id"` // 报警 ID dc_alarm_bind.id
+		Title      string    `db:"title"`    // 报警标题
+		Context    string    `db:"context"`  // 报警内容
+		CTime      time.Time `db:"c_time"`
+	}
+)
+
+func newDcAlarmListModel(conn sqlx.SqlConn) *defaultDcAlarmListModel {
+	return &defaultDcAlarmListModel{
+		conn:  conn,
+		table: "`dc_alarm_list`",
+	}
+}
+
+func (m *defaultDcAlarmListModel) withSession(session sqlx.Session) *defaultDcAlarmListModel {
+	return &defaultDcAlarmListModel{
+		conn:  sqlx.NewSqlConnFromSession(session),
+		table: "`dc_alarm_list`",
+	}
+}
+
+func (m *defaultDcAlarmListModel) Delete(ctx context.Context, id int64) error {
+	query := fmt.Sprintf("delete from %s where `id` = ?", m.table)
+	_, err := m.conn.ExecCtx(ctx, query, id)
+	return err
+}
+
+func (m *defaultDcAlarmListModel) FindOne(ctx context.Context, id int64) (*DcAlarmList, error) {
+	query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", dcAlarmListRows, m.table)
+	var resp DcAlarmList
+	err := m.conn.QueryRowCtx(ctx, &resp, query, id)
+	switch err {
+	case nil:
+		return &resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultDcAlarmListModel) Insert(ctx context.Context, data *DcAlarmList) (sql.Result, error) {
+	query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?)", m.table, dcAlarmListRowsExpectAutoSet)
+	ret, err := m.conn.ExecCtx(ctx, query, data.ProjectId, data.DeviceCode, data.Item, data.Val, data.AlarmId, data.Title, data.Context, data.CTime)
+	return ret, err
+}
+
+func (m *defaultDcAlarmListModel) Update(ctx context.Context, data *DcAlarmList) error {
+	query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, dcAlarmListRowsWithPlaceHolder)
+	_, err := m.conn.ExecCtx(ctx, query, data.ProjectId, data.DeviceCode, data.Item, data.Val, data.AlarmId, data.Title, data.Context, data.CTime, data.Id)
+	return err
+}
+
+func (m *defaultDcAlarmListModel) tableName() string {
+	return m.table
+}

+ 24 - 0
app/model/dcCleanBindModel.go

@@ -0,0 +1,24 @@
+package model
+
+import "github.com/zeromicro/go-zero/core/stores/sqlx"
+
+var _ DcCleanBindModel = (*customDcCleanBindModel)(nil)
+
+type (
+	// DcCleanBindModel is an interface to be customized, add more methods here,
+	// and implement the added methods in customDcCleanBindModel.
+	DcCleanBindModel interface {
+		dcCleanBindModel
+	}
+
+	customDcCleanBindModel struct {
+		*defaultDcCleanBindModel
+	}
+)
+
+// NewDcCleanBindModel returns a model for the database table.
+func NewDcCleanBindModel(conn sqlx.SqlConn) DcCleanBindModel {
+	return &customDcCleanBindModel{
+		defaultDcCleanBindModel: newDcCleanBindModel(conn),
+	}
+}

+ 116 - 0
app/model/dcCleanBindModel_gen.go

@@ -0,0 +1,116 @@
+// Code generated by goctl. DO NOT EDIT.
+
+package model
+
+import (
+	"context"
+	"database/sql"
+	"fmt"
+	"strings"
+	"time"
+
+	"github.com/zeromicro/go-zero/core/stores/builder"
+	"github.com/zeromicro/go-zero/core/stores/sqlc"
+	"github.com/zeromicro/go-zero/core/stores/sqlx"
+	"github.com/zeromicro/go-zero/core/stringx"
+)
+
+var (
+	dcCleanBindFieldNames          = builder.RawFieldNames(&DcCleanBind{})
+	dcCleanBindRows                = strings.Join(dcCleanBindFieldNames, ",")
+	dcCleanBindRowsExpectAutoSet   = strings.Join(stringx.Remove(dcCleanBindFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), ",")
+	dcCleanBindRowsWithPlaceHolder = strings.Join(stringx.Remove(dcCleanBindFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), "=?,") + "=?"
+)
+
+type (
+	dcCleanBindModel interface {
+		Insert(ctx context.Context, data *DcCleanBind) (sql.Result, error)
+		FindOne(ctx context.Context, id int64) (*DcCleanBind, error)
+		FindOneByProjectIdItem(ctx context.Context, projectId int64, item string) (*DcCleanBind, error)
+		Update(ctx context.Context, data *DcCleanBind) error
+		Delete(ctx context.Context, id int64) error
+	}
+
+	defaultDcCleanBindModel struct {
+		conn  sqlx.SqlConn
+		table string
+	}
+
+	DcCleanBind struct {
+		Id           int64     `db:"id"`
+		ProjectId    int64     `db:"project_id"`
+		DeviceCode   string    `db:"device_code"`
+		Item         string    `db:"item"`
+		RangeNa      string    `db:"range_na"`      // 被当做 na 的值范围,使用逗号分隔多个值 例: '''', ''-'', ''null
+		Dropna       int64     `db:"dropna"`        // 为 na 时,是否进行删除操作 0: 否 1: 是
+		Fillna       int64     `db:"fillna"`        // 为 na 时,是否进行数据填充 0:  否 1: 是
+		FillnaWay    string    `db:"fillna_way"`    // 当 fillna 为 1 时, 为数据指定填充方式 【默认值 | 中位数 | 众数 | 平均数 | 自定义】
+		DropSolitude int64     `db:"drop_solitude"` // 是否删除离群点
+		Duplicate    int64     `db:"duplicate"`     // 是否进行去重复操作 0:  否 1: 是
+		CTime        time.Time `db:"c_time"`
+	}
+)
+
+func newDcCleanBindModel(conn sqlx.SqlConn) *defaultDcCleanBindModel {
+	return &defaultDcCleanBindModel{
+		conn:  conn,
+		table: "`dc_clean_bind`",
+	}
+}
+
+func (m *defaultDcCleanBindModel) withSession(session sqlx.Session) *defaultDcCleanBindModel {
+	return &defaultDcCleanBindModel{
+		conn:  sqlx.NewSqlConnFromSession(session),
+		table: "`dc_clean_bind`",
+	}
+}
+
+func (m *defaultDcCleanBindModel) Delete(ctx context.Context, id int64) error {
+	query := fmt.Sprintf("delete from %s where `id` = ?", m.table)
+	_, err := m.conn.ExecCtx(ctx, query, id)
+	return err
+}
+
+func (m *defaultDcCleanBindModel) FindOne(ctx context.Context, id int64) (*DcCleanBind, error) {
+	query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", dcCleanBindRows, m.table)
+	var resp DcCleanBind
+	err := m.conn.QueryRowCtx(ctx, &resp, query, id)
+	switch err {
+	case nil:
+		return &resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultDcCleanBindModel) FindOneByProjectIdItem(ctx context.Context, projectId int64, item string) (*DcCleanBind, error) {
+	var resp DcCleanBind
+	query := fmt.Sprintf("select %s from %s where `project_id` = ? and `item` = ? limit 1", dcCleanBindRows, m.table)
+	err := m.conn.QueryRowCtx(ctx, &resp, query, projectId, item)
+	switch err {
+	case nil:
+		return &resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultDcCleanBindModel) Insert(ctx context.Context, data *DcCleanBind) (sql.Result, error) {
+	query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, dcCleanBindRowsExpectAutoSet)
+	ret, err := m.conn.ExecCtx(ctx, query, data.ProjectId, data.DeviceCode, data.Item, data.RangeNa, data.Dropna, data.Fillna, data.FillnaWay, data.DropSolitude, data.Duplicate, data.CTime)
+	return ret, err
+}
+
+func (m *defaultDcCleanBindModel) Update(ctx context.Context, newData *DcCleanBind) error {
+	query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, dcCleanBindRowsWithPlaceHolder)
+	_, err := m.conn.ExecCtx(ctx, query, newData.ProjectId, newData.DeviceCode, newData.Item, newData.RangeNa, newData.Dropna, newData.Fillna, newData.FillnaWay, newData.DropSolitude, newData.Duplicate, newData.CTime, newData.Id)
+	return err
+}
+
+func (m *defaultDcCleanBindModel) tableName() string {
+	return m.table
+}

+ 24 - 0
app/model/dcCleanQualityModel.go

@@ -0,0 +1,24 @@
+package model
+
+import "github.com/zeromicro/go-zero/core/stores/sqlx"
+
+var _ DcCleanQualityModel = (*customDcCleanQualityModel)(nil)
+
+type (
+	// DcCleanQualityModel is an interface to be customized, add more methods here,
+	// and implement the added methods in customDcCleanQualityModel.
+	DcCleanQualityModel interface {
+		dcCleanQualityModel
+	}
+
+	customDcCleanQualityModel struct {
+		*defaultDcCleanQualityModel
+	}
+)
+
+// NewDcCleanQualityModel returns a model for the database table.
+func NewDcCleanQualityModel(conn sqlx.SqlConn) DcCleanQualityModel {
+	return &customDcCleanQualityModel{
+		defaultDcCleanQualityModel: newDcCleanQualityModel(conn),
+	}
+}

+ 111 - 0
app/model/dcCleanQualityModel_gen.go

@@ -0,0 +1,111 @@
+// Code generated by goctl. DO NOT EDIT.
+
+package model
+
+import (
+	"context"
+	"database/sql"
+	"fmt"
+	"strings"
+	"time"
+
+	"github.com/zeromicro/go-zero/core/stores/builder"
+	"github.com/zeromicro/go-zero/core/stores/sqlc"
+	"github.com/zeromicro/go-zero/core/stores/sqlx"
+	"github.com/zeromicro/go-zero/core/stringx"
+)
+
+var (
+	dcCleanQualityFieldNames          = builder.RawFieldNames(&DcCleanQuality{})
+	dcCleanQualityRows                = strings.Join(dcCleanQualityFieldNames, ",")
+	dcCleanQualityRowsExpectAutoSet   = strings.Join(stringx.Remove(dcCleanQualityFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), ",")
+	dcCleanQualityRowsWithPlaceHolder = strings.Join(stringx.Remove(dcCleanQualityFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), "=?,") + "=?"
+)
+
+type (
+	dcCleanQualityModel interface {
+		Insert(ctx context.Context, data *DcCleanQuality) (sql.Result, error)
+		FindOne(ctx context.Context, id int64) (*DcCleanQuality, error)
+		FindOneByProjectIdTagItem(ctx context.Context, projectId int64, tag string, item string) (*DcCleanQuality, error)
+		Update(ctx context.Context, data *DcCleanQuality) error
+		Delete(ctx context.Context, id int64) error
+	}
+
+	defaultDcCleanQualityModel struct {
+		conn  sqlx.SqlConn
+		table string
+	}
+
+	DcCleanQuality struct {
+		Id        int64     `db:"id"`
+		ProjectId int64     `db:"project_id"`
+		Tag       string    `db:"tag"`      // 清洗批次
+		Item      string    `db:"item"`     // 点位名
+		Describe  string    `db:"describe"` // 数据质量描述
+		CTime     time.Time `db:"c_time"`
+	}
+)
+
+func newDcCleanQualityModel(conn sqlx.SqlConn) *defaultDcCleanQualityModel {
+	return &defaultDcCleanQualityModel{
+		conn:  conn,
+		table: "`dc_clean_quality`",
+	}
+}
+
+func (m *defaultDcCleanQualityModel) withSession(session sqlx.Session) *defaultDcCleanQualityModel {
+	return &defaultDcCleanQualityModel{
+		conn:  sqlx.NewSqlConnFromSession(session),
+		table: "`dc_clean_quality`",
+	}
+}
+
+func (m *defaultDcCleanQualityModel) Delete(ctx context.Context, id int64) error {
+	query := fmt.Sprintf("delete from %s where `id` = ?", m.table)
+	_, err := m.conn.ExecCtx(ctx, query, id)
+	return err
+}
+
+func (m *defaultDcCleanQualityModel) FindOne(ctx context.Context, id int64) (*DcCleanQuality, error) {
+	query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", dcCleanQualityRows, m.table)
+	var resp DcCleanQuality
+	err := m.conn.QueryRowCtx(ctx, &resp, query, id)
+	switch err {
+	case nil:
+		return &resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultDcCleanQualityModel) FindOneByProjectIdTagItem(ctx context.Context, projectId int64, tag string, item string) (*DcCleanQuality, error) {
+	var resp DcCleanQuality
+	query := fmt.Sprintf("select %s from %s where `project_id` = ? and `tag` = ? and `item` = ? limit 1", dcCleanQualityRows, m.table)
+	err := m.conn.QueryRowCtx(ctx, &resp, query, projectId, tag, item)
+	switch err {
+	case nil:
+		return &resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultDcCleanQualityModel) Insert(ctx context.Context, data *DcCleanQuality) (sql.Result, error) {
+	query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?)", m.table, dcCleanQualityRowsExpectAutoSet)
+	ret, err := m.conn.ExecCtx(ctx, query, data.ProjectId, data.Tag, data.Item, data.Describe, data.CTime)
+	return ret, err
+}
+
+func (m *defaultDcCleanQualityModel) Update(ctx context.Context, newData *DcCleanQuality) error {
+	query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, dcCleanQualityRowsWithPlaceHolder)
+	_, err := m.conn.ExecCtx(ctx, query, newData.ProjectId, newData.Tag, newData.Item, newData.Describe, newData.CTime, newData.Id)
+	return err
+}
+
+func (m *defaultDcCleanQualityModel) tableName() string {
+	return m.table
+}

+ 24 - 0
app/model/dcDeviceBindModel.go

@@ -0,0 +1,24 @@
+package model
+
+import "github.com/zeromicro/go-zero/core/stores/sqlx"
+
+var _ DcDeviceBindModel = (*customDcDeviceBindModel)(nil)
+
+type (
+	// DcDeviceBindModel is an interface to be customized, add more methods here,
+	// and implement the added methods in customDcDeviceBindModel.
+	DcDeviceBindModel interface {
+		dcDeviceBindModel
+	}
+
+	customDcDeviceBindModel struct {
+		*defaultDcDeviceBindModel
+	}
+)
+
+// NewDcDeviceBindModel returns a model for the database table.
+func NewDcDeviceBindModel(conn sqlx.SqlConn) DcDeviceBindModel {
+	return &customDcDeviceBindModel{
+		defaultDcDeviceBindModel: newDcDeviceBindModel(conn),
+	}
+}

+ 128 - 0
app/model/dcDeviceBindModel_gen.go

@@ -0,0 +1,128 @@
+// Code generated by goctl. DO NOT EDIT.
+
+package model
+
+import (
+	"GtDataStore/common/envitem"
+	"context"
+	"database/sql"
+	"fmt"
+	"strings"
+
+	"github.com/zeromicro/go-zero/core/stores/builder"
+	"github.com/zeromicro/go-zero/core/stores/sqlc"
+	"github.com/zeromicro/go-zero/core/stores/sqlx"
+	"github.com/zeromicro/go-zero/core/stringx"
+)
+
+var (
+	dcDeviceBindFieldNames          = builder.RawFieldNames(&DcDeviceBind{})
+	dcDeviceBindRows                = strings.Join(dcDeviceBindFieldNames, ",")
+	dcDeviceBindRowsExpectAutoSet   = strings.Join(stringx.Remove(dcDeviceBindFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), ",")
+	dcDeviceBindRowsWithPlaceHolder = strings.Join(stringx.Remove(dcDeviceBindFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), "=?,") + "=?"
+)
+
+type (
+	dcDeviceBindModel interface {
+		Insert(ctx context.Context, data *DcDeviceBind) (sql.Result, error)
+		FindOne(ctx context.Context, id int64) (*DcDeviceBind, error)
+		FindByProjectIdDeviceType(ctx context.Context, projectId int64, deviceType string) ([]DcDeviceBind, error)
+		FindOneByProjectIdDeviceCode(ctx context.Context, projectId int64, deviceCode string) (*DcDeviceBind, error)
+		Update(ctx context.Context, data *DcDeviceBind) error
+		Delete(ctx context.Context, id int64) error
+	}
+
+	defaultDcDeviceBindModel struct {
+		conn  sqlx.SqlConn
+		table string
+	}
+
+	DcDeviceBind struct {
+		Id          int64                `db:"id"`
+		ProjectId   int64                `db:"project_id"`
+		Name        string               `db:"name"`         // 关系名
+		DeviceCode  string               `db:"device_code"`  // 关键设备指标
+		DeviceType  string               `db:"device_type"`  // 设备类型
+		Status      int64                `db:"status"`       // 当前状态 0: 禁用 1: 正常
+		Items       envitem.MultiEnvItem `db:"items"`        // 相关点位集合
+		TargetTable string               `db:"target_table"` // 数据存入目标表名
+	}
+)
+
+func newDcDeviceBindModel(conn sqlx.SqlConn) *defaultDcDeviceBindModel {
+	return &defaultDcDeviceBindModel{
+		conn:  conn,
+		table: "`dc_device_bind`",
+	}
+}
+
+func (m *defaultDcDeviceBindModel) withSession(session sqlx.Session) *defaultDcDeviceBindModel {
+	return &defaultDcDeviceBindModel{
+		conn:  sqlx.NewSqlConnFromSession(session),
+		table: "`dc_device_bind`",
+	}
+}
+
+func (m *defaultDcDeviceBindModel) Delete(ctx context.Context, id int64) error {
+	query := fmt.Sprintf("delete from %s where `id` = ?", m.table)
+	_, err := m.conn.ExecCtx(ctx, query, id)
+	return err
+}
+
+func (m *defaultDcDeviceBindModel) FindOne(ctx context.Context, id int64) (*DcDeviceBind, error) {
+	query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", dcDeviceBindRows, m.table)
+	var resp DcDeviceBind
+	err := m.conn.QueryRowCtx(ctx, &resp, query, id)
+	switch err {
+	case nil:
+		return &resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultDcDeviceBindModel) FindByProjectIdDeviceType(ctx context.Context, projectId int64, deviceType string) ([]DcDeviceBind, error) {
+	var resp []DcDeviceBind
+	query := fmt.Sprintf("select %s from %s where `project_id` = ? and `device_type` = ?", dcDeviceBindRows, m.table)
+	err := m.conn.QueryRowsCtx(ctx, &resp, query, projectId, deviceType)
+	switch err {
+	case nil:
+		return resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultDcDeviceBindModel) FindOneByProjectIdDeviceCode(ctx context.Context, projectId int64, deviceCode string) (*DcDeviceBind, error) {
+	var resp DcDeviceBind
+	query := fmt.Sprintf("select %s from %s where `project_id` = ? and `device_code` = ? limit 1", dcDeviceBindRows, m.table)
+	err := m.conn.QueryRowCtx(ctx, &resp, query, projectId, deviceCode)
+	switch err {
+	case nil:
+		return &resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultDcDeviceBindModel) Insert(ctx context.Context, data *DcDeviceBind) (sql.Result, error) {
+	query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?)", m.table, dcDeviceBindRowsExpectAutoSet)
+	ret, err := m.conn.ExecCtx(ctx, query, data.ProjectId, data.Name, data.DeviceCode, data.DeviceType, data.Status, data.Items, data.TargetTable)
+	return ret, err
+}
+
+func (m *defaultDcDeviceBindModel) Update(ctx context.Context, newData *DcDeviceBind) error {
+	query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, dcDeviceBindRowsWithPlaceHolder)
+	_, err := m.conn.ExecCtx(ctx, query, newData.ProjectId, newData.Name, newData.DeviceCode, newData.DeviceType, newData.Status, newData.Items, newData.TargetTable, newData.Id)
+	return err
+}
+
+func (m *defaultDcDeviceBindModel) tableName() string {
+	return m.table
+}

+ 24 - 0
app/model/dcDeviceRelationModel.go

@@ -0,0 +1,24 @@
+package model
+
+import "github.com/zeromicro/go-zero/core/stores/sqlx"
+
+var _ DcDeviceRelationModel = (*customDcDeviceRelationModel)(nil)
+
+type (
+	// DcDeviceRelationModel is an interface to be customized, add more methods here,
+	// and implement the added methods in customDcDeviceRelationModel.
+	DcDeviceRelationModel interface {
+		dcDeviceRelationModel
+	}
+
+	customDcDeviceRelationModel struct {
+		*defaultDcDeviceRelationModel
+	}
+)
+
+// NewDcDeviceRelationModel returns a model for the database table.
+func NewDcDeviceRelationModel(conn sqlx.SqlConn) DcDeviceRelationModel {
+	return &customDcDeviceRelationModel{
+		defaultDcDeviceRelationModel: newDcDeviceRelationModel(conn),
+	}
+}

+ 110 - 0
app/model/dcDeviceRelationModel_gen.go

@@ -0,0 +1,110 @@
+// Code generated by goctl. DO NOT EDIT.
+
+package model
+
+import (
+	"context"
+	"database/sql"
+	"fmt"
+	"strings"
+
+	"github.com/zeromicro/go-zero/core/stores/builder"
+	"github.com/zeromicro/go-zero/core/stores/sqlc"
+	"github.com/zeromicro/go-zero/core/stores/sqlx"
+	"github.com/zeromicro/go-zero/core/stringx"
+)
+
+var (
+	dcDeviceRelationFieldNames          = builder.RawFieldNames(&DcDeviceRelation{})
+	dcDeviceRelationRows                = strings.Join(dcDeviceRelationFieldNames, ",")
+	dcDeviceRelationRowsExpectAutoSet   = strings.Join(stringx.Remove(dcDeviceRelationFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), ",")
+	dcDeviceRelationRowsWithPlaceHolder = strings.Join(stringx.Remove(dcDeviceRelationFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), "=?,") + "=?"
+)
+
+type (
+	dcDeviceRelationModel interface {
+		Insert(ctx context.Context, data *DcDeviceRelation) (sql.Result, error)
+		FindOne(ctx context.Context, id int64) (*DcDeviceRelation, error)
+		FindOneByProjectIdDeviceCode(ctx context.Context, projectId int64, deviceCode string) (*DcDeviceRelation, error)
+		Update(ctx context.Context, data *DcDeviceRelation) error
+		Delete(ctx context.Context, id int64) error
+	}
+
+	defaultDcDeviceRelationModel struct {
+		conn  sqlx.SqlConn
+		table string
+	}
+
+	DcDeviceRelation struct {
+		Id         int64  `db:"id"`
+		ProjectId  int64  `db:"project_id"`
+		DeviceCode string `db:"device_code"`
+		Chest      string `db:"chest"` // 与之相关的 chest 设备
+		Pump       string `db:"pump"`  // 与之相关的 pump 设备
+		Value      string `db:"value"` // 与之相关的 value 设备
+	}
+)
+
+func newDcDeviceRelationModel(conn sqlx.SqlConn) *defaultDcDeviceRelationModel {
+	return &defaultDcDeviceRelationModel{
+		conn:  conn,
+		table: "`dc_device_relation`",
+	}
+}
+
+func (m *defaultDcDeviceRelationModel) withSession(session sqlx.Session) *defaultDcDeviceRelationModel {
+	return &defaultDcDeviceRelationModel{
+		conn:  sqlx.NewSqlConnFromSession(session),
+		table: "`dc_device_relation`",
+	}
+}
+
+func (m *defaultDcDeviceRelationModel) Delete(ctx context.Context, id int64) error {
+	query := fmt.Sprintf("delete from %s where `id` = ?", m.table)
+	_, err := m.conn.ExecCtx(ctx, query, id)
+	return err
+}
+
+func (m *defaultDcDeviceRelationModel) FindOne(ctx context.Context, id int64) (*DcDeviceRelation, error) {
+	query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", dcDeviceRelationRows, m.table)
+	var resp DcDeviceRelation
+	err := m.conn.QueryRowCtx(ctx, &resp, query, id)
+	switch err {
+	case nil:
+		return &resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultDcDeviceRelationModel) FindOneByProjectIdDeviceCode(ctx context.Context, projectId int64, deviceCode string) (*DcDeviceRelation, error) {
+	var resp DcDeviceRelation
+	query := fmt.Sprintf("select %s from %s where `project_id` = ? and `device_code` = ? limit 1", dcDeviceRelationRows, m.table)
+	err := m.conn.QueryRowCtx(ctx, &resp, query, projectId, deviceCode)
+	switch err {
+	case nil:
+		return &resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultDcDeviceRelationModel) Insert(ctx context.Context, data *DcDeviceRelation) (sql.Result, error) {
+	query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?)", m.table, dcDeviceRelationRowsExpectAutoSet)
+	ret, err := m.conn.ExecCtx(ctx, query, data.ProjectId, data.DeviceCode, data.Chest, data.Pump, data.Value)
+	return ret, err
+}
+
+func (m *defaultDcDeviceRelationModel) Update(ctx context.Context, newData *DcDeviceRelation) error {
+	query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, dcDeviceRelationRowsWithPlaceHolder)
+	_, err := m.conn.ExecCtx(ctx, query, newData.ProjectId, newData.DeviceCode, newData.Chest, newData.Pump, newData.Value, newData.Id)
+	return err
+}
+
+func (m *defaultDcDeviceRelationModel) tableName() string {
+	return m.table
+}

+ 24 - 0
app/model/dcEventBindModel.go

@@ -0,0 +1,24 @@
+package model
+
+import "github.com/zeromicro/go-zero/core/stores/sqlx"
+
+var _ DcEventBindModel = (*customDcEventBindModel)(nil)
+
+type (
+	// DcEventBindModel is an interface to be customized, add more methods here,
+	// and implement the added methods in customDcEventBindModel.
+	DcEventBindModel interface {
+		dcEventBindModel
+	}
+
+	customDcEventBindModel struct {
+		*defaultDcEventBindModel
+	}
+)
+
+// NewDcEventBindModel returns a model for the database table.
+func NewDcEventBindModel(conn sqlx.SqlConn) DcEventBindModel {
+	return &customDcEventBindModel{
+		defaultDcEventBindModel: newDcEventBindModel(conn),
+	}
+}

+ 145 - 0
app/model/dcEventBindModel_gen.go

@@ -0,0 +1,145 @@
+// Code generated by goctl. DO NOT EDIT.
+
+package model
+
+import (
+	"GtDataStore/common/identify"
+	"context"
+	"database/sql"
+	"fmt"
+	"strings"
+	"time"
+
+	"github.com/zeromicro/go-zero/core/stores/builder"
+	"github.com/zeromicro/go-zero/core/stores/sqlc"
+	"github.com/zeromicro/go-zero/core/stores/sqlx"
+	"github.com/zeromicro/go-zero/core/stringx"
+)
+
+var (
+	dcEventBindFieldNames          = builder.RawFieldNames(&DcEventBind{})
+	dcEventBindRows                = strings.Join(dcEventBindFieldNames, ",")
+	dcEventBindRowsExpectAutoSet   = strings.Join(stringx.Remove(dcEventBindFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), ",")
+	dcEventBindRowsWithPlaceHolder = strings.Join(stringx.Remove(dcEventBindFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), "=?,") + "=?"
+)
+
+type (
+	dcEventBindModel interface {
+		Insert(ctx context.Context, data *DcEventBind) (sql.Result, error)
+		FindOne(ctx context.Context, id int64) (*DcEventBind, error)
+		FindByProjectIdRuleFlag(ctx context.Context, projectId int64, ruleFlag string) ([]DcEventBind, error)
+		FindOneByProjectIdItemName(ctx context.Context, projectId int64, item string, name string) (*DcEventBind, error)
+		FindOneByProjectIdItemRuleFlag(ctx context.Context, projectId int64, item string, ruleFlag string) (*DcEventBind, error)
+		Update(ctx context.Context, data *DcEventBind) error
+		Delete(ctx context.Context, id int64) error
+	}
+
+	defaultDcEventBindModel struct {
+		conn  sqlx.SqlConn
+		table string
+	}
+
+	DcEventBind struct {
+		Id         int64         `db:"id"`
+		ProjectId  int64         `db:"project_id"`  // 项目 ID
+		DeviceCode string        `db:"device_code"` // 设备位号
+		Name       string        `db:"name"`        // 事件名称
+		Item       string        `db:"item"`        // 点位名称
+		RuleFlag   string        `db:"rule_flag"`   // 绑定的事件引擎
+		Config     identify.Rule `db:"config"`      // 事件配置 一个 json 配置,用于
+		Interval   int64         `db:"interval"`    // 检测时间间隔
+		CTime      time.Time     `db:"c_time"`
+	}
+)
+
+func newDcEventBindModel(conn sqlx.SqlConn) *defaultDcEventBindModel {
+	return &defaultDcEventBindModel{
+		conn:  conn,
+		table: "`dc_event_bind`",
+	}
+}
+
+func (m *defaultDcEventBindModel) withSession(session sqlx.Session) *defaultDcEventBindModel {
+	return &defaultDcEventBindModel{
+		conn:  sqlx.NewSqlConnFromSession(session),
+		table: "`dc_event_bind`",
+	}
+}
+
+func (m *defaultDcEventBindModel) Delete(ctx context.Context, id int64) error {
+	query := fmt.Sprintf("delete from %s where `id` = ?", m.table)
+	_, err := m.conn.ExecCtx(ctx, query, id)
+	return err
+}
+
+func (m *defaultDcEventBindModel) FindOne(ctx context.Context, id int64) (*DcEventBind, error) {
+	query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", dcEventBindRows, m.table)
+	var resp DcEventBind
+	err := m.conn.QueryRowCtx(ctx, &resp, query, id)
+	switch err {
+	case nil:
+		return &resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultDcEventBindModel) FindByProjectIdRuleFlag(ctx context.Context, projectId int64, ruleFlag string) ([]DcEventBind, error) {
+	var resp []DcEventBind
+	query := fmt.Sprintf("select %s from %s where `project_id` = ? and `rule_flag` = ?", dcEventBindRows, m.table)
+	err := m.conn.QueryRowsCtx(ctx, &resp, query, projectId, ruleFlag)
+	switch err {
+	case nil:
+		return resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultDcEventBindModel) FindOneByProjectIdItemRuleFlag(ctx context.Context, projectId int64, item string, ruleFlag string) (*DcEventBind, error) {
+	var resp DcEventBind
+	query := fmt.Sprintf("select %s from %s where `project_id` = ? and `item` = ? and `rule_flag` = ? limit 1", dcEventBindRows, m.table)
+	err := m.conn.QueryRowCtx(ctx, &resp, query, projectId, item, ruleFlag)
+	switch err {
+	case nil:
+		return &resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultDcEventBindModel) FindOneByProjectIdItemName(ctx context.Context, projectId int64, item string, name string) (*DcEventBind, error) {
+	var resp DcEventBind
+	query := fmt.Sprintf("select %s from %s where `project_id` = ? and `item` = ? and `name` = ? limit 1", dcEventBindRows, m.table)
+	err := m.conn.QueryRowCtx(ctx, &resp, query, projectId, item, name)
+	switch err {
+	case nil:
+		return &resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultDcEventBindModel) Insert(ctx context.Context, data *DcEventBind) (sql.Result, error) {
+	query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?)", m.table, dcEventBindRowsExpectAutoSet)
+	ret, err := m.conn.ExecCtx(ctx, query, data.ProjectId, data.DeviceCode, data.Name, data.Item, data.RuleFlag, data.Config, data.Interval, data.CTime)
+	return ret, err
+}
+
+func (m *defaultDcEventBindModel) Update(ctx context.Context, newData *DcEventBind) error {
+	query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, dcEventBindRowsWithPlaceHolder)
+	_, err := m.conn.ExecCtx(ctx, query, newData.ProjectId, newData.DeviceCode, newData.Name, newData.Item, newData.RuleFlag, newData.Config, newData.Interval, newData.CTime, newData.Id)
+	return err
+}
+
+func (m *defaultDcEventBindModel) tableName() string {
+	return m.table
+}

+ 24 - 0
app/model/dcEventListModel.go

@@ -0,0 +1,24 @@
+package model
+
+import "github.com/zeromicro/go-zero/core/stores/sqlx"
+
+var _ DcEventListModel = (*customDcEventListModel)(nil)
+
+type (
+	// DcEventListModel is an interface to be customized, add more methods here,
+	// and implement the added methods in customDcEventListModel.
+	DcEventListModel interface {
+		dcEventListModel
+	}
+
+	customDcEventListModel struct {
+		*defaultDcEventListModel
+	}
+)
+
+// NewDcEventListModel returns a model for the database table.
+func NewDcEventListModel(conn sqlx.SqlConn) DcEventListModel {
+	return &customDcEventListModel{
+		defaultDcEventListModel: newDcEventListModel(conn),
+	}
+}

+ 99 - 0
app/model/dcEventListModel_gen.go

@@ -0,0 +1,99 @@
+// Code generated by goctl. DO NOT EDIT.
+
+package model
+
+import (
+	"context"
+	"database/sql"
+	"fmt"
+	"strings"
+	"time"
+
+	"github.com/zeromicro/go-zero/core/stores/builder"
+	"github.com/zeromicro/go-zero/core/stores/sqlc"
+	"github.com/zeromicro/go-zero/core/stores/sqlx"
+	"github.com/zeromicro/go-zero/core/stringx"
+)
+
+var (
+	dcEventListFieldNames          = builder.RawFieldNames(&DcEventList{})
+	dcEventListRows                = strings.Join(dcEventListFieldNames, ",")
+	dcEventListRowsExpectAutoSet   = strings.Join(stringx.Remove(dcEventListFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), ",")
+	dcEventListRowsWithPlaceHolder = strings.Join(stringx.Remove(dcEventListFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), "=?,") + "=?"
+)
+
+type (
+	dcEventListModel interface {
+		Insert(ctx context.Context, data *DcEventList) (sql.Result, error)
+		FindOne(ctx context.Context, id int64) (*DcEventList, error)
+		Update(ctx context.Context, data *DcEventList) error
+		Delete(ctx context.Context, id int64) error
+	}
+
+	defaultDcEventListModel struct {
+		conn  sqlx.SqlConn
+		table string
+	}
+
+	DcEventList struct {
+		Id         int64     `db:"id"`
+		ProjectId  int64     `db:"project_id"`
+		DeviceCode string    `db:"device_code"`
+		Item       string    `db:"item"`
+		Val        string    `db:"val"`      // 事件发生时,点位的值
+		EventId    int64     `db:"event_id"` // 事件 ID dc_event_bind.id
+		Title      string    `db:"title"`    // 事件标题
+		Context    string    `db:"context"`  // 事件内容
+		CTime      time.Time `db:"c_time"`
+	}
+)
+
+func newDcEventListModel(conn sqlx.SqlConn) *defaultDcEventListModel {
+	return &defaultDcEventListModel{
+		conn:  conn,
+		table: "`dc_event_list`",
+	}
+}
+
+func (m *defaultDcEventListModel) withSession(session sqlx.Session) *defaultDcEventListModel {
+	return &defaultDcEventListModel{
+		conn:  sqlx.NewSqlConnFromSession(session),
+		table: "`dc_event_list`",
+	}
+}
+
+func (m *defaultDcEventListModel) Delete(ctx context.Context, id int64) error {
+	query := fmt.Sprintf("delete from %s where `id` = ?", m.table)
+	_, err := m.conn.ExecCtx(ctx, query, id)
+	return err
+}
+
+func (m *defaultDcEventListModel) FindOne(ctx context.Context, id int64) (*DcEventList, error) {
+	query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", dcEventListRows, m.table)
+	var resp DcEventList
+	err := m.conn.QueryRowCtx(ctx, &resp, query, id)
+	switch err {
+	case nil:
+		return &resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultDcEventListModel) Insert(ctx context.Context, data *DcEventList) (sql.Result, error) {
+	query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?)", m.table, dcEventListRowsExpectAutoSet)
+	ret, err := m.conn.ExecCtx(ctx, query, data.ProjectId, data.DeviceCode, data.Item, data.Val, data.EventId, data.Title, data.Context, data.CTime)
+	return ret, err
+}
+
+func (m *defaultDcEventListModel) Update(ctx context.Context, data *DcEventList) error {
+	query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, dcEventListRowsWithPlaceHolder)
+	_, err := m.conn.ExecCtx(ctx, query, data.ProjectId, data.DeviceCode, data.Item, data.Val, data.EventId, data.Title, data.Context, data.CTime, data.Id)
+	return err
+}
+
+func (m *defaultDcEventListModel) tableName() string {
+	return m.table
+}

+ 24 - 0
app/model/dcEventRuleModel.go

@@ -0,0 +1,24 @@
+package model
+
+import "github.com/zeromicro/go-zero/core/stores/sqlx"
+
+var _ DcEventRuleModel = (*customDcEventRuleModel)(nil)
+
+type (
+	// DcEventRuleModel is an interface to be customized, add more methods here,
+	// and implement the added methods in customDcEventRuleModel.
+	DcEventRuleModel interface {
+		dcEventRuleModel
+	}
+
+	customDcEventRuleModel struct {
+		*defaultDcEventRuleModel
+	}
+)
+
+// NewDcEventRuleModel returns a model for the database table.
+func NewDcEventRuleModel(conn sqlx.SqlConn) DcEventRuleModel {
+	return &customDcEventRuleModel{
+		defaultDcEventRuleModel: newDcEventRuleModel(conn),
+	}
+}

+ 110 - 0
app/model/dcEventRuleModel_gen.go

@@ -0,0 +1,110 @@
+// Code generated by goctl. DO NOT EDIT.
+
+package model
+
+import (
+	"context"
+	"database/sql"
+	"fmt"
+	"strings"
+	"time"
+
+	"github.com/zeromicro/go-zero/core/stores/builder"
+	"github.com/zeromicro/go-zero/core/stores/sqlc"
+	"github.com/zeromicro/go-zero/core/stores/sqlx"
+	"github.com/zeromicro/go-zero/core/stringx"
+)
+
+var (
+	dcEventRuleFieldNames          = builder.RawFieldNames(&DcEventRule{})
+	dcEventRuleRows                = strings.Join(dcEventRuleFieldNames, ",")
+	dcEventRuleRowsExpectAutoSet   = strings.Join(stringx.Remove(dcEventRuleFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), ",")
+	dcEventRuleRowsWithPlaceHolder = strings.Join(stringx.Remove(dcEventRuleFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), "=?,") + "=?"
+)
+
+type (
+	dcEventRuleModel interface {
+		Insert(ctx context.Context, data *DcEventRule) (sql.Result, error)
+		FindOne(ctx context.Context, id int64) (*DcEventRule, error)
+		FindOneByFlag(ctx context.Context, flag string) (*DcEventRule, error)
+		Update(ctx context.Context, data *DcEventRule) error
+		Delete(ctx context.Context, id int64) error
+	}
+
+	defaultDcEventRuleModel struct {
+		conn  sqlx.SqlConn
+		table string
+	}
+
+	DcEventRule struct {
+		Id     int64     `db:"id"`
+		Name   string    `db:"name"`   // 识别事件的处理名称
+		Flag   string    `db:"flag"`   // 唯一标识,应该被程序定义为常量
+		Remark string    `db:"remark"` // 说明信息
+		CTime  time.Time `db:"c_time"` // 创建时间
+	}
+)
+
+func newDcEventRuleModel(conn sqlx.SqlConn) *defaultDcEventRuleModel {
+	return &defaultDcEventRuleModel{
+		conn:  conn,
+		table: "`dc_event_rule`",
+	}
+}
+
+func (m *defaultDcEventRuleModel) withSession(session sqlx.Session) *defaultDcEventRuleModel {
+	return &defaultDcEventRuleModel{
+		conn:  sqlx.NewSqlConnFromSession(session),
+		table: "`dc_event_rule`",
+	}
+}
+
+func (m *defaultDcEventRuleModel) Delete(ctx context.Context, id int64) error {
+	query := fmt.Sprintf("delete from %s where `id` = ?", m.table)
+	_, err := m.conn.ExecCtx(ctx, query, id)
+	return err
+}
+
+func (m *defaultDcEventRuleModel) FindOne(ctx context.Context, id int64) (*DcEventRule, error) {
+	query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", dcEventRuleRows, m.table)
+	var resp DcEventRule
+	err := m.conn.QueryRowCtx(ctx, &resp, query, id)
+	switch err {
+	case nil:
+		return &resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultDcEventRuleModel) FindOneByFlag(ctx context.Context, flag string) (*DcEventRule, error) {
+	var resp DcEventRule
+	query := fmt.Sprintf("select %s from %s where `flag` = ? limit 1", dcEventRuleRows, m.table)
+	err := m.conn.QueryRowCtx(ctx, &resp, query, flag)
+	switch err {
+	case nil:
+		return &resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultDcEventRuleModel) Insert(ctx context.Context, data *DcEventRule) (sql.Result, error) {
+	query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?)", m.table, dcEventRuleRowsExpectAutoSet)
+	ret, err := m.conn.ExecCtx(ctx, query, data.Name, data.Flag, data.Remark, data.CTime)
+	return ret, err
+}
+
+func (m *defaultDcEventRuleModel) Update(ctx context.Context, newData *DcEventRule) error {
+	query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, dcEventRuleRowsWithPlaceHolder)
+	_, err := m.conn.ExecCtx(ctx, query, newData.Name, newData.Flag, newData.Remark, newData.CTime, newData.Id)
+	return err
+}
+
+func (m *defaultDcEventRuleModel) tableName() string {
+	return m.table
+}

+ 24 - 0
app/model/dcItemDataModel.go

@@ -0,0 +1,24 @@
+package model
+
+import "github.com/zeromicro/go-zero/core/stores/sqlx"
+
+var _ DcItemDataModel = (*customDcItemDataModel)(nil)
+
+type (
+	// DcItemDataModel is an interface to be customized, add more methods here,
+	// and implement the added methods in customDcItemDataModel.
+	DcItemDataModel interface {
+		dcItemDataModel
+	}
+
+	customDcItemDataModel struct {
+		*defaultDcItemDataModel
+	}
+)
+
+// NewDcItemDataModel returns a model for the database table.
+func NewDcItemDataModel(conn sqlx.SqlConn) DcItemDataModel {
+	return &customDcItemDataModel{
+		defaultDcItemDataModel: newDcItemDataModel(conn),
+	}
+}

+ 96 - 0
app/model/dcItemDataModel_gen.go

@@ -0,0 +1,96 @@
+// Code generated by goctl. DO NOT EDIT.
+
+package model
+
+import (
+	"context"
+	"database/sql"
+	"fmt"
+	"strings"
+	"time"
+
+	"github.com/zeromicro/go-zero/core/stores/builder"
+	"github.com/zeromicro/go-zero/core/stores/sqlc"
+	"github.com/zeromicro/go-zero/core/stores/sqlx"
+	"github.com/zeromicro/go-zero/core/stringx"
+)
+
+var (
+	dcItemDataFieldNames          = builder.RawFieldNames(&DcItemData{})
+	dcItemDataRows                = strings.Join(dcItemDataFieldNames, ",")
+	dcItemDataRowsExpectAutoSet   = strings.Join(stringx.Remove(dcItemDataFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), ",")
+	dcItemDataRowsWithPlaceHolder = strings.Join(stringx.Remove(dcItemDataFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), "=?,") + "=?"
+)
+
+type (
+	dcItemDataModel interface {
+		Insert(ctx context.Context, data *DcItemData) (sql.Result, error)
+		FindOne(ctx context.Context, id int64) (*DcItemData, error)
+		Update(ctx context.Context, data *DcItemData) error
+		Delete(ctx context.Context, id int64) error
+	}
+
+	defaultDcItemDataModel struct {
+		conn  sqlx.SqlConn
+		table string
+	}
+
+	DcItemData struct {
+		Id        int64     `db:"id"`
+		ProjectId int64     `db:"project_id"`
+		Item      string    `db:"item"`
+		Val       string    `db:"val"`
+		Htime     time.Time `db:"htime"`
+		Tag       string    `db:"tag"`
+	}
+)
+
+func newDcItemDataModel(conn sqlx.SqlConn) *defaultDcItemDataModel {
+	return &defaultDcItemDataModel{
+		conn:  conn,
+		table: "`dc_item_data`",
+	}
+}
+
+func (m *defaultDcItemDataModel) withSession(session sqlx.Session) *defaultDcItemDataModel {
+	return &defaultDcItemDataModel{
+		conn:  sqlx.NewSqlConnFromSession(session),
+		table: "`dc_item_data`",
+	}
+}
+
+func (m *defaultDcItemDataModel) Delete(ctx context.Context, id int64) error {
+	query := fmt.Sprintf("delete from %s where `id` = ?", m.table)
+	_, err := m.conn.ExecCtx(ctx, query, id)
+	return err
+}
+
+func (m *defaultDcItemDataModel) FindOne(ctx context.Context, id int64) (*DcItemData, error) {
+	query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", dcItemDataRows, m.table)
+	var resp DcItemData
+	err := m.conn.QueryRowCtx(ctx, &resp, query, id)
+	switch err {
+	case nil:
+		return &resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultDcItemDataModel) Insert(ctx context.Context, data *DcItemData) (sql.Result, error) {
+	query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?)", m.table, dcItemDataRowsExpectAutoSet)
+	ret, err := m.conn.ExecCtx(ctx, query, data.ProjectId, data.Item, data.Val, data.Htime, data.Tag)
+	return ret, err
+}
+
+func (m *defaultDcItemDataModel) Update(ctx context.Context, data *DcItemData) error {
+	query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, dcItemDataRowsWithPlaceHolder)
+	_, err := m.conn.ExecCtx(ctx, query, data.ProjectId, data.Item, data.Val, data.Htime, data.Tag, data.Id)
+	return err
+}
+
+func (m *defaultDcItemDataModel) tableName() string {
+	return m.table
+}

+ 24 - 0
app/model/dcItemMapModel.go

@@ -0,0 +1,24 @@
+package model
+
+import "github.com/zeromicro/go-zero/core/stores/sqlx"
+
+var _ DcItemMapModel = (*customDcItemMapModel)(nil)
+
+type (
+	// DcItemMapModel is an interface to be customized, add more methods here,
+	// and implement the added methods in customDcItemMapModel.
+	DcItemMapModel interface {
+		dcItemMapModel
+	}
+
+	customDcItemMapModel struct {
+		*defaultDcItemMapModel
+	}
+)
+
+// NewDcItemMapModel returns a model for the database table.
+func NewDcItemMapModel(conn sqlx.SqlConn) DcItemMapModel {
+	return &customDcItemMapModel{
+		defaultDcItemMapModel: newDcItemMapModel(conn),
+	}
+}

+ 110 - 0
app/model/dcItemMapModel_gen.go

@@ -0,0 +1,110 @@
+// Code generated by goctl. DO NOT EDIT.
+
+package model
+
+import (
+	"context"
+	"database/sql"
+	"fmt"
+	"strings"
+
+	"github.com/zeromicro/go-zero/core/stores/builder"
+	"github.com/zeromicro/go-zero/core/stores/sqlc"
+	"github.com/zeromicro/go-zero/core/stores/sqlx"
+	"github.com/zeromicro/go-zero/core/stringx"
+)
+
+var (
+	dcItemMapFieldNames          = builder.RawFieldNames(&DcItemMap{})
+	dcItemMapRows                = strings.Join(dcItemMapFieldNames, ",")
+	dcItemMapRowsExpectAutoSet   = strings.Join(stringx.Remove(dcItemMapFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), ",")
+	dcItemMapRowsWithPlaceHolder = strings.Join(stringx.Remove(dcItemMapFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), "=?,") + "=?"
+)
+
+type (
+	dcItemMapModel interface {
+		Insert(ctx context.Context, data *DcItemMap) (sql.Result, error)
+		FindOne(ctx context.Context, id int64) (*DcItemMap, error)
+		FindOneByProjectIdSourceItem(ctx context.Context, projectId int64, sourceItem string) (*DcItemMap, error)
+		Update(ctx context.Context, data *DcItemMap) error
+		Delete(ctx context.Context, id int64) error
+	}
+
+	defaultDcItemMapModel struct {
+		conn  sqlx.SqlConn
+		table string
+	}
+
+	DcItemMap struct {
+		Id         int64  `db:"id"`
+		ProjectId  int64  `db:"project_id"`  // 项目 ID
+		DeviceCode string `db:"device_code"` // 设备位号
+		SourceItem string `db:"source_item"` // 来源 item 名
+		TargetItem string `db:"target_item"` // 目标item 名,也就是数据中心的 item 名
+		Alias      string `db:"alias"`       // 点位名描述
+	}
+)
+
+func newDcItemMapModel(conn sqlx.SqlConn) *defaultDcItemMapModel {
+	return &defaultDcItemMapModel{
+		conn:  conn,
+		table: "`dc_item_map`",
+	}
+}
+
+func (m *defaultDcItemMapModel) withSession(session sqlx.Session) *defaultDcItemMapModel {
+	return &defaultDcItemMapModel{
+		conn:  sqlx.NewSqlConnFromSession(session),
+		table: "`dc_item_map`",
+	}
+}
+
+func (m *defaultDcItemMapModel) Delete(ctx context.Context, id int64) error {
+	query := fmt.Sprintf("delete from %s where `id` = ?", m.table)
+	_, err := m.conn.ExecCtx(ctx, query, id)
+	return err
+}
+
+func (m *defaultDcItemMapModel) FindOne(ctx context.Context, id int64) (*DcItemMap, error) {
+	query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", dcItemMapRows, m.table)
+	var resp DcItemMap
+	err := m.conn.QueryRowCtx(ctx, &resp, query, id)
+	switch err {
+	case nil:
+		return &resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultDcItemMapModel) FindOneByProjectIdSourceItem(ctx context.Context, projectId int64, sourceItem string) (*DcItemMap, error) {
+	var resp DcItemMap
+	query := fmt.Sprintf("select %s from %s where `project_id` = ? and `source_item` = ? limit 1", dcItemMapRows, m.table)
+	err := m.conn.QueryRowCtx(ctx, &resp, query, projectId, sourceItem)
+	switch err {
+	case nil:
+		return &resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultDcItemMapModel) Insert(ctx context.Context, data *DcItemMap) (sql.Result, error) {
+	query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?)", m.table, dcItemMapRowsExpectAutoSet)
+	ret, err := m.conn.ExecCtx(ctx, query, data.ProjectId, data.DeviceCode, data.SourceItem, data.TargetItem, data.Alias)
+	return ret, err
+}
+
+func (m *defaultDcItemMapModel) Update(ctx context.Context, newData *DcItemMap) error {
+	query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, dcItemMapRowsWithPlaceHolder)
+	_, err := m.conn.ExecCtx(ctx, query, newData.ProjectId, newData.DeviceCode, newData.SourceItem, newData.TargetItem, newData.Alias, newData.Id)
+	return err
+}
+
+func (m *defaultDcItemMapModel) tableName() string {
+	return m.table
+}

+ 24 - 0
app/model/dcProjectConfigModel.go

@@ -0,0 +1,24 @@
+package model
+
+import "github.com/zeromicro/go-zero/core/stores/sqlx"
+
+var _ DcProjectConfigModel = (*customDcProjectConfigModel)(nil)
+
+type (
+	// DcProjectConfigModel is an interface to be customized, add more methods here,
+	// and implement the added methods in customDcProjectConfigModel.
+	DcProjectConfigModel interface {
+		dcProjectConfigModel
+	}
+
+	customDcProjectConfigModel struct {
+		*defaultDcProjectConfigModel
+	}
+)
+
+// NewDcProjectConfigModel returns a model for the database table.
+func NewDcProjectConfigModel(conn sqlx.SqlConn) DcProjectConfigModel {
+	return &customDcProjectConfigModel{
+		defaultDcProjectConfigModel: newDcProjectConfigModel(conn),
+	}
+}

+ 144 - 0
app/model/dcProjectConfigModel_gen.go

@@ -0,0 +1,144 @@
+// Code generated by goctl. DO NOT EDIT.
+
+package model
+
+import (
+	"context"
+	"database/sql"
+	"fmt"
+	"strings"
+	"time"
+
+	"github.com/zeromicro/go-zero/core/stores/builder"
+	"github.com/zeromicro/go-zero/core/stores/sqlc"
+	"github.com/zeromicro/go-zero/core/stores/sqlx"
+	"github.com/zeromicro/go-zero/core/stringx"
+)
+
+var (
+	dcProjectConfigFieldNames          = builder.RawFieldNames(&DcProjectConfig{})
+	dcProjectConfigRows                = strings.Join(dcProjectConfigFieldNames, ",")
+	dcProjectConfigRowsExpectAutoSet   = strings.Join(stringx.Remove(dcProjectConfigFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), ",")
+	dcProjectConfigRowsWithPlaceHolder = strings.Join(stringx.Remove(dcProjectConfigFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), "=?,") + "=?"
+)
+
+type (
+	dcProjectConfigModel interface {
+		FindAll(ctx context.Context) ([]DcProjectConfig, error)
+		FindAllByPage(ctx context.Context, offset, limit int64) ([]DcProjectConfig, error)
+		Insert(ctx context.Context, data *DcProjectConfig) (sql.Result, error)
+		FindOne(ctx context.Context, id int64) (*DcProjectConfig, error)
+		FindOneByProjectId(ctx context.Context, projectId int64) (*DcProjectConfig, error)
+		Update(ctx context.Context, data *DcProjectConfig) error
+		Delete(ctx context.Context, id int64) error
+	}
+
+	defaultDcProjectConfigModel struct {
+		conn  sqlx.SqlConn
+		table string
+	}
+
+	DcProjectConfig struct {
+		Id          int64       `db:"id"`
+		ProjectId   int64       `db:"project_id"`
+		Technologys Technologys `db:"technologys"` // 该项目中要使用的项目 ["A","B"]
+		Status      int64       `db:"status"`      // 项目状态  0:禁用 1: 正常
+		MTime       time.Time   `db:"m_time"`
+	}
+)
+
+func newDcProjectConfigModel(conn sqlx.SqlConn) *defaultDcProjectConfigModel {
+	return &defaultDcProjectConfigModel{
+		conn:  conn,
+		table: "`dc_project_config`",
+	}
+}
+
+func (m *defaultDcProjectConfigModel) withSession(session sqlx.Session) *defaultDcProjectConfigModel {
+	return &defaultDcProjectConfigModel{
+		conn:  sqlx.NewSqlConnFromSession(session),
+		table: "`dc_project_config`",
+	}
+}
+
+func (m *defaultDcProjectConfigModel) FindAllByPage(ctx context.Context, offset, limit int64) ([]DcProjectConfig, error) {
+	var resp []DcProjectConfig
+	query := fmt.Sprintf("select %s from %s where `status`=1 order by id desc limit %d, %d", dcProjectConfigRows, m.table, offset, limit)
+	err := m.conn.QueryRowsCtx(ctx, &resp, query)
+	switch err {
+	case nil:
+		return resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultDcProjectConfigModel) Delete(ctx context.Context, id int64) error {
+	query := fmt.Sprintf("delete from %s where `id` = ?", m.table)
+	_, err := m.conn.ExecCtx(ctx, query, id)
+	return err
+}
+
+func (m *defaultDcProjectConfigModel) FindOne(ctx context.Context, id int64) (*DcProjectConfig, error) {
+	query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", dcProjectConfigRows, m.table)
+	var resp DcProjectConfig
+	err := m.conn.QueryRowCtx(ctx, &resp, query, id)
+	switch err {
+	case nil:
+		return &resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultDcProjectConfigModel) FindOneByProjectId(ctx context.Context, projectId int64) (*DcProjectConfig, error) {
+	var resp DcProjectConfig
+	query := fmt.Sprintf("select %s from %s where `project_id` = ? limit 1", dcProjectConfigRows, m.table)
+	err := m.conn.QueryRowCtx(ctx, &resp, query, projectId)
+	switch err {
+	case nil:
+		return &resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultDcProjectConfigModel) FindAll(ctx context.Context) ([]DcProjectConfig, error) {
+	var resp []DcProjectConfig
+	query := fmt.Sprintf("select %s from %s", dcProjectConfigRows, m.table)
+	err := m.conn.QueryRowsCtx(ctx, &resp, query)
+	switch err {
+	case nil:
+		return resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultDcProjectConfigModel) Insert(ctx context.Context, data *DcProjectConfig) (sql.Result, error) {
+	query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?)", m.table, dcProjectConfigRowsExpectAutoSet)
+	ret, err := m.conn.ExecCtx(ctx, query, data.ProjectId, data.Technologys, data.Status, data.MTime)
+	return ret, err
+}
+
+func (m *defaultDcProjectConfigModel) Update(ctx context.Context, newData *DcProjectConfig) error {
+	query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, dcProjectConfigRowsWithPlaceHolder)
+	_, err := m.conn.ExecCtx(ctx, query, newData.ProjectId, newData.Technologys, newData.Status, newData.MTime, newData.Id)
+	return err
+}
+
+func (c *DcProjectConfig) IsEnabled() bool {
+	return c.Status == 1
+}
+
+func (m *defaultDcProjectConfigModel) tableName() string {
+	return m.table
+}

+ 24 - 0
app/model/dcWorkingChestModel.go

@@ -0,0 +1,24 @@
+package model
+
+import "github.com/zeromicro/go-zero/core/stores/sqlx"
+
+var _ DcWorkingChestModel = (*customDcWorkingChestModel)(nil)
+
+type (
+	// DcWorkingChestModel is an interface to be customized, add more methods here,
+	// and implement the added methods in customDcWorkingChestModel.
+	DcWorkingChestModel interface {
+		dcWorkingChestModel
+	}
+
+	customDcWorkingChestModel struct {
+		*defaultDcWorkingChestModel
+	}
+)
+
+// NewDcWorkingChestModel returns a model for the database table.
+func NewDcWorkingChestModel(conn sqlx.SqlConn) DcWorkingChestModel {
+	return &customDcWorkingChestModel{
+		defaultDcWorkingChestModel: newDcWorkingChestModel(conn),
+	}
+}

+ 117 - 0
app/model/dcWorkingChestModel_gen.go

@@ -0,0 +1,117 @@
+// Code generated by goctl. DO NOT EDIT.
+
+package model
+
+import (
+	"context"
+	"database/sql"
+	"fmt"
+	"strings"
+	"time"
+
+	"github.com/zeromicro/go-zero/core/stores/builder"
+	"github.com/zeromicro/go-zero/core/stores/sqlc"
+	"github.com/zeromicro/go-zero/core/stores/sqlx"
+	"github.com/zeromicro/go-zero/core/stringx"
+)
+
+var (
+	dcWorkingChestFieldNames          = builder.RawFieldNames(&DcWorkingChest{})
+	dcWorkingChestRows                = strings.Join(dcWorkingChestFieldNames, ",")
+	dcWorkingChestRowsExpectAutoSet   = strings.Join(stringx.Remove(dcWorkingChestFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), ",")
+	dcWorkingChestRowsWithPlaceHolder = strings.Join(stringx.Remove(dcWorkingChestFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), "=?,") + "=?"
+)
+
+type (
+	dcWorkingChestModel interface {
+		MultiInsert(ctx context.Context, datas []DcWorkingChest) (int64, error)
+		Insert(ctx context.Context, data *DcWorkingChest) (sql.Result, error)
+		FindOne(ctx context.Context, id int64) (*DcWorkingChest, error)
+		Update(ctx context.Context, data *DcWorkingChest) error
+		Delete(ctx context.Context, id int64) error
+	}
+
+	defaultDcWorkingChestModel struct {
+		conn  sqlx.SqlConn
+		table string
+	}
+
+	DcWorkingChest struct {
+		Id                  int64     `db:"id"`
+		ProjectId           int64     `db:"project_id"`
+		DeviceCode          string    `db:"device_code"`
+		Switch              int64     `db:"switch"`                // 药箱液位开关 0: 关 1: 开
+		Level               float64   `db:"level"`                 // 液位高度
+		AgitatorStatus      int64     `db:"agitator_status"`       // 搅拌器运行状态 0: 未运行 1:运行中
+		AgitatorDuration    int64     `db:"agitator_duration"`     // 搅拌器运行时长
+		AgitatorFaultStatus int64     `db:"agitator_fault_status"` // 搅拌器故障状态 0:正常 1:故障
+		CTime               time.Time `db:"c_time"`
+	}
+)
+
+func newDcWorkingChestModel(conn sqlx.SqlConn) *defaultDcWorkingChestModel {
+	return &defaultDcWorkingChestModel{
+		conn:  conn,
+		table: "`dc_working_chest`",
+	}
+}
+
+func (m *defaultDcWorkingChestModel) withSession(session sqlx.Session) *defaultDcWorkingChestModel {
+	return &defaultDcWorkingChestModel{
+		conn:  sqlx.NewSqlConnFromSession(session),
+		table: "`dc_working_chest`",
+	}
+}
+
+func (m *defaultDcWorkingChestModel) Delete(ctx context.Context, id int64) error {
+	query := fmt.Sprintf("delete from %s where `id` = ?", m.table)
+	_, err := m.conn.ExecCtx(ctx, query, id)
+	return err
+}
+
+func (m *defaultDcWorkingChestModel) FindOne(ctx context.Context, id int64) (*DcWorkingChest, error) {
+	query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", dcWorkingChestRows, m.table)
+	var resp DcWorkingChest
+	err := m.conn.QueryRowCtx(ctx, &resp, query, id)
+	switch err {
+	case nil:
+		return &resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultDcWorkingChestModel) MultiInsert(ctx context.Context, datas []DcWorkingChest) (int64, error) {
+	query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?)", m.table, dcWorkingChestRowsExpectAutoSet)
+
+	if bulk, err := sqlx.NewBulkInserter(m.conn, query);err == nil {
+		for _, data := range datas {
+			if err = bulk.Insert(data.ProjectId, data.DeviceCode, data.Switch, data.Level, data.AgitatorStatus, data.AgitatorDuration, data.AgitatorFaultStatus, data.CTime);err != nil {
+				return 0, err
+			}
+		}
+
+		bulk.Flush()
+		return int64(len(datas)), nil
+	} else {
+		return 0, err
+	}
+}
+
+func (m *defaultDcWorkingChestModel) Insert(ctx context.Context, data *DcWorkingChest) (sql.Result, error) {
+	query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?)", m.table, dcWorkingChestRowsExpectAutoSet)
+	ret, err := m.conn.ExecCtx(ctx, query, data.ProjectId, data.DeviceCode, data.Switch, data.Level, data.AgitatorStatus, data.AgitatorDuration, data.AgitatorFaultStatus, data.CTime)
+	return ret, err
+}
+
+func (m *defaultDcWorkingChestModel) Update(ctx context.Context, data *DcWorkingChest) error {
+	query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, dcWorkingChestRowsWithPlaceHolder)
+	_, err := m.conn.ExecCtx(ctx, query, data.ProjectId, data.DeviceCode, data.Switch, data.Level, data.AgitatorStatus, data.AgitatorDuration, data.AgitatorFaultStatus, data.CTime, data.Id)
+	return err
+}
+
+func (m *defaultDcWorkingChestModel) tableName() string {
+	return m.table
+}

+ 24 - 0
app/model/dcWorkingMfModel.go

@@ -0,0 +1,24 @@
+package model
+
+import "github.com/zeromicro/go-zero/core/stores/sqlx"
+
+var _ DcWorkingMfModel = (*customDcWorkingMfModel)(nil)
+
+type (
+	// DcWorkingMfModel is an interface to be customized, add more methods here,
+	// and implement the added methods in customDcWorkingMfModel.
+	DcWorkingMfModel interface {
+		dcWorkingMfModel
+	}
+
+	customDcWorkingMfModel struct {
+		*defaultDcWorkingMfModel
+	}
+)
+
+// NewDcWorkingMfModel returns a model for the database table.
+func NewDcWorkingMfModel(conn sqlx.SqlConn) DcWorkingMfModel {
+	return &customDcWorkingMfModel{
+		defaultDcWorkingMfModel: newDcWorkingMfModel(conn),
+	}
+}

+ 137 - 0
app/model/dcWorkingMfModel_gen.go

@@ -0,0 +1,137 @@
+// Code generated by goctl. DO NOT EDIT.
+
+package model
+
+import (
+	"context"
+	"database/sql"
+	"fmt"
+	"strings"
+	"time"
+
+	"github.com/zeromicro/go-zero/core/stores/builder"
+	"github.com/zeromicro/go-zero/core/stores/sqlc"
+	"github.com/zeromicro/go-zero/core/stores/sqlx"
+	"github.com/zeromicro/go-zero/core/stringx"
+)
+
+var (
+	dcWorkingMfFieldNames          = builder.RawFieldNames(&DcWorkingMf{})
+	dcWorkingMfRows                = strings.Join(dcWorkingMfFieldNames, ",")
+	dcWorkingMfRowsExpectAutoSet   = strings.Join(stringx.Remove(dcWorkingMfFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), ",")
+	dcWorkingMfRowsWithPlaceHolder = strings.Join(stringx.Remove(dcWorkingMfFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), "=?,") + "=?"
+)
+
+type (
+	dcWorkingMfModel interface {
+		MultiInsert(ctx context.Context, datas []DcWorkingMf) (int64, error)
+		Insert(ctx context.Context, data *DcWorkingMf) (sql.Result, error)
+		FindOne(ctx context.Context, id int64) (*DcWorkingMf, error)
+		Update(ctx context.Context, data *DcWorkingMf) error
+		Delete(ctx context.Context, id int64) error
+	}
+
+	defaultDcWorkingMfModel struct {
+		conn  sqlx.SqlConn
+		table string
+	}
+
+	DcWorkingMf struct {
+		Id               int64         `db:"id"`
+		ProjectId        int64         `db:"project_id"`
+		DeviceCode       string        `db:"device_code"`
+		WaterTemperature float64       `db:"water_temperature"` // 水温 摄氏度
+		FeedFlow         float64       `db:"feed_flow"`         // 进水流量
+		ConFlow          float64       `db:"con_flow"`          // 浓水流量
+		ProductFlow      float64       `db:"product_flow"`      // 产水流量
+		FeedPressure     float64       `db:"feed_pressure"`     // 进水压力
+		ConPressure      float64       `db:"con_pressure"`      // 浓水压力
+		ProductPressure  float64       `db:"product_pressure"`  // 产水压力
+		Tmp              float64       `db:"tmp"`               // 跨膜压差
+		Flux             float64       `db:"flux"`              // 膜通量
+		FeedWqTurbidity  float64       `db:"feed_wq_turbidity"` // 进水浊度
+		FeedWqPh         int64         `db:"feed_wq_ph"`        // 进水 PH 值
+		ProductWqPh      int64         `db:"product_wq_ph"`     // 产水 PH 值
+		FeedWqAl         float64       `db:"feed_wq_al"`        // 进水水质:铝
+		ProductWqAl      float64       `db:"product_wq_al"`     // 产水水质:铝
+		FeedWqFe         float64       `db:"feed_wq_fe"`        // 进水水质:铁
+		ProductWqFe      float64       `db:"product_wq_fe"`     // 产水水质:铁
+		FeedWqMn         float64       `db:"feed_wq_mn"`        // 进水水质:锰
+		ProductWqMn      float64       `db:"product_wq_mn"`     // 产水水质:锰
+		FeedWqSio2       float64       `db:"feed_wq_sio2"`      // 进水水质:二氧化硅
+		ProductWqSio2    float64       `db:"product_wq_sio2"`   // 产水水质:二氧化硅
+		FeedWqCod        float64       `db:"feed_wq_cod"`       // 进水水质:COD
+		ProductWqCod     float64       `db:"product_wq_cod"`    // 产水水质:COD
+		FeedWqP          float64       `db:"feed_wq_p"`         // 进水水质:磷
+		ProductWqP       float64       `db:"product_wq_p"`      // 产水水质:磷
+		Step             int64 `db:"step"`              // 设备当前步序值
+		CTime            time.Time     `db:"c_time"`
+	}
+)
+
+func newDcWorkingMfModel(conn sqlx.SqlConn) *defaultDcWorkingMfModel {
+	return &defaultDcWorkingMfModel{
+		conn:  conn,
+		table: "`dc_working_mf`",
+	}
+}
+
+func (m *defaultDcWorkingMfModel) withSession(session sqlx.Session) *defaultDcWorkingMfModel {
+	return &defaultDcWorkingMfModel{
+		conn:  sqlx.NewSqlConnFromSession(session),
+		table: "`dc_working_mf`",
+	}
+}
+
+func (m *defaultDcWorkingMfModel) Delete(ctx context.Context, id int64) error {
+	query := fmt.Sprintf("delete from %s where `id` = ?", m.table)
+	_, err := m.conn.ExecCtx(ctx, query, id)
+	return err
+}
+
+func (m *defaultDcWorkingMfModel) FindOne(ctx context.Context, id int64) (*DcWorkingMf, error) {
+	query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", dcWorkingMfRows, m.table)
+	var resp DcWorkingMf
+	err := m.conn.QueryRowCtx(ctx, &resp, query, id)
+	switch err {
+	case nil:
+		return &resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultDcWorkingMfModel) MultiInsert(ctx context.Context, datas []DcWorkingMf) (int64, error) {
+	query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, dcWorkingMfRowsExpectAutoSet)
+
+	if bulk, err := sqlx.NewBulkInserter(m.conn, query);err == nil {
+		for _, data := range datas {
+			if err = bulk.Insert(data.ProjectId, data.DeviceCode, data.WaterTemperature, data.FeedFlow, data.ConFlow, data.ProductFlow, data.FeedPressure, data.ConPressure, data.ProductPressure, data.Tmp, data.Flux, data.FeedWqTurbidity, data.FeedWqPh, data.ProductWqPh, data.FeedWqAl, data.ProductWqAl, data.FeedWqFe, data.ProductWqFe, data.FeedWqMn, data.ProductWqMn, data.FeedWqSio2, data.ProductWqSio2, data.FeedWqCod, data.ProductWqCod, data.FeedWqP, data.ProductWqP, data.Step, data.CTime);err != nil {
+				return 0, err
+			}
+		}
+
+		bulk.Flush()
+		return int64(len(datas)), nil
+	} else {
+		return 0, err
+	}
+}
+
+func (m *defaultDcWorkingMfModel) Insert(ctx context.Context, data *DcWorkingMf) (sql.Result, error) {
+	query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, dcWorkingMfRowsExpectAutoSet)
+	ret, err := m.conn.ExecCtx(ctx, query, data.ProjectId, data.DeviceCode, data.WaterTemperature, data.FeedFlow, data.ConFlow, data.ProductFlow, data.FeedPressure, data.ConPressure, data.ProductPressure, data.Tmp, data.Flux, data.FeedWqTurbidity, data.FeedWqPh, data.ProductWqPh, data.FeedWqAl, data.ProductWqAl, data.FeedWqFe, data.ProductWqFe, data.FeedWqMn, data.ProductWqMn, data.FeedWqSio2, data.ProductWqSio2, data.FeedWqCod, data.ProductWqCod, data.FeedWqP, data.ProductWqP, data.Step, data.CTime)
+	return ret, err
+}
+
+func (m *defaultDcWorkingMfModel) Update(ctx context.Context, data *DcWorkingMf) error {
+	query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, dcWorkingMfRowsWithPlaceHolder)
+	_, err := m.conn.ExecCtx(ctx, query, data.ProjectId, data.DeviceCode, data.WaterTemperature, data.FeedFlow, data.ConFlow, data.ProductFlow, data.FeedPressure, data.ConPressure, data.ProductPressure, data.Tmp, data.Flux, data.FeedWqTurbidity, data.FeedWqPh, data.ProductWqPh, data.FeedWqAl, data.ProductWqAl, data.FeedWqFe, data.ProductWqFe, data.FeedWqMn, data.ProductWqMn, data.FeedWqSio2, data.ProductWqSio2, data.FeedWqCod, data.ProductWqCod, data.FeedWqP, data.ProductWqP, data.Step, data.CTime, data.Id)
+	return err
+}
+
+func (m *defaultDcWorkingMfModel) tableName() string {
+	return m.table
+}

+ 24 - 0
app/model/dcWorkingNfModel.go

@@ -0,0 +1,24 @@
+package model
+
+import "github.com/zeromicro/go-zero/core/stores/sqlx"
+
+var _ DcWorkingNfModel = (*customDcWorkingNfModel)(nil)
+
+type (
+	// DcWorkingNfModel is an interface to be customized, add more methods here,
+	// and implement the added methods in customDcWorkingNfModel.
+	DcWorkingNfModel interface {
+		dcWorkingNfModel
+	}
+
+	customDcWorkingNfModel struct {
+		*defaultDcWorkingNfModel
+	}
+)
+
+// NewDcWorkingNfModel returns a model for the database table.
+func NewDcWorkingNfModel(conn sqlx.SqlConn) DcWorkingNfModel {
+	return &customDcWorkingNfModel{
+		defaultDcWorkingNfModel: newDcWorkingNfModel(conn),
+	}
+}

+ 156 - 0
app/model/dcWorkingNfModel_gen.go

@@ -0,0 +1,156 @@
+// Code generated by goctl. DO NOT EDIT.
+
+package model
+
+import (
+	"context"
+	"database/sql"
+	"fmt"
+	"strings"
+	"time"
+
+	"github.com/zeromicro/go-zero/core/stores/builder"
+	"github.com/zeromicro/go-zero/core/stores/sqlc"
+	"github.com/zeromicro/go-zero/core/stores/sqlx"
+	"github.com/zeromicro/go-zero/core/stringx"
+)
+
+var (
+	dcWorkingNfFieldNames          = builder.RawFieldNames(&DcWorkingNf{})
+	dcWorkingNfRows                = strings.Join(dcWorkingNfFieldNames, ",")
+	dcWorkingNfRowsExpectAutoSet   = strings.Join(stringx.Remove(dcWorkingNfFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), ",")
+	dcWorkingNfRowsWithPlaceHolder = strings.Join(stringx.Remove(dcWorkingNfFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), "=?,") + "=?"
+)
+
+type (
+	dcWorkingNfModel interface {
+		MultiInsert(ctx context.Context, datas []DcWorkingNf) (int64, error)
+		Insert(ctx context.Context, data *DcWorkingNf) (sql.Result, error)
+		FindOne(ctx context.Context, id int64) (*DcWorkingNf, error)
+		Update(ctx context.Context, data *DcWorkingNf) error
+		Delete(ctx context.Context, id int64) error
+	}
+
+	defaultDcWorkingNfModel struct {
+		conn  sqlx.SqlConn
+		table string
+	}
+
+	DcWorkingNf struct {
+		Id                 int64         `db:"id"`
+		ProjectId          int64         `db:"project_id"`
+		DeviceCode         string        `db:"device_code"`
+		WaterTemperature   float64       `db:"water_temperature"`    // 水温 摄氏度
+		FeedFlow1St        float64       `db:"feed_flow_1st"`        // 一段进水流量
+		ConFlow1St         float64       `db:"con_flow_1st"`         // 一段浓水流量
+		ProductFlow1St     float64       `db:"product_flow_1st"`     // 一段产水流量
+		FeedPressure1St    float64       `db:"feed_pressure_1st"`    // 一段进水压力
+		ConPressure1St     float64       `db:"con_pressure_1st"`     // 一段浓水压力
+		ProductPressure1St float64       `db:"product_pressure_1st"` // 一段产水压力
+		Tmp1St             float64       `db:"tmp_1st"`              // 一段跨膜压差
+		Flux1St            float64       `db:"flux_1st"`             // 一段膜通量
+		Permeability1St    float64       `db:"permeability_1st"`     // 一段渗透率
+		FeedFlow2Nd        float64       `db:"feed_flow_2nd"`        // 二段进水流量
+		ConFlow2Nd         float64       `db:"con_flow_2nd"`         // 二段浓水流量
+		ProductFlow2Nd     float64       `db:"product_flow_2nd"`     // 二段产水流量
+		FeedPressure2Nd    float64       `db:"feed_pressure_2nd"`    // 二段进水压力
+		ConPressure2Nd     float64       `db:"con_pressure_2nd"`     // 二段浓水压力
+		ProductPressure2Nd float64       `db:"product_pressure_2nd"` // 二段产水压力
+		Tmp2Nd             float64       `db:"tmp_2nd"`              // 二段压差
+		Flux2Nd            float64       `db:"flux_2nd"`             // 二段通量
+		Permeability2Nd    float64       `db:"permeability_2nd"`     // 二段渗透率
+		FeedFlow3Th        float64       `db:"feed_flow_3th"`        // 三段进水流量
+		ConFlow3Th         float64       `db:"con_flow_3th"`         // 三段浓水流量
+		ProductFlow3Th     float64       `db:"product_flow_3th"`     // 三段产水流量
+		FeedPressure3Th    float64       `db:"feed_pressure_3th"`    // 三段进水压力
+		ConPressure3Th     float64       `db:"con_pressure_3th"`     // 三段浓水压力
+		ProductPressure3Th float64       `db:"product_pressure_3th"` // 三段产水压力
+		Tmp3Th             float64       `db:"tmp_3th"`              // 三段压差
+		Flux3Th            float64       `db:"flux_3th"`             // 三段通量
+		Permeability3Th    float64       `db:"permeability_3th"`     // 三段渗透率
+		FeedWqTurbidity    float64       `db:"feed_wq_turbidity"`    // 进水浊度
+		FeedWqPh           int64         `db:"feed_wq_ph"`           // 进水 PH 值
+		ProductWqPh        int64         `db:"product_wq_ph"`        // 产水 PH 值
+		FeedWqAl           float64       `db:"feed_wq_al"`           // 进水水质:铝
+		ProductWqAl        float64       `db:"product_wq_al"`        // 产水水质:铝
+		FeedWqFe           float64       `db:"feed_wq_fe"`           // 进水水质:铁
+		ProductWqFe        float64       `db:"product_wq_fe"`        // 产水水质:铁
+		FeedWqMn           float64       `db:"feed_wq_mn"`           // 进水水质:锰
+		ProductWqMn        float64       `db:"product_wq_mn"`        // 产水水质:锰
+		FeedWqSio2         float64       `db:"feed_wq_sio2"`         // 进水水质:二氧化硅
+		ProductWqSio2      float64       `db:"product_wq_sio2"`      // 产水水质:二氧化硅
+		FeedWqCod          float64       `db:"feed_wq_cod"`          // 进水水质:COD
+		ProductWqCod       float64       `db:"product_wq_cod"`       // 产水水质:COD
+		FeedWqP            float64       `db:"feed_wq_p"`            // 进水水质:磷
+		ProductWqP         float64       `db:"product_wq_p"`         // 产水水质:磷
+		Step               int64 `db:"step"`                 // 设备当前步序值
+		CTime              time.Time     `db:"c_time"`
+	}
+)
+
+func newDcWorkingNfModel(conn sqlx.SqlConn) *defaultDcWorkingNfModel {
+	return &defaultDcWorkingNfModel{
+		conn:  conn,
+		table: "`dc_working_nf`",
+	}
+}
+
+func (m *defaultDcWorkingNfModel) withSession(session sqlx.Session) *defaultDcWorkingNfModel {
+	return &defaultDcWorkingNfModel{
+		conn:  sqlx.NewSqlConnFromSession(session),
+		table: "`dc_working_nf`",
+	}
+}
+
+func (m *defaultDcWorkingNfModel) Delete(ctx context.Context, id int64) error {
+	query := fmt.Sprintf("delete from %s where `id` = ?", m.table)
+	_, err := m.conn.ExecCtx(ctx, query, id)
+	return err
+}
+
+func (m *defaultDcWorkingNfModel) FindOne(ctx context.Context, id int64) (*DcWorkingNf, error) {
+	query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", dcWorkingNfRows, m.table)
+	var resp DcWorkingNf
+	err := m.conn.QueryRowCtx(ctx, &resp, query, id)
+	switch err {
+	case nil:
+		return &resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultDcWorkingNfModel) MultiInsert(ctx context.Context, datas []DcWorkingNf) (int64, error) {
+	query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, dcWorkingNfRowsExpectAutoSet)
+
+	if bulk, err := sqlx.NewBulkInserter(m.conn, query);err == nil {
+		for _, data := range datas {
+			if err = bulk.Insert(data.ProjectId, data.DeviceCode, data.WaterTemperature, data.FeedFlow1St, data.ConFlow1St, data.ProductFlow1St, data.FeedPressure1St, data.ConPressure1St, data.ProductPressure1St, data.Tmp1St, data.Flux1St, data.Permeability1St, data.FeedFlow2Nd, data.ConFlow2Nd, data.ProductFlow2Nd, data.FeedPressure2Nd, data.ConPressure2Nd, data.ProductPressure2Nd, data.Tmp2Nd, data.Flux2Nd, data.Permeability2Nd, data.FeedFlow3Th, data.ConFlow3Th, data.ProductFlow3Th, data.FeedPressure3Th, data.ConPressure3Th, data.ProductPressure3Th, data.Tmp3Th, data.Flux3Th, data.Permeability3Th, data.FeedWqTurbidity, data.FeedWqPh, data.ProductWqPh, data.FeedWqAl, data.ProductWqAl, data.FeedWqFe, data.ProductWqFe, data.FeedWqMn, data.ProductWqMn, data.FeedWqSio2, data.ProductWqSio2, data.FeedWqCod, data.ProductWqCod, data.FeedWqP, data.ProductWqP, data.Step, data.CTime);err != nil {
+				return 0, err
+			}
+		}
+
+		bulk.Flush()
+		return int64(len(datas)), nil
+	} else {
+		return 0, err
+	}
+}
+
+func (m *defaultDcWorkingNfModel) Insert(ctx context.Context, data *DcWorkingNf) (sql.Result, error) {
+	query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, dcWorkingNfRowsExpectAutoSet)
+	ret, err := m.conn.ExecCtx(ctx, query, data.ProjectId, data.DeviceCode, data.WaterTemperature, data.FeedFlow1St, data.ConFlow1St, data.ProductFlow1St, data.FeedPressure1St, data.ConPressure1St, data.ProductPressure1St, data.Tmp1St, data.Flux1St, data.Permeability1St, data.FeedFlow2Nd, data.ConFlow2Nd, data.ProductFlow2Nd, data.FeedPressure2Nd, data.ConPressure2Nd, data.ProductPressure2Nd, data.Tmp2Nd, data.Flux2Nd, data.Permeability2Nd, data.FeedFlow3Th, data.ConFlow3Th, data.ProductFlow3Th, data.FeedPressure3Th, data.ConPressure3Th, data.ProductPressure3Th, data.Tmp3Th, data.Flux3Th, data.Permeability3Th, data.FeedWqTurbidity, data.FeedWqPh, data.ProductWqPh, data.FeedWqAl, data.ProductWqAl, data.FeedWqFe, data.ProductWqFe, data.FeedWqMn, data.ProductWqMn, data.FeedWqSio2, data.ProductWqSio2, data.FeedWqCod, data.ProductWqCod, data.FeedWqP, data.ProductWqP, data.Step, data.CTime)
+	return ret, err
+}
+
+func (m *defaultDcWorkingNfModel) Update(ctx context.Context, data *DcWorkingNf) error {
+	query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, dcWorkingNfRowsWithPlaceHolder)
+	_, err := m.conn.ExecCtx(ctx, query, data.ProjectId, data.DeviceCode, data.WaterTemperature, data.FeedFlow1St, data.ConFlow1St, data.ProductFlow1St, data.FeedPressure1St, data.ConPressure1St, data.ProductPressure1St, data.Tmp1St, data.Flux1St, data.Permeability1St, data.FeedFlow2Nd, data.ConFlow2Nd, data.ProductFlow2Nd, data.FeedPressure2Nd, data.ConPressure2Nd, data.ProductPressure2Nd, data.Tmp2Nd, data.Flux2Nd, data.Permeability2Nd, data.FeedFlow3Th, data.ConFlow3Th, data.ProductFlow3Th, data.FeedPressure3Th, data.ConPressure3Th, data.ProductPressure3Th, data.Tmp3Th, data.Flux3Th, data.Permeability3Th, data.FeedWqTurbidity, data.FeedWqPh, data.ProductWqPh, data.FeedWqAl, data.ProductWqAl, data.FeedWqFe, data.ProductWqFe, data.FeedWqMn, data.ProductWqMn, data.FeedWqSio2, data.ProductWqSio2, data.FeedWqCod, data.ProductWqCod, data.FeedWqP, data.ProductWqP, data.Step, data.CTime, data.Id)
+	return err
+}
+
+func (m *defaultDcWorkingNfModel) tableName() string {
+	return m.table
+}

+ 24 - 0
app/model/dcWorkingPumpModel.go

@@ -0,0 +1,24 @@
+package model
+
+import "github.com/zeromicro/go-zero/core/stores/sqlx"
+
+var _ DcWorkingPumpModel = (*customDcWorkingPumpModel)(nil)
+
+type (
+	// DcWorkingPumpModel is an interface to be customized, add more methods here,
+	// and implement the added methods in customDcWorkingPumpModel.
+	DcWorkingPumpModel interface {
+		dcWorkingPumpModel
+	}
+
+	customDcWorkingPumpModel struct {
+		*defaultDcWorkingPumpModel
+	}
+)
+
+// NewDcWorkingPumpModel returns a model for the database table.
+func NewDcWorkingPumpModel(conn sqlx.SqlConn) DcWorkingPumpModel {
+	return &customDcWorkingPumpModel{
+		defaultDcWorkingPumpModel: newDcWorkingPumpModel(conn),
+	}
+}

+ 121 - 0
app/model/dcWorkingPumpModel_gen.go

@@ -0,0 +1,121 @@
+// Code generated by goctl. DO NOT EDIT.
+
+package model
+
+import (
+	"context"
+	"database/sql"
+	"fmt"
+	"strings"
+	"time"
+
+	"github.com/zeromicro/go-zero/core/stores/builder"
+	"github.com/zeromicro/go-zero/core/stores/sqlc"
+	"github.com/zeromicro/go-zero/core/stores/sqlx"
+	"github.com/zeromicro/go-zero/core/stringx"
+)
+
+var (
+	dcWorkingPumpFieldNames          = builder.RawFieldNames(&DcWorkingPump{})
+	dcWorkingPumpRows                = strings.Join(dcWorkingPumpFieldNames, ",")
+	dcWorkingPumpRowsExpectAutoSet   = strings.Join(stringx.Remove(dcWorkingPumpFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), ",")
+	dcWorkingPumpRowsWithPlaceHolder = strings.Join(stringx.Remove(dcWorkingPumpFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), "=?,") + "=?"
+)
+
+type (
+	dcWorkingPumpModel interface {
+		MultiInsert(ctx context.Context, datas []DcWorkingPump) (int64, error)
+		Insert(ctx context.Context, data *DcWorkingPump) (sql.Result, error)
+		FindOne(ctx context.Context, id int64) (*DcWorkingPump, error)
+		Update(ctx context.Context, data *DcWorkingPump) error
+		Delete(ctx context.Context, id int64) error
+	}
+
+	defaultDcWorkingPumpModel struct {
+		conn  sqlx.SqlConn
+		table string
+	}
+
+	DcWorkingPump struct {
+		Id           int64     `db:"id"`
+		ProjectId    int64     `db:"project_id"`
+		DeviceCode   string    `db:"device_code"`
+		FeedPressure float64   `db:"feed_pressure"` // 进水压力
+		OutPressure  float64   `db:"out_pressure"`  // 出水压力
+		Duration     int64     `db:"duration"`      // 运行时长 单位 s
+		Current      float64   `db:"current"`       // 运行电流
+		Frequency    float64   `db:"frequency"`     // 运行频率
+		Lift         float64   `db:"lift"`          // 工作扬程
+		Efficiency   float64   `db:"efficiency"`    // 运行效率
+		RunStatus    int64     `db:"run_status"`    // 运行状态 0: 停机 1: 运行正常
+		FaultStatus  int64     `db:"fault_status"`  // 故障状态 0: 正常 1: 故障
+		CTime        time.Time `db:"c_time"`
+	}
+)
+
+func newDcWorkingPumpModel(conn sqlx.SqlConn) *defaultDcWorkingPumpModel {
+	return &defaultDcWorkingPumpModel{
+		conn:  conn,
+		table: "`dc_working_pump`",
+	}
+}
+
+func (m *defaultDcWorkingPumpModel) withSession(session sqlx.Session) *defaultDcWorkingPumpModel {
+	return &defaultDcWorkingPumpModel{
+		conn:  sqlx.NewSqlConnFromSession(session),
+		table: "`dc_working_pump`",
+	}
+}
+
+func (m *defaultDcWorkingPumpModel) Delete(ctx context.Context, id int64) error {
+	query := fmt.Sprintf("delete from %s where `id` = ?", m.table)
+	_, err := m.conn.ExecCtx(ctx, query, id)
+	return err
+}
+
+func (m *defaultDcWorkingPumpModel) FindOne(ctx context.Context, id int64) (*DcWorkingPump, error) {
+	query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", dcWorkingPumpRows, m.table)
+	var resp DcWorkingPump
+	err := m.conn.QueryRowCtx(ctx, &resp, query, id)
+	switch err {
+	case nil:
+		return &resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultDcWorkingPumpModel) MultiInsert(ctx context.Context, datas []DcWorkingPump) (int64, error) {
+	query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, dcWorkingPumpRowsExpectAutoSet)
+
+	if bulk, err := sqlx.NewBulkInserter(m.conn, query);err == nil {
+		for _, data := range datas {
+			if err = bulk.Insert(data.ProjectId, data.DeviceCode, data.FeedPressure, data.OutPressure, data.Duration, data.Current, data.Frequency, data.Lift, data.Efficiency, data.RunStatus, data.FaultStatus, data.CTime);err != nil {
+				return 0, err
+			}
+		}
+
+		bulk.Flush()
+		return int64(len(datas)), nil
+	} else {
+		return 0, err
+	}
+}
+
+func (m *defaultDcWorkingPumpModel) Insert(ctx context.Context, data *DcWorkingPump) (sql.Result, error) {
+	query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, dcWorkingPumpRowsExpectAutoSet)
+	ret, err := m.conn.ExecCtx(ctx, query, data.ProjectId, data.DeviceCode, data.FeedPressure, data.OutPressure, data.Duration, data.Current, data.Frequency, data.Lift, data.Efficiency, data.RunStatus, data.FaultStatus, data.CTime)
+	return ret, err
+}
+
+func (m *defaultDcWorkingPumpModel) Update(ctx context.Context, data *DcWorkingPump) error {
+	query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, dcWorkingPumpRowsWithPlaceHolder)
+	_, err := m.conn.ExecCtx(ctx, query, data.ProjectId, data.DeviceCode, data.FeedPressure, data.OutPressure, data.Duration, data.Current, data.Frequency, data.Lift, data.Efficiency, data.RunStatus, data.FaultStatus, data.CTime, data.Id)
+	return err
+}
+
+func (m *defaultDcWorkingPumpModel) tableName() string {
+	return m.table
+}

+ 24 - 0
app/model/dcWorkingRoModel.go

@@ -0,0 +1,24 @@
+package model
+
+import "github.com/zeromicro/go-zero/core/stores/sqlx"
+
+var _ DcWorkingRoModel = (*customDcWorkingRoModel)(nil)
+
+type (
+	// DcWorkingRoModel is an interface to be customized, add more methods here,
+	// and implement the added methods in customDcWorkingRoModel.
+	DcWorkingRoModel interface {
+		dcWorkingRoModel
+	}
+
+	customDcWorkingRoModel struct {
+		*defaultDcWorkingRoModel
+	}
+)
+
+// NewDcWorkingRoModel returns a model for the database table.
+func NewDcWorkingRoModel(conn sqlx.SqlConn) DcWorkingRoModel {
+	return &customDcWorkingRoModel{
+		defaultDcWorkingRoModel: newDcWorkingRoModel(conn),
+	}
+}

+ 156 - 0
app/model/dcWorkingRoModel_gen.go

@@ -0,0 +1,156 @@
+// Code generated by goctl. DO NOT EDIT.
+
+package model
+
+import (
+	"context"
+	"database/sql"
+	"fmt"
+	"strings"
+	"time"
+
+	"github.com/zeromicro/go-zero/core/stores/builder"
+	"github.com/zeromicro/go-zero/core/stores/sqlc"
+	"github.com/zeromicro/go-zero/core/stores/sqlx"
+	"github.com/zeromicro/go-zero/core/stringx"
+)
+
+var (
+	dcWorkingRoFieldNames          = builder.RawFieldNames(&DcWorkingRo{})
+	dcWorkingRoRows                = strings.Join(dcWorkingRoFieldNames, ",")
+	dcWorkingRoRowsExpectAutoSet   = strings.Join(stringx.Remove(dcWorkingRoFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), ",")
+	dcWorkingRoRowsWithPlaceHolder = strings.Join(stringx.Remove(dcWorkingRoFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), "=?,") + "=?"
+)
+
+type (
+	dcWorkingRoModel interface {
+		MultiInsert(ctx context.Context, datas []DcWorkingRo) (int64, error)
+		Insert(ctx context.Context, data *DcWorkingRo) (sql.Result, error)
+		FindOne(ctx context.Context, id int64) (*DcWorkingRo, error)
+		Update(ctx context.Context, data *DcWorkingRo) error
+		Delete(ctx context.Context, id int64) error
+	}
+
+	defaultDcWorkingRoModel struct {
+		conn  sqlx.SqlConn
+		table string
+	}
+
+	DcWorkingRo struct {
+		Id                 int64         `db:"id"`
+		ProjectId          int64         `db:"project_id"`
+		DeviceCode         string        `db:"device_code"`
+		WaterTemperature   float64       `db:"water_temperature"`    // 水温 摄氏度
+		FeedFlow1St        float64       `db:"feed_flow_1st"`        // 一段进水流量
+		ConFlow1St         float64       `db:"con_flow_1st"`         // 一段浓水流量
+		ProductFlow1St     float64       `db:"product_flow_1st"`     // 一段产水流量
+		FeedPressure1St    float64       `db:"feed_pressure_1st"`    // 一段进水压力
+		ConPressure1St     float64       `db:"con_pressure_1st"`     // 一段浓水压力
+		ProductPressure1St float64       `db:"product_pressure_1st"` // 一段产水压力
+		Tmp1St             float64       `db:"tmp_1st"`              // 一段跨膜压差
+		Flux1St            float64       `db:"flux_1st"`             // 一段膜通量
+		Permeability1St    float64       `db:"permeability_1st"`     // 一段渗透率
+		FeedFlow2Nd        float64       `db:"feed_flow_2nd"`        // 二段进水流量
+		ConFlow2Nd         float64       `db:"con_flow_2nd"`         // 二段浓水流量
+		ProductFlow2Nd     float64       `db:"product_flow_2nd"`     // 二段产水流量
+		FeedPressure2Nd    float64       `db:"feed_pressure_2nd"`    // 二段进水压力
+		ConPressure2Nd     float64       `db:"con_pressure_2nd"`     // 二段浓水压力
+		ProductPressure2Nd float64       `db:"product_pressure_2nd"` // 二段产水压力
+		Tmp2Nd             float64       `db:"tmp_2nd"`              // 二段压差
+		Flux2Nd            float64       `db:"flux_2nd"`             // 二段通量
+		Permeability2Nd    float64       `db:"permeability_2nd"`     // 二段渗透率
+		FeedFlow3Th        float64       `db:"feed_flow_3th"`        // 三段进水流量
+		ConFlow3Th         float64       `db:"con_flow_3th"`         // 三段浓水流量
+		ProductFlow3Th     float64       `db:"product_flow_3th"`     // 三段产水流量
+		FeedPressure3Th    float64       `db:"feed_pressure_3th"`    // 三段进水压力
+		ConPressure3Th     float64       `db:"con_pressure_3th"`     // 三段浓水压力
+		ProductPressure3Th float64       `db:"product_pressure_3th"` // 三段产水压力
+		Tmp3Th             float64       `db:"tmp_3th"`              // 三段压差
+		Flux3Th            float64       `db:"flux_3th"`             // 三段通量
+		Permeability3Th    float64       `db:"permeability_3th"`     // 三段渗透率
+		FeedWqTurbidity    float64       `db:"feed_wq_turbidity"`    // 进水浊度
+		FeedWqPh           int64         `db:"feed_wq_ph"`           // 进水 PH 值
+		ProductWqPh        int64         `db:"product_wq_ph"`        // 产水 PH 值
+		FeedWqAl           float64       `db:"feed_wq_al"`           // 进水水质:铝
+		ProductWqAl        float64       `db:"product_wq_al"`        // 产水水质:铝
+		FeedWqFe           float64       `db:"feed_wq_fe"`           // 进水水质:铁
+		ProductWqFe        float64       `db:"product_wq_fe"`        // 产水水质:铁
+		FeedWqMn           float64       `db:"feed_wq_mn"`           // 进水水质:锰
+		ProductWqMn        float64       `db:"product_wq_mn"`        // 产水水质:锰
+		FeedWqSio2         float64       `db:"feed_wq_sio2"`         // 进水水质:二氧化硅
+		ProductWqSio2      float64       `db:"product_wq_sio2"`      // 产水水质:二氧化硅
+		FeedWqCod          float64       `db:"feed_wq_cod"`          // 进水水质:COD
+		ProductWqCod       float64       `db:"product_wq_cod"`       // 产水水质:COD
+		FeedWqP            float64       `db:"feed_wq_p"`            // 进水水质:磷
+		ProductWqP         float64       `db:"product_wq_p"`         // 产水水质:磷
+		Step               int64 `db:"step"`                 // 设备当前步序值
+		CTime              time.Time     `db:"c_time"`
+	}
+)
+
+func newDcWorkingRoModel(conn sqlx.SqlConn) *defaultDcWorkingRoModel {
+	return &defaultDcWorkingRoModel{
+		conn:  conn,
+		table: "`dc_working_ro`",
+	}
+}
+
+func (m *defaultDcWorkingRoModel) withSession(session sqlx.Session) *defaultDcWorkingRoModel {
+	return &defaultDcWorkingRoModel{
+		conn:  sqlx.NewSqlConnFromSession(session),
+		table: "`dc_working_ro`",
+	}
+}
+
+func (m *defaultDcWorkingRoModel) Delete(ctx context.Context, id int64) error {
+	query := fmt.Sprintf("delete from %s where `id` = ?", m.table)
+	_, err := m.conn.ExecCtx(ctx, query, id)
+	return err
+}
+
+func (m *defaultDcWorkingRoModel) FindOne(ctx context.Context, id int64) (*DcWorkingRo, error) {
+	query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", dcWorkingRoRows, m.table)
+	var resp DcWorkingRo
+	err := m.conn.QueryRowCtx(ctx, &resp, query, id)
+	switch err {
+	case nil:
+		return &resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultDcWorkingRoModel) MultiInsert(ctx context.Context, datas []DcWorkingRo) (int64, error) {
+	query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, dcWorkingRoRowsExpectAutoSet)
+
+	if bulk, err := sqlx.NewBulkInserter(m.conn, query);err == nil {
+		for _, data := range datas {
+			if err = bulk.Insert(data.ProjectId, data.DeviceCode, data.WaterTemperature, data.FeedFlow1St, data.ConFlow1St, data.ProductFlow1St, data.FeedPressure1St, data.ConPressure1St, data.ProductPressure1St, data.Tmp1St, data.Flux1St, data.Permeability1St, data.FeedFlow2Nd, data.ConFlow2Nd, data.ProductFlow2Nd, data.FeedPressure2Nd, data.ConPressure2Nd, data.ProductPressure2Nd, data.Tmp2Nd, data.Flux2Nd, data.Permeability2Nd, data.FeedFlow3Th, data.ConFlow3Th, data.ProductFlow3Th, data.FeedPressure3Th, data.ConPressure3Th, data.ProductPressure3Th, data.Tmp3Th, data.Flux3Th, data.Permeability3Th, data.FeedWqTurbidity, data.FeedWqPh, data.ProductWqPh, data.FeedWqAl, data.ProductWqAl, data.FeedWqFe, data.ProductWqFe, data.FeedWqMn, data.ProductWqMn, data.FeedWqSio2, data.ProductWqSio2, data.FeedWqCod, data.ProductWqCod, data.FeedWqP, data.ProductWqP, data.Step, data.CTime);err != nil {
+				return 0, err
+			}
+		}
+
+		bulk.Flush()
+		return int64(len(datas)), nil
+	} else {
+		return 0, err
+	}
+}
+
+func (m *defaultDcWorkingRoModel) Insert(ctx context.Context, data *DcWorkingRo) (sql.Result, error) {
+	query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, dcWorkingRoRowsExpectAutoSet)
+	ret, err := m.conn.ExecCtx(ctx, query, data.ProjectId, data.DeviceCode, data.WaterTemperature, data.FeedFlow1St, data.ConFlow1St, data.ProductFlow1St, data.FeedPressure1St, data.ConPressure1St, data.ProductPressure1St, data.Tmp1St, data.Flux1St, data.Permeability1St, data.FeedFlow2Nd, data.ConFlow2Nd, data.ProductFlow2Nd, data.FeedPressure2Nd, data.ConPressure2Nd, data.ProductPressure2Nd, data.Tmp2Nd, data.Flux2Nd, data.Permeability2Nd, data.FeedFlow3Th, data.ConFlow3Th, data.ProductFlow3Th, data.FeedPressure3Th, data.ConPressure3Th, data.ProductPressure3Th, data.Tmp3Th, data.Flux3Th, data.Permeability3Th, data.FeedWqTurbidity, data.FeedWqPh, data.ProductWqPh, data.FeedWqAl, data.ProductWqAl, data.FeedWqFe, data.ProductWqFe, data.FeedWqMn, data.ProductWqMn, data.FeedWqSio2, data.ProductWqSio2, data.FeedWqCod, data.ProductWqCod, data.FeedWqP, data.ProductWqP, data.Step, data.CTime)
+	return ret, err
+}
+
+func (m *defaultDcWorkingRoModel) Update(ctx context.Context, data *DcWorkingRo) error {
+	query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, dcWorkingRoRowsWithPlaceHolder)
+	_, err := m.conn.ExecCtx(ctx, query, data.ProjectId, data.DeviceCode, data.WaterTemperature, data.FeedFlow1St, data.ConFlow1St, data.ProductFlow1St, data.FeedPressure1St, data.ConPressure1St, data.ProductPressure1St, data.Tmp1St, data.Flux1St, data.Permeability1St, data.FeedFlow2Nd, data.ConFlow2Nd, data.ProductFlow2Nd, data.FeedPressure2Nd, data.ConPressure2Nd, data.ProductPressure2Nd, data.Tmp2Nd, data.Flux2Nd, data.Permeability2Nd, data.FeedFlow3Th, data.ConFlow3Th, data.ProductFlow3Th, data.FeedPressure3Th, data.ConPressure3Th, data.ProductPressure3Th, data.Tmp3Th, data.Flux3Th, data.Permeability3Th, data.FeedWqTurbidity, data.FeedWqPh, data.ProductWqPh, data.FeedWqAl, data.ProductWqAl, data.FeedWqFe, data.ProductWqFe, data.FeedWqMn, data.ProductWqMn, data.FeedWqSio2, data.ProductWqSio2, data.FeedWqCod, data.ProductWqCod, data.FeedWqP, data.ProductWqP, data.Step, data.CTime, data.Id)
+	return err
+}
+
+func (m *defaultDcWorkingRoModel) tableName() string {
+	return m.table
+}

+ 24 - 0
app/model/dcWorkingUfModel.go

@@ -0,0 +1,24 @@
+package model
+
+import "github.com/zeromicro/go-zero/core/stores/sqlx"
+
+var _ DcWorkingUfModel = (*customDcWorkingUfModel)(nil)
+
+type (
+	// DcWorkingUfModel is an interface to be customized, add more methods here,
+	// and implement the added methods in customDcWorkingUfModel.
+	DcWorkingUfModel interface {
+		dcWorkingUfModel
+	}
+
+	customDcWorkingUfModel struct {
+		*defaultDcWorkingUfModel
+	}
+)
+
+// NewDcWorkingUfModel returns a model for the database table.
+func NewDcWorkingUfModel(conn sqlx.SqlConn) DcWorkingUfModel {
+	return &customDcWorkingUfModel{
+		defaultDcWorkingUfModel: newDcWorkingUfModel(conn),
+	}
+}

+ 137 - 0
app/model/dcWorkingUfModel_gen.go

@@ -0,0 +1,137 @@
+// Code generated by goctl. DO NOT EDIT.
+
+package model
+
+import (
+	"context"
+	"database/sql"
+	"fmt"
+	"strings"
+	"time"
+
+	"github.com/zeromicro/go-zero/core/stores/builder"
+	"github.com/zeromicro/go-zero/core/stores/sqlc"
+	"github.com/zeromicro/go-zero/core/stores/sqlx"
+	"github.com/zeromicro/go-zero/core/stringx"
+)
+
+var (
+	dcWorkingUfFieldNames          = builder.RawFieldNames(&DcWorkingUf{})
+	dcWorkingUfRows                = strings.Join(dcWorkingUfFieldNames, ",")
+	dcWorkingUfRowsExpectAutoSet   = strings.Join(stringx.Remove(dcWorkingUfFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), ",")
+	dcWorkingUfRowsWithPlaceHolder = strings.Join(stringx.Remove(dcWorkingUfFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), "=?,") + "=?"
+)
+
+type (
+	dcWorkingUfModel interface {
+		MultiInsert(ctx context.Context, datas []DcWorkingUf) (int64, error)
+		Insert(ctx context.Context, data *DcWorkingUf) (sql.Result, error)
+		FindOne(ctx context.Context, id int64) (*DcWorkingUf, error)
+		Update(ctx context.Context, data *DcWorkingUf) error
+		Delete(ctx context.Context, id int64) error
+	}
+
+	defaultDcWorkingUfModel struct {
+		conn  sqlx.SqlConn
+		table string
+	}
+
+	DcWorkingUf struct {
+		Id               int64         `db:"id"`
+		ProjectId        int64         `db:"project_id"`
+		DeviceCode       string        `db:"device_code"`
+		WaterTemperature float64       `db:"water_temperature"` // 水温 摄氏度
+		FeedFlow         float64       `db:"feed_flow"`         // 进水流量
+		ConFlow          float64       `db:"con_flow"`          // 浓水流量
+		ProductFlow      float64       `db:"product_flow"`      // 产水流量
+		FeedPressure     float64       `db:"feed_pressure"`     // 进水压力
+		ConPressure      float64       `db:"con_pressure"`      // 浓水压力
+		ProductPressure  float64       `db:"product_pressure"`  // 产水压力
+		Tmp              float64       `db:"tmp"`               // 跨膜压差
+		Flux             float64       `db:"flux"`              // 膜通量
+		FeedWqTurbidity  float64       `db:"feed_wq_turbidity"` // 进水浊度
+		FeedWqPh         int64         `db:"feed_wq_ph"`        // 进水 PH 值
+		ProductWqPh      int64         `db:"product_wq_ph"`     // 产水 PH 值
+		FeedWqAl         float64       `db:"feed_wq_al"`        // 进水水质:铝
+		ProductWqAl      float64       `db:"product_wq_al"`     // 产水水质:铝
+		FeedWqFe         float64       `db:"feed_wq_fe"`        // 进水水质:铁
+		ProductWqFe      float64       `db:"product_wq_fe"`     // 产水水质:铁
+		FeedWqMn         float64       `db:"feed_wq_mn"`        // 进水水质:锰
+		ProductWqMn      float64       `db:"product_wq_mn"`     // 产水水质:锰
+		FeedWqSio2       float64       `db:"feed_wq_sio2"`      // 进水水质:二氧化硅
+		ProductWqSio2    float64       `db:"product_wq_sio2"`   // 产水水质:二氧化硅
+		FeedWqCod        float64       `db:"feed_wq_cod"`       // 进水水质:COD
+		ProductWqCod     float64       `db:"product_wq_cod"`    // 产水水质:COD
+		FeedWqP          float64       `db:"feed_wq_p"`         // 进水水质:磷
+		ProductWqP       float64       `db:"product_wq_p"`      // 产水水质:磷
+		Step             int64 `db:"step"`              // 设备当前步序值
+		CTime            time.Time     `db:"c_time"`
+	}
+)
+
+func newDcWorkingUfModel(conn sqlx.SqlConn) *defaultDcWorkingUfModel {
+	return &defaultDcWorkingUfModel{
+		conn:  conn,
+		table: "`dc_working_uf`",
+	}
+}
+
+func (m *defaultDcWorkingUfModel) withSession(session sqlx.Session) *defaultDcWorkingUfModel {
+	return &defaultDcWorkingUfModel{
+		conn:  sqlx.NewSqlConnFromSession(session),
+		table: "`dc_working_uf`",
+	}
+}
+
+func (m *defaultDcWorkingUfModel) Delete(ctx context.Context, id int64) error {
+	query := fmt.Sprintf("delete from %s where `id` = ?", m.table)
+	_, err := m.conn.ExecCtx(ctx, query, id)
+	return err
+}
+
+func (m *defaultDcWorkingUfModel) FindOne(ctx context.Context, id int64) (*DcWorkingUf, error) {
+	query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", dcWorkingUfRows, m.table)
+	var resp DcWorkingUf
+	err := m.conn.QueryRowCtx(ctx, &resp, query, id)
+	switch err {
+	case nil:
+		return &resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultDcWorkingUfModel) MultiInsert(ctx context.Context, datas []DcWorkingUf) (int64, error) {
+	query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, dcWorkingUfRowsExpectAutoSet)
+
+	if bulk, err := sqlx.NewBulkInserter(m.conn, query);err == nil {
+		for _, data := range datas {
+			if err = bulk.Insert(data.ProjectId, data.DeviceCode, data.WaterTemperature, data.FeedFlow, data.ConFlow, data.ProductFlow, data.FeedPressure, data.ConPressure, data.ProductPressure, data.Tmp, data.Flux, data.FeedWqTurbidity, data.FeedWqPh, data.ProductWqPh, data.FeedWqAl, data.ProductWqAl, data.FeedWqFe, data.ProductWqFe, data.FeedWqMn, data.ProductWqMn, data.FeedWqSio2, data.ProductWqSio2, data.FeedWqCod, data.ProductWqCod, data.FeedWqP, data.ProductWqP, data.Step, data.CTime);err != nil {
+				return 0, err
+			}
+		}
+
+		bulk.Flush()
+		return int64(len(datas)), nil
+	} else {
+		return 0, err
+	}
+}
+
+func (m *defaultDcWorkingUfModel) Insert(ctx context.Context, data *DcWorkingUf) (sql.Result, error) {
+	query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, dcWorkingUfRowsExpectAutoSet)
+	ret, err := m.conn.ExecCtx(ctx, query, data.ProjectId, data.DeviceCode, data.WaterTemperature, data.FeedFlow, data.ConFlow, data.ProductFlow, data.FeedPressure, data.ConPressure, data.ProductPressure, data.Tmp, data.Flux, data.FeedWqTurbidity, data.FeedWqPh, data.ProductWqPh, data.FeedWqAl, data.ProductWqAl, data.FeedWqFe, data.ProductWqFe, data.FeedWqMn, data.ProductWqMn, data.FeedWqSio2, data.ProductWqSio2, data.FeedWqCod, data.ProductWqCod, data.FeedWqP, data.ProductWqP, data.Step, data.CTime)
+	return ret, err
+}
+
+func (m *defaultDcWorkingUfModel) Update(ctx context.Context, data *DcWorkingUf) error {
+	query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, dcWorkingUfRowsWithPlaceHolder)
+	_, err := m.conn.ExecCtx(ctx, query, data.ProjectId, data.DeviceCode, data.WaterTemperature, data.FeedFlow, data.ConFlow, data.ProductFlow, data.FeedPressure, data.ConPressure, data.ProductPressure, data.Tmp, data.Flux, data.FeedWqTurbidity, data.FeedWqPh, data.ProductWqPh, data.FeedWqAl, data.ProductWqAl, data.FeedWqFe, data.ProductWqFe, data.FeedWqMn, data.ProductWqMn, data.FeedWqSio2, data.ProductWqSio2, data.FeedWqCod, data.ProductWqCod, data.FeedWqP, data.ProductWqP, data.Step, data.CTime, data.Id)
+	return err
+}
+
+func (m *defaultDcWorkingUfModel) tableName() string {
+	return m.table
+}

+ 24 - 0
app/model/dcWorkingValveModel.go

@@ -0,0 +1,24 @@
+package model
+
+import "github.com/zeromicro/go-zero/core/stores/sqlx"
+
+var _ DcWorkingValveModel = (*customDcWorkingValveModel)(nil)
+
+type (
+	// DcWorkingValveModel is an interface to be customized, add more methods here,
+	// and implement the added methods in customDcWorkingValveModel.
+	DcWorkingValveModel interface {
+		dcWorkingValveModel
+	}
+
+	customDcWorkingValveModel struct {
+		*defaultDcWorkingValveModel
+	}
+)
+
+// NewDcWorkingValveModel returns a model for the database table.
+func NewDcWorkingValveModel(conn sqlx.SqlConn) DcWorkingValveModel {
+	return &customDcWorkingValveModel{
+		defaultDcWorkingValveModel: newDcWorkingValveModel(conn),
+	}
+}

+ 117 - 0
app/model/dcWorkingValveModel_gen.go

@@ -0,0 +1,117 @@
+// Code generated by goctl. DO NOT EDIT.
+
+package model
+
+import (
+	"context"
+	"database/sql"
+	"fmt"
+	"strings"
+	"time"
+
+	"github.com/zeromicro/go-zero/core/stores/builder"
+	"github.com/zeromicro/go-zero/core/stores/sqlc"
+	"github.com/zeromicro/go-zero/core/stores/sqlx"
+	"github.com/zeromicro/go-zero/core/stringx"
+)
+
+var (
+	dcWorkingValveFieldNames          = builder.RawFieldNames(&DcWorkingValve{})
+	dcWorkingValveRows                = strings.Join(dcWorkingValveFieldNames, ",")
+	dcWorkingValveRowsExpectAutoSet   = strings.Join(stringx.Remove(dcWorkingValveFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), ",")
+	dcWorkingValveRowsWithPlaceHolder = strings.Join(stringx.Remove(dcWorkingValveFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), "=?,") + "=?"
+)
+
+type (
+	dcWorkingValveModel interface {
+		MultiInsert(ctx context.Context, datas []DcWorkingValve) (int64, error)
+		Insert(ctx context.Context, data *DcWorkingValve) (sql.Result, error)
+		FindOne(ctx context.Context, id int64) (*DcWorkingValve, error)
+		Update(ctx context.Context, data *DcWorkingValve) error
+		Delete(ctx context.Context, id int64) error
+	}
+
+	defaultDcWorkingValveModel struct {
+		conn  sqlx.SqlConn
+		table string
+	}
+
+	DcWorkingValve struct {
+		Id          int64     `db:"id"`
+		ProjectId   int64     `db:"project_id"`
+		DeviceCode  string    `db:"device_code"`
+		Adjust      int64     `db:"adjust"`       // 是否为调节阀门 0: 否 1: 是
+		Opening     float64   `db:"opening"`      // 当前阀门的开度
+		Closed      int64     `db:"closed"`       // 关到位 全关  0: 否 1: 是
+		Opened      int64     `db:"opened"`       // 开到位 开到 设置的开度 0: 否 1: 是
+		FaultStatus int64     `db:"fault_status"` // 是否故障 0: 否 1: 是
+		CTime       time.Time `db:"c_time"`
+	}
+)
+
+func newDcWorkingValveModel(conn sqlx.SqlConn) *defaultDcWorkingValveModel {
+	return &defaultDcWorkingValveModel{
+		conn:  conn,
+		table: "`dc_working_valve`",
+	}
+}
+
+func (m *defaultDcWorkingValveModel) withSession(session sqlx.Session) *defaultDcWorkingValveModel {
+	return &defaultDcWorkingValveModel{
+		conn:  sqlx.NewSqlConnFromSession(session),
+		table: "`dc_working_valve`",
+	}
+}
+
+func (m *defaultDcWorkingValveModel) Delete(ctx context.Context, id int64) error {
+	query := fmt.Sprintf("delete from %s where `id` = ?", m.table)
+	_, err := m.conn.ExecCtx(ctx, query, id)
+	return err
+}
+
+func (m *defaultDcWorkingValveModel) FindOne(ctx context.Context, id int64) (*DcWorkingValve, error) {
+	query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", dcWorkingValveRows, m.table)
+	var resp DcWorkingValve
+	err := m.conn.QueryRowCtx(ctx, &resp, query, id)
+	switch err {
+	case nil:
+		return &resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultDcWorkingValveModel) MultiInsert(ctx context.Context, datas []DcWorkingValve) (int64, error) {
+	query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?)", m.table, dcWorkingValveRowsExpectAutoSet)
+
+	if bulk, err := sqlx.NewBulkInserter(m.conn, query);err == nil {
+		for _, data := range datas {
+			if err = bulk.Insert(data.ProjectId, data.DeviceCode, data.Adjust, data.Opening, data.Closed, data.Opened, data.FaultStatus, data.CTime);err != nil {
+				return 0, err
+			}
+		}
+
+		bulk.Flush()
+		return int64(len(datas)), nil
+	} else {
+		return 0, err
+	}
+}
+
+func (m *defaultDcWorkingValveModel) Insert(ctx context.Context, data *DcWorkingValve) (sql.Result, error) {
+	query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?)", m.table, dcWorkingValveRowsExpectAutoSet)
+	ret, err := m.conn.ExecCtx(ctx, query, data.ProjectId, data.DeviceCode, data.Adjust, data.Opening, data.Closed, data.Opened, data.FaultStatus, data.CTime)
+	return ret, err
+}
+
+func (m *defaultDcWorkingValveModel) Update(ctx context.Context, data *DcWorkingValve) error {
+	query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, dcWorkingValveRowsWithPlaceHolder)
+	_, err := m.conn.ExecCtx(ctx, query, data.ProjectId, data.DeviceCode, data.Adjust, data.Opening, data.Closed, data.Opened, data.FaultStatus, data.CTime, data.Id)
+	return err
+}
+
+func (m *defaultDcWorkingValveModel) tableName() string {
+	return m.table
+}

+ 21 - 0
app/model/vars.go

@@ -0,0 +1,21 @@
+package model
+
+import (
+	"database/sql/driver"
+	"encoding/json"
+	"github.com/zeromicro/go-zero/core/stores/sqlx"
+)
+
+var ErrNotFound = sqlx.ErrNotFound
+
+type Technologys []string
+
+func (d Technologys) Value() (driver.Value, error) {
+	return json.Marshal(d)
+}
+
+// Scan 实现方法
+func (d *Technologys) Scan(input interface{}) error {
+	_ = json.Unmarshal(input.([]byte), &d)
+	return nil
+}

TEMPAT SAMPAH
common/.DS_Store


+ 312 - 0
common/envitem/func.go

@@ -0,0 +1,312 @@
+package envitem
+
+import (
+	"GtDataStore/common/httplib"
+	"context"
+	"database/sql/driver"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"strconv"
+	"strings"
+	"time"
+)
+
+func SetOptions(options Options) {
+	snapUrl = fmt.Sprintf("http://%s/api/v1/plc-current", options.GtServerIp)
+	ctlUrl = fmt.Sprintf("http://%s/api/v1/plc/set-var-values", options.GtServerIp)
+
+	if options.Cache != nil {
+		cache = options.Cache
+	}
+}
+
+func (m MultiEnvItem) GetProjectId() int64 {
+	for _, item := range m {
+		return item.ProjectId
+	}
+	return 0
+}
+
+func (m MultiEnvItem) GetItemNames() []string {
+	items := make([]string, 0)
+	for _, item := range m {
+		items = append(items, item.Item)
+	}
+	return items
+}
+
+func (m MultiEnvItem) FillCurrentValue() error {
+	datas, err := m.getCurrentData()
+	if err != nil {
+		return err
+	}
+	// 先做一个item -> key的映射
+	ikm := make(map[string]string)
+	for s, item := range m {
+		ikm[item.Item] = s
+	}
+
+	for _, data := range datas {
+		if k, ok := ikm[data.ItemName]; ok {
+			m[k].Value = data.Val
+			m[k].Htime = data.HTime
+			_ = m[k].setPrevValue()
+		}
+	}
+	return nil
+}
+
+func (m MultiEnvItem) GetItemFloat64Value(key string) float64 {
+	if envItem, ok := m[key]; ok {
+		return envItem.GetItemFloat64Val()
+	}
+	return 0
+}
+
+func (m MultiEnvItem) GetItemInt64Value(key string) int64 {
+	if envItem, ok := m[key]; ok {
+		return envItem.GetItemInt64Val()
+	}
+	return 0
+}
+
+func (m MultiEnvItem) GetItemStringValue(key string) string {
+	if envItem, ok := m[key]; ok {
+		return envItem.GetItemStringVal()
+	}
+	return ""
+}
+
+func (m MultiEnvItem) GetCurrentValue(key string) (string, string, error) {
+	if envItem, ok := m[key]; ok {
+		return envItem.getCurrentValue()
+	}
+	return "", "", errors.New(key + " not exists")
+}
+
+func (m MultiEnvItem) getCurrentData() ([]*ItemValueResp, error) {
+	req := httplib.Post(snapUrl)
+	data := make([]*ItemValueReq, 1)
+
+	data[0] = &ItemValueReq{
+		DeviceItems: strings.Join(m.GetItemNames(), ","),
+		ProjectId:   m.GetProjectId(),
+	}
+
+	jsonBytes, err := json.Marshal(data)
+	if err != nil {
+		return nil, err
+	}
+	req.Body(jsonBytes)
+	req.SetTimeout(time.Millisecond * 2000)
+
+	r, err := req.Response()
+	if err != nil {
+		return nil, err
+	}
+	defer r.Body.Close()
+
+	if r.StatusCode == 200 {
+		resp, err := req.Bytes()
+		if err != nil {
+			return nil, err
+		}
+
+		res := &ItemValueResps{}
+		err = json.Unmarshal(resp, res)
+		if err != nil {
+			return nil, err
+		}
+
+		if len(res.Data) == 0 {
+			return nil, errors.New("not found envitem's value")
+		}
+
+		return res.Data, nil
+	}
+
+	return nil, errors.New(fmt.Sprintf("request statusCode: %d", r.StatusCode))
+}
+
+func (e *EnvItem) getCurrentData() (*ItemValueResp, error) {
+	req := httplib.Post(snapUrl)
+	data := make([]*ItemValueReq, 1)
+
+	data[0] = &ItemValueReq{
+		DeviceItems: e.Item,
+		ProjectId:   e.ProjectId,
+	}
+
+	jsonBytes, err := json.Marshal(data)
+	if err != nil {
+		return nil, err
+	}
+	req.Body(jsonBytes)
+	req.SetTimeout(time.Millisecond * 2000)
+
+	r, err := req.Response()
+	if err != nil {
+		return nil, err
+	}
+	defer r.Body.Close()
+
+	if r.StatusCode == 200 {
+		resp, err := req.Bytes()
+		if err != nil {
+			return nil, err
+		}
+
+		res := &ItemValueResps{}
+		err = json.Unmarshal(resp, res)
+		if err != nil {
+			return nil, err
+		}
+
+		if len(res.Data) == 0 {
+			return nil, errors.New("not found envitem's value")
+		}
+
+		return res.Data[0], nil
+	}
+
+	return nil, errors.New(fmt.Sprintf("request statusCode: %d", r.StatusCode))
+}
+
+func (e *EnvItem) getCurrentValue() (string, string, error) {
+	resp, err := e.getCurrentData()
+	if err != nil {
+		return "", "", err
+	}
+
+	e.Value = resp.Val
+	e.Htime = resp.HTime
+	_ = e.setPrevValue()
+
+	return resp.Val, resp.HTime, nil
+}
+
+func (e *EnvItem) getPrevValue() (string, string, error) {
+	if cache == nil {
+		return "", "", errors.New("not cache")
+	}
+	key := fmt.Sprintf(CACHE_PREV_VALUE_KEY, e.ProjectId, e.Item)
+	if cmd := cache.Get(context.Background(), key); cmd != nil {
+		n := strings.Split(cmd.Val(), "|")
+		if len(n) != 2 {
+			return "", "", errors.New("getPrevValue cache length error")
+		}
+		return n[0], n[1], nil
+	} else {
+		return "", "", cmd.Err()
+	}
+}
+
+func (e *EnvItem) setPrevValue() error {
+	if cache == nil {
+		return errors.New("not cache")
+	}
+	key := fmt.Sprintf(CACHE_PREV_VALUE_KEY, e.ProjectId, e.Item)
+	value := fmt.Sprintf("%s|%s", e.Value, e.Htime)
+	if statusCmd := cache.Set(context.Background(), key, value, CACHE_PREV_VALUE_KEY_EXPIRE); statusCmd != nil {
+		return nil
+	} else {
+		return errors.New("setPrevValue error")
+	}
+}
+
+func (e *EnvItem) GetItemFloat64Val() float64 {
+	if e.Value == nil {
+		e.getCurrentValue()
+	}
+
+	if v, ok := e.Value.(float64); ok {
+		return v
+	}
+
+	return 0
+}
+
+func (e *EnvItem) GetItemInt64Val() int64 {
+	if e.Value == nil {
+		e.getCurrentValue()
+	}
+
+	if v, ok := e.Value.(int64); ok {
+		return v
+	}
+
+	return 0
+}
+
+func (e *EnvItem) GetItemStringVal() string {
+	if e.Value == nil {
+		e.getCurrentValue()
+	}
+
+	if v, ok := e.Value.(string); ok {
+		return v
+	}
+
+	return ""
+}
+
+func (e *EnvItem) GetItemHtime() *time.Time {
+	if e.Value == nil {
+		e.getCurrentValue()
+	}
+
+	if ht, err := time.ParseInLocation("2006-01-02 15:04:05", e.Htime, time.Local); err == nil {
+		return &ht
+	}
+	return nil
+}
+
+func (e *EnvItem) GetItemPrevFloat64Val() float64 {
+	ov, _, err := e.getPrevValue()
+	if err != nil {
+		return 0
+	}
+
+	if v, err := strconv.ParseFloat(ov, 64); err == nil {
+		return v
+	}
+
+	return 0
+}
+
+func (e *EnvItem) GetItemPrevInt64Val() int64 {
+	ov, _, err := e.getPrevValue()
+	if err != nil {
+		return 0
+	}
+
+	if v, err := strconv.ParseInt(ov, 10, 64); err == nil {
+		return v
+	}
+
+	return 0
+}
+
+func (e *EnvItem) GetItemPrevStringVal() string {
+	ov, _, _ := e.getPrevValue()
+	return ov
+}
+
+func (e *EnvItem) GetItemPrevHtime() *time.Time {
+	_, ht, _ := e.getPrevValue()
+	if t, err := time.ParseInLocation("2006-01-02 15:04:05", ht, time.Local); err == nil {
+		return &t
+	}
+	return nil
+}
+
+// Scan 实现方法
+func (d *MultiEnvItem) Scan(input interface{}) error {
+	_ = json.Unmarshal(input.([]byte), &d)
+	return nil
+}
+
+func (d MultiEnvItem) Value() (driver.Value, error) {
+	return json.Marshal(d)
+}

+ 57 - 0
common/envitem/func_test.go

@@ -0,0 +1,57 @@
+package envitem
+
+import (
+	"encoding/json"
+	"testing"
+)
+
+func TestEnvItem_GetCurrentData(t *testing.T) {
+	SetOptions(Options{GtServerIp: "47.96.12.136:8788"})
+	e := EnvItem{
+		ProjectId: 92,
+		Item:      "C.M.LT_CIP@out,C.M.RO1_DB@time_CS_display",
+	}
+
+	v, ht, err := e.getCurrentValue()
+
+	t.Log(v, ht, err)
+
+}
+
+func TestMultiEnvItem_FillCurrentValue(t *testing.T) {
+	SetOptions(Options{GtServerIp: "47.96.12.136:8788"})
+	m := make(MultiEnvItem, 2)
+	m["C.M.LT_CIP@out"] = &EnvItem{
+		ProjectId: 92,
+		Item:      "C.M.LT_CIP@out",
+	}
+	m["C.M.RO1_DB@time_CS_display"] = &EnvItem{
+		ProjectId: 92,
+		Item:      "C.M.RO1_DB@time_CS_display",
+	}
+
+	err := m.FillCurrentValue()
+	t.Log(err)
+
+	for s, item := range m {
+		t.Logf("item: %s value: %s htime: %s", s, item.Value, item.Htime)
+	}
+}
+
+func TestMultiEnvItem_FillCurrentValue2(t *testing.T) {
+	SetOptions(Options{GtServerIp: "47.96.12.136:8788"})
+	js := `{"tmp":{"project_id":92,"item":"C.M.UF2_DB@press_PV"},"feed_flow":{"project_id":92,"item":"C.M.UF2_FT_JS@out"},"feed_pressure":{"project_id":92,"item":"C.M.UF2_PT_JS@out"},"product_pressure":{"project_id":92,"item":"C.M.UF2_PT_CS@out"},"feed_wq_turbidity":{"project_id":92,"item":"C.M.UF_Tur_ZJS@out"},"water_temperature":{"project_id":92,"item":"C.M.RO_TT_ZJS@out"},"product_wq_ph":{"project_id":92,"item":"C.M.UF_PH_ZCS@out"}}`
+	var multiEnvItems MultiEnvItem
+
+	json.Unmarshal([]byte(js), &multiEnvItems)
+
+	t.Log(multiEnvItems)
+
+	err := multiEnvItems.FillCurrentValue()
+	t.Log(err)
+
+	for s, item := range multiEnvItems {
+		t.Logf("item: %s value: %s htime: %s", s, item.Value, item.Htime)
+	}
+
+}

+ 48 - 0
common/envitem/types.go

@@ -0,0 +1,48 @@
+package envitem
+
+import "github.com/go-redis/redis/v8"
+
+type (
+	Options struct {
+		GtServerIp string
+		Cache      *redis.Client
+	}
+
+	EnvItem struct {
+		ProjectId   int64       `json:"project_id"`
+		DeviceCode  string      `json:"device_code"`
+		PlcDeviceId string      `json:"plc_device_id"`
+		Item        string      `json:"item"`
+		DefaultVal  interface{} `json:"default_val"`
+		Value       interface{} `json:"value"`
+		Htime       string      `json:"htime"`
+	}
+
+	MultiEnvItem map[string]*EnvItem
+
+	ItemValueResp struct {
+		Alias        string `json:"alias"`
+		DataAddress  string `json:"dataAddress"`
+		DataType     string `json:"datatype"`
+		DevName      string `json:"devName"`
+		DevID        string `json:"devid"`
+		HTime        string `json:"htime"`
+		ItemID       string `json:"itemid"`
+		ItemName     string `json:"itemname"`
+		Quality      string `json:"quality"`
+		ReadOnly     bool   `json:"readOnly"`
+		SpecificType string `json:"specificType"`
+		Val          string `json:"val"`
+	}
+
+	ItemValueResps struct {
+		Code int              `json:"code"`
+		Data []*ItemValueResp `json:"data"`
+	}
+
+	ItemValueReq struct {
+		DeviceId    string `json:"deviceId"`
+		DeviceItems string `json:"deviceItems"`
+		ProjectId   int64  `json:"project_id"`
+	}
+)

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini