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.Utils; import com.doumee.dao.business.*; import com.doumee.dao.business.join.SolutionWorktypeJoinMapper; import com.doumee.dao.business.join.SolutionsJoinMapper; import com.doumee.dao.business.model.*; import com.doumee.service.business.CompanyService; import com.doumee.service.business.SolutionsService; 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.yulichang.wrapper.MPJLambdaWrapper; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import java.math.BigDecimal; import java.util.Date; import java.util.List; import java.util.Objects; import java.util.UUID; /** * 保险方案信息表Service实现 * @author 江蹄蹄 * @date 2024/01/16 10:03 */ @Service public class SolutionsServiceImpl implements SolutionsService { @Autowired private SolutionsMapper solutionsMapper; @Autowired private SolutionsJoinMapper solutionsJoinMapper; @Autowired private WorktypeMapper worktypeMapper; @Autowired private SolutionWorktypeJoinMapper solutionWorktypeJoinMapper; @Autowired private InsuranceMapper insuranceMapper; @Autowired private CompanySolutionMapper companySolutionMapper; @Autowired private DuSolutionMapper duSolutionMapper; @Override @Transactional(rollbackFor = {BusinessException.class,Exception.class}) public Integer create(Solutions solutions) { LoginUserInfo user= (LoginUserInfo)SecurityUtils.getSubject().getPrincipal(); initCreateParam(solutions);//工种数据有效性检验,去除空白行数据 if(solutionsMapper.selectCount(new QueryWrapper().lambda() .eq(Solutions::getName,solutions.getName()) .eq(Solutions::getIsdeleted,Constants.ZERO) .eq(Solutions::getDataType,Constants.ZERO) )>Constants.ZERO){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"保险方案名称已存在"); } solutions.setIsdeleted(Constants.ZERO); solutions.setCreator(user.getId()); solutions.setCreateDate(new Date()); solutions.setVersion(UUID.randomUUID().toString());//版本号 solutions.setDataType(Constants.ZERO); solutions.setStatus(Constants.ZERO); solutionsMapper.insert(solutions);//基础版本 //如果有工种,则产生一个新的有效历史版本 ~ Solutions newModel = new Solutions(); BeanUtils.copyProperties(solutions,newModel); newModel.setId(null); newModel.setBaseId(solutions.getId()); newModel.setDataType(Constants.TWO); solutionsMapper.insert(newModel); dealWorkType(solutions,newModel,solutions.getWorktypeIdList(),true); return solutions.getId(); } private void dealWorkType(Solutions solutions, Solutions newModel, List worktypeIdList, boolean b) { Insurance model = insuranceMapper.selectById(solutions.getInsuranceId()); if(model == null || !Constants.equalsInteger(model.getIsdeleted(),Constants.ZERO) || !Constants.equalsInteger(model.getDataType(),Constants.TWO)){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,该保险公司信息不存在,请尝试刷新页面重试~" ); } if( !Constants.equalsInteger(model.getStatus(),Constants.ZERO)){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,该保险公司已被禁用,请尝试刷新页面重试~" ); } List worktypeList = worktypeMapper.selectList(new QueryWrapper().lambda() .eq(Worktype::getInsuranceId,solutions.getInsuranceId()) .eq(Worktype::getIsdeleted,Constants.ZERO) .in(Worktype::getId,worktypeIdList)); if(worktypeList==null ||worktypeIdList.size()==0){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,工种信息选择有误,请尝试刷新页面重试~" ); } int num =0; for(Worktype type : worktypeList) { //基础版本 SolutionWorktype w = new SolutionWorktype(); w.setSolutionId(solutions.getId()); w.setIsdeleted(Constants.ZERO); w.setCreator(newModel.getCreator()); w.setCreateDate(solutions.getCreateDate()); w.setWorktypeId(type.getId()); w.setStatus(Constants.ZERO); w.setSortnum(num++); solutionWorktypeJoinMapper.insert(w); //历史版本的工种信息 SolutionWorktype newType = new SolutionWorktype(); BeanUtils.copyProperties(w, newType); newType.setSolutionId(newModel.getId()); solutionWorktypeJoinMapper.insert(newType); } } private void initCreateParam(Solutions solutions) { if(StringUtils.isBlank(solutions.getName()) ||solutions.getInsuranceId()==null ||solutions.getWorktypeIdList()==null ||solutions.getWorktypeIdList().size()==0 ||Constants.formatIntegerNum(solutions.getMaxAge()) < 0 ||Constants.formatIntegerNum(solutions.getMinAge()) < 0 // ||Constants.formatIntegerNum(solutions.getPriceCycleUnit()) < 0 ||Constants.formatIntegerNum(solutions.getInsureCycle()) < 0 ||Constants.formatIntegerNum(solutions.getInsureCycleUnit()) < 0 || solutions.getMinAge() >solutions.getMaxAge() || Constants.formatBigdecimal(solutions.getPrice()).compareTo(new BigDecimal(0)) !=1 ){ throw new BusinessException(ResponseStatus.BAD_REQUEST); } } @Override public void deleteById(Integer id) { solutionsMapper.deleteById(id); } @Override public void delete(Solutions solutions) { UpdateWrapper deleteWrapper = new UpdateWrapper<>(solutions); solutionsMapper.delete(deleteWrapper); } @Override public void deleteByIdInBatch(List ids) { if (CollectionUtils.isEmpty(ids)) { return; } solutionsMapper.deleteBatchIds(ids); } @Override @Transactional(rollbackFor = {BusinessException.class,Exception.class}) public void updateById(Solutions solutions) { LoginUserInfo user= (LoginUserInfo)SecurityUtils.getSubject().getPrincipal(); Solutions model = findById(solutions.getId()); if(model == null || !Constants.equalsInteger(model.getIsdeleted(),Constants.ZERO) || !Constants.equalsInteger(model.getDataType(),Constants.ZERO)){ throw new BusinessException(ResponseStatus.DATA_EMPTY ); } //数据有效性校验 initCreateParam(solutions); if(solutionsMapper.selectCount(new QueryWrapper().lambda() .eq(Solutions::getName,solutions.getName()) .eq(Solutions::getIsdeleted,Constants.ZERO) .eq(Solutions::getDataType,Constants.ZERO) .ne(Solutions::getId,solutions.getId()) )>Constants.ZERO){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"保险方案名称已存在"); } solutions.setEditor(user.getId()); solutions.setVersion(UUID.randomUUID().toString()); solutions.setEditDate(new Date()); solutionsMapper.updateById(solutions); Solutions oldVersion = solutionsMapper.selectOne(new QueryWrapper() .lambda() .eq(Solutions::getBaseId,solutions.getId()) .eq(Solutions::getDataType,Constants.TWO) .last("limit 1") ); if(Objects.isNull(oldVersion)){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到历史版本数据"); } //如果修改,则产生一个新的历史版本 ~ Solutions newModel = new Solutions(); BeanUtils.copyProperties( findById(solutions.getId()),newModel); newModel.setId(null); newModel.setVersion(solutions.getVersion()); newModel.setCreateDate(new Date()); newModel.setBaseId(solutions.getId()); newModel.setDataType(Constants.TWO); solutionsMapper.insert(newModel); //删除所有工种数据 solutionWorktypeJoinMapper.delete(new UpdateWrapper() .lambda() .eq(SolutionWorktype::getSolutionId,solutions.getId()) ); solutionsMapper.update(null,new UpdateWrapper() .lambda() .ne(Solutions::getId,newModel.getId()) .eq(Solutions::getBaseId,solutions.getId()) .eq(Solutions::getDataType,Constants.TWO) .set(Solutions::getDataType,Constants.ONE) .set(StringUtils.isNotBlank(solutions.getSignKeyword()),Solutions::getSignKeyword,solutions.getSignKeyword()) ); //处理工种信息,新增最新的,同时产生历史版本 dealWorkType(solutions,newModel,solutions.getWorktypeIdList(),false); //更新company_solution 使用新版本的数据 companySolutionMapper.update(null, new UpdateWrapper() .lambda() .eq(CompanySolution::getStatus,Constants.ZERO) .set(CompanySolution::getSolutionId,newModel.getId()) .eq(CompanySolution::getSolutionBaseId,solutions.getId()) ); //更新 du_solution 使用新版本的数据 duSolutionMapper.update(null, new UpdateWrapper() .lambda() .eq(DuSolution::getIsdeleted, Constants.ZERO) .eq(DuSolution::getStatus, Constants.ONE) .set(DuSolution::getSolutionId,newModel.getId()) .eq(DuSolution::getSolutionId,oldVersion.getId())); } @Override public void updateByIdInBatch(List solutionss) { if (CollectionUtils.isEmpty(solutionss)) { return; } for (Solutions solutions: solutionss) { this.updateById(solutions); } } @Override public void updateStatus(Solutions solutions){ if(solutions.getId() == null || solutions.getStatus()==null || solutions.getStatus()<0||solutions.getStatus()>1){ throw new BusinessException(ResponseStatus.BAD_REQUEST ); } Solutions model = findById(solutions.getId()); if(model == null || !Constants.equalsInteger(model.getIsdeleted(),Constants.ZERO) || !Constants.equalsInteger(model.getDataType(),Constants.ZERO)){ throw new BusinessException(ResponseStatus.DATA_EMPTY ); } if(Constants.equalsInteger(model.getStatus(),solutions.getStatus())){ //如果状态不发生改变,直接返回 return; } LoginUserInfo user= (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); //同时更新基表和历史版本所有数据状态 solutionsMapper.update(null,new UpdateWrapper() .lambda() .and(m -> m.eq(Solutions::getId,model.getId()).or().eq(Solutions::getBaseId,model.getId())) .eq(Solutions::getIsdeleted,Constants.ZERO) .set(Solutions::getEditDate,new Date()) .set(Solutions::getEditor,user.getId()) .set(Solutions::getStatus,solutions.getStatus()) ); } @Override public Solutions findById(Integer id) { MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); queryWrapper.selectAll(Solutions.class); queryWrapper.selectAs(Insurance::getName,Solutions::getInsuranceName); queryWrapper.leftJoin(Insurance.class,Insurance::getId,Solutions::getInsuranceId); queryWrapper.eq(Solutions::getId,id); Solutions model = solutionsJoinMapper.selectJoinOne(Solutions.class,queryWrapper); if(model == null || !Constants.equalsInteger(model.getIsdeleted(),Constants.ZERO)){ throw new BusinessException(ResponseStatus.DATA_EMPTY ); } MPJLambdaWrapper wrapper = new MPJLambdaWrapper<>(); wrapper.selectAll(SolutionWorktype.class); wrapper.selectAs(Worktype::getName,SolutionWorktype::getWorktypeName); wrapper.leftJoin(Worktype.class,Worktype::getId,SolutionWorktype::getWorktypeId); wrapper.eq(SolutionWorktype::getSolutionId,id); wrapper.eq(SolutionWorktype::getIsdeleted,Constants.ZERO); wrapper.orderByAsc(SolutionWorktype::getSortnum); List worktypeList = solutionWorktypeJoinMapper.selectJoinList(SolutionWorktype.class,wrapper); model.setWorktypeList(worktypeList); return model; } @Override public Solutions findOne(Solutions solutions) { QueryWrapper wrapper = new QueryWrapper<>(solutions); return solutionsMapper.selectOne(wrapper); } @Override public List findList(Solutions solutions) { solutions.setIsdeleted(Constants.ZERO); solutions.setStatus(Constants.ZERO); if(solutions.getDataType() == null){ solutions.setDataType(Constants.TWO); } QueryWrapper wrapper = new QueryWrapper<>(solutions); return solutionsMapper.selectList(wrapper); } @Override public PageData findPage(PageWrap pageWrap) { IPage page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); Utils.MP.blankToNull(pageWrap.getModel()); pageWrap.getModel().setDataType(Constants.ZERO);//只选择基表数据 pageWrap.getModel().setIsdeleted(Constants.ZERO); MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); Utils.MP.blankToNull(pageWrap.getModel()); queryWrapper.selectAll(Solutions.class); queryWrapper.selectAs(Insurance::getName,Solutions::getInsuranceName); queryWrapper.leftJoin(Insurance.class,Insurance::getId,Solutions::getInsuranceId); LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); if(user.getType().equals(Constants.ONE)){ queryWrapper.exists(("select 1 from company_solution b where b.isdeleted=0 and b.company_id="+user.getCompanyId()+" and b.SOLUTION_BASE_ID = t.id")); } if (pageWrap.getModel().getId() != null) { queryWrapper.eq(Solutions::getId, pageWrap.getModel().getId()); } if (pageWrap.getModel().getCreator() != null) { queryWrapper.eq(Solutions::getCreator, pageWrap.getModel().getCreator()); } if (pageWrap.getModel().getCreateDate() != null) { queryWrapper.ge(Solutions::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate())); queryWrapper.le(Solutions::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate())); } if (pageWrap.getModel().getEditor() != null) { queryWrapper.eq(Solutions::getEditor, pageWrap.getModel().getEditor()); } if (pageWrap.getModel().getEditDate() != null) { queryWrapper.ge(Solutions::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate())); queryWrapper.le(Solutions::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate())); } if (pageWrap.getModel().getIsdeleted() != null) { queryWrapper.eq(Solutions::getIsdeleted, pageWrap.getModel().getIsdeleted()); } if (pageWrap.getModel().getName() != null) { queryWrapper.like(Solutions::getName, pageWrap.getModel().getName()); } if (pageWrap.getModel().getRemark() != null) { queryWrapper.eq(Solutions::getRemark, pageWrap.getModel().getRemark()); } if (pageWrap.getModel().getStatus() != null) { queryWrapper.eq(Solutions::getStatus, pageWrap.getModel().getStatus()); } if (pageWrap.getModel().getSortnum() != null) { queryWrapper.eq(Solutions::getSortnum, pageWrap.getModel().getSortnum()); } if (pageWrap.getModel().getInsuranceId() != null) { queryWrapper.eq(Solutions::getInsuranceId, pageWrap.getModel().getInsuranceId()); } if (pageWrap.getModel().getValidType() != null) { queryWrapper.eq(Solutions::getValidType, pageWrap.getModel().getValidType()); } if (pageWrap.getModel().getType() != null) { queryWrapper.eq(Solutions::getType, pageWrap.getModel().getType()); } if (pageWrap.getModel().getMinAge() != null) { queryWrapper.eq(Solutions::getMinAge, pageWrap.getModel().getMinAge()); } if (pageWrap.getModel().getMaxAge() != null) { queryWrapper.eq(Solutions::getMaxAge, pageWrap.getModel().getMaxAge()); } if (pageWrap.getModel().getPrice() != null) { queryWrapper.eq(Solutions::getPrice, pageWrap.getModel().getPrice()); } if (pageWrap.getModel().getTimeUnit() != null) { queryWrapper.eq(Solutions::getTimeUnit, pageWrap.getModel().getTimeUnit()); } if (pageWrap.getModel().getInsureCycle() != null) { queryWrapper.eq(Solutions::getInsureCycle, pageWrap.getModel().getInsureCycle()); } if (pageWrap.getModel().getInsureCycleUnit() != null) { queryWrapper.eq(Solutions::getInsureCycleUnit, pageWrap.getModel().getInsureCycleUnit()); } if (pageWrap.getModel().getPriceCycleUnit() != null) { queryWrapper.eq(Solutions::getPriceCycleUnit, pageWrap.getModel().getPriceCycleUnit()); } if (pageWrap.getModel().getSingleWorktype() != null) { queryWrapper.eq(Solutions::getSingleWorktype, pageWrap.getModel().getSingleWorktype()); } if (pageWrap.getModel().getEmail() != null) { queryWrapper.eq(Solutions::getEmail, pageWrap.getModel().getEmail()); } if (pageWrap.getModel().getSpecialAgreement() != null) { queryWrapper.eq(Solutions::getSpecialAgreement, pageWrap.getModel().getSpecialAgreement()); } if (pageWrap.getModel().getSpecialInfo() != null) { queryWrapper.eq(Solutions::getSpecialInfo, pageWrap.getModel().getSpecialInfo()); } if (pageWrap.getModel().getOrtherInfo() != null) { queryWrapper.eq(Solutions::getOrtherInfo, pageWrap.getModel().getOrtherInfo()); } if (pageWrap.getModel().getVersion() != null) { queryWrapper.eq(Solutions::getVersion, pageWrap.getModel().getVersion()); } if (pageWrap.getModel().getDataType() != null) { queryWrapper.eq(Solutions::getDataType, pageWrap.getModel().getDataType()); } if (pageWrap.getModel().getBaseId() != null) { queryWrapper.eq(Solutions::getBaseId, pageWrap.getModel().getBaseId()); } 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(solutionsJoinMapper.selectJoinPage(page,Solutions.class, queryWrapper)); return pageData; } @Override public PageData findPageCom(PageWrap pageWrap) { IPage page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); QueryWrapper queryWrapper = new QueryWrapper<>(); Utils.MP.blankToNull(pageWrap.getModel()); pageWrap.getModel().setDataType(Constants.ZERO);//只选择基表数据 pageWrap.getModel().setStatus(Constants.ZERO); pageWrap.getModel().setIsdeleted(Constants.ZERO); LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); queryWrapper.exists(("select b.id from company_solution b where b.isdeleted=0 and b.company_id="+user.getCompanyId()+" and b.SOLUTION_BASE_ID = solutions.id")); if (pageWrap.getModel().getName() != null) { queryWrapper.lambda().like(Solutions::getName, pageWrap.getModel().getName()); } if (pageWrap.getModel().getStatus() != null) { queryWrapper.lambda().eq(Solutions::getStatus, pageWrap.getModel().getStatus()); } if (pageWrap.getModel().getSortnum() != null) { queryWrapper.lambda().eq(Solutions::getSortnum, pageWrap.getModel().getSortnum()); } if (pageWrap.getModel().getInsuranceId() != null) { queryWrapper.lambda().eq(Solutions::getInsuranceId, pageWrap.getModel().getInsuranceId()); } if (pageWrap.getModel().getBaseId() != null) { queryWrapper.lambda().eq(Solutions::getBaseId, pageWrap.getModel().getBaseId()); } queryWrapper.lambda().orderByAsc(Solutions::getInsuranceId); return PageData.from(solutionsMapper.selectPage(page, queryWrapper)); } @Override public List findListForCompany(Integer dataType) { LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); List solutionsList = solutionsJoinMapper.selectJoinList(Solutions.class,new MPJLambdaWrapper() .selectAll(Solutions.class) .leftJoin(CompanySolution.class,CompanySolution::getSolutionId,Solutions::getId) .leftJoin(Company.class,Company::getId,CompanySolution::getCompanyId) .leftJoin(Insurance.class,Insurance::getId,Solutions::getInsuranceId) .eq(Solutions::getIsdeleted,Constants.ZERO) .eq(Solutions::getStatus,Constants.ZERO) .eq(Solutions::getDataType,dataType) .eq(CompanySolution::getIsdeleted,Constants.ZERO) .eq(CompanySolution::getCompanyId,user.getCompanyId()) .eq(Company::getIsdeleted,Constants.ZERO) .eq(Company::getStatus,Constants.ZERO) .eq(Insurance::getIsdeleted,Constants.ZERO) .eq(Insurance::getStatus,Constants.ZERO) .orderByAsc(Solutions::getSortnum) ); return solutionsList; } /** * 根据历史版本查询当前最新启用版本 * @param solutionId * @return */ @Override public Solutions getNewVersion(Integer solutionId){ Solutions solutions = solutionsMapper.selectById(solutionId); if(Objects.isNull(solutions)){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到历史方案信息"); } if(solutions.getDataType().equals(Constants.TWO)){ return solutions; } Solutions newVersion = solutionsMapper.selectOne(new QueryWrapper().lambda() .eq(Solutions::getIsdeleted,Constants.ZERO) .eq(Solutions::getDataType,Constants.TWO) .eq(Solutions::getBaseId,solutions.getBaseId()) .last("limit 1") ); if(Objects.isNull(newVersion)){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到最新版本数据"); } return newVersion; } @Override public long count(Solutions solutions) { QueryWrapper wrapper = new QueryWrapper<>(solutions); return solutionsMapper.selectCount(wrapper); } }