| | |
| | | package com.doumee.service.business.impl; |
| | | |
| | | import cn.hutool.core.util.IdcardUtil; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.doumee.biz.system.SystemDictDataBiz; |
| | | import com.doumee.core.constants.ResponseStatus; |
| | | import com.doumee.core.erp.ErpConstants; |
| | | import com.doumee.core.erp.ErpTool; |
| | | import com.doumee.core.erp.model.openapi.request.VisitListRequest; |
| | | import com.doumee.core.erp.model.openapi.request.erp.ApproveAddRequest; |
| | | import com.doumee.core.erp.model.openapi.request.erp.UserInfoRequest; |
| | | import com.doumee.core.erp.model.openapi.response.VisitEventListResponse; |
| | | import com.doumee.core.erp.model.openapi.response.erp.ApproveInfoResponse; |
| | | import com.doumee.core.exception.BusinessException; |
| | | import com.doumee.core.haikang.model.HKConstants; |
| | |
| | | import com.doumee.core.utils.Utils; |
| | | import com.doumee.core.wx.wxPlat.WxPlatNotice; |
| | | import com.doumee.dao.admin.response.MemberInfoDTO; |
| | | import com.doumee.dao.business.DeviceRoleMapper; |
| | | import com.doumee.dao.business.MemberMapper; |
| | | import com.doumee.dao.business.ProblemLogMapper; |
| | | import com.doumee.dao.business.VisitsMapper; |
| | | import com.doumee.dao.business.*; |
| | | import com.doumee.dao.business.join.DeviceJoinMapper; |
| | | import com.doumee.dao.business.join.VisitEventJoinMapper; |
| | | import com.doumee.dao.business.join.VisitsJoinMapper; |
| | | import com.doumee.dao.business.model.*; |
| | | import com.doumee.dao.web.reqeust.AuditApproveDTO; |
| | | import com.doumee.dao.web.reqeust.VisitRecordDTO; |
| | | import com.doumee.dao.web.response.InternalHomeVO; |
| | | import com.doumee.dao.web.response.VisitDetailVO; |
| | | import com.doumee.dao.web.response.VisitRecordVO; |
| | | import com.doumee.service.business.ApproveService; |
| | | import com.doumee.service.business.VisitsService; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; |
| | |
| | | @Autowired |
| | | private VisitsMapper visitsMapper; |
| | | @Autowired |
| | | private ApproveMapper approveMapper; |
| | | @Autowired |
| | | private ApproveParamMapper approveParamMapper; |
| | | @Autowired |
| | | private DeviceRoleMapper deviceRoleMapper; |
| | | @Autowired |
| | | private ProblemLogMapper problemLogMapper ; |
| | |
| | | private MemberMapper memberMapper ; |
| | | @Autowired |
| | | private VisitsJoinMapper visitsJoinMapper; |
| | | |
| | | @Autowired |
| | | private CompanyMapper companyMapper; |
| | | @Autowired |
| | | private SystemDictDataBiz systemDictDataBiz; |
| | | @Autowired |
| | |
| | | visitsMapper.insert(visits); |
| | | initWithVisitInfo(visits); |
| | | updateProblemLog(visits,problemLog,member); |
| | | //创建审批记录 |
| | | createApprove(visits,visitMember); |
| | | //发送微信公众号通知 |
| | | wxPlatNotice.sendVisitAuditTemplateNotice(visits, |
| | | systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_PREFIX).getCode(), |
| | | systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_AUDIT_VISIT).getCode()); |
| | | |
| | | return visits.getId(); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 创建审批记录 |
| | | * @param visits |
| | | * @param visitMember |
| | | */ |
| | | public void createApprove(Visits visits,Member visitMember){ |
| | | List<Integer> approveIds = new ArrayList<>(); |
| | | ApproveParam approveParam = null;//this.getApproveIds(1,visitMember,approveIds); |
| | | //创建待审批记录 |
| | | //获取审批配置主键 |
| | | Integer firstApproveId = this.checkFirstAudit(); |
| | | //内部人员创建 且创建人与被访问人相同 |
| | | if(!Objects.isNull(visits.getCreateMemberId())//内部人员发布 |
| | | &&visits.getCreateMemberId().equals(visitMember.getId())//创建人员与被访问人员是否是同一人 |
| | | &&!Objects.isNull(firstApproveId)//审批配置第一级为 被访问人审批 |
| | | ){ |
| | | approveParam = this.getApproveIds(2,visitMember,approveIds); |
| | | Approve approve = new Approve(); |
| | | approve.setCreateDate(new Date()); |
| | | approve.setIsdeleted(Constants.ZERO); |
| | | approve.setCheckInfo("自动审批"); |
| | | approve.setTemplatId(firstApproveId); |
| | | approve.setIsEndCheck(Constants.ZERO); |
| | | approve.setType(Constants.ZERO); |
| | | approve.setLevel(Constants.ONE); |
| | | approve.setVisitId(visits.getId()); |
| | | approveMapper.insert(approve); |
| | | if(!CollectionUtils.isNotEmpty(approveIds)){ |
| | | approve.setIsEndCheck(Constants.ONE); |
| | | visits.setStatus(Constants.TWO); |
| | | visitsMapper.updateById(visits); |
| | | //存储抄送记录 |
| | | this.saveCopyFor(visits.getId()); |
| | | } |
| | | }else{ |
| | | approveParam = this.getApproveIds(null,visitMember,approveIds); |
| | | if(!CollectionUtils.isNotEmpty(approveIds)){ |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"无有效的审批配置,请联系管理员"); |
| | | } |
| | | } |
| | | if(!Objects.isNull(approveIds)){ |
| | | //创建下一级审批记录 |
| | | this.saveAuditRecord(visits.getId(),approveIds,approveParam); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 审批 审批记录 或签 审批通过进入下一步 会签 检测是否是最后一条待审批 |
| | | * @param auditApproveDTO |
| | | */ |
| | | @Override |
| | | public void auditApprove(AuditApproveDTO auditApproveDTO){ |
| | | Approve approve = approveMapper.selectById(auditApproveDTO.getId()); |
| | | if(Objects.isNull(approve)){ |
| | | throw new BusinessException(ResponseStatus.DATA_EMPTY); |
| | | } |
| | | if(approve.getStatus().equals(Constants.approveStatus.wait)){ |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"审批记录已处理!"); |
| | | } |
| | | Visits visits = visitsMapper.selectById(approve.getVisitId()); |
| | | if(Objects.isNull(visits)){ |
| | | throw new BusinessException(ResponseStatus.DATA_EMPTY); |
| | | } |
| | | if(!auditApproveDTO.getMemberId().equals(approve.getChekorId())){ |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"人员信息匹配错误!"); |
| | | } |
| | | //被访人 |
| | | Member visitMember = memberMapper.selectById(visits.getReceptMemberId()); |
| | | List<Integer> approveIds = new ArrayList<>(); |
| | | ApproveParam approveParam = this.getApproveIds(approve.getLevel()+1,visitMember,approveIds); |
| | | |
| | | approve.setStatus(auditApproveDTO.getStatus()); |
| | | approve.setEditDate(new Date()); |
| | | approve.setChekorId(auditApproveDTO.getMemberId()); |
| | | approve.setCheckInfo(auditApproveDTO.getCheckInfo()); |
| | | approveMapper.updateById(approve); |
| | | |
| | | if(auditApproveDTO.getStatus().equals(Constants.approveStatus.pass)){ |
| | | if(approve.getApproveType().equals(Constants.ONE)){ |
| | | //会签 查询是否是最后一条记录 如果是最后一条记录 则生成下级审批记录 如果是最后一级,则进行审批确认 |
| | | if(approveMapper.selectCount(new QueryWrapper<Approve>().lambda() |
| | | .eq(Approve::getVisitId,visits.getId()) |
| | | .eq(Approve::getLevel,approve.getLevel()) |
| | | .ne(Approve::getId,approve.getId()) |
| | | )<=Constants.ZERO){ |
| | | //当前审批级别 最后一条待审批记录 |
| | | if(!CollectionUtils.isNotEmpty(approveIds)){ |
| | | //没有下级审批流则 修改访客记录主键 |
| | | visits.setStatus(auditApproveDTO.getStatus()); |
| | | visits.setCheckDate(new Date()); |
| | | visits.setCheckorId(auditApproveDTO.getMemberId()); |
| | | visitsMapper.updateById(visits); |
| | | }else{ |
| | | this.saveAuditRecord(visits.getId(),approveIds,approveParam); |
| | | } |
| | | } |
| | | }else{ |
| | | //或签 |
| | | approveMapper.update(null,new UpdateWrapper<Approve>().lambda() |
| | | .set(Approve::getStatus,Constants.approveStatus.otherDeal) |
| | | .set(Approve::getEditDate,new Date()) |
| | | .set(Approve::getCheorId,auditApproveDTO.getMemberId()) |
| | | .eq(Approve::getVisitId,visits.getId()) |
| | | .eq(Approve::getStatus,Constants.approveStatus.wait) |
| | | .ne(Approve::getId,approve.getId()) |
| | | .eq(Approve::getLevel,approve.getLevel()) |
| | | ); |
| | | |
| | | if(!CollectionUtils.isNotEmpty(approveIds)){ |
| | | //没有下级审批流则 修改访客记录主键 |
| | | visits.setStatus(auditApproveDTO.getStatus()); |
| | | visits.setCheckDate(new Date()); |
| | | visits.setCheckorId(auditApproveDTO.getMemberId()); |
| | | visitsMapper.updateById(visits); |
| | | }else{ |
| | | this.saveAuditRecord(visits.getId(),approveIds,approveParam); |
| | | } |
| | | |
| | | } |
| | | }else if(auditApproveDTO.getStatus().equals(Constants.approveStatus.unPass)){ |
| | | visits.setStatus(auditApproveDTO.getStatus()); |
| | | visits.setCheckDate(new Date()); |
| | | visits.setCheckorId(auditApproveDTO.getMemberId()); |
| | | visitsMapper.updateById(visits); |
| | | |
| | | approveMapper.update(null,new UpdateWrapper<Approve>().lambda() |
| | | .set(Approve::getStatus,Constants.approveStatus.otherDeal) |
| | | .set(Approve::getEditDate,new Date()) |
| | | .set(Approve::getCheorId,auditApproveDTO.getMemberId()) |
| | | .eq(Approve::getVisitId,visits.getId()) |
| | | .eq(Approve::getStatus,Constants.approveStatus.wait) |
| | | .ne(Approve::getId,approve.getId()) |
| | | .eq(Approve::getLevel,approve.getLevel()) |
| | | ); |
| | | |
| | | }else{ |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"审批状态错误!"); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | /** |
| | | * 存储抄送记录 |
| | | * @param visitId |
| | | */ |
| | | public void saveCopyFor(Integer visitId){ |
| | | ApproveParam approveParam = approveParamMapper.selectOne(new QueryWrapper<ApproveParam>().lambda() |
| | | .eq(ApproveParam::getIsdeleted,Constants.ZERO) |
| | | .eq(ApproveParam::getType,Constants.ONE) |
| | | .eq(ApproveParam::getLevel,Constants.ONE) |
| | | .last("limit 1")); |
| | | if(Objects.isNull(approveParam)){ |
| | | return; |
| | | } |
| | | if(StringUtils.isNotBlank(approveParam.getObjIds())){ |
| | | String [] ids = approveParam.getObjIds().split(","); |
| | | List<Approve> approveList = new ArrayList<>(); |
| | | for (String id:ids) { |
| | | Approve approve = new Approve(); |
| | | approve.setCreateDate(new Date()); |
| | | approve.setIsdeleted(Constants.ZERO); |
| | | approve.setCheckInfo("抄送记录"); |
| | | approve.setTemplatId(approveParam.getId()); |
| | | approve.setChekorId(Integer.valueOf(id)); |
| | | approve.setType(Constants.ONE); |
| | | approve.setVisitId(visitId); |
| | | approveList.add(approve); |
| | | } |
| | | approveMapper.insertBatchSomeColumn(approveList); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 存储下级审批记录 |
| | | * @param visitId |
| | | * @param ids |
| | | * @param approveParam |
| | | */ |
| | | public void saveAuditRecord(Integer visitId,List<Integer> ids,ApproveParam approveParam){ |
| | | if(CollectionUtils.isNotEmpty(ids)) { |
| | | List<Approve> approveList = new ArrayList<>(); |
| | | for (Integer id:ids) { |
| | | Approve approve = new Approve(); |
| | | approve.setCreateDate(new Date()); |
| | | approve.setIsdeleted(Constants.ZERO); |
| | | approve.setStatus(Constants.ZERO); |
| | | approve.setCheckInfo("抄送记录"); |
| | | approve.setTemplatId(approveParam.getId()); |
| | | approve.setLevel(approveParam.getLevel()); |
| | | approve.setApproveType(approveParam.getApproveType()); |
| | | approve.setChekorId(id); |
| | | approve.setType(Constants.ONE); |
| | | approve.setVisitId(visitId); |
| | | approveList.add(approve); |
| | | } |
| | | approveMapper.insertBatchSomeColumn(approveList); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 判断一级审批人是否是创建人 |
| | | * @return |
| | | */ |
| | | public Integer checkFirstAudit(){ |
| | | ApproveParam approveParam = approveParamMapper.selectOne(new QueryWrapper<ApproveParam>().lambda() |
| | | .eq(ApproveParam::getIsdeleted,Constants.ZERO) |
| | | .eq(ApproveParam::getType,Constants.ZERO) |
| | | .eq(ApproveParam::getLevel,Constants.ONE) |
| | | .eq(ApproveParam::getMemberType,Constants.ZERO) |
| | | .last("limit 1")); |
| | | return Objects.isNull(approveParam)?null:approveParam.getId(); |
| | | |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 创建审批人员信息 若返回待审批人员主键列表为空,则无审批人员 抛出对应异常 |
| | | * @param level 处理级别 |
| | | * @param visitMember 被访人 |
| | | */ |
| | | public ApproveParam getApproveIds(Integer level,Member visitMember,List<Integer> ids){ |
| | | //查询审批配置项 |
| | | List<ApproveParam> allParam = approveParamMapper.selectList(new QueryWrapper<ApproveParam>().lambda() |
| | | .eq(ApproveParam::getIsdeleted,Constants.ZERO) |
| | | .eq(ApproveParam::getType,Constants.ZERO) |
| | | .ge(!Objects.isNull(level),ApproveParam::getLevel,level) |
| | | .orderByAsc(ApproveParam::getLevel)); |
| | | ApproveParam approveParam = new ApproveParam(); |
| | | //发送审批/抄送记录的用户主键集合 |
| | | ids.clear(); |
| | | if(Objects.isNull(allParam)){ |
| | | if(Objects.isNull(level)){ |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"未配置访客记录审批流,请联系管理员"); |
| | | } |
| | | }else{ |
| | | approveParam = allParam.get(0); |
| | | if(approveParam.getMemberType().equals(Constants.ZERO)){ |
| | | //被访人审批 |
| | | //添加审批人 |
| | | ids.add(visitMember.getId()); |
| | | }else if(approveParam.getMemberType().equals(Constants.ONE)){ |
| | | //指定人员审批 |
| | | String [] objIds = approveParam.getObjIds().split(","); |
| | | for (String id:objIds) { |
| | | //添加审批人 |
| | | ids.add(Integer.valueOf(id)); |
| | | } |
| | | }else if(approveParam.getMemberType().equals(Constants.TWO)){ |
| | | //部门主管审批 |
| | | //审批部门 |
| | | Company auditCompany = this.getAuditCompanyHead(visitMember.getCompanyId(),approveParam.getObjLevel()); |
| | | if(Objects.isNull(auditCompany)){ |
| | | //审批部门为空 自动流转下一级审批配置 |
| | | level = level + 1; |
| | | return this.getApproveIds(level,visitMember,ids); |
| | | }else{ |
| | | //查询部门负责人 |
| | | Member headMember = memberMapper.selectById(auditCompany.getHeadId()); |
| | | if(Objects.isNull(headMember)){ |
| | | //未查询到部门负责人 |
| | | if(approveParam.getNoleaderOpt().equals(Constants.ONE)&&!Objects.isNull(auditCompany.getParentId())){ |
| | | //由上级主管代替审核 |
| | | auditCompany = companyMapper.selectOne(new QueryWrapper<Company>().lambda().eq(Company::getId,auditCompany.getParentId())); |
| | | if(Objects.isNull(auditCompany)){ |
| | | //审批部门为空 自动流转下一级审批配置 |
| | | level = level + 1; |
| | | this.getApproveIds(level,visitMember,ids); |
| | | }else{ |
| | | headMember = memberMapper.selectById(auditCompany.getHeadId()); |
| | | if(Objects.isNull(headMember)){ |
| | | //查询部门负责人 为空 自动流转下一级审批配置 |
| | | level = level + 1; |
| | | return this.getApproveIds(level,visitMember,ids); |
| | | }else{ |
| | | //添加审批人 |
| | | ids.add(headMember.getId()); |
| | | } |
| | | } |
| | | }else{ |
| | | level = level + 1; |
| | | return this.getApproveIds(level,visitMember,ids); |
| | | } |
| | | }else{ |
| | | //添加审批人 |
| | | ids.add(headMember.getId()); |
| | | } |
| | | |
| | | } |
| | | } |
| | | } |
| | | |
| | | return approveParam; |
| | | } |
| | | |
| | | /** |
| | | * 根据配置查询上级数据 |
| | | * @param companyId 直接部门 |
| | | * @param objLevel 查询级别 |
| | | */ |
| | | public Company getAuditCompanyHead(Integer companyId,Integer objLevel){ |
| | | Integer queryLevel = Constants.ONE; |
| | | Integer nextCompanyId = companyId; |
| | | Company auditCompany = new Company(); |
| | | while(queryLevel.equals(objLevel)){ |
| | | auditCompany = companyMapper.selectById(nextCompanyId); |
| | | if(Objects.isNull(auditCompany)){ |
| | | return null; |
| | | } |
| | | nextCompanyId = auditCompany.getParentId(); |
| | | } |
| | | return auditCompany; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 校验必填项数据是否合法 |
| | |
| | | visitDetailVO.setVisitUserName(member.getName()); |
| | | visitDetailVO.setVisitReason(visits.getReason()); |
| | | visitDetailVO.setVisitTime(DateUtil.DateToStr(visits.getStarttime(),"yyyy-MM-dd HH:mm") + " 至 " + DateUtil.DateToStr(visits.getEndtime(),"yyyy-MM-dd HH:mm") ); |
| | | //被访人员部门 |
| | | Company company = companyMapper.selectById(member.getCompanyId()); |
| | | if(!Objects.isNull(company)){ |
| | | visitDetailVO.setVisitUserCompany(company.getName()); |
| | | } |
| | | visitDetailVO.setName(visits.getName()); |
| | | visitDetailVO.setCompanyName(visits.getCompanyName()); |
| | | visitDetailVO.setFaceImg(visits.getFaceImg()); |
| | | visitDetailVO.setImgUrl(visits.getImgurl()); |
| | | visitDetailVO.setIdCardDecode(visits.getIdcardDecode()); |
| | | visitDetailVO.setPrefix(systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode() + |
| | | systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode()); |
| | | if(StringUtils.isNotBlank(visits.getDoors())){ |
| | | List<DeviceRole> deviceRoleList = deviceRoleMapper.selectList(new QueryWrapper<DeviceRole>().lambda() |
| | | .select(DeviceRole::getName) |
| | |
| | | ); |
| | | } |
| | | } |
| | | visitDetailVO.setWithVisitsList(visitsMapper.selectList(new QueryWrapper<Visits>().lambda() |
| | | .select(Visits::getName,Visits::getPhone) |
| | | visitDetailVO.setWithVisitsList( |
| | | visitsMapper.selectList(new QueryWrapper<Visits>().lambda() |
| | | .select(Visits::getName,Visits::getPhone,Visits::getFaceImg,Visits::getImgurl,Visits::getIdcardDecode) |
| | | .eq(Visits::getParentId,id))); |
| | | return visitDetailVO; |
| | | } |
| | |
| | | |
| | | |
| | | |
| | | @Override |
| | | public PageData<VisitRecordVO> taskCenter(PageWrap<VisitRecordDTO> param) { |
| | | VisitRecordDTO visitRecordDTO = param.getModel(); |
| | | IPage<Visits> page = new Page<>(param.getPage(), param.getCapacity()); |
| | | MPJLambdaWrapper<Visits> queryWrapper = new MPJLambdaWrapper<>(); |
| | | Utils.MP.blankToNull(visitRecordDTO); |
| | | |
| | | queryWrapper.selectAs(Visits::getId,VisitRecordVO::getId); |
| | | queryWrapper.selectAs(Visits::getName,VisitRecordVO::getName); |
| | | queryWrapper.selectAs(Visits::getStarttime,VisitRecordVO::getStartTime); |
| | | queryWrapper.selectAs(Visits::getEndtime,VisitRecordVO::getEndTime); |
| | | queryWrapper.selectAs(Visits::getReason,VisitRecordVO::getReason); |
| | | queryWrapper.selectAs(Visits::getMemberNum,VisitRecordVO::getInNum); |
| | | queryWrapper.selectAs(Visits::getCreateDate,VisitRecordVO::getCreateDate); |
| | | queryWrapper.leftJoin(Approve.class,Approve::getId,Visits::getId); |
| | | if(!Objects.isNull(visitRecordDTO)){ |
| | | queryWrapper.like(StringUtils.isNotBlank(visitRecordDTO.getName()),Visits::getName,visitRecordDTO.getName()); |
| | | queryWrapper.le(!Objects.isNull(visitRecordDTO.getCreateTimeS()),Visits::getCreateDate,visitRecordDTO.getCreateTimeS()); |
| | | queryWrapper.ge(!Objects.isNull(visitRecordDTO.getCreateTimeE()),Visits::getCreateDate,visitRecordDTO.getCreateTimeE()); |
| | | queryWrapper.eq(!Objects.isNull(visitRecordDTO.getType()),Visits::getType,visitRecordDTO.getType()); |
| | | if(!Objects.isNull(visitRecordDTO.getState())&&visitRecordDTO.getState()<Constants.TWO){ |
| | | queryWrapper.eq(Approve::getStatus,visitRecordDTO.getState()); |
| | | queryWrapper.eq(Approve::getChekorId,visitRecordDTO.getMemberId()); |
| | | }else if(!Objects.isNull(visitRecordDTO.getState())&&visitRecordDTO.getState()==Constants.TWO){ |
| | | queryWrapper.eq(Visits::getMemberId,visitRecordDTO.getMemberId()); |
| | | } |
| | | } |
| | | queryWrapper.orderByDesc(Visits::getCreateDate); |
| | | IPage<VisitRecordVO> result = visitsJoinMapper.selectJoinPage(page, VisitRecordVO.class,queryWrapper); |
| | | |
| | | return PageData.from(result); |
| | | } |
| | | |
| | | |
| | | |
| | | } |