package com.ruoyi.inspect.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.aspose.words.License; import com.aspose.words.SaveFormat; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; 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.deepoove.poi.config.ConfigureBuilder; import com.deepoove.poi.data.*; import com.deepoove.poi.data.style.BorderStyle; import com.deepoove.poi.data.style.Style; import com.deepoove.poi.data.style.TableStyle; import com.deepoove.poi.util.TableTools; import com.deepoove.poi.util.UnitUtils; import com.ruoyi.basic.mapper.IfsInventoryQuantityMapper; import com.ruoyi.basic.pojo.IfsInventoryQuantity; import com.ruoyi.basic.pojo.StandardTemplate; import com.ruoyi.basic.service.StandardTemplateService; import com.ruoyi.common.constant.DictDataConstants; import com.ruoyi.common.constant.InsOrderTypeConstants; import com.ruoyi.common.constant.MenuJumpPathConstants; import com.ruoyi.common.core.domain.entity.Custom; import com.ruoyi.common.core.domain.entity.InformationNotification; import com.ruoyi.common.core.domain.entity.User; import com.ruoyi.common.utils.*; import com.ruoyi.framework.exception.ErrorException; import com.ruoyi.inspect.dto.*; import com.ruoyi.inspect.mapper.*; import com.ruoyi.inspect.pojo.*; import com.ruoyi.inspect.service.*; import com.ruoyi.inspect.util.HackLoopTableRenderPolicy; import com.ruoyi.inspect.vo.InsOrderPlanTaskSwitchVo; import com.ruoyi.inspect.vo.InsOrderPlanVO; import com.ruoyi.performance.mapper.AuxiliaryOutputWorkingHoursMapper; import com.ruoyi.performance.mapper.PerformanceShiftMapper; import com.ruoyi.performance.mapper.ShiftTimeMapper; import com.ruoyi.performance.pojo.AuxiliaryOutputWorkingHours; import com.ruoyi.performance.pojo.AuxiliaryOutputWorkingHoursTemporary; import com.ruoyi.performance.service.AuxiliaryOutputWorkingHoursService; import com.ruoyi.performance.service.AuxiliaryOutputWorkingHoursTemporaryService; import com.ruoyi.system.mapper.CustomMapper; import com.ruoyi.system.mapper.UserMapper; import com.ruoyi.system.service.ISysDictTypeService; import com.ruoyi.system.service.InformationNotificationService; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.*; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.ClassPathResource; import org.springframework.mock.web.MockMultipartFile; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import java.io.*; import java.math.BigDecimal; import java.math.RoundingMode; import java.nio.file.Files; import java.nio.file.Paths; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; import java.util.regex.Pattern; import java.util.stream.Collectors; /** * 检验任务-业务实现层 */ @Service public class InsOrderPlanServiceImpl extends ServiceImpl implements InsOrderPlanService { @Resource private InsSampleMapper insSampleMapper; @Resource private InsSampleUserMapper insSampleUserMapper; @Resource private InsOrderMapper insOrderMapper; @Resource private InsOrderService insOrderService; @Resource private StandardTemplateService standardTemplateService; @Resource private InsOrderStateMapper insOrderStateMapper; @Resource private InsProductMapper insProductMapper; @Value("${wordUrl}") private String wordUrl; @Resource private InsReportMapper insReportMapper; @Resource private InsProductResultMapper insProductResultMapper; @Resource private InsProductUserMapper insProductUserMapper; @Resource private AuxiliaryOutputWorkingHoursService auxiliaryOutputWorkingHoursService; @Resource private AuxiliaryOutputWorkingHoursMapper auxiliaryOutputWorkingHoursMapper; @Resource private InformationNotificationService informationNotificationService; @Resource private UserMapper userMapper; @Resource private CustomMapper customMapper; @Value("${file.path}") private String imgUrl; @Resource private InsOrderFileMapper insOrderFileMapper; @Resource private IfsInventoryQuantityMapper ifsInventoryQuantityMapper; @Resource private InsReportService insReportService; @Resource private InsUnqualifiedRetestProductMapper insUnqualifiedRetestProductMapper; @Resource private InsUnqualifiedRetestProductService insUnqualifiedRetestProductService; @Resource private InsUnqualifiedRetestResultMapper insUnqualifiedRetestResultMapper; @Resource private ThreadPoolTaskExecutor threadPoolTaskExecutor; @Resource private InsOrderFactoryVerifyMapper insOrderFactoryVerifyMapper; @Resource private InsOrderFactoryVerifyItemService insOrderFactoryVerifyItemService; @Resource private SpotCheckQuarterItemMapper spotCheckQuarterItemMapper; @Resource private InsOrderStandardTemplateService insOrderStandardTemplateService; @Resource private InsOrderDeviceRecordMapper insOrderDeviceRecordMapper; @Resource private InsOrderDeviceRecordService insOrderDeviceRecordService; @Resource private ISysDictTypeService iSysDictTypeService; @Resource private InsOrderRatesService insOrderRatesService; @Resource private InsProductDeviationWarningService insProductDeviationWarningService; @Resource private InsProductDeviationWarningDetailService insProductDeviationWarningDetailService; @Override public IPage selectInsOrderPlanList(Page page, InsOrderPlanDTO insOrderPlanDTO) { // todo: 仅看自己或者实验室 //获取当前人所属实验室id String laboratory = null; String userName = null; Integer userId = null; if (ObjectUtil.isNotEmpty(insOrderPlanDTO.getUserId())) { userId = SecurityUtils.getUserId().intValue(); userName = userMapper.selectById(userId).getName(); insOrderPlanDTO.setUserId(null); } Integer isCheck = insOrderPlanDTO.getIsCheck(); insOrderPlanDTO.setIsCheck(null); String sonLaboratory = insOrderPlanDTO.getSonLaboratory();//试验室 IPage insOrderPage = insSampleMapper.findInsSampleAndOrder(page, QueryWrappers.queryWrappers(insOrderPlanDTO), userName, userId, sonLaboratory, laboratory, isCheck); return insOrderPage; } @Override public IPage inspectionOrderDetailsTaskSwitching(Page page, InsOrderPlanDTO insOrderPlanDTO) { Integer userId = SecurityUtils.getUserId().intValue(); User user = userMapper.selectById(userId);//当前登录的人 // todo: 仅看自己或者实验室 //获取当前人所属实验室id String departLimsId = user.getDepartLimsId(); String laboratory = null; if (ObjectUtil.isNotEmpty(insOrderPlanDTO.getUserId())) { insOrderPlanDTO.setUserId(userId.longValue()); } String sonLaboratory = insOrderPlanDTO.getSonLaboratory();//试验室 IPage insOrderPage = insSampleMapper.inspectionOrderDetailsTaskSwitching(page, QueryWrappers.queryWrappers(insOrderPlanDTO), userId, sonLaboratory, laboratory); return insOrderPage; } //认领任务 @Override public boolean claimInsOrderPlan(InsOrderPlanDTO entity) { if (Objects.isNull(entity)) { return false; } Integer userId = SecurityUtils.getUserId().intValue(); InsSampleUser insSampleUser = new InsSampleUser(entity.getInsSampleId().intValue(), userId, 0, entity.getSonLaboratory()); return insSampleUserMapper.insert(insSampleUser) > 0; } @Override public Map doInsOrder(Integer id, String laboratory) { InsOrder insOrder = new InsOrder(); insOrder.setId(id); InsOrder order = insOrderMapper.selectById(id); if (BeanUtil.isEmpty(order.getInsTime())) { insOrder.setInsTime(LocalDateTime.now()); insOrderMapper.updateById(insOrder); insOrderStateMapper.update(null, Wrappers.lambdaUpdate().eq(InsOrderState::getInsOrderId, id).eq(InsOrderState::getLaboratory, laboratory).set(InsOrderState::getInsTime, LocalDateTime.now()).set(InsOrderState::getInsState, 1)); } Map map = insOrderService.getInsOrderAndSample(id, laboratory); List list = JSON.parseArray(JSON.toJSONString(map.get("sampleProduct")), SampleProductDto.class); map.put("sampleProduct", list); // 查询厂家密度 String supplierDensity = ""; if (CollectionUtils.isNotEmpty(list)) { SampleProductDto sampleProductDto = list.get(0); // 判断有没有绑定型号 String modelValue = insSampleMapper.selectSupplierDensityModel(sampleProductDto.getSample(), order.getProduction(), sampleProductDto.getModel()); if (StringUtils.isNotBlank(modelValue)) { supplierDensity = modelValue; } else { supplierDensity = insSampleMapper.selectSupplierDensity(sampleProductDto.getSample(), order.getProduction()); } } map.put("supplierDensity", supplierDensity); return map; } @Override public List getInsProduct(InsOrderPlanProductDto dto) { List insProducts = new ArrayList<>(); switch (dto.getType()) { case 0: case 4: //委托 insProducts = insSampleMapper.getInsProduct1(dto.getId(), dto.getLaboratory(), dto.getCableTag(), dto.getRepetitionTag()); break; case 5: //原材料下单 insProducts = insSampleMapper.getInsProduct6(dto.getId(), dto.getLaboratory(), dto.getRawMaterialTag()); break; } if (BeanUtil.isEmpty(insProducts)) { return null; } // 查询订单Id InsOrder order = insOrderMapper.selectFirstSubmit(dto.getId()); getTemplateThing(order, insProducts); return insProducts; } @Override public List checkSubmitPlan(Integer orderId, String laboratory) { List collect = new ArrayList<>(); List insSamples = insSampleMapper.selectList(Wrappers.lambdaQuery().eq(InsSample::getInsOrderId, orderId).select(InsSample::getId)); List ids = insSamples.stream().map(a -> a.getId()).collect(Collectors.toList()); List insProducts = insProductMapper.selectList(Wrappers.lambdaQuery() .in(InsProduct::getInsSampleId, ids) .eq(InsProduct::getSonLaboratory, laboratory) .eq(InsProduct::getState, 1) .eq(InsProduct::getInsResult, 0)); // 过滤判断是有复测的值是合格的 List productList = insProducts.stream().filter(insProduct -> { // 查询不合格复测 Long count = insUnqualifiedRetestProductMapper.selectCount(Wrappers.lambdaQuery() .eq(InsUnqualifiedRetestProduct::getInsProductId, insProduct.getId()) .ne(InsUnqualifiedRetestProduct::getInsResult, 0)); if (count != 2) { return true; } return false; }).collect(Collectors.toList()); if (productList.size() > 0) { collect = productList.stream().map(insProduct -> { return insProduct.getInspectionItem() + "-" + insProduct.getInspectionItemSubclass(); }).collect(Collectors.toList()); } return collect; } @Override public IPage getFileList(Page page, InsOrderFile insOrderFile) { Integer insOrderId = insOrderFile.getInsOrderId(); insOrderFile.setInsOrderId(null); IPage insOrderFileIPage = insOrderFileMapper.getFileList(page, QueryWrappers.queryWrappers(insOrderFile), insOrderId); return insOrderFileIPage; } @Override public int uploadFile(Integer orderId, MultipartFile file) { String urlString; String pathName; String path; String filename = file.getOriginalFilename(); String contentType = file.getContentType(); InsOrderFile insOrderFile = new InsOrderFile(); insOrderFile.setInsOrderId(orderId); insOrderFile.setFileName(filename); if (contentType != null && contentType.startsWith("image/")) { // 是图片 path = imgUrl; insOrderFile.setType(1); } else { // 是文件 path = wordUrl; insOrderFile.setType(2); } try { 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)); insOrderFile.setFileUrl(pathName); return insOrderFileMapper.insert(insOrderFile); } catch (Exception e) { e.printStackTrace(); System.err.println("附件上传错误"); return 0; } } @Override public List upPlanUser2(Integer orderId) { List sampleId = insSampleMapper.selectList(Wrappers.lambdaQuery().eq(InsSample::getInsOrderId, orderId)).stream().map(InsSample::getId).collect(Collectors.toList()); List sonLaboratory = insProductMapper.selectList(Wrappers.lambdaQuery().eq(InsProduct::getState, 1).in(InsProduct::getInsSampleId, sampleId)).stream().map(InsProduct::getSonLaboratory).distinct().collect(Collectors.toList()); return sonLaboratory; } @Override @Transactional(rollbackFor = Exception.class) public void saveInsContext(SaveInsContextDto saveInsContextDto) { Map insContext = JSON.parseObject(saveInsContextDto.getParam(), Map.class); Integer userId = SecurityUtils.getUserId().intValue(); InsSample insSample = insSampleMapper.selectById(saveInsContextDto.getSampleId()); insContext.forEach((k, v) -> { JSONObject jo = JSON.parseObject(JSON.toJSONString(v)); InsProduct insProduct = new InsProduct(); insProduct.setId(Integer.parseInt(k)); InsProduct product = insProductMapper.selectById(insProduct.getId()); if (saveInsContextDto.getCurrentTable().equals(product.getTemplateId()) && saveInsContextDto.getSampleId().equals(product.getInsSampleId())) { List oldResults = insProductResultMapper.selectList(Wrappers.lambdaQuery() .eq(InsProductResult::getInsProductId, insProduct.getId())); InsProductResult newResult = new InsProductResult(); if (CollectionUtils.isNotEmpty(oldResults)) { BeanUtil.copyProperties(oldResults.get(0), newResult); } newResult.setInsProductId(Integer.parseInt(k)); /*校验一下result表*/ if (oldResults.size() > 1) { for (int i = 1; i < oldResults.size(); i++) { insProductResultMapper.deleteById(oldResults.get(i)); } } //检验值 if (jo.get("insValue") != null) { JSONArray jsonArray = JSON.parseArray(JSON.toJSONString(jo.get("insValue"))); List> iv = new ArrayList<>(); for (Object o : jsonArray) { JSONObject insValue = JSON.parseObject(JSON.toJSONString(o)); Map map = new HashMap<>(); map.put("v", JSON.parseObject(JSON.toJSONString(insValue.get("v"))).get("v")); map.put("r", JSON.toJSONString(insValue.get("r"))); map.put("c", JSON.toJSONString(insValue.get("c"))); map.put("w", insValue.get("w")); try { if ((insValue.get("u") == null || insValue.get("u").equals("")) && StrUtil.isNotEmpty(JSON.parseObject(JSON.toJSONString(insValue.get("v"))).get("v").toString())) { map.put("u", userId + ""); } else { map.put("u", insValue.get("u")); } iv.add(map); } catch (Exception e) { } } newResult.setInsValue(JSON.toJSONString(iv)); } //计算值 if (jo.get("comValue") != null && !Objects.equals(jo.get("comValue"), "")) { JSONArray jsonArray2 = JSON.parseArray(JSON.toJSONString(jo.get("comValue"))); List> cv = new ArrayList<>(); for (Object o : jsonArray2) { JSONObject comValue = JSON.parseObject(JSON.toJSONString(o)); Map map = new HashMap<>(); map.put("r", JSON.toJSONString(comValue.get("r"))); map.put("c", JSON.toJSONString(comValue.get("c"))); map.put("v", JSON.parseObject(JSON.toJSONString(comValue.get("v"))).get("v")); cv.add(map); } newResult.setComValue(JSON.toJSONString(cv)); } //最终值 try { JSONObject resValue = JSON.parseObject(JSON.toJSONString(jo.get("resValue"))); if (resValue.get("v") != null) { Object o = JSON.parseObject(JSON.toJSONString(resValue.get("v"))).get("v"); insProduct.setLastValue(o.equals("") ? null : (o.toString())); } } catch (Exception e) { insProduct.setLastValue("");//'' } //设备编号 if (jo.get("equipValue") != null) { JSONArray jsonArray2 = JSON.parseArray(JSON.toJSONString(jo.get("equipValue"))); List> ev = new ArrayList<>(); for (Object o : jsonArray2) { JSONObject equipValue = JSON.parseObject(JSON.toJSONString(o)); Map map = new HashMap<>(); map.put("v", JSON.parseObject(JSON.toJSONString(equipValue.get("v"))).get("v")); ev.add(map); } newResult.setEquipValue(JSON.toJSONString(ev)); } //设备名称 if (jo.get("equipName") != null) { JSONArray jsonArray2 = JSON.parseArray(JSON.toJSONString(jo.get("equipName"))); List> ev = new ArrayList<>(); for (Object o : jsonArray2) { JSONObject equipValue = JSON.parseObject(JSON.toJSONString(o)); Map map = new HashMap<>(); map.put("v", JSON.parseObject(JSON.toJSONString(equipValue.get("v"))).get("v")); ev.add(map); } newResult.setEquipName(JSON.toJSONString(ev)); } //结论 try { JSONObject insResult = JSON.parseObject(JSON.toJSONString(jo.get("insResult"))); String ir = JSON.parseObject(JSON.toJSONString(insResult.get("v"))).get("v") + ""; insProduct.setInsResult(Integer.parseInt(ir)); } catch (Exception e) { insProduct.setInsResult(2);//待定 } if (Objects.isNull(newResult.getId())) { newResult.setCreateUser(userId); newResult.setUpdateUser(userId); insProductResultMapper.insert(newResult); } else { newResult.setUpdateUser(userId); newResult.setUpdateTime(LocalDateTime.now()); insProductResultMapper.updateById(newResult); } insProduct.setUpdateUser(userId); insProductMapper.updateById(insProduct); insProductUserMapper.insert(new InsProductUser(null, userId, LocalDateTime.now(), insProduct.getId())); insSample.setInsState(1); Long l = insProductMapper.selectCount(Wrappers.lambdaQuery() .eq(InsProduct::getInsSampleId, insSample.getId())); Long l1 = insProductMapper.selectCount(Wrappers.lambdaQuery() .eq(InsProduct::getInsSampleId, insSample.getId()) .and(wrapper -> wrapper .isNotNull(InsProduct::getInsResult) .or() .ne(InsProduct::getInsResult, 2) )); if (Objects.equals(l, l1)) { insSample.setInsState(2); } insSampleMapper.updateById(insSample); /*校验一下result表*/ List insProductResults = insProductResultMapper.selectList(Wrappers.lambdaQuery() .eq(InsProductResult::getInsProductId, product.getId())); if (insProductResults.size() > 1) { for (int i = 1; i < insProductResults.size(); i++) { insProductResultMapper.deleteById(insProductResults.get(i)); } } // 添加工时 // 判断是否只是参与计算值, 参与计算值实际没有填写 InsProduct finalInsProduct = insProductMapper.selectById(product.getId()); InsOrder insOrder = insOrderMapper.selectById(insSample.getInsOrderId()); if (StringUtils.isNotBlank(newResult.getInsValue()) && !newResult.getInsValue().equals("[]")) { threadPoolTaskExecutor.execute(() -> { this.addAuxiliary(userId, finalInsProduct, insOrder); }); } else { // 判断是否是没有检验值的内容 if (saveInsContextDto.getIsNoTestValue() != null && saveInsContextDto.getIsNoTestValue() == 1) { threadPoolTaskExecutor.execute(() -> { this.addAuxiliary(userId, finalInsProduct, insOrder); }); } } } }); String sampleIdStr = insContext.keySet().stream().findFirst().orElse(null); if (sampleIdStr != null) { int count = insProductMapper.selectInsProductCountByOrderId(saveInsContextDto.getOrderId()); if (count == 0) { insOrderStateMapper.update(new InsOrderState(), Wrappers.lambdaUpdate() .eq(InsOrderState::getInsOrderId, saveInsContextDto.getOrderId()) .eq(InsOrderState::getLaboratory, saveInsContextDto.getSonLaboratory()) .set(InsOrderState::getInsState, 2)); } } // 添加设备记录 threadPoolTaskExecutor.execute(() -> { // 添加设备使用记录 addDeviceRecord(insSample, userId); }); } private synchronized void addDeviceRecord(InsSample insSample, Integer userId) { InsOrder order = insOrderMapper.selectById(insSample.getInsOrderId()); User user = userMapper.selectById(userId); // 查询设备使用记录查询该订单的使用记录 List deviceRecordDtoList = insOrderDeviceRecordMapper.selectDeviceNumber(insSample.getInsOrderId()); Set recordCodeset = deviceRecordDtoList.stream().map(InsOrderDeviceRecordDto::getManagementNumber).collect(Collectors.toSet()); // 获取订单设备编号 List resultList = insProductResultMapper.selectResultByOrderId(insSample.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 = insOrderDeviceRecordMapper.selectDeviceIdsByNumbers(orderDeviceNumbers); List collect = orderDeviceIds.stream().map(deviceId -> { InsOrderDeviceRecord insOrderDeviceRecord = new InsOrderDeviceRecord(); insOrderDeviceRecord.setInsOrderId(insSample.getInsOrderId()); insOrderDeviceRecord.setDeviceId(deviceId); insOrderDeviceRecord.setSampleCode(order.getEntrustCode()); insOrderDeviceRecord.setUseBefore(1); insOrderDeviceRecord.setUseAfter(1); insOrderDeviceRecord.setUsePerson(user.getName()); insOrderDeviceRecord.setUsePersonId(user.getId()); return insOrderDeviceRecord; }).collect(Collectors.toList()); insOrderDeviceRecordService.saveBatch(collect); } // 2.判断是否取消了设备使用 Set repoprNumbers = getDeviceDifference(recordCodeset, deviceCodeSet); if (CollectionUtils.isNotEmpty(repoprNumbers)) { List reportDeviceIds = insOrderDeviceRecordMapper.selectDeviceIdsByNumbers(repoprNumbers); insOrderDeviceRecordMapper.delete(Wrappers.lambdaQuery() .in(InsOrderDeviceRecord::getDeviceId, reportDeviceIds) .eq(InsOrderDeviceRecord::getInsOrderId, insSample.getInsOrderId())); } } private static Set getDeviceDifference(Set number1, Set number2) { return number1.stream().filter(s1 -> number2.stream().noneMatch(s2 -> s1.equals(s2))) .collect(Collectors.toSet()); } //交接 @Override public int upPlanUser(Integer userId, Integer orderId, String sonLaboratory) { InsSampleUser insSampleUser = new InsSampleUser(); insSampleUser.setUserId(userId); insSampleUser.setInsSampleId(orderId); insSampleUser.setState(0); insSampleUser.setSonLaboratory(sonLaboratory); return insSampleUserMapper.insert(insSampleUser); } /** * 查询模板内容 * @param order * @param insProducts */ private void getTemplateThing(InsOrder order, List insProducts) { Set set = new HashSet<>(); // 查询订单状态判断是否是查历史模板 if (order.getIsFirstSubmit() != null && order.getIsFirstSubmit().equals(1)) { InsOrderState insOrderState = insOrderStateMapper.selectOne(Wrappers.lambdaQuery() .eq(InsOrderState::getInsOrderId, order.getId()) .last("limit 1")); if (insOrderState != null && (!insOrderState.getInsState().equals(3) || !insOrderState.getInsState().equals(5))) { for (InsProduct product : insProducts) { if (product.getTemplateId() == null) { product.setTemplate(new ArrayList<>()); continue; } String thing = null; if (product.getTemplateId() != null && set.add(product.getTemplateId())) { // 查询历史模板 InsOrderStandardTemplate one = insOrderStandardTemplateService.getOne(Wrappers.lambdaQuery() .eq(InsOrderStandardTemplate::getTemplateId, product.getTemplateId()) .eq(InsOrderStandardTemplate::getInsOrderId, order.getId())); thing = one.getThing(); if (StrUtil.isNotEmpty(thing)) { thing = GZipUtil.uncompress(thing); JSONObject sheet = JSON.parseObject(thing).getJSONArray("data").getJSONObject(0); JSONObject config = sheet.getJSONObject("config"); List cellData = JSON.parseArray(JSON.toJSONString(sheet.get("celldata")), JSONObject.class); Map style = new HashMap<>(); style.put("rowlen", config.get("rowlen")); style.put("columnlen", config.get("columnlen")); product.setTemplate(cellData); product.setStyle(style); product.setTemplateName(one.getName()); } } } } } for (InsProduct product : insProducts) { if (product.getTemplateId() == null) { product.setTemplate(new ArrayList<>()); continue; } String thing = null; if (product.getTemplateId() != null && set.add(product.getTemplateId())) { thing = standardTemplateService.getStandTempThingById(product.getTemplateId()); } if (StrUtil.isNotEmpty(thing)) { JSONObject sheet = JSON.parseObject(thing).getJSONArray("data").getJSONObject(0); JSONObject config = sheet.getJSONObject("config"); List cellData = JSON.parseArray(JSON.toJSONString(sheet.get("celldata")), JSONObject.class); Map style = new HashMap<>(); style.put("rowlen", config.get("rowlen")); style.put("columnlen", config.get("columnlen")); product.setTemplate(cellData); product.setStyle(style); product.setTemplateName(standardTemplateService.getStandTempNameById(product.getTemplateId())); } } } /** * todo: 原始记录模板清除没有使用的检验项(暂时有bug无法使用) * @param sheet * @param itemNameList */ private static void eliminateItem(JSONObject sheet, List itemNameList) { // 获取到 检验项分类+检验项+检验子项的拼接,如果模板里的信息跟接口返回的检验项信息能够匹配则展示出来 // 循环行数判断是否 JSONArray dataListJSONArray = sheet.getJSONArray("data"); // 添加坐标map Map coordinatesMap = new HashMap<>(); // 需要移除的索引 List deleteIndex = new ArrayList<>(); // 循环列 for (int r = 0; r < dataListJSONArray.size(); r++) { JSONArray dataList = dataListJSONArray.getJSONArray(r); // 循环行 String itemName = ""; // 判断是否显示 boolean isShow = false; for (int c = 0; c < dataList.size(); c++) { // 查询批注 JSONObject jsonObject = dataList.getJSONObject(c); try { if (jsonObject.getJSONObject("ps").getString("value").equals("检验项分类")) { String value = jsonObject.getString("v").trim(); itemName += value; // 添加坐标 String coordinates = coordinatesJoint(r, c); coordinatesMap.put(coordinates, value); isShow = true; } else if (jsonObject.getJSONObject("ps").getString("value").equals("检验项")) { String value = jsonObject.getString("v").trim(); itemName += value; // 添加坐标 String coordinates = coordinatesJoint(r, c); coordinatesMap.put(coordinates, value); isShow = true; } else if (jsonObject.getJSONObject("ps").getString("value").equals("检验子项")) { String value = jsonObject.getString("v").trim(); itemName += value; // 添加坐标 String coordinates = coordinatesJoint(r, c); coordinatesMap.put(coordinates, value); isShow = true; } } catch (Exception e) { // 判断是否有mc合并单元格 if (jsonObject != null && jsonObject.getJSONObject("mc") != null) { // 查询坐标进行添加 String value = coordinatesMap.get(coordinatesJoint(jsonObject.getJSONObject("mc").getInteger("r"), jsonObject.getJSONObject("mc").getInteger("c"))); if (StringUtils.isNotBlank(value) && !itemName.contains(value)) { itemName += value; } } } } // 判断该订单是否有改检验项, 没有剔除 if (isShow) { if (!itemNameList.contains(itemName)) { dataListJSONArray.remove(r); r--; } } } } /** * 坐标拼接 * @param r 横坐标 * @param c 纵坐标 * @return */ private static String coordinatesJoint(int r, int c) { String coordinates = ""; coordinates = "r:" + r + ",c:" + c; return coordinates; } @Override @Transactional(rollbackFor = Exception.class) public int submitPlan(Integer orderId, String laboratory, Integer verifyUser, String entrustCode) { InsOrder order = insOrderMapper.selectById(orderId); // 1. 判断是否有重复编号, 有重复编号做提醒 Long codeCount = insOrderMapper.selectCount(Wrappers.lambdaQuery() .ne(InsOrder::getState, -1) .ne(InsOrder::getIfsInventoryId, order.getIfsInventoryId()) .eq(InsOrder::getEntrustCode, order.getEntrustCode())); if (codeCount > 0) { throw new ErrorException("当前编号有重复, 请先去修改重复编号"); } // 2. 判断该订单是否是第一次生产(后续报告生成只取第一次提交时间) if (!(order.getIsFirstSubmit() != null && order.getIsFirstSubmit().equals(1))) { insOrderMapper.update(null, Wrappers.lambdaUpdate() .eq(InsOrder::getId, orderId) .set(InsOrder::getIsFirstSubmit, 1) .set(InsOrder::getFirstSubmitDate, LocalDateTime.now())); } // 3. 判断是否有未检项 List insSamples = insSampleMapper.selectList(Wrappers.lambdaQuery() .eq(InsSample::getInsOrderId, orderId).select(InsSample::getId)); List InsSampleIds = insSamples.stream().map(InsSample::getId).collect(Collectors.toList()); List insProducts = insProductMapper.selectList(Wrappers.lambdaQuery() .in(InsProduct::getInsSampleId, InsSampleIds) .eq(InsProduct::getSonLaboratory, laboratory) .eq(InsProduct::getState, 1) .and(wrapper -> wrapper .isNull(InsProduct::getInsResult) .or() .eq(InsProduct::getInsResult, 2) ) .ne(InsProduct::getIsBinding, 1)); insProducts.addAll(insProductMapper.selectFiberInsProduct(InsSampleIds, laboratory)); if (insProducts.size() > 0) { String str = ""; int count = 0; for (InsProduct product : insProducts) { count++; str += (count != 0 ? "\n" : "") + count + ":" + product.getInspectionItemClass() + " " + product.getInspectionItem() + " " + product.getInspectionItemSubclass(); } if (ObjectUtils.isNotEmpty(str)) { throw new ErrorException("存在待检验的项目:" + str); } } // 4.修改检测结果 insOrderStateMapper.update(null, Wrappers.lambdaUpdate().eq(InsOrderState::getInsOrderId, orderId) .eq(InsOrderState::getLaboratory, laboratory) .set(InsOrderState::getInsTime, LocalDateTime.now()) .set(InsOrderState::getInsState, 3) .set(InsOrderState::getVerifyUser, verifyUser)); // 5.发送消息通知给复核人 // 查询当前人信息 Integer userId = SecurityUtils.getUserId().intValue(); String userName = insProductMapper.selectUserById(userId).get("name"); // 查询发送人信息 String sendUserAccount = insProductMapper.selectUserById(verifyUser).get("account"); InformationNotification info = new InformationNotification(); info.setCreateUser(userName); info.setMessageType("2"); info.setTheme("复核通知"); info.setContent("您有一条检验任务待复核消息, 编号:" + order.getEntrustCode()); info.setSenderId(userId); info.setConsigneeId(verifyUser); info.setViewStatus(false); info.setJumpPath(MenuJumpPathConstants.INSPECTION_REVIEW); informationNotificationService.addInformationNotification(info); // 6.复核人--新增检验单相关负责人 InsSampleUser insSampleUser = new InsSampleUser(); insSampleUser.setUserId(verifyUser); insSampleUser.setInsSampleId(orderId); insSampleUser.setState(1); insSampleUser.setSonLaboratory(laboratory); insSampleUserMapper.insert(insSampleUser); // 7.校验一下result表(避免出现多个检验项结果) threadPoolTaskExecutor.execute(() -> { List ips = insProducts.stream().map(InsProduct::getId).distinct().collect(Collectors.toList()); for (Integer ip : ips) { List insProductResults = insProductResultMapper.selectList(Wrappers.lambdaQuery() .eq(InsProductResult::getInsProductId, ip)); if (insProductResults.size() > 1) { for (int i = 1; i < insProductResults.size(); i++) { insProductResultMapper.deleteById(insProductResults.get(i)); } } } }); // 8.提交生成报告 this.generateReport(orderId); // 9.添加临时pdf生成地址 InsReport report = insReportMapper.selectOne(Wrappers.lambdaQuery() .eq(InsReport::getInsOrderId, orderId)); String tempUrlPdf = this.wordToPdfTemp(report.getUrl().replace("/word", wordUrl)); report.setTempUrlPdf("/word/" + tempUrlPdf); insReportMapper.updateById(report); // 10.原始记录模板复制(添加备份, 避免修改原始模板影响到已经完成的单子) this.templateCopy(orderId, InsSampleIds); // 11.成品抽样添加合格状态 // 判断是否有抽样信息 if (order.getQuarterItemId() != null) { // 判断是否有不合格 this.addProductSpotCheck(insSamples, order); } // 12.添加订单费用统计信息 List productList = insProductMapper.selectProductByOrderId(orderId); // 删除原本费用信息 insOrderRatesService.remove(Wrappers.lambdaQuery() .eq(InsOrderRates::getInsOrderId, orderId)); List orderRatesList = productList.stream().map(insProduct -> { InsOrderRates insOrderRates = new InsOrderRates(); insOrderRates.setInsOrderId(orderId); insOrderRates.setInsSampleId(insProduct.getInsSampleId()); insOrderRates.setInsProductId(insProduct.getId()); insOrderRates.setSampleCode(insProduct.getSampleCode()); insOrderRates.setEntrustCode(order.getEntrustCode()); insOrderRates.setInspectionItemClass(insProduct.getInspectionItemClass()); insOrderRates.setInspectionItem(insProduct.getInspectionItem()); insOrderRates.setInspectionItemSubclass(insProduct.getInspectionItemSubclass()); insOrderRates.setCableTag(insProduct.getCableTag()); insOrderRates.setRates(insProduct.getRates()); insOrderRates.setManHourGroup(insProduct.getManHourGroup()); return insOrderRates; }).collect(Collectors.toList()); insOrderRatesService.saveBatch(orderRatesList); // 13.发送企业微信通知 // 查询原材料 IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(order.getIfsInventoryId()); // 查询样品信息 InsSample insSample = insSampleMapper.selectOne(Wrappers.lambdaQuery() .eq(InsSample::getInsOrderId, orderId) .last("limit 1")); threadPoolTaskExecutor.execute(() -> { String message = ""; message += "检验任务复核通知"; message += "\n提交人: " + userName; message += "\n委托编号: " + order.getEntrustCode(); message += "\n样品名称: " + insSample.getModel(); message += "\n规格型号: " + order.getPartDetail(); if (ifsInventoryQuantity != null) { message += "\n批次号: " + ifsInventoryQuantity.getUpdateBatchNo(); } //发送企业微信消息通知 提交复核 try { WxCpUtils.inform(sendUserAccount, message, null); } catch (Exception e) { throw new RuntimeException(e); } }); // 14.ifs移库(原材料需要进行移库操作) --> 最后执行,因为失败无法回滚 if (ifsInventoryQuantity != null) { // 登记检验结果 // 判断是否有不合格, 有不合格不能移库 // todo: ifs移库 insReportService.isRawMaterial(order); // 15 判断当前样品是否为原材料, 原材料需要进行数据分析, 判断之前10条数据同一个供应商, 同一个检验项的偏差是否超过10% // 查询ifs信息获取获取前10个供应商一样的, 检验项一样信息 threadPoolTaskExecutor.execute(() -> { // 添加分析数据 addAnalysis(productList, ifsInventoryQuantity, order, sendUserAccount); }); } else { // 修改成品状态 // 判断是否有不合格 Long unqualifiedCount = insReportService.getUnqualifiedCount(order); if (unqualifiedCount.equals(0L)) { insOrderMapper.update(null, Wrappers.lambdaUpdate() .eq(InsOrder::getId, order.getId()) .set(InsOrder::getInsResult, 1)); } else { insOrderMapper.update(null, Wrappers.lambdaUpdate() .eq(InsOrder::getId, order.getId()) .set(InsOrder::getInsResult, 0)); } } return 1; } /** * *****添加分析数据****** * @param productList * @param ifsInventoryQuantity * @param order */ private void addAnalysis(List productList, IfsInventoryQuantity ifsInventoryQuantity, InsOrder order, String sendUserAccount) { for (InsProduct insProduct : productList) { // 判断是否是数值类型 if (insProduct.getInspectionValueType().equals("1") && insProduct.getInsResult().equals(1)) { List insProductAnalysisDtoList = insProductMapper.selectAnalysis(insProduct, ifsInventoryQuantity.getSupplierName()); if (insProductAnalysisDtoList.size() < 10) { continue; } // 判断当前检测项是否偏差超过10% List laseValueList = insProductAnalysisDtoList.stream().map(InsProductDeviationWarningDetail::getTestValue) .collect(Collectors.toList()); double deviation = isDeviationOverTenPercent(laseValueList, insProduct.getLastValue()); // 判断偏差是否大于10 if (deviation > 10) { // 判断之前是否添加过, 添加过不需要添加 long count = insProductDeviationWarningService.count(Wrappers.lambdaQuery() .eq(InsProductDeviationWarning::getInsProductId, insProduct.getId())); if (count == 0L) { // 发送通知, 并且添加数据 // 添加主表信息 InsProductDeviationWarning deviationWarning = new InsProductDeviationWarning(); deviationWarning.setInsOrderId(order.getId()); deviationWarning.setInsSampleId(insProduct.getInsSampleId()); deviationWarning.setInsProductId(insProduct.getId()); deviationWarning.setEntrustCode(order.getEntrustCode()); deviationWarning.setSampleCode(insProduct.getSampleCode()); deviationWarning.setSupplierName(ifsInventoryQuantity.getSupplierName()); deviationWarning.setDeviationValue(Double.toString(deviation)); deviationWarning.setDetectionTime(insProduct.getUpdateTime()); insProductDeviationWarningService.save(deviationWarning); // 添加详情数据 InsProductDeviationWarningDetail deviationWarningDetail = new InsProductDeviationWarningDetail(); deviationWarningDetail.setInsOrderId(order.getId()); deviationWarningDetail.setInsSampleId(insProduct.getInsSampleId()); deviationWarningDetail.setInsProductId(insProduct.getId()); deviationWarningDetail.setEntrustCode(order.getEntrustCode()); deviationWarningDetail.setSampleCode(insProduct.getSampleCode()); deviationWarningDetail.setSupplierName(ifsInventoryQuantity.getSupplierName()); deviationWarningDetail.setTestValue(insProduct.getLastValue()); deviationWarningDetail.setDetectionTime(insProduct.getCreateTime()); deviationWarningDetail.setIsIssue(1); insProductAnalysisDtoList.add(deviationWarningDetail); // 添加id for (InsProductDeviationWarningDetail warningDetail : insProductAnalysisDtoList) { warningDetail.setDeviationWarningId(deviationWarning.getDeviationWarningId()); } insProductDeviationWarningDetailService.saveBatch(insProductAnalysisDtoList); //发送企业微信消息通知 检验项预警预警通知 try { String message = ""; message += "检验项预警预警通知"; message += "\n委托编号: " + order.getEntrustCode(); message += "\n样品名称: " + order.getSample(); message += "\n规格型号: " + order.getPartDetail(); message += "\n批次号: " + ifsInventoryQuantity.getUpdateBatchNo(); message += "\n供应商名称: " + ifsInventoryQuantity.getSupplierName(); message += "\n检验项: " + insProduct.getInspectionItem() + insProduct.getInspectionItemSubclass(); message += "\n偏差超过了 10%"; // 发送给提交人 // WxCpUtils.inform(sendUserAccount, message, null); // // // todo: 发送给检测中心主任(固定死) // WxCpUtils.inform("ZT-004704", message, null); } catch (Exception e) { e.printStackTrace(); log.error("偏差预警企业微信通知报错"); } } } } } } /** * *****计算偏差**** * @param data * @param targetStr * @return */ public static double isDeviationOverTenPercent(List data, String targetStr) { if (data.isEmpty()) { return 0; } List doubleData = data.stream() .map(Double::parseDouble) .collect(Collectors.toList()); double sum = doubleData.stream().mapToDouble(Double::doubleValue).sum(); double average = sum / doubleData.size(); double target = Double.parseDouble(targetStr); double deviationPercent = Math.abs(target - average) / average * 100; // 保留两位小数 DecimalFormat df = new DecimalFormat("#.00"); String formatted = df.format(deviationPercent); return Double.parseDouble(formatted); } /** * ******原始记录模板复制***** * @param orderId * @param ids */ private void templateCopy(Integer orderId, List ids) { // 删除原本模板 insOrderStandardTemplateService.remove(Wrappers.lambdaQuery() .eq(InsOrderStandardTemplate::getInsOrderId, orderId)); // 复制模板 Set set = new HashSet<>(); List insProductList = insProductMapper.selectList(Wrappers.lambdaQuery() .in(InsProduct::getInsSampleId, ids) .select(InsProduct::getTemplateId)); for (InsProduct product : insProductList) { // 查询模板id if (product.getTemplateId() != null && set.add(product.getTemplateId())) { StandardTemplate standardTemplate = standardTemplateService.getById(product.getTemplateId()); if (standardTemplate != null) { InsOrderStandardTemplate insOrderStandardTemplate = new InsOrderStandardTemplate(); insOrderStandardTemplate.setInsOrderId(orderId); insOrderStandardTemplate.setTemplateId(standardTemplate.getId()); insOrderStandardTemplate.setNumber(standardTemplate.getNumber()); insOrderStandardTemplate.setName(standardTemplate.getName()); insOrderStandardTemplate.setThing(standardTemplate.getThing()); insOrderStandardTemplateService.save(insOrderStandardTemplate); } } } } /** * 检验任务复核 * @param orderId * @param laboratory * @param type * @param tell * @return */ @Override @Transactional(rollbackFor = Exception.class) public int rawMaterialVerifyPlan(Integer orderId, String laboratory, Integer type, String tell, Integer userId) { Integer num = (type == 1 ? 5 : 4); LocalDateTime now = LocalDateTime.now(); insOrderStateMapper.update(null, Wrappers.lambdaUpdate() .eq(InsOrderState::getInsOrderId, orderId) .eq(InsOrderState::getLaboratory, laboratory) .set(InsOrderState::getInsTime, now) .set(InsOrderState::getInsState, num) .set(InsOrderState::getVerifyTell, tell) .set(InsOrderState::getVerifyUser, SecurityUtils.getUserId().intValue())); Long count = insOrderStateMapper.selectCount(Wrappers.lambdaQuery() .eq(InsOrderState::getInsOrderId, orderId) .ne(InsOrderState::getInsState, 5)); InsReport report = insReportMapper.selectOne(Wrappers.lambdaQuery() .eq(InsReport::getInsOrderId, orderId)); // 查询订单 InsOrder order = insOrderMapper.selectById(orderId); if (count == 0 && num == 5) { // 修改报告状态 insReportMapper.update(null, Wrappers.lambdaUpdate() .eq(InsReport::getInsOrderId, orderId) .set(InsReport::getIsPass, 1)); // 修改订单状态 insOrderMapper.update(null, Wrappers.lambdaUpdate() .eq(InsOrder::getId, orderId) .set(InsOrder::getInsState, 5)); //生成原材料进货验证原始记录到附件里 if (order.getTypeSource() != null && order.getTypeSource().equals(1)) { this.reportFactoryVerify(orderId, userId, report.getWriteUserId()); } // 查询检验任务的检验任务 // 报告盖上批准人 insReportService.writeReport(report.getId(), userId, report.getWriteUserId()); // 检验人 String userName = insProductMapper.selectUserById(report.getWriteUserId()).get("name"); // 复核人 Integer checkUserId = SecurityUtils.getUserId().intValue(); String chenkUserName = insProductMapper.selectUserById(checkUserId).get("name"); // 审核人 String sendUserAccount = insProductMapper.selectUserById(userId).get("account"); // 发送企业微信通知(通知审核人审批) threadPoolTaskExecutor.execute(() -> { InsSample insSample = insSampleMapper.selectOne(Wrappers.lambdaQuery() .eq(InsSample::getInsOrderId, orderId) .last("limit 1")); // 查询原材料 IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(order.getIfsInventoryId()); String message = ""; message += "报告编制审批通知"; message += "\n检验人: " + userName; message += "\n复核人: " + chenkUserName; message += "\n委托编号: " + order.getEntrustCode(); message += "\n样品名称: " + insSample.getModel(); message += "\n规格型号: " + order.getPartDetail(); if (ifsInventoryQuantity != null) { message += "\n生产厂家: " + ifsInventoryQuantity.getSupplierName(); message += "\n批次号: " + ifsInventoryQuantity.getUpdateBatchNo(); } //发送企业微信消息通知 提交复核 try { WxCpUtils.inform(sendUserAccount, message, null); } catch (Exception e) { throw new RuntimeException(e); } }); } else { //复核不通过将把复核的负责人去掉 Integer id = insSampleUserMapper.selectOne(Wrappers.lambdaQuery().eq(InsSampleUser::getInsSampleId, orderId).orderByDesc(InsSampleUser::getId).last("limit 1")).getId(); insSampleUserMapper.deleteById(id); // 当前审核人 Integer currentUserId = SecurityUtils.getUserId().intValue(); String userName = insProductMapper.selectUserById(currentUserId).get("name"); // 发送消息的人 // 查询发送人信息 String sendUserAccount = insProductMapper.selectUserById(report.getWriteUserId()).get("account"); // 发送企业微信通知(检验任务退回) threadPoolTaskExecutor.execute(() -> { // 查询订单 InsSample insSample = insSampleMapper.selectOne(Wrappers.lambdaQuery() .eq(InsSample::getInsOrderId, orderId) .last("limit 1")); // 查询原材料 IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(order.getIfsInventoryId()); String message = ""; message += "检验任务复核退回通知"; message += "\n复核人: " + userName; message += "\n委托编号: " + order.getEntrustCode(); message += "\n样品名称: " + insSample.getModel(); message += "\n规格型号: " + order.getPartDetail(); if (ifsInventoryQuantity != null) { message += "\n批次号: " + ifsInventoryQuantity.getUpdateBatchNo(); } message += "\n退回原因: " + tell; //发送企业微信消息通知 提交复核 try { WxCpUtils.inform(sendUserAccount, message, null); } catch (Exception e) { throw new RuntimeException(e); } }); } return 1; } /** * 生成报告 * @param orderId */ private void generateReport(Integer orderId) { /*样品下的项目只要有一个项目不合格则检验结果为0,否则为1*/ //这里的insSamples是订单下的所有样品包括("/") List insSamples = insSampleMapper.selectList(Wrappers.lambdaQuery().eq(InsSample::getInsOrderId, orderId)); for (InsSample insSample : insSamples) { List insProducts = insProductMapper.selectList(Wrappers.lambdaQuery() .eq(InsProduct::getInsSampleId, insSample.getId()) .eq(InsProduct::getState, 1) .ne(InsProduct::getIsBinding, 1)); List results = insProducts.stream().map(InsProduct::getInsResult).filter(str -> str != null).collect(Collectors.toList()); if (results.contains(0)) { insSample.setInsResult(0); } else { insSample.setInsResult(1); } insSampleMapper.updateById(insSample); } InsOrder insOrder = insOrderMapper.selectById(orderId); // 抽检变成委托检验 if (insOrder.getOrderType().equals(InsOrderTypeConstants.SPOT_CHECK)) { insOrder.setOrderType(InsOrderTypeConstants.CUSTOMER_ORDERED); } // 判断是大报告还是小报告 进厂小报告, 其他都是大报告 if (insOrder.getOrderType().equals(InsOrderTypeConstants.ENTER_THE_FACTORY)) { // 生成小报告 addSmallReport(orderId, insOrder, insSamples); } else { //生成大报告 addBitReport(orderId, insOrder); } } /** * 电缆配置, 查看配置标识 * @param id * @param laboratory * @return */ @Override public List> getCableTag(Integer id, String laboratory) { return insSampleMapper.getCableTag(id, laboratory); } /** * 原材料查看标识 * @param id * @param laboratory * @return */ @Override public List> getRawMaterialTag(Integer id, String laboratory) { return insSampleMapper.getRawMaterialTag(id, laboratory); } /** * 查看重复标识 * @param id * @param laboratory * @return */ @Override public List> getRepetitionTag(Integer id, String laboratory, String cableTag) { return insSampleMapper.getRepetitionTag(id, laboratory, cableTag); } /** * 新增不合格复测内容 * @return */ @Override public boolean addDisqualificationRetest(List insProductsList) { List ids = insProductsList.stream().map(InsProduct::getId).collect(Collectors.toList()); // 判断之前是否添加过 Long count = insUnqualifiedRetestProductMapper.selectCount(Wrappers.lambdaQuery() .in(InsUnqualifiedRetestProduct::getInsProductId, ids)); if (count > 0) { throw new ErrorException("有检验项检添加过复测信息"); } // 查询不合格内容 List list = insUnqualifiedRetestProductMapper.selectRetestProduct(ids); // 循环判断是否是绑定值, 绑定值修改检验要求 for (InsUnqualifiedRetestProduct insUnqualifiedRetestProduct : list) { for (InsProduct insProduct : insProductsList) { if (insProduct.getIsBinding().equals(1)) { insUnqualifiedRetestProduct.setIsBinding(1); insUnqualifiedRetestProduct.setAsk(null); insUnqualifiedRetestProduct.setTell(null); insUnqualifiedRetestProduct.setPrice(null); insUnqualifiedRetestProduct.setManHour(null); insUnqualifiedRetestProduct.setSection(null); } } } // 新增不合格内容 insUnqualifiedRetestProductService.saveBatch(list); list.forEach(insUnqualifiedRetestProduct -> { insUnqualifiedRetestProduct.setRetestTag("2"); insUnqualifiedRetestProduct.setId(null); }); insUnqualifiedRetestProductService.saveBatch(list); return true; } @Override public List getInsProductUnqualifiedRetest(InsOrderPlanProductDto dto) { List insProducts = new ArrayList<>(); switch (dto.getType()) { case 0: case 4: //委托 insProducts = insUnqualifiedRetestProductMapper.getInsProductUnqualifiedRetest1(dto.getId(), dto.getLaboratory(), dto.getCableTag(), dto.getRepetitionTag(), dto.getRetestTag()); break; case 5: //原材料下单 insProducts = insUnqualifiedRetestProductMapper.getInsProductUnqualifiedRetest6(dto.getId(), dto.getLaboratory(), dto.getRawMaterialTag(), dto.getRetestTag()); break; } if (BeanUtil.isEmpty(insProducts)) { return null; } InsOrder order = insOrderMapper.selectFirstSubmit(dto.getId()); getTemplateThing(order, Collections.unmodifiableList(insProducts)); return insProducts; } @Override @Transactional(rollbackFor = Exception.class) public void saveUnqualifiedContext(Map insContext, Integer currentTable, Integer currentSampleId, Integer orderId, String sonLaboratory) { Integer userId = SecurityUtils.getUserId().intValue(); insContext.forEach((k, v) -> { JSONObject jo = JSON.parseObject(JSON.toJSONString(v)); InsUnqualifiedRetestProduct insProduct = new InsUnqualifiedRetestProduct(); insProduct.setId(Integer.parseInt(k)); InsUnqualifiedRetestProduct product = insUnqualifiedRetestProductMapper.selectById(insProduct.getId()); if (currentTable.equals(product.getTemplateId()) && currentSampleId.equals(product.getInsSampleId())) { List oldResults = insUnqualifiedRetestResultMapper.selectList(Wrappers.lambdaQuery() .eq(InsUnqualifiedRetestResult::getRetestProductId, insProduct.getId())); InsUnqualifiedRetestResult newResult = new InsUnqualifiedRetestResult(); if (CollectionUtils.isNotEmpty(oldResults)) { BeanUtil.copyProperties(oldResults.get(0), newResult); } newResult.setRetestProductId(Integer.parseInt(k)); /*校验一下result表*/ if (oldResults.size() > 1) { for (int i = 1; i < oldResults.size(); i++) { insUnqualifiedRetestResultMapper.deleteById(oldResults.get(i)); } } //检验值 if (jo.get("insValue") != null) { JSONArray jsonArray = JSON.parseArray(JSON.toJSONString(jo.get("insValue"))); List> iv = new ArrayList<>(); for (Object o : jsonArray) { JSONObject insValue = JSON.parseObject(JSON.toJSONString(o)); Map map = new HashMap<>(); map.put("v", JSON.parseObject(JSON.toJSONString(insValue.get("v"))).get("v")); map.put("r", JSON.toJSONString(insValue.get("r"))); map.put("c", JSON.toJSONString(insValue.get("c"))); map.put("w", insValue.get("w")); try { if ((insValue.get("u") == null || insValue.get("u").equals("")) && StrUtil.isNotEmpty(JSON.parseObject(JSON.toJSONString(insValue.get("v"))).get("v").toString())) { map.put("u", userId + ""); } else { map.put("u", insValue.get("u")); } iv.add(map); } catch (Exception e) { } } newResult.setInsValue(JSON.toJSONString(iv)); } //计算值 if (jo.get("comValue") != null && !Objects.equals(jo.get("comValue"), "")) { JSONArray jsonArray2 = JSON.parseArray(JSON.toJSONString(jo.get("comValue"))); List> cv = new ArrayList<>(); for (Object o : jsonArray2) { JSONObject comValue = JSON.parseObject(JSON.toJSONString(o)); Map map = new HashMap<>(); map.put("r", JSON.toJSONString(comValue.get("r"))); map.put("c", JSON.toJSONString(comValue.get("c"))); map.put("v", JSON.parseObject(JSON.toJSONString(comValue.get("v"))).get("v")); cv.add(map); } newResult.setComValue(JSON.toJSONString(cv)); } //最终值 try { JSONObject resValue = JSON.parseObject(JSON.toJSONString(jo.get("resValue"))); if (resValue.get("v") != null) { Object o = JSON.parseObject(JSON.toJSONString(resValue.get("v"))).get("v"); insProduct.setLastValue(o.equals("") ? null : (o.toString())); } } catch (Exception e) { insProduct.setLastValue("");//'' } //设备编号 if (jo.get("equipValue") != null) { JSONArray jsonArray2 = JSON.parseArray(JSON.toJSONString(jo.get("equipValue"))); List> ev = new ArrayList<>(); for (Object o : jsonArray2) { JSONObject equipValue = JSON.parseObject(JSON.toJSONString(o)); Map map = new HashMap<>(); map.put("v", JSON.parseObject(JSON.toJSONString(equipValue.get("v"))).get("v")); ev.add(map); } newResult.setEquipValue(JSON.toJSONString(ev)); } //设备名称 if (jo.get("equipName") != null) { JSONArray jsonArray2 = JSON.parseArray(JSON.toJSONString(jo.get("equipName"))); List> ev = new ArrayList<>(); for (Object o : jsonArray2) { JSONObject equipValue = JSON.parseObject(JSON.toJSONString(o)); Map map = new HashMap<>(); map.put("v", JSON.parseObject(JSON.toJSONString(equipValue.get("v"))).get("v")); ev.add(map); } newResult.setEquipName(JSON.toJSONString(ev)); } //结论 try { JSONObject insResult = JSON.parseObject(JSON.toJSONString(jo.get("insResult"))); String ir = JSON.parseObject(JSON.toJSONString(insResult.get("v"))).get("v") + ""; insProduct.setInsResult(Integer.parseInt(ir)); } catch (Exception e) { insProduct.setInsResult(2);//待定 } if (Objects.isNull(newResult.getId())) { newResult.setCreateUser(userId); newResult.setUpdateUser(userId); insUnqualifiedRetestResultMapper.insert(newResult); } else { newResult.setUpdateUser(userId); newResult.setUpdateTime(LocalDateTime.now()); insUnqualifiedRetestResultMapper.updateById(newResult); } insProduct.setUpdateUser(userId); insUnqualifiedRetestProductMapper.updateById(insProduct); insProductUserMapper.insert(new InsProductUser(null, userId, LocalDateTime.now(), insProduct.getId())); /*校验一下result表*/ List insProductResults = insUnqualifiedRetestResultMapper.selectList(Wrappers.lambdaQuery() .eq(InsUnqualifiedRetestResult::getRetestProductId, product.getId())); if (insProductResults.size() > 1) { for (int i = 1; i < insProductResults.size(); i++) { insUnqualifiedRetestResultMapper.deleteById(insProductResults.get(i)); } } } }); } /** * 查询进货原始记录 * @param insOrderId * @return */ @Override public InsOrderFactoryVerify getFactoryVerify(Integer insOrderId) { InsOrderFactoryVerify insOrderFactoryVerify = insOrderFactoryVerifyMapper.selectOne(Wrappers.lambdaQuery() .eq(InsOrderFactoryVerify::getInsOrderId, insOrderId) .last("limit 1")); // 判断查询查询是否为空 if (insOrderFactoryVerify == null) { insOrderFactoryVerify = new InsOrderFactoryVerify(); // 查询下单 InsOrder order = insOrderMapper.selectById(insOrderId); // 查询检验项目表 List insSamples = insSampleMapper.selectList(Wrappers.lambdaQuery() .eq(InsSample::getInsOrderId, insOrderId)); //查询规格信号 List insSamplemodel = insSamples.stream().map(insSample -> insSample.getModel()).collect(Collectors.toList()); String model = CollUtil.join(insSamplemodel, ","); // 查询原材料信息 IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(order.getIfsInventoryId()); if (ifsInventoryQuantity == null) { throw new ErrorException("缺少原材料信息"); } // 检验编号 insOrderFactoryVerify.setEntrustCode(order.getEntrustCode()); // 材料厂家 insOrderFactoryVerify.setSupplierName(ifsInventoryQuantity.getSupplierName()); // 到货日期 insOrderFactoryVerify.setDeclareDate(ifsInventoryQuantity.getDeclareDate()); // 材料名称 insOrderFactoryVerify.setSample(order.getSample()); // 规格型号 insOrderFactoryVerify.setModel(model); // 材料批号 insOrderFactoryVerify.setUpdateBatchNo(ifsInventoryQuantity.getUpdateBatchNo()); insOrderFactoryVerify.setInsOrderId(insOrderId); return insOrderFactoryVerify; } // 查询验证项目 List verifyItems = insOrderFactoryVerifyItemService.list(Wrappers.lambdaQuery() .eq(InsOrderFactoryVerifyItem::getFactoryVerifyId, insOrderFactoryVerify.getFactoryVerifyId()) .orderByAsc(InsOrderFactoryVerifyItem::getSort)); insOrderFactoryVerify.setFactoryVerifyItemList(verifyItems); return insOrderFactoryVerify; } /** * 保存原材料进货验证 * @param factoryVerify * @return */ @Override @Transactional(rollbackFor = Exception.class) public boolean addFactoryVerify(InsOrderFactoryVerify factoryVerify) { if (factoryVerify.getInsOrderId() == null) { throw new ErrorException("缺少订单Id"); } // 判断是新增还是修改 if (factoryVerify.getFactoryVerifyId() == null) { // 判断之前是否添加过 Long count = insOrderFactoryVerifyMapper.selectCount(Wrappers.lambdaQuery() .eq(InsOrderFactoryVerify::getInsOrderId, factoryVerify.getInsOrderId())); if (count > 0) { throw new ErrorException("原材料进货验证记录重复添加"); } // 新增 insOrderFactoryVerifyMapper.insert(factoryVerify); for (InsOrderFactoryVerifyItem item : factoryVerify.getFactoryVerifyItemList()) { item.setFactoryVerifyId(factoryVerify.getFactoryVerifyId()); } // 批量添加 insOrderFactoryVerifyItemService.saveBatch(factoryVerify.getFactoryVerifyItemList()); } else { // 编辑 insOrderFactoryVerifyMapper.updateById(factoryVerify); // 删除原本验证项目 insOrderFactoryVerifyItemService.remove(Wrappers.lambdaQuery() .eq(InsOrderFactoryVerifyItem::getFactoryVerifyId, factoryVerify.getFactoryVerifyId())); for (InsOrderFactoryVerifyItem item : factoryVerify.getFactoryVerifyItemList()) { item.setFactoryVerifyId(factoryVerify.getFactoryVerifyId()); } insOrderFactoryVerifyItemService.saveBatch(factoryVerify.getFactoryVerifyItemList()); } return true; } /***************************************************** 小报告 ***************************************************************************/ /** * 小报告生成 * @param orderId * @param insOrder * @param insSamples */ private void addSmallReport(Integer orderId, InsOrder insOrder, List insSamples) { InsReport insReport = new InsReport(); AtomicReference resultCh = new AtomicReference<>(""); insReport.setCode(insOrder.getEntrustCode()); insReport.setInsOrderId(orderId); InsSample insSample = insSamples.get(0); // 填充基础数据 EnterFactoryReport enterFactoryReport = new EnterFactoryReport(); enterFactoryReport.setCode(insOrder.getEntrustCode()); enterFactoryReport.setSample(insOrder.getSample()); // 获取ifs数据 IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(insOrder.getIfsInventoryId()); enterFactoryReport.setQtyArrived(ifsInventoryQuantity.getQtyArrived() == null ? "" : ifsInventoryQuantity.getQtyArrived().stripTrailingZeros().toPlainString() + ifsInventoryQuantity.getBuyUnitMeas()); enterFactoryReport.setQuantity(insOrder.getTestQuantity()); enterFactoryReport.setPartDesc(insOrder.getPartDetail()); enterFactoryReport.setSupplierName("**********"); enterFactoryReport.setLotBatchNo(ifsInventoryQuantity.getUpdateBatchNo()); // 检测依据 Set standardMethod = new HashSet<>(); StringBuilder standardMethod2 = new StringBuilder(); standardMethod.add(baseMapper.getStandardMethodCode(insSample.getStandardMethodListId())); for (String s : standardMethod) { standardMethod2.append("、").append(s); } standardMethod2.replace(0, 1, ""); // 样品类型 String orderType = iSysDictTypeService.selectLabelByDict(DictDataConstants.CHECK_TYPE, insOrder.getOrderType()); List rows = new ArrayList<>(); List text = new ArrayList<>(); RowRenderData rowRenderData = null; // 查询检验内容 List sampleProductDto2s = insOrderMapper.selectSampleBySampleId(insSamples.stream() .map(InsSample::getId).collect(Collectors.toList())); // 格式化修改检验项 this.formatProducts(sampleProductDto2s); List sampleList = new ArrayList<>(); Integer max = insSamples.stream().mapToInt(InsSample::getQuantity).sum(); // 转成Mpa进行排序 Map> sortedMap = sampleProductDto2s.stream() .filter(sampleProductDto2 -> StringUtils.isNotBlank(sampleProductDto2.getInspectionItem())) .collect(Collectors.groupingBy(SampleProductExportDto::getInspectionItem)); List>> entries = new ArrayList<>(sortedMap.entrySet()); entries.sort((o1, o2) -> (o1.getValue().get(0).getSort() == null ? 0 : o1.getValue().get(0).getSort()) - (o2.getValue().get(0).getSort() == null ? 0 : o2.getValue().get(0).getSort())); // 创建一个 LinkedHashMap 来保持插入顺序 Map> item = new LinkedHashMap<>(); for (Map.Entry> entry : entries) { item.put(entry.getKey(), entry.getValue()); } AtomicInteger finalIndex = new AtomicInteger(1); item.forEach((s, sampleProductDtoInside) -> { // 添加检验项 SampleProductExportDto dto2 = new SampleProductExportDto(); // 判断是否有英文名称 SampleProductExportDto temp = sampleProductDtoInside.get(0); // 判断是否有检验子项,没有就把检验参数填充 dto2.setIndex(Integer.toString(finalIndex.get())); if (StringUtils.isBlank(temp.getInspectionItemSubclass())) { // 处理集合 Map map = new LinkedHashMap<>(); for (SampleProductExportDto productDto2 : sampleProductDtoInside) { String productName = productDto2.getInspectionItemClass() + productDto2.getInspectionItem(); if (map.containsKey(productName)) { // 如果名称已经存在,添加 lastValue 值到 lastValueList 列表 map.get(productName) .getLastValueList() .add(productDto2.getLastValue()); map.get(productName) .getInsResultList() .add(productDto2.getInsResult()); } else { // 如果名称不存在,直接放入 map productDto2.setLastValueList(new ArrayList<>()); // 检验内容 productDto2.getLastValueList().add(productDto2.getLastValue()); productDto2.setInsResultList(new ArrayList<>()); // 结果 productDto2.getInsResultList().add(productDto2.getInsResult()); map.put(productName, productDto2); } } List result = new ArrayList<>(map.values()); //添加检验子项 SampleProductExportDto temp2 = result.get(0); if (StringUtils.isNotBlank(temp2.getRadius())) { s = s + "(" + temp2.getRadius() + ")"; } // 判断有没有条件字段有需要拼接到名称后面 temp2.setInspectionName(s); temp2.setIndex(Integer.toString(finalIndex.get())); sampleList.add(temp2); } else { dto2.setInspectionName(s); // 填充到要求 if (StringUtils.isNotBlank(temp.getRadius())) { dto2.setTell("(" + temp.getRadius() + ")"); } sampleList.add(dto2); // 处理集合 Map map = new LinkedHashMap<>(); for (SampleProductExportDto productDto2 : sampleProductDtoInside) { String productName = productDto2.getInspectionItemClass() + productDto2.getInspectionItem() + productDto2.getInspectionItemSubclass(); if (map.containsKey(productName)) { // 如果名称已经存在,添加 lastValue 值到 lastValueList 列表 map.get(productName) .getLastValueList() .add(productDto2.getLastValue()); map.get(productName) .getInsResultList() .add(productDto2.getInsResult()); } else { // 如果名称不存在,直接放入 map productDto2.setLastValueList(new ArrayList<>()); // 检验内容 productDto2.getLastValueList().add(productDto2.getLastValue()); productDto2.setInsResultList(new ArrayList<>()); // 结果 productDto2.getInsResultList().add(productDto2.getInsResult()); map.put(productName, productDto2); } } List result = new ArrayList<>(map.values()); //添加检验子项 for (SampleProductExportDto productDto2 : result) { productDto2.setInspectionName("--" + productDto2.getInspectionItemSubclass()); sampleList.add(productDto2); } } finalIndex.incrementAndGet(); }); // 添加小报告表头 text = addSmallHead(text, max, rows); // 中间检测值添加 for (int i = 0; i < sampleList.size(); i++) { SampleProductExportDto sample = sampleList.get(i); // 序号 TextRenderData middleRenderData1 = new TextRenderData(); middleRenderData1.setText(sample.getIndex()); Style middleStyle1 = new Style(); middleStyle1.setFontFamily("宋体"); middleStyle1.setColor("000000"); middleRenderData1.setStyle(middleStyle1); text.add(middleRenderData1); // 检验项目 TextRenderData middleRenderData2 = new TextRenderData(); middleRenderData2.setText(sample.getInspectionName()); Style middleStyle2 = new Style(); middleStyle2.setFontFamily("宋体"); middleStyle2.setColor("000000"); middleRenderData2.setStyle(middleStyle2); text.add(middleRenderData2); // 单位 TextRenderData middleRenderData4 = new TextRenderData(); middleRenderData4.setText(sample.getUnit()); Style middleStyle4 = new Style(); middleStyle4.setFontFamily("宋体"); middleStyle4.setColor("000000"); middleRenderData4.setStyle(middleStyle4); text.add(middleRenderData4); //标准要求 TextRenderData middleRenderData5 = new TextRenderData(); middleRenderData5.setText(sample.getTell()); Style middleStyle5 = new Style(); middleStyle5.setFontFamily("宋体"); middleStyle5.setColor("000000"); middleRenderData5.setStyle(middleStyle5); text.add(middleRenderData5); // 检验结果 boolean isMore = false; if (CollectionUtils.isNotEmpty(sample.getLastValueList()) && sample.getLastValueList().size() == max) { // 判断是否是外观, 外观全部合格的话需要合并 if (sample.getInspectionItem().contains("外观")) { // 判定结果 boolean falg = false; if (CollectionUtils.isNotEmpty(sample.getLastValueList())) { // 判断是否有一个错误 if (sample.getInsResultList().stream().anyMatch(s -> s.equals(2))) { falg = true; } else { boolean error = sample.getInsResultList().stream().anyMatch(s -> s.equals(0)); if (!error) { falg = true; } } } else { if (!sample.getInsResult().equals(2)) { falg = true; } } if (falg) { for (int j = 0; j < max; j++) { TextRenderData middleRenderData6 = new TextRenderData(); middleRenderData6.setText((StringUtils.isNotEmpty(sample.getLastValue()) ? sample.getLastValue() : "") + "∑" + (50 + i)); Style middleStyle6 = new Style(); middleStyle6.setFontFamily("宋体"); middleStyle6.setColor("000000"); middleRenderData6.setStyle(middleStyle6); text.add(middleRenderData6); } } else { for (String s : sample.getLastValueList()) { TextRenderData middleRenderData6 = new TextRenderData(); middleRenderData6.setText(s); Style middleStyle6 = new Style(); middleStyle6.setFontFamily("宋体"); middleStyle6.setColor("000000"); middleRenderData6.setStyle(middleStyle6); text.add(middleRenderData6); } } } else { for (String s : sample.getLastValueList()) { TextRenderData middleRenderData6 = new TextRenderData(); middleRenderData6.setText(s); Style middleStyle6 = new Style(); middleStyle6.setFontFamily("宋体"); middleStyle6.setColor("000000"); middleRenderData6.setStyle(middleStyle6); text.add(middleRenderData6); } } } else { for (int j = 0; j < max; j++) { TextRenderData middleRenderData6 = new TextRenderData(); middleRenderData6.setText((StringUtils.isNotEmpty(sample.getLastValue()) ? sample.getLastValue() : "") + "∑" + (7 + i)); Style middleStyle6 = new Style(); middleStyle6.setFontFamily("宋体"); middleStyle6.setColor("000000"); middleRenderData6.setStyle(middleStyle6); text.add(middleRenderData6); } } // 判定结果 String result = ""; if (sample.getInsResult() != null) { switch (sample.getInsResult()) { case 1: result = "√"; break; case 2: result = "×"; break; case 3: result = "-"; break; } } if (CollectionUtils.isNotEmpty(sample.getLastValueList())) { // 判断是否有一个错误 if (sample.getInsResultList().stream().anyMatch(s -> s.equals(3))) { result = "-"; } else { boolean error = sample.getInsResultList().stream().anyMatch(s -> s.equals(0)); if (error) { List collect = new ArrayList<>(); int index = 1; for (Integer count : sample.getInsResultList()) { String type; if (count.equals(0)) { // 添加不合格描述 String item1 = (max == 1 ? "" : "第" + Integer.toString(index) + "次") + sample.getInspectionItem() + (StringUtils.isBlank(sample.getInspectionItemSubclass()) ? "" : "" + sample.getInspectionItemSubclass()); if (resultCh.get().equals("")) { resultCh.set(resultCh.get() + item1); } else { resultCh.set(resultCh.get() + "、" + item1); } type = "×"; } else { type = "√"; } collect.add(type); index++; } result = CollUtil.join(collect, " "); } else { result = "√"; } } } TextRenderData middleRenderData7 = new TextRenderData(); middleRenderData7.setText(result); Style middleStyle7 = new Style(); middleStyle7.setFontFamily("宋体"); middleStyle7.setColor("000000"); middleRenderData7.setStyle(middleStyle7); text.add(middleRenderData7); TextRenderData[] text2 = text.toArray(new TextRenderData[0]); rowRenderData = Rows.of(text2).center().rowAtleastHeight(1).create(); // 0.8厘米 double centimeters = 0.8; int twips = UnitUtils.cm2Twips(centimeters); rowRenderData.getRowStyle().setHeight(twips); rows.add(rowRenderData); text = new ArrayList<>(); } TableRenderData tableRenderData = new TableRenderData(); tableRenderData.setRows(rows); //设置样式 TableStyle tableStyle = new TableStyle(); for (int i = 1; i <= max; i++) { // 根据减压那结果个数修改长度 switch (i) { case 1: tableStyle.setColWidths(new int[]{650, 2900, 850, 2300, 2100, 1200}); break; case 2: tableStyle.setColWidths(new int[]{650, 2700, 850, 2200, 1200, 1200, 1200}); break; case 3: tableStyle.setColWidths(new int[]{650, 2700, 850, 1600, 1000, 1000, 1000, 1200}); break; case 4: tableStyle.setColWidths(new int[]{650, 2400, 850, 1500, 850, 850, 850, 850, 1200}); break; case 5: tableStyle.setColWidths(new int[]{650, 2200, 850, 1350, 750, 750, 750, 750, 750, 1200}); break; } } tableStyle.setWidth("10000"); tableStyle.setAlign(TableRowAlign.CENTER); BorderStyle borderStyle = new BorderStyle(); borderStyle.setColor("000000"); borderStyle.setType(XWPFTable.XWPFBorderType.SINGLE); borderStyle.setSize(4); tableStyle.setLeftBorder(borderStyle); tableStyle.setRightBorder(borderStyle); tableStyle.setInsideHBorder(borderStyle); // 设置水平内边框 tableStyle.setInsideVBorder(borderStyle); tableRenderData.setTableStyle(tableStyle); if (!resultCh.get().equals("")) { resultCh.set("经检验," + resultCh.get() + "所检项目不合格,其余所检项目均合格。"); } else { resultCh.set("经检验此批" + enterFactoryReport.getSample() + "各项目均符合检验规范要求。"); } ConfigureBuilder builder = Configure.builder(); builder.useSpringEL(true); InputStream inputStream = this.getClass().getResourceAsStream("/static/small-report-template.docx"); XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render( new HashMap() {{ put("report", enterFactoryReport); put("standardMethod", standardMethod2.toString().equals("null") ? "" : standardMethod2); put("orderType", orderType); put("table", tableRenderData); put("resultCh", resultCh); put("writeUrl", null); put("examineUrl", null); put("ratifyUrl", null); put("writeDateUrl", null); put("examineDateUrl", null); put("ratifyDateUrl", null); put("seal1", null); }}); try { // 修改换行和合并问题 updaeMerge(template.getXWPFDocument(), true); String name = insReport.getCode().replace("/", "") + "-J.docx"; template.writeAndClose(Files.newOutputStream(Paths.get(wordUrl + "/" + name))); insReport.setUrl("/word/" + name); insReport.setIsPass(0); insReport.setWriteUserId(SecurityUtils.getUserId().intValue());//提交人 insReport.setWriteTime(LocalDateTime.now());//提交时间 // 查询报告, 判断之前是否添加过, 添加过删除 insReportMapper.delete(Wrappers.lambdaQuery() .eq(InsReport::getInsOrderId, insOrder.getId())); insReportMapper.insert(insReport); inputStream.close(); } catch (IOException e) { throw new RuntimeException(e); } } /** * 添加小宝表头 * @param text * @param max * @param rows * @return */ private static List addSmallHead(List text, Integer max, List rows) { RowRenderData rowRenderData; // // 头 TextRenderData headRenderData1 = new TextRenderData(); headRenderData1.setText("序号"); Style headStyle1 = new Style(); headStyle1.setFontFamily("宋体"); headStyle1.setColor("000000"); headRenderData1.setStyle(headStyle1); text.add(headRenderData1); TextRenderData headRenderData2 = new TextRenderData(); headRenderData2.setText("检验项目"); Style headStyle2 = new Style(); headStyle2.setFontFamily("宋体"); headStyle2.setColor("000000"); headRenderData2.setStyle(headStyle2); text.add(headRenderData2); TextRenderData headRenderData4 = new TextRenderData(); headRenderData4.setText("单位"); Style headStyle4 = new Style(); headStyle4.setFontFamily("宋体"); headStyle4.setColor("000000"); headRenderData4.setStyle(headStyle4); text.add(headRenderData4); TextRenderData headRenderData5 = new TextRenderData(); headRenderData5.setText("标准要求"); Style headStyle5 = new Style(); headStyle5.setFontFamily("宋体"); headStyle5.setColor("000000"); headRenderData5.setStyle(headStyle5); text.add(headRenderData5); for (int i = 0; i < max; i++) { TextRenderData headRenderData6 = new TextRenderData(); headRenderData6.setText("检验结果∑6"); Style headStyle6 = new Style(); headStyle6.setFontFamily("宋体"); headStyle6.setColor("000000"); headRenderData6.setStyle(headStyle6); text.add(headRenderData6); } TextRenderData headRenderData7 = new TextRenderData(); headRenderData7.setText("单项判断"); Style headStyle7 = new Style(); headStyle7.setFontFamily("宋体"); headStyle7.setColor("000000"); headRenderData7.setStyle(headStyle7); text.add(headRenderData7); TextRenderData[] text3 = text.toArray(new TextRenderData[0]); rowRenderData = Rows.of(text3).center().rowAtleastHeight(1).create(); rows.add(rowRenderData); text = new ArrayList<>(); // 第二行(可能没有) if (max > 1) { TextRenderData tagRenderData1 = new TextRenderData(); tagRenderData1.setText(""); Style tagStyle1 = new Style(); tagStyle1.setFontFamily("宋体"); tagStyle1.setColor("000000"); tagRenderData1.setStyle(tagStyle1); text.add(tagRenderData1); TextRenderData tagRenderData2 = new TextRenderData(); tagRenderData2.setText("标识"); Style tagStyle2 = new Style(); tagStyle2.setFontFamily("宋体"); tagStyle2.setColor("000000"); tagRenderData2.setStyle(tagStyle2); text.add(tagRenderData2); TextRenderData tagRenderData4 = new TextRenderData(); tagRenderData4.setText(""); Style tagStyle4 = new Style(); tagStyle4.setFontFamily("宋体"); tagStyle4.setColor("000000"); tagRenderData4.setStyle(tagStyle4); text.add(tagRenderData4); TextRenderData tagRenderData5 = new TextRenderData(); tagRenderData5.setText(""); Style tagStyle5 = new Style(); tagStyle5.setFontFamily("宋体"); tagStyle5.setColor("000000"); tagRenderData5.setStyle(tagStyle5); text.add(tagRenderData5); for (int i = 0; i < max; i++) { TextRenderData tagRenderData6 = new TextRenderData(); tagRenderData6.setText("标识" + (i + 1)); Style tagStyle6 = new Style(); tagStyle6.setFontFamily("宋体"); tagStyle6.setColor("000000"); tagRenderData6.setStyle(tagStyle6); text.add(tagRenderData6); } TextRenderData tagRenderData7 = new TextRenderData(); tagRenderData7.setText(""); Style tagStyle7 = new Style(); tagStyle7.setFontFamily("宋体"); tagStyle7.setColor("000000"); tagRenderData7.setStyle(tagStyle7); text.add(tagRenderData7); TextRenderData[] text4 = text.toArray(new TextRenderData[0]); rowRenderData = Rows.of(text4).center().rowAtleastHeight(1).create(); rows.add(rowRenderData); text = new ArrayList<>(); } return text; } /***************************************************** 大报告 ***************************************************************************/ /** * 创建大报告 * @param orderId * @param insOrder * @param */ private void addBitReport(Integer orderId, InsOrder insOrder) { //samples是不包括带有"/"的样品 List samples = insSampleMapper.selectSampleProductListByOrderId(orderId); InsReport insReport = new InsReport(); insReport.setCode(insOrder.getEntrustCode()); insReport.setInsOrderId(orderId); List> tables = new ArrayList<>(); Set standardMethod = new HashSet<>(); Set deviceSet = new HashSet<>(); Set models = new HashSet<>(); // 查询检验项数量 AtomicInteger productSize = new AtomicInteger(); String[] monthNames = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; List resultChList = new ArrayList<>(); List resultEnList = new ArrayList<>(); // 判断是否是只有一个样品 boolean isOneSample = samples.size() == 1 ? true : false; /*基础报告(根据绘制的原始记录模版形成)*/ samples.forEach(a -> { models.add(a.getModel()); String standardMethodCode = baseMapper.getStandardMethodCode(a.getStandardMethodListId()); if (StrUtil.isNotBlank(a.getSpecialStandardMethod())) { standardMethodCode = standardMethodCode + "+" + a.getSpecialStandardMethod(); } standardMethod.add(standardMethodCode); for (InsProduct b : a.getInsProduct()) { if (b.getInsProductResult() != null) { List jsonObjects = JSON.parseArray(b.getInsProductResult().getEquipValue(), JSONObject.class); for (JSONObject jsonObject : jsonObjects) { if (!"".equals(jsonObject.get("v") + "")) { List v = StrUtil.split(jsonObject.get("v") + "", ","); deviceSet.addAll(v); } } } } // 收样日期 List rows = new ArrayList<>(); List text = new ArrayList<>(); RowRenderData rowRenderData = null; InsSample insSamples = null; int max = 1; List cableTags = new ArrayList<>(); // 判断是否为原材料 if (insOrder.getTypeSource() != null && insOrder.getTypeSource().equals(1)) { InsOrder one = insOrderService.getOne(Wrappers.lambdaQuery() .eq(InsOrder::getIfsInventoryId, insOrder.getIfsInventoryId()) .eq(InsOrder::getOrderType, InsOrderTypeConstants.ENTER_THE_FACTORY) .ne(InsOrder::getState, -1) .last("limit 1")); // 判断之前是否有进厂检验 if (one != null) { insSamples = insSampleMapper.selectOne(Wrappers.lambdaQuery() .eq(InsSample::getInsOrderId, one.getId()) .last("limit 1")); } max = a.getQuantity(); // 季度检验需要进厂检验的设备 // 查询是否有进厂检验 InsOrder order = insOrderMapper.selectOne(Wrappers.lambdaQuery() .eq(InsOrder::getIfsInventoryId, insOrder.getIfsInventoryId()) .ne(InsOrder::getState, -1) .eq(InsOrder::getOrderType, InsOrderTypeConstants.ENTER_THE_FACTORY) .ne(InsOrder::getId, insOrder.getId()) .last("limit 1")); if (order != null) { List sampleProductDtos = insSampleMapper.selectSampleProductListByOrderId(order.getId()); for (InsProduct b : sampleProductDtos.get(0).getInsProduct()) { if (b.getInsProductResult() != null) { List jsonObjects = JSON.parseArray(b.getInsProductResult().getEquipValue(), JSONObject.class); for (JSONObject jsonObject : jsonObjects) { if (!"".equals(jsonObject.get("v") + "")) { List v = StrUtil.split(jsonObject.get("v") + "", ","); deviceSet.addAll(v); } } } } } insOrder.setSampleView(insOrder.getSample()); String sampleViewEn = insSampleMapper.getSampleEn(insOrder.getSample()); if (StringUtils.isBlank(sampleViewEn)) { sampleViewEn = insSampleMapper.getSampleEnByObject(insOrder.getSample()); } insOrder.setSampleViewEn(sampleViewEn); } else { // 获得批量检验的总数 max = insOrderMapper.selectSampleMax(a.getId()); cableTags = insOrderMapper.selectSampleCableTag(a.getId()); } // 表头添加 addHead(a, text, rowRenderData, rows, max, cableTags); text = new ArrayList<>(); // 添加检测值 productSize.set(addTestValue(a, text, rowRenderData, rows, max, resultChList, resultEnList, insSamples, cableTags, isOneSample)); text = new ArrayList<>(); // 结尾添加 addEnding(text, rowRenderData, rows, max); text = new ArrayList<>(); List tables1 = new ArrayList<>(); TableRenderData tableRenderData = new TableRenderData(); tableRenderData.setRows(new ArrayList<>()); double totalHeight = 0.0; // 用于跟踪当前表格的总行高 double heightThreshold = 9300.0; // 阈值, List firstTwoRows = new ArrayList<>(); // 保存前两行以便复制到新表格 List endTwoRows = new ArrayList<>(); // 保存最后一行以便复制到新表格 // 保存前两行以便复制到新表格 firstTwoRows.add(rows.get(0)); firstTwoRows.add(rows.get(1)); // 保存最后一行 endTwoRows.add(rows.get(rows.size() - 1)); for (RowRenderData row : rows) { double rowHeight = row.getRowStyle().getHeight(); // 获取当前行的行高 // // 判断字体内容是否有多的, 多的行高乘倍数 RowRenderData lastRaw = rows.get(rows.size() - 1); // 排除最后一行 if (rows.get(0) != row && rows.get(1) != row && lastRaw != row) { // 调整高度 rowHeight = adjustRowHeight(row, rowHeight, max); } totalHeight += rowHeight; // 更新总行高 if (totalHeight >= heightThreshold) { // 创建新表格并复制前两行 TableRenderData newTableRenderData = new TableRenderData(); newTableRenderData.setRows(new ArrayList<>(firstTwoRows)); //设置样式 TableStyle tableStyle = new TableStyle(); for (int i = 1; i <= max; i++) { // 根据减压那结果个数修改长度 switch (i) { case 1: tableStyle.setColWidths(new int[]{650, 2000, 2000, 850, 2200, 2100, 1200}); break; case 2: tableStyle.setColWidths(new int[]{650, 1400, 1400, 850, 2100, 1200, 1200, 1200}); break; case 3: tableStyle.setColWidths(new int[]{650, 1400, 1400, 850, 1500, 1000, 1000, 1000, 1200}); break; case 4: tableStyle.setColWidths(new int[]{650, 1200, 1200, 850, 1400, 850, 850, 850, 850, 1200}); break; case 5: tableStyle.setColWidths(new int[]{650, 1100, 1100, 850, 1350, 750, 750, 750, 750, 750, 1200}); break; } } tableStyle.setWidth("10000"); tableStyle.setAlign(TableRowAlign.CENTER); BorderStyle borderStyle = new BorderStyle(); borderStyle.setColor("000000"); borderStyle.setType(XWPFTable.XWPFBorderType.THICK); borderStyle.setSize(14); tableStyle.setLeftBorder(borderStyle); tableStyle.setTopBorder(borderStyle); tableStyle.setRightBorder(borderStyle); tableStyle.setBottomBorder(borderStyle); tableRenderData.setTableStyle(tableStyle); newTableRenderData.setTableStyle(tableStyle); // 添加最后一行 tableRenderData.addRow(rows.get(rows.size() - 1)); tables1.add(tableRenderData); tableRenderData = newTableRenderData; totalHeight = rowHeight; } tableRenderData.getRows().add(row); } if (!tableRenderData.getRows().isEmpty() && tableRenderData.getRows().size() != 3) { //设置样式 TableStyle tableStyle = new TableStyle(); for (int i = 1; i <= max; i++) { // 根据减压那结果个数修改长度 switch (i) { case 1: tableStyle.setColWidths(new int[]{650, 2000, 2000, 850, 2200, 2100, 1200}); break; case 2: tableStyle.setColWidths(new int[]{650, 1400, 1400, 850, 2100, 1200, 1200, 1200}); break; case 3: tableStyle.setColWidths(new int[]{650, 1400, 1400, 850, 1500, 1000, 1000, 1000, 1200}); break; case 4: tableStyle.setColWidths(new int[]{650, 1200, 1200, 850, 1400, 850, 850, 850, 850, 1200}); break; case 5: tableStyle.setColWidths(new int[]{650, 1100, 1100, 850, 1350, 750, 750, 750, 750, 750, 1200}); break; } } tableStyle.setWidth("10000"); tableStyle.setAlign(TableRowAlign.CENTER); BorderStyle borderStyle = new BorderStyle(); borderStyle.setColor("000000"); borderStyle.setType(XWPFTable.XWPFBorderType.THICK); borderStyle.setSize(14); tableStyle.setLeftBorder(borderStyle); tableStyle.setTopBorder(borderStyle); tableStyle.setRightBorder(borderStyle); tableStyle.setBottomBorder(borderStyle); tableRenderData.setTableStyle(tableStyle); tables1.add(tableRenderData); } tables1.forEach(table -> { Map tableMap = new HashMap<>(); tableMap.put("table", table); tableMap.put("report", insReport); tables.add(tableMap); }); }); StringBuilder standardMethod2 = new StringBuilder(); for (String s : standardMethod) { standardMethod2.append("、").append(s); } standardMethod2.replace(0, 1, ""); tables.forEach(table -> { table.put("tableSize", tables.size() + 1); }); // 设备信息 List> deviceList = null; if (CollectionUtils.isNotEmpty(deviceSet)) { deviceList = insOrderMapper.selectDeviceList(deviceSet); } if (CollectionUtils.isNotEmpty(deviceList)) { int count = 1; for (Map stringMap : deviceList) { stringMap.put("index", String.valueOf(count)); count++; } } Map codeStr = new HashMap<>(); codeStr.put("报告编号", insReport.getCode()); codeStr.put("样品名称", insOrder.getSample()); codeStr.put("规格型号", samples.get(0).getModel()); codeStr.put("发放日期", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); String modelStr = CollUtil.join(models, "\n"); // 检测类型 String orderType = null; orderType = iSysDictTypeService.selectLabelByDict(DictDataConstants.CHECK_TYPE, insOrder.getOrderType()); // 判断第一个字典是否为空 if (StringUtils.isBlank(orderType)) { orderType = iSysDictTypeService.selectLabelByDict(DictDataConstants.CHECK_TYPE1, insOrder.getOrderType()); } // 来样方式 String formType = iSysDictTypeService.selectLabelByDict(DictDataConstants.FORM_TYPE, insOrder.getFormType()); // 样品状态 String sampleStatus = iSysDictTypeService.selectLabelByDict(DictDataConstants.SAMPLE_STATUS_LIST, insOrder.getSampleStatus()); ; // 公司信息 Custom custom = customMapper.selectById(insOrder.getCompanyId()); // 查询判断是否有不判定项目,和全都是判定项 int judgeType = insProductMapper.selectNoJudge(insOrder.getId()); String resultCh = ""; String resultEn = ""; for (String reference : resultChList) { resultCh = resultCh + reference; } for (String reference : resultEnList) { resultEn = resultEn + reference; } switch (judgeType) { // 没有不判定项目 case 1: if (StringUtils.isNotBlank(resultCh)) { resultCh = "依据委托要求," + resultCh + "所检项目不合格,其余所检项目均合格。"; resultEn = "According to commissioned requirements," + resultEn + " these inspected items do not meet the requirements, all other inspected items meet the requirements."; } else { resultCh = "依据委托要求,所检项目均符合要求。"; resultEn = "According to commissioned requirements, all the tested items meet the requirements."; } break; // 存在不判定项目 case 2: if (StringUtils.isNotBlank(resultCh)) { resultCh = "依据委托要求," + resultCh + "所检项目不合格,其余所检项目除不判定外均符合要求。"; resultEn = "According to commissioned requirements," + resultEn + " these inspected items do not meet the requirements, all the inspected items meet the requirements except that they are not judged."; } else { resultCh = "依据委托要求,所检项目除不判定外均符合要求。"; resultEn = "According to commissioned requirements, all the tested items meet the requirements."; } break; // 都是不判定项目 case 3: resultCh = "依据委托要求,所检项目均不判定。"; resultEn = "According to commissioned requirements, the items examined are not judged."; break; } /*获取附件图片类型*/ List> images = new ArrayList<>(); List insOrderFiles = insOrderFileMapper.selectList(Wrappers.lambdaQuery().eq(InsOrderFile::getType, 1).eq(InsOrderFile::getInsOrderId, orderId)); if (CollectionUtils.isNotEmpty(insOrderFiles)) { insOrderFiles.forEach(insOrderFile -> { Map 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("/"); } // 抽样日期 // 成品是抽样时间 LocalDateTime sendTime = insOrder.getSendTime(); if (insOrder.getTypeSource() != null && insOrder.getTypeSource().equals(1)) { // 原材料收样日期是报检日期 IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(insOrder.getIfsInventoryId()); sendTime = ifsInventoryQuantity.getDeclareDate(); } // 检验时间 抽样时间-提交时间 LocalDateTime now = LocalDateTime.now(); // 提交时间 LocalDateTime submitTime = LocalDateTime.now(); // 判断是否有提交时间 if (insOrder.getFirstSubmitDate() != null) { submitTime = insOrder.getFirstSubmitDate(); } String insTime = insOrder.getSendTime().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日")) + "-" + submitTime.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日")); String insTimeEn = monthNames[insOrder.getSendTime().getMonthValue() - 1] + " " + insOrder.getSendTime().format(DateTimeFormatter.ofPattern("dd, yyyy")) + "-" + monthNames[submitTime.getMonthValue() - 1] + " " + submitTime.format(DateTimeFormatter.ofPattern("dd, yyyy")); //检验项目的环境 String environment = ""; environment = (ObjectUtils.isNotEmpty(insOrder.getTemperature()) ? insOrder.getTemperature() + "℃ " : "") + (ObjectUtils.isNotEmpty(insOrder.getHumidity()) ? insOrder.getHumidity() + "%" : ""); String finalEnvironment = environment; LocalDateTime finalSendTime = sendTime; String finalResultCh = resultCh; String finalResultEn = resultEn; String finalOrderType = orderType; List> finalDeviceList = deviceList; String finalModelStr = modelStr; InputStream inputStream = this.getClass().getResourceAsStream("/static/report-template.docx"); Configure configure = Configure.builder() .bind("deviceList", new HackLoopTableRenderPolicy()) .useSpringEL(true) .build(); XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render( new HashMap() {{ put("order", insOrder); put("report", insReport); put("environment", finalEnvironment); put("custom", custom); put("sampleSize", insOrder.getTestQuantity()); put("tables", tables); put("tableSize", tables.size() + 1); put("standardMethod", (standardMethod2.toString().equals("null") ? "" : standardMethod2)); put("deviceList", finalDeviceList); put("twoCode", null); put("models", finalModelStr); put("productSize", productSize.get()); put("createTime", now.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"))); put("createTimeEn", monthNames[now.getMonthValue() - 1] + " " + now.format(DateTimeFormatter.ofPattern("dd, yyyy"))); put("insTime", insTime); put("insTimeEn", insTimeEn); put("writeUrl", null); put("insUrl", null); put("images", images); put("examineUrl", null); put("ratifyUrl", null); put("orderType", finalOrderType); put("getTime", finalSendTime.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"))); put("getTimeEn", monthNames[finalSendTime.getMonthValue() - 1] + " " + finalSendTime.format(DateTimeFormatter.ofPattern("dd, yyyy"))); put("seal1", null); put("seal2", null); put("formTypeCh", formType); put("formTypeEn", insOrder.getFormType()); put("resultCh", finalResultCh); put("resultEn", finalResultEn); put("sampleStatus", sampleStatus); }}); try { // 修改换行和合并问题 updaeMerge(template.getXWPFDocument(), false); String name = insReport.getCode().replace("/", "") + ".docx"; template.writeAndClose(Files.newOutputStream(Paths.get(wordUrl + "/" + name))); insReport.setUrl("/word/" + name); insReport.setWriteUserId(SecurityUtils.getUserId().intValue());//提交人 insReport.setWriteTime(LocalDateTime.now());//提交时间 // 查询报告, 判断之前是否添加过, 添加过删除 insReportMapper.delete(Wrappers.lambdaQuery() .eq(InsReport::getInsOrderId, insOrder.getId())); insReportMapper.insert(insReport); inputStream.close(); } catch (IOException e) { throw new RuntimeException(e); } } /** * 调整高度 * @param row * @param rowHeight * @return */ private static double adjustRowHeight(RowRenderData row, double rowHeight, int max) { // 根据检验项目名称进行高度调整 TextRenderData renderData = (TextRenderData) row.getCells().get(1).getParagraphs().get(0).getContents().get(0); String dataText = renderData.getText(); TextRenderData valueData = (TextRenderData) row.getCells().get(5).getParagraphs().get(0).getContents().get(0); String valueText = valueData.getText(); // 获取检测内容判断是否超出 if (StringUtils.isNotBlank(dataText) && dataText.contains("@")) { double number = 1; double chinaLength = 0; double englishLength = 0; double valueLength = 0; // 根据线芯个数判断距离 switch (max) { case 1: chinaLength = 15; englishLength = 30; valueLength = 8; break; case 2: chinaLength = 13; englishLength = 25; valueLength = 6; break; case 3: chinaLength = 13; englishLength = 25; valueLength = 4; break; case 4: chinaLength = 13; englishLength = 23; valueLength = 3; break; case 5: chinaLength = 12; englishLength = 22; valueLength = 2; break; } // 根据@符号截取中英文 String[] split = dataText.split("@"); // 文字倍数 double chinaMultiple = (Math.ceil(split[0].length() / chinaLength)) - 1; // 英文倍数 double englishMultiple = (Math.ceil(split[1].length() / englishLength)) - 1; double multiple = number + chinaMultiple * 0.5 + englishMultiple * 0.5; if (StringUtils.isNotBlank(valueText)) { double valueMultiple = (Math.ceil(valueText.length() / valueLength)) - 1; if (multiple < number + valueMultiple * 0.4) { multiple = number + valueMultiple * 0.4; } } rowHeight = rowHeight * multiple; } return rowHeight; } /** * 合并单元格 */ private void updaeMerge(XWPFDocument document, boolean isSmall) { // 处理合并单元格的问题 // 获取文档中的所有表格 List xwpfTables = document.getTables(); // 遍历表格 for (int i = 1; i < xwpfTables.size(); i++) { // 创建一个HashSet来存储唯一的字符串(这里基于"∑"分割后的第二部分) Set set1 = new HashSet<>(); // 创建一个HashMap来存储每个唯一字符串及其对应的单元格位置信息 Map> 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("∑"); // 如果分割后的第二部分是新的(即之前未出现过),则添加到set1并创建位置信息map if (set1.add(split[1])) { Map 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 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); } } // 判断小高报告还是大报告 if (isSmall) { // 获取单元格 XWPFTableCell cell = xwpfTables.get(i).getRows().get(j).getTableCells().get(k); XWPFParagraph paragraph = cell.getParagraphArray(0); String originalText = paragraph.getText(); String newText = originalText.split("∑")[0]; List runs = paragraph.getRuns(); for (XWPFRun run : runs) { run.setText("", 0); // 清空 run 中的文本 } if (!runs.isEmpty()) { XWPFRun run = runs.get(0); run.setText(newText); // 复制样式 run.setFontFamily(paragraph.getRuns().get(0).getFontFamily()); run.setFontSize(paragraph.getRuns().get(0).getFontSize()); run.setBold(paragraph.getRuns().get(0).isBold()); run.setItalic(paragraph.getRuns().get(0).isItalic()); run.setUnderline(paragraph.getRuns().get(0).getUnderline()); run.setColor(paragraph.getRuns().get(0).getColor()); } cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER); paragraph.setAlignment(ParagraphAlignment.CENTER); } else { // 移除包含"∑"的段落,并重新设置单元格文本和样式 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(ParagraphAlignment.CENTER); } } } } // 单元格排序, 避免格式错乱 List>> entries = new ArrayList<>(maps.entrySet()); entries.sort((o1, o2) -> o1.getValue().get("sc") - o2.getValue().get("sc")); // 按照顺序添加进集合 List list = new ArrayList<>(); for (Map.Entry> entry : entries) { list.add(entry.getKey()); } for (int a = list.size() - 1; a >= 0; a--) { Map 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) { } } } } //处理中英文换行的问题 List xwpfTables1 = document.getTables(); for (int i = 1; i < xwpfTables1.size(); 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("@")) { if (isSmall) { // 获取原有段落的第一个 XWPFRun String text = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getText(); XWPFParagraph oldParagraph = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getParagraphs().get(0); XWPFRun oldRun = oldParagraph.getRuns().get(0); // 保存原有样式 String fontFamily = oldRun.getFontFamily(); int fontSize = oldRun.getFontSize(); boolean isBold = oldRun.isBold(); boolean isItalic = oldRun.isItalic(); boolean isUnderline = oldRun.getUnderline() != UnderlinePatterns.NONE; // 删除原有段落 xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).removeParagraph(0); // 添加新段落 XWPFParagraph newParagraph = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).addParagraph(); XWPFRun newRun = newParagraph.createRun(); // 应用保存的样式 newRun.setFontFamily(fontFamily); newRun.setFontSize(fontSize); newRun.setBold(isBold); newRun.setItalic(isItalic); if (isUnderline) { newRun.setUnderline(UnderlinePatterns.SINGLE); } // 设置新文本 String[] split = text.split("@"); newRun.setText(split[0]); if (split.length > 1) { newRun.addBreak(); newRun.setText(split[1]); } // 设置段落对齐方式 newParagraph.setAlignment(ParagraphAlignment.CENTER); } else { 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(ParagraphAlignment.CENTER); } } } } } } /** * 添加报告表头 * @param sample * @param text * @param rowRenderData * @param rows * @param max * @param cableTags 线芯颜色 */ private static void addHead(SampleProductDto sample, List text, RowRenderData rowRenderData, List rows, int max, List cableTags) { // 第一行 TextRenderData firstRenderData1 = new TextRenderData(); firstRenderData1.setText("样品编号@Sample No.∑1"); Style firstStyle1 = new Style(); firstStyle1.setFontFamily("宋体"); firstStyle1.setColor("000000"); firstRenderData1.setStyle(firstStyle1); text.add(firstRenderData1); TextRenderData firstRenderData2 = new TextRenderData(); firstRenderData2.setText("样品编号@Sample No.∑1"); Style firstStyle2 = new Style(); firstStyle2.setFontFamily("宋体"); firstStyle2.setColor("000000"); firstRenderData2.setStyle(firstStyle2); text.add(firstRenderData2); TextRenderData firstRenderData3 = new TextRenderData(); firstRenderData3.setText(sample.getSampleCode() + "∑2"); Style firstStyle3 = new Style(); firstStyle3.setFontFamily("宋体"); firstStyle3.setColor("000000"); firstRenderData3.setStyle(firstStyle3); text.add(firstRenderData3); TextRenderData firstRenderData4 = new TextRenderData(); firstRenderData4.setText(sample.getSampleCode() + "∑2"); Style firstStyle4 = new Style(); firstStyle4.setFontFamily("宋体"); firstStyle4.setColor("000000"); firstRenderData4.setStyle(firstStyle4); text.add(firstRenderData4); // 判断循环条件 if (max <= 2) { for (int i = 0; i < max; i++) { TextRenderData firstRenderData5 = new TextRenderData(); firstRenderData5.setText("规格型号@Type∑3"); Style firstStyle5 = new Style(); firstStyle5.setFontFamily("宋体"); firstStyle5.setColor("000000"); firstRenderData4.setStyle(firstStyle5); text.add(firstRenderData5); } for (int i = 0; i < 2; i++) { TextRenderData firstRenderData6 = new TextRenderData(); firstRenderData6.setText(sample.getModel() + "∑4"); Style firstStyle6 = new Style(); firstStyle6.setFontFamily("宋体"); firstStyle6.setColor("000000"); firstRenderData6.setStyle(firstStyle6); text.add(firstRenderData6); } } else { for (int i = 0; i < 2; i++) { TextRenderData firstRenderData5 = new TextRenderData(); firstRenderData5.setText("规格型号@Type∑3"); Style firstStyle5 = new Style(); firstStyle5.setFontFamily("宋体"); firstStyle5.setColor("000000"); firstRenderData4.setStyle(firstStyle5); text.add(firstRenderData5); } for (int i = 0; i < max; i++) { TextRenderData firstRenderData6 = new TextRenderData(); firstRenderData6.setText(sample.getModel() + "∑4"); Style firstStyle6 = new Style(); firstStyle6.setFontFamily("宋体"); firstStyle6.setColor("000000"); firstRenderData6.setStyle(firstStyle6); text.add(firstRenderData6); } } TextRenderData[] text2 = text.toArray(new TextRenderData[0]); rowRenderData = Rows.of(text2).center().rowAtleastHeight(1).create(); rows.add(rowRenderData); text = new ArrayList<>(); // 第二行 TextRenderData headRenderData1 = new TextRenderData(); headRenderData1.setText("序号@NO."); Style headStyle1 = new Style(); headStyle1.setFontFamily("宋体"); headStyle1.setColor("000000"); headRenderData1.setStyle(headStyle1); text.add(headRenderData1); TextRenderData headRenderData2 = new TextRenderData(); headRenderData2.setText("检验项目@Test item∑5"); Style headStyle2 = new Style(); headStyle2.setFontFamily("宋体"); headStyle2.setColor("000000"); headRenderData2.setStyle(headStyle2); text.add(headRenderData2); TextRenderData headRenderData3 = new TextRenderData(); headRenderData3.setText("检验项目@Test item∑5"); Style headStyle3 = new Style(); headStyle3.setFontFamily("宋体"); headStyle3.setColor("000000"); headRenderData3.setStyle(headStyle3); text.add(headRenderData3); TextRenderData headRenderData4 = new TextRenderData(); headRenderData4.setText("单位@Unit"); Style headStyle4 = new Style(); headStyle4.setFontFamily("宋体"); headStyle4.setColor("000000"); headRenderData4.setStyle(headStyle4); text.add(headRenderData4); TextRenderData headRenderData5 = new TextRenderData(); headRenderData5.setText("标准要求@Requirement"); Style headStyle5 = new Style(); headStyle5.setFontFamily("宋体"); headStyle5.setColor("000000"); headRenderData5.setStyle(headStyle5); text.add(headRenderData5); for (int i = 0; i < max; i++) { TextRenderData headRenderData6 = new TextRenderData(); headRenderData6.setText("检验结果@Test result∑6"); Style headStyle6 = new Style(); headStyle6.setFontFamily("宋体"); headStyle6.setColor("000000"); headRenderData6.setStyle(headStyle6); text.add(headRenderData6); } TextRenderData headRenderData7 = new TextRenderData(); headRenderData7.setText("结论@Conclusion"); Style headStyle7 = new Style(); headStyle7.setFontFamily("宋体"); headStyle7.setColor("000000"); headRenderData7.setStyle(headStyle7); text.add(headRenderData7); TextRenderData[] text3 = text.toArray(new TextRenderData[0]); rowRenderData = Rows.of(text3).center().rowAtleastHeight(1).create(); rows.add(rowRenderData); text = new ArrayList<>(); // 线芯颜色 if (CollectionUtils.isNotEmpty(cableTags)) { TextRenderData cableRenderData1 = new TextRenderData(); cableRenderData1.setText(""); Style cableStyle1 = new Style(); cableStyle1.setFontFamily("宋体"); cableStyle1.setColor("000000"); cableRenderData1.setStyle(cableStyle1); text.add(cableRenderData1); TextRenderData cableRenderData2 = new TextRenderData(); cableRenderData2.setText("绝缘线芯颜色和标志@Insulation core color and mark∑200"); Style cableStyle2 = new Style(); cableStyle2.setFontFamily("宋体"); cableStyle2.setColor("000000"); cableRenderData2.setStyle(cableStyle2); text.add(cableRenderData2); TextRenderData cableRenderData3 = new TextRenderData(); cableRenderData3.setText("绝缘线芯颜色和标志@Insulation core color and mark∑200"); Style cableStyle3 = new Style(); cableStyle3.setFontFamily("宋体"); cableStyle3.setColor("000000"); cableRenderData3.setStyle(cableStyle3); text.add(cableRenderData3); TextRenderData cableRenderData4 = new TextRenderData(); cableRenderData4.setText(""); Style cableStyle4 = new Style(); cableStyle4.setFontFamily("宋体"); cableStyle4.setColor("000000"); cableRenderData4.setStyle(cableStyle4); text.add(cableRenderData4); TextRenderData cableRenderData5 = new TextRenderData(); cableRenderData5.setText(""); Style cableStyle5 = new Style(); cableStyle5.setFontFamily("宋体"); cableStyle5.setColor("000000"); cableRenderData5.setStyle(cableStyle5); text.add(cableRenderData5); for (String cableTag : cableTags) { TextRenderData cableRenderData6 = new TextRenderData(); cableRenderData6.setText(cableTag); Style cableStyle6 = new Style(); cableStyle6.setFontFamily("宋体"); cableStyle6.setColor("000000"); cableRenderData6.setStyle(cableStyle6); text.add(cableRenderData6); } TextRenderData cableRenderData7 = new TextRenderData(); cableRenderData7.setText("-"); Style cableStyle7 = new Style(); cableStyle7.setFontFamily("宋体"); cableStyle7.setColor("000000"); cableRenderData7.setStyle(cableStyle7); text.add(cableRenderData7); TextRenderData[] text4 = text.toArray(new TextRenderData[0]); rowRenderData = Rows.of(text4).center().rowAtleastHeight(1).create(); rows.add(rowRenderData); text = new ArrayList<>(); } } /** * 添加检测值 * @param a 当前样品 * @param text * @param rowRenderData * @param rows * @param max 检验数量 * @param resultChList 不符合信息中文 * @param resultEhList 不符合信息英文 * @param insSamples * @param cableTags 线芯颜色 * @param isOneSample 判断是否是只有一个样品 */ private int addTestValue(SampleProductDto a, List text, RowRenderData rowRenderData, List rows, int max, List resultChList, List resultEhList, InsSample insSamples, List cableTags, boolean isOneSample) { // 检验项总数 AtomicInteger productSize = new AtomicInteger(1); // 不合格信息 AtomicReference resultCh = new AtomicReference<>(""); AtomicReference resultEn = new AtomicReference<>(""); // 查询检验结果 List ids = new ArrayList<>(); ids.add(a.getId()); List sampleProductDto2s = insOrderMapper.selectSampleBySampleId(ids); // 判断是否是季度检验, 且有没有进厂检验, 有进厂检验进厂检验的信息赋值到季度上 if (insSamples != null) { // 查询检验内容 List enterDto = insOrderMapper.selectSampleBySampleIdOne(insSamples.getId()); // 排除掉进厂报告重复的 enterDto = enterDto.stream().filter(sampleProductDto2 -> { // 判断检验项检验子项是否一样, 一样就直接返回false排除 return !sampleProductDto2s.stream().anyMatch(dto -> { String quarter = sampleProductDto2.getInspectionItem() + sampleProductDto2.getInspectionItemSubclass(); String enter = dto.getInspectionItem() + dto.getInspectionItemSubclass(); return quarter.equals(enter); }); }).collect(Collectors.toList()); sampleProductDto2s.addAll(enterDto); } // 格式化修改检验项 this.formatProducts(sampleProductDto2s); List sampleList = new ArrayList<>(); // 获取检验项分类的 Map> itemClassMap = sampleProductDto2s.stream().filter(sampleProductDto2 -> StringUtils.isNotBlank(sampleProductDto2.getInspectionItemClass())) .collect(Collectors.groupingBy(SampleProductExportDto::getInspectionItemClass)); List>> itemClassEntries = new ArrayList<>(itemClassMap.entrySet()); itemClassEntries.sort((o1, o2) -> { // 再比较 sort Integer sort1 = o1.getValue().get(0).getSort(); Integer sort2 = o2.getValue().get(0).getSort(); sort1 = sort1 == null ? 0 : sort1; sort2 = sort2 == null ? 0 : sort2; return sort1.compareTo(sort2); }); // 创建一个 LinkedHashMap 来保持插入顺序 Map> itemClassList = new LinkedHashMap<>(); for (Map.Entry> entry : itemClassEntries) { itemClassList.put(entry.getKey(), entry.getValue()); } if (CollectionUtils.isNotEmpty(itemClassList)) { AtomicInteger finalIndex = new AtomicInteger(1); // 获取检验项分类相同的 itemClassList.forEach((s, sampleClass) -> { // 添加检验分类 SampleProductExportDto classDto = new SampleProductExportDto(); // 判断是否有英文名称 SampleProductExportDto temp = sampleClass.get(0); if (StringUtils.isNotBlank(temp.getInspectionItemClassEN())) { classDto.setInspectionName(temp.getInspectionItemClass() + "@" + temp.getInspectionItemClassEN()); } else { classDto.setInspectionName(temp.getInspectionItemClass()); } classDto.setIndex(Integer.toString(finalIndex.get())); sampleList.add(classDto); // 添加检验项 Map> sortedMap = sampleClass.stream() .filter(sampleProductDto2 -> StringUtils.isNotBlank(sampleProductDto2.getInspectionItem())) .collect(Collectors.groupingBy(SampleProductExportDto::getInspectionItemRadius)); List>> entries = new ArrayList<>(sortedMap.entrySet()); entries.sort((o1, o2) -> { // 再比较 sort Integer sort1 = o1.getValue().get(0).getSort(); Integer sort2 = o2.getValue().get(0).getSort(); sort1 = sort1 == null ? 0 : sort1; sort2 = sort2 == null ? 0 : sort2; return sort1.compareTo(sort2); }); // 创建一个 LinkedHashMap 来保持插入顺序 Map> item = new LinkedHashMap<>(); for (Map.Entry> entry : entries) { item.put(entry.getKey(), entry.getValue()); } AtomicInteger belowIndex = new AtomicInteger(1); item.forEach((s2, sampleProductDtoInside) -> { // 添加检验项 SampleProductExportDto dto2 = new SampleProductExportDto(); // 判断是否有英文名称 SampleProductExportDto temp2 = sampleProductDtoInside.get(0); if (StringUtils.isNotBlank(temp2.getInspectionItemEn())) { dto2.setInspectionName(temp2.getInspectionItem() + "@" + temp2.getInspectionItemEn()); } else { dto2.setInspectionName(temp2.getInspectionItem()); } // 判断有没有条件字段填充到要求 if (StringUtils.isNotBlank(temp2.getRadius())) { dto2.setTell("(" + temp2.getRadius() + ")"); } // 判断是否有检验子项,没有就把检验参数填充 dto2.setIndex(finalIndex.get() + "." + belowIndex.get()); if (StringUtils.isBlank(temp2.getInspectionItemSubclass())) { // 处理集合 Map map = new LinkedHashMap<>(); for (SampleProductExportDto productDto2 : sampleProductDtoInside) { String productName = productDto2.getInspectionItemClass() + productDto2.getInspectionItem(); if (map.containsKey(productName)) { // 如果名称已经存在,添加 lastValue 值到 lastValueList 列表 map.get(productName) .getLastValueList() .add(productDto2.getLastValue()); map.get(productName) .getInsResultList() .add(productDto2.getInsResult()); // 添加颜色对应的值和结果 if (StringUtils.isNotBlank(productDto2.getCableTag())) { map.get(productName) .getCableTagValueMap() .put(productDto2.getCableTag(), productDto2.getLastValue()); map.get(productName) .getCableTagResultMap() .put(productDto2.getCableTag(), productDto2.getInsResult()); } // 添加标准要求来确定唯一性 map.get(productName).getTellSet().add(productDto2.getTell()); } else { // 如果名称不存在,直接放入 map productDto2.setLastValueList(new ArrayList<>()); // 检验内容 productDto2.getLastValueList().add(productDto2.getLastValue()); productDto2.setInsResultList(new ArrayList<>()); // 结果 productDto2.getInsResultList().add(productDto2.getInsResult()); productDto2.setTellSet(new LinkedHashSet<>()); productDto2.getTellSet().add(productDto2.getTell());// 标准要求 // 判断是否有线芯颜色, 添加颜色对应的值和结果 productDto2.setCableTagValueMap(new TreeMap<>()); productDto2.setCableTagResultMap(new TreeMap<>()); if (StringUtils.isNotBlank(productDto2.getCableTag())) { productDto2.getCableTagValueMap().put(productDto2.getCableTag(), productDto2.getLastValue()); productDto2.getCableTagResultMap().put(productDto2.getCableTag(), productDto2.getInsResult()); } map.put(productName, productDto2); } } List result = new ArrayList<>(map.values()); //添加检验项 SampleProductExportDto temp3 = result.get(0); String itemName = temp3.getInspectionItem(); if (StringUtils.isNotBlank(temp3.getRadius())) { itemName = itemName + "(" + temp3.getRadius() + ")"; } // 判断有没有条件字段有需要拼接到名称后面 if (StringUtils.isNotBlank(temp3.getInspectionItemEn())) { temp3.setInspectionName(itemName + "@" + temp3.getInspectionItemEn()); } else { temp3.setInspectionName(itemName); } // 判断有没有条件字段有需要拼接到名称后面 // 判断有没有条件字段填充到要求 if (StringUtils.isNotBlank(temp3.getRadius())) { temp3.setTell("(" + temp3.getRadius() + ")"); } temp3.setIndex(finalIndex.get() + "." + belowIndex.get()); sampleList.add(temp3); } else { sampleList.add(dto2); // 现在需要根据子项去重累加检验结果 // 处理集合 Map map = new LinkedHashMap<>(); for (SampleProductExportDto productDto2 : sampleProductDtoInside) { String productName = productDto2.getInspectionItemClass() + productDto2.getInspectionItem() + productDto2.getInspectionItemSubclass(); if (map.containsKey(productName)) { // 如果名称已经存在,添加 lastValue 值到 lastValueList 列表 map.get(productName) .getLastValueList() .add(productDto2.getLastValue()); map.get(productName) .getInsResultList() .add(productDto2.getInsResult()); // 添加颜色对应的值和结果 if (StringUtils.isNotBlank(productDto2.getCableTag())) { map.get(productName) .getCableTagValueMap() .put(productDto2.getCableTag(), productDto2.getLastValue()); map.get(productName) .getCableTagResultMap() .put(productDto2.getCableTag(), productDto2.getInsResult()); } // 添加标准要求来确定唯一性 map.get(productName).getTellSet().add(productDto2.getTell()); } else { // 如果名称不存在,直接放入 map productDto2.setLastValueList(new ArrayList<>()); // 检验内容 productDto2.getLastValueList().add(productDto2.getLastValue()); productDto2.setInsResultList(new ArrayList<>()); // 结果 productDto2.getInsResultList().add(productDto2.getInsResult()); productDto2.setTellSet(new LinkedHashSet<>()); productDto2.getTellSet().add(productDto2.getTell());// 标准要求 // 判断是否有线芯颜色, 添加颜色对应的值和结果 productDto2.setCableTagValueMap(new TreeMap<>()); productDto2.setCableTagResultMap(new TreeMap<>()); if (StringUtils.isNotBlank(productDto2.getCableTag())) { productDto2.getCableTagValueMap().put(productDto2.getCableTag(), productDto2.getLastValue()); productDto2.getCableTagResultMap().put(productDto2.getCableTag(), productDto2.getInsResult()); } map.put(productName, productDto2); } } List result = new ArrayList<>(map.values()); //添加检验子项 for (SampleProductExportDto productDto2 : result) { if (StringUtils.isNotBlank(productDto2.getInspectionItemSubclassEn())) { productDto2.setInspectionName("--" + productDto2.getInspectionItemSubclass() + "@" + "--" + productDto2.getInspectionItemSubclassEn()); } else { productDto2.setInspectionName("--" + productDto2.getInspectionItemSubclass()); } sampleList.add(productDto2); } } belowIndex.incrementAndGet(); productSize.incrementAndGet(); }); finalIndex.incrementAndGet(); }); } else { // 转成Mpa进行排序 Map> sortedMap = sampleProductDto2s.stream() .filter(sampleProductDto2 -> StringUtils.isNotBlank(sampleProductDto2.getInspectionItem())) .collect(Collectors.groupingBy(SampleProductExportDto::getInspectionItemRadius)); List>> entries = new ArrayList<>(sortedMap.entrySet()); entries.sort((o1, o2) -> { Integer sort1 = o1.getValue().get(0).getSort(); Integer sort2 = o2.getValue().get(0).getSort(); sort1 = sort1 == null ? 0 : sort1; sort2 = sort2 == null ? 0 : sort2; return sort1.compareTo(sort2); }); // 创建一个 LinkedHashMap 来保持插入顺序 Map> item = new LinkedHashMap<>(); for (Map.Entry> entry : entries) { item.put(entry.getKey(), entry.getValue()); } AtomicInteger finalIndex = new AtomicInteger(1); item.forEach((s, sampleProductDtoInside) -> { // 添加检验项 SampleProductExportDto dto2 = new SampleProductExportDto(); // 判断是否有英文名称 SampleProductExportDto temp = sampleProductDtoInside.get(0); // 判断是否有检验子项,没有就把检验参数填充 dto2.setIndex(Integer.toString(finalIndex.get())); if (StringUtils.isBlank(temp.getInspectionItemSubclass())) { // 处理集合 Map map = new LinkedHashMap<>(); for (SampleProductExportDto productDto2 : sampleProductDtoInside) { String productName = productDto2.getInspectionItemClass() + productDto2.getInspectionItem(); if (map.containsKey(productName)) { // 如果名称已经存在,添加 lastValue 值到 lastValueList 列表 map.get(productName) .getLastValueList() .add(productDto2.getLastValue()); map.get(productName) .getInsResultList() .add(productDto2.getInsResult()); // 添加颜色对应的值和结果 if (StringUtils.isNotBlank(productDto2.getCableTag())) { map.get(productName) .getCableTagValueMap() .put(productDto2.getCableTag(), productDto2.getLastValue()); map.get(productName) .getCableTagResultMap() .put(productDto2.getCableTag(), productDto2.getInsResult()); } // 添加标准要求来确定唯一性 map.get(productName).getTellSet().add(productDto2.getTell()); } else { // 如果名称不存在,直接放入 map productDto2.setLastValueList(new ArrayList<>()); // 检验内容 productDto2.getLastValueList().add(productDto2.getLastValue()); productDto2.setInsResultList(new ArrayList<>()); // 结果 productDto2.getInsResultList().add(productDto2.getInsResult()); productDto2.setTellSet(new LinkedHashSet<>()); productDto2.getTellSet().add(productDto2.getTell());// 标准要求 // 判断是否有线芯颜色, 添加颜色对应的值和结果 productDto2.setCableTagValueMap(new TreeMap<>()); productDto2.setCableTagResultMap(new TreeMap<>()); if (StringUtils.isNotBlank(productDto2.getCableTag())) { productDto2.getCableTagValueMap().put(productDto2.getCableTag(), productDto2.getLastValue()); productDto2.getCableTagResultMap().put(productDto2.getCableTag(), productDto2.getInsResult()); } map.put(productName, productDto2); } } List result = new ArrayList<>(map.values()); //添加检验子项 SampleProductExportDto temp2 = result.get(0); String itemName = temp2.getInspectionItem(); if (StringUtils.isNotBlank(temp2.getRadius())) { itemName = itemName + "(" + temp2.getRadius() + ")"; } // 判断有没有条件字段有需要拼接到名称后面 if (StringUtils.isNotBlank(temp2.getInspectionItemEn())) { temp2.setInspectionName(itemName + "@" + temp2.getInspectionItemEn()); } else { temp2.setInspectionName(itemName); } // 判断有没有条件字段有需要拼接到名称后面 temp2.setIndex(Integer.toString(finalIndex.get())); sampleList.add(temp2); } else { if (StringUtils.isNotBlank(temp.getInspectionItemEn())) { dto2.setInspectionName(temp.getInspectionItem() + "@" + temp.getInspectionItemEn()); } else { dto2.setInspectionName(temp.getInspectionItem()); } // 填充到要求 if (StringUtils.isNotBlank(temp.getRadius())) { dto2.setTell("(" + temp.getRadius() + ")"); } sampleList.add(dto2); // 现在需要根据子项去重累加检验结果 // 处理集合 Map map = new LinkedHashMap<>(); for (SampleProductExportDto productDto2 : sampleProductDtoInside) { // 名字取三层唯一 String productName = productDto2.getInspectionItemClass() + productDto2.getInspectionItem() + productDto2.getInspectionItemSubclass(); if (map.containsKey(productName)) { // 如果名称已经存在,添加 lastValue 值到 lastValueList 列表 map.get(productName) .getLastValueList() .add(productDto2.getLastValue()); map.get(productName) .getInsResultList() .add(productDto2.getInsResult()); // 添加颜色对应的值和结果 if (StringUtils.isNotBlank(productDto2.getCableTag())) { map.get(productName) .getCableTagValueMap() .put(productDto2.getCableTag(), productDto2.getLastValue()); map.get(productName) .getCableTagResultMap() .put(productDto2.getCableTag(), productDto2.getInsResult()); } // 添加标准要求来确定唯一性 map.get(productName).getTellSet().add(productDto2.getTell()); } else { // 如果名称不存在,直接放入 map productDto2.setLastValueList(new ArrayList<>()); // 检验内容 productDto2.getLastValueList().add(productDto2.getLastValue()); productDto2.setInsResultList(new ArrayList<>()); // 结果 productDto2.getInsResultList().add(productDto2.getInsResult()); productDto2.setTellSet(new LinkedHashSet<>()); productDto2.getTellSet().add(productDto2.getTell());// 标准要求 productDto2.setCableTagValueMap(new TreeMap<>()); // 判断是否有线芯颜色, 添加颜色对应的值和结果 productDto2.setCableTagValueMap(new TreeMap<>()); productDto2.setCableTagResultMap(new TreeMap<>()); if (StringUtils.isNotBlank(productDto2.getCableTag())) { productDto2.getCableTagValueMap().put(productDto2.getCableTag(), productDto2.getLastValue()); productDto2.getCableTagResultMap().put(productDto2.getCableTag(), productDto2.getInsResult()); } map.put(productName, productDto2); } } List result = new ArrayList<>(map.values()); //添加检验子项 for (SampleProductExportDto productDto2 : result) { if (StringUtils.isNotBlank(productDto2.getInspectionItemSubclassEn())) { productDto2.setInspectionName("--" + productDto2.getInspectionItemSubclass() + "@" + "--" + productDto2.getInspectionItemSubclassEn()); } else { productDto2.setInspectionName("--" + productDto2.getInspectionItemSubclass()); } sampleList.add(productDto2); } } finalIndex.incrementAndGet(); }); productSize.set(finalIndex.get()); } if (CollectionUtils.isEmpty(sampleList)) { return productSize.get() - 1; } /* 检验项map, 如果不合格判断是否有大类和检验项, 有大类不需要重叠, 如(绝缘机械物理性能老化前断裂伸长率、绝缘机械物理性能老化前抗张强度) * 需要修改成绝缘机械物理性能老化前断裂伸长率、抗张强度 * */ // 检验项分类 检验项 检验子项 Map>> errorClassItemMapCn = new LinkedHashMap<>(); Map>> errorClassItemMapEn = new LinkedHashMap<>(); // 中间检测值添加 for (int i = 0; i < sampleList.size(); i++) { SampleProductExportDto sample = sampleList.get(i); String fixedValue = "(100℃,168h)"; // 判断是否是 拉伸强度变化率(100℃,168h) 和 断裂拉伸应变变化率(100℃,168h) 需要去除条件 if (StrUtil.isNotBlank(sample.getInspectionName()) && sample.getInspectionName().contains("断裂拉伸应变变化率(100℃,168h)")) { sample.setInspectionName(sample.getInspectionName().replace(fixedValue, "")); } if (StrUtil.isNotBlank(sample.getInspectionName()) && sample.getInspectionName().contains("拉伸强度变化率(100℃,168h)")) { sample.setInspectionName(sample.getInspectionName().replace(fixedValue, "")); } if (StrUtil.isNotBlank(sample.getInspectionName()) && sample.getInspectionName().contains("老化后机械性能(100℃,168h)")) { sample.setInspectionName(sample.getInspectionName().replace(fixedValue, "")); } // 判断是否是 耐矿物油Ⅰ(150℃ 72h) 和 耐矿物油Ⅰ(150℃ 144h) 需要去除条件 if (StrUtil.isNotBlank(sample.getInspectionName()) && sample.getInspectionName().contains("耐矿物油Ⅰ(150℃ 72h)")) { sample.setInspectionName(sample.getInspectionName().replace("(150℃ 72h)", "")); } if (StrUtil.isNotBlank(sample.getInspectionName()) && sample.getInspectionName().contains("耐矿物油Ⅰ(150℃ 144h)")) { sample.setInspectionName(sample.getInspectionName().replace("(150℃ 144h)", "")); } // 序号 TextRenderData headRenderData1 = new TextRenderData(); headRenderData1.setText(sample.getIndex()); Style headStyle1 = new Style(); headStyle1.setFontFamily("宋体"); headStyle1.setColor("000000"); headRenderData1.setStyle(headStyle1); text.add(headRenderData1); // 检验项目 TextRenderData headRenderData2 = new TextRenderData(); headRenderData2.setText(sample.getInspectionName() + "∑" + (i + 999)); Style headStyle2 = new Style(); headStyle2.setFontFamily("宋体"); headStyle2.setColor("000000"); headRenderData2.setStyle(headStyle2); text.add(headRenderData2); // 检验项目 TextRenderData headRenderData3 = new TextRenderData(); headRenderData3.setText(sample.getInspectionName() + "∑" + (i + 999)); Style headStyle3 = new Style(); headStyle3.setFontFamily("宋体"); headStyle3.setColor("000000"); headRenderData3.setStyle(headStyle3); text.add(headRenderData3); // 单位 TextRenderData headRenderData4 = new TextRenderData(); headRenderData4.setText(sample.getUnit()); Style headStyle4 = new Style(); headStyle4.setFontFamily("宋体"); headStyle4.setColor("000000"); headRenderData4.setStyle(headStyle4); text.add(headRenderData4); //标准要求 String tell = sample.getTell(); if (CollectionUtils.isNotEmpty(sample.getTellSet())) { tell = CollUtil.join(sample.getTellSet(), "/"); } TextRenderData headRenderData5 = new TextRenderData(); headRenderData5.setText(tell); Style headStyle5 = new Style(); headStyle5.setFontFamily("宋体"); headStyle5.setColor("000000"); headRenderData5.setStyle(headStyle5); text.add(headRenderData5); // 判断是否有电缆标识map if (CollectionUtils.isNotEmpty(sample.getCableTagValueMap())) { sample.setLastValueList(new ArrayList<>(sample.getCableTagValueMap().values())); } if (CollectionUtils.isNotEmpty(sample.getCableTagResultMap())) { sample.setInsResultList(new ArrayList<>(sample.getCableTagResultMap().values())); } // 检验结果 // 判断是否是多次检验 if (CollectionUtils.isNotEmpty(sample.getLastValueList()) && sample.getLastValueList().size() == max) { for (String s : sample.getLastValueList()) { TextRenderData headRenderData6 = new TextRenderData(); headRenderData6.setText(s); Style headStyle6 = new Style(); headStyle6.setFontFamily("宋体"); headStyle6.setColor("000000"); headRenderData6.setStyle(headStyle6); text.add(headRenderData6); } } else { for (int j = 0; j < max; j++) { TextRenderData headRenderData6 = new TextRenderData(); headRenderData6.setText((StringUtils.isNotEmpty(sample.getLastValue()) ? sample.getLastValue() : "") + "∑" + (7 + i)); Style headStyle6 = new Style(); headStyle6.setFontFamily("宋体"); headStyle6.setColor("000000"); headRenderData6.setStyle(headStyle6); text.add(headRenderData6); } } // 判定结果 String result = ""; if (sample.getInsResult() != null) { switch (sample.getInsResult()) { case 1: result = "√"; break; case 2: result = "×"; break; case 3: result = "-"; break; } } if (CollectionUtils.isNotEmpty(sample.getLastValueList())) { // 判断是否有一个错误 if (sample.getInsResultList().stream().anyMatch(s -> s.equals(3))) { result = "-"; } else { boolean error = sample.getInsResultList().stream().anyMatch(s -> s.equals(0)); if (error) { List collect = new ArrayList<>(); int index = 0; for (Integer count : sample.getInsResultList()) { String type; if (count.equals(0)) { String itemCh = ""; String itemEn = ""; // 添加不合格描述 // 判断长度是否为1 if (sample.getLastValueList().size() == 1) { this.fillReportErrorResult(errorClassItemMapCn, errorClassItemMapEn, sample, itemCh, itemEn); } else if (CollectionUtils.isNotEmpty(cableTags)) { // 判断是否有电缆配置, 不是的话可能为原材料 // 添加不合格描述 itemCh = (max == 1 ? "" : cableTags.get(index)); itemEn = (max == 1 ? "" : "The " + Integer.toString(index + 1) + " time "); this.fillReportErrorResult(errorClassItemMapCn, errorClassItemMapEn, sample, itemCh, itemEn); } else { // 添加不合格描述 itemCh = (max == 1 ? "" : "第" + Integer.toString(index + 1) + "次"); itemEn = (max == 1 ? "" : "The " + Integer.toString(index + 1) + " time "); this.fillReportErrorResult(errorClassItemMapCn, errorClassItemMapEn, sample, itemCh, itemEn); } type = "×"; } else { type = "√"; } collect.add(type); index++; } result = CollUtil.join(collect, " "); ; } else { result = "√"; } } } TextRenderData headRenderData7 = new TextRenderData(); headRenderData7.setText(result); Style headStyle7 = new Style(); headStyle7.setFontFamily("宋体"); headStyle7.setColor("000000"); headRenderData7.setStyle(headStyle7); text.add(headRenderData7); TextRenderData[] text2 = text.toArray(new TextRenderData[0]); rowRenderData = Rows.of(text2).center().rowAtleastHeight(1).create(); rows.add(rowRenderData); text = new ArrayList<>(); } if (CollectionUtils.isNotEmpty(errorClassItemMapCn)) { // 循环检验项分类 errorClassItemMapCn.forEach((errorClass, errorItemMap) -> { if (StringUtils.isNotBlank(resultCh.get())) { resultCh.set(resultCh.get() + "," + errorClass); } else { resultCh.set(errorClass); } // 循环检验项 AtomicBoolean flag = new AtomicBoolean(false); errorItemMap.forEach((errorItem, errorSubClassList) -> { if (flag.get()) { resultCh.set(resultCh.get() + "," + errorItem); } else { resultCh.set(resultCh.get() + errorItem); } flag.set(true); // 循环检验项分类 if (CollectionUtils.isNotEmpty(errorSubClassList)) { for (int i = 0; i < errorSubClassList.size(); i++) { // 判断是否是第二个, 第二个添加顿号 if (i > 0) { resultCh.set(resultCh.get() + "、" + errorSubClassList.get(i)); } else { resultCh.set(resultCh.get() + errorSubClassList.get(i)); } } } }); }); // 循环检验项分类 errorClassItemMapEn.forEach((errorClass, errorItemMap) -> { if (StringUtils.isNotBlank(resultEn.get())) { resultEn.set(resultEn.get() + "," + errorClass); } else { resultEn.set(errorClass); } // 循环检验项 errorItemMap.forEach((errorItem, errorSubClassList) -> { resultEn.set(resultEn.get() + errorItem); // 循环检验项分类 if (CollectionUtils.isNotEmpty(errorSubClassList)) { for (int i = 0; i < errorSubClassList.size(); i++) { // 判断是否是第二个, 第二个添加顿号 if (i > 0) { resultEn.set(resultEn.get() + "、" + errorSubClassList.get(i)); } else { resultEn.set(resultEn.get() + errorSubClassList.get(i)); } } } }); }); } if (StringUtils.isNotBlank(resultCh.get())) { String resultChString = resultCh.get(); String resultEnString = resultEn.get(); // 判断样品是否有多个, 有多个需要拼接样品编号 if (!isOneSample) { resultChString = a.getSampleCode() + resultChString; resultEnString = a.getSampleCode() + resultEnString; } resultChList.add(resultChString); resultEhList.add(resultEnString); } return productSize.get() - 1; } /** * 添加报告结论中英文 * @param sample * @param itemCh * @param itemEn */ private void fillReportErrorResult(Map>> errorClassItemMapCn, Map>> errorClassItemMapEn, SampleProductExportDto sample, String itemCh, String itemEn) { // 判断是否有检验项分类map String classTiemName = itemCh + (StringUtils.isBlank(sample.getInspectionItemClass()) ? "" : sample.getInspectionItemClass()); String classTiemNameEn = itemEn + (StringUtils.isBlank(sample.getInspectionItemClassEN()) ? "" : sample.getInspectionItemClassEN()); String classTiemNameItemEN = StringUtils.isBlank(sample.getInspectionItemEn()) ? "" : sample.getInspectionItemEn(); if (errorClassItemMapCn.containsKey(classTiemName)) { // 判断是否有检验项map if (errorClassItemMapCn.get(classTiemName).containsKey(sample.getInspectionItem())) { // 添加检验项分类 if (StringUtils.isNotBlank(sample.getInspectionItemSubclass())) { errorClassItemMapCn.get(classTiemName).get(sample.getInspectionItem()).add(sample.getInspectionItemSubclass()); } if (StringUtils.isNotBlank(sample.getInspectionItemSubclassEn())) { errorClassItemMapEn.get(classTiemNameEn).get(classTiemNameItemEN).add(sample.getInspectionItemSubclassEn()); } } else { // 添加检验项map List errorItemSubClassList = new ArrayList<>(); if (StringUtils.isNotBlank(sample.getInspectionItemSubclass())) { errorItemSubClassList.add(sample.getInspectionItemSubclass()); } List errorItemSubClassListEn = new ArrayList<>(); if (StringUtils.isNotBlank(sample.getInspectionItemSubclassEn())) { errorItemSubClassListEn.add(sample.getInspectionItemSubclassEn()); } errorClassItemMapCn.get(classTiemName).put(sample.getInspectionItem(), errorItemSubClassList); errorClassItemMapEn.get(classTiemNameEn).put(classTiemNameItemEN, errorItemSubClassListEn); } } else { // map添加检验项分类 List errorItemSubClassList = new ArrayList<>(); if (StringUtils.isNotBlank(sample.getInspectionItemSubclass())) { errorItemSubClassList.add(sample.getInspectionItemSubclass()); } List errorItemSubClassListEn = new ArrayList<>(); if (StringUtils.isNotBlank(sample.getInspectionItemSubclassEn())) { errorItemSubClassListEn.add(sample.getInspectionItemSubclassEn()); } errorClassItemMapCn.put(classTiemName, new LinkedHashMap>() {{ put(sample.getInspectionItem(), errorItemSubClassList); }}); errorClassItemMapEn.put(classTiemNameEn, new LinkedHashMap>() {{ put(classTiemNameItemEN, errorItemSubClassListEn); }}); } } /** * 格式化修改检验项 * @param sampleProductDto2s */ private void formatProducts(List sampleProductDto2s) { sampleProductDto2s.forEach(sampleProductDto2 -> { // 清除全部结果的前后空格, 换行符 if (StrUtil.isNotBlank(sampleProductDto2.getLastValue())) { sampleProductDto2.setLastValue(sampleProductDto2.getLastValue().trim()); } if (sampleProductDto2.getInsResult().equals(0)) { // 查询不合格复测 Long count = insUnqualifiedRetestProductMapper.selectCount(Wrappers.lambdaQuery() .eq(InsUnqualifiedRetestProduct::getInsProductId, sampleProductDto2.getInsProductId()) .ne(InsUnqualifiedRetestProduct::getInsResult, 0)); if (count == 2) { // 复测内容都合格就取第一个结果 InsUnqualifiedRetestProduct retestProduct = insUnqualifiedRetestProductMapper.selectOne(Wrappers.lambdaQuery() .eq(InsUnqualifiedRetestProduct::getInsProductId, sampleProductDto2.getInsProductId()) .last("limit 1")); sampleProductDto2.setLastValue(retestProduct.getLastValue()); sampleProductDto2.setInsResult(retestProduct.getInsResult()); } } // 判断是否是数字类型 if (sampleProductDto2.getInspectionValueType().equals("1")) { // 把检验内容如果正硫化点和焦烧时间把 . 切割成 : String lastValue = sampleProductDto2.getLastValue(); if (sampleProductDto2.getInspectionItem().contains("正硫化点") || sampleProductDto2.getInspectionItem().contains("焦烧时间")) { sampleProductDto2.setLastValue(sampleProductDto2.getLastValue().replace('.', ':')); } else { // 判断当前结果是否是科学计数法 boolean scientificNotation = isScientificNotation(lastValue); if (scientificNotation) { // 修改要求描述 sampleProductDto2.setTell(convertToScientificNotation(sampleProductDto2.getTell())); // 修改要求值 sampleProductDto2.setLastValue(toScientificNotationWithTimes(lastValue)); } else { // 排除氧指数 if (sampleProductDto2.getInspectionItem().contains("氧指数")) { // 特殊处理判断检验项是否等于外护套电导率, 是的话只需要保留一位小数 } else if (StringUtils.isNotBlank(sampleProductDto2.getInspectionItemSubclass()) && sampleProductDto2.getInspectionItemSubclass().contains("外护套电导率")) { BigDecimal bd = new BigDecimal(lastValue); bd = bd.setScale(1, RoundingMode.HALF_UP); sampleProductDto2.setLastValue(bd.stripTrailingZeros().toPlainString()); } else { // 修改小数点位数根据要求值来 sampleProductDto2.setLastValue(modifyNumber(sampleProductDto2.getAsk(), lastValue)); } } } } // 判断是否是 拉伸强度变化率(100℃,168h) 和 断裂拉伸应变变化率(100℃,168h) 需要去除条件 if (StrUtil.isNotBlank(sampleProductDto2.getInspectionItemSubclass()) && sampleProductDto2.getInspectionItemSubclass().equals("拉伸强度变化率(100℃,168h)")) { sampleProductDto2.setInspectionItem("老化后机械性能(100℃,168h)"); } if (StrUtil.isNotBlank(sampleProductDto2.getInspectionItemSubclass()) && sampleProductDto2.getInspectionItemSubclass().equals("断裂拉伸应变变化率(100℃,168h)")) { sampleProductDto2.setInspectionItem("老化后机械性能(100℃,168h)"); } }); } /** * 添加结尾 * @param text * @param rowRenderData * @param rows */ private static void addEnding(List text, RowRenderData rowRenderData, List rows, int max) { for (int i = 0; i < 2; i++) { TextRenderData endingRenderData = new TextRenderData(); endingRenderData.setText("备注∑1999"); Style endingStyle = new Style(); endingStyle.setFontFamily("宋体"); endingStyle.setColor("000000"); endingRenderData.setStyle(endingStyle); text.add(endingRenderData); } for (int i = 0; i < 5 + max - 1; i++) { TextRenderData endingRenderData = new TextRenderData(); endingRenderData.setText("“√”表示项目合格,“×”表示项目不合格,“-”表示不要判定,“/”表示没有标准要求。@“√” indicates test ltem is qualified,“×” indicates test ltem is unqualified,“-” indicates test ltem judgment is not required,“/” indicates test ltem is no test requirement.∑2000"); Style endingStyle = new Style(); endingStyle.setFontFamily("宋体"); endingStyle.setColor("000000"); endingRenderData.setStyle(endingStyle); text.add(endingRenderData); } TextRenderData[] text3 = text.toArray(new TextRenderData[0]); rowRenderData = Rows.of(text3).center().rowAtleastHeight(1).create(); rows.add(rowRenderData); } /** * 判断当前内容是否是科学计数法 * @param str * @return */ public static boolean isScientificNotation(String str) { if (StringUtils.isEmpty(str)) { return false; } // 正则表达式匹配科学计数法,包括正数和负数 String regex = "^[+|-]?\\d*[.]?\\d*e[+|-]?\\d+$"; Pattern pattern = Pattern.compile(regex); return pattern.matcher(str).matches(); } /** * 修改要求描述的科学计数法 * @param input */ public static String convertToScientificNotation(String input) { // 保存原始输入 String originalInput = input; // 去掉非科学计数法的字符 String cleanedInput = input.replaceAll("[^0-9eE+-.]", ""); // 判断要求描述是否是科学计数法 boolean scientificNotation = isScientificNotation(cleanedInput); if (!scientificNotation) { return input; } // 找出被去掉的字符 String removedChars = originalInput.replace(cleanedInput, ""); try { String scientificNotationWithTimes = toScientificNotationWithTimes(cleanedInput); return removedChars + scientificNotationWithTimes; } catch (Exception e) { return input; } } /** * 展示成科学计数法 * @param number * @return */ public static String toScientificNotationWithTimes(String number) { Double value = Double.valueOf(number); // 提取小数部分和指数部分 String scientificFormat = String.format("%.1e", value); String[] parts = scientificFormat.split("e"); // 处理数字部分和指数部分 String mantissa = parts[0]; // 小数部分 int exponent = Integer.parseInt(parts[1]); // 指数部分 String power = ""; switch (exponent) { case 2: power = "²"; break; case 3: power = "³"; break; case 4: power = "⁴"; break; case 5: power = "⁵"; break; case 6: power = "⁶"; break; case 7: power = "⁷"; break; case 8: power = "⁸"; break; case 9: power = "⁹"; break; case 10: power = "¹⁰"; break; case 11: power = "¹¹"; break; case 12: power = "¹²"; break; case 13: power = "¹³"; break; case 14: power = "¹⁴"; break; case 15: power = "¹⁵"; break; case 16: power = "¹⁶"; break; case 17: power = "¹⁷"; break; case 18: power = "¹⁸"; break; case 19: power = "¹⁹"; break; case 20: power = "²⁰"; break; } // 构建最终的科学计数法格式字符串 return String.format("%s×10%s", mantissa, power); } // 判断是否是数字 public static boolean isNumeric(String str) { if (str == null || str.isEmpty()) { return false; } try { Double.parseDouble(str); // 尝试将字符串解析为双精度浮点数 return true; } catch (NumberFormatException e) { return false; // 解析失败则返回false } } /** * 根据要求描述保留结果小数点位数 * @param reference * @param value * @return */ public static String modifyNumber(String reference, String value) { if (reference.equals("/") || reference.equals("-") || reference.equals("—")) { // 不判定默认保留一位小数 > 默认小数位 // BigDecimal bd = new BigDecimal(value); // bd = bd.setScale(1, RoundingMode.HALF_UP); return value; } // 判断是否是数字 if (!isNumeric(value)) { try { // 可能是≤95.1A这样的, 需要截取保留位数 // 使用正则表达式提取数字部分 String numberPart = value.replaceAll("[^0-9.]", ""); // 将数字部分替换成占位符 String withPlaceholder = value.replaceAll(numberPart, "**"); // 提取小数点位数 int decimalPlaces = getDecimalPlaces(reference); // 处理第二个字符串 BigDecimal number = new BigDecimal(numberPart); number = number.setScale(decimalPlaces, RoundingMode.HALF_UP); // 等于0需要进一步处理 if (number.compareTo(BigDecimal.ZERO) == 0) { return formatNumber(value, decimalPlaces); } // 将占位符替换成指定数字 String finalResult = withPlaceholder.replace("**", number.toString()); return finalResult; } catch (Exception e) { return value; } } // 提取小数点位数 int decimalPlaces = getDecimalPlaces(reference); // 处理第二个字符串 BigDecimal number = new BigDecimal(value); number = number.setScale(decimalPlaces, RoundingMode.HALF_UP); // 等于0需要进一步处理 if (number.compareTo(BigDecimal.ZERO) == 0) { return formatNumber(value, decimalPlaces); } return number.toString(); } private static int getDecimalPlaces(String str) { // 查找小数点位置 int decimalPointIndex = str.lastIndexOf('.'); if (decimalPointIndex == -1) { // 如果没有小数点,返回0位小数 return 0; } // 计算小数点后的位数 return str.length() - decimalPointIndex - 1; } /** * 保留位数, 如果等于0 返回找到的一个非0位数 * @param number 当前数字 * @param scale 原本保留的位数 * @return */ public static String formatNumber(String number, int scale) { // 将输入的字符串转换为 BigDecimal BigDecimal bd = new BigDecimal(number); // 保留指定的小数位数,并使用四舍五入模式 bd = bd.setScale(scale, RoundingMode.HALF_UP); // 检查保留的小数是否等于 0 if (bd.stripTrailingZeros().scale() <= 0) { // 需要找到第一个不为 0 的小数位 String decimalPart = number.substring(number.indexOf('.') + 1); int firstNonZeroIndex = findFirstNonZeroIndex(decimalPart); if (firstNonZeroIndex != -1) { // 计算需要保留的小数位数 int newScale = firstNonZeroIndex + 1; bd = new BigDecimal(number).setScale(newScale, RoundingMode.HALF_UP); } } return bd.toString(); } private static int findFirstNonZeroIndex(String decimalPart) { for (int i = 0; i < decimalPart.length(); i++) { if (decimalPart.charAt(i) != '0') { return i; } } return -1; // 如果没有找到非零的数字 } /** * *****保存元此阿里进货验证原始记录***** * @param insOrderId 订单Id * @param examineUserId 复核人Id * @param writeUserId 检验员Id */ private void reportFactoryVerify(Integer insOrderId, Integer examineUserId, Integer writeUserId) { // 查询进货验证原始记录 InsOrderFactoryVerify factoryVerify = insOrderFactoryVerifyMapper.selectOne(Wrappers.lambdaQuery() .eq(InsOrderFactoryVerify::getInsOrderId, insOrderId) .last("limit 1")); // 没有就结束 if (factoryVerify == null) { return; } //1.材料名称 factoryVerify.setBasicName(this.formatBasic(factoryVerify.getBasicName())); //2.规格型号 factoryVerify.setBasicModel(this.formatBasic(factoryVerify.getBasicModel())); //3.材料批号 factoryVerify.setBasicBatchNo(this.formatBasic(factoryVerify.getBasicBatchNo())); //4.执行标准 factoryVerify.setBasicStandard(this.formatBasic(factoryVerify.getBasicStandard())); //5.生产日期 factoryVerify.setBasicDate(this.formatBasic(factoryVerify.getBasicDate())); //6.供货数量 factoryVerify.setBasicNumber(this.formatBasic(factoryVerify.getBasicNumber())); //7.材料名称 factoryVerify.setBasicColor(this.formatBasic(factoryVerify.getBasicColor())); //8.其他 // 内容 if (factoryVerify.getBasicOtherValue() == null) { factoryVerify.setBasicOtherValue(""); } // 值 if (factoryVerify.getBasicOther() == null) { factoryVerify.setBasicOther(""); } switch (factoryVerify.getBasicOther()) { case "1": factoryVerify.setBasicOther("☑符合 □不符合"); break; case "2": factoryVerify.setBasicOther("□符合 ☑不符合"); break; default: factoryVerify.setBasicOther("□符合 □不符合"); } DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); String declareDate = factoryVerify.getDeclareDate().format(formatter); // 修改验证项目 List verifyItems = insOrderFactoryVerifyItemService.list(Wrappers.lambdaQuery() .eq(InsOrderFactoryVerifyItem::getFactoryVerifyId, factoryVerify.getFactoryVerifyId()) .orderByAsc(InsOrderFactoryVerifyItem::getSort)); for (InsOrderFactoryVerifyItem verifyItem : verifyItems) { if (verifyItem.getResult() == null) { verifyItem.setResult(""); } switch (verifyItem.getResult()) { case "1": verifyItem.setResult("☑符合 □不符合 □不适用"); break; case "2": verifyItem.setResult("□符合 ☑不符合 □不适用"); break; case "3": verifyItem.setResult("□符合 □不符合 ☑不适用"); break; default: verifyItem.setResult("□符合 □不符合 □不适用"); } } //获取提交人的签名地址 String writeUrl; try { writeUrl = userMapper.selectById(writeUserId).getSignatureUrl(); } catch (Exception e) { throw new ErrorException("找不到编制人的签名"); } if (ObjectUtils.isEmpty(writeUrl) || writeUrl.equals("")) { throw new ErrorException("找不到检验人的签名"); } //获取复核人的签名地址 String examineUrl; try { examineUrl = userMapper.selectById(examineUserId).getSignatureUrl(); } catch (Exception e) { throw new ErrorException("找不到复核人的签名"); } if (ObjectUtils.isEmpty(examineUrl) || examineUrl.equals("")) { throw new ErrorException("找不到复核人的签名"); } InputStream inputStream = this.getClass().getResourceAsStream("/static/factory_verify.docx"); ConfigureBuilder builder = Configure.builder(); builder.useSpringEL(true); XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render( new HashMap() {{ put("report", factoryVerify); put("declareDate", declareDate); put("factoryVerifyItemList", verifyItems); put("writeUrl", Pictures.ofLocal(imgUrl + "/" + writeUrl).create()); put("examineUrl", Pictures.ofLocal(imgUrl + "/" + examineUrl).create()); put("writeDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(null)).create()); put("examineDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(null)).create()); }}); MultipartFile multipartFile = xwpfDocumentToMockMultipartFile(template.getXWPFDocument()); // 保存到附件里面 uploadFile(insOrderId, multipartFile); try { inputStream.close(); } catch (IOException e) { throw new RuntimeException(e); } } /** * XWPFDocument 转 MultipartFile(MockMultipartFile) * * @param document 文档对象 * @return */ public static MultipartFile xwpfDocumentToMockMultipartFile(XWPFDocument document) { String fileName = "原材料进货验证记录.docx"; try { String contentType = "text/plain"; ByteArrayOutputStream bos = new ByteArrayOutputStream(); document.write(bos); //XWPFDocument 转 byte[] byte[] barray = bos.toByteArray(); //byte[] 转 InputStream InputStream is = new ByteArrayInputStream(barray); //InputStream 转 MultipartFile MultipartFile multipartFile = new MockMultipartFile(fileName, fileName, contentType, is); return multipartFile; } catch (Exception e) { e.printStackTrace(); return null; } } /** * ***格式化进厂验证内容**** * @param basicType * @return */ private String formatBasic(String basicType) { if (basicType == null) { basicType = ""; } //格式化字段 String basic = ""; switch (basicType) { case "1": basic = "☑符合 □不符合 □不适用"; break; case "2": basic = "□符合 ☑不符合 □不适用"; break; case "3": basic = "□符合 □不符合 ☑不适用"; break; default: basic = "□符合 □不符合 □不适用"; } return basic; } /** * ***word转换pdf*** * @param path * @return */ @Override public String wordToPdfTemp(String path) { try { return wordToPdf(path, path.replace(".docx", "-临时.pdf")); } catch (Exception e) { throw new ErrorException("转换失败"); } } private String wordToPdf(String wordPath, String pdfPath) { FileOutputStream os = null; try { //凭证 不然切换后有水印 InputStream is = new ClassPathResource("/lib/license.xml").getInputStream(); License license = new License(); license.setLicense(is); if (!license.getIsLicensed()) { return null; } //生成一个空的PDF文件 File file; //判断是否是进厂报告 file = new File(pdfPath); os = new FileOutputStream(file); //要转换的word文件 com.aspose.words.Document doc = new com.aspose.words.Document(wordPath); doc.save(os, SaveFormat.PDF); String name = file.getName(); return file.getName(); } catch (Exception e) { e.printStackTrace(); } finally { if (os != null) { try { os.close(); } catch (IOException e) { e.printStackTrace(); } } } return null; } /** * *****修改成品抽样状态****** * @param insSamples * @param order */ private void addProductSpotCheck(List insSamples, InsOrder order) { Long unqualifiedCount = 0L; if (CollectionUtils.isNotEmpty(insSamples)) { unqualifiedCount = insProductMapper.selectCount(Wrappers.lambdaQuery() .in(InsProduct::getInsSampleId, insSamples.stream().map(InsSample::getId).collect(Collectors.toList())) .eq(InsProduct::getInsResult, 0)); // 判断如果有不合格的检验项, 判断有没有检验项复测, 复核合格也算合格通过 if (!unqualifiedCount.equals(0L)) { List productList = insProductMapper.selectList(Wrappers.lambdaQuery() .in(InsProduct::getInsSampleId, insSamples.stream().map(InsSample::getId).collect(Collectors.toList())) .eq(InsProduct::getInsResult, 0)); boolean flag = true; for (InsProduct insProduct : productList) { Long unqualifiedProductCount = insUnqualifiedRetestProductMapper.selectCount(Wrappers.lambdaQuery() .eq(InsUnqualifiedRetestProduct::getInsProductId, insProduct.getId()) .ne(InsUnqualifiedRetestProduct::getInsResult, 0)); if (unqualifiedProductCount != 2) { flag = false; } } if (flag) { unqualifiedCount = 0L; } } } spotCheckQuarterItemMapper.update(null, Wrappers.lambdaUpdate() .eq(SpotCheckQuarterItem::getQuarterItemId, order.getQuarterItemId()) .set(SpotCheckQuarterItem::getResult, unqualifiedCount.equals(0L) ? "合格" : "不合格")); } /** * 添加工时 * @param userId * @param insProduct * @param insOrder */ private synchronized void addAuxiliary(Integer userId, InsProduct insProduct, InsOrder insOrder) { if (insProduct.getIsBinding().equals(1)) { return; } //校验如果这个人这个检测项目已经添加过了 List count2s = auxiliaryOutputWorkingHoursMapper.selectList(Wrappers.lambdaQuery() .eq(AuxiliaryOutputWorkingHours::getCheck, userId) .eq(AuxiliaryOutputWorkingHours::getInsProductId, insProduct.getId())); if (CollectionUtils.isNotEmpty(count2s)) { for (AuxiliaryOutputWorkingHours auxiliaryOutputWorkingHours : count2s) { auxiliaryOutputWorkingHours.setCheck(userId);//检测人 } auxiliaryOutputWorkingHoursService.updateBatchById(count2s); } else { if (ObjectUtils.isNotEmpty(insProduct.getManHour()) && StringUtils.isNotBlank(insProduct.getLastValue())) { AuxiliaryOutputWorkingHours auxiliaryOutputWorkingHours = new AuxiliaryOutputWorkingHours(); auxiliaryOutputWorkingHours.setInspectionItemClass(insProduct.getInspectionItemClass());//检测项分类 auxiliaryOutputWorkingHours.setInspectionItem(insProduct.getInspectionItem());//检测父项 auxiliaryOutputWorkingHours.setInspectionItemSubclass(insProduct.getInspectionItemSubclass());//检测子项 auxiliaryOutputWorkingHours.setSample(insSampleMapper.selectById(insProduct.getInsSampleId()).getSampleCode());//样品编号 auxiliaryOutputWorkingHours.setOrderId(insOrder.getId());//订单id auxiliaryOutputWorkingHours.setOrderNo(insOrder.getEntrustCode());//非加班委托单号 auxiliaryOutputWorkingHours.setWorkTime(insProduct.getManHour());//非加班工时 auxiliaryOutputWorkingHours.setAmount(1);//非加班数量 auxiliaryOutputWorkingHours.setOutputWorkTime((ObjectUtils.isNotEmpty(auxiliaryOutputWorkingHours.getOvertimeWorkTime()) ? auxiliaryOutputWorkingHours.getOvertimeWorkTime() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(auxiliaryOutputWorkingHours.getWorkTime()) ? auxiliaryOutputWorkingHours.getWorkTime() : BigDecimal.ZERO));//产量工时 auxiliaryOutputWorkingHours.setManHourGroup(insProduct.getManHourGroup());//工时分组 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); DateTimeFormatter formatters = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); auxiliaryOutputWorkingHours.setDateTime(LocalDateTime.now().toLocalDate().atStartOfDay().format(formatters));//日期 LocalDateTime localDateTime = LocalDateTime.now(); DateTime parse = DateUtil.parse(localDateTime.format(formatter)); auxiliaryOutputWorkingHours.setWeekDay(getWeek(localDateTime.format(formatters)));//星期 auxiliaryOutputWorkingHours.setWeek(String.valueOf(DateUtil.weekOfYear(DateUtil.offsetDay(parse, 1))));//周次 auxiliaryOutputWorkingHours.setCheck(userId);//检测人 auxiliaryOutputWorkingHours.setPrice(insProduct.getPrice());//单价 auxiliaryOutputWorkingHours.setSampleId(insProduct.getInsSampleId());//样品id auxiliaryOutputWorkingHours.setInsProductId(insProduct.getId());//检验项id auxiliaryOutputWorkingHoursMapper.insert(auxiliaryOutputWorkingHours); } } } public static String getWeek(String dayStr) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { Date date = sdf.parse(dayStr); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); int day = calendar.get(Calendar.DAY_OF_MONTH); return getWeekDay(dayOfWeek); } catch (Exception e) { e.printStackTrace(); } return null; } public static String getWeekDay(int dayOfWeek) { switch (dayOfWeek) { case Calendar.MONDAY: return "周一"; case Calendar.TUESDAY: return "周二"; case Calendar.WEDNESDAY: return "周三"; case Calendar.THURSDAY: return "周四"; case Calendar.FRIDAY: return "周五"; case Calendar.SATURDAY: return "周六"; case Calendar.SUNDAY: return "周日"; default: return "未知"; } } }