jiangping
2024-05-31 7b3b1cb76452258c3b554b6364ef5d50ed34542c
最新版本
已添加11个文件
已修改19个文件
587 ■■■■ 文件已修改
admin/src/api/other/other.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/assets/icons/ic_grey.png 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaCarUseBookWindow.vue 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaHiddenDangerWindow.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/Menu.vue 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/tagsview.vue 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/hk/copas.vue 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/hk/dfeform.vue 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/hk/frs.vue 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/hk/hkservice.vue 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/vue.config.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/api/cloud/SystemDictDataCloudController.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/biz/system/impl/SystemMenuBizImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/Constants.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/dao/system/model/SystemMenu.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/dao/system/vo/SystemMenuListVO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/dao/system/vo/SystemMenuNodeVO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/resources/mappers/SystemMenuMapper.xml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/HkSyncCloudController.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKConstants.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/ApplyCTGTRequest.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/ApplySTequest.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/HKGetServiceLoginUrlRequest.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/ApplyCTGTResponse.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/ApplySTResponse.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/ext/HkSyncService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncBaseServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncLoginAuthServiceImpl.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/other/other.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
import request from '../../utils/request'
// æŸ¥è¯¢
export function getServiceUrl (data) {
  return request.post('/visitsAdmin/cloudService//business/hksync/getServiceUrl', data, {
    trim: true
  })
}
admin/src/assets/icons/ic_grey.png

admin/src/components/business/OperaCarUseBookWindow.vue
@@ -67,35 +67,35 @@
          <div class="item" v-for="(item,index) in model.approveDateVO.approveList" :key="item.id">
            <div class="separate" v-if=" (index < model.approveDateVO.approveList.length-1)"></div>
            <div class="info">
              <img src="@/assets/icons/ic_tongguo.png"   class="iconnew" v-if="(item.status ==2)"/>
              <img src="@/assets/icons/ic_dangqian.png"   class="iconnew"  v-if="(item.status==1)"/>
              <img src="@/assets/icons/ic_jujue.png"  class="iconnew"  v-if="(item.status==3)"></i>
              <img src="@/assets/icons/ic_grep.png"  class="iconnew" v-if="(item.status==null || item.status==0 )"></i>
              <div style="display: inline" v-if="item.approveType ===0">
              <img src="@/assets/icons/ic_tongguo.png"   class="iconnew" v-if="(item.type !=1 &&item.status ==2)"/>
              <img src="@/assets/icons/ic_dangqian.png"   class="iconnew"  v-if="(item.type !=1 &&item.status==1)"/>
              <img src="@/assets/icons/ic_jujue.png"  class="iconnew"  v-if="(item.type !=1 &&item.status==3)"/>
              <img src="@/assets/icons/ic_grey.png"  class="iconnew" v-if="item.type ==1 || (item.status==null || item.status==0 )"/>
              <div style="display: inline" v-if="item.approveType !=1">
                <img v-if="item.faceImg!=null && item.faceImg !=''" :src="item.faceImg" class="avatar" alt="" />
                <img v-if="item.faceImg ==null ||item.faceImg ==''"  src="@/assets/avatar/man.png" class="avatar" alt="" />
              </div>
              <div style="display: inline" v-if="item.approveType ===1">
                <img v-if="item.status === 1"  src="@/assets/icons/ic_chaosong.png" class="avatar" alt="" />
              <div style="display: inline" v-if="item.approveType  ==1">
                <img v-if="item.status == 1"  src="@/assets/icons/ic_chaosong.png" class="avatar" alt="" />
                <img  v-if="item.status != 1"  src="@/assets/icons/ic_duoren.png" class="avatar" alt="" />
              </div>
              <div class="content">
                <div class="line">
                  <div class="name">{{ item.title}}</div>
                  <div class="time">{{ item.createDate }}</div>
                  <div class="time">{{ item.checkDate }}</div>
                </div>
                <div class="line">
                  <div class="company">
                    {{ item.createUserName }} {{ item.companyName }}
                    {{ item.memberName }}
                    <div style="display: inline" v-if="item.statusInfo!=null && item.statusInfo!=''">
                       <span class="status-green">{{item.statusInfo||''}}</span>)
                       <span class="status-green">{{item.statusInfo ||''}}</span>)
                    </div>
                  </div>
                </div>
              </div>
            </div>
            <div v-if="item.approveType != 1 " class="remark">
              {{ item.checkInfo ||'水电费反反复复反反复复方法方法方法方法方法方法方法方法方法方法方法方法发发发' }}
            <div v-if="item.approveType != 1 && item.checkInfo !=null && item.checkInfo !=''" class="remark">
              {{ item.checkInfo || '' }}
            </div>
            <div v-if="item.approveType == 1 "  class="childList">
              <div style="display: inline" v-for="item1 in item.approveList" :key="item1.id">
@@ -117,6 +117,7 @@
    <el-dialog
        append-to-body
        title="同意申请"
        style="text-align: center"
        class="dialogCl"
        :visible.sync="isShowProblem"
        width="480px"
@@ -149,6 +150,7 @@
    <el-dialog
        append-to-body
        title="拒绝申请"
        style="text-align: center"
        class="dialogCl"
        :visible.sync="isBackProblem"
        width="600px"
@@ -478,7 +480,7 @@
            height: 40px;
            border-radius: 50%;
            margin: 0 12px 0 16px;
            border: 1px solid;
            //border: 1px solid;
          }
          .content {
            flex: 1;
admin/src/components/business/OperaHiddenDangerWindow.vue
@@ -116,9 +116,9 @@
          <div class="item" v-for="(item,index) in logList" :key="item.id">
            <div class="separate" v-if="index < logList.length-1"></div>
            <div class="info">
              <i class="el-icon-success icon" v-if="(model.status ==1) || index < logList.length-1"></i>
              <i class="el-icon-question icon1" v-if="(model.status==0)  && index == logList.length-1"></i>
              <i class="el-icon-error icon2" v-if="(model.status==2)  && index == logList.length-1"></i>
              <img src="@/assets/icons/ic_tongguo.png"   class="iconnew" v-if="(model.status ==1) || index < logList.length-1"/>
              <img src="@/assets/icons/ic_dangqian.png"   class="iconnew"   v-if="(model.status==0)  && index == logList.length-1"/>
              <img src="@/assets/icons/ic_jujue.png"  class="iconnew"   v-if="(model.status==2)  && index == logList.length-1"/>
              <img v-if="item.avatar!=null && item.avatar !=''" :src="item.avatar" class="avatar" alt="" />
              <img v-if="item.avatar ==null ||item.avatar ==''"  src="@/assets/avatar/man.png" class="avatar" alt="" />
              <div class="content">
@@ -683,6 +683,11 @@
            color: #53b76f;
            font-size: 24px;
          }
          .iconnew{
            width: 24px;
            height: 24px;
          }
          .icon1 {
            position: relative;
            z-index: 11;
@@ -700,7 +705,7 @@
            height: 40px;
            border-radius: 50%;
            margin: 0 12px 0 16px;
            border: 1px solid;
            //border: 1px solid;
          }
          .content {
            flex: 1;
admin/src/components/common/Menu.vue
@@ -33,11 +33,11 @@
      if (path.endsWith('/')) {
        path = path.substring(0, path.length - 1)
      }
      const menuConfig = this.__getMenuConfig(path, 'url', this.menuData.list)
      const menuConfig = this.__getMenuConfig(path, 'index', this.menuData.list)
      if (menuConfig == null) {
        return null
      } else {
        this.$store.commit("pushtags", menuConfig)
        this.$store.commit('pushtags', menuConfig)
      }
      // console.log(menuConfig.index);
      return menuConfig.index
@@ -45,7 +45,7 @@
    // é»˜è®¤å±•开的菜单index
    defaultOpeneds () {
      // return this.menuData.list.map(menu => menu.index)
      return [this.menuData.list[0].index]
    }
  },
@@ -55,20 +55,24 @@
      const menuConfig = this.__getMenuConfig(menuIndex, 'index', this.menuData.list)
      // æ‰¾ä¸åˆ°é¡µé¢
      try {
        require('@/views' + menuConfig.url)
          require('@/views' + menuConfig.url)
      } catch (e) {
        this.$tip.error('未找到页面文件@/views' + menuConfig.url + '.vue,请检查菜单路径是否正确')
        return
      }
      // ç‚¹å‡»å½“前菜单不做处理
      if (menuConfig.url === this.$route.path) {
      if (menuConfig.url === this.$route.path && menuConfig.params === this.$route.query.param) {
        return
      }
      if (menuConfig.url == null || menuConfig.url.trim().length === 0) {
        return
      }
      this.$router.push(menuConfig.url)
      this.$store.commit("pushtags", menuConfig)
      if(menuConfig.params!=null && menuConfig.params!=''){
        this.$router.push({path:menuConfig.url,query:{index:menuConfig.index,param:menuConfig.params}})
      }else{
        this.$router.push(menuConfig.url)
      }
      this.$store.commit('pushtags', menuConfig)
    },
    // èŽ·å–èœå•é…ç½®
    __getMenuConfig (value, key, menus) {
admin/src/components/common/tagsview.vue
@@ -12,7 +12,7 @@
        :key="index"
        :id="'tags-box-' + index"
        @contextmenu.prevent="openMenu(item, $event)"
        :class="isActive(item.url, index) ? 'active' : ''"
        :class="isActive(item.url, item.params,index) ? 'active' : ''"
        class="tagsview"
        @click="tagsmenu(item, index)"
      >
@@ -68,7 +68,7 @@
    },
    $route(to, from) {
      this.tags.forEach((item, index) => {
        if (item.url === to.path) {
        if (item.url === to.path && item.index === to.query.index) {
          const tagsDiv = document.getElementById('tags-box')
          if (index) {
            tagsDiv.scrollTo(index * 110, 0)
@@ -129,11 +129,11 @@
          }
        } else {
          // é‚£ä¹ˆï¼Œå¦‚果上面的条件都不成立,没有length=0.也就是说你还有好几个标签,并且你删除的是最后一位标签,那么就往左边挪一位跳转路由
          this.$router.push({ path: this.tags[index - 1].url })
          this.$router.push({ path: this.tags[index - 1].url,query:{param: this.tags[index - 1].params} })
        }
      } else {
        // å¦‚果你点击不是最后一位标签,点的前面的,那就往右边跳转
        this.$router.push({ path: this.tags[index].url })
        this.$router.push({ path: this.tags[index].url ,query:{param: this.tags[index].params}})
      }
    },
    // ç‚¹å‡»è·³è½¬è·¯ç”±
@@ -142,7 +142,7 @@
      // åˆ¤æ–­ï¼šå½“前路由不等于当前选中项的url,也就代表你点击的不是现在选中的标签,是另一个标签就跳转过去,如果你点击的是现在已经选中的标签就不用跳转了,因为你已经在这个路由了还跳什么呢。
      if (this.$route.path !== item.url) {
        // ç”¨path的跳转方法把当前项的url当作地址跳转。
        this.$router.push({ path: item.url })
        this.$router.push({ path: item.url ,query:{param: this.tags[index].params}})
        const tagsDiv = document.getElementById('tags-box')
        if (index) {
          tagsDiv.scrollTo(index * 110, 0)
@@ -150,8 +150,8 @@
      }
    },
    // é€šè¿‡åˆ¤æ–­è·¯ç”±ä¸€è‡´è¿”回布尔值添加class,添加高亮效果
    isActive(route, index) {
      const res = route === this.$route.path
    isActive(route,params, index) {
      const res =(route === this.$route.path && params== this.$route.query.param)
      return res
    },
    scrollToStart() {
admin/src/views/hk/copas.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,58 @@
<template>
  <div   style="text-align: center;background: white;width: 100%;height: 100%;">
    <div v-if="url!=null"  >
      <iframe :src="url" width="100%"  style="border:none"  height="600"></iframe>
    </div>
    <div  v-else >
      <div style="padding-top: 200px;font-size: 28px;color: #3C77DA">{{message}}</div>
    </div>
    <template v-if="1===2">
      <div style="bottom: 20px;position: fixed;text-align: center;width: 90%;height: 60px">
        {{url}}<br>
        <el-button type="primary" :loading="loading" @click="getUrl()">重新加载页面</el-button>
      </div>
    </template>
  </div>
</template>
<script>
import BaseTable from '@/components/base/BaseTable'
export default {
  name: 'otherLoginService',
  extends: BaseTable,
  data () {
    return {
      url: null,
      loading: false,
      message: '正在努力登录组件服务...'
    }
  },
  created () {
    this.config({
      module: '设备管otherLoginService理信息表',
      api: '/other/other',
      'field.id': 'id',
      'field.main': 'id'
    })
    this.getUrl()
  },
  methods: {
    getUrl () {
      this.loading = true
      this.api.getServiceUrl({ label: 'HK_SERVICE_COPAS_URL' })
        .then(res => {
          this.message = '正在做努力加载组件!'
          this.url = res
        })
        .catch(e => {
          this.message = '登录组件服务失败,请联系系统管理员检查!'
        })
        .finally(() => {
          this.loading = false
        })
    }
  }
}
</script>
<style>
</style>
admin/src/views/hk/dfeform.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,58 @@
<template>
  <div   style="text-align: center;background: white;width: 100%;height: 100%;">
    <div v-if="url!=null"  >
      <iframe :src="url" width="100%" style="border:none" height="600"></iframe>
    </div>
    <div  v-else >
      <div style="padding-top: 200px;font-size: 28px;color: #3C77DA">{{message}}</div>
    </div>
    <template v-if="1==2">
      <div style="bottom: 20px;position: fixed;text-align: center;width: 90%;height: 60px">
        {{url}}<br>
        <el-button type="primary" :loading="loading" @click="getUrl()">重新加载页面</el-button>
      </div>
    </template>
  </div>
</template>
<script>
import BaseTable from '@/components/base/BaseTable'
export default {
  name: 'otherLoginService',
  extends: BaseTable,
  data () {
    return {
      url: null,
      loading: false,
      message: '正在努力登录组件服务...'
    }
  },
  created () {
    this.config({
      module: '设备管otherLoginService理信息表',
      api: '/other/other',
      'field.id': 'id',
      'field.main': 'id'
    })
    this.getUrl()
  },
  methods: {
    getUrl () {
      this.loading = true
      this.api.getServiceUrl({ label: 'HK_SERVICE_DFEFORM_URL' })
        .then(res => {
          this.message = '正在做努力加载组件!'
        this.url = res
        })
        .catch(e => {
          this.message = '登录组件服务失败,请联系系统管理员检查!'
        })
        .finally(() => {
          this.loading = false
        })
    }
  }
}
</script>
<style>
</style>
admin/src/views/hk/frs.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,58 @@
<template>
  <div   style="text-align: center;background: white;width: 100%;height: 100%;">
    <div v-if="url!=null"  >
      <iframe :src="url" width="100%" style="border:none"  height="600"></iframe>
    </div>
    <div  v-else >
      <div style="padding-top: 200px;font-size: 28px;color: #3C77DA">{{message}}</div>
    </div>
    <template v-if="1==2">
      <div style="bottom: 20px;position: fixed;text-align: center;width: 90%;height: 60px">
        {{url}}<br>
        <el-button type="primary" :loading="loading" @click="getUrl()">重新加载页面</el-button>
      </div>
    </template>
  </div>
</template>
<script>
import BaseTable from '@/components/base/BaseTable'
export default {
  name: 'otherLoginService',
  extends: BaseTable,
  data () {
    return {
      url: null,
      loading: false,
      message: '正在努力登录组件服务...'
    }
  },
  created () {
    this.config({
      module: '设备管otherLoginService理信息表',
      api: '/other/other',
      'field.id': 'id',
      'field.main': 'id'
    })
    this.getUrl()
  },
  methods: {
    getUrl () {
      this.loading = true
      this.api.getServiceUrl({ label: 'HK_SERVICE_FRS_URL' })
        .then(res => {
          this.message = '正在做努力加载组件!'
          this.url = res
        })
        .catch(e => {
          this.message = '登录组件服务失败,请联系系统管理员检查!'
        })
        .finally(() => {
          this.loading = false
        })
    }
  }
}
</script>
<style>
</style>
admin/src/views/hk/hkservice.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,60 @@
<template>
  <div   style="text-align: center;background: white;width: 100%;height: 100%;">
    <div v-if="url!=null"  >
      <iframe :src="url" width="100%"  style="border:none"  height="600"></iframe>
    </div>
    <div  v-else >
      <div style="padding-top: 200px;font-size: 28px;color: #3C77DA">{{message}}</div>
    </div>
    <template v-if="1===2">
      <div style="bottom: 20px;position: fixed;text-align: center;width: 90%;height: 60px">
        {{url}}<br>
        <el-button type="primary" :loading="loading" @click="getUrl()">重新加载页面</el-button>
      </div>
    </template>
  </div>
</template>
<script>
import BaseTable from '@/components/base/BaseTable'
export default {
  name: 'otherLoginService',
  extends: BaseTable,
  data () {
    return {
      url: null,
      loading: false,
      paramUrl:'',
      message: '正在努力登录组件服务...'
    }
  },
  created () {
    this.config({
      module: '设备管otherLoginService理信息表',
      api: '/other/other',
      'field.id': 'id',
      'field.main': 'id'
    })
    this.paramUrl = this.$route.query.param
    this.getUrl()
  },
  methods: {
    getUrl () {
      this.loading = true
      this.api.getServiceUrl({ label: this.paramUrl})
        .then(res => {
          this.message = '正在做努力加载组件!'
          this.url = res
        })
        .catch(e => {
          this.message = '登录组件服务失败,请联系系统管理员检查!'
        })
        .finally(() => {
          this.loading = false
        })
    }
  }
}
</script>
<style>
</style>
admin/vue.config.js
@@ -12,16 +12,15 @@
  lintOnSave: false,
  devServer: {
    host: '0.0.0.0',
    port: 10012,
    proxy: {
    port: 10012
  /*  proxy: {
      [process.env.VUE_APP_API_PREFIX]: {
        target: process.env.VUE_APP_API_URL,
        changeOrigin: true,
        pathRewrite: {
          [`^${[process.env.VUE_APP_API_PREFIX]}`]: ''
        }
      }
    }
      } */
  },
  configureWebpack: {
    resolve: {
server/system_service/src/main/java/com/doumee/api/cloud/SystemDictDataCloudController.java
@@ -46,6 +46,7 @@
    @CloudRequiredPermission("system:dict:update")
    public ApiResponse create(@Validated(OperaType.Create.class) @RequestBody SystemDictData systemDictData,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        systemDictData.setLoginUserInfo(this.getLoginUser(token));
        systemDictData.setCreateUser(systemDictData.getLoginUserInfo().getId());
        return ApiResponse.success(systemDictDataBiz.create(systemDictData));
    }
@@ -75,6 +76,7 @@
    @CloudRequiredPermission("system:dict:update")
    public ApiResponse updateById(@Validated(OperaType.Update.class) @RequestBody SystemDictData systemDictData,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        systemDictData.setLoginUserInfo(this.getLoginUser(token));
        systemDictData.setUpdateUser(systemDictData.getLoginUserInfo().getId());
        systemDictDataBiz.updateById(systemDictData);
        return ApiResponse.success(null);
    }
@@ -84,15 +86,6 @@
    @CloudRequiredPermission("system:dict:update")
    public ApiResponse<PageData<SystemDictDataListVO>> findPage (@RequestBody PageWrap<QuerySystemDictDataDTO> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(systemDictDataService.findPage(pageWrap));
    }
    @ApiOperation("查询咖豆任务规则")
    @PostMapping("/findAllList")
    @CloudRequiredPermission("system:dict:update")
    public ApiResponse findAllList (@RequestBody PageWrap<QuerySystemDictDataDTO> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        List<SystemDictData> list= systemDictDataBiz.queryListByCode(Constants.COFFEE_BEAN_TASK,null);
        return ApiResponse.success(list);
    }
server/system_service/src/main/java/com/doumee/biz/system/impl/SystemMenuBizImpl.java
@@ -126,6 +126,7 @@
                nodeVO.setIndex("menu_" + menu.getId());
                nodeVO.setLabel(menu.getName());
                nodeVO.setUrl(menu.getPath());
                nodeVO.setParams(menu.getParams());
                nodeVO.setIcon(menu.getIcon());
                nodeVO.setChildren(new ArrayList<>());
                rootNodes.add(nodeVO);
@@ -210,6 +211,7 @@
                child.setId(menu.getId());
                child.setLabel(menu.getName());
                child.setUrl(menu.getPath());
                child.setParams(menu.getParams());
                child.setIcon(menu.getIcon());
                child.setIndex("menu_" + menu.getId());
                child.setChildren(new ArrayList<>());
server/system_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -25,6 +25,7 @@
public class Constants {
    public static final String HEADER_USER_TOKEN = "dm_user_token";
    public static final String REDIS_TOKEN_KEY = "token_";
    public static final String REDIS_HK_TOKEN_KEY = "hk_token_";
    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 ;
    public static final int ONE = 1 ;
@@ -102,7 +103,7 @@
    public static final String HIDDEN_DANGER_FILE = "HIDDEN_DANGER_FILE";
    public static final String LOG_DEL_DAYS_LIMIT ="LOG_DEL_DAYS_LIMIT" ;
    public static final String HK_LOG_DEL_DAYS_LIMIT ="HK_LOG_DEL_DAYS_LIMIT" ;
    public static final String HK_NGINX_URL = "HK_NGINX_URL";
    public static  boolean DEALING_HK_SYNCPRIVILEGE= false;
    public static  boolean DEALING_HK_SYNCDEVICE = false;
    public static  boolean DEALING_HK_SYNCDEVICE_STATUS = false;
server/system_service/src/main/java/com/doumee/dao/system/model/SystemMenu.java
@@ -70,5 +70,7 @@
    @ApiModelProperty(value = "是否已删除", hidden = true)
    private Boolean deleted;
    @ApiModelProperty(value = "参数" )
    private String params;
}
server/system_service/src/main/java/com/doumee/dao/system/vo/SystemMenuListVO.java
@@ -27,4 +27,6 @@
    @ApiModelProperty(value = "更新人信息")
    private SystemUser updateUserInfo;
    @ApiModelProperty(value = "参数" )
    private String params;
}
server/system_service/src/main/java/com/doumee/dao/system/vo/SystemMenuNodeVO.java
@@ -32,4 +32,6 @@
    @ApiModelProperty(value = "子菜单")
    private List<SystemMenuNodeVO> children;
    @ApiModelProperty(value = "参数" )
    private String params;
}
server/system_service/src/main/resources/mappers/SystemMenuMapper.xml
@@ -16,7 +16,7 @@
  </resultMap>
  <select id="selectManageList" resultMap="SystemMenuListVO">
    SELECT
      menu.`ID`, menu.`PARENT_ID`, menu.`NAME`, menu.`PATH`, menu.`FIXED`, menu.`REMARK`, menu.`DISABLED`, menu.SORT, menu.`ICON`, menu.`CREATE_TIME`, menu.`UPDATE_TIME`, menu.`CREATE_USER`, menu.`UPDATE_USER`, menu.`DELETED`,
      menu.`ID`, menu.`PARENT_ID`,menu.params, menu.`NAME`, menu.`PATH`, menu.`FIXED`, menu.`REMARK`, menu.`DISABLED`, menu.SORT, menu.`ICON`, menu.`CREATE_TIME`, menu.`UPDATE_TIME`, menu.`CREATE_USER`, menu.`UPDATE_USER`, menu.`DELETED`,
      create_user.ID CREATE_USER_ID, create_user.`USERNAME` CREATE_USER_NAME,
      update_user.ID UPDETE_USER_ID, update_user.`USERNAME` UPDATE_USER_NAME
    FROM SYSTEM_MENU menu
@@ -31,7 +31,7 @@
  <!-- æŸ¥è¯¢èœå•æ ‘ -->
  <select id="selectByUserId" parameterType="java.lang.Integer" resultType="com.doumee.dao.system.model.SystemMenu">
    SELECT
      DISTINCT menu.`ID`, menu.`PARENT_ID`, menu.`NAME`, menu.`PATH`, menu.`REMARK`, menu.`DISABLED`, menu.SORT, menu.`ICON`, menu.`CREATE_TIME`, menu.`UPDATE_TIME`, menu.`CREATE_USER`, menu.`UPDATE_USER`, menu.`DELETED`
      DISTINCT menu.`ID`, menu.`PARENT_ID`,menu.params, menu.`NAME`, menu.`PATH`, menu.`REMARK`, menu.`DISABLED`, menu.SORT, menu.`ICON`, menu.`CREATE_TIME`, menu.`UPDATE_TIME`, menu.`CREATE_USER`, menu.`UPDATE_USER`, menu.`DELETED`
    FROM `SYSTEM_MENU` menu
    INNER JOIN SYSTEM_ROLE_MENU role_menu ON role_menu.MENU_ID = menu.ID AND role_menu.DELETED = 0
    INNER JOIN SYSTEM_USER_ROLE user_role ON user_role.ROLE_ID = role_menu.ROLE_ID AND user_role.DELETED = 0
@@ -46,7 +46,7 @@
  <!-- æ ¹æ®è§’色ID查询菜单列表 -->
  <select id="selectByRoleId" parameterType="java.lang.Integer" resultType="com.doumee.dao.system.model.SystemMenu">
    SELECT
      menu.`ID`, menu.`PARENT_ID`, menu.`NAME`, menu.`PATH`, menu.`REMARK`, menu.`DISABLED`, menu.SORT, menu.`ICON`, menu.`CREATE_TIME`, menu.`UPDATE_TIME`, menu.`CREATE_USER`, menu.`UPDATE_USER`, menu.`DELETED`
      menu.`ID`, menu.`PARENT_ID`, menu.`NAME`,menu.params, menu.`PATH`, menu.`REMARK`, menu.`DISABLED`, menu.SORT, menu.`ICON`, menu.`CREATE_TIME`, menu.`UPDATE_TIME`, menu.`CREATE_USER`, menu.`UPDATE_USER`, menu.`DELETED`
    FROM `SYSTEM_MENU` menu
    INNER JOIN `SYSTEM_ROLE_MENU` role_menu ON role_menu.MENU_ID = menu.ID AND role_menu.DELETED = 0
    <where>
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/HkSyncCloudController.java
@@ -3,19 +3,13 @@
import com.doumee.api.BaseController;
import com.doumee.config.annotation.CloudRequiredPermission;
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.haikang.model.param.request.AcsDeviceListRequest;
import com.doumee.core.haikang.model.param.request.EventSubRequest;
import com.doumee.core.haikang.model.param.request.ParkListRequest;
import com.doumee.core.haikang.model.param.request.PrivilegeGroupRequest;
import com.doumee.core.haikang.model.param.request.*;
import com.doumee.core.haikang.model.param.request.event.acs.EventAcsRequest;
import com.doumee.core.haikang.model.param.request.event.parks.EventParkRequest;
import com.doumee.core.haikang.model.param.request.event.visit.EventVisitRequest;
import com.doumee.core.model.ApiResponse;
import com.doumee.core.utils.Constants;
import com.doumee.service.business.impl.hksync.HkSyncDeviceServiceImpl;
import com.doumee.service.business.impl.hksync.HkSyncParkServiceImpl;
import com.doumee.service.business.impl.hksync.HkSyncPrivilegeServiceImpl;
import com.doumee.service.business.impl.hksync.HkSyncPushServiceImpl;
import com.doumee.service.business.impl.hksync.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
@@ -40,6 +34,8 @@
    private HkSyncPrivilegeServiceImpl hkSyncPrivilegeService;
    @Autowired
    private HkSyncPushServiceImpl hkSyncPushService;
    @Autowired
    private HkSyncLoginAuthServiceImpl hkSyncLoginAuthService;
    @PreventRepeat
    @ApiOperation("【海康】全量同步门禁设备接口")
@@ -50,6 +46,14 @@
        return ApiResponse.success(result);
    }
    @PreventRepeat
    @ApiOperation("【海康】获取组件授权登录地址接口")
    @PostMapping("/getServiceUrl")
    public ApiResponse getServiceUrl(@RequestBody HKGetServiceLoginUrlRequest param,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
        param.setUsername(this.getLoginUser(token).getUsername());
        String result = hkSyncLoginAuthService.getServiceUrl(param);
        return ApiResponse.success(result);
    }
    @PreventRepeat
    @ApiOperation("【海康】全量同步停车库接口")
    @PostMapping("/syncParks")
    @CloudRequiredPermission("business:hksync:park")
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKConstants.java
@@ -88,6 +88,9 @@
        String facePictureCheck= "/api/frs/v1/face/picture/check";//人脸评分
        String acsDeviceStatus= "/api/nms/v1/online/acs_device/get";//获取门禁设备在线状态
        String tempCarInRecords= "/api/pms/v1/tempCarInRecords/page";//查询场内车停车信息
        String applyCTGT= "/api/lsm/ssoService/v1/applyCTGT";//根据用户标识获取客户端TGC接口
        String applyST= "/api/lsm/ssoService/v1/applyST";//根据登录标识TGC申请登录凭证ST接口
        String tokenLoginUrl= "/lsm/ssoService/v1/tokenLogin?token=${st}&service=${service}";//组件授权登录拼接地址
    }
    /**
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java
@@ -593,4 +593,21 @@
        return startDoPostStringArtemis(HKConstants.InterfacePath.tempCarInRecords,body);
    }
    /**
     * æ ¹æ®ç”¨æˆ·æ ‡è¯†èŽ·å–å®¢æˆ·ç«¯TGC接口
     * @param body
     * @return
     */
    public static String applyCTGT(String body) {
        return startDoPostStringArtemis(HKConstants.InterfacePath.applyCTGT,body);
    }
    /**
     * æ ¹æ®ç™»å½•标识TGC申请登录凭证ST接口
     * @param body
     * @return
     */
    public static String applyST(String body) {
        return startDoPostStringArtemis(HKConstants.InterfacePath.applyST,body);
    }
}
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/ApplyCTGTRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
package com.doumee.core.haikang.model.param.request;
import lombok.Data;
@Data
public class ApplyCTGTRequest {
    private String loginType;//    string    False    ç™»å½•类型
    private String userCode;//    string    False登录用户名
    private String language;//    string    False    è¯­è¨€æ ‡è¯†
}
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/ApplySTequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.doumee.core.haikang.model.param.request;
import lombok.Data;
@Data
public class ApplySTequest {
    private String ctgt;//    string    ctgt凭证
    private String service;//    string    æœåŠ¡åœ°å€
}
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/HKGetServiceLoginUrlRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.doumee.core.haikang.model.param.request;
import lombok.Data;
@Data
public class HKGetServiceLoginUrlRequest {
   private String   label; //获取地址字典label
   private String username; //获取地址字典label
}
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/ApplyCTGTResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.doumee.core.haikang.model.param.respose;
import lombok.Data;
@Data
public class ApplyCTGTResponse {
private String   CTGT    ;//string    False
}
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/ApplySTResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.doumee.core.haikang.model.param.respose;
import lombok.Data;
@Data
public class ApplySTResponse {
private String   ST    ;//string    ST凭证
}
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java
@@ -1035,6 +1035,42 @@
        }
        return  null;
    }
    /**
     *根据用户标识获取客户端TGC接口
     * @return
     */
    public  static  BaseResponse<ApplyCTGTResponse>   applyCTGT(ApplyCTGTRequest param){
        log.info("【海康根据用户标识获取客户端TGC接口】================开始===="+JSONObject.toJSONString(param));
        try {
            String res = HKTools.applyCTGT(JSONObject.toJSONString(param));
            TypeReference typeReference =
                    new TypeReference< BaseResponse<ApplyCTGTResponse>>(){};
            BaseResponse<ApplyCTGTResponse>   result = JSONObject.parseObject(res, typeReference.getType());
            logResult(result,"海康根据用户标识获取客户端TGC接口");
            return  result;
        }catch (Exception e){
            log.error("【海康根据用户标识获取客户端TGC接口息】================失败====:\n"+ e.getMessage());
        }
        return  null;
    }
    /**
     *根据登录标识TGC申请登录凭证ST接口
     * @return
     */
    public  static  BaseResponse<ApplySTResponse>   applyST(ApplySTequest param){
        log.info("【海康根据登录标识TGC申请登录凭证ST接口】================开始===="+JSONObject.toJSONString(param));
        try {
            String res = HKTools.applyST(JSONObject.toJSONString(param));
            TypeReference typeReference =
                    new TypeReference< BaseResponse<ApplySTResponse>>(){};
            BaseResponse<ApplySTResponse>   result = JSONObject.parseObject(res, typeReference.getType());
            logResult(result,"海康根据登录标识TGC申请登录凭证ST接口口");
            return  result;
        }catch (Exception e){
            log.error("【海康根据登录标识TGC申请登录凭证ST接口息】================失败====:\n"+ e.getMessage());
        }
        return  null;
    }
    private static void logResult(BaseResponse res,String name) {
        if(StringUtils.equals(res.getCode(),HKConstants.RESPONSE_SUCCEE)){
            log.info("【"+name+"】================成功====\n"+res);
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/ext/HkSyncService.java
@@ -1,9 +1,6 @@
package com.doumee.service.business.ext;
import com.doumee.core.haikang.model.param.request.AcsDeviceListRequest;
import com.doumee.core.haikang.model.param.request.DoorsListRequest;
import com.doumee.core.haikang.model.param.request.ParkListRequest;
import com.doumee.core.haikang.model.param.request.PrivilegeGroupRequest;
import com.doumee.core.haikang.model.param.request.*;
import com.doumee.core.haikang.model.param.request.event.acs.EventAcsRequest;
import com.doumee.core.haikang.model.param.request.event.parks.EventParkRequest;
import com.doumee.core.haikang.model.param.request.event.visit.EventVisitRequest;
@@ -83,4 +80,5 @@
    void syncMemberFailData();
    void syncMemberDelData();
    String getServiceUrl(HKGetServiceLoginUrlRequest param);
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncBaseServiceImpl.java
@@ -42,6 +42,11 @@
    }
    @Override
//    @Async
    public   String getServiceUrl(HKGetServiceLoginUrlRequest param){
        return null;
    }
    @Override
//    @Async
    public  void syncParkRecords(Date date){
    }
    @Override
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncLoginAuthServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,96 @@
package com.doumee.service.business.impl.hksync;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.haikang.model.HKConstants;
import com.doumee.core.haikang.model.param.BaseListPageResponse;
import com.doumee.core.haikang.model.param.BaseResponse;
import com.doumee.core.haikang.model.param.request.*;
import com.doumee.core.haikang.model.param.respose.*;
import com.doumee.core.haikang.service.HKService;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.dao.business.DeviceMapper;
import com.doumee.dao.business.model.Device;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
 * è®¾å¤‡ä¿¡æ¯è¡¨Service实现
 * @author æ±Ÿè¹„蹄
 * @date 2023/11/30 15:33
 */
@Service
public class HkSyncLoginAuthServiceImpl extends HkSyncBaseServiceImpl {
    @Autowired
    private DeviceMapper deviceMapper;
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    /**
     * åŒæ­¥æµ·åº·é—¨ç¦è®¾å¤‡æ•°æ®
     * @param param
     * @return
     */
    @Override
    public   String getServiceUrl(HKGetServiceLoginUrlRequest param){
        if(StringUtils.isBlank(param.getLabel())||StringUtils.isBlank(param.getUsername())){
            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,登录组件失败,请稍后重试!");
        }
        //优先从缓存取数据,如果有缓存,直接返回缓存地址
        /*String cacheUrl = (String) redisTemplate.opsForValue().get(Constants.REDIS_HK_TOKEN_KEY+param.getUsername()+param.getLabel());
        if(StringUtils.isNotBlank(cacheUrl)){
            return cacheUrl;
        }*/
        String url = systemDictDataBiz.queryByCode(Constants.HK_PARAM,param.getLabel()).getCode();
        if(StringUtils.isBlank(url)){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        ApplyCTGTRequest ctgtParam = new ApplyCTGTRequest();
        ctgtParam.setLanguage("zh_CN");
        ctgtParam.setUserCode(param.getUsername());
        ctgtParam.setLoginType("2");
        BaseResponse<ApplyCTGTResponse> response = HKService.applyCTGT(ctgtParam);
        if(response !=null && StringUtils.equals(response.getCode(),HKConstants.RESPONSE_SUCCEE) &&response.getData()!=null &&StringUtils.isNotBlank(response.getData().getCTGT())){
            //处理新增成功的数据,修改海康同步状态
            String ctgt = response.getData().getCTGT();
            ApplySTequest stParam = new ApplySTequest();
            stParam.setCtgt(ctgt);
            stParam.setService(url);
            BaseResponse<ApplySTResponse> result = HKService.applyST(stParam);
            if(result !=null && StringUtils.equals(result.getCode(),HKConstants.RESPONSE_SUCCEE)
                    &&result.getData()!=null &&StringUtils.isNotBlank(result.getData().getST())){
                //处理新增成功的数据,修改海康同步状态
                String st = result.getData().getST();
                try {
                    String serviceUrl =   systemDictDataBiz.queryByCode(Constants.HK_PARAM,Constants.HK_NGINX_URL).getCode()
                            +(HKConstants.InterfacePath.tokenLoginUrl.replace("${st}", st).replace("${service}", URLEncoder.encode(url, "UTF-8")));
//                    redisTemplate.opsForValue().set(Constants.REDIS_HK_TOKEN_KEY+param.getUsername()+param.getLabel(),serviceUrl,1, TimeUnit.HOURS);
                    return serviceUrl;
                }catch (Exception e){
                    throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"对不起,登录组件失败,请稍后重试!");
                }
            }else{
                throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"对不起,登录组件失败,请稍后重试!");
            }
        }else{
            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"对不起,登录组件失败,请稍后重试!");
        }
    }
}