jiangping
2025-03-06 0f10707eaa4d58832903a2f27e19f9fb713c7715
Merge remote-tracking branch 'origin/master'
已添加3个文件
已修改7个文件
311 ■■■■■ 文件已修改
admin/src/api/business/visitEvent.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/dangerStatic.vue 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/visitEvent.vue 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/index.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/HiddenDangerCloudController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/HiddenDanger.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/GeneralDataVO.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/HiddenDangerDataVO.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/HiddenDangerService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/HiddenDangerServiceImpl.java 86 ●●●●● 补丁 | 查看 | 原始文档 | 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,6 +1,7 @@
<template>
  <TableLayout :permissions="['business:visitevent:query']">
    <!-- æœç´¢è¡¨å• -->
    <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>
@@ -9,7 +10,8 @@
        <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-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="请选择">
@@ -43,16 +45,20 @@
        <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/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/HiddenDangerCloudController.java
@@ -117,4 +117,14 @@
        return ApiResponse.success("操作成功");
    }
    @ApiOperation("隐患数据统计")
    @PostMapping("/hiddenDangerData")
    public ApiResponse hiddenDangerData (@RequestBody HiddenDanger hiddenDanger,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
        hiddenDanger.setLoginUserInfo(getLoginUser(token));
        hiddenDangerService.hiddenDangerData(hiddenDanger);
        return ApiResponse.success("操作成功");
    }
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/HiddenDanger.java
@@ -157,5 +157,8 @@
    @TableField(exist = false)
    private List<Multifile> multifileList;
    @ApiModelProperty(value = "隐患区域部门主键", example = "1",hidden = true)
    @TableField(exist = false)
    private Integer areaCompanyId;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/GeneralDataVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.doumee.dao.business.vo;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.service.business.third.model.LoginUserModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class GeneralDataVO{
    @ApiModelProperty(value = "名称")
    private String name;
    @ApiModelProperty(value = "数量")
    private Integer total ;
    @ApiModelProperty(value = "占比")
    private BigDecimal rata ;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/HiddenDangerDataVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.doumee.dao.business.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
public class HiddenDangerDataVO {
    @ApiModelProperty(value = "总数")
    private Integer total;
    @ApiModelProperty(value = "隐患类型统计")
    private List<GeneralDataVO> cateList ;
    @ApiModelProperty(value = "隐患部门统计")
    private List<GeneralDataVO> departmentList ;
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/HiddenDangerService.java
@@ -1,5 +1,6 @@
package com.doumee.service.business;
import com.doumee.dao.business.vo.HiddenDangerDataVO;
import com.doumee.service.business.third.model.LoginUserInfo;
import com.doumee.service.business.third.model.PageData;
import com.doumee.service.business.third.model.PageWrap;
@@ -100,4 +101,6 @@
    void dealHiddenDanger(HiddenDanger hiddenDanger);
    void transferHiddenDanger(HiddenDanger hiddenDanger);
    HiddenDangerDataVO hiddenDangerData(HiddenDanger hiddenDanger);
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/HiddenDangerServiceImpl.java
@@ -8,7 +8,9 @@
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.dao.business.dao.UserActionMapper;
import com.doumee.dao.business.dao.*;
import com.doumee.dao.business.vo.GeneralDataVO;
import com.doumee.dao.business.vo.HiddenDangerDataVO;
import com.doumee.service.business.third.model.LoginUserInfo;
import com.doumee.service.business.third.model.PageData;
import com.doumee.service.business.third.model.PageWrap;
@@ -19,9 +21,6 @@
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.MemberMapper;
import com.doumee.dao.business.dao.SmsConfigMapper;
import com.doumee.dao.business.dao.SmsEmailMapper;
import com.doumee.dao.business.model.*;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.system.MultifileMapper;
@@ -41,7 +40,9 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
 * é𐿂£ä¿¡æ¯è¡¨Service实现
@@ -73,6 +74,9 @@
    private HiddenDangerLogMapper hiddenDangerLogMapper;
    @Autowired
    private UserActionMapper userActionMapper;
    @Autowired
    private CompanyMapper companyMapper;
    @Autowired
@@ -471,8 +475,8 @@
                .and(StringUtils.isNotBlank(pageWrap.getModel().getMemberName()), ms->ms.like(Member::getName,pageWrap.getModel().getMemberName())
                        .or().like(Member::getPhone,pageWrap.getModel().getMemberName()))
                .ge(Objects.nonNull(pageWrap.getModel().getQueryStartTime()), Empower::getCreateDate,pageWrap.getModel().getQueryStartTime())
                .le(Objects.nonNull(pageWrap.getModel().getQueryEndTime()),Empower::getCreateDate,pageWrap.getModel().getQueryEndTime())
                .ge(Objects.nonNull(pageWrap.getModel().getQueryStartTime()), HiddenDanger::getCreateDate,pageWrap.getModel().getQueryStartTime())
                .le(Objects.nonNull(pageWrap.getModel().getQueryEndTime()),HiddenDanger::getCreateDate,pageWrap.getModel().getQueryEndTime())
                .orderByDesc(Visits::getCreateDate)
        ;
        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
@@ -772,4 +776,74 @@
    }
    /**
     * éšæ‰‹æ‹ç»Ÿè®¡æ•°æ®
     */
    @Override
    public HiddenDangerDataVO hiddenDangerData(HiddenDanger hiddenDanger){
        HiddenDangerDataVO hiddenDangerDataVO = new HiddenDangerDataVO();
        List<HiddenDanger> hiddenDangerAllList = hiddenDangerMapper.selectJoinList(HiddenDanger.class,
                new MPJLambdaWrapper<HiddenDanger>()
                        .selectAll(HiddenDanger.class)
                .selectAs(HiddenDangerParam::getCompanyId, HiddenDanger::getAreaCompanyId)
                .leftJoin(HiddenDangerParam.class,HiddenDangerParam::getId,HiddenDanger::getAreaId) //隐患区域
                .eq(Objects.nonNull(hiddenDanger.getStatus()),HiddenDanger::getStatus,hiddenDanger.getStatus())
                .ge(Objects.nonNull(hiddenDanger.getQueryStartTime()), HiddenDanger::getCreateDate,hiddenDanger.getQueryStartTime())
                .le(Objects.nonNull(hiddenDanger.getQueryEndTime()),HiddenDanger::getCreateDate,hiddenDanger.getQueryEndTime())
        );
        hiddenDangerDataVO.setTotal(hiddenDangerAllList.size());
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(hiddenDangerAllList)){
            List<Integer> cateList =  hiddenDangerAllList.stream().map(i->i.getCateId()).collect(Collectors.toList());
            //全部隐患分类数据
            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(cateList)){
                List<GeneralDataVO> cateGeneralDataList = new ArrayList<>();
                Set<Integer> cateSetList = new HashSet<>(cateList);
                List<HiddenDangerParam> hiddenDangerParamList = hiddenDangerParamMapper.selectList(new QueryWrapper<HiddenDangerParam>()
                        .lambda().eq(HiddenDangerParam::getIsdeleted,Constants.ZERO).eq(HiddenDangerParam::getType,Constants.ONE));
                for (Integer cateId:cateSetList) {
                    Optional<HiddenDangerParam> optionalHiddenDanger = hiddenDangerParamList.stream().filter(i->Constants.equalsInteger(i.getId(),cateId)).findAny();
                    if(optionalHiddenDanger.isPresent()){
                        GeneralDataVO generalDataVO = new GeneralDataVO();
                        HiddenDangerParam hiddenDangerParam = optionalHiddenDanger.get();
                        Integer total = hiddenDangerAllList.stream().filter(i->Constants.equalsInteger(i.getCateId(),hiddenDangerParam.getId())).collect(Collectors.toList()).size();
                        generalDataVO.setName(hiddenDangerParam.getName());
                        generalDataVO.setTotal(total);
                        generalDataVO.setRata(
                                    Constants.equalsInteger(total,Constants.ZERO)?
                                        BigDecimal.ZERO:new BigDecimal(total.toString()).divide(new BigDecimal(hiddenDangerDataVO.getTotal().toString()),2).multiply(new BigDecimal("100"))
                                );
                        cateGeneralDataList.add(generalDataVO);
                    }
                }
                hiddenDangerDataVO.setCateList(cateGeneralDataList);
            }
            //全部隐患区域部门数据
            List<Integer> companyIdList =  hiddenDangerAllList.stream().map(i->i.getAreaCompanyId()).collect(Collectors.toList());
            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(companyIdList)){
                List<GeneralDataVO> companyGeneralDataList = new ArrayList<>();
                Set<Integer> companyIdSetList = new HashSet<>(companyIdList);
                List<Company> companyList = companyMapper.selectList(new QueryWrapper<Company>()
                        .lambda().eq(Company::getIsdeleted,Constants.ZERO));
                for (Integer companyId:companyIdSetList) {
                    Optional<Company> optionalCompany = companyList.stream().filter(i->Constants.equalsInteger(i.getId(),companyId)).findAny();
                    if(optionalCompany.isPresent()){
                        GeneralDataVO generalDataVO = new GeneralDataVO();
                        Company company = optionalCompany.get();
                        Integer total = hiddenDangerAllList.stream().filter(i->Constants.equalsInteger(i.getAreaCompanyId(),company.getId())).collect(Collectors.toList()).size();
                        generalDataVO.setName(company.getName());
                        generalDataVO.setTotal(total);
                        companyGeneralDataList.add(generalDataVO);
                    }
                }
                hiddenDangerDataVO.setDepartmentList(companyGeneralDataList);
            }
        }
        return hiddenDangerDataVO;
    }
}