From b12c9e77a6b6a7b410ac421c5a3d68da88823460 Mon Sep 17 00:00:00 2001
From: zhuguifei <312353457@qq.com>
Date: 星期五, 06 三月 2026 15:20:51 +0800
Subject: [PATCH] feat: 烟丝单柜产耗统计

---
 ruoyi-plus-soybean/src/views/analy/store-silk/index.vue                                                             |  120 ++---
 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/qa/analy/service/impl/StoreSilkInfoServiceImpl.java |  448 ++++++++++++++++++++++++
 ruoyi-plus-soybean/src/views/analy/hoister/modules/hoister-data-operate-drawer.vue                                  |   73 ++--
 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/qa/analy/domain/vo/StoreSilkDetailVo.java           |   55 +++
 ruoyi-plus-soybean/src/views/qm/batch/modules/batch-operate-drawer.vue                                              |    8 
 ruoyi-plus-soybean/src/views/md/shift/modules/shift-operate-drawer.vue                                              |    8 
 ruoyi-plus-soybean/src/typings/api/qm.batch.api.d.ts                                                                |   12 
 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/qa/md/domain/bo/MdShiftBo.java                      |    5 
 ruoyi-plus-soybean/src/views/analy/packer/modules/packer-data-operate-drawer.vue                                    |   44 +-
 ruoyi-plus-soybean/src/views/md/shift/modules/shift-search.vue                                                      |    2 
 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/qa/md/service/OracleShiftReader.java                |   21 +
 ruoyi-plus-soybean/src/views/analy/feed-match/modules/feed-match-operate-drawer.vue                                 |   30 
 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/qa/analy/domain/vo/StoreSilkInfoVo.java             |   16 
 ruoyi-plus-soybean/src/views/qm/batch/modules/batch-search.vue                                                      |    2 
 ruoyi-plus-soybean/src/views/analy/store-silk/modules/store-silk-operate-drawer.vue                                 |    8 
 RuoYi-Vue-Plus/开发日志.md                                                                                              |    5 
 ruoyi-plus-soybean/src/views/analy/store-silk/modules/store-silk-detail.vue                                         |  173 +++++++++
 ruoyi-plus-soybean/src/typings/api/analy.store-silk.api.d.ts                                                        |    2 
 18 files changed, 865 insertions(+), 167 deletions(-)

diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/qa/analy/domain/vo/StoreSilkDetailVo.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/qa/analy/domain/vo/StoreSilkDetailVo.java
new file mode 100644
index 0000000..f08f5b8
--- /dev/null
+++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/qa/analy/domain/vo/StoreSilkDetailVo.java
@@ -0,0 +1,55 @@
+package org.dromara.qa.analy.domain.vo;
+
+import lombok.Data;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 鍌ㄤ笣鏌滀骇閲忔槑缁� VO
+ * 鐢ㄤ簬淇濆瓨姣忔缁熻浜ч噺鐨勫瓙椤癸紙鍗锋帴/鍖呰锛�
+ */
+@Data
+public class StoreSilkDetailVo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 鍠備笣鏈哄彿 (濡� fs01)
+     */
+    private String fsNum;
+
+    /**
+     * 鍌ㄤ笣鏌滃彿 (濡� 1)
+     */
+    private String siloNum;
+
+    /**
+     * 绠¢亾鍙� (濡� pipe01)
+     */
+    private String pipeNum;
+
+    /**
+     * 鏈哄彴鍙� (濡� 1)
+     */
+    private String equNo;
+
+    /**
+     * 鐝浠g爜 (1-鏃╃彮 2-涓彮)
+     */
+    private String shiftCode;
+
+    /**
+     * 鐝寮�濮嬫椂闂� (鍖呭惈鏃ユ湡)
+     */
+    private Date shiftStartTime;
+
+    /**
+     * 鐝缁撴潫鏃堕棿 (鍖呭惈鏃ユ湡)
+     */
+    private Date shiftEndTime;
+
+    /**
+     * 璇ョ彮娆″唴璁$畻鍑虹殑浜ч噺
+     */
+    private Double output;
+}
diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/qa/analy/domain/vo/StoreSilkInfoVo.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/qa/analy/domain/vo/StoreSilkInfoVo.java
index 2613db3..e7d9e7e 100644
--- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/qa/analy/domain/vo/StoreSilkInfoVo.java
+++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/qa/analy/domain/vo/StoreSilkInfoVo.java
@@ -1,8 +1,10 @@
 package org.dromara.qa.analy.domain.vo;
 
 import java.util.Date;
+import java.util.List;
 
 import org.dromara.qa.analy.domain.StoreSilkInfo;
+import org.dromara.qa.md.domain.bo.MdShiftBo;
 import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
 import cn.idev.excel.annotation.ExcelProperty;
 import io.github.linpeilie.annotations.AutoMapper;
@@ -92,5 +94,19 @@
     @ExcelProperty(value = "鏌滃瓙鍙�(鏈綅)")
     private String siloid;
 
+    // 鍑烘枡寮�濮嬬粨鏉熸椂闂磋法瓒婄彮娆″垪琛�
+    private List<MdShiftBo> distShiftList;
 
+    private Double rollerOutput;
+    private Double packerOutput;
+
+    /**
+     * 鍗锋帴鏈轰骇閲忔槑缁�
+     */
+    private List<StoreSilkDetailVo> rollerDetailList;
+
+    /**
+     * 鍖呰鏈轰骇閲忔槑缁�
+     */
+    private List<StoreSilkDetailVo> packerDetailList;
 }
diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/qa/analy/service/impl/StoreSilkInfoServiceImpl.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/qa/analy/service/impl/StoreSilkInfoServiceImpl.java
index 5747535..2afb2fd 100644
--- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/qa/analy/service/impl/StoreSilkInfoServiceImpl.java
+++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/qa/analy/service/impl/StoreSilkInfoServiceImpl.java
@@ -1,5 +1,8 @@
 package org.dromara.qa.analy.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.BeanUtils;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -9,6 +12,15 @@
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.dromara.qa.analy.domain.FeedmatchTimeData;
+import org.dromara.qa.analy.domain.PackerTimeData;
+import org.dromara.qa.analy.domain.RollerTimeData;
+import org.dromara.qa.analy.domain.vo.StoreSilkDetailVo;
+import org.dromara.qa.analy.mapper.RollerTimeDataMapper;
+import org.dromara.qa.md.domain.MdShift;
+import org.dromara.qa.md.domain.bo.MdShiftBo;
+import org.dromara.qa.md.mapper.MdShiftMapper;
+import org.dromara.qa.md.service.OracleShiftReader;
 import org.springframework.stereotype.Service;
 import org.dromara.qa.analy.domain.bo.StoreSilkInfoBo;
 import org.dromara.qa.analy.domain.vo.StoreSilkInfoVo;
@@ -17,9 +29,16 @@
 import org.dromara.qa.analy.service.IStoreSilkInfoService;
 import org.dromara.qa.analy.mapper.FeedmatchTimeDataMapper;
 
-import java.util.List;
-import java.util.Map;
-import java.util.Collection;
+import java.lang.reflect.Field;
+import java.sql.Timestamp;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
 
 /**
  * 鍌ㄤ笣鏌滀骇閲廠ervice涓氬姟灞傚鐞�
@@ -34,6 +53,10 @@
 
     private final StoreSilkInfoMapper baseMapper;
     private final FeedmatchTimeDataMapper feedmatchTimeDataMapper;
+    private final RollerTimeDataMapper rollerTimeDataMapper;
+    private final org.dromara.qa.analy.mapper.PackerTimeDataMapper packerTimeDataMapper;
+    private final MdShiftMapper mdShiftMapper;
+    private final OracleShiftReader oracleShiftReader;
 
     /**
      * 鏌ヨ鍌ㄤ笣鏌滀骇閲�
@@ -42,7 +65,7 @@
      * @return 鍌ㄤ笣鏌滀骇閲�
      */
     @Override
-    public StoreSilkInfoVo queryById(Long id){
+    public StoreSilkInfoVo queryById(Long id) {
         return baseMapper.selectVoById(id);
     }
 
@@ -61,19 +84,426 @@
         queryFeedmatchData(result);
         return TableDataInfo.build(result);
     }
- 
+
     private void queryFeedmatchData(Page<StoreSilkInfoVo> page) {
         if (page == null || page.getRecords() == null || page.getRecords().isEmpty()) {
             return;
         }
+        // 鏌ヨ鏁伴噰绯荤粺鐝鏃堕棿锛堢嫭绔嬩娇鐢� oracle 鏁版嵁婧愶級
+        List<MdShift> mdShifts = oracleShiftReader.listAll();
+
+
         List<StoreSilkInfoVo> storeSilkInfoList = page.getRecords();
 
         for (int i = 0; i < storeSilkInfoList.size(); i++) {
-            //
+            //鍌ㄤ笣鏌�
             StoreSilkInfoVo storeSilkInfoVo = storeSilkInfoList.get(i);
+            //鍑烘枡寮�濮嬫椂闂�
+            Date distimebegin = storeSilkInfoVo.getDistimebegin();
+            //鍑烘枡缁撴潫鏃堕棿
+            Date distimeend = storeSilkInfoVo.getDistimeend();
+
+            //鍌ㄤ笣鏌滄煖鍙�
+            String siloid = storeSilkInfoVo.getSiloid();
+            if (StringUtils.isEmpty(siloid)) continue;
+            int lastIndex = siloid.lastIndexOf("_");
+            String containerNum = siloid.substring(lastIndex + 1);
+            if (StringUtils.isEmpty(containerNum)) continue;
+
+            //鏍规嵁鍑烘枡寮�濮嬫椂闂存煡璇㈠杺涓濇満->鍌ㄤ笣鏌�->鏈哄彴瀵瑰簲鍏崇郴(feedmatch_time_data)
+            Timestamp targetTime = new Timestamp(distimebegin.getTime() + 10 * 60 * 1000); // 鏌ヨ鍑烘枡10鍒嗛挓鍚庣殑绗竴鏉¤褰曪紝淇濊瘉鏁版嵁鍑嗙‘鎬�
+            LambdaQueryWrapper<FeedmatchTimeData> lqw = new LambdaQueryWrapper<>();
+            lqw.ge(FeedmatchTimeData::getTime, targetTime)
+                    .le(FeedmatchTimeData::getTime, distimeend) // 涓嶈兘澶т簬鍑烘枡缁撴潫鏃堕棿
+                    .orderByAsc(FeedmatchTimeData::getTime)
+                    .last("LIMIT 1");
+            FeedmatchTimeData feedMatch = feedmatchTimeDataMapper.selectOne(lqw);
+            if (feedMatch == null) {
+                // TODO  娣诲姞鎻愮ず
+                continue;
+            }
+
+            // feedMatch 杞琺ap  TODO 閫嗚浆map闇�楠岃瘉key鏄惁浼氶噸澶�
+            //fsRevMap鏄�嗚浆map     key->鍠備笣鏈哄搴旂殑鍌ㄤ笣鏌滃彿   value-> fs + 搴忓彿
+            Map<String, String> fsRevMap = new HashMap<>();
+            //pipeRevMap鏄�嗚浆map   key->鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�  value-> pipe + 搴忓彿
+            Map<String, String> pipeRevMap = new HashMap<>();
+            Map<String, String> pipeMap = new HashMap<>();
+            Field[] fields = feedMatch.getClass().getDeclaredFields();
+            for (Field field : fields) {
+                field.setAccessible(true);
+                Object value = null;
+                try {
+                    value = field.get(feedMatch);
+                } catch (IllegalAccessException e) {
+                    throw new RuntimeException(e);
+                }
+                if (field.getName().startsWith("fs") && value != null) {
+                    fsRevMap.put(value.toString(), field.getName());
+                } else if (field.getName().startsWith("pipe") && value != null) {
+                    pipeRevMap.put(value.toString(), field.getName());
+                    pipeMap.put(field.getName(),value.toString());
+                }
+            }
+            // 鏍规嵁鍌ㄤ笣鏌滃彿鑾峰彇鍠備笣鏈哄彿
+            String fsNum = fsRevMap.get(containerNum);
+            if (StringUtils.isEmpty(fsNum)) {
+                // TODO   鍠備笣鏈哄彿绌鸿繑鍥炰俊鎭�
+                continue;
+            }
+            if (pipeRevMap.isEmpty()) {
+                // TODO   绠¢亾鍙风┖杩斿洖淇℃伅
+                continue;
+            }
+            // List瀛�->  鍠備笣鏈哄搴旂殑鏈虹粍锛堝 pipe01 pipe02 浠h〃1#銆�2#鍗锋帴鏈虹粍锛�
+            List<String> pipeList = new ArrayList<>();
+            for (Map.Entry<String, String> entry : pipeRevMap.entrySet()) {
+                //fsNum绗笁浣嶆槸鍠備笣鏈哄簭鍙�
+                if (entry.getKey().length() > 1 && entry.getKey().startsWith(fsNum.substring(2, 3))) {
+                    pipeList.add(entry.getValue());
+                }
+            }
+            if (pipeList.isEmpty()) {
+                //TODO 娣诲姞鎻愮ず
+                continue;
+            }
+
+            // 鏍规嵁鍑烘枡寮�濮嬬粨鏉熸椂闂达紝鏌ヨ璇ユ煖鏂欏湪鍝嚑涓彮娆$敓浜�
+            List<MdShiftBo> distShiftList = calcShiftSpans(distimebegin, distimeend, mdShifts);
+            storeSilkInfoVo.setDistShiftList(distShiftList);
+            if (distShiftList.isEmpty()) continue;
+            //鏌ヨ鏃ユ湡鍜岀彮娆″唴鍗锋帴鏈虹粍鐨勪骇閲�
+            ZoneId zone = ZoneId.systemDefault();
+            // 鍗峰寘浜ч噺缁熻
+            Double rollerOutput = 0.0;
+            Double packerOutput = 0.0;
+            // 鏄庣粏鍒楄〃
+            List<StoreSilkDetailVo> rollerDetailList = new ArrayList<>();
+            List<StoreSilkDetailVo> packerDetailList = new ArrayList<>();
+
+            for (int s = 0; s < distShiftList.size(); s++) {
+                MdShiftBo shiftBo = distShiftList.get(s);
+                if (shiftBo.getDay() == null || StringUtils.isEmpty(shiftBo.getCode())) {
+                    continue;
+                }
+                String shift = shiftBo.getCode();
+
+                // 瑙f瀽鐝鏃堕棿
+                // 1. 鑾峰彇鐝閰嶇疆鐨勫紑濮嬪拰缁撴潫鏃堕棿瀛楃涓� (鏍煎紡濡� "07:30:00")
+                String stimStr = shiftBo.getStim();
+                String etimStr = shiftBo.getEtim();
+                if (StringUtils.isEmpty(stimStr) || StringUtils.isEmpty(etimStr)) {
+                    continue;
+                }
+                // 2. 琛ュ叏绉掓暟锛堝鏋滈厤缃粎涓� HH:mm锛�
+                if (stimStr.length() == 5) stimStr += ":00";
+                if (etimStr.length() == 5) etimStr += ":00";
+
+                // 3. 缁撳悎鏃ユ湡瑙f瀽涓� LocalDateTime
+                // 娉ㄦ剰锛歴hiftBo.getDay() 鏄鐝鐨勫綊灞炴棩鏈�
+                String dateStr = shiftBo.getDay().toInstant().atZone(zone).toLocalDate().toString();
+                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+                LocalDateTime shiftStart = LocalDateTime.parse(dateStr + " " + stimStr, formatter);
+                LocalDateTime shiftEnd = LocalDateTime.parse(dateStr + " " + etimStr, formatter);
+
+                // 4. 澶勭悊璺ㄥぉ鐝锛氬鏋� 缁撴潫鏃堕棿 <= 寮�濮嬫椂闂达紝璇存槑璺ㄥぉ锛岀粨鏉熸椂闂撮渶 +1 澶�
+                if (!shiftEnd.isAfter(shiftStart)) {
+                    shiftEnd = shiftEnd.plusDays(1);
+                }
+
+                // 杞崲 Date 瀵硅薄鐢ㄤ簬姣旇緝锛堝吋瀹圭幇鏈夐�昏緫锛�
+                Date stimDate = Date.from(shiftStart.atZone(zone).toInstant());
+                Date etimDate = Date.from(shiftEnd.atZone(zone).toInstant());
+
+                // 璁$畻鐝缁撴潫鍓�10鍒嗛挓鐨勬椂闂寸偣
+                String shiftEndStr = shiftEnd.format(formatter);
+                String tenMinBeforeShiftEnd = shiftEnd.minusMinutes(10).format(formatter);
+
+                // 鏍规嵁鍗锋帴鏈虹粍鍜岀彮娆¤幏鍙栦骇閲忥紙pipeList = 澶氬皯涓満缁勶級
+                for (int j = 0; j < pipeList.size(); j++) {
+                    String pipe = pipeList.get(j);
+                    // 鎻愬彇鏈虹粍鍙�
+                    String equNo = pipe.replaceAll("\\D+", "");
+                    //绠¢亾鍙�
+                    String channel = pipeMap.get("pipe" + equNo);
+                    if (channel != null && channel.length() > 0) {
+                        channel = channel.substring(channel.length() - 1);
+                    }else {
+                        channel = "";
+                    }
+
+                    //娉ㄦ剰4鍙风閬撲互鍚庡搴旂殑鏈虹粍闇�瑕�+1锛屾満缁�4鍙风┖缂鸿烦鍒�5鍙�
+                    try {
+                        int equ = Integer.parseInt(equNo);
+                        equNo = String.format("%02d", equ >= 4 ? equ + 1 : equ);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        // TODO 娣诲姞鎻愮ず
+                        continue;
+                    }
+
+
+                    // 鎷兼帴鍗锋帴鏈虹殑key锛屼腑闂� "1" 浠h〃鍗锋帴鏈猴紝鏍煎紡锛氱彮娆� + "1" + 鏈虹粍鍙�
+                    String key = shift + "1" + equNo;
+                    // 鎷兼帴鍖呰鏈虹殑key锛屼腑闂� "2" 浠h〃鍖呰鏈猴紝鏍煎紡锛氱彮娆� + "2" + 鏈虹粍鍙�
+                    String packerKey = shift + "2" + equNo;
+
+                    // ================= 鍗锋帴鏈轰骇閲忕粺璁� =================
+                    Double currentRollerOutput = 0.0;
+                    // 1. 鏌ヨ鐝缁撴潫鏃剁殑浜ч噺蹇収
+                    LambdaQueryWrapper<RollerTimeData> rlqw = new LambdaQueryWrapper<>();
+                    rlqw.le(RollerTimeData::getTime, shiftEndStr)
+                            .eq(RollerTimeData::getKey, key)
+                            .ge(RollerTimeData::getTime, tenMinBeforeShiftEnd)
+                            .orderByDesc(RollerTimeData::getTime)
+                            .isNotNull(RollerTimeData::getQty)
+                            .gt(RollerTimeData::getQty, 0)
+                            .last("LIMIT 1");
+
+                    RollerTimeData rData = rollerTimeDataMapper.selectOne(rlqw);
+                    if (rData != null) {
+                        // 鍒濆浜ч噺璁句负鐝缁撴潫鏃剁殑绱鍊�
+                        currentRollerOutput += rData.getQty();
+
+                        // 2. 澶勭悊鈥滄墸澶粹�濓細鍑烘枡寮�濮嬫椂闂� > 鐝寮�濮嬫椂闂�
+                        if (distimebegin.after(stimDate)) {
+                            LocalDateTime distBeginTime = LocalDateTime.ofInstant(distimebegin.toInstant(), zone);
+                            String distBeginStr = distBeginTime.format(formatter);
+                            String tenMinBeforeDistBegin = distBeginTime.minusMinutes(10).format(formatter);
+
+                            LambdaQueryWrapper<RollerTimeData> beginRlqw = new LambdaQueryWrapper<>();
+                            beginRlqw.le(RollerTimeData::getTime, distBeginStr)
+                                    .eq(RollerTimeData::getKey, key)
+                                    .ge(RollerTimeData::getTime, tenMinBeforeDistBegin)
+                                    .orderByDesc(RollerTimeData::getTime)
+                                    .isNotNull(RollerTimeData::getQty)
+                                    .gt(RollerTimeData::getQty, 0)
+                                    .last("LIMIT 1");
+
+                            RollerTimeData rBeginData = rollerTimeDataMapper.selectOne(beginRlqw);
+                            if (rBeginData != null) {
+                                currentRollerOutput -= rBeginData.getQty();
+                            }
+                        }
+
+                        // 3. 澶勭悊鈥滄墸灏锯�濓細鍑烘枡缁撴潫鏃堕棿 < 鐝缁撴潫鏃堕棿
+                        if (etimDate.after(distimeend)) {
+                            LocalDateTime distEndTime = LocalDateTime.ofInstant(distimeend.toInstant(), zone);
+                            String distEndStr = distEndTime.format(formatter);
+                            String tenMinBeforeDistEnd = distEndTime.minusMinutes(10).format(formatter);
+
+                            LambdaQueryWrapper<RollerTimeData> endRlqw = new LambdaQueryWrapper<>();
+                            endRlqw.le(RollerTimeData::getTime, distEndStr)
+                                    .eq(RollerTimeData::getKey, key)
+                                    .ge(RollerTimeData::getTime, tenMinBeforeDistEnd)
+                                    .orderByDesc(RollerTimeData::getTime)
+                                    .isNotNull(RollerTimeData::getQty)
+                                    .gt(RollerTimeData::getQty, 0)
+                                    .last("LIMIT 1");
+
+                            RollerTimeData rEndData = rollerTimeDataMapper.selectOne(endRlqw);
+                            if (rEndData != null) {
+                                double qtyDelta = rData.getQty() - rEndData.getQty();
+                                if (qtyDelta > 0) {
+                                    currentRollerOutput -= qtyDelta;
+                                }
+                            }
+                        }
+                    }
+                    // 绱鎬讳骇閲�
+                    rollerOutput += currentRollerOutput;
+                    // 璁板綍鍗锋帴鏈烘槑缁�
+                    if (currentRollerOutput > 0) {
+                        StoreSilkDetailVo detail = new StoreSilkDetailVo();
+                        detail.setFsNum(fsNum.substring(2, 3));
+                        detail.setSiloNum(containerNum);
+                        detail.setPipeNum(channel);
+                        detail.setEquNo(equNo);
+                        detail.setShiftCode(shift);
+                        detail.setShiftStartTime(stimDate);
+                        detail.setShiftEndTime(etimDate);
+                        detail.setOutput(currentRollerOutput);
+                        rollerDetailList.add(detail);
+                    }
+
+                    // ================= 鍖呰鏈轰骇閲忕粺璁� =================
+                    Double currentPackerOutput = 0.0;
+                    // 1. 鏌ヨ鐝缁撴潫鏃剁殑浜ч噺蹇収
+                    LambdaQueryWrapper<PackerTimeData> plqw = new LambdaQueryWrapper<>();
+                    plqw.le(PackerTimeData::getTime, shiftEndStr)
+                            .eq(PackerTimeData::getKey, packerKey)
+                            .ge(PackerTimeData::getTime, tenMinBeforeShiftEnd)
+                            .orderByDesc(PackerTimeData::getTime)
+                            .isNotNull(PackerTimeData::getQty)
+                            .gt(PackerTimeData::getQty, 0)
+                            .last("LIMIT 1");
+
+                    PackerTimeData pData = packerTimeDataMapper.selectOne(plqw);
+                    if (pData != null) {
+                        // 鍒濆浜ч噺璁句负鐝缁撴潫鏃剁殑绱鍊�
+                        currentPackerOutput += pData.getQty();
+
+                        // 2. 澶勭悊鈥滄墸澶粹��
+                        if (distimebegin.after(stimDate)) {
+                            LocalDateTime distBeginTime = LocalDateTime.ofInstant(distimebegin.toInstant(), zone);
+                            String distBeginStr = distBeginTime.format(formatter);
+                            String tenMinBeforeDistBegin = distBeginTime.minusMinutes(10).format(formatter);
+
+                            LambdaQueryWrapper<PackerTimeData> beginPlqw = new LambdaQueryWrapper<>();
+                            beginPlqw.le(PackerTimeData::getTime, distBeginStr)
+                                    .eq(PackerTimeData::getKey, packerKey)
+                                    .ge(PackerTimeData::getTime, tenMinBeforeDistBegin)
+                                    .orderByDesc(PackerTimeData::getTime)
+                                    .isNotNull(PackerTimeData::getQty)
+                                    .gt(PackerTimeData::getQty, 0)
+                                    .last("LIMIT 1");
+
+                            PackerTimeData pBeginData = packerTimeDataMapper.selectOne(beginPlqw);
+                            if (pBeginData != null) {
+                                currentPackerOutput -= pBeginData.getQty();
+                            }
+                        }
+
+                        // 3. 澶勭悊鈥滄墸灏锯��
+                        if (etimDate.after(distimeend)) {
+                            LocalDateTime distEndTime = LocalDateTime.ofInstant(distimeend.toInstant(), zone);
+                            String distEndStr = distEndTime.format(formatter);
+                            String tenMinBeforeDistEnd = distEndTime.minusMinutes(10).format(formatter);
+
+                            LambdaQueryWrapper<PackerTimeData> endPlqw = new LambdaQueryWrapper<>();
+                            endPlqw.le(PackerTimeData::getTime, distEndStr)
+                                    .eq(PackerTimeData::getKey, packerKey)
+                                    .ge(PackerTimeData::getTime, tenMinBeforeDistEnd)
+                                    .orderByDesc(PackerTimeData::getTime)
+                                    .isNotNull(PackerTimeData::getQty)
+                                    .gt(PackerTimeData::getQty, 0)
+                                    .last("LIMIT 1");
+
+                            PackerTimeData pEndData = packerTimeDataMapper.selectOne(endPlqw);
+                            if (pEndData != null) {
+                                double qtyDelta = pData.getQty() - pEndData.getQty();
+                                if (qtyDelta > 0) {
+                                    currentPackerOutput -= qtyDelta;
+                                }
+                            }
+                        }
+                    }
+                    // 绱鎬讳骇閲�
+                    packerOutput += currentPackerOutput;
+                    // 璁板綍鍖呰鏈烘槑缁�
+                    if (currentPackerOutput > 0) {
+                        StoreSilkDetailVo detail = new StoreSilkDetailVo();
+                        detail.setFsNum(fsNum.substring(2, 3));
+                        detail.setSiloNum(containerNum);
+                        detail.setPipeNum(channel);
+                        detail.setEquNo(equNo);
+                        detail.setShiftCode(shift);
+                        detail.setShiftStartTime(stimDate);
+                        detail.setShiftEndTime(etimDate);
+                        detail.setOutput(currentPackerOutput);
+                        packerDetailList.add(detail);
+                    }
+                }
+            }
+            storeSilkInfoVo.setRollerOutput(rollerOutput);
+            storeSilkInfoVo.setPackerOutput(packerOutput);
+            storeSilkInfoVo.setRollerDetailList(rollerDetailList);
+            storeSilkInfoVo.setPackerDetailList(packerDetailList);
 
         }
 
+    }
+
+    /**
+     * 璁$畻鍑烘枡鍖洪棿 [begin, end) 娑夊強鍒扮殑鐝锛堜粎 code=1銆�2 鐨勬棭/涓彮锛�
+     * 杩斿洖 Map<yyyy-MM-dd, code>锛岃〃绀鸿鏃ユ湡涓婄殑璇ョ彮娆′笌鍑烘枡鍖洪棿瀛樺湪鏃堕棿閲嶅彔
+     * 鑻ュ悓涓�鏃ユ湡鏃�/涓彮鍧囨湁閲嶅彔锛寁alue 浣跨敤閫楀彿鎷兼帴锛屽 "1,2"
+     * <p>
+     * 绠�鍖栨�濊矾锛�
+     * 1. 灏� begin/end 杞负 LocalDateTime锛屽彇鍑鸿鐩栫殑鎵�鏈夎嚜鐒舵棩
+     * 2. 瀵规瘡涓�澶╂寜鐝鐨� stim/etim 鐢熸垚鐝鏃堕棿绐� [shiftStart, shiftEnd)
+     * - 鑻� etim <= stim锛岃涓鸿法澶╃彮娆★細shiftEnd = 褰撳ぉ鏃ユ湡 + 1 澶� + etim
+     * 3. 鐢ㄧ畝鍗曠殑鍖洪棿閲嶅彔鍒ゆ柇锛歴hiftEnd > begin && shiftStart < end
+     */
+    private List<MdShiftBo> calcShiftSpans(Date begin, Date end, List<MdShift> mdShifts) {
+        List<MdShiftBo> result = new ArrayList<>();
+
+        // 鍩虹鏍¢獙
+        if (begin == null || end == null || !end.after(begin) || mdShifts == null || mdShifts.isEmpty()) {
+            return result;
+        }
+
+        // 浠呬繚鐣欐棭鐝�(code=1)涓庝腑鐝�(code=2)
+        // 鍚屾椂蹇界暐 stim/etim 涓虹┖鐨勭彮娆�
+        ZoneId zone = ZoneId.systemDefault();
+        LocalDateTime intervalStart = LocalDateTime.ofInstant(begin.toInstant(), zone);
+        LocalDateTime intervalEnd = LocalDateTime.ofInstant(end.toInstant(), zone);
+        LocalDate day = intervalStart.toLocalDate();
+        LocalDate lastDay = intervalEnd.toLocalDate();
+
+        // 瑙f瀽鏃堕棿鏍煎紡锛氭敮鎸� "H:mm" 鎴� "H:mm:ss"
+        DateTimeFormatter tf = DateTimeFormatter.ofPattern("H:mm[:ss]");
+        Set<String> seen = new HashSet<>();
+
+        // 鎸夊ぉ閬嶅巻瑕嗙洊鑼冨洿
+        while (!day.isAfter(lastDay)) {
+            for (MdShift s : mdShifts) {
+                // 浠呮棭/涓彮
+                String code = s.getCode();
+                if (!"1".equals(code) && !"2".equals(code)) {
+                    continue;
+                }
+                String st = s.getStim();
+                String et = s.getEtim();
+                if (st == null || et == null) {
+                    continue;
+                }
+                // 瑙f瀽鐝璧锋鏃堕棿
+                LocalTime stt;
+                LocalTime ett;
+                try {
+                    stt = LocalTime.parse(st.trim(), tf);
+                    ett = LocalTime.parse(et.trim(), tf);
+                } catch (Exception ignore) {
+                    // 鏃堕棿鏍煎紡寮傚父鍒欒烦杩囪鐝
+                    continue;
+                }
+                // 鐢熸垚褰撳ぉ璇ョ彮娆$殑鏃堕棿绐�
+                LocalDateTime shiftStart = LocalDateTime.of(day, stt);
+                LocalDateTime shiftEnd = ett.isAfter(stt) || ett.equals(stt)
+                        ? LocalDateTime.of(day, ett)
+                        : LocalDateTime.of(day.plusDays(1), ett); // 璺ㄥぉ澶勭悊
+
+                // 鍒ゆ柇鍖洪棿鏄惁閲嶅彔锛� [shiftStart, shiftEnd) 涓� [intervalStart, intervalEnd)
+                if (shiftEnd.isAfter(intervalStart) && shiftStart.isBefore(intervalEnd)) {
+                    Date shiftDay = Date.from(day.atStartOfDay(zone).toInstant());
+                    String dedupeKey = shiftDay.getTime() + "-" + code;
+                    if (seen.add(dedupeKey)) {
+                        MdShiftBo bo = new MdShiftBo();
+                        bo.setId(s.getId());
+                        bo.setWsId(s.getWsId());
+                        bo.setCode(s.getCode());
+                        bo.setName(s.getName());
+                        bo.setStim(s.getStim());
+                        bo.setEtim(s.getEtim());
+                        bo.setSeq(s.getSeq());
+                        bo.setEnable(s.getEnable());
+                        bo.setDel(s.getDel());
+                        bo.setCreateUserName(s.getCreateUserName());
+                        bo.setCreateUserTime(s.getCreateUserTime());
+                        bo.setUpdateUserName(s.getUpdateUserName());
+                        bo.setUpdateUserTime(s.getUpdateUserTime());
+                        bo.setDay(shiftDay);
+                        result.add(bo);
+                    }
+                }
+            }
+            day = day.plusDays(1);
+        }
+        result.sort(Comparator
+                .comparing(MdShiftBo::getDay, Comparator.nullsLast(Date::compareTo))
+                .thenComparing(MdShiftBo::getCode, Comparator.nullsLast(String::compareTo)));
+        return result;
     }
 
     /**
@@ -98,6 +528,8 @@
         lqw.eq(bo.getDistimebegin() != null, StoreSilkInfo::getDistimebegin, bo.getDistimebegin());
         lqw.eq(bo.getDistimeend() != null, StoreSilkInfo::getDistimeend, bo.getDistimeend());
         lqw.eq(StringUtils.isNotBlank(bo.getSiloid()), StoreSilkInfo::getSiloid, bo.getSiloid());
+        lqw.between(params.get("beginTime") != null && params.get("endTime") != null,
+                StoreSilkInfo::getDistimeend, params.get("beginTime"), params.get("endTime"));
         return lqw;
     }
 
@@ -134,7 +566,7 @@
     /**
      * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
      */
-    private void validEntityBeforeSave(StoreSilkInfo entity){
+    private void validEntityBeforeSave(StoreSilkInfo entity) {
         //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
     }
 
@@ -147,7 +579,7 @@
      */
     @Override
     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
-        if(isValid){
+        if (isValid) {
             //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
         }
         return baseMapper.deleteByIds(ids) > 0;
diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/qa/md/domain/bo/MdShiftBo.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/qa/md/domain/bo/MdShiftBo.java
index 8f1b2e2..7a50c48 100644
--- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/qa/md/domain/bo/MdShiftBo.java
+++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/qa/md/domain/bo/MdShiftBo.java
@@ -86,5 +86,10 @@
      */
     private Date updateUserTime;
 
+    /**
+     * 鐝鏃ユ湡
+     */
+    private Date day;
+
 
 }
diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/qa/md/service/OracleShiftReader.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/qa/md/service/OracleShiftReader.java
new file mode 100644
index 0000000..a0d0b39
--- /dev/null
+++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/qa/md/service/OracleShiftReader.java
@@ -0,0 +1,21 @@
+package org.dromara.qa.md.service;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import lombok.RequiredArgsConstructor;
+import org.dromara.qa.md.domain.MdShift;
+import org.dromara.qa.md.mapper.MdShiftMapper;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@DS("oracle")
+@Service
+@RequiredArgsConstructor
+public class OracleShiftReader {
+
+    private final MdShiftMapper mdShiftMapper;
+
+    public List<MdShift> listAll() {
+        return mdShiftMapper.selectList();
+    }
+}
diff --git "a/RuoYi-Vue-Plus/\345\274\200\345\217\221\346\227\245\345\277\227.md" "b/RuoYi-Vue-Plus/\345\274\200\345\217\221\346\227\245\345\277\227.md"
index 002cc10..2123e4c 100644
--- "a/RuoYi-Vue-Plus/\345\274\200\345\217\221\346\227\245\345\277\227.md"
+++ "b/RuoYi-Vue-Plus/\345\274\200\345\217\221\346\227\245\345\277\227.md"
@@ -12,5 +12,8 @@
 
 #### 20260302
 - 寰呭姙浜嬮」
-- [ ] 鐩墠鍌ㄤ笣鏌滀俊鎭俊鎭病鏈変粠瑙嗗浘涓幏鍙栵紝浣跨敤oracle_store_silk琛ㄦā鎷�
+- [ ] 鐩墠鍌ㄤ笣鏌滀俊鎭俊鎭病鏈変粠瑙嗗浘涓幏鍙栵紝浣跨敤oracle_store_silk琛ㄦā鎷�->浣跨敤鍒朵笣杞﹂棿鐪熷疄瑙嗗浘鏁版嵁婧�
+- [ ] 鍠備笣鏈哄搴斿叧绯伙紝fs寮�澶村偍瀛樼殑鐪熷疄鍊兼槸浠�涔堬紝鐩墠娴嬭瘯鏁版嵁浣跨敤鐨勬槸 fs11 -> 鍌ㄤ笣鏌滃彿
+- [ ] 纭1鍙板杺涓濇満瀵瑰簲鐨�2鍙板偍涓濇煖鏄緷娆′緵涓濊繕鏄彲浠ュ苟琛屼緵涓�(<span style="color: red;">***骞惰渚涗笣鏃犳硶鍑嗙‘璁$畻浜ч噺***</span>)
+- [ ] 纭 鍠備笣鏈哄搴斿叧绯讳腑(key->pipe01	value->1#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�)value涓嶄細閲嶅  (<span style="color: red;">***閲嶅灏嗗鑷磋绠楅�昏緫鍑虹幇閿欒***</span>)
 
diff --git a/ruoyi-plus-soybean/src/typings/api/analy.store-silk.api.d.ts b/ruoyi-plus-soybean/src/typings/api/analy.store-silk.api.d.ts
index e448905..8a0154f 100644
--- a/ruoyi-plus-soybean/src/typings/api/analy.store-silk.api.d.ts
+++ b/ruoyi-plus-soybean/src/typings/api/analy.store-silk.api.d.ts
@@ -33,7 +33,7 @@
       /** 鍌ㄤ笣鏌滃嚭鏂欑粨鏉熸椂闂� */
       distimeend: string;
       /** 鏌滃瓙鍙�(鏈綅) */
-      siloid: CommonType.IdType;
+      siloid: string;
     }>;
 
     /** store silk search params */
diff --git a/ruoyi-plus-soybean/src/typings/api/qm.batch.api.d.ts b/ruoyi-plus-soybean/src/typings/api/qm.batch.api.d.ts
index 30b532f..bdb8333 100644
--- a/ruoyi-plus-soybean/src/typings/api/qm.batch.api.d.ts
+++ b/ruoyi-plus-soybean/src/typings/api/qm.batch.api.d.ts
@@ -112,7 +112,17 @@
     type BatchSearchParams = CommonType.RecordNullable<
       Pick<
         Api.Qm.Batch,
-        'batchCode' | 'typ' | 'eqpCode' | 'matCode' | 'batchDate' | 'flag' | 'deleted' | 'category' | 'state'
+        | 'batchCode'
+        | 'typ'
+        | 'eqpCode'
+        | 'matCode'
+        | 'batchDate'
+        | 'flag'
+        | 'toMesDate'
+        | 'fromMesDate'
+        | 'deleted'
+        | 'category'
+        | 'state'
       > &
         Api.Common.CommonSearchParams
     >;
diff --git a/ruoyi-plus-soybean/src/views/analy/feed-match/modules/feed-match-operate-drawer.vue b/ruoyi-plus-soybean/src/views/analy/feed-match/modules/feed-match-operate-drawer.vue
index 8f41345..e8bd128 100644
--- a/ruoyi-plus-soybean/src/views/analy/feed-match/modules/feed-match-operate-drawer.vue
+++ b/ruoyi-plus-soybean/src/views/analy/feed-match/modules/feed-match-operate-drawer.vue
@@ -250,49 +250,49 @@
           <NInput v-model:value="model.fs42" :rows="3" type="textarea" placeholder="璇疯緭鍏�4#鍠備笣鏈哄搴旂殑绗簩涓偍涓濇煖" />
         </NFormItem>
         <NFormItem label="1#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" path="pipe01">
-          <NInput v-model:value="model.pipe01" placeholder="璇疯緭鍏�1#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" />
+          <NInputNumber v-model:value="model.pipe01" placeholder="璇疯緭鍏�1#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" class="w-full" />
         </NFormItem>
         <NFormItem label="2#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" path="pipe02">
-          <NInput v-model:value="model.pipe02" placeholder="璇疯緭鍏�2#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" />
+          <NInputNumber v-model:value="model.pipe02" placeholder="璇疯緭鍏�2#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" class="w-full" />
         </NFormItem>
         <NFormItem label="3#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" path="pipe03">
-          <NInput v-model:value="model.pipe03" placeholder="璇疯緭鍏�3#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" />
+          <NInputNumber v-model:value="model.pipe03" placeholder="璇疯緭鍏�3#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" class="w-full" />
         </NFormItem>
         <NFormItem label="4#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" path="pipe04">
-          <NInput v-model:value="model.pipe04" placeholder="璇疯緭鍏�4#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" />
+          <NInputNumber v-model:value="model.pipe04" placeholder="璇疯緭鍏�4#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" class="w-full" />
         </NFormItem>
         <NFormItem label="5#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" path="pipe05">
-          <NInput v-model:value="model.pipe05" placeholder="璇疯緭鍏�5#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" />
+          <NInputNumber v-model:value="model.pipe05" placeholder="璇疯緭鍏�5#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" class="w-full" />
         </NFormItem>
         <NFormItem label="6#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" path="pipe06">
-          <NInput v-model:value="model.pipe06" placeholder="璇疯緭鍏�6#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" />
+          <NInputNumber v-model:value="model.pipe06" placeholder="璇疯緭鍏�6#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" class="w-full" />
         </NFormItem>
         <NFormItem label="7#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" path="pipe07">
-          <NInput v-model:value="model.pipe07" placeholder="璇疯緭鍏�7#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" />
+          <NInputNumber v-model:value="model.pipe07" placeholder="璇疯緭鍏�7#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" class="w-full" />
         </NFormItem>
         <NFormItem label="8#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" path="pipe08">
-          <NInput v-model:value="model.pipe08" placeholder="璇疯緭鍏�8#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" />
+          <NInputNumber v-model:value="model.pipe08" placeholder="璇疯緭鍏�8#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" class="w-full" />
         </NFormItem>
         <NFormItem label="9#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" path="pipe09">
-          <NInput v-model:value="model.pipe09" placeholder="璇疯緭鍏�9#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" />
+          <NInputNumber v-model:value="model.pipe09" placeholder="璇疯緭鍏�9#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" class="w-full" />
         </NFormItem>
         <NFormItem label="10#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" path="pipe10">
-          <NInput v-model:value="model.pipe10" placeholder="璇疯緭鍏�10#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" />
+          <NInputNumber v-model:value="model.pipe10" placeholder="璇疯緭鍏�10#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" class="w-full" />
         </NFormItem>
         <NFormItem label="11#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" path="pipe11">
-          <NInput v-model:value="model.pipe11" placeholder="璇疯緭鍏�11#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" />
+          <NInputNumber v-model:value="model.pipe11" placeholder="璇疯緭鍏�11#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" class="w-full" />
         </NFormItem>
         <NFormItem label="12#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" path="pipe12">
-          <NInput v-model:value="model.pipe12" placeholder="璇疯緭鍏�12#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" />
+          <NInputNumber v-model:value="model.pipe12" placeholder="璇疯緭鍏�12#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�" class="w-full" />
         </NFormItem>
         <NFormItem label="鍠備笣鏈虹姸鎬� 1-杩炴帴 0-鏂紑" path="wsjState">
-          <NInput v-model:value="model.wsjState" placeholder="璇疯緭鍏ュ杺涓濇満鐘舵�� 1-杩炴帴 0-鏂紑" />
+          <NInputNumber v-model:value="model.wsjState" placeholder="璇疯緭鍏ュ杺涓濇満鐘舵�� 1-杩炴帴 0-鏂紑" class="w-full" />
         </NFormItem>
         <NFormItem label="鐝" path="shift">
-          <NInput v-model:value="model.shift" placeholder="璇疯緭鍏ョ彮娆�" />
+          <NInputNumber v-model:value="model.shift" placeholder="璇疯緭鍏ョ彮娆�" class="w-full" />
         </NFormItem>
         <NFormItem label="鏈哄彴" path="equNo">
-          <NInput v-model:value="model.equNo" placeholder="璇疯緭鍏ユ満鍙�" />
+          <NInputNumber v-model:value="model.equNo" placeholder="璇疯緭鍏ユ満鍙�" class="w-full" />
         </NFormItem>
         <NFormItem label="澶囨敞" path="remark">
           <NInput v-model:value="model.remark" placeholder="璇疯緭鍏ュ娉�" />
diff --git a/ruoyi-plus-soybean/src/views/analy/hoister/modules/hoister-data-operate-drawer.vue b/ruoyi-plus-soybean/src/views/analy/hoister/modules/hoister-data-operate-drawer.vue
index 594cdd9..75d5ed2 100755
--- a/ruoyi-plus-soybean/src/views/analy/hoister/modules/hoister-data-operate-drawer.vue
+++ b/ruoyi-plus-soybean/src/views/analy/hoister/modules/hoister-data-operate-drawer.vue
@@ -251,7 +251,6 @@
   if (visible.value) {
     handleUpdateModelWhenEdit();
     restoreValidation();
-    getTreeList();
   }
 });
 </script>
@@ -272,112 +271,112 @@
           <NInput v-model:value="model.key" :rows="3" type="textarea" placeholder="璇疯緭鍏ey" />
         </NFormItem>
         <NFormItem label="缃戠粶鐘舵��  0寮傚父锛�1姝e父" path="online">
-          <NInput v-model:value="model.online" placeholder="璇疯緭鍏ョ綉缁滅姸鎬�  0寮傚父锛�1姝e父" />
+          <NInputNumber v-model:value="model.online" placeholder="璇疯緭鍏ョ綉缁滅姸鎬�  0寮傚父锛�1姝e父" class="w-full" />
         </NFormItem>
         <NFormItem label="浜ч噺" path="qty">
-          <NInput v-model:value="model.qty" placeholder="璇疯緭鍏ヤ骇閲�" />
+          <NInputNumber v-model:value="model.qty" placeholder="璇疯緭鍏ヤ骇閲�" class="w-full" />
         </NFormItem>
         <NFormItem label="1#鎻愬崌鏈虹姸鎬�" path="tState1">
-          <NInput v-model:value="model.tState1" placeholder="璇疯緭鍏�1#鎻愬崌鏈虹姸鎬�" />
+          <NInputNumber v-model:value="model.tState1" placeholder="璇疯緭鍏�1#鎻愬崌鏈虹姸鎬�" class="w-full" />
         </NFormItem>
         <NFormItem label="2#鎻愬崌鏈虹姸鎬�" path="tState2">
-          <NInput v-model:value="model.tState2" placeholder="璇疯緭鍏�2#鎻愬崌鏈虹姸鎬�" />
+          <NInputNumber v-model:value="model.tState2" placeholder="璇疯緭鍏�2#鎻愬崌鏈虹姸鎬�" class="w-full" />
         </NFormItem>
         <NFormItem label="3#鎻愬崌鏈虹姸鎬�" path="tState3">
-          <NInput v-model:value="model.tState3" placeholder="璇疯緭鍏�3#鎻愬崌鏈虹姸鎬�" />
+          <NInputNumber v-model:value="model.tState3" placeholder="璇疯緭鍏�3#鎻愬崌鏈虹姸鎬�" class="w-full" />
         </NFormItem>
         <NFormItem label="4#鎻愬崌鏈虹姸鎬�" path="tState4">
-          <NInput v-model:value="model.tState4" placeholder="璇疯緭鍏�4#鎻愬崌鏈虹姸鎬�" />
+          <NInputNumber v-model:value="model.tState4" placeholder="璇疯緭鍏�4#鎻愬崌鏈虹姸鎬�" class="w-full" />
         </NFormItem>
         <NFormItem label="5#鎻愬崌鏈虹姸鎬�" path="tState5">
-          <NInput v-model:value="model.tState5" placeholder="璇疯緭鍏�5#鎻愬崌鏈虹姸鎬�" />
+          <NInputNumber v-model:value="model.tState5" placeholder="璇疯緭鍏�5#鎻愬崌鏈虹姸鎬�" class="w-full" />
         </NFormItem>
         <NFormItem label="6#鎻愬崌鏈虹姸鎬�" path="tState6">
-          <NInput v-model:value="model.tState6" placeholder="璇疯緭鍏�6#鎻愬崌鏈虹姸鎬�" />
+          <NInputNumber v-model:value="model.tState6" placeholder="璇疯緭鍏�6#鎻愬崌鏈虹姸鎬�" class="w-full" />
         </NFormItem>
         <NFormItem label="7#鎻愬崌鏈虹姸鎬�" path="tState7">
-          <NInput v-model:value="model.tState7" placeholder="璇疯緭鍏�7#鎻愬崌鏈虹姸鎬�" />
+          <NInputNumber v-model:value="model.tState7" placeholder="璇疯緭鍏�7#鎻愬崌鏈虹姸鎬�" class="w-full" />
         </NFormItem>
         <NFormItem label="8#鎻愬崌鏈虹姸鎬�" path="tState8">
-          <NInput v-model:value="model.tState8" placeholder="璇疯緭鍏�8#鎻愬崌鏈虹姸鎬�" />
+          <NInputNumber v-model:value="model.tState8" placeholder="璇疯緭鍏�8#鎻愬崌鏈虹姸鎬�" class="w-full" />
         </NFormItem>
         <NFormItem label="9#鎻愬崌鏈虹姸鎬�" path="tState9">
-          <NInput v-model:value="model.tState9" placeholder="璇疯緭鍏�9#鎻愬崌鏈虹姸鎬�" />
+          <NInputNumber v-model:value="model.tState9" placeholder="璇疯緭鍏�9#鎻愬崌鏈虹姸鎬�" class="w-full" />
         </NFormItem>
         <NFormItem label="10#鎻愬崌鏈虹姸鎬�" path="tState10">
-          <NInput v-model:value="model.tState10" placeholder="璇疯緭鍏�10#鎻愬崌鏈虹姸鎬�" />
+          <NInputNumber v-model:value="model.tState10" placeholder="璇疯緭鍏�10#鎻愬崌鏈虹姸鎬�" class="w-full" />
         </NFormItem>
         <NFormItem label="11#鎻愬崌鏈虹姸鎬�" path="tState11">
-          <NInput v-model:value="model.tState11" placeholder="璇疯緭鍏�11#鎻愬崌鏈虹姸鎬�" />
+          <NInputNumber v-model:value="model.tState11" placeholder="璇疯緭鍏�11#鎻愬崌鏈虹姸鎬�" class="w-full" />
         </NFormItem>
         <NFormItem label="12#鎻愬崌鏈虹姸鎬�" path="tState12">
-          <NInput v-model:value="model.tState12" placeholder="璇疯緭鍏�12#鎻愬崌鏈虹姸鎬�" />
+          <NInputNumber v-model:value="model.tState12" placeholder="璇疯緭鍏�12#鎻愬崌鏈虹姸鎬�" class="w-full" />
         </NFormItem>
         <NFormItem label="1#鎺掑寘鏈虹姸鎬�" path="pState1">
-          <NInput v-model:value="model.pState1" placeholder="璇疯緭鍏�1#鎺掑寘鏈虹姸鎬�" />
+          <NInputNumber v-model:value="model.pState1" placeholder="璇疯緭鍏�1#鎺掑寘鏈虹姸鎬�" class="w-full" />
         </NFormItem>
         <NFormItem label="2#鎺掑寘鏈虹姸鎬�" path="pState2">
-          <NInput v-model:value="model.pState2" placeholder="璇疯緭鍏�2#鎺掑寘鏈虹姸鎬�" />
+          <NInputNumber v-model:value="model.pState2" placeholder="璇疯緭鍏�2#鎺掑寘鏈虹姸鎬�" class="w-full" />
         </NFormItem>
         <NFormItem label="3#鎺掑寘鏈虹姸鎬�" path="pState3">
-          <NInput v-model:value="model.pState3" placeholder="璇疯緭鍏�3#鎺掑寘鏈虹姸鎬�" />
+          <NInputNumber v-model:value="model.pState3" placeholder="璇疯緭鍏�3#鎺掑寘鏈虹姸鎬�" class="w-full" />
         </NFormItem>
         <NFormItem label="4#鎺掑寘鏈虹姸鎬�" path="pState4">
-          <NInput v-model:value="model.pState4" placeholder="璇疯緭鍏�4#鎺掑寘鏈虹姸鎬�" />
+          <NInputNumber v-model:value="model.pState4" placeholder="璇疯緭鍏�4#鎺掑寘鏈虹姸鎬�" class="w-full" />
         </NFormItem>
         <NFormItem label="1#鎻愬崌鏈轰骇閲�" path="tQty1">
-          <NInput v-model:value="model.tQty1" placeholder="璇疯緭鍏�1#鎻愬崌鏈轰骇閲�" />
+          <NInputNumber v-model:value="model.tQty1" placeholder="璇疯緭鍏�1#鎻愬崌鏈轰骇閲�" class="w-full" />
         </NFormItem>
         <NFormItem label="2#鎻愬崌鏈轰骇閲�" path="tQty2">
-          <NInput v-model:value="model.tQty2" placeholder="璇疯緭鍏�2#鎻愬崌鏈轰骇閲�" />
+          <NInputNumber v-model:value="model.tQty2" placeholder="璇疯緭鍏�2#鎻愬崌鏈轰骇閲�" class="w-full" />
         </NFormItem>
         <NFormItem label="3#鎻愬崌鏈轰骇閲�" path="tQty3">
-          <NInput v-model:value="model.tQty3" placeholder="璇疯緭鍏�3#鎻愬崌鏈轰骇閲�" />
+          <NInputNumber v-model:value="model.tQty3" placeholder="璇疯緭鍏�3#鎻愬崌鏈轰骇閲�" class="w-full" />
         </NFormItem>
         <NFormItem label="4#鎻愬崌鏈轰骇閲�" path="tQty4">
-          <NInput v-model:value="model.tQty4" placeholder="璇疯緭鍏�4#鎻愬崌鏈轰骇閲�" />
+          <NInputNumber v-model:value="model.tQty4" placeholder="璇疯緭鍏�4#鎻愬崌鏈轰骇閲�" class="w-full" />
         </NFormItem>
         <NFormItem label="5#鎻愬崌鏈轰骇閲�" path="tQty5">
-          <NInput v-model:value="model.tQty5" placeholder="璇疯緭鍏�5#鎻愬崌鏈轰骇閲�" />
+          <NInputNumber v-model:value="model.tQty5" placeholder="璇疯緭鍏�5#鎻愬崌鏈轰骇閲�" class="w-full" />
         </NFormItem>
         <NFormItem label="6#鎻愬崌鏈轰骇閲�" path="tQty6">
-          <NInput v-model:value="model.tQty6" placeholder="璇疯緭鍏�6#鎻愬崌鏈轰骇閲�" />
+          <NInputNumber v-model:value="model.tQty6" placeholder="璇疯緭鍏�6#鎻愬崌鏈轰骇閲�" class="w-full" />
         </NFormItem>
         <NFormItem label="7#鎻愬崌鏈轰骇閲�" path="tQty7">
-          <NInput v-model:value="model.tQty7" placeholder="璇疯緭鍏�7#鎻愬崌鏈轰骇閲�" />
+          <NInputNumber v-model:value="model.tQty7" placeholder="璇疯緭鍏�7#鎻愬崌鏈轰骇閲�" class="w-full" />
         </NFormItem>
         <NFormItem label="8#鎻愬崌鏈轰骇閲�" path="tQty8">
-          <NInput v-model:value="model.tQty8" placeholder="璇疯緭鍏�8#鎻愬崌鏈轰骇閲�" />
+          <NInputNumber v-model:value="model.tQty8" placeholder="璇疯緭鍏�8#鎻愬崌鏈轰骇閲�" class="w-full" />
         </NFormItem>
         <NFormItem label="9#鎻愬崌鏈轰骇閲�" path="tQty9">
-          <NInput v-model:value="model.tQty9" placeholder="璇疯緭鍏�9#鎻愬崌鏈轰骇閲�" />
+          <NInputNumber v-model:value="model.tQty9" placeholder="璇疯緭鍏�9#鎻愬崌鏈轰骇閲�" class="w-full" />
         </NFormItem>
         <NFormItem label="10#鎻愬崌鏈轰骇閲�" path="tQty10">
-          <NInput v-model:value="model.tQty10" placeholder="璇疯緭鍏�10#鎻愬崌鏈轰骇閲�" />
+          <NInputNumber v-model:value="model.tQty10" placeholder="璇疯緭鍏�10#鎻愬崌鏈轰骇閲�" class="w-full" />
         </NFormItem>
         <NFormItem label="11#鎻愬崌鏈轰骇閲�" path="tQty11">
-          <NInput v-model:value="model.tQty11" placeholder="璇疯緭鍏�11#鎻愬崌鏈轰骇閲�" />
+          <NInputNumber v-model:value="model.tQty11" placeholder="璇疯緭鍏�11#鎻愬崌鏈轰骇閲�" class="w-full" />
         </NFormItem>
         <NFormItem label="12#鎻愬崌鏈轰骇閲�" path="tQty12">
-          <NInput v-model:value="model.tQty12" placeholder="璇疯緭鍏�12#鎻愬崌鏈轰骇閲�" />
+          <NInputNumber v-model:value="model.tQty12" placeholder="璇疯緭鍏�12#鎻愬崌鏈轰骇閲�" class="w-full" />
         </NFormItem>
         <NFormItem label="1#鎺掑寘鏈轰骇閲�" path="pQty1">
-          <NInput v-model:value="model.pQty1" placeholder="璇疯緭鍏�1#鎺掑寘鏈轰骇閲�" />
+          <NInputNumber v-model:value="model.pQty1" placeholder="璇疯緭鍏�1#鎺掑寘鏈轰骇閲�" class="w-full" />
         </NFormItem>
         <NFormItem label="2#鎺掑寘鏈轰骇閲�" path="pQty2">
-          <NInput v-model:value="model.pQty2" placeholder="璇疯緭鍏�2#鎺掑寘鏈轰骇閲�" />
+          <NInputNumber v-model:value="model.pQty2" placeholder="璇疯緭鍏�2#鎺掑寘鏈轰骇閲�" class="w-full" />
         </NFormItem>
         <NFormItem label="3#鎺掑寘鏈轰骇閲�" path="pQty3">
-          <NInput v-model:value="model.pQty3" placeholder="璇疯緭鍏�3#鎺掑寘鏈轰骇閲�" />
+          <NInputNumber v-model:value="model.pQty3" placeholder="璇疯緭鍏�3#鎺掑寘鏈轰骇閲�" class="w-full" />
         </NFormItem>
         <NFormItem label="4#鎺掑寘鏈轰骇閲�" path="pQty4">
-          <NInput v-model:value="model.pQty4" placeholder="璇疯緭鍏�4#鎺掑寘鏈轰骇閲�" />
+          <NInputNumber v-model:value="model.pQty4" placeholder="璇疯緭鍏�4#鎺掑寘鏈轰骇閲�" class="w-full" />
         </NFormItem>
         <NFormItem label="鐝" path="shift">
-          <NInput v-model:value="model.shift" placeholder="璇疯緭鍏ョ彮娆�" />
+          <NInputNumber v-model:value="model.shift" placeholder="璇疯緭鍏ョ彮娆�" class="w-full" />
         </NFormItem>
         <NFormItem label="璁惧" path="equNo">
-          <NInput v-model:value="model.equNo" placeholder="璇疯緭鍏ヨ澶�" />
+          <NInputNumber v-model:value="model.equNo" placeholder="璇疯緭鍏ヨ澶�" class="w-full" />
         </NFormItem>
         <NFormItem label="澶囨敞" path="remark">
           <NInput v-model:value="model.remark" placeholder="璇疯緭鍏ュ娉�" />
diff --git a/ruoyi-plus-soybean/src/views/analy/packer/modules/packer-data-operate-drawer.vue b/ruoyi-plus-soybean/src/views/analy/packer/modules/packer-data-operate-drawer.vue
index bce49be..c158eb8 100755
--- a/ruoyi-plus-soybean/src/views/analy/packer/modules/packer-data-operate-drawer.vue
+++ b/ruoyi-plus-soybean/src/views/analy/packer/modules/packer-data-operate-drawer.vue
@@ -212,74 +212,74 @@
           <NInput v-model:value="model.key" :rows="3" type="textarea" placeholder="璇疯緭鍏ey" />
         </NFormItem>
         <NFormItem label="缃戠粶鐘舵��(0寮傚父锛�1姝e父)" path="online">
-          <NInput v-model:value="model.online" placeholder="璇疯緭鍏ョ綉缁滅姸鎬�(0寮傚父锛�1姝e父)" />
+          <NInputNumber v-model:value="model.online" placeholder="璇疯緭鍏ョ綉缁滅姸鎬�(0寮傚父锛�1姝e父)" class="w-full" />
         </NFormItem>
         <NFormItem label="浜ч噺" path="qty">
-          <NInput v-model:value="model.qty" placeholder="璇疯緭鍏ヤ骇閲�" />
+          <NInputNumber v-model:value="model.qty" placeholder="璇疯緭鍏ヤ骇閲�" class="w-full" />
         </NFormItem>
         <NFormItem label="鍓旈櫎浜ч噺" path="badQty">
-          <NInput v-model:value="model.badQty" placeholder="璇疯緭鍏ュ墧闄や骇閲�" />
+          <NInputNumber v-model:value="model.badQty" placeholder="璇疯緭鍏ュ墧闄や骇閲�" class="w-full" />
         </NFormItem>
         <NFormItem label="灏忕洅鑶滄秷鑰�" path="xiaohemoVal">
-          <NInput v-model:value="model.xiaohemoVal" placeholder="璇疯緭鍏ュ皬鐩掕啘娑堣��" />
+          <NInputNumber v-model:value="model.xiaohemoVal" placeholder="璇疯緭鍏ュ皬鐩掕啘娑堣��" class="w-full" />
         </NFormItem>
         <NFormItem label="鏉$洅鑶滄秷鑰�" path="tiaohemoVal">
-          <NInput v-model:value="model.tiaohemoVal" placeholder="璇疯緭鍏ユ潯鐩掕啘娑堣��" />
+          <NInputNumber v-model:value="model.tiaohemoVal" placeholder="璇疯緭鍏ユ潯鐩掕啘娑堣��" class="w-full" />
         </NFormItem>
         <NFormItem label="灏忕洅绾告秷鑰�" path="xiaohezhiVal">
-          <NInput v-model:value="model.xiaohezhiVal" placeholder="璇疯緭鍏ュ皬鐩掔焊娑堣��" />
+          <NInputNumber v-model:value="model.xiaohezhiVal" placeholder="璇疯緭鍏ュ皬鐩掔焊娑堣��" class="w-full" />
         </NFormItem>
         <NFormItem label="鏉$洅绾告秷鑰�" path="tiaohezhiVal">
-          <NInput v-model:value="model.tiaohezhiVal" placeholder="璇疯緭鍏ユ潯鐩掔焊娑堣��" />
+          <NInputNumber v-model:value="model.tiaohezhiVal" placeholder="璇疯緭鍏ユ潯鐩掔焊娑堣��" class="w-full" />
         </NFormItem>
         <NFormItem label="鍐呰‖绾告秷鑰�" path="neichenzhiVal">
-          <NInput v-model:value="model.neichenzhiVal" placeholder="璇疯緭鍏ュ唴琛焊娑堣��" />
+          <NInputNumber v-model:value="model.neichenzhiVal" placeholder="璇疯緭鍏ュ唴琛焊娑堣��" class="w-full" />
         </NFormItem>
         <NFormItem label="杩愯鏃堕棿" path="runTime">
-          <NInput v-model:value="model.runTime" placeholder="璇疯緭鍏ヨ繍琛屾椂闂�" />
+          <NInputNumber v-model:value="model.runTime" placeholder="璇疯緭鍏ヨ繍琛屾椂闂�" class="w-full" />
         </NFormItem>
         <NFormItem label="鍋滄満鏃堕棿" path="stopTime">
-          <NInput v-model:value="model.stopTime" placeholder="璇疯緭鍏ュ仠鏈烘椂闂�" />
+          <NInputNumber v-model:value="model.stopTime" placeholder="璇疯緭鍏ュ仠鏈烘椂闂�" class="w-full" />
         </NFormItem>
         <NFormItem label="鍋滄満娆℃暟" path="stopTimes">
-          <NInput v-model:value="model.stopTimes" placeholder="璇疯緭鍏ュ仠鏈烘鏁�" />
+          <NInputNumber v-model:value="model.stopTimes" placeholder="璇疯緭鍏ュ仠鏈烘鏁�" class="w-full" />
         </NFormItem>
         <NFormItem label="杞﹂��" path="speed">
-          <NInput v-model:value="model.speed" placeholder="璇疯緭鍏ヨ溅閫�" />
+          <NInputNumber v-model:value="model.speed" placeholder="璇疯緭鍏ヨ溅閫�" class="w-full" />
         </NFormItem>
         <NFormItem label="杩愯鐘舵��(-1 鏂綉 0鍋滄 1浣庨�熻繍琛� 2姝e父杩愯)" path="runStatus">
           <NRadioGroup v-model:value="model.runStatus">
             <NSpace>
-              <NRadio value="0" label="璇烽�夋嫨瀛楀吀鐢熸垚" />
+              <NRadio :value="0" label="璇烽�夋嫨瀛楀吀鐢熸垚" />
             </NSpace>
           </NRadioGroup>
         </NFormItem>
         <NFormItem label="鎻愬崌鏈轰骇閲�" path="tsQty">
-          <NInput v-model:value="model.tsQty" placeholder="璇疯緭鍏ユ彁鍗囨満浜ч噺" />
+          <NInputNumber v-model:value="model.tsQty" placeholder="璇疯緭鍏ユ彁鍗囨満浜ч噺" class="w-full" />
         </NFormItem>
         <NFormItem label="涓绘満浜ч噺锛堝皬鍖呮満锛�" path="mainQty">
-          <NInput v-model:value="model.mainQty" placeholder="璇疯緭鍏ヤ富鏈轰骇閲忥紙灏忓寘鏈猴級" />
+          <NInputNumber v-model:value="model.mainQty" placeholder="璇疯緭鍏ヤ富鏈轰骇閲忥紙灏忓寘鏈猴級" class="w-full" />
         </NFormItem>
         <NFormItem label="涓绘満鍓旈櫎閲�" path="mainBadQty">
-          <NInput v-model:value="model.mainBadQty" placeholder="璇疯緭鍏ヤ富鏈哄墧闄ら噺" />
+          <NInputNumber v-model:value="model.mainBadQty" placeholder="璇疯緭鍏ヤ富鏈哄墧闄ら噺" class="w-full" />
         </NFormItem>
         <NFormItem label="閫忓寘鏈轰骇閲�" path="tbjQty">
-          <NInput v-model:value="model.tbjQty" placeholder="璇疯緭鍏ラ�忓寘鏈轰骇閲�" />
+          <NInputNumber v-model:value="model.tbjQty" placeholder="璇疯緭鍏ラ�忓寘鏈轰骇閲�" class="w-full" />
         </NFormItem>
         <NFormItem label="閫忓寘鏈哄墧闄ゅソ鍖�" path="tbjGdQty">
-          <NInput v-model:value="model.tbjGdQty" placeholder="璇疯緭鍏ラ�忓寘鏈哄墧闄ゅソ鍖�" />
+          <NInputNumber v-model:value="model.tbjGdQty" placeholder="璇疯緭鍏ラ�忓寘鏈哄墧闄ゅソ鍖�" class="w-full" />
         </NFormItem>
         <NFormItem label="閫忓寘鏈哄墧闄ゅ潖鍖�" path="tbjBadQty">
-          <NInput v-model:value="model.tbjBadQty" placeholder="璇疯緭鍏ラ�忓寘鏈哄墧闄ゅ潖鍖�" />
+          <NInputNumber v-model:value="model.tbjBadQty" placeholder="璇疯緭鍏ラ�忓寘鏈哄墧闄ゅ潖鍖�" class="w-full" />
         </NFormItem>
         <NFormItem label="鎺掑寘鏈轰骇閲�" path="pbjQty">
-          <NInput v-model:value="model.pbjQty" placeholder="璇疯緭鍏ユ帓鍖呮満浜ч噺" />
+          <NInputNumber v-model:value="model.pbjQty" placeholder="璇疯緭鍏ユ帓鍖呮満浜ч噺" class="w-full" />
         </NFormItem>
         <NFormItem label="鐝" path="shift">
           <NSelect
             v-model:value="model.shift"
             placeholder="璇烽�夋嫨鐝"
-            :options="[{ value: '0', label: '璇烽�夋嫨瀛楀吀鐢熸垚' }]"
+            :options="[{ value: 0, label: '璇烽�夋嫨瀛楀吀鐢熸垚' }]"
             clearable
           />
         </NFormItem>
@@ -287,7 +287,7 @@
           <NSelect
             v-model:value="model.equNo"
             placeholder="璇烽�夋嫨璁惧"
-            :options="[{ value: '0', label: '璇烽�夋嫨瀛楀吀鐢熸垚' }]"
+            :options="[{ value: 0, label: '璇烽�夋嫨瀛楀吀鐢熸垚' }]"
             clearable
           />
         </NFormItem>
diff --git a/ruoyi-plus-soybean/src/views/analy/store-silk/index.vue b/ruoyi-plus-soybean/src/views/analy/store-silk/index.vue
index b772674..89f96b8 100644
--- a/ruoyi-plus-soybean/src/views/analy/store-silk/index.vue
+++ b/ruoyi-plus-soybean/src/views/analy/store-silk/index.vue
@@ -10,6 +10,7 @@
 import ButtonIcon from '@/components/custom/button-icon.vue';
 import StoreSilkOperateDrawer from './modules/store-silk-operate-drawer.vue';
 import StoreSilkSearch from './modules/store-silk-search.vue';
+import StoreSilkDetail from './modules/store-silk-detail.vue';
 
 defineOptions({
   name: 'StoreSilkList'
@@ -18,6 +19,9 @@
 const appStore = useAppStore();
 const { download } = useDownload();
 const { hasAuth } = useAuth();
+
+const selectedRollerDetailList = ref<any[]>([]);
+const selectedPackerDetailList = ref<any[]>([]);
 
 const searchParams = ref<Api.Analy.StoreSilkSearchParams>({
   pageNum: 1,
@@ -50,11 +54,6 @@
     },
     columns: () => [
       {
-        type: 'selection',
-        align: 'center',
-        width: 48
-      },
-      {
         key: 'index',
         title: $t('common.index'),
         align: 'center',
@@ -74,16 +73,26 @@
         minWidth: 130
       },
       {
-        key: 'roller',
-        title: '鍗锋帴浜ч噺',
+        key: 'rollerOutput',
+        title: '鍗锋帴浜ч噺(绠�)',
         align: 'center',
-        minWidth: 100
+        minWidth: 120,
+        render: row => {
+          const v = calcRollerBox((row as any).rollerOutput);
+          if (v === null) return '-';
+          return v.toFixed(1);
+        }
       },
       {
-        key: 'packer',
-        title: '鍖呰浜ч噺',
+        key: 'packerOutput',
+        title: '鍖呰浜ч噺(绠�)',
         align: 'center',
-        minWidth: 100
+        minWidth: 120,
+        render: row => {
+          const v = calcPackerBox((row as any).packerOutput);
+          if (v === null) return '-';
+          return v.toFixed(1);
+        }
       },
       {
         key: 'actualstarttime',
@@ -120,60 +129,6 @@
         title: '鏌滃瓙鍙�(鏈綅)',
         align: 'center',
         width: 160
-      },
-      {
-        key: 'operate',
-        title: $t('common.operate'),
-        align: 'center',
-        fixed: 'right',
-        width: 130,
-        render: row => {
-          const divider = () => {
-            if (!hasAuth('analy:storeSilk:edit') || !hasAuth('analy:storeSilk:remove')) {
-              return null;
-            }
-            return <NDivider vertical />;
-          };
-
-          const editBtn = () => {
-            if (!hasAuth('analy:storeSilk:edit')) {
-              return null;
-            }
-            return (
-              <ButtonIcon
-                text
-                type="primary"
-                icon="material-symbols:drive-file-rename-outline-outline"
-                tooltipContent={$t('common.edit')}
-                onClick={() => edit(row.id)}
-              />
-            );
-          };
-
-          const deleteBtn = () => {
-            if (!hasAuth('analy:storeSilk:remove')) {
-              return null;
-            }
-            return (
-              <ButtonIcon
-                text
-                type="error"
-                icon="material-symbols:delete-outline"
-                tooltipContent={$t('common.delete')}
-                popconfirmContent={$t('common.confirmDelete')}
-                onPositiveClick={() => handleDelete(row.id)}
-              />
-            );
-          };
-
-          return (
-            <div class="flex-center gap-8px">
-              {editBtn()}
-              {divider()}
-              {deleteBtn()}
-            </div>
-          );
-        }
       }
     ]
   });
@@ -202,6 +157,30 @@
 function handleExport() {
   download('/analy/storeSilk/export', searchParams.value, `鍌ㄤ笣鏌滀骇閲廮${new Date().getTime()}.xlsx`);
 }
+
+function calcRollerBox(val: unknown) {
+  if (val === null || val === undefined) return null;
+  const v = Number(val) / 50;
+  if (!Number.isFinite(v)) return null;
+  return v;
+}
+
+function calcPackerBox(val: unknown) {
+  if (val === null || val === undefined) return null;
+  const v = Number(val) / 10 / 250;
+  if (!Number.isFinite(v)) return null;
+  return v;
+}
+
+function handleRowClick(row: any) {
+  return {
+    onClick: () => {
+      selectedRollerDetailList.value = row.rollerDetailList || [];
+      selectedPackerDetailList.value = row.packerDetailList || [];
+    },
+    style: 'cursor: pointer;'
+  };
+}
 </script>
 
 <template>
@@ -213,8 +192,8 @@
           v-model:columns="columnChecks"
           :disabled-delete="checkedRowKeys.length === 0"
           :loading="loading"
-          :show-add="hasAuth('analy:storeSilk:add')"
-          :show-delete="hasAuth('analy:storeSilk:remove')"
+          :show-add="false"
+          :show-delete="false"
           :show-export="hasAuth('analy:storeSilk:export')"
           @add="handleAdd"
           @delete="handleBatchDelete"
@@ -243,7 +222,6 @@
         </TableHeaderOperation>
       </template>
       <NDataTable
-        v-model:checked-row-keys="checkedRowKeys"
         :columns="columns"
         :data="data"
         :size="tableSize"
@@ -253,6 +231,7 @@
         remote
         :row-key="row => row.id"
         :pagination="mobilePagination"
+        :row-props="handleRowClick"
         class="sm:h-full"
       />
       <StoreSilkOperateDrawer
@@ -262,6 +241,11 @@
         @submitted="getDataByPage"
       />
     </NCard>
+    <StoreSilkDetail
+      :roller-detail-list="selectedRollerDetailList"
+      :packer-detail-list="selectedPackerDetailList"
+      class="h-[192px] overflow-hidden"
+    />
   </div>
 </template>
 
diff --git a/ruoyi-plus-soybean/src/views/analy/store-silk/modules/store-silk-detail.vue b/ruoyi-plus-soybean/src/views/analy/store-silk/modules/store-silk-detail.vue
new file mode 100644
index 0000000..d652e37
--- /dev/null
+++ b/ruoyi-plus-soybean/src/views/analy/store-silk/modules/store-silk-detail.vue
@@ -0,0 +1,173 @@
+<script setup lang="tsx">
+import { computed, ref } from 'vue';
+import { NDataTable } from 'naive-ui';
+import { $t } from '@/locales';
+
+defineOptions({
+  name: 'StoreSilkDetail'
+});
+
+interface StoreSilkDetailVo {
+  fsNum: string;
+  siloNum: string;
+  pipeNum: string;
+  equNo: string;
+  shiftCode: string;
+  shiftStartTime: string;
+  shiftEndTime: string;
+  output: number | null;
+}
+
+interface Props {
+  rollerDetailList?: StoreSilkDetailVo[];
+  packerDetailList?: StoreSilkDetailVo[];
+}
+
+const props = withDefaults(defineProps<Props>(), {
+  rollerDetailList: () => [],
+  packerDetailList: () => []
+});
+
+function calcRollerBox(val: unknown) {
+  if (val === null || val === undefined) return null;
+  const v = Number(val) / 50;
+  if (!Number.isFinite(v)) return null;
+  return v;
+}
+
+function calcPackerBox(val: unknown) {
+  if (val === null || val === undefined) return null;
+  const v = Number(val) / 10 / 250;
+  if (!Number.isFinite(v)) return null;
+  return v;
+}
+
+type DetailType = 'roller' | 'packer';
+
+const detailType = ref<DetailType>('roller');
+
+const detailList = computed(() => {
+  return detailType.value === 'roller' ? props.rollerDetailList : props.packerDetailList;
+});
+
+const columns: NaiveUI.TableColumn<StoreSilkDetailVo>[] = [
+  {
+    key: 'index',
+    title: $t('common.index'),
+    align: 'center',
+    width: 64,
+    render: (_: any, index: number) => index + 1
+  },
+  {
+    key: 'fsNum',
+    title: '鍠備笣鏈哄彿',
+    align: 'center',
+    width: 100
+  },
+  {
+    key: 'siloNum',
+    title: '鍌ㄤ笣鏌滃彿',
+    align: 'center',
+    width: 100
+  },
+  {
+    key: 'pipeNum',
+    title: '绠¢亾鍙�',
+    align: 'center',
+    width: 100
+  },
+  {
+    key: 'equNo',
+    title: '鏈哄彴鍙�',
+    align: 'center',
+    width: 100
+  },
+  {
+    key: 'shiftCode',
+    title: '鐝浠g爜',
+    align: 'center',
+    width: 100,
+    render: (row: StoreSilkDetailVo) => {
+      const map: Record<string, string> = {
+        '1': '鏃╃彮',
+        '2': '涓彮',
+        '3': '鏅氱彮'
+      };
+      return map[row.shiftCode] || row.shiftCode;
+    }
+  },
+  {
+    key: 'shiftStartTime',
+    title: '鐝寮�濮嬫椂闂�',
+    align: 'center',
+    width: 160
+  },
+  {
+    key: 'shiftEndTime',
+    title: '鐝缁撴潫鏃堕棿',
+    align: 'center',
+    width: 160
+  },
+  {
+    key: 'output',
+    title: '浜ч噺(鍗冩敮)',
+    align: 'center',
+    width: 120,
+    render: (row: StoreSilkDetailVo) => {
+      if (row.output === null || row.output === undefined) return '-';
+      const v = Number(row.output);
+      if (!Number.isFinite(v)) return '-';
+      return v;
+    }
+  },
+  {
+    key: 'outputBox',
+    title: '浜ч噺(绠�)',
+    align: 'center',
+    width: 100,
+    render: (row: StoreSilkDetailVo) => {
+      const v = detailType.value === 'roller' ? calcRollerBox(row.output) : calcPackerBox(row.output);
+      if (v === null) return '-';
+      return v.toFixed(1);
+    }
+  }
+];
+</script>
+
+<template>
+  <NCard
+    title="浜ч噺鏄庣粏"
+    :bordered="false"
+    size="small"
+    class="card-wrapper flex-col-stretch"
+    :content-style="{ flex: 1, overflow: 'hidden', display: 'flex', flexDirection: 'column' }"
+  >
+    <template #header-extra>
+      <NSpace :size="8">
+        <NButton size="small" ghost :type="detailType === 'roller' ? 'primary' : 'default'" @click="detailType = 'roller'">
+          鍗锋帴
+        </NButton>
+        <NButton size="small" ghost :type="detailType === 'packer' ? 'primary' : 'default'" @click="detailType = 'packer'">
+          鍖呰
+        </NButton>
+      </NSpace>
+    </template>
+
+    <div v-if="!detailList || detailList.length === 0" class="flex-center h-full text-gray-400">
+      璇风偣鍑讳笂鏂硅〃鏍艰鏌ョ湅璇︽儏
+    </div>
+    <NDataTable
+      v-else
+      :columns="columns as any"
+      :data="detailList"
+      flex-height
+      class="flex-1-hidden"
+    />
+  </NCard>
+</template>
+
+<style scoped>
+:deep(.n-card__content) {
+  padding: 8px 12px;
+}
+</style>
diff --git a/ruoyi-plus-soybean/src/views/analy/store-silk/modules/store-silk-operate-drawer.vue b/ruoyi-plus-soybean/src/views/analy/store-silk/modules/store-silk-operate-drawer.vue
index 169e340..323ce98 100644
--- a/ruoyi-plus-soybean/src/views/analy/store-silk/modules/store-silk-operate-drawer.vue
+++ b/ruoyi-plus-soybean/src/views/analy/store-silk/modules/store-silk-operate-drawer.vue
@@ -162,16 +162,16 @@
           />
         </NFormItem>
         <NFormItem label="鎶曟枡閲嶉噺" path="jobinput">
-          <NInput v-model:value="model.jobinput" placeholder="璇疯緭鍏ユ姇鏂欓噸閲�" />
+          <NInputNumber v-model:value="model.jobinput" placeholder="璇疯緭鍏ユ姇鏂欓噸閲�" class="w-full" />
         </NFormItem>
         <NFormItem label="鎹熻�楅噸閲�" path="weightloss">
-          <NInput v-model:value="model.weightloss" placeholder="璇疯緭鍏ユ崯鑰楅噸閲�" />
+          <NInputNumber v-model:value="model.weightloss" placeholder="璇疯緭鍏ユ崯鑰楅噸閲�" class="w-full" />
         </NFormItem>
         <NFormItem label="鍑哄彾涓濈巼" path="slkrate">
-          <NInput v-model:value="model.slkrate" placeholder="璇疯緭鍏ュ嚭鍙朵笣鐜�" />
+          <NInputNumber v-model:value="model.slkrate" placeholder="璇疯緭鍏ュ嚭鍙朵笣鐜�" class="w-full" />
         </NFormItem>
         <NFormItem label="鍌ㄤ笣鏌滈噸閲�" path="weight">
-          <NInput v-model:value="model.weight" placeholder="璇疯緭鍏ュ偍涓濇煖閲嶉噺" />
+          <NInputNumber v-model:value="model.weight" placeholder="璇疯緭鍏ュ偍涓濇煖閲嶉噺" class="w-full" />
         </NFormItem>
         <NFormItem label="鍌ㄤ笣鏌滃嚭鏂欏紑濮嬫椂闂�" path="distimebegin">
           <NDatePicker
diff --git a/ruoyi-plus-soybean/src/views/md/shift/modules/shift-operate-drawer.vue b/ruoyi-plus-soybean/src/views/md/shift/modules/shift-operate-drawer.vue
index ded007d..a9b4fdf 100644
--- a/ruoyi-plus-soybean/src/views/md/shift/modules/shift-operate-drawer.vue
+++ b/ruoyi-plus-soybean/src/views/md/shift/modules/shift-operate-drawer.vue
@@ -154,7 +154,7 @@
     <NDrawerContent :title="title" :native-scrollbar="false" closable>
       <NForm ref="formRef" :model="model" :rules="rules">
         <NFormItem label="杞﹂棿澶栭敭" path="wsId">
-          <NInput v-model:value="model.wsId" placeholder="璇疯緭鍏ヨ溅闂村閿�" />
+          <NInputNumber v-model:value="model.wsId as any" placeholder="璇疯緭鍏ヨ溅闂村閿�" class="w-full" />
         </NFormItem>
         <NFormItem label="缂栫爜" path="code">
           <NInput v-model:value="model.code" placeholder="璇疯緭鍏ョ紪鐮�" />
@@ -169,13 +169,13 @@
           <NInput v-model:value="model.etim" placeholder="璇疯緭鍏ョ彮娆$粨鏉熸椂闂�" />
         </NFormItem>
         <NFormItem label="鎺掑簭" path="seq">
-          <NInput v-model:value="model.seq" placeholder="璇疯緭鍏ユ帓搴�" />
+          <NInputNumber v-model:value="model.seq" placeholder="璇疯緭鍏ユ帓搴�" class="w-full" />
         </NFormItem>
         <NFormItem label="鍚敤" path="enable">
-          <NInput v-model:value="model.enable" placeholder="璇疯緭鍏ュ惎鐢�" />
+          <NInputNumber v-model:value="model.enable" placeholder="璇疯緭鍏ュ惎鐢�" class="w-full" />
         </NFormItem>
         <NFormItem label="鍒犻櫎" path="del">
-          <NInput v-model:value="model.del" placeholder="璇疯緭鍏ュ垹闄�" />
+          <NInputNumber v-model:value="model.del" placeholder="璇疯緭鍏ュ垹闄�" class="w-full" />
         </NFormItem>
         <NFormItem label="鍒涘缓鐢ㄦ埛" path="createUserName">
           <NInput v-model:value="model.createUserName" placeholder="璇疯緭鍏ュ垱寤虹敤鎴�" />
diff --git a/ruoyi-plus-soybean/src/views/md/shift/modules/shift-search.vue b/ruoyi-plus-soybean/src/views/md/shift/modules/shift-search.vue
index d544a66..0007b29 100644
--- a/ruoyi-plus-soybean/src/views/md/shift/modules/shift-search.vue
+++ b/ruoyi-plus-soybean/src/views/md/shift/modules/shift-search.vue
@@ -49,7 +49,7 @@
               <NInput v-model:value="model.name" placeholder="璇疯緭鍏ュ悕绉�" />
             </NFormItemGi>
             <NFormItemGi span="24 s:12 m:6" label="鍚敤" label-width="auto" path="enable" class="pr-24px">
-              <NInput v-model:value="model.enable" placeholder="璇疯緭鍏ュ惎鐢�" />
+              <NInputNumber v-model:value="model.enable" placeholder="璇疯緭鍏ュ惎鐢�" class="w-full" />
             </NFormItemGi>
             <NFormItemGi :show-feedback="false" span="24" class="pr-24px">
               <NSpace class="w-full" justify="end">
diff --git a/ruoyi-plus-soybean/src/views/qm/batch/modules/batch-operate-drawer.vue b/ruoyi-plus-soybean/src/views/qm/batch/modules/batch-operate-drawer.vue
index 12d91d0..bccc726 100644
--- a/ruoyi-plus-soybean/src/views/qm/batch/modules/batch-operate-drawer.vue
+++ b/ruoyi-plus-soybean/src/views/qm/batch/modules/batch-operate-drawer.vue
@@ -344,7 +344,7 @@
           <NInput v-model:value="model.enabled" placeholder="璇疯緭鍏ュ惎鐢ㄦ爣蹇�" />
         </NFormItem>
         <NFormItem label="鍒拌揣鎬婚噺" path="totalNum">
-          <NInput v-model:value="model.totalNum" placeholder="璇疯緭鍏ュ埌璐ф�婚噺" />
+          <NInputNumber v-model:value="model.totalNum" placeholder="璇疯緭鍏ュ埌璐ф�婚噺" class="w-full" />
         </NFormItem>
         <NFormItem label="缁煎悎鍒ゅ畾" path="results">
           <NInput v-model:value="model.results" placeholder="璇疯緭鍏ョ患鍚堝垽瀹�" />
@@ -395,7 +395,7 @@
           />
         </NFormItem>
         <NFormItem label="鍒犻櫎鏍囧織" path="deleted">
-          <NInput v-model:value="model.deleted" placeholder="璇疯緭鍏ュ垹闄ゆ爣蹇�" />
+          <NInputNumber v-model:value="model.deleted" placeholder="璇疯緭鍏ュ垹闄ゆ爣蹇�" class="w-full" />
         </NFormItem>
         <NFormItem label="鎵规鎻忚堪" path="batchDes">
           <NInput v-model:value="model.batchDes" placeholder="璇疯緭鍏ユ壒娆℃弿杩�" />
@@ -413,13 +413,13 @@
           <NInput v-model:value="model.boxno" placeholder="璇疯緭鍏ヨ绠卞彿" />
         </NFormItem>
         <NFormItem label="鐖舵壒娆″彿" path="pid">
-          <NInput v-model:value="model.pid" placeholder="璇疯緭鍏ョ埗鎵规鍙�" />
+          <NInput v-model:value="model.pid as any" placeholder="璇疯緭鍏ョ埗鎵规鍙�" />
         </NFormItem>
         <NFormItem label="澶嶆牳浜�" path="reviewer">
           <NInput v-model:value="model.reviewer" placeholder="璇疯緭鍏ュ鏍镐汉" />
         </NFormItem>
         <NFormItem label="澶嶆娆℃暟" path="rvcount">
-          <NInput v-model:value="model.rvcount" placeholder="璇疯緭鍏ュ妫�娆℃暟" />
+          <NInputNumber v-model:value="model.rvcount" placeholder="璇疯緭鍏ュ妫�娆℃暟" class="w-full" />
         </NFormItem>
         <NFormItem label="鎵规鐘舵��" path="state">
           <NInput v-model:value="model.state" placeholder="璇疯緭鍏ユ壒娆$姸鎬�" />
diff --git a/ruoyi-plus-soybean/src/views/qm/batch/modules/batch-search.vue b/ruoyi-plus-soybean/src/views/qm/batch/modules/batch-search.vue
index 599f7ec..77400be 100644
--- a/ruoyi-plus-soybean/src/views/qm/batch/modules/batch-search.vue
+++ b/ruoyi-plus-soybean/src/views/qm/batch/modules/batch-search.vue
@@ -116,7 +116,7 @@
               />
             </NFormItemGi>
             <NFormItemGi span="24 s:12 m:8" label="鍒犻櫎鏍囧織" label-width="auto" path="deleted" class="pr-24px">
-              <NInput v-model:value="model.deleted" placeholder="璇疯緭鍏ュ垹闄ゆ爣蹇�" />
+              <NInputNumber v-model:value="model.deleted" placeholder="璇疯緭鍏ュ垹闄ゆ爣蹇�" class="w-full" />
             </NFormItemGi>
             <NFormItemGi span="24 s:12 m:8" label="绫诲埆" label-width="auto" path="category" class="pr-24px">
               <NSelect v-model:value="model.category" :options="categoryOptions" placeholder="璇烽�夋嫨绫诲埆" clearable />

--
Gitblit v1.9.3