4 Ревизии 4a26aed88a ... 8c1a5a1c13

Автор SHA1 Съобщение Дата
  wangbin 8c1a5a1c13 暂时还原设备信息查询以前逻辑 преди 2 години
  wangbin 9adba9e315 设备信息查询更新 преди 2 години
  wangbin 9cedad129e 提交设备信息更新 преди 2 години
  wangbin 8a161f5f9d 设备信息更新 преди 2 години
променени са 5 файла, в които са добавени 342 реда и са изтрити 95 реда
  1. 1 1
      api/v1/log/loging.go
  2. 56 45
      initialize/timer.go
  3. 58 27
      model/log/device_log.go
  4. 145 4
      service/levelMonitor/image_record.go
  5. 82 18
      service/log/loging/logical_log.go

+ 1 - 1
api/v1/log/loging.go

@@ -409,7 +409,7 @@ func (s *ApiLoging) ComputerHeartbeat(c *gin.Context) {
 func (s *ApiLoging) ComputerTest(c *gin.Context) {
 	var paramsInfo request.OnlineComputerRequest
 	_ = c.ShouldBindJSON(&paramsInfo)
-	ServiceStatisticsLog.RegularCheckPc()
+	//ServiceStatisticsLog.ImageIdentify(paramsInfo.PcCode)
 	response.OkWithDetailed("b", "上报成功", c)
 }
 

+ 56 - 45
initialize/timer.go

@@ -67,12 +67,12 @@ func Timer() {
 	//	fmt.Println("add TaskStatisticsDataCache timer error:", err)
 	//}
 	//// 重试失败数据
-	//_, err = global.GVA_Timer.AddTaskByFunc("createFailLog", "2 5,15,25,35,45,55 6-23 * * * ", ServiceLogList.CreateFailLog)
+	//_, err = global.GVA_Timer.AddTaskByFunc("createFailLog", "2 15,35,55 6-23 * * * ", ServiceLogList.CreateFailLog)
 	//if err != nil {
 	//	fmt.Println("everyDayResetStatisticsCache timer error:", err)
 	//}
 	//// 定时检查电脑上报
-	//_, err = global.GVA_Timer.AddTaskByFunc("RegularCheckPc", "2 57 8-23 * * * ", serviceStatisticsLog.RegularCheckPc)
+	//_, err = global.GVA_Timer.AddTaskByFunc("RegularCheckPc", "2 2 9-23 * * * ", serviceStatisticsLog.RegularCheckPc)
 	//if err != nil {
 	//	fmt.Println("RegularCheckPc timer error:", err)
 	//}
@@ -92,7 +92,7 @@ func Timer() {
 	//	fmt.Println("add EveryDaySyncTaskData timer error:", err)
 	//}
 	////同步任务数据
-	//_, err = global.GVA_Timer.AddTaskByFunc("SyncTaskData", "2 0/3 1-23 * * *", syncData.SyncTaskData)
+	//_, err = global.GVA_Timer.AddTaskByFunc("SyncTaskData", "2 1/3 1-23 * * *", syncData.SyncTaskData)
 	//if err != nil {
 	//	fmt.Println("add SyncTaskData timer error:", err)
 	//}
@@ -115,41 +115,36 @@ func Timer() {
 	//
 	////定时获取扫码平台余额,每小时执行一次
 	////_, err = global.GVA_Timer.AddTaskByFunc("SyncGetWeChatScannerBalance", "0 58 * * * *", serviceWeChatScannerApi.SyncGetWeChatScannerBalance)
-	//_, err = global.GVA_Timer.AddTaskByFunc("SyncGetWeChatScannerBalance", "0 58 * * * *", serviceWeChatScannerApi.SyncGetWeChatScannerBalance)
-	//if err != nil {
-	//	fmt.Println("add UpdateGameVersion timer error:", err)
-	//}
+	////_, err = global.GVA_Timer.AddTaskByFunc("SyncGetWeChatScannerBalance", "0 58 * * * *", serviceWeChatScannerApi.SyncGetWeChatScannerBalance)
+	////if err != nil {
+	////	fmt.Println("add UpdateGameVersion timer error:", err)
+	////}
 	////定时更新异常率
 	//_, err = global.GVA_Timer.AddTaskByFunc("SyncAbnormalRateByBatch", "0 1,31 * * * *", serviceDataAbnormalRate.SyncAbnormalRateByBatch)
 	//if err != nil {
 	//	fmt.Println("add SyncAbnormalRateByBatch timer error:", err)
 	//}
 	//
-	////定时更新当日微信扫码订单列表
-	//_, err = global.GVA_Timer.AddTaskByFunc("SyncTodayWeChatScannerDetailed", "0 3,33 * * * *", serviceWeChatScannerDetailed.SyncTodayWeChatScannerDetailed)
-	//if err != nil {
-	//	fmt.Println("add SyncTodayWeChatScannerDetailed timer error:", err)
-	//}
+	//////定时更新当日微信扫码订单列表
+	////_, err = global.GVA_Timer.AddTaskByFunc("SyncTodayWeChatScannerDetailed", "0 3,33 * * * *", serviceWeChatScannerDetailed.SyncTodayWeChatScannerDetailed)
+	////if err != nil {
+	////	fmt.Println("add SyncTodayWeChatScannerDetailed timer error:", err)
+	////}
 	//
-	////0点更新昨日微信扫码订单列表
-	//_, err = global.GVA_Timer.AddTaskByFunc("SyncYesterdayWeChatScannerDetailed", "1 1 0 * * *", serviceWeChatScannerDetailed.SyncYesterdayWeChatScannerDetailed)
-	//if err != nil {
-	//	fmt.Println("add SyncYesterdayWeChatScannerDetailed timer error:", err)
-	//}
+	//////0点更新昨日微信扫码订单列表
+	////_, err = global.GVA_Timer.AddTaskByFunc("SyncYesterdayWeChatScannerDetailed", "1 1 0 * * *", serviceWeChatScannerDetailed.SyncYesterdayWeChatScannerDetailed)
+	////if err != nil {
+	////	fmt.Println("add SyncYesterdayWeChatScannerDetailed timer error:", err)
+	////}
 	//
-	////半小时同步一次机房设备信息,播报是否有异常
-	//_, err = global.GVA_Timer.AddTaskByFunc("SyncJfDevicesMessage", "0 0,30 * * * *", robotService.SyncJfDevicesMessage)
-	//if err != nil {
-	//	fmt.Println("add SyncJfDevicesMessage timer error:", err)
-	//}
-	//定时获取机房小绵羊新号剩余
-	//_, err := global.GVA_Timer.AddTaskByFunc("SyncJfXmyNewAccount", "0 0,30 * * * *", robotService.SyncJfXmyNewAccount)
-	//if err != nil {
-	//	fmt.Println("add SyncJfXmyNewAccount timer error:", err)
-	//}
+	//////半小时同步一次机房设备信息,播报是否有异常
+	////_, err = global.GVA_Timer.AddTaskByFunc("SyncJfDevicesMessage", "0 0,30 * * * *", robotService.SyncJfDevicesMessage)
+	////if err != nil {
+	////	fmt.Println("add SyncJfDevicesMessage timer error:", err)
+	////}
 	//
 	//// 活跃定时推送消息
-	//_, err = global.GVA_Timer.AddTaskByFunc("TaskMsgSend", "20 2/32 8-21 * * *", syncData.TaskMsgSend)
+	//_, err = global.GVA_Timer.AddTaskByFunc("TaskMsgSend", "20 2/30 8-21 * * *", syncData.TaskMsgSend)
 	//if err != nil {
 	//	fmt.Println("add TaskMsgSend timer error:", err)
 	//}
@@ -173,7 +168,7 @@ func Timer() {
 	//}
 	//
 	//// 23起检测任务完成情况
-	//_, err = global.GVA_Timer.AddTaskByFunc("CheckTaskCompletedInfo", "57 5/4 23 * * *", syncData.CheckTaskCompletedInfo)
+	//_, err = global.GVA_Timer.AddTaskByFunc("CheckTaskCompletedInfo", "57 10/4 23 * * *", syncData.CheckTaskCompletedInfo)
 	//if err != nil {
 	//	fmt.Println("add CheckTaskCompletedInfo timer error:", err)
 	//}
@@ -191,33 +186,49 @@ func Timer() {
 	//}
 	//
 	//// 定时同步arpu值
-	//_, err = global.GVA_Timer.AddTaskByFunc("SyncArpu", "50 36 7,12,23 * * *", syncData.SyncArpu)
+	//_, err = global.GVA_Timer.AddTaskByFunc("SyncArpu", "50 36 23 * * *", syncData.SyncArpu)
 	//if err != nil {
 	//	fmt.Println("add SyncArpu timer error:", err)
 	//}
 	//
 	//// 提醒修改腾讯目标
-	//_, err = global.GVA_Timer.AddTaskByFunc("RemindSendOne", "11 2 18,22 * * *", syncData.RemindSendOne)
+	////_, err = global.GVA_Timer.AddTaskByFunc("RemindSendOne", "11 2 18,22 * * *", syncData.RemindSendOne)
+	////if err != nil {
+	////	fmt.Println("add RemindSendOne timer error:", err)
+	////}
+	//
+	////定时获取机房小绵羊新号剩余
+	//_, err = global.GVA_Timer.AddTaskByFunc("SyncJfXmyNewAccount", "0 0,30 * * * *", robotService.SyncJfXmyNewAccount)
 	//if err != nil {
-	//	fmt.Println("add RemindSendOne timer error:", err)
+	//	fmt.Println("add SyncJfXmyNewAccount timer error:", err)
 	//}
-
-	//一小时同步一次IP信息,播报是否有异常
-	//_, err := global.GVA_Timer.AddTaskByFunc("SyncIPMessage", "0 0 * * * ? ", robotService.SyncIPMessage)
+	//
+	//// 设备信息
+	//_, err = global.GVA_Timer.AddTaskByFunc("DeviceStatistics", "10 9/10 8-23 * * *", serviceStatisticsLog.DeviceStatistics)
 	//if err != nil {
-	//	fmt.Println("add SyncIPMessage timer error:", err)
+	//	fmt.Println("add DeviceStatistics timer error:", err)
 	//}
-
-
-	//每天凌晨3点删除一次过期图片信息
-	_, err := global.GVA_Timer.AddTaskByFunc("DeleteExpireImageRecord", "0 0 3 * * ? ", imageRecordService.DeleteExpireImageRecord)
-	if err != nil {
-		fmt.Println("add DeleteExpireImageRecord timer error:", err)
-	}
-
+	//
 	////定时查看延迟更新的镜像是否到期
-	//_, err = global.GVA_Timer.AddTaskByFunc("CheckPushTime", "35 0/2 * * * *", serviceFileQiniu.CheckPushTime)
+	//_, err = global.GVA_Timer.AddTaskByFunc("CheckPushTime", "35 0/5 * * * *", serviceFileQiniu.CheckPushTime)
 	//if err != nil {
 	//	fmt.Println("add CheckPushTime timer error:", err)
 	//}
+	//
+	//// 半小时同步一次IP信息,播报是否有异常
+	//_, err = global.GVA_Timer.AddTaskByFunc("SyncIPMessage", "50 8/10 9-23 * * ? ", robotService.SyncIPMessage)
+	//if err != nil {
+	//	fmt.Println("add SyncIPMessage timer error:", err)
+	//}
+	//
+	//_, err = global.GVA_Timer.AddTaskByFunc("ComputerUpdateStatus", "30 1/5 8-23 * * *", serviceStatisticsLog.ComputerUpdateStatus)
+	//if err != nil {
+	//	fmt.Println("add ComputerUpdateStatus timer error:", err)
+	//}
+	//
+	////每天凌晨3点删除一次过期图片信息
+	//_, err = global.GVA_Timer.AddTaskByFunc("DeleteExpireImageRecord", "0 0 3 * * ? ", imageRecordService.DeleteExpireImageRecord)
+	//if err != nil {
+	//	fmt.Println("add DeleteExpireImageRecord timer error:", err)
+	//}
 }

+ 58 - 27
model/log/device_log.go

@@ -3,28 +3,28 @@ package log
 import "time"
 
 type DeviceLog struct {
-	Id                 uint   `json:"id"`
-	SimulatorCode      string `json:"simulator_code"`
-	DeviceManufacturer string `json:"device_manufacturer"`
-	DeviceModel        string `json:"device_model"`
-	DeviceImei         string `json:"device_imei"`
-	DeviceSdk          string `json:"device_sdk"`
-	DeviceMac          string `json:"device_mac"`
-	DeviceNumber       string `json:"device_number"`
-	DeviceIp           string `json:"device_ip"`
-	DeviceId           string `json:"device_id"`
-	Account            string `json:"account"`
-	GameId             int    `json:"game_id"`
-	CreateDate         string `json:"create_date"`
-	CreateTime         string `json:"create_time"` // 创建时间
-	IsErr              int8   `json:"is_err"`
-	ErrStatus          uint8  `json:"err_status"`
-	DeviceHex          string `json:"device_hex"`
-	AccountHex         string `json:"account_hex"`
-	LogUuid            string `json:"log_uuid"` //日志UUID
-	ScriptDeviceId     string `json:"script_device_id"`
-	PcCode             string `json:"pc_code"`
-	SimulatorIpCity    string `json:"simulator_ip_city"`
+	Id                 uint      `json:"id"`
+	SimulatorCode      string    `json:"simulator_code"`
+	DeviceManufacturer string    `json:"device_manufacturer"`
+	DeviceModel        string    `json:"device_model"`
+	DeviceImei         string    `json:"device_imei"`
+	DeviceSdk          string    `json:"device_sdk"`
+	DeviceMac          string    `json:"device_mac"`
+	DeviceNumber       string    `json:"device_number"`
+	DeviceIp           string    `json:"device_ip"`
+	DeviceId           string    `json:"device_id"`
+	Account            string    `json:"account"`
+	GameId             int       `json:"game_id"`
+	CreateDate         string    `json:"create_date"`
+	CreateTime         time.Time `json:"create_time"` // 创建时间
+	IsErr              int8      `json:"is_err"`
+	ErrStatus          uint8     `json:"err_status"`
+	DeviceHex          string    `json:"device_hex"`
+	AccountHex         string    `json:"account_hex"`
+	LogUuid            string    `json:"log_uuid"` //日志UUID
+	ScriptDeviceId     string    `json:"script_device_id"`
+	PcCode             string    `json:"pc_code"`
+	SimulatorIpCity    string    `json:"simulator_ip_city"`
 }
 
 func (DeviceLog) TableName() string {
@@ -54,12 +54,43 @@ type DeviceHex struct {
 	GameId             int    `json:"game_id"`
 }
 
+type DeviceErr struct {
+	Id                 uint      `json:"id"`
+	GameId             int       `json:"game_id"`
+	Account            string    `json:"account"`
+	ScriptDeviceId     string    `json:"script_device_id"`
+	DeviceManufacturer string    `json:"device_manufacturer"`
+	DeviceModel        string    `json:"device_model"`
+	DeviceImei         string    `json:"device_imei"`
+	DeviceSdk          string    `json:"device_sdk"`
+	DeviceMac          string    `json:"device_mac"`
+	DeviceNumber       string    `json:"device_number"`
+	DeviceId           string    `json:"device_id"`
+	DeviceHex          string    `json:"device_hex"`
+	AccountHex         string    `json:"account_hex"`
+	CreateTime         time.Time `json:"create_time"` // 创建时间
+	CreateDate         time.Time `json:"create_date"`
+	DeviceLogId        uint      `json:"device_log_id"`
+}
+
 type GameAccount struct {
-	Id             uint      `json:"id"`
-	GameId         int       `json:"game_id"`
-	Account        string    `json:"account"`
-	ScriptDeviceId string    `json:"script_device_id"`
-	CreateTime     time.Time `json:"create_time"` // 创建时间
+	Id                 uint      `json:"id"`
+	GameId             int       `json:"game_id"`
+	Account            string    `json:"account"`
+	ScriptDeviceId     string    `json:"script_device_id"`
+	DeviceManufacturer string    `json:"device_manufacturer"`
+	DeviceModel        string    `json:"device_model"`
+	DeviceImei         string    `json:"device_imei"`
+	DeviceSdk          string    `json:"device_sdk"`
+	DeviceMac          string    `json:"device_mac"`
+	DeviceNumber       string    `json:"device_number"`
+	DeviceId           string    `json:"device_id"`
+	DeviceHex          string    `json:"device_hex"`
+	AccountHex         string    `json:"account_hex"`
+	CreateTime         time.Time `json:"create_time"` // 创建时间
+	UseNum             int       `json:"use_num"`     //账号登录成功次数
+	Identify           int       `json:"identify"`    //图片识别的内容
+	UpdateTime         time.Time `json:"update_time"`
 }
 
 func (GameAccount) TableName() string {

+ 145 - 4
service/levelMonitor/image_record.go

@@ -1,13 +1,21 @@
 package levelMonitor
 
 import (
+	"context"
+	"encoding/json"
 	"errors"
+	"fmt"
 	"go.uber.org/zap"
 	"gorm.io/gorm"
+	"io/ioutil"
 	"log-server/global"
 	"log-server/model/common/request"
 	"log-server/model/levelMonitor"
 	levelRequest "log-server/model/levelMonitor/request"
+	"net/http"
+	"net/url"
+	"strconv"
+	"strings"
 	"time"
 )
 
@@ -15,7 +23,7 @@ type ImageRecordService struct {
 }
 
 //创建图片记录
-func (s *ImageRecordService) CreateImageRecord (record levelMonitor.ImageRecord) (err error) {
+func (s *ImageRecordService) CreateImageRecord(record levelMonitor.ImageRecord) (err error) {
 	//获取今日日期
 	date := time.Now().Format("2006-01-02")
 	var entity levelMonitor.ImageRecord
@@ -24,14 +32,19 @@ func (s *ImageRecordService) CreateImageRecord (record levelMonitor.ImageRecord)
 	record.Status = 2
 	//查找数据库是否存在此账号此游戏今日记录
 	err = global.GVA_DB.Model(&levelMonitor.ImageRecord{}).Where("task_id = ? and account = ? and create_date = ?", record.TaskId, record.Account, date).First(&entity).Error
-	if !errors.Is(err , gorm.ErrRecordNotFound) {
+	if !errors.Is(err, gorm.ErrRecordNotFound) {
 		return errors.New("此记录已存在,请勿重复添加")
 	}
-	return global.GVA_DB.Model(&levelMonitor.ImageRecord{}).Omit("create_time", "update_time").Create(&record).Error
+	err = global.GVA_DB.Model(&levelMonitor.ImageRecord{}).Omit("create_time", "update_time").Create(&record).Error
+	if err != nil {
+		return err
+	}
+	go s.ImageIdentify(record)
+	return
 }
 
 //删除三日前的图片记录
-func (s *ImageRecordService) DeleteExpireImageRecord() ()  {
+func (s *ImageRecordService) DeleteExpireImageRecord() {
 	markTime := time.Now().Add(-time.Hour * 48).Format("2006-01-02")
 	err := global.GVA_DB.Model(&levelMonitor.ImageRecord{}).Delete("create_date < ?", markTime).Error
 	if err != nil {
@@ -91,3 +104,131 @@ func (s *ImageRecordService) GetImageRecordList(record levelRequest.ImageRecordR
 	}
 	return recordList, total, err
 }
+
+const API_KEY = "z9GNcyrC7VeV3g1xXEj3YL1s"
+const SECRET_KEY = "VASRBsEzeVsyKduSkkflfL87r5yqoqvj"
+const BAIDU_IDENTIFY = "baiduIdentifyToken"
+
+func (s *ImageRecordService) ImageIdentify(record levelMonitor.ImageRecord) {
+	token, err := GetAccessToken()
+	if err != nil {
+		global.GVA_LOG.Error("get token fail", zap.Error(err))
+		s.UpdateImageRecordStatus(record.Id, "get token fail", -1)
+		return
+	}
+	body, err := Request(token, record.ImageBase64)
+	if err != nil {
+		global.GVA_LOG.Error("Read Body Fail", zap.Error(err))
+		s.UpdateImageRecordStatus(record.Id, err.Error(), -1)
+		return
+	}
+	type Data struct {
+		WordsResult []struct {
+			Words string `json:"words"`
+		} `json:"words_result"`
+		WordsResultNum int `json:"words_result_num"`
+		LogId          int `json:"log_id"`
+	}
+	var data Data
+	err = json.Unmarshal(body, &data)
+	if err != nil {
+		global.GVA_LOG.Error("Read Body Fail", zap.Error(err))
+		s.UpdateImageRecordStatus(record.Id, "Read Body Fail", -1)
+		return
+	}
+	s.UpdateImageRecordStatus(record.Id, string(body), 1)
+	identify := 0
+	if len(data.WordsResult) > 1 {
+		for _, words := range data.WordsResult {
+			i, err := strconv.Atoi(words.Words)
+			if err == nil {
+				identify = i
+				break
+			}
+		}
+	} else {
+		i, _ := strconv.Atoi(data.WordsResult[0].Words)
+		identify = i
+	}
+	if identify == 0 {
+		return
+	}
+	UpdateGameAccountIdentify(record.Account, record.TaskId, identify)
+	return
+}
+
+func (s *ImageRecordService) UpdateImageRecordStatus(id int, result string, status int) {
+	update := map[string]interface{}{
+		"result": result,
+		"status": status,
+	}
+	global.GVA_DB.Model(&levelMonitor.ImageRecord{}).Where("id", id).Updates(update)
+}
+
+func Request(baiduToken, content string) (body []byte, err error) {
+	reqUrl := "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token=" + baiduToken
+	var (
+		params = url.Values{}
+	)
+	params.Set("image", content)
+	requestData := params.Encode()
+	payload := strings.NewReader(requestData)
+	client := &http.Client{}
+	req, err := http.NewRequest("POST", reqUrl, payload)
+
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+	req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
+	req.Header.Add("Accept", "application/json")
+
+	res, err := client.Do(req)
+	if err != nil {
+		global.GVA_LOG.Error("request Identify fail", zap.Error(err))
+		return
+	}
+	defer res.Body.Close()
+
+	body, err = ioutil.ReadAll(res.Body)
+	if err != nil {
+		global.GVA_LOG.Error("Read Body Fail", zap.Error(err))
+		return
+	}
+	fmt.Println(string(body))
+	return
+}
+
+// 更新game_acount
+func UpdateGameAccountIdentify(account string, gameId int, identify int) {
+	global.GVA_DB.Table("game_account").Where("game_id", gameId).Where("account", account).Update("identify", identify)
+}
+
+/**
+ * 使用 AK,SK 生成鉴权签名(Access Token)
+ * @return string 鉴权签名信息(Access Token)
+ */
+func GetAccessToken() (string, error) {
+	ctx := context.Background()
+	token, err := global.GVA_REDIS.Get(ctx, BAIDU_IDENTIFY).Result()
+	if err != nil || token == "" {
+		reqUrl := "https://aip.baidubce.com/oauth/2.0/token"
+		postData := fmt.Sprintf("grant_type=client_credentials&client_id=%s&client_secret=%s", API_KEY, SECRET_KEY)
+		resp, err := http.Post(reqUrl, "application/x-www-form-urlencoded", strings.NewReader(postData))
+		if err != nil {
+			fmt.Println(err)
+			return "", err
+		}
+		defer resp.Body.Close()
+		body, err := ioutil.ReadAll(resp.Body)
+		if err != nil {
+			fmt.Println(err)
+			return "", err
+		}
+		accessTokenObj := map[string]string{}
+		json.Unmarshal(body, &accessTokenObj)
+		global.GVA_REDIS.Set(ctx, BAIDU_IDENTIFY, accessTokenObj["access_token"], time.Hour*24*29)
+		return accessTokenObj["access_token"], err
+	}
+	return token, err
+}

+ 82 - 18
service/log/loging/logical_log.go

@@ -941,10 +941,21 @@ func (s *LogicalLog) AddDeviceLog(request request.AddLogRequest) {
 	logSC.PcCode = request.PcCode
 	logSC.SimulatorIpCity = request.SimulatorIpCity
 	ctx := context.Background()
+	if s.CheckDeviceLogIsSave(logSC) {
+		logSC.IsErr = 1
+		logSC.ErrStatus = 4
+		logSC.CreateDate = time.Now().Format("2006-01-02")
+		err := global.GVA_DB.Omit("create_time").Create(&logSC).Error
+		if err != nil {
+			global.GVA_LOG.Error("create LogScanningCode fail", zap.Error(err))
+		}
+		return
+	}
+	var deviceLogs []log.DeviceErr
 	if request.TaskType == 1 {
-		var deviceLog = log.DeviceLog{}
-		if !errors.Is(global.GVA_DB.Where("account = ?", request.Account).Where("game_id = ?", request.GameId).Order("id desc").First(&deviceLog).Error, gorm.ErrRecordNotFound) {
-			if deviceLog.AccountHex != logSC.AccountHex {
+		global.GVA_DB.Table("game_account").Where("account = ?", request.Account).Where("game_id = ?", request.GameId).Order("id desc").Limit(1).Find(&deviceLogs)
+		if len(deviceLogs) != 0 {
+			if deviceLogs[0].AccountHex != "" && deviceLogs[0].AccountHex != logSC.AccountHex {
 				logSC.IsErr = 1
 				logSC.ErrStatus = 3
 				gameDeviceErrKey := fmt.Sprintf(GameDeviceErrKey, logSC.CreateDate, request.GameId)
@@ -952,13 +963,8 @@ func (s *LogicalLog) AddDeviceLog(request request.AddLogRequest) {
 			}
 		}
 	} else {
-		var deviceLogs []log.DeviceLog
-		if !errors.Is(global.GVA_DB.Where("create_date = ?", logSC.CreateDate).Where("game_id = ?", request.GameId).Where("device_hex = ?", logSC.DeviceHex).Order("id desc").Limit(10).Find(&deviceLogs).Error, gorm.ErrRecordNotFound) {
-			mps := make(map[string]int, 10)
-			for _, dl := range deviceLogs {
-				mps[dl.Account] = 1
-			}
-			if len(mps) > 2 {
+		if !errors.Is(global.GVA_DB.Table("game_account").Where("game_id = ?", request.GameId).Where("account != ?", request.Account).Where("device_hex = ?", logSC.DeviceHex).Order("id desc").Limit(10).Find(&deviceLogs).Error, gorm.ErrRecordNotFound) {
+			if len(deviceLogs) > 2 {
 				logSC.IsErr = 1
 				logSC.ErrStatus = 2
 				gameDeviceAccountErrKey := fmt.Sprintf(GameDeviceAccountErrKey, logSC.CreateDate, request.GameId)
@@ -971,6 +977,39 @@ func (s *LogicalLog) AddDeviceLog(request request.AddLogRequest) {
 	if err != nil {
 		global.GVA_LOG.Error("create LogScanningCode fail", zap.Error(err))
 	}
+	if logSC.ErrStatus == 3 || logSC.ErrStatus == 2 {
+		s.AddDeviceErr(logSC, deviceLogs)
+	}
+}
+
+func (s *LogicalLog) AddDeviceErr(deviceLog *log.DeviceLog, deviceErrs []log.DeviceErr) {
+	var deviceErr = log.DeviceErr{}
+	deviceErr.GameId = deviceLog.GameId
+	deviceErr.ScriptDeviceId = deviceLog.ScriptDeviceId
+	deviceErr.Account = deviceLog.Account
+	deviceErr.DeviceId = deviceLog.DeviceId
+	deviceErr.DeviceImei = deviceLog.DeviceImei
+	deviceErr.DeviceMac = deviceLog.DeviceMac
+	deviceErr.DeviceManufacturer = deviceLog.DeviceManufacturer
+	deviceErr.DeviceModel = deviceLog.DeviceModel
+	deviceErr.DeviceSdk = deviceLog.DeviceSdk
+	deviceErr.DeviceNumber = deviceLog.DeviceNumber
+	deviceErr.AccountHex = deviceLog.AccountHex
+	deviceErr.DeviceHex = deviceLog.DeviceHex
+	deviceErr.CreateTime = time.Now()
+	deviceErrs = append(deviceErrs, deviceErr)
+	for k, _ := range deviceErrs {
+		deviceErrs[k].DeviceLogId = deviceLog.Id
+		deviceErrs[k].CreateDate = time.Now()
+	}
+	err := global.GVA_DB.Table("device_err").Omit("id").Create(&deviceErrs).Error
+	if err != nil {
+		global.GVA_LOG.Error("create AddAccount fail", zap.Error(err))
+	}
+}
+
+func (s *LogicalLog) CheckDeviceLogIsSave(deviceLog *log.DeviceLog) bool {
+	return deviceLog.DeviceManufacturer == "" || deviceLog.DeviceModel == "" || deviceLog.DeviceImei == "" || deviceLog.DeviceSdk == "" || deviceLog.DeviceMac == "" || deviceLog.DeviceNumber == "" || deviceLog.DeviceId == ""
 }
 
 func (s *LogicalLog) DeviceHexLog(request request.AddLogRequest) string {
@@ -1018,13 +1057,23 @@ func (s *LogicalLog) UpdateDeviceLogScriptId(logUuid string, scriptDeviceId stri
 	}
 }
 
-func (s *LogicalLog) AddAccount(request request.AddLogRequest) {
-
+func (s *LogicalLog) AddAccount(request request.AddLogRequest, deviceLog log.DeviceLog) {
 	gameAccount := new(log.GameAccount)
 	gameAccount.GameId = request.GameId
 	gameAccount.ScriptDeviceId = request.ScriptDeviceId
 	gameAccount.Account = request.Account
-	err := global.GVA_DB.Omit("create_time").Create(&gameAccount).Error
+	if deviceLog.ErrStatus != 4 {
+		gameAccount.DeviceId = deviceLog.DeviceId
+		gameAccount.DeviceImei = deviceLog.DeviceImei
+		gameAccount.DeviceMac = deviceLog.DeviceMac
+		gameAccount.DeviceManufacturer = deviceLog.DeviceManufacturer
+		gameAccount.DeviceModel = deviceLog.DeviceModel
+		gameAccount.DeviceSdk = deviceLog.DeviceSdk
+		gameAccount.DeviceNumber = deviceLog.DeviceNumber
+		gameAccount.AccountHex = deviceLog.AccountHex
+		gameAccount.DeviceHex = deviceLog.DeviceHex
+	}
+	err := global.GVA_DB.Omit("create_time", "update_time", "use_num").Create(&gameAccount).Error
 	if err != nil {
 		global.GVA_LOG.Error("create AddAccount fail", zap.Error(err))
 	}
@@ -1054,7 +1103,10 @@ func (s *LogicalLog) CheckDeviceId(request request.AddLogRequest) {
 		global.GVA_LOG.Error("get CheckDeviceId fail", zap.Error(errors.New("没有获取到设备id")))
 		return
 	}
-	s.UpdateDeviceLogScriptId(request.LogUuid, request.ScriptDeviceId, time.Now().Format("2006-01-02"))
+	date := time.Now().Format("2006-01-02")
+	s.UpdateDeviceLogScriptId(request.LogUuid, request.ScriptDeviceId, date)
+	var device log.DeviceLog
+	global.GVA_DB.Table("device_log").Where("create_date = ?", date).Where("log_uuid = ?", request.LogUuid).First(&device)
 	global.GVA_LOG.Warn("进入 CheckDeviceId")
 	if request.TaskType == 0 {
 		b, deviceLog := s.CheckDeviceIdErr(request.ScriptDeviceId, request.LogUuid, request.GameId)
@@ -1064,7 +1116,7 @@ func (s *LogicalLog) CheckDeviceId(request request.AddLogRequest) {
 			//ct := fmt.Sprintf("<font color=\"warning\">%s:%d, 相同设备id</font>", request.PcCode, request.GameId)
 			//s.SendDeviceMsg(ct, request.Operator)
 		}
-		s.AddAccount(request)
+		s.AddAccount(request, device)
 		return
 	}
 	var gameAccount log.GameAccount
@@ -1072,7 +1124,7 @@ func (s *LogicalLog) CheckDeviceId(request request.AddLogRequest) {
 	if result.Error != nil {
 		if result.Error == gorm.ErrRecordNotFound {
 			// 数据不存在,执行创建操作
-			s.AddAccount(request)
+			s.AddAccount(request, device)
 			return
 		} else {
 			// 其他错误
@@ -1080,13 +1132,25 @@ func (s *LogicalLog) CheckDeviceId(request request.AddLogRequest) {
 			return
 		}
 	}
-	if gameAccount.ScriptDeviceId != request.ScriptDeviceId {
+	if gameAccount.ScriptDeviceId != request.ScriptDeviceId || device.ErrStatus == 3 || gameAccount.DeviceHex == "" {
 		s.AddScriptDeviceErr(request.GameId, request.Account, gameAccount.ScriptDeviceId, request.ScriptDeviceId, gameAccount.Account, gameAccount.GameId, 1, request.PcCode, request.Operator)
 		//ct := fmt.Sprintf("<font color=\"warning\">%s:%d, 设备id出现不同</font>", request.PcCode, request.GameId)
 		//s.SendDeviceMsg(ct, request.Operator)
 		gameAccount.ScriptDeviceId = request.ScriptDeviceId
-		global.GVA_DB.Save(&gameAccount)
+		if gameAccount.DeviceHex != device.DeviceHex {
+			gameAccount.DeviceId = device.DeviceId
+			gameAccount.DeviceImei = device.DeviceImei
+			gameAccount.DeviceMac = device.DeviceMac
+			gameAccount.DeviceManufacturer = device.DeviceManufacturer
+			gameAccount.DeviceModel = device.DeviceModel
+			gameAccount.DeviceSdk = device.DeviceSdk
+			gameAccount.DeviceNumber = device.DeviceNumber
+			gameAccount.AccountHex = device.AccountHex
+			gameAccount.DeviceHex = device.DeviceHex
+		}
 	}
+	gameAccount.UseNum += 1
+	global.GVA_DB.Save(&gameAccount)
 }
 
 func (s *LogicalLog) SendDeviceMsg(content string, operator string) {