jiangping
2024-01-05 cb6874174975a370cb60f1557704c9d49a05f9e6
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java
@@ -1,12 +1,15 @@
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;
@@ -24,14 +27,17 @@
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;
@@ -61,6 +67,10 @@
    @Autowired
    private VisitsMapper visitsMapper;
    @Autowired
    private ApproveMapper approveMapper;
    @Autowired
    private ApproveParamMapper approveParamMapper;
    @Autowired
    private DeviceRoleMapper deviceRoleMapper;
    @Autowired
    private ProblemLogMapper problemLogMapper ;
@@ -68,7 +78,8 @@
    private MemberMapper memberMapper ;
    @Autowired
    private VisitsJoinMapper visitsJoinMapper;
    @Autowired
    private CompanyMapper companyMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Autowired
@@ -125,12 +136,333 @@
        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;
    }
    /**
     * 校验必填项数据是否合法
@@ -692,6 +1024,18 @@
        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)
@@ -703,8 +1047,9 @@
                );
            }
        }
        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;
    }
@@ -712,5 +1057,39 @@
    @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);
    }
}