doum
2026-03-06 34fe52caba63e6a6337cb9c3e6bd0d4707fd6a99
解决冲突
已修改21个文件
466 ■■■■■ 文件已修改
admin/.env.development 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.env.production 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/public/index.html 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/public/template/member.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/workbench/index.js 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/CommonHeader.vue 209 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/main.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/store/index.js 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/admissionStatistics.vue 64 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/carStatistics.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/login.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/vue.config.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/startsh/启动脚本和日志处理脚本说明.txt 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/Constants.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/device_service/pom.xml 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/resources/bootstrap-dev.yml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKConstants.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Device.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningRuleDetail.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/thrid/BoardServiceImpl.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.env.development
@@ -1,14 +1,9 @@
# å¼€å‘环境配置
NODE_ENV = 'development'
# VUE_APP_API_URL  = 'https://atwl.ahzyssl.com/zhyq_interface'
VUE_APP_SCREEN_URL_PREFIX  = 'http://192.168.0.7/screen/#/'
#VUE_APP_API_URL  = 'http://192.168.1.82:10010'
#VUE_APP_API_URL  = 'http://localhost:10010'
VUE_APP_API_URL  = 'http://192.168.0.7/system_gateway'
VUE_APP_API_URL  = 'http://localhost:10010'
#key:045542fc5f436b75e6c911c5c84ff8cd
#密钥:8bd38497f9aee2b75e7a888a4dfd1e6c
VUE_APP_AMAP_KEY='045542fc5f436b75e6c911c5c84ff8cd'
admin/.env.production
@@ -7,4 +7,3 @@
VUE_APP_SCREEN_URL_PREFIX  =  'http://192.168.0.7/screen/#/'
admin/public/index.html
@@ -5,14 +5,12 @@
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title>
        title: process.env.VUE_APP_TITLE,</title>
    <title>智慧园区安消一体化系统</title>
  </head>
  <body>
    <noscript>
      <strong>We're sorry but èŠœæ¹–çƒŸè‰æ™ºæ…§å®‰æ¶ˆå®‰å…¨é˜²èŒƒç³»ç»Ÿ doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    <strong>We're sorry but æ™ºæ…§å›­åŒºå®‰æ¶ˆä¸€ä½“化系统 doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app"></div>
    <!-- built files will be auto injected -->
  </body>
</html>
admin/public/template/member.xlsx
Binary files differ
admin/src/api/workbench/index.js
@@ -30,7 +30,5 @@
}
// pc工作台
export function getWorkbenchData (data) {
  return request.get('/visitsAdmin/cloudService/business/staging/pCWorkPlatformData', {
    params: {...data  }
  })
  return request.get('/visitsAdmin/cloudService/business/staging/pCWorkPlatformData', data)
}
admin/src/components/common/CommonHeader.vue
@@ -2,7 +2,7 @@
  <div class="common-header">
    <div class="header">
      <div class="logo">
        <div class="title"> <img src="@/assets/system.png" alt="" />{{sysConfig.subtitle || title }}</div>
        <div class="title">{{ title }}</div>
        <div class="list">
            <div  :class="index==currentIndex?'item active':'item'" v-for="(item,index) in topMenuList.list" :key="item.id"  @click="getHeaderNav(item,index)" :index="index">{{item.label}}
              <div v-if="index==currentIndex" class="linellae"></div>
@@ -10,48 +10,18 @@
        </div>
      </div>
      <div class="user">
          <div class="user-search">
              <div class="user-search-left">
                <span>全部</span>
                  <img src="@/assets/icons/xl.png" alt="">
              </div>
              <div class="user-search-right">
                  <input type="text" placeholder="请输入" />
                  <img src="@/assets/icons/sousuo.png" alt="">
              </div>
          </div>
          <div class="user-images">
<!--              <img src="@/assets/icons/ic_1.jpg" alt="">-->
<!--              <img src="@/assets/icons/ic_2.png" alt="">-->
              <img src="@/assets/icons/ic_3.jpg" alt="">
              <img src="@/assets/icons/ic_4.jpg" alt="">
              <img src="@/assets/icons/ic_5.jpg" alt="">
<!--              <img src="@/assets/icons/ic_6.jpg" alt="">-->
              <img src="@/assets/icons/ic_7.jpg" alt="">
<!--              <img src="@/assets/icons/ic_8.jpg" alt="">-->
          </div>
          <el-dropdown v-if="isLogined" trigger="click">
            <span class="el-dropdown-link" style="cursor: pointer; color: rgba(255,255,255,.56);">
              {{ userInfo | displayName }}
              <i class="el-icon-arrow-down el-icon--right"></i>
          <span class="el-dropdown-link">
            <!-- <img v-if="userInfo != null" :src="userInfo.avatar == null ? `${require('@/assets/avatar/man.png')}` : userInfo.avatar" alt="">{{userInfo | displayName}}<i class="el-icon-arrow-down el-icon--right"></i> -->
            <img v-if="userInfo != null" style="width: 30px !important" src="@/assets/avatar/man.png" alt="" />{{
              userInfo | displayName
            }}<i class="el-icon-arrow-down el-icon--right"></i>
            </span>
            <el-dropdown-menu slot="dropdown">
              <el-dropdown-item @click.native="changePwd">修改密码</el-dropdown-item>
              <el-dropdown-item @click.native="logout">退出登录</el-dropdown-item>
            </el-dropdown-menu>
          </el-dropdown>
<!--        <el-dropdown v-if="isLogined" trigger="click">-->
<!--          <span class="el-dropdown-link">-->
<!--            &lt;!&ndash; <img v-if="userInfo != null" :src="userInfo.avatar == null ? `${require('@/assets/avatar/man.png')}` : userInfo.avatar" alt="">{{userInfo | displayName}}<i class="el-icon-arrow-down el-icon&#45;&#45;right"></i> &ndash;&gt;-->
<!--            <img v-if="userInfo != null" style="width: 30px !important" src="@/assets/avatar/man.png" alt="" />{{-->
<!--              userInfo | displayName-->
<!--            }}<i class="el-icon-arrow-down el-icon&#45;&#45;right"></i>-->
<!--          </span>-->
<!--          <el-dropdown-menu slot="dropdown">-->
<!--            <el-dropdown-item @click.native="changePwd">修改密码</el-dropdown-item>-->
<!--            <el-dropdown-item @click.native="logout">退出登录</el-dropdown-item>-->
<!--          </el-dropdown-menu>-->
<!--        </el-dropdown>-->
      </div>
    </div>
    <!-- ä¿®æ”¹å¯†ç  -->
@@ -65,7 +35,7 @@
            show-password></el-input>
        </el-form-item>
        <el-form-item label="新密码" prop="newPwd" required>
          <el-input v-model="changePwdData.form.newPwd" type="password" placeholder="请输入新密码,至少包括数字、大写字母、小写字母、特殊字符中的三种字符,且至少8位数"
          <el-input v-model="changePwdData.form.newPwd" type="password" placeholder="请输入新密码,密码需包含字母、数字及特殊字符中的至少两种"
            maxlength="20" show-password></el-input>
        </el-form-item>
        <!-- <div style="font-size: 12px;color:#999999">密码需包含字母、数字及特殊字符中的至少两种</div> -->
@@ -81,7 +51,7 @@
<script>
import { mapState, mapMutations } from 'vuex'
import GlobalAlertWindow from './GlobalAlertWindow'
import { getSystemConfig, logout, updatePwd } from '@/api/system/common'
import { logout, updatePwd } from '@/api/system/common'
import { getAppHeaderNav } from '@/api'
export default {
  name: 'CommonHeader',
@@ -96,6 +66,7 @@
    return {
      title: process.env.VUE_APP_TITLE,
      headerNavData: {},
      currentIndex: 0,
      visible: {
        // ä¿®æ”¹å¯†ç 
        changePwd: false
@@ -128,13 +99,13 @@
    }
  },
  computed: {
    ...mapState(['menuData', 'userInfo', 'topMenuList', 'currentIndex', 'sysConfig'])
    ...mapState(['menuData', 'userInfo', 'topMenuList'])
    // title () {
    //   return this.$route.meta.title
    // }
  },
  created () {
    this.getSystemConfig()
  },
  mounted () {
    // needChangePwd 0 : é»˜è®¤å¯†ç éœ€è¦ä¿®æ”¹ï¼Œ1 ä¸éœ€è¦
@@ -155,7 +126,7 @@
    }
  },
  methods: {
    ...mapMutations(['setUserInfo', 'switchCollapseMenu', 'clearUserInfo', 'setTopMenuCurrent', 'setCurrentIndex', 'setSysconfig']),
    ...mapMutations(['setUserInfo', 'switchCollapseMenu', 'clearUserInfo', 'setTopMenuCurrent']),
    // ä¿®æ”¹å¯†ç 
    changePwd () {
      this.visible.changePwd = true
@@ -163,68 +134,41 @@
        this.$refs.changePwdDataForm.resetFields()
      })
    },
    getSystemConfig () {
      if (!this.sysConfig.subTitle) {
        getSystemConfig()
          .then((res) => {
            if (res && res.subtitle) {
              this.setSysconfig(res)
            }
          })
      }
    },
    validatePassword (rule, value, callback) {
      if (!value) {
        callback(new Error('请输入密码'))
      } else {
        // const lengthValid = /^.{6,20}$/.test(value)
        // const hasLetter = /[a-zA-Z]/.test(value)
        // const hasNumber = /[0-9]/.test(value)
        // const hasSpecial = /[!@#$%^&*(),.?":{}|<>]/.test(value)
        //
        // const typesCount = [hasLetter, hasNumber, hasSpecial].filter(Boolean).length
        //
        // if (!lengthValid) {
        //   callback(new Error('密码长度需为6到20个字符'))
        // } else if (typesCount < 2) {
        //   callback(new Error('密码需包含字母、数字及特殊字符中的至少两种'))
        // } else {
        //   callback() // éªŒè¯é€šè¿‡
        // }
        let typeCount = 0
        if (/[a-z]/.test(value)) typeCount++ // å°å†™å­—母
        if (/[A-Z]/.test(value)) typeCount++ // å¤§å†™å­—母
        if (/\d/.test(value)) typeCount++ // æ•°å­—
        if (/[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]/.test(value)) typeCount++ // ç‰¹æ®Šå­—符
        if (typeCount >= 3) {
          callback()
        const lengthValid = /^.{6,20}$/.test(value)
        const hasLetter = /[a-zA-Z]/.test(value)
        const hasNumber = /[0-9]/.test(value)
        const hasSpecial = /[!@#$%^&*(),.?":{}|<>]/.test(value)
        const typesCount = [hasLetter, hasNumber, hasSpecial].filter(Boolean).length
        if (!lengthValid) {
          callback(new Error('密码长度需为6到20个字符'))
        } else if (typesCount < 2) {
          callback(new Error('密码需包含字母、数字及特殊字符中的至少两种'))
        } else {
          callback(new Error('至少包括数字、大写字母、小写字母、特殊字符中的三种字符,且至少8位数'))
          callback() // éªŒè¯é€šè¿‡
        }
      }
    },
    getHeaderNav (item, index) {
      this.setCurrentIndex(index)
      this.currentIndex = index
      if (item.linkType === 0) {
        this.setTopMenuCurrent(item)
      } else {
        if (item.url && item.url === 'goHKAF' && item.params != null) {
          this.getHKAFHeaderNav(item.params, item.label)
          this.getHKAFHeaderNav(item.params)
        } else if (item.url && item.url.indexOf('http') === 0) {
          window.open(item.url, '_blank')
        }
      }
    },
    getHKAFHeaderNav (type, label) {
    getHKAFHeaderNav (type) {
      getAppHeaderNav(type).then(res => {
        if (label === '安防中心') {
          const openWindow = window.open(res, '_blank')
          // setTimeout(() => {
          //   openWindow.close()
          // }, 7 * 1000)
        } else {
          window.open(res, '_blank')
        }
      })
    },
    handleTest () {
@@ -310,9 +254,8 @@
          newPwd: this.changePwdData.form.newPwd
        })
          .then(() => {
            console.log('修改成功')
            this.$tip.apiSuccess('修改成功')
            // this.$store.commit('setUserInfo', { needChangePwd: 1 })
            this.$store.commit('setUserInfo', { needChangePwd: 1 })
            this.visible.changePwd = false
          })
          .catch(e => {
@@ -344,7 +287,7 @@
@import "@/assets/style/variables.scss";
.common-header {
  background-color: #1E7FFF;
  background-color: #2080f7;
}
.list {
@@ -354,14 +297,14 @@
    display: flex;
    align-items: center;
    .item {
      margin-right: 24px;
      margin-right: 40px;
      font-size: 16px;
      font-weight: 400;
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: flex-start;
      height: 49px;
      height: 40px;
      cursor: pointer;
      .linellae {
@@ -389,7 +332,7 @@
    box-sizing: border-box;
    min-width: 360px;
    height: 56px;
    padding: 10px 12px;
    padding: 10px 30px;
    // flex-shrink: 0;
    line-height: 36px;
    font-size: 22px;
@@ -399,18 +342,8 @@
    align-items: center;
    .title {
      display: flex;
      color: rgb(255, 255, 255);
      font-size: 18px;
      font-weight: 700;
      font-family: "Microsoft Yahei", "sans-serif", "segoe UI", "PingFang SC", arial, Helvetica;
      //font-size: 18px;
      //width: 320px;
      img{
        width:auto ;
        height: 32px;
        margin-right: 5px;
      }
      width: 320px;
    }
    // display: inline;
@@ -422,83 +355,15 @@
  }
  .user {
    /*width: 152px;*/
    width: 152px;
    box-sizing: border-box;
    height: 56px;
    padding-right: 25px;
    /*background: url("../../assets/images/top_ic_bolang@2x.png") no-repeat;*/
    background: url("../../assets/images/top_ic_bolang@2x.png") no-repeat;
    flex-shrink: 0;
    text-align: right;
    display: flex;
    align-items: center;
    .user-search {
        width: 346px;
        height: 32px;
        border-radius: 30px;
        border: 1px solid rgba(255,255,255,.56);
        margin-right: 15px;
        display: flex;
        align-items: center;
        .user-search-left {
            flex-shrink: 0;
            width: 106px;
            height: 100%;
            display: flex;
            align-items: center;
            justify-content: center;
            span {
                font-size: 14px;
                font-weight: 400;
                color: rgba(255,255,255,.56);
                margin-right: 10px;
            }
            img {
                top: 0;
                margin: 0;
                width: 20px;
                height: 16px;
            }
        }
        .user-search-right {
            flex: 1;
            height: 100%;
            display: flex;
            align-items: center;
            justify-content: center;
            padding-right: 10px;
            box-sizing: border-box;
            input {
                flex: 1;
                height: 100%;
                font-size: 14px;
                font-weight: 400;
                color: rgba(255,255,255,.56);
                border: none;
                outline: none;
                background-color: rgba(0,0,0,0);
                &::placeholder {
                    color: rgba(255,255,255,.56);
                }
            }
            img {
                top: 0;
                margin: 0;
                width: 20px;
                height: 20px;
            }
        }
    }
    .user-images {
        height: 100%;
        display: flex;
        align-items: center;
        img {
            top: 0 !important;
            width: 18px;
            height: 18px;
            margin-right: 12px;
        }
    }
    cursor: pointer;
    .el-dropdown {
      top: 2px;
      color: #fff;
admin/src/main.js
@@ -96,7 +96,7 @@
              }
            })
            if (this.$route.query && this.$route.query.menuparams) {
              let menu = topList.filter(item => item.params === this.$route.query.menuparams)
            const menu = topList.filter(item => item.params === this.$route.query.menuparams)
              this.setTopMenuCurrent(menu[0])
              this.setCurrentIndex(topList.findIndex(obj => obj.params === this.$route.query.menuparams))
            } else {
admin/src/store/index.js
@@ -1,13 +1,11 @@
import Vue from 'vue'
import Vuex from 'vuex'
import router from '../router'
Vue.use(Vuex)
const state = {
  // ç™»å½•用户信息
  userInfo: null,
  tableHeightNew: 300,
  sysConfig: { title: '', subtitle: '' },
  primaryColor: '#2080f7',
  // é¦–页
  homePage: null,
@@ -29,21 +27,10 @@
  // tags数组
  tags: [],
  // tagsview标签显示隐藏
  isCollapse: false,
  // é¡¶éƒ¨èœå•索引
  currentIndex: 0
  isCollapse: false
}
const mutations = {
  // è®¾ç½®é¡¶éƒ¨èœå•索引
  setCurrentIndex (state, index) {
    console.log('设置顶部菜单索引', index)
    state.currentIndex = index
  },
  setSysconfig (state, config) {
    state.sysConfig = { title: config.title || '', subtitle: config.subtitle || '' }
    document.title =  state.sysConfig.title+ state.sysConfig.subtitle
  },
  // åˆ‡æ¢èœå•状态
  switchCollapseMenu (state, value) {
    if (value != null) {
@@ -73,7 +60,7 @@
  },
  // è®¾ç½®é¦–页路由信息
  setTopMenuCurrent (state, current) {
    console.log('setTopMenuCurrent', current)
    console.log("setTopMenuCurrent",current)
    if (current.id !== state.topMenuCurrent.id) {
      state.topMenuList.list.forEach(item => {
        console.log(item.id, item.id)
@@ -86,7 +73,7 @@
  },
  // é‡ç½®èœå•
  resetMenus: (state) => {
    state.topMenuId = null
    state.topMenuId=null;
    state.menuData.list = []
  },
  //  tags
admin/src/views/business/admissionStatistics.vue
@@ -133,9 +133,9 @@
      }
    },
    mounted() {
      var now = new Date();
      var year = now.getFullYear();
      var month = now.getMonth() + 1 > 9 ? now.getMonth() + 1 : `0${now.getMonth() + 1}`;
    var now = new Date()
    var year = now.getFullYear()
    var month = now.getMonth() + 1 > 9 ? now.getMonth() + 1 : `0${now.getMonth() + 1}`
      this.value = `${year}-${month}`
      this.date1 = `${year}-${month}`
@@ -152,13 +152,13 @@
      },
      changeBB() {
        if (this.radio === 'month') {
          let now = new Date();
          let year = now.getFullYear();
          let month = now.getMonth() + 1 > 9 ? now.getMonth() + 1 : `0${now.getMonth() + 1}`;
        const now = new Date()
        const year = now.getFullYear()
        const month = now.getMonth() + 1 > 9 ? now.getMonth() + 1 : `0${now.getMonth() + 1}`
          this.date1 = `${year}-${month}`
        } else {
          let now = new Date();
          let year = now.getFullYear();
        const now = new Date()
        const year = now.getFullYear()
          this.date1 = `${year}`
        }
        this.getReportLists()
@@ -167,22 +167,19 @@
      getReportLists() {
        getReportList({ dateStr: this.date1, isGroupBy: this.isGroupBy, type: 1 })
          .then(res => {
            if (res.length === 0) {
          if (!res || res.length === 0) {
              this.column = []
              this.list = []
              return
            }
            this.column = res[0]
            this.list = res.slice(1).map(row => {
              const obj = {};
            const obj = {}
              this.column.forEach((header, index) => {
                obj[header] = row[index];
              });
              return obj;
            });
              obj[header] = row[index]
            })
            return obj
          })
            // if (res.length === 0) {
            //   this.column = []
            //   this.list = []
@@ -195,13 +192,13 @@
      },
      changeDateType() {
        if (this.dateType === 'month') {
          let now = new Date();
          let year = now.getFullYear();
          let month = now.getMonth() + 1 > 9 ? now.getMonth() + 1 : `0${now.getMonth() + 1}`;
        const now = new Date()
        const year = now.getFullYear()
        const month = now.getMonth() + 1 > 9 ? now.getMonth() + 1 : `0${now.getMonth() + 1}`
          this.value = `${year}-${month}`
        } else {
          let now = new Date();
          let year = now.getFullYear();
        const now = new Date()
        const year = now.getFullYear()
          this.value = `${year}`
        }
        this.getRataLists()
@@ -237,10 +234,10 @@
        const myChart = echarts.init(document.querySelector('.echart1'))
        let names = this.info.cumulativeDataList.map(item => item.name)
        let datas = this.info.cumulativeDataList.map(item => item.total)
      const names = this.info.cumulativeDataList.map(item => item.name)
      const datas = this.info.cumulativeDataList.map(item => item.total)
        let option = {
      const option = {
          grid: {
            left: '0%',
            right: '5%',
@@ -266,7 +263,7 @@
            axisLabel: {
              formatter: function (value) {
                // å››èˆäº”入到最近的整数
                return Math.round(value);
              return Math.round(value)
              }
            }
          },
@@ -345,16 +342,16 @@
        console.log(dom)
        const myChart = echarts.init(dom)
        let data = this.listZB.map(item => {
      const data = this.listZB.map(item => {
          return {
            value: item.total,
            name: item.name
          }
        })
        let option = {
      const option = {
          tooltip: {
            trigger: 'item',
          trigger: 'item'
          },
          legend: {
            show: false,
@@ -369,11 +366,11 @@
              labelLine: {
                normal: {
                  length: 30,
                  length2: 70,
                length2: 70
                }
              },
              label: {
                formatter: "{a|{b}} {d}%",
              formatter: '{a|{b}} {d}%',
                rich: {
                  a: {
                    color: '#333333',
@@ -395,7 +392,7 @@
      initDept3() {
        const myChart = echarts.init(document.querySelector('#echart3'))
        let option = {
      const option = {
          grid: {
            left: '5%',
            right: '10%',
@@ -504,7 +501,7 @@
        .main_table {
            display: flex;
            align-items: start;
            align-items: flex-start;
            justify-content: space-between;
            margin-top: 10px;
            .main_table_list {
@@ -665,7 +662,6 @@
                padding: 20px;
                box-sizing: border-box;
                /*border-right: 12px solid #f7f7f7;*/
                .echart1 {
                    width: 100%;
admin/src/views/business/carStatistics.vue
@@ -174,6 +174,12 @@
                return
              }
              if (!res || res.length === 0) {
                this.column = []
                this.list = []
                return
              }
              this.column = res[0]
              this.list = res.slice(1).map(row => {
@@ -525,7 +531,7 @@
        .main_table {
            display: flex;
            align-items: start;
            align-items: flex-start;
            justify-content: space-between;
            margin-top: 10px;
            .main_table_list {
admin/src/views/index.vue
@@ -238,6 +238,7 @@
      nowDate: '',
      nowWeek: '',
      headerData: {},
      timeInfo:'上午',
      staticData: {},
      manningRatio: [],
      taskList: [],
@@ -376,6 +377,7 @@
      this.$router.push(item.path)
    },
    updateDate () {
      this.timeInfo = new Date().getHours()<12?'上午':'下午'
      this.nowDate = dayjs().format('YYYYå¹´M月D日')
      this.nowWeek = weeks[new Date().getDay()]
    },
admin/src/views/login.vue
@@ -4,7 +4,7 @@
    <div class="login_wrap">
      <div class="login_img">
        <div class="h3" style="font-size: 30px; margin-bottom: 0;">{{sysConfig.title || ''}}</div>
        <div class="h3">{{sysConfig.subtitle || title}}</div>
        <div class="h3">智慧物流园区安消一体化系统</div>
      </div>
      <div class="form_wrap">
        <div class="tabs">
@@ -104,6 +104,7 @@
    ...mapState(['sysConfig'])
  },
  mounted () {
    alert(1)
    this.username = localStorage.getItem('username') || ''
    this.password = localStorage.getItem('password') || ''
    this.phone = localStorage.getItem('phone') || ''
admin/vue.config.js
@@ -12,7 +12,7 @@
  lintOnSave: false,
  devServer: {
    host: '0.0.0.0',
    port: 10012,
    port: 10085,
    proxy: {
      [process.env.VUE_APP_API_PREFIX]: {
        target: process.env.VUE_APP_API_URL,
server/startsh/Æô¶¯½Å±¾ºÍÈÕÖ¾´¦Àí½Å±¾ËµÃ÷.txt
@@ -12,6 +12,10 @@
#查看是否创建成功
crontab -l
vim /etc/systemd/system/zhyqVisits.service
sudo systemctl start zhyqVisits.service
sudo systemctl enable zhyqVisits.service
#JAVA spring boot中使用google的ortools(算法包)
Linux系统安装对应的版本服务:
server/system_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -1,7 +1,9 @@
package com.doumee.core.utils;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -23,7 +25,9 @@
    public static final String HEADER_USER_TOKEN = "dm_user_token";
    public static final String REDIS_USER_KEY = "user_token_list_";
    public static final String REDIS_TOKEN_KEY = "token_";
    public static final String WMS_IN_REPERTOTY_CODE_LIST = "WMS_IN_REPERTOTY_CODE_LIST";
    public static final String REDIS_HK_TOKEN_KEY = "hk_token_";
    public static   boolean IS_AUTOCALL_WORKING = false;
    public static final String HK_TOKEN_VALIDITY = "HK_TOKEN_VALIDITY";
    public static final String[]  ALL_SPELL_LIST_FIRST = new String[]{"A", "B", "C", "D", "E", "F", "G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
    public static final int ZERO = 0 ;
@@ -556,6 +560,7 @@
    public static final String COFFEE_BEAN_TASK ="COFFEE_BEAN_TASK";
    public static final String IN_REPERTOTY_CODE ="IN_REPERTOTY_CODE";
    public static final String HOME_IMAGE ="HOME_IMAGE";
    public static final String DD_TALK ="DD_TALK";
@@ -792,14 +797,73 @@
        }
    }
    public static  String getWmsAreasNameByCode(String listStr,String code) {
        try {
            JSONArray list = JSONObject.parseArray(listStr );
            if(list!=null && list.size()>0){
                for (int i = 0; i < list.size(); i++) {
                    if(StringUtils.equals(list.getJSONObject(i).getString("code"),code)){
                        return  list.getJSONObject(i).getString("name");
                    }
                }
            }
        }catch (Exception e){
        }
        return null;
    }
    public static   List<JSONObject> getWmsAreasList(){
        List<JSONObject>  list = new ArrayList<>();
        JSONObject t = new JSONObject();
        t.put("code","01");
        t.put("name","蚌埠菴烟厂");
        list.add(t);
        t = new JSONObject();
        t.put("code","02");
        t.put("name","芜湖卷烟厂");
        list.add(t);
        t = new JSONObject();
        t.put("code","03");
        t.put("name","合肥卷烟厂");
        list.add(t);
        t = new JSONObject();
        t.put("code","04");
        t.put("name","阜阳卷烟厂");
        list.add(t);
        t = new JSONObject();
        t.put("code","04206");
        t.put("name","合肥卷烟厂鞍山库");
        list.add(t);
        t = new JSONObject();
        t.put("code","05");
        t.put("name","滁州卷烟厂");
        list.add(t);
        t = new JSONObject();
        t.put("code","06");
        t.put("name","蒙城香茄生产部");
        list.add(t);
        t = new JSONObject();
        t.put("code","07");
        t.put("name","重庆中烟工业有限责任公司");
        list.add(t);
        t = new JSONObject();
        t.put("code","08");
        t.put("name","陕西中烟工业有限责任公司");
        list.add(t);
        t = new JSONObject();
        t.put("code","09");
        t.put("name","特殊纪念版");
        list.add(t);
        return list;
    }
    public static void main(String[] args) {
        System.out.println(JSONObject.toJSONString(getWmsAreasList()));
//        getChinesePingyin("DDaa江萍的对对对");
//        System.out.println(DateUtil.getShortTime(new Date()));
//        System.out.println( "2025-01-14 10:50:56".substring(0,10));
//        System.out.println(Constants.checkCarNo("皖AA10991"));
//        System.out.println(Constants.getVehiclePlateNo("湘B140D17").getDescription());
//        System.out.println(Constants.getVehiclePlateNo("宿AP0637").getDescription());
//        0789150665 C97B092F 0789150561
@@ -960,6 +1024,7 @@
        LEAVED(10, "已离园 ","车辆从{data}离场 " ),
        OVER_NUMBER(11, "已过号","超时未到指定月台自动过号" ),
        CHANGE_GROUP(12, "更换月台组","从【{data}】更换到【{data1}】" ),
        BACK_TO_WAIT_SIGNIN(13, "重新签到","重新签到" ),
        ;
        // æˆå‘˜å˜é‡
server/visits/device_service/pom.xml
@@ -9,13 +9,13 @@
        <version>1.0.0-SNAPSHOT</version>
        <relativePath>../../pom.xml</relativePath>
    </parent>
    <artifactId>device_service</artifactId>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <fastjson.version>1.2.70</fastjson.version>
    </properties>
    <dependencies>
@@ -28,5 +28,10 @@
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
        </dependency>
    </dependencies>
</project>
server/visits/dmvisit_admin/src/main/resources/bootstrap-dev.yml
@@ -15,8 +15,7 @@
      password: nacos
      discovery:
        server-addr: http://192.168.0.7:8848 #配置Nacos地址
#        namespace: dmvisit
        namespace: wuhu_visit_dev
        namespace: dm_visits_test
        username: nacos
        password: nacos
knife4j:
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKConstants.java
@@ -431,6 +431,7 @@
        String[] iccmSignoff= new String[]{"/api/iccm/v1/signoff","iccm访客签离"};// iccm访客签离
        String[] authResultPage= new String[]{"/api/acps/auth/open/v1/auth/result/businessNo/page","按业务编号查询下发记录"};// 1.4.7.3按业务编号查询下发记录
        String[] wxAuthUrl= new String[]{"dps/web/wxAuth/loginV2?oaId=atwl&redirectUrl=","待办考勤跳转地址"};// å¾…办考勤跳转地址
        String[] sensorStatusStatistic= new String[]{"/api/v1/sensorStatusStatistic","消防维保定制-设备维保情况"};//消防维保定制-设备维保情况
    }
    /**
     * é™„录A.55消防设备类型
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Device.java
@@ -73,8 +73,8 @@
    @ExcelColumn(name="排序码")
    private Integer sortnum;
    @ApiModelProperty(value = "类型 0门禁 1车库 2LED 3广播点 4广播设备 5断路器空开", example = "1")
    @ExcelColumn(name="类型 0门禁 1车库 2LED 3广播点 4广播设备 5断路器空开")
    @ApiModelProperty(value = "类型 0门禁 1车库 2LED 3广播点 4广播设备 5断路器空开 6海康电表", example = "1")
    @ExcelColumn(name="类型 0门禁 1车库 2LED 3广播点 4广播设备 5断路器空开 6海康电表")
    private Integer type;
    @ApiModelProperty(value = "是否园区出入口 0不是 1是", example = "1")
    @ExcelColumn(name="是否园区出入口 0不是 1是")
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningRuleDetail.java
@@ -1,8 +1,8 @@
package com.doumee.dao.business.model;
import com.doumee.service.business.third.model.LoginUserModel;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.service.business.third.model.LoginUserModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/thrid/BoardServiceImpl.java
@@ -1710,23 +1710,41 @@
    @Override
    public    YearDeviceDataVO yearFightingAdminDeviceData(){
        YearDeviceDataVO data = new YearDeviceDataVO();
        FireStatisticRequest param = new FireStatisticRequest();
        param.setIndexCode("api_fire_statistic");
        BaseResponse<FireStatisticResponse> response = HKService.fireStatistic(param);
        if(response != null && StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE) && response.getData()!=null ) {
            data.setProtectNum(Constants.formatIntegerNum(response.getData().getMaintenanceNum()));
            data.setPlanProtectTotal(Constants.formatIntegerNum(response.getData().getDeviceTotalNum()));
//        FireStatisticRequest param = new FireStatisticRequest();
//        param.setIndexCode("api_fire_statistic");
//        BaseResponse<FireStatisticResponse> response = HKService.fireStatistic(param);
//        if(response != null && StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE) && response.getData()!=null ) {
//            data.setProtectNum(Constants.formatIntegerNum(response.getData().getMaintenanceNum()));
//            data.setPlanProtectTotal(Constants.formatIntegerNum(response.getData().getDeviceTotalNum()));
//        }
//        param = new FireStatisticRequest();
//        param.setIndexCode("api_fire_statistic_month");
//        BaseResponse<FireStatisticResponse> response1 = HKService.fireStatisticMonth(param);
//        if(response1 != null && StringUtils.equals(response1.getCode(), HKConstants.RESPONSE_SUCCEE)
//                && response1.getData()!=null ) {
//            data.setMonthAddNum(Constants.formatIntegerNum(response1.getData().getMaintenanceNumMonth()));
//            data.setMonthTotalNum(Constants.formatIntegerNum(response1.getData().getDeviceTotalNum()));
//        }
        data.setProtectNum(Constants.ZERO);
        data.setPlanProtectTotal(Constants.ZERO);
        data.setMonthAddNum(Constants.ZERO);
        data.setMonthTotalNum(Constants.ZERO);
        BaseResponse<SensorStatusStatisticResponse> response = HKService.sensorStatusStatistic();
        if(response != null && StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)
                && response.getData()!=null ) {
            data.setProtectNum(Constants.formatIntegerNum(response.getData().getSensorMainNum()));
            data.setPlanProtectTotal(Constants.formatIntegerNum(response.getData().getSensorNum()));
            data.setMonthAddNum(Constants.formatIntegerNum(response.getData().getSensorMainMonthNum()));
            data.setMonthTotalNum(Constants.formatIntegerNum(response.getData().getSensorNum()));
        }
        param = new FireStatisticRequest();
        param.setIndexCode("api_fire_statistic_month");
        BaseResponse<FireStatisticResponse> response1 = HKService.fireStatisticMonth(param);
        if(response1 != null && StringUtils.equals(response1.getCode(), HKConstants.RESPONSE_SUCCEE)
                && response1.getData()!=null ) {
            data.setMonthAddNum(Constants.formatIntegerNum(response1.getData().getMaintenanceNumMonth()));
            data.setMonthTotalNum(Constants.formatIntegerNum(response1.getData().getDeviceTotalNum()));
        }
        return data;
    }
    /**
     * ã€æ¶ˆé˜²ç®¡æŽ§ã€‘看板-分类和汇总的各状态设备数量
@@ -2578,7 +2596,8 @@
                .selectAs(Platform::getName,PlatformWarnEvent::getPlatformName)
                .leftJoin(Platform.class,Platform::getId,PlatformJob::getPlatformId)
                .eq(PlatformWarnEvent::getIsdeleted,Constants.ZERO)
                .apply("to_days(t.create_date) = to_days(now())")
                //.apply(" to_days(t.create_date) = to_days(now()) ")
                .apply(" ( t.create_date > now() - INTERVAL 10 MINUTE ) ")
                .orderByDesc(PlatformWarnEvent::getCreateDate)
                .last(" limit "+limit)
        );