jiangping
2023-12-14 e2f8fb1fbe26ba6d92f3e5dfcaeb0c69abe76b25
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java
@@ -4,10 +4,18 @@
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.ResponseStatus;
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.business.DeviceRoleMapper;
import com.doumee.dao.business.MemberMapper;
@@ -25,9 +33,11 @@
import org.apache.commons.lang3.StringUtils;
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.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
@@ -63,7 +73,41 @@
     * @return
     */
    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public Integer createFk(Visits visits) {
        isValidBaseParam(visits);
        //检查是否必须答题,并且符合答题要求
        ProblemLog problemLog = isValidProblemLog(visits);
        //获取申请的海康访问门禁组信息
        String[] hkIds = getHkDeviceRoles(visits);
        //检验拜访人是否合法
        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);
        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())
@@ -75,44 +119,190 @@
                || visits.getReceptMemberId() == null){
            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,信息填写不正确!");
        }
        //检查是否必须答题,并且符合答题要求
        ProblemLog problemLog = isValidProblemLog(visits);
        //获取申请的海康访问门禁组信息
        String[] hkIds = getHkDeviceRoles(visits);
        //检验拜访人是否合法
        isValideVisitedUser(visits.getReceptMemberId());
        //检查随访人员是否合法,生成随访人员新增集合
        List<Member> withUsers = isValideWithUsers(visits.getWithUserList());
        if(Constants.equalsInteger(Constants.ZERO, visits.getIdcardType()) &&!IdcardUtil.isValidCard(visits.getIdcardNo())){
            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,身份证号码有误,请核实后重试!");
        if(visits.getStarttime().getTime() < System.currentTimeMillis()){
            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,预约开始时间必须大于当前时间!");//
        }
        Date date = new Date();
        visits.setBirthday(Constants.getBirthdyByCardNo(visits.getIdcardNo()));
        //身份证号存储密文
        visits.setIdcardNo(DESUtil.encrypt(Constants.EDS_PWD, visits.getIdcardNo()));//身份证号加密
        visits.setIdcardDecode(Constants.getTuominStr(visits.getIdcardNo()));//脱敏手机号
        visits.setCreateDate(date);
        //访客信息(使用身份证号查询是否已存在改普通访客,没有则新增,存在则更新openid等信息)
        Member member = getMemberByIdcardno(visits);
        visitsMapper.insert(visits);
        updateProblemLog(visits,problemLog,member);
        return visits.getId();
        if(visits.getEndtime().getTime() <= visits.getStarttime().getTime()){
            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,预约结束时间必须大于开始时间!");//
        }
    }
    private void isValidWithVisitParam(Visits visits,  List<Member> addList,  List<Member> 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 Member getMemberByIdcardno(Visits idcardNo) {
        Member member = memberMapper.selectOne(new QueryWrapper<Member>().lambda()
//                .eq(Member::getType,Constants.MEMBER_TYPE)
                .eq(Member::getIdcardNo,idcardNo.getIdcardNo())
        );
    private boolean isRepeatedMember(Visits visits, List<Member> addList, List<Member> 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) {
        return  null;
    }
    private String visitAppiontment(Visits visits) {
        VisitAppointmentRequest param = new VisitAppointmentRequest();
        param.setVisitStartTime(DateUtil.getISO8601Timestamp(visits.getStarttime()));
        param.setVisitEndTime(DateUtil.getISO8601Timestamp(visits.getStarttime()));
        BaseResponse<VisitAppointmentResponse>  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<Member>().lambda()
                    .eq(Member::getType,Constants.memberType.visitor)
                    .eq(Member::getOpenid,visits.getOpenid())
                    .set(Member::getOpenid,null)
            );
        }
        List<Member> addList = new ArrayList<>();
        List<Member> 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<Member> addList, List<Member> editList) {
        if(!Constants.checkCarNo(visits.getCarNos())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,车牌号【"+visits.getCarNos()+"】不合法,请核实后重试~");
        }
        Member member = memberMapper.selectOne(new QueryWrapper<Member>().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(visits.getSex());
            // 新增访客记录
            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(visits.getSex());
            // 更新访客信息,
            editList.add(member);
        }
        return  member;
    }
    /**
     * 核查预约用户是否存在未签离的预约记录
     * @param member
     */
    private void isExsitNoOutVisisRecord(Member member) {
        Visits v = visitsMapper.selectOne(new QueryWrapper<Visits>().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<Member> isValideWithUsers(List<Visits> withUserList) {
        if(withUserList!= null && withUserList .size()>0){
            for(Visits model:withUserList){