From dd75b36c03049be232a94d97eff1c4a5cc751fb5 Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期二, 31 十月 2023 22:08:39 +0800
Subject: [PATCH] 支持设备ID切换

---
 service/task.go          |   13 +-
 model/device.go          |   10 ++
 service/device_plc.go    |    2 
 api/v1/config.go         |    2 
 api/v1/device.go         |   81 ++++++++++++++++++++
 model/request/task.go    |   10 +-
 api/v1/task.go           |   10 +-
 constvar/const.go        |    6 +
 service/cache_store.go   |    2 
 service/progress.go      |    2 
 model/request/common.go  |    4 +
 service/device.go        |   40 ++++++++++
 service/process_model.go |    2 
 conf/config.go           |    4 +
 model/response/common.go |    6 +
 main.go                  |   23 +++++
 16 files changed, 196 insertions(+), 21 deletions(-)

diff --git a/api/v1/config.go b/api/v1/config.go
index 08642f8..ee22af0 100644
--- a/api/v1/config.go
+++ b/api/v1/config.go
@@ -125,7 +125,7 @@
 		return
 	}
 
-	params.DeviceID = conf.Conf.System.DeviceId
+	params.DeviceID = conf.Conf.CurrentDeviceID
 	if params.Method == constvar.PlcMethodModbusTCP && (params.Address == "" || params.Port == 0) {
 		ctx.FailWithMsg(ecode.ParamsErr, "褰撴帴鍙f柟寮忎负modbusTCP鏃讹紝鍦板潃鍜岀鍙e彿涓嶈兘涓虹┖")
 		return
diff --git a/api/v1/device.go b/api/v1/device.go
new file mode 100644
index 0000000..ab7f965
--- /dev/null
+++ b/api/v1/device.go
@@ -0,0 +1,81 @@
+package v1
+
+import (
+	"apsClient/conf"
+	"apsClient/constvar"
+	"apsClient/crontask"
+	"apsClient/model/request"
+	"apsClient/model/response"
+	_ "apsClient/model/response"
+	"apsClient/pkg/contextx"
+	"apsClient/pkg/ecode"
+	"apsClient/pkg/logx"
+	"apsClient/service"
+	"github.com/gin-gonic/gin"
+)
+
+type DeviceApi struct{}
+
+// Set
+// @Tags      璁惧
+// @Summary   璁剧疆褰撳墠璁惧id
+// @Produce   application/json
+// @Param     object  body    request.SetCurrentDevice true  "鏌ヨ鍙傛暟"
+// @Success   200   {object}  contextx.Response{}  "鎴愬姛"
+// @Router    /v1/device/set [post]
+func (slf *DeviceApi) Set(c *gin.Context) {
+	var params request.SetCurrentDevice
+	ctx, ok := contextx.NewContext(c, &params)
+	if !ok {
+		return
+	}
+	if params.CurrentDeviceID != "" {
+		ctx.Fail(ecode.ParamsErr)
+		return
+	}
+	list, err := service.GetDeviceIDList()
+	findFlag := false
+	for _, item := range list {
+		if item == params.CurrentDeviceID {
+			findFlag = true
+		}
+	}
+	if !findFlag {
+		ctx.Fail(ecode.ParamsErr)
+		return
+	}
+	service.SetDeviceIDToFile(params.CurrentDeviceID)
+	conf.Conf.SerfClusterStatus = params.CurrentDeviceID
+	err = crontask.RestartTask(conf.Conf.SerfClusterStatus != constvar.SerfClusterStatusSlave)
+	if err != nil {
+		logx.Errorf("restart task failed:%v", err)
+		ctx.Fail(ecode.UnknownErr)
+		return
+	}
+
+	ctx.Ok()
+}
+
+// DeviceList
+// @Tags      Device
+// @Summary   鑾峰彇褰撳墠闈㈡澘缁戝畾鐨勮澶囧垪琛�
+// @Produce   application/json
+// @Success   200   {object}  contextx.Response{data=response.DeviceListResponse}  "鎴愬姛"
+// @Router    /v1/device/list [post]
+func (slf *DeviceApi) DeviceList(c *gin.Context) {
+	ctx, ok := contextx.NewContext(c, nil)
+	if !ok {
+		return
+	}
+	list, err := service.GetDeviceIDList()
+	if err != nil {
+		ctx.Fail(ecode.DBErr)
+		return
+	}
+	resp := response.DeviceListResponse{
+		SystemDeviceID:  conf.Conf.System.DeviceId,
+		CurrentDeviceID: conf.Conf.CurrentDeviceID,
+		DeviceIDList:    list,
+	}
+	ctx.OkWithDetailed(resp)
+}
diff --git a/api/v1/task.go b/api/v1/task.go
index cd04286..d700a97 100644
--- a/api/v1/task.go
+++ b/api/v1/task.go
@@ -63,8 +63,7 @@
 		ctx.FailWithMsg(ecode.NeedConfirmedErr, err.Error())
 		return
 	}
-
-	taskCount := service.NewTaskService().NewTaskCount()
+	taskCount := service.NewTaskService().NewTaskCount(conf.Conf.CurrentDeviceID)
 	params.Page = 1
 	if params.PageSize <= 0 {
 		if params.TaskMode == constvar.TaskModeUnStarted {
@@ -79,7 +78,7 @@
 		taskMode = params.TaskMode
 	}
 
-	taskResponse, code := service.NewTaskService().GetTask(params.Page, params.PageSize, taskMode, nil) //鍙栬繘琛屼腑鐨勬垨鏈紑濮嬬殑
+	taskResponse, code := service.NewTaskService().GetTask(params.DeviceID, params.Page, params.PageSize, taskMode, nil) //鍙栬繘琛屼腑鐨勬垨鏈紑濮嬬殑
 	if code != ecode.OK {
 		ctx.Fail(code)
 		return
@@ -94,7 +93,7 @@
 			if existsChannel[int32(i)] {
 				continue
 			}
-			taskResponseTemp, code := service.NewTaskService().GetTask(params.Page, 1, constvar.TaskModeLastFinished, []int32{int32(i)}) //鍙栦笂涓�涓畬鎴愮殑
+			taskResponseTemp, code := service.NewTaskService().GetTask(params.DeviceID, params.Page, 1, constvar.TaskModeLastFinished, []int32{int32(i)}) //鍙栦笂涓�涓畬鎴愮殑
 			if code != ecode.OK {
 				ctx.Fail(code)
 				return
@@ -434,6 +433,7 @@
 		ctx.FailWithMsg(ecode.NeedConfirmedErr, err.Error())
 		return
 	}
+	params.DeviceID = conf.Conf.CurrentDeviceID
 
 	dataMap := make(map[int32]*response.TaskResponse, channelAmount)
 	if params.Channel != nil {
@@ -469,7 +469,7 @@
 }
 
 func getTaskResponseByChannel(params request.TaskListByChannel, channel int32) (taskResponse *response.TaskResponse, err error) {
-	taskResponse, err = service.NewTaskService().GetTask2(params.Offset, params.Limit, []int32{channel}, params.Type) //鍙栬繘琛屼腑鐨勬垨鏈紑濮嬬殑
+	taskResponse, err = service.NewTaskService().GetTask2(params.DeviceID, params.Offset, params.Limit, []int32{channel}, params.Type) //鍙栬繘琛屼腑鐨勬垨鏈紑濮嬬殑
 	if err != nil {
 		return
 	}
diff --git a/conf/config.go b/conf/config.go
index 1888f21..ad8f0cc 100644
--- a/conf/config.go
+++ b/conf/config.go
@@ -101,6 +101,10 @@
 		PLC plc
 
 		Prompt Prompt
+
+		CurrentDeviceID string //璁剧疆褰撳墠闈㈡澘鎺у埗鐨勮澶�
+
+		SerfClusterStatus string
 	}
 )
 
diff --git a/constvar/const.go b/constvar/const.go
index abe1c72..bb73e7e 100644
--- a/constvar/const.go
+++ b/constvar/const.go
@@ -91,3 +91,9 @@
 	}
 	return ""
 }
+
+const (
+	SerfClusterStatusNull   = ""       //鏈姞鍏ラ泦缇�
+	SerfClusterStatusMaster = "master" //闆嗙兢master
+	SerfClusterStatusSlave  = "slave"  //闆嗙兢slave
+)
diff --git a/main.go b/main.go
index 8aa04c1..b1a14d7 100644
--- a/main.go
+++ b/main.go
@@ -2,6 +2,7 @@
 
 import (
 	"apsClient/conf"
+	"apsClient/constvar"
 	"apsClient/crontask"
 	"apsClient/model"
 	"apsClient/nsq"
@@ -9,6 +10,7 @@
 	"apsClient/pkg/sqlitex"
 	"apsClient/router"
 	"apsClient/serf"
+	"apsClient/service"
 	"apsClient/service/plc_address"
 	"fmt"
 	"log"
@@ -52,9 +54,18 @@
 		return
 	}
 
+	//浠庢枃浠堕噷璇诲彇褰撳墠鐢熶骇璁惧id
+	conf.Conf.CurrentDeviceID = service.ReadDeviceIDFromFile()
+	if conf.Conf.CurrentDeviceID == "" {
+		conf.Conf.CurrentDeviceID = conf.Conf.System.DeviceId
+	}
+
 	// 鍒ゆ柇褰撳墠闆嗙兢鐘舵��
 	logx.Infof("current agent.ClusterStatus:%v", agent.ClusterStatus)
 	log.Println("current agent.ClusterStatus:", agent.ClusterStatus)
+
+	conf.Conf.SerfClusterStatus = agent.ClusterStatus
+
 	if agent.ClusterStatus != "slave" {
 		if err := nsq.Init(); err != nil {
 			logx.Errorf("nsq Init err:%v", err)
@@ -79,6 +90,7 @@
 }
 
 func serfClusterEvent(stat int) {
+	ChangeClusterStatus(stat)
 	switch stat {
 	case serf.EventCreateCluster, serf.EventSlave2Master, serf.EventLeaveCluster:
 		if err := nsq.Init(); err != nil { //寮�鍚痭sq
@@ -101,3 +113,14 @@
 
 	logx.Infof("serf cluster event: %v", stat)
 }
+
+func ChangeClusterStatus(stat int) {
+	switch stat {
+	case serf.EventSlave2Master, serf.EventCreateCluster:
+		conf.Conf.SerfClusterStatus = constvar.SerfClusterStatusMaster
+	case serf.EventLeaveCluster:
+		conf.Conf.SerfClusterStatus = constvar.SerfClusterStatusNull
+	case serf.EventJoinCluster, serf.EventMaster2Slave:
+		conf.Conf.SerfClusterStatus = constvar.SerfClusterStatusSlave
+	}
+}
diff --git a/model/device.go b/model/device.go
index 2919584..a4f8edf 100644
--- a/model/device.go
+++ b/model/device.go
@@ -14,6 +14,7 @@
 		DeviceID         string   `gorm:"column:device_id;type:varchar(255);not null;unique" json:"deviceID"` //璁惧缂栧彿
 		ExtChannelAmount int      `gorm:"type:tinyint;default:0" json:"extChannelAmount"`
 		Procedures       string   `gorm:"column:procedure;type:varchar(255);not null;default ''" json:"procedures"` //璁惧鏀寔鐨勫伐搴忥紝鐢ㄩ�楀彿鍒嗛殧
+		DeviceMac        string   `gorm:"type:varchar(255);" json:"deviceMac"`                                      //缁戝畾鐨勫伐鎺ф満璁惧ID
 		ProceduresArr    []string `gorm:"-" json:"procedureAdd"`                                                    //璁惧鏀寔鐨勫伐搴忓垏鐗�
 	}
 
@@ -65,6 +66,11 @@
 	return slf
 }
 
+func (slf *DeviceSearch) SetDeviceMac(deviceMac string) *DeviceSearch {
+	slf.DeviceMac = deviceMac
+	return slf
+}
+
 func (slf *DeviceSearch) SetDeviceIds(deviceIds []string) *DeviceSearch {
 	slf.DeviceIDs = deviceIds
 	return slf
@@ -81,6 +87,10 @@
 		db = db.Where("device_id = ?", slf.DeviceID)
 	}
 
+	if slf.DeviceMac != "" {
+		db = db.Where("device_mac = ?", slf.DeviceMac)
+	}
+
 	if len(slf.DeviceIDs) != 0 {
 		db = db.Where("device_id in (?)", slf.DeviceIDs)
 	}
diff --git a/model/request/common.go b/model/request/common.go
index 952d6c6..c515c4e 100644
--- a/model/request/common.go
+++ b/model/request/common.go
@@ -8,3 +8,7 @@
 type GetById struct {
 	ID uint `json:"id"` // 涓婚敭ID
 }
+
+type SetCurrentDevice struct {
+	CurrentDeviceID string `json:"currentDeviceID,omitempty"` //褰撳墠閫夊畾鐨勭敓浜ц澶�
+}
diff --git a/model/request/task.go b/model/request/task.go
index afa11d5..f72f5d5 100644
--- a/model/request/task.go
+++ b/model/request/task.go
@@ -15,6 +15,7 @@
 type TaskList struct {
 	PageInfo
 	TaskMode constvar.TaskMode `json:"taskMode" form:"taskMode"`
+	DeviceID string            `json:"deviceID"`
 }
 
 type SendProcessParams struct {
@@ -34,10 +35,11 @@
 
 // TaskListByChannel 鎸塩hannel杩斿洖浠诲姟鍒楄〃璇锋眰鍙傛暟
 type TaskListByChannel struct {
-	Offset  int       `json:"offset,omitempty" form:"offset"` //榛樿0
-	Limit   int       `json:"limit,omitempty" form:"limit"`   //榛樿3
-	Type    QueryType `json:"type,omitempty" form:"type"`     //1 鏈畬鎴� 2 浠婂ぉ鏈畬鎴� 3 宸插畬鎴�
-	Channel *int32    `json:"channel" form:"channel"`         //閫氶亾鍙枫�備笉浼犲彇鍏ㄩ儴鐨�
+	Offset   int       `json:"offset,omitempty" form:"offset"` //榛樿0
+	Limit    int       `json:"limit,omitempty" form:"limit"`   //榛樿3
+	Type     QueryType `json:"type,omitempty" form:"type"`     //1 鏈畬鎴� 2 浠婂ぉ鏈畬鎴� 3 宸插畬鎴�
+	Channel  *int32    `json:"channel" form:"channel"`         //閫氶亾鍙枫�備笉浼犲彇鍏ㄩ儴鐨�
+	DeviceID string    `json:"deviceID"`
 }
 
 type QueryType int
diff --git a/model/response/common.go b/model/response/common.go
index dae30ae..78341ce 100644
--- a/model/response/common.go
+++ b/model/response/common.go
@@ -69,3 +69,9 @@
 	Event string
 	Data  interface{}
 }
+
+type DeviceListResponse struct {
+	SystemDeviceID  string   `json:"systemDeviceID,omitempty"`  //宸ユ帶鏈鸿澶嘔D
+	CurrentDeviceID string   `json:"currentDeviceID,omitempty"` //褰撳墠閫夊畾鐨勭敓浜ц澶�
+	DeviceIDList    []string `json:"deviceIDList,omitempty"`    //鐢熶骇璁惧id鍒楄〃
+}
diff --git a/service/cache_store.go b/service/cache_store.go
index 743e4a7..1d9b7d1 100644
--- a/service/cache_store.go
+++ b/service/cache_store.go
@@ -92,7 +92,7 @@
 	if v, ok := defaultCacheStore.Get(fmt.Sprintf(CurrentTaskCacheKey, channel)); ok {
 		return v.(bool)
 	}
-	_, err := model.NewProceduresSearch(nil).SetDeviceId(conf.Conf.System.DeviceId).SetStatus(model.ProcedureStatusProcessing).SetChannels([]int32{channel}).First()
+	_, err := model.NewProceduresSearch(nil).SetDeviceId(conf.Conf.CurrentDeviceID).SetStatus(model.ProcedureStatusProcessing).SetChannels([]int32{channel}).First()
 	if err == gorm.ErrRecordNotFound {
 		defaultCacheStore.Add(fmt.Sprintf(CurrentTaskCacheKey, channel), false)
 		return false
diff --git a/service/device.go b/service/device.go
new file mode 100644
index 0000000..f778f25
--- /dev/null
+++ b/service/device.go
@@ -0,0 +1,40 @@
+package service
+
+import (
+	"apsClient/conf"
+	"apsClient/model"
+	"fmt"
+	"os"
+)
+
+func GetDeviceIDList() (deviceIds []string, err error) {
+	devices, err := model.NewDeviceSearch().SetDeviceMac(conf.Conf.System.DeviceId).FindNotTotal()
+	if err != nil {
+		return nil, err
+	}
+	deviceIds = make([]string, 0, len(devices))
+	for _, device := range devices {
+		deviceIds = append(deviceIds, device.DeviceID)
+	}
+	return deviceIds, nil
+}
+
+const deviceIDFile = "currentDeviceID.txt"
+
+func SetDeviceIDToFile(deviceID string) {
+	err := os.WriteFile(deviceIDFile, []byte(deviceID), 0644)
+	if err != nil {
+		fmt.Printf("鏃犳硶鍐欏叆璁惧ID鍒版枃浠�: %v\n", err)
+	} else {
+		fmt.Println("璁惧ID宸插啓鍏ユ枃浠�")
+	}
+}
+
+func ReadDeviceIDFromFile() string {
+	data, err := os.ReadFile(deviceIDFile)
+	if err != nil {
+		fmt.Printf("鏃犳硶璇诲彇璁惧ID鏂囦欢: %v\n", err)
+		return ""
+	}
+	return string(data)
+}
diff --git a/service/device_plc.go b/service/device_plc.go
index d98d689..ebe9d56 100644
--- a/service/device_plc.go
+++ b/service/device_plc.go
@@ -19,7 +19,7 @@
 }
 
 func (slf DevicePlcService) GetDevicePlc() (*model.DevicePlc, int) {
-	DevicePlc, err := model.NewDevicePlcSearch().SetDeviceId(conf.Conf.System.DeviceId).First()
+	DevicePlc, err := model.NewDevicePlcSearch().SetDeviceId(conf.Conf.CurrentDeviceID).First()
 	if err == gorm.ErrRecordNotFound {
 		return &model.DevicePlc{
 			DeviceID:   "",
diff --git a/service/process_model.go b/service/process_model.go
index bb42646..d1154a3 100644
--- a/service/process_model.go
+++ b/service/process_model.go
@@ -6,7 +6,7 @@
 )
 
 func GetProcessModelList(offset, limit int, currentNumber string) (list []*model.ProcessModel, total int64, err error) {
-	device, err := model.NewDeviceSearch().SetDeviceId(conf.Conf.System.DeviceId).First()
+	device, err := model.NewDeviceSearch().SetDeviceId(conf.Conf.CurrentDeviceID).First()
 	if err != nil {
 		return
 	}
diff --git a/service/progress.go b/service/progress.go
index ed904f1..2e7bc07 100644
--- a/service/progress.go
+++ b/service/progress.go
@@ -55,7 +55,7 @@
 	var ok bool
 	progressCache, ok = ProgressCacheGet(channel)
 	if !ok {
-		progressCache, err = model.NewProductionProgressSearch(nil).SetDeviceId(conf.Conf.System.DeviceId).SetChannel(channel).SetOrder("id desc").First()
+		progressCache, err = model.NewProductionProgressSearch(nil).SetDeviceId(conf.Conf.CurrentDeviceID).SetChannel(channel).SetOrder("id desc").First()
 		if err == gorm.ErrRecordNotFound {
 			return nil, errors.New("progress not found")
 		}
diff --git a/service/task.go b/service/task.go
index 8f6388d..adb83c1 100644
--- a/service/task.go
+++ b/service/task.go
@@ -1,7 +1,6 @@
 package service
 
 import (
-	"apsClient/conf"
 	"apsClient/constvar"
 	"apsClient/model"
 	"apsClient/model/common"
@@ -22,7 +21,7 @@
 }
 
 // GetTask 鑾峰彇浠诲姟锛屾湭瀹屾垚鐨勫紑濮嬫椂闂村皬浜庣瓑浜庡綋鍓嶆椂闂达紝缁撴潫鏃堕棿澶т簬褰撳墠鏃堕棿鐨勪换鍔�
-func (slf TaskService) GetTask(page, pageSize int, mode constvar.TaskMode, channels []int32) (taskResp *response.TaskResponse, code int) {
+func (slf TaskService) GetTask(deviceID string, page, pageSize int, mode constvar.TaskMode, channels []int32) (taskResp *response.TaskResponse, code int) {
 	var taskList []*response.TaskData
 	var count int64
 	var workers []*common.ProcedureWorker
@@ -40,7 +39,7 @@
 		workOrderIds []string
 	)
 	search := model.NewProceduresSearch(nil).
-		SetDeviceId(conf.Conf.System.DeviceId).
+		SetDeviceId(deviceID).
 		SetPage(page, pageSize)
 
 	if mode == constvar.TaskModeUnStarted {
@@ -106,8 +105,8 @@
 	}
 	return taskResp, ecode.OK
 }
-func (slf TaskService) NewTaskCount() (count int64) {
-	count, _ = model.NewProceduresSearch(nil).SetDeviceId(conf.Conf.System.DeviceId).SetStatus(model.ProcedureStatusWaitProcess).Count()
+func (slf TaskService) NewTaskCount(deviceId string) (count int64) {
+	count, _ = model.NewProceduresSearch(nil).SetDeviceId(deviceId).SetStatus(model.ProcedureStatusWaitProcess).Count()
 	return count
 }
 
@@ -204,7 +203,7 @@
 }
 
 // GetTask2 鑾峰彇浠诲姟鍒楄〃2
-func (slf TaskService) GetTask2(offset, limit int, channels []int32, queryType request.QueryType) (taskResp *response.TaskResponse, err error) {
+func (slf TaskService) GetTask2(deviceID string, offset, limit int, channels []int32, queryType request.QueryType) (taskResp *response.TaskResponse, err error) {
 	var taskList []*response.TaskData
 	var count int64
 	var workers []*common.ProcedureWorker
@@ -221,7 +220,7 @@
 		workOrderIds []string
 	)
 	search := model.NewProceduresSearch(nil).
-		SetDeviceId(conf.Conf.System.DeviceId).
+		SetDeviceId(deviceID).
 		SetOffset(offset, limit).SetChannels(channels)
 	nowTs := time.Now().Unix()
 	switch queryType {

--
Gitblit v1.8.0