package com.ycl.platform.service.impl; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.read.listener.PageReadListener; import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ycl.handler.CommentWriteHandler; import com.ycl.handler.CustomCellWriteHandler; import com.ycl.handler.CustomSheetWriteHandler; import com.ycl.platform.domain.entity.CalculateMoneyRule; import com.ycl.platform.domain.entity.CalculateRule; import com.ycl.platform.domain.entity.TContract; import com.ycl.platform.domain.query.ContractQuery; import com.ycl.platform.domain.vo.ContractVO; import com.ycl.platform.mapper.TContractMapper; import com.ycl.platform.service.ICalculateRuleService; import com.ycl.platform.service.ITContractService; import com.ycl.system.AjaxResult; import com.ycl.system.Result; import com.ycl.system.page.PageUtil; import com.ycl.utils.DateUtils; import com.ycl.utils.StringUtils; import enumeration.ContractStatus; import enumeration.general.RuleDeductCategoryEnum; import jakarta.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; import lombok.SneakyThrows; import org.apache.commons.lang3.ObjectUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.interceptor.TransactionAspectSupport; import org.springframework.web.multipart.MultipartFile; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.stream.Collectors; /** * 【请填写功能名称】Service业务层处理 * * @author ruoyi * @date 2024-03-12 */ @Service @AllArgsConstructor public class TContractServiceImpl extends ServiceImpl implements ITContractService { private final ICalculateRuleService calculateRuleService; private final CalculateMoneyRuleServiceImpl calculateMoneyRuleService; @Override public void importTemplate(HttpServletResponse response) { try { response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); String fileName = URLEncoder.encode("导入合同模板", StandardCharsets.UTF_8).replace("\\+", "%20"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); EasyExcel.write(response.getOutputStream(), CalculateRule.class) // 自适应列宽 .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 下拉框 .registerWriteHandler(new CustomSheetWriteHandler(Arrays.asList("扣指定分数", "分数乘以数量", "除以数量后乘以分数"))) .registerWriteHandler(new CustomCellWriteHandler()) // 标注 .registerWriteHandler(new CommentWriteHandler()) .sheet("合同导入模板") .doWrite(getExcelData()); } catch (Exception e) { throw new RuntimeException(e); } } private List getExcelData() { ArrayList list = new ArrayList<>(); CalculateRule calculateRule1 = new CalculateRule(); calculateRule1.setId(1); calculateRule1.setRuleName("视频平均在线率"); calculateRule1.setRuleCondition("≥98%"); calculateRule1.setMax(98D); calculateRule1.setDeductCategory(RuleDeductCategoryEnum.DEDUCT_POINTS); calculateRule1.setCalcFraction(0.00); list.add(calculateRule1); CalculateRule calculateRule2 = new CalculateRule(); calculateRule2.setRuleName("视频平均在线率"); calculateRule2.setRuleCondition("95%≤视频平均在线率<98%"); calculateRule2.setMax(97D); calculateRule2.setMin(95D); calculateRule2.setDeductCategory(RuleDeductCategoryEnum.DEDUCT_POINTS); calculateRule2.setCalcFraction(5.00); list.add(calculateRule2); CalculateRule calculateRule3 = new CalculateRule(); calculateRule3.setRuleName("视频平均在线率"); calculateRule3.setRuleCondition("90%≤视频平均在线率<95%"); calculateRule3.setMax(94D); calculateRule3.setMin(90D); calculateRule3.setDeductCategory(RuleDeductCategoryEnum.DEDUCT_POINTS); calculateRule3.setCalcFraction(10.00); list.add(calculateRule3); CalculateRule calculateRule33 = new CalculateRule(); calculateRule33.setRuleName("视频平均在线率"); calculateRule33.setRuleCondition("<90%"); calculateRule33.setMin(89D); calculateRule33.setDeductCategory(RuleDeductCategoryEnum.DEDUCT_POINTS); calculateRule33.setCalcFraction(10.00); list.add(calculateRule33); CalculateRule calculateRule4 = new CalculateRule(); calculateRule4.setId(2); calculateRule4.setRuleName("前端感知源治理工作"); calculateRule4.setRuleCondition("时钟同步(超过±3秒为不合格)"); calculateRule4.setDeductCategory(RuleDeductCategoryEnum.MULTIPLY_POINTS_BY_QUANTITY); calculateRule4.setCalcFraction(0.1); list.add(calculateRule4); CalculateRule calculateRule7 = new CalculateRule(); calculateRule7.setRuleName("前端感知源治理工作"); calculateRule7.setRuleCondition("OSD标识"); calculateRule7.setDeductCategory(RuleDeductCategoryEnum.MULTIPLY_POINTS_BY_QUANTITY); calculateRule7.setCalcFraction(0.1); list.add(calculateRule7); CalculateRule calculateRule6 = new CalculateRule(); calculateRule6.setRuleName("前端感知源治理工作"); calculateRule6.setRuleCondition("一机一档"); calculateRule6.setDeductCategory(RuleDeductCategoryEnum.MULTIPLY_POINTS_BY_QUANTITY); calculateRule6.setCalcFraction(0.1); list.add(calculateRule6); CalculateRule calculateRule5 = new CalculateRule(); calculateRule5.setId(3); calculateRule5.setRuleName("后台系统的保障"); calculateRule5.setRuleCondition("单次故障时长若超出72小时不足144小时的,每超出12小时(不足12小时按12小时计)"); calculateRule5.setMax(144D); calculateRule5.setMin(72D); calculateRule5.setDeductCategory(RuleDeductCategoryEnum.MULTIPLY_POINTS_AFTER_DIVIDING_QUANTITY); calculateRule5.setCalcFraction(2.00); calculateRule5.setCalcUnit(12); list.add(calculateRule5); return list; } @Override @Transactional @SneakyThrows public AjaxResult importData(MultipartFile file, TContract tContract) { // 保存合同 tContract.setCreateTime(DateUtils.getNowDate()); save(tContract); // 获取合同Excel规则 List list = new ArrayList<>(); EasyExcel.read(file.getInputStream(), CalculateRule.class, new PageReadListener(list::addAll)).sheet().doRead(); // 遍历父子关系 List calculateRulesToSave = new ArrayList<>(); for (CalculateRule calculateRule : list) { // 判断数据完整性 if (ObjectUtils.isEmpty(calculateRule.getDeductCategory())) { TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return AjaxResult.warn("请选择" + calculateRule.getRuleName() + calculateRule.getRuleCondition() + "扣分方式"); } if (RuleDeductCategoryEnum.MULTIPLY_POINTS_AFTER_DIVIDING_QUANTITY.equals(calculateRule.getDeductCategory()) && ObjectUtils.isEmpty(calculateRule.getCalcUnit())) { TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return AjaxResult.warn("请填写" + calculateRule.getRuleName() + calculateRule.getRuleCondition() + "除以数量"); } if(ObjectUtils.isEmpty(calculateRule.getCalcFraction())) { TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return AjaxResult.warn("请填写" + calculateRule.getRuleName() + calculateRule.getRuleCondition() + "扣分数值"); } // 保存规则 if (StringUtils.isNotBlank(calculateRule.getRuleName())) { calculateRule.setContractId(tContract.getId().intValue()); calculateRule.setCreateTime(DateUtils.getNowDate()); calculateRule.setUpdateTime(DateUtils.getNowDate()); calculateRulesToSave.add(calculateRule); } } // 批量保存规则 calculateRuleService.saveBatch(calculateRulesToSave); //批量保存考核结果应用规则 calculateMoneyRuleService.saveBatch(JSON.parseArray(tContract.getRuleList(), CalculateMoneyRule.class).stream().peek( calculateMoneyRule -> calculateMoneyRule.setContractId(tContract.getId().intValue()) ).collect(Collectors.toList())); return AjaxResult.success("操作成功"); } @Override public Result selectAll(ContractQuery query) { IPage page = PageUtil.getPage(query, ContractVO.class); baseMapper.getPage(page, query); page.getRecords().stream().forEach(contract -> { Date now = new Date(); if (now.before(contract.getStartTime())) { contract.setStatus(ContractStatus.NOT_START); } else if (now.after(contract.getEndTime())) { contract.setStatus(ContractStatus.FINISHED); } else { contract.setStatus(ContractStatus.ACTIVE); } }); return Result.ok().data(page.getRecords()).total(page.getTotal()); } @Override public List selectMoneyRules(Integer contractId) { return calculateMoneyRuleService.selectMoneyRules(contractId); } @Override public List selectUsingContract() { return new LambdaQueryChainWrapper<>(baseMapper) .le(TContract::getStartTime, DateUtils.getDate()) .ge(TContract::getEndTime, DateUtils.getDate()) .list(); } @Override public Result timeRange(Integer unitId) { List unitContractList = new LambdaQueryChainWrapper<>(baseMapper) .select(TContract::getId, TContract::getName, TContract::getStartTime, TContract::getEndTime) .eq(TContract::getUnitId, unitId) .ge(TContract::getEndTime, new Date()) .list(); return Result.ok().data(unitContractList); } }