Parcourir la source

Merge remote-tracking branch 'origin/master'

chengqian il y a 5 mois
Parent
commit
96e8c02859

+ 2 - 0
server/api/v1/devices/enter.go

@@ -6,10 +6,12 @@ type ApiGroup struct {
 	ScreensApi
 	ProgramApi
 	SoundPeriodApi
+	VoiceApi
 }
 
 var (
 	ScreensService     = service.ServiceGroupApp.DevicesServiceGroup.ScreensService
 	programService     = service.ServiceGroupApp.DevicesServiceGroup.ProgramService
 	soundPeriodService = service.ServiceGroupApp.DevicesServiceGroup.SoundPeriodService
+	voiceService       = service.ServiceGroupApp.DevicesServiceGroup.VoiceService
 )

+ 27 - 0
server/api/v1/devices/screens.go

@@ -114,3 +114,30 @@ func (a ScreensApi) GetScreensList(c *gin.Context) {
 		PageSize: pageInfo.PageSize,
 	}, "获取成功", c)
 }
+
+func (a ScreensApi) QueryEventByUserId(c *gin.Context) {
+	id := utils.GetUserID(c)
+	data, err := ScreensService.QueryEventByUserId(int(id))
+	if err != nil {
+		global.GVA_LOG.Error("QueryEventByUserId === ", zap.Error(err))
+		response.FailWithMessage("查询失败", c)
+		return
+	}
+	response.OkWithData(data, c)
+}
+
+func (a ScreensApi) Sending(c *gin.Context) {
+	var json devices.JSONForm
+	err := c.ShouldBindJSON(&json)
+	if err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+	err = ScreensService.Sending(json.Sn, json.Json)
+	if err != nil {
+		global.GVA_LOG.Error("Sending === ", zap.Error(err))
+		response.FailWithMessage("发送失败", c)
+		return
+	}
+	response.Ok(c)
+}

+ 45 - 0
server/api/v1/devices/voice.go

@@ -0,0 +1,45 @@
+package devices
+
+import (
+	"github.com/gin-gonic/gin"
+	"go.uber.org/zap"
+	"server/global"
+	"server/model/common/response"
+	"server/model/devices"
+)
+
+type VoiceApi struct{}
+
+func (va *VoiceApi) CreateVoice(c *gin.Context) {
+	var info devices.VoiceReq
+	if err := c.ShouldBindJSON(&info); err != nil {
+		global.GVA_LOG.Error("CreateVoice === ", zap.Error(err))
+		response.FailWithMessage("参数错误", c)
+		return
+	}
+	err := voiceService.CreateVoice(info)
+	if err != nil {
+		global.GVA_LOG.Error("CreateVoice === ", zap.Error(err))
+		response.FailWithMessage("新增失败", c)
+		return
+	}
+
+	response.Ok(c)
+}
+
+func (va *VoiceApi) UpdateVoice(c *gin.Context) {
+	var info devices.VoiceReq
+	if err := c.ShouldBindJSON(&info); err != nil {
+		global.GVA_LOG.Error("UpdateVoice === ", zap.Error(err))
+		response.FailWithMessage("参数错误", c)
+		return
+	}
+	err := voiceService.UpdateVoice(info)
+	if err != nil {
+		global.GVA_LOG.Error("UpdateVoice === ", zap.Error(err))
+		response.FailWithMessage("更新失败", c)
+		return
+	}
+
+	response.Ok(c)
+}

+ 1 - 1
server/config.yaml

@@ -125,7 +125,7 @@ mysql:
     config: charset=utf8mb4&parseTime=True&loc=Local
     db-name: smart_intersection2.0
     username: root
-    password: 123456
+    password: root
     path: 127.0.0.1
     engine: ""
     log-mode: error

+ 21 - 0
server/dao/dev_event.go

@@ -12,3 +12,24 @@ type Event struct {
 func (Event) TableName() string {
 	return "dev_event"
 }
+
+func QueryEventByUserId(userId int) (data interface{}, err error) {
+	var results []struct {
+		Event
+		ProjectName string
+		ScreensName string
+	}
+
+	err = global.GVA_DB.Table("dev_event").
+		Select("dev_event.*, project.project_name, dev_screens.screens_name").
+		Joins("LEFT JOIN dev_screens ON dev_screens.sn = dev_event.sn").
+		Joins("LEFT JOIN project ON project.id = dev_screens.project_id").
+		Joins("LEFT JOIN user_project ON user_project.project_id = project.id").
+		Where("user_project.sys_user_id = ?", userId).
+		Order("dev_event.id DESC").
+		Scan(&results).Error
+	if err != nil {
+		return nil, err
+	}
+	return results, err
+}

+ 4 - 1
server/dao/dev_screens.go

@@ -22,6 +22,9 @@ type Screens struct {
 
 	SoundPeriodId int         `gorm:"type:int" json:"soundPeriodId"`
 	SoundPeriod   SoundPeriod `gorm:"foreignkey:SoundPeriodId"`
+
+	VoiceId int   `gorm:"type:int" json:"voiceId"`
+	Voice   Voice `gorm:"foreignkey:VoiceId"`
 }
 
 func (Screens) TableName() string {
@@ -60,7 +63,7 @@ func (s Screens) GetScreensList(limit, offset, projectId int, sn string, uid uin
 	if err != nil {
 		return
 	}
-	err = db.Limit(limit).Offset(offset).Preload("SoundPeriod").Preload("Program").Preload("Project").Find(&screensList).Error
+	err = db.Limit(limit).Offset(offset).Preload("Voice").Preload("SoundPeriod").Preload("Program").Preload("Project").Find(&screensList).Error
 	return
 }
 

+ 16 - 0
server/dao/dev_voice.go

@@ -0,0 +1,16 @@
+package dao
+
+import "server/global"
+
+type Voice struct {
+	global.GVA_MODEL
+	Num0 string `json:"num0" gorm:"column:num0"`
+	Num1 string `json:"num1" gorm:"column:num1"`
+	Num2 string `json:"num2" gorm:"column:num2"`
+	Num3 string `json:"num3" gorm:"column:num3"`
+	Num4 string `json:"num4" gorm:"column:num4"`
+}
+
+func (Voice) TableName() string {
+	return "dev_voice"
+}

+ 1 - 0
server/initialize/router.go

@@ -92,6 +92,7 @@ func Routers() *gin.Engine {
 		devicesRouter.InitScreensRouter(PrivateGroup) //注册设备管理路由
 		devicesRouter.InitProgramRouter(PrivateGroup)
 		devicesRouter.InitSoundPeriodRouter(PrivateGroup)
+		devicesRouter.InitVoiceRouter(PrivateGroup)
 	}
 
 	global.GVA_LOG.Info("router register success")

+ 22 - 0
server/model/devices/common.go

@@ -57,3 +57,25 @@ type SetPeropdtime struct {
 type PeriodtimeJSON struct {
 	Setperiodtime0 SetPeropdtime `json:"setperiodtime0"`
 }
+
+type VoiceReq struct {
+	DeviceSn string    `json:"deviceSn"`
+	Voice    dao.Voice `json:"voice"`
+}
+
+type VoiceJSON struct {
+	Audionumset0 SetVoice `json:"audionumset0"`
+}
+
+type SetVoice struct {
+	Num0 string `json:"num0"`
+	Num1 string `json:"num1"`
+	Num2 string `json:"num2"`
+	Num3 string `json:"num3"`
+	Num4 string `json:"num4"`
+}
+
+type JSONForm struct {
+	Sn   string `json:"sn"`
+	Json string `json:"json"`
+}

+ 1 - 0
server/router/devices/enter.go

@@ -4,4 +4,5 @@ type RouterGroup struct {
 	ScreensRouter
 	ProgramRouter
 	SoundPeriodRouter
+	VoiceRouter
 }

+ 2 - 0
server/router/devices/screens.go

@@ -18,9 +18,11 @@ func (s *ScreensRouter) InitScreensRouter(Router *gin.RouterGroup) {
 		screensRouter.POST("addScreens", baseApi.AddScreens)      // 增加LED
 		screensRouter.PUT("updateScreens", baseApi.UpdateScreens) // 编辑
 		screensRouter.DELETE("delScreens", baseApi.DelScreens)    // 删除
+		screensRouter.POST("sending", baseApi.Sending)
 	}
 
 	{
 		screensRouterWithoutRecord.POST("getScreensList", baseApi.GetScreensList) //获取显示屏列表
+		screensRouterWithoutRecord.GET("queryEventByUserId", baseApi.QueryEventByUserId)
 	}
 }

+ 22 - 0
server/router/devices/voice.go

@@ -0,0 +1,22 @@
+package devices
+
+import (
+	"github.com/gin-gonic/gin"
+	v1 "server/api/v1"
+	"server/middleware"
+)
+
+type VoiceRouter struct{}
+
+func (s *VoiceRouter) InitVoiceRouter(Router *gin.RouterGroup) {
+	voiceRouter := Router.Group("voice").Use(middleware.OperationRecord())
+
+	voiceApi := v1.ApiGroupApp.DevicesApiGroup.VoiceApi
+
+	{
+		voiceRouter.POST("createVoice", voiceApi.CreateVoice) // 增加LED
+		voiceRouter.PUT("updateVoice", voiceApi.UpdateVoice)  // 编辑
+	}
+	{
+	}
+}

+ 1 - 0
server/service/devices/enter.go

@@ -4,4 +4,5 @@ type ServiceGroup struct {
 	ScreensService
 	ProgramService
 	SoundPeriodService
+	VoiceService
 }

+ 8 - 0
server/service/devices/screens.go

@@ -28,3 +28,11 @@ func (s ScreensService) GetScreensList(info devices.SearchInfo, userId uint) (li
 	screensList, t, err := dao.Screens{}.GetScreensList(limit, offset, int(info.ProjectId), info.Sn, userId)
 	return screensList, t, err
 }
+
+func (s ScreensService) QueryEventByUserId(userId int) (data interface{}, err error) {
+	return dao.QueryEventByUserId(userId)
+}
+
+func (s ScreensService) Sending(sn, json string) error {
+	return Sending(sn, json)
+}

+ 71 - 0
server/service/devices/voice.go

@@ -0,0 +1,71 @@
+package devices
+
+import (
+	"encoding/json"
+	"fmt"
+	"server/dao"
+	"server/global"
+	"server/model/devices"
+	"server/utils/protocol"
+)
+
+type VoiceService struct {
+}
+
+func (vs *VoiceService) CreateVoice(info devices.VoiceReq) error {
+	result := devices.VoiceJSON{
+		Audionumset0: devices.SetVoice{
+			Num0: info.Voice.Num0,
+			Num1: info.Voice.Num1,
+			Num2: info.Voice.Num2,
+			Num3: info.Voice.Num3,
+			Num4: info.Voice.Num4,
+		},
+	}
+
+	// 序列化为 JSON 字符串
+	jsonBytes, err := json.MarshalIndent(result, "", "  ")
+	if err != nil {
+		return fmt.Errorf("转换失败: %v", err)
+	}
+
+	err = MqttService.Publish(MqttService.GetTopic(info.DeviceSn, protocol.TopicChanStatus), jsonBytes)
+	if err != nil {
+		return fmt.Errorf("error updating: %v", err)
+	}
+
+	err = global.GVA_DB.Create(&info.Voice).Error
+	if err != nil {
+		return err
+	}
+	err = global.GVA_DB.Model(dao.Screens{}).Where("sn = ?", info.DeviceSn).Update("program_id", info.Voice.ID).Error
+	if err != nil {
+		return err
+	}
+	return err
+}
+
+func (vs *VoiceService) UpdateVoice(info devices.VoiceReq) error {
+	result := devices.VoiceJSON{
+		Audionumset0: devices.SetVoice{
+			Num0: info.Voice.Num0,
+			Num1: info.Voice.Num1,
+			Num2: info.Voice.Num2,
+			Num3: info.Voice.Num3,
+			Num4: info.Voice.Num4,
+		},
+	}
+
+	// 序列化为 JSON 字符串
+	jsonBytes, err := json.MarshalIndent(result, "", "  ")
+	if err != nil {
+		return fmt.Errorf("转换失败: %v", err)
+	}
+
+	err = MqttService.Publish(MqttService.GetTopic(info.DeviceSn, protocol.TopicChanStatus), jsonBytes)
+	if err != nil {
+		return fmt.Errorf("error updating: %v", err)
+	}
+
+	return global.GVA_DB.Save(&info).Error
+}

+ 15 - 0
web/src/api/screens.js

@@ -38,3 +38,18 @@ export const delScreens = (data) => {
     data: data
   })
 }
+
+export const queryEventByUserId = () => {
+  return service({
+    url: '/screens/queryEventByUserId',
+    method: 'get'
+  })
+}
+
+export const sending = (data) => {
+  return service({
+    url: '/screens/sending',
+    method: 'post',
+    data
+  })
+}

+ 17 - 0
web/src/api/voice.js

@@ -0,0 +1,17 @@
+import service from '@/utils/request'
+
+export const createVoice = (data) => {
+  return service({
+    url: '/voice/createVoice',
+    method: 'post',
+    data
+  })
+}
+
+export const updateVoice = (data) => {
+  return service({
+    url: '/voice/updateVoice',
+    method: 'put',
+    data
+  })
+}

+ 12 - 35
web/src/view/dashboard/dashboardTable/dashboardTable.vue

@@ -1,23 +1,7 @@
 <template>
   <div class="commit-table">
-    <div class="commit-table-title">
-      更新日志
-    </div>
-    <div class="log">
-      <div
-        v-for="(item,key) in dataTimeline"
-        :key="key"
-        class="log-item"
-      >
-        <div class="flex-1 flex key-box">
-          <span
-            class="key"
-            :class="key<3&&'top'"
-          >{{ key+1 }}</span>
-        </div>
-        <div class="flex-5 flex message">{{ item.message }}</div>
-        <div class="flex-3 flex form">{{ item.from }}</div>
-      </div>
+    <div v-for="(i,j) in eventData" :key="j">
+      {{i.ProjectName}} {{i.ScreensName}} {{i.type}} {{i.time}}
     </div>
   </div>
 </template>
@@ -25,32 +9,25 @@
 <script setup>
 import { Commits } from '@/api/github'
 import { formatTimeToStr } from '@/utils/date.js'
-import { ref } from 'vue'
+import { ref, onMounted } from 'vue'
+import {queryEventByUserId} from "@/api/screens";
 
 defineOptions({
   name: 'DashboardTable',
 })
 
-const loading = ref(true)
-const dataTimeline = ref([])
+const eventData = ref()
 
-const loadCommits = () => {
-  Commits(0).then(({ data }) => {
-    loading.value = false
-    data.forEach((element, index) => {
-      if (element.commit.message && index < 10) {
-        dataTimeline.value.push({
-          from: formatTimeToStr(element.commit.author.date, 'yyyy-MM-dd'),
-          title: element.commit.author.name,
-          showDayAndMonth: true,
-          message: element.commit.message,
-        })
-      }
-    })
+const getData = async() => {
+  await queryEventByUserId().then(ref => {
+    console.log(ref)
+    eventData.value = ref.data
   })
 }
 
-loadCommits()
+onMounted(() => {
+  getData()
+})
 </script>
 
 <style lang="scss" scoped>

+ 131 - 4
web/src/view/devicesAdmin/screens/screens.vue

@@ -306,7 +306,10 @@
                   type="success"
                   @click="storageProgram"
                 >存储</el-button>
-                <el-button type="primary">发送</el-button>
+                <el-button
+                  type="primary"
+                  @click="sendingFun('setdiscontent0')"
+                >发送</el-button>
               </el-form-item>
             </el-form>
           </el-tab-pane>
@@ -378,7 +381,70 @@
                   type="success"
                   @click="storageSoundPeriod"
                 >存储</el-button>
-                <el-button type="primary">发送</el-button>
+                <el-button
+                  type="primary"
+                  @click="sendingFun('setperiodtime0')"
+                >发送</el-button>
+              </el-form-item>
+            </el-form>
+          </el-tab-pane>
+          <el-tab-pane
+            label="语音"
+            name="voice"
+          >
+            <el-form
+              :model="soundPeriodData"
+              label-width="auto"
+            >
+              <el-form-item label="无车">
+                <el-input
+                  v-model="voiceData.num0"
+                  style="width: 240px;"
+                  maxlength="30"
+                  show-word-limit
+                />
+              </el-form-item>
+              <el-form-item label="正常">
+                <el-input
+                  v-model="voiceData.num1"
+                  style="width: 240px;"
+                  maxlength="30"
+                  show-word-limit
+                />
+              </el-form-item>
+              <el-form-item label="超速">
+                <el-input
+                  v-model="voiceData.num2"
+                  style="width: 240px;"
+                  maxlength="30"
+                  show-word-limit
+                />
+              </el-form-item>
+              <el-form-item label="对向">
+                <el-input
+                  v-model="voiceData.num3"
+                  style="width: 240px;"
+                  maxlength="30"
+                  show-word-limit
+                />
+              </el-form-item>
+              <el-form-item label="双向">
+                <el-input
+                  v-model="voiceData.num4"
+                  style="width: 240px;"
+                  maxlength="30"
+                  show-word-limit
+                />
+              </el-form-item>
+              <el-form-item>
+                <el-button
+                  type="success"
+                  @click="storageVoice"
+                >存储</el-button>
+                <el-button
+                  type="primary"
+                  @click="sendingFun('audionumset0')"
+                >发送</el-button>
               </el-form-item>
             </el-form>
           </el-tab-pane>
@@ -400,11 +466,12 @@
   </div>
 </template>
 <script setup>
-import { addScreens, delScreens, getProjectList, getScreensList, updateScreens } from '@/api/screens'
+import { addScreens, delScreens, getProjectList, getScreensList, sending, updateScreens } from '@/api/screens'
 import { ref, onMounted } from 'vue'
 import { ElMessage, ElMessageBox } from 'element-plus'
 import { createProgram, updateProgram } from '@/api/program'
-import {createSoundPeriod, updateSoundPeriod} from "@/api/soundPeriod";
+import { createSoundPeriod, updateSoundPeriod } from '@/api/soundPeriod'
+import { createVoice, updateVoice } from '@/api/voice'
 
 const page = ref(1)
 const total = ref(0)
@@ -550,6 +617,7 @@ const openSet = (val) => {
   showSettingDialog.value = true
   deviceSn.value = val.sn
   programData.value = val.Program
+  voiceData.value = val.Voice
   if (val.soundPeriodId === 0) {
     isWarning.value = true
     soundPeriodData.value = soundPeriodForm.value
@@ -783,6 +851,65 @@ const storageSoundPeriod = async() => {
     })
   }
 }
+
+// 语言
+
+const voiceData = ref()
+
+const storageVoice = async() => {
+  if (voiceData.value.ID === 0) {
+    console.log('create')
+    await createVoice({
+      deviceSn: deviceSn.value,
+      voice: voiceData.value,
+    }).then(res => {
+      if (res.code === 0) {
+        ElMessage.success('存储成功')
+      }
+      getTableData()
+    })
+  } else {
+    console.log('update')
+    await updateVoice({
+      deviceSn: deviceSn.value,
+      voice: voiceData.value,
+    }).then(res => {
+      if (res.code === 0) {
+        ElMessage.success('存储成功')
+      }
+      getTableData()
+    })
+  }
+}
+
+const sendingFun = async(val) => {
+  let json = ''
+  if (val === 'setdiscontent0') {
+    json = JSON.stringify({
+      setdiscontent0: programData.value
+    })
+  } else if (val === 'setperiodtime0') {
+    json = JSON.stringify({
+      setperiodtime0: soundPeriodData.value
+    })
+  } else if (val === 'audionumset0') {
+    json = JSON.stringify({
+      audionumset0: voiceData.value
+    })
+  } else {
+    return
+  }
+  await sending({
+    sn: deviceSn.value,
+    json: json,
+  }).then(res => {
+    if (res.code === 0) {
+      ElMessage.success('发送成功')
+    }
+    getTableData()
+  })
+}
+
 </script>
 <style>
 .el-table .success-row {