package com.yuanchu.mom.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.data.Pictures;
import com.yuanchu.mom.dto.InconsistentDistributionDto;
import com.yuanchu.mom.dto.InconsistentDistributionProportionDto;
import com.yuanchu.mom.pojo.InconsistentDistribution;
import com.yuanchu.mom.mapper.InconsistentDistributionMapper;
import com.yuanchu.mom.pojo.InconsistentDistributionDetail;
import com.yuanchu.mom.pojo.User;
import com.yuanchu.mom.service.InconsistentDistributionDetailService;
import com.yuanchu.mom.service.InconsistentDistributionService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yuanchu.mom.utils.HackLoopTableRenderPolicy;
import com.yuanchu.mom.utils.DateImageUtil;
import com.yuanchu.mom.utils.QueryWrappers;
import io.swagger.models.auth.In;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
/**
*
* 不符合项的分布 服务实现类
*
*
* @author
* @since 2024-11-15 09:53:20
*/
@Service
@AllArgsConstructor
@Transactional(rollbackFor = Exception.class)
public class InconsistentDistributionServiceImpl extends ServiceImpl implements InconsistentDistributionService {
private InconsistentDistributionDetailService inconsistentDistributionDetailService;
/**
* 不符合项分布查询
* @param page
* @param inconsistentDistributionDto
* @return
*/
@Override
public IPage pageInconsistentDistribution(Page page, InconsistentDistribution inconsistentDistributionDto) {
return baseMapper.pageInconsistentDistribution(page, QueryWrappers.queryWrappers(inconsistentDistributionDto));
}
/**
* 不符合项分布新增
* @param inconsistentDistributionDto
* @return
*/
@Override
public boolean addInconsistentDistribution(InconsistentDistributionDto inconsistentDistributionDto) {
baseMapper.insert(inconsistentDistributionDto);
// 新增详情
for (InconsistentDistributionDetail distributionDetail : inconsistentDistributionDto.getDistributionDetailList()) {
distributionDetail.setDistributionId(inconsistentDistributionDto.getDistributionId());
}
inconsistentDistributionDetailService.saveBatch(inconsistentDistributionDto.getDistributionDetailList());
return true;
}
/**
* 不符合项分布修改
* @param inconsistentDistributionDto
* @return
*/
@Override
public boolean updateInconsistentDistribution(InconsistentDistributionDto inconsistentDistributionDto) {
inconsistentDistributionDetailService.updateBatchById(inconsistentDistributionDto.getDistributionDetailList());
return true;
}
/**
* 不符合项分布删除
* @param distributionId
* @return
*/
@Override
public boolean delInconsistentDistribution(Integer distributionId) {
inconsistentDistributionDetailService.remove(Wrappers.lambdaQuery()
.eq(InconsistentDistributionDetail::getDistributionId, distributionId));
baseMapper.deleteById(distributionId);
return true;
}
/**
* 不符合项分布查看详情
* @param distributionId
* @return
*/
@Override
public InconsistentDistributionDto getInconsistentDistributionOne(Integer distributionId) {
InconsistentDistributionDto distributionDto = new InconsistentDistributionDto();
InconsistentDistribution inconsistentDistribution = baseMapper.selectById(distributionId);
BeanUtils.copyProperties(distributionDto, inconsistentDistribution);
// 查询详细
List distributionDetailList = inconsistentDistributionDetailService.list(Wrappers.lambdaQuery()
.eq(InconsistentDistributionDetail::getDistributionId, distributionId));
// 主任汇总
int directorSum = distributionDetailList.stream()
.filter(detail -> detail.getDirector() != null)
.mapToInt(InconsistentDistributionDetail::getDirector)
.sum();
// 技术负责人汇总
int technologySum = distributionDetailList.stream()
.filter(detail -> detail.getTechnology() != null)
.mapToInt(InconsistentDistributionDetail::getTechnology)
.sum();
// 质量负责人汇总
int qualitySum = distributionDetailList.stream()
.filter(detail -> detail.getQuality() != null)
.mapToInt(InconsistentDistributionDetail::getQuality)
.sum();
// 综合室汇总
int comprehensiveSum = distributionDetailList.stream()
.filter(detail -> detail.getComprehensive() != null)
.mapToInt(InconsistentDistributionDetail::getComprehensive)
.sum();
// 试验室汇总
int testingSum = distributionDetailList.stream()
.filter(detail -> detail.getTesting() != null)
.mapToInt(InconsistentDistributionDetail::getTesting)
.sum();
// 总数汇总
int sum = directorSum + technologySum + qualitySum + comprehensiveSum + testingSum;
//计算合计
for (InconsistentDistributionDetail distributionDetail : distributionDetailList) {
// 总数
Integer total = (distributionDetail.getDirector() != null ? distributionDetail.getDirector() : 0)
+ (distributionDetail.getTechnology() != null ? distributionDetail.getTechnology() : 0)
+ (distributionDetail.getQuality() != null ? distributionDetail.getQuality() : 0)
+ (distributionDetail.getComprehensive() != null ? distributionDetail.getComprehensive() : 0)
+ (distributionDetail.getTesting() != null ? distributionDetail.getTesting() : 0);
distributionDetail.setTotal(total);
// 占比
distributionDetail.setProportion(calculatePercentage(total, sum));
}
// 添加最后一行占比对象
InconsistentDistributionProportionDto proportionDto = new InconsistentDistributionProportionDto();
proportionDto.setEssentials("占比 %");
proportionDto.setDirector(calculatePercentage(directorSum, sum));
proportionDto.setTechnology(calculatePercentage(technologySum, sum));
proportionDto.setQuality(calculatePercentage(qualitySum, sum));
proportionDto.setComprehensive(calculatePercentage(comprehensiveSum, sum));
proportionDto.setTesting(calculatePercentage(testingSum, sum));
proportionDto.setTotal(sum);
distributionDto.setDistributionDetailList(distributionDetailList);
distributionDto.setDistributionProportion(proportionDto);
return distributionDto;
}
/**
* 计算占比
* @return
*/
public BigDecimal calculatePercentage(Integer numeratorNum, Integer denominatorNum) {
BigDecimal numerator = new BigDecimal(numeratorNum);
BigDecimal denominator = new BigDecimal(denominatorNum);
// 检查除数是否为0
if (denominator.compareTo(BigDecimal.ZERO) == 0) {
return BigDecimal.ZERO;
}
BigDecimal ratio = numerator.divide(denominator, 4, RoundingMode.HALF_UP); // 保留4位小数
BigDecimal percentage = ratio.multiply(new BigDecimal("100"));
BigDecimal percentageRounded = percentage.setScale(2, RoundingMode.HALF_UP);
return percentageRounded;
}
/**
* 导出不符合的分布
* @param distributionId
* @param response
*/
@Override
public void exportInconsistentDistribution(Integer distributionId, HttpServletResponse response) {
InconsistentDistributionDto inconsistentDistributionOne = getInconsistentDistributionOne(distributionId);
// 获取路径
InputStream inputStream = this.getClass().getResourceAsStream("/static/inconsistent-distribution.docx");
Configure configure = Configure.builder()
.bind("distributionDetailList", new HackLoopTableRenderPolicy())
.build();
XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
new HashMap() {{
put("distributionDetailList", inconsistentDistributionOne.getDistributionDetailList());
put("proport", inconsistentDistributionOne.getDistributionProportion());
}});
try {
response.setContentType("application/msword");
String fileName = URLEncoder.encode(
"不符合项的分布", "UTF-8");
response.setHeader("Content-disposition",
"attachment;filename=" + fileName + ".docx");
OutputStream os = response.getOutputStream();
template.write(os);
os.flush();
os.close();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("导出失败");
}
}
}