package com.doumee.service.business.impl; import cn.hutool.core.util.IdcardUtil; import com.doumee.core.annotation.excel.ExcelImporter; import com.doumee.core.constants.ResponseStatus; import com.doumee.core.exception.BusinessException; import com.doumee.core.model.LoginUserInfo; import com.doumee.core.model.PageData; import com.doumee.core.model.PageWrap; import com.doumee.core.utils.Constants; import com.doumee.core.utils.DateUtil; import com.doumee.core.utils.Utils; import com.doumee.dao.business.InsuranceApplyMapper; import com.doumee.dao.business.MemberMapper; import com.doumee.dao.business.SolutionsMapper; import com.doumee.dao.business.WorktypeMapper; import com.doumee.dao.business.dto.MemberImport; import com.doumee.dao.business.dto.MemberQueryDTO; import com.doumee.dao.business.dto.MemberReduceImport; import com.doumee.dao.business.dto.WorktypeImport; import com.doumee.dao.business.join.ApplyDetailJoinMapper; import com.doumee.dao.business.join.DispatchUnitJoinMapper; import com.doumee.dao.business.join.MemberJoinMapper; import com.doumee.dao.business.join.SolutionWorktypeJoinMapper; import com.doumee.dao.business.model.*; import com.doumee.service.business.MemberService; 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.xiaoymin.knife4j.core.util.CollectionUtils; import com.github.yulichang.wrapper.MPJLambdaWrapper; import lombok.extern.java.Log; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import org.checkerframework.checker.units.qual.C; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.math.BigDecimal; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; /** * 用工信息表Service实现 * @author 江蹄蹄 * @date 2024/01/16 10:03 */ @Service public class MemberServiceImpl implements MemberService { @Autowired private MemberMapper memberMapper; @Autowired private MemberJoinMapper memberJoinMapper; @Autowired private DispatchUnitJoinMapper dispatchUnitJoinMapper; @Autowired private ApplyDetailJoinMapper applyDetailJoinMapper; @Autowired private WorktypeMapper worktypeMapper; @Autowired private SolutionsMapper solutionsMapper; @Autowired private InsuranceApplyMapper insuranceApplyMapper; @Autowired private SolutionWorktypeJoinMapper solutionWorktypeJoinMapper; @Override public Integer create(Member member) { LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); member.setCompanyId(loginUserInfo.getCompanyId()); memberMapper.insert(member); return member.getId(); } @Override public void deleteById(Integer id) { memberMapper.deleteById(id); } @Override public void delete(Member member) { UpdateWrapper deleteWrapper = new UpdateWrapper<>(member); memberMapper.delete(deleteWrapper); } @Override public void deleteByIdInBatch(List ids) { if (CollectionUtils.isEmpty(ids)) { return; } memberMapper.deleteBatchIds(ids); } @Override public void updateById(Member member) { memberMapper.updateById(member); } @Override public void updateByIdInBatch(List members) { if (CollectionUtils.isEmpty(members)) { return; } for (Member member: members) { this.updateById(member); } } @Override public Member findById(Integer id) { return memberMapper.selectById(id); } @Override public Member findDetailById(Integer id) { MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); queryWrapper.selectAll(Member.class) .selectAs(DispatchUnit::getName,Member::getDuName) .selectAs(Worktype::getName,Member::getWorkTypeName) .selectAs(Solutions::getName,Member::getSolutionName) .selectAs(Company::getName,Member::getCompanyName) .select(" case when now() between t.start_time and t.end_time then 1 else 2 end solutionsStatus ") .leftJoin(InsuranceApply.class,InsuranceApply::getId,Member::getApplyId) .leftJoin(Solutions.class,Solutions::getId,InsuranceApply::getSolutionId) .leftJoin(DispatchUnit.class,DispatchUnit::getId,Member::getDuId) .leftJoin(Worktype.class,Worktype::getId,Member::getWorktypeId) .leftJoin(Company.class,Company::getId,Member::getCompanyId) .eq(Member::getId,id) .eq(Member::getIsdeleted, Constants.ZERO) .last(" limit 1 ") ; return memberJoinMapper.selectJoinOne(Member.class,queryWrapper); } @Override public Member findOne(Member member) { QueryWrapper wrapper = new QueryWrapper<>(member); return memberMapper.selectOne(wrapper); } @Override public List findList(Member member) { QueryWrapper wrapper = new QueryWrapper<>(member); return memberMapper.selectList(wrapper); } @Override public PageData findPage(PageWrap pageWrap) { IPage page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); QueryWrapper queryWrapper = new QueryWrapper<>(); Utils.MP.blankToNull(pageWrap.getModel()); if (pageWrap.getModel().getId() != null) { queryWrapper.lambda().eq(Member::getId, pageWrap.getModel().getId()); } if (pageWrap.getModel().getCreator() != null) { queryWrapper.lambda().eq(Member::getCreator, pageWrap.getModel().getCreator()); } if (pageWrap.getModel().getCreateDate() != null) { queryWrapper.lambda().ge(Member::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate())); queryWrapper.lambda().le(Member::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate())); } if (pageWrap.getModel().getEditor() != null) { queryWrapper.lambda().eq(Member::getEditor, pageWrap.getModel().getEditor()); } if (pageWrap.getModel().getEditDate() != null) { queryWrapper.lambda().ge(Member::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate())); queryWrapper.lambda().le(Member::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate())); } if (pageWrap.getModel().getIsdeleted() != null) { queryWrapper.lambda().eq(Member::getIsdeleted, pageWrap.getModel().getIsdeleted()); } if (pageWrap.getModel().getRemark() != null) { queryWrapper.lambda().eq(Member::getRemark, pageWrap.getModel().getRemark()); } if (pageWrap.getModel().getSortnum() != null) { queryWrapper.lambda().eq(Member::getSortnum, pageWrap.getModel().getSortnum()); } if (pageWrap.getModel().getApplyId() != null) { queryWrapper.lambda().eq(Member::getApplyId, pageWrap.getModel().getApplyId()); } if (pageWrap.getModel().getEndTime() != null) { queryWrapper.lambda().eq(Member::getEndTime, pageWrap.getModel().getEndTime()); } if (pageWrap.getModel().getStartTime() != null) { queryWrapper.lambda().eq(Member::getStartTime, pageWrap.getModel().getStartTime()); } if (pageWrap.getModel().getCompanyId() != null) { queryWrapper.lambda().eq(Member::getCompanyId, pageWrap.getModel().getCompanyId()); } if (pageWrap.getModel().getDuId() != null) { queryWrapper.lambda().eq(Member::getDuId, pageWrap.getModel().getDuId()); } if (pageWrap.getModel().getWorktypeId() != null) { queryWrapper.lambda().eq(Member::getWorktypeId, pageWrap.getModel().getWorktypeId()); } if (pageWrap.getModel().getSex() != null) { queryWrapper.lambda().eq(Member::getSex, pageWrap.getModel().getSex()); } for(PageWrap.SortData sortData: pageWrap.getSorts()) { if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) { queryWrapper.orderByDesc(sortData.getProperty()); } else { queryWrapper.orderByAsc(sortData.getProperty()); } } return PageData.from(memberMapper.selectPage(page, queryWrapper)); } @Override public PageData findPageForCompany(PageWrap pageWrap) { IPage page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); Utils.MP.blankToNull(pageWrap.getModel()); MemberQueryDTO memberQueryDTO = pageWrap.getModel(); LoginUserInfo loginUserInfo =(LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); //企业人员查看本企业数据 if(loginUserInfo.getType().equals(Constants.ONE)){ queryWrapper.eq(InsuranceApply::getCompanyId, loginUserInfo.getCompanyId()); // .select( " ( select count(1) from apply_detail a inner join insurance_apply b on a.APPLY_ID = b.id where a.member_id = t.id and b.company_id = "+loginUserInfo.getCompanyId()+" and b.status in (" + // " "+Constants.InsuranceApplyStatus.WTB_DONE.getKey()+","+Constants.InsuranceApplyStatus.UPLOAD_INSURANCE.getKey()+" ) " + // " and a.end_time >= now() ) ", Member::getValidNum ) // // .select( " ( select count(1) from apply_detail a inner join insurance_apply b on a.APPLY_ID = b.id where a.member_id = t.id and b.company_id = "+loginUserInfo.getCompanyId()+" and b.status in (" + // " "+Constants.InsuranceApplyStatus.WTB_DONE.getKey()+","+Constants.InsuranceApplyStatus.UPLOAD_INSURANCE.getKey()+" ) " + // " and a.end_time < now() ) ", Member::getInvalidNum ); }else{ if(loginUserInfo.getCompanyIdList()!=null && loginUserInfo.getCompanyIdList().size()>0){ queryWrapper.in(InsuranceApply::getCompanyId, loginUserInfo.getCompanyIdList()); }else{ queryWrapper.eq(InsuranceApply::getCompanyId, -1); } queryWrapper.eq(pageWrap.getModel().getCompanyId()!=null,InsuranceApply::getCompanyId, pageWrap.getModel().getCompanyId()); // .select( " ( select count(1) from apply_detail a inner join insurance_apply b on a.APPLY_ID = b.id where a.member_id = t.id and b.status in (" + // " "+Constants.InsuranceApplyStatus.WTB_DONE.getKey()+","+Constants.InsuranceApplyStatus.UPLOAD_INSURANCE.getKey()+" ) " + // " and a.end_time >= now() ) ", Member::getValidNum ) // .select( " ( select count(1) from apply_detail a inner join insurance_apply b on a.APPLY_ID = b.id where a.member_id = t.id and b.status in (" + // " "+Constants.InsuranceApplyStatus.WTB_DONE.getKey()+","+Constants.InsuranceApplyStatus.UPLOAD_INSURANCE.getKey()+" ) " + // " and a.end_time < now() ) ", Member::getInvalidNum ); } queryWrapper.selectAll(Member.class) .and(StringUtils.isNotBlank(memberQueryDTO.getKeywords()), i->i.like(Member::getName, memberQueryDTO.getKeywords()).or().like( Member::getIdcardNo,memberQueryDTO.getKeywords() )) .eq(Member::getIsdeleted, Constants.ZERO) .like(StringUtils.isNotBlank(memberQueryDTO.getName()),Member::getName, memberQueryDTO.getName()) .like(StringUtils.isNotBlank(memberQueryDTO.getIdCard()),Member::getIdcardNo, memberQueryDTO.getIdCard()) .like(StringUtils.isNotBlank(memberQueryDTO.getIdcardNo()),Member::getIdcardNo, memberQueryDTO.getIdcardNo()) .apply(!Objects.isNull(memberQueryDTO.getSolutionsId())," t.id in( select a.member_id from apply_detail a inner join insurance_apply b on a.APPLY_ID = b.id " + "inner join solutions s on b.solution_id = s.id where s.base_id = '"+memberQueryDTO.getSolutionsId()+"' ) ") ; queryWrapper.orderByAsc(DispatchUnit::getName); queryWrapper.orderByAsc(Member::getName); PageData pageData = PageData.from(memberJoinMapper.selectJoinPage(page,Member.class, queryWrapper)); this.getValidNum(pageData,loginUserInfo); Integer sn = 0; for (Member member:pageData.getRecords()) { sn = sn + 1; member.setSn(sn); if(StringUtils.isNotBlank(member.getIdcardNo())){ member.setAge(Constants.getAgeByIdCard(member.getIdcardNo())); } member.setTotalNum(member.getInvalidNum()+member.getValidNum()); } return pageData; } public void getValidNum(PageData pageData,LoginUserInfo loginUserInfo){ List listId = pageData.getRecords().stream().map(i->i.getId()).collect(Collectors.toList()); if(CollectionUtils.isNotEmpty(listId)){ Integer companyId = null; if(Objects.nonNull(loginUserInfo.getType())&&Constants.equalsInteger(loginUserInfo.getType(),Constants.ONE)){ companyId = loginUserInfo.getShowCompany().getId(); } List applyDetailList = applyDetailJoinMapper.selectJoinList(ApplyDetail.class, new MPJLambdaWrapper() .select(ApplyDetail::getMemberId,ApplyDetail::getStartTime,ApplyDetail::getEndTime,ApplyDetail::getId) .leftJoin(InsuranceApply.class,InsuranceApply::getId,ApplyDetail::getApplyId) .in(InsuranceApply::getStatus,Constants.InsuranceApplyStatus.WTB_DONE.getKey(),Constants.InsuranceApplyStatus.UPLOAD_INSURANCE.getKey()) .in(ApplyDetail::getMemberId,listId) .eq(Objects.nonNull(companyId) ,InsuranceApply::getCompanyId,companyId) ); if(CollectionUtils.isNotEmpty(applyDetailList)){ for (Member member:pageData.getRecords()) { member.setInvalidNum(applyDetailList.stream().filter(i->Constants.equalsInteger(i.getMemberId(),member.getId())&&i.getEndTime().getTime()Constants.equalsInteger(i.getMemberId(),member.getId())&&i.getEndTime().getTime()>=System.currentTimeMillis()).collect(Collectors.toList()).size() ); } } } } @Override public long count(Member member) { QueryWrapper wrapper = new QueryWrapper<>(member); return memberMapper.selectCount(wrapper); } @Override public List findListByDTO(MemberQueryDTO memberQueryDTO) { MPJLambdaWrapper lambdaWrapper = new MPJLambdaWrapper(); lambdaWrapper.selectAll(Member.class) .selectAs(DispatchUnit::getName,Member::getDuName) .selectAs(Worktype::getName,Member::getWorkTypeName) .selectAs(Company::getName,Member::getCompanyName) .select(" case when now() between t.start_time and t.end_time then 1 else 2 end solutionsStatus ") .leftJoin(DispatchUnit.class,DispatchUnit::getId,Member::getDuId) .leftJoin(Worktype.class,Worktype::getId,Member::getWorktypeId) .leftJoin(Company.class,Company::getId,Member::getCompanyId) .notIn(CollectionUtils.isNotEmpty(memberQueryDTO.getMemberIds()),Member::getId,memberQueryDTO.getMemberIds()) .in(CollectionUtils.isNotEmpty(memberQueryDTO.getSubtractMemberIds()),Member::getId,memberQueryDTO.getSubtractMemberIds()) .eq(!Objects.isNull(memberQueryDTO.getCompanyId()),Member::getCompanyId,memberQueryDTO.getCompanyId()) .eq(Member::getIsdeleted, Constants.ZERO) .apply(!Objects.isNull(memberQueryDTO.getSolutionsStatus())&&memberQueryDTO.getSolutionsStatus().equals(Constants.ONE),"now() between t.start_time and t.end_time") .apply(!Objects.isNull(memberQueryDTO.getSolutionsStatus())&&memberQueryDTO.getSolutionsStatus().equals(Constants.TWO),"now() > t.end_time") .and(StringUtils.isNotBlank(memberQueryDTO.getName()),i->i.like(Member::getName,memberQueryDTO.getName()) .or().like(Member::getIdcardNo,memberQueryDTO.getName())) .notExists(!Objects.isNull(memberQueryDTO.getNotInInsuranceApplyId())&&!Objects.isNull(memberQueryDTO.getValidTime()), " select 1 from apply_detail ad where ad.apply_id = "+memberQueryDTO.getNotInInsuranceApplyId()+"" + " and ad.END_TIME >= '"+DateUtil.DateToStr(memberQueryDTO.getValidTime(),"yyyy-MM-dd HH:mm:ss.SSS")+"' and ad.START_TIME <= '"+DateUtil.DateToStr(memberQueryDTO.getValidTime(),"yyyy-MM-dd HH:mm:ss.SSS")+"' and ad.isdeleted = 0 " + " and ad.member_id = t.id ") ; if(!Objects.isNull(memberQueryDTO.getInsuranceApplyId())){ if(Objects.isNull(memberQueryDTO.getValidTime())){ memberQueryDTO.setValidTime(new Date()); } lambdaWrapper = new MPJLambdaWrapper() .select(Member::getId,Member::getName,Member::getIdcardNo) .selectAs(Worktype::getId,Member::getWorktypeId) .selectAs(DispatchUnit::getId,Member::getDuId) .selectAs(DispatchUnit::getName,Member::getDuName) .selectAs(Worktype::getName,Member::getWorkTypeName) .selectAs(Company::getName,Member::getCompanyName) .selectAs(InsuranceApply::getStartTime,Member::getStartTime) .selectAs(InsuranceApply::getFinalEndTime,Member::getEndTime) .selectAs(InsuranceApply::getSolutionId,Member::getSolutionId) .selectAs(ApplyDetail::getStartTime,Member::getDetailStartTime) .selectAs(ApplyDetail::getEndTime,Member::getDetailEndTime) .selectAs(ApplyDetail::getFee,Member::getFee) .selectAs(InsuranceApply::getServerCost,Member::getDetailServerCost) .leftJoin(ApplyDetail.class,ApplyDetail::getMemberId,Member::getId) .leftJoin(InsuranceApply.class,InsuranceApply::getId,ApplyDetail::getApplyId) .leftJoin(DispatchUnit.class,DispatchUnit::getId,ApplyDetail::getDuId) .leftJoin(Worktype.class,Worktype::getId,ApplyDetail::getWorktypeId) .eq(Member::getIsdeleted, Constants.ZERO) .eq(InsuranceApply::getId,memberQueryDTO.getInsuranceApplyId()) .and(StringUtils.isNotBlank(memberQueryDTO.getName()),i->i.like(Member::getName,memberQueryDTO.getName()) .or().like(Member::getIdcardNo,memberQueryDTO.getName())) // .le(!Objects.isNull(memberQueryDTO.getValidTime()),ApplyDetail::getStartTime,memberQueryDTO.getValidTime()) .ge(!Objects.isNull(memberQueryDTO.getValidTime()),ApplyDetail::getEndTime,memberQueryDTO.getValidTime()) .in(CollectionUtils.isNotEmpty(memberQueryDTO.getSubtractMemberIds()),Member::getId,memberQueryDTO.getSubtractMemberIds()) .exists(!Objects.isNull(memberQueryDTO.getInsuranceApplyId())&&!Objects.isNull(memberQueryDTO.getValidTime()), " select 1 from apply_detail ad where ad.apply_id = "+memberQueryDTO.getInsuranceApplyId()+"" + " and ad.END_TIME >= '"+DateUtil.DateToStr(memberQueryDTO.getValidTime(),"yyyy-MM-dd HH:mm:ss.SSS")+"'" + // " and ad.START_TIME <= '"+DateUtil.DateToStr(memberQueryDTO.getValidTime(),"yyyy-MM-dd HH:mm:ss.SSS")+"'" + " and ad.isdeleted = 0 " + " and ad.member_id = t.id "); } List memberList = memberJoinMapper.selectJoinList(Member.class,lambdaWrapper); if(!Objects.isNull(memberQueryDTO.getInsuranceApplyId())&&Objects.nonNull(memberQueryDTO.getValidTime())){ if(CollectionUtils.isNotEmpty(memberList)){ Solutions solutions = solutionsMapper.selectById(memberList.get(Constants.ZERO).getSolutionId()); // Date reduceEndTime = DateUtil.getMontageDate( // DateUtil.afterDateByType(new Date(),0,solutions.getDelValidDays()),3); // Date reduceEndTime = DateUtil.getMontageDate(new Date(),3); for (Member member:memberList) { //如果当前日期 小于 人员保单明细记录的开始时间 则使用开始日期 开始日期 = 结束日期 且 费用全部退回 // if(System.currentTimeMillis()<=member.getStartTime().getTime()){ // member.setFee(solutions.getPrice().multiply(new BigDecimal(-1))); if(System.currentTimeMillis()<=member.getDetailStartTime().getTime()){ member.setFee(member.getFee().multiply(new BigDecimal(-1))); }else{ Date reduceEndTime = DateUtil.getMontageDate( DateUtil.afterDateByType(new Date(),0,solutions.getDelValidDays()),3); member.setFee( Constants.reduceFee(solutions, Objects.isNull(member.getDetailServerCost())? solutions.getPrice():solutions.getPrice().add(member.getDetailServerCost()),member.getStartTime(),member.getEndTime(),member.getDetailStartTime(), reduceEndTime).subtract(member.getFee())); } } } } return memberList; } @Override public List importReduceBatch(MultipartFile file, Integer applyId){ if(applyId == null ){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,请选择有效的方案再进行操作!"); } LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); // if(!loginUserInfo.getType().equals(Constants.ONE)){ // throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"非企业人员无法进行该操作"); // } ExcelImporter ie = null; List dataList =null; try { ie = new ExcelImporter(file,1,0); dataList = ie.getDataList(MemberReduceImport.class,null); } catch (Exception e) { e.printStackTrace(); } if(dataList == null || dataList.size() ==0){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,录入数据为空!"); } InsuranceApply insuranceApply = insuranceApplyMapper.selectById(applyId); // if (Objects.isNull(insuranceApply) || !Constants.equalsInteger(insuranceApply.getCompanyId(),loginUserInfo.getCompanyId())) { // throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,保单信息不存在,请刷新页面重试!"); // } if (!(Constants.equalsInteger(insuranceApply.getStatus(), Constants.InsuranceApplyStatus.UPLOAD_INSURANCE.getKey()) ||Constants.equalsInteger(insuranceApply.getStatus(), Constants.InsuranceApplyStatus.WTB_DONE.getKey()) )) { throw new BusinessException(ResponseStatus.DATA_ERRO.getCode(), "对不起,保单当前状态不支持该操作!"); } if (DateUtil.compareDate(insuranceApply.getEndTime(),new Date()) >= Constants.ZERO ) { throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "保单已过保,不支持该操作"); } Solutions solutions = solutionsMapper.selectById(insuranceApply.getSolutionId()); if(Objects.isNull(solutions)){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到保险方案"); } // Date reduceEndTime = DateUtil.getMontageDate( // DateUtil.afterDateByType(new Date(),0,solutions.getDelValidDays()),3); // Date reduceEndTime = DateUtil.getMontageDate(new Date(),3); int index = Constants.TWO; Map idCardMap = new HashMap<>(); for(MemberReduceImport model : dataList){ //校验参数是否合法 validReduceImportParam(model,idCardMap,index); index += 1; } index = Constants.TWO; for(MemberReduceImport model : dataList){ ApplyDetail detail =applyDetailJoinMapper.selectJoinOne(ApplyDetail.class,new MPJLambdaWrapper() .selectAll(ApplyDetail.class) .selectAs(Worktype::getName,ApplyDetail::getWorkTypeName) .selectAs(DispatchUnit::getName,ApplyDetail::getDuName) // .selectAs(InsuranceApply::getStartTime,ApplyDetail::getStartTime) // .selectAs(InsuranceApply::getEndTime,ApplyDetail::getEndTime) .selectAs(InsuranceApply::getServerCost,ApplyDetail::getDetailServerCost) .leftJoin(Worktype.class,Worktype::getId,ApplyDetail::getWorktypeId) .leftJoin(DispatchUnit.class,DispatchUnit::getId,ApplyDetail::getDuId) .leftJoin(InsuranceApply.class,InsuranceApply::getId,ApplyDetail::getApplyId) .eq(ApplyDetail::getApplyId,insuranceApply.getId()) .eq(ApplyDetail::getApplyId,insuranceApply.getId()) .eq(ApplyDetail::getIdcardNo,model.getIdCard()) /* .le(ApplyDetail::getStartTime,DateUtil.getMontageDate(new Date(),1))*/ .ge(ApplyDetail::getEndTime,DateUtil.getMontageDate(new Date(),3)) .orderByAsc(ApplyDetail::getEndTime) .last(" limit 1 ") ); if(detail == null){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "当前保单下,员工【" + model.getName()+model.getIdCard() + "】非在保人员,无法进行该操作"); } if(!StringUtils.equals(model.getName(), detail.getMemberName())){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "当前保单下,员工【" +model.getName()+ model.getIdCard() + "】与其登记在保记录姓名不一致,请核实填写正确再操作"); } if(!Constants.equalsInteger(Constants.ZERO, detail.getChangeStatus())){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "当前保单下,员工【" +model.getName()+ model.getIdCard() + "】已进行过减保申请,不能再次进行该操作"); } model.setDuId(detail.getDuId()); model.setDuName(detail.getDuName()); model.setWorktypeId(detail.getWorktypeId()); model.setMemberId(detail.getMemberId()); model.setWorkTypeName(detail.getWorkTypeName()); //如果当前日期 小于 人员保单明细记录的开始时间 则使用开始日期 开始日期 = 结束日期 且 费用全部退回 if(System.currentTimeMillis()<=detail.getStartTime().getTime()){ model.setFee(solutions.getPrice().multiply(new BigDecimal(-1))); }else{ Date reduceEndTime = DateUtil.getMontageDate( DateUtil.afterDateByType(new Date(),0,solutions.getDelValidDays()),3); model.setFee( Constants.reduceFee(solutions, Objects.isNull(detail.getDetailServerCost())?solutions.getPrice():solutions.getPrice().add(detail.getDetailServerCost()), insuranceApply.getStartTime(), insuranceApply.getEndTime(), detail.getStartTime(), reduceEndTime).subtract(detail.getFee())); } index += 1; } return dataList; } private void validReduceImportParam(MemberReduceImport model, Map idCardMap, int index) { if(StringUtils.isBlank(model.getName())){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第"+index+"行数据姓名不能为空!"); } if(StringUtils.isBlank(model.getIdCard())){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第"+index+"行数据身份证号不能为空!"); } if(StringUtils.isBlank(model.getIdCard())||model.getIdCard().length()!=18){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第"+index+"行数据身份证【"+model.getIdCard()+"】格式不正确!"); } if(!IdcardUtil.isValidCard(model.getIdCard())){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第"+index+"行数据身份证【"+model.getIdCard()+"】信息不正确!"); } if(Objects.nonNull(idCardMap.get(model.getIdCard()))){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,文档中第"+index+"行数据身份证号【"+model.getIdCard()+"】存在相同数据!"); } idCardMap.put(model.getIdCard(), model.getIdCard()); } @Override public List importBatch(MultipartFile file,Integer solutionId){ if(solutionId == null ){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,请选择有效的方案再进行操作!"); } LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); // if(!loginUserInfo.getType().equals(Constants.ONE)){ // throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"非企业人员无法进行该操作"); // } if(Objects.isNull(solutionId)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"参数错误 - 方案信息"); } Solutions solutions = solutionsMapper.selectById(solutionId); if(Objects.isNull(solutions)){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到方案信息"); } ExcelImporter ie = null; List dataList =null; try { ie = new ExcelImporter(file,1,0); dataList = ie.getDataList(MemberImport.class,null); } catch (Exception e) { e.printStackTrace(); } if(dataList == null || dataList.size() ==0){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,录入数据为空!"); } int index = Constants.TWO; Map idCardMap = new HashMap<>(); for(MemberImport model : dataList){ //校验参数是否合法 validImportParam(model,idCardMap,dataList,index,solutions); index += 1; } List dispatchUnitList = new ArrayList<>(); List solutionWorktypeList = new ArrayList<>(); //2024年11月6日15:39:10 加入 根据方案是否有保险方案进行判断 if(Constants.equalsInteger(solutions.getHasDispatchUnit(),Constants.ZERO)){ dispatchUnitList = dispatchUnitJoinMapper.selectJoinList(DispatchUnit.class, new MPJLambdaWrapper() .selectAll(DispatchUnit.class) .select("(select b.id from du_solution b where b.isdeleted=0 and b.dispatch_unit_id=t.id and b.solution_id="+solutionId+" order by b.CHECK_DATE desc limit 1) as du_solution_id" ) .eq(DispatchUnit::getIsdeleted,Constants.ZERO) .eq(DispatchUnit::getStatus,Constants.ZERO) .eq(DispatchUnit::getDataType,Constants.TWO) .eq(loginUserInfo.getType().equals(Constants.ONE),DispatchUnit::getCompanyId,loginUserInfo.getCompanyId()) .exists("select b.id from du_solution b where b.isdeleted=0 and b.dispatch_unit_id=t.id and b.status = 1 and b.solution_id="+solutionId ) ); if(CollectionUtils.isNotEmpty(dispatchUnitList)){ for (DispatchUnit dispatchUnit:dispatchUnitList) { List worktypeList = worktypeMapper.selectList(new QueryWrapper().lambda() .eq(Worktype::getIsdeleted,Constants.ZERO) .eq(Worktype::getDataType,Constants.TWO) .eq(Worktype::getStatus,Constants.ZERO) .apply("id in ( select dw.work_type_id from du_worktype dw where dw.status = 1" + " and dw.du_solution_id = "+dispatchUnit.getDuSolutionId()+" )") ); dispatchUnit.setWorktypeList(worktypeList); } } }else{ //方案不选择派遣单位情况下的业务 solutionWorktypeList = solutionWorktypeJoinMapper.selectJoinList(SolutionWorktype.class, new MPJLambdaWrapper() .selectAll(SolutionWorktype.class) .selectAs(Worktype::getName,SolutionWorktype::getWorktypeName) .leftJoin(Worktype.class,Worktype::getId,SolutionWorktype::getWorktypeId) .eq(SolutionWorktype::getSolutionId,solutions.getId()) ); if(CollectionUtils.isEmpty(solutionWorktypeList)){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,保险方案下未查询到工种信息"); } } //String pattern = "^[\\u4e00-\\u9fa5\\d·]+$"; String pattern = "^[\\u4e00-\\u9fa5·]*$"; Pattern r = Pattern.compile(pattern); index = Constants.TWO; for(MemberImport model : dataList){ Matcher m = r.matcher(model.getName()); if (!m.matches()) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,"+model.getName() + "姓名无效,请检查后重试"); } //检查派遣单位和工种有效性 dealDuAndWorktype(model,index,dispatchUnitList,solutions,solutionWorktypeList); index += 1; model.setSex(Constants.getSexByIdCard(model.getIdCard())); } return dataList; } private void dealDuAndWorktype(MemberImport model, int index, List dispatchUnitList , Solutions solutions,List solutionWorktypeList) { //2024年11月6日15:39:10 加入 根据方案是否有保险方案进行判断 if(Constants.equalsInteger(solutions.getHasDispatchUnit(),Constants.ZERO)){ if(CollectionUtils.isNotEmpty(dispatchUnitList)){ Optional dispatchUnitOptional= dispatchUnitList.stream().filter(m->m.getName().equals(model.getDuName())).findFirst(); if(dispatchUnitOptional.isPresent()){ DispatchUnit dispatchUnit = dispatchUnitOptional.get(); model.setDuId(dispatchUnit.getId()); if(StringUtils.isNotBlank(model.getWorkTypeName())&&CollectionUtils.isNotEmpty(dispatchUnit.getWorktypeList())){ Optional worktypeOptional= dispatchUnit.getWorktypeList().stream().filter(m->m.getName().replaceAll(" ","").equals(model.getWorkTypeName().replaceAll(" ",""))).findFirst(); if(worktypeOptional.isPresent()){ Worktype worktype = worktypeOptional.get(); model.setWorktypeId(worktype.getId()); } } } } if(Objects.isNull(model.getDuId())){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第"+index+"行数据派遣单位【"+model.getDuName()+"】不正确!"); } }else{ Optional worktypeOptional= solutionWorktypeList.stream().filter(m->m.getWorktypeName().replaceAll(" ","") .equals(model.getWorkTypeName().replaceAll(" ",""))).findFirst(); if(worktypeOptional.isPresent()){ SolutionWorktype worktype = worktypeOptional.get(); model.setWorktypeId(worktype.getId()); } } if(Objects.isNull(model.getWorktypeId())){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第"+index+"行数据工种【"+model.getWorkTypeName()+"】不正确!"); } } private void validImportParam(MemberImport model, Map idCardMap, List dataList,int index,Solutions solutions) { if(StringUtils.isBlank(model.getName())){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第"+index+"行数据姓名不能为空!"); } if(StringUtils.isBlank(model.getIdCard())){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第"+index+"行数据身份证号不能为空!"); } //2024年11月6日15:39:10 加入 根据方案是否有保险方案进行判断 if(Constants.equalsInteger(solutions.getHasDispatchUnit(),Constants.ZERO)){ if(StringUtils.isBlank(model.getDuName())){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第"+index+"行数据派遣单位不能为空!"); } } if(StringUtils.isBlank(model.getWorkTypeName())){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第"+index+"行数据工种不能为空!"); } if(StringUtils.isBlank(model.getIdCard())||model.getIdCard().length()!=18){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第"+index+"行数据身份证【"+model.getIdCard()+"】格式不正确!"); } if(!IdcardUtil.isValidCard(model.getIdCard())){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第"+index+"行数据身份证【"+model.getIdCard()+"】信息不正确!"); } if(Objects.nonNull(idCardMap.get(model.getIdCard()))){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,文档中第"+index+"行数据身份证号【"+model.getIdCard()+"】存在相同数据!"); } idCardMap.put(model.getIdCard(), model.getIdCard()); } }