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.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.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 javax.annotation.Resource; import javax.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; /** * 检验委托单分页查询 * @param page * @param InspectionOrder * @return */ @Override public IPage pageInspectionOrder(Page page, InspectionOrder InspectionOrder) { return baseMapper.pageInspectionOrder(page, QueryWrappers.queryWrappers(InspectionOrder)); } /** * 检验委托单新增 * @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(inspectionOrder.getEntrustCode());//报告编号=委托编号 //页数 try { com.aspose.words.Document doc = new com.aspose.words.Document(path); processReport.setPages(doc.getPageCount()+""); } catch (Exception e) { } processReport.setNumber("1");//发送份数默认1 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()); } /** * 检验委托单修改 * @param InspectionOrder * @return */ @Override public boolean updateInspectionOrder(InspectionOrderDto InspectionOrder) { baseMapper.updateById(InspectionOrder); // 删除之前的详情 inspectionOrderDetailService.remove(Wrappers.lambdaQuery() .eq(InspectionOrderDetail::getInspectionOrderId, InspectionOrder.getInspectionOrderId())); // 新增详情 for (InspectionOrderDetail InspectionOrderDetail : InspectionOrder.getOrderDetailList()) { InspectionOrderDetail.setInspectionOrderId(InspectionOrder.getInspectionOrderId()); } inspectionOrderDetailService.saveBatch(InspectionOrder.getOrderDetailList()); //修改7.9报告结果 ProcessReport processReport = processReportService.getOne(Wrappers.lambdaQuery().eq(ProcessReport::getInspectionOrderId, InspectionOrder.getInspectionOrderId())); processReport.setInsReportCode(InspectionOrder.getEntrustCode());//报告编号=委托编号 processReportService.updateById(processReport); return true; } /** * 检验委托单删除 * @param inspectionOrderId * @return */ @Override public boolean delInspectionOrder(Integer inspectionOrderId) { inspectionOrderDetailService.remove(Wrappers.lambdaQuery() .eq(InspectionOrderDetail::getInspectionOrderId, inspectionOrderId)); baseMapper.deleteById(inspectionOrderId); //删除7.8报告 processReportService.remove(Wrappers.lambdaQuery() .eq(ProcessReport::getInspectionOrderId, inspectionOrderId)); //删除对应的设备使用记录 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; } /** * 检验委托单查看详情 * @param inspectionOrderId * @return */ @Override public InspectionOrderDto getInspectionOrderOne(Integer inspectionOrderId) { InspectionOrder inspectionOrder = baseMapper.selectById(inspectionOrderId); InspectionOrderDto inspectionOrderDto = new InspectionOrderDto(); BeanUtils.copyProperties(inspectionOrder, inspectionOrderDto); // 查询详细信息 inspectionOrderDto.setOrderDetailList(inspectionOrderDetailService.list(Wrappers.lambdaQuery() .eq(InspectionOrderDetail::getInspectionOrderId, inspectionOrderId))); 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());//报告发送方式 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) { InspectionOrder inspectionOrder = baseMapper.selectById(inspectionOrderId); InspectionOrderExportDto inspectionOrderExportDto = extracted(inspectionOrder); List list = inspectionOrderDetailService.list(Wrappers.lambdaQuery() .eq(InspectionOrderDetail::getInspectionOrderId, inspectionOrderId)); int index = 1; for (InspectionOrderDetail inspectionOrderDetail : list) { inspectionOrderDetail.setIndex(index); index++; } // 获取路径 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", list); }}); try { response.setContentType("application/msword"); String fileName = URLEncoder.encode( 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) { 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() == 0? "☑" : "□"); inspectionOrderExportDto.setSend0(inspectionOrder.getSend() != null && inspectionOrder.getSend() == 1? "☑" : "□"); inspectionOrderExportDto.setSend1(inspectionOrder.getSend() != null && inspectionOrder.getSend() == 0? "☑" : "□"); 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? "☑" : "□"); return inspectionOrderExportDto; } }