Browse Source

ly 特种设备 shenchanjilu

ly 2 months ago
parent
commit
9107c2b8c5

+ 1 - 0
master/src/main/java/com/ruoyi/common/sendEmail/IMailService.java

@@ -27,6 +27,7 @@ public interface IMailService {
      * @param content 内容
      */
     public void sendHtmlMail(String to, String subject, String content, String cc);
+    public void sendHtmlMail(String to, String subject, String content, String cc[]);
     public void sendHtmlMail(String[] to, String subject, String content, String cc[]);
     /**
      * 发送带附件的邮件

+ 33 - 0
master/src/main/java/com/ruoyi/common/sendEmail/IMailServiceImpl.java

@@ -164,6 +164,39 @@ public class IMailServiceImpl implements IMailService {
         }
     }
 
+    /**
+     * html邮件
+     *
+     * @param to      收件人
+     * @param subject 主题
+     * @param content 内容
+     */
+    @Override
+    public void sendHtmlMail(String to, String subject, String content, String cc[]) {
+        //获取MimeMessage对象
+        MimeMessage message = mailSender.createMimeMessage();
+        MimeMessageHelper messageHelper;
+        try {
+            messageHelper = new MimeMessageHelper(message, true);
+            //邮件发送人
+            messageHelper.setFrom(from);
+            //邮件接收人
+            messageHelper.setTo(to);
+            //邮件发送人
+            messageHelper.setCc(cc);
+            //邮件主题
+            message.setSubject(subject);
+            //邮件内容,html格式
+            messageHelper.setText(content, true);
+            //发送
+            mailSender.send(message);
+            //日志信息
+            logger.info("邮件已经发送。");
+        } catch (Exception e) {
+            logger.error("发送邮件时发生异常!", e);
+        }
+    }
+
     /**
      * 多人html邮件
      *

+ 13 - 13
master/src/main/java/com/ruoyi/framework/task/byx/ApprovalBYXTask.java

@@ -25,10 +25,7 @@ import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.List;
+import java.util.*;
 
 /**
  * 定时任务批文管理预警
@@ -177,7 +174,7 @@ public class ApprovalBYXTask extends BaseController {
                         }
                     }
                 }
-                levelSendEmail(firstwarningContent, secondwarningContent, thirdwarningContent, alarmPrincipals.get(0), "安全批文清单", "safetyapproval", "(证书编号,批文名称,下次回顾日期)", AlarmtypeId.toString(), o);
+                levelSendEmail(firstwarningContent, secondwarningContent, thirdwarningContent, alarmPrincipals, "安全批文清单", "safetyapproval", "(证书编号,批文名称,下次回顾日期)", AlarmtypeId.toString(), o);
             }
             firstwarningContent = "";
             secondwarningContent = "";
@@ -216,7 +213,7 @@ public class ApprovalBYXTask extends BaseController {
                         }
                     }
                 }
-                levelSendEmail(firstwarningContent, secondwarningContent, thirdwarningContent, alarmPrincipals.get(0), "消防批文清单", "fireapproval", "(文件编号,批文名称,下次回顾日期)", AlarmtypeId.toString(), o);
+                levelSendEmail(firstwarningContent, secondwarningContent, thirdwarningContent, alarmPrincipals, "消防批文清单", "fireapproval", "(文件编号,批文名称,下次回顾日期)", AlarmtypeId.toString(), o);
             }
             firstwarningContent = "";
             secondwarningContent = "";
@@ -255,7 +252,7 @@ public class ApprovalBYXTask extends BaseController {
                         }
                     }
                 }
-                levelSendEmail(firstwarningContent, secondwarningContent, thirdwarningContent, alarmPrincipals.get(0), "环保批文清单", "environapproval", "(证书编号,批文名称,下次回顾日期)", AlarmtypeId.toString() , o);
+                levelSendEmail(firstwarningContent, secondwarningContent, thirdwarningContent, alarmPrincipals, "环保批文清单", "environapproval", "(证书编号,批文名称,下次回顾日期)", AlarmtypeId.toString() , o);
             }
         }
         this.ValidityTask(deptId);
@@ -360,7 +357,7 @@ public class ApprovalBYXTask extends BaseController {
                         }
                     }
                 }
-                levelSendEmail(firstwarningContent, secondwarningContent, thirdwarningContent, alarmPrincipals.get(0), "安全批文清单", "safetyapproval", "(证书编号,批文名称,证书有效期)", AlarmtypeId.toString(),o);
+                levelSendEmail(firstwarningContent, secondwarningContent, thirdwarningContent, alarmPrincipals, "安全批文清单", "safetyapproval", "(证书编号,批文名称,证书有效期)", AlarmtypeId.toString(),o);
             }
             firstwarningContent = "";
             secondwarningContent = "";
@@ -399,7 +396,7 @@ public class ApprovalBYXTask extends BaseController {
                     }
                 }
             }
-            levelSendEmail(firstwarningContent, secondwarningContent, thirdwarningContent, alarmPrincipals.get(0), "环保批文清单", "environapproval", "(证书编号,批文名称,证书有效期)", AlarmtypeId.toString(),o);
+            levelSendEmail(firstwarningContent, secondwarningContent, thirdwarningContent, alarmPrincipals, "环保批文清单", "environapproval", "(证书编号,批文名称,证书有效期)", AlarmtypeId.toString(),o);
         }}
     }
 
@@ -418,7 +415,7 @@ public class ApprovalBYXTask extends BaseController {
     /**
      * 分级预警
      */
-    public void levelSendEmail(String content1, String content2, String content3, TAlarmPrincipal alarmPrincipal, String alarmType, String alarmTypeEn, String contenFormat, String typeId, SysUser user) {
+    public void levelSendEmail(String content1, String content2, String content3, List<TAlarmPrincipal>  alarmPrincipal, String alarmType, String alarmTypeEn, String contenFormat, String typeId, SysUser user) {
         if (content1 != "") {
             sendEmail(alarmPrincipal, alarmType, "1级预警", content1, alarmTypeEn, contenFormat, typeId, user);
         }
@@ -433,7 +430,7 @@ public class ApprovalBYXTask extends BaseController {
     /**
      * 发送预警邮件
      */
-    public void sendEmail(TAlarmPrincipal alarmPrincipal, String alarmType, String warningLevel, String warningContent, String alarmTypeEn, String contenFormat, String typeId, SysUser user) {
+    public void sendEmail(List<TAlarmPrincipal> alarmPrincipal, String alarmType, String warningLevel, String warningContent, String alarmTypeEn, String contenFormat, String typeId, SysUser user) {
         //写html开始内容
         String start = "<!DOCTYPE html><html><head><meta charset=\"utf-8\"><title></title></head><body><div style=\"background-color:#ECECEC; padding: 35px;\">" +
                 "<table cellpadding=\"0\" align=\"center\"" +
@@ -446,7 +443,10 @@ public class ApprovalBYXTask extends BaseController {
         String email = "";
         username = user.getNickName();
         email = user.getEmail();
-        String emailCc = alarmPrincipal.getPrincipalEmail();
+        String[] emailCc = alarmPrincipal.stream()
+                .map(TAlarmPrincipal::getPrincipalEmail)
+                .filter(Objects::nonNull)
+                .toArray(String[]::new);
         //表html中间内容
         String prime = "";
         String firstcenter = "<tr><td><div style=\"padding:25px 35px 40px; background-color:#fff;\"><h2 style=\"margin: 5px 0px; \">" +
@@ -477,7 +477,7 @@ public class ApprovalBYXTask extends BaseController {
         mailService.sendHtmlMail(email, "CPMS:您有一条预警信息", html,emailCc);
 //        mailService.sendHtmlMail("735032128@qq.com", "CPMS:您有一条预警信息", html, "ly@seashoreept.com");
         String level = warningLevel.substring(0, 1);
-        insertHistory(alarmPrincipal, level, warningContent, typeId, alarmType);
+        insertHistory(alarmPrincipal.get(0), level, warningContent, typeId, alarmType);
     }
 
     /**

+ 9 - 6
master/src/main/java/com/ruoyi/framework/task/byx/PlantproglistBYXTask.java

@@ -162,7 +162,7 @@ public class PlantproglistBYXTask extends BaseController {
                         }
                     }
                 }
-                levelSendEmail(firstwarningContent, secondwarningContent, thirdwarningContent, alarmPrincipals.get(0), "装置程序清单", "plantproglist", "(文件编号,文件名称,下次回顾日期)", AlarmtypeId.toString(), o);
+                levelSendEmail(firstwarningContent, secondwarningContent, thirdwarningContent, alarmPrincipals, "装置程序清单", "plantproglist", "(文件编号,文件名称,下次回顾日期)", AlarmtypeId.toString(), o);
             }
         }
         this.EditTask(deptId);
@@ -257,7 +257,7 @@ public class PlantproglistBYXTask extends BaseController {
                         }
                     }
                 }
-                levelSendEmail(firstwarningContent, secondwarningContent, thirdwarningContent, alarmPrincipals.get(0), "装置程序清单", "plantproglist", "(文件编号,文件名称,下次修改日期)", AlarmtypeId.toString(), o);
+                levelSendEmail(firstwarningContent, secondwarningContent, thirdwarningContent, alarmPrincipals, "装置程序清单", "plantproglist", "(文件编号,文件名称,下次修改日期)", AlarmtypeId.toString(), o);
             }
         }
     }
@@ -278,7 +278,7 @@ public class PlantproglistBYXTask extends BaseController {
     /**
      * 分级预警
      */
-    public void levelSendEmail(String content1, String content2, String content3, TAlarmPrincipal alarmPrincipals, String alarmType, String alarmTypeEn, String contenFormat, String typeId, SysUser user) {
+    public void levelSendEmail(String content1, String content2, String content3, List<TAlarmPrincipal> alarmPrincipals, String alarmType, String alarmTypeEn, String contenFormat, String typeId, SysUser user) {
         if (content1 != "") {
             sendEmail(alarmPrincipals, alarmType, "1级预警", content1, alarmTypeEn, contenFormat, typeId, user);
         }
@@ -293,7 +293,7 @@ public class PlantproglistBYXTask extends BaseController {
     /**
      * 发送预警邮件
      */
-    public void sendEmail(TAlarmPrincipal alarmPrincipal, String alarmType, String warningLevel, String warningContent, String alarmTypeEn, String contenFormat, String typeId, SysUser user) {
+    public void sendEmail(List<TAlarmPrincipal> alarmPrincipal, String alarmType, String warningLevel, String warningContent, String alarmTypeEn, String contenFormat, String typeId, SysUser user) {
         //写html开始内容
         String start = "<!DOCTYPE html><html><head><meta charset=\"utf-8\"><title></title></head><body><div style=\"background-color:#ECECEC; padding: 35px;\">" +
                 "<table cellpadding=\"0\" align=\"center\"" +
@@ -306,7 +306,10 @@ public class PlantproglistBYXTask extends BaseController {
         String email = "";
         username = user.getNickName();
         email = user.getEmail();
-        String emailCc = alarmPrincipal.getPrincipalEmail();
+        String[] emailCc = alarmPrincipal.stream()
+                .map(TAlarmPrincipal::getPrincipalEmail)
+                .filter(Objects::nonNull)
+                .toArray(String[]::new);
 //        email = "735032128@qq.com";
         //表html中间内容
         String prime = "";
@@ -338,7 +341,7 @@ public class PlantproglistBYXTask extends BaseController {
         mailService.sendHtmlMail(email, "CPMS:您有一条预警信息", html, emailCc);
 //        mailService.sendHtmlMail("735032128@qq.com", "CPMS:您有一条预警信息", html, "ly@seashoreept.com");
         String level = warningLevel.substring(0, 1);
-        insertHistory(alarmPrincipal, level, warningContent, typeId, alarmType);
+        insertHistory(alarmPrincipal.get(0), level, warningContent, typeId, alarmType);
 
     }
 

+ 9 - 1
master/src/main/java/com/ruoyi/project/common/controller/TCommonfileController.java

@@ -1,6 +1,7 @@
 package com.ruoyi.project.common.controller;
 
 import java.io.IOException;
+import java.time.LocalDate;
 import java.util.List;
 
 import com.alibaba.fastjson.JSON;
@@ -50,7 +51,14 @@ public class TCommonfileController extends BaseController
     {
         if (!file.isEmpty())
         {
-                String url = FileUploadUtils.upload(RuoYiConfig.getFilePath("/"+ pType), file);
+            // 获取当前日期
+            LocalDate currentDate = LocalDate.now();
+            // 获取年份
+            int year = currentDate.getYear();
+            // 获取月份
+            int month = currentDate.getMonthValue();
+
+                String url = FileUploadUtils.upload(RuoYiConfig.getFilePath("/"+ pType + "/" + year), file);
                 long size = file.getSize()/1024;
                 TCommonfile tCommonfile = new TCommonfile();
                 tCommonfile.setFileUrl(url);

+ 78 - 5
master/src/main/java/com/ruoyi/project/production/controller/TPrdRecordController.java

@@ -1,5 +1,8 @@
 package com.ruoyi.project.production.controller;
 
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.text.SimpleDateFormat;
@@ -9,6 +12,10 @@ import java.util.List;
 
 import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGUpdateStatement;
 import com.alibaba.fastjson.JSON;
+import com.ruoyi.framework.config.RuoYiConfig;
+import com.ruoyi.project.common.domain.TCommonfile;
+import com.ruoyi.project.common.mapper.TCommonfileMapper;
+import com.ruoyi.project.common.service.ITCommonfileService;
 import com.ruoyi.project.plant.domain.TMtdDaily;
 import com.ruoyi.project.plant.domain.TMtdItem;
 import com.ruoyi.project.plant.mapper.TMtdItemMapper;
@@ -17,9 +24,9 @@ import com.ruoyi.project.production.domain.TPrdRecordItem;
 import com.ruoyi.project.production.mapper.TPrdRecordItemMapper;
 import com.ruoyi.project.production.mapper.TPrdRecordMapper;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.poi.xwpf.usermodel.XWPFDocument;
-import org.apache.poi.xwpf.usermodel.XWPFParagraph;
-import org.apache.poi.xwpf.usermodel.XWPFRun;
+import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
+import org.apache.poi.util.Units;
+import org.apache.poi.xwpf.usermodel.*;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -40,6 +47,7 @@ import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.web.page.TableDataInfo;
 
 import javax.annotation.Resource;
+import javax.imageio.ImageIO;
 
 /**
  * 生产记录Controller
@@ -61,6 +69,9 @@ public class TPrdRecordController extends BaseController
     private TPrdRecordMapper tPrdRecordMapper;
     @Resource
     private TPrdRecordItemMapper tPrdRecordItemMapper;
+    @Resource
+    private TCommonfileMapper tCommonfileMapper;
+
     /**
      * 查询生产记录列表
      */
@@ -155,7 +166,7 @@ public class TPrdRecordController extends BaseController
 
 
     // 添加每日的内容
-    private static void addDayContent(XWPFDocument document,TPrdRecord t ) {
+    private void addDayContent(XWPFDocument document,TPrdRecord t ) {
         Date date = t.getRecordDate();
         List<TPrdRecordItem> items = t.getItems();
         String remarks = t.getRemarks();
@@ -193,6 +204,52 @@ public class TPrdRecordController extends BaseController
             XWPFRun markRun2 = markParagraph2.createRun();
             markRun2.setText(remarks);
         }
+
+        TCommonfile tCommonfile = new TCommonfile();
+        tCommonfile.setpType("prdRecord");
+        tCommonfile.setpId(t.getId());
+        List<TCommonfile> exceptionImages = tCommonfileMapper.selectTCommonfileList(tCommonfile);
+
+        // 添加异常图片
+        if (exceptionImages != null && exceptionImages.size() >0) {
+            XWPFParagraph imageTitlePara = document.createParagraph();
+            XWPFRun titleRun = imageTitlePara.createRun();
+            titleRun.setText("异常图片:");
+            titleRun.setBold(true);
+            titleRun.addBreak();
+
+            for (TCommonfile commonfile : exceptionImages) {
+                String imgPath = RuoYiConfig.getProfile() + commonfile.getFileUrl().replaceFirst("/profile", "");
+                try (FileInputStream fis = new FileInputStream(imgPath)) {
+                    XWPFParagraph imgPara = document.createParagraph();
+                    XWPFRun imgRun = imgPara.createRun();
+
+                    String extension = imgPath.substring(imgPath.lastIndexOf(".") + 1).toLowerCase();
+                    int picType = determinePictureType(extension);
+
+                    // 动态尺寸计算
+                    BufferedImage img = ImageIO.read(new File(imgPath));
+                    int targetWidthPixel = 400; // 目标宽度像素
+                    double aspectRatio = (double) img.getHeight() / img.getWidth();
+                    int targetHeightPixel = (int) (targetWidthPixel * aspectRatio);
+
+                    try {
+                        imgRun.addPicture(
+                                fis,
+                                picType,
+                                imgPath,
+                                Units.toEMU(targetWidthPixel),
+                                Units.toEMU(targetHeightPixel)
+                        );
+                    } catch (InvalidFormatException e) {
+                        e.printStackTrace();
+                    }
+                    imgRun.addBreak(BreakType.TEXT_WRAPPING);
+                } catch (Exception e) {
+                    System.err.println("无法加载图片: " + imgPath);
+                }
+            }
+        }
         // 添加空白
         XWPFParagraph endParagraph = document.createParagraph();
         XWPFRun endRun = endParagraph.createRun();
@@ -217,7 +274,7 @@ public class TPrdRecordController extends BaseController
         tPrdRecordItemList.add(recordItem1);
 
         TPrdRecordItem recordItem2= new TPrdRecordItem();
-        recordItem2.setDescription("负荷:裂解:" +  tMtdDaily.getSplit()+ " AEU:" + tMtdDaily.getAeu() + " PGU:" + tMtdDaily.getPgu());
+        recordItem2.setDescription("负荷(t/hr):裂解:" +  tMtdDaily.getSplit()+ " AEU:" + tMtdDaily.getAeu() + " PGU:" + tMtdDaily.getPgu());
         recordItem2.setDailyId(record.getId());
         tPrdRecordItemList.add(recordItem2);
 
@@ -317,4 +374,20 @@ public class TPrdRecordController extends BaseController
     {
         return toAjax(tPrdRecordService.deleteTPrdRecordByIds(ids));
     }
+
+    private static int determinePictureType(String extension) {
+        switch (extension) {
+            case "jpg":
+            case "jpeg":
+                return Document.PICTURE_TYPE_JPEG;
+            case "png":
+                return Document.PICTURE_TYPE_PNG;
+            case "gif":
+                return Document.PICTURE_TYPE_GIF;
+            case "bmp":
+                return Document.PICTURE_TYPE_BMP;
+            default:
+                return Document.PICTURE_TYPE_PNG; // 默认类型
+        }
+    }
 }

+ 192 - 125
master/src/main/java/com/ruoyi/project/sems/controller/TMeasureThicknessController.java

@@ -45,6 +45,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.text.DateFormat;
@@ -61,8 +62,7 @@ import java.util.*;
  */
 @RestController
 @RequestMapping("/sems/thickness")
-public class TMeasureThicknessController extends BaseController
-{
+public class TMeasureThicknessController extends BaseController {
     @Autowired
     private ITMeasureThicknessService tMeasureThicknessService;
     @Autowired
@@ -74,6 +74,7 @@ public class TMeasureThicknessController extends BaseController
 
     // 美标(ASME)与国标B系列外径对照表(单位:mm)
     private static final Map<Double, Double> INCH_TO_MM_MAP = new HashMap<>();
+
     static {
         // 基础尺寸(0.5"~4")
         INCH_TO_MM_MAP.put(0.5, 21.3);   // 1/2英寸 → 21.3mm(国标B系列与ASME一致)[1,2](@ref)
@@ -83,7 +84,7 @@ public class TMeasureThicknessController extends BaseController
         INCH_TO_MM_MAP.put(2.0, 57.0);   // 2英寸 → 国标B系列57.0mm(ASME为60.3mm)[2,3](@ref)
         INCH_TO_MM_MAP.put(3.0, 88.9);   // 3英寸 → 88.9mm(国标B系列与ASME一致)[1,2](@ref)
         INCH_TO_MM_MAP.put(4.0, 114.3);  // 4英寸 → 114.3mm(国标B系列与ASME一致)
-
+        INCH_TO_MM_MAP.put(5.0, 141.3);  // 5英寸
         // 扩展尺寸(6"~20")
         INCH_TO_MM_MAP.put(6.0, 168.3);  // 6英寸 → 168.3mm(国标B系列与ASME一致)[2](@ref)
         INCH_TO_MM_MAP.put(8.0, 219.1);  // 8英寸 → 219.1mm(国标B系列与ASME一致)[2](@ref)
@@ -96,13 +97,13 @@ public class TMeasureThicknessController extends BaseController
     }
 
     private final Long alarmtype = 1080L;//特种设备预警ID
+
     /**
      * 查询定点测厚列表
      */
     @PreAuthorize("@ss.hasPermi('sems:thickness:list')")
     @GetMapping("/list")
-    public TableDataInfo list(TMeasureThickness tMeasureThickness)
-    {
+    public TableDataInfo list(TMeasureThickness tMeasureThickness) {
         logger.info(JSON.toJSONString(tMeasureThickness));
         startPage();
         List<TMeasureThickness> list = tMeasureThicknessService.selectTMeasureThicknessList(tMeasureThickness);
@@ -122,22 +123,22 @@ public class TMeasureThicknessController extends BaseController
 //                nextMeasureDate.setTime(dat);
 //                java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd");
 //                m.setNextMeasureDate(format.format(nextMeasureDate.getTime()));
-            }else {
+            } else {
                 m.setFirstMeasureDate(null);
                 m.setNewMeasureDate(null);
                 m.setNextMeasureDate(null);
             }
             //寿命预警
             if (m.getNextWarnDate() != null && !StringUtils.isEmpty(m.getEstRemain())) {
-               int day = this.formatDate(m.getNextWarnDate(),new Date());
-               BigDecimal remain = new BigDecimal(m.getEstRemain()).multiply(new BigDecimal("365")).setScale(4,BigDecimal.ROUND_HALF_DOWN);
-                logger.info(day +"::::" + remain);
-               if (remain.compareTo(new BigDecimal(day)) == -1) {
+                int day = this.formatDate(m.getNextWarnDate(), new Date());
+                BigDecimal remain = new BigDecimal(m.getEstRemain()).multiply(new BigDecimal("365")).setScale(4, BigDecimal.ROUND_HALF_DOWN);
+                logger.info(day + "::::" + remain);
+                if (remain.compareTo(new BigDecimal(day)) == -1) {
                     m.setWarnFlag(1);
-               }else {
-                   m.setWarnFlag(0);
-               }
-            }else {
+                } else {
+                    m.setWarnFlag(0);
+                }
+            } else {
                 m.setWarnFlag(0);
             }
         }
@@ -150,12 +151,11 @@ public class TMeasureThicknessController extends BaseController
     @PreAuthorize("@ss.hasPermi('sems:thickness:add')")
     @Log(title = "侧厚批量导入", businessType = BusinessType.INSERT)
     @PostMapping("/importData")
-    public AjaxResult importData(@RequestParam("file") MultipartFile file) throws IOException
-    {
+    public AjaxResult importData(@RequestParam("file") MultipartFile file) throws IOException {
         //获取操作人员ID
         Long userId = getUserId();
         //报错行数统计
-        List<Integer> failRow =new ArrayList<Integer>();
+        List<Integer> failRow = new ArrayList<Integer>();
         Workbook workbook = ExcelUtils.getWorkBook(file);
         Sheet sheet = workbook.getSheetAt(0);
         List<TMeasureThickness> list = new ArrayList<TMeasureThickness>();
@@ -188,7 +188,7 @@ public class TMeasureThicknessController extends BaseController
                         entity.setPosition(cellValue);//测厚部位CML
                     } else if (j == 5) {
                         entity.setLoopNo(cellValue);//回路编号
-                    }else if (j == 6) {
+                    } else if (j == 6) {
                         entity.setMeasureNo(cellValue);//检测编号
                     } else if (j == 7) {
                         entity.setEquipmentName(cellValue);//设备/管线名称
@@ -208,9 +208,9 @@ public class TMeasureThicknessController extends BaseController
                         if (cellValue.length() > 3) {//下次测厚日期
                             entity.setNextWarnDate(new SimpleDateFormat(DateUtils.getDateFormat(cellValue)).parse(cellValue));
                         }
-                    }  else if (j == 15) {
+                    } else if (j == 15) {
                         entity.setInspectionMethod(cellValue);//检测方法
-                    }  else if (j == 16) {
+                    } else if (j == 16) {
                         entity.setCorAllowance(cellValue);//腐蚀裕度(mm)
                     } else if (j == 17) {
                         entity.setOriginalThickness(cellValue);//原始壁厚(mm)
@@ -224,38 +224,38 @@ public class TMeasureThicknessController extends BaseController
                         entity.setFlowRate(cellValue);//流速(m/s)
                     } else if (j == 22) {
                         //温度(℃)
-                         entity.setTemperature(cellValue);
+                        entity.setTemperature(cellValue);
                     } else if (j == 23) {
                         //腐蚀类型
                         entity.setCorrosionType(cellValue);
                     } else if (j == 24) {
                         entity.setAnalysis(cellValue);//原因分析
-                    }else if (j == 25) {
+                    } else if (j == 25) {
                         entity.setMethodCause(cellValue);//治理方法及依据
                     } else if (j == 26) {
                         entity.setEffectTracing(cellValue); //效果跟踪
-                    }else if (j == 27) {
+                    } else if (j == 27) {
                         entity.setRaiser(cellValue);//提出人
-                    }else if (j == 28) {
+                    } else if (j == 28) {
                         if (cellValue.length() > 3) {//提出时间
                             entity.setRaiserDate(new SimpleDateFormat(DateUtils.getDateFormat(cellValue)).parse(cellValue));
                         }
-                    }else if (j == 29) {
+                    } else if (j == 29) {
                         entity.setOtherContent(cellValue);//其他检测方法内容
-                    }else if (j == 30) {
+                    } else if (j == 30) {
                         entity.setRecorder(cellValue);//记录人
-                    }else if (j == 31) {
+                    } else if (j == 31) {
                         if (cellValue.length() > 3) {//记录时间
                             entity.setRecorderDate(new SimpleDateFormat(DateUtils.getDateFormat(cellValue)).parse(cellValue));
                         }
-                    }else if (j == 32) {
+                    } else if (j == 32) {
                         entity.setRemarks(cellValue);//备注
                     }
                 }
                 entity.setCreateBy(userId.toString());
                 logger.info("entity:" + entity);
                 list.add(entity);
-            }catch (Exception e){
+            } catch (Exception e) {
                 failNumber++;
                 logger.info("e:" + JSON.toJSONString(e));
                 failRow.add(i + 1);
@@ -269,16 +269,16 @@ public class TMeasureThicknessController extends BaseController
             try {
                 tMeasureThicknessService.insertTMeasureThickness(t);
                 successNumber++;
-            }catch (Exception e){
+            } catch (Exception e) {
                 failNumber++;
                 logger.info("e:" + e);
                 failRow.add(failNum + 1);
             }
         }
         logger.info("list:" + JSON.toJSONString(list));
-        logger.info("successNumber:" +String.valueOf(successNumber));
-        logger.info("failNumber:" +String.valueOf(failNumber));
-        logger.info("failRow:" +String.valueOf(failRow));
+        logger.info("successNumber:" + String.valueOf(successNumber));
+        logger.info("failNumber:" + String.valueOf(failNumber));
+        logger.info("failRow:" + String.valueOf(failRow));
         return AjaxResult.success(String.valueOf(successNumber), failRow);
     }
 
@@ -288,8 +288,7 @@ public class TMeasureThicknessController extends BaseController
     @PreAuthorize("@ss.hasPermi('sems:thickness:export')")
     @Log(title = "定点测厚", businessType = BusinessType.EXPORT)
     @GetMapping("/export")
-    public AjaxResult export(TMeasureThickness tMeasureThickness)
-    {
+    public AjaxResult export(TMeasureThickness tMeasureThickness) {
         List<TMeasureThickness> list = tMeasureThicknessService.selectTMeasureThicknessList(tMeasureThickness);
         ExcelUtil<TMeasureThickness> util = new ExcelUtil<TMeasureThickness>(TMeasureThickness.class);
         return util.exportExcel(list, "thickness");
@@ -300,8 +299,7 @@ public class TMeasureThicknessController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('sems:thickness:query')")
     @GetMapping(value = "/{id}")
-    public AjaxResult getInfo(@PathVariable("id") Long id)
-    {
+    public AjaxResult getInfo(@PathVariable("id") Long id) {
         //生成图表
         String chartUrl = "/profile/" + this.getRecordUrl(id.toString());
         TMeasureThickness t = tMeasureThicknessService.selectTMeasureThicknessById(id);
@@ -315,8 +313,7 @@ public class TMeasureThicknessController extends BaseController
     @PreAuthorize("@ss.hasPermi('sems:thickness:add')")
     @Log(title = "定点测厚", businessType = BusinessType.INSERT)
     @PostMapping
-    public AjaxResult add(@RequestBody TMeasureThickness tMeasureThickness)
-    {
+    public AjaxResult add(@RequestBody TMeasureThickness tMeasureThickness) {
         return toAjax(tMeasureThicknessService.insertTMeasureThickness(tMeasureThickness));
     }
 
@@ -326,8 +323,8 @@ public class TMeasureThicknessController extends BaseController
     @PreAuthorize("@ss.hasPermi('sems:thickness:edit')")
     @Log(title = "定点测厚", businessType = BusinessType.UPDATE)
     @PutMapping
-    public AjaxResult edit(@RequestBody TMeasureThickness tMeasureThickness)
-    {
+    public AjaxResult edit(@RequestBody TMeasureThickness tMeasureThickness) {
+        tMeasureThickness.setThicknessMin(calculateTsd(tMeasureThickness));
         return toAjax(tMeasureThicknessService.updateTMeasureThickness(tMeasureThickness));
     }
 
@@ -336,9 +333,8 @@ public class TMeasureThicknessController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('sems:thickness:remove')")
     @Log(title = "定点测厚", businessType = BusinessType.DELETE)
-	@DeleteMapping("/{ids}")
-    public AjaxResult remove(@PathVariable Long[] ids)
-    {
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids) {
         return toAjax(tMeasureThicknessService.deleteTMeasureThicknessByIds(ids));
     }
 
@@ -347,10 +343,8 @@ public class TMeasureThicknessController extends BaseController
      */
     @Log(title = "定点测厚图片上传", businessType = BusinessType.UPDATE)
     @PostMapping("/uploadFile")
-    public AjaxResult uploadFile(@RequestParam("file") MultipartFile file) throws IOException
-    {
-        if (!file.isEmpty())
-        {
+    public AjaxResult uploadFile(@RequestParam("file") MultipartFile file) throws IOException {
+        if (!file.isEmpty()) {
             String avatar = FileUploadUtils.upload(RuoYiConfig.getFilePath("/thickness"), file);
             return AjaxResult.success(avatar);
         }
@@ -360,7 +354,7 @@ public class TMeasureThicknessController extends BaseController
 
     @RequestMapping("/measure/exportPDF")
     public String measure(@RequestParam String id, HttpServletRequest request, HttpServletResponse response) {
-        OutputStream out= null;
+        OutputStream out = null;
         try {
             getRecordUrl(id);
             out = response.getOutputStream();
@@ -379,45 +373,55 @@ public class TMeasureThicknessController extends BaseController
             String[] inspectionMethod = measureThicknessEntity.getInspectionMethod().split(",");
             logger.info("inspectionMethod:" + inspectionMethod);
             for (String m : inspectionMethod) {
-                if (m.equals("1")){ measureThicknessEntity.setMethodUT(true); }
-                if (m.equals("2")){ measureThicknessEntity.setMethodPEC(true); }
-                if (m.equals("3")){ measureThicknessEntity.setMethodRT(true); }
-                if (m.equals("4")){ measureThicknessEntity.setMethodEMAT(true); }
-                if (m.equals("5")){ measureThicknessEntity.setMethodOther(true); }
+                if (m.equals("1")) {
+                    measureThicknessEntity.setMethodUT(true);
+                }
+                if (m.equals("2")) {
+                    measureThicknessEntity.setMethodPEC(true);
+                }
+                if (m.equals("3")) {
+                    measureThicknessEntity.setMethodRT(true);
+                }
+                if (m.equals("4")) {
+                    measureThicknessEntity.setMethodEMAT(true);
+                }
+                if (m.equals("5")) {
+                    measureThicknessEntity.setMethodOther(true);
+                }
             }
             map.put("measure", measureThicknessEntity);
             logger.info("measure:" + measureThicknessEntity);
-            if(StringUtils.isNotEmpty(measureThicknessEntity.getPhoto())){
-                String[] photos =  measureThicknessEntity.getPhoto().split(",");
+            if (StringUtils.isNotEmpty(measureThicknessEntity.getPhoto())) {
+                String[] photos = measureThicknessEntity.getPhoto().split(",");
                 if (photos.length == 1) {
-                    map.put("photo1", photos[0].replaceAll("/profile/",""));
-                }else if (photos.length == 2) {
-                    map.put("photo1", photos[0].replaceAll("/profile/",""));
-                    map.put("photo2", photos[1].replaceAll("/profile/",""));
-                }else if (photos.length == 3) {
-                    map.put("photo1", photos[0].replaceAll("/profile/",""));
-                    map.put("photo2", photos[1].replaceAll("/profile/",""));
-                    map.put("photo3", photos[2].replaceAll("/profile/",""));
+                    map.put("photo1", photos[0].replaceAll("/profile/", ""));
+                } else if (photos.length == 2) {
+                    map.put("photo1", photos[0].replaceAll("/profile/", ""));
+                    map.put("photo2", photos[1].replaceAll("/profile/", ""));
+                } else if (photos.length == 3) {
+                    map.put("photo1", photos[0].replaceAll("/profile/", ""));
+                    map.put("photo2", photos[1].replaceAll("/profile/", ""));
+                    map.put("photo3", photos[2].replaceAll("/profile/", ""));
                 }
             }
-            if(StringUtils.isNotEmpty(measureThicknessEntity.getLocationUrl())){
-                String[] locationUrls =  measureThicknessEntity.getLocationUrl().split(",");
+            if (StringUtils.isNotEmpty(measureThicknessEntity.getLocationUrl())) {
+                String[] locationUrls = measureThicknessEntity.getLocationUrl().split(",");
                 if (locationUrls.length == 1) {
-                    map.put("locationUrl1", locationUrls[0].replaceAll("/profile/",""));
-                }else if (locationUrls.length == 2) {
-                    map.put("locationUrl1", locationUrls[0].replaceAll("/profile/",""));
-                    map.put("locationUrl2", locationUrls[1].replaceAll("/profile/",""));
+                    map.put("locationUrl1", locationUrls[0].replaceAll("/profile/", ""));
+                } else if (locationUrls.length == 2) {
+                    map.put("locationUrl1", locationUrls[0].replaceAll("/profile/", ""));
+                    map.put("locationUrl2", locationUrls[1].replaceAll("/profile/", ""));
                     logger.info(locationUrls[0]);
-                }else if (locationUrls.length == 3) {
-                    map.put("locationUrl1", locationUrls[0].replaceAll("/profile/",""));
-                    map.put("locationUrl2", locationUrls[1].replaceAll("/profile/",""));
-                    map.put("locationUrl3", locationUrls[2].replaceAll("/profile/",""));
+                } else if (locationUrls.length == 3) {
+                    map.put("locationUrl1", locationUrls[0].replaceAll("/profile/", ""));
+                    map.put("locationUrl2", locationUrls[1].replaceAll("/profile/", ""));
+                    map.put("locationUrl3", locationUrls[2].replaceAll("/profile/", ""));
                 }
             }
-        //测量记录分行
-        List<TMeasureRecord> measureRecords = tMeasureRecordService.queryRecords(id);
-        List<List<TMeasureRecord>> result = new ArrayList<List<TMeasureRecord>>();
-        int sourceSize = measureRecords.size();
+            //测量记录分行
+            List<TMeasureRecord> measureRecords = tMeasureRecordService.queryRecords(id);
+            List<List<TMeasureRecord>> result = new ArrayList<List<TMeasureRecord>>();
+            int sourceSize = measureRecords.size();
             int size = (measureRecords.size() / 7) + 1;
             if (measureRecords.size() % 7 == 0) {
                 size = size - 1;
@@ -440,14 +444,14 @@ public class TMeasureThicknessController extends BaseController
             }
             map.put("result", result);
             logger.info("result:" + result);
-            String name = measureThicknessEntity.getPlantCode() +"-" +measureThicknessEntity.getTagno() + "-" + measureThicknessEntity.getPosition();
-            PDFTemplateUtil.exportPdf("measureFMaker.ftl", name + ".pdf","file:"+RuoYiConfig.getProfile(), map, response);
+            String name = measureThicknessEntity.getPlantCode() + "-" + measureThicknessEntity.getTagno() + "-" + measureThicknessEntity.getPosition();
+            PDFTemplateUtil.exportPdf("measureFMaker.ftl", name + ".pdf", "file:" + RuoYiConfig.getProfile(), map, response);
 //             PDFTemplateUtil.exportPdf("measureFMaker.ftl", name + ".pdf",RuoYiConfig.getProfile(), map, response);
 
         } catch (Exception e) {
             e.printStackTrace();
-        }finally {
-            if(out!=null)
+        } finally {
+            if (out != null)
                 try {
                     out.close();
                 } catch (IOException e) {
@@ -457,7 +461,7 @@ public class TMeasureThicknessController extends BaseController
         return null;
     }
 
-    public String getRecordUrl(String id){
+    public String getRecordUrl(String id) {
         try {
             TMeasureThickness measureThicknessEntity = tMeasureThicknessService.selectTMeasureThicknessById(Long.parseLong(id));
             List<TMeasureRecord> measureRecords = tMeasureRecordService.queryRecords(id);
@@ -465,24 +469,24 @@ public class TMeasureThicknessController extends BaseController
             //种类数据集
             DefaultCategoryDataset dataset = new DefaultCategoryDataset();
             SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
-            for (TMeasureRecord t: measureRecords
+            for (TMeasureRecord t : measureRecords
             ) {
-                dataset.addValue(t.getMeasureValue() , "数值Value" , sdf.format(t.getMeasureDate()));
-                if (measureThicknessEntity.getThicknessMin() != null){
-                    dataset.addValue(Double.parseDouble(measureThicknessEntity.getThicknessMin()) , "最小允许壁厚" , sdf.format(t.getMeasureDate()));
+                dataset.addValue(t.getMeasureValue(), "数值Value", sdf.format(t.getMeasureDate()));
+                if (measureThicknessEntity.getThicknessMin() != null) {
+                    dataset.addValue(Double.parseDouble(measureThicknessEntity.getThicknessMin()), "最小允许壁厚", sdf.format(t.getMeasureDate()));
                 }
             }
-            String url = RuoYiConfig.getProfile() + "/" + id +".jpg";
-            ChartUtil.createLinePort("" , dataset ,"" ,"" , url ) ;
+            String url = RuoYiConfig.getProfile() + "/" + id + ".jpg";
+            ChartUtil.createLinePort("", dataset, "", "", url);
 
-        }catch (Exception e) {
+        } catch (Exception e) {
             logger.error("生成图片错误");
             logger.error(JSON.toJSONString(e));
         }
-        return id +".jpg";
+        return id + ".jpg";
     }
 
-    private int formatDate(Date nowDate, Date sqlDate){
+    private int formatDate(Date nowDate, Date sqlDate) {
         DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         String newDate = df.format(nowDate);
         String sqlDate1 = df.format(sqlDate);
@@ -492,11 +496,12 @@ public class TMeasureThicknessController extends BaseController
         } catch (Exception e) {
             e.printStackTrace();
         }
-        Long time =  nowDate.getTime();
-        Long time2 =  sqlDate.getTime();
-        int day = (int) ((time - time2) / (24*3600*1000));
+        Long time = nowDate.getTime();
+        Long time2 = sqlDate.getTime();
+        int day = (int) ((time - time2) / (24 * 3600 * 1000));
         return day;
     }
+
     /**
      * @param id
      * @return
@@ -520,7 +525,7 @@ public class TMeasureThicknessController extends BaseController
         //根据ID查询并生成
         TMeasureThickness t = tMeasureThicknessService.selectTMeasureThicknessById(id);
         String url = this.createcheck(t);
-        if (StringUtils.isNotEmpty(t.getCheckUrl()) ) {
+        if (StringUtils.isNotEmpty(t.getCheckUrl())) {
             //合并PDF
             logger.info("url:" + url);
             // 将路径字符串转换为Path对象
@@ -528,13 +533,13 @@ public class TMeasureThicknessController extends BaseController
             // 获取文件名
             String fileName = path.getFileName().toString();
             fileName = officeConvertController.wordTransPdf(url);
-            String filePathOne = RuoYiConfig.getProfile() + "/" + fileName.replace("/profile","");
-            String filePathTwo =RuoYiConfig.getProfile() + "/" + t.getCheckUrl().replace("/profile","");
-            String newPdfPath =  "sems/measure/" + t.getId() + ".pdf" ;
+            String filePathOne = RuoYiConfig.getProfile() + "/" + fileName.replace("/profile", "");
+            String filePathTwo = RuoYiConfig.getProfile() + "/" + t.getCheckUrl().replace("/profile", "");
+            String newPdfPath = "sems/measure/" + t.getId() + ".pdf";
             logger.info("newPdfPath:" + newPdfPath);
             logger.info("filePathOne:" + filePathOne);
             logger.info("filePathTwo:" + filePathTwo);
-            PDFUtil.mergeTwoPdfs(filePathOne ,filePathTwo,RuoYiConfig.getProfile() + "/" + newPdfPath);
+            PDFUtil.mergeTwoPdfs(filePathOne, filePathTwo, RuoYiConfig.getProfile() + "/" + newPdfPath);
             return "/profile/" + newPdfPath;
         }
         return url;
@@ -552,7 +557,7 @@ public class TMeasureThicknessController extends BaseController
         // 生成word的路径
         String fileDir = RuoYiConfig.getProfile() + "/" + "sems/measure";
         // 生成word的文件名称
-        String fileName = tMeasureThickness.getPlantCode()+ "_" +tMeasureThickness.getId()  + ".docx";
+        String fileName = tMeasureThickness.getPlantCode() + "_" + tMeasureThickness.getId() + ".docx";
         String wordPath = this.createWord(templatePath, fileDir, fileName, params);
         return wordPath;
     }
@@ -618,21 +623,21 @@ public class TMeasureThicknessController extends BaseController
                 params.put("corrosion3", Pictures.ofLocal(fileName(pArr[2])).size(240, 240).create());
             }
         }
-        String trendUrl = "/" + getRecordUrl(thickness.getId()+"");
+        String trendUrl = "/" + getRecordUrl(thickness.getId() + "");
         logger.info("trendUrl:" + trendUrl);
         params.put("trend", Pictures.ofLocal(fileName(trendUrl)).size(600, 300).create());
 
         //测量记录分行
-        List<TMeasureRecord> measureRecords = tMeasureRecordService.queryRecords(thickness.getId()+"");
+        List<TMeasureRecord> measureRecords = tMeasureRecordService.queryRecords(thickness.getId() + "");
         RowRenderData[] rowList = new RowRenderData[measureRecords.size() + 1];
         rowList[0] = Rows.of("日期Date", "数值Value").textColor("FFFFFF")
                 .bgColor("4472C4").center().create();
         List rows = new ArrayList();
         int i = 0;
-        for (TMeasureRecord m: measureRecords
-             ) {
+        for (TMeasureRecord m : measureRecords
+        ) {
             i++;
-            rowList[i] = Rows.create(DateUtils.dateTime(m.getMeasureDate()),m.getMeasureValue()+"");
+            rowList[i] = Rows.create(DateUtils.dateTime(m.getMeasureDate()), m.getMeasureValue() + "");
         }
 
         params.put("table", Tables.of(rowList).create());
@@ -688,6 +693,7 @@ public class TMeasureThicknessController extends BaseController
 
     /**
      * 将字符串转换为 double 数值,支持多种格式(如逗号/小数点分隔符、千位分隔符等)
+     *
      * @param valueStr 输入的字符串(如 "2.5", "1,200.75", "3,14")
      * @return 转换后的 double 数值
      * @throws ParseException 如果无法解析字符串
@@ -704,9 +710,10 @@ public class TMeasureThicknessController extends BaseController
 
     /**
      * 将带单位的英寸字符串转换为国标B系列外径(毫米)
+     *
      * @param input 输入字符串(如 "6\"", "2.5in", "3.14inch")
      * @return 国标B系列对应的外径(毫米)
-     * @throws ParseException 如果输入格式无法解析
+     * @throws ParseException           如果输入格式无法解析
      * @throws IllegalArgumentException 如果尺寸未在对照表中定义
      */
     public static double convertInchStringToMillimeters(String input) throws ParseException, IllegalArgumentException {
@@ -729,27 +736,87 @@ public class TMeasureThicknessController extends BaseController
     /**
      * 计算管道壁厚的通用方法(输入参数均为 String 类型)
      */
-    public double calculateTsd(TMeasureThickness thickness)
-            throws ParseException {
-        // 转换所有参数为 double
-        double p = parseStringToDouble(thickness.getDesPressure());
-        double d0 = convertInchStringToMillimeters(thickness.getSpecification());
-        double ej = 1;
-        double y = 0.4;
-
-        TMeasureStress stress = tMeasureStressMapper.selectTMeasureStressByName(thickness.getMaterial());
-        double c2 = 1.5;
-        if (stress.getIsSteel() == 1) {
-             c2 = 1 ;
-        }
+    public String calculateTsd(TMeasureThickness thickness) {
+        try {
+            // 转换所有参数为 double
+            double p = 0;
 
-        double sT = 0;
+            p = parseStringToDouble(thickness.getDesPressure());
 
+            double d0 = convertInchStringToMillimeters(thickness.getSpecification());
+            double ej = 1;
+            double y = 0.4;
 
-        // 计算壁厚公式
-        double numerator = p * d0;
-        double denominator = 2 * (sT * ej + p * y);
-        return (numerator / denominator) + c2;
+            TMeasureStress stress = tMeasureStressMapper.selectTMeasureStressByName(thickness.getMaterial());
+            double c2 = 1.5;
+            if (stress.getIsSteel() == 1) {
+                c2 = 1;
+            }
+            String stStress = "";
+            double desTemp = parseStringToDouble(thickness.getDesTemp());
+            if (desTemp <= 40) {
+                stStress = stress.getC40();
+            } else if (desTemp <= 65) {
+                stStress = stress.getC65();
+            } else if (desTemp <= 100) {
+                stStress = stress.getC100();
+            } else if (desTemp <= 125) {
+                stStress = stress.getC125();
+            } else if (desTemp <= 150) {
+                stStress = stress.getC150();
+            } else if (desTemp <= 175) {
+                stStress = stress.getC175();
+            } else if (desTemp <= 200) {
+                stStress = stress.getC200();
+            } else if (desTemp <= 225) {
+                stStress = stress.getC225();
+            } else if (desTemp <= 250) {
+                stStress = stress.getC250();
+            } else if (desTemp <= 275) {
+                stStress = stress.getC275();
+            } else if (desTemp <= 300) {
+                stStress = stress.getC300();
+            } else if (desTemp <= 325) {
+                stStress = stress.getC325();
+            } else if (desTemp <= 350) {
+                stStress = stress.getC350();
+            } else if (desTemp <= 375) {
+                stStress = stress.getC375();
+            } else if (desTemp <= 400) {
+                stStress = stress.getC400();
+            } else if (desTemp <= 425) {
+                stStress = stress.getC425();
+            } else if (desTemp <= 450) {
+                stStress = stress.getC450();   // 允许返回 null
+            } else if (desTemp <= 475) {
+                stStress = stress.getC475();   // 允许返回 null
+            } else if (desTemp <= 500) {
+                stStress = stress.getC500();   // 允许返回 null
+            } else if (desTemp <= 525) {
+                stStress = stress.getC525();   // 允许返回 null
+            } else if (desTemp <= 550) {
+                stStress = stress.getC550();   // 允许返回 null
+            } else if (desTemp <= 575) {
+                stStress = stress.getC575();   // 允许返回 null
+            } else if (desTemp <= 600) {
+                stStress = stress.getC600();   // 允许返回 null
+            } else {
+                stStress = stress.getC600();   // 超过 600 仍用 c600
+            }
+
+            double sT = parseStringToDouble(stStress);
+
+            // 计算壁厚公式
+            double numerator = p * d0;
+            double denominator = 2 * (sT * ej + p * y);
+            double tds = (numerator / denominator) + c2;
+            // 使用BigDecimal四舍五入到两位小数
+            return  BigDecimal.valueOf(tds)
+                    .setScale(2, RoundingMode.HALF_UP).toString();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return thickness.getThicknessMin();
+        }
     }
 
 

+ 13 - 0
master/src/main/java/com/ruoyi/project/sems/controller/TReportHiYlgdController.java

@@ -35,6 +35,7 @@ import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.text.SimpleDateFormat;
+import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -154,6 +155,12 @@ public class TReportHiYlgdController extends BaseController {
                     map.put("safePhonenumber", "");
                 }
             }
+            // 转换为 LocalDate 获取年份
+            int year = reportHiYlgd.getCheckDate().toInstant()
+                    .atZone(ZoneId.systemDefault())
+                    .toLocalDate()
+                    .getYear();
+            reportHiYlgd.setYearReportNo(reportHiYlgd.getPlantCode() + "-"+ year +  "-" + reportHiYlgd.getYearReportNo());
             map.put("reportHiYlgd", reportHiYlgd);
             TReportYlgd reportYlgd = tReportYlgdService.selectTReportYlgdById(reportHiYlgd.getReportId());
             TSpecdevYlgd devYlgd = tSpecdevYlgdService.selectTSpecdevYlgdById(reportYlgd.getDevId());
@@ -255,6 +262,12 @@ public class TReportHiYlgdController extends BaseController {
                         map.put("safePhonenumber", "");
                     }
                 }
+                // 转换为 LocalDate 获取年份
+                int year2 = tReportHiYlgd.getCheckDate().toInstant()
+                        .atZone(ZoneId.systemDefault())
+                        .toLocalDate()
+                        .getYear();
+                tReportHiYlgd.setYearReportNo(tReportHiYlgd.getPlantCode() + "-"+ year2 +  "-" + tReportHiYlgd.getYearReportNo());
                 map.put("reportHiYlgd", tReportHiYlgd);
                 TReportYlgd reportYlgd = tReportYlgdService.selectTReportYlgdById(tReportHiYlgd.getReportId());
                 //如果出现无法获取的基础数据,可能是以往的脏数据,选择跳过当前数据项

+ 13 - 0
master/src/main/java/com/ruoyi/project/sems/controller/TReportHiYlrqController.java

@@ -35,6 +35,7 @@ import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.text.SimpleDateFormat;
+import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -154,6 +155,12 @@ public class TReportHiYlrqController extends BaseController {
                     map.put("safePhonenumber", "");
                 }
             }
+            // 转换为 LocalDate 获取年份
+            int year = tReportHiYlrq.getCheckDate().toInstant()
+                    .atZone(ZoneId.systemDefault())
+                    .toLocalDate()
+                    .getYear();
+            tReportHiYlrq.setYearReportNo(tReportHiYlrq.getPlantCode() + "-"+ year +  "-" + tReportHiYlrq.getYearReportNo());
             map.put("reportHiYlrq", tReportHiYlrq);
             TReportYlrq reportYlrq = tReportYlrqService.selectTReportYlrqById(tReportHiYlrq.getReportId());
             TSpecdevYlrq devYlrq = tSpecdevYlrqService.selectTSpecdevYlrqById(reportYlrq.getDevId());
@@ -255,6 +262,12 @@ public class TReportHiYlrqController extends BaseController {
                         map.put("safePhonenumber", "");
                     }
                 }
+                // 转换为 LocalDate 获取年份
+                int year2 = tReportHiYlrq.getCheckDate().toInstant()
+                        .atZone(ZoneId.systemDefault())
+                        .toLocalDate()
+                        .getYear();
+                tReportHiYlrq.setYearReportNo(tReportHiYlrq.getPlantCode() + "-"+ year2 +  "-"+tReportHiYlrq.getYearReportNo());
                 map.put("reportHiYlrq", tReportHiYlrq);
                 TReportYlrq reportYlrq = tReportYlrqService.selectTReportYlrqById(tReportHiYlrq.getReportId());
                 //如果出现无法获取的基础数据,可能是以往的脏数据,选择跳过当前数据项

+ 3 - 1
master/src/main/resources/mybatis/sems/TMeasureStressMapper.xml

@@ -61,7 +61,9 @@
 
     <select id="selectTMeasureStressByName" parameterType="String" resultMap="TMeasureStressResult">
         <include refid="selectTMeasureStressVo"/>
-        where name = #{name}
+        where name like concat(concat('%', #{name}), '%') and del_flag = 0
+        ORDER BY id DESC  -- 可选:按业务规则排序
+        FETCH FIRST 1 ROWS ONLY
     </select>
 
 

BIN
master/src/main/resources/static/word/plant/dailymeeting.docx


+ 17 - 75
ui/src/views/login.vue

@@ -17,26 +17,25 @@
           show-password
           auto-complete="off"
           :placeholder="$t('login.password')"
-          @keyup.enter.native="handleLoginWithSms"
+          @keyup.enter.native="handleLogin"
         >
           <svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon"/>
         </el-input>
       </el-form-item>
-            <el-form-item prop="code">
-              <el-input
-                v-model="loginForm.code"
-                auto-complete="off"
-                :placeholder="$t('login.code')"
-                style="width: 63%"
-                @keyup.enter.native="handleLoginWithSms"
-              >
-                <svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" />
-              </el-input>
-              <div class="login-code">
-                <el-button size="mini" type="primary" style="width:100%;" class="sendCode" @click="sendSmsCode()"
-                           :disabled="isSending">{{ isSending ? `${countdown}秒后重新发送` : '发送验证码' }}</el-button>
-              </div>
-            </el-form-item>
+      <!--      <el-form-item prop="code">-->
+      <!--        <el-input-->
+      <!--          v-model="loginForm.code"-->
+      <!--          auto-complete="off"-->
+      <!--          :placeholder="$t('login.code')"-->
+      <!--          style="width: 63%"-->
+      <!--          @keyup.enter.native="handleLogin"-->
+      <!--        >-->
+      <!--          <svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" />-->
+      <!--        </el-input>-->
+      <!--        <div class="login-code">-->
+      <!--          <img :src="codeUrl" @click="getCode" class="login-code-img"/>-->
+      <!--        </div>-->
+      <!--      </el-form-item>-->
       <el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 0px;">{{
           $t('login.rememberPassword')
         }}
@@ -47,7 +46,7 @@
           size="medium"
           type="primary"
           style="width:100%;"
-          @click.native.prevent="handleLoginWithSms"
+          @click.native.prevent="handleLogin"
         >
           <span v-if="!loading"> {{ $t('login.logIn') }}</span>
           <span v-else>{{ $t('login.loading') }}</span>
@@ -98,7 +97,7 @@
 </template>
 
 <script>
-import {getCodeImg,sendSms} from "@/api/login";
+import {getCodeImg} from "@/api/login";
 import Cookies from "js-cookie";
 import {encrypt, decrypt} from '@/utils/jsencrypt'
 import LangSelect from '@/components/LangSelect'
@@ -110,8 +109,6 @@ export default {
     return {
       codeUrl: "",
       cookiePassword: "",
-      isSending: false,
-      countdown: 60,
       loginForm: {
         username: "",
         password: "",
@@ -157,36 +154,6 @@ export default {
         this.loginForm.uuid = res.uuid;
       });
     },
-    sendSmsCode(){
-
-      let hasError = false;
-      this.$refs.loginForm.validateField(['username', 'password'], err => {
-        if (err) {
-          hasError = true;
-          this.$message.warning('请检查必填项是否填写完整/正确')
-          return false;
-        }
-      })
-      if (!hasError) {
-        // 校验通过
-          sendSms(this.loginForm).then(res => {
-            this.startCountdown ()
-          });
-      }
-    },
-    // 验证码重新发送倒计时方法
-    startCountdown () {
-      this.isSending = true;
-      const timer = setInterval(() => {
-        if (this.countdown > 0) {
-          this.countdown--;
-        } else {
-          this.isSending = false;
-          this.countdown = 60;
-          clearInterval(timer);
-        }
-      }, 1000);
-    },
     getCookie() {
       const username = Cookies.get("username");
       const password = Cookies.get("password");
@@ -197,31 +164,6 @@ export default {
         rememberMe: rememberMe === undefined ? false : Boolean(rememberMe)
       };
     },
-    handleLoginWithSms() {
-      this.$refs.loginForm.validate(valid => {
-        if (valid) {
-          this.loading = true;
-          if (this.loginForm.rememberMe) {
-            Cookies.set("username", this.loginForm.username, {expires: 30});
-            Cookies.set("password", encrypt(this.loginForm.password), {expires: 30});
-            Cookies.set('rememberMe', this.loginForm.rememberMe, {expires: 30});
-          } else {
-            Cookies.remove("username");
-            Cookies.remove("password");
-            Cookies.remove('rememberMe');
-          }
-          this.$store
-            .dispatch("LoginWithSms", this.loginForm)
-            .then(() => {
-              this.$router.push({path: this.redirect || "/404"});
-            })
-            .catch(() => {
-              this.loading = false;
-              this.getCode();
-            });
-        }
-      });
-    },
     handleLogin() {
       this.$refs.loginForm.validate(valid => {
         if (valid) {

+ 75 - 17
ui/src/views/login.bak → ui/src/views/login2.bak

@@ -17,25 +17,26 @@
           show-password
           auto-complete="off"
           :placeholder="$t('login.password')"
-          @keyup.enter.native="handleLogin"
+          @keyup.enter.native="handleLoginWithSms"
         >
           <svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon"/>
         </el-input>
       </el-form-item>
-      <!--      <el-form-item prop="code">-->
-      <!--        <el-input-->
-      <!--          v-model="loginForm.code"-->
-      <!--          auto-complete="off"-->
-      <!--          :placeholder="$t('login.code')"-->
-      <!--          style="width: 63%"-->
-      <!--          @keyup.enter.native="handleLogin"-->
-      <!--        >-->
-      <!--          <svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" />-->
-      <!--        </el-input>-->
-      <!--        <div class="login-code">-->
-      <!--          <img :src="codeUrl" @click="getCode" class="login-code-img"/>-->
-      <!--        </div>-->
-      <!--      </el-form-item>-->
+            <el-form-item prop="code">
+              <el-input
+                v-model="loginForm.code"
+                auto-complete="off"
+                :placeholder="$t('login.code')"
+                style="width: 63%"
+                @keyup.enter.native="handleLoginWithSms"
+              >
+                <svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" />
+              </el-input>
+              <div class="login-code">
+                <el-button size="mini" type="primary" style="width:100%;" class="sendCode" @click="sendSmsCode()"
+                           :disabled="isSending">{{ isSending ? `${countdown}秒后重新发送` : '发送验证码' }}</el-button>
+              </div>
+            </el-form-item>
       <el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 0px;">{{
           $t('login.rememberPassword')
         }}
@@ -46,7 +47,7 @@
           size="medium"
           type="primary"
           style="width:100%;"
-          @click.native.prevent="handleLogin"
+          @click.native.prevent="handleLoginWithSms"
         >
           <span v-if="!loading"> {{ $t('login.logIn') }}</span>
           <span v-else>{{ $t('login.loading') }}</span>
@@ -97,7 +98,7 @@
 </template>
 
 <script>
-import {getCodeImg} from "@/api/login";
+import {getCodeImg,sendSms} from "@/api/login";
 import Cookies from "js-cookie";
 import {encrypt, decrypt} from '@/utils/jsencrypt'
 import LangSelect from '@/components/LangSelect'
@@ -109,6 +110,8 @@ export default {
     return {
       codeUrl: "",
       cookiePassword: "",
+      isSending: false,
+      countdown: 60,
       loginForm: {
         username: "",
         password: "",
@@ -154,6 +157,36 @@ export default {
         this.loginForm.uuid = res.uuid;
       });
     },
+    sendSmsCode(){
+
+      let hasError = false;
+      this.$refs.loginForm.validateField(['username', 'password'], err => {
+        if (err) {
+          hasError = true;
+          this.$message.warning('请检查必填项是否填写完整/正确')
+          return false;
+        }
+      })
+      if (!hasError) {
+        // 校验通过
+          sendSms(this.loginForm).then(res => {
+            this.startCountdown ()
+          });
+      }
+    },
+    // 验证码重新发送倒计时方法
+    startCountdown () {
+      this.isSending = true;
+      const timer = setInterval(() => {
+        if (this.countdown > 0) {
+          this.countdown--;
+        } else {
+          this.isSending = false;
+          this.countdown = 60;
+          clearInterval(timer);
+        }
+      }, 1000);
+    },
     getCookie() {
       const username = Cookies.get("username");
       const password = Cookies.get("password");
@@ -164,6 +197,31 @@ export default {
         rememberMe: rememberMe === undefined ? false : Boolean(rememberMe)
       };
     },
+    handleLoginWithSms() {
+      this.$refs.loginForm.validate(valid => {
+        if (valid) {
+          this.loading = true;
+          if (this.loginForm.rememberMe) {
+            Cookies.set("username", this.loginForm.username, {expires: 30});
+            Cookies.set("password", encrypt(this.loginForm.password), {expires: 30});
+            Cookies.set('rememberMe', this.loginForm.rememberMe, {expires: 30});
+          } else {
+            Cookies.remove("username");
+            Cookies.remove("password");
+            Cookies.remove('rememberMe');
+          }
+          this.$store
+            .dispatch("LoginWithSms", this.loginForm)
+            .then(() => {
+              this.$router.push({path: this.redirect || "/404"});
+            })
+            .catch(() => {
+              this.loading = false;
+              this.getCode();
+            });
+        }
+      });
+    },
     handleLogin() {
       this.$refs.loginForm.validate(valid => {
         if (valid) {

+ 30 - 2
ui/src/views/production/prdRecord/index.vue

@@ -77,6 +77,24 @@
 
 
       <el-table-column label="异常情况记录" align="center" prop="remarks"  width="400" />
+      <el-table-column label="异常文件" align="center" prop="tnNew-score" width="100">
+        <template slot-scope="scope">
+          <el-badge
+            :value="scope.row.infoNum"
+            :hidden="scope.row.infoNum == 0"
+            :type="'primary'"
+            :offset="[-5, 5]"
+          >
+            <el-button
+              size="small"
+              icon="el-icon-folder"
+              style="color:#6e96fa;"
+              @click="handleDoc(scope.row)"
+              circle>
+            </el-button>
+          </el-badge>
+        </template>
+      </el-table-column>
       <el-table-column label="操作" align="center" fixed="right" width="160" class-name="small-padding fixed-width">
         <template slot-scope="scope">
           <el-button
@@ -113,7 +131,7 @@
     />
 
     <!-- 添加或修改生产记录对话框 -->
-    <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
+    <el-dialog :close-on-click-modal="false" :title="title" :visible.sync="open" width="800px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
 
         <el-form-item label="记录时间" prop="recordDate">
@@ -178,6 +196,7 @@
               <el-button @click="upload.open = false">取 消</el-button>
           </div>
       </el-dialog>
+    <Attachment ref="childRef"></Attachment>
   </div>
 </template>
 
@@ -187,10 +206,11 @@ import { treeselect } from "@/api/system/dept";
 import { getToken } from "@/utils/auth";
 import Treeselect from "@riophae/vue-treeselect";
 import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+import Attachment from '@/views/components/file/attachment.vue'
 
 export default {
   name: "PrdRecord",
-  components: { Treeselect },
+  components: { Treeselect,Attachment },
   data() {
     return {
       // 遮罩层
@@ -430,6 +450,14 @@ export default {
     addItem(type) {
         this.form.items.push({description: ''})
     },
+
+    /** 报告附件按钮操作 */
+    handleDoc(row) {
+      // 通过ref引用子组件
+      const child = this.$refs.childRef;
+      // 调用子组件的方法并传递参数
+      child.handleDoc(row , 'prdRecord');
+    },
   }
 };
 </script>