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<TContractMapper, TContract> 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<CalculateRule> getExcelData() {
|
ArrayList<CalculateRule> 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<CalculateRule> list = new ArrayList<>();
|
EasyExcel.read(file.getInputStream(), CalculateRule.class, new PageReadListener<CalculateRule>(list::addAll)).sheet().doRead();
|
|
// 遍历父子关系
|
List<CalculateRule> 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<ContractVO> 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<CalculateMoneyRule> selectMoneyRules(Integer contractId) {
|
return calculateMoneyRuleService.selectMoneyRules(contractId);
|
}
|
|
@Override
|
public List<TContract> selectUsingContract() {
|
return new LambdaQueryChainWrapper<>(baseMapper)
|
.le(TContract::getStartTime, DateUtils.getDate())
|
.ge(TContract::getEndTime, DateUtils.getDate())
|
.list();
|
}
|
}
|