package com.ruoyi.process.service.impl;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.inspect.dto.InsOrderDeviceRecordDto;
import com.ruoyi.inspect.mapper.InsProductResultMapper;
import com.ruoyi.inspect.mapper.InsSampleMapper;
import com.ruoyi.inspect.pojo.*;
import com.ruoyi.inspect.service.InsOrderService;
import com.ruoyi.inspect.service.InsReportService;
import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
import com.ruoyi.process.dto.InspectionOrderDetailExportDto;
import com.ruoyi.process.dto.InspectionOrderDto;
import com.ruoyi.process.dto.InspectionOrderExportDto;
import com.ruoyi.process.mapper.InspectionOrderMapper;
import com.ruoyi.process.mapper.ProcessOrderDeviceMapper;
import com.ruoyi.process.mapper.ProcessSampleMapper;
import com.ruoyi.process.pojo.*;
import com.ruoyi.process.service.*;
import com.ruoyi.system.mapper.UserMapper;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
/**
*
* 检验委托单 服务实现类
*
*
* @author 江苏鵷雏网络科技有限公司
* @since 2024-12-09
*/
@Service
@Transactional(rollbackFor = Exception.class)
public class InspectionOrderServiceImpl extends ServiceImpl implements InspectionOrderService {
@Resource
private InspectionOrderDetailService inspectionOrderDetailService;
@Resource
private InsOrderService insOrderService;
@Resource
private InsSampleMapper insSampleMapper;
@Resource
private InsReportService insReportService;
@Value("${wordUrl}")
private String wordUrl;
@Resource
private ProcessReportService processReportService;
@Resource
private ProcessOrderDeviceMapper processOrderDeviceMapper;
@Resource
private InsProductResultMapper insProductResultMapper;
@Resource
private ProcessOrderDeviceService processOrderDeviceService;
@Resource
private UserMapper userMapper;
@Resource
private ProcessSampleService processSampleService;
@Resource
private ProcessSampleMapper processSampleMapper;
@Resource
private ProcessDealService processDealService;
/**
* 检验委托单分页查询:同一批次的样品合并成一行展示。
* 过滤条件先匹配订单,再按批次补全成员,最后在内存里分组和分页。
*/
@Override
public IPage pageInspectionOrder(Page page, InspectionOrder inspectionOrderQuery) {
QueryWrapper queryWrapper = QueryWrappers.queryWrappers(inspectionOrderQuery);
queryWrapper.orderByDesc("create_time").orderByDesc("inspection_order_id");
List matched = baseMapper.selectList(queryWrapper);
Page result = new Page<>(page.getCurrent(), page.getSize(), 0);
if (matched.isEmpty()) {
result.setRecords(Collections.emptyList());
return result;
}
Set batchNos = matched.stream()
.map(InspectionOrder::getBatchNo)
.filter(StrUtil::isNotBlank)
.collect(Collectors.toSet());
List allOrders = new ArrayList<>(matched);
if (!batchNos.isEmpty()) {
Set matchedIds = matched.stream()
.map(InspectionOrder::getInspectionOrderId)
.collect(Collectors.toSet());
allOrders.addAll(baseMapper.selectList(Wrappers.lambdaQuery()
.in(InspectionOrder::getBatchNo, batchNos)
.notIn(InspectionOrder::getInspectionOrderId, matchedIds)));
}
Map> membersByGroup = allOrders.stream()
.collect(Collectors.groupingBy(this::batchGroupKey));
Map groupKeyById = allOrders.stream()
.collect(Collectors.toMap(InspectionOrder::getInspectionOrderId, this::batchGroupKey, (first, ignored) -> first));
Map detailCountByGroup = new HashMap<>();
List details = inspectionOrderDetailService.list(
Wrappers.lambdaQuery()
.in(InspectionOrderDetail::getInspectionOrderId, groupKeyById.keySet())
.select(InspectionOrderDetail::getInspectionOrderId));
for (InspectionOrderDetail detail : details) {
String groupKey = groupKeyById.get(detail.getInspectionOrderId());
if (groupKey != null) {
detailCountByGroup.merge(groupKey, 1, Integer::sum);
}
}
// 按匹配订单的先后顺序输出分组;代表单固定取组内最早的订单,保证翻页稳定
LinkedHashMap orderedGroups = new LinkedHashMap<>();
for (InspectionOrder order : matched) {
orderedGroups.putIfAbsent(batchGroupKey(order), order);
}
List groups = new ArrayList<>();
for (Map.Entry entry : orderedGroups.entrySet()) {
List members = membersByGroup.getOrDefault(entry.getKey(),
Collections.singletonList(entry.getValue()));
InspectionOrder representative = members.stream()
.min(Comparator.comparing(InspectionOrder::getInspectionOrderId))
.orElse(entry.getValue());
InspectionOrderDto dto = new InspectionOrderDto();
BeanUtils.copyProperties(representative, dto);
dto.setMemberCount(members.size());
dto.setDetailCount(detailCountByGroup.getOrDefault(entry.getKey(), 0));
groups.add(dto);
}
long total = groups.size();
int from = (int) Math.min(total, Math.max(0L, (page.getCurrent() - 1) * page.getSize()));
int to = (int) Math.min(total, from + page.getSize());
result.setTotal(total);
result.setRecords(from >= to ? Collections.emptyList() : new ArrayList<>(groups.subList(from, to)));
return result;
}
private String batchGroupKey(InspectionOrder order) {
return StrUtil.isBlank(order.getBatchNo()) ? "#" + order.getInspectionOrderId() : order.getBatchNo();
}
private List listBatchMembers(String batchNo) {
return baseMapper.selectList(Wrappers.lambdaQuery()
.eq(InspectionOrder::getBatchNo, batchNo)
.orderByAsc(InspectionOrder::getInspectionOrderId));
}
/**
* 检验委托单新增
* @param inspectionOrder
* @return
*/
@Override
public boolean addInspectionOrder(InspectionOrderDto inspectionOrder) {
if (inspectionOrder.getInsOrderId() == null) {
throw new ErrorException("缺少订单id");
}
// 复制报告
// 查询订单报告
InsReport insReport = insReportService.getOne(Wrappers.lambdaQuery()
.eq(InsReport::getInsOrderId, inspectionOrder.getInsOrderId()));
String path = wordUrl + insReport.getUrl().replaceFirst("/word", "");
String fileName =LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss")) + "_" + "委托单报告.docx";
// 源文件路径
Path sourcePath = Paths.get(path);
// 目标文件路径
Path targetPath = Paths.get(wordUrl + "/" + fileName);
try {
// 复制文件,如果目标文件已存在,则覆盖
Files.copy(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING);
// 添加文件地址
inspectionOrder.setFileUrl("/word/" + fileName);
} catch (Exception e) {
e.printStackTrace();
}
baseMapper.insert(inspectionOrder);
// 新增详情
if (CollectionUtils.isNotEmpty(inspectionOrder.getOrderDetailList())) {
for (InspectionOrderDetail InspectionOrderDetail : inspectionOrder.getOrderDetailList()) {
InspectionOrderDetail.setInspectionOrderId(inspectionOrder.getInspectionOrderId());
}
inspectionOrderDetailService.saveBatch(inspectionOrder.getOrderDetailList());
}
/*新增7.8报告结果*/
ProcessReport processReport = new ProcessReport();
processReport.setInspectionOrderId(inspectionOrder.getInsOrderId());
processReport.setInsReportCode(insReport.getCode());//报告编号使用正式报告编号
processReport.setSend(inspectionOrder.getCommissionUnit());//发往何处=委托单位
processReport.setMethod(inspectionOrder.getSend()==1?"自取":"其他");//发送方式
processReport.setSendTime(insReport.getRatifyTime().toLocalDate());//发送日期
processReport.setSendUser(64);//发送人固定
processReport.setSignatory(inspectionOrder.getCommissionUser());//签收人=委托人
processReportService.save(processReport);
/*新增7.1委托单对应的设备使用记录*/
addDeviceRecord(inspectionOrder,insReport.getWriteUserId());
/*新增7.4样品接收*/
List insSamples = insSampleMapper.selectList(Wrappers.lambdaQuery()
.eq(InsSample::getInsOrderId, inspectionOrder.getInsOrderId()));
if (insSamples.size()>0){
List processSamples = new ArrayList<>();
for (InsSample insSample : insSamples) {
ProcessSample processSample = new ProcessSample();
processSample.setReceiveDate(inspectionOrder.getSampleData());//收样日期=领样日期
processSample.setSampleCode(insSample.getSampleCode());//样品编号
processSample.setSampleName(insSample.getSample());//样品名称
processSample.setNum(1);//样品数量=1
processSample.setSampleSupplier(inspectionOrder.getCommissionUnit());//来样单位
LocalDate plusMonths = inspectionOrder.getSampleData() == null ? null : inspectionOrder.getSampleData().plusMonths(1);
processSample.setLeaveDate(plusMonths);//留样日期=收样日期往后延一个月
processSample.setSampleState(inspectionOrder.getSampleStatus());//样品状态
processSample.setDealTime(plusMonths);//退样日期=留样日期
processSample.setInspectionOrderId(inspectionOrder.getInspectionOrderId());//委托单id
processSamples.add(processSample);
}
processSampleService.saveBatch(processSamples);
}
return true;
}
private synchronized void addDeviceRecord(InspectionOrder inspectionOrder,Integer userId) {
// 查询设备使用记录查询该订单的使用记录
Set recordCodeset = processOrderDeviceMapper.selectDeviceNumber(inspectionOrder.getInspectionOrderId());
// 获取订单设备编号
List resultList = insProductResultMapper.selectResultByOrderId(inspectionOrder.getInsOrderId());
Set deviceCodeSet = new HashSet<>();
for (InsProductResult result : resultList) {
// 添加设备编号
List jsonObjects = JSON.parseArray(result.getEquipValue(), JSONObject.class);
for (JSONObject jsonObject : jsonObjects) {
if (!"".equals(jsonObject.get("v") + "")) {
List v = StrUtil.split(jsonObject.get("v") + "", ",");
deviceCodeSet.addAll(v);
}
}
}
// 1.判断是否有没有添加的使用记录
Set orderDeviceNumbers = getDeviceDifference(deviceCodeSet, recordCodeset);
// 添加使用记录, 根据编号查询设备id
if (CollectionUtils.isNotEmpty(orderDeviceNumbers)) {
List orderDeviceIds = processOrderDeviceMapper.selectDeviceIdsByNumbers(orderDeviceNumbers);
List collect = orderDeviceIds.stream().map(deviceId -> {
ProcessOrderDevice processOrderDevice = new ProcessOrderDevice();
processOrderDevice.setInspectionOrderId(inspectionOrder.getInspectionOrderId());
processOrderDevice.setDeviceId(deviceId);
processOrderDevice.setSampleCode(inspectionOrder.getEntrustCode());
processOrderDevice.setUseBefore(1);
processOrderDevice.setUseAfter(1);
processOrderDevice.setUsePerson(userMapper.selectById(userId).getName());//使用人
processOrderDevice.setUsePersonId(userId);//使用人id
return processOrderDevice;
}).collect(Collectors.toList());
processOrderDeviceService.saveBatch(collect);
}
}
private static Set getDeviceDifference(Set number1, Set number2) {
return number1.stream().filter(s1 -> number2.stream().noneMatch(s2 -> s1.equals(s2)))
.collect(Collectors.toSet());
}
private void syncHeaderSampleFields(InspectionOrderDto inspectionOrder) {
if (CollectionUtils.isEmpty(inspectionOrder.getOrderDetailList())) {
return;
}
InspectionOrderDetail first = inspectionOrder.getOrderDetailList().get(0);
if (StrUtil.isNotBlank(first.getSampleName())) {
inspectionOrder.setSampleName(first.getSampleName());
}
if (StrUtil.isNotBlank(first.getQuantity())) {
inspectionOrder.setQuantity(first.getQuantity());
}
if (StrUtil.isNotBlank(first.getSampleStatus())) {
inspectionOrder.setSampleStatus(first.getSampleStatus());
}
}
private void applyRequirementFields(InspectionOrderDto inspectionOrder) {
if (inspectionOrder.getSampleDisposal() != null) {
inspectionOrder.setProcessing(Integer.valueOf(2).equals(inspectionOrder.getSampleDisposal()) ? 1 : 0);
}
if (inspectionOrder.getReportDelivery() != null) {
inspectionOrder.setSend(Integer.valueOf(1).equals(inspectionOrder.getReportDelivery()) ? 1 : 0);
}
}
private void syncInsOrderRequirement(InspectionOrderDto inspectionOrder) {
if (inspectionOrder.getInsOrderId() == null) {
return;
}
InsOrder insOrder = new InsOrder();
insOrder.setId(inspectionOrder.getInsOrderId());
insOrder.setSubcontractType(inspectionOrder.getSubcontractType());
if (inspectionOrder.getSubcontractType() != null) {
insOrder.setSubcontractCompany(Integer.valueOf(1).equals(inspectionOrder.getSubcontractType())
? (inspectionOrder.getSubcontractCompany() == null ? "" : inspectionOrder.getSubcontractCompany())
: "");
}
insOrder.setSampleDisposal(inspectionOrder.getSampleDisposal());
insOrder.setResultEvaluation(inspectionOrder.getResultEvaluation());
insOrder.setReportDelivery(inspectionOrder.getReportDelivery());
insOrder.setReportAddress(inspectionOrder.getReportAddress());
insOrder.setReportReceiver(inspectionOrder.getReportReceiver());
if (inspectionOrder.getSampleDisposal() != null) {
insOrder.setProcessing(inspectionOrder.getProcessing());
}
if (inspectionOrder.getReportDelivery() != null) {
insOrder.setSend(inspectionOrder.getSend());
}
insOrderService.updateById(insOrder);
}
private void fillRequirementFields(InspectionOrder inspectionOrder, InspectionOrderDto dto, InsOrder insOrder) {
Integer sampleDisposal = insOrder == null ? null : insOrder.getSampleDisposal();
if (sampleDisposal == null) {
sampleDisposal = inspectionOrder.getProcessing() != null && inspectionOrder.getProcessing() == 1 ? 2 : 1;
}
Integer reportDelivery = insOrder == null ? null : insOrder.getReportDelivery();
if (reportDelivery == null) {
reportDelivery = inspectionOrder.getSend() != null && inspectionOrder.getSend() == 1 ? 1 : 2;
}
Integer subcontractType = insOrder != null && insOrder.getSubcontractType() != null ? insOrder.getSubcontractType() : 0;
dto.setSubcontractType(subcontractType);
dto.setSubcontractCompany(subcontractType == 1 && insOrder != null && insOrder.getSubcontractCompany() != null
? insOrder.getSubcontractCompany() : "");
dto.setSampleDisposal(sampleDisposal);
dto.setResultEvaluation(insOrder != null && insOrder.getResultEvaluation() != null ? insOrder.getResultEvaluation() : 0);
dto.setReportDelivery(reportDelivery);
dto.setReportAddress(insOrder != null && insOrder.getReportAddress() != null ? insOrder.getReportAddress() : "");
dto.setReportReceiver(insOrder != null && insOrder.getReportReceiver() != null ? insOrder.getReportReceiver() : "");
}
/**
* 检验委托单修改
* @param InspectionOrder
* @return
*/
@Override
public boolean updateInspectionOrder(InspectionOrderDto InspectionOrder) {
if (StrUtil.isNotBlank(InspectionOrder.getBatchNo())) {
return updateBatchInspectionOrder(InspectionOrder);
}
applyRequirementFields(InspectionOrder);
syncHeaderSampleFields(InspectionOrder);
baseMapper.updateById(InspectionOrder);
// 明细为 null 表示本次不维护明细,保留原数据;空数组表示清空
if (InspectionOrder.getOrderDetailList() != null) {
inspectionOrderDetailService.remove(Wrappers.lambdaQuery()
.eq(InspectionOrderDetail::getInspectionOrderId, InspectionOrder.getInspectionOrderId()));
if (CollectionUtils.isNotEmpty(InspectionOrder.getOrderDetailList())) {
for (InspectionOrderDetail InspectionOrderDetail : InspectionOrder.getOrderDetailList()) {
InspectionOrderDetail.setInspectionOrderId(InspectionOrder.getInspectionOrderId());
}
inspectionOrderDetailService.saveBatch(InspectionOrder.getOrderDetailList());
}
}
syncInsOrderRequirement(InspectionOrder);
syncProcessReport(InspectionOrder.getInsOrderId());
return true;
}
/**
* 合并编辑:公共委托信息广播到整批,明细按行所属委托单写回。
*/
private boolean updateBatchInspectionOrder(InspectionOrderDto inspectionOrder) {
List members = listBatchMembers(inspectionOrder.getBatchNo());
if (members.isEmpty()) {
throw new ErrorException("批次数据不存在");
}
Set memberIds = members.stream()
.map(InspectionOrder::getInspectionOrderId)
.collect(Collectors.toSet());
Integer representativeId = inspectionOrder.getInspectionOrderId();
if (representativeId == null || !memberIds.contains(representativeId)) {
representativeId = members.get(0).getInspectionOrderId();
}
applyRequirementFields(inspectionOrder);
for (InspectionOrder member : members) {
copyBatchHeader(inspectionOrder, member);
baseMapper.updateById(member);
}
if (inspectionOrder.getOrderDetailList() != null) {
inspectionOrderDetailService.remove(Wrappers.lambdaQuery()
.in(InspectionOrderDetail::getInspectionOrderId, memberIds));
if (CollectionUtils.isNotEmpty(inspectionOrder.getOrderDetailList())) {
Map> detailsByOwner = new LinkedHashMap<>();
for (InspectionOrderDetail detail : inspectionOrder.getOrderDetailList()) {
Integer ownerId = detail.getInspectionOrderId();
if (ownerId == null || !memberIds.contains(ownerId)) {
ownerId = representativeId;
}
detail.setInspectionOrderDetailId(null);
detail.setInspectionOrderId(ownerId);
detailsByOwner.computeIfAbsent(ownerId, key -> new ArrayList<>()).add(detail);
}
final Integer fallbackOwnerId = representativeId;
for (Map.Entry> entry : detailsByOwner.entrySet()) {
InspectionOrder member = members.stream()
.filter(item -> item.getInspectionOrderId().equals(entry.getKey()))
.findFirst()
.orElse(members.stream()
.filter(item -> item.getInspectionOrderId().equals(fallbackOwnerId))
.findFirst().orElse(null));
InspectionOrderDetail first = entry.getValue().get(0);
if (member != null) {
if (StrUtil.isNotBlank(first.getSampleName())) {
member.setSampleName(first.getSampleName());
}
if (StrUtil.isNotBlank(first.getQuantity())) {
member.setQuantity(first.getQuantity());
}
if (StrUtil.isNotBlank(first.getSampleStatus())) {
member.setSampleStatus(first.getSampleStatus());
}
baseMapper.updateById(member);
}
inspectionOrderDetailService.saveBatch(entry.getValue());
}
}
}
for (InspectionOrder member : members) {
InspectionOrderDto memberDto = new InspectionOrderDto();
BeanUtils.copyProperties(inspectionOrder, memberDto);
memberDto.setInspectionOrderId(member.getInspectionOrderId());
memberDto.setInsOrderId(member.getInsOrderId());
memberDto.setEntrustCode(member.getEntrustCode());
memberDto.setBatchNo(member.getBatchNo());
syncInsOrderRequirement(memberDto);
syncProcessReport(member.getInsOrderId());
}
return true;
}
private void copyBatchHeader(InspectionOrderDto source, InspectionOrder target) {
target.setCommissionUnit(source.getCommissionUnit());
target.setCommissionDate(source.getCommissionDate());
target.setCommissionUser(source.getCommissionUser());
target.setCommissionPhone(source.getCommissionPhone());
target.setProduction(source.getProduction());
target.setIsLeave(source.getIsLeave());
target.setSampleSource(source.getSampleSource());
target.setProcessing(source.getProcessing());
target.setSend(source.getSend());
target.setCriterionRule(source.getCriterionRule());
target.setCriterionRuleRemark(source.getCriterionRuleRemark());
target.setGeneralOfficeUser(source.getGeneralOfficeUser());
target.setReceiptData(source.getReceiptData());
target.setReceiveStatus(source.getReceiveStatus());
target.setFeeStatus(source.getFeeStatus());
target.setSampleTakerUser(source.getSampleTakerUser());
target.setSampleData(source.getSampleData());
target.setAppointed(source.getAppointed());
}
private void syncProcessReport(Integer insOrderId) {
if (insOrderId == null) {
return;
}
ProcessReport processReport = processReportService.getOne(Wrappers.lambdaQuery()
.eq(ProcessReport::getInspectionOrderId, insOrderId)
.last("limit 1"));
InsReport insReport = insReportService.getOne(Wrappers.lambdaQuery()
.eq(InsReport::getInsOrderId, insOrderId)
.orderByDesc(InsReport::getId)
.last("limit 1"));
if (processReport != null && insReport != null) {
processReport.setInsReportCode(insReport.getCode());//报告编号使用正式报告编号
processReportService.updateById(processReport);
}
}
/**
* 检验委托单删除
* @param inspectionOrderId
* @return
*/
@Override
public boolean delInspectionOrder(Integer inspectionOrderId) {
InspectionOrder order = baseMapper.selectById(inspectionOrderId);
inspectionOrderDetailService.remove(Wrappers.lambdaQuery()
.eq(InspectionOrderDetail::getInspectionOrderId, inspectionOrderId));
baseMapper.deleteById(inspectionOrderId);
//删除7.8报告(该表 inspection_order_id 存的是成品订单id)
if (order != null && order.getInsOrderId() != null) {
processReportService.remove(Wrappers.lambdaQuery()
.eq(ProcessReport::getInspectionOrderId, order.getInsOrderId()));
}
//删除对应的设备使用记录
processOrderDeviceService.remove(Wrappers.lambdaQuery()
.eq(ProcessOrderDevice::getInspectionOrderId, inspectionOrderId));
//删除对应的7.4的样品申请
List processSamples = processSampleMapper.selectList(Wrappers.lambdaQuery()
.eq(ProcessSample::getInspectionOrderId, inspectionOrderId));
if (processSamples.size()>0){
List list = processSamples.stream().map(ProcessSample::getId).collect(Collectors.toList());
processDealService.remove(Wrappers.lambdaQuery()
.in(ProcessDeal::getProcessSampleId,list));
}
//删除对应7.4的样品接收
processSampleService.remove(Wrappers.lambdaQuery()
.eq(ProcessSample::getInspectionOrderId,inspectionOrderId));
return true;
}
@Override
public boolean delInspectionOrder(Integer inspectionOrderId, String batchNo) {
if (StrUtil.isBlank(batchNo)) {
return delInspectionOrder(inspectionOrderId);
}
List members = listBatchMembers(batchNo);
if (members.isEmpty()) {
return delInspectionOrder(inspectionOrderId);
}
for (InspectionOrder member : members) {
delInspectionOrder(member.getInspectionOrderId());
}
return true;
}
/**
* 检验委托单查看详情
* @param inspectionOrderId
* @return
*/
@Override
public InspectionOrderDto getInspectionOrderOne(Integer inspectionOrderId) {
InspectionOrder inspectionOrder = baseMapper.selectById(inspectionOrderId);
InspectionOrderDto inspectionOrderDto = new InspectionOrderDto();
BeanUtils.copyProperties(inspectionOrder, inspectionOrderDto);
InsOrder insOrder = inspectionOrder.getInsOrderId() == null ? null : insOrderService.getById(inspectionOrder.getInsOrderId());
fillRequirementFields(inspectionOrder, inspectionOrderDto, insOrder);
if (inspectionOrderDto.getSampleSource() == null) {
inspectionOrderDto.setSampleSource(1);
}
if (inspectionOrderDto.getReceiveStatus() == null) {
inspectionOrderDto.setReceiveStatus(1);
}
if (inspectionOrderDto.getFeeStatus() == null) {
inspectionOrderDto.setFeeStatus(2);
}
// 查询详细信息
inspectionOrderDto.setOrderDetailList(inspectionOrderDetailService.list(Wrappers.lambdaQuery()
.eq(InspectionOrderDetail::getInspectionOrderId, inspectionOrderId)
.orderByAsc(InspectionOrderDetail::getInspectionOrderDetailId)));
return inspectionOrderDto;
}
/**
* 按批次查看:头信息取代表单,明细合并整批样品。
*/
@Override
public InspectionOrderDto getInspectionOrderOne(Integer inspectionOrderId, String batchNo) {
if (StrUtil.isBlank(batchNo)) {
return getInspectionOrderOne(inspectionOrderId);
}
List members = listBatchMembers(batchNo);
if (members.isEmpty()) {
return getInspectionOrderOne(inspectionOrderId);
}
InspectionOrder representative = members.stream()
.filter(item -> item.getInspectionOrderId().equals(inspectionOrderId))
.findFirst()
.orElse(members.get(0));
InspectionOrderDto inspectionOrderDto = new InspectionOrderDto();
BeanUtils.copyProperties(representative, inspectionOrderDto);
InsOrder insOrder = representative.getInsOrderId() == null ? null
: insOrderService.getById(representative.getInsOrderId());
fillRequirementFields(representative, inspectionOrderDto, insOrder);
if (inspectionOrderDto.getSampleSource() == null) {
inspectionOrderDto.setSampleSource(1);
}
if (inspectionOrderDto.getReceiveStatus() == null) {
inspectionOrderDto.setReceiveStatus(1);
}
if (inspectionOrderDto.getFeeStatus() == null) {
inspectionOrderDto.setFeeStatus(2);
}
inspectionOrderDto.setMemberCount(members.size());
Map entrustCodeById = members.stream()
.collect(Collectors.toMap(InspectionOrder::getInspectionOrderId,
item -> item.getEntrustCode() == null ? "" : item.getEntrustCode()));
List details = inspectionOrderDetailService.list(
Wrappers.lambdaQuery()
.in(InspectionOrderDetail::getInspectionOrderId, entrustCodeById.keySet())
.orderByAsc(InspectionOrderDetail::getInspectionOrderId)
.orderByAsc(InspectionOrderDetail::getInspectionOrderDetailId));
Map> detailsByOwner = details.stream()
.collect(Collectors.groupingBy(InspectionOrderDetail::getInspectionOrderId,
LinkedHashMap::new, Collectors.toList()));
for (InspectionOrder member : members) {
List ownerDetails = detailsByOwner.get(member.getInspectionOrderId());
if (CollectionUtils.isEmpty(ownerDetails)) {
continue;
}
List codes = buildDetailEntrustCodes(member.getEntrustCode(), ownerDetails);
for (int index = 0; index < ownerDetails.size(); index++) {
ownerDetails.get(index).setEntrustCode(codes.get(index));
}
}
inspectionOrderDto.setOrderDetailList(details);
inspectionOrderDto.setDetailCount(details.size());
return inspectionOrderDto;
}
/**
* 根据成品订单id查询委托单详情
* @param insOrderId
* @return
*/
@Override
public InspectionOrderDto getInspectionOrderByInsOderId(Integer insOrderId) {
InsOrder order = insOrderService.getById(insOrderId);
InspectionOrderDto inspectionOrderDto = new InspectionOrderDto();
inspectionOrderDto.setInsOrderId(order.getId());//成品订单id
inspectionOrderDto.setEntrustCode(order.getEntrustCode());//委托编号
inspectionOrderDto.setSampleName(order.getSample());//试样名称
inspectionOrderDto.setProduction(order.getProduction());//生产单位
inspectionOrderDto.setCommissionUnit(order.getCompany());//委托单位
inspectionOrderDto.setCommissionUser(order.getPrepareUser());//委托人
inspectionOrderDto.setSampleStatus("完好");//样品状态
inspectionOrderDto.setIsLeave(order.getIsLeave());//是否留样
inspectionOrderDto.setProcessing(order.getProcessing());//样品处理方式
inspectionOrderDto.setAppointed(order.getAppointed());//约定时间
inspectionOrderDto.setSend(order.getSend());//报告发送方式
inspectionOrderDto.setCommissionPhone(order.getPhone());//报告发送方式
Integer subcontractType = order.getSubcontractType() == null ? 0 : order.getSubcontractType();
inspectionOrderDto.setSubcontractType(subcontractType);
inspectionOrderDto.setSubcontractCompany(subcontractType == 1 && order.getSubcontractCompany() != null
? order.getSubcontractCompany() : "");
Integer sampleDisposal = order.getSampleDisposal();
if (sampleDisposal == null) {
sampleDisposal = order.getProcessing() != null && order.getProcessing() == 1 ? 2 : 1;
}
inspectionOrderDto.setSampleDisposal(sampleDisposal);
inspectionOrderDto.setResultEvaluation(order.getResultEvaluation() == null ? 0 : order.getResultEvaluation());
Integer reportDelivery = order.getReportDelivery();
if (reportDelivery == null) {
reportDelivery = order.getSend() != null && order.getSend() == 1 ? 1 : 2;
}
inspectionOrderDto.setReportDelivery(reportDelivery);
inspectionOrderDto.setReportAddress(order.getReportAddress() == null ? "" : order.getReportAddress());
inspectionOrderDto.setReportReceiver(order.getReportReceiver() == null ? "" : order.getReportReceiver());
inspectionOrderDto.setSampleSource(1);
inspectionOrderDto.setReceiveStatus(1);
inspectionOrderDto.setFeeStatus(2);
return inspectionOrderDto;
}
/**
* 委托单查询成品订单
* @return
*/
@Override
public IPage getInsOrderOnInspection(Page page, InsOrder insOrder) {
return baseMapper.getInsOrderOnInspection(page, QueryWrappers.queryWrappers(insOrder));
}
/**
* 委托单成品报告上传
* @param file
* @param inspectionOrderId
* @return
*/
@Override
public boolean uploadInspectionOrderFile(MultipartFile file, Integer inspectionOrderId) {
String urlString;
String pathName;
try {
String path = wordUrl;
File realpath = new File(path);
if (!realpath.exists()) {
realpath.mkdirs();
}
pathName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss")) + "_" + file.getOriginalFilename();
urlString = realpath + "/" + pathName;
file.transferTo(new File(urlString));
baseMapper.update(null, Wrappers.lambdaUpdate()
.eq(InspectionOrder::getInspectionOrderId, inspectionOrderId)
.set(InspectionOrder::getFileUrl, "/word/" + pathName));
} catch (Exception e) {
throw new ErrorException("文件上传失败");
}
return true;
}
@Override
public void exportInspectionOrder(Integer inspectionOrderId, HttpServletResponse response) {
exportSingleInspectionOrder(inspectionOrderId, response);
}
@Override
public void exportInspectionOrder(Integer inspectionOrderId, String batchNo, HttpServletResponse response) {
if (StrUtil.isBlank(batchNo)) {
exportSingleInspectionOrder(inspectionOrderId, response);
return;
}
List members = listBatchMembers(batchNo);
if (members.isEmpty()) {
exportSingleInspectionOrder(inspectionOrderId, response);
return;
}
InspectionOrder representative = members.stream()
.filter(item -> item.getInspectionOrderId().equals(inspectionOrderId))
.findFirst()
.orElse(members.get(0));
InsOrder insOrder = representative.getInsOrderId() == null ? null
: insOrderService.getById(representative.getInsOrderId());
InspectionOrderExportDto inspectionOrderExportDto = extracted(representative, insOrder);
Map> detailsByOwner = inspectionOrderDetailService.list(
Wrappers.lambdaQuery()
.in(InspectionOrderDetail::getInspectionOrderId, members.stream()
.map(InspectionOrder::getInspectionOrderId)
.collect(Collectors.toList()))
.orderByAsc(InspectionOrderDetail::getInspectionOrderId)
.orderByAsc(InspectionOrderDetail::getInspectionOrderDetailId))
.stream()
.collect(Collectors.groupingBy(InspectionOrderDetail::getInspectionOrderId,
LinkedHashMap::new, Collectors.toList()));
List detailList = new ArrayList<>();
for (InspectionOrder member : members) {
List ownerDetails = detailsByOwner.get(member.getInspectionOrderId());
if (CollectionUtils.isEmpty(ownerDetails)) {
continue;
}
List detailEntrustCodes = buildDetailEntrustCodes(member.getEntrustCode(), ownerDetails);
for (int i = 0; i < ownerDetails.size(); i++) {
InspectionOrderDetail inspectionOrderDetail = ownerDetails.get(i);
InspectionOrderDetailExportDto row = new InspectionOrderDetailExportDto();
row.setSampleName(StrUtil.isNotBlank(inspectionOrderDetail.getSampleName())
? inspectionOrderDetail.getSampleName() : member.getSampleName());
row.setSampleNumber(inspectionOrderDetail.getSampleNumber());
row.setTestItem(inspectionOrderDetail.getTestItem());
row.setQuantity(StrUtil.isNotBlank(inspectionOrderDetail.getQuantity())
? inspectionOrderDetail.getQuantity() : member.getQuantity());
row.setSampleStatus(StrUtil.isNotBlank(inspectionOrderDetail.getSampleStatus())
? inspectionOrderDetail.getSampleStatus() : member.getSampleStatus());
row.setTestStandard(inspectionOrderDetail.getTestStandard());
row.setRemark(inspectionOrderDetail.getRemark());
row.setEntrustCode(detailEntrustCodes.get(i));
detailList.add(row);
}
}
inspectionOrderExportDto.setProjectName(detailList.size() + "个样品");
writeInspectionOrderExport(inspectionOrderExportDto, detailList, response);
}
private void exportSingleInspectionOrder(Integer inspectionOrderId, HttpServletResponse response) {
InspectionOrder inspectionOrder = baseMapper.selectById(inspectionOrderId);
InsOrder insOrder = inspectionOrder.getInsOrderId() == null ? null : insOrderService.getById(inspectionOrder.getInsOrderId());
InspectionOrderExportDto inspectionOrderExportDto = extracted(inspectionOrder, insOrder);
List list = inspectionOrderDetailService.list(Wrappers.lambdaQuery()
.eq(InspectionOrderDetail::getInspectionOrderId, inspectionOrderId)
.orderByAsc(InspectionOrderDetail::getInspectionOrderDetailId));
List detailEntrustCodes = buildDetailEntrustCodes(inspectionOrder.getEntrustCode(), list);
List detailList = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
InspectionOrderDetail inspectionOrderDetail = list.get(i);
InspectionOrderDetailExportDto row = new InspectionOrderDetailExportDto();
row.setSampleName(StrUtil.isNotBlank(inspectionOrderDetail.getSampleName())
? inspectionOrderDetail.getSampleName() : inspectionOrder.getSampleName());
row.setSampleNumber(inspectionOrderDetail.getSampleNumber());
row.setTestItem(inspectionOrderDetail.getTestItem());
row.setQuantity(StrUtil.isNotBlank(inspectionOrderDetail.getQuantity())
? inspectionOrderDetail.getQuantity() : inspectionOrder.getQuantity());
row.setSampleStatus(StrUtil.isNotBlank(inspectionOrderDetail.getSampleStatus())
? inspectionOrderDetail.getSampleStatus() : inspectionOrder.getSampleStatus());
row.setTestStandard(inspectionOrderDetail.getTestStandard());
row.setRemark(inspectionOrderDetail.getRemark());
row.setEntrustCode(detailEntrustCodes.get(i));
detailList.add(row);
}
inspectionOrderExportDto.setProjectName(detailList.size() + "个样品");
writeInspectionOrderExport(inspectionOrderExportDto, detailList, response);
}
private void writeInspectionOrderExport(InspectionOrderExportDto inspectionOrderExportDto,
List detailList,
HttpServletResponse response) {
// 获取路径
InputStream inputStream = this.getClass().getResourceAsStream("/static/inspection-order.docx");
Configure configure = Configure.builder()
.bind("inspectionOrderDetailList", new HackLoopTableRenderPolicy())
.build();
XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
new HashMap() {{
put("inspectionOrder", inspectionOrderExportDto);
put("inspectionOrderDetailList", detailList);
}});
try {
response.setContentType("application/msword");
String fileName = URLEncoder.encode(
StrUtil.isBlank(inspectionOrderExportDto.getSampleName())
? "客户检测委托书" : inspectionOrderExportDto.getSampleName(), "UTF-8");
response.setHeader("Content-disposition",
"attachment;filename=" + fileName + ".docx");
OutputStream os = response.getOutputStream();
template.write(os);
os.flush();
os.close();
inputStream.close();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("导出失败");
}
}
private InspectionOrderExportDto extracted(InspectionOrder inspectionOrder, InsOrder insOrder) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
InspectionOrderExportDto inspectionOrderExportDto = new InspectionOrderExportDto();
BeanUtils.copyProperties(inspectionOrder, inspectionOrderExportDto);
if (inspectionOrder.getCommissionDate() != null) {
inspectionOrderExportDto.setCommissionDateString(inspectionOrder.getCommissionDate().format(formatter));
}
if (inspectionOrder.getReceiptData() != null) {
inspectionOrderExportDto.setReceiptDataString(inspectionOrder.getReceiptData().format(formatter));
}
if (inspectionOrder.getSampleData() != null) {
inspectionOrderExportDto.setSampleDataString(inspectionOrder.getSampleData().format(formatter));
}
if (inspectionOrder.getAppointed() != null) {
inspectionOrderExportDto.setAppointedString(inspectionOrder.getAppointed().format(formatter));
}
inspectionOrderExportDto.setIsLeave1(inspectionOrder.getIsLeave() != null && inspectionOrder.getIsLeave() == 1? "☑" : "□");
inspectionOrderExportDto.setIsLeave2(inspectionOrder.getIsLeave() != null && inspectionOrder.getIsLeave() != 1? "☑" : "□");
inspectionOrderExportDto.setProcessing0(inspectionOrder.getProcessing() != null && inspectionOrder.getProcessing() == 0? "☑" : "□");
inspectionOrderExportDto.setProcessing1(inspectionOrder.getProcessing() != null && inspectionOrder.getProcessing() == 1? "☑" : "□");
inspectionOrderExportDto.setCriterionRule0(inspectionOrder.getCriterionRule() != null && inspectionOrder.getCriterionRule() == 0? "☑" : "□");
inspectionOrderExportDto.setCriterionRule1(inspectionOrder.getCriterionRule() != null && inspectionOrder.getCriterionRule() == 1? "☑" : "□");
Integer subcontractType = insOrder != null && insOrder.getSubcontractType() != null ? insOrder.getSubcontractType() : 0;
Integer sampleDisposal = insOrder == null ? null : insOrder.getSampleDisposal();
if (sampleDisposal == null) {
sampleDisposal = inspectionOrder.getProcessing() != null && inspectionOrder.getProcessing() == 1 ? 2 : 1;
}
Integer resultEvaluation = insOrder != null && insOrder.getResultEvaluation() != null ? insOrder.getResultEvaluation() : 0;
Integer reportDelivery = insOrder == null ? null : insOrder.getReportDelivery();
if (reportDelivery == null) {
reportDelivery = inspectionOrder.getSend() != null && inspectionOrder.getSend() == 1 ? 1 : 2;
}
inspectionOrderExportDto.setSubcontractType(subcontractType);
inspectionOrderExportDto.setSubcontractCompany(subcontractType == 1 && insOrder != null && insOrder.getSubcontractCompany() != null
? insOrder.getSubcontractCompany() : "");
inspectionOrderExportDto.setSubcontractYes(subcontractType == 1 ? "☑" : "□");
inspectionOrderExportDto.setSubcontractNo(subcontractType == 0 ? "☑" : "□");
inspectionOrderExportDto.setSampleDisposal(sampleDisposal);
inspectionOrderExportDto.setResultEvaluation(resultEvaluation);
inspectionOrderExportDto.setResultEvaluationYes(resultEvaluation == 1 ? "☑" : "□");
inspectionOrderExportDto.setResultEvaluationNo(resultEvaluation == 0 ? "☑" : "□");
inspectionOrderExportDto.setReportDelivery(reportDelivery);
inspectionOrderExportDto.setSendSelf(reportDelivery == 1 ? "☑" : "□");
inspectionOrderExportDto.setSendExpress(reportDelivery == 2 ? "☑" : "□");
inspectionOrderExportDto.setSendElectronic(reportDelivery == 3 ? "☑" : "□");
boolean express = reportDelivery == 2;
inspectionOrderExportDto.setReportAddress(express && insOrder != null && insOrder.getReportAddress() != null
? insOrder.getReportAddress() : "");
inspectionOrderExportDto.setReportReceiver(express && insOrder != null && insOrder.getReportReceiver() != null
? insOrder.getReportReceiver() : "");
int sampleSource = inspectionOrder.getSampleSource() == null ? 1 : inspectionOrder.getSampleSource();
int receiveStatus = inspectionOrder.getReceiveStatus() == null ? 1 : inspectionOrder.getReceiveStatus();
int feeStatus = inspectionOrder.getFeeStatus() == null ? 2 : inspectionOrder.getFeeStatus();
inspectionOrderExportDto.setSourceSend(sampleSource == 1 ? "☑" : "□");
inspectionOrderExportDto.setSourceSample(sampleSource == 2 ? "☑" : "□");
inspectionOrderExportDto.setReceiveOk(receiveStatus == 1 ? "☑" : "□");
inspectionOrderExportDto.setReceiveDefect(receiveStatus == 2 ? "☑" : "□");
inspectionOrderExportDto.setReceiveReject(receiveStatus == 3 ? "☑" : "□");
inspectionOrderExportDto.setFeeReceived(feeStatus == 1 ? "☑" : "□");
inspectionOrderExportDto.setFeeUnpaid(feeStatus == 2 ? "☑" : "□");
inspectionOrderExportDto.setFeePrepaid(feeStatus == 3 ? "☑" : "□");
return inspectionOrderExportDto;
}
private static String buildDetailEntrustCode(String orderEntrustCode, String sampleNumber) {
if (StrUtil.isBlank(orderEntrustCode) || StrUtil.isBlank(sampleNumber)) {
return orderEntrustCode;
}
String trimmed = sampleNumber.trim();
String suffix = trimmed.length() >= 2 ? trimmed.substring(trimmed.length() - 2) : trimmed;
int index = orderEntrustCode.lastIndexOf('-');
return index < 0 ? orderEntrustCode : orderEntrustCode.substring(0, index + 1) + suffix;
}
/**
* 逐行委托编号:默认取样品编号后两位;出现重复或为空时用行号兜底,保证不重复。
*/
private static List buildDetailEntrustCodes(String orderEntrustCode, List details) {
List bases = details.stream()
.map(detail -> buildDetailEntrustCode(orderEntrustCode, detail.getSampleNumber()))
.map(base -> base == null ? "" : base)
.collect(Collectors.toList());
Map counts = new HashMap<>();
for (String base : bases) {
counts.merge(base, 1, Integer::sum);
}
String prefix = "";
if (StrUtil.isNotBlank(orderEntrustCode)) {
int index = orderEntrustCode.lastIndexOf('-');
prefix = index < 0 ? orderEntrustCode + "-" : orderEntrustCode.substring(0, index + 1);
}
Set used = new HashSet<>();
List result = new ArrayList<>();
for (int i = 0; i < bases.size(); i++) {
String base = bases.get(i);
String candidate = base;
if (StrUtil.isBlank(base) || counts.getOrDefault(base, 0) > 1 || used.contains(candidate)) {
int seq = i + 1;
candidate = prefix + String.format("%02d", seq);
while (used.contains(candidate)) {
seq += bases.size();
candidate = prefix + String.format("%02d", seq);
}
}
used.add(candidate);
result.add(candidate);
}
return result;
}
}