framework/src/main/java/com/yuanchu/mom/utils/QYWXApi.java
@@ -21,7 +21,7 @@ public static final String WWA_423654_B_975441_AC = "wwa423654b975441ac"; final String ip = "https://qyapi.weixin.qq.com/"; final String corpid = WWA_423654_B_975441_AC; final String corpsecret = "VfTV3D0BFWORlBm8grykUhloQSTM06mIXYEHUqr3UIc"; final String corpsecret = "rQ1_ddKBVW5qVSMNK_p0EnR3Z2OHrAMxGahBKTKWYxE"; /** inspect-server/src/main/java/com/yuanchu/mom/dto/InsReportDto.java
@@ -2,6 +2,7 @@ import lombok.Data; import javax.validation.constraints.NotNull; import java.util.List; @Data @@ -14,5 +15,6 @@ private Integer state; //选择的每个站点的第几次数据 @NotNull private List<InsReportDto1> insReportDto1s; } inspect-server/src/main/java/com/yuanchu/mom/dto/InsReportDto1.java
@@ -8,4 +8,6 @@ private String laboratory; private Integer num; private Integer insOrderUsersId; } inspect-server/src/main/java/com/yuanchu/mom/mapper/InsOrderFileMapper.java
@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yuanchu.mom.pojo.InsOrderFile; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Param; /** * <p> @@ -16,5 +17,5 @@ */ public interface InsOrderFileMapper extends BaseMapper<InsOrderFile> { IPage<InsOrderFile> getFileList(Page page, QueryWrapper<InsOrderFile> ew); IPage<InsOrderFile> getFileList(@Param("page") Page page, @Param("ew") QueryWrapper<InsOrderFile> ew , @Param("insOrderId") Integer insOrderId); } inspect-server/src/main/java/com/yuanchu/mom/mapper/InsSampleMapper.java
@@ -60,6 +60,8 @@ //查询且过滤出有电路试验的样品 List<InsSample> selectSample(Integer insOrderId); List<SampleProductDto> selectList1(Integer id); } inspect-server/src/main/java/com/yuanchu/mom/service/impl/InsOrderPlanServiceImpl.java
@@ -204,8 +204,22 @@ //样品 insProducts = insSampleMapper.getInsProduct1(id, laboratory); if (insProducts.size() == 0) { insProducts = insSampleMapper.getIns2Product1(id, laboratory); insProducts = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery() .eq(InsProduct::getInsSampleId, id) .eq(InsProduct::getState, 1) .eq(InsProduct::getSonLaboratory, laboratory)); for (InsProduct insProduct : insProducts) { List<InsProductResult2> insProductResult2List = insProductResult2Mapper.selectList(Wrappers.<InsProductResult2>lambdaQuery() .eq(InsProductResult2::getInsProductId, insProduct.getId()).isNull(InsProductResult2::getNum)); insProduct.setInsProductResult2(insProductResult2List); InsProductResult insProductResult = insProductResultMapper.selectOne(Wrappers.<InsProductResult>lambdaQuery() .eq(InsProductResult::getInsProductId, insProduct.getId()).isNull(InsProductResult::getNum)); insProduct.setInsProductResult(insProductResult); } } /*if (insProducts.size() == 0) { insProducts = insSampleMapper.getIns2Product1(id, laboratory); }*/ break; case 1: //光纤带 @@ -274,7 +288,9 @@ public Map<String, Object> getFileList(Page page, InsOrderFile insOrderFile) { Map<String, Object> map = new HashMap<>(); map.put("head", PrintChina.printChina(InsOrderFile.class)); IPage<InsOrderFile> insOrderFileIPage = insOrderFileMapper.getFileList(page, QueryWrappers.queryWrappers(insOrderFile)); Integer insOrderId = insOrderFile.getInsOrderId(); insOrderFile.setInsOrderId(null); IPage<InsOrderFile> insOrderFileIPage = insOrderFileMapper.getFileList(page, QueryWrappers.queryWrappers(insOrderFile), insOrderId); map.put("body", insOrderFileIPage); return map; } @@ -393,13 +409,15 @@ //判断该订单是否站点任务有(继续试验或者是结束试验) List<InsOrderState> orderStates = insOrderStateMapper.selectList(Wrappers.<InsOrderState>lambdaQuery() .eq(InsOrderState::getInsOrderId, insSample.getInsOrderId()) .and(wrapper -> wrapper .eq(InsOrderState::getInsState, 5) .or() .eq(InsOrderState::getInsState, 6) )); .eq(InsOrderState::getInsState, 5)); if (CollectionUtils.isEmpty(orderStates)) { throw new ErrorException("该样品的检验任务还没有结束试验,暂时无法出库!"); List<InsOrderState> orderStates1 = insOrderStateMapper.selectList(Wrappers.<InsOrderState>lambdaQuery() .eq(InsOrderState::getInsOrderId, insSample.getInsOrderId()) .eq(InsOrderState::getLaboratory, sonLaboratory) .eq(InsOrderState::getInsState, 6)); if (CollectionUtils.isEmpty(orderStates1)) { throw new ErrorException("该样品的检验任务还没有结束试验或继续试验,暂时无法出库!"); } } warehouseService.outWarehouse(sampleCode); return 0; @@ -857,7 +875,6 @@ Integer userId = getLook.selectPowerByMethodAndUserId(null).get("userId"); List<InsUnPass> insUnPasses = new ArrayList<>(); /*样品下的项目只要有一个项目不合格则检验结果为0,否则为1*/ //这里的insSamples是订单下的所有样品包括("/") List<InsSample> samples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery().eq(InsSample::getInsOrderId, orderId)); for (InsSample insSample : samples) { List<InsProduct> insProducts = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery() @@ -935,6 +952,14 @@ //如果订单类型是原理样机,则该订单直接闭环 InsOrder insOrder = insOrderMapper.selectById(orderId); if (insOrder.getFormType().equals("原理样机")) { for (InsSample sample : samples) { //出库 try{ outInsOrderState(laboratory,sample.getSampleCode()); }catch (Exception e){ } } insOrder.setState(4); insOrderMapper.updateById(insOrder); } @@ -1032,8 +1057,8 @@ .eq(InsOrderState::getLaboratory, submitPlanDto.getLaboratory()) .set(InsOrderState::getInsState, 3) .set(InsOrderState::getVerifyUser, submitPlanDto.getVerifyUser())); InsOrder insOrder = insOrderMapper.selectById(submitPlanDto.getOrderId()); /*这个情况先关闭----如果是C类订单且是下发到质量部,则直接复核通过(结束试验)*/ // InsOrder insOrder = insOrderMapper.selectById(orderId); // if (insOrder.getOrderType().equals("C") && insOrder.getDepartmentLims().equals("质量部")) { // try { // verifyPlan(orderId, laboratory, 2, null); @@ -1056,14 +1081,14 @@ //todo 企业微信消息推送@zss /* HashMap<String, Object> map = new HashMap<>(); String account = userMapper.selectById(userId).getAccount(); map.put("touser", *//*account*//*"ZT-012117");//接收消息成员的账号'ZT-031292'这种类型(如果有多个用'|'分隔) map.put("touser", account);//接收消息成员的账号'ZT-031292'这种类型(如果有多个用'|'分隔) map.put("toparty", "");//接收部门id map.put("totag", "");//消息标签id map.put("msgtype", "text");//消息类型 text:文本 map.put("agentid", 1000513);//应用id map.put("agentid", 1000517);//应用id HashMap<String, Object> hashMap = new HashMap<>(); hashMap.put("content", "您有一条检验任务待复核消息,请前往LIMS系统查看。<a href=\"http://10.1.13.77/enter\"> </a>"); map.put("text", JSONArray.toJSONString(hashMap));//消息内容 hashMap.put("content", "您有一条检验任务待复核消息,订单号是:"+insOrder.getEntrustCode()+",请前往LIMS系统查看。<a href=\"https://ztwxlims.ztt.cn:7443/enter\">中天通信LIMS系统 </a>"); map.put("text", hashMap);//消息内容 map.put("safe", 0);//是否保密消息.0否 map.put("enable_id_trans", 0);//是否开启id转译.0否 map.put("enable_duplicate_check", 0);//是否开启重复消息检查.0否 @@ -1093,19 +1118,18 @@ });*/ /*生成电路试验的站点报告并上传到附件中*/ if (submitPlanDto.getLaboratory().equals("电路试验")) { try { wordUtils.generateWord(submitPlanDto.getNote(), submitPlanDto.getTerm(), orderState); } catch (Exception e) { throw new ErrorException("电路试验的站点报告生成有误,请联系开发人员调整!"); } // try { // wordUtils.generateWord(submitPlanDto.getNote(), submitPlanDto.getTerm(), orderState); // } catch (Exception e) { // throw new ErrorException("电路试验的站点报告生成有误,请联系开发人员调整!"); // } } /*// 删除数采采集次数 String key = "frequency" + ":" + submitPlanDto.getEntrustCode() + ":*"; RedisUtil.delsLike(key);*/ /*生成产量工时*/ //查询检验单信息 InsOrder insOrder = insOrderMapper.selectById(submitPlanDto.getOrderId()); //校验如果这个人这个检测项目已经添加过了则不需要再新增 //首先判断当前人的当前时间是否是排班时间内,如果不是就是加班 LocalDateTime today = LocalDateTime.of(LocalDate.now(), LocalTime.MIDNIGHT); inspect-server/src/main/java/com/yuanchu/mom/service/impl/InsOrderServiceImpl.java
@@ -74,6 +74,10 @@ @Resource private InsSampleMapper insSampleMapper; @Resource InsProductResult2Mapper insProductResult2Mapper; @Resource InsProductResultMapper insProductResultMapper; @Resource private WarehouseHistoryMapper warehouseHistoryMapper; @Resource private InsProductMapper insProductMapper; @@ -322,27 +326,22 @@ if (insOrder.getState() == 1) { //审核通过才会生成委托编号 insOrder.setEntrustCode(giveCode.giveCode2("WT-", "ins_order", "-", "yyMMdd")); //确定订单的下发时间和约定时间 //int day = insProductService.selectOrderManDay(insOrder.getId());//预计完成时间 //insOrder.setAppointed(LocalDate.parse(LocalDateTime.now().plusHours(day).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))); insOrder.setSendTime(LocalDateTime.now()); /*todo 根据订单类型判断是否需要推送企业微信 @zss*/ if (!order.getFormType().equals("其他成品")) { /* HashMap<String, Object> map = new HashMap<>(); /*if (!order.getFormType().equals("其他成品")) { String account = userMapper.selectById(order.getIssueUser()).getAccount(); HashMap<String, Object> map = new HashMap<>(); map.put("touser", account);//接收消息成员的账号'ZT-031292'这种类型(如果有多个用'|'分隔) map.put("toparty", "");//接收部门id map.put("totag", "");//消息标签id map.put("msgtype", "text");//消息类型 text:文本 map.put("agentid", 1000513);//应用id map.put("agentid", 1000517);//应用id HashMap<String, Object> hashMap = new HashMap<>(); hashMap.put("content", "您有一条订单需生成检验,请前往LIMS系统查看。<a href=\"http://10.1.13.77/enter\"> </a>"); map.put("text", JSONArray.toJSONString(hashMap));//消息内容 hashMap.put("content", "您有一条订单需要完成,请前往LIMS系统查看。订单号是:"+order.getEntrustCode()+",请前往LIMS系统查看。<a href=\"https://ztwxlims.ztt.cn:7443/enter\">中天通信LIMS系统 </a>"); map.put("text", hashMap);//消息内容 map.put("safe", 0);//是否保密消息.0否 map.put("enable_id_trans", 0);//是否开启id转译.0否 map.put("enable_duplicate_check", 0);//是否开启重复消息检查.0否 qywxApi.send(map);*/ } qywxApi.send(map); }*/ } return insOrderMapper.updateById(insOrder); } @@ -399,9 +398,31 @@ public Map<String, Object> getInsOrderAndSample(Integer id, String laboratory) { Map<String, Object> map = new HashMap<>(); InsOrder insOrder = insOrderMapper.selectById2(id); List<SampleProductDto> insSamples = insSampleMapper.selectList1(insOrder.getId()); List<SampleProductDto> list = insSampleMapper.getInsOrderAndSample(id, laboratory); if (list.size() == 0) { list = insSampleMapper.getInsOrderAndSample2(id, laboratory); //再次试验会出现为空的情况 if (list.size() != insSamples.size()) { List<Integer> ids = list.stream().map(sampleProductDto -> sampleProductDto.getId()).distinct().collect(Collectors.toList()); List<SampleProductDto> samples = insSamples.stream().filter(insSample -> !ids.contains(insSample.getId()) ).collect(Collectors.toList()); for (SampleProductDto insSample : samples) { List<InsProduct> insProducts = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery() .eq(InsProduct::getInsSampleId, insSample.getId()) .eq(InsProduct::getState, 1) .eq(InsProduct::getSonLaboratory, laboratory)); for (InsProduct insProduct : insProducts) { List<InsProductResult2> insProductResult2List = insProductResult2Mapper.selectList(Wrappers.<InsProductResult2>lambdaQuery() .eq(InsProductResult2::getInsProductId, insProduct.getId()).isNull(InsProductResult2::getNum)); insProduct.setInsProductResult2(insProductResult2List); InsProductResult insProductResult = insProductResultMapper.selectOne(Wrappers.<InsProductResult>lambdaQuery() .eq(InsProductResult::getInsProductId, insProduct.getId()).isNull(InsProductResult::getNum)); insProduct.setInsProductResult(insProductResult); } insSample.setInsProduct(insProducts); list.add(insSample); } } for (SampleProductDto sampleProductDto : list) { List<Integer> ids = sampleProductDto.getInsProduct().stream().map(InsProduct::getId).collect(Collectors.toList()); inspect-server/src/main/java/com/yuanchu/mom/service/impl/InsReportServiceImpl.java
@@ -17,6 +17,7 @@ import com.deepoove.poi.data.*; import com.deepoove.poi.data.style.*; import com.deepoove.poi.data.style.Style; import com.deepoove.poi.data.style.TableStyle; import com.deepoove.poi.util.TableTools; import com.itextpdf.text.BadElementException; import com.itextpdf.text.DocumentException; @@ -37,9 +38,12 @@ import com.yuanchu.mom.utils.JackSonUtil; import com.yuanchu.mom.utils.MatrixToImageWriter; import com.yuanchu.mom.utils.QueryWrappers; import com.yuanchu.mom.utils.WordUtils; import com.yuanchu.mom.vo.Result; import org.apache.commons.io.IOUtils; import org.apache.logging.log4j.util.Strings; import org.apache.poi.xwpf.usermodel.*; import org.apache.poi.xwpf.usermodel.ParagraphAlignment; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.ClassPathResource; import org.springframework.stereotype.Service; @@ -103,6 +107,9 @@ private InsOrderStateMapper insOrderStateMapper; @Resource WordUtils wordUtils; @Resource private InsProductMapper insProductMapper; @Resource @@ -110,6 +117,9 @@ @Resource private InsProductResult2Mapper insProductResult2Mapper; @Resource private InsOrderUserMapper insOrderUserMapper; @Resource private InsSampleMapper insSampleMapper; @@ -380,7 +390,8 @@ Long count = insOrderStateMapper.selectCount(Wrappers.<InsOrderState>lambdaQuery().eq(InsOrderState::getInsOrderId, insReportDto.getId()).eq(InsOrderState::getInsState, 5)); if (count > 0) { if (insReportDto.getState() == 1) { generateReport(insReportDto.getId(), insReportDto.getInsReportDto1s()); List<InsReportDto1> insReportDto1s = insReportDto.getInsReportDto1s(); wordUtils.generateReport(insReportDto.getId(), insReportDto1s); } else { //结束订单 InsOrder insOrder = new InsOrder(); @@ -593,370 +604,6 @@ over.addImage(img); } stamp.close(); } //生成报告 private void generateReport(Integer orderId, List<InsReportDto1> insReportDto1s) { LocalDateTime now = LocalDateTime.now(); InsOrder insOrder = insOrderMapper.selectById(orderId); //委托部门 departLims String departLims = userMapper.selectDepartLims(insOrder.getPrepareUser()); //samples是过滤掉没有检验项目的样品 List<SampleProductDto> samples = insSampleMapper.selectSampleProductListByOrderId(orderId); String sampleCode = samples.get(0).getSampleCode(); InsReport insReport = new InsReport(); insReport.setCode(insOrder.getEntrustCode().replace("WT","TXJC")); insReport.setInsOrderId(orderId); List<Map<String, Object>> tables = new ArrayList<>(); Set<String> standardMethod = new HashSet<>(); Set<String> deviceSet = new HashSet<>(); Set<String> models = new HashSet<>(); AtomicReference<Integer> productSize = new AtomicReference<>(0); AtomicReference<Integer> productSize1 = new AtomicReference<>(0); AtomicReference<Integer> productSize2 = new AtomicReference<>(0); AtomicReference<Integer> productSize3 = new AtomicReference<>(0); String[] monthNames = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; samples.forEach(s -> { models.add(s.getModel()); standardMethod.addAll(standardMethodListMapper.selectList(Wrappers.<StandardMethodList>lambdaQuery() .in(StandardMethodList::getId,Arrays.stream(s.getStandardMethodListId().replaceAll("[\\[\\]]", "").split(",")) .map(String::trim).map(Integer::parseInt).collect(Collectors.toList()))).stream().map(aa->{return aa.getCode()+" "+aa.getName();}).distinct().collect(Collectors.toList())); //总数 Long productCount = insProductMapper.selectCount(Wrappers.<InsProduct>lambdaQuery() .eq(InsProduct::getInsSampleId, s.getId())); productSize.set(productSize.get() + Integer.parseInt(productCount + "")); //不判定 Long productCount1 = insProductMapper.selectCount(Wrappers.<InsProduct>lambdaQuery() .eq(InsProduct::getInsSampleId, s.getId()) .eq(InsProduct::getInsResult, 3)); productSize1.set(productSize1.get() + Integer.parseInt(productCount1 + "")); //不合格 Long productCount2 = insProductMapper.selectCount(Wrappers.<InsProduct>lambdaQuery() .eq(InsProduct::getInsSampleId, s.getId()) .eq(InsProduct::getInsResult, 0)); productSize2.set(productSize2.get() + Integer.parseInt(productCount2 + "")); //合格 Long productCount3 = insProductMapper.selectCount(Wrappers.<InsProduct>lambdaQuery() .eq(InsProduct::getInsSampleId, s.getId()) .eq(InsProduct::getInsResult, 1)); productSize3.set(productSize3.get() + Integer.parseInt(productCount3 + "")); //将项目按照站点进行分类 Map<String, List<InsProduct>> listMap = s.getInsProduct().stream().collect(Collectors.groupingBy(InsProduct::getLaboratory)); // 创建一个 Map 将站点和项目ID的映射关系 Map<String, Set<Integer>> labToDeviceMap = new HashMap<>(); // 获取所有站点的项目ID 列表 for (Map.Entry<String, List<InsProduct>> entry : listMap.entrySet()) { Set<Integer> deviceIds = entry.getValue().stream() .map(InsProduct::getId) .collect(Collectors.toSet()); labToDeviceMap.put(entry.getKey(), deviceIds); } for (InsReportDto1 insReportDto1 : insReportDto1s) { String laboratory = insReportDto1.getLaboratory(); if (!labToDeviceMap.containsKey(laboratory)) { continue; } Set<Integer> deviceIds = labToDeviceMap.get(laboratory); Integer num = insReportDto1.getNum(); List<InsProductResult> insProductResults = insProductResultMapper.selectList( Wrappers.<InsProductResult>lambdaQuery() .eq(InsProductResult::getNum, num) .in(InsProductResult::getInsProductId, deviceIds)); for (InsProductResult insProductResult : insProductResults) { List<JSONObject> jsonObjects = JSON.parseArray(insProductResult.getEquipValue(), JSONObject.class); for (JSONObject jsonObject : jsonObjects) { String value = jsonObject.getString("v"); if (value != null && !value.isEmpty()) { deviceSet.add(value); } } } List<InsProductResult2> insProductResult2s = insProductResult2Mapper.selectList( Wrappers.<InsProductResult2>lambdaQuery() .eq(InsProductResult2::getNum, num) .in(InsProductResult2::getInsProductId, deviceIds)); for (InsProductResult2 result2 : insProductResult2s) { String equipValue = result2.getEquipValue(); if (equipValue != null && !equipValue.isEmpty()) { deviceSet.add(equipValue); } } } }); String url; try { InputStream inputStream = this.getClass().getResourceAsStream("/static/report-template.docx"); File file = File.createTempFile("temp", ".tmp"); OutputStream outputStream = new FileOutputStream(file); IOUtils.copy(inputStream, outputStream); url = file.getAbsolutePath(); } catch (FileNotFoundException e) { throw new ErrorException("找不到模板文件"); } catch (IOException e) { throw new RuntimeException(e); } StringBuilder standardMethod2 = new StringBuilder(); for (String s : standardMethod) { standardMethod2.append(";\n").append(s); } standardMethod2.append(";\n").append("GB/T 9410-2008 《移动通信天线通用技术规范》"); standardMethod2.replace(0, 1, ""); tables.forEach(table -> { table.put("tableSize", tables.size() + 1); }); List<Map<String, String>> deviceList = null; if (deviceSet.size() != 0) { deviceList = insOrderMapper.selectDeviceList(deviceSet); } Map<String, String> codeStr = new HashMap<>(); codeStr.put("报告编号", insReport.getCode()); codeStr.put("样品名称", insOrder.getSample()); codeStr.put("规格型号", samples.get(0).getModel()); codeStr.put("发放日期", now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); String codePath; try { codePath = new MatrixToImageWriter().code(JackSonUtil.marshal(codeStr).replaceAll("\\{", "") .replaceAll("}", "").replaceAll(",", "").replaceAll("\"", ""), twoCode); } catch (Exception e) { throw new RuntimeException(e); } String modelStr = ""; for (String model : models) { modelStr += "," + model; } String finalModelStr = modelStr; String sampleEn = insSampleMapper.getSampleEn(insOrder.getSample()); String orderType = insOrderMapper.getEnumLabelByValue(insOrder.getOrderType()); String formType = insOrderMapper.getEnumLabelByValue(insOrder.getFormType()); ConfigureBuilder builder = Configure.builder(); builder.useSpringEL(true); List<Map<String, String>> finalDeviceList = deviceList; List<Map<String, String>> sampleList = insSampleMapper.selectSampleList(orderId); Integer userId = insSampleUserMapper.selectOne(Wrappers.<InsSampleUser>lambdaQuery() .eq(InsSampleUser::getInsSampleId, orderId).last("limit 1")).getUserId(); String signatureUrl; try { signatureUrl = userMapper.selectById(userId).getSignatureUrl(); } catch (Exception e) { throw new ErrorException("找不到检验人的签名"); } if (ObjectUtils.isEmpty(signatureUrl) || signatureUrl.equals("")) { throw new ErrorException("找不到检验人的签名"); } Custom custom = customMapper.selectById(insOrder.getCompanyId()); /*获取附件图片类型*/ List<Map<String, Object>> images = new ArrayList<>(); List<InsOrderFile> insOrderFiles = insOrderFileMapper.selectList(Wrappers.<InsOrderFile>lambdaQuery().eq(InsOrderFile::getType, 1).eq(InsOrderFile::getInsOrderId, orderId)); if (CollectionUtils.isNotEmpty(insOrderFiles)) { insOrderFiles.forEach(insOrderFile -> { Map<String, Object> image = new HashMap<>(); PictureRenderData pictureRenderData = Pictures.ofLocal(imgUrl + "/" + insOrderFile.getFileUrl()).sizeInCm(17, 20).create(); image.put("url", pictureRenderData); image.put("report", insReport); images.add(image); }); } //委托人和电话字段判断 if (ObjectUtils.isEmpty(insOrder.getPrepareUser())) { insOrder.setPrepareUser("/"); } if (ObjectUtils.isEmpty(insOrder.getPhone())) { insOrder.setPhone("/"); } //检验项目的环境 InsProduct insProduct = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery().eq(InsProduct::getState, 1).eq(InsProduct::getInsSampleId, samples.get(0).getId())).get(0); String environment = ""; environment = (ObjectUtils.isNotEmpty(insProduct.getTemperature()) ? insProduct.getTemperature() + "℃ " : "") + (ObjectUtils.isNotEmpty(insProduct.getHumidity()) ? insProduct.getHumidity() + "%" : ""); String finalEnvironment = environment; List<SampleProductDto> finalSamples = samples; XWPFTemplate template = XWPFTemplate.compile(url, builder.build()).render( new HashMap<String, Object>() {{ put("order", insOrder); put("report", insReport); put("departLims", departLims); put("sampleCode", sampleCode); put("environment", finalEnvironment); put("custom", custom); put("sampleSize", finalSamples.size()); put("tables", tables); put("tableSize", tables.size() + 1); put("standardMethod", (standardMethod2.toString().equals("null") ? "" : standardMethod2)); put("deviceList", finalDeviceList); put("sampleList", sampleList); put("twoCode", Pictures.ofLocal(codePath).create()); put("models", finalModelStr.replace(",", "")); put("productSize", productSize); put("productSize1", productSize1); put("productSize2", productSize2); put("productSize3", productSize3); put("createTime", now.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"))); put("createTimeEn", monthNames[now.getMonthValue() - 1] + " " + now.getDayOfMonth() + ", " + now.getYear()); put("insTime", insOrder.getInsTime().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"))); put("insTimeEn", monthNames[insOrder.getInsTime().getMonthValue() - 1] + " " + insOrder.getInsTime().getDayOfMonth() + ", " + insOrder.getInsTime().getYear()); put("writeUrl", null); put("insUrl", Pictures.ofLocal(imgUrl + "/" + signatureUrl).create()); put("images", images); put("examineUrl", null); put("ratifyUrl", null); put("sampleEn", sampleEn); put("orderType", orderType); put("getTime", insOrder.getExamineTime().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"))); put("getTimeEn", monthNames[insOrder.getExamineTime().getMonthValue() - 1] + " " + insOrder.getExamineTime().getDayOfMonth() + ", " + insOrder.getExamineTime().getYear()); put("seal1", null); put("seal2", null); put("formTypeCh", formType); put("formTypeEn", insOrder.getFormType()); }}); try { String name = insReport.getCode().replace("/", "") + ".docx"; template.writeAndClose(Files.newOutputStream(Paths.get(wordUrl + "/" + name))); insReport.setUrl("/word/" + name); insReportMapper.insert(insReport); insOrder.setInsState(5); insOrderMapper.updateById(insOrder); } catch (IOException e) { throw new RuntimeException(e); } // 处理合并单元格的问题 String path = wordUrl + "/" + insReport.getCode().replace("/", "") + ".docx"; try { FileInputStream stream = new FileInputStream(path); XWPFDocument document = new XWPFDocument(stream); List<XWPFTable> xwpfTables = document.getTables(); for (int i = 1; i < xwpfTables.size() - (deviceList == null ? 1 : 2); i++) { Set<String> set1 = new HashSet<>(); Map<String, Map<String, Integer>> maps = new HashMap<>(); for (int j = 0; j < xwpfTables.get(i).getRows().size(); j++) { for (int k = 0; k < xwpfTables.get(i).getRows().get(j).getTableCells().size(); k++) { if (xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().indexOf("∑") > -1) { String[] split = xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().split("∑"); if (set1.add(split[1])) { Map<String, Integer> map = new HashMap<>(); map.put("sr", j); map.put("sc", k); map.put("er", j + 0); map.put("ec", k + 0); maps.put(split[1], map); } else { Map<String, Integer> map1 = maps.get(split[1]); if (j == map1.get("sr")) { map1.put("ec", map1.get("ec") + 1); } else if (k == map1.get("sc")) { map1.put("er", map1.get("er") + 1); } } String str = xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().split("∑")[0]; xwpfTables.get(i).getRows().get(j).getTableCells().get(k).removeParagraph(0); xwpfTables.get(i).getRows().get(j).getTableCells().get(k).setText(str); xwpfTables.get(i).getRows().get(j).getTableCells().get(k).setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER); xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getParagraphArray(0).setAlignment(org.apache.poi.xwpf.usermodel.ParagraphAlignment.CENTER); } } } List<String> list = new ArrayList<>(); for (String s : maps.keySet()) { list.add(s); } for (int a = list.size() - 1; a >= 0; a--) { Map<String, Integer> v = maps.get(list.get(a)); for (int j = 0; j < v.get("er") - v.get("sr") + 1; j++) { if (v.get("ec") > v.get("sc")) { try { TableTools.mergeCellsHorizonal(xwpfTables.get(i), v.get("sr") + j, v.get("sc"), v.get("ec")); } catch (Exception e) { } } } if (v.get("er") > v.get("sr")) { try { TableTools.mergeCellsVertically(xwpfTables.get(i), v.get("sc"), v.get("sr"), v.get("er")); } catch (Exception e) { } } } } FileOutputStream fileOutputStream = new FileOutputStream(path); document.write(fileOutputStream); fileOutputStream.close(); } catch (FileNotFoundException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } //处理中英文换行的问题 try { FileInputStream stream1 = new FileInputStream(path); XWPFDocument document1 = new XWPFDocument(stream1); List<XWPFTable> xwpfTables1 = document1.getTables(); for (int i = 1; i < xwpfTables1.size() - (deviceList == null ? 1 : 2); i++) { for (int j = 0; j < xwpfTables1.get(i).getRows().size(); j++) { for (int k = 0; k < xwpfTables1.get(i).getRows().get(j).getTableCells().size(); k++) { if (xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getText().contains("@")) { String text = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getText(); String[] split = text.split("@"); xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).removeParagraph(0); XWPFParagraph xwpfParagraph = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).addParagraph(); XWPFRun run = xwpfParagraph.createRun(); run.setText(split[0]); if (ObjectUtils.isNotNull(split[1])) { run.addBreak(); run.setText(split[1]); } xwpfParagraph.setAlignment(org.apache.poi.xwpf.usermodel.ParagraphAlignment.CENTER); } } } } FileOutputStream fileOutputStream1 = new FileOutputStream(path); document1.write(fileOutputStream1); fileOutputStream1.close(); } catch (FileNotFoundException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } } // 计算行高的方法 private int calculateRowHeight(RowRenderData rowRenderData) { // 实现计算逻辑,可能需要根据单元格内容和字体等参数进行计算 int height = 0; for (CellRenderData cell : rowRenderData.getCells()) { int cellHeight = estimateCellHeight(cell); // 根据内容估算单元格高度 if (cellHeight > height) { height = cellHeight; } } return height; } //根据单元格的文本内容计算实际行高 private int estimateCellHeight(CellRenderData cellRenderData) { // 假设默认行高是40 int defaultHeight = 40; // 获取单元格中的所有段落 List<ParagraphRenderData> paragraphs = cellRenderData.getParagraphs(); int estimatedHeight = 0; // 遍历段落,估算每个段落的高度 for (ParagraphRenderData paragraph : paragraphs) { List<RenderData> contents = paragraph.getContents(); for (RenderData content : contents) { if (content instanceof TextRenderData) { TextRenderData text = (TextRenderData) content; Style style = text.getStyle(); // 假设每行文本的高度为字体大小的1.2倍 Double fontSize = Objects.isNull(style.getFontSize()) ? 12.0 : style.getFontSize(); int lines = (int) Math.ceil(text.getText().length() / 15.0); // 假设每行约15个字符 int textHeight = (int) (fontSize * 1.2 * lines); // 累加段落的高度 estimatedHeight += textHeight; } } } // 返回最大值,确保高度不低于默认高度 return Math.max(estimatedHeight, defaultHeight); } } inspect-server/src/main/java/com/yuanchu/mom/utils/WordUtils.java
@@ -1,5 +1,8 @@ package com.yuanchu.mom.utils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.deepoove.poi.XWPFTemplate; @@ -8,6 +11,8 @@ import com.deepoove.poi.data.*; import com.deepoove.poi.data.style.*; import com.deepoove.poi.util.TableTools; import com.yuanchu.mom.dto.InsReportDto1; import com.yuanchu.mom.dto.SampleProductDto; import com.yuanchu.mom.exception.ErrorException; import com.yuanchu.mom.mapper.*; import com.yuanchu.mom.pojo.*; @@ -24,8 +29,11 @@ import java.io.*; import java.nio.file.Files; import java.nio.file.Paths; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; @Component @@ -41,7 +49,22 @@ private InsOrderFileMapper insOrderFileMapper; @Resource CustomMapper customMapper; @Value("${file.path}") private String imgUrl; @Resource InsReportMapper insReportMapper; @Resource private InsSampleMapper insSampleMapper; @Resource StandardMethodListMapper standardMethodListMapper; @Value("${twoCode}") private String twoCode; @Resource private InsProductMapper insProductMapper; @@ -49,12 +72,20 @@ @Resource private InsProductResult2Mapper insProductResult2Mapper; @Resource private InsProductResultMapper insProductResultMapper; //生成报告 @Resource UserMapper userMapper; @Resource InsSampleUserMapper insSampleUserMapper; //生成站点电路试验报告 public void generateWord(String note, String term, InsOrderState insOrderState) { AtomicInteger lable = new AtomicInteger(1); AtomicInteger index = new AtomicInteger(); Set<String> itemSet = new HashSet<>(); String title = term + "电路参数"; List<Map<String, Object>> tables = new ArrayList<>(); //查询订单 @@ -84,7 +115,10 @@ } } //频点数 long often = insProductResult2s.stream().filter(insProductResult2 -> ObjectUtils.isNotEmpty(insProductResult2.getOften())).distinct().count(); long often = insProductResult2s.stream().filter(insProductResult2 -> insProductResult2.getFrequency().equals(s)) .filter(insProductResult2 -> insProductMapper.selectById(insProductResult2.getInsProductId()).getInspectionItemSubclass().equals("互调") ).filter(insProductResult2 -> ObjectUtils.isNotEmpty(insProductResult2.getOften())).distinct().count(); List<String> inspectionItemSubclass = insProducts.stream().map(InsProduct::getInspectionItemSubclass).collect(Collectors.toList()); //行数 int aa = 0; @@ -150,6 +184,7 @@ } } List<RowRenderData> rows = new ArrayList<>(); Set<String> itemSet = new HashSet<>(); int cc = 0; int dd = 0; int ee = 0; @@ -273,10 +308,18 @@ if (i % 2 == 0) { //最差值 String value = result2s.get(0).getValue().replaceAll("[\\[\\]\"]", ""); try { textRenderData.setText(value.split(",")[(j - 5) + (i - 1) / 2 * (Math.min(ports, 8))]); } catch (Exception e) { textRenderData.setText(""); } } else { //端口 try { textRenderData.setText(result2s.get(0).getPort().split(",")[(j - 5) + (i / 2) * (Math.min(ports, 8))]); } catch (Exception e) { textRenderData.setText(""); } } renderData.add(textRenderData); paragraphRenderData.setContents(renderData); @@ -353,7 +396,11 @@ cells.add(cellRenderData); } else if (j % 2 == 0) { String value = result2s.get(0).getValue().replaceAll("[\\[\\]\"]", ""); try { textRenderData.setText(value.split(",")[(j - 6) / 2 + (i - cc - 1) * 4] + "∑5" + i + (j - 6)); } catch (Exception e) { textRenderData.setText(""); } renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); @@ -361,7 +408,11 @@ cells.add(cellRenderData); } else { String value = result2s.get(0).getValue().replaceAll("[\\[\\]\"]", ""); try { textRenderData.setText(value.split(",")[(j - 5) / 2 + (i - cc - 1) * 4] + "∑5" + i + (j - 5)); } catch (Exception e) { textRenderData.setText(""); } renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); @@ -437,7 +488,11 @@ cells.add(cellRenderData); } else if (j % 2 == 0) { String value = result2s.get(0).getValue().replaceAll("[\\[\\]\"]", ""); try { textRenderData.setText(value.split(",")[(j - 6) / 2 + (i - (dd == 0 ? cc : dd) - 1) * 4] + "∑5" + i + (j - 6)); } catch (Exception e) { textRenderData.setText(""); } renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); @@ -445,7 +500,11 @@ cells.add(cellRenderData); } else { String value = result2s.get(0).getValue().replaceAll("[\\[\\]\"]", ""); try { textRenderData.setText(value.split(",")[(j - 5) / 2 + (i - (dd == 0 ? cc : dd) - 1) * 4] + "∑5" + i + (j - 5)); } catch (Exception e) { textRenderData.setText(""); } renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); @@ -528,11 +587,15 @@ cells.add(cellRenderData); } else { if ((i - (ee == 0 ? ((dd == 0 ? cc : dd)) : ee)) % (angles + 1) == 1) { textRenderData.setText(result2s.get((i - (ee == 0 ? ((dd == 0 ? cc : dd)) : ee)) / (2 * (angles + 1))).getOften() + "∑6" + index); textRenderData.setText(result2s.get((i - (ee == 0 ? ((dd == 0 ? cc : dd)) : ee)) / portRow / (angles + 1)).getOften() + "∑6" + i + index); } else { String[] value = result2s.get((i - (ee == 0 ? ((dd == 0 ? cc : dd)) : ee)) / (2 * (angles + 1))).getValue().split("\\],\\["); String[] value = result2s.get((i - (ee == 0 ? ((dd == 0 ? cc : dd)) : ee)) / portRow / (angles + 2)).getValue().split("\\],\\["); String[] split = value[(i - (ee == 0 ? ((dd == 0 ? cc : dd)) : ee) - 2) % (angles + 1)].replaceAll("[\\[\\]\"]", "").split(","); textRenderData.setText(split[(j - 5) + ((i - (ee == 0 ? ((dd == 0 ? cc : dd)) : ee) + (angles - 1)) / (angles + 1) - 1) * (Math.min(ports, 8))]); try { textRenderData.setText(split[((j - 5) + ((i - (ee == 0 ? ((dd == 0 ? cc : dd)) : ee) - 1) / (angles + 1) % portRow) * (Math.min(ports, 8)))]); } catch (Exception e) { textRenderData.setText(""); } } renderData.add(textRenderData); paragraphRenderData.setContents(renderData); @@ -622,12 +685,20 @@ //其余列 if (i % (angles + 1) == 1) { //端口 try { textRenderData.setText(result2s.get(0).getPort().split(",")[(j - 5) + (i / (angles + 1)) * (Math.min(ports, 8))]); } catch (Exception e) { textRenderData.setText(""); } } else { //最差值 String[] value = result2s.get(0).getValue().split("\\],\\["); String[] split = value[(i + (angles - 1)) % (angles + 1)].replaceAll("[\\[\\]\"]", "").split(","); try { textRenderData.setText(split[(j - 5) + ((i + (angles - 1)) / (angles + 1) - 1) * (Math.min(ports, 8))]); } catch (Exception e) { textRenderData.setText(""); } } renderData.add(textRenderData); paragraphRenderData.setContents(renderData); @@ -721,13 +792,13 @@ //端口 if (j % 2 == 0) { try { textRenderData.setText(result2s.get(0).getPort().split(",")[(j - 6) / 2 + ((i - cc) / (angles + 2)) * (ports > 8 ? 4 : (ports + 1) / 2)] + "∑5" + i + (j - 6)); textRenderData.setText(result2s.get(0).getPort().split(",")[(j - 6) / 2 + ((i - cc) / (angles + 1)) * (ports > 8 ? 4 : (ports + 1) / 2)] + "∑5" + i + (j - 6)); } catch (Exception e) { textRenderData.setText(""); } } else { try { textRenderData.setText(result2s.get(0).getPort().split(",")[(j - 5) / 2 + ((i - cc) / (angles + 2)) * (ports > 8 ? 4 : (ports + 1) / 2)] + "∑5" + i + (j - 5)); textRenderData.setText(result2s.get(0).getPort().split(",")[(j - 5) / 2 + ((i - cc) / (angles + 1)) * (ports > 8 ? 4 : (ports + 1) / 2)] + "∑5" + i + (j - 5)); } catch (Exception e) { textRenderData.setText(""); } @@ -844,13 +915,13 @@ //端口 if (j % 2 == 0) { try { textRenderData.setText(result2s.get(0).getPort().split(",")[(j - 6) / 2 + ((i - (dd == 0 ? cc : dd)) / (angles + 2)) * (ports > 8 ? 4 : (ports + 1) / 2)] + "∑5" + i + (j - 6)); textRenderData.setText(result2s.get(0).getPort().split(",")[(j - 6) / 2 + ((i - (dd == 0 ? cc : dd)) / (angles + 1)) * (ports > 8 ? 4 : (ports + 1) / 2)] + "∑5" + i + (j - 6)); } catch (Exception e) { textRenderData.setText(""); } } else { try { textRenderData.setText(result2s.get(0).getPort().split(",")[(j - 5) / 2 + ((i - (dd == 0 ? cc : dd)) / (angles + 2)) * (ports > 8 ? 4 : (ports + 1) / 2)] + "∑5" + i + (j - 5)); textRenderData.setText(result2s.get(0).getPort().split(",")[(j - 5) / 2 + ((i - (dd == 0 ? cc : dd)) / (angles + 1)) * (ports > 8 ? 4 : (ports + 1) / 2)] + "∑5" + i + (j - 5)); } catch (Exception e) { textRenderData.setText(""); } @@ -960,12 +1031,16 @@ //其余列 if ((i - (ee == 0 ? ((dd == 0 ? cc : dd)) : ee)) % (angles + 1) == 1) { //频点 textRenderData.setText(result2s.get((i - (ee == 0 ? ((dd == 0 ? cc : dd)) : ee)) / (angles + 1)).getOften() + "∑6" + index); textRenderData.setText(result2s.get((i - (ee == 0 ? ((dd == 0 ? cc : dd)) : ee)) / portRow / (angles + 1)).getOften() + "∑6" + i + index); } else { //最差值 String[] value = result2s.get((i - (ee == 0 ? ((dd == 0 ? cc : dd)) : ee)) / (angles + 1)).getValue().split("\\],\\["); String[] value = result2s.get((i - (ee == 0 ? ((dd == 0 ? cc : dd)) : ee)) / portRow / (angles + 2)).getValue().split("\\],\\["); String[] split = value[(i + (angles - 1)) % (angles + 1)].replaceAll("[\\[\\]\"]", "").split(","); textRenderData.setText(split[(j - 5) + (((i - (ee == 0 ? ((dd == 0 ? cc : dd)) : ee) + (angles - 1)) / (angles + 1) - 1) * (Math.min(ports, 8)))]); try { textRenderData.setText(split[((j - 5) + ((i - (ee == 0 ? ((dd == 0 ? cc : dd)) : ee) - 1) / (angles + 1) % portRow)* (Math.min(ports, 8)))]); } catch (Exception e) { textRenderData.setText(""); } } renderData.add(textRenderData); paragraphRenderData.setContents(renderData); @@ -1058,7 +1133,7 @@ //最差值 String[] value = result2s.get(0).getValue().split("\\],\\["); String[] split = value[(i + (angles - 1)) % (angles + 1)].replaceAll("[\\[\\]\"]", "").split(","); textRenderData.setText(split[0] + "∑7" + i + j); textRenderData.setText(split[0] + "∑7" + i ); } renderData.add(textRenderData); paragraphRenderData.setContents(renderData); @@ -1151,7 +1226,7 @@ //最差值 String[] value = result2s.get(0).getValue().split("\\],\\["); String[] split = value[(i + (angles - 1)) % (angles + 1)].replaceAll("[\\[\\]\"]", "").split(","); textRenderData.setText(split[0] + "∑7" + i + j); textRenderData.setText(split[0] + "∑7" + i ); } renderData.add(textRenderData); paragraphRenderData.setContents(renderData); @@ -1220,8 +1295,7 @@ paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j == bb - 1) { } else if (j == bb - 1) { //最后一列 if ((i - (hh == 0 ? (gg == 0 ? (ff == 0 ? (ee == 0 ? ((dd == 0 ? cc : dd)) : ee) : ff) : gg) : hh)) % (angles + 1) == 1) { textRenderData.setText("/"); @@ -1240,8 +1314,7 @@ paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else { } else { //其余列 if ((i - (hh == 0 ? (gg == 0 ? (ff == 0 ? (ee == 0 ? ((dd == 0 ? cc : dd)) : ee) : ff) : gg) : hh)) % (angles + 1) == 1) { //频段 @@ -1313,8 +1386,7 @@ paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j == 4) { } else if (j == 4) { //第五列 if ((i - (mm == 0 ? (hh == 0 ? (gg == 0 ? (ff == 0 ? (ee == 0 ? ((dd == 0 ? cc : dd)) : ee) : ff) : gg) : hh) : mm)) % (angles + 1) == 1) { //频段 @@ -1328,8 +1400,7 @@ paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j == bb - 1) { } else if (j == bb - 1) { //最后一列 if ((i - (mm == 0 ? (hh == 0 ? (gg == 0 ? (ff == 0 ? (ee == 0 ? ((dd == 0 ? cc : dd)) : ee) : ff) : gg) : hh) : mm)) % (angles + 1) == 1) { textRenderData.setText("/"); @@ -1407,6 +1478,7 @@ table.put("table", tableRenderData); tables.add(table); lable.getAndIncrement(); index.getAndIncrement(); }); }); String url; @@ -1518,4 +1590,493 @@ insOrderFile.setFileUrl(name); insOrderFileMapper.insert(insOrderFile); } //生成总报告 public void generateReport(Integer orderId, List<InsReportDto1> insReportDto1s) { LocalDateTime now = LocalDateTime.now(); InsOrder insOrder = insOrderMapper.selectById(orderId); //委托部门 departLims String departLims = userMapper.selectDepartLims(insOrder.getPrepareUser()); //samples是过滤掉没有检验项目的样品 List<SampleProductDto> samples = insSampleMapper.selectSampleProductListByOrderId(orderId); String sampleCode = samples.get(0).getSampleCode(); InsReport insReport = new InsReport(); insReport.setCode(insOrder.getEntrustCode().replace("WT", "TXJC")); insReport.setInsOrderId(orderId); Set<String> standardMethod = new HashSet<>(); Set<String> deviceSet = new HashSet<>(); Set<String> models = new HashSet<>(); AtomicReference<Integer> productSize = new AtomicReference<>(0); AtomicReference<Integer> productSize1 = new AtomicReference<>(0); AtomicReference<Integer> productSize2 = new AtomicReference<>(0); AtomicReference<Integer> productSize3 = new AtomicReference<>(0); String[] monthNames = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; samples.forEach(s -> { models.add(s.getModel()); standardMethod.addAll(standardMethodListMapper.selectList(Wrappers.<StandardMethodList>lambdaQuery() .in(StandardMethodList::getId, Arrays.stream(s.getStandardMethodListId().replaceAll("[\\[\\]]", "").split(",")) .map(String::trim).map(Integer::parseInt).collect(Collectors.toList()))).stream().map(aa -> { return aa.getCode() + " " + aa.getName(); }).distinct().collect(Collectors.toList())); //总数 Long productCount = insProductMapper.selectCount(Wrappers.<InsProduct>lambdaQuery() .eq(InsProduct::getInsSampleId, s.getId())); productSize.set(productSize.get() + Integer.parseInt(productCount + "")); //不判定 Long productCount1 = insProductMapper.selectCount(Wrappers.<InsProduct>lambdaQuery() .eq(InsProduct::getInsSampleId, s.getId()) .eq(InsProduct::getInsResult, 3)); productSize1.set(productSize1.get() + Integer.parseInt(productCount1 + "")); //不合格 Long productCount2 = insProductMapper.selectCount(Wrappers.<InsProduct>lambdaQuery() .eq(InsProduct::getInsSampleId, s.getId()) .eq(InsProduct::getInsResult, 0)); productSize2.set(productSize2.get() + Integer.parseInt(productCount2 + "")); //合格 Long productCount3 = insProductMapper.selectCount(Wrappers.<InsProduct>lambdaQuery() .eq(InsProduct::getInsSampleId, s.getId()) .eq(InsProduct::getInsResult, 1)); productSize3.set(productSize3.get() + Integer.parseInt(productCount3 + "")); //将项目按照站点进行分类 Map<String, List<InsProduct>> listMap = s.getInsProduct().stream().collect(Collectors.groupingBy(InsProduct::getLaboratory)); // 创建一个 Map 将站点和项目ID的映射关系 Map<String, Set<Integer>> labToDeviceMap = new HashMap<>(); // 获取所有站点的项目ID 列表 for (Map.Entry<String, List<InsProduct>> entry : listMap.entrySet()) { Set<Integer> productIds = entry.getValue().stream() .map(InsProduct::getId) .collect(Collectors.toSet()); labToDeviceMap.put(entry.getKey(), productIds); } for (InsReportDto1 insReportDto1 : insReportDto1s) { String laboratory = insReportDto1.getLaboratory(); if (!labToDeviceMap.containsKey(laboratory)) { continue; } Set<Integer> productIds = labToDeviceMap.get(laboratory); Integer num = insReportDto1.getNum(); //普通试验结果表 List<InsProductResult> insProductResults = insProductResultMapper.selectList( Wrappers.<InsProductResult>lambdaQuery() .eq(InsProductResult::getNum, num) .in(InsProductResult::getInsProductId, productIds)); for (InsProductResult insProductResult : insProductResults) { List<JSONObject> jsonObjects = JSON.parseArray(insProductResult.getEquipValue(), JSONObject.class); for (JSONObject jsonObject : jsonObjects) { String value = jsonObject.getString("v"); if (value != null && !value.isEmpty()) { deviceSet.add(value); } } } //电路试验结果表 List<InsProductResult2> insProductResult2s = insProductResult2Mapper.selectList( Wrappers.<InsProductResult2>lambdaQuery() .eq(InsProductResult2::getNum, num) .in(InsProductResult2::getInsProductId, productIds)); for (InsProductResult2 result2 : insProductResult2s) { String equipValue = result2.getEquipValue(); if (equipValue != null && !equipValue.isEmpty()) { deviceSet.add(equipValue); } } } }); /*检验情况一览表*/ List<Map<String, String>> tables = null; List<Map<String, Object>> tables2 = null; List<Map<String, Object>> tables3 = null; List<Map<String, Object>> tables4 = null; Map<String, String> table = null; Integer indexs = 1; //判断是否有电路试验,环境试验 List<String> strings = insReportDto1s.stream().map(InsReportDto1::getLaboratory).distinct().collect(Collectors.toList()); if (strings.contains("电路试验")) { strings.remove("电路试验"); strings.remove("近场"); strings.remove("远场"); List<Integer> productIdes = samples.stream().flatMap(sampleProductDto -> sampleProductDto.getInsProduct().stream().map(InsProduct::getId)).collect(Collectors.toList()); List<Integer> collect = insProductResult2Mapper.selectList(Wrappers.<InsProductResult2>lambdaQuery() .in(InsProductResult2::getInsProductId, productIdes)) .stream().map(InsProductResult2::getResult).distinct().collect(Collectors.toList()); //如果有环境试验 if (strings.size() > 0) { table.put("indexs", indexs + ""); table.put("term", "环境试验前电路参数"); if (collect.contains(0)) { table.put("result", "不合格"); } else { table.put("result", "合格"); } tables.add(table); indexs += 1; table.put("indexs", "环境试验:" + String.join("、", strings) + "∑1"); table.put("term", "环境试验:" + String.join("、", strings) + "∑1"); table.put("result", "环境试验:" + String.join("、", strings) + "∑1"); tables.add(table); table.put("indexs", indexs + ""); table.put("term", "环境试验后电路参数"); if (collect.contains(0)) { table.put("result", "不合格"); } else { table.put("result", "合格"); } tables.add(table); indexs += 1; /*创建环境试验条件表2*(项目数+1)*/ List<InsProduct> products = samples.stream().flatMap(sampleProductDto -> sampleProductDto.getInsProduct().stream() .filter(insProduct -> !insProduct.getInspectionItem().equals("电路试验")) .filter(insProduct -> !insProduct.getInspectionItem().equals("辐射试验"))).collect(Collectors.toList()); List<RowRenderData> rows = new ArrayList<>(); //行数 for (int i = 0; i < products.size() + 1; i++) { RowRenderData rowRenderData = new RowRenderData(); RowStyle rowStyle = new RowStyle(); rowStyle.setHeight(40); rowRenderData.setRowStyle(rowStyle); List<CellRenderData> cells = new ArrayList<>(); //列数 for (int j = 0; j < 2; j++) { CellRenderData cellRenderData = new CellRenderData(); CellStyle cellStyle = new CellStyle(); cellStyle.setVertAlign(XWPFTableCell.XWPFVertAlign.CENTER); cellRenderData.setCellStyle(cellStyle); List<ParagraphRenderData> paragraphRenderDataList = new ArrayList<>(); ParagraphRenderData paragraphRenderData = new ParagraphRenderData(); ParagraphStyle paragraphStyle = new ParagraphStyle(); paragraphStyle.setAlign(ParagraphAlignment.CENTER); paragraphRenderData.setParagraphStyle(paragraphStyle); List<RenderData> renderData = new ArrayList<>(); TextRenderData textRenderData = new TextRenderData(); Style style = new Style(); style.setFontFamily("宋体"); style.setColor("000000"); textRenderData.setStyle(style); if (i == 0) { //第一行 if (j == 0) { //第一列 textRenderData.setText("项目"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else { //第二列 textRenderData.setText("试验要求"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } } else { //其余行 if (j == 0) { //第一列 textRenderData.setText(products.get(i - 1).getInspectionItemSubclass()); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else { textRenderData.setText(products.get(i - 1).getTell()); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } } } rowRenderData.setCells(cells); if (rowRenderData.getCells().size() != 0) { rows.add(rowRenderData); } } TableRenderData tableRenderData = new TableRenderData(); tableRenderData.setRows(rows); int countSize = tableRenderData.getRows().get(0).getCells().size(); for (RowRenderData row : tableRenderData.getRows()) { if (row.getCells().size() != countSize) { throw new ErrorException("每行单元格不相等"); } } TableStyle tableStyle = new TableStyle(); tableStyle.setWidth(XWPFTable.DEFAULT_PERCENTAGE_WIDTH); tableStyle.setAlign(TableRowAlign.CENTER); BorderStyle borderStyle = new BorderStyle(); borderStyle.setColor("000000"); borderStyle.setType(XWPFTable.XWPFBorderType.THICK); borderStyle.setSize(4); tableStyle.setLeftBorder(borderStyle); tableStyle.setTopBorder(borderStyle); tableStyle.setRightBorder(borderStyle); tableStyle.setBottomBorder(borderStyle); tableRenderData.setTableStyle(tableStyle); Map<String, Object> table4 = new HashMap<>(); table4.put("table4", tableRenderData); tables4.add(table4); } else { table.put("indexs", indexs + ""); table.put("term", "电路参数"); if (collect.contains(0)) { table.put("result", "不合格"); } else { table.put("result", "合格"); } tables.add(table); indexs += 1; } /*拼接勾选的电路试验表*/ } if (strings.contains("近场") || strings.contains("远场")) { table.put("indexs", indexs + ""); table.put("term", "辐射方向图参数"); table.put("result", "不判定"); tables.add(table); } String url; try { InputStream inputStream = this.getClass().getResourceAsStream("/static/report-template.docx"); File file = File.createTempFile("temp", ".tmp"); OutputStream outputStream = new FileOutputStream(file); IOUtils.copy(inputStream, outputStream); url = file.getAbsolutePath(); } catch (FileNotFoundException e) { throw new ErrorException("找不到模板文件"); } catch (IOException e) { throw new RuntimeException(e); } StringBuilder standardMethod2 = new StringBuilder(); for (String s : standardMethod) { standardMethod2.append(";\n").append(s); } standardMethod2.append(";\n").append("GB/T 9410-2008 《移动通信天线通用技术规范》"); standardMethod2.replace(0, 1, ""); List<Map<String, String>> deviceList = null; if (deviceSet.size() != 0) { deviceList = insOrderMapper.selectDeviceList(deviceSet); } Map<String, String> codeStr = new HashMap<>(); codeStr.put("报告编号", insReport.getCode()); codeStr.put("样品名称", insOrder.getSample()); codeStr.put("规格型号", samples.get(0).getModel()); codeStr.put("发放日期", now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); String codePath; try { codePath = new MatrixToImageWriter().code(JackSonUtil.marshal(codeStr).replaceAll("\\{", "") .replaceAll("}", "").replaceAll(",", "").replaceAll("\"", ""), twoCode); } catch (Exception e) { throw new RuntimeException(e); } String modelStr = ""; for (String model : models) { modelStr += "," + model; } String finalModelStr = modelStr; String sampleEn = insSampleMapper.getSampleEn(insOrder.getSample()); String orderType = insOrderMapper.getEnumLabelByValue(insOrder.getOrderType()); String formType = insOrderMapper.getEnumLabelByValue(insOrder.getFormType()); ConfigureBuilder builder = Configure.builder(); builder.useSpringEL(true); List<Map<String, String>> finalDeviceList = deviceList; List<Map<String, String>> sampleList = insSampleMapper.selectSampleList(orderId); Integer userId = insSampleUserMapper.selectOne(Wrappers.<InsSampleUser>lambdaQuery() .eq(InsSampleUser::getInsSampleId, orderId).last("limit 1")).getUserId(); String signatureUrl; try { signatureUrl = userMapper.selectById(userId).getSignatureUrl(); } catch (Exception e) { throw new ErrorException("找不到检验人的签名"); } if (ObjectUtils.isEmpty(signatureUrl) || signatureUrl.equals("")) { throw new ErrorException("找不到检验人的签名"); } Custom custom = customMapper.selectById(insOrder.getCompanyId()); /*获取附件图片类型*/ List<Map<String, Object>> images = new ArrayList<>(); List<InsOrderFile> insOrderFiles = insOrderFileMapper.selectList(Wrappers.<InsOrderFile>lambdaQuery().eq(InsOrderFile::getType, 1).eq(InsOrderFile::getInsOrderId, orderId)); if (CollectionUtils.isNotEmpty(insOrderFiles)) { insOrderFiles.forEach(insOrderFile -> { Map<String, Object> image = new HashMap<>(); PictureRenderData pictureRenderData = Pictures.ofLocal(imgUrl + "/" + insOrderFile.getFileUrl()).sizeInCm(17, 20).create(); image.put("url", pictureRenderData); image.put("report", insReport); images.add(image); }); } //委托人和电话字段判断 if (ObjectUtils.isEmpty(insOrder.getPrepareUser())) { insOrder.setPrepareUser("/"); } if (ObjectUtils.isEmpty(insOrder.getPhone())) { insOrder.setPhone("/"); } //检验项目的环境 InsProduct insProduct = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery().eq(InsProduct::getState, 1).eq(InsProduct::getInsSampleId, samples.get(0).getId())).get(0); String environment = ""; environment = (ObjectUtils.isNotEmpty(insProduct.getTemperature()) ? insProduct.getTemperature() + "℃ " : "") + (ObjectUtils.isNotEmpty(insProduct.getHumidity()) ? insProduct.getHumidity() + "%" : ""); String finalEnvironment = environment; List<SampleProductDto> finalSamples = samples; XWPFTemplate template = XWPFTemplate.compile(url, builder.build()).render( new HashMap<String, Object>() {{ put("order", insOrder); put("report", insReport); put("departLims", departLims); put("sampleCode", sampleCode); put("environment", finalEnvironment); put("custom", custom); put("sampleSize", finalSamples.size()); put("standardMethod", (standardMethod2.toString().equals("null") ? "" : standardMethod2)); put("deviceList", finalDeviceList); put("tables", tables); put("tables2", tables2); put("tables3", tables3); put("tables4", tables4); put("sampleList", sampleList); put("twoCode", Pictures.ofLocal(codePath).create()); put("models", finalModelStr.replace(",", "")); put("productSize", productSize); put("productSize1", productSize1); put("productSize2", productSize2); put("productSize3", productSize3); put("createTime", now.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"))); // put("createTimeEn", monthNames[now.getMonthValue() - 1] + " " + now.getDayOfMonth() + ", " + now.getYear()); put("insTime", insOrder.getInsTime().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"))); put("insTimeEn", monthNames[insOrder.getInsTime().getMonthValue() - 1] + " " + insOrder.getInsTime().getDayOfMonth() + ", " + insOrder.getInsTime().getYear()); put("writeUrl", null); put("insUrl", Pictures.ofLocal(imgUrl + "/" + signatureUrl).create()); put("images", images); put("examineUrl", null); put("ratifyUrl", null); put("sampleEn", sampleEn); put("orderType", orderType); put("getTime", insOrder.getExamineTime().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"))); put("getTimeEn", monthNames[insOrder.getExamineTime().getMonthValue() - 1] + " " + insOrder.getExamineTime().getDayOfMonth() + ", " + insOrder.getExamineTime().getYear()); put("seal1", null); put("seal2", null); put("formTypeCh", formType); put("formTypeEn", insOrder.getFormType()); }}); try { String name = insReport.getCode().replace("/", "") + ".docx"; template.writeAndClose(Files.newOutputStream(Paths.get(wordUrl + "/" + name))); insReport.setUrl("/word/" + name); insReportMapper.insert(insReport); insOrder.setInsState(5); insOrderMapper.updateById(insOrder); } catch (IOException e) { throw new RuntimeException(e); } // 处理合并单元格的问题 String path = wordUrl + "/" + insReport.getCode().replace("/", "") + ".docx"; try { FileInputStream stream = new FileInputStream(path); XWPFDocument document = new XWPFDocument(stream); List<XWPFTable> xwpfTables = document.getTables(); for (int i = 1; i < xwpfTables.size() - (deviceList == null ? 1 : 2); i++) { Set<String> set1 = new HashSet<>(); Map<String, Map<String, Integer>> maps = new HashMap<>(); for (int j = 0; j < xwpfTables.get(i).getRows().size(); j++) { for (int k = 0; k < xwpfTables.get(i).getRows().get(j).getTableCells().size(); k++) { if (xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().indexOf("∑") > -1) { String[] split = xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().split("∑"); if (set1.add(split[1])) { Map<String, Integer> map = new HashMap<>(); map.put("sr", j); map.put("sc", k); map.put("er", j + 0); map.put("ec", k + 0); maps.put(split[1], map); } else { Map<String, Integer> map1 = maps.get(split[1]); if (j == map1.get("sr")) { map1.put("ec", map1.get("ec") + 1); } else if (k == map1.get("sc")) { map1.put("er", map1.get("er") + 1); } } String str = xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().split("∑")[0]; xwpfTables.get(i).getRows().get(j).getTableCells().get(k).removeParagraph(0); xwpfTables.get(i).getRows().get(j).getTableCells().get(k).setText(str); xwpfTables.get(i).getRows().get(j).getTableCells().get(k).setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER); xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getParagraphArray(0).setAlignment(org.apache.poi.xwpf.usermodel.ParagraphAlignment.CENTER); } } } List<String> list = new ArrayList<>(); for (String s : maps.keySet()) { list.add(s); } for (int a = list.size() - 1; a >= 0; a--) { Map<String, Integer> v = maps.get(list.get(a)); for (int j = 0; j < v.get("er") - v.get("sr") + 1; j++) { if (v.get("ec") > v.get("sc")) { try { TableTools.mergeCellsHorizonal(xwpfTables.get(i), v.get("sr") + j, v.get("sc"), v.get("ec")); } catch (Exception e) { } } } if (v.get("er") > v.get("sr")) { try { TableTools.mergeCellsVertically(xwpfTables.get(i), v.get("sc"), v.get("sr"), v.get("er")); } catch (Exception e) { } } } } FileOutputStream fileOutputStream = new FileOutputStream(path); document.write(fileOutputStream); fileOutputStream.close(); } catch (FileNotFoundException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } //处理中英文换行的问题 try { FileInputStream stream1 = new FileInputStream(path); XWPFDocument document1 = new XWPFDocument(stream1); List<XWPFTable> xwpfTables1 = document1.getTables(); for (int i = 1; i < xwpfTables1.size() - (deviceList == null ? 1 : 2); i++) { for (int j = 0; j < xwpfTables1.get(i).getRows().size(); j++) { for (int k = 0; k < xwpfTables1.get(i).getRows().get(j).getTableCells().size(); k++) { if (xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getText().contains("@")) { String text = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getText(); String[] split = text.split("@"); xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).removeParagraph(0); XWPFParagraph xwpfParagraph = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).addParagraph(); XWPFRun run = xwpfParagraph.createRun(); run.setText(split[0]); if (ObjectUtils.isNotNull(split[1])) { run.addBreak(); run.setText(split[1]); } xwpfParagraph.setAlignment(org.apache.poi.xwpf.usermodel.ParagraphAlignment.CENTER); } } } } FileOutputStream fileOutputStream1 = new FileOutputStream(path); document1.write(fileOutputStream1); fileOutputStream1.close(); } catch (FileNotFoundException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } } } inspect-server/src/main/resources/mapper/InsOrderFileMapper.xml
@@ -17,7 +17,8 @@ select A.* from (select iof.*, name from ins_order_file iof left join user u on iof.create_user = u.id) A left join user u on iof.create_user = u.id where ins_order_id=#{insOrderId}) A <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''"> ${ew.customSqlSegment} </if> inspect-server/src/main/resources/mapper/InsOrderUserMapper.xml
@@ -17,5 +17,6 @@ select iou.*, name submitUserName from ins_order_user iou left join user on submit_user = user.id where ins_order_state_id=#{insOrderStateId} </select> </mapper> inspect-server/src/main/resources/mapper/InsSampleMapper.xml
@@ -367,6 +367,7 @@ and state = 1 and ip.son_laboratory = #{laboratory} and ios.laboratory = #{laboratory} and (ipr2.num is null or ipr.num is null) </select> <select id="getSampleEn" resultType="java.lang.String"> select name_en @@ -950,4 +951,8 @@ and state = 1 and ins_order_id = #{insOrderId} </select> <select id="selectList1" resultType="com.yuanchu.mom.dto.SampleProductDto"> select * from ins_sample where ins_order_id=#{id } </select> </mapper> inspect-server/src/main/resources/static/report-template.docxBinary files differ
system-run/src/main/resources/application-dev.yml
@@ -42,10 +42,8 @@ type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver # url: jdbc:mysql://localhost:3306/11?useSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8 # url: jdbc:mysql://10.1.200.86:3306/center-lims?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8 # url: jdbc:mysql://10.16.173.59:3306/center-lims?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8 url: jdbc:mysql://10.1.13.77:3306/center-lims?useSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8 # url: jdbc:mysql://114.132.189.42:9004/center-lims?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8 # url: jdbc:mysql://192.168.22.29:3306/center-lims?useSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8 username: remote_user # username: root password: zttZTT123! @@ -76,6 +74,7 @@ port: 6379 # redis访问密码(默认为空) password: 123456 # password: zttZTT123! # redis连接超时时间(单位毫秒) timeout: 50 # redis连接池配置