k94314517
2025-03-06 15b5c60d13655519a3a744a67e988b45656508a4
Merge remote-tracking branch 'origin/master'
已添加1个文件
已修改5个文件
256 ■■■■ 文件已修改
admin/src/api/business/visitEvent.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/dangerStatic.vue 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/visitEvent.vue 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/index.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/Constants.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitEventServiceImpl.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/visitEvent.js
@@ -14,3 +14,8 @@
    download: true
  })
}
export function fetchcountNum (data) {
  return request.post('/visitsAdmin/cloudService/business/visitEvent/countNum', data, {
    trim: true
  })
}
admin/src/views/business/dangerStatic.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,112 @@
<template>
  <div class="main_app">
    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getData(1)" @clear="clear"
      @changeForm='changeForm'>
      <template #fastdate>
        <el-radio-group v-model="filters.fastdate" size="small" @input="changeForm">
          <el-radio-button label="0">当天</el-radio-button>
          <el-radio-button label="6">近7天</el-radio-button>
          <el-radio-button label="29">近30天</el-radio-button>
        </el-radio-group>
      </template>
    </QueryForm>
    <div class="main_content">
      <div class="type_wrap">
        <div class="title">隐患类型统计</div>
        <div class="type" ref="typeRef"></div>
      </div>
      <div class="dept_wrap">
        <div class="title">隐患归属部门统计</div>
        <div class="dept" ref="deptRef"></div>
      </div>
    </div>
  </div>
</template>
<script>
import QueryForm from '@/components/common/QueryForm'
import echarts from 'echarts'
export default {
  components: {
    QueryForm,
  },
  data() {
    return {
      filters: {},
      queryFormConfig: {
        formItems: [
          {
            filed: 'status',
            type: 'select',
            label: '状态',
            options: [
              { label: '访客申请', value: '0' },
              { label: '访客报备', value: '1' },
              { label: '用车申请', value: '2' },
              { label: '隐患随手拍', value: '3' },
              { label: '物流车申请', value: '6' }
            ]
          },
          {
            filed1: 'startDate',
            filed2: 'endDate',
            type: 'datetime',
            label: '提报时间'
          },
          {
            type: 'slot',
            filed: 'fastdate',
            label: ''
          }
        ],
        online: true
      },
    }
  },
  methods: {
    getData(page) {
      console.log(this.filters)
    },
    changeForm(form) {
      console.log(form)
    },
    clear() {
      this.filters = {}
    }
  }
}
</script>
<style lang="scss" scoped>
.main_app {
  height: 100%;
}
.main_content {
  display: flex;
  height: calc(100% - 110px);
  .title {
    font-weight: 600;
    font-size: 16px;
    color: #222222;
    margin-bottom: 20px;
    margin-top: 20px;
  }
  .type_wrap {
    flex: 5;
    flex-shrink: 0;
    border: 1px solid #E5E5E5;
    height: 100%;
    border-right: 12px solid #f7f7f7;
  }
  .dept_wrap {
    flex: 4;
    flex-shrink: 0;
    border: 1px solid #E5E5E5;
    height: 100%;
    padding-left: 20px;
  }
}
</style>
admin/src/views/business/visitEvent.vue
@@ -1,58 +1,64 @@
<template>
  <TableLayout :permissions="['business:visitevent:query']">
    <!-- æœç´¢è¡¨å• -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <el-form-item label="姓名/手机号" prop="keyWords">
        <el-input v-model="searchForm.keyWords" placeholder="请输入姓名/手机号" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="车牌号" prop="carNo">
        <el-input v-model="searchForm.carNo" placeholder="请输入车牌号" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="组织名称" prop="visitorWorkUint">
        <el-input v-model="searchForm.visitorWorkUint" placeholder="请输入组织名称" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="事件类型" prop="eventType">
        <el-select v-model="searchForm.eventType" placeholder="请选择">
          <el-option label="访客登记" value="541200006"></el-option>
          <el-option label="访客签离" value="541200007"></el-option>
          <el-option label="访客通行" value="541200060"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="进出类型" prop="inOrOut">
        <el-select v-model="searchForm.inOrOut" placeholder="请选择">
          <el-option label="进" value="0"></el-option>
          <el-option label="出" value="1"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="起始时间" prop="carNo">
        <!-- <el-date-picker @change="seleTime" v-model="time" type="datetimerange" format="yyyy-MM-dd HH:mm:ss"
    <div slot="search-form" ref="QueryFormRef">
      <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
        <el-form-item label="姓名/手机号" prop="keyWords">
          <el-input v-model="searchForm.keyWords" placeholder="请输入姓名/手机号" @keypress.enter.native="search"></el-input>
        </el-form-item>
        <el-form-item label="车牌号" prop="carNo">
          <el-input v-model="searchForm.carNo" placeholder="请输入车牌号" @keypress.enter.native="search"></el-input>
        </el-form-item>
        <el-form-item label="组织名称" prop="visitorWorkUint">
          <el-input v-model="searchForm.visitorWorkUint" placeholder="请输入组织名称"
            @keypress.enter.native="search"></el-input>
        </el-form-item>
        <el-form-item label="事件类型" prop="eventType">
          <el-select v-model="searchForm.eventType" placeholder="请选择">
            <el-option label="访客登记" value="541200006"></el-option>
            <el-option label="访客签离" value="541200007"></el-option>
            <el-option label="访客通行" value="541200060"></el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="进出类型" prop="inOrOut">
          <el-select v-model="searchForm.inOrOut" placeholder="请选择">
            <el-option label="进" value="0"></el-option>
            <el-option label="出" value="1"></el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="起始时间" prop="carNo">
          <!-- <el-date-picker @change="seleTime" v-model="time" type="datetimerange" format="yyyy-MM-dd HH:mm:ss"
          value-format="yyyy-MM-dd HH:mm:ss" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期">
        </el-date-picker> -->
        <el-date-picker type="datetime" v-model="searchForm.startTime" value-format="yyyy-MM-dd HH:mm:ss"
          placeholder="请选择开始时间" @change="changeRadio" />
        <el-date-picker type="datetime" v-model="searchForm.endTime" value-format="yyyy-MM-dd HH:mm:ss"
          placeholder="请选择结束时间" @change="changeRadio" />
      </el-form-item>
      <el-radio-group v-model="searchForm.radio" size="small" @input="changeRadio">
        <el-radio-button label="0">当天</el-radio-button>
        <el-radio-button label="1">近7天</el-radio-button>
        <el-radio-button label="2">近30天</el-radio-button>
      </el-radio-group>
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
        <el-button @click="reset">重置</el-button>
      </section>
    </el-form>
          <el-date-picker type="datetime" v-model="searchForm.startTime" value-format="yyyy-MM-dd HH:mm:ss"
            placeholder="请选择开始时间" @change="changeRadio" />
          <el-date-picker type="datetime" v-model="searchForm.endTime" value-format="yyyy-MM-dd HH:mm:ss"
            placeholder="请选择结束时间" @change="changeRadio" />
        </el-form-item>
        <el-radio-group v-model="searchForm.radio" size="small" @input="changeRadio">
          <el-radio-button label="0">当天</el-radio-button>
          <el-radio-button label="1">近7天</el-radio-button>
          <el-radio-button label="2">近30天</el-radio-button>
        </el-radio-group>
        <section>
          <el-button type="primary" @click="search">搜索</el-button>
          <el-button @click="reset">重置</el-button>
        </section>
      </el-form>
    </div>
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['business:visitevent:exportExcel']">
        <li><el-button type="primary" :loading="isWorking.export" v-permissions="['business:visitevent:exportExcel']"
            @click="exportExcel">导出</el-button></li>
        <li class="ml20"> æ‹œè®¿äººæ¬¡ï¼š<span class="primaryColor">{{staticObj.eventNum}}次</span></li>
        <li class="ml20"> æ‹œè®¿äººæ•°ï¼š<span class="primaryColor">{{staticObj.visitorNum}}人</span></li>
      </ul>
      <el-table v-loading="isWorking.search" :data="tableData.list" stripe>
        <el-table-column prop="personName" label="姓名" min-width="100px"></el-table-column>
      <el-table :max-height="tableHeight" v-loading="isWorking.search" :data="tableData.list" stripe>
        <el-table-column prop="personName" label="姓名" min-width="90px"></el-table-column>
        <el-table-column prop="phone" label="手机号码" min-width="100px"></el-table-column>
        <el-table-column prop="idcardDecode" label="身份证号码" min-width="100px"></el-table-column>
        <el-table-column prop="idcardDecode" label="身份证号码" min-width="120px"></el-table-column>
        <el-table-column prop="visitorWorkUint" label="组织" min-width="100px"></el-table-column>
        <el-table-column prop="carNo" label="车牌号" min-width="100px"></el-table-column>
        <el-table-column prop="beVisitedPersonName" label="被访人" min-width="100px"></el-table-column>
@@ -72,7 +78,7 @@
            </el-image>
          </template>
        </el-table-column>
        <el-table-column prop="createDate" label="事件时间" min-width="100px"></el-table-column>
        <el-table-column prop="createDate" label="事件时间" min-width="120px"></el-table-column>
      </el-table>
      <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="tableData.pagination">
      </pagination>
@@ -85,6 +91,7 @@
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import { timeForMat } from '@/utils/util'
import { fetchcountNum } from '@/api/business/visitEvent'
export default {
  name: 'VisitEvent',
  extends: BaseTable,
@@ -103,7 +110,9 @@
        visitorWorkUint: '',
        radio: '0'
      },
      time: []
      tableHeight: 400,
      time: [],
      staticObj: {}
    }
  },
  created() {
@@ -117,12 +126,22 @@
    this.changeRadio('0')
    this.search()
  },
  mounted() {
    this.$nextTick(() => {
      this.tableHeight = document.body.scrollHeight - this.$refs.QueryFormRef.offsetHeight - 300
    })
  },
  methods: {
    seleTime(e) {
      this.searchForm.startTime = e[0]
      this.searchForm.endTime = e[1]
      this.searchForm.radio = null
      this.search()
    },
    getCountNum() {
      fetchcountNum(this.searchForm).then(res => {
        this.staticObj = res
      })
    },
    changeRadio(e) {
      if (e === '0') {
@@ -149,7 +168,11 @@
      this.time = []
      this.searchForm = {}
      this.search()
    }
    },
    search() {
      this.getCountNum()
      this.handlePageChange(1)
    },
  }
}
</script>
admin/src/views/platform/index.vue
@@ -202,17 +202,26 @@
      detail: {},
      isShowQueuing: false,
      timer: null,
      timer2: null,
      loadingOpen: false,
      loadingFinish: false,
    }
  },
  created() {
    setInterval(() => {
    this.timer2 = setInterval(() => {
      this.getPlatGroupList()
    }, 1000 * 20)
    this.getPlatGroupList()
  },
  beforeDestroy() {
    if (this.timer2) {
      clearInterval(this.timer2)
    }
    if (this.timer) {
      clearInterval(this.timer)
    }
  },
  methods: {
    handleWork(item) {
      this.loadingOpen = true
server/system_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -726,7 +726,7 @@
                "meeting_user_rel ur\n" +
                "LEFT JOIN `SYSTEM_USER` su ON ur.USER_ID = su.id \n" +
                "LEFT JOIN meeting_book b ON ur.OBJ_ID = b.id \n" +
                "WHERE DATE_FORMAT(b.START_TIME,'%Y') = #{yearNum} AND b.STATUS = 0" +
                "WHERE DATE_FORMAT(b.START_TIME,'%Y') = #{yearNum} AND b.STATUS in(0,2) and b.isdeleted=0" +
                "<if test='userId != null'>"+
                "and ur.USER_ID = #{userId}\n" +
                "</if>"+
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitEventServiceImpl.java
@@ -258,17 +258,18 @@
        if(count!=null){
            data.setEventNum(count);
        }
        Long count1 = visitEventJoinMapper.selectCount(new QueryWrapper<VisitEvent>().lambda()
        VisitEvent count1 = visitEventJoinMapper.selectOne(new QueryWrapper<VisitEvent>()
                 .select("count(distinct(visitor_id)) as num")
                        .lambda()
                .ge(StringUtils.isNotBlank(model.getStartTime()),VisitEvent::getCreateDate, model.getStartTime())
                .le(StringUtils.isNotBlank(model.getEndTime()), VisitEvent::getCreateDate,model.getEndTime())
                .eq( VisitEvent::getIsdeleted,Constants.ZERO)
                .eq( VisitEvent::getInOrOut,Constants.ZERO)
                .isNotNull(VisitEvent::getVisitorId)
                .eq(VisitEvent::getEventType,HKConstants.EventTypes.VISIT_SIGN_ICCM_PASS.getKey())
                .groupBy(VisitEvent::getVisitorId)
                );
        if(count1!=null){
            data.setVisitorNum(count);
            data.setVisitorNum((long)Constants.formatIntegerNum(count1.getNum()));
        }
        return data;
    }
@@ -322,13 +323,11 @@
        return visitEventDTOIPage;
    }
    private List<VisitEvent> newVisitEvent(List<VisitEvent> VisitEventDTOList) {
        List<String> codes = Arrays.asList(Constants.FTP_RESOURCE_PATH,Constants.MEMBER_IMG);
        List<SystemDictData> list = systemDictDataMapper.list(codes);
        Map<String,SystemDictData> dataMap = list.stream().collect(Collectors.toMap(SystemDictData::getLabel, Function.identity()));
        VisitEventDTOList.stream().forEach(obj->{
            if(StringUtils.isNotBlank( obj.getCaptureUrl())
                    && !obj.getCaptureUrl().startsWith(HKConstants.IMG_INDEX)
                    && !obj.getCaptureUrl().startsWith(HKConstants.IMG_INDEX_ERROR)) {
@@ -338,7 +337,7 @@
                            +obj.getCaptureUrl());
                }
            }
            obj.setEventTypeName(HKConstants.EventTypes.getName(obj.getEventType())); ;
            obj.setEventTypeName(HKConstants.EventTypes.getName(obj.getEventType()));
        });
        return  VisitEventDTOList;
    }