From 275a85689266231fbdb0fd6e7615c06eb7fbf7b2 Mon Sep 17 00:00:00 2001
From: zhuguifei <312353457@qq.com>
Date: 星期三, 04 三月 2026 12:51:47 +0800
Subject: [PATCH] feat(moudule(qa)): 1.新增Oracle多数据源 2.新增喂丝机对应关系、第三方储丝柜信息视图等

---
 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/domain/vo/FeedmatchTimeDataVo.java             |  196 +++++
 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/service/IFeedmatchTimeDataService.java         |   69 +
 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/resources/mapper/analy/FeedmatchTimeDataMapper.xml                    |    6 
 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/resources/mapper/analy/StoreSilkInfoMapper.xml                        |    6 
 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/domain/FeedmatchTimeData.java                  |   78 +-
 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/mapper/FeedmatchTimeDataMapper.java            |   15 
 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/mapper/StoreSilkInfoMapper.java                |   15 
 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/md/service/impl/MdShiftServiceImpl.java              |  134 +++
 RuoYi-Vue-Plus/ruoyi-admin/src/main/resources/application-dev.yml                                                    |   12 
 RuoYi-Vue-Plus/ruoyi-admin/pom.xml                                                                                   |   16 
 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/md/mapper/MdShiftMapper.java                         |   15 
 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/md/domain/bo/MdShiftBo.java                          |   92 ++
 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/domain/StoreSilkInfo.java                      |   82 ++
 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/md/domain/MdShift.java                               |   93 ++
 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/service/IStoreSilkInfoService.java             |   68 +
 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/service/impl/FeedmatchTimeDataServiceImpl.java |  133 +++
 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/service/impl/StoreSilkInfoServiceImpl.java     |  156 ++++
 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/domain/bo/FeedmatchTimeDataBo.java             |  163 ++++
 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/resources/mapper/md/MdShiftMapper.xml                                 |    6 
 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-generator/pom.xml                                                                 |   10 
 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/md/service/IMdShiftService.java                      |   68 +
 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/md/domain/vo/MdShiftVo.java                          |  112 +++
 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/domain/vo/StoreSilkInfoVo.java                 |  100 ++
 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/md/controller/MdShiftController.java                 |  105 +++
 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/domain/bo/StoreSilkInfoBo.java                 |   84 ++
 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/controller/StoreSilkInfoController.java        |  106 +++
 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/controller/FeedmatchTimeDataController.java    |  106 +++
 27 files changed, 1,992 insertions(+), 54 deletions(-)

diff --git a/RuoYi-Vue-Plus/ruoyi-admin/pom.xml b/RuoYi-Vue-Plus/ruoyi-admin/pom.xml
index 25600a1..f16c7a1 100755
--- a/RuoYi-Vue-Plus/ruoyi-admin/pom.xml
+++ b/RuoYi-Vue-Plus/ruoyi-admin/pom.xml
@@ -25,15 +25,15 @@
 
 <!--        &lt;!&ndash; mp鏀寔鐨勬暟鎹簱鍧囨敮鎸� 鍙渶瑕佸鍔犲搴旂殑jdbc渚濊禆鍗冲彲 &ndash;&gt;-->
 <!--        &lt;!&ndash; Oracle &ndash;&gt;-->
-<!--        <dependency>-->
-<!--            <groupId>com.oracle.database.jdbc</groupId>-->
-<!--            <artifactId>ojdbc8</artifactId>-->
-<!--        </dependency>-->
+        <dependency>
+            <groupId>com.oracle.database.jdbc</groupId>
+            <artifactId>ojdbc8</artifactId>
+        </dependency>
 <!--        &lt;!&ndash; 鍏煎oracle浣庣増鏈� &ndash;&gt;-->
-<!--        <dependency>-->
-<!--            <groupId>com.oracle.database.nls</groupId>-->
-<!--            <artifactId>orai18n</artifactId>-->
-<!--        </dependency>-->
+        <dependency>
+            <groupId>com.oracle.database.nls</groupId>
+            <artifactId>orai18n</artifactId>
+        </dependency>
         <!-- PostgreSql -->
         <dependency>
             <groupId>org.postgresql</groupId>
diff --git a/RuoYi-Vue-Plus/ruoyi-admin/src/main/resources/application-dev.yml b/RuoYi-Vue-Plus/ruoyi-admin/src/main/resources/application-dev.yml
index 8e3efe6..d63a6d8 100755
--- a/RuoYi-Vue-Plus/ruoyi-admin/src/main/resources/application-dev.yml
+++ b/RuoYi-Vue-Plus/ruoyi-admin/src/main/resources/application-dev.yml
@@ -64,12 +64,12 @@
 #          url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
 #          username:
 #          password:
-#        oracle:
-#          type: ${spring.datasource.type}
-#          driverClassName: oracle.jdbc.OracleDriver
-#          url: jdbc:oracle:thin:@//localhost:1521/XE
-#          username: ROOT
-#          password: root
+        oracle:
+          type: ${spring.datasource.type}
+          driverClassName: oracle.jdbc.OracleDriver
+          url: jdbc:oracle:thin:@192.168.2.26:1521:orcl
+          username: gfsc
+          password: lbit
 #        postgres:
 #          type: ${spring.datasource.type}
 #          driverClassName: org.postgresql.Driver
diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-generator/pom.xml b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-generator/pom.xml
index fa5dc25..ab25430 100755
--- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-generator/pom.xml
+++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-generator/pom.xml
@@ -66,11 +66,11 @@
         </dependency>
 
         <!-- anyline鏀寔100+绉嶇被鍨嬫暟鎹簱 娣诲姞瀵瑰簲鐨刯dbc渚濊禆涓巃nyline瀵瑰簲鏁版嵁搴撲緷璧栧寘鍗冲彲 -->
-<!--        <dependency>-->
-<!--            <groupId>org.anyline</groupId>-->
-<!--            <artifactId>anyline-data-jdbc-oracle</artifactId>-->
-<!--            <version>${anyline.version}</version>-->
-<!--        </dependency>-->
+        <dependency>
+            <groupId>org.anyline</groupId>
+            <artifactId>anyline-data-jdbc-oracle</artifactId>
+            <version>${anyline.version}</version>
+        </dependency>
 
         <dependency>
             <groupId>org.anyline</groupId>
diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/controller/FeedmatchTimeDataController.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/controller/FeedmatchTimeDataController.java
new file mode 100644
index 0000000..40eff2c
--- /dev/null
+++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/controller/FeedmatchTimeDataController.java
@@ -0,0 +1,106 @@
+package org.dromara.analy.controller;
+
+import java.util.Date;
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.analy.domain.vo.FeedmatchTimeDataVo;
+import org.dromara.analy.domain.bo.FeedmatchTimeDataBo;
+import org.dromara.analy.service.IFeedmatchTimeDataService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 鍠備笣鏈哄搴斿叧绯�
+ *
+ * @author zhuguifei
+ * @date 2026-03-02
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/analy/feedMatch")
+public class FeedmatchTimeDataController extends BaseController {
+
+    private final IFeedmatchTimeDataService feedmatchTimeDataService;
+
+    /**
+     * 鏌ヨ鍠備笣鏈哄搴斿叧绯诲垪琛�
+     */
+    @SaCheckPermission("analy:feedMatch:list")
+    @GetMapping("/list")
+    public TableDataInfo<FeedmatchTimeDataVo> list(FeedmatchTimeDataBo bo, PageQuery pageQuery) {
+        return feedmatchTimeDataService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 瀵煎嚭鍠備笣鏈哄搴斿叧绯诲垪琛�
+     */
+    @SaCheckPermission("analy:feedMatch:export")
+    @Log(title = "鍠備笣鏈哄搴斿叧绯�", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(FeedmatchTimeDataBo bo, HttpServletResponse response) {
+        List<FeedmatchTimeDataVo> list = feedmatchTimeDataService.queryList(bo);
+        ExcelUtil.exportExcel(list, "鍠備笣鏈哄搴斿叧绯�", FeedmatchTimeDataVo.class, response);
+    }
+
+    /**
+     * 鑾峰彇鍠備笣鏈哄搴斿叧绯昏缁嗕俊鎭�
+     *
+     * @param time 涓婚敭
+     */
+    @SaCheckPermission("analy:feedMatch:query")
+    @GetMapping("/{time}")
+    public R<FeedmatchTimeDataVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
+                                     @PathVariable Date time) {
+        return R.ok(feedmatchTimeDataService.queryById(time));
+    }
+
+    /**
+     * 鏂板鍠備笣鏈哄搴斿叧绯�
+     */
+    @SaCheckPermission("analy:feedMatch:add")
+    @Log(title = "鍠備笣鏈哄搴斿叧绯�", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody FeedmatchTimeDataBo bo) {
+        return toAjax(feedmatchTimeDataService.insertByBo(bo));
+    }
+
+    /**
+     * 淇敼鍠備笣鏈哄搴斿叧绯�
+     */
+    @SaCheckPermission("analy:feedMatch:edit")
+    @Log(title = "鍠備笣鏈哄搴斿叧绯�", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody FeedmatchTimeDataBo bo) {
+        return toAjax(feedmatchTimeDataService.updateByBo(bo));
+    }
+
+    /**
+     * 鍒犻櫎鍠備笣鏈哄搴斿叧绯�
+     *
+     * @param times 涓婚敭涓�
+     */
+    @SaCheckPermission("analy:feedMatch:remove")
+    @Log(title = "鍠備笣鏈哄搴斿叧绯�", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{times}")
+    public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
+                          @PathVariable Date[] times) {
+        return toAjax(feedmatchTimeDataService.deleteWithValidByIds(List.of(times), true));
+    }
+}
diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/controller/StoreSilkInfoController.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/controller/StoreSilkInfoController.java
new file mode 100644
index 0000000..e8c9fa4
--- /dev/null
+++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/controller/StoreSilkInfoController.java
@@ -0,0 +1,106 @@
+package org.dromara.analy.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.analy.domain.vo.StoreSilkInfoVo;
+import org.dromara.analy.domain.bo.StoreSilkInfoBo;
+import org.dromara.analy.service.IStoreSilkInfoService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 鍌ㄤ笣鏌滀骇閲�
+ *
+ * @author zhuguifei
+ * @date 2026-03-02
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/analy/storeSilk")
+public class StoreSilkInfoController extends BaseController {
+
+    private final IStoreSilkInfoService storeSilkInfoService;
+
+    /**
+     * 鏌ヨ鍌ㄤ笣鏌滀骇閲忓垪琛�
+     */
+    @SaCheckPermission("analy:storeSilk:list")
+    @GetMapping("/list")
+    public TableDataInfo<StoreSilkInfoVo> list(StoreSilkInfoBo bo, PageQuery pageQuery) {
+
+        return storeSilkInfoService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 瀵煎嚭鍌ㄤ笣鏌滀骇閲忓垪琛�
+     */
+    @SaCheckPermission("analy:storeSilk:export")
+    @Log(title = "鍌ㄤ笣鏌滀骇閲�", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(StoreSilkInfoBo bo, HttpServletResponse response) {
+        List<StoreSilkInfoVo> list = storeSilkInfoService.queryList(bo);
+        ExcelUtil.exportExcel(list, "鍌ㄤ笣鏌滀骇閲�", StoreSilkInfoVo.class, response);
+    }
+
+    /**
+     * 鑾峰彇鍌ㄤ笣鏌滀骇閲忚缁嗕俊鎭�
+     *
+     * @param id 涓婚敭
+     */
+    @SaCheckPermission("analy:storeSilk:query")
+    @GetMapping("/{id}")
+    public R<StoreSilkInfoVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
+                                     @PathVariable Long id) {
+        return R.ok(storeSilkInfoService.queryById(id));
+    }
+
+    /**
+     * 鏂板鍌ㄤ笣鏌滀骇閲�
+     */
+    @SaCheckPermission("analy:storeSilk:add")
+    @Log(title = "鍌ㄤ笣鏌滀骇閲�", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody StoreSilkInfoBo bo) {
+        return toAjax(storeSilkInfoService.insertByBo(bo));
+    }
+
+    /**
+     * 淇敼鍌ㄤ笣鏌滀骇閲�
+     */
+    @SaCheckPermission("analy:storeSilk:edit")
+    @Log(title = "鍌ㄤ笣鏌滀骇閲�", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody StoreSilkInfoBo bo) {
+        return toAjax(storeSilkInfoService.updateByBo(bo));
+    }
+
+    /**
+     * 鍒犻櫎鍌ㄤ笣鏌滀骇閲�
+     *
+     * @param ids 涓婚敭涓�
+     */
+    @SaCheckPermission("analy:storeSilk:remove")
+    @Log(title = "鍌ㄤ笣鏌滀骇閲�", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
+                          @PathVariable Long[] ids) {
+        return toAjax(storeSilkInfoService.deleteWithValidByIds(List.of(ids), true));
+    }
+}
diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/domain/FeedmatchTimeData.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/domain/FeedmatchTimeData.java
old mode 100755
new mode 100644
index 09ad4bd..a53d88a
--- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/domain/FeedmatchTimeData.java
+++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/domain/FeedmatchTimeData.java
@@ -5,13 +5,15 @@
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
 import java.io.Serial;
 
 /**
- * 鍠備笣鏈哄垎鏋愬璞� feedmatch_time_data
+ * 鍠備笣鏈哄搴斿叧绯诲璞� feedmatch_time_data
  *
  * @author zhuguifei
- * @date 2026-01-29
+ * @date 2026-03-02
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
@@ -22,24 +24,14 @@
     private static final long serialVersionUID = 1L;
 
     /**
-     * 鏃堕棿
+     * 鏃堕棿鎴�
      */
     private Date time;
 
     /**
-     * Key
+     * 鐝+鏈哄彴
      */
     private String key;
-
-    /**
-     * 鐝 (1浣嶆暟瀛�)
-     */
-    private Integer shift;
-
-    /**
-     * 璁惧鍙� (3浣嶆暟瀛�)
-     */
-    private Integer equNo;
 
     /**
      * 鏁版嵁鏇存柊鏃堕棿
@@ -49,106 +41,122 @@
     /**
      * 1#鍠備笣鏈哄搴旂殑绗竴涓偍涓濇煖
      */
-    private Integer fs11;
+    private String fs11;
 
     /**
      * 1#鍠備笣鏈哄搴旂殑绗簩涓偍涓濇煖
      */
-    private Integer fs12;
+    private String fs12;
 
     /**
      * 2#鍠備笣鏈哄搴旂殑绗竴涓偍涓濇煖
      */
-    private Integer fs21;
+    private String fs21;
 
     /**
      * 2#鍠備笣鏈哄搴旂殑绗簩涓偍涓濇煖
      */
-    private Integer fs22;
+    private String fs22;
 
     /**
      * 3#鍠備笣鏈哄搴旂殑绗竴涓偍涓濇煖
      */
-    private Integer fs31;
+    private String fs31;
 
     /**
      * 3#鍠備笣鏈哄搴旂殑绗簩涓偍涓濇煖
      */
-    private Integer fs32;
+    private String fs32;
 
     /**
      * 4#鍠備笣鏈哄搴旂殑绗竴涓偍涓濇煖
      */
-    private Integer fs41;
+    private String fs41;
 
     /**
      * 4#鍠備笣鏈哄搴旂殑绗簩涓偍涓濇煖
      */
-    private Integer fs42;
+    private String fs42;
 
     /**
      * 1#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
      */
-    private Integer pipe01;
+    private Long pipe01;
 
     /**
      * 2#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
      */
-    private Integer pipe02;
+    private Long pipe02;
 
     /**
      * 3#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
      */
-    private Integer pipe03;
+    private Long pipe03;
 
     /**
      * 4#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
      */
-    private Integer pipe04;
+    private Long pipe04;
 
     /**
      * 5#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
      */
-    private Integer pipe05;
+    private Long pipe05;
 
     /**
      * 6#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
      */
-    private Integer pipe06;
+    private Long pipe06;
 
     /**
      * 7#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
      */
-    private Integer pipe07;
+    private Long pipe07;
 
     /**
      * 8#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
      */
-    private Integer pipe08;
+    private Long pipe08;
 
     /**
      * 9#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
      */
-    private Integer pipe09;
+    private Long pipe09;
 
     /**
      * 10#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
      */
-    private Integer pipe10;
+    private Long pipe10;
 
     /**
      * 11#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
      */
-    private Integer pipe11;
+    private Long pipe11;
 
     /**
      * 12#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
      */
-    private Integer pipe12;
+    private Long pipe12;
 
     /**
      * 鍠備笣鏈虹姸鎬� 1-杩炴帴 0-鏂紑
      */
-    private Integer wsjState;
+    private Long wsjState;
+
+    /**
+     * 鐝
+     */
+    private Long shift;
+
+    /**
+     * 鏈哄彴
+     */
+    private Long equNo;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
 
 }
diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/domain/StoreSilkInfo.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/domain/StoreSilkInfo.java
new file mode 100644
index 0000000..8c23f46
--- /dev/null
+++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/domain/StoreSilkInfo.java
@@ -0,0 +1,82 @@
+package org.dromara.analy.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serial;
+
+/**
+ * 鍌ㄤ笣鏌滀骇閲忓璞� oracle_store_silk
+ *
+ * @author zhuguifei
+ * @date 2026-03-02
+ */
+@Data
+@TableName("oracle_store_silk")
+public class StoreSilkInfo {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 鐗屽彿
+     */
+    private String materialname;
+
+    /**
+     * 鎵规鍙�
+     */
+    private String batchcode;
+
+    /**
+     * 鎶曟枡鏃ユ湡
+     */
+    private Date actualstarttime;
+
+    /**
+     * 鎶曟枡閲嶉噺
+     */
+    private Long jobinput;
+
+    /**
+     * 鎹熻�楅噸閲�
+     */
+    private Long weightloss;
+
+    /**
+     * 鍑哄彾涓濈巼
+     */
+    private Long slkrate;
+
+    /**
+     * 鍌ㄤ笣鏌滈噸閲�
+     */
+    private Long weight;
+
+    /**
+     * 鍌ㄤ笣鏌滃嚭鏂欏紑濮嬫椂闂�
+     */
+    private Date distimebegin;
+
+    /**
+     * 鍌ㄤ笣鏌滃嚭鏂欑粨鏉熸椂闂�
+     */
+    private Date distimeend;
+
+    /**
+     * 鏌滃瓙鍙�(鏈綅)
+     */
+    private String siloid;
+
+
+}
diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/domain/bo/FeedmatchTimeDataBo.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/domain/bo/FeedmatchTimeDataBo.java
new file mode 100644
index 0000000..7cbf1c4
--- /dev/null
+++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/domain/bo/FeedmatchTimeDataBo.java
@@ -0,0 +1,163 @@
+package org.dromara.analy.domain.bo;
+
+import org.dromara.analy.domain.FeedmatchTimeData;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 鍠備笣鏈哄搴斿叧绯讳笟鍔″璞� feedmatch_time_data
+ *
+ * @author zhuguifei
+ * @date 2026-03-02
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = FeedmatchTimeData.class, reverseConvertGenerate = false)
+public class FeedmatchTimeDataBo extends BaseEntity {
+
+    /**
+     * 鏃堕棿鎴�
+     */
+    @NotNull(message = "鏃堕棿鎴充笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+    private Date time;
+
+    /**
+     * 鐝+鏈哄彴
+     */
+    @NotBlank(message = "鐝+鏈哄彴涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String key;
+
+    /**
+     * 鏁版嵁鏇存柊鏃堕棿
+     */
+    private String dacUpTime;
+
+    /**
+     * 1#鍠備笣鏈哄搴旂殑绗竴涓偍涓濇煖
+     */
+    private String fs11;
+
+    /**
+     * 1#鍠備笣鏈哄搴旂殑绗簩涓偍涓濇煖
+     */
+    private String fs12;
+
+    /**
+     * 2#鍠備笣鏈哄搴旂殑绗竴涓偍涓濇煖
+     */
+    private String fs21;
+
+    /**
+     * 2#鍠備笣鏈哄搴旂殑绗簩涓偍涓濇煖
+     */
+    private String fs22;
+
+    /**
+     * 3#鍠備笣鏈哄搴旂殑绗竴涓偍涓濇煖
+     */
+    private String fs31;
+
+    /**
+     * 3#鍠備笣鏈哄搴旂殑绗簩涓偍涓濇煖
+     */
+    private String fs32;
+
+    /**
+     * 4#鍠備笣鏈哄搴旂殑绗竴涓偍涓濇煖
+     */
+    private String fs41;
+
+    /**
+     * 4#鍠備笣鏈哄搴旂殑绗簩涓偍涓濇煖
+     */
+    private String fs42;
+
+    /**
+     * 1#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
+     */
+    private Long pipe01;
+
+    /**
+     * 2#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
+     */
+    private Long pipe02;
+
+    /**
+     * 3#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
+     */
+    private Long pipe03;
+
+    /**
+     * 4#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
+     */
+    private Long pipe04;
+
+    /**
+     * 5#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
+     */
+    private Long pipe05;
+
+    /**
+     * 6#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
+     */
+    private Long pipe06;
+
+    /**
+     * 7#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
+     */
+    private Long pipe07;
+
+    /**
+     * 8#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
+     */
+    private Long pipe08;
+
+    /**
+     * 9#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
+     */
+    private Long pipe09;
+
+    /**
+     * 10#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
+     */
+    private Long pipe10;
+
+    /**
+     * 11#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
+     */
+    private Long pipe11;
+
+    /**
+     * 12#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
+     */
+    private Long pipe12;
+
+    /**
+     * 鍠備笣鏈虹姸鎬� 1-杩炴帴 0-鏂紑
+     */
+    private Long wsjState;
+
+    /**
+     * 鐝
+     */
+    private Long shift;
+
+    /**
+     * 鏈哄彴
+     */
+    private Long equNo;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+
+}
diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/domain/bo/StoreSilkInfoBo.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/domain/bo/StoreSilkInfoBo.java
new file mode 100644
index 0000000..23a5268
--- /dev/null
+++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/domain/bo/StoreSilkInfoBo.java
@@ -0,0 +1,84 @@
+package org.dromara.analy.domain.bo;
+
+import org.dromara.analy.domain.StoreSilkInfo;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 鍌ㄤ笣鏌滀骇閲忎笟鍔″璞� oracle_store_silk
+ *
+ * @author zhuguifei
+ * @date 2026-03-02
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = StoreSilkInfo.class, reverseConvertGenerate = false)
+public class StoreSilkInfoBo extends BaseEntity {
+
+    /**
+     * id
+     */
+    @NotNull(message = "id涓嶈兘涓虹┖", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 鐗屽彿
+     */
+    @NotBlank(message = "鐗屽彿涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String materialname;
+
+    /**
+     * 鎵规鍙�
+     */
+    @NotBlank(message = "鎵规鍙蜂笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+    private String batchcode;
+
+    /**
+     * 鎶曟枡鏃ユ湡
+     */
+    private Date actualstarttime;
+
+    /**
+     * 鎶曟枡閲嶉噺
+     */
+    private Long jobinput;
+
+    /**
+     * 鎹熻�楅噸閲�
+     */
+    private Long weightloss;
+
+    /**
+     * 鍑哄彾涓濈巼
+     */
+    private Long slkrate;
+
+    /**
+     * 鍌ㄤ笣鏌滈噸閲�
+     */
+    private Long weight;
+
+    /**
+     * 鍌ㄤ笣鏌滃嚭鏂欏紑濮嬫椂闂�
+     */
+    private Date distimebegin;
+
+    /**
+     * 鍌ㄤ笣鏌滃嚭鏂欑粨鏉熸椂闂�
+     */
+    private Date distimeend;
+
+    /**
+     * 鏌滃瓙鍙�(鏈綅)
+     */
+    private String siloid;
+
+
+}
diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/domain/vo/FeedmatchTimeDataVo.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/domain/vo/FeedmatchTimeDataVo.java
new file mode 100644
index 0000000..a34f951
--- /dev/null
+++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/domain/vo/FeedmatchTimeDataVo.java
@@ -0,0 +1,196 @@
+package org.dromara.analy.domain.vo;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.analy.domain.FeedmatchTimeData;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 鍠備笣鏈哄搴斿叧绯昏鍥惧璞� feedmatch_time_data
+ *
+ * @author zhuguifei
+ * @date 2026-03-02
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = FeedmatchTimeData.class)
+public class FeedmatchTimeDataVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 鏃堕棿鎴�
+     */
+    @ExcelProperty(value = "鏃堕棿鎴�")
+    private Date time;
+
+    /**
+     * 鐝+鏈哄彴
+     */
+    @ExcelProperty(value = "鐝+鏈哄彴")
+    private String key;
+
+    /**
+     * 鏁版嵁鏇存柊鏃堕棿
+     */
+    @ExcelProperty(value = "鏁版嵁鏇存柊鏃堕棿")
+    private String dacUpTime;
+
+    /**
+     * 1#鍠備笣鏈哄搴旂殑绗竴涓偍涓濇煖
+     */
+    @ExcelProperty(value = "1#鍠備笣鏈哄搴旂殑绗竴涓偍涓濇煖")
+    private String fs11;
+
+    /**
+     * 1#鍠備笣鏈哄搴旂殑绗簩涓偍涓濇煖
+     */
+    @ExcelProperty(value = "1#鍠備笣鏈哄搴旂殑绗簩涓偍涓濇煖")
+    private String fs12;
+
+    /**
+     * 2#鍠備笣鏈哄搴旂殑绗竴涓偍涓濇煖
+     */
+    @ExcelProperty(value = "2#鍠備笣鏈哄搴旂殑绗竴涓偍涓濇煖")
+    private String fs21;
+
+    /**
+     * 2#鍠備笣鏈哄搴旂殑绗簩涓偍涓濇煖
+     */
+    @ExcelProperty(value = "2#鍠備笣鏈哄搴旂殑绗簩涓偍涓濇煖")
+    private String fs22;
+
+    /**
+     * 3#鍠備笣鏈哄搴旂殑绗竴涓偍涓濇煖
+     */
+    @ExcelProperty(value = "3#鍠備笣鏈哄搴旂殑绗竴涓偍涓濇煖")
+    private String fs31;
+
+    /**
+     * 3#鍠備笣鏈哄搴旂殑绗簩涓偍涓濇煖
+     */
+    @ExcelProperty(value = "3#鍠備笣鏈哄搴旂殑绗簩涓偍涓濇煖")
+    private String fs32;
+
+    /**
+     * 4#鍠備笣鏈哄搴旂殑绗竴涓偍涓濇煖
+     */
+    @ExcelProperty(value = "4#鍠備笣鏈哄搴旂殑绗竴涓偍涓濇煖")
+    private String fs41;
+
+    /**
+     * 4#鍠備笣鏈哄搴旂殑绗簩涓偍涓濇煖
+     */
+    @ExcelProperty(value = "4#鍠備笣鏈哄搴旂殑绗簩涓偍涓濇煖")
+    private String fs42;
+
+    /**
+     * 1#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
+     */
+    @ExcelProperty(value = "1#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�")
+    private Long pipe01;
+
+    /**
+     * 2#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
+     */
+    @ExcelProperty(value = "2#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�")
+    private Long pipe02;
+
+    /**
+     * 3#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
+     */
+    @ExcelProperty(value = "3#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�")
+    private Long pipe03;
+
+    /**
+     * 4#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
+     */
+    @ExcelProperty(value = "4#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�")
+    private Long pipe04;
+
+    /**
+     * 5#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
+     */
+    @ExcelProperty(value = "5#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�")
+    private Long pipe05;
+
+    /**
+     * 6#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
+     */
+    @ExcelProperty(value = "6#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�")
+    private Long pipe06;
+
+    /**
+     * 7#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
+     */
+    @ExcelProperty(value = "7#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�")
+    private Long pipe07;
+
+    /**
+     * 8#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
+     */
+    @ExcelProperty(value = "8#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�")
+    private Long pipe08;
+
+    /**
+     * 9#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
+     */
+    @ExcelProperty(value = "9#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�")
+    private Long pipe09;
+
+    /**
+     * 10#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
+     */
+    @ExcelProperty(value = "10#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�")
+    private Long pipe10;
+
+    /**
+     * 11#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
+     */
+    @ExcelProperty(value = "11#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�")
+    private Long pipe11;
+
+    /**
+     * 12#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�
+     */
+    @ExcelProperty(value = "12#鏈虹粍瀵瑰簲鐨勫杺涓濇満鍜岀閬�")
+    private Long pipe12;
+
+    /**
+     * 鍠備笣鏈虹姸鎬� 1-杩炴帴 0-鏂紑
+     */
+    @ExcelProperty(value = "鍠備笣鏈虹姸鎬� 1-杩炴帴 0-鏂紑")
+    private Long wsjState;
+
+    /**
+     * 鐝
+     */
+    @ExcelProperty(value = "鐝")
+    private Long shift;
+
+    /**
+     * 鏈哄彴
+     */
+    @ExcelProperty(value = "鏈哄彴")
+    private Long equNo;
+
+    /**
+     * 澶囨敞
+     */
+    @ExcelProperty(value = "澶囨敞")
+    private String remark;
+
+
+}
diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/domain/vo/StoreSilkInfoVo.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/domain/vo/StoreSilkInfoVo.java
new file mode 100644
index 0000000..0622110
--- /dev/null
+++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/domain/vo/StoreSilkInfoVo.java
@@ -0,0 +1,100 @@
+package org.dromara.analy.domain.vo;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.analy.domain.StoreSilkInfo;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 鍌ㄤ笣鏌滀骇閲忚鍥惧璞� oracle_store_silk
+ *
+ * @author zhuguifei
+ * @date 2026-03-02
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = StoreSilkInfo.class)
+public class StoreSilkInfoVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @ExcelProperty(value = "id")
+    private Long id;
+
+    /**
+     * 鐗屽彿
+     */
+    @ExcelProperty(value = "鐗屽彿")
+    private String materialname;
+
+    /**
+     * 鎵规鍙�
+     */
+    @ExcelProperty(value = "鎵规鍙�")
+    private String batchcode;
+
+    /**
+     * 鎶曟枡鏃ユ湡
+     */
+    @ExcelProperty(value = "鎶曟枡鏃ユ湡")
+    private Date actualstarttime;
+
+    /**
+     * 鎶曟枡閲嶉噺
+     */
+    @ExcelProperty(value = "鎶曟枡閲嶉噺")
+    private Long jobinput;
+
+    /**
+     * 鎹熻�楅噸閲�
+     */
+    @ExcelProperty(value = "鎹熻�楅噸閲�")
+    private Long weightloss;
+
+    /**
+     * 鍑哄彾涓濈巼
+     */
+    @ExcelProperty(value = "鍑哄彾涓濈巼")
+    private Long slkrate;
+
+    /**
+     * 鍌ㄤ笣鏌滈噸閲�
+     */
+    @ExcelProperty(value = "鍌ㄤ笣鏌滈噸閲�")
+    private Long weight;
+
+    /**
+     * 鍌ㄤ笣鏌滃嚭鏂欏紑濮嬫椂闂�
+     */
+    @ExcelProperty(value = "鍌ㄤ笣鏌滃嚭鏂欏紑濮嬫椂闂�")
+    private Date distimebegin;
+
+    /**
+     * 鍌ㄤ笣鏌滃嚭鏂欑粨鏉熸椂闂�
+     */
+    @ExcelProperty(value = "鍌ㄤ笣鏌滃嚭鏂欑粨鏉熸椂闂�")
+    private Date distimeend;
+
+    /**
+     * 鏌滃瓙鍙�(鏈綅)
+     */
+    @ExcelProperty(value = "鏌滃瓙鍙�(鏈綅)")
+    private String siloid;
+
+
+}
diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/mapper/FeedmatchTimeDataMapper.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/mapper/FeedmatchTimeDataMapper.java
new file mode 100644
index 0000000..94940e1
--- /dev/null
+++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/mapper/FeedmatchTimeDataMapper.java
@@ -0,0 +1,15 @@
+package org.dromara.analy.mapper;
+
+import org.dromara.analy.domain.FeedmatchTimeData;
+import org.dromara.analy.domain.vo.FeedmatchTimeDataVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 鍠備笣鏈哄搴斿叧绯籑apper鎺ュ彛
+ *
+ * @author zhuguifei
+ * @date 2026-03-02
+ */
+public interface FeedmatchTimeDataMapper extends BaseMapperPlus<FeedmatchTimeData, FeedmatchTimeDataVo> {
+
+}
diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/mapper/StoreSilkInfoMapper.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/mapper/StoreSilkInfoMapper.java
new file mode 100644
index 0000000..c988c3b
--- /dev/null
+++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/mapper/StoreSilkInfoMapper.java
@@ -0,0 +1,15 @@
+package org.dromara.analy.mapper;
+
+import org.dromara.analy.domain.StoreSilkInfo;
+import org.dromara.analy.domain.vo.StoreSilkInfoVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 鍌ㄤ笣鏌滀骇閲廙apper鎺ュ彛
+ *
+ * @author zhuguifei
+ * @date 2026-03-02
+ */
+public interface StoreSilkInfoMapper extends BaseMapperPlus<StoreSilkInfo, StoreSilkInfoVo> {
+
+}
diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/service/IFeedmatchTimeDataService.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/service/IFeedmatchTimeDataService.java
new file mode 100644
index 0000000..aadf438
--- /dev/null
+++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/service/IFeedmatchTimeDataService.java
@@ -0,0 +1,69 @@
+package org.dromara.analy.service;
+
+import org.dromara.analy.domain.vo.FeedmatchTimeDataVo;
+import org.dromara.analy.domain.bo.FeedmatchTimeDataBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 鍠備笣鏈哄搴斿叧绯籗ervice鎺ュ彛
+ *
+ * @author zhuguifei
+ * @date 2026-03-02
+ */
+public interface IFeedmatchTimeDataService {
+
+    /**
+     * 鏌ヨ鍠備笣鏈哄搴斿叧绯�
+     *
+     * @param time 涓婚敭
+     * @return 鍠備笣鏈哄搴斿叧绯�
+     */
+    FeedmatchTimeDataVo queryById(Date time);
+
+    /**
+     * 鍒嗛〉鏌ヨ鍠備笣鏈哄搴斿叧绯诲垪琛�
+     *
+     * @param bo        鏌ヨ鏉′欢
+     * @param pageQuery 鍒嗛〉鍙傛暟
+     * @return 鍠備笣鏈哄搴斿叧绯诲垎椤靛垪琛�
+     */
+    TableDataInfo<FeedmatchTimeDataVo> queryPageList(FeedmatchTimeDataBo bo, PageQuery pageQuery);
+
+    /**
+     * 鏌ヨ绗﹀悎鏉′欢鐨勫杺涓濇満瀵瑰簲鍏崇郴鍒楄〃
+     *
+     * @param bo 鏌ヨ鏉′欢
+     * @return 鍠備笣鏈哄搴斿叧绯诲垪琛�
+     */
+    List<FeedmatchTimeDataVo> queryList(FeedmatchTimeDataBo bo);
+
+    /**
+     * 鏂板鍠備笣鏈哄搴斿叧绯�
+     *
+     * @param bo 鍠備笣鏈哄搴斿叧绯�
+     * @return 鏄惁鏂板鎴愬姛
+     */
+    Boolean insertByBo(FeedmatchTimeDataBo bo);
+
+    /**
+     * 淇敼鍠備笣鏈哄搴斿叧绯�
+     *
+     * @param bo 鍠備笣鏈哄搴斿叧绯�
+     * @return 鏄惁淇敼鎴愬姛
+     */
+    Boolean updateByBo(FeedmatchTimeDataBo bo);
+
+    /**
+     * 鏍¢獙骞舵壒閲忓垹闄ゅ杺涓濇満瀵瑰簲鍏崇郴淇℃伅
+     *
+     * @param ids     寰呭垹闄ょ殑涓婚敭闆嗗悎
+     * @param isValid 鏄惁杩涜鏈夋晥鎬ф牎楠�
+     * @return 鏄惁鍒犻櫎鎴愬姛
+     */
+    Boolean deleteWithValidByIds(Collection<Date> ids, Boolean isValid);
+}
diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/service/IStoreSilkInfoService.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/service/IStoreSilkInfoService.java
new file mode 100644
index 0000000..10c5157
--- /dev/null
+++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/service/IStoreSilkInfoService.java
@@ -0,0 +1,68 @@
+package org.dromara.analy.service;
+
+import org.dromara.analy.domain.vo.StoreSilkInfoVo;
+import org.dromara.analy.domain.bo.StoreSilkInfoBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 鍌ㄤ笣鏌滀骇閲廠ervice鎺ュ彛
+ *
+ * @author zhuguifei
+ * @date 2026-03-02
+ */
+public interface IStoreSilkInfoService {
+
+    /**
+     * 鏌ヨ鍌ㄤ笣鏌滀骇閲�
+     *
+     * @param id 涓婚敭
+     * @return 鍌ㄤ笣鏌滀骇閲�
+     */
+    StoreSilkInfoVo queryById(Long id);
+
+    /**
+     * 鍒嗛〉鏌ヨ鍌ㄤ笣鏌滀骇閲忓垪琛�
+     *
+     * @param bo        鏌ヨ鏉′欢
+     * @param pageQuery 鍒嗛〉鍙傛暟
+     * @return 鍌ㄤ笣鏌滀骇閲忓垎椤靛垪琛�
+     */
+    TableDataInfo<StoreSilkInfoVo> queryPageList(StoreSilkInfoBo bo, PageQuery pageQuery);
+
+    /**
+     * 鏌ヨ绗﹀悎鏉′欢鐨勫偍涓濇煖浜ч噺鍒楄〃
+     *
+     * @param bo 鏌ヨ鏉′欢
+     * @return 鍌ㄤ笣鏌滀骇閲忓垪琛�
+     */
+    List<StoreSilkInfoVo> queryList(StoreSilkInfoBo bo);
+
+    /**
+     * 鏂板鍌ㄤ笣鏌滀骇閲�
+     *
+     * @param bo 鍌ㄤ笣鏌滀骇閲�
+     * @return 鏄惁鏂板鎴愬姛
+     */
+    Boolean insertByBo(StoreSilkInfoBo bo);
+
+    /**
+     * 淇敼鍌ㄤ笣鏌滀骇閲�
+     *
+     * @param bo 鍌ㄤ笣鏌滀骇閲�
+     * @return 鏄惁淇敼鎴愬姛
+     */
+    Boolean updateByBo(StoreSilkInfoBo bo);
+
+    /**
+     * 鏍¢獙骞舵壒閲忓垹闄ゅ偍涓濇煖浜ч噺淇℃伅
+     *
+     * @param ids     寰呭垹闄ょ殑涓婚敭闆嗗悎
+     * @param isValid 鏄惁杩涜鏈夋晥鎬ф牎楠�
+     * @return 鏄惁鍒犻櫎鎴愬姛
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}
diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/service/impl/FeedmatchTimeDataServiceImpl.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/service/impl/FeedmatchTimeDataServiceImpl.java
new file mode 100644
index 0000000..6169935
--- /dev/null
+++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/service/impl/FeedmatchTimeDataServiceImpl.java
@@ -0,0 +1,133 @@
+package org.dromara.analy.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.analy.domain.bo.FeedmatchTimeDataBo;
+import org.dromara.analy.domain.vo.FeedmatchTimeDataVo;
+import org.dromara.analy.domain.FeedmatchTimeData;
+import org.dromara.analy.mapper.FeedmatchTimeDataMapper;
+import org.dromara.analy.service.IFeedmatchTimeDataService;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 鍠備笣鏈哄搴斿叧绯籗ervice涓氬姟灞傚鐞�
+ *
+ * @author zhuguifei
+ * @date 2026-03-02
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class FeedmatchTimeDataServiceImpl implements IFeedmatchTimeDataService {
+
+    private final FeedmatchTimeDataMapper baseMapper;
+
+    /**
+     * 鏌ヨ鍠備笣鏈哄搴斿叧绯�
+     *
+     * @param time 涓婚敭
+     * @return 鍠備笣鏈哄搴斿叧绯�
+     */
+    @Override
+    public FeedmatchTimeDataVo queryById(Date time){
+        return baseMapper.selectVoById(time);
+    }
+
+    /**
+     * 鍒嗛〉鏌ヨ鍠備笣鏈哄搴斿叧绯诲垪琛�
+     *
+     * @param bo        鏌ヨ鏉′欢
+     * @param pageQuery 鍒嗛〉鍙傛暟
+     * @return 鍠備笣鏈哄搴斿叧绯诲垎椤靛垪琛�
+     */
+    @Override
+    public TableDataInfo<FeedmatchTimeDataVo> queryPageList(FeedmatchTimeDataBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<FeedmatchTimeData> lqw = buildQueryWrapper(bo);
+        Page<FeedmatchTimeDataVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 鏌ヨ绗﹀悎鏉′欢鐨勫杺涓濇満瀵瑰簲鍏崇郴鍒楄〃
+     *
+     * @param bo 鏌ヨ鏉′欢
+     * @return 鍠備笣鏈哄搴斿叧绯诲垪琛�
+     */
+    @Override
+    public List<FeedmatchTimeDataVo> queryList(FeedmatchTimeDataBo bo) {
+        LambdaQueryWrapper<FeedmatchTimeData> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<FeedmatchTimeData> buildQueryWrapper(FeedmatchTimeDataBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<FeedmatchTimeData> lqw = Wrappers.lambdaQuery();
+        lqw.eq(bo.getTime() != null, FeedmatchTimeData::getTime, bo.getTime());
+        lqw.eq(StringUtils.isNotBlank(bo.getKey()), FeedmatchTimeData::getKey, bo.getKey());
+        return lqw;
+    }
+
+    /**
+     * 鏂板鍠備笣鏈哄搴斿叧绯�
+     *
+     * @param bo 鍠備笣鏈哄搴斿叧绯�
+     * @return 鏄惁鏂板鎴愬姛
+     */
+    @Override
+    public Boolean insertByBo(FeedmatchTimeDataBo bo) {
+        FeedmatchTimeData add = MapstructUtils.convert(bo, FeedmatchTimeData.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setTime(add.getTime());
+        }
+        return flag;
+    }
+
+    /**
+     * 淇敼鍠備笣鏈哄搴斿叧绯�
+     *
+     * @param bo 鍠備笣鏈哄搴斿叧绯�
+     * @return 鏄惁淇敼鎴愬姛
+     */
+    @Override
+    public Boolean updateByBo(FeedmatchTimeDataBo bo) {
+        FeedmatchTimeData update = MapstructUtils.convert(bo, FeedmatchTimeData.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
+     */
+    private void validEntityBeforeSave(FeedmatchTimeData entity){
+        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
+    }
+
+    /**
+     * 鏍¢獙骞舵壒閲忓垹闄ゅ杺涓濇満瀵瑰簲鍏崇郴淇℃伅
+     *
+     * @param ids     寰呭垹闄ょ殑涓婚敭闆嗗悎
+     * @param isValid 鏄惁杩涜鏈夋晥鎬ф牎楠�
+     * @return 鏄惁鍒犻櫎鎴愬姛
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Date> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}
diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/service/impl/StoreSilkInfoServiceImpl.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/service/impl/StoreSilkInfoServiceImpl.java
new file mode 100644
index 0000000..389179e
--- /dev/null
+++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/analy/service/impl/StoreSilkInfoServiceImpl.java
@@ -0,0 +1,156 @@
+package org.dromara.analy.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.analy.domain.bo.StoreSilkInfoBo;
+import org.dromara.analy.domain.vo.StoreSilkInfoVo;
+import org.dromara.analy.domain.StoreSilkInfo;
+import org.dromara.analy.mapper.StoreSilkInfoMapper;
+import org.dromara.analy.service.IStoreSilkInfoService;
+import org.dromara.analy.mapper.FeedmatchTimeDataMapper;
+import org.dromara.analy.domain.FeedmatchTimeData;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+import java.util.HashMap;
+
+/**
+ * 鍌ㄤ笣鏌滀骇閲廠ervice涓氬姟灞傚鐞�
+ *
+ * @author zhuguifei
+ * @date 2026-03-02
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class StoreSilkInfoServiceImpl implements IStoreSilkInfoService {
+
+    private final StoreSilkInfoMapper baseMapper;
+    private final FeedmatchTimeDataMapper feedmatchTimeDataMapper;
+
+    /**
+     * 鏌ヨ鍌ㄤ笣鏌滀骇閲�
+     *
+     * @param id 涓婚敭
+     * @return 鍌ㄤ笣鏌滀骇閲�
+     */
+    @Override
+    public StoreSilkInfoVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 鍒嗛〉鏌ヨ鍌ㄤ笣鏌滀骇閲忓垪琛�
+     *
+     * @param bo        鏌ヨ鏉′欢
+     * @param pageQuery 鍒嗛〉鍙傛暟
+     * @return 鍌ㄤ笣鏌滀骇閲忓垎椤靛垪琛�
+     */
+    @Override
+    public TableDataInfo<StoreSilkInfoVo> queryPageList(StoreSilkInfoBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<StoreSilkInfo> lqw = buildQueryWrapper(bo);
+        Page<StoreSilkInfoVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+
+        queryFeedmatchData(result);
+        return TableDataInfo.build(result);
+    }
+ 
+    private void queryFeedmatchData(Page<StoreSilkInfoVo> page) {
+        if (page == null || page.getRecords() == null || page.getRecords().isEmpty()) {
+            return;
+        }
+        List<StoreSilkInfoVo> storeSilkInfoList = page.getRecords();
+
+        for (int i = 0; i < storeSilkInfoList.size(); i++) {
+            StoreSilkInfoVo storeSilkInfoVo = storeSilkInfoList.get(i);
+
+        }
+
+    }
+
+    /**
+     * 鏌ヨ绗﹀悎鏉′欢鐨勫偍涓濇煖浜ч噺鍒楄〃
+     *
+     * @param bo 鏌ヨ鏉′欢
+     * @return 鍌ㄤ笣鏌滀骇閲忓垪琛�
+     */
+    @Override
+    public List<StoreSilkInfoVo> queryList(StoreSilkInfoBo bo) {
+        LambdaQueryWrapper<StoreSilkInfo> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<StoreSilkInfo> buildQueryWrapper(StoreSilkInfoBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<StoreSilkInfo> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(StoreSilkInfo::getId);
+        lqw.like(StringUtils.isNotBlank(bo.getMaterialname()), StoreSilkInfo::getMaterialname, bo.getMaterialname());
+        lqw.eq(StringUtils.isNotBlank(bo.getBatchcode()), StoreSilkInfo::getBatchcode, bo.getBatchcode());
+        lqw.eq(bo.getActualstarttime() != null, StoreSilkInfo::getActualstarttime, bo.getActualstarttime());
+        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());
+        return lqw;
+    }
+
+    /**
+     * 鏂板鍌ㄤ笣鏌滀骇閲�
+     *
+     * @param bo 鍌ㄤ笣鏌滀骇閲�
+     * @return 鏄惁鏂板鎴愬姛
+     */
+    @Override
+    public Boolean insertByBo(StoreSilkInfoBo bo) {
+        StoreSilkInfo add = MapstructUtils.convert(bo, StoreSilkInfo.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 淇敼鍌ㄤ笣鏌滀骇閲�
+     *
+     * @param bo 鍌ㄤ笣鏌滀骇閲�
+     * @return 鏄惁淇敼鎴愬姛
+     */
+    @Override
+    public Boolean updateByBo(StoreSilkInfoBo bo) {
+        StoreSilkInfo update = MapstructUtils.convert(bo, StoreSilkInfo.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
+     */
+    private void validEntityBeforeSave(StoreSilkInfo entity){
+        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
+    }
+
+    /**
+     * 鏍¢獙骞舵壒閲忓垹闄ゅ偍涓濇煖浜ч噺淇℃伅
+     *
+     * @param ids     寰呭垹闄ょ殑涓婚敭闆嗗悎
+     * @param isValid 鏄惁杩涜鏈夋晥鎬ф牎楠�
+     * @return 鏄惁鍒犻櫎鎴愬姛
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}
diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/md/controller/MdShiftController.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/md/controller/MdShiftController.java
new file mode 100644
index 0000000..72bc5f6
--- /dev/null
+++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/md/controller/MdShiftController.java
@@ -0,0 +1,105 @@
+package org.dromara.md.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.md.domain.vo.MdShiftVo;
+import org.dromara.md.domain.bo.MdShiftBo;
+import org.dromara.md.service.IMdShiftService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 鐝
+ *
+ * @author zhuguifei
+ * @date 2026-03-04
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/md/shift")
+public class MdShiftController extends BaseController {
+
+    private final IMdShiftService mdShiftService;
+
+    /**
+     * 鏌ヨ鐝鍒楄〃
+     */
+    @SaCheckPermission("md:shift:list")
+    @GetMapping("/list")
+    public TableDataInfo<MdShiftVo> list(MdShiftBo bo, PageQuery pageQuery) {
+        return mdShiftService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 瀵煎嚭鐝鍒楄〃
+     */
+    @SaCheckPermission("md:shift:export")
+    @Log(title = "鐝", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(MdShiftBo bo, HttpServletResponse response) {
+        List<MdShiftVo> list = mdShiftService.queryList(bo);
+        ExcelUtil.exportExcel(list, "鐝", MdShiftVo.class, response);
+    }
+
+    /**
+     * 鑾峰彇鐝璇︾粏淇℃伅
+     *
+     * @param id 涓婚敭
+     */
+    @SaCheckPermission("md:shift:query")
+    @GetMapping("/{id}")
+    public R<MdShiftVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
+                                     @PathVariable String id) {
+        return R.ok(mdShiftService.queryById(id));
+    }
+
+    /**
+     * 鏂板鐝
+     */
+    @SaCheckPermission("md:shift:add")
+    @Log(title = "鐝", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody MdShiftBo bo) {
+        return toAjax(mdShiftService.insertByBo(bo));
+    }
+
+    /**
+     * 淇敼鐝
+     */
+    @SaCheckPermission("md:shift:edit")
+    @Log(title = "鐝", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody MdShiftBo bo) {
+        return toAjax(mdShiftService.updateByBo(bo));
+    }
+
+    /**
+     * 鍒犻櫎鐝
+     *
+     * @param ids 涓婚敭涓�
+     */
+    @SaCheckPermission("md:shift:remove")
+    @Log(title = "鐝", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
+                          @PathVariable String[] ids) {
+        return toAjax(mdShiftService.deleteWithValidByIds(List.of(ids), true));
+    }
+}
diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/md/domain/MdShift.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/md/domain/MdShift.java
new file mode 100644
index 0000000..2c40db0
--- /dev/null
+++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/md/domain/MdShift.java
@@ -0,0 +1,93 @@
+package org.dromara.md.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serial;
+
+/**
+ * 鐝瀵硅薄 MD_SHIFT
+ *
+ * @author zhuguifei
+ * @date 2026-03-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("MD_SHIFT")
+public class MdShift extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ud
+     */
+    @TableId(value = "ID")
+    private String id;
+
+    /**
+     * 杞﹂棿澶栭敭
+     */
+    private String wsId;
+
+    /**
+     * 缂栫爜
+     */
+    private String code;
+
+    /**
+     * 鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 鐝寮�濮嬫椂闂�
+     */
+    private String stim;
+
+    /**
+     * 鐝缁撴潫鏃堕棿
+     */
+    private String etim;
+
+    /**
+     * 鎺掑簭
+     */
+    private Long seq;
+
+    /**
+     * 鍚敤
+     */
+    private Long enable;
+
+    /**
+     * 鍒犻櫎
+     */
+    private Long del;
+
+    /**
+     * 鍒涘缓鐢ㄦ埛
+     */
+    private String createUserName;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Date createUserTime;
+
+    /**
+     * 鏇存柊鐢ㄦ埛
+     */
+    private String updateUserName;
+
+    /**
+     * 鏇存柊鏃堕棿
+     */
+    private Date updateUserTime;
+
+
+}
diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/md/domain/bo/MdShiftBo.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/md/domain/bo/MdShiftBo.java
new file mode 100644
index 0000000..8e19413
--- /dev/null
+++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/md/domain/bo/MdShiftBo.java
@@ -0,0 +1,92 @@
+package org.dromara.md.domain.bo;
+
+import org.dromara.md.domain.MdShift;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 鐝涓氬姟瀵硅薄 MD_SHIFT
+ *
+ * @author zhuguifei
+ * @date 2026-03-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = MdShift.class, reverseConvertGenerate = false)
+public class MdShiftBo extends BaseEntity {
+
+    /**
+     * ud
+     */
+    @NotBlank(message = "ud涓嶈兘涓虹┖", groups = { EditGroup.class })
+    private String id;
+
+    /**
+     * 杞﹂棿澶栭敭
+     */
+    private String wsId;
+
+    /**
+     * 缂栫爜
+     */
+    private String code;
+
+    /**
+     * 鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 鐝寮�濮嬫椂闂�
+     */
+    private String stim;
+
+    /**
+     * 鐝缁撴潫鏃堕棿
+     */
+    private String etim;
+
+    /**
+     * 鎺掑簭
+     */
+    private Long seq;
+
+    /**
+     * 鍚敤
+     */
+    private Long enable;
+
+    /**
+     * 鍒犻櫎
+     */
+    private Long del;
+
+    /**
+     * 鍒涘缓鐢ㄦ埛
+     */
+    private String createUserName;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Date createUserTime;
+
+    /**
+     * 鏇存柊鐢ㄦ埛
+     */
+    private String updateUserName;
+
+    /**
+     * 鏇存柊鏃堕棿
+     */
+    private Date updateUserTime;
+
+
+}
diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/md/domain/vo/MdShiftVo.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/md/domain/vo/MdShiftVo.java
new file mode 100644
index 0000000..9d9e8cd
--- /dev/null
+++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/md/domain/vo/MdShiftVo.java
@@ -0,0 +1,112 @@
+package org.dromara.md.domain.vo;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.md.domain.MdShift;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 鐝瑙嗗浘瀵硅薄 MD_SHIFT
+ *
+ * @author zhuguifei
+ * @date 2026-03-04
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = MdShift.class)
+public class MdShiftVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ud
+     */
+    @ExcelProperty(value = "ud")
+    private String id;
+
+    /**
+     * 杞﹂棿澶栭敭
+     */
+    @ExcelProperty(value = "杞﹂棿澶栭敭")
+    private String wsId;
+
+    /**
+     * 缂栫爜
+     */
+    @ExcelProperty(value = "缂栫爜")
+    private String code;
+
+    /**
+     * 鍚嶇О
+     */
+    @ExcelProperty(value = "鍚嶇О")
+    private String name;
+
+    /**
+     * 鐝寮�濮嬫椂闂�
+     */
+    @ExcelProperty(value = "鐝寮�濮嬫椂闂�")
+    private String stim;
+
+    /**
+     * 鐝缁撴潫鏃堕棿
+     */
+    @ExcelProperty(value = "鐝缁撴潫鏃堕棿")
+    private String etim;
+
+    /**
+     * 鎺掑簭
+     */
+    @ExcelProperty(value = "鎺掑簭")
+    private Long seq;
+
+    /**
+     * 鍚敤
+     */
+    @ExcelProperty(value = "鍚敤")
+    private Long enable;
+
+    /**
+     * 鍒犻櫎
+     */
+    @ExcelProperty(value = "鍒犻櫎")
+    private Long del;
+
+    /**
+     * 鍒涘缓鐢ㄦ埛
+     */
+    @ExcelProperty(value = "鍒涘缓鐢ㄦ埛")
+    private String createUserName;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    @ExcelProperty(value = "鍒涘缓鏃堕棿")
+    private Date createUserTime;
+
+    /**
+     * 鏇存柊鐢ㄦ埛
+     */
+    @ExcelProperty(value = "鏇存柊鐢ㄦ埛")
+    private String updateUserName;
+
+    /**
+     * 鏇存柊鏃堕棿
+     */
+    @ExcelProperty(value = "鏇存柊鏃堕棿")
+    private Date updateUserTime;
+
+
+}
diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/md/mapper/MdShiftMapper.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/md/mapper/MdShiftMapper.java
new file mode 100644
index 0000000..836d099
--- /dev/null
+++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/md/mapper/MdShiftMapper.java
@@ -0,0 +1,15 @@
+package org.dromara.md.mapper;
+
+import org.dromara.md.domain.MdShift;
+import org.dromara.md.domain.vo.MdShiftVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 鐝Mapper鎺ュ彛
+ *
+ * @author zhuguifei
+ * @date 2026-03-04
+ */
+public interface MdShiftMapper extends BaseMapperPlus<MdShift, MdShiftVo> {
+
+}
diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/md/service/IMdShiftService.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/md/service/IMdShiftService.java
new file mode 100644
index 0000000..9d38f20
--- /dev/null
+++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/md/service/IMdShiftService.java
@@ -0,0 +1,68 @@
+package org.dromara.md.service;
+
+import org.dromara.md.domain.vo.MdShiftVo;
+import org.dromara.md.domain.bo.MdShiftBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 鐝Service鎺ュ彛
+ *
+ * @author zhuguifei
+ * @date 2026-03-04
+ */
+public interface IMdShiftService {
+
+    /**
+     * 鏌ヨ鐝
+     *
+     * @param id 涓婚敭
+     * @return 鐝
+     */
+    MdShiftVo queryById(String id);
+
+    /**
+     * 鍒嗛〉鏌ヨ鐝鍒楄〃
+     *
+     * @param bo        鏌ヨ鏉′欢
+     * @param pageQuery 鍒嗛〉鍙傛暟
+     * @return 鐝鍒嗛〉鍒楄〃
+     */
+    TableDataInfo<MdShiftVo> queryPageList(MdShiftBo bo, PageQuery pageQuery);
+
+    /**
+     * 鏌ヨ绗﹀悎鏉′欢鐨勭彮娆″垪琛�
+     *
+     * @param bo 鏌ヨ鏉′欢
+     * @return 鐝鍒楄〃
+     */
+    List<MdShiftVo> queryList(MdShiftBo bo);
+
+    /**
+     * 鏂板鐝
+     *
+     * @param bo 鐝
+     * @return 鏄惁鏂板鎴愬姛
+     */
+    Boolean insertByBo(MdShiftBo bo);
+
+    /**
+     * 淇敼鐝
+     *
+     * @param bo 鐝
+     * @return 鏄惁淇敼鎴愬姛
+     */
+    Boolean updateByBo(MdShiftBo bo);
+
+    /**
+     * 鏍¢獙骞舵壒閲忓垹闄ょ彮娆′俊鎭�
+     *
+     * @param ids     寰呭垹闄ょ殑涓婚敭闆嗗悎
+     * @param isValid 鏄惁杩涜鏈夋晥鎬ф牎楠�
+     * @return 鏄惁鍒犻櫎鎴愬姛
+     */
+    Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid);
+}
diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/md/service/impl/MdShiftServiceImpl.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/md/service/impl/MdShiftServiceImpl.java
new file mode 100644
index 0000000..8c697b5
--- /dev/null
+++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/md/service/impl/MdShiftServiceImpl.java
@@ -0,0 +1,134 @@
+package org.dromara.md.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.md.domain.bo.MdShiftBo;
+import org.dromara.md.domain.vo.MdShiftVo;
+import org.dromara.md.domain.MdShift;
+import org.dromara.md.mapper.MdShiftMapper;
+import org.dromara.md.service.IMdShiftService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 鐝Service涓氬姟灞傚鐞�
+ *
+ * @author zhuguifei
+ * @date 2026-03-04
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class MdShiftServiceImpl implements IMdShiftService {
+
+    private final MdShiftMapper baseMapper;
+
+    /**
+     * 鏌ヨ鐝
+     *
+     * @param id 涓婚敭
+     * @return 鐝
+     */
+    @Override
+    public MdShiftVo queryById(String id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 鍒嗛〉鏌ヨ鐝鍒楄〃
+     *
+     * @param bo        鏌ヨ鏉′欢
+     * @param pageQuery 鍒嗛〉鍙傛暟
+     * @return 鐝鍒嗛〉鍒楄〃
+     */
+    @Override
+    public TableDataInfo<MdShiftVo> queryPageList(MdShiftBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<MdShift> lqw = buildQueryWrapper(bo);
+        Page<MdShiftVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 鏌ヨ绗﹀悎鏉′欢鐨勭彮娆″垪琛�
+     *
+     * @param bo 鏌ヨ鏉′欢
+     * @return 鐝鍒楄〃
+     */
+    @Override
+    public List<MdShiftVo> queryList(MdShiftBo bo) {
+        LambdaQueryWrapper<MdShift> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<MdShift> buildQueryWrapper(MdShiftBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<MdShift> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(MdShift::getId);
+        lqw.eq(StringUtils.isNotBlank(bo.getCode()), MdShift::getCode, bo.getCode());
+        lqw.like(StringUtils.isNotBlank(bo.getName()), MdShift::getName, bo.getName());
+        lqw.eq(bo.getEnable() != null, MdShift::getEnable, bo.getEnable());
+        return lqw;
+    }
+
+    /**
+     * 鏂板鐝
+     *
+     * @param bo 鐝
+     * @return 鏄惁鏂板鎴愬姛
+     */
+    @Override
+    public Boolean insertByBo(MdShiftBo bo) {
+        MdShift add = MapstructUtils.convert(bo, MdShift.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 淇敼鐝
+     *
+     * @param bo 鐝
+     * @return 鏄惁淇敼鎴愬姛
+     */
+    @Override
+    public Boolean updateByBo(MdShiftBo bo) {
+        MdShift update = MapstructUtils.convert(bo, MdShift.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
+     */
+    private void validEntityBeforeSave(MdShift entity){
+        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
+    }
+
+    /**
+     * 鏍¢獙骞舵壒閲忓垹闄ょ彮娆′俊鎭�
+     *
+     * @param ids     寰呭垹闄ょ殑涓婚敭闆嗗悎
+     * @param isValid 鏄惁杩涜鏈夋晥鎬ф牎楠�
+     * @return 鏄惁鍒犻櫎鎴愬姛
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}
diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/resources/mapper/analy/FeedmatchTimeDataMapper.xml b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/resources/mapper/analy/FeedmatchTimeDataMapper.xml
new file mode 100644
index 0000000..2c37079
--- /dev/null
+++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/resources/mapper/analy/FeedmatchTimeDataMapper.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.analy.mapper.FeedmatchTimeDataMapper">
+</mapper>
diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/resources/mapper/analy/StoreSilkInfoMapper.xml b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/resources/mapper/analy/StoreSilkInfoMapper.xml
new file mode 100644
index 0000000..7ba13f7
--- /dev/null
+++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/resources/mapper/analy/StoreSilkInfoMapper.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.analy.mapper.StoreSilkInfoMapper">
+</mapper>
diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/resources/mapper/md/MdShiftMapper.xml b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/resources/mapper/md/MdShiftMapper.xml
new file mode 100644
index 0000000..552cf76
--- /dev/null
+++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/resources/mapper/md/MdShiftMapper.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.md.mapper.MdShiftMapper">
+</mapper>

--
Gitblit v1.9.3