liukangdong
2024-12-06 1a3a322d6f55d0f812001984d41010524cda69e0
Merge branch 'master' of http://139.186.142.91:10010/r/productDev/dmvisit
已添加24个文件
已修改80个文件
3976 ■■■■ 文件已修改
admin/src/api/business/areas.js 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/workbench/index.js 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaAreasWindow.vue 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/areas.vue 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/index.vue 195 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/task/index.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/README.md 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/meeting/meeting_admin/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/meeting/meeting_service/src/main/java/com/doumee/core/wx/SendWxMessage.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/meeting/meeting_service/src/main/java/com/doumee/core/wx/WxPlatNotice.java 166 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/meeting/meeting_service/src/main/java/com/doumee/dao/business/model/UserRel.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/meeting/meeting_service/src/main/java/com/doumee/service/business/UtilService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/meeting/meeting_service/src/main/java/com/doumee/service/business/impl/BookingsServiceImpl.java 71 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_gateway/src/main/java/com/doumee/api/gateway/JwtAuthController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_gateway/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_gateway/src/main/resources/bootstrap-pro.yml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_gateway/src/main/resources/bootstrap.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_gateway/src/main/resources/logback-spring.xml 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/api/cloud/SystemDictDataCloudController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/biz/system/SystemDictDataBiz.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/biz/system/impl/SystemDictDataBizImpl.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/Constants.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/DateUtil.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/dao/system/dto/LoginDTO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/dao/system/model/Notices.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_timer/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/admin_timer/src/main/java/com/doumee/api/HkNoticeTimerController.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/admin_timer/src/main/java/com/doumee/api/WxTokenTimerController.java 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/admin_timer/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/HkSyncCloudController.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/PlatformJobCloudController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/StagingCloudController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/WmsPushCloudController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/board/EnergyController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/board/FightingAdminController.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/board/PlatformJobRunActController.java 150 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/board/PlatformJobRunController.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/board/SecurityController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/VisitorWebController.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_screen/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/ErpTool.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/ApproveNoticeRequest.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKConstants.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/cars/BaseCarsPageResponse.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/cars/BaseCarsResponse.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/cars/request/CarsDeviceRequest.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/cars/request/CarsGpsRequest.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/cars/response/CarsDeviceChannelResponse.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/cars/response/CarsDeviceDetaisResponse.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/cars/response/CarsDeviceResponse.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/cars/response/CarsGpsResponse.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/GetTodoListRequest.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/GetTodoListResponse.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKCarOpenService.java 236 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/wms/model/request/WmsBaseRequest.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/wms/model/response/WmsBaseResponse.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/wms/model/response/WmsInventoryJsonResponse.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/wx/wxPlat/WxPlatConfig.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/wx/wxPlat/WxPlatConstants.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/wx/wxPlat/WxPlatNotice.java 643 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/PlatformLogMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/PlatformWmsJobMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformJob.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformWmsDetail.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformWmsJob.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/CarsJobAndContractDTO.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/ErpVisitDTO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/platformReport/AlarmEventDataVO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/platformReport/BoardCarsListVO.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/platformReport/BoardJobCenterDataVO.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/platformReport/BoardStockListVO.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/platformReport/CarmeraListVO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/platformReport/CarsContractVO.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/platformReport/CarsJobAndContractVO.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/platformReport/PlatformJobRunBoardNewVO.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/platformReport/RegionTreeVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/platformReport/TransportMeasureVO.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/DeviceService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/ext/ERPSyncService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/ext/HkSyncService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/ApproveServiceImpl.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CarUseBookServiceImpl.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceServiceImpl.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/HiddenDangerServiceImpl.java 54 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/InitServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformBooksServiceImpl.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformJobServiceImpl.java 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/erp/ErpSyncServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | 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/HkSyncDoorsServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncInitConfigServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncNoticeServiceImpl.java 163 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncVisitServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/thrid/BoardServiceImpl.java 468 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/thrid/WmsServiceImpl.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/third/BoardService.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/third/WmsService.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/openapi/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/areas.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
import request from '../../utils/request'
// æŸ¥è¯¢
export function fetchList (data) {
  // return request.post('/visitsAdmin/cloudService/business/areas/treeList', data, {
  //   trim: true
  // })
  return request.post('/visitsAdmin/cloudService/business/areas/page', data, {
    trim: true
  })
}
export function listByParentId (data) {
  return request.post('/visitsAdmin/cloudService/business/areas/listByParentId', data)
}
// åˆ›å»º
export function create (data) {
  return request.post('/visitsAdmin/cloudService/business/areas/create', data)
}
// ä¿®æ”¹
export function updateById (data) {
  return request.post('/visitsAdmin/cloudService/business/areas/updateById', data)
}
// æ ‘å½¢
export function treeList (data) {
  return request.post('/visitsAdmin/cloudService/business/areas/listByParentId', data)
}
// åˆ é™¤
export function deleteById (id) {
  return request.get(`/visitsAdmin/cloudService/business/areas/delete/${id}`)
}
// æ‰¹é‡åˆ é™¤
export function deleteByIdInBatch (ids) {
  return request.get('/visitsAdmin/cloudService/business/areas/delete/batch', {
    params: {
      ids
    }
  })
}
admin/src/api/workbench/index.js
@@ -2,7 +2,7 @@
// é¡¶éƒ¨å¯¼èˆª
export function getAppHeaderNav (data) {
  return request.get('/visitsAdmin/cloudService/business/hksync/getHkMenuLink?type='+ data)
  return request.post('/visitsAdmin/cloudService/business/hksync/getHkMenuLink/'+data+'?time='+Math.random())
}
// ä¸»ä½“数据
export function getWorkbenchBody (data) {
@@ -24,9 +24,13 @@
export function getWorkbenchTaskHead (data) {
  return request.post('/visitsAdmin/cloudService/business/staging/taskCenterHeadPC', data)
}
// åŒæ­¥æµ·åº·ä»£åŠžæ•°æ®
export function syncHkNotice (data) {
  return request.post('/visitsAdmin/cloudService/business/hksync/notice/getList', data)
}
// pc工作台
export function getWorkbenchData (data) {
  return request.get('/visitsAdmin/cloudService/business/staging/pCWorkPlatformData', {
    params: {...data  }
  })
}
}
admin/src/components/business/OperaAreasWindow.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,94 @@
<template>
  <GlobalAlertWindow
    :title="title"
    :visible.sync="visible"
    :confirm-working="isWorking"
    @confirm="confirm"
  >
    <el-form :model="form" ref="form" label-width="100px" label-suffix=":" :rules="rules">
      <el-form-item :label="form.type==0?'市名称':'县区名称'" prop="name">
        <el-input v-model="form.name" :placeholder="form.type==0?'输入市名称':'输入县区名称'" v-trim/>
      </el-form-item>
      <el-form-item label="排序码" prop="sortnum">
        <el-input v-model="form.sortnum" placeholder="请输入排序码" v-trim/>
      </el-form-item>
    </el-form>
  </GlobalAlertWindow>
</template>
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalAlertWindow from '@/components/common/GlobalAlertWindow'
export default {
  name: 'OperaAreasWindow',
  extends: BaseOpera,
  components: { GlobalAlertWindow },
  data () {
    return {
      // è¡¨å•数据
      form: {
        id: null,
        parentId: null,
        name: null,
        sortnum: '0',
        type: '',
      },
      // éªŒè¯è§„则
      rules: {
      }
    }
  },
  created () {
    this.config({
      api: '/business/areas',
      'field.id': 'id'
    })
  },
  methods: {
    // ç¡®è®¤æ–°å»º
    __confirmCreate () {
      this.$refs.form.validate((valid) => {
        if (!valid) {
          return
        }
        // è°ƒç”¨æ–°å»ºæŽ¥å£
        this.isWorking = true
        this.api.create(this.form)
          .then(() => {
            this.visible = false
            this.$message.success('新建成功')
            this.$emit('success', this.form.parentId)
          })
          .catch(e => {
            this.$message.error(e)
          })
          .finally(() => {
            this.isWorking = false
          })
      })
    },
    // ç¡®è®¤ä¿®æ”¹
    __confirmEdit () {
      this.$refs.form.validate((valid) => {
        if (!valid) {
          return
        }
        // è°ƒç”¨æ–°å»ºæŽ¥å£
        this.isWorking = true
        this.api.updateById(this.form)
          .then(() => {
            this.visible = false
            this.$message.success('修改成功')
            this.$emit('success', this.form.parentId)
          })
          .catch(e => {
            this.$message.error(e)
          })
          .finally(() => {
            this.isWorking = false
          })
      })
    }
  },
}
</script>
admin/src/views/business/areas.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,160 @@
<template>
  <TableLayout :permissions="['business:areas:query']">
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <el-table
        ref="table"
        v-loading="isWorking.search"
        :data="tableData.list"
        lazy
        :load="load"
        :tree-props="{ children: 'childList', hasChildren: 'hasChildren' }"
        row-key="id"
        stripe
        border
        :header-row-class-name="'table-header'"
        class="doumee-element-table"
        @selection-change="handleSelectionChange"
      >
        <el-table-column prop="name" label="地区名称" min-width="100px"></el-table-column>
        <el-table-column prop="createDate" label="创建时间" align="center" min-width="140px"></el-table-column>
        <el-table-column prop="sortnum" label="排序码" align="center" min-width="140px"></el-table-column>
        <el-table-column
          v-if="containPermissions(['business:areas:update', 'business:areas:create', 'business:areas:delete'])"
          label="操作"
          align="center"
          min-width="220"
          fixed="right"
        >
          <template slot-scope="{ row }">
            <el-button type="text" @click="edit(row)" v-permissions="['business:areas:update']">编辑</el-button>
            <el-button v-if="row.type!=2" type="text" @click="createChild(row)" v-permissions="['business:areas:create']">新建{{ row.type==0 ? '市' : '区县' }}</el-button>
            <el-button type="text" @click="deleteById(row)" v-permissions="['business:areas:delete']">删除</el-button>
          </template>
        </el-table-column>
      </el-table>
    </template>
    <!-- æ–°å»º/修改 -->
    <OperaAreasWindow ref="operaAreasWindow" @success="update"/>
  </TableLayout>
</template>
<script>
import BaseTable from '@/components/base/BaseTable'
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaAreasWindow from '@/components/business/OperaAreasWindow'
import { listByParentId } from '@/api/business/areas'
export default {
  name: 'Areas',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaAreasWindow },
  data () {
    return {
      // æœç´¢
      searchForm: {
        type: 0,
        parentId: ''
      },
      treeMaps: new Map(),
      parentId: null
    }
  },
  created () {
    this.config({
      module: '省市区信息表',
      api: '/business/areas',
      'field.id': 'id',
      'field.main': 'id'
    })
    this.search()
  },
  methods: {
    // é¡µç å˜æ›´å¤„理
    handlePageChange (pageIndex) {
      this.isWorking.search = true
      listByParentId(this.searchForm)
        .then(data => {
          this.tableData.list = this.dataAddBool(data)
        })
        .catch(e => {
          this.$message.error(e)
        })
        .finally(() => {
          this.isWorking.search = false
        })
    },
    dataAddBool(array) {
      array.forEach(item => {
        item.hasChildren = item.type != 2
        // item.childList = item.childList && this.dataAddBool(item.childList)
      })
      return array
    },
    load(tree, treeNode, resolve) {
      this.treeMaps.set(tree.id, { tree, treeNode, resolve })
      listByParentId({ parentId: tree.id, type: tree.type + 1 })
        .then(data => {
          resolve(this.dataAddBool(data||[]))
        })
        .catch(e => {
          this.$message.error(e)
        })
        .finally(() => {
          this.isWorking.search = false
        })
    },
    refreshLoadTree(parentId) {
      if (this.treeMaps.get(parentId)) {
        const { tree, treeNode, resolve } = this.treeMaps.get(parentId)
        this.$set(this.$refs.table.store.states.lazyTreeNodeMap, parentId, [])
        if (tree) { // é‡æ–°æ‰§è¡Œçˆ¶èŠ‚ç‚¹åŠ è½½å­çº§æ“ä½œ
          this.load(tree, treeNode, resolve)
          if (tree.parentId) { // è‹¥å­˜åœ¨çˆ·çˆ·ç»“点,则执行爷爷节点加载子级操作,防止最后一个子节点被删除后父节点不显示删除按钮
            const a = this.treeMaps.get(tree.parentId)
            this.load(a.tree, a.treeNode, a.resolve)
          }
        }
      } else {
        this.handlePageChange()
      }
    },
    deleteById (row, childConfirm = true) {
      // let message = `确认删除${this.module}【${row[this.configData['field.main']]}】吗?`
      let message = `确认删除该记录吗?`
      if (childConfirm && row.childList != null && row.childList.length > 0) {
        // message = `确认删除${this.module}【${row[this.configData['field.main']]}】及其子${this.module}吗?`
        message = `确认删除该记录及其子数据吗?`
      }
      this.$dialog.deleteConfirm(message)
        .then(() => {
          this.isWorking.delete = true
          this.api.deleteById(row[this.configData['field.id']])
            .then(() => {
              this.$message.success('删除成功')
              this.refreshLoadTree(row.parentId)
            })
            .catch(e => {
              this.$message.error(e)
            })
            .finally(() => {
              this.isWorking.delete = false
            })
        })
        .catch(() => {})
    },
    edit(row) {
      // this.parentId = row.type==0 ? null : row.type==1 ? '编辑市' : '编辑区县'
      this.$refs.operaAreasWindow.open(row.type==0 ? '编辑省' : row.type==1 ? '编辑市' : '编辑区县', row)
    },
    createChild(row) {
      this.$refs.operaAreasWindow.open(row.type == 0 ? '新建市' : '新建县区', { parentId: row.id, name: '', type: row.type + 1 })
    },
    update(parentId) {
      this.refreshLoadTree(parentId)
    }
  }
}
</script>
admin/src/views/index.vue
@@ -133,7 +133,7 @@
        <div class="task">
          <div class="header df_sb">
            <div class="home_title df">
              <span @click="handleTest">待办事项</span>
              <span >待办事项</span>
              <span class="num" v-if="taskTotal">{{ taskTotal }}</span>
            </div>
            <div class="df_ac more" @click="jumpPage('/task/index')">
@@ -202,7 +202,7 @@
import { weeks } from '@/utils/config'
import {
  getWorkbenchData,
  getAppHeaderNav
  getAppHeaderNav, syncHkNotice
} from '@/api'
import { level } from '@/api/business/visits'
import TaskDetail from '@/views/task/visSubDetail.vue'
@@ -223,7 +223,7 @@
    OperaHiddenDangerWindow,
    OperaVisitsDesWindow
  },
  data() {
  data () {
    return {
      colors,
      nowDate: '',
@@ -244,122 +244,131 @@
      isShowDetail: false,
      isShowReport: false,
      isShowDanger: false,
      isShowDriver: false,
      isShowDriver: false
    }
  },
  computed: {
    userInfo() {
    userInfo () {
      return this.$store.state.userInfo
    }
  },
  created() {
  created () {
    this.updateDate()
    setInterval(() => {
      this.updateDate()
    }, 1000 * 60 * 60)
  },
  mounted() {
  mounted () {
    this.initData()
  },
  methods: {
    handleTest() {
      const myWindow = window.open('https://10.50.250.253/portal/ui/index?componentId=dfe&componentMenuId=process_apply')
      setTimeout(() => {
        const params = {
          componentId: 'dfe',
          componentMenuId: 'process_apply',
          callback: {
            method: 'dealTlncMsg', argument: {
              "msgId": "98c256b9-aaff-11ef-8347-fa163ee2c57c",
              "moduleId": "dfeFlowTodoModuleId",
              "msgTitle": "请及时处理13856591439发起的请假申请",
              "msgStatus": "0",
              "msgCreateTime": "今天 15:33",
              "msgCreateTimeIso": "2024-11-25T15:33:42.000+08:00",
              "serverTime": 1732531014591,
              "menuCode": "process_apply",
              "msgStatusStr": "待处理",
              "comId": "dfe",
              "userId": "13856591439",
              "extendNoShow": "{\"processInstanceId\":\"98a57fe0-aaff-11ef-8347-fa163ee2c57c\",\"processId\":\"process_dabcfdd39f1b6f46d36a9f4ff6ce1080\",\"param\":{\"sourceType\":\"todo\",\"modelCode\":\"tb_leave_dfe_for_dfe_runtime\",\"processNodeId\":\"UserTask_dde7d83377343a2d5fa1f60c23b023ef\",\"taskId\":\"98c256b9-aaff-11ef-8347-fa163ee2c57c\"},\"process.param.appId\":\"32ca8770-6f85-11ec-b5a3-991864da52a6\",\"appId\":\"32ca8770-6f85-11ec-b5a3-991864da52a6\",\"name\":\"请假申请\",\"taskId\":\"98c256b9-aaff-11ef-8347-fa163ee2c57c\",\"taskNodeId\":\"UserTask_dde7d83377343a2d5fa1f60c23b023ef\",\"url\":\"/dfe-form/process/tlnc/apply\"}",
              "targetComId": "dfe",
              "moduleName": "流程待办",
              "tid": "99cad778-aaff-11ef-9dbf-ff08ba71965c",
              "msgEndTime": null,
              "msgEndTimeIso": "",
              "picUrl": "",
              "extendJson": "{\"key1\":\"请及时处理陈鸿飞发起的请假申请\"}",
              "extendParam": null,
              "extendCascade": null,
              "createUser": "13856591439",
              "webCascadeUrl": null,
              "h5CascadeUrl": null,
              "cascadeTodoOpenType": null,
              "cascadeSourceConfigId": null,
              "h5Url": "/h5/pages/form-page/form-page?returnPath=-1&appId=32ca8770-6f85-11ec-b5a3-991864da52a6&taskId=98c256b9-aaff-11ef-8347-fa163ee2c57c&processNodeId=UserTask_dde7d83377343a2d5fa1f60c23b023ef&modelCode=tb_leave_dfe_for_dfe_runtime&type=flowHandle&component=form-apply&_sn=true",
              "segmentId": "dfe-form",
              "lastUsers": "陈鸿飞",
              "currentUsers": "陈鸿飞",
              "todoTypeCode": "dfe@@tlnc_placeholder_tlnc@@dfeFlowTodoModuleId",
              "currentUserIds": "13856591439",
              "lastUserIds": "13856591439",
              "msgDesc": null,
              "widgetUrl": null,
              "detailType": null,
              "widgetWidth": null,
              "widgetHeight": null,
              "userIdList": null,
              "statusName": null,
              "arriveTime": null,
              "stayTime": null,
              "todoType": null,
              "cascadePort": null,
              "openMode": null
            }
          },
          msgType: 'tlnc'
        }
        let argus = JSON.stringify(params)
        myWindow.postMessage('{"method":"goToApp","argument":' + argus + '}', '*')
      }, 3000)
    getNoticeList(){
      syncHkNotice().then(res => {
      })
    },
    SubSuccess(str) {
    handleTest (row) {
      getAppHeaderNav(5).then(res => {
        if (res == undefined || res == null) {
          return
        }
        const myWindow = window.open(res)
        setTimeout(() => {
          const params = {
            componentId: 'dfe',
            componentMenuId: 'process_apply',
            callback: {
              method: 'dealTlncMsg',
              argument: {
                msgId: '98c256b9-aaff-11ef-8347-fa163ee2c57c',
                moduleId: 'dfeFlowTodoModuleId',
                msgTitle: '请及时处理13856591439发起的请假申请',
                msgStatus: '0',
                msgCreateTime: '今天 15:33',
                msgCreateTimeIso: '2024-11-25T15:33:42.000+08:00',
                serverTime: 1732531014591,
                menuCode: 'process_apply',
                msgStatusStr: '待处理',
                comId: 'dfe',
                userId: '13856591439',
                extendNoShow: '{"processInstanceId":"98a57fe0-aaff-11ef-8347-fa163ee2c57c","processId":"process_dabcfdd39f1b6f46d36a9f4ff6ce1080","param":{"sourceType":"todo","modelCode":"tb_leave_dfe_for_dfe_runtime","processNodeId":"UserTask_dde7d83377343a2d5fa1f60c23b023ef","taskId":"98c256b9-aaff-11ef-8347-fa163ee2c57c"},"process.param.appId":"32ca8770-6f85-11ec-b5a3-991864da52a6","appId":"32ca8770-6f85-11ec-b5a3-991864da52a6","name":"请假申请","taskId":"98c256b9-aaff-11ef-8347-fa163ee2c57c","taskNodeId":"UserTask_dde7d83377343a2d5fa1f60c23b023ef","url":"/dfe-form/process/tlnc/apply"}',
                targetComId: 'dfe',
                moduleName: '流程待办',
                tid: '99cad778-aaff-11ef-9dbf-ff08ba71965c',
                msgEndTime: null,
                msgEndTimeIso: '',
                picUrl: '',
                extendJson: '{"key1":"请及时处理陈鸿飞发起的请假申请"}',
                extendParam: null,
                extendCascade: null,
                createUser: '13856591439',
                webCascadeUrl: null,
                h5CascadeUrl: null,
                cascadeTodoOpenType: null,
                cascadeSourceConfigId: null,
                h5Url: '/h5/pages/form-page/form-page?returnPath=-1&appId=32ca8770-6f85-11ec-b5a3-991864da52a6&taskId=98c256b9-aaff-11ef-8347-fa163ee2c57c&processNodeId=UserTask_dde7d83377343a2d5fa1f60c23b023ef&modelCode=tb_leave_dfe_for_dfe_runtime&type=flowHandle&component=form-apply&_sn=true',
                segmentId: 'dfe-form',
                lastUsers: '陈鸿飞',
                currentUsers: '陈鸿飞',
                todoTypeCode: 'dfe@@tlnc_placeholder_tlnc@@dfeFlowTodoModuleId',
                currentUserIds: '13856591439',
                lastUserIds: '13856591439',
                msgDesc: null,
                widgetUrl: null,
                detailType: null,
                widgetWidth: null,
                widgetHeight: null,
                userIdList: null,
                statusName: null,
                arriveTime: null,
                stayTime: null,
                todoType: null,
                cascadePort: null,
                openMode: null
              }
            },
            msgType: 'tlnc'
          }
          // const argus = JSON.stringify(params)
          myWindow.postMessage('{"method":"goToApp","argument":' + row.param5 + '}', '*')
        }, 3000)
      })
    },
    SubSuccess (str) {
      this[str] = false
      this.getTaskList()
    },
    funcClick(item) {
    funcClick (item) {
      if (item.name == '考勤工作台') {
        getAppHeaderNav(4).then(res => {
          window.open(res, "_blank")
          return
          window.open(res, '_blank')
        })
      }
      this.$router.push(item.path)
    },
    updateDate() {
    updateDate () {
      this.nowDate = dayjs().format('YYYYå¹´M月D日')
      this.nowWeek = weeks[new Date().getDay()]
    },
    initData() {
    initData () {
      this.getWorkHead()
      this.getWorkBody()
      this.getTaskList()
      this.getWarningList()
    },
    getWarningList() {
    getWarningList () {
      getWorkbenchData({ queryType: 4 }).then(res => {
        this.warningList = res.timeOutVisitList || []
        this.warningTotal = res.timeOutVisitNum || 0
      })
    },
    getTaskList() {
    getTaskList () {
      getWorkbenchData({ queryType: 3 }).then(res => {
        this.taskList = res.noticesList || []
        this.taskTotal = res.noticesNum || 0
      })
    },
    getWorkBody() {
    getWorkBody () {
      getWorkbenchData({ queryType: 2 }).then(res => {
        this.staticData = res || {}
        this.initEchart2()
@@ -367,10 +376,10 @@
        this.initEchart4()
      })
    },
    getWorkHead() {
    getWorkHead () {
      getWorkbenchData({ queryType: 1 }).then(res => {
        this.headerData = res || {}
        let arr = []
        const arr = []
        arr.push({ name: '访客', value: this.headerData.inParkVisitUserNum })
        arr.push({ name: '内部员工', value: this.headerData.todayInParkUserNum - this.headerData.inParkLwUserNum - this.headerData.inParkVisitUserNum })
        arr.push({ name: '长期相关方', value: this.headerData.inParkLwUserNum })
@@ -379,10 +388,10 @@
        this.initEchart1()
      })
    },
    jumpPage(page) {
    jumpPage (page) {
      this.$router.push(page)
    },
    departure(id) {
    departure (id) {
      this.$confirm('确定离厂吗, æ˜¯å¦ç»§ç»­?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
@@ -396,7 +405,11 @@
      })
    },
    handleDetail(row) {
    handleDetail (row) {
      if (row.type === 7) {
       this.handleTest(row);
        return
      }
      if (row.objType === 2) {
        this.$refs.OperaDetailsWindow.open('公务车申请详情', { ...row, id: row.objId })
        return
@@ -437,9 +450,9 @@
        })
      }
    },
    initEchart1() {
    initEchart1 () {
      const myChart = echarts.init(document.getElementById('echart1'))
      let that = this
      const that = this
      const option = {
        tooltip: {
@@ -471,9 +484,9 @@
        myChart.resize()
      })
    },
    initEchart2() {
    initEchart2 () {
      const myChart = echarts.init(document.getElementById('echart2'))
      let that = this
      const that = this
      myChart.setOption({
        grid: {
          top: '4%',
@@ -516,7 +529,7 @@
                    { offset: 0, color: '#56abf8' },
                    { offset: 1, color: '#407ff0' }
                  ]
                ),
                )
                // barBorderRadius: [0, 10, 10, 0]
              }
            }
@@ -527,9 +540,9 @@
        myChart.resize()
      })
    },
    initEchart3() {
    initEchart3 () {
      const myChart = echarts.init(document.getElementById('echart3'))
      let that = this
      const that = this
      myChart.setOption({
        tooltip: {
          trigger: 'axis',
@@ -627,9 +640,9 @@
        myChart.resize()
      })
    },
    initEchart4() {
    initEchart4 () {
      const myChart = echarts.init(document.getElementById('echart4'))
      let that = this
      const that = this
      myChart.setOption({
        tooltip: {
          trigger: 'axis',
admin/src/views/task/index.vue
@@ -109,6 +109,7 @@
import OperaVisitsDesWindow from '@/components/business/OperaVisitsDesWindow'
import dayjs from 'dayjs'
import {
  getAppHeaderNav,
  taskCenterHeadPC,
  taskCenterPage,
  taskSignRead
@@ -196,7 +197,22 @@
      this[str] = false
      this.getTaskList()
    },
    handleTest (row) {
      getAppHeaderNav(5).then(res => {
        if (res === undefined || res == null) {
          return
        }
        const myWindow = window.open(res)
        setTimeout(() => {
          myWindow.postMessage('{"method":"goToApp","argument":' + row.param5 + '}', '*')
        }, 3000)
      })
    },
    handleDetail (row) {
      if (row.type === 7) {
        this.handleTest(row);
        return
      }
      if (this.filters.queryType == 3) {
        taskSignRead({
          noticesId: row.id,
server/README.md
@@ -11,3 +11,10 @@
nohup java -Xms512m -Xmx512m -Xmn512m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=10018 -jar /usr/local/jars/dmvisit/openapi.jar >/usr/local/jars/dmvisit/web.log 2>/usr/local/jars/dmvisit/err.log &
重要:
1、关于外网访问限制 ï¼Œå¦‚果服务器重启了或者网卡重启,进行一下操作:
vim /etc/resolv.conf
nameserver æ”¹æˆ  nameserver 202.102.192.68
server/meeting/meeting_admin/src/main/resources/application.yml
@@ -34,7 +34,7 @@
cache:
  session:
    # ä¼šè¯è¿‡æœŸæ—¶é•¿(s)
    expire: 18000
    expire: 1800
  captcha:
    # éªŒè¯ç è¿‡æœŸæ—¶é•¿(s)
    expire: 300
server/meeting/meeting_service/src/main/java/com/doumee/core/wx/SendWxMessage.java
@@ -41,7 +41,8 @@
     */
    public  void  bookingsStart(SystemUser systemUser, Bookings bookings, Rooms rooms){
        RestTemplate restTemplate = new RestTemplate();
        String accessToken = systemDictDataBiz.queryCodeById(106);
        String accessToken = systemDictDataBiz.getWxAccessToken();
        log.info("微信小程序 ä¼šè®®å¼€å§‹è®¢é˜…消息发送日志 -> accessToken:{}",accessToken);
        //这里简单起见我们每次都获取最新的access_token(时间开发中,应该在access_token快过期时再重新获取)
        String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+accessToken;
@@ -67,6 +68,7 @@
        log.info("微信小程序-> å–消通知订阅消息发送日志:{}",JSONObject.toJSONString(responseEntity));
    }
    /**
     * ä¼šè®®å–消通知
     * @param systemUser ç”¨æˆ·
@@ -75,7 +77,7 @@
     */
    public  void  bookingsCancel(SystemUser systemUser, Bookings bookings, Rooms rooms){
        RestTemplate restTemplate = new RestTemplate();
        String accessToken = systemDictDataBiz.queryCodeById(106);
        String accessToken =systemDictDataBiz.getWxAccessToken() ;
        log.info("微信小程序 ä¼šè®®å¼€å§‹è®¢é˜…消息发送日志 -> accessToken:{}",accessToken);
        //这里简单起见我们每次都获取最新的access_token(时间开发中,应该在access_token快过期时再重新获取)
        String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+accessToken;
@@ -114,7 +116,7 @@
     */
    public void  bookingsReservation(SystemUser systemUser, Bookings bookings, Rooms rooms){
        RestTemplate restTemplate = new RestTemplate();
        String accessToken = systemDictDataBiz.queryCodeById(106);
        String accessToken = systemDictDataBiz.getWxAccessToken() ;
        log.info("微信小程序 ä¼šè®®å¼€å§‹è®¢é˜…消息发送日志 -> accessToken:{}",accessToken);
        //这里简单起见我们每次都获取最新的access_token(时间开发中,应该在access_token快过期时再重新获取)
server/meeting/meeting_service/src/main/java/com/doumee/core/wx/WxPlatNotice.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,166 @@
package com.doumee.core.wx;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.HttpsUtil;
import com.doumee.dao.business.model.Bookings;
import com.github.xiaoymin.knife4j.core.util.CollectionUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import java.util.*;
/**
 * å¾®ä¿¡å…¬ä¼—号通知
 *
 * @Author : Rk
 * @create 2023/12/27 9:19
 */
@Slf4j
@Component
public class WxPlatNotice {
    public void  testSendNotice(List<String> openIds,String token){
        if(CollectionUtils.isNotEmpty(openIds)){
            String postUrL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+token;
            //整体参数map
            Map<String, Object> paramMap = new HashMap<String, Object>();
            //消息主题显示相关map
            Map<String, Object> dataMap = new HashMap<String, Object>();
            Map<String, Object> const9 = new HashMap<String,Object>();
            const9.put("value","申请待您审批");
            Map<String, Object> thing1 = new HashMap<String,Object>();
            thing1.put("value", "测试名称");
            Map<String, Object> car_number7 = new HashMap<String,Object>();
            car_number7.put("value","皖AP12345");
            Map<String, Object> character_string6 = new HashMap<String,Object>();
            character_string6.put("value","1");
            Map<String, Object> thing4 = new HashMap<String,Object>();
            thing4.put("value","理由");
            dataMap.put("const9",const9);
            dataMap.put("thing1",thing1);
            dataMap.put("car_number7",car_number7);
            dataMap.put("character_string6",character_string6);
            dataMap.put("thing4",thing4);
            paramMap.put("data", dataMap);
            for (String openId:openIds) {
                paramMap.clear();
                paramMap.put("template_id", "SPwvgtASkm1aMDBsYhX2wHKdL2JBEGPknDkgniSza2Y");
                paramMap.put("touser", openId);
                paramMap.put("data", dataMap);
                String response = HttpsUtil.postJson(postUrL, JSONObject.toJSONString(paramMap));
                if(StringUtils.isBlank(response)){
                    log.warn("·==++--·推送微信模板信息:{}·--++==·", "失败");
                }else{
                    JSONObject json = JSONObject.parseObject(response);
                    log.warn("·==++--·推送微信模板信息:{}·--++==·", Constants.equalsInteger(json.getInteger("errcode"),Constants.ZERO)?"成功":"失败"+json.getString("errmsg"));
                }
            }
//            log.warn("·==++--·推送微信模板信息:{}·--++==·", msgId != null ? "成功" : "失败");
        }
    }
    /**
     * ä¼šè®®å®¤é¢„约通知
     * @param bookings
     * @param tempId CuoDoxOl6SFwi4NhNgOQgKSJVjDD4VCIaPYlnbv_zdY
     * @param token
     * @param openIds
     */
    public void  sendMeetingBookTemplateNotice(Bookings bookings,String tempId, String token, Set<String> openIds){
        if(CollectionUtils.isNotEmpty(openIds)){
            String postUrL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+token;
            //整体参数map
            Map<String, Object> paramMap = new HashMap<String, Object>();
            //消息主题显示相关map
            Map<String, Object> dataMap = new HashMap<String, Object>();
            //会议名称
            Map<String, Object> thing1 = new HashMap<String,Object>();
            thing1.put("value",bookings.getName());
            //会议时间
            Map<String, Object> time2 = new HashMap<String,Object>();
            time2.put("value", DateUtil.getDate(bookings.getStartTime(),"yyyy-MM-dd HH:mm:ss") );
            //会议地点
            Map<String, Object> thing3 = new HashMap<String,Object>();
            thing3.put("value",bookings.getRoomName());
            //发起人
            Map<String, Object> thing6 = new HashMap<String,Object>();
            thing6.put("value",bookings.getManagerInfo());
            dataMap.put("thing1",thing1);
            dataMap.put("time2",time2);
            dataMap.put("thing3",thing3);
            dataMap.put("thing6",thing6);
            paramMap.put("data", dataMap);
            for (String openId:openIds) {
                paramMap.clear();
                paramMap.put("template_id", tempId);
                paramMap.put("touser", openId);
                paramMap.put("data", dataMap);
                String response = HttpsUtil.postJson(postUrL, JSONObject.toJSONString(paramMap));
                if(StringUtils.isBlank(response)){
                    log.warn("·==++--·推送微信模板信息:{}·--++==·", "失败");
                }else{
                    JSONObject json = JSONObject.parseObject(response);
                    log.warn("·==++--·推送微信模板信息:{}·--++==·", Constants.equalsInteger(json.getInteger("errcode"),Constants.ZERO)?"成功":"失败"+json.getString("errmsg"));
                }
            }
        }
    }
    /**
     * ä¼šè®®å®¤å–消通知
     * @param bookings
     * @param tempId  CiB6vCT2InovAoQfudY-lvzLSV0-3lfz3a5GsSFCzd8
     * @param token
     * @param openIds
     */
    public void  sendMeetingBookCancelTemplateNotice(Bookings bookings,String tempId, String token, Set<String> openIds){
        if(CollectionUtils.isNotEmpty(openIds)){
            String postUrL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+token;
            //整体参数map
            Map<String, Object> paramMap = new HashMap<String, Object>();
            //消息主题显示相关map
            Map<String, Object> dataMap = new HashMap<String, Object>();
            //会议名称
            Map<String, Object> thing1 = new HashMap<String,Object>();
            thing1.put("value",bookings.getName());
            //会议时间
            Map<String, Object> time6 = new HashMap<String,Object>();
            time6.put("value", DateUtil.getDate(bookings.getStartTime(),"yyyy-MM-dd HH:mm:ss") );
            //会议地点
            Map<String, Object> thing2 = new HashMap<String,Object>();
            thing2.put("value",bookings.getRoomName());
            //预约人员
            Map<String, Object> thing4 = new HashMap<String,Object>();
            thing4.put("value",bookings.getManagerInfo());
            dataMap.put("thing1",thing1);
            dataMap.put("time6",time6);
            dataMap.put("thing2",thing2);
            dataMap.put("thing4",thing4);
            paramMap.put("data", dataMap);
            for (String openId:openIds) {
                paramMap.clear();
                paramMap.put("template_id", tempId);
                paramMap.put("touser", openId);
                paramMap.put("data", dataMap);
                String response = HttpsUtil.postJson(postUrL, JSONObject.toJSONString(paramMap));
                if(StringUtils.isBlank(response)){
                    log.warn("·==++--·推送微信模板信息:{}·--++==·", "失败");
                }else{
                    JSONObject json = JSONObject.parseObject(response);
                    log.warn("·==++--·推送微信模板信息:{}·--++==·", Constants.equalsInteger(json.getInteger("errcode"),Constants.ZERO)?"成功":"失败"+json.getString("errmsg"));
                }
            }
        }
    }
}
server/meeting/meeting_service/src/main/java/com/doumee/dao/business/model/UserRel.java
@@ -70,6 +70,9 @@
    @ApiModelProperty(value = "参会人员手机号")
    @TableField(exist = false)
    private String userPhone;
    @ApiModelProperty(value = "openid")
    @TableField(exist = false)
    private String openid;
server/meeting/meeting_service/src/main/java/com/doumee/service/business/UtilService.java
@@ -35,7 +35,7 @@
    public String generate(@RequestParam Integer bookingsId, @RequestParam Integer userId) {
        String accessToken =  systemDictDataBiz.queryCodeById(106);
        String accessToken = systemDictDataBiz.getWxAccessToken() ;
        //生成图片上传OSS
        Map<String,Object> body = new HashMap<>();
        // åœºæ™¯ç ï¼Œä¸Žå‰ç«¯çº¦å®šï¼Œæœ€ç»ˆæ˜¯éœ€è¦å‰ç«¯è§£æž
@@ -88,7 +88,7 @@
    }
    public InputStream generateImgStream(Integer bookingsId, Integer userId) {
        String accessToken =  systemDictDataBiz.queryCodeById(106);
        String accessToken = systemDictDataBiz.getWxAccessToken() ;
        log.info("微信小程序-> accessToken:{}",accessToken);
        //生成图片上传OSS
        Map<String,Object> body = new HashMap<>();
server/meeting/meeting_service/src/main/java/com/doumee/service/business/impl/BookingsServiceImpl.java
@@ -13,6 +13,7 @@
import com.doumee.core.utils.*;
import com.doumee.core.wx.MeetConstants;
import com.doumee.core.wx.SendWxMessage;
import com.doumee.core.wx.WxPlatNotice;
import com.doumee.dao.admin.request.BusinessOverDTO;
import com.doumee.dao.admin.request.QrOpenDoorDto;
import com.doumee.dao.admin.response.DevWgResponseParam;
@@ -152,8 +153,8 @@
        if(Constants.equalsInteger(bookings.getJoinNotice(),Constants.ZERO)){
            this.sendNotice(bookings, MeetConstants.TWO);
        }
        //发送微信订阅通知
//        sendWxMessage.bookingsReservation(systemUserMapper.selectById(bookings.getCreator()), bookings, roomsMapper.selectById(bookings.getRoomId()));
        SystemUser systemUser = systemUserMapper.selectById(bookings.getUserId());
        this.sendWxNotice(bookings,Objects.isNull(systemUser)||StringUtils.isBlank(systemUser.getOpenid())?null:systemUser.getOpenid(),Constants.ZERO);
        return bookings.getId();
    }
@@ -382,7 +383,11 @@
        updateProjectRel(bookings, user);
        handleFile(bookings, user);
        //发送会议通知
        this.sendNotice(bookings, MeetConstants.TWO);
        if(Constants.equalsInteger(bookings.getJoinNotice(),Constants.ZERO)){
            this.sendNotice(bookings, MeetConstants.TWO);
        }
        SystemUser systemUser = systemUserMapper.selectById(bookings.getUserId());
        this.sendWxNotice(bookings,Objects.isNull(systemUser)||StringUtils.isBlank(systemUser.getOpenid())?null:systemUser.getOpenid(),Constants.ZERO);
    }
    @Override
@@ -447,9 +452,11 @@
        bookings.setEditor(user.getId());
        bookingsMapper.updateById(bookings);
        //取消会议 å‘送取消通知
        this.sendNotice(bookings, 3);
        //发送微信订阅通知
        sendWxMessage.bookingsCancel(systemUserMapper.selectById(bookings.getCreator()), bookings, roomsMapper.selectById(bookings.getRoomId()));
        if(Constants.equalsInteger(bookings.getJoinNotice(),Constants.ZERO)){
            this.sendNotice(bookings, 3);
        }
        SystemUser systemUser = systemUserMapper.selectById(bookings.getUserId());
        this.sendWxNotice(bookings,Objects.isNull(systemUser)||StringUtils.isBlank(systemUser.getOpenid())?null:systemUser.getOpenid(),Constants.ONE);
    }
@@ -927,8 +934,10 @@
        String avatarPath = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode()
                +systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
        userResponseList.forEach(i -> {
            if(StringUtils.isNotBlank(i.getAvatar())){
            if(StringUtils.isNotBlank(i.getAvatar()) && !i.getAvatar().startsWith("HKIMG") ){
                i.setAvatar(avatarPath+i.getAvatar());
            }else{
                i.setAvatar(null);
            }
        });
        meetingDetailResponse.setUserResponseList(userResponseList);
@@ -1039,9 +1048,12 @@
        bookings.setEditor(businessOverDTO.getUserId());
        bookingsMapper.updateById(bookings);
        //取消会议 å‘送取消通知
        this.sendNotice(bookings, 3);
        //发送微信订阅通知
//        sendWxMessage.bookingsCancel(systemUserMapper.selectById(bookings.getCreator()), bookings, roomsMapper.selectById(bookings.getRoomId()));
        if(Constants.equalsInteger(bookings.getJoinNotice(),Constants.ZERO)){
            this.sendNotice(bookings, 3);
        }
        SystemUser systemUser = systemUserMapper.selectById(bookings.getUserId());
        this.sendWxNotice(bookings,Objects.isNull(systemUser)||StringUtils.isBlank(systemUser.getOpenid())?null:systemUser.getOpenid(),Constants.ONE);
    }
@@ -1289,6 +1301,7 @@
            bookings.setEditDate(new Date());
            bookingsMapper.updateById(bookings);
            this.sendNotice(bookings, MeetConstants.ONE);
            //发送微信通知
//            sendWxMessage.bookingsStart(systemUserMapper.selectById(bookings.getCreator()), bookings, roomsMapper.selectById(bookings.getRoomId()));
        }
@@ -1365,6 +1378,44 @@
    }
    @Async
    public void sendWxNotice(Bookings bookings,String openid, Integer sendType) {
        try{
            List<UserRel> userRelList = userRelMapper.selectJoinList(UserRel.class,new MPJLambdaWrapper<UserRel>()
                    .selectAll(UserRel.class)
                    .selectAs(SystemUser::getRealname,UserRel::getRealName)
                    .selectAs(SystemUser::getMobile,UserRel::getUserPhone)
                    .selectAs(SystemUser::getOpenid,UserRel::getOpenid)
                    .leftJoin(SystemUser.class,SystemUser::getId,UserRel::getUserId)
                    .eq(UserRel::getObjType, MeetConstants.ONE)
                    .eq(UserRel::getObjId, bookings.getId())
                    .eq(UserRel::getIsdeleted, MeetConstants.ZERO)
                    .isNotNull(SystemUser::getOpenid)
            );
            List<String> openIdList = userRelList.stream().map(i->i.getOpenid()).collect(Collectors.toList());
            if(StringUtils.isNotBlank(openid)){
                openIdList.add(openid);
            }
            Set<String> openIds = new HashSet<String>(openIdList);
            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(openIds)){
                WxPlatNotice wxPlatNotice = new WxPlatNotice();
                if(Constants.equalsInteger(sendType,Constants.ZERO)){
                    wxPlatNotice.sendMeetingBookTemplateNotice(bookings,"CuoDoxOl6SFwi4NhNgOQgKSJVjDD4VCIaPYlnbv_zdY",
                            systemDictDataBiz.queryByCode(Constants.WX_PLATFORM, Constants.WX_PLATFORM_ACCESS_TOKEN).getCode(),openIds);
                }else{
                    wxPlatNotice.sendMeetingBookCancelTemplateNotice(bookings,"CiB6vCT2InovAoQfudY-lvzLSV0-3lfz3a5GsSFCzd8",
                            systemDictDataBiz.queryByCode(Constants.WX_PLATFORM, Constants.WX_PLATFORM_ACCESS_TOKEN).getCode(),openIds);
                }
            }
        }catch (Exception e){
        }
    }
    @Override
    public List<Bookings> getMyJoinBookingMeet(Integer userId, Integer roomId, LocalDateTime startTime, LocalDateTime endTime) {
        DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
server/system_gateway/src/main/java/com/doumee/api/gateway/JwtAuthController.java
@@ -147,7 +147,6 @@
        }catch (Exception e){
            return ApiResponse.failed(ResponseStatus.SERVER_ERROR);
        }
    }
    /**
     * åˆ·æ–°JWT令牌,用旧的令牌换新的令牌
server/system_gateway/src/main/resources/application.yml
@@ -37,7 +37,7 @@
cache:
  session:
    # ä¼šè¯è¿‡æœŸæ—¶é•¿(s)
    expire: 18000
    expire: 1800
  captcha:
    # éªŒè¯ç è¿‡æœŸæ—¶é•¿(s)
    expire: 300
server/system_gateway/src/main/resources/bootstrap-pro.yml
@@ -90,5 +90,6 @@
      url: 1
      email: 1
    license:
      name: Apache 2.0
      url: https://www.apache.org/licenses/LICENSE-2.0.html
server/system_gateway/src/main/resources/bootstrap.yml
@@ -1,6 +1,6 @@
spring:
  profiles:
    active: dev
    active:
  application:
    name: system_gateway
  # å®‰å…¨é…ç½®
server/system_gateway/src/main/resources/logback-spring.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%highlight(%date{yyyy-MM-dd HH:mm:ss}) | %highlight(%-5level) | %highlight(%thread) | %highlight(%logger) | %msg%n</pattern>
        </layout>
    </appender>
    <property name="log.path" value="logs/system_gateway"></property>
    <property name="log.fileSize" value="100MB"></property>
    <property name="log.historyDays" value="7"></property>
    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <!--匹配就舍去-->
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--路径-->
            <fileNamePattern>${log.path}/info.%d.%i.log</fileNamePattern>
            <maxFileSize>${log.fileSize}</maxFileSize>
            <maxHistory>${log.historyDays}</maxHistory>
            <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>
    </appender>
    <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
        <!--滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--路径-->
            <fileNamePattern>${log.path}/error.%d.%i.log</fileNamePattern>
            <maxFileSize>${log.fileSize}</maxFileSize>
            <maxHistory>${log.historyDays}</maxHistory>
            <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>
    </appender>
    <!-- å¼‚步写入日志 -->
    <appender name ="ASYNC" class= "ch.qos.logback.classic.AsyncAppender">
        <!-- ä¸ä¸¢å¤±æ—¥å¿—.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold >0</discardingThreshold>
        <!-- æ›´æ”¹é»˜è®¤çš„队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>512</queueSize>
        <!-- æ·»åŠ é™„åŠ çš„appender,最多只能添加一个 -->
        <appender-ref ref ="fileInfoLog"/>
    </appender>
    <root level="info">
        <appender-ref ref="consoleLog"/>
        <appender-ref ref="fileInfoLog"/>
        <appender-ref ref="fileErrorLog"/>
    </root>
</configuration>
server/system_service/src/main/java/com/doumee/api/cloud/SystemDictDataCloudController.java
@@ -79,6 +79,7 @@
        systemDictData.setLoginUserInfo(this.getLoginUser(token));
        systemDictData.setUpdateUser(systemDictData.getLoginUserInfo().getId());
        systemDictDataBiz.updateById(systemDictData);
        systemDictDataBiz.refreshCache();
        return ApiResponse.success(null);
    }
server/system_service/src/main/java/com/doumee/biz/system/SystemDictDataBiz.java
@@ -36,4 +36,7 @@
  String getPreFixPath(String resourceCode, String targetCode);
    void refreshCache();
    String getWxAccessToken();
}
server/system_service/src/main/java/com/doumee/biz/system/impl/SystemDictDataBizImpl.java
@@ -11,14 +11,12 @@
import com.doumee.service.system.SystemDictService;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Optional;
@Service
public class SystemDictDataBizImpl implements SystemDictDataBiz {
@@ -139,6 +137,22 @@
    }
    @Override
    public void refreshCache() {
       /* HKCarOpenService.ACCESS_KEY= queryByCode(Constants.HK_PARAM, Constants.HK_CARS_OPENAPI_ACCESS_KEY).getCode();
        HKCarOpenService.BASE_URL= queryByCode(Constants.HK_PARAM, Constants.HK_CARS_OPENAPI_URL).getCode();
        HKCarOpenService.ACCESS_SECRET= queryByCode(Constants.HK_PARAM, Constants.HK_CARS_OPENAPI_ACCESS_SECRET).getCode();
        ArtemisConfig.host = queryByCode(Constants.HK_PARAM, Constants.HK_HOST).getCode();
        ArtemisConfig.appKey = queryByCode(Constants.HK_PARAM, Constants.HK_APPKEY).getCode();
        ArtemisConfig.appSecret = queryByCode(Constants.HK_PARAM, Constants.HK_APPSECRET).getCode();
        HKConstants.https = queryByCode(Constants.HK_PARAM, Constants.HK_HTTPS).getCode();*/
    }
    @Override
    public    String getWxAccessToken(){
        return  queryByCode(Constants.WX_PLATFORM, Constants.WX_PLATFORM_ACCESS_TOKEN).getCode();
    }
    @Override
    public String getPreFixPath(String resourceCode, String targetCode) {
        if (StringUtils.isBlank(resourceCode) || StringUtils.isBlank(targetCode)){
server/system_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -43,6 +43,9 @@
    public static final String HK_APPSECRET ="HK_APPSECRET" ;
    public static final String HK_HTTPS ="HK_HTTPS" ;
    public static final String HK_PUSH_URL = "HK_PUSH_URL";
    public static final String HK_CARS_OPENAPI_ACCESS_KEY = "HK_CARS_OPENAPI_ACCESS_KEY";
    public static final String HK_CARS_OPENAPI_ACCESS_SECRET = "HK_CARS_OPENAPI_ACCESS_SECRET";
    public static final String HK_CARS_OPENAPI_URL = "HK_CARS_OPENAPI_URL";
    public static final String HK_ROOTORG_CODE ="HK_ROOTORG_CODE" ;
    public static final String HK_ROOTORG_NAME ="HK_ROOTORG_NAME" ;
    public static final String PLATFORM ="PLATFORM" ;
@@ -141,6 +144,9 @@
    public static final String MYSQL_BACKUP_DIR ="MYSQL_BACKUP_DIR" ;
    public static final String EVENT_FILES_PRIVATE_DOMAIN ="EVENT_FILES_PRIVATE_DOMAIN" ;
    public static final String EVENT_FILES_PUBLIC_DOMAIN ="EVENT_FILES_PUBLIC_DOMAIN" ;
    public static final String HK_WXTOKEN_CONFIGID ="HK_WXTOKEN_CONFIGID" ;
    public static final String HK_WXTOKEN_TAGID ="HK_WXTOKEN_TAGID" ;
    public static final String WMS_TOTAL_STOCK_NUM ="WMS_TOTAL_STOCK_NUM" ;
    public static  boolean DEALING_HK_SYNCPRIVILEGE= false;
    public static  boolean DEALING_HK_SYNCDEVICE = false;
    public static  boolean DEALING_HK_SYNCPLATFORM = false;
@@ -153,6 +159,7 @@
    public static  boolean DEALING_HK_DEL_USER = false;
    public static  boolean DEALING_HK_VISIT = false;
    public static  boolean DEALING_HK_VISIT_EXPIRE = false;
    public static  boolean DEALING_HK_NOTICE_LIST = false;
    public static  boolean DEALING_FROM_HK_VISIT = false;
    public static  boolean DEALING_HK_EMPOWER = false;
    public static  boolean DEALING_HK_EMPOWER_DETAIL = false;
@@ -470,6 +477,14 @@
        d = d.setScale(4, BigDecimal.ROUND_HALF_UP);
        return  d;
    }
    public static BigDecimal formatBigdecimal0Float(BigDecimal d) {
        if (d == null) {
            d = new BigDecimal(0.0);
        }
        //保留两位小数且四舍五入
        d = d.setScale(0, BigDecimal.ROUND_HALF_UP);
        return  d;
    }
    public static BigDecimal formatBigdecimal2Float(BigDecimal d) {
        if (d == null) {
            d = new BigDecimal(0.0);
@@ -551,6 +566,7 @@
    int logisticsCarUse = 4;//物流车审批
    int system = 5;//系统消息
    int reason = 6;//入园原因
    int hknotice = 7;//海康考勤代办
}
server/system_service/src/main/java/com/doumee/core/utils/DateUtil.java
@@ -317,7 +317,6 @@
        }
    }
    /**
     * èŽ·å–X月份之前的月份数
     * @param currentDate
@@ -343,9 +342,31 @@
        }
        return list;
    }
    /**
     * èŽ·å–X月份之前的月份数
     * @param currentDate
     * @param month
     * @return
     */
    public static List<String> getDateListBeforMonth(Date currentDate , Integer month) {
        SimpleDateFormat sdfYear = new SimpleDateFormat("yyyy");
        SimpleDateFormat sdfMonth = new SimpleDateFormat("MM");
        int currentYear = Integer.parseInt(sdfYear.format(currentDate));
        int currentMonth = Integer.parseInt(sdfMonth.format(currentDate));
        List<String> list = new ArrayList<>();
        for (int i = 0; i < month; i++) {
            int tempYear = currentYear;
            int tempMonth = currentMonth - i;
            if (tempMonth <= 0) {
                tempYear--;
                tempMonth += 12;
            }
            list.add(tempYear +"-" + StringUtils.leftPad(Integer.toString(tempMonth),2,"0"));
        }
        return list;
    }
    public static List<String> getBeforDays(Date currentDate,Integer days){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
@@ -360,6 +381,21 @@
            startDate = calendar.getTime();
            list.add(DateUtil.dateToString(startDate,"yyyy-MM-dd"));
            System.out.println(DateUtil.dateToString(startDate,"yyyy-MM-dd"));
        }
        return list;
    }
    public static List<Date> getDateListBeforDays(Date currentDate,Integer days){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(currentDate);
        Date endDate = currentDate; // èŽ·å–å½“å‰æ—¥æœŸ
        calendar.add(Calendar.DAY_OF_YEAR, -days); // å¾€å‰æŽ¨7天
        Date startDate = calendar.getTime(); // èŽ·å–æŽ¨ç®—åŽçš„æ—¥æœŸ
        List<Date> list = new ArrayList<>();
        while (startDate.before(endDate)) {
            calendar.add(Calendar.DAY_OF_YEAR, 1); // èŽ·å–ä¸‹ä¸€å¤©æ—¥æœŸ
            startDate = calendar.getTime();
            list.add(startDate);
        }
        return list;
    }
@@ -442,7 +478,7 @@
     * @return String
     * @throws Exception
     */
    public static String getNowPlusTime() throws Exception {
    public static String getNowPlusTime()   {
        String nowDate = "";
        try {
            java.sql.Date date = null;
@@ -1636,6 +1672,49 @@
            return getNowShortDate().substring(0, 6) + "01";
        } catch (Exception e) {
            return "";
        }
    }
    public static  List<Date> getThisMonthDateList() {
        List<Date> dateList = new ArrayList<>();
        try {
            Calendar calendar = Calendar.getInstance();
            int daysInMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
            calendar.set(Calendar.HOUR,0);
            calendar.set(Calendar.MINUTE,0);
            calendar.set(Calendar.SECOND,0);
            calendar.set(Calendar.MILLISECOND,0);
            for (int i = 0; i < daysInMonth; i++) {
                calendar.set(Calendar.DAY_OF_MONTH,i+1);
                dateList.add(calendar.getTime());
            }
        } catch (Exception e) {
            return null;
        }
        return dateList;
    }
    public static  List<Date> getThisYearMonthList() {
        List<Date> dateList = new ArrayList<>();
        try {
            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.DAY_OF_MONTH,1);
            calendar.set(Calendar.HOUR,0);
            calendar.set(Calendar.MINUTE,0);
            calendar.set(Calendar.SECOND,0);
            calendar.set(Calendar.MILLISECOND,0);
            for (int i = 0; i < 12; i++) {
                calendar.set(Calendar.MONTH,i);
                dateList.add(calendar.getTime());
            }
        } catch (Exception e) {
            return null;
        }
        return dateList;
    }
    public static Date getFirstThisYearDate() {
        try {
            return sdfShort.parse( getNowShortDate().substring(0, 4) + "0101");
        } catch (Exception e) {
            return null;
        }
    }
    public static String getFirstDayCurrentMonth() {
@@ -2832,7 +2911,14 @@
//            System.out.println(DateUtil.afterMinutesDate(-5));
            DateUtil.getBeforDays(new Date(),7);
            List<Date> list =getThisMonthDateList();
            for(Date d :list){
                System.out.println(getPlusTime2(d));
            }
            List<Date> list1 =getThisYearMonthList();
            for(Date d :list1){
                System.out.println(getPlusTime2(d));
            }
//            Date startTime = DateUtil.StringToDate("2024-05-01 08:00:00" ,"yyyy-MM-dd HH:mm:ss");
//            Date endTime = DateUtil.StringToDate("2024-05-01 17:00:00" ,"yyyy-MM-dd HH:mm:ss");
@@ -3042,6 +3128,12 @@
        calendar.add(Calendar.MONTH, month);//
        return calendar.getTime();
    }
    public static Date addYearToDate(Date date, int year) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.YEAR, year);//
        return calendar.getTime();
    }
    public static String afterDateToStr(Integer days){
        Date date = new Date();
server/system_service/src/main/java/com/doumee/dao/system/dto/LoginDTO.java
@@ -19,6 +19,9 @@
    @ApiModelProperty(value = "用户名")
    private String username;
    @ApiModelProperty(value = "微信openId")
    private String openid;
    @NotBlank(message = "密码不能为空")
    @ApiModelProperty(value = "密码")
    private String password;
server/system_service/src/main/java/com/doumee/dao/system/model/Notices.java
@@ -79,8 +79,8 @@
    @ExcelColumn(name="关联对象名称")
    private String objName;
    @ApiModelProperty(value = "类型 0访客审批 1访客报备 2用车审批 3隐患处理 4物流车审批 5系统系统")
    @ExcelColumn(name="类型 0访客审批 1访客报备 2用车审批 3隐患处理 4物流车审批 5系统系统")
    @ApiModelProperty(value = "类型 0访客审批 1访客报备 2用车审批 3隐患处理 4物流车审批 5系统系统 6入园原因  7海康考勤代办")
    @ExcelColumn(name="类型 0访客审批 1访客报备 2用车审批 3隐患处理 4物流车审批 5系统系统  6入园原因 7海康考勤代办")
    private Integer type;
    @ApiModelProperty(value = "类型描述")
server/system_service/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java
@@ -1,6 +1,7 @@
package com.doumee.service.system.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.doumee.config.jwt.JwtTokenUtil;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.LoginUserInfo;
@@ -11,6 +12,7 @@
import com.doumee.dao.business.dao.SmsEmailMapper;
import com.doumee.dao.business.model.Company;
import com.doumee.dao.business.model.SmsEmail;
import com.doumee.dao.system.SystemUserMapper;
import com.doumee.dao.system.dto.LoginByOpenidDTO;
import com.doumee.dao.system.dto.LoginDTO;
import com.doumee.dao.system.dto.LoginPhoneDTO;
@@ -47,6 +49,8 @@
    @Lazy
    @Autowired
    private SystemUserService systemUserService;
    @Autowired
    private SystemUserMapper systemUserMapper;
    @Autowired
    private SmsEmailMapper smsEmailMapper;
@@ -83,7 +87,7 @@
        loginLog.setLoginTime(new Date());
        loginLog.setSystemVersion(systemVersion);
        loginLog.setIp(Utils.User_Client.getIP(request));
        loginLog.setLocation(Utils.Location.getLocationString(loginLog.getIp()));
//        loginLog.setLocation(Utils.Location.getLocationString(loginLog.getIp()));
        loginLog.setPlatform(Utils.User_Client.getPlatform(request));
        loginLog.setClientInfo(Utils.User_Client.getBrowser(request));
        loginLog.setOsInfo(Utils.User_Client.getOS(request));
@@ -124,7 +128,7 @@
        loginLog.setLoginUsername(dto.getUsername());
        loginLog.setLoginTime(new Date());
        loginLog.setSystemVersion(systemVersion);
        loginLog.setLocation(Utils.Location.getLocationString(loginLog.getIp()));
//        loginLog.setLocation(Utils.Location.getLocationString(loginLog.getIp()));
        if(request!=null&&request.getHeaders()!=null && request.getHeaders().size()>0){
            loginLog.setIp(Utils.User_Client.getIP(request));
            loginLog.setPlatform(Utils.User_Client.getPlatform(request));
@@ -132,7 +136,7 @@
            loginLog.setOsInfo(Utils.User_Client.getOS(request));
        }
        loginLog.setServerIp(Utils.Server.getIP());
        if(isDebug == null  || !isDebug  && dto.getCheckCode()){
//        if(isDebug == null  || !isDebug  && dto.getCheckCode()){
            // æ ¡éªŒéªŒè¯ç 
            try {
                captchaService.check(dto.getUuid(), dto.getCode());
@@ -143,7 +147,7 @@
                systemLoginLogService.create(loginLog);
                throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT.getCode(),"对不起,验证码不正确!");
            }
        }
//        }
        // æ ¹æ®ç”¨æˆ·åæŸ¥è¯¢ç”¨æˆ·å¯¹è±¡
        SystemUser queryDto = new SystemUser();
        queryDto.setUsername(dto.getUsername());
@@ -160,6 +164,7 @@
        if( !StringUtils.equals(pwd, user.getPassword())){
            throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT);
        }
        dealOpenIdBiz(user,dto.getOpenid());
        Company company = new Company();
        if(Objects.nonNull(user.getCompanyId())){
            company = companyMapper.selectById(user.getCompanyId());
@@ -177,8 +182,17 @@
        return  userInfo;
    }
    private void dealOpenIdBiz(SystemUser user, String openid) {
        if(StringUtils.isNotBlank(openid)){
            //如果openId不为空,绑定该用户openid
            systemUserMapper.update(null,new UpdateWrapper<SystemUser>().lambda()
                    .set(SystemUser::getOpenid,null)
                    .eq(SystemUser::getType,user.getType()));
            systemUserMapper.update(null,new UpdateWrapper<SystemUser>().lambda()
                    .set(SystemUser::getOpenid,openid)
                    .eq(SystemUser::getId,user.getId()));
        }
    }
    @Override
@@ -187,7 +201,7 @@
        loginLog.setLoginUsername(dto.getPhone());
        loginLog.setLoginTime(new Date());
        loginLog.setSystemVersion(systemVersion);
        loginLog.setLocation(Utils.Location.getLocationString(loginLog.getIp()));
//        loginLog.setLocation(Utils.Location.getLocationString(loginLog.getIp()));
        if(request!=null&&request.getHeaders()!=null && request.getHeaders().size()>0){
            loginLog.setIp(Utils.User_Client.getIP(request));
            loginLog.setPlatform(Utils.User_Client.getPlatform(request));
@@ -258,8 +272,9 @@
        SystemLoginLog loginLog = new SystemLoginLog();
        loginLog.setLoginUsername(dto.getUsername());
        loginLog.setLoginTime(new Date());
        loginLog.setReason("【公众号】司机端登陆:openid="+dto.getOpenid());
        loginLog.setSystemVersion(systemVersion);
        loginLog.setLocation(Utils.Location.getLocationString(loginLog.getIp()));
//        loginLog.setLocation(Utils.Location.getLocationString(loginLog.getIp()));
        if(request!=null&&request.getHeaders()!=null && request.getHeaders().size()>0){
            loginLog.setIp(Utils.User_Client.getIP(request));
            loginLog.setPlatform(Utils.User_Client.getPlatform(request));
@@ -280,6 +295,7 @@
        if( !StringUtils.equals(pwd, user.getPassword())){
            throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT);
        }
        dealOpenIdBiz(user,dto.getOpenid());
        Company company = new Company();
        if(Objects.nonNull(user.getCompanyId())){
            company = companyMapper.selectById(user.getCompanyId());
@@ -298,7 +314,7 @@
        SystemLoginLog loginLog = new SystemLoginLog();
        loginLog.setLoginTime(new Date());
        loginLog.setSystemVersion(systemVersion);
        loginLog.setLocation(Utils.Location.getLocationString(loginLog.getIp()));
//        loginLog.setLocation(Utils.Location.getLocationString(loginLog.getIp()));
        loginLog.setServerIp(Utils.Server.getIP());
        // æ ¹æ®ç”¨æˆ·åæŸ¥è¯¢ç”¨æˆ·å¯¹è±¡
server/system_timer/src/main/resources/application.yml
@@ -35,7 +35,7 @@
cache:
  session:
    # ä¼šè¯è¿‡æœŸæ—¶é•¿(s)
    expire: 18000
    expire: 1800
  captcha:
    # éªŒè¯ç è¿‡æœŸæ—¶é•¿(s)
    expire: 300
server/visits/admin_timer/src/main/java/com/doumee/api/HkNoticeTimerController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
package com.doumee.api;
import com.doumee.core.model.ApiResponse;
import com.doumee.core.utils.Constants;
import com.doumee.service.business.VisitsService;
import com.doumee.service.business.impl.hksync.HkSyncVisitServiceImpl;
import com.doumee.service.business.impl.hksync.fhk.HkSyncVisitFromHKServiceImpl;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2023/11/30 15:33
 */
@Api(tags = "海康代办定时抓取接口")
@RestController
@RequestMapping("/timer/hkNotice")
public class HkNoticeTimerController extends BaseController {
    @Autowired
    private HkSyncVisitServiceImpl hkSyncVisitService;
    @Autowired
    private HkSyncVisitFromHKServiceImpl hkSyncVisitFromHKService;
    @Autowired
    private VisitsService visitsService;
    @ApiOperation("开启定时查询最新人员代办数据状态")
    @GetMapping("/getNoticeList")
    public ApiResponse getNoticeList() {
        hkSyncVisitService.syncVisitData();
        return ApiResponse.success("开启定时下发访客预约申请成功");
    }
}
server/visits/admin_timer/src/main/java/com/doumee/api/WxTokenTimerController.java
@@ -2,21 +2,22 @@
import com.alibaba.fastjson.JSONObject;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.haikang.model.HKConstants;
import com.doumee.core.haikang.model.param.BaseResponse;
import com.doumee.core.haikang.service.HKService;
import com.doumee.core.model.ApiResponse;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.HttpsUtil;
import com.doumee.core.wx.WXConstant;
import com.doumee.dao.system.model.SystemDictData;
import com.doumee.service.business.impl.hksync.HkSyncVisitServiceImpl;
import com.doumee.service.business.impl.hksync.fhk.HkSyncVisitFromHKServiceImpl;
import com.doumee.service.system.SystemDictDataService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@@ -45,7 +46,27 @@
    @ApiOperation("开启定时更新微信公众号accesstoken")
    @GetMapping("/updateWxAccessToken")
    public ApiResponse updateWxAccessToken() {
        DefaultSecurityManager securityManager = new DefaultSecurityManager();
       DefaultSecurityManager securityManager = new DefaultSecurityManager();
        SecurityUtils.setSecurityManager(securityManager);
        String token =null;
        BaseResponse<String> result = HKService.wxAccessToken(systemDictDataBiz.queryByCode(Constants.HK_PARAM,Constants.HK_WXTOKEN_CONFIGID).getCode(),systemDictDataBiz.queryByCode(Constants.HK_PARAM,Constants.HK_WXTOKEN_TAGID).getCode());
        if(StringUtils.equals(result.getCode(), HKConstants.RESPONSE_SUCCEE) ){
            token= result.getData();
            SystemDictData systemDictData =  systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_ACCESS_TOKEN);
            if(!Objects.isNull(systemDictData)){
                systemDictData.setCode(token);
                systemDictData.setUpdateTime(new Date());
                systemDictDataService.updateById(systemDictData);
            }
        }else{
            return ApiResponse.success("开启定时更新微信公众号accesstoken失败");
        }
        return ApiResponse.success("开启定时更新微信公众号accesstoken成功");
    }
    @ApiOperation("开启定时更新微信公众号accesstoken")
    @GetMapping("/updateWxAccessTokenOrigin")
    public ApiResponse updateWxAccessTokenOrigin() {
       DefaultSecurityManager securityManager = new DefaultSecurityManager();
        SecurityUtils.setSecurityManager(securityManager);
        String appId = systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_APPID).getCode();
server/visits/admin_timer/src/main/resources/application.yml
@@ -31,7 +31,7 @@
cache:
  session:
    # ä¼šè¯è¿‡æœŸæ—¶é•¿(s)
    expire: 18000
    expire: 1800
  captcha:
    # éªŒè¯ç è¿‡æœŸæ—¶é•¿(s)
    expire: 300
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/HkSyncCloudController.java
@@ -33,6 +33,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.Cacheable;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -60,6 +61,8 @@
    private HkSyncPrivilegeServiceImpl hkSyncPrivilegeService;
    @Autowired
    private HkSyncPushServiceImpl hkSyncPushService;
    @Autowired
    private HkSyncNoticeServiceImpl hkSyncNoticeService;
    @Autowired
    private HkSyncLoginAuthServiceImpl hkSyncLoginAuthService;
@@ -231,11 +234,11 @@
     * @return
     */
    @ApiOperation(value = "获取安防平台系统免密菜单调整地址" )
    @GetMapping("/getHkMenuLink")
    @PostMapping("/getHkMenuLink/{type}")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "type",example = "0",value = "菜单类型", required = true),
    })
    public ApiResponse<String> getHkMenuLink(Integer type,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
    public ApiResponse<String> getHkMenuLink(@PathVariable Integer type,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
        LoginUserInfo loginUserInfo = this.getLoginUser(token);
        String hkToken = DESUtil.generateTokenToHk(loginUserInfo.getUsername(),Integer.valueOf(
          systemDictDataBiz.queryByCode(Constants.HK_PARAM,Constants.HK_TOKEN_VALIDITY).getCode()
@@ -267,7 +270,12 @@
    }
    @ApiOperation("【海康】代办消息数据集合对接处理接口")
    @PostMapping("/notice/getList")
    public ApiResponse getNoticeList( HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token ){
        String result = hkSyncNoticeService.syncHkNotices(this.getLoginUser(token).getUsername());
        return ApiResponse.success(result);
    }
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/PlatformJobCloudController.java
@@ -12,6 +12,7 @@
import com.doumee.dao.web.reqeust.JobDetailDTO;
import com.doumee.dao.web.reqeust.SignInDTO;
import com.doumee.service.business.PlatformJobService;
import com.doumee.service.business.third.WmsService;
import com.github.xiaoymin.knife4j.core.util.CollectionUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -32,6 +33,8 @@
    @Autowired
    private PlatformJobService platformJobService;
    @Autowired
    private WmsService wmsService;
    @PreventRepeat
    @ApiOperation("新建")
@@ -56,6 +59,13 @@
        platformJobService.deleteByIdInBatch(this.getIdList(ids));
        return ApiResponse.success(null);
    }
    @ApiOperation("批量更新wms合同总运输量")
    @GetMapping("/updateTotalNum")
    @CloudRequiredPermission("business:platformjob:update")
    public ApiResponse updateTotalNum(@RequestParam String ids,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
        wmsService.computjobTotalNum(this.getIdList(ids));
        return ApiResponse.success(null);
    }
    @ApiOperation("根据ID修改")
    @PostMapping("/updateById")
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/StagingCloudController.java
@@ -17,6 +17,7 @@
import com.doumee.service.business.ApproveService;
import com.doumee.service.business.MemberService;
import com.doumee.service.business.VisitsService;
import com.doumee.service.business.impl.hksync.HkSyncNoticeServiceImpl;
import com.doumee.service.system.NoticesService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
@@ -46,6 +47,8 @@
    @Autowired
    private VisitsService visitsService;
    @Autowired
    private HkSyncNoticeServiceImpl hkSyncNoticeService;
    @Autowired
    private NoticesService noticesService;
@@ -90,6 +93,8 @@
            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "isDetail", value = " æ˜¯å¦æŸ¥è¯¢è¯¦ç»† 1是;0否", required = true),
    })
    public ApiResponse<InternalHomeVO> taskCenterHead(@RequestParam Integer isDetail,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        LoginUserInfo loginUserInfo = getLoginUser(token);
        hkSyncNoticeService.syncHkNotices(loginUserInfo.getUsername());
        return ApiResponse.success("查询成功",approveService.getHomeDataH5(getLoginUser(token).getMemberId(),isDetail));
    }
@@ -98,6 +103,7 @@
    @PostMapping("/taskCenterHeadPC")
    public ApiResponse<InternalHomeVO> taskCenterHeadPC(@RequestBody NoticesDTO  noticesDTO,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        LoginUserInfo loginUserInfo = getLoginUser(token);
        hkSyncNoticeService.syncHkNotices(loginUserInfo.getUsername());
        noticesDTO.setMemberId(loginUserInfo.getMemberId());
        noticesDTO.setUserId(loginUserInfo.getId());
        return ApiResponse.success("查询成功",approveService.getHomeDataPC(noticesDTO));
@@ -138,6 +144,10 @@
            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "queryType", value = "查询类型:1=在园人数;2=报表数据;3=待办事项;4=超时预警", required = true),
    })
    public ApiResponse<PCWorkPlatformDataVO> pCWorkPlatformData (@RequestParam Integer queryType, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        if(queryType==Constants.THREE){
            //同步海康代办数据
            hkSyncNoticeService.syncHkNotices(this.getLoginUser(token).getUsername());
        }
        PCWorkPlatformDataVO pcWorkPlatformDataVO = visitsService.getPcWorkPlatformData(queryType,getLoginUser(token));
        return ApiResponse.success("查询成功",pcWorkPlatformDataVO);
    }
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/WmsPushCloudController.java
@@ -42,6 +42,7 @@
        WmsBaseResponse result =null;
        try {
            result = wmsService.inboundNotice(param);
            wmsService.computjobTotalNum(param.getJobIdList());
        }catch (BusinessException e){
            log.error("【WMS】推送入库单通知任务===失败:"+e.getMessage());
            success = Constants.ONE;
@@ -64,6 +65,7 @@
        WmsBaseResponse result =null;
        try {
            result = wmsService.outboundNotice(param);
            wmsService.computjobTotalNum(param.getJobIdList());
        }catch (BusinessException e){
            log.error("【WMS】推送出库单通知任务===失败:"+e.getMessage());
            success = Constants.ONE;
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/board/EnergyController.java
@@ -9,17 +9,13 @@
import com.doumee.service.business.third.BoardService;
import io.swagger.annotations.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
 * Created by IntelliJ IDEA.
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/board/FightingAdminController.java
@@ -1,32 +1,19 @@
package com.doumee.cloud.board;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.doumee.api.BaseController;
import com.doumee.config.annotation.LoginNoRequired;
import com.doumee.core.haikang.model.HKConstants;
import com.doumee.core.haikang.model.param.BaseResponse;
import com.doumee.core.haikang.model.param.request.FireDevStatusTotalRequest;
import com.doumee.core.haikang.model.param.respose.FireDevStatusListResponse;
import com.doumee.core.haikang.model.param.respose.MonthDataByMeterTypeResponse;
import com.doumee.core.haikang.service.HKService;
import com.doumee.core.model.ApiResponse;
import com.doumee.core.utils.Constants;
import com.doumee.dao.business.PlatformLogMapper;
import com.doumee.dao.business.model.PlatformLog;
import com.doumee.dao.web.response.platformReport.*;
import com.doumee.service.business.third.BoardService;
import io.swagger.annotations.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
 * Created by IntelliJ IDEA.
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/board/PlatformJobRunActController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,150 @@
package com.doumee.cloud.board;
import com.doumee.api.BaseController;
import com.doumee.config.annotation.LoginNoRequired;
import com.doumee.core.model.ApiResponse;
import com.doumee.core.utils.Constants;
import com.doumee.dao.business.join.PlatformJobJoinMapper;
import com.doumee.dao.business.model.Platform;
import com.doumee.dao.business.model.PlatformBooks;
import com.doumee.dao.business.model.PlatformJob;
import com.doumee.dao.business.model.PlatformWmsJob;
import com.doumee.dao.web.reqeust.CarsJobAndContractDTO;
import com.doumee.dao.web.response.platformReport.*;
import com.doumee.service.business.third.BoardService;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2024/10/28 13:42
 */
@Api(tags = "【看板大屏】园区物流运行调度看板真实")
@RestController
@Slf4j
@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/board/api/platformJobRunAct")
public class PlatformJobRunActController extends BaseController {
    @Autowired
    private PlatformJobJoinMapper platformJobJoinMapper;
    @Autowired
    private BoardService boardService;
    @LoginNoRequired
    @ApiOperation("查询本月、本年的累计出库量,出入库任务量、出入库作业效率统计数据")
    @GetMapping("/centerData")
    public ApiResponse<PlatformJobRunBoardNewVO> centerData() {
        PlatformJobRunBoardNewVO data = boardService.platformJobCenterData();
        return ApiResponse.success(data);
    }
    @LoginNoRequired
    @ApiOperation("运输任务分析")
    @GetMapping("/transportMeasure")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "queryType", value = "查询类型:0=周;1=月;2=年;", required = true),
    })
    public ApiResponse<List<TransportMeasureVO>> transportMeasure(@RequestParam Integer queryType) {
        List<TransportMeasureVO> list = boardService.transportMeasure(queryType);
        return ApiResponse.success(list);
    }
    @LoginNoRequired
    @ApiOperation("汽车状态、经纬度集合数据")
    @GetMapping("/carsList")
    public ApiResponse<BoardCarsListVO> carsList() {
        BoardCarsListVO data = boardService.platformJobCarsList();
        return ApiResponse.success(data);
    }
    @LoginNoRequired
    @ApiOperation("根据车牌号查询作业信息和合同信息集合")
    @PostMapping("/getCarsJobDetails")
    public ApiResponse<CarsJobAndContractVO> getCarsJobDetails(@RequestBody CarsJobAndContractDTO param) {
        CarsJobAndContractVO data = boardService.getCarsJobDetails(param);
        return ApiResponse.success(data);
    }
    @LoginNoRequired
    @ApiOperation("当日运输任务")
    @GetMapping("/platformJobList")
    public ApiResponse<List<PlatformJob>> platformJobList() {
        List<PlatformJob> list =  platformJobJoinMapper.selectJoinList(PlatformJob.class,
                new MPJLambdaWrapper<PlatformJob>()
                        .selectAll(PlatformJob.class)
                        .selectAs(PlatformBooks::getId,PlatformJob::getBookId)
                        .selectAs(Platform::getName,PlatformJob::getPlatformName)
                        .selectAs(Platform::getWorkRate,PlatformJob::getWorkRate)
                        .selectAs(PlatformWmsJob::getCarrierName,PlatformJob::getCarrierName)
                        .selectAs(PlatformWmsJob::getRepertotyAddress,PlatformJob::getRepertotyAddress)
                        .leftJoin(Platform.class,Platform::getId,PlatformJob::getPlatformId)
                        .leftJoin(PlatformWmsJob.class,PlatformWmsJob::getCarryBillCode,PlatformJob::getBillCode)
                        .leftJoin(PlatformBooks.class,PlatformBooks::getJobId,PlatformJob::getId)
                        .eq(PlatformJob::getIsdeleted,Constants.ZERO)
                        .in(PlatformJob::getStatus
                                ,Constants.PlatformJobStatus.WAIT_CALL.getKey()
                                ,Constants.PlatformJobStatus.CALLED.getKey()
                                ,Constants.PlatformJobStatus.IN_WAIT.getKey()
                                ,Constants.PlatformJobStatus.WORKING.getKey()
                                ,Constants.PlatformJobStatus.TRANSFERING.getKey()
                                ,Constants.PlatformJobStatus.EXCEPTION.getKey()
                                ,Constants.PlatformJobStatus.DONE.getKey()
                        )
                        .orderByDesc(PlatformJob::getSignNum)
                        .last(" limit 20 ")
        );
        return ApiResponse.success(list);
    }
    @LoginNoRequired
    @ApiOperation("出入库任务量")
    @GetMapping("/jobData")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "queryType", value = "查询类型:0=出库;1=入库;", required = true),
    })
    public ApiResponse<JobDataVO> jobData(@RequestParam Integer queryType) {
        Random random = new Random();
        JobDataVO jobDataVO = new JobDataVO();
        jobDataVO.setPlanTaskNum(BigDecimal.valueOf(random.nextInt(1000)));
        jobDataVO.setFinishTaskNum(BigDecimal.valueOf(jobDataVO.getPlanTaskNum().intValue()));
        return ApiResponse.success(jobDataVO);
    }
    @LoginNoRequired
    @ApiOperation("今日入库量统计")
    @GetMapping("/totalInList")
    public ApiResponse<List<GeneralVO>> totalInList() {
        List<GeneralVO> list = new ArrayList<>();
        for (int i = 1; i < 4; i++) {
            Random random = new Random();
            GeneralVO data = new GeneralVO();
            data.setName("厂区名称_"+i);
            data.setNum(BigDecimal.valueOf(random.nextInt(1000)));
            list.add(data);
        }
        return ApiResponse.success(list);
    }
    @LoginNoRequired
    @ApiOperation("库存情况")
    @GetMapping("/stockList")
    public ApiResponse< BoardStockListVO > stockList() {
         BoardStockListVO list =  boardService.stockList();
        return ApiResponse.success(list);
    }
}
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/board/PlatformJobRunController.java
@@ -88,7 +88,7 @@
        }
        for (String str:dayList) {
            TransportMeasureVO data = new TransportMeasureVO();
            data.setPlanDate(str);
            data.setPlanDateStr(str);
            data.setPlanTimes(random.nextInt(200));
            data.setPlanTaskNum(new BigDecimal(random.nextInt(1000)));
            data.setFinishTaskNum(new BigDecimal(data.getPlanTaskNum().intValue()));
@@ -96,9 +96,6 @@
        }
        return ApiResponse.success(list);
    }
    @LoginNoRequired
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/board/SecurityController.java
@@ -1,15 +1,12 @@
package com.doumee.cloud.board;
import com.doumee.api.BaseController;
import com.doumee.config.annotation.CloudRequiredPermission;
import com.doumee.config.annotation.LoginNoRequired;
import com.doumee.core.haikang.model.param.respose.PageRegionInfoResponse;
import com.doumee.core.haikang.model.param.respose.RuleEventSearchResponse;
import com.doumee.core.model.ApiResponse;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.dao.admin.response.PCWorkPlatformDataVO;
import com.doumee.dao.business.model.Visits;
import com.doumee.dao.web.response.platformReport.*;
import com.doumee.service.business.VisitsService;
@@ -19,7 +16,6 @@
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/VisitorWebController.java
@@ -10,6 +10,7 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.wx.wxPlat.WxPlatNotice;
import com.doumee.dao.business.model.VisitReason;
import com.doumee.dao.business.model.Visits;
import com.doumee.dao.web.reqeust.CheckVisitedDTO;
@@ -32,6 +33,7 @@
import org.springframework.web.server.ServerWebExchange;
import javax.validation.Valid;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
@@ -71,6 +73,21 @@
    }
    @LoginNoRequired
    @ApiOperation(value = "testSendNotice", notes = "testSendNotice")
    @GetMapping("/testSendNotice")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "query", dataType = "String", name = "openid", value = "openid", required = true),
            @ApiImplicitParam(paramType = "query", dataType = "String", name = "token", value = "token", required = true),
    })
    public ApiResponse wxAuthorize(@RequestParam String openid,String token) {
        WxPlatNotice wxPlatNotice = new WxPlatNotice();
        List<String> idList = Arrays.asList(openid.split(","));
        wxPlatNotice.testSendNotice(idList,token);
        return ApiResponse.success("查询成功");
    }
    @ApiOperation(value = "查询被访问人信息", notes = "查询被访问人信息")
    @PostMapping("/getVisitedMember")
    public ApiResponse<List<MemberVO>> getVisitedMember(@Valid @RequestBody CheckVisitedDTO checkVisitedDTO) {
server/visits/dmvisit_admin/src/main/resources/application.yml
@@ -34,7 +34,7 @@
cache:
  session:
    # ä¼šè¯è¿‡æœŸæ—¶é•¿(s)
    expire: 18000
    expire: 1800
  captcha:
    # éªŒè¯ç è¿‡æœŸæ—¶é•¿(s)
    expire: 300
server/visits/dmvisit_screen/src/main/resources/application.yml
@@ -37,7 +37,7 @@
cache:
  session:
    # ä¼šè¯è¿‡æœŸæ—¶é•¿(s)
    expire: 18000
    expire: 1800
  captcha:
    # éªŒè¯ç è¿‡æœŸæ—¶é•¿(s)
    expire: 300
server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/ErpTool.java
@@ -19,9 +19,7 @@
import com.doumee.core.utils.HttpsUtil;
import com.doumee.dao.business.InterfaceLogMapper;
import com.doumee.dao.business.model.InterfaceLog;
import com.doumee.dao.business.model.Member;
import com.doumee.service.business.InterfaceLogService;
import com.github.pagehelper.PageInfo;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/ApproveNoticeRequest.java
@@ -6,7 +6,6 @@
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
 * åˆ†ç±»ä¿¡æ¯è¡¨
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKConstants.java
@@ -39,11 +39,13 @@
     * 3、能管中心:ngzx
     */
    public interface MenuPageId{
        String[] componentIds = new String[]{"Infovision iPark Platform","dfe"};
        String afzx = "afzx";//安防中心
        String xkzx = "xkzx";//消控中心
        String ngzx = "ngzx";//能管中心
        String jsc = "jsc";//物业后勤
        String kqgzt = "attendance_workstand";//考勤管理
        String kqdbcl = "process_apply";//考勤代办处理
    }
    /**
@@ -126,7 +128,8 @@
        String[] iccmAppointmentRecords= new String[]{"/api/iccm/v2/appointment/records","iccm查询已预约登记"};//iccm查询已预约登记
        String[] wxAccessToken= new String[]{"/api/wx/v1/oa/get/accessToken","根据微信公众号信息获取AccessToken"};//1.9.1根据微信公众号信息获取AccessToken
        String[] getWxConfig= new String[]{"/api/wx/v1/oa/get/config","根据配置微信公众号编号查询微信公众号信息"};//根据配置微信公众号编号查询微信公众号信息
        String[] goMenuUrl= new String[]{"/xauthplus-plugin/thirdLogin?type=third&componentId=Infovision iPark Platform&componentMenuId=${menuId}&token=${token}","工作台菜单跳转地址"};
        String[] goMenuUrl= new String[]{"/xauthplus-plugin/thirdLogin?type=third&componentId=${componentId}&componentMenuId=${menuId}&token=${token}","工作台菜单跳转地址"};
//        String[] goNoticeMenuUrl= new String[]{"/xauthplus-plugin/thirdLogin?type=third&componentId=dfe&componentMenuId={menuId}&token=${token}","工作台考勤代办处理跳转地址"};
        String[] nhEventPageList= new String[]{"/api/ecm/warning/event/v1/pageList","分页获取告警事件"};//分页获取告警事件
        String[] nhRegionDataRanking= new String[]{"/api/ecm/v1/energy/regionDataRanking","根据时间维度获取区域用量排名"};//1.8.5根据时间维度获取区域用量排名
        String[] nhEnergyDistribution= new String[]{"/api/ecm/v1/energy/energyDistribution","根据时间维度获取能耗分布"};// æ ¹æ®æ—¶é—´ç»´åº¦èŽ·å–èƒ½è€—åˆ†å¸ƒ
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java
@@ -395,6 +395,13 @@
        saveInterfaceLog(JSONObject.toJSONString(body),result,path,pathStr[1]);
        return result;
    }
    public static String startDoGetStringArtemisJson(String[] pathStr,Map<String,String> body ){
        Map<String, String> path = getPath(pathStr[0]);
        Map<String, String> header = new HashMap<>();
        String result = ArtemisHttpUtil.doGetArtemis(path, body, null, "application/json",  header);
        saveInterfaceLog(JSONObject.toJSONString(body),result,path,pathStr[1]);
        return result;
    }
    public static String startDoPostStringArtemis(String[] pathStr,String param,String body ){
        Map<String, String> path = getPath(pathStr[0]+StringUtils.defaultString(param,""));
        Map<String, String> header = new HashMap<>();
@@ -574,10 +581,13 @@
     *    æ ¹æ®å¾®ä¿¡å…¬ä¼—号信息获取AccessToken
     * @return
     */
    public static String wxAccessToken(String configId,String tagId) {
        String[] wxAccessToken= HKConstants.InterfacePath.wxAccessToken;
        wxAccessToken[0] = HKConstants.InterfacePath.wxAccessToken+"?tagId="+tagId+"&configId"+configId;
        return startDoPostStringArtemis(wxAccessToken,"");
    public static String wxAccessToken(HashMap<String,String> params ) {
//        String[] wxAccessToken= new String[2];
//        String url = HKConstants.InterfacePath.wxAccessToken[0]+"?tagId="+tagId+"&configId="+configId;
//        String t = HKConstants.InterfacePath.wxAccessToken[1];
//        wxAccessToken[0] = url;
//        wxAccessToken[1] = t;
        return startDoGetStringArtemisJson(HKConstants.InterfacePath.wxAccessToken,params);
    }
    /**
     *    æ ¹æ®é…ç½®å¾®ä¿¡å…¬ä¼—号编号查询微信公众号信息
@@ -994,9 +1004,9 @@
        return startDoPostStringArtemis(HKConstants.InterfacePath.applyST,body);
    }
    public static String getMenuUrl(String menuId, String token) {
    public static String getMenuUrl(String componentId,String menuId, String token) {
        String url = HKConstants.InterfacePath.goMenuUrl[0];
        url = url.replace("${menuId}", menuId).replace("${token}",token);
        url = url.replace("${componentId}",componentId).replace("${menuId}", menuId).replace("${token}",token);
        return  url;
    }
}
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/cars/BaseCarsPageResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.doumee.core.haikang.model.cars;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
import java.util.List;
@Data
public class BaseCarsPageResponse<T> {
  private int total;//    number    False    æŸ¥è¯¢æ•°æ®è®°å½•总数
  private int totalPages;//    æ€»é¡µæ•°    Integer
  private int  currentPage    ;//当前页    Integer
  private int  totalRecords;//    æ€»è®°å½•条数    Long
  private int  startIndex    ;//记录开始序号    Long
  @JSONField(name="results",alternateNames = {"rows","list"})
  private List<T> results    ;// object[]    False    æƒé™ç»„对象列表
}
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/cars/BaseCarsResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.doumee.core.haikang.model.cars;
import lombok.Data;
@Data
public class BaseCarsResponse<T> {
    private T data;
    /**
     *错误信息描述,仅status不为0时有值
     */
    private String msg;
    /**
     * è¯·æ±‚结果状态值, æˆåŠŸä¸º0,其他值请查看附录返回码状态表。
     */
    private Integer status;
}
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/cars/request/CarsDeviceRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.doumee.core.haikang.model.cars.request;
import lombok.Data;
/**
 * è®¾å¤‡åˆ—表请求信息
 */
@Data
public class CarsDeviceRequest  {
    private String   productKey    ;//设备型号秘钥    String    æ—     å¦
    private Integer   pageSize;//    é¡µé¢å¤§å°    Integer    1000    å¦
    private Integer   pageNo    ;//当前页    Integer    1
}
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/cars/request/CarsGpsRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.doumee.core.haikang.model.cars.request;
import lombok.Data;
/**
 * GPS列表请求信息
 */
@Data
public class CarsGpsRequest  {
    private String  deviceCode    ;//设备终端手机号    String    æ—     æ˜¯
    private String   startTime    ;//开始时间yyyy-MM-dd HH:mm:ss    String    æ—     æ˜¯
    private String    endTime    ;//结束时间yyyy-MM-dd HH:mm:ss    String    æ—     æ˜¯
    private Boolean   filterInvalidGps    ;//是否过滤无效的GPS    boolean    true    å¦
    private Boolean  filterSupplementGps    ;//是否过滤补报的GPS    boolean    true    å¦
    private Integer   pageSize;//    é¡µé¢å¤§å°    Integer    1000    å¦
    private Integer   pageNo    ;//当前页    Integer    1
}
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/cars/response/CarsDeviceChannelResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.doumee.core.haikang.model.cars.response;
import lombok.Data;
/**
 * è®¾å¤‡é€šé“信息
 * @param <T>
 */
@Data
public class CarsDeviceChannelResponse<T> {
    private String  terminalID;//    ç»ˆç«¯æ‰‹æœºå·    String
    private String   channelName;//    é€šé“号名称    String
    private Integer    channelNum;//    é€šé“编号
    private Integer    channelType;//    é€šé“号类型,0 è§†é¢‘通道,1 éŸ³é¢‘通道
}
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/cars/response/CarsDeviceDetaisResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.doumee.core.haikang.model.cars.response;
import lombok.Data;
/**
 * GPS列表单元信息
 */
@Data
public class CarsDeviceDetaisResponse {
    private Integer gpsValid    ;//定位状态,0 æ— æ•ˆï¼Œ 1 æœ‰æ•ˆ
    private Double  longitude    ;//经度    Double
    private Double  latitude;//    çº¬åº¦
    private Double  altitude    ;//海拔高度
    private Float   speed;//    é€Ÿåº¦
    private Integer direction;//    æ–¹å‘è§’    Integer
    private String  collectTime    ;//GPS上报时间yyyy-MM-dd HH:mm:ss    String
    private String  accStatus;//    acc状态 0:关闭 1:开启    String
    private Integer supplementSign;//    è¡¥æŠ¥æ ‡è¯†ï¼ˆ1:补报;0:正常上报)    Integer
    private String  createTime;//    ç³»ç»Ÿæ”¶åˆ°GPS时间yyyy-MM-dd HH:mm:ss    String
    private Integer status;//设备状态 0:离线;1:在线;2:休眠
    private String plateNum;//车牌号
    private String  terminalID;//    ç»ˆç«¯æ‰‹æœºå·    String
}
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/cars/response/CarsDeviceResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.doumee.core.haikang.model.cars.response;
import lombok.Data;
import java.util.List;
/**
 * è®¾å¤‡åˆ—表单元信息
 * @param <T>
 */
@Data
public class CarsDeviceResponse<T> {
    private String  terminalID;//    ç»ˆç«¯æ‰‹æœºå·    String
    private String  productKey    ;//设备所属型号的产品密钥    String
    private String  createTime;//    æ·»åŠ æ—¶é—´    String
    private String   deviceStatus;//    è®¾å¤‡çŠ¶æ€ 0:离线;1:在线;2:休眠    Integer
    private String  language    ;//固件语言:CN/EN    String
    private String  organizeName;//    ç»„织名称    Sring
    private String  organizeId    ;//组织id    Integer
    private String version    ;//软件版本    String
    private String plateNum    ;//车牌号    String
    private List<CarsDeviceChannelResponse> deviceChannelList;//    è®¾å¤‡é€šé“列表,详细参数见*表2
}
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/cars/response/CarsGpsResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.doumee.core.haikang.model.cars.response;
import lombok.Data;
import javax.annotation.PostConstruct;
import java.util.List;
/**
 * GPS列表单元信息
 * @param <T>
 */
@Data
public class CarsGpsResponse<T> {
    private Integer    gpsValid    ;//定位状态,0 æ— æ•ˆï¼Œ 1 æœ‰æ•ˆ
    private Double    longitude    ;//经度    Double
    private Double    latitude;//    çº¬åº¦
    private Double   altitude    ;//海拔高度
    private Float    speed;//    é€Ÿåº¦
    private Integer    direction;//    æ–¹å‘è§’    Integer
    private String   collectTime    ;//GPS上报时间yyyy-MM-dd HH:mm:ss    String
    private String    accStatus;//    acc状态 0:关闭 1:开启    String
    private Integer    supplementSign;//    è¡¥æŠ¥æ ‡è¯†ï¼ˆ1:补报;0:正常上报)    Integer
    private String    createTime;//    ç³»ç»Ÿæ”¶åˆ°GPS时间yyyy-MM-dd HH:mm:ss    String
}
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/GetTodoListRequest.java
@@ -6,12 +6,12 @@
public class GetTodoListRequest {
    private String  comId;//        Query    String    false    ç»„ä»¶id
    private int  pageSize    ;//    Query    Number    false    åˆ†é¡µå¤§å°ï¼ˆ1~999)
    private int cascade    ;//    Query    Number    false    çº§è”数据来源0:下级平台来源;1:非下级平台来源,为空默认查询所有数据来源
    private Integer  pageSize    ;//    Query    Number    false    åˆ†é¡µå¤§å°ï¼ˆ1~999)
    private Integer cascade    ;//    Query    Number    false    çº§è”数据来源0:下级平台来源;1:非下级平台来源,为空默认查询所有数据来源
    private String  messageId;//        Query    String    false    messageId
    private int  pageNo;//        Query    Number    false    å½“前页码(1~100000)
    private Integer  pageNo;//        Query    Number    false    å½“前页码(1~100000)
    private String  localeType;//        Query    String    false    è¯­è¨€ç±»åž‹zh_CN:中文en_US:英文
    private int status;//        Query    Number    false    ä¸šåŠ¡çŠ¶æ€ç±»åž‹,1-待处理,2-审批中,3-已完成,4-抄送我,5-我审批,默认待处理
    private Integer status;//        Query    Number    false    ä¸šåŠ¡çŠ¶æ€ç±»åž‹,1-待处理,2-审批中,3-已完成,4-抄送我,5-我审批,默认待处理
    private String userId;//        Query    String    false    ç”¨æˆ·id
    private String clientType;//        Query    String    false    è°ƒç”¨æ–¹ç±»åž‹0:其他;1:APP,为空时默认为1;2:门户
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/GetTodoListResponse.java
@@ -10,7 +10,7 @@
      private String comId;//    String    false    ç»„件标识
      private String moduleId;//    String    false    æ¨¡å—标识
      private String msgTitle;//    String    false    ä¿¡æ¯æ ‡é¢˜
      private String msgStatus    ;//String    false    ä¿¡æ¯çŠ¶æ€
      private String msgStatus    ;//String    false    ä¿¡æ¯çŠ¶æ€ ä¸šåŠ¡çŠ¶æ€ç±»åž‹,1-待处理,2-审批中,3-已完成,4-抄送我,5-我审批,默认待处理
      private String msgStatusStr;//    String    false    ä¿¡æ¯çŠ¶æ€åç§°
      private String msgCreateTime;//    String    false    æ¶ˆæ¯åˆ›å»ºæ—¶é—´,优先使用msgCreateTimeIso
      private String msgCreateTimeIso;//    String    false    æ¶ˆæ¯åˆ›å»ºæ—¶é—´,ISO时间
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKCarOpenService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,236 @@
package com.doumee.core.haikang.service;
    import com.alibaba.fastjson.JSONObject;
    import com.alibaba.fastjson.TypeReference;
    import com.doumee.core.haikang.model.cars.BaseCarsPageResponse;
    import com.doumee.core.haikang.model.cars.BaseCarsResponse;
    import com.doumee.core.haikang.model.cars.request.CarsDeviceRequest;
    import com.doumee.core.haikang.model.cars.request.CarsGpsRequest;
    import com.doumee.core.haikang.model.cars.response.CarsDeviceDetaisResponse;
    import com.doumee.core.haikang.model.cars.response.CarsDeviceResponse;
    import com.doumee.core.haikang.model.cars.response.CarsGpsResponse;
    import com.doumee.core.haikang.model.param.BaseListPageResponse;
    import com.doumee.core.haikang.model.param.BaseResponse;
    import com.doumee.core.haikang.model.param.respose.FindHomeAlarmInfoPageResponse;
    import com.doumee.core.utils.Constants;
    import com.doumee.core.utils.DateUtil;
    import com.google.common.collect.Maps;
    import org.apache.commons.lang3.StringUtils;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClientBuilder;
    import org.apache.http.util.EntityUtils;
    import org.springframework.http.HttpMethod;
    import java.io.UnsupportedEncodingException;
    import java.util.*;
public class HKCarOpenService {
    public static   String ACCESS_KEY = "D_SUB_gfJkiUxt_1723101405213";
    public static   String ACCESS_SECRET = "0vB3VLU21SC6eG8T";
    private static final String SIGNATURE_METHOD = "HMAC-SHA1";
    private static final String DEFAULT_CHARSET  = "UTF-8";
    private static final String REGION_ID = "cn-hangzhou";
    private static final String VERSION = "2.1.0";
    public static   String BASE_URL = "https://open.hikvisionauto.com:14021/v2/";
    private static TreeMap<String, String> getBaseParams()   {
        Map<String, String> params = Maps.newHashMap();
        params.put("SignatureMethod", SIGNATURE_METHOD);
        params.put("SignatureNonce", UUID.randomUUID().toString());
        params.put("AccessKey", ACCESS_KEY);
        params.put("Timestamp", String.valueOf(System.currentTimeMillis()));
        params.put("Version", VERSION);
        params.put("RegionId", REGION_ID);
        TreeMap<String, String> sortParas = Maps.newTreeMap();
        sortParas.putAll(params);
        return sortParas;
    }
    public static String sign(String accessSecret, TreeMap<String, String> params, HttpMethod method) throws Exception {
        String stringToSign = getStringToSign(params, method);
        System.out.println("StringToSign = [" + stringToSign + "]");
        javax.crypto.Mac mac = javax.crypto.Mac.getInstance("HmacSHA1");
        mac.init(new javax.crypto.spec.SecretKeySpec(accessSecret.getBytes(DEFAULT_CHARSET), "HmacSHA1"));
        byte[] signData = mac.doFinal(stringToSign.getBytes(DEFAULT_CHARSET));
        return new sun.misc.BASE64Encoder().encode(signData);
    }
    private static String getStringToSign(TreeMap<String, String> params, HttpMethod method) throws Exception {
        StringBuilder sortQueryStringTmp = new StringBuilder();
        for(Map.Entry<String, String> entry : params.entrySet()){
            sortQueryStringTmp.append("&").append(specialUrlEncode(entry.getKey())).append("=").append(specialUrlEncode(entry.getValue()));
        }
        StringBuilder stringToSign = new StringBuilder();
        stringToSign.append(method.toString()).append("&").append(specialUrlEncode("/")).append("&").append(specialUrlEncode(sortQueryStringTmp.substring(1)));
        return stringToSign.toString();
    }
    public static String specialUrlEncode(String value) throws Exception {
        return java.net.URLEncoder.encode(value, "UTF-8").replace("+", "%20").replace("*", "%2A").replace("%7E", "~");
    }
    public static void main(String[] args) {
        getAllCarsDetais();
    }
    public static List<CarsDeviceDetaisResponse> getAllCarsDetais() {
        List<CarsDeviceDetaisResponse> list = new ArrayList<>();
        BaseCarsPageResponse<CarsDeviceResponse>  data = getDeviceList(new CarsDeviceRequest());
        if(data!=null &&data.getResults()!=null){
            List<String> cars = new ArrayList<>();
            List<String> codes = new ArrayList<>();
            for(CarsDeviceResponse model :data.getResults()){
//                System.out.println("=================车牌号:"+model.getPlateNum());
                cars.add(model.getPlateNum());
                codes.add(model.getTerminalID());
                CarsDeviceDetaisResponse t = new CarsDeviceDetaisResponse();
                t.setPlateNum(model.getPlateNum());
                t.setTerminalID(model.getTerminalID());
                /*CarsGpsRequest gp = new CarsGpsRequest();
                gp.setDeviceCode(t.getTerminalID());
                gp.setFilterSupplementGps(false);
                gp.setFilterSupplementGps(false);
                gp.setStartTime(DateUtil.getYesterday()+" 00:00:00");
                gp.setEndTime(DateUtil.getNowPlusTime());
                gp.setPageNo(1);
                gp.setPageSize(10);*/
                 CarsGpsResponse tg = getLatestGpsInfo(t.getTerminalID());
                if(tg!=null ){
                    t.setSpeed(tg.getSpeed());
                    t.setLatitude(tg.getLatitude());
                    t.setLongitude(tg.getLongitude());
                    t.setCollectTime(tg.getCollectTime());
                    t.setAccStatus(tg.getAccStatus());
                    t.setGpsValid(tg.getGpsValid());
                }
                list.add(t);
            }
            System.out.println("=================车牌总数:"+codes.size());
            Map<String,Integer>   statusList = getDeviceStatusList(codes);
            if(statusList!=null &&statusList.size()>0){
                for(Map.Entry<String, Integer> entry : statusList.entrySet()){
                    CarsDeviceDetaisResponse t = getFromListById(entry.getKey(),list);
                    if(t!=null) {
                        t.setStatus(entry.getValue());
                    }
                }
            }
        }
        for(CarsDeviceDetaisResponse m  : list){
            System.out.println("=================车牌号:"+m.getPlateNum()+" çŠ¶æ€ï¼šã€"+m.getStatus()+"】"+" ä½ç½®ï¼šã€"+m.getLongitude()+","+m.getLatitude()+"】");
        }
        return list;
    }
    private static CarsDeviceDetaisResponse getFromListById(String key, List<CarsDeviceDetaisResponse> list) {
        for(CarsDeviceDetaisResponse dd  :list){
            if(dd.getTerminalID()!=null && key !=null && dd.getTerminalID().equals(key)){
                return  dd;
            }
        }
        return null;
    }
    public static String sendRequest(String url,TreeMap<String, String> map){
        try {
            StringBuilder sortQueryStringTmp = new StringBuilder();
            for(Map.Entry<String, String> entry : map.entrySet()){
                sortQueryStringTmp
                        .append("&")
                        .append(specialUrlEncode(entry.getKey()))
                        .append("=")
                        .append(specialUrlEncode(entry.getValue()));
            }
            //与下方的HttpGet对应,采用的是HttpMethod.GET
            String sign = sign(ACCESS_SECRET + "&", map, HttpMethod.GET);
            url += "?Signature=" + specialUrlEncode(sign) + sortQueryStringTmp.toString();
            CloseableHttpClient httpClient = HttpClientBuilder.create().build();
            //与上方的HttpMethod.GET对应,使用HttpGet
            HttpGet httpDelete = new HttpGet(url);
            CloseableHttpResponse response = httpClient.execute(httpDelete);
            return  EntityUtils.toString(response.getEntity());
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
}
    public static  BaseCarsPageResponse<CarsGpsResponse>  getGpsList(CarsGpsRequest param)   {
        String url = BASE_URL + "gps/list/";
        TreeMap<String, String> BASE_PARAMS = getBaseParams();
        if(StringUtils.isNotBlank(param.getEndTime())) {
            BASE_PARAMS.put("endTime", param.getEndTime());
        }
        if(StringUtils.isNotBlank(param.getStartTime())){
             BASE_PARAMS.put("startTime",param.getStartTime());
        }
        if( param.getFilterInvalidGps() !=null && !param.getFilterInvalidGps()){
             BASE_PARAMS.put("filterInvalidGps", "false");
        }
        if( param.getFilterSupplementGps() !=null && !param.getFilterSupplementGps()){
             BASE_PARAMS.put("filterSupplementGps", "false");
        }
        if(StringUtils.isNotBlank(param.getDeviceCode())){
            BASE_PARAMS.put("deviceCode", param.getDeviceCode().toString());//设备型号秘钥
        }
        BASE_PARAMS.put("pageSize",Constants.equalsInteger(param.getPageSize(),0)? "100":param.getPageSize().toString());//页面大小
        BASE_PARAMS.put("pageNo", Constants.equalsInteger(param.getPageNo(),0)? "1":param.getPageNo().toString());//当前页
        String str = sendRequest(url,BASE_PARAMS);
        TypeReference typeReference =
                new TypeReference<BaseCarsResponse<BaseCarsPageResponse<CarsGpsResponse>>>(){};
        BaseCarsResponse<BaseCarsPageResponse<CarsGpsResponse>>   result = JSONObject.parseObject(str, typeReference.getType());
        if(result!=null && Constants.equalsInteger(result.getStatus(),0)){
            return  result.getData();
        }
        return  null;
    }
    public static  CarsGpsResponse   getLatestGpsInfo(String deviceCode)   {
        String url = BASE_URL + "gps/latest/";
        TreeMap<String, String> BASE_PARAMS = getBaseParams();
        BASE_PARAMS.put("deviceCode", deviceCode);//设备型号秘钥
        String str = sendRequest(url,BASE_PARAMS);
        TypeReference typeReference =
                new TypeReference<BaseCarsResponse<CarsGpsResponse>>(){};
        BaseCarsResponse<CarsGpsResponse>   result = JSONObject.parseObject(str, typeReference.getType());
        if(result!=null && Constants.equalsInteger(result.getStatus(),0)){
            return  result.getData();
        }
        return  null;
    }
    public static   Map<String,Integer>   getDeviceStatusList(List<String> code)   {
        String url = BASE_URL + "device/status/";
        TreeMap<String, String> BASE_PARAMS = getBaseParams();
        if(code ==null || code.size() ==0){
            return  new HashMap<>();
        }
        BASE_PARAMS.put("deviceCodeList", JSONObject.toJSONString(code));//终端手机号列表
        String str = sendRequest(url,BASE_PARAMS);
        TypeReference typeReference =
                new TypeReference<BaseCarsResponse<Map<String,Integer>>>(){};
        BaseCarsResponse<Map<String,Integer>>   result = JSONObject.parseObject(str, typeReference.getType());
        if(result!=null && Constants.equalsInteger(result.getStatus(),0)){
            return  result.getData();
        }
        return  null;
    }
    public static BaseCarsPageResponse<CarsDeviceResponse> getDeviceList(CarsDeviceRequest param)  {
        String url = BASE_URL + "device/list/";
        TreeMap<String, String> BASE_PARAMS = getBaseParams();
        if(StringUtils.isNotBlank(param.getProductKey())){
            BASE_PARAMS.put("productKey", "");//设备型号秘钥
        }
        BASE_PARAMS.put("pageSize",Constants.equalsInteger(param.getPageSize(),0)? "100":param.getPageSize().toString());//页面大小
        BASE_PARAMS.put("pageNo", Constants.equalsInteger(param.getPageNo(),0)? "1":param.getPageNo().toString());//当前页
        String str = sendRequest(url,BASE_PARAMS);
        TypeReference typeReference =
                new TypeReference<BaseCarsResponse<BaseCarsPageResponse<CarsDeviceResponse>>>(){};
        BaseCarsResponse<BaseCarsPageResponse<CarsDeviceResponse>>   result = JSONObject.parseObject(str, typeReference.getType());
        if(result!=null && Constants.equalsInteger(result.getStatus(),0)){
            return  result.getData();
        }
        return  null;
    }
}
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java
@@ -888,7 +888,10 @@
    public  static  BaseResponse<String>   wxAccessToken(String configId,String tagId){
        log.info("【海康根据微信公众号信息获取AccessToken】================开始====configId:"+configId+" && tagId:"+tagId);
        try {
            String res = HKTools.wxAccessToken(configId,tagId);
            HashMap<String,String> params = new HashMap<>();
            params.put("tagId",tagId);
            params.put("configId",configId);
            String res = HKTools.wxAccessToken(params);
            TypeReference typeReference =
                    new TypeReference<BaseResponse<String>>(){};
            BaseResponse<String>   result = JSONObject.parseObject(res, typeReference.getType());
@@ -1086,6 +1089,7 @@
     * @return
     */
    public  static  String   getMenuUrl(Integer type,String token){
        String componentId = HKConstants.MenuPageId.componentIds[0];
        String menuId = HKConstants.MenuPageId.afzx;
        if(Constants.equalsInteger(type,Constants.ONE)){
            menuId = HKConstants.MenuPageId.xkzx;
@@ -1095,10 +1099,13 @@
            menuId = HKConstants.MenuPageId.jsc;
        }else  if(Constants.equalsInteger(type,Constants.FOUR)){
            menuId = HKConstants.MenuPageId.kqgzt;
        }else  if(Constants.equalsInteger(type,Constants.FIVE)){
            componentId = HKConstants.MenuPageId.componentIds[1];
            menuId = HKConstants.MenuPageId.kqdbcl;
        }
        log.info("【海康获取工作台菜单免密登陆调整地址】================开始====menuId:"+menuId+"==token:"+token);
        try {
            String res = HKTools.getMenuUrl(menuId,token);
            String res = HKTools.getMenuUrl(componentId,menuId,token);
            return  res;
        }catch (Exception e){
            log.error("【海康获取工作台菜单免密登陆调整地址】================失败====:\n"+ e.getMessage());
@@ -1404,7 +1411,9 @@
        Class<?> clazz = obj.getClass();
        for (Field field : clazz.getDeclaredFields()) {
            field.setAccessible(true); // ä½¿å¾—私有字段也可以访问
            map.put(field.getName(), (String) field.get(obj));
            if(field.get(obj)!=null){
                map.put(field.getName(), String.valueOf( field.get(obj)));
            }
        }
        return map;
    }
server/visits/dmvisit_service/src/main/java/com/doumee/core/wms/model/request/WmsBaseRequest.java
@@ -1,5 +1,6 @@
package com.doumee.core.wms.model.request;
import com.doumee.dao.business.model.PlatformJob;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -16,5 +17,5 @@
    @ApiModelProperty(value = "data"  )
    private List<T> data;
    private List<Integer> jobIdList;
}
server/visits/dmvisit_service/src/main/java/com/doumee/core/wms/model/response/WmsBaseResponse.java
@@ -1,11 +1,9 @@
package com.doumee.core.wms.model.response;
import com.doumee.core.haikang.model.param.BaseRequst;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
server/visits/dmvisit_service/src/main/java/com/doumee/core/wms/model/response/WmsInventoryJsonResponse.java
@@ -19,9 +19,9 @@
    private String item_code;
    @ApiModelProperty(value = "消息描述" ,example = "1")
    private String item_name;
    @ApiModelProperty(value = "内容详情集合" ,example = "1")
    @ApiModelProperty(value = "qty" ,example = "1")
    private BigDecimal qty;
    @ApiModelProperty(value = "内容详情集合" ,example = "1")
    @ApiModelProperty(value = "supplier_code" ,example = "1")
    private String  supplier_code;
    @ApiModelProperty(value = "g" ,example = "1")
    private String  supplier_name;
server/visits/dmvisit_service/src/main/java/com/doumee/core/wx/wxPlat/WxPlatConfig.java
@@ -17,13 +17,13 @@
 * @Author : Rk
 * @create 2023/12/27 9:30
 */
@Configuration
//@Configuration
public class WxPlatConfig {
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Bean
//    @Bean
    public WxMpConfigStorage wxMpConfigStorage() {
        WxMpDefaultConfigImpl configStorage = new WxMpDefaultConfigImpl();
        // å…¬ä¼—号appId
@@ -43,7 +43,7 @@
     *
     * @return
     */
    @Bean
//    @Bean
    public WxMpService wxMpService() {
        WxMpService wxMpService = new WxMpServiceImpl();
        wxMpService.setWxMpConfigStorage(wxMpConfigStorage());
server/visits/dmvisit_service/src/main/java/com/doumee/core/wx/wxPlat/WxPlatConstants.java
@@ -46,7 +46,7 @@
        //  å®¡æ‰¹é©³å›žç»™ç”³è¯·äººï¼šç”³è¯·å·²è¢«é©³å›ž
        String visitReportAuditFail = "visitReportAuditFail";
        // ç»™å®¡æ‰¹äººï¼šç”³è¯·å¾…您审批
        String visitReportWaitAudit = "visitReportAuditSuccess";
        String visitReportWaitAudit = "visitReportWaitAudit";
    }
@@ -103,7 +103,7 @@
        // å®¡æ‰¹é€šè¿‡ç»™ç”³è¯·äººï¼šç”³è¯·å·²å®¡æ ¸é€šè¿‡
        String platformBookAuditSuccess = "platformBookAuditSuccess";
        //  å®¡æ‰¹é©³å›žç»™ç”³è¯·äººï¼šç”³è¯·å·²è¢«é©³å›ž
        String platformBookAuditFail = "platformBookWaitAudit";
        String platformBookAuditFail = "platformBookAuditFail";
        // ç»™å®¡æ‰¹äººï¼šç”³è¯·å¾…您审批
        String platformBookWaitAudit = "platformBookWaitAudit";
    }
@@ -136,6 +136,8 @@
        String platformJobStopErr = "platformJobStopErr";
        // è¿è¾“任务下达 ï¼ˆç»™å¸æœºï¼‰
        String platformJobNewJob = "platformJobNewJob";
        // è¿è¾“任务取消 ï¼ˆç»™å¸æœºï¼‰
        String platformJobCancel = "platformJobCancel";
    }
server/visits/dmvisit_service/src/main/java/com/doumee/core/wx/wxPlat/WxPlatNotice.java
@@ -1,10 +1,16 @@
package com.doumee.core.wx.wxPlat;
import cn.emay.sdk.util.json.gson.JsonObject;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.Http;
import com.doumee.core.utils.HttpsUtil;
import com.doumee.dao.business.VisitsMapper;
import com.doumee.dao.business.WxNoticeConfigMapper;
import com.doumee.dao.business.model.Visits;
import com.doumee.dao.business.model.WxNoticeConfig;
import com.doumee.dao.business.model.*;
import com.github.xiaoymin.knife4j.core.util.CollectionUtils;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
@@ -12,10 +18,11 @@
import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Objects;
import java.util.*;
/**
 * å¾®ä¿¡å…¬ä¼—号通知
@@ -27,94 +34,160 @@
@Component
public class WxPlatNotice {
    /**
     * å¾®ä¿¡å…¬ä¼—号API的Service
     */
    private final WxMpService wxMpService;
    public WxPlatNotice(WxMpService wxMpService) {
        this.wxMpService = wxMpService;
    }
    /**
     * è®¿å®¢ä¸šåŠ¡é€šçŸ¥æŽ¥å£
     */
    public Boolean  sendVisitAuditTemplateNotice(Visits visits,String prefix,String tempId){
        if(StringUtils.isBlank(visits.getOpenid())){
            return false;
        }
        WxMpTemplateMessage templateMessage =  WxMpTemplateMessage.builder()
                .toUser(visits.getOpenid())
                .templateId(tempId)
                .url(prefix + visits.getId())
                .build();
        String thing1 = "待审批";
        if(visits.getStatus()==2){
            thing1 = "审核通过";
        }else if(visits.getStatus()==3){
            thing1 = "审核不通过";
        }else if(visits.getStatus()==5){
            thing1 = "设备授权成功";
        }else if(visits.getStatus()==6){
            thing1 = "设备授权未成功";
        }
        // æ·»åŠ æ¨¡æ¿æ•°æ®
        templateMessage.addData(new WxMpTemplateData("thing1", thing1))
                .addData(new WxMpTemplateData("thing2", visits.getName()))
                .addData(new WxMpTemplateData("phone_number6", visits.getPhone()));
        String msgId = null;
        try {
            // å‘送模板消息
            msgId = wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
        } catch (WxErrorException e) {
            e.printStackTrace();
        }
        log.warn("·==++--·推送微信模板信息:{}·--++==·", msgId != null ? "成功" : "失败");
        return msgId != null;
    }
    /**
     * è®¿å®¢ä¸šåŠ¡é€šçŸ¥
     */
    public void  sendVisitTemplateNotice(WxNoticeConfigMapper wxNoticeConfigMapper,Visits visits,String objCode, String prefix, String tempId, List<String> openIds){
    public void  testSendNotice(List<String> openIds,String token){
        if(CollectionUtils.isNotEmpty(openIds)){
           WxNoticeConfig wxNoticeConfig =  wxNoticeConfigMapper.selectOne(new QueryWrapper<WxNoticeConfig>().lambda().eq(WxNoticeConfig::getObjType,WxPlatConstants.visit)
                    .eq(WxNoticeConfig::getObjCode,objCode)
                           .eq(WxNoticeConfig::getStatus, Constants.ZERO)
                    .last(" limit 1")
            );
           if(Objects.isNull(wxNoticeConfig)){
               return;
           }
            WxMpTemplateMessage templateMessage =  WxMpTemplateMessage.builder()
                    .toUser(visits.getOpenid())
                    .templateId(tempId)
                    .url(prefix + visits.getId())
                    .build();
            templateMessage.addData(new WxMpTemplateData("thing1", visits.getName()))
                    .addData(new WxMpTemplateData("car_number7", StringUtils.isBlank(visits.getCarNos())?visits.getCarNos():"-"))
                    .addData(new WxMpTemplateData("character_string6", Constants.equalsInteger(visits.getMemberNum(),Constants.ZERO)?Constants.ONE+"":visits.getMemberNum().toString()))
                    .addData(new WxMpTemplateData("const9", wxNoticeConfig.getTitile()))
                    .addData(new WxMpTemplateData("thing4", visits.getReason()))
                    ;
            String msgId = null;
            try {
                for (String openId:openIds) {
                    templateMessage.setToUser(openId);
            String postUrL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+token;
            //整体参数map
            Map<String, Object> paramMap = new HashMap<String, Object>();
            //消息主题显示相关map
            Map<String, Object> dataMap = new HashMap<String, Object>();
            Map<String, Object> const9 = new HashMap<String,Object>();
            const9.put("value","申请待您审批");
            Map<String, Object> thing1 = new HashMap<String,Object>();
            thing1.put("value", "测试名称");
            Map<String, Object> car_number7 = new HashMap<String,Object>();
            car_number7.put("value","皖AP12345");
            Map<String, Object> character_string6 = new HashMap<String,Object>();
            character_string6.put("value","1");
            Map<String, Object> thing4 = new HashMap<String,Object>();
            thing4.put("value","理由");
            dataMap.put("const9",const9);
            dataMap.put("thing1",thing1);
            dataMap.put("car_number7",car_number7);
            dataMap.put("character_string6",character_string6);
            dataMap.put("thing4",thing4);
            paramMap.put("data", dataMap);
            for (String openId:openIds) {
                paramMap.clear();
                paramMap.put("template_id", "SPwvgtASkm1aMDBsYhX2wHKdL2JBEGPknDkgniSza2Y");
                paramMap.put("touser", openId);
                paramMap.put("data", dataMap);
                String response = HttpsUtil.postJson(postUrL, JSONObject.toJSONString(paramMap));
                if(StringUtils.isBlank(response)){
                    log.warn("·==++--·推送微信模板信息:{}·--++==·", "失败");
                }else{
                    JSONObject json = JSONObject.parseObject(response);
                    log.warn("·==++--·推送微信模板信息:{}·--++==·", Constants.equalsInteger(json.getInteger("errcode"),Constants.ZERO)?"成功":"失败"+json.getString("errmsg"));
                }
                // å‘送模板消息
                msgId = wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
            } catch (WxErrorException e) {
                e.printStackTrace();
            }
            log.warn("·==++--·推送微信模板信息:{}·--++==·", msgId != null ? "成功" : "失败");
//            log.warn("·==++--·推送微信模板信息:{}·--++==·", msgId != null ? "成功" : "失败");
        }
    }
    /**
     * è®¿å®¢ç”³è¯·/报备业务通知
     * @param wxNoticeConfigMapper
     * @param visits
     * @param objCode  visitUpload,visitAuditSuccess,visitWaitAudit,visitWaitAudit,visitReportUpload,visitReportAuditSuccess,visitReportAuditFail, visitReportAuditSuccess
     * @param openIds
     */
    public void  sendVisitTemplateNotice(WxNoticeConfigMapper wxNoticeConfigMapper, Visits visits, String objCode, String token, List<String> openIds){
        try{
            if(CollectionUtils.isNotEmpty(openIds)){
                WxNoticeConfig wxNoticeConfig =  wxNoticeConfigMapper.selectOne(new QueryWrapper<WxNoticeConfig>().lambda().eq(WxNoticeConfig::getObjType,WxPlatConstants.visit)
                        .eq(WxNoticeConfig::getObjCode,objCode)
                        .eq(WxNoticeConfig::getStatus, Constants.ZERO)
                        .last(" limit 1")
                );
                if(Objects.isNull(wxNoticeConfig)){
                    return;
                }
                String postUrL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+token;
                //整体参数map
                Map<String, Object> paramMap = new HashMap<String, Object>();
                //消息主题显示相关map
                Map<String, Object> dataMap = new HashMap<String, Object>();
                Map<String, Object> const9 = new HashMap<String,Object>();
                const9.put("value",wxNoticeConfig.getTitile());
                Map<String, Object> thing1 = new HashMap<String,Object>();
                thing1.put("value", visits.getName());
                Map<String, Object> car_number7 = new HashMap<String,Object>();
                car_number7.put("value",StringUtils.isNotBlank(visits.getCarNos())?visits.getCarNos():"-");
                Map<String, Object> character_string6 = new HashMap<String,Object>();
                character_string6.put("value","1");
                Map<String, Object> thing4 = new HashMap<String,Object>();
                thing4.put("value",visits.getReason());
                dataMap.put("const9",const9);
                dataMap.put("thing1",thing1);
                dataMap.put("car_number7",car_number7);
                dataMap.put("character_string6",character_string6);
                dataMap.put("thing4",thing4);
                paramMap.put("data", dataMap);
                for (String openId:openIds) {
                    paramMap.clear();
                    paramMap.put("template_id", wxNoticeConfig.getTempId());
                    paramMap.put("touser", openId);
                    paramMap.put("data", dataMap);
                    String response = HttpsUtil.postJson(postUrL, JSONObject.toJSONString(paramMap));
                    if(StringUtils.isBlank(response)){
                        log.warn("·==++--·推送微信模板信息:{}·--++==·", "失败");
                    }else{
                        JSONObject json = JSONObject.parseObject(response);
                        log.warn("·==++--·推送微信模板信息:{}·--++==·", Constants.equalsInteger(json.getInteger("errcode"),Constants.ZERO)?"成功":"失败"+json.getString("errmsg"));
                    }
                }
//            log.warn("·==++--·推送微信模板信息:{}·--++==·", msgId != null ? "成功" : "失败");
            }
        }catch (Exception e){
        }
    }
    /**
     * é𐿂£ä¸ŠæŠ¥
     * @param wxNoticeConfigMapper
     * @param hiddenDanger
     * @param objCode hiddenDangerUpload
     * @param openIds
     */
    public void  sendHiddenDangerUploadTemplateNotice(WxNoticeConfigMapper wxNoticeConfigMapper, HiddenDanger hiddenDanger, String objCode,String token, List<String> openIds){
        try{
            if(CollectionUtils.isNotEmpty(openIds)){
                WxNoticeConfig wxNoticeConfig =  wxNoticeConfigMapper.selectOne(new QueryWrapper<WxNoticeConfig>().lambda().eq(WxNoticeConfig::getObjType,WxPlatConstants.visit)
                        .eq(WxNoticeConfig::getObjCode,objCode)
                        .eq(WxNoticeConfig::getStatus, Constants.ZERO)
                        .last(" limit 1")
                );
                if(Objects.isNull(wxNoticeConfig)){
                    return;
                }
                String postUrL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+token;
                //整体参数map
                Map<String, Object> paramMap = new HashMap<String, Object>();
                //消息主题显示相关map
                Map<String, Object> dataMap = new HashMap<String, Object>();
                //隐患区域
                Map<String, Object> thing9 = new HashMap<String,Object>();
                thing9.put("value",hiddenDanger.getAreaName());
                //隐患名称
                Map<String, Object> thing1 = new HashMap<String,Object>();
                thing1.put("value", hiddenDanger.getCategoryName());
                //提报人
                Map<String, Object> thing12 = new HashMap<String,Object>();
                thing12.put("value",hiddenDanger.getMemberName());
                //提报时间
                Map<String, Object> time11 = new HashMap<String,Object>();
                time11.put("value", DateUtil.getDate(hiddenDanger.getCreateDate(),"yyyyå¹´MM月dd日 HH:mm:ss") );
                dataMap.put("thing9",thing9);
                dataMap.put("thing1",thing1);
                dataMap.put("thing12",thing12);
                dataMap.put("time11",time11);
                paramMap.put("template_id", wxNoticeConfig.getTempId());
                paramMap.put("data", dataMap);
                for (String openId:openIds) {
                    paramMap.clear();
                    paramMap.put("touser", openId);
                    paramMap.put("data", dataMap);
                    String response = HttpsUtil.postJson(postUrL, JSONObject.toJSONString(paramMap));
                    if(StringUtils.isBlank(response)){
                        log.warn("·==++--·推送微信模板信息:{}·--++==·", "失败");
                    }else{
                        JSONObject json = JSONObject.parseObject(response);
                        log.warn("·==++--·推送微信模板信息:{}·--++==·", Constants.equalsInteger(json.getInteger("errcode"),Constants.ZERO)?"成功":"失败"+json.getString("errmsg"));
                    }
                }
            }
        }catch (Exception e){
        }
@@ -122,5 +195,399 @@
    /**
     * é𐿂£æ•´æ”¹
     * @param wxNoticeConfigMapper
     * @param hiddenDanger
     * @param objCode hiddenDangerDeal
     * @param openIds
     */
    public void  sendHiddenDangerDealTemplateNotice(WxNoticeConfigMapper wxNoticeConfigMapper, HiddenDanger hiddenDanger, String objCode,String token, List<String> openIds){
        try{
            if(CollectionUtils.isNotEmpty(openIds)){
                WxNoticeConfig wxNoticeConfig =  wxNoticeConfigMapper.selectOne(new QueryWrapper<WxNoticeConfig>().lambda().eq(WxNoticeConfig::getObjType,WxPlatConstants.visit)
                        .eq(WxNoticeConfig::getObjCode,objCode)
                        .eq(WxNoticeConfig::getStatus, Constants.ZERO)
                        .last(" limit 1")
                );
                if(Objects.isNull(wxNoticeConfig)){
                    return;
                }
                String postUrL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+token;
                //整体参数map
                Map<String, Object> paramMap = new HashMap<String, Object>();
                //消息主题显示相关map
                Map<String, Object> dataMap = new HashMap<String, Object>();
                //隐患区域
                Map<String, Object> thing17 = new HashMap<String,Object>();
                thing17.put("value",hiddenDanger.getAreaName());
                //隐患名称
                Map<String, Object> thing3 = new HashMap<String,Object>();
                thing3.put("value", hiddenDanger.getCategoryName());
                //整改方式
                Map<String, Object> thing13 = new HashMap<String,Object>();
                thing13.put("value",Constants.equalsInteger(hiddenDanger.getStatus(),Constants.ONE)?"隐患已整改":"隐患已退回");
                //提交人
                Map<String, Object> thing10 = new HashMap<String,Object>();
                thing10.put("value",hiddenDanger.getCheckorName());
                //通知时间
                Map<String, Object> time16 = new HashMap<String,Object>();
                time16.put("value", DateUtil.getDate(hiddenDanger.getDealTime(),"yyyyå¹´MM月dd日 HH:mm:ss") );
                dataMap.put("thing17",thing17);
                dataMap.put("thing3",thing3);
                dataMap.put("thing13",thing13);
                dataMap.put("thing10",thing10);
                dataMap.put("time16",time16);
                paramMap.put("template_id", wxNoticeConfig.getTempId());
                paramMap.put("data", dataMap);
                for (String openId:openIds) {
                    paramMap.clear();
                    paramMap.put("touser", openId);
                    paramMap.put("data", dataMap);
                    String response = HttpsUtil.postJson(postUrL, JSONObject.toJSONString(paramMap));
                    if(StringUtils.isBlank(response)){
                        log.warn("·==++--·推送微信模板信息:{}·--++==·", "失败");
                    }else{
                        JSONObject json = JSONObject.parseObject(response);
                        log.warn("·==++--·推送微信模板信息:{}·--++==·", Constants.equalsInteger(json.getInteger("errcode"),Constants.ZERO)?"成功":"失败"+json.getString("errmsg"));
                    }
                }
            }
        }catch (Exception e){
        }
    }
    /**
     * ç”¨è½¦ç”³è¯· å®¡æ‰¹æƒ…况
     * @param wxNoticeConfigMapper
     * @param carUseBook
     * @param objCode  reservationSuccess,meetingCancel,meetingBeginA,meetingEndA
     * @param openIds
     * @param sendType 0=申请人;1=审批人
     */
    public void  sendCarUseBookTemplateNotice(WxNoticeConfigMapper wxNoticeConfigMapper, CarUseBook carUseBook, String objCode,String token,
                                              List<String> openIds,Integer sendType){
        try {
            if(CollectionUtils.isNotEmpty(openIds)){
                WxNoticeConfig wxNoticeConfig =  wxNoticeConfigMapper.selectOne(new QueryWrapper<WxNoticeConfig>().lambda().eq(WxNoticeConfig::getObjType,WxPlatConstants.visit)
                        .eq(WxNoticeConfig::getObjCode,objCode)
                        .eq(WxNoticeConfig::getStatus, Constants.ZERO)
                        .last(" limit 1")
                );
                if(Objects.isNull(wxNoticeConfig)){
                    return;
                }
                String postUrL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+token;
                //整体参数map
                Map<String, Object> paramMap = new HashMap<String, Object>();
                //消息主题显示相关map
                Map<String, Object> dataMap = new HashMap<String, Object>();
                //审批进度
                Map<String, Object> thing3 = new HashMap<String,Object>();
                if(Constants.equalsInteger(sendType,Constants.ONE)){
                    thing3.put("value","申请待您审批");
                }else{
                    if(Constants.equalsInteger(carUseBook.getStatus(),Constants.ZERO)){
                        thing3.put("value","申请提交成功待审核");
                    }else if(Constants.equalsInteger(carUseBook.getStatus(),Constants.TWO)){
                        thing3.put("value","申请已审核通过");
                    }else{
                        thing3.put("value","申请已被驳回");
                    }
                }
                //申请人
                Map<String, Object> thing1 = new HashMap<String,Object>();
                thing1.put("value", carUseBook.getMemberName());
                //车牌号
                Map<String, Object> car_number2 = new HashMap<String,Object>();
                car_number2.put("value",carUseBook.getCarCode());
                //目的地
                Map<String, Object> thing11 = new HashMap<String,Object>();
                thing11.put("value",carUseBook.getAddr());
                //用车时间
                Map<String, Object> time14 = new HashMap<String,Object>();
                time14.put("value", carUseBook.getPlanUseDate());
                dataMap.put("thing3",thing3);
                dataMap.put("car_number2",car_number2);
                dataMap.put("thing1",thing1);
                dataMap.put("thing11",thing11);
                dataMap.put("time14",time14);
                paramMap.put("template_id", wxNoticeConfig.getTempId());
                paramMap.put("data", dataMap);
                for (String openId:openIds) {
                    paramMap.clear();
                    paramMap.put("touser", openId);
                    paramMap.put("data", dataMap);
                    String response = HttpsUtil.postJson(postUrL, JSONObject.toJSONString(paramMap));
                    if(StringUtils.isBlank(response)){
                        log.warn("·==++--·推送微信模板信息:{}·--++==·", "失败");
                    }else{
                        JSONObject json = JSONObject.parseObject(response);
                        log.warn("·==++--·推送微信模板信息:{}·--++==·", Constants.equalsInteger(json.getInteger("errcode"),Constants.ZERO)?"成功":"失败"+json.getString("errmsg"));
                    }
                }
            }
        }catch (Exception e){
        }
    }
    /**
     * è½¦è¾†å…¥å›­ç”³è¯·  ç‰©æµè½¦
     * @param wxNoticeConfigMapper
     * @param platformBooks
     * @param objCode platformBookUpload,platformBookAuditSuccess,platformBookAuditFail,platformBookWaitAudit
     * @param token
     * @param openIds
     * @param sendType 0=申请人;1=审批人
     */
    public void  sendPlatformBookTemplateNotice(WxNoticeConfigMapper wxNoticeConfigMapper, PlatformBooks platformBooks, String objCode,String token,
                                       List<String> openIds,Integer sendType){
        try{
            if(CollectionUtils.isNotEmpty(openIds)){
                WxNoticeConfig wxNoticeConfig =  wxNoticeConfigMapper.selectOne(new QueryWrapper<WxNoticeConfig>().lambda().eq(WxNoticeConfig::getObjType,WxPlatConstants.visit)
                        .eq(WxNoticeConfig::getObjCode,objCode)
                        .eq(WxNoticeConfig::getStatus, Constants.ZERO)
                        .last(" limit 1")
                );
                if(Objects.isNull(wxNoticeConfig)){
                    return;
                }
                String postUrL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+token;
                //整体参数map
                Map<String, Object> paramMap = new HashMap<String, Object>();
                //消息主题显示相关map
                Map<String, Object> dataMap = new HashMap<String, Object>();
                //审核状态
                Map<String, Object> const9 = new HashMap<String,Object>();
                if(Constants.equalsInteger(sendType,Constants.ONE)){
                    const9.put("value","申请待您审批");
                }else{
                    if(Constants.equalsInteger(platformBooks.getStatus(),Constants.ZERO)){
                        const9.put("value","申请提交成功待审核");
                    }else if(Constants.equalsInteger(platformBooks.getStatus(),Constants.TWO)){
                        const9.put("value","申请已审核通过");
                    }else{
                        const9.put("value","申请已被驳回");
                    }
                }
                //车牌号
                Map<String, Object> car_number3 = new HashMap<String,Object>();
                car_number3.put("value", platformBooks.getCarCodeFront());
                //业务类型
                Map<String, Object> phrase4 = new HashMap<String,Object>();
                phrase4.put("value", platformBooks.getInReason());
                //申请人
                Map<String, Object> thing8 = new HashMap<String,Object>();
                thing8.put("value", platformBooks.getDriverName());
                //时间
                Map<String, Object> time4 = new HashMap<String,Object>();
                time4.put("value", DateUtil.getDate(platformBooks.getArriveDate(),"yyyyå¹´MM月dd日 HH:mm:ss") );
                dataMap.put("const9",const9);
                dataMap.put("car_number3",car_number3);
                dataMap.put("phrase4",phrase4);
                dataMap.put("thing8",thing8);
                dataMap.put("time4",time4);
                paramMap.put("data", dataMap);
                for (String openId:openIds) {
                    paramMap.clear();
                    paramMap.put("template_id", wxNoticeConfig.getTempId());
                    paramMap.put("touser", openId);
                    paramMap.put("data", dataMap);
                    String response = HttpsUtil.postJson(postUrL, JSONObject.toJSONString(paramMap));
                    if(StringUtils.isBlank(response)){
                        log.warn("·==++--·推送微信模板信息:{}·--++==·", "失败");
                    }else{
                        JSONObject json = JSONObject.parseObject(response);
                        log.warn("·==++--·推送微信模板信息:{}·--++==·", Constants.equalsInteger(json.getInteger("errcode"),Constants.ZERO)?"成功":"失败"+json.getString("errmsg"));
                    }
                }
            }
        }catch (Exception e){
        }
    }
    /**
     * Wms ä»»åŠ¡ä¸‹è¾¾é€šçŸ¥
     * @param wxNoticeConfigMapper
     * @param platformJob
     * @param objCode   platformJobNewJob
     * @param openIds
     */
    public void  sendWmsTemplateNotice(WxNoticeConfigMapper wxNoticeConfigMapper, PlatformJob platformJob, String objCode,String token,
                                               List<String> openIds){
        try{
            if(CollectionUtils.isNotEmpty(openIds)){
                WxNoticeConfig wxNoticeConfig =  wxNoticeConfigMapper.selectOne(new QueryWrapper<WxNoticeConfig>().lambda().eq(WxNoticeConfig::getObjType,WxPlatConstants.visit)
                        .eq(WxNoticeConfig::getObjCode,objCode)
                        .eq(WxNoticeConfig::getStatus, Constants.ZERO)
                        .last(" limit 1")
                );
                if(Objects.isNull(wxNoticeConfig)){
                    return;
                }
                String postUrL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+token;
                //整体参数map
                Map<String, Object> paramMap = new HashMap<String, Object>();
                //消息主题显示相关map
                Map<String, Object> dataMap = new HashMap<String, Object>();
                //运单编号
                Map<String, Object> character_string1 = new HashMap<String,Object>();
                character_string1.put("value",platformJob.getBillCode());
                //司机
                Map<String, Object> thing3 = new HashMap<String,Object>();
                thing3.put("value", platformJob.getDriverName());
                //下达时间
                Map<String, Object> time4 = new HashMap<String,Object>();
                time4.put("value", DateUtil.getDate(platformJob.getCreateDate(),"yyyyå¹´MM月dd日 HH:mm:ss") );
                dataMap.put("character_string1",character_string1);
                dataMap.put("thing3",thing3);
                dataMap.put("time4",time4);
                paramMap.put("data", dataMap);
                for (String openId:openIds) {
                    paramMap.clear();
                    paramMap.put("template_id", wxNoticeConfig.getTempId());
                    paramMap.put("touser", openId);
                    paramMap.put("data", dataMap);
                    String response = HttpsUtil.postJson(postUrL, JSONObject.toJSONString(paramMap));
                    if(StringUtils.isBlank(response)){
                        log.warn("·==++--·推送微信模板信息:{}·--++==·", "失败");
                    }else{
                        JSONObject json = JSONObject.parseObject(response);
                        log.warn("·==++--·推送微信模板信息:{}·--++==·", Constants.equalsInteger(json.getInteger("errcode"),Constants.ZERO)?"成功":"失败"+json.getString("errmsg"));
                    }
                }
            }
        }catch (Exception e){
        }
    }
    /**
     * Wms ä»»åŠ¡å–æ¶ˆé€šçŸ¥
     * @param wxNoticeConfigMapper
     * @param platformJob
     * @param objCode   platformJobNewJob
     * @param openIds
     */
    public void  sendWmsCancelTemplateNotice(WxNoticeConfigMapper wxNoticeConfigMapper, PlatformJob platformJob, String objCode,String token,
                                       List<String> openIds){
        try{
            if(CollectionUtils.isNotEmpty(openIds)){
                WxNoticeConfig wxNoticeConfig =  wxNoticeConfigMapper.selectOne(new QueryWrapper<WxNoticeConfig>().lambda().eq(WxNoticeConfig::getObjType,WxPlatConstants.visit)
                        .eq(WxNoticeConfig::getObjCode,objCode)
                        .eq(WxNoticeConfig::getStatus, Constants.ZERO)
                        .last(" limit 1")
                );
                if(Objects.isNull(wxNoticeConfig)){
                    return;
                }
                String postUrL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+token;
                //整体参数map
                Map<String, Object> paramMap = new HashMap<String, Object>();
                //消息主题显示相关map
                Map<String, Object> dataMap = new HashMap<String, Object>();
                //任务单号
                Map<String, Object> character_string1 = new HashMap<String,Object>();
                character_string1.put("value",platformJob.getBillCode());
                //取消时间
                Map<String, Object> time6 = new HashMap<String,Object>();
                time6.put("value", DateUtil.getDate(new Date(),"yyyyå¹´MM月dd日 HH:mm:ss") );
                dataMap.put("character_string1",character_string1);
                dataMap.put("time6",time6);
                paramMap.put("data", dataMap);
                for (String openId:openIds) {
                    paramMap.clear();
                    paramMap.put("template_id", wxNoticeConfig.getTempId());
                    paramMap.put("touser", openId);
                    paramMap.put("data", dataMap);
                    String response = HttpsUtil.postJson(postUrL, JSONObject.toJSONString(paramMap));
                    if(StringUtils.isBlank(response)){
                        log.warn("·==++--·推送微信模板信息:{}·--++==·", "失败");
                    }else{
                        JSONObject json = JSONObject.parseObject(response);
                        log.warn("·==++--·推送微信模板信息:{}·--++==·", Constants.equalsInteger(json.getInteger("errcode"),Constants.ZERO)?"成功":"失败"+json.getString("errmsg"));
                    }
                }
            }
        }catch (Exception e){
        }
    }
    /**
     * æœˆå°ä½œä¸š
     * @param wxNoticeConfigMapper
     * @param platformJob
     * @param objCode platformJobCallIn,platformJobSingIn,platformJobOverNum,platformJobWorking,platformJobFinish,platformJobLevelPower,platformJobMove,platformJobError,platformJobTimeOut,platformJobStopErr
     * @param token
     * @param openIds
     */
    public void  sendPlatformJobTemplateNotice(WxNoticeConfigMapper wxNoticeConfigMapper, PlatformJob platformJob, String objCode,String token,
                                       List<String> openIds){
        try{
            if(CollectionUtils.isNotEmpty(openIds)){
                WxNoticeConfig wxNoticeConfig =  wxNoticeConfigMapper.selectOne(new QueryWrapper<WxNoticeConfig>().lambda().eq(WxNoticeConfig::getObjType,WxPlatConstants.visit)
                        .eq(WxNoticeConfig::getObjCode,objCode)
                        .eq(WxNoticeConfig::getStatus, Constants.ZERO)
                        .last(" limit 1")
                );
                if(Objects.isNull(wxNoticeConfig)){
                    return;
                }
                String postUrL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+token;
                //整体参数map
                Map<String, Object> paramMap = new HashMap<String, Object>();
                //消息主题显示相关map
                Map<String, Object> dataMap = new HashMap<String, Object>();
                //月台通知
                Map<String, Object> const6 = new HashMap<String,Object>();
                const6.put("value",wxNoticeConfig.getTitile());
                //车牌号
                Map<String, Object> character_string1 = new HashMap<String,Object>();
                character_string1.put("value",platformJob.getCarCodeFront());
                //月台号
                Map<String, Object> thing3 = new HashMap<String,Object>();
                thing3.put("value", platformJob.getPlatformName());
                //时间
                Map<String, Object> time4 = new HashMap<String,Object>();
                time4.put("value", DateUtil.getDate(new Date(),"yyyyå¹´MM月dd日 HH:mm:ss") );
                dataMap.put("const6",const6);
                dataMap.put("character_string1",character_string1);
                dataMap.put("thing3",thing3);
                dataMap.put("time4",time4);
                paramMap.put("data", dataMap);
                for (String openId:openIds) {
                    paramMap.clear();
                    paramMap.put("template_id", wxNoticeConfig.getTempId());
                    paramMap.put("touser", openId);
                    paramMap.put("data", dataMap);
                    String response = HttpsUtil.postJson(postUrL, JSONObject.toJSONString(paramMap));
                    if(StringUtils.isBlank(response)){
                        log.warn("·==++--·推送微信模板信息:{}·--++==·", "失败");
                    }else{
                        JSONObject json = JSONObject.parseObject(response);
                        log.warn("·==++--·推送微信模板信息:{}·--++==·", Constants.equalsInteger(json.getInteger("errcode"),Constants.ZERO)?"成功":"失败"+json.getString("errmsg"));
                    }
                }
            }
        }catch (Exception e){
        }
    }
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/PlatformLogMapper.java
@@ -2,11 +2,12 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.business.model.PlatformLog;
import com.github.yulichang.base.MPJBaseMapper;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2024/06/28 10:03
 */
public interface PlatformLogMapper extends BaseMapper<PlatformLog> {
public interface PlatformLogMapper extends MPJBaseMapper<PlatformLog> {
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/PlatformWmsJobMapper.java
@@ -2,11 +2,12 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.business.model.PlatformWmsJob;
import com.github.yulichang.base.MPJBaseMapper;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2024/06/28 10:03
 */
public interface PlatformWmsJobMapper extends BaseMapper<PlatformWmsJob> {
public interface PlatformWmsJobMapper extends MPJBaseMapper<PlatformWmsJob> {
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformJob.java
@@ -43,6 +43,8 @@
    @ApiModelProperty(value = "是否删除0否 1是", example = "1")
    private Integer isdeleted;
    @ApiModelProperty(value = "作业来源:0自建 1wms推送", example = "1")
    private Integer origin;
    @ApiModelProperty(value = "名称")
    private String name;
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformWmsDetail.java
@@ -77,7 +77,9 @@
    @ApiModelProperty(value = "供应商")
    @ExcelColumn(name="供应商")
    private String inRepertotyCode;
    @ApiModelProperty(value = "收货地")
    @ExcelColumn(name="收货地")
    private String repertotyAddress;
    @ApiModelProperty(value = "计划收货数量", example = "1")
    @ExcelColumn(name="计划收货数量")
    private BigDecimal ioQty;
@@ -98,7 +100,7 @@
    @ApiModelProperty(value = "作业完成时间(最终时间)")
    @TableField(exist = false)
    private Date doneDate;
    @ApiModelProperty(value = "计划收货数量(非wms)", example = "1")
    @ApiModelProperty(value = "承运单号", example = "1")
    @TableField(exist = false)
    private BigDecimal ortherIoQty;
    private String carryBillCode;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformWmsJob.java
@@ -51,6 +51,9 @@
    @ApiModelProperty(value = "是否删除0否 1是", example = "1")
    @ExcelColumn(name="是否删除0否 1是")
    private Integer isdeleted;
//    @ApiModelProperty(value = "作业来源:0自建 1wms推送", example = "1")
//    @ExcelColumn(name="作业来源:0自建 1wms推送")
//    private Integer origin;
    @ApiModelProperty(value = "备注")
    @ExcelColumn(name="备注")
@@ -75,7 +78,9 @@
    @ApiModelProperty(value = "司机姓名")
    @ExcelColumn(name="司机姓名")
    private String driverName;
    @ApiModelProperty(value = "收货地")
    @ExcelColumn(name="收货地")
    private String repertotyAddress;
    @ApiModelProperty(value = "承运商")
    @ExcelColumn(name="承运商")
    private String carrierName;
@@ -104,10 +109,6 @@
    @ApiModelProperty(value = "车牌号")
    @ExcelColumn(name="车牌号")
    private String plateNumber;
    @ApiModelProperty(value = "收货地")
    @ExcelColumn(name="收货地")
    private String repertotyAddress;
    @ApiModelProperty(value = "合同号`")
    @ExcelColumn(name="合同号`")
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/CarsJobAndContractDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.doumee.dao.web.reqeust;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2024/1/4 16:17
 */
@Data
public class CarsJobAndContractDTO {
    @ApiModelProperty(value = "车牌号")
    private String carCode;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/ErpVisitDTO.java
@@ -1,6 +1,5 @@
package com.doumee.dao.web.reqeust;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.core.haikang.model.param.BaseRequst;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
@@ -8,7 +7,6 @@
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.Date;
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/platformReport/AlarmEventDataVO.java
@@ -26,7 +26,7 @@
    @ApiModelProperty(value = "报警源资源名称")
    private String resourceName;
    @ApiModelProperty(value = "报警状态")
    private String handleStatus;
    private Integer handleStatus;
    @ApiModelProperty(value = "报警类型名称")
    private String alarmTypeName;
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/platformReport/BoardCarsListVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.doumee.dao.web.response.platformReport;
import com.doumee.core.haikang.model.cars.response.CarsDeviceDetaisResponse;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * è¿è¾“量
 *
 * @Author : Rk
 * @create 2024/10/25 10:59
 */
@Data
public class BoardCarsListVO {
    @ApiModelProperty(value = "车辆及经纬度信息")
    private List<CarsDeviceDetaisResponse> carsList;
    @ApiModelProperty(value = "在途数量")
    private int busyNum;
    @ApiModelProperty(value = "空闲数量")
    private int idleNum;
    @ApiModelProperty(value = "离线数量")
    private int offlineNum;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/platformReport/BoardJobCenterDataVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.doumee.dao.web.response.platformReport;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * è¿è¾“量
 *
 * @Author : Rk
 * @create 2024/10/25 10:59
 */
@Data
public class BoardJobCenterDataVO {
    @ApiModelProperty(value = "在途数量")
    private int busyNum;
    @ApiModelProperty(value = "空闲数量")
    private int idleNum;
    @ApiModelProperty(value = "离线数量")
    private int offlineNum;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/platformReport/BoardStockListVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.doumee.dao.web.response.platformReport;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
 * é€šç”¨
 *
 * @Author : Rk
 * @create 2024/10/25 10:59
 */
@Data
public class BoardStockListVO {
    @ApiModelProperty(value = "库存明细集合")
    private List<GeneralVO> stockList;
    @ApiModelProperty(value = "区域库存汇总集合")
    private List<GeneralVO> areaTotalList;
    @ApiModelProperty(value = "库存已利用")
    private BigDecimal num;
    @ApiModelProperty(value = "库存利用率")
    private BigDecimal useRate;
    @ApiModelProperty(value = "库存总量")
    private BigDecimal totalNum;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/platformReport/CarmeraListVO.java
@@ -1,13 +1,7 @@
package com.doumee.dao.web.response.platformReport;
import com.doumee.core.haikang.model.param.respose.PageRegionInfoResponse;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
 * ç›‘控点集合
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/platformReport/CarsContractVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.doumee.dao.web.response.platformReport;
import com.doumee.dao.business.model.PlatformLog;
import com.doumee.dao.business.model.PlatformWmsDetail;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
 * è¿è¾“量
 *
 * @Author : Rk
 * @create 2024/10/25 10:59
 */
@Data
public class CarsContractVO {
    @ApiModelProperty(value = "物料清单")
    private List<PlatformWmsDetail> detailList;
    @ApiModelProperty(value = "合同号")
    private String ioCode;
    @ApiModelProperty(value ="收货地")
    private String address;
    @ApiModelProperty(value = "运输总量")
    private BigDecimal totalNum;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/platformReport/CarsJobAndContractVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.doumee.dao.web.response.platformReport;
import com.doumee.dao.business.model.PlatformLog;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
 * è¿è¾“量
 *
 * @Author : Rk
 * @create 2024/10/25 10:59
 */
@Data
public class CarsJobAndContractVO {
    @ApiModelProperty(value = "作业记录集合")
    private List<PlatformLog> logList;
    @ApiModelProperty(value = "合同列表")
    private List<CarsContractVO> contractList;
    @ApiModelProperty(value = "司机手机号")
    private String phone;
    @ApiModelProperty(value = "司机姓名")
    private String name;
    @ApiModelProperty(value = "运输单号")
    private String billCode;
    @ApiModelProperty(value = "运输总量")
    private BigDecimal totalNum;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/platformReport/PlatformJobRunBoardNewVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,93 @@
package com.doumee.dao.web.response.platformReport;
import com.doumee.dao.business.model.PlatformJob;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
 * å›­åŒºç‰©æµè¿è¡Œè°ƒåº¦çœ‹æ¿
 *
 * @Author : Rk
 * @create 2024/10/25 9:54
 */
@Data
public class PlatformJobRunBoardNewVO {
    @ApiModelProperty(value = "累计出库量 - æœ¬æœˆ")
    private BigDecimal monthOutTotal;
    @ApiModelProperty(value = "累计出库量月度 - ä¸Šæœˆ")
    private BigDecimal monthLastOutTotal;
    @ApiModelProperty(value = "累计出库量 - æœ¬å¹´")
    private BigDecimal yearOutTotal;
    @ApiModelProperty(value = "累计出库量年度 - å޻年")
    private BigDecimal yearLastOutTotal;
    @ApiModelProperty(value = "累计出库车次 - æœ¬æœˆ")
    private Integer monthOutTimes;
    @ApiModelProperty(value = "累计出库车次 - æœ¬å¹´")
    private Integer yearOutTimes;
    @ApiModelProperty(value = "出库任务 - å½“前任务量")
    private BigDecimal currentOutNum;
    @ApiModelProperty(value = "出库任务 - å½“前完成任务量")
    private BigDecimal currentOutDoneNum;
    @ApiModelProperty(value = "入库任务 - å½“前任务量")
    private BigDecimal currentInNum;
    @ApiModelProperty(value = "入库任务 - å½“前完成任务量")
    private BigDecimal currentInDoneNum;
    @ApiModelProperty(value = "今日出库效率")
    private BigDecimal todayOutRate;
    @ApiModelProperty(value = "本月出库效率")
    private BigDecimal monthOutRate;
    @ApiModelProperty(value = "今日入库效率")
    private BigDecimal todayInRate;
    @ApiModelProperty(value = "本月入库效率")
    private BigDecimal monthInRate;
    @ApiModelProperty(value = "库存最大值")
    private BigDecimal stockMax;
    @ApiModelProperty(value = "当前库存")
    private BigDecimal stockTotal;
    @ApiModelProperty(value = "运输任务分析 - 7日" , hidden = true)
    private List<TransportMeasureVO> transportMeasureWeekList;
    @ApiModelProperty(value = "运输任务分析 - æœˆåº¦", hidden = true)
    private List<TransportMeasureVO> transportMeasureMonthList;
    @ApiModelProperty(value = "运输任务分析 - å¹´åº¦", hidden = true)
    private List<TransportMeasureVO> transportMeasureYearList;
    @ApiModelProperty(value = "当日运输任务")
    private List<PlatformJob> platformJobList;
    @ApiModelProperty(value = "出库任务")
    private JobDataVO outJob;
    @ApiModelProperty(value = "入库任务")
    private JobDataVO inJob;
    @ApiModelProperty(value = "今日入库量统计")
    private List<GeneralVO> totalInList;
    @ApiModelProperty(value = "库存情况")
    private List<GeneralVO> stockList;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/platformReport/RegionTreeVO.java
@@ -1,13 +1,9 @@
package com.doumee.dao.web.response.platformReport;
import com.doumee.config.DataSyncConfig;
import com.doumee.core.haikang.model.param.respose.PageRegionInfoResponse;
import com.doumee.dao.business.model.Company;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/platformReport/TransportMeasureVO.java
@@ -4,6 +4,7 @@
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
 * è¿è¾“量
@@ -24,6 +25,8 @@
    private Integer planTimes;
    @ApiModelProperty(value = "日期")
    private String planDate;
    private Date planDate;
    @ApiModelProperty(value = "日期Str")
    private String planDateStr;
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/DeviceService.java
@@ -1,7 +1,5 @@
package com.doumee.service.business;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.doumee.core.haikang.model.param.request.AcsDeviceListRequest;
import com.doumee.core.haikang.model.param.request.TransparentChannelSingleRequest;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/ext/ERPSyncService.java
@@ -1,9 +1,6 @@
package com.doumee.service.business.ext;
import com.doumee.core.erp.model.openapi.request.erp.*;
import com.doumee.core.erp.model.openapi.response.erp.ApproveInfoResponse;
import com.doumee.core.haikang.model.param.request.AcsDeviceListRequest;
import com.doumee.core.haikang.model.param.request.PrivilegeGroupRequest;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.erp.model.openapi.request.*;
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/ext/HkSyncService.java
@@ -26,6 +26,7 @@
     * @return
     */
    String syncHkDevices(Device param);
    String syncHkNotices(String username);
    /**
     * åŒæ­¥æµ·åº·åœè½¦åº“
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/ApproveServiceImpl.java
@@ -15,6 +15,8 @@
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.SmsConstants;
import com.doumee.core.utils.Utils;
import com.doumee.core.wx.wxPlat.WxPlatConstants;
import com.doumee.core.wx.wxPlat.WxPlatNotice;
import com.doumee.dao.business.*;
import com.doumee.dao.business.dao.CompanyMapper;
import com.doumee.dao.business.dao.SmsConfigMapper;
@@ -65,6 +67,8 @@
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Autowired
    private WxNoticeConfigMapper wxNoticeConfigMapper;
    @Autowired
    private ApproveTemplMapper approveTemplMapper;
@@ -484,7 +488,7 @@
        approveList.add(createUserApprove);
        //查询所有待处理人
        String token = systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_ACCESS_TOKEN).getCode();
        //审批业务数据
        for (int i = 0; i < approveParamList.size(); i++) {
            ApproveParam approveParam = approveParamList.get(i);
@@ -567,6 +571,7 @@
                approve.setType(Constants.ZERO);
                approveList.add(approve);
                WxPlatNotice wxPlatNotice = new WxPlatNotice();
                if(Constants.equalsInteger(approve.getStatus(),Constants.ONE) && StringUtils.isNotBlank(member.getPhone())){
                    //发送短信通知
                    if(Constants.equalsInteger(noticeType,Constants.noticesObjectType.reason)){
@@ -576,13 +581,32 @@
                                SmsConstants.platformBookContent.platformBookWaitAudit,
                                null,Arrays.asList(member.getPhone().split(","))
                        );
                        //公众号通知
                        if(StringUtils.isNotBlank(member.getOpenid())){
                            wxPlatNotice.sendPlatformBookTemplateNotice(
                                    wxNoticeConfigMapper,
                                    platformBooksMapper.selectById(businessId),
                                    WxPlatConstants.platformBookContent.platformBookWaitAudit,
                                    token,
                                    Arrays.asList(member.getOpenid().split(",")),
                                    Constants.ONE);
                        }
                    }else if(Constants.equalsInteger(noticeType,Constants.noticesObjectType.visit)){
                        //访客申请
                        //短信通知
                        SmsEmailServiceImpl.sendVisitSms(systemDictDataBiz,
                                emayService,smsEmailMapper,smsConfigMapper,visitsMapper,businessId,
                                SmsConstants.visitContent.visitNotice,
                                null,Arrays.asList(member.getPhone().split(","))
                        );
                        //公众号通知
                        if(StringUtils.isNotBlank(member.getOpenid())){
                            wxPlatNotice.sendVisitTemplateNotice(
                                    wxNoticeConfigMapper,visitsMapper.selectById(businessId), WxPlatConstants.visitContent.visitWaitAudit,
                                    token,
                                    Arrays.asList(member.getOpenid().split(","))
                            );
                        }
                    }else if(Constants.equalsInteger(noticeType,Constants.noticesObjectType.visitReporting)){
                        //访客报备
                        SmsEmailServiceImpl.sendVisitReportSms(systemDictDataBiz,
@@ -590,6 +614,14 @@
                                SmsConstants.visitReportingContent.visitReportingNotice,
                                null,Arrays.asList(member.getPhone().split(","))
                        );
                        //公众号通知
                        if(StringUtils.isNotBlank(member.getOpenid())){
                            wxPlatNotice.sendVisitTemplateNotice(
                                    wxNoticeConfigMapper,visitsMapper.selectById(businessId), WxPlatConstants.visitReportContent.visitReportWaitAudit,
                                    token,
                                    Arrays.asList(member.getOpenid().split(","))
                            );
                        }
                    }else if(Constants.equalsInteger(noticeType,Constants.noticesObjectType.useCar)){
                        //用车申请
                        SmsEmailServiceImpl.sendCarUseSms(systemDictDataBiz,
@@ -597,6 +629,16 @@
                                SmsConstants.carUseBookContent.carUseBookWaitAudit,
                                null,Arrays.asList(member.getPhone().split(","))
                        );
                        //公众号通知
                        if(StringUtils.isNotBlank(member.getOpenid())){
                            wxPlatNotice.sendCarUseBookTemplateNotice(
                                    wxNoticeConfigMapper,
                                    carUseBookMapper.selectById(businessId),
                                    WxPlatConstants.carUseBookContent.carUseBookWaitAudit,
                                    token,
                                    Arrays.asList(member.getOpenid().split(",")),
                                    Constants.ONE);
                        }
                    }
                }
@@ -1502,6 +1544,7 @@
    public void dealBusinessData(ApproveDTO approveDTO,Approve approve){
        WxPlatNotice wxPlatNotice = new WxPlatNotice();
        if(approveDTO.getObjType().equals(Constants.approveObjectType.unConstructionVisit)
                ||approveDTO.getObjType().equals(Constants.approveObjectType.constructionVisit)
                ||approveDTO.getObjType().equals(Constants.approveObjectType.visitReporting)){
@@ -1571,6 +1614,7 @@
                }
            }
            //访客报备
            String objCode = "";
            if(approveDTO.getObjType().equals(Constants.approveObjectType.visitReporting)){
                //发送短信通知
                SmsEmailServiceImpl.sendVisitReportSms(systemDictDataBiz,
@@ -1579,6 +1623,9 @@
                                SmsConstants.visitReportingContent.visitReportingAuditFail,
                        approveDTO.getCheckInfo(),null
                );
                objCode =  Constants.equalsInteger(approveDTO.getStatus(),Constants.TWO)? WxPlatConstants.visitReportContent.visitReportAuditSuccess:WxPlatConstants.visitReportContent.visitReportAuditFail;
            }else{ //访客申请
                //发送短信通知
                SmsEmailServiceImpl.sendVisitSms(systemDictDataBiz,
@@ -1587,15 +1634,28 @@
                                SmsConstants.visitContent.visitAuditFail,
                        approveDTO.getCheckInfo(),null
                );
                objCode =  Constants.equalsInteger(approveDTO.getStatus(),Constants.TWO)? WxPlatConstants.visitContent.visitAuditSuccess:WxPlatConstants.visitContent.visitAuditFail;
            }
            visitsMapper.updateById(visits);
            //发送微信公众号
            if(StringUtils.isNotBlank(objCode)){
                Member member = memberMapper.selectById(visits.getCreateMemberId());
                if(Objects.nonNull(member) && StringUtils.isNotBlank(member.getOpenid())){
                    wxPlatNotice.sendVisitTemplateNotice(
                            wxNoticeConfigMapper,visits, objCode,
                            systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_ACCESS_TOKEN).getCode(),
                            Arrays.asList(member.getOpenid().split(","))
                    );
                }
            }
            visitsMapper.updateById(visits);
        }else if(approveDTO.getObjType().equals(Constants.approveObjectType.cityUseCar)||approveDTO.getObjType().equals(
                Constants.approveObjectType.unCityUseCar)){
            this.updDriver(approveDTO,approve,true);
            CarUseBook carUseBook = carUseBookJoinMapper.selectById(approveDTO.getObjId());
            if(Objects.nonNull(carUseBook)){
                Member member = memberMapper.selectById(carUseBook.getMemberId());
                //发送通知短息
                if(Objects.nonNull(member)&&StringUtils.isNotBlank(member.getPhone())){
                    SmsEmailServiceImpl.sendCarUseSms(systemDictDataBiz,
                            emayService,smsEmailMapper,smsConfigMapper,carUseBookMapper,approveDTO.getObjId(),
@@ -1603,6 +1663,14 @@
                                    SmsConstants.carUseBookContent.carUseBookAuditFail,
                            approveDTO.getCheckInfo(),Arrays.asList(member.getPhone().split(","))
                    );
                }
                if(StringUtils.isNotBlank(member.getOpenid())){
                    //发送微信公众号通知
                    wxPlatNotice.sendCarUseBookTemplateNotice(
                            wxNoticeConfigMapper,carUseBook,
                            Constants.equalsInteger(approveDTO.getStatus(),Constants.TWO)?WxPlatConstants.carUseBookContent.carUseBookAuditSuccess: WxPlatConstants.carUseBookContent.carUseBookAuditFail,
                            systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_ACCESS_TOKEN).getCode(),
                            Arrays.asList(member.getOpenid().split(",")),0);
                }
            }
@@ -1661,7 +1729,16 @@
                    approveDTO.getCheckInfo(),null
            );
            //TODO å‘送微信公众号消息
            //发送微信公众号消息
            Member member = memberMapper.selectById(platformBooks.getDriverId() );
            if(Objects.nonNull(member) && StringUtils.isNotBlank(member.getOpenid())){
                //发送微信公众号通知
                wxPlatNotice.sendPlatformBookTemplateNotice(
                        wxNoticeConfigMapper,platformBooks,
                        Constants.equalsInteger(approveDTO.getStatus(),Constants.TWO)?WxPlatConstants.platformBookContent.platformBookAuditSuccess: WxPlatConstants.platformBookContent.platformBookAuditFail,
                        systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_ACCESS_TOKEN).getCode(),
                        Arrays.asList(member.getOpenid().split(",")),0);
            }
        }else{
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CarUseBookServiceImpl.java
@@ -7,6 +7,8 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.*;
import com.doumee.core.wx.wxPlat.WxPlatConstants;
import com.doumee.core.wx.wxPlat.WxPlatNotice;
import com.doumee.dao.business.*;
import com.doumee.dao.business.dao.SmsConfigMapper;
import com.doumee.dao.business.dao.SmsEmailMapper;
@@ -16,6 +18,8 @@
import com.doumee.dao.business.vo.ApproveDataVO;
import com.doumee.dao.business.vo.DateIntervalVO;
import com.doumee.dao.system.join.NoticesJoinMapper;
import com.doumee.dao.system.model.Notices;
import com.doumee.dao.system.model.SystemDictData;
import com.doumee.service.business.ApproveService;
import com.doumee.service.business.CarUseBookService;
@@ -61,6 +65,9 @@
    private ApproveJoinMapper approveJoinMapper;
    @Autowired
    private NoticesJoinMapper noticesJoinMapper;
    @Autowired
    private ApproveService approveService;
    @Autowired
@@ -78,6 +85,9 @@
    @Autowired
    private EmayService emayService;
    @Autowired
    private WxNoticeConfigMapper wxNoticeConfigMapper;
    @Override
    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
@@ -132,6 +142,18 @@
        carUseBookMapper.insert(carUseBook);
        //用车申请 å®¡æ‰¹è®°å½•创建
        approveService.createApproveFlow(carUseBook.getType()==0?3:4,carUseBook.getId(),carUseBook.getMemberId());
        //发送微信公众号通知
        //发送微信公众号通知
        WxPlatNotice wxPlatNotice = new WxPlatNotice();
        Member member = memberMapper.selectById(carUseBook.getMemberId());
        if(Objects.nonNull(member) && StringUtils.isNotBlank(member.getOpenid())){
            wxPlatNotice.sendCarUseBookTemplateNotice(
                    wxNoticeConfigMapper,carUseBook,
                    WxPlatConstants.carUseBookContent.carUseBookUpload,
                    systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_ACCESS_TOKEN).getCode(),
                    Arrays.asList(member.getOpenid().split(",")),0);
        }
        return carUseBook.getId();
    }
@@ -474,6 +496,15 @@
               .in(Approve::getObjType,Constants.approveObjectType.cityUseCar,Constants.approveObjectType.unCityUseCar)
                .eq(Approve::getObjId,id)
        );
        //处理待办信息
        noticesJoinMapper.update(null,new UpdateWrapper<Notices>().lambda()
                .set(Notices::getStatus,Constants.ONE)
                .eq(Notices::getType,Constants.TWO)
                .eq(Notices::getObjId,carUseBook.getId())
        );
        Member member = memberMapper.selectById(carUseBook.getMemberId());
        if(Objects.nonNull(member)&&StringUtils.isNotBlank(member.getPhone())){
            //用车申请取消
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceServiceImpl.java
@@ -1,13 +1,10 @@
package com.doumee.service.business.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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.BaseResponse;
import com.doumee.core.haikang.model.param.request.*;
import com.doumee.core.haikang.model.param.request.TransparentChannelSingleRequest;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
@@ -22,7 +19,6 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.doumee.service.business.impl.hksync.HkSyncPushServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/HiddenDangerServiceImpl.java
@@ -15,6 +15,8 @@
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.SmsConstants;
import com.doumee.core.utils.Utils;
import com.doumee.core.wx.wxPlat.WxPlatConstants;
import com.doumee.core.wx.wxPlat.WxPlatNotice;
import com.doumee.dao.business.*;
import com.doumee.dao.business.dao.SmsConfigMapper;
import com.doumee.dao.business.dao.SmsEmailMapper;
@@ -76,6 +78,9 @@
    @Autowired
    private EmayService emayService;
    @Autowired
    private WxNoticeConfigMapper wxNoticeConfigMapper;
    @Override
    public Integer create(HiddenDanger hiddenDanger) {
@@ -91,6 +96,10 @@
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        hiddenDanger.setMemberId(hiddenDanger.getLoginUserInfo().getMemberId());
        Member createMember = memberMapper.selectById(hiddenDanger.getMemberId());
        if(Objects.isNull(createMember)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到创建人信息");
        }
        hiddenDanger.setIsdeleted(Constants.ZERO);
        hiddenDanger.setCreateDate(new Date());
        hiddenDanger.setEditDate(new Date());
@@ -181,6 +190,7 @@
        noticesJoinMapper.insert(notices);
        WxPlatNotice wxPlatNotice = new WxPlatNotice();
        if(Objects.nonNull(member) && StringUtils.isNotBlank(member.getPhone())){
            //发送短信通知
            SmsEmailServiceImpl.sendHiddenDangerSms(systemDictDataBiz,
@@ -190,7 +200,22 @@
            );
        }
        //提交人的微信公众号通知
        if(Objects.nonNull(createMember)&&StringUtils.isNotBlank(createMember.getOpenid())){
            wxPlatNotice.sendHiddenDangerUploadTemplateNotice(
                    wxNoticeConfigMapper,hiddenDanger,
                    WxPlatConstants.hiddenDangerContent.hiddenDangerUpload,
                    systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_ACCESS_TOKEN).getCode(),
                    Arrays.asList(createMember.getOpenid().split(",")));
        }
        //处理人的微信公众号通知
        if(Objects.nonNull(member)&&StringUtils.isNotBlank(member.getOpenid())){
            wxPlatNotice.sendHiddenDangerUploadTemplateNotice(
                    wxNoticeConfigMapper,hiddenDanger,
                    WxPlatConstants.hiddenDangerContent.hiddenDangerUpload,
                    systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_ACCESS_TOKEN).getCode(),
                    Arrays.asList(member.getOpenid().split(",")));
        }
        return hiddenDanger.getId();
    }
@@ -244,7 +269,7 @@
                .leftJoin(Member.class,Member::getId,HiddenDanger::getCheckUserId)
                .leftJoin(HiddenDangerParam.class,HiddenDangerParam::getId,HiddenDanger::getCateId)
                .leftJoin("company t4 on t1.company_id=t4.id")
                .leftJoin("company t5 on t3.company_id=t5.id");
                .leftJoin("company t5 on t2.company_id=t5.id");
        queryWrapper
                .eq(HiddenDanger::getId, id).last("limit 1");
@@ -326,7 +351,7 @@
                .leftJoin(Member.class,Member::getId,HiddenDanger::getCheckUserId)
                .leftJoin(HiddenDangerParam.class,HiddenDangerParam::getId,HiddenDanger::getCateId)
                .leftJoin("company t4 on t1.company_id=t4.id")
                .leftJoin("company t5 on t3.company_id=t5.id");
                .leftJoin("company t5 on t2.company_id=t5.id");
        //数据权限开始--------------------start----------------
        LoginUserInfo userInfo =pageWrap.getModel().getLoginUserInfo();
@@ -429,10 +454,17 @@
                        Arrays.asList(member.getPhone().split(","))
                );
            }
        }
        Member createMember = memberMapper.selectById(hiddenDanger.getMemberId());
        //处理人的微信公众号通知
        if(Objects.nonNull(createMember)&&StringUtils.isNotBlank(createMember.getOpenid())){
            WxPlatNotice wxPlatNotice = new WxPlatNotice();
            wxPlatNotice.sendHiddenDangerDealTemplateNotice(
                    wxNoticeConfigMapper,hiddenDanger,
                    WxPlatConstants.hiddenDangerContent.hiddenDangerDeal,
                    systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_ACCESS_TOKEN).getCode(),
                    Arrays.asList(createMember.getOpenid().split(",")));
        }
    }
@@ -592,6 +624,16 @@
                    Arrays.asList(member.getPhone().split(","))
            );
        }
        //处理人的微信公众号通知
        if(Objects.nonNull(member)&&StringUtils.isNotBlank(member.getOpenid())){
            WxPlatNotice wxPlatNotice = new WxPlatNotice();
            wxPlatNotice.sendHiddenDangerUploadTemplateNotice(
                    wxNoticeConfigMapper,hiddenDanger,
                    WxPlatConstants.hiddenDangerContent.hiddenDangerUpload,
                    systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_ACCESS_TOKEN).getCode(),
                    Arrays.asList(member.getOpenid().split(",")));
        }
    }
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/InitServiceImpl.java
@@ -7,7 +7,6 @@
import com.doumee.service.business.InterfaceLogService;
import com.doumee.service.business.impl.hksync.HkSyncBaseServiceImpl;
import com.hikvision.artemis.sdk.config.ArtemisConfig;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -1697,6 +1697,7 @@
    /**
     * å¾®ä¿¡æŽˆæƒæŽ¥å£
     * @param code
     * æ¥æº:0=司机;1=访客;2=内部员工
     * @return
     */
    @Override
@@ -1708,50 +1709,80 @@
        String appSecret = systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_SECRET).getCode();
        String getTokenUrl = WXConstant.GET_USER_INFO_URL.replace("CODE", code)
                .replace("APPID", appId).replace("SECRET", appSecret);
//        JSONObject tokenJson = JSONObject.parseObject(HttpsUtil.get(getTokenUrl,true));
        String openId = code;
//        if(!Objects.isNull(tokenJson.get("access_token"))){
//            openId = tokenJson.getString("openid");
//        }
//        String openId = "12345";
        JSONObject tokenJson = JSONObject.parseObject(HttpsUtil.get(getTokenUrl,true));
        String openId = "";
        if(!Objects.isNull(tokenJson.get("access_token"))){
            openId = tokenJson.getString("openid");
        }
        WxAuthorizeVO wxAuthorizeVO = new WxAuthorizeVO();
        wxAuthorizeVO.setOpenid(openId);
        //根据openId æŸ¥è¯¢ç”¨æˆ·ä¿¡æ¯
        Member member = memberJoinMapper.selectJoinOne(Member.class,new MPJLambdaWrapper<Member>()
                .selectAll(Member.class)
                .selectAs(Company::getName,Member::getCompanyName)
                .leftJoin(Company.class,Company::getId,Member::getCompanyId)
                .eq(Member::getOpenid,openId)
                .eq(Member::getType,source)
                .eq(Member::getIsdeleted,Constants.ZERO)
                .orderByDesc(Member::getCreateDate)
                .last(" limit 1 ")
        );
        //非访客用户 è¿›è¡Œåˆ¤æ–­æ˜¯å¦å­˜åœ¨ç”¨æˆ·
        if(!Objects.isNull(member)){
            if(member.getIsdeleted() == Constants.ONE){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"用户已删除,请联系管理员");
            }
            if(member.getStatus() != Constants.ZERO){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"用户已禁用,请联系管理员");
            }
            if(StringUtils.isNotBlank(member.getIdcardNo())){
               member.setIdcardDecode(DESUtil.decrypt(Constants.EDS_PWD, member.getIdcardNo()));
            }
            String prefixUrl = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode() +
                    systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
            member.setPrefixUrl(prefixUrl);
            wxAuthorizeVO.setMember(member);
            //司机 ä¸Ž å†…部人员 æä¾›token
            if(Constants.equalsInteger(source,Constants.ZERO)||Constants.equalsInteger(source,Constants.TWO)){
                SystemUser systemUser = systemUserMapper.selectOne(new QueryWrapper<SystemUser>().lambda().eq(SystemUser::getMemberId,member.getId())
                        .eq(SystemUser::getStatus,Constants.ZERO).last(" limit 1 "));
                if(Objects.nonNull(systemUser)){
                    String token = systemLoginService.loginByUserId(systemUser.getId());
                    wxAuthorizeVO.setToken(token);
        if(source==1){
            //根据openId æŸ¥è¯¢ç”¨æˆ·ä¿¡æ¯
            Member member = memberJoinMapper.selectJoinOne(Member.class,new MPJLambdaWrapper<Member>()
                    .selectAll(Member.class)
                    .selectAs(Company::getName,Member::getCompanyName)
                    .leftJoin(Company.class,Company::getId,Member::getCompanyId)
                    .eq(Member::getOpenid,openId)
                    .eq(Member::getType,source)
                    .eq(Member::getIsdeleted,Constants.ZERO)
                    .orderByDesc(Member::getCreateDate)
                    .last(" limit 1 ")
            );
            //非访客用户 è¿›è¡Œåˆ¤æ–­æ˜¯å¦å­˜åœ¨ç”¨æˆ·
            if(!Objects.isNull(member)){
                if(member.getIsdeleted() == Constants.ONE){
                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"用户已删除,请联系管理员");
                }
                if(member.getStatus() != Constants.ZERO){
                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"用户已禁用,请联系管理员");
                }
                if(StringUtils.isNotBlank(member.getIdcardNo())){
                    member.setIdcardDecode(DESUtil.decrypt(Constants.EDS_PWD, member.getIdcardNo()));
                }
                String prefixUrl = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode() +
                        systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
                member.setPrefixUrl(prefixUrl);
                wxAuthorizeVO.setMember(member);
                //司机 ä¸Ž å†…部人员 æä¾›token
                if(Constants.equalsInteger(source,Constants.ZERO)||Constants.equalsInteger(source,Constants.TWO)){
                    SystemUser systemUser = systemUserMapper.selectOne(new QueryWrapper<SystemUser>().lambda().eq(SystemUser::getMemberId,member.getId())
                            .eq(SystemUser::getStatus,Constants.ZERO).last(" limit 1 "));
                    if(Objects.nonNull(systemUser)){
                        String token = systemLoginService.loginByUserId(systemUser.getId());
                        wxAuthorizeVO.setToken(token);
                    }
                }
            }
        }else{
            //如果是司机或者内部人员,则从system_user查询
            SystemUser user = systemUserMapper.selectOne(new QueryWrapper<SystemUser>().lambda()
                    .eq(SystemUser::getOpenid,openId)
                    .eq(SystemUser::getType,source)
                    .eq(SystemUser::getDeleted,Boolean.FALSE)
                    .last(" limit 1 "));
            //非访客用户 è¿›è¡Œåˆ¤æ–­æ˜¯å¦å­˜åœ¨ç”¨æˆ·
            if(!Objects.isNull(user)){
                Member member = memberMapper.selectById(user.getId());
                if(member.getIsdeleted() == Constants.ONE){
                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"用户已删除,请联系管理员");
                }
                if(member.getStatus() != Constants.ZERO){
                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"用户已禁用,请联系管理员");
                }
                if(StringUtils.isNotBlank(member.getIdcardNo())){
                    member.setIdcardDecode(DESUtil.decrypt(Constants.EDS_PWD, member.getIdcardNo()));
                }
                String prefixUrl = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode() +
                        systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
                member.setPrefixUrl(prefixUrl);
                wxAuthorizeVO.setMember(member);
                //司机 ä¸Ž å†…部人员 æä¾›token
                String token = systemLoginService.loginByUserId(user.getId());
                wxAuthorizeVO.setToken(token);
            }
        }
        return wxAuthorizeVO;
    }
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformBooksServiceImpl.java
@@ -10,6 +10,8 @@
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.SmsConstants;
import com.doumee.core.utils.Utils;
import com.doumee.core.wx.wxPlat.WxPlatConstants;
import com.doumee.core.wx.wxPlat.WxPlatNotice;
import com.doumee.dao.business.*;
import com.doumee.dao.business.dao.SmsConfigMapper;
import com.doumee.dao.business.dao.SmsEmailMapper;
@@ -36,6 +38,7 @@
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Objects;
@@ -86,6 +89,9 @@
    @Autowired
    private EmayService emayService;
    @Autowired
    private WxNoticeConfigMapper wxNoticeConfigMapper;
    @Override
    public Integer create(PlatformBooks platformBooks) {
@@ -285,6 +291,17 @@
        //创建审批流信息
        approveService.createApproveForPlatfrom(approveTempl.getId(),platformBooks.getId(),platformBooks.getDriverId());
        //发送公众号通知 ç»™æäº¤äºº
        Member member = memberMapper.selectById(platformBooks.getDriverId());
        if(Objects.nonNull(member)&&StringUtils.isNotBlank(member.getOpenid())){
            WxPlatNotice wxPlatNotice = new WxPlatNotice();
            wxPlatNotice.sendPlatformBookTemplateNotice(
                    wxNoticeConfigMapper,platformBooks,
                    WxPlatConstants.platformBookContent.platformBookUpload,
                    systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_ACCESS_TOKEN).getCode(),
                    Arrays.asList(member.getOpenid().split(",")),0);
        }
        return platformBooks.getId();
    }
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformJobServiceImpl.java
@@ -17,6 +17,8 @@
import com.doumee.core.tms.model.response.TmsBaseResponse;
import com.doumee.core.tms.model.response.TmsLockStatusQueryResponse;
import com.doumee.core.utils.*;
import com.doumee.core.wx.wxPlat.WxPlatConstants;
import com.doumee.core.wx.wxPlat.WxPlatNotice;
import com.doumee.dao.business.*;
import com.doumee.dao.business.dao.SmsConfigMapper;
import com.doumee.dao.business.dao.SmsEmailMapper;
@@ -118,6 +120,10 @@
    private PlatformBroadcastLogMapper platformBroadcastLogMapper;
    @Autowired
    private PlatformWarnEventServiceImpl platformWarnEventService;
    @Autowired
    private MemberMapper memberMapper;
    @Autowired
    private WxNoticeConfigMapper wxNoticeConfigMapper;
    @Override
    public Integer create(PlatformJob platformJob) {
@@ -860,6 +866,20 @@
                emayService,smsEmailMapper,smsConfigMapper,platformJobMapper,platformJob.getId(),
                SmsConstants.platformJobContent.platformJobCallIn,null,null
        );
        //公众号模板消息
        if(Objects.nonNull(platformJob.getDriverId())) {
            Member member = memberMapper.selectById(platformJob.getDriverId());
            if (Objects.nonNull(member) && StringUtils.isNotBlank(member.getOpenid())) {
                WxPlatNotice wxPlatNotice = new WxPlatNotice();
                wxPlatNotice.sendPlatformJobTemplateNotice(
                        wxNoticeConfigMapper, platformJob,
                        WxPlatConstants.platformJobContent.platformJobCallIn,
                        systemDictDataBiz.queryByCode(Constants.WX_PLATFORM, Constants.WX_PLATFORM_ACCESS_TOKEN).getCode(),
                        Arrays.asList(member.getOpenid().split(","))
                );
            }
        }
        return platformJob;
    }
@@ -1058,6 +1078,21 @@
                SmsConstants.platformJobContent.platformJobSingIn,platform.getName(),null
        );
        //公众号模板消息
        if(Objects.nonNull(platformJob.getDriverId())){
            Member member = memberMapper.selectById(platformJob.getDriverId());
            if(Objects.nonNull(member) && StringUtils.isNotBlank(member.getOpenid())){
                WxPlatNotice wxPlatNotice = new WxPlatNotice();
                wxPlatNotice.sendPlatformJobTemplateNotice(
                        wxNoticeConfigMapper,platformJob,
                        WxPlatConstants.platformJobContent.platformJobSingIn,
                        systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_ACCESS_TOKEN).getCode(),
                        Arrays.asList(member.getOpenid().split(","))
                );
            }
        }
        //广播 led通知
        platformJob.setPlatformName(platform.getName());
        this.broadcastAndLEed(platformJob,Constants.PlatformLedContent.CALLING.getInfo(),
@@ -1188,6 +1223,20 @@
                SmsConstants.platformJobContent.platformJobMove,oldPlatform.getName(),platform.getName()
        );
        //公众号模板消息
        if(Objects.nonNull(platformJob.getDriverId())) {
            Member member = memberMapper.selectById(platformJob.getDriverId());
            if (Objects.nonNull(member) && StringUtils.isNotBlank(member.getOpenid())) {
                WxPlatNotice wxPlatNotice = new WxPlatNotice();
                wxPlatNotice.sendPlatformJobTemplateNotice(
                        wxNoticeConfigMapper, platformJob,
                        WxPlatConstants.platformJobContent.platformJobMove,
                        systemDictDataBiz.queryByCode(Constants.WX_PLATFORM, Constants.WX_PLATFORM_ACCESS_TOKEN).getCode(),
                        Arrays.asList(member.getOpenid().split(","))
                );
            }
        }
        platformJob.setPlatformName(oldPlatform.getName());
        platformJob.setPlatformId(oldPlatform.getId());
        this.broadcastAndLEed(platformJob, StringUtils.isBlank(oldPlatform.getLedContent())?Constants.PlatformLedContent.IDEL_CONTNET.getName():oldPlatform.getLedContent(),
@@ -1235,6 +1284,21 @@
                emayService,smsEmailMapper,smsConfigMapper,platformJobMapper,platformJob.getId(),
                SmsConstants.platformJobContent.platformJobOverNum,null,null
        );
        //公众号模板消息
        if(Objects.nonNull(platformJob.getDriverId())){
            Member member = memberMapper.selectById(platformJob.getDriverId());
            if(Objects.nonNull(member) && StringUtils.isNotBlank(member.getOpenid())){
                WxPlatNotice wxPlatNotice = new WxPlatNotice();
                wxPlatNotice.sendPlatformJobTemplateNotice(
                        wxNoticeConfigMapper,platformJob,
                        WxPlatConstants.platformJobContent.platformJobOverNum,
                        systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_ACCESS_TOKEN).getCode(),
                        Arrays.asList(member.getOpenid().split(","))
                );
            }
        }
        platformJob.setPlatformName(platform.getName());
        this.broadcastAndLEed(platformJob, StringUtils.isBlank(platform.getLedContent())?Constants.PlatformLedContent.IDEL_CONTNET.getName():platform.getLedContent(),
                null
@@ -1281,6 +1345,20 @@
                emayService,smsEmailMapper,smsConfigMapper,platformJobMapper,platformJob.getId(),
                SmsConstants.platformJobContent.platformJobError,platform.getName(),null
        );
        //公众号模板消息
        if(Objects.nonNull(platformJob.getDriverId())) {
            Member member = memberMapper.selectById(platformJob.getDriverId());
            if (Objects.nonNull(member) && StringUtils.isNotBlank(member.getOpenid())) {
                WxPlatNotice wxPlatNotice = new WxPlatNotice();
                wxPlatNotice.sendPlatformJobTemplateNotice(
                        wxNoticeConfigMapper, platformJob,
                        WxPlatConstants.platformJobContent.platformJobError,
                        systemDictDataBiz.queryByCode(Constants.WX_PLATFORM, Constants.WX_PLATFORM_ACCESS_TOKEN).getCode(),
                        Arrays.asList(member.getOpenid().split(","))
                );
            }
        }
        platformJob.setPlatformName(platform.getName());
        this.broadcastAndLEed(platformJob, StringUtils.isBlank(platform.getLedContent())?Constants.PlatformLedContent.IDEL_CONTNET.getName():platform.getLedContent(),
@@ -1331,7 +1409,19 @@
                emayService,smsEmailMapper,smsConfigMapper,platformJobMapper,platformJob.getId(),
                SmsConstants.platformJobContent.platformJobWorking,platform.getName(),null
        );
        //公众号模板消息
        if(Objects.nonNull(platformJob.getDriverId())) {
            Member member = memberMapper.selectById(platformJob.getDriverId());
            if (Objects.nonNull(member) && StringUtils.isNotBlank(member.getOpenid())) {
                WxPlatNotice wxPlatNotice = new WxPlatNotice();
                wxPlatNotice.sendPlatformJobTemplateNotice(
                        wxNoticeConfigMapper, platformJob,
                        WxPlatConstants.platformJobContent.platformJobWorking,
                        systemDictDataBiz.queryByCode(Constants.WX_PLATFORM, Constants.WX_PLATFORM_ACCESS_TOKEN).getCode(),
                        Arrays.asList(member.getOpenid().split(","))
                );
            }
        }
        //广播 led通知
        platformJob.setPlatformName(platform.getName());
        this.broadcastAndLEed(platformJob,Constants.PlatformLedContent.WORKING.getInfo(),
@@ -1416,6 +1506,21 @@
                emayService,smsEmailMapper,smsConfigMapper,platformJobMapper,platformJob.getId(),
                SmsConstants.platformJobContent.platformJobFinish,platform.getName(),null
        );
        //公众号模板消息
        if(Objects.nonNull(platformJob.getDriverId())) {
            Member member = memberMapper.selectById(platformJob.getDriverId());
            if (Objects.nonNull(member) && StringUtils.isNotBlank(member.getOpenid())) {
                WxPlatNotice wxPlatNotice = new WxPlatNotice();
                wxPlatNotice.sendPlatformJobTemplateNotice(
                        wxNoticeConfigMapper, platformJob,
                        WxPlatConstants.platformJobContent.platformJobFinish,
                        systemDictDataBiz.queryByCode(Constants.WX_PLATFORM, Constants.WX_PLATFORM_ACCESS_TOKEN).getCode(),
                        Arrays.asList(member.getOpenid().split(","))
                );
            }
        }
        //广播 led通知
        platformJob.setPlatformName(platform.getName());
        this.broadcastAndLEed(platformJob,Constants.PlatformLedContent.DONE.getInfo(),
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java
@@ -23,6 +23,8 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.*;
import com.doumee.core.wx.WXConstant;
import com.doumee.core.wx.wxPlat.WxPlatConstants;
import com.doumee.core.wx.wxPlat.WxPlatNotice;
import com.doumee.dao.admin.response.InterestedListVO;
import com.doumee.dao.admin.response.PCWorkPlatformDataVO;
@@ -129,6 +131,9 @@
    @Autowired
    private SmsEmailMapper smsEmailMapper;
    @Autowired
    private WxNoticeConfigMapper wxNoticeConfigMapper;
    @Autowired
    private EmayService emayService;
@@ -279,10 +284,6 @@
            }else{
                throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,发起拜访审批申请失败!");
            }
            //发送微信公众号通知
            wxPlatNotice.sendVisitAuditTemplateNotice(visits,
                    systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_PREFIX).getCode(),
                    systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_AUDIT_VISIT).getCode());
        }else if(dataSyncConfig.getVisitorDataOrigin().equals(Constants.ZERO)){
            visits.setStatus(Constants.VisitStatus.waitCheck);
            visitsMapper.updateById(visits);
@@ -292,6 +293,17 @@
        }
        initWithVisitInfo(visits);
        updateProblemLog(visits,problemLog,member);
        //发送微信公众号通知 - ç”³è¯·æäº¤æˆåŠŸå¾…å®¡æ ¸
        if(StringUtils.isNotBlank(visits.getOpenid())){
            WxPlatNotice wxPlatNotice = new WxPlatNotice();
            wxPlatNotice.sendVisitTemplateNotice(
                    wxNoticeConfigMapper,visits,
                    Constants.equalsInteger(visits.getType(),Constants.TWO)?WxPlatConstants.visitReportContent.visitReportUpload:WxPlatConstants.visitContent.visitUpload,
                    systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_ACCESS_TOKEN).getCode(),
                    Arrays.asList(visits.getOpenid().split(","))
            );
        }
        //创建审批记录
        createApprove(visits,visitMember);
@@ -1486,11 +1498,6 @@
      if(Constants.equalsInteger(visits.getStatus(),Constants.VisitStatus.xfSuccess)){
          //如果下发成功,
          visitsMapper.updateById(visits);
          if(Objects.isNull(visits.getParentId())){
              wxPlatNotice.sendVisitAuditTemplateNotice(visits,
                      systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_PREFIX).getCode(),
                      systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_AUDIT_VISIT).getCode());
          }
      }else{
          throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"重新下发会失败!");
      }
@@ -1661,25 +1668,28 @@
            pcWorkPlatformDataVO.setLwList(lwList   );
        }else if(Constants.equalsInteger(queryType,Constants.THREE)) {
            MPJLambdaWrapper<Notices> queryWrapper = new MPJLambdaWrapper<>();
            queryWrapper.selectAll(Notices.class);
            if (Objects.isNull(loginUserInfo.getMemberId())) {
                queryWrapper.eq("1", "2");
                pcWorkPlatformDataVO.setNoticesList(new ArrayList<>());
                pcWorkPlatformDataVO.setNoticesNum(0);
//                queryWrapper.eq("1", "2");
            } else {
                MPJLambdaWrapper<Notices> queryWrapper = new MPJLambdaWrapper<>();
                queryWrapper.selectAll(Notices.class);
                queryWrapper.eq(Notices::getStatus, Constants.ZERO);
                queryWrapper.eq(Notices::getSendacopy, Constants.ZERO);
                queryWrapper.eq(Notices::getParam2, Constants.ZERO);
                queryWrapper.eq(Notices::getUserId, loginUserInfo.getMemberId());
            }
            queryWrapper.orderByDesc(Notices::getCreateDate);
            List<Notices> noticesList = noticesJoinMapper.selectList(queryWrapper);
            pcWorkPlatformDataVO.setNoticesList(noticesList);
            pcWorkPlatformDataVO.setNoticesNum(noticesList.size());
            if(noticesList.size() > 5 ){
                pcWorkPlatformDataVO.setNoticesList(noticesList.subList(0,5));
            }else{
                queryWrapper.orderByDesc(Notices::getCreateDate);
                List<Notices> noticesList = noticesJoinMapper.selectList(queryWrapper);
                pcWorkPlatformDataVO.setNoticesList(noticesList);
                pcWorkPlatformDataVO.setNoticesNum(noticesList.size());
                if(noticesList.size() > 5 ){
                    pcWorkPlatformDataVO.setNoticesList(noticesList.subList(0,5));
                }else{
                    pcWorkPlatformDataVO.setNoticesList(noticesList);
                }
            }
        }else{
            String code= systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.TIMEOUT_WARNING).getCode();
            MPJLambdaWrapper<Visits> queryWrapper = new MPJLambdaWrapper<>();
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/erp/ErpSyncServiceImpl.java
@@ -1053,11 +1053,6 @@
                    i.setEndtime(param.getEndTime());
                    i.setDoors(param.getDoors());
                    visitsMapper.updateById(i);
                    if(Objects.isNull(i.getParentId())){
                        wxPlatNotice.sendVisitAuditTemplateNotice(i,
                                systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_PREFIX).getCode(),
                                systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_AUDIT_VISIT).getCode());
                    }
                });
            }
        }catch (BusinessException e){
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncBaseServiceImpl.java
@@ -67,6 +67,11 @@
        return null;
    }
    @Override
    public    String syncHkNotices(String username){
        return null;
    }
    @Override
    public String syncHkLed(Device param){
        return null;
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncDoorsServiceImpl.java
@@ -48,10 +48,10 @@
            List<Device> deleteList = new ArrayList<>();
            List<Device> addList = new ArrayList<>();
            List<Device> editList = new ArrayList<>();
            List<DoorsInfoResponse> allHkList = new ArrayList<>();
            Date date = new Date();
            //查询全部门禁设备数据
            List<Device> allList = deviceMapper.selectList(null);
            List<DoorsInfoResponse> allHkList = new ArrayList<>();
            boolean hasNext = true;
            int curTotal = 0;
            int curPage = 1;
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncInitConfigServiceImpl.java
@@ -3,6 +3,7 @@
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.haikang.model.HKConstants;
import com.doumee.core.haikang.model.HKTools;
import com.doumee.core.haikang.service.HKCarOpenService;
import com.doumee.core.utils.Constants;
import com.doumee.service.business.InterfaceLogService;
import com.hikvision.artemis.sdk.config.ArtemisConfig;
@@ -28,6 +29,9 @@
    @PostConstruct
    public  int  initHkConfig(){
        HKCarOpenService.ACCESS_KEY= systemDictDataBiz.queryByCode(Constants.HK_PARAM, Constants.HK_CARS_OPENAPI_ACCESS_KEY).getCode();
        HKCarOpenService.BASE_URL= systemDictDataBiz.queryByCode(Constants.HK_PARAM, Constants.HK_CARS_OPENAPI_URL).getCode();
        HKCarOpenService.ACCESS_SECRET= systemDictDataBiz.queryByCode(Constants.HK_PARAM, Constants.HK_CARS_OPENAPI_ACCESS_SECRET).getCode();
        ArtemisConfig.host = systemDictDataBiz.queryByCode(Constants.HK_PARAM, Constants.HK_HOST).getCode();
        ArtemisConfig.appKey = systemDictDataBiz.queryByCode(Constants.HK_PARAM, Constants.HK_APPKEY).getCode();
        ArtemisConfig.appSecret = systemDictDataBiz.queryByCode(Constants.HK_PARAM, Constants.HK_APPSECRET).getCode();
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncNoticeServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,163 @@
package com.doumee.service.business.impl.hksync;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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.DESUtil;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.ImageBase64Util;
import com.doumee.core.wx.wxPlat.WxPlatNotice;
import com.doumee.dao.business.DeviceRoleMapper;
import com.doumee.dao.business.MemberMapper;
import com.doumee.dao.business.RetentionMapper;
import com.doumee.dao.business.join.VisitsJoinMapper;
import com.doumee.dao.business.model.DeviceRole;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.Retention;
import com.doumee.dao.business.model.Visits;
import com.doumee.dao.system.SystemUserMapper;
import com.doumee.dao.system.join.NoticesJoinMapper;
import com.doumee.dao.system.model.Notices;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.service.system.NoticesService;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
/**
 * æµ·åº·è®¿å®¢ä¸šåŠ¡Service实现
 * @author æ±Ÿè¹„蹄
 * @date 2023/11/30 15:33
 */
@Service
@Slf4j
public class HkSyncNoticeServiceImpl extends HkSyncBaseServiceImpl {
    @Autowired
    private NoticesJoinMapper noticesJoinMapper;
    @Autowired
    private MemberMapper memberMapper;
    @Override
    public String syncHkNotices(String username){
        if(Constants.DEALING_HK_NOTICE_LIST){
            return   null;
        }
        Constants.DEALING_HK_NOTICE_LIST =true;
        try {
            Date date = new Date();
            List<GetTodoListResponse> allHkList = new ArrayList<>();
            boolean hasNext = true;
            int curTotal = 0;
            int curPage = 1;
            while (hasNext){
                //分页遍历循环查询所有门禁设备数据
                GetTodoListRequest param = new GetTodoListRequest();
                param.setComId("dfe");
                param.setUserId(username);
                param.setStatus(1);//只查待处理的数据
                param.setPageNo(curPage);
                param.setLocaleType("zh_CN");
                param.setPageSize(100);
                BaseResponse<BaseListPageResponse<GetTodoListResponse>>   response = HKService.getTodoListPage(param);
                if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)){
                    throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,海康同步数据失败~");
                }
                BaseListPageResponse<GetTodoListResponse> r = response.getData();
                curTotal += 100;
                if(curTotal >= r.getTotal()){
                    hasNext = false;
                }
                if(r.getList() == null || r.getList().size()==0){
                    hasNext =false;
                }else{
                    allHkList.addAll(r.getList());
                }
                curPage++;
            }
             if(allHkList!=null && allHkList.size()>0){
                List<Notices> list = new ArrayList<>();
                List<String> users = new ArrayList<>();
                for(GetTodoListResponse data :allHkList){
                    users.add(data.getUserId());
                }
                List<Integer> userIds = new ArrayList<>();
                List<Member > userList = memberMapper.selectList(new QueryWrapper<Member>().lambda()
                        .in(Member::getPhone,users)
                        .eq(Member::getIsdeleted,Constants.ZERO));
                for(GetTodoListResponse data :allHkList){
                   Member u = getFromUserList(data.getUserId(),userList);
                   if(u==null){
                       continue;
                   }
                    userIds.add(u.getId());
                    JSONObject param = new JSONObject();
                    param.put("componentId","dfe");
                    param.put("msgType","tlnc");
                    param.put("componentMenuId", data.getMenuCode());
                    JSONObject c = new JSONObject();
                    c.put("method","dealTlncMsg");
                    c.put("argument",JSONObject.toJSONString(data));
                    param.put("callback",c);
                    Notices notices = new Notices();
                    notices.setCreateDate(DateUtil.getISO8601DateByStr(data.getMsgCreateTimeIso()));
                    notices.setUserId(u.getId());
                    notices.setStatus(Constants.ZERO);
                    notices.setSendacopy(Constants.ZERO);
                    //业务状态信息 0 =待处理;1=已同意/已处理;2=已拒绝/已退回;3=已转交;4=已撤销
                    notices.setParam1(JSONObject.toJSONString(data));
                    notices.setParam2(Constants.ZERO+"");
                    notices.setTitle(data.getMsgTitle());
                    if(notices.getCreateDate() == null){
                        notices.setCreateDate(date);
                    }
                    notices.setIsdeleted(Constants.ZERO);
                    notices.setParam4(data.getMsgCreateTimeIso());
                    notices.setParam3(data.getMsgCreateTime());
                    notices.setParam5(JSONObject.toJSONString(param));
                    notices.setType(Constants.noticesObjectType.hknotice);
                    list.add(notices);
                }
                if(list.size()>0){
                    //清空海康全部的代办数据
                    noticesJoinMapper.delete(new UpdateWrapper<Notices>().lambda()
                            .eq(Notices::getType, Constants.noticesObjectType.hknotice)
                            .in(Notices::getUserId, userIds));
                    noticesJoinMapper.insert(list);//批量插入记录
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            Constants.DEALING_HK_NOTICE_LIST =false;
        }
        return  null;
    }
    private Member getFromUserList(String userId, List<Member> userList) {
        if(userList!=null ){
            for(Member u :userList){
                if(StringUtils.equals(u.getPhone(),userId)){
                    return  u;
                }
            }
        }
        return null;
    }
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncVisitServiceImpl.java
@@ -311,11 +311,6 @@
//                getUpdateModelByResponse(c,date,roleList,path);
                getUpdateModelByResponseIccm(c,date,roleList,path);
                visitsMapper.updateById(c);
                if(Objects.isNull(c.getParentId())){
                    wxPlatNotice.sendVisitAuditTemplateNotice(c,
                            systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_PREFIX).getCode(),
                            systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_AUDIT_VISIT).getCode());
                }
            }
        }catch (Exception e){
            e.printStackTrace();
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/thrid/BoardServiceImpl.java
@@ -1,37 +1,38 @@
package com.doumee.service.business.impl.thrid;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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.cars.response.CarsDeviceDetaisResponse;
import com.doumee.core.haikang.model.param.BaseListPageRequest;
import com.doumee.core.haikang.model.param.BaseListPageResponse;
import com.doumee.core.haikang.model.param.BaseResponse;
import com.doumee.core.haikang.model.param.BaseListPageRequest;
import com.doumee.core.haikang.model.param.request.*;
import com.doumee.core.haikang.model.param.respose.*;
import com.doumee.core.haikang.service.HKCarOpenService;
import com.doumee.core.haikang.service.HKService;
import com.doumee.core.model.ApiResponse;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.Utils;
import com.doumee.core.wms.model.response.WmsBaseResponse;
import com.doumee.core.wms.model.response.WmsInventoryDataResponse;
import com.doumee.core.wms.model.response.WmsInventoryJsonResponse;
import com.doumee.dao.business.*;
import com.doumee.dao.business.join.VisitsJoinMapper;
import com.doumee.dao.business.model.*;
import com.doumee.dao.system.model.SystemDictData;
import com.doumee.dao.web.reqeust.SavePlatformWarnEventDTO;
import com.doumee.dao.web.reqeust.CarsJobAndContractDTO;
import com.doumee.dao.web.response.platformReport.*;
import com.doumee.service.business.impl.PlatformJobServiceImpl;
import com.doumee.service.business.impl.VisitsServiceImpl;
import com.doumee.service.business.third.BoardService;
import com.doumee.service.business.third.WmsService;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.checkerframework.checker.units.qual.C;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -51,6 +52,8 @@
    @Autowired
    private PlatformLogMapper platformLogMapper;
    @Autowired
    private WmsService wmsService;
    @Autowired
    private HiddenDangerMapper hiddenDangerMapper;
    @Autowired
    private PlatformWaterGasMapper platformWaterGasMapper;
@@ -63,6 +66,8 @@
    @Autowired
    private PlatformWmsDetailMapper platformWmsDetailMapper;
    @Autowired
    private PlatformWmsJobMapper platformWmsJobMapper;
    @Autowired
    private PlatformMapper platformMapper;
    @Autowired
    private VisitsJoinMapper visitsJoinMapper;
@@ -70,6 +75,44 @@
    private RetentionMapper retentionMapper;
    @Autowired
    private PlatformGroupMapper platformGroupMapper;
    /**
     * èŽ·å–åŒºåŸŸæ ‘å½¢ç»“æž„æ•°æ®
     * @return
     */
    @Override
    public BoardStockListVO stockList( ){
        BoardStockListVO data = new BoardStockListVO();
        double toatalNum = 1d;
        BigDecimal num = new BigDecimal(0);
        List<GeneralVO> list = new ArrayList<>();
        try {
            toatalNum =Double.parseDouble(systemDictDataBiz.queryByCode(Constants.WMS_PARAM,Constants.WMS_TOTAL_STOCK_NUM).getCode()) ;
        }catch (Exception e){
        }
        WmsBaseResponse<WmsInventoryDataResponse> response =  wmsService.getInventoryList();
        if(response!=null && response.getData()!=null && response.getData().size()>=0){
            List<WmsInventoryJsonResponse> t= response.getData().get(0).getJson();
            if(t!=null &&t.size()>0){
                for(WmsInventoryJsonResponse j :t){
                    num = num.add (Constants.formatBigdecimal( j.getQty()));
                    GeneralVO d = new GeneralVO();
                    d.setNum(Constants.formatBigdecimal(j.getQty()));
                    d.setName(j.getItem_name());
                    list.add(d);
                }
            }
        }
        data.setStockList(list);
        data.setNum(num);
        if(toatalNum<=0){
            toatalNum =1;
        }
        data.setTotalNum(new BigDecimal(toatalNum));
        data.setUseRate(data.getTotalNum().divide(data.getNum(),2,BigDecimal.ROUND_UP));
        return data;
    }
    /**
     * èŽ·å–åŒºåŸŸæ ‘å½¢ç»“æž„æ•°æ®
     * @return
@@ -451,6 +494,8 @@
        FindHomeAlarmInfoPageRequest param = new FindHomeAlarmInfoPageRequest();
        param.setHour(24);
        param.setPage(1);
        param.setUserId("admin");
//        param.setRegionIndexCodes("root000000");
        param.setAlarmStartTime(DateUtil.getPlusTime2(DateUtil.addDaysToDate(new Date(),-1)));
        param.setAlarmEndTime(DateUtil.getPlusTime2(new Date()));
        param.setPageSize(20);
@@ -464,7 +509,7 @@
                data.add(t);
            }
        }
            return data;
        return data;
    }
    /**
@@ -477,7 +522,7 @@
        List<MonitorDataVO> list = new ArrayList<>();
        MinitorDataSearchRequest param = new MinitorDataSearchRequest();
        param.setResourceTypeCodes(new String[]{});
        param.setRegionIndexCode("root0001");
        param.setRegionIndexCode("root000000");
        param.setIncludeDown("1");
        param.setUserId("admin");
        BaseResponse<BaseListPageResponse<MonitorDataSearchResponse>> response = HKService.minitorDataSearch(param);
@@ -514,8 +559,8 @@
    @Override
    public   List<AlarmDataVO> fightingAlarmHandleData(){
        List<AlarmDataVO> alarmHandleDataVOList = new ArrayList<>();
        Date now = DateUtil.getStartOfDay(new Date());
        for (int i = 1; i < 12; i++) {
        Date now =DateUtil.StringToDate(DateUtil.getFirstDayCurrentMonth(),"yyyy-MM") ;
        for (int i = 1; i <= 12; i++) {
            Date start  =  DateUtil.addMonthToDate(now,-12+i);
            Date end  =  DateUtil.addMonthToDate(now,-11+i);
            AlarmDataVO t = getAlertDataByStartEndTime(DateUtil.getPlusTime2(start),DateUtil.getPlusTime2(end));
@@ -523,6 +568,171 @@
        }
        return alarmHandleDataVOList;
    }
    /**
     * ã€å›­åŒºç‰©æ–™ä¸­å¿ƒè°ƒåº¦ã€‘看板-运输任务分析
     *
     * @return
     *
     */
    @Override
    public  List<TransportMeasureVO> transportMeasure(Integer queryType){
        List<TransportMeasureVO> list = new ArrayList<>();
        Random random = new Random();
        List<Date> dayList = DateUtil.getDateListBeforDays(new Date(),7);//近7天
        if(Constants.equalsInteger(queryType,Constants.ONE)){
            dayList = DateUtil.getThisMonthDateList();//本月天数
        }else if(Constants.equalsInteger(queryType,Constants.TWO)){
            dayList = DateUtil.getThisYearMonthList();//本年月份
        }
        List<PlatformJob>  dataList = platformJobMapper.selectJoinList(PlatformJob.class,
                new MPJLambdaWrapper<PlatformJob>()
                        .selectAs(PlatformJob::getId,PlatformJob::getId)
                        .selectAs(PlatformJob::getTotalNum,PlatformJob::getTotalNum)
//                        .select("select sum(io_qty) from platform_wms_details a where a.isdeleted=0 and a.job_id=t.id",create_date)
                        .eq(PlatformJob::getIsdeleted,Constants.ZERO)
                        .apply(queryType==0,"to_days(create_date) >= to_days(now()) -7")
                        .apply(queryType==1,"year(create_date) = year(now()) and month(create_date) = month(now())")
                        .apply(queryType==2,"year(create_date) = year(now())"));
        for (Date date : dayList) {
            TransportMeasureVO data = new TransportMeasureVO();
            data.setPlanDate(date);
            data.setPlanTimes(0);
            data.setPlanTaskNum(new BigDecimal(random.nextInt(0)));
            data.setFinishTaskNum(new BigDecimal(0));
            for(PlatformJob job :dataList){
                if(queryType == 2){
                    if(DateUtil.formatDate(date,"yyyy-MM").equals(DateUtil.formatDate(job.getCreateDate(),"yyyy-MM"))){
                        data.setPlanTimes( data.getPlanTimes() +1);
                        data.setPlanTaskNum( data.getPlanTaskNum().add(Constants.formatBigdecimal(job.getTotalNum())));
                        if(Constants.equalsInteger(job.getStatus(),Constants.PlatformJobStatus.DONE.getKey())
                                ||Constants.equalsInteger(job.getStatus(),Constants.PlatformJobStatus.LEAVED.getKey())
                                ||Constants.equalsInteger(job.getStatus(),Constants.PlatformJobStatus.AUTHED_LEAVE.getKey())){
                            //完成数
                            data.setFinishTaskNum( data.getFinishTaskNum().add(Constants.formatBigdecimal(job.getTotalNum())));
                        }
                    }
                }else{
                    if(DateUtil.formatDate(date,"yyyy-MM-dd").equals(DateUtil.formatDate(job.getCreateDate(),"yyyy-MM-dd"))){
                        data.setPlanTimes( data.getPlanTimes() +1);
                        data.setPlanTaskNum( data.getPlanTaskNum().add(Constants.formatBigdecimal(job.getTotalNum())));
                        if(Constants.equalsInteger(job.getStatus(),Constants.PlatformJobStatus.DONE.getKey())
                                ||Constants.equalsInteger(job.getStatus(),Constants.PlatformJobStatus.LEAVED.getKey())
                                ||Constants.equalsInteger(job.getStatus(),Constants.PlatformJobStatus.AUTHED_LEAVE.getKey())){
                            //完成数
                            data.setFinishTaskNum( data.getFinishTaskNum().add(Constants.formatBigdecimal(job.getTotalNum())));
                        }
                    }
                }
            }
            list.add(data);
        }
        return list;
    }
    /**
     * ã€å›­åŒºç‰©æ–™ä¸­å¿ƒè°ƒåº¦ã€‘看板-根据车牌号查询作业信息和合同信息集合
     *
     * @return
     *
     */
    @Override
    public    CarsJobAndContractVO getCarsJobDetails(CarsJobAndContractDTO param){
        CarsJobAndContractVO data = new CarsJobAndContractVO();
        if(StringUtils.isBlank(param.getCarCode())){
            return  data;
        }
        PlatformJob job = platformJobMapper.selectJoinOne(PlatformJob.class,
                new MPJLambdaWrapper<PlatformJob>()
                        .selectAll(PlatformJob.class)
                        .eq(PlatformJob::getIsdeleted,Constants.ZERO)
                        .eq(PlatformJob::getCarCodeFront,param.getCarCode())
                        .in(PlatformJob::getStatus,Constants.PlatformJobStatus.DONE.getKey(),Constants.PlatformJobStatus.LEAVED.getKey(),Constants.PlatformJobStatus.AUTHED_LEAVE.getKey(),Constants.PlatformJobStatus.CALLED.getKey())
                        .last("limit 1"));
        if(job!=null){
            List<PlatformLog>  logList = platformLogMapper.selectJoinList(PlatformLog.class,
                    new MPJLambdaWrapper<PlatformLog>()
                            .selectAll(PlatformLog.class)
                            .eq(PlatformLog::getIsdeleted,Constants.ZERO)
                            .eq(PlatformLog::getJobId,job.getId())
                            .orderByDesc(PlatformLog::getCreateDate));
            data.setLogList(logList);
            data.setName(job.getDriverName());
            data.setPhone(job.getDrivierPhone());
            data.setBillCode(job.getBillCode());
            data.setTotalNum(Constants.formatBigdecimal(job.getTotalNum()));
            data.setContractList(new ArrayList<>());
            CarsContractVO tt = new CarsContractVO();
            tt.setIoCode(job.getContractNum());
            tt.setDetailList(new ArrayList<>());
            data.getContractList().add(tt);
            PlatformWmsJob wmsJob = platformWmsJobMapper.selectJoinOne(PlatformWmsJob.class,
                    new MPJLambdaWrapper<PlatformWmsJob>()
                            .selectAll(PlatformWmsJob.class)
                            .eq(PlatformWmsJob::getIsdeleted,Constants.ZERO)
                            .eq(PlatformWmsJob::getJobId,job.getId())
                            .last("limit 1"));
            if(wmsJob!=null){
                data.setName(wmsJob.getDriverName());
                data.setPhone(wmsJob.getDriverPhone());
                data.setBillCode(wmsJob.getCarryBillCode());
                data.setContractList(new ArrayList<>());
                List<PlatformWmsDetail>  detailList = platformWmsDetailMapper.selectJoinList(PlatformWmsDetail.class,
                        new MPJLambdaWrapper<PlatformWmsDetail>()
                                .selectAll(PlatformWmsDetail.class)
                                .eq(PlatformWmsDetail::getIsdeleted,Constants.ZERO)
                                .eq(PlatformWmsDetail::getWmsJobId,wmsJob.getId())
                                .orderByDesc(PlatformLog::getCreateDate));
                if(detailList!=null){
                    for(PlatformWmsDetail d : detailList){
                        if(!isNotExistIocode(d.getIocode(),data.getContractList())){
                                continue;
                        }
                        tt = new CarsContractVO();
                        tt.setIoCode(d.getIocode());
                        tt.setAddress(d.getRepertotyAddress());
                        tt.setDetailList(getDetailListByCode(d.getIocode(),detailList,tt));
                        data.getContractList().add(tt);
                        data.getTotalNum().add(Constants.formatBigdecimal(tt.getTotalNum()));//总运输量
                    }
                }
            }
        }
        return data;
    }
    private List<PlatformWmsDetail> getDetailListByCode(String iocode, List<PlatformWmsDetail> detailList,CarsContractVO tt) {
        List<PlatformWmsDetail> list = new ArrayList<>();
        BigDecimal total = new BigDecimal(0);
        if(detailList!=null){
            for(PlatformWmsDetail d :detailList){
                if(StringUtils.equals(d.getIocode(),iocode)){
                    list.add(d);
                    total.add(Constants.formatBigdecimal(d.getIoQty()));
                }
            }
        }
        tt.setTotalNum(total);
        return list;
    }
    private boolean isNotExistIocode(String iocode, List<CarsContractVO> detailList) {
        if(detailList!=null){
            for(CarsContractVO d :detailList){
                if(StringUtils.equals(d.getIoCode(),iocode)){
                    return true;
                }
            }
        }
        return false;
    }
    /**
     * ã€æ¶ˆé˜²ç®¡æŽ§ã€‘看板-告警信息集合
     *
@@ -534,6 +744,236 @@
        AlarmDataVO alarmDataVO = getAlertDataByStartEndTime(DateUtil.getPlusTime2(DateUtil.addDaysToDate(new Date(),-1))
                ,(DateUtil.getPlusTime2(new Date())));
        return  alarmDataVO;
    }
    /**
     * æŸ¥è¯¢æœ¬æœˆ æœ¬å¹´çš„累计出库量统计数据,出库任务、入库任务量
     * @return
     */
    @Override
    public  PlatformJobRunBoardNewVO platformJobCenterData(){
        PlatformJobRunBoardNewVO data = new PlatformJobRunBoardNewVO();
        Random random = new Random();
        data.setMonthOutTimes(random.nextInt(1000));
        data.setYearOutTimes(random.nextInt(1000) * 11);
        Date month  = Utils.Date.getStart(new Date());//本月
        Date lastMonth =  DateUtil.addMonthToDate(month,-1);//上月
        Date year = Utils.Date.getStart(new Date());//今年
        Date lastYear = DateUtil.addYearToDate(year,-1);//去年
        List<PlatformJob>  monthNum = platformJobMapper.selectJoinList(PlatformJob.class,
                new MPJLambdaWrapper<PlatformJob>()
                .selectAs(PlatformJob::getId,PlatformJob::getId)
                .select(PlatformJob::getTotalNum,PlatformJob::getTotalNum)
//                .select("select sum(io_qty) from platform_wms_details a where a.isdeleted=0 and a.job_id=t.id",create_date)
                        .eq(PlatformJob::getIsdeleted,Constants.ZERO)
//                        .in(PlatformJob::getType,Constants.ONE,Constants.THREE)
                        .in(PlatformJob::getStatus,Constants.PlatformJobStatus.DONE.getKey(),Constants.PlatformJobStatus.LEAVED.getKey(),Constants.PlatformJobStatus.AUTHED_LEAVE.getKey())
                        .apply("year(create_date) = year("+DateUtil.getPlusTime2(month)+") and month(create_date) = month("+DateUtil.getPlusTime2(month)+") and to_days(create_date)<= "+DateUtil.getPlusTime2(month)));
        List<PlatformJob>  monthLastNum = platformJobMapper.selectJoinList(PlatformJob.class,
                new MPJLambdaWrapper<PlatformJob>()
                        .selectAs(PlatformJob::getId,PlatformJob::getId)
//                        .select("select sum(io_qty) from platform_wms_details a where a.isdeleted=0 and a.job_id=t.id",create_date)
                        .eq(PlatformJob::getIsdeleted,Constants.ZERO)
                        .in(PlatformJob::getType,Constants.ONE,Constants.THREE)
                        .in(PlatformJob::getStatus,Constants.PlatformJobStatus.DONE.getKey(),Constants.PlatformJobStatus.LEAVED.getKey(),Constants.PlatformJobStatus.AUTHED_LEAVE.getKey())
                        .apply("year(create_date) = year("+DateUtil.getPlusTime2(lastMonth)+") and month(create_date) = month("+DateUtil.getPlusTime2(lastMonth)+") and to_days(create_date)<= "+DateUtil.getPlusTime2(lastMonth)));
        List<PlatformJob>  yearNum = platformJobMapper.selectJoinList(PlatformJob.class,
                new MPJLambdaWrapper<PlatformJob>()
                        .selectAs(PlatformJob::getId,PlatformJob::getId)
                        .select(PlatformJob::getTotalNum,PlatformJob::getTotalNum)
                        .selectCount(PlatformJob::getPlatformId,PlatformJob::getCountum)
//                        .select("select sum(io_qty) from platform_wms_details a where a.isdeleted=0 and a.job_id=t.id",create_date)
                        .eq(PlatformJob::getIsdeleted,Constants.ZERO)
                        .in(PlatformJob::getType,Constants.ONE,Constants.THREE)
                        .in(PlatformJob::getStatus,Constants.PlatformJobStatus.DONE.getKey(),Constants.PlatformJobStatus.LEAVED.getKey(),Constants.PlatformJobStatus.AUTHED_LEAVE.getKey())
                        .apply("year(create_date) = year("+DateUtil.getPlusTime2(year)+")   and to_days(create_date)<= "+DateUtil.getPlusTime2(year)));
        List<PlatformJob> yearLastNum = platformJobMapper.selectJoinList(PlatformJob.class,
                new MPJLambdaWrapper<PlatformJob>()
                        .selectAs(PlatformJob::getId,PlatformJob::getId)
                        .select(PlatformJob::getTotalNum,PlatformJob::getTotalNum)
//                        .select("select sum(io_qty) from platform_wms_details a where a.isdeleted=0 and a.job_id=t.id",create_date)
                        .eq(PlatformJob::getIsdeleted,Constants.ZERO)
                        .in(PlatformJob::getType,Constants.ONE,Constants.THREE)
                        .in(PlatformJob::getStatus,Constants.PlatformJobStatus.DONE.getKey(),Constants.PlatformJobStatus.LEAVED.getKey(),Constants.PlatformJobStatus.AUTHED_LEAVE.getKey())
                        .apply("year(create_date) = year("+DateUtil.getPlusTime2(lastYear)+")  and to_days(create_date)<= "+DateUtil.getPlusTime2(lastYear)));
        data.setMonthOutTotal(getSumTotalByList(monthNum,0,null));//本月出库量
        data.setMonthLastOutTotal(getSumTotalByList(monthLastNum,null,null) );//上有出库量
        data.setYearOutTotal(getSumTotalByList(yearNum,null,null)  );//本年出库量
        data.setYearLastOutTotal(getSumTotalByList(yearLastNum,null,null) );//去年出库量
        data.setMonthOutTimes(monthNum!=null?monthNum.size():0);
        data.setYearOutTimes(yearNum!=null?yearNum.size():0);
        //==========今天之前未完成出入库任务
        List<PlatformJob> beforeJobNum = platformJobMapper.selectJoinList(PlatformJob.class,
                new MPJLambdaWrapper<PlatformJob>()
                        .selectAs(PlatformJob::getId,PlatformJob::getId)
                        .selectAs(PlatformJob::getStatus,PlatformJob::getStatus)
                        .selectAs(PlatformJob::getType,PlatformJob::getType)
                        .select(PlatformJob::getTotalNum,PlatformJob::getTotalNum)
//                        .select("select sum(io_qty) from platform_wms_details a where a.isdeleted=0 and a.job_id=t.id",create_date)
                        .eq(PlatformJob::getIsdeleted,Constants.ZERO)
                        .notIn(PlatformJob::getStatus,Constants.PlatformJobStatus.DONE.getKey(),Constants.PlatformJobStatus.LEAVED.getKey(),Constants.PlatformJobStatus.AUTHED_LEAVE.getKey(),Constants.PlatformJobStatus.CALLED.getKey())
                        .apply(" and to_days(create_date) <to_days(now())"));
        //==========今天出入库任务
        List<PlatformJob> currentNum = platformJobMapper.selectJoinList(PlatformJob.class,
                new MPJLambdaWrapper<PlatformJob>()
                        .selectAs(PlatformJob::getId,PlatformJob::getId)
                        .selectAs(PlatformJob::getStatus,PlatformJob::getStatus)
                        .selectAs(PlatformJob::getType,PlatformJob::getType)
                        .select(PlatformJob::getTotalNum,PlatformJob::getTotalNum)
//                        .select("select sum(io_qty) from platform_wms_details a where a.isdeleted=0 and a.job_id=t.id",create_date)
                        .eq(PlatformJob::getIsdeleted,Constants.ZERO)
                        .notIn(PlatformJob::getStatus,Constants.PlatformJobStatus.CALLED.getKey())
                        .apply("year(create_date) = year("+DateUtil.getPlusTime2(lastYear)+")  and to_days(create_date)<= "+DateUtil.getPlusTime2(lastYear)));
        BigDecimal beforeOutNum = (getSumTotalByList(beforeJobNum,0,null));//今天之前未完成出库任务
        BigDecimal currentOutNum = (getSumTotalByList(currentNum,0,null));//今天下发出库任务
        BigDecimal beforeInNum = (getSumTotalByList(beforeJobNum,1,null));//今天之前未完成入库任务
        BigDecimal currentInNum = (getSumTotalByList(currentNum,1,null));//今天下发入库任务
        data.setCurrentInNum(beforeInNum.add(currentInNum));//当前入库总任务成量
        data.setCurrentOutNum(beforeOutNum.add(currentOutNum));//当前出库总任务成量
        data.setCurrentInDoneNum(getSumTotalByList(currentNum,0,1));//今日完成量
        data.setCurrentOutDoneNum(getSumTotalByList(currentNum,1,1));//今日完成量
        //------------今日出入库效率----------------
        BigDecimal outHours = getTotalDoneTimes(currentNum,0);//
        BigDecimal inHours = getTotalDoneTimes(currentNum,1);//
        if(outHours.compareTo(new BigDecimal(0))>0){
            data.setTodayOutRate(data.getCurrentOutDoneNum().divide(outHours,2));//当前入库总任务成量
        }
        if(inHours.compareTo(new BigDecimal(0))>0){
            data.setTodayInRate(data.getCurrentInDoneNum().divide(inHours,2));//当前入库总任务成量
        }
        //------------本月出入库效率----------------
        BigDecimal outMonthNum = getSumTotalByList(monthNum,0,null).add(data.getCurrentOutDoneNum());
        BigDecimal inMonthNum = getSumTotalByList(monthNum,1,null).add(data.getCurrentInDoneNum());
        BigDecimal outYearHours = getTotalDoneTimes(yearNum,0).add(outHours);//
        BigDecimal inYearHours = getTotalDoneTimes(yearNum,1).add(inHours);//
        if(outYearHours.compareTo(new BigDecimal(0))>0){
            data.setMonthOutRate(outMonthNum.divide(outYearHours,2));//本月入库效率
        }
        if(inYearHours.compareTo(new BigDecimal(0))>0){
            data.setMonthInRate(inMonthNum.divide(inYearHours,2));//本月入库效率
        }
        return data;
    }
    private BigDecimal getDoneHoursByData(String start ,String end) {
        List<PlatformLog> platformLogList = platformLogMapper.selectList(new QueryWrapper<PlatformLog>().lambda()
                .apply("create_date >= '"+start+"' and create_date <= '"+end+"'")
                .isNotNull(PlatformLog::getParam3)
                .ne(PlatformLog::getParam3,Constants.ZERO+""));
        if(platformLogList!=null && platformLogList.size()>0){
            return new BigDecimal((double)(platformLogList.stream().map(m->Long.valueOf(m.getParam3())).reduce(Long.valueOf(0),Long::sum))/(double)60);
        }
        return new BigDecimal(0);
    }
    private BigDecimal getTotalDoneTimes(List<PlatformJob> list, Integer type) {
        BigDecimal r = new BigDecimal(0);
        if(list==null || list.size() == 0){
            return r;
        }
        List<Integer> jobIds= new ArrayList<>();
        for(PlatformJob job : list){
            if( !(Constants.equalsInteger(job.getStatus(),Constants.PlatformJobStatus.DONE.getKey())
                    ||Constants.equalsInteger(job.getStatus(),Constants.PlatformJobStatus.LEAVED.getKey())
                    ||Constants.equalsInteger(job.getStatus(),Constants.PlatformJobStatus.AUTHED_LEAVE.getKey()))){
                //只查询完成数据
                continue;
            }
            if(type !=null &&type ==0 &&  (Constants.equalsInteger(job.getType(),Constants.ONE) ||Constants.equalsInteger(job.getType(),Constants.THREE))){
               //出库
               jobIds.add(job.getId());
            }
            if(type !=null &&type ==1 &&  (Constants.equalsInteger(job.getType(),Constants.ZERO) ||Constants.equalsInteger(job.getType(),Constants.TWO)||Constants.equalsInteger(job.getType(),Constants.FOUR))){
                //入库
                jobIds.add(job.getId());
            }
        }
        if(jobIds.size()>0){
            //处理作业时长
            List<PlatformLog> platformLogList = platformLogMapper.selectList(new QueryWrapper<PlatformLog>().lambda()
                    .in(PlatformLog::getJobId,jobIds)
                    .isNotNull(PlatformLog::getParam3)
                    .ne(PlatformLog::getParam3,Constants.ZERO+""));
            if(platformLogList!=null && platformLogList.size()>0){
                return new BigDecimal((double)(platformLogList.stream().map(m->Long.valueOf(m.getParam3())).reduce(Long.valueOf(0),Long::sum))/(double)60);
            }
        }
        return r;
    }
    private BigDecimal getSumTotalByList(List<PlatformJob> list,Integer type,Integer status) {
        BigDecimal r = new BigDecimal(0);
        if(list==null || list.size() == 0){
            return r;
        }
        for(PlatformJob job : list){
            if(type !=null &&type ==0 && !(Constants.equalsInteger(job.getType(),Constants.ONE) ||Constants.equalsInteger(job.getType(),Constants.THREE))){
                continue;
            }
            if(type !=null &&type ==1 && !(Constants.equalsInteger(job.getType(),Constants.ZERO) ||Constants.equalsInteger(job.getType(),Constants.TWO)||Constants.equalsInteger(job.getType(),Constants.FOUR))){
                continue;
            }
            if(status !=null &&status ==1 && !(Constants.equalsInteger(job.getStatus(),Constants.PlatformJobStatus.DONE.getKey())
                    ||Constants.equalsInteger(job.getStatus(),Constants.PlatformJobStatus.LEAVED.getKey())
                    ||Constants.equalsInteger(job.getStatus(),Constants.PlatformJobStatus.AUTHED_LEAVE.getKey()))){
                continue;
            }
//            if(Constants.formatBigdecimal(job.getIoQty()).compareTo(new BigDecimal(0)) >0){
//                r.add( job.getIoQty());
//            }else{
                r.add(Constants.formatBigdecimal(job.getTotalNum()));
//            }
        }
        return Constants.formatBigdecimal0Float(r);
    }
    @Override
    public     BoardCarsListVO platformJobCarsList(){
        BoardCarsListVO data = new BoardCarsListVO();
        List<CarsDeviceDetaisResponse> detaisResponses = HKCarOpenService.getAllCarsDetais();
        data.setCarsList(detaisResponses);
        if(data.getCarsList()!=null && data.getCarsList().size()>0){
            List<String> codes = new ArrayList<>();
            //设备状态 0:离线;1:在线;2:休眠
            int online = 0;
            for(CarsDeviceDetaisResponse model:detaisResponses){
                if(Constants.equalsInteger(model.getStatus(),Constants.ONE) ||Constants.equalsInteger(model.getStatus(),Constants.TWO)){
                   //如果是在线或者休眠,查询在途还是空闲
                    codes.add(model.getPlateNum());
                }else
                    data.setOfflineNum(data.getOfflineNum()+1);
                }
            if(codes.size()>0){
                //状态 0待确认 1待签到 2等待叫号 3入园等待 4已叫号 5作业中 6作业完成 7转移中 8异常挂起 9已授权离园 10已离园 11 å·²è¿‡å·  12取消(WMS)
                long busyNum = platformJobMapper.selectCount(new QueryWrapper<PlatformJob>().lambda()
                        .eq(PlatformJob::getIsdeleted,Constants.ZERO)
                        .in(PlatformJob::getCarCodeFront,codes)
                        .in(PlatformJob::getStatus,Constants.PlatformJobStatus.WORKING.getKey()
                                ,Constants.PlatformJobStatus.WAIT_CALL.getKey()
                                ,Constants.PlatformJobStatus.CALLED.getKey()
                                ,Constants.PlatformJobStatus.IN_WAIT.getKey()
                                ,Constants.PlatformJobStatus.TRANSFERING.getKey()
                                ,Constants.PlatformJobStatus.WART_SIGN_IN.getKey()
                                ,Constants.PlatformJobStatus.WAIT_CONFIRM.getKey()
                                ,Constants.PlatformJobStatus.EXCEPTION.getKey())
                        .groupBy(PlatformJob::getCarCodeFront));
                data.setBusyNum((int)busyNum);//在途有任务数量
                data.setIdleNum(codes.size() -data.getBusyNum());//无任务空闲数量
            }
        }
        return  data;
    }
    public static AlarmDataVO getAlertDataByStartEndTime(String start,String end){
@@ -615,12 +1055,12 @@
        data.setDeviceTypeList(list);
        Long totalNum =hiddenDangerMapper.selectCount(new QueryWrapper<HiddenDanger>().lambda()
                .eq(HiddenDanger::getIsdeleted,Constants.ZERO )
                .apply("to_day(create_data) = to_days(now())" ) );
                .apply("to_days(create_date) = to_days(now())" ) );
        data.setDangerTotalNum(totalNum !=null?totalNum.intValue():0);//今日隐患数量
        totalNum =hiddenDangerMapper.selectCount(new QueryWrapper<HiddenDanger>().lambda()
                .eq(HiddenDanger::getIsdeleted,Constants.ZERO )
                .in(HiddenDanger::getStatus,Constants.ONE,Constants.TWO )
                .apply("to_day(check_date) = to_days(now())" ) );
                .apply("to_days(check_date) = to_days(now())" ) );
        data.setDangerDealedNum(totalNum !=null?totalNum.intValue():0);//今日处理隐患数量
        return  data;
    }
@@ -1065,7 +1505,7 @@
        List<WorkEfficiencyVO> workEfficiencyVOList = new ArrayList<>();
        List<PlatformJob> jobList = platformJobMapper.selectJoinList(PlatformJob.class, new MPJLambdaWrapper<PlatformJob>()
                .selectAll( PlatformJob.class)
                .select("(select sum(ifnull(a.io_qty,0)) from platform_wms_detail a where a.isdeleted=0 and a.job_id =t.id )", PlatformJob::getIoQty)
//                .select("(select sum(ifnull(a.io_qty,0)) from platform_wms_detail a where a.isdeleted=0 and a.job_id =t.id )", create_date)
                .apply("to_days(t.create_date) = to_days(now())")
                .eq(Platform::getIsdeleted, Constants.ZERO)
                .in(PlatformJob::getStatus, Constants.PlatformJobStatus.DONE.getKey()
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/thrid/WmsServiceImpl.java
@@ -12,6 +12,8 @@
import com.doumee.core.wms.model.response.WmsBaseDataResponse;
import com.doumee.core.wms.model.response.WmsBaseResponse;
import com.doumee.core.wms.model.response.WmsInventoryDataResponse;
import com.doumee.core.wx.wxPlat.WxPlatConstants;
import com.doumee.core.wx.wxPlat.WxPlatNotice;
import com.doumee.dao.business.*;
import com.doumee.dao.business.dao.SmsConfigMapper;
import com.doumee.dao.business.dao.SmsEmailMapper;
@@ -28,6 +30,7 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
@@ -63,6 +66,8 @@
    private EmayService emayService;
    @Autowired
    private RetentionMapper retentionMapper;
    @Autowired
    private WxNoticeConfigMapper wxNoticeConfigMapper;
    /**
     * å…¥åº“通知任务业务处理
     * @param job å‚æ•°
@@ -261,6 +266,7 @@
                    job.setPlateNumber(param.getPlateNumber());
                    job.setType(Constants.ZERO);
                    job.setIoCreatedate(param.getCreateDate());
//                    job.setOrigin(Constants.ONE);
                    job.setJobId(model.getId());
                    job.setDriverPhone(param.getDriverPhone());
                    platformWmsJobMapper.insert(job);
@@ -316,7 +322,22 @@
                        emayService,smsEmailMapper,smsConfigMapper,platformJobMapper,job.getId(),
                        SmsConstants.platformJobContent.platformJobNewJob,null,null
                );
                //查询司机信息 å‘送公众号通知
                if(Objects.nonNull(job.getDriverId())){
                    Member member = memberMapper.selectOne(new QueryWrapper<Member>().lambda().eq(Member::getPhone,job.getDriverId()));
                    if(Objects.nonNull(member) && StringUtils.isNotBlank(member.getOpenid())){
                        WxPlatNotice wxPlatNotice = new WxPlatNotice();
                        wxPlatNotice.sendWmsTemplateNotice(
                                wxNoticeConfigMapper,job,
                                WxPlatConstants.platformJobContent.platformJobNewJob,
                                systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_ACCESS_TOKEN).getCode(),
                                Arrays.asList(member.getOpenid().split(","))
                        );
                    }
                }
            }
        }
    }
@@ -331,6 +352,7 @@
        job.setCarCodeFront(param.getPlateNumber());
        job.setDrivierPhone(param.getDriverPhone());
        job.setDriverName(param.getDriverName());
        job.setOrigin(Constants.ONE);
        //处理作业的车辆、司机、月台组关联关系,卸货
        dealCarPlatformAndDriverInfo(job,0);
//        platformJobMapper.insert(job);
@@ -399,6 +421,7 @@
        job.setCarCodeFront(param.getPlateNumber());
        job.setDrivierPhone(param.getDriverPhone());
        job.setDriverName(param.getDriverName());
        job.setOrigin(Constants.ONE);
        //处理作业的车辆、司机、月台组关联关系,装货
        dealCarPlatformAndDriverInfo(job,1);
        return job;
@@ -416,6 +439,7 @@
                return returnFailReuslt("请求参数不正确,参数不能为空");
            }
            List<PlatformJob> jobList = new ArrayList<>();
            List<Integer> jobIdList = new ArrayList<>();
            List<PlatformWmsDetail> details = new ArrayList<>();
            List<String> iocodeList = new ArrayList<>();
            for(WmsOutboundNoticeRequest param : list.getData()){
@@ -450,9 +474,10 @@
                    job.setContractNum(param.getContractNum());
                    job.setDriverPhone(param.getDriverPhone());
                    job.setDriverName(param.getDriverName());
//                    job.setOrigin(Constants.ONE);
                    platformWmsJobMapper.insert(job);
                    jobList.add(model);
                }
                jobIdList.add(job.getId());
                if(param.getDetails()!=null && param.getDetails().size()>0){
                    for(WmsOutboundDetailRequest d :param.getDetails()){
                        PlatformWmsDetail entity = new PlatformWmsDetail();
@@ -462,6 +487,7 @@
                        entity.setJobId(job.getJobId());
                        entity.setWmsJobId(job.getId());
                        entity.setIoQty(d.getIoQty());
                        entity.setRepertotyAddress(job.getRepertotyAddress());
                        entity.setWmsJobId(job.getId());
                        entity.setStatus(Constants.ZERO);
                        entity.setRate(d.getRate());
@@ -478,12 +504,14 @@
                                .in(PlatformWmsDetail::getIocode,iocodeList)
                        );
                    }
                    jobIdList.add(job.getId());
                }
            }
            if(details.size()>0){
                platformWmsDetailMapper.insert(details);
            }
            if(jobList.size()>0){
                list.setJobIdList(jobIdList);
                startEndNoticeToDriver(jobList);
            }
        }catch (Exception e){
@@ -537,12 +565,29 @@
                            .set(PlatformJob::getStatus,Constants.PlatformJobStatus.CANCEL.getKey())
                            .in(PlatformJob::getId,setJobIds)
                    );
                    for (Integer jobId:setJobIds
                    ) {
                        //短信通知
                        SmsEmailServiceImpl.sendPlatformJobSms(systemDictDataBiz,
                                emayService,smsEmailMapper,smsConfigMapper,platformJobMapper,jobId,
                                SmsConstants.platformJobContent.platformJobStopJob,null,null
                        );
                        //公众号通知司机 ä»»åŠ¡å–æ¶ˆ
                        PlatformJob job = platformJobMapper.selectById(jobId);
                        if(Objects.nonNull(job)){
                             Member member = memberMapper.selectById(job.getDriverId());
                            if(Objects.nonNull(member) && StringUtils.isNotBlank(member.getOpenid())){
                                WxPlatNotice wxPlatNotice = new WxPlatNotice();
                                wxPlatNotice.sendWmsCancelTemplateNotice(
                                        wxNoticeConfigMapper,job,
                                        WxPlatConstants.platformJobContent.platformJobCancel,
                                        systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_ACCESS_TOKEN).getCode(),
                                        Arrays.asList(member.getOpenid().split(","))
                                );
                            }
                        }
                    }
                }
            }
@@ -603,6 +648,21 @@
                                emayService,smsEmailMapper,smsConfigMapper,platformJobMapper,jobId,
                                SmsConstants.platformJobContent.platformJobStopJob,null,null
                        );
                        //公众号通知司机 ä»»åŠ¡å–æ¶ˆ
                        PlatformJob job = platformJobMapper.selectById(jobId);
                        if(Objects.nonNull(job)){
                             Member member = memberMapper.selectById(job.getDriverId());
                            if(Objects.nonNull(member) && StringUtils.isNotBlank(member.getOpenid())){
                                WxPlatNotice wxPlatNotice = new WxPlatNotice();
                                wxPlatNotice.sendWmsCancelTemplateNotice(
                                        wxNoticeConfigMapper,job,
                                        WxPlatConstants.platformJobContent.platformJobCancel,
                                        systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_ACCESS_TOKEN).getCode(),
                                        Arrays.asList(member.getOpenid().split(","))
                                );
                            }
                        }
                    }
                }
            }
@@ -615,6 +675,33 @@
        return returnSuccessReuslt(null);
    }
    /**
     * å¤„理作业行数据的运输总量信息
     * @param jobList å‚æ•°
     * @return
     */
    @Override
    public void computjobTotalNum(List<Integer> jobList) {
        if(jobList==null || jobList.size()==0){
            return;
        }
        for(Integer jobId : jobList){
            BigDecimal num = new BigDecimal(0);
            List<PlatformWmsDetail> details =   platformWmsDetailMapper.selectList( new QueryWrapper<PlatformWmsDetail>().lambda()
                    .eq(PlatformWmsDetail::getJobId,jobId)
                    .eq(PlatformWmsDetail::getIsdeleted, Constants.ZERO));
            if(details!=null && details.size()>0){
                for(PlatformWmsDetail d :details){
                   num.add(Constants.formatBigdecimal(d.getIoQty()));
                }
                platformJobMapper.update(null,new UpdateWrapper<PlatformJob>().lambda()
                        .set(PlatformJob::getTotalNum,num)
                        .eq(PlatformJob::getOrigin, Constants.ZERO)
                        .eq(PlatformJob::getId, jobId));
            }
        }
    }
    /**
     * ä½œä¸šå®Œæˆé€šçŸ¥ä»»åŠ¡ä¸šåŠ¡å¤„ç†
     * @param list å‚æ•°
     * @return
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/third/BoardService.java
@@ -4,14 +4,8 @@
import com.doumee.core.haikang.model.param.respose.PageRegionInfoResponse;
import com.doumee.core.haikang.model.param.respose.PageSensorStatusResponse;
import com.doumee.core.haikang.model.param.respose.RegionEnergyListResponse;
import com.doumee.core.tms.model.request.TmsLockStatusQueryRequest;
import com.doumee.core.tms.model.request.TmsOrderInfoRequest;
import com.doumee.core.tms.model.request.TmsOrderListRequest;
import com.doumee.core.tms.model.response.TmsBaseResponse;
import com.doumee.core.tms.model.response.TmsLockStatusQueryResponse;
import com.doumee.core.tms.model.response.TmsOrderInfoResponse;
import com.doumee.core.tms.model.response.TmsOrderListResponse;
import com.doumee.dao.business.model.PlatformWarnEvent;
import com.doumee.dao.web.reqeust.CarsJobAndContractDTO;
import com.doumee.dao.web.response.platformReport.*;
import java.util.List;
@@ -81,4 +75,14 @@
    List<AlarmDataVO> fightingAlarmHandleData();
    List<MonitorDataVO> monitorDataList();
    BoardCarsListVO platformJobCarsList();
    PlatformJobRunBoardNewVO platformJobCenterData();
    CarsJobAndContractVO getCarsJobDetails(CarsJobAndContractDTO param);
    List<TransportMeasureVO> transportMeasure(Integer queryType);
    BoardStockListVO stockList();
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/third/WmsService.java
@@ -5,6 +5,7 @@
import com.doumee.core.wms.model.request.WmsInboundNoticeRequest;
import com.doumee.core.wms.model.request.WmsOutboundNoticeRequest;
import com.doumee.core.wms.model.response.WmsBaseResponse;
import com.doumee.core.wms.model.response.WmsInventoryDataResponse;
import com.doumee.dao.business.model.PlatformJob;
import java.util.List;
@@ -21,7 +22,7 @@
     * @return WmsBaseResponse
     */
    WmsBaseResponse orderPlatformBind(PlatformJob job);
    WmsBaseResponse getInventoryList();
    WmsBaseResponse<WmsInventoryDataResponse> getInventoryList();
    void  saveInterfaceLog(String url,String name,String  param,Integer success,String respone,int type);
    /**
     * å…¥åº“单批量通知
@@ -57,4 +58,5 @@
    WmsBaseResponse doneTask(WmsBaseRequest<WmsActionNoticeRequest> list);
    void computjobTotalNum(List<Integer> jobList);
}
server/visits/openapi/src/main/resources/application.yml
@@ -36,7 +36,7 @@
cache:
  session:
    # ä¼šè¯è¿‡æœŸæ—¶é•¿(s)
    expire: 18000
    expire: 1800
  captcha:
    # éªŒè¯ç è¿‡æœŸæ—¶é•¿(s)
    expire: 300