doum
2026-03-06 34fe52caba63e6a6337cb9c3e6bd0d4707fd6a99
解决冲突
已修改21个文件
1104 ■■■■ 文件已修改
admin/.env.development 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.env.production 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/public/index.html 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/public/template/member.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/workbench/index.js 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/CommonHeader.vue 231 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/main.js 120 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/store/index.js 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/admissionStatistics.vue 552 ●●●● 补丁 | 查看 | 原始文档 | 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 6 ●●●● 补丁 | 查看 | 原始文档 | 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>
    </noscript>
<noscript>
    <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>
            <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>-->
        <el-dropdown v-if="isLogined" trigger="click">
          <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>
      </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)
      if (item.linkType === 0) {
    getHeaderNav (item,index) {
      this.currentIndex = index
      if(item.linkType === 0){
        this.setTopMenuCurrent(item)
      } else {
      }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')
        }
        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
@@ -38,7 +38,7 @@
  router,
  store,
  computed: {
    ...mapState(['userInfo', 'homePage','topMenuCurrent','menuData'])
    ...mapState(['userInfo', 'homePage', 'topMenuCurrent', 'menuData'])
  },
  watch: {
    async userInfo () {
@@ -55,7 +55,7 @@
    }
  },
  methods: {
    ...mapMutations(['switchCollapseMenu', 'setCurrentIndex', 'setHomePage', 'setTopMenuCurrent', 'setTopMenuCurrent','cleartagsview']),
    ...mapMutations(['switchCollapseMenu', 'setCurrentIndex', 'setHomePage', 'setTopMenuCurrent', 'setTopMenuCurrent', 'cleartagsview']),
    // åˆå§‹åŒ–本地配置
    initLocalConfig () {
      // èœå•状态配置
@@ -79,66 +79,66 @@
        this.setHomePage(storeMenus[0])
      }
      await fetchMenuTree()
          .then(allmenus => {
            // æ·»åŠ èœå•
            var topList = allmenus.filter(item => {
              return item.type === 1
            })
            storeTopMenus.push.apply(storeTopMenus, topList)
            var topCurrent = null
            var tlist =[]
            topList.forEach(item => {
              if (item.linkType === 0 ) {
                if (topCurrent == null) {
                  topCurrent = item
                }
                tlist.push(...item.children)
        .then(allmenus => {
          // æ·»åŠ èœå•
          var topList = allmenus.filter(item => {
            return item.type === 1
          })
          storeTopMenus.push.apply(storeTopMenus, topList)
          var topCurrent = null
          var tlist = []
          topList.forEach(item => {
            if (item.linkType === 0) {
              if (topCurrent == null) {
                topCurrent = item
              }
            })
            if (this.$route.query && this.$route.query.menuparams) {
              let 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 {
              this.setTopMenuCurrent(topCurrent)
              this.setCurrentIndex(0)
            }
            // console.log(topList)
            // var menus = []
            // topList.forEach(item => {
            //   console.log(topCurrent.id, item.id)
            //   if (item.id == this.topMenuCurrent.id) {
            //     menus = item.children
            //   }
            // })
            console.log('menus', this.menuData.list)
            storeMenus.push.apply(storeMenus, this.menuData.list)
            // æ·»åŠ è·¯ç”±
            this.__addRouters(tlist)
            // 404
            router.addRoute({
              path: '*',
              redirect: '/not-found'
            })
            // é¦–页
            router.addRoute({
              name: 'index',
              path: '/',
              redirect: this.homePage.url
            })
            // è·¯ç”±åŠ è½½å®ŒæˆåŽï¼Œå¦‚æžœè®¿é—®çš„æ˜¯/,跳转至动态识别的首页
            if (this.$route.query && this.$route.query.menuparams) {
              this.$router.push(topList.filter(item => item.params === this.$route.query.menuparams)[0].homeUrl)
            } else if (this.$route.path === '/') {
              this.$router.push(this.homePage.url)
              tlist.push(...item.children)
            }
          })
          .catch(e => {
            throw e
          if (this.$route.query && 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 {
            this.setTopMenuCurrent(topCurrent)
            this.setCurrentIndex(0)
          }
          // console.log(topList)
          // var menus = []
          // topList.forEach(item => {
          //   console.log(topCurrent.id, item.id)
          //   if (item.id == this.topMenuCurrent.id) {
          //     menus = item.children
          //   }
          // })
          console.log('menus', this.menuData.list)
          storeMenus.push.apply(storeMenus, this.menuData.list)
          // æ·»åŠ è·¯ç”±
          this.__addRouters(tlist)
          // 404
          router.addRoute({
            path: '*',
            redirect: '/not-found'
          })
          .finally(() => {
            this.loading = false
          // é¦–页
          router.addRoute({
            name: 'index',
            path: '/',
            redirect: this.homePage.url
          })
          // è·¯ç”±åŠ è½½å®ŒæˆåŽï¼Œå¦‚æžœè®¿é—®çš„æ˜¯/,跳转至动态识别的首页
          if (this.$route.query && this.$route.query.menuparams) {
            this.$router.push(topList.filter(item => item.params === this.$route.query.menuparams)[0].homeUrl)
          } else if (this.$route.path === '/') {
            this.$router.push(this.homePage.url)
          }
        })
        .catch(e => {
          throw e
        })
        .finally(() => {
          this.loading = false
        })
    },
    async chagneRoutes () {
      // é‡ç½®èœå•
@@ -146,8 +146,8 @@
      console.log('menus', this.menuData.list)
      // æ·»åŠ è·¯ç”±
      // this.__addRouters(this.menuData.list)
      if(this.topMenuCurrent.homeUrl){
        await this.$router.push({path: this.topMenuCurrent.homeUrl, query: {}})
      if (this.topMenuCurrent.homeUrl) {
        await this.$router.push({ path: this.topMenuCurrent.homeUrl, query: {} })
      }
    },
    // æ–°å»ºè·¯ç”±
@@ -188,7 +188,7 @@
      return
    }
    await this.initRoutes()
        .catch(() => {})
      .catch(() => {})
  },
  mounted () {
    this.initLocalConfig()
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,8 +60,8 @@
  },
  // è®¾ç½®é¦–页路由信息
  setTopMenuCurrent (state, current) {
    console.log('setTopMenuCurrent', current)
    if (current.id !== state.topMenuCurrent.id) {
    console.log("setTopMenuCurrent",current)
    if(current.id !== state.topMenuCurrent.id){
      state.topMenuList.list.forEach(item => {
        console.log(item.id, item.id)
        if (current.id == item.id) {
@@ -86,7 +73,7 @@
  },
  // é‡ç½®èœå•
  resetMenus: (state) => {
    state.topMenuId = null
    state.topMenuId=null;
    state.menuData.list = []
  },
  //  tags
@@ -95,7 +82,7 @@
    // findindex找角标,循环判断一下,如果等于那么就代表有相同的,就不必添加,如果找不到那就是-1.就添加
    // state.tags = [{ ...val, keepAlive: false }]
    const result = state.tags.findIndex(item => item.index === val.index)
    if (result === -1) {
      if (result === -1) {
      state.tags.push({ ...val, keepAlive: false })
    } else {
      state.tags[result] = { ...val, keepAlive: false }
admin/src/views/business/admissionStatistics.vue
@@ -114,316 +114,313 @@
</template>
<script>
  import * as echarts from 'echarts'
  import { getInParkUserData, getRataList, getReportList, reportExportExcel } from '@/api/business'
  export default {
    data() {
      return {
        info: null,
        isGroupBy: 0,
        radio: 'month',
        value: '',
        dateType: 'month',
        date: '',
        date1: '',
import * as echarts from 'echarts'
import { getInParkUserData, getRataList, getReportList, reportExportExcel } from '@/api/business'
export default {
  data () {
    return {
      info: null,
      isGroupBy: 0,
      radio: 'month',
      value: '',
      dateType: 'month',
      date: '',
      date1: '',
        listZB: [],
        column: [],
        list: []
      }
    },
    mounted() {
      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}`
      listZB: [],
      column: [],
      list: []
    }
  },
  mounted () {
    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}`
    this.getData()
    this.getRataLists()
    this.getReportLists()
  },
  methods: {
    // å¯¼å‡º
    daochu () {
      reportExportExcel({ dateStr: this.date1, isGroupBy: this.isGroupBy, type: 1 }).then(res => {
        this.download(res)
      })
    },
    methods: {
      // å¯¼å‡º
      daochu() {
        reportExportExcel({ dateStr: this.date1, isGroupBy: this.isGroupBy, type: 1 }).then(res => {
          this.download(res)
    changeBB () {
      if (this.radio === 'month') {
        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 {
        const now = new Date()
        const year = now.getFullYear()
        this.date1 = `${year}`
      }
      this.getReportLists()
    },
    // å…¥å›­è½¦è¾†ç»Ÿè®¡è¡¨
    getReportLists () {
      getReportList({ dateStr: this.date1, isGroupBy: this.isGroupBy, type: 1 })
        .then(res => {
          if (!res || res.length === 0) {
            this.column = []
            this.list = []
            return
          }
          this.column = res[0]
          this.list = res.slice(1).map(row => {
            const obj = {}
            this.column.forEach((header, index) => {
              obj[header] = row[index]
            })
            return obj
          })
          // if (res.length === 0) {
          //   this.column = []
          //   this.list = []
          //   return
          // }
          //
          // this.column = res[0]
          // this.list = res.slice(1, res.length);
        })
      },
      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}`;
          this.date1 = `${year}-${month}`
        } else {
          let now = new Date();
          let year = now.getFullYear();
          this.date1 = `${year}`
        }
        this.getReportLists()
      },
      // å…¥å›­è½¦è¾†ç»Ÿè®¡è¡¨
      getReportLists() {
        getReportList({ dateStr: this.date1, isGroupBy: this.isGroupBy, type: 1 })
          .then(res => {
            if (res.length === 0) {
              this.column = []
              this.list = []
              return
            }
            this.column = res[0]
            this.list = res.slice(1).map(row => {
              const obj = {};
              this.column.forEach((header, index) => {
                obj[header] = row[index];
              });
              return obj;
            });
            // if (res.length === 0) {
            //   this.column = []
            //   this.list = []
            //   return
            // }
            //
            // this.column = res[0]
            // this.list = res.slice(1, res.length);
          })
      },
      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}`;
          this.value = `${year}-${month}`
        } else {
          let now = new Date();
          let year = now.getFullYear();
          this.value = `${year}`
        }
        this.getRataLists()
      },
      // è½¦è¾†åˆ†ç±»ç»Ÿè®¡
      getRataLists() {
        getRataList({ dateStr: this.value, isGroupBy: this.isGroupBy, type: 1 })
          .then(res => {
            this.listZB = res
            // this.$nextTick(() => {
            //   this.initDept()
            // })
            setTimeout(() => {
              this.initDept()
            }, 1000)
          })
      },
      // åŸºç¡€æ•°æ®
      getData() {
        getInParkUserData({ isGroupBy: this.isGroupBy, type: 1 }).then(res => {
          this.info = res
    },
    changeDateType () {
      if (this.dateType === 'month') {
        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 {
        const now = new Date()
        const year = now.getFullYear()
        this.value = `${year}`
      }
      this.getRataLists()
    },
    // è½¦è¾†åˆ†ç±»ç»Ÿè®¡
    getRataLists () {
      getRataList({ dateStr: this.value, isGroupBy: this.isGroupBy, type: 1 })
        .then(res => {
          this.listZB = res
          // this.$nextTick(() => {
          //   this.initType()
          //   this.initDept()
          // })
          setTimeout(() => {
            this.initType()
            this.initDept()
          }, 1000)
        })
      },
      // å…¨å¹´å…¥å›­è½¦è¾†è¶‹åŠ¿
      initType() {
        if (!this.info.cumulativeDataList) return
    },
    // åŸºç¡€æ•°æ®
    getData () {
      getInParkUserData({ isGroupBy: this.isGroupBy, type: 1 }).then(res => {
        this.info = res
        // this.$nextTick(() => {
        //   this.initType()
        // })
        setTimeout(() => {
          this.initType()
        }, 1000)
      })
    },
    // å…¨å¹´å…¥å›­è½¦è¾†è¶‹åŠ¿
    initType () {
      if (!this.info.cumulativeDataList) return
        const myChart = echarts.init(document.querySelector('.echart1'))
      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 = {
          grid: {
            left: '0%',
            right: '5%',
            bottom: '10%',
            top: '10%',
            containLabel: true
      const option = {
        grid: {
          left: '0%',
          right: '5%',
          bottom: '10%',
          top: '10%',
          containLabel: true
        },
        tooltip: {
          trigger: 'axis',
          axisPointer: {
            type: 'line'
          }
        },
        xAxis: {
          type: 'category',
          data: names
        },
        yAxis: {
          type: 'value',
          axisLine: {
            show: true
          },
          tooltip: {
            trigger: 'axis',
            axisPointer: {
              type: 'line'
          axisLabel: {
            formatter: function (value) {
              // å››èˆäº”入到最近的整数
              return Math.round(value)
            }
          },
          xAxis: {
            type: 'category',
            data: names
          },
          yAxis: {
            type: 'value',
            axisLine: {
              show: true
            },
            axisLabel: {
              formatter: function (value) {
                // å››èˆäº”入到最近的整数
                return Math.round(value);
          }
        },
        graphic: {
          elements: [
            {
              type: 'text',
              left: 'left',
              top: 'top',
              style: {
                text: '人员数',
                textAlign: 'center',
                fill: '#333'
              }
            }
          },
          graphic: {
            elements: [
              {
                  type: 'text',
                  left: 'left',
                  top: 'top',
                  style: {
                    text: '人员数',
                    textAlign: 'center',
                    fill: '#333'
                  }
                }
            ]
          },
          series: [
            {
              data: datas,
              type: 'line',
              areaStyle: {
                normal: {
                  color: {
                    x: 0,
                    y: 0,
                    x2: 0,
                    y2: 1,
                    colorStops: [{
                      offset: 0,
                      color: '#207FF7' // 0% å¤„的颜色
                    }, {
                      offset: 1,
                      color: 'rgba(255,255,255,.2)' // 100% å¤„的颜色
                    }],
                    globalCoord: false // ç¼ºçœä¸º false
                  }
                }
              },
              lineStyle: { // çº¿æ¡æ ·å¼
          ]
        },
        series: [
          {
            data: datas,
            type: 'line',
            areaStyle: {
              normal: {
                color: {
                  type: 'linear',
                  x: 0,
                  y: 0,
                  x2: 0,
                  y2: 1,
                  colorStops: [{
                    offset: 0, color: '#207FF7' // 0% å¤„的颜色
                    offset: 0,
                    color: '#207FF7' // 0% å¤„的颜色
                  }, {
                    offset: 1, color: '#207FF7' // 100% å¤„的颜色
                  }]
                },
                width: 2 // çº¿æ¡ç²—细
                    offset: 1,
                    color: 'rgba(255,255,255,.2)' // 100% å¤„的颜色
                  }],
                  globalCoord: false // ç¼ºçœä¸º false
                }
              }
            },
            lineStyle: { // çº¿æ¡æ ·å¼
              color: {
                type: 'linear',
                x: 0,
                y: 0,
                x2: 0,
                y2: 1,
                colorStops: [{
                  offset: 0, color: '#207FF7' // 0% å¤„的颜色
                }, {
                  offset: 1, color: '#207FF7' // 100% å¤„的颜色
                }]
              },
              symbol: 'circle',
              symbolSize: 10,
              itemStyle: {
                borderWidth: 1,
                borderColor: '#fff',
                color: '#207FF7'
              },
              smooth: false
            }
          ]
        }
        myChart.setOption(option)
        window.addEventListener('resize', function () { // æ‰§è¡Œ
          myChart.resize()
        })
      },
      // è½¦è¾†åˆ†ç±»ç»Ÿè®¡
      initDept() {
        if (!this.listZB) return
        const dom = document.getElementById('echart2')
        console.log(dom)
        const myChart = echarts.init(dom)
        let data = this.listZB.map(item => {
          return {
            value: item.total,
            name: item.name
              width: 2 // çº¿æ¡ç²—细
            },
            symbol: 'circle',
            symbolSize: 10,
            itemStyle: {
              borderWidth: 1,
              borderColor: '#fff',
              color: '#207FF7'
            },
            smooth: false
          }
        })
        ]
      }
      myChart.setOption(option)
      window.addEventListener('resize', function () { // æ‰§è¡Œ
        myChart.resize()
      })
    },
    // è½¦è¾†åˆ†ç±»ç»Ÿè®¡
    initDept () {
      if (!this.listZB) return
        let option = {
          tooltip: {
            trigger: 'item',
          },
          legend: {
            show: false,
            orient: 'vertical',
            left: 'left'
          },
          series : [
            {
              name: '访问来源',
              type: 'pie',
              radius: ['34%', '50%'],
              labelLine: {
                normal: {
                  length: 30,
                  length2: 70,
      const dom = document.getElementById('echart2')
      console.log(dom)
      const myChart = echarts.init(dom)
      const data = this.listZB.map(item => {
        return {
          value: item.total,
          name: item.name
        }
      })
      const option = {
        tooltip: {
          trigger: 'item'
        },
        legend: {
          show: false,
          orient: 'vertical',
          left: 'left'
        },
        series: [
          {
            name: '访问来源',
            type: 'pie',
            radius: ['34%', '50%'],
            labelLine: {
              normal: {
                length: 30,
                length2: 70
              }
            },
            label: {
              formatter: '{a|{b}} {d}%',
              rich: {
                a: {
                  color: '#333333',
                  fontSize: 14,
                  fontWeight: 500
                }
              },
              label: {
                formatter: "{a|{b}} {d}%",
                rich: {
                  a: {
                    color: '#333333',
                    fontSize: 14,
                    fontWeight: 500
                  }
                },
                padding: [0,-50,20,-100]
              },
              data: data
            }
          ]
        }
        myChart.setOption(option)
        window.addEventListener('resize', function () { // æ‰§è¡Œ
          myChart.resize()
        })
      },
      initDept3() {
        const myChart = echarts.init(document.querySelector('#echart3'))
        let option = {
          grid: {
            left: '5%',
            right: '10%',
            bottom: '0%',
            top: '20%',
            containLabel: true
          },
          xAxis: {
            type: 'category',
            data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
          },
          yAxis: {
            type: 'value'
          },
          series: [
            {
              data: [150, 230, 224, 218, 135, 147, 260],
              type: 'line'
            }
          ]
        }
        myChart.setOption(option)
        window.addEventListener('resize', function () { // æ‰§è¡Œ
          myChart.resize()
        })
              padding: [0, -50, 20, -100]
            },
            data: data
          }
        ]
      }
      myChart.setOption(option)
      window.addEventListener('resize', function () { // æ‰§è¡Œ
        myChart.resize()
      })
    },
    initDept3 () {
      const myChart = echarts.init(document.querySelector('#echart3'))
      const option = {
        grid: {
          left: '5%',
          right: '10%',
          bottom: '0%',
          top: '20%',
          containLabel: true
        },
        xAxis: {
          type: 'category',
          data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
        },
        yAxis: {
          type: 'value'
        },
        series: [
          {
            data: [150, 230, 224, 218, 135, 147, 260],
            type: 'line'
          }
        ]
      }
      myChart.setOption(option)
      window.addEventListener('resize', function () { // æ‰§è¡Œ
        myChart.resize()
      })
    }
  }
}
</script>
<style lang="scss" scoped>
@@ -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系统安装对应的版本服务:
@@ -24,4 +28,4 @@
(nameserve 8.8.8.8)
tail -f /usr/local/jars/logs/visitsAdmin/info.2025-10-31.0.log
tail -f /usr/local/jars/logs/visitsAdmin/info.2025-10-31.0.log
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)
        );