package com.doumee.service.business.impl; import cn.hutool.core.util.IdcardUtil; 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.erp.ApproveAddRequest; import com.doumee.core.erp.model.openapi.request.erp.UserInfoRequest; 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.haikang.model.HKTools; import com.doumee.core.haikang.model.param.BaseResponse; import com.doumee.core.haikang.model.param.request.VisitAppointmentCancelRequest; import com.doumee.core.haikang.model.param.request.VisitAppointmentRequest; import com.doumee.core.haikang.model.param.respose.VisitAppointmentResponse; import com.doumee.core.haikang.service.HKService; import com.doumee.core.model.PageData; import com.doumee.core.model.PageWrap; import com.doumee.core.utils.Constants; import com.doumee.core.utils.DESUtil; import com.doumee.core.utils.DateUtil; import com.doumee.core.utils.Utils; 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.join.DeviceJoinMapper; import com.doumee.dao.business.join.VisitsJoinMapper; import com.doumee.dao.business.model.*; import com.doumee.service.business.VisitsService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.wrapper.MPJLambdaWrapper; import io.swagger.models.auth.In; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.util.DigestUtils; import java.util.*; import java.util.stream.Collectors; /** * 访客申请信息表Service实现 * @author 江蹄蹄 * @date 2023/11/30 15:33 */ @Service public class VisitsServiceImpl implements VisitsService { @Autowired private VisitsMapper visitsMapper; @Autowired private DeviceRoleMapper deviceRoleMapper; @Autowired private ProblemLogMapper problemLogMapper ; @Autowired private MemberMapper memberMapper ; @Autowired private VisitsJoinMapper visitsJoinMapper; @Autowired private SystemDictDataBiz systemDictDataBiz; @Autowired private DeviceJoinMapper deviceJoinMapper; @Override public Integer create(Visits visits) { visitsMapper.insert(visits); return visits.getId(); } /** * 普通访客申请 * @param visits * @return */ @Override @Transactional(rollbackFor = {BusinessException.class,Exception.class}) public Integer createFk(Visits visits) { isValidBaseParam(visits); //检查是否必须答题,并且符合答题要求 ProblemLog problemLog = isValidProblemLog(visits); //获取申请的海康访问门禁组信息 String[] hkIds = getHkDeviceRoles(visits); //检验拜访人是否合法 Member visitMember = isValideVisitedUser(visits.getReceptMemberId()); if(Constants.equalsInteger(Constants.ZERO, visits.getIdcardType()) &&!IdcardUtil.isValidCard(visits.getIdcardNo())){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,身份证号码有误,请核实后重试!"); } Date date = new Date(); //访客信息(使用身份证号查询是否已存在改普通访客,没有则新增,存在则更新openid等信息),包括随访人员校验和处理 Member member =dealMemberAndVisits(visits); //初始化访客信息 initVisitInfo(visits,date); //发起ERP审批申请 String erpId = startSendErpCheck(visits,visitMember); if(StringUtils.isNotBlank(erpId)){ visits.setErpId(erpId); }else{ throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,发起拜访审批申请失败!"); } visitsMapper.insert(visits); initWithVisitInfo(visits); updateProblemLog(visits,problemLog,member); return visits.getId(); } /** * 校验必填项数据是否合法 * @param visits */ private void isValidBaseParam(Visits visits) { if(visits.getStarttime() == null || visits.getEndtime() == null || StringUtils.isBlank(visits.getReason()) || StringUtils.isBlank( visits.getName()) || StringUtils.isBlank( visits.getPhone()) || visits.getIdcardType() == null || StringUtils.isBlank( visits.getFaceImg() ) || StringUtils.isBlank( visits.getIdcardNo() ) || visits.getReceptMemberId() == null){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,信息填写不正确!"); } if(visits.getStarttime().getTime() < System.currentTimeMillis()){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,预约开始时间必须大于当前时间!");// } if(visits.getEndtime().getTime() <= visits.getStarttime().getTime()){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,预约结束时间必须大于开始时间!");// } } private void isValidWithVisitParam(Visits visits, List addList, List updateList) { if( StringUtils.isBlank( visits.getName()) || StringUtils.isBlank( visits.getPhone()) || visits.getIdcardType() == null || StringUtils.isBlank( visits.getFaceImg() ) || StringUtils.isBlank( visits.getIdcardNo() ) ){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,信息填写不正确!"); } if(visits.getStarttime().getTime() < System.currentTimeMillis()){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,预约开始时间必须大于当前时间!");// } if(visits.getEndtime().getTime() <= visits.getStarttime().getTime()){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,预约结束时间必须大于开始时间!");// } if(isRepeatedMember(visits,addList,updateList)){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,手机号或身份证号出现重复数据,请修改后重新提交!");// } } private boolean isRepeatedMember(Visits visits, List addList, List updateList) { if(addList.size()>0){ for(Member m :addList){ if(StringUtils.equals(visits.getPhone(), m.getPhone()) || StringUtils.equals(visits.getIdcardNo(), m.getIdcardDecode())){ return true; } } } if(updateList.size()>0){ for(Member m :updateList){ if(StringUtils.equals(visits.getPhone(), m.getPhone()) || StringUtils.equals(visits.getIdcardNo(), m.getIdcardDecode())){ return true; } } } return false; } private void initWithVisitInfo(Visits visits) { if(visits.getWithUserList()!=null && visits.getLwWithUserList().size()>0){ for(Visits v :visits.getWithUserList()){ v.setParentId(visits.getId()); v.setStarttime(visits.getStarttime()); v.setEndtime(visits.getEndtime()); v.setIsdeleted(Constants.ZERO); v.setCreateDate(visits.getCreateDate()); v.setErpId(visits.getErpId()); v.setHkStatus(Constants.ZERO); v.setStatus(Constants.ZERO); } //批量插入数据 visitsMapper.insertBatchSomeColumn(visits.getWithUserList()); } } private void initVisitInfo(Visits visits,Date date) { visits.setHkStatus(Constants.ZERO);//未同步 visits.setBirthday(Constants.getBirthdyByCardNo(visits.getIdcardNo())); visits.setStatus(Constants.ZERO);//待审批 visits.setIdcardNo(DESUtil.encrypt(Constants.EDS_PWD, visits.getIdcardNo()));//身份证号加密 //身份证号存储密文 visits.setIdcardDecode(Constants.getTuominStr(visits.getIdcardNo()));//脱敏手机号 visits.setCreateDate(date); } private String startSendErpCheck(Visits visits,Member visitMember) { ApproveAddRequest param = new ApproveAddRequest(); List withUserVisitsList = visits.getWithUserList(); List withUserList = new ArrayList<>(); if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(withUserVisitsList)){ for (Visits v:withUserVisitsList) { UserInfoRequest userInfoRequest = new UserInfoRequest(); userInfoRequest.setName(v.getName()); userInfoRequest.setIdNo(v.getIdcardNo()); userInfoRequest.setSex(v.getSex()); userInfoRequest.setPhone(v.getPhone()); userInfoRequest.setFaceImg(v.getFaceImg()); userInfoRequest.setHealthImg(v.getImgurl()); withUserList.add(userInfoRequest); } param.setWithUserList(withUserList); } param.setId(visits.getId()); param.setBeVisitedUserId(visitMember.getErpId()); param.setVisitorWorkUint(visits.getCompanyName()); param.setPurpose(visits.getReason()); param.setStartTime(DateUtil.getDate(visits.getStarttime(),"yyyy-MM-dd HH:mm:ss")); param.setEndTime(DateUtil.getDate(visits.getEndtime(),"yyyy-MM-dd HH:mm:ss")); if(StringUtils.isNotBlank(visits.getCarNos())){ param.setCarNo(Arrays.asList(visits.getCarNos().split(","))); } if(StringUtils.isNotBlank(visits.getDoors())){ List deviceRoleList = deviceRoleMapper.selectList(new QueryWrapper().lambda().in(DeviceRole::getId,Arrays.asList(visits.getDoors().split(",")))); if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(deviceRoleList)){ param.setRoleIds(deviceRoleList.stream().map(m->m.getId()).collect(Collectors.toList())); param.setRoleNames(deviceRoleList.stream().map(m->m.getName()).collect(Collectors.toList())); } } ApproveInfoResponse response = ErpTool.submitApprove(ErpConstants.approveUrl,param); if(!Objects.isNull(response)){ return response.getId().toString(); } return null; } private String visitAppiontment(Visits visits) { VisitAppointmentRequest param = new VisitAppointmentRequest(); param.setVisitStartTime(DateUtil.getISO8601Timestamp(visits.getStarttime())); param.setVisitEndTime(DateUtil.getISO8601Timestamp(visits.getStarttime())); BaseResponse res = HKService.visitAppiontment(param); if(res==null || !StringUtils.equals(res.getCode(), HKConstants.RESPONSE_SUCCEE) || res.getData()==null){ //如果发起预约失败 visits.setStatus(Constants.VisitStatus.xfFail); }else{ visits.setStatus(Constants.VisitStatus.xfSuccess); visits.setHkStatus(Constants.ONE); visits.setHkId(res.getData().getAppointRecordId()); } visits.setHkDate(visits.getCheckDate()); return res.getData().getAppointRecordId(); } /** * 访客信息(使用身份证号查询是否已存在改普通访客,没有则新增,存在则更新openid等信息),包括随访人员校验和处理 * @param visits * @return */ private Member dealMemberAndVisits(Visits visits ) { if(StringUtils.isNotBlank(visits.getOpenid())){ //先清空原有访客的openid绑定关系 memberMapper.update(null, new UpdateWrapper().lambda() .eq(Member::getType,Constants.memberType.visitor) .eq(Member::getOpenid,visits.getOpenid()) .set(Member::getOpenid,null) ); } List addList = new ArrayList<>(); List editList = new ArrayList<>(); //申请人信息 Member m = getMemberListParam(visits.getIdcardNo(),visits,addList,editList); //随访人员信息处理 if(visits.getWithUserList()!= null && visits.getWithUserList().size()>0){ for(Visits model:visits.getWithUserList()){ //校验随访人员填报数据合法性 isValidWithVisitParam(model,addList,editList); model.setCreateDate(visits.getCreateDate()); getMemberListParam(model.getIdcardNo(),visits,addList,editList); } } return m; } private Member getMemberListParam(String cardno, Visits visits, List addList, List editList) { if(!Constants.checkCarNo(visits.getCarNos())){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,车牌号【"+visits.getCarNos()+"】不合法,请核实后重试~"); } Member member = memberMapper.selectOne(new QueryWrapper().lambda() .eq(Member::getType,Constants.memberType.visitor) .eq(Member::getIdcardType,visits.getIdcardType()) .eq(Member::getIdcardNo,visits.getIdcardNo()).last("limit 1" ) ); if(member == null){ //如果用户不存在,则新增 member.setCreateDate(visits.getCreateDate()); member.setIsdeleted(Constants.ZERO); member.setIdcardNo(visits.getIdcardNo()); member.setIdcardDecode(visits.getIdcardDecode()); member.setIdcardNo(DESUtil.encrypt(Constants.EDS_PWD, cardno));//身份证号加密 member.setIdcardDecode(Constants.getTuominStr(cardno));//脱敏手机号 member.setName(visits.getName()); member.setPhone(visits.getPhone()); member.setOpenid(visits.getOpenid()); member.setType(Constants.memberType.visitor); member.setStatus(Constants.ZERO); member.setSex(Constants.getSexByCardNo(cardno)); // 新增访客记录 addList.add(member); }else{ if(!Constants.equalsInteger(Constants.ZERO,member.getStatus() )){ //如果用户状态异常,则提示 throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,该身份证号被禁止访问申请,如有疑问,请联系您的拜访人进行核实"); } //核查预约用户是否存在未签离的预约记录 isExsitNoOutVisisRecord(member); member.setEditDate(visits.getCreateDate()); member.setIsdeleted(Constants.ZERO); member.setIdcardNo(visits.getIdcardNo()); member.setIdcardDecode(visits.getIdcardDecode()); member.setName(visits.getName()); member.setPhone(visits.getPhone()); member.setOpenid(visits.getOpenid()); member.setSex(Constants.getSexByCardNo(cardno)); // 更新访客信息, editList.add(member); } //根据手机号和身份证号码查询 当前预约的时间是否与其他预约记录有冲突 if (visitsMapper.selectCount(new QueryWrapper().lambda() .eq(Visits::getPhone, member.getPhone()) .and(ms -> ms.eq(Visits::getPhone, member.getPhone()) .or().eq(Visits::getIdcardDecode, member.getIdcardDecode())) .and(ms -> ms.apply(" visits.STARTTIME <= '" + visits.getStarttime() + "' and visits.ENDTIME >= '" + visits.getStarttime() + "' ") .or().apply(" visits.STARTTIME <= '" + visits.getEndtime() + "' and visits.ENDTIME >= '" + visits.getEndtime() + "' ") )) > Constants.ZERO) { throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,手机号【"+member.getPhone()+"】或身份证【"+ member.getIdcardDecode() +"】存在预约时间冲突,无法申请哦!"); } return member; } /** * 核查预约用户是否存在未签离的预约记录 * @param member */ private void isExsitNoOutVisisRecord(Member member) { Visits v = visitsMapper.selectOne(new QueryWrapper().lambda() .eq(Visits::getPhone, member.getPhone()) .eq(Visits::getStatus,Constants.VisitStatus.xfSuccess) .last(" limit 1" ) ); if(v !=null){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,手机号【"+member.getPhone()+"】存在未签离预约申请,不能重复申请哦!"); } } private List isValideWithUsers(List withUserList) { if(withUserList!= null && withUserList .size()>0){ for(Visits model:withUserList){ } } return null; } /** * 如果有答题记录,更新答题记录关联数据 * @param visits * @param problemLog * @param member */ private void updateProblemLog(Visits visits, ProblemLog problemLog,Member member) { if(problemLog!=null){ problemLog.setEditDate(visits.getCreateDate()); problemLog.setName(visits.getName()); problemLog.setUserId(member.getId()); problemLog.setPhone(member.getPhone()); problemLog.setLogId(visits.getId()); problemLogMapper.updateById(problemLog); } } /** * 检查访人是否合法 * @param receptMemberId */ private Member isValideVisitedUser(Integer receptMemberId) { Member member = memberMapper.selectById(receptMemberId); if(member == null || Constants.equalsInteger(Constants.ZERO,member.getIsdeleted())){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,该拜访人暂时不能接受您的拜访申请!"); } if(!Constants.equalsInteger(member.getStatus(), Constants.ZERO)){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,该拜访人暂时不能接受您的拜访申请."); } if(!Constants.equalsInteger(Constants.ONE, member.getCanVisit())){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,该拜访人暂时不能接受您的拜访申请~"); } return member; } private ProblemLog isValidProblemLog(Visits visits) { String required = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PROBLEM_VISIT_REQUIRED).getCode(); if(StringUtils.equals(required,Constants.ONE+"")){ //如果必须答题,查找答题记录 if(visits.getUserAnswerId() == null){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,请先按要求进行安全知识答题!"); } ProblemLog log = problemLogMapper.selectById(visits.getUserAnswerId()); if(log == null){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,请先按要求进行安全知识答题."); } if(log.getLogId() !=null){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,请先按要求进行安全知识答题~"); } return log; } return null; } /** * 获取申请的海康访问门禁组信息 * @param visits * @return */ private String[] getHkDeviceRoles(Visits visits) { String mustSelectDoors = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.SELECT_DOORS_VISIT_REQUIRED).getCode(); List roles = null; if(StringUtils.equals(mustSelectDoors,Constants.ZERO+"")){ //如果必须选择门禁,但未选择 if(StringUtils.isBlank(visits.getDoors())){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,请选择访问门禁!"); } //校验门禁组信息是否正确 String[] dIds = visits.getDoors().split(","); roles = deviceRoleMapper.selectList(new QueryWrapper().lambda() .eq(DeviceRole::getIsdeleted,Constants.ZERO) .eq(DeviceRole::getType,Constants.DeviceRoleType.fk) .in(DeviceRole::getId, Arrays.asList(dIds))); if(roles == null || roles.size()==0 || roles.size() != dIds.length){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,请选择有效访问门禁!"); } }else{ //如果设置不选择门禁,则提供默认门禁组信息 String[] dIds = visits.getDoors().split(","); roles = deviceRoleMapper.selectList(new QueryWrapper().lambda() .eq(DeviceRole::getIsdeleted,Constants.ZERO) .eq(DeviceRole::getIsDefault,Constants.ZERO) .eq(DeviceRole::getType,Constants.DeviceRoleType.fk)); if(roles.size() ==0){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,暂不存在可访问的访客门禁,无法进行申请操作!"); } } String[] ids =new String[roles.size()]; for (int i = 0; i < roles.size(); i++) { ids[i] = roles.get(i).getHkId(); } return ids; } @Override public void deleteById(Integer id) { visitsMapper.deleteById(id); } @Override public void delete(Visits visits) { UpdateWrapper deleteWrapper = new UpdateWrapper<>(visits); visitsMapper.delete(deleteWrapper); } @Override public void deleteByIdInBatch(List ids) { if (CollectionUtils.isEmpty(ids)) { return; } visitsMapper.deleteBatchIds(ids); } @Override public void updateById(Visits visits) { visitsMapper.updateById(visits); } @Override public void updateByIdInBatch(List visitss) { if (CollectionUtils.isEmpty(visitss)) { return; } for (Visits visits: visitss) { this.updateById(visits); } } @Override public Visits findById(Integer id) { MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); queryWrapper.selectAll(Visits.class); queryWrapper.selectAs(Member::getName,Visits::getReceptMemberName); queryWrapper.selectAs(Company::getName,Visits::getReceptMemberDepartment); queryWrapper.leftJoin(Member.class,Member::getId,Visits::getReceptMemberId); queryWrapper.leftJoin(Company.class,Company::getId,Member::getCompanyId); queryWrapper.eq(Visits::getId,id); Visits result = visitsJoinMapper.selectJoinOne(Visits.class,queryWrapper); if(result!=null){ if(StringUtils.isNotBlank(result.getDoors())){ String[] doorList=result.getDoors().split(","); MPJLambdaWrapper deviceQuery = new MPJLambdaWrapper<>(); deviceQuery.in(Device::getId,doorList); List deviceList= deviceJoinMapper.selectList(deviceQuery); result.setDeviceList(deviceList); } } MPJLambdaWrapper visitQuery = new MPJLambdaWrapper<>(); visitQuery.selectAll(Visits.class); visitQuery.eq(Visits::getParentId,result.getId()); visitQuery.isNotNull(Visits::getParentId); visitQuery.eq(Visits::getIsdeleted,Constants.ZERO); List visitsList = visitsJoinMapper.selectList(visitQuery); Visits v = new Visits(); BeanUtils.copyProperties(result,v); visitsList.add(0,v); result.setWithUserList(visitsList); return result; } @Override public Visits findOne(Visits visits) { QueryWrapper wrapper = new QueryWrapper<>(visits); return visitsMapper.selectOne(wrapper); } @Override public List findList(Visits visits) { QueryWrapper wrapper = new QueryWrapper<>(visits); return visitsMapper.selectList(wrapper); } @Override public PageData findPage(PageWrap pageWrap) { IPage page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); queryWrapper.selectAll(Visits.class); queryWrapper.selectAs(Member::getName,Visits::getReceptMemberName); queryWrapper.selectAs(Company::getName,Visits::getReceptMemberDepartment); queryWrapper.leftJoin(Member.class,Member::getId,Visits::getReceptMemberId); queryWrapper.leftJoin(Company.class,Company::getId,Member::getCompanyId); queryWrapper.eq(Visits::getIsdeleted,Constants.ZERO); queryWrapper.eq(Objects.nonNull(pageWrap.getModel().getType()),Visits::getType,pageWrap.getModel().getType()); queryWrapper.and(StringUtils.isNotBlank(pageWrap.getModel().getName()),ms->ms.like(Visits::getPhone,pageWrap.getModel().getName()) .or().like(Visits::getPhone,pageWrap.getModel().getName())) .eq(StringUtils.isNotBlank(pageWrap.getModel().getIdcardNo()),Visits::getIdcardNo,StringUtils.isNotBlank(pageWrap.getModel().getIdcardNo())) .eq(StringUtils.isNotBlank(pageWrap.getModel().getCompanyName()),Visits::getCompanyName,pageWrap.getModel().getCompanyName()) .eq(Objects.nonNull(pageWrap.getModel().getStatus()),Visits::getStatus,pageWrap.getModel().getStatus()); queryWrapper.isNull(Visits::getParentId); queryWrapper.orderByDesc(Visits::getCreateDate); IPage result = visitsJoinMapper.selectJoinPage(page, Visits.class,queryWrapper); return PageData.from(result); } @Override public long count(Visits visits) { QueryWrapper wrapper = new QueryWrapper<>(visits); return visitsMapper.selectCount(wrapper); } @Override public PageData retentionPage(PageWrap pageWrap) { IPage page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); queryWrapper.selectAll(Visits.class); queryWrapper.selectAs(Member::getName,Visits::getReceptMemberName); queryWrapper.select("TIMESTAMPDIFF(MINUTE,t.ENDTIME , NOW()) AS timeOut"); queryWrapper.selectAs(Member::getType,Visits::getMemberType); queryWrapper.selectAs(Company::getName,Visits::getReceptMemberDepartment); queryWrapper.leftJoin(Member.class,Member::getId,Visits::getReceptMemberId); queryWrapper.leftJoin(Company.class,Company::getId,Member::getCompanyId); queryWrapper.leftJoin(" member m on m.id=t.MEMBER_ID"); queryWrapper.ne("m.type ",Constants.TWO); queryWrapper.eq(Visits::getIsdeleted,Constants.ZERO); queryWrapper.eq(Objects.nonNull(pageWrap.getModel().getType()),Visits::getType,pageWrap.getModel().getType()); queryWrapper.and(StringUtils.isNotBlank(pageWrap.getModel().getName()),ms->ms.like(Visits::getPhone,pageWrap.getModel().getName()) .or().like(Visits::getPhone,pageWrap.getModel().getName())) .eq(StringUtils.isNotBlank(pageWrap.getModel().getIdcardNo()),Visits::getIdcardNo,StringUtils.isNotBlank(pageWrap.getModel().getIdcardNo())) .eq(StringUtils.isNotBlank(pageWrap.getModel().getCompanyName()),Visits::getCompanyName,pageWrap.getModel().getCompanyName()) .eq(Objects.nonNull(pageWrap.getModel().getStatus()),Visits::getStatus,pageWrap.getModel().getStatus()); queryWrapper.isNull(Visits::getOutDate); queryWrapper.orderByDesc(Visits::getEditDate); String code= systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.TIMEOUT_FREEZE).getCode(); IPage result = visitsJoinMapper.selectJoinPage(page, Visits.class,queryWrapper); if(result!=null&&result.getRecords()!=null){ result.getRecords().stream().forEach(s ->{ if(s.getTimeOut()>=Constants.ZERO){ s.setOutStatus(Constants.ONE); }else if(s.getTimeOut()<=Integer.valueOf(code)&&s.getTimeOut()>0){ s.setOutStatus(Constants.TWO); }else{ s.setOutStatus(Constants.ZERO); } }); } return PageData.from(result); } }