package com.doumee.service.business.impl; 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.*; import com.doumee.dao.business.dto.InsuranceApplyOptDTO; import com.doumee.dao.business.dto.InsuranceApplyQueryDTO; import com.doumee.dao.business.join.ApplyLogJoinMapper; import com.doumee.dao.business.join.InsuranceApplyJoinMapper; import com.doumee.dao.business.model.*; import com.doumee.dao.system.model.SystemUser; import com.doumee.service.business.InsuranceApplyService; 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 io.swagger.models.auth.In; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; /** * 投保申请信息表Service实现 * @author 江蹄蹄 * @date 2024/01/16 10:03 */ @Service public class InsuranceApplyServiceImpl implements InsuranceApplyService { @Autowired private InsuranceApplyMapper insuranceApplyMapper; @Autowired private InsuranceApplyJoinMapper insuranceApplyJoinMapper; @Autowired private ApplyDetailMapper applyDetailMapper; @Autowired private ApplyLogMapper applyLogMapper; @Autowired private ApplyLogJoinMapper applyLogJoinMapper; @Autowired private SolutionsMapper solutionsMapper; @Autowired private MemberMapper memberMapper; @Autowired private DuSolutionMapper duSolutionMapper; @Autowired private DuWorktypeMapper duWorktypeMapper; @Override @Transactional(rollbackFor = {Exception.class,BusinessException.class}) public Integer create(InsuranceApply insuranceApply) { if (Objects.isNull(insuranceApply) || Objects.isNull(insuranceApply.getSolutionId()) || Objects.isNull(insuranceApply.getApplyStartTime()) || Objects.isNull(insuranceApply.getApplyEndTime()) || !CollectionUtils.isNotEmpty(insuranceApply.getApplyDetailList()) ) { throw new BusinessException(ResponseStatus.BAD_REQUEST); } LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); if(!loginUserInfo.getType().equals(Constants.ONE)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"用户类型错误:非企业用户无法进行该操作"); } Solutions solutions = solutionsMapper.selectById(insuranceApply.getSolutionId()); if(Objects.isNull(solutions)){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"未查询到方案信息"); } List applyDetailList = insuranceApply.getApplyDetailList(); //判断是否存在重复信息 List memberIdList = applyDetailList.stream().map(i->i.getMemberId()).collect(Collectors.toList()); Set set = new HashSet<>(memberIdList); if(memberIdList.size() != set.size()){ throw new BusinessException(ResponseStatus.DATA_ERRO.getCode(),"员工信息存在重复信息"); } Constants.InsuranceApplyStatus insuranceApplyStatus = Constants.InsuranceApplyStatus.UPLOAD; insuranceApply.setCreateDate(new Date()); insuranceApply.setCreator(loginUserInfo.getId()); insuranceApply.setIsdeleted(Constants.ZERO); insuranceApply.setCompanyId(loginUserInfo.getCompanyId()); insuranceApply.setCheckInfo(insuranceApplyStatus.getName()); insuranceApply.setCheckDate(new Date()); insuranceApply.setCheckUserId(loginUserInfo.getId()); insuranceApply.setStatus(insuranceApplyStatus.getKey()); insuranceApplyMapper.insert(insuranceApply); //查询保险方案下的所有派遣单位 List duSolutionList = duSolutionMapper.selectList(new QueryWrapper().lambda() .eq(DuSolution::getIsdeleted,Constants.ZERO) .eq(DuSolution::getStatus,Constants.ONE) .eq(DuSolution::getSolutionId,insuranceApply.getSolutionId())); if(!CollectionUtils.isNotEmpty(duSolutionList)){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"数据异常:保险方案下未查询到派遣单位"); } //查询所有派遣单位下的工种 List duSolutionIdList = duSolutionList.stream().map(i->i.getId()).collect(Collectors.toList()); List duWorktypeList = duWorktypeMapper.selectList(new QueryWrapper().lambda() .eq(DuWorktype::getIsdeleted,Constants.ZERO) .eq(DuWorktype::getStatus,Constants.ONE) .in(DuWorktype::getDuSolutionId,duSolutionIdList)); if(!CollectionUtils.isNotEmpty(duWorktypeList)){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"数据异常:保险方案下未查询到工种信息"); } for (int i = 0; i < applyDetailList.size(); i++) { ApplyDetail applyDetail = applyDetailList.get(i); if(Objects.isNull(applyDetail) ||Objects.isNull(applyDetail.getMemberId()) ||Objects.isNull(applyDetail.getDuId()) ||Objects.isNull(applyDetail.getWorktypeId()) ){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"投保员工信息数据缺失"); } applyDetail.setCreateDate(new Date()); applyDetail.setCreator(loginUserInfo.getId()); applyDetail.setIsdeleted(Constants.ZERO); applyDetail.setSortnum(i); applyDetail.setApplyId(insuranceApply.getId()); if(Objects.isNull(applyDetail.getMemberId())){ throw new BusinessException(ResponseStatus.DATA_ERRO.getCode(),"【"+applyDetail.getMemberName()+"】员工信息存在异常数据!"); } Member member = memberMapper.selectById(applyDetail.getMemberId()); if(Objects.isNull(member)){ throw new BusinessException(ResponseStatus.DATA_ERRO.getCode(),"【"+applyDetail.getMemberName()+"】员工信息存在异常数据!"); } applyDetail.setIdcardNo(member.getIdcardNo()); applyDetail.setSex(member.getSex()); applyDetail.setFee(Constants.countDetailFee(solutions,insuranceApply.getApplyEndTime(),insuranceApply.getApplyStartTime())); //验证派遣单位信息是否存在 if(duSolutionList.stream().filter(d->d.getDispatchUnitId().equals(applyDetail.getDuId())).collect(Collectors.toList()).size()<=Constants.ZERO){ throw new BusinessException(ResponseStatus.DATA_ERRO.getCode(),"【"+applyDetail.getMemberName()+"】员工派遣单位未查询到!"); } if(duWorktypeList.stream().filter(d->d.getDuSolutionId().equals(applyDetail.getDuId())&&d.getWorkTypeId().equals(applyDetail.getWorktypeId())) .collect(Collectors.toList()).size()<=Constants.ZERO){ throw new BusinessException(ResponseStatus.DATA_ERRO.getCode(),"【"+applyDetail.getMemberName()+"】员工工种信息未查询到!"); } applyDetailMapper.insert(applyDetail); } //存储日志数据 this.saveApplyLog(insuranceApply,insuranceApplyStatus,null); return insuranceApply.getId(); } public void saveApplyLog(InsuranceApply insuranceApply,Constants.InsuranceApplyStatus insuranceApplyStatus,String content){ LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); ApplyLog applyLog = new ApplyLog(); applyLog.setCreateDate(new Date()); applyLog.setCreator(loginUserInfo.getId()); applyLog.setIsdeleted(Constants.ZERO); applyLog.setApplyId(insuranceApply.getId()); applyLog.setTitle(insuranceApplyStatus.getName()); applyLog.setContent(content); applyLog.setObjType(insuranceApplyStatus.getKey()); applyLog.setObjId(Integer.toString(insuranceApply.getId())); applyLog.setStatus(insuranceApply.getStatus()); applyLogMapper.insert(applyLog); } // public BigDecimal countDetailFee(Solutions solutions ,Date startDate,Date endDate){ // //查询保险实际周期 // Integer cycle = DateUtil.calculateBetween(endDate,startDate,solutions.getDataType()); // if(cycle==-1){ // throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"日期信息错误!"); // } // return solutions.getPrice().multiply(new BigDecimal(cycle)); // } // public static void main(String[] args) { // Date date1 = DateUtil.StringToDate("2023-03-01 00:00:00"); // Date date2 = DateUtil.StringToDate("2023-04-01 00:00:00"); // System.out.println(DateUtil.calculateBetween(date1,date2,0)); // System.out.println(DateUtil.calculateBetween(date1,date2,1)); // System.out.println(DateUtil.calculateBetween(date1,date2,2)); // System.out.println(DateUtil.calculateBetween(date1,date2,3)); // // } @Override public void deleteById(Integer id) { insuranceApplyMapper.deleteById(id); } @Override public void delete(InsuranceApply insuranceApply) { UpdateWrapper deleteWrapper = new UpdateWrapper<>(insuranceApply); insuranceApplyMapper.delete(deleteWrapper); } @Override public void deleteByIdInBatch(List ids) { if (CollectionUtils.isEmpty(ids)) { return; } insuranceApplyMapper.deleteBatchIds(ids); } @Override public void updateById(InsuranceApply insuranceApply) { insuranceApplyMapper.updateById(insuranceApply); } @Override public void updateByIdInBatch(List insuranceApplys) { if (CollectionUtils.isEmpty(insuranceApplys)) { return; } for (InsuranceApply insuranceApply: insuranceApplys) { this.updateById(insuranceApply); } } @Override public InsuranceApply findById(Integer id) { return insuranceApplyMapper.selectById(id); } @Override public InsuranceApply findOne(InsuranceApply insuranceApply) { QueryWrapper wrapper = new QueryWrapper<>(insuranceApply); return insuranceApplyMapper.selectOne(wrapper); } @Override public List findList(InsuranceApply insuranceApply) { QueryWrapper wrapper = new QueryWrapper<>(insuranceApply); return insuranceApplyMapper.selectList(wrapper); } @Override public PageData findPage(PageWrap pageWrap) { LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); IPage page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); Utils.MP.blankToNull(pageWrap.getModel()); queryWrapper.selectAll(InsuranceApply.class); queryWrapper.selectAs(Company::getName,InsuranceApply::getCompanyName); queryWrapper.selectAs(Solutions::getName,InsuranceApply::getSolutionsName); queryWrapper.eq(InsuranceApply::getIsdeleted,Constants.ZERO); //企业人员查看本企业数据 if(loginUserInfo.getType().equals(Constants.ONE)){ queryWrapper.eq(InsuranceApply::getCompanyId, loginUserInfo.getCompanyId()); } if (pageWrap.getModel().getSolutionId() != null) { queryWrapper.eq(InsuranceApply::getSolutionId, pageWrap.getModel().getSolutionId()); } if (pageWrap.getModel().getEndTimeS() != null) { queryWrapper.ge(InsuranceApply::getEndTime, Utils.Date.getStart(pageWrap.getModel().getEndTimeS())); } if (pageWrap.getModel().getEndTimeE() != null) { queryWrapper.le(InsuranceApply::getEndTime, Utils.Date.getEnd(pageWrap.getModel().getEndTimeE())); } if (pageWrap.getModel().getStartTimeS() != null) { queryWrapper.ge(InsuranceApply::getStartTime, Utils.Date.getStart(pageWrap.getModel().getStartTimeS())); } if (pageWrap.getModel().getStartTimeE() != null) { queryWrapper.le(InsuranceApply::getStartTime, Utils.Date.getEnd(pageWrap.getModel().getStartTimeE())); } if (pageWrap.getModel().getCreateTimeS() != null) { queryWrapper.ge(InsuranceApply::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateTimeS())); } if (pageWrap.getModel().getCreateTimeE() != null) { queryWrapper.le(InsuranceApply::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateTimeE())); } if (pageWrap.getModel().getCode() != null) { queryWrapper.eq(InsuranceApply::getCode, pageWrap.getModel().getCode()); } if (pageWrap.getModel().getStatus() != null) { queryWrapper.eq(InsuranceApply::getStatus, pageWrap.getModel().getStatus()); } for(PageWrap.SortData sortData: pageWrap.getSorts()) { if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) { queryWrapper.orderByDesc(sortData.getProperty()); } else { queryWrapper.orderByAsc(sortData.getProperty()); } } PageData pageData = PageData.from(insuranceApplyJoinMapper.selectJoinPage(page,InsuranceApply.class, queryWrapper)); return pageData; } @Override public long count(InsuranceApply insuranceApply) { QueryWrapper wrapper = new QueryWrapper<>(insuranceApply); return insuranceApplyMapper.selectCount(wrapper); } @Override public InsuranceApply findDetail(Integer id) { InsuranceApply insuranceApply = insuranceApplyMapper.selectById(id); if(Objects.isNull(insuranceApply)){ throw new BusinessException(ResponseStatus.DATA_EMPTY); } insuranceApply.setInsureNum(applyDetailMapper.selectCount(new QueryWrapper().lambda().eq(ApplyDetail::getApplyId,insuranceApply.getId()) .eq(ApplyDetail::getIsdeleted,Constants.ZERO))); //设置在保时长(天数) if(insuranceApply.getStatus().equals(Constants.InsuranceApplyStatus.UPLOAD_INSURANCE.getKey())){ //如果当前时间大于结束日期 则使用结束日期对比开始日期 if(DateUtil.compareDate(new Date(),insuranceApply.getEndTime())>=Constants.ZERO){ insuranceApply.setServiceDays(DateUtil.daysBetweenDates(insuranceApply.getEndTime(),insuranceApply.getStartTime())); }else if(DateUtil.compareDate(insuranceApply.getStartTime(),new Date())>=Constants.ZERO){ //未开始 insuranceApply.setServiceDays(Constants.ZERO); }else{ insuranceApply.setServiceDays(DateUtil.daysBetweenDates(new Date(),insuranceApply.getStartTime())); } } //查询操作记录 List applyLogList = applyLogJoinMapper.selectJoinList(ApplyLog.class, new MPJLambdaWrapper() .selectAll(ApplyLog.class) .selectAs(Member::getName,ApplyLog::getCreatorName) .selectAs(Company::getName,ApplyLog::getCompanyName) .leftJoin(Member.class,Member::getId,ApplyLog::getCreator) .leftJoin(Company.class,Company::getId,Member::getCompanyId) .eq(ApplyLog::getApplyId,insuranceApply.getId()) .orderByAsc(ApplyLog::getCreateDate) ); insuranceApply.setApplyLogList(applyLogList); return insuranceApply; } @Override @Transactional(rollbackFor = {Exception.class,BusinessException.class}) public void applyOpt(InsuranceApplyOptDTO insuranceApplyOptDTO){ if(Objects.isNull(insuranceApplyOptDTO) ||Objects.isNull(insuranceApplyOptDTO.getApplyId()) ||StringUtils.isBlank(insuranceApplyOptDTO.getOptIllustration())){ throw new BusinessException(ResponseStatus.BAD_REQUEST); } LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); if(loginUserInfo.getType().equals(Constants.ZERO)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"非企业端用户无法进行该操作"); } InsuranceApply insuranceApply = insuranceApplyMapper.selectById(insuranceApplyOptDTO.getApplyId()); if(Objects.isNull(insuranceApply)){ throw new BusinessException(ResponseStatus.DATA_EMPTY); } if(insuranceApply.getIsdeleted().equals(Constants.ONE)){ throw new BusinessException(ResponseStatus.DATA_ERRO.getCode(),"数据已删除,无法进行该操作"); } Constants.InsuranceApplyStatus insuranceApplyStatus = Constants.InsuranceApplyStatus.COMPANY_APPLY_RETURN; if(insuranceApplyOptDTO.getOptType().equals(Constants.ONE)){ if(insuranceApply.getStatus().equals(Constants.InsuranceApplyStatus.COMPANY_APPLY_RETURN.getKey())){ throw new BusinessException(ResponseStatus.DATA_ERRO.getCode(),"退回申请中,请勿重复操作"); } if(!(insuranceApply.getStatus().equals(Constants.InsuranceApplyStatus.UPLOAD.getKey()) ||insuranceApply.getStatus().equals(Constants.InsuranceApplyStatus.WAIT_SIGNATURE.getKey()) ||insuranceApply.getStatus().equals(Constants.InsuranceApplyStatus.SIGNATURE.getKey()))){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"数据状态非可申请退回!"); } }else if(insuranceApplyOptDTO.getOptType().equals(Constants.TWO)){ insuranceApplyStatus = Constants.InsuranceApplyStatus.CLOSE; if(insuranceApply.getStatus().equals(Constants.InsuranceApplyStatus.CLOSE.getKey())){ throw new BusinessException(ResponseStatus.DATA_ERRO.getCode(),"已关闭,请勿重复操作"); } if(!(insuranceApply.getStatus().equals(Constants.InsuranceApplyStatus.PLATFORM_AGREE.getKey()) ||insuranceApply.getStatus().equals(Constants.InsuranceApplyStatus.PLATFORM_RETURN.getKey()))){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"数据状态非可申请退回!"); } } insuranceApply.setStatus(insuranceApplyStatus.getKey()); insuranceApply.setCheckDate(new Date()); insuranceApply.setCheckInfo(insuranceApplyOptDTO.getOptIllustration()); insuranceApply.setCheckUserId(loginUserInfo.getId()); insuranceApplyMapper.updateById(insuranceApply); //存储日志数据 this.saveApplyLog(insuranceApply,insuranceApplyStatus,null); } }