Selaa lähdekoodia

Merge branch 'master' of http://git.xt.wenhq.top:8083/wenhongquan/khyznh-ui

# Conflicts:
#	src/views/index.vue
liwei19941102 2 vuotta sitten
vanhempi
commit
6d1f47752a

+ 1 - 1
.env.development

@@ -1,5 +1,5 @@
 # 页面标题
 # 页面标题
-VITE_APP_TITLE = 客货邮智能化管理系统
+VITE_APP_TITLE = 农村客运信息化管理系统
 
 
 # 开发环境配置
 # 开发环境配置
 VITE_APP_ENV = 'development'
 VITE_APP_ENV = 'development'

+ 1 - 1
.env.production

@@ -1,5 +1,5 @@
 # 页面标题
 # 页面标题
-VITE_APP_TITLE = 客货邮智能化管理系统
+VITE_APP_TITLE = 农村客运信息化管理系统
 
 
 # 生产环境配置
 # 生产环境配置
 VITE_APP_ENV = 'production'
 VITE_APP_ENV = 'production'

+ 1 - 1
index.html

@@ -6,7 +6,7 @@
     <meta name="renderer" content="webkit" />
     <meta name="renderer" content="webkit" />
     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
     <link rel="icon" href="/favicon.ico" />
     <link rel="icon" href="/favicon.ico" />
-    <title>客货邮智能化管理系统</title>
+    <title>农村客运信息化管理系统</title>
     <!--[if lt IE 11
     <!--[if lt IE 11
       ]><script>
       ]><script>
         window.location.href='/html/ie.html';
         window.location.href='/html/ie.html';

+ 1 - 1
package.json

@@ -1,7 +1,7 @@
 {
 {
   "name": "khyznh",
   "name": "khyznh",
   "version": "5.1.2",
   "version": "5.1.2",
-  "description": "客货邮智能化管理系统",
+  "description": "农村客运信息化管理系统",
   "author": "LionLi",
   "author": "LionLi",
   "license": "MIT",
   "license": "MIT",
   "scripts": {
   "scripts": {

+ 8 - 0
src/api/gpsData/index.ts

@@ -25,3 +25,11 @@ export function getCameraPlayerConfig(code): AxiosPromise<any> {
     method: 'get'
     method: 'get'
   });
   });
 }
 }
+
+export function playdevice(codes): AxiosPromise<any> {
+  return request({
+    url: `/system/common/play`,
+    data: codes,
+    method: 'post'
+  });
+}

+ 1 - 1
src/layout/components/Sidebar/Logo.vue

@@ -35,7 +35,7 @@ defineProps({
     }
     }
 })
 })
 
 
-const title = ref('客货邮智能化');
+const title = ref('农村客运信息化');
 const settingsStore = useSettingsStore();
 const settingsStore = useSettingsStore();
 const sideTheme = computed(() => settingsStore.sideTheme);
 const sideTheme = computed(() => settingsStore.sideTheme);
 </script>
 </script>

+ 1 - 0
src/main.ts

@@ -35,6 +35,7 @@ import 'element-tree-line/dist/style.css';
 
 
 // 国际化
 // 国际化
 import i18n from '@/lang/index';
 import i18n from '@/lang/index';
+import EZUIKit from 'ezuikit-js';
 
 
 const app = createApp(App);
 const app = createApp(App);
 // 全局方法挂载
 // 全局方法挂载

+ 6 - 2
src/utils/request.ts

@@ -41,7 +41,7 @@ service.interceptors.request.use(
     const isRepeatSubmit = (config.headers || {}).repeatSubmit === false;
     const isRepeatSubmit = (config.headers || {}).repeatSubmit === false;
     // 是否需要加密
     // 是否需要加密
     // const isEncrypt = (config.headers || {}).isEncrypt === 'true';
     // const isEncrypt = (config.headers || {}).isEncrypt === 'true';
-    const isEncrypt = false
+    const isEncrypt = false;
     if (getToken() && !isToken) {
     if (getToken() && !isToken) {
       config.headers['Authorization'] = 'Bearer ' + getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改
       config.headers['Authorization'] = 'Bearer ' + getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改
     }
     }
@@ -141,7 +141,11 @@ service.interceptors.response.use(
       return Promise.reject('无效的会话,或者会话已过期,请重新登录。');
       return Promise.reject('无效的会话,或者会话已过期,请重新登录。');
     } else if (code === HttpStatus.SERVER_ERROR) {
     } else if (code === HttpStatus.SERVER_ERROR) {
       console.log(msg);
       console.log(msg);
-      ElMessage({ message: msg, type: 'error' });
+      let msg1 = msg;
+      if (msg == '设备不在线') {
+        msg1 = '摄像设备不在线';
+      }
+      ElMessage({ message: msg1, type: 'error' });
       return Promise.reject(new Error(msg));
       return Promise.reject(new Error(msg));
     } else if (code === HttpStatus.WARN) {
     } else if (code === HttpStatus.WARN) {
       ElMessage({ message: msg, type: 'warning' });
       ElMessage({ message: msg, type: 'warning' });

+ 1 - 1
src/views/login.vue

@@ -1,7 +1,7 @@
 <template>
 <template>
   <div class="login">
   <div class="login">
     <el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form">
     <el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form">
-      <h3 class="title">客货邮智能化管理系统</h3>
+      <h3 class="title">农村客运信息化管理系统</h3>
       <el-form-item prop="tenantId" v-if="tenantEnabled">
       <el-form-item prop="tenantId" v-if="tenantEnabled">
         <el-select v-model="loginForm.tenantId" filterable placeholder="请选择/输入公司名称" style="width: 100%">
         <el-select v-model="loginForm.tenantId" filterable placeholder="请选择/输入公司名称" style="width: 100%">
           <el-option v-for="item in tenantList" :key="item.tenantId" :label="item.companyName" :value="item.tenantId"></el-option>
           <el-option v-for="item in tenantList" :key="item.tenantId" :label="item.companyName" :value="item.tenantId"></el-option>

+ 1 - 1
src/views/register.vue

@@ -1,7 +1,7 @@
 <template>
 <template>
   <div class="register">
   <div class="register">
     <el-form ref="registerRef" :model="registerForm" :rules="registerRules" class="register-form">
     <el-form ref="registerRef" :model="registerForm" :rules="registerRules" class="register-form">
-      <h3 class="title">客货邮智能化管理系统</h3>
+      <h3 class="title">农村客运信息化管理系统</h3>
       <el-form-item prop="tenantId" v-if="tenantEnabled">
       <el-form-item prop="tenantId" v-if="tenantEnabled">
         <el-select v-model="registerForm.tenantId" filterable placeholder="请选择/输入公司名称" style="width: 100%">
         <el-select v-model="registerForm.tenantId" filterable placeholder="请选择/输入公司名称" style="width: 100%">
           <el-option v-for="item in tenantList" :key="item.tenantId" :label="item.companyName" :value="item.tenantId"> </el-option>
           <el-option v-for="item in tenantList" :key="item.tenantId" :label="item.companyName" :value="item.tenantId"> </el-option>

+ 91 - 0
src/views/yunying/message/index.vue

@@ -0,0 +1,91 @@
+<!-- eslint-disable prettier/prettier -->
+<template>
+  <div class="p-2" style="padding: 40px">
+
+     <el-form :model="formdata" label-width="180px">
+        <el-form-item label="信息">
+           <el-input v-model="formdata.message" type="textarea" :rows="8"></el-input>
+        </el-form-item>
+
+        <el-form-item label="设备">
+            <el-tree-select
+              v-model="formdata.devicelist"
+              :data="sites.map(i=>{return {value: i.dictLabel,label: i.dictLabel,children: JSON.parse(i.remark).filter(j=>{return j.type=='led'||j.type=='tts'}).map(j=>{return {value: `${i.dictCode}_${j.type}_${j.code}`,label:`${i.dictLabel}—${j.name}` }})}})"
+              multiple
+              :render-after-expand="false"
+              style="width: 100%"
+            />
+        </el-form-item>
+
+        <el-form-item >
+          <el-button type="primary" @click="sendMessage">发送</el-button>
+        </el-form-item>
+
+     </el-form>
+
+
+  </div>
+</template>
+
+<script setup name="CarInfo" lang="ts">
+import { useRoute, useRouter } from "vue-router";
+import { updateData, listData } from "@/api/system/dict/data";
+import { playdevice } from '@/api/gpsData';
+import { ElMessage } from "element-plus";
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+
+
+const sites = ref([]);
+const formdata = ref({
+  message: "",
+  devicelist: []
+})
+
+
+
+
+const route = useRoute();
+const router = useRouter();
+
+
+const sendMessage = () => {
+  if (formdata.value.message == "") {
+    ElMessage.warning("请输入发送的内容");
+    return;
+  }
+    if (formdata.value.devicelist.length<1) {
+    ElMessage.warning("请选择站点设备");
+    return;
+  }
+  playdevice(formdata.value).then(res => {
+    ElMessage.success("成功");
+  })
+}
+
+
+
+const getSites = () => {
+  listData({ dictType: "tbl_sites" }).then(res2 => {
+    sites.value = res2.rows;
+  });
+}
+
+onMounted(() => {
+    getSites();
+    // treeRef.value.expandNode(treeRef.value.getNode(1))
+  })
+
+
+
+</script>
+
+<style lang="scss" scoped>
+.card-header {
+  display: flex;
+  flex-direction: row;
+  justify-content: space-between;
+}
+.boxunused{
+  background: #3333332d;
+}
+</style>

+ 116 - 11
src/views/yunying/video/index.vue

@@ -48,7 +48,7 @@
       </div>
       </div>
       <div style="width: 77%; margin-left: 2%">
       <div style="width: 77%; margin-left: 2%">
         <div class="card-header">
         <div class="card-header">
-          <div style="display: flex; flex-direction: row">
+          <div style="display: flex; flex-direction: row;position: relative">
             <div style="width: 4px; height: 19px; opacity: 1; background: #409eff"></div>
             <div style="width: 4px; height: 19px; opacity: 1; background: #409eff"></div>
             <span
             <span
               style="
               style="
@@ -62,7 +62,10 @@
               >站点设备</span
               >站点设备</span
             >
             >
             <span style="margin-left: 30px; font-size: 14px">{{currentdata?.label}}</span>
             <span style="margin-left: 30px; font-size: 14px">{{currentdata?.label}}</span>
+
+
           </div>
           </div>
+           <el-button v-if="tableData.length>0 && tableData.length<4" type="primary" style="position: absolute;right: 20px;" @click="dialogVisible = true">添加设备</el-button>
         </div>
         </div>
         <div style="margin-top: 20px">
         <div style="margin-top: 20px">
           <el-table :data="tableData" border style="width: 100%">
           <el-table :data="tableData" border style="width: 100%">
@@ -91,6 +94,7 @@
             <el-table-column prop="code" label="操作" >
             <el-table-column prop="code" label="操作" >
                 <template #default="scope">
                 <template #default="scope">
                    <div>
                    <div>
+                        <el-button type="danger" link size="small" @click="deleteDevice(scope.row)">删除</el-button>
                         <el-button v-if="scope.row.type=='cabinet'"  type="primary" link size="small">立即同步</el-button>
                         <el-button v-if="scope.row.type=='cabinet'"  type="primary" link size="small">立即同步</el-button>
                    </div>
                    </div>
                 </template>
                 </template>
@@ -102,11 +106,11 @@
               <div id="video-container" style="border-radius: 10px;"></div>
               <div id="video-container" style="border-radius: 10px;"></div>
            </el-tab-pane>
            </el-tab-pane>
            <el-tab-pane v-if="tableData.filter(i=>i.type=='cabinet').length>0" label="快递柜" name="cabinet">
            <el-tab-pane v-if="tableData.filter(i=>i.type=='cabinet').length>0" label="快递柜" name="cabinet">
-               <div style="display: flex;align-items: center;flex-wrap: wrap;gap: 10px;place-content: center;width: 80vw;justify-content: flex-start;flex-direction: row;align-content: center;">
-                  <div :class="item.box_status==1?'boxunused':''" v-for="(item,index) in currentCabinet.boxlist" style="width: 60px;height:60px;border: 1px solid #33333317;border-radius: 6px;margin-right:20px;margin-bottom: 10px;position: relative;">
+               <div style="display: flex;align-items: center;flex-wrap: wrap;gap: 10px;place-content: center;width: 100%;justify-content: flex-start;flex-direction: row;align-content: center;">
+                  <div :class="item.box_status==1?'':''" v-for="(item,index) in currentCabinet.boxlist" style="width: 60px;height:60px;border: 1px solid #33333317;border-radius: 6px;position: relative;">
                     <div style="font-size: 10px;padding:8px">{{ item.box_name }}</div>
                     <div style="font-size: 10px;padding:8px">{{ item.box_name }}</div>
 
 
-                    <el-button size="small" v-if="item.box_status!=1" text style="position: absolute;right: 0;bottom: 0;" @click="openbox">
+                    <el-button size="small"  text style="position: absolute;right: 0;bottom: 0;" @click="openbox">
                          <img style="width:10px" src="@/assets/images/unlock@2x.png">
                          <img style="width:10px" src="@/assets/images/unlock@2x.png">
                     </el-button>
                     </el-button>
                   </div>
                   </div>
@@ -116,6 +120,36 @@
         </div>
         </div>
       </div>
       </div>
     </div>
     </div>
+
+<el-dialog  v-model="dialogVisible" title="添加设备" width="500">
+  <el-form :model="formdata" ref="ruleForm" label-width="100px" class="demo-ruleForm">
+     <el-form-item label="名称">
+      <el-input v-model="formdata.name" />
+    </el-form-item>
+    <el-form-item label="类型">
+      <el-select v-model="formdata.type" placeholder="请选择设备类型">
+        <el-option v-if="tableData.filter(i=>i.type=='tts').length<1" label="tts" value="tts" />
+        <el-option v-if="tableData.filter(i=>i.type=='led').length<1" label="led" value="led" />
+        <el-option v-if="tableData.filter(i=>i.type=='cabinet').length<1" label="快递柜" value="cabinet" />
+        <el-option v-if="tableData.filter(i=>i.type=='camera').length<1" label="摄像头" value="camera" />
+      </el-select>
+    </el-form-item>
+    <el-form-item label="序列号">
+      <el-input v-model="formdata.code" />
+    </el-form-item>
+  </el-form>
+  <template #footer>
+      <div class="dialog-footer">
+        <el-button @click="dialogVisible = false">取消</el-button>
+        <el-button type="primary" @click="addDevice">
+          保存
+        </el-button>
+      </div>
+    </template>
+
+
+</el-dialog>
+
   </div>
   </div>
 </template>
 </template>
 
 
@@ -124,14 +158,20 @@ import { TreeNode } from "element-plus";
 import { useRoute, useRouter } from "vue-router";
 import { useRoute, useRouter } from "vue-router";
 import EZUIKit from 'ezuikit-js';
 import EZUIKit from 'ezuikit-js';
 import { getCameraPlayerConfig } from '@/api/gpsData';
 import { getCameraPlayerConfig } from '@/api/gpsData';
-import { updateData } from "@/api/system/dict/data";
+import { updateData,listData } from "@/api/system/dict/data";
 import imgulock from "@/assets/images/unlock@2x.png";
 import imgulock from "@/assets/images/unlock@2x.png";
 
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
-const { tbl_sites } = toRefs<any>(proxy?.useDict('tbl_sites'));
 
 
+const sites = ref([]);
 
 
 
 
+const formdata = ref({
+  name: "",
+  type: "",
+  code:""
+})
+
 
 
 const route = useRoute();
 const route = useRoute();
 const router = useRouter();
 const router = useRouter();
@@ -142,6 +182,7 @@ const activeName=ref("camera")
 
 
 const filterText = ref("");
 const filterText = ref("");
 const treeRef = ref(null);
 const treeRef = ref(null);
+const dialogVisible = ref(false);
 
 
 const gettreeheight = () => {
 const gettreeheight = () => {
   return document.body.clientHeight - 100;
   return document.body.clientHeight - 100;
@@ -164,13 +205,42 @@ const savedata = () => {
   //保存数据
   //保存数据
   var data = {
   var data = {
     dictCode: currentdata.value.dictCode,
     dictCode: currentdata.value.dictCode,
-    dictValue: currentdata.value.value,
-    dictLabel: currentdata.value.label,
+    dictValue: currentdata.value.dictValue,
+    dictLabel: currentdata.value.dictLabel,
     dictType: "tbl_sites",
     dictType: "tbl_sites",
     remark: JSON.stringify(tableData.value)
     remark: JSON.stringify(tableData.value)
   }
   }
   updateData(data).then(res => {
   updateData(data).then(res => {
     ElMessage.success("成功!");
     ElMessage.success("成功!");
+    getSites();
+
+  })
+}
+
+const getSites = () => {
+    listData({ dictType: "tbl_sites" }).then(res2 => {
+      sites.value = res2.rows;
+
+       var index = 1;
+      data.value = [{
+        id: 1,
+        label: "站点",
+        children: sites.value.map(i => { return { id: ++index, label: i.dictLabel } }),
+      },];
+    });
+}
+
+const deleteDevice = (datac) => {
+  tableData.value = tableData.value.filter(i => i.type != datac.type);
+  var data = {
+    dictCode: currentdata.value.dictCode,
+    dictValue: currentdata.value.dictValue,
+    dictLabel: currentdata.value.dictLabel,
+    dictType: "tbl_sites",
+    remark: JSON.stringify(tableData.value)
+  }
+   updateData(data).then(res => {
+    ElMessage.success("成功!");
   })
   })
 }
 }
 
 
@@ -188,8 +258,8 @@ const currentdata = ref(null)
 
 
 const treeclick = (data: TreeNodeData, node: TreeNode) => {
 const treeclick = (data: TreeNodeData, node: TreeNode) => {
 
 
-  currentdata.value = tbl_sites.value.filter(i => {
-    return i.label == data.label
+  currentdata.value = sites.value.filter(i => {
+    return i.dictLabel == data.label
   })[0];
   })[0];
   tableData.value = [];
   tableData.value = [];
   if (currentdata.value) {
   if (currentdata.value) {
@@ -216,6 +286,40 @@ const treeclick = (data: TreeNodeData, node: TreeNode) => {
 
 
 }
 }
 
 
+
+const addDevice = () => {
+  dialogVisible.value = false;
+  if (formdata.value.name == "") {
+    ElMessage.warning("设备名称未填写");
+    return;
+  }
+  if (formdata.value.type == "") {
+    ElMessage.warning("设备类型未填写");
+    return;
+  }
+  if (formdata.value.code == "") {
+    ElMessage.warning("设备序列号未填写");
+    return;
+  }
+   if (tableData.value.filter(i => i.type == formdata.value.type).length >0) {
+    ElMessage.warning("存在相同类型的设备");
+    return;
+  }
+  tableData.value.push(formdata.value);
+   var data = {
+    dictCode: currentdata.value.dictCode,
+    dictValue: currentdata.value.value,
+    dictLabel: currentdata.value.label,
+    dictType: "tbl_sites",
+    remark: JSON.stringify(tableData.value)
+   }
+  updateData(data).then(res => {
+    ElMessage.success("成功!");
+  })
+
+
+}
+
 const currentCabinet = ref({
 const currentCabinet = ref({
   total: 40,
   total: 40,
   unused: 10,
   unused: 10,
@@ -250,7 +354,7 @@ const data = computed(() => {
   return [{
   return [{
     id: 1,
     id: 1,
     label: "站点",
     label: "站点",
-    children: tbl_sites.value.map(i => { return {id:++index,label:i.label} }),
+    children: sites.value.map(i => { return {id:++index,label:i.dictLabel} }),
   },]
   },]
 });
 });
 onMounted(() => {
 onMounted(() => {
@@ -258,6 +362,7 @@ onMounted(() => {
     setTimeout(() => {
     setTimeout(() => {
       treeRef.value.expandNode(treeRef.value.getNode(1))
       treeRef.value.expandNode(treeRef.value.getNode(1))
     }, 100);
     }, 100);
+    getSites();
     // treeRef.value.expandNode(treeRef.value.getNode(1))
     // treeRef.value.expandNode(treeRef.value.getNode(1))
   }
   }
 });
 });

+ 2 - 2
vite.config.ts

@@ -26,8 +26,8 @@ export default defineConfig(({ mode, command }: ConfigEnv): UserConfig => {
       open: true,
       open: true,
       proxy: {
       proxy: {
         [env.VITE_APP_BASE_API]: {
         [env.VITE_APP_BASE_API]: {
-          // target: 'http://localhost:8080',
-          target: 'http://47.104.97.60/api',
+          target: 'http://localhost:8080',
+          // target: 'http://47.104.97.60/api',
           changeOrigin: true,
           changeOrigin: true,
           ws: true,
           ws: true,
           rewrite: (path) => path.replace(new RegExp('^' + env.VITE_APP_BASE_API), '')
           rewrite: (path) => path.replace(new RegExp('^' + env.VITE_APP_BASE_API), '')