package com.ycl.platform.service.impl;
|
|
import com.alibaba.excel.EasyExcel;
|
import com.alibaba.excel.write.merge.LoopMergeStrategy;
|
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
|
import com.alibaba.fastjson2.JSON;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
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.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.mapper.TContractMapper;
|
import com.ycl.platform.service.ICalculateRuleService;
|
import com.ycl.platform.service.ITContractService;
|
import com.ycl.system.AjaxResult;
|
import com.ycl.utils.DateUtils;
|
import com.ycl.utils.StringUtils;
|
import enumeration.general.RuleDeductCategoryEnum;
|
import jakarta.servlet.http.HttpServletResponse;
|
import lombok.AllArgsConstructor;
|
import org.apache.commons.lang3.ObjectUtils;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Propagation;
|
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.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;
|
private final YwUnitServiceImpl ywUnitService;
|
|
@Override
|
public void importTemplate(HttpServletResponse response) {
|
try {
|
List<CalculateRule> list = getExcelData();
|
ArrayList<String> arrayList = new ArrayList<>();
|
arrayList.add("扣指定分数");
|
arrayList.add("分数乘以数量");
|
arrayList.add("除以数量后乘以分数");
|
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");
|
// 第一列、第二列上下合并3行
|
LoopMergeStrategy loopMergeStrategy1 = new LoopMergeStrategy(3, 0);
|
LoopMergeStrategy loopMergeStrategy2 = new LoopMergeStrategy(3, 1);
|
EasyExcel.write(response.getOutputStream(), CalculateRule.class)
|
.registerWriteHandler(loopMergeStrategy1)
|
.registerWriteHandler(loopMergeStrategy2)
|
// 自适应列宽
|
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
|
// 下拉框
|
.registerWriteHandler(new CustomSheetWriteHandler(arrayList))
|
// 标注
|
.registerWriteHandler(new CommentWriteHandler())
|
.sheet("合同导入模板").doWrite(list);
|
} catch (Exception e) {
|
throw new RuntimeException(e);
|
}
|
}
|
|
private List<CalculateRule> getExcelData() {
|
ArrayList<CalculateRule> list = new ArrayList<>();
|
CalculateRule calculateRule1 = new CalculateRule();
|
calculateRule1.setId(1L);
|
calculateRule1.setRuleName("视频平均在线率");
|
calculateRule1.setRuleDesc("(1)视频在线率=视频在线数量÷前端服务配置数(应扣除不可抗力或与中标人服务无关造成的掉线除外。)");
|
calculateRule1.setRuleCondition("≥98%");
|
calculateRule1.setDeductCategory(RuleDeductCategoryEnum.DEDUCT_POINTS);
|
calculateRule1.setCalcFraction(0.00);
|
list.add(calculateRule1);
|
CalculateRule calculateRule2 = new CalculateRule();
|
calculateRule2.setRuleDesc("(2)视频平均在线率:当月每日视频在线率的平均值。");
|
calculateRule2.setRuleCondition("95%≤视频平均在线率<98%");
|
calculateRule2.setDeductCategory(RuleDeductCategoryEnum.DEDUCT_POINTS);
|
calculateRule2.setCalcFraction(5.00);
|
list.add(calculateRule2);
|
CalculateRule calculateRule3 = new CalculateRule();
|
calculateRule3.setRuleDesc("(3)视频在线率保留整数并且向下取整。");
|
calculateRule3.setRuleCondition("90%≤视频平均在线率<95%");
|
calculateRule3.setDeductCategory(RuleDeductCategoryEnum.DEDUCT_POINTS);
|
calculateRule3.setCalcFraction(10.00);
|
list.add(calculateRule3);
|
CalculateRule calculateRule4 = new CalculateRule();
|
calculateRule4.setId(2L);
|
calculateRule4.setRuleName("前端感知源治理工作");
|
calculateRule4.setRuleDesc("时钟同步(超过±3秒为不合格)");
|
calculateRule4.setRuleCondition("视频监控摄像机时钟不同步,24小时内未修复的");
|
calculateRule4.setDeductCategory(RuleDeductCategoryEnum.MULTIPLY_POINTS_BY_QUANTITY);
|
calculateRule4.setCalcFraction(0.1);
|
list.add(calculateRule4);
|
CalculateRule calculateRule7 = new CalculateRule();
|
calculateRule7.setRuleDesc("…………");
|
calculateRule7.setRuleCondition("…………");
|
list.add(calculateRule7);
|
CalculateRule calculateRule6 = new CalculateRule();
|
calculateRule6.setRuleDesc("…………");
|
calculateRule6.setRuleCondition("…………");
|
list.add(calculateRule6);
|
CalculateRule calculateRule5 = new CalculateRule();
|
calculateRule5.setId(3L);
|
calculateRule5.setRuleName("后台系统的保障");
|
calculateRule5.setRuleDesc("在个别设备故障但不影响该功能模块整体应用情况下,须在72小时以内排除故障。");
|
calculateRule5.setRuleCondition("单次故障时长若超出144小时以后,每超出12小时(不足12小时按12小时计)");
|
calculateRule5.setDeductCategory(RuleDeductCategoryEnum.MULTIPLY_POINTS_AFTER_DIVIDING_QUANTITY);
|
calculateRule5.setCalcFraction(2.00);
|
calculateRule5.setCalcUnit(12);
|
list.add(calculateRule5);
|
return list;
|
}
|
|
@Override
|
@Transactional
|
public AjaxResult importData(MultipartFile file, TContract tContract) {
|
// 保存合同
|
tContract.setCreateTime(DateUtils.getNowDate());
|
tContract.setDeleted("0");
|
save(tContract);
|
List<CalculateRule> list = calculateRuleService.readExcel(file);
|
|
// 遍历父子关系
|
List<CalculateRule> calculateRulesToSave = new ArrayList<>();
|
CalculateRule fu1 = new CalculateRule();
|
CalculateRule fu2 = new CalculateRule();
|
boolean fuNew = true;
|
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() + "扣分数值");
|
}
|
// 保存父规则获取父id
|
if (StringUtils.isNotBlank(calculateRule.getRuleName())) {
|
CalculateRule one = new CalculateRule();
|
one.setParentId(0L);
|
one.setContractId(tContract.getId().intValue());
|
one.setRuleName(calculateRule.getRuleName());
|
one.setCreateTime(DateUtils.getNowDate());
|
one.setDeleted(0);
|
calculateRuleService.save(one);
|
fu1 = one;
|
fuNew = true;
|
}
|
// 保存第二层父规则获取第二层父id
|
if (StringUtils.isNotBlank(calculateRule.getRuleDesc())) {
|
CalculateRule two = new CalculateRule();
|
two.setContractId(tContract.getId().intValue());
|
two.setParentId(fu1.getId());
|
two.setRuleDesc(calculateRule.getRuleDesc());
|
two.setCreateTime(DateUtils.getNowDate());
|
two.setDeleted(0);
|
calculateRuleService.save(two);
|
fu2 = two;
|
fuNew = false;
|
}
|
calculateRule.setContractId(tContract.getId().intValue());
|
calculateRule.setCreateTime(DateUtils.getNowDate());
|
calculateRule.setDeleted(0);
|
calculateRule.setParentId(fuNew ? fu1.getId() : fu2.getId());
|
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 List<TContract> selectAll() {
|
return list(new LambdaQueryWrapper<TContract>()
|
.orderByDesc(TContract::getCreateTime))
|
.stream().peek(
|
tContract -> tContract.setUnitName(ywUnitService.getById(tContract.getUnitId()).getUnitName())
|
).toList();
|
}
|
|
@Override
|
public List<CalculateMoneyRule> selectMoneyRules(Integer contractId) {
|
return calculateMoneyRuleService.selectMoneyRules(contractId);
|
}
|
}
|