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<Member> deleteWrapper = new UpdateWrapper<>(member);
|
memberMapper.delete(deleteWrapper);
|
}
|
|
@Override
|
public void deleteByIdInBatch(List<Integer> ids) {
|
if (CollectionUtils.isEmpty(ids)) {
|
return;
|
}
|
memberMapper.deleteBatchIds(ids);
|
}
|
|
@Override
|
public void updateById(Member member) {
|
memberMapper.updateById(member);
|
}
|
|
@Override
|
public void updateByIdInBatch(List<Member> 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<Member> 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<Member> wrapper = new QueryWrapper<>(member);
|
return memberMapper.selectOne(wrapper);
|
}
|
|
@Override
|
public List<Member> findList(Member member) {
|
QueryWrapper<Member> wrapper = new QueryWrapper<>(member);
|
return memberMapper.selectList(wrapper);
|
}
|
|
@Override
|
public PageData<Member> findPage(PageWrap<Member> pageWrap) {
|
IPage<Member> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
|
QueryWrapper<Member> 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<Member> findPageForCompany(PageWrap<MemberQueryDTO> pageWrap) {
|
IPage<Member> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
|
MPJLambdaWrapper<Member> 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<Member> 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<Member> pageData,LoginUserInfo loginUserInfo){
|
List<Integer> 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<ApplyDetail> applyDetailList = applyDetailJoinMapper.selectJoinList(ApplyDetail.class,
|
new MPJLambdaWrapper<ApplyDetail>()
|
.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()<System.currentTimeMillis()).collect(Collectors.toList()).size());
|
member.setValidNum(
|
applyDetailList.stream().filter(i->Constants.equalsInteger(i.getMemberId(),member.getId())&&i.getEndTime().getTime()>=System.currentTimeMillis()).collect(Collectors.toList()).size()
|
);
|
}
|
}
|
}
|
}
|
|
|
|
@Override
|
public long count(Member member) {
|
QueryWrapper<Member> wrapper = new QueryWrapper<>(member);
|
return memberMapper.selectCount(wrapper);
|
}
|
|
@Override
|
public List<Member> findListByDTO(MemberQueryDTO memberQueryDTO) {
|
|
MPJLambdaWrapper<Member> lambdaWrapper = new MPJLambdaWrapper<Member>();
|
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<Member>()
|
.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<Member> 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<MemberReduceImport> 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<MemberReduceImport> 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<String,String> 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<ApplyDetail>()
|
.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<String, String> 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<MemberImport> 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<MemberImport> 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<String,String> idCardMap = new HashMap<>();
|
for(MemberImport model : dataList){
|
//校验参数是否合法
|
validImportParam(model,idCardMap,dataList,index,solutions);
|
index += 1;
|
}
|
List<DispatchUnit> dispatchUnitList = new ArrayList<>();
|
List<SolutionWorktype> solutionWorktypeList = new ArrayList<>();
|
//2024年11月6日15:39:10 加入 根据方案是否有保险方案进行判断
|
if(Constants.equalsInteger(solutions.getHasDispatchUnit(),Constants.ZERO)){
|
dispatchUnitList = dispatchUnitJoinMapper.selectJoinList(DispatchUnit.class,
|
new MPJLambdaWrapper<DispatchUnit>()
|
.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<Worktype> worktypeList = worktypeMapper.selectList(new QueryWrapper<Worktype>().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<SolutionWorktype>()
|
.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<DispatchUnit> dispatchUnitList , Solutions solutions,List<SolutionWorktype> solutionWorktypeList) {
|
//2024年11月6日15:39:10 加入 根据方案是否有保险方案进行判断
|
if(Constants.equalsInteger(solutions.getHasDispatchUnit(),Constants.ZERO)){
|
if(CollectionUtils.isNotEmpty(dispatchUnitList)){
|
Optional<DispatchUnit> 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<Worktype> 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<SolutionWorktype> 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<String, String> idCardMap, List<MemberImport> 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());
|
|
}
|
|
|
}
|