From b24f6eca27214c54ea5df6d738a54889997fac2d Mon Sep 17 00:00:00 2001
From: Yangwl <1726150332@qq.com>
Date: Fri, 21 Mar 2025 18:26:24 +0800
Subject: [PATCH 1/2] =?UTF-8?q?=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?=
 =?UTF-8?q?=E5=90=8C=E6=AD=A5=E5=91=98=E5=B7=A5=E6=89=93=E5=8D=A1=E6=95=B0?=
 =?UTF-8?q?=E6=8D=AE=EF=BC=8C=E8=AE=BE=E5=A4=87=E6=A8=A1=E5=9D=97=E5=A2=9E?=
 =?UTF-8?q?=E5=8A=A0websocket=E5=92=8C=E5=89=8D=E7=AB=AF=E9=80=9A=E8=AE=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/op/system/api/RemoteUserService.java  |   4 +
 .../factory/RemoteUserFallbackFactory.java    |   5 +
 op-modules/op-device/pom.xml                  |   7 +
 .../java/com/op/device/DeviceApplication.java |   2 +
 .../com/op/device/domain/EquRepairOrder.java  |  11 ++
 .../device/mapper/EquRepairOrderMapper.java   |   7 +-
 .../op/device/schedul/MyWebSocketHandler.java |  48 ++++++
 .../impl/EquRepairOrderServiceImpl.java       |   1 +
 .../op/device/websocket/SemaphoreUtils.java   |  58 ++++++++
 .../op/device/websocket/WebSocketConfig.java  |  20 +++
 .../op/device/websocket/WebSocketServer.java  | 106 +++++++++++++
 .../op/device/websocket/WebSocketUsers.java   | 140 ++++++++++++++++++
 .../mapper/device/EquRepairOrderMapper.xml    |  10 ++
 .../src/main/java/com/op/job/task/RyTask.java |   5 +
 op-modules/op-system/pom.xml                  |   8 +
 .../system/controller/SysUserController.java  |   6 +-
 .../com/op/system/domain/MesClockRecord.java  |  94 ++++++++++++
 .../system/mapper/MesClockRecordMapper.java   |  66 +++++++++
 .../service/IMesClockRecordService.java       |  62 ++++++++
 .../op/system/service/ISysUserService.java    |   2 +
 .../impl/MesClockRecordServiceImpl.java       | 101 +++++++++++++
 .../service/impl/SysUserServiceImpl.java      |  87 ++++++++++-
 .../mapper/system/MesClockRecordMapper.xml    |  87 +++++++++++
 23 files changed, 927 insertions(+), 10 deletions(-)
 create mode 100644 op-modules/op-device/src/main/java/com/op/device/schedul/MyWebSocketHandler.java
 create mode 100644 op-modules/op-device/src/main/java/com/op/device/websocket/SemaphoreUtils.java
 create mode 100644 op-modules/op-device/src/main/java/com/op/device/websocket/WebSocketConfig.java
 create mode 100644 op-modules/op-device/src/main/java/com/op/device/websocket/WebSocketServer.java
 create mode 100644 op-modules/op-device/src/main/java/com/op/device/websocket/WebSocketUsers.java
 create mode 100644 op-modules/op-system/src/main/java/com/op/system/domain/MesClockRecord.java
 create mode 100644 op-modules/op-system/src/main/java/com/op/system/mapper/MesClockRecordMapper.java
 create mode 100644 op-modules/op-system/src/main/java/com/op/system/service/IMesClockRecordService.java
 create mode 100644 op-modules/op-system/src/main/java/com/op/system/service/impl/MesClockRecordServiceImpl.java
 create mode 100644 op-modules/op-system/src/main/resources/mapper/system/MesClockRecordMapper.xml

diff --git a/op-api/op-api-system/src/main/java/com/op/system/api/RemoteUserService.java b/op-api/op-api-system/src/main/java/com/op/system/api/RemoteUserService.java
index 06377cb3..ba4efd25 100644
--- a/op-api/op-api-system/src/main/java/com/op/system/api/RemoteUserService.java
+++ b/op-api/op-api-system/src/main/java/com/op/system/api/RemoteUserService.java
@@ -69,4 +69,8 @@ public interface RemoteUserService {
 	/**部门基础数据数据**/
 	@PostMapping("/dept/sysDeptInfoTask")
 	public R sysDeptInfoTask();
+
+	/**员工打卡数据**/
+	@PostMapping("/user/clockInRecord")
+	public R sysClockInRecord();
 }
diff --git a/op-api/op-api-system/src/main/java/com/op/system/api/factory/RemoteUserFallbackFactory.java b/op-api/op-api-system/src/main/java/com/op/system/api/factory/RemoteUserFallbackFactory.java
index 268de31e..c545a8e4 100644
--- a/op-api/op-api-system/src/main/java/com/op/system/api/factory/RemoteUserFallbackFactory.java
+++ b/op-api/op-api-system/src/main/java/com/op/system/api/factory/RemoteUserFallbackFactory.java
@@ -61,6 +61,11 @@ public class RemoteUserFallbackFactory implements FallbackFactory<RemoteUserServ
 			public R sysDeptInfoTask() {
 				return R.fail("hr人力资源基础数据-部门信息同步失败:"+throwable.getMessage());
 			}
+
+			@Override
+			public R sysClockInRecord() {
+				return R.fail("hr人力资源基础数据-员工考勤打卡信息同步失败:"+throwable.getMessage());
+			}
 		};
 	}
 }
diff --git a/op-modules/op-device/pom.xml b/op-modules/op-device/pom.xml
index e55b4858..494bb168 100644
--- a/op-modules/op-device/pom.xml
+++ b/op-modules/op-device/pom.xml
@@ -83,6 +83,13 @@
             <artifactId>op-common-swagger</artifactId>
         </dependency>
 
+        <!-- pom.xml -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-websocket</artifactId>
+        </dependency>
+
+
     </dependencies>
 
     <build>
diff --git a/op-modules/op-device/src/main/java/com/op/device/DeviceApplication.java b/op-modules/op-device/src/main/java/com/op/device/DeviceApplication.java
index dd898098..4509ade6 100644
--- a/op-modules/op-device/src/main/java/com/op/device/DeviceApplication.java
+++ b/op-modules/op-device/src/main/java/com/op/device/DeviceApplication.java
@@ -5,6 +5,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 import com.op.common.security.annotation.EnableCustomConfig;
 import com.op.common.security.annotation.EnableRyFeignClients;
 import com.op.common.swagger.annotation.EnableCustomSwagger2;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 /**
  * 系统模块
@@ -14,6 +15,7 @@ import com.op.common.swagger.annotation.EnableCustomSwagger2;
 @EnableCustomConfig
 @EnableCustomSwagger2
 @EnableRyFeignClients
+@EnableScheduling
 @SpringBootApplication
 public class DeviceApplication {
     public static void main(String[] args) {
diff --git a/op-modules/op-device/src/main/java/com/op/device/domain/EquRepairOrder.java b/op-modules/op-device/src/main/java/com/op/device/domain/EquRepairOrder.java
index 5e584ed7..7cd6a312 100644
--- a/op-modules/op-device/src/main/java/com/op/device/domain/EquRepairOrder.java
+++ b/op-modules/op-device/src/main/java/com/op/device/domain/EquRepairOrder.java
@@ -182,6 +182,7 @@ public class EquRepairOrder extends BaseEntity {
     @Excel(name = "审核意见")
     private String auditOpinion;
 
+
     /**
      * 计划维修时间
      */
@@ -268,6 +269,16 @@ public class EquRepairOrder extends BaseEntity {
     private String orderTimeStart;
     private String orderTimeEnd;
 
+    private Equipment equipment;
+
+    public Equipment getEquipment() {
+        return equipment;
+    }
+
+    public void setEquipment(Equipment equipment) {
+        this.equipment = equipment;
+    }
+
     //图片文件
     public String getFileList() {
         return fileList;
diff --git a/op-modules/op-device/src/main/java/com/op/device/mapper/EquRepairOrderMapper.java b/op-modules/op-device/src/main/java/com/op/device/mapper/EquRepairOrderMapper.java
index 9c075237..55ca833a 100644
--- a/op-modules/op-device/src/main/java/com/op/device/mapper/EquRepairOrderMapper.java
+++ b/op-modules/op-device/src/main/java/com/op/device/mapper/EquRepairOrderMapper.java
@@ -4,10 +4,7 @@ import java.util.List;
 
 import com.baomidou.dynamic.datasource.annotation.DS;
 import com.op.common.core.domain.BaseFileData;
-import com.op.device.domain.EquEquipment;
-import com.op.device.domain.EquFile;
-import com.op.device.domain.EquRepairOrder;
-import com.op.device.domain.EquTeamUser;
+import com.op.device.domain.*;
 import com.op.system.api.domain.SysNoticeGroup;
 import org.apache.ibatis.annotations.Param;
 
@@ -113,4 +110,6 @@ public interface EquRepairOrderMapper {
 
     //查询公告绑定的班组
     List<SysNoticeGroup> getNoticesGroup(SysNoticeGroup noticeQo);
+
+    Equipment selectEquInfoByequCode(Equipment equipment);
 }
diff --git a/op-modules/op-device/src/main/java/com/op/device/schedul/MyWebSocketHandler.java b/op-modules/op-device/src/main/java/com/op/device/schedul/MyWebSocketHandler.java
new file mode 100644
index 00000000..5dfb0e92
--- /dev/null
+++ b/op-modules/op-device/src/main/java/com/op/device/schedul/MyWebSocketHandler.java
@@ -0,0 +1,48 @@
+package com.op.device.schedul;
+
+import com.alibaba.fastjson2.JSON;
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
+import com.op.device.domain.EquRepairOrder;
+import com.op.device.domain.Equipment;
+import com.op.device.mapper.EquRepairOrderMapper;
+import com.op.device.service.IEquRepairOrderService;
+import com.op.device.websocket.WebSocketUsers;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+import org.springframework.web.socket.handler.TextWebSocketHandler;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Component
+@EnableScheduling
+public class MyWebSocketHandler extends TextWebSocketHandler {
+
+    @Autowired
+    private EquRepairOrderMapper equRepairOrderMapper;
+
+
+    @Scheduled(fixedRate = 10000) // 每60秒执行一次
+    @DS("ds_1000")
+    public void sendPeriodicMessages() {
+        EquRepairOrder equRepairOrder=new EquRepairOrder();
+        equRepairOrder.setOrderStatus("2");
+        List<EquRepairOrder> equRepairOrderList=equRepairOrderMapper.selectEquRepairOrderList(equRepairOrder);
+        Equipment equipment=new Equipment();
+        List<EquRepairOrder> equRepairOrders=new ArrayList<>();
+        for (EquRepairOrder repairOrder : equRepairOrderList)  {
+            equipment.setEquipmentCode(repairOrder.getEquipmentCode());
+            equipment=equRepairOrderMapper.selectEquInfoByequCode(equipment);
+            repairOrder.setEquipment(equipment);
+            equRepairOrders.add(repairOrder);
+        }
+        String jsonResult = JSON.toJSONString(equRepairOrders);
+        WebSocketUsers.sendMessageToUsersByText(jsonResult);
+
+    }
+}
diff --git a/op-modules/op-device/src/main/java/com/op/device/service/impl/EquRepairOrderServiceImpl.java b/op-modules/op-device/src/main/java/com/op/device/service/impl/EquRepairOrderServiceImpl.java
index 23528ba1..50b64e9f 100644
--- a/op-modules/op-device/src/main/java/com/op/device/service/impl/EquRepairOrderServiceImpl.java
+++ b/op-modules/op-device/src/main/java/com/op/device/service/impl/EquRepairOrderServiceImpl.java
@@ -603,4 +603,5 @@ public class EquRepairOrderServiceImpl implements IEquRepairOrderService {
     public List<EquEquipment> selectGroupLineList() {
         return equEquipmentMapper.selectEquipmentGroupLine();
     }
+
 }
diff --git a/op-modules/op-device/src/main/java/com/op/device/websocket/SemaphoreUtils.java b/op-modules/op-device/src/main/java/com/op/device/websocket/SemaphoreUtils.java
new file mode 100644
index 00000000..7d02c092
--- /dev/null
+++ b/op-modules/op-device/src/main/java/com/op/device/websocket/SemaphoreUtils.java
@@ -0,0 +1,58 @@
+package com.op.device.websocket;
+
+import java.util.concurrent.Semaphore;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * 信号量相关处理
+ *
+ * @author ruoyi
+ */
+public class SemaphoreUtils
+{
+    /**
+     * SemaphoreUtils 日志控制器
+     */
+    private static final Logger LOGGER = LoggerFactory.getLogger(SemaphoreUtils.class);
+
+    /**
+     * 获取信号量
+     *
+     * @param semaphore
+     * @return
+     */
+    public static boolean tryAcquire(Semaphore semaphore)
+    {
+        boolean flag = false;
+
+        try
+        {
+            flag = semaphore.tryAcquire();
+        }
+        catch (Exception e)
+        {
+            LOGGER.error("获取信号量异常", e);
+        }
+
+        return flag;
+    }
+
+    /**
+     * 释放信号量
+     *
+     * @param semaphore
+     */
+    public static void release(Semaphore semaphore)
+    {
+
+        try
+        {
+            semaphore.release();
+        }
+        catch (Exception e)
+        {
+            LOGGER.error("释放信号量异常", e);
+        }
+    }
+}
diff --git a/op-modules/op-device/src/main/java/com/op/device/websocket/WebSocketConfig.java b/op-modules/op-device/src/main/java/com/op/device/websocket/WebSocketConfig.java
new file mode 100644
index 00000000..84e173a8
--- /dev/null
+++ b/op-modules/op-device/src/main/java/com/op/device/websocket/WebSocketConfig.java
@@ -0,0 +1,20 @@
+package com.op.device.websocket;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+/**
+ * websocket 配置
+ *
+ * @author ruoyi
+ */
+@Configuration
+public class WebSocketConfig
+{
+    @Bean
+    public ServerEndpointExporter serverEndpointExporter()
+    {
+        return new ServerEndpointExporter();
+    }
+}
diff --git a/op-modules/op-device/src/main/java/com/op/device/websocket/WebSocketServer.java b/op-modules/op-device/src/main/java/com/op/device/websocket/WebSocketServer.java
new file mode 100644
index 00000000..1063d89d
--- /dev/null
+++ b/op-modules/op-device/src/main/java/com/op/device/websocket/WebSocketServer.java
@@ -0,0 +1,106 @@
+package com.op.device.websocket;
+
+import java.util.concurrent.Semaphore;
+import javax.websocket.OnClose;
+import javax.websocket.OnError;
+import javax.websocket.OnMessage;
+import javax.websocket.OnOpen;
+import javax.websocket.Session;
+import javax.websocket.server.ServerEndpoint;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+/**
+ * websocket 消息处理
+ *
+ * @author ruoyi
+ */
+@Component
+@ServerEndpoint("/websocket/message")
+public class WebSocketServer
+{
+    /**
+     * WebSocketServer 日志控制器
+     */
+    private static final Logger LOGGER = LoggerFactory.getLogger(WebSocketServer.class);
+
+    /**
+     * 默认最多允许同时在线人数100
+     */
+    public static int socketMaxOnlineCount = 100;
+
+    private static Semaphore socketSemaphore = new Semaphore(socketMaxOnlineCount);
+
+    /**
+     * 连接建立成功调用的方法
+     */
+    @OnOpen
+    public void onOpen(Session session) throws Exception
+    {
+        boolean semaphoreFlag = false;
+        // 尝试获取信号量
+        semaphoreFlag = SemaphoreUtils.tryAcquire(socketSemaphore);
+        if (!semaphoreFlag)
+        {
+            // 未获取到信号量
+            LOGGER.error("\n 当前在线人数超过限制数- {}", socketMaxOnlineCount);
+            WebSocketUsers.sendMessageToUserByText(session, "当前在线人数超过限制数:" + socketMaxOnlineCount);
+            session.close();
+        }
+        else
+        {
+            // 添加用户
+            WebSocketUsers.put(session.getId(), session);
+            LOGGER.info("\n 建立连接 - {}", session);
+            LOGGER.info("\n 当前人数 - {}", WebSocketUsers.getUsers().size());
+            WebSocketUsers.sendMessageToUserByText(session, "连接成功");
+        }
+    }
+
+    /**
+     * 连接关闭时处理
+     */
+    @OnClose
+    public void onClose(Session session)
+    {
+        LOGGER.info("\n 关闭连接 - {}", session);
+        // 移除用户
+        boolean removeFlag = WebSocketUsers.remove(session.getId());
+        if (!removeFlag)
+        {
+            // 获取到信号量则需释放
+            SemaphoreUtils.release(socketSemaphore);
+        }
+    }
+
+    /**
+     * 抛出异常时处理
+     */
+    @OnError
+    public void onError(Session session, Throwable exception) throws Exception
+    {
+        if (session.isOpen())
+        {
+            // 关闭连接
+            session.close();
+        }
+        String sessionId = session.getId();
+        LOGGER.info("\n 连接异常 - {}", sessionId);
+        LOGGER.info("\n 异常信息 - {}", exception);
+        // 移出用户
+        WebSocketUsers.remove(sessionId);
+        // 获取到信号量则需释放
+        SemaphoreUtils.release(socketSemaphore);
+    }
+
+    /**
+     * 服务器接收到客户端消息时调用的方法
+     */
+    @OnMessage
+    public void onMessage(String message, Session session)
+    {
+        String msg = message.replace("你", "我").replace("吗", "");
+        WebSocketUsers.sendMessageToUserByText(session, msg);
+    }
+}
diff --git a/op-modules/op-device/src/main/java/com/op/device/websocket/WebSocketUsers.java b/op-modules/op-device/src/main/java/com/op/device/websocket/WebSocketUsers.java
new file mode 100644
index 00000000..f21be112
--- /dev/null
+++ b/op-modules/op-device/src/main/java/com/op/device/websocket/WebSocketUsers.java
@@ -0,0 +1,140 @@
+package com.op.device.websocket;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import javax.websocket.Session;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * websocket 客户端用户集
+ *
+ * @author ruoyi
+ */
+public class WebSocketUsers
+{
+    /**
+     * WebSocketUsers 日志控制器
+     */
+    private static final Logger LOGGER = LoggerFactory.getLogger(WebSocketUsers.class);
+
+    /**
+     * 用户集
+     */
+    private static Map<String, Session> USERS = new ConcurrentHashMap<String, Session>();
+
+    /**
+     * 存储用户
+     *
+     * @param key 唯一键
+     * @param session 用户信息
+     */
+    public static void put(String key, Session session)
+    {
+        USERS.put(key, session);
+    }
+
+    /**
+     * 移除用户
+     *
+     * @param session 用户信息
+     *
+     * @return 移除结果
+     */
+    public static boolean remove(Session session)
+    {
+        String key = null;
+        boolean flag = USERS.containsValue(session);
+        if (flag)
+        {
+            Set<Map.Entry<String, Session>> entries = USERS.entrySet();
+            for (Map.Entry<String, Session> entry : entries)
+            {
+                Session value = entry.getValue();
+                if (value.equals(session))
+                {
+                    key = entry.getKey();
+                    break;
+                }
+            }
+        }
+        else
+        {
+            return true;
+        }
+        return remove(key);
+    }
+
+    /**
+     * 移出用户
+     *
+     * @param key 键
+     */
+    public static boolean remove(String key)
+    {
+        LOGGER.info("\n 正在移出用户 - {}", key);
+        Session remove = USERS.remove(key);
+        if (remove != null)
+        {
+            boolean containsValue = USERS.containsValue(remove);
+            LOGGER.info("\n 移出结果 - {}", containsValue ? "失败" : "成功");
+            return containsValue;
+        }
+        else
+        {
+            return true;
+        }
+    }
+
+    /**
+     * 获取在线用户列表
+     *
+     * @return 返回用户集合
+     */
+    public static Map<String, Session> getUsers()
+    {
+        return USERS;
+    }
+
+    /**
+     * 群发消息文本消息
+     *
+     * @param message 消息内容
+     */
+    public static void sendMessageToUsersByText(String message)
+    {
+        Collection<Session> values = USERS.values();
+        for (Session value : values)
+        {
+            sendMessageToUserByText(value, message);
+        }
+    }
+
+    /**
+     * 发送文本消息
+     *
+     * @param userName 自己的用户名
+     * @param message 消息内容
+     */
+    public static void sendMessageToUserByText(Session session, String message)
+    {
+        if (session != null)
+        {
+            try
+            {
+                session.getBasicRemote().sendText(message);
+            }
+            catch (IOException e)
+            {
+                LOGGER.error("\n[发送消息异常]", e);
+            }
+        }
+        else
+        {
+            LOGGER.info("\n[你已离线]");
+        }
+    }
+}
diff --git a/op-modules/op-device/src/main/resources/mapper/device/EquRepairOrderMapper.xml b/op-modules/op-device/src/main/resources/mapper/device/EquRepairOrderMapper.xml
index f6f3b019..0d958237 100644
--- a/op-modules/op-device/src/main/resources/mapper/device/EquRepairOrderMapper.xml
+++ b/op-modules/op-device/src/main/resources/mapper/device/EquRepairOrderMapper.xml
@@ -345,5 +345,15 @@
         left join base_team_user btu on sng.group_code = btu.team_code
         where sng.notice_id = #{noticeId} and sng.del_flag = '0'
     </select>
+    <select id="selectEquInfoByequCode" resultType="com.op.device.domain.Equipment" >
+        SELECT
+            equipment_code,
+            equipment_name,
+            sap_code
+        FROM
+            [dbo].[base_equipment]
+        WHERE
+            equipment_code = #{equipmentCode}
+    </select>
 
 </mapper>
diff --git a/op-modules/op-job/src/main/java/com/op/job/task/RyTask.java b/op-modules/op-job/src/main/java/com/op/job/task/RyTask.java
index caf74f71..797dd8ba 100644
--- a/op-modules/op-job/src/main/java/com/op/job/task/RyTask.java
+++ b/op-modules/op-job/src/main/java/com/op/job/task/RyTask.java
@@ -221,6 +221,11 @@ public class RyTask {
 		logger.info("++hr部门基础数据同步+开始++sysPostInfoTask+++++");
 		remoteUserService.sysDeptInfoTask();
 	}
+	//同步每天的员工打卡信息
+	public void sysClockInRecord(){
+		logger.info("++hr部门员工打卡信息数据同步+开始++sysClockInRecord+++++");
+		remoteUserService.sysClockInRecord();
+	}
 	/************部门基础数据定时任务开始*****************/
 	/************装运单同步定时任务*********************/
 	public void SynchronizationOfShippingDocuments(){
diff --git a/op-modules/op-system/pom.xml b/op-modules/op-system/pom.xml
index faca5d25..292ed4da 100644
--- a/op-modules/op-system/pom.xml
+++ b/op-modules/op-system/pom.xml
@@ -82,6 +82,14 @@
             <groupId>com.op</groupId>
             <artifactId>op-common-swagger</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-websocket</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-websocket</artifactId>
+        </dependency>
 
     </dependencies>
 
diff --git a/op-modules/op-system/src/main/java/com/op/system/controller/SysUserController.java b/op-modules/op-system/src/main/java/com/op/system/controller/SysUserController.java
index f48236be..28a79966 100644
--- a/op-modules/op-system/src/main/java/com/op/system/controller/SysUserController.java
+++ b/op-modules/op-system/src/main/java/com/op/system/controller/SysUserController.java
@@ -382,5 +382,9 @@ public class SysUserController extends BaseController {
 	public R syncUserInfoTask() {
 		return  R.ok(userService.syncUserInfoTask());
 	}
-
+	/**人员考勤打卡信息**/
+	@PostMapping("/clockInRecord")
+	public R syncClockInRecord() {
+		return  R.ok(userService.syncClockInRecord());
+	}
 }
diff --git a/op-modules/op-system/src/main/java/com/op/system/domain/MesClockRecord.java b/op-modules/op-system/src/main/java/com/op/system/domain/MesClockRecord.java
new file mode 100644
index 00000000..45a33292
--- /dev/null
+++ b/op-modules/op-system/src/main/java/com/op/system/domain/MesClockRecord.java
@@ -0,0 +1,94 @@
+package com.op.system.domain;
+
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.op.common.core.annotation.Excel;
+import com.op.common.core.web.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+
+/**
+ * 员工考勤记录对象 mes_clock_record
+ *
+ * @author yangwl
+ * @date 2025-03-21
+ */
+public class MesClockRecord extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    private String day;
+    private String time;
+
+    /** 打卡时间 */
+    @Excel(name = "打卡时间", width = 30, dateFormat = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date clockTime;
+
+    /** 工号 */
+    @Excel(name = "工号")
+    private String workNo;
+
+    /** 姓名 */
+    @Excel(name = "姓名")
+    private String name;
+
+
+
+    public void setClockTime(Date clockTime)
+    {
+        this.clockTime = clockTime;
+    }
+
+    public Date getClockTime()
+    {
+        return clockTime;
+    }
+
+    public String getDay() {
+        return day;
+    }
+
+    public void setDay(String day) {
+        this.day = day;
+    }
+
+    public String getTime() {
+        return time;
+    }
+
+    public void setTime(String time) {
+        this.time = time;
+    }
+
+    public String getWorkNo() {
+        return workNo;
+    }
+
+    public void setWorkNo(String workNo) {
+        this.workNo = workNo;
+    }
+
+    public void setName(String name)
+    {
+        this.name = name;
+    }
+
+    public String getName()
+    {
+        return name;
+    }
+
+    @Override
+    public String toString() {
+        return "MesClockRecord{" +
+                "day='" + day + '\'' +
+                ", time='" + time + '\'' +
+                ", clockTime=" + clockTime +
+                ", workNo='" + workNo + '\'' +
+                ", name='" + name + '\'' +
+                '}';
+    }
+}
diff --git a/op-modules/op-system/src/main/java/com/op/system/mapper/MesClockRecordMapper.java b/op-modules/op-system/src/main/java/com/op/system/mapper/MesClockRecordMapper.java
new file mode 100644
index 00000000..7f05e556
--- /dev/null
+++ b/op-modules/op-system/src/main/java/com/op/system/mapper/MesClockRecordMapper.java
@@ -0,0 +1,66 @@
+package com.op.system.mapper;
+
+import java.util.Date;
+import java.util.List;
+import com.op.system.domain.MesClockRecord;
+import feign.Param;
+
+/**
+ * 员工考勤记录Mapper接口
+ *
+ * @author yangwl
+ * @date 2025-03-21
+ */
+public interface MesClockRecordMapper
+{
+    /**
+     * 查询员工考勤记录
+     *
+     * @param clockTime 员工考勤记录ID
+     * @return 员工考勤记录
+     */
+    public MesClockRecord selectMesClockRecordById(Date clockTime);
+
+    /**
+     * 查询员工考勤记录列表
+     *
+     * @param mesClockRecord 员工考勤记录
+     * @return 员工考勤记录集合
+     */
+    public List<MesClockRecord> selectMesClockRecordList(MesClockRecord mesClockRecord);
+
+    /**
+     * 新增员工考勤记录
+     *
+     * @param mesClockRecord 员工考勤记录
+     * @return 结果
+     */
+    public int insertMesClockRecord(MesClockRecord mesClockRecord);
+
+    /**
+     * 修改员工考勤记录
+     *
+     * @param mesClockRecord 员工考勤记录
+     * @return 结果
+     */
+    public int updateMesClockRecord(MesClockRecord mesClockRecord);
+
+    /**
+     * 删除员工考勤记录
+     *
+     * @param clockTime 员工考勤记录ID
+     * @return 结果
+     */
+    public int deleteMesClockRecordById(Date clockTime);
+
+    /**
+     * 批量删除员工考勤记录
+     *
+     * @param clockTimes 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteMesClockRecordByIds(String[] clockTimes);
+
+
+    void insertMesClockRecordList(List<MesClockRecord> list);
+}
diff --git a/op-modules/op-system/src/main/java/com/op/system/service/IMesClockRecordService.java b/op-modules/op-system/src/main/java/com/op/system/service/IMesClockRecordService.java
new file mode 100644
index 00000000..bbc80611
--- /dev/null
+++ b/op-modules/op-system/src/main/java/com/op/system/service/IMesClockRecordService.java
@@ -0,0 +1,62 @@
+package com.op.system.service;
+
+import java.util.Date;
+import java.util.List;
+import com.op.system.domain.MesClockRecord;
+
+/**
+ * 员工考勤记录Service接口
+ *
+ * @author yangwl
+ * @date 2025-03-21
+ */
+public interface IMesClockRecordService
+{
+    /**
+     * 查询员工考勤记录
+     *
+     * @param clockTime 员工考勤记录ID
+     * @return 员工考勤记录
+     */
+    public MesClockRecord selectMesClockRecordById(Date clockTime);
+
+    /**
+     * 查询员工考勤记录列表
+     *
+     * @param mesClockRecord 员工考勤记录
+     * @return 员工考勤记录集合
+     */
+    public List<MesClockRecord> selectMesClockRecordList(MesClockRecord mesClockRecord);
+
+    /**
+     * 新增员工考勤记录
+     *
+     * @param mesClockRecord 员工考勤记录
+     * @return 结果
+     */
+    public int insertMesClockRecord(MesClockRecord mesClockRecord);
+
+    /**
+     * 修改员工考勤记录
+     *
+     * @param mesClockRecord 员工考勤记录
+     * @return 结果
+     */
+    public int updateMesClockRecord(MesClockRecord mesClockRecord);
+
+    /**
+     * 批量删除员工考勤记录
+     *
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteMesClockRecordByIds(String ids);
+
+    /**
+     * 删除员工考勤记录信息
+     *
+     * @param clockTime 员工考勤记录ID
+     * @return 结果
+     */
+    public int deleteMesClockRecordById(Date clockTime);
+}
diff --git a/op-modules/op-system/src/main/java/com/op/system/service/ISysUserService.java b/op-modules/op-system/src/main/java/com/op/system/service/ISysUserService.java
index 4d57f54f..6030bb82 100644
--- a/op-modules/op-system/src/main/java/com/op/system/service/ISysUserService.java
+++ b/op-modules/op-system/src/main/java/com/op/system/service/ISysUserService.java
@@ -210,4 +210,6 @@ public interface ISysUserService {
     public List<Map<String, String>> getPoolNameList(SysUser user);
 
     public R syncUserInfoTask();
+
+    public R syncClockInRecord();
 }
diff --git a/op-modules/op-system/src/main/java/com/op/system/service/impl/MesClockRecordServiceImpl.java b/op-modules/op-system/src/main/java/com/op/system/service/impl/MesClockRecordServiceImpl.java
new file mode 100644
index 00000000..259a1045
--- /dev/null
+++ b/op-modules/op-system/src/main/java/com/op/system/service/impl/MesClockRecordServiceImpl.java
@@ -0,0 +1,101 @@
+package com.op.system.service.impl;
+
+import java.util.Date;
+import java.util.List;
+
+import com.op.common.core.text.Convert;
+import com.op.common.core.utils.DateUtils;
+import com.op.system.mapper.MesClockRecordMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.op.system.domain.MesClockRecord;
+import com.op.system.service.IMesClockRecordService;
+
+
+/**
+ * 员工考勤记录Service业务层处理
+ *
+ * @author yangwl
+ * @date 2025-03-21
+ */
+@Service
+public class MesClockRecordServiceImpl implements IMesClockRecordService
+{
+    @Autowired
+    private MesClockRecordMapper mesClockRecordMapper;
+
+    /**
+     * 查询员工考勤记录
+     *
+     * @param clockTime 员工考勤记录ID
+     * @return 员工考勤记录
+     */
+    @Override
+    public MesClockRecord selectMesClockRecordById(Date clockTime)
+    {
+        return mesClockRecordMapper.selectMesClockRecordById(clockTime);
+    }
+
+    /**
+     * 查询员工考勤记录列表
+     *
+     * @param mesClockRecord 员工考勤记录
+     * @return 员工考勤记录
+     */
+    @Override
+    public List<MesClockRecord> selectMesClockRecordList(MesClockRecord mesClockRecord)
+    {
+        return mesClockRecordMapper.selectMesClockRecordList(mesClockRecord);
+    }
+
+    /**
+     * 新增员工考勤记录
+     *
+     * @param mesClockRecord 员工考勤记录
+     * @return 结果
+     */
+    @Override
+    public int insertMesClockRecord(MesClockRecord mesClockRecord)
+    {
+        mesClockRecord.setCreateTime(DateUtils.getNowDate());
+        return mesClockRecordMapper.insertMesClockRecord(mesClockRecord);
+    }
+
+    /**
+     * 修改员工考勤记录
+     *
+     * @param mesClockRecord 员工考勤记录
+     * @return 结果
+     */
+    @Override
+    public int updateMesClockRecord(MesClockRecord mesClockRecord)
+    {
+        mesClockRecord.setUpdateTime(DateUtils.getNowDate());
+        return mesClockRecordMapper.updateMesClockRecord(mesClockRecord);
+    }
+
+    /**
+     * 删除员工考勤记录对象
+     *
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    @Override
+    public int deleteMesClockRecordByIds(String ids)
+    {
+        return mesClockRecordMapper.deleteMesClockRecordByIds(Convert.toStrArray(ids));
+    }
+
+    /**
+     * 删除员工考勤记录信息
+     *
+     * @param clockTime 员工考勤记录ID
+     * @return 结果
+     */
+    @Override
+    public int deleteMesClockRecordById(Date clockTime)
+    {
+        return mesClockRecordMapper.deleteMesClockRecordById(clockTime);
+    }
+}
diff --git a/op-modules/op-system/src/main/java/com/op/system/service/impl/SysUserServiceImpl.java b/op-modules/op-system/src/main/java/com/op/system/service/impl/SysUserServiceImpl.java
index bad7b2c9..1357fc5c 100644
--- a/op-modules/op-system/src/main/java/com/op/system/service/impl/SysUserServiceImpl.java
+++ b/op-modules/op-system/src/main/java/com/op/system/service/impl/SysUserServiceImpl.java
@@ -1,5 +1,6 @@
 package com.op.system.service.impl;
 
+import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -8,17 +9,22 @@ import javax.validation.Validator;
 
 import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.dynamic.datasource.annotation.DS;
 import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
 import com.op.common.core.domain.R;
 import com.op.common.core.utils.DateUtils;
+import com.op.common.core.utils.http.HttpUtils;
 import com.op.common.core.web.domain.AjaxResult;
 import com.op.system.api.RemoteOpenService;
 import com.op.system.api.domain.quality.HRInfo;
 import com.op.system.api.domain.quality.OAInfo;
 import com.op.system.api.domain.sap.SapWorkCenter;
-import com.op.system.domain.SysDatasource;
+import com.op.system.domain.*;
 import com.op.system.mapper.*;
 import org.apache.commons.lang3.time.DateFormatUtils;
+import org.apache.ibatis.session.ExecutorType;
+import org.apache.ibatis.session.SqlSession;
+import org.apache.ibatis.session.SqlSessionFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -34,9 +40,6 @@ import com.op.common.datascope.annotation.DataScope;
 import com.op.common.security.utils.SecurityUtils;
 import com.op.system.api.domain.SysRole;
 import com.op.system.api.domain.SysUser;
-import com.op.system.domain.SysPost;
-import com.op.system.domain.SysUserPost;
-import com.op.system.domain.SysUserRole;
 import com.op.system.service.ISysConfigService;
 import com.op.system.service.ISysUserService;
 import org.springframework.web.context.request.RequestContextHolder;
@@ -74,6 +77,9 @@ public class SysUserServiceImpl implements ISysUserService {
 	@Autowired
 	private SysDatasourceMapper sysDatasourceMapper;
 
+	@Autowired
+	private MesClockRecordMapper mesClockRecordMapper;
+
 	@Autowired
 	private RemoteOpenService remoteOpenService;
 
@@ -569,7 +575,9 @@ public class SysUserServiceImpl implements ISysUserService {
 		return R.ok();
 	}
 
-    protected int syncUserInfoFunc(List<HRInfo> dtos){
+
+
+	protected int syncUserInfoFunc(List<HRInfo> dtos){
         log.info("人力信息同步:"+ JSONObject.toJSONString(dtos));
 		Date nowDate = DateUtils.getNowDate();
 		String createBy = "job";
@@ -651,6 +659,75 @@ public class SysUserServiceImpl implements ISysUserService {
 
 		return 1;
 	}
+	@Override
+	public R syncClockInRecord() {
+		DynamicDataSourceContextHolder.push("ds_1000");// 这是数据源的key
+
+		try {
+			/*从接口获取人员打卡信息*/
+			// 获取当前日期
+			Calendar calendar = Calendar.getInstance();
+
+			// 定义日期格式
+			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+
+			// 格式化日期
+			String formattedDate = sdf.format(calendar.getTime());
+			JSONObject jsonObject = new JSONObject();
+			jsonObject.put("day", formattedDate);
+
+			// 将 JSON 对象转换为字符串
+			String jsonString = jsonObject.toString();
+
+			// 调用 sendPost 方法(确保此方法内部使用 POST 方法发送数据)
+			String url = "http://lj.lanju.cn:8801/outside/api/mes/attendanceRecord/today/list.do";
+			String result = HttpUtils.sendPostWechart(url, jsonString);
+			List<MesClockRecord> mesClockRecordList =JSONArray.parseArray(result,MesClockRecord.class);
+
+			SimpleDateFormat sdfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+			List<MesClockRecord> clockRecordList = mesClockRecordList.stream().map(mesClockRecord -> {
+				String ClockTime=mesClockRecord.getDay()+ " " +mesClockRecord.getTime();
+				try {
+					Date clockTime = sdfs.parse(ClockTime);
+					mesClockRecord.setClockTime(clockTime);
+				} catch (ParseException e) {
+					e.printStackTrace();
+				}
+				return mesClockRecord;
+			}).collect(Collectors.toList());
+			// 处理响应结果
+			batchInsert(clockRecordList);
+
+			System.out.println("服务器响应: " + clockRecordList);
+			return R.ok(result);
+		}catch (Exception e) {
+			e.printStackTrace();
+			return R.fail(e.getMessage());
+		}
+
+	}
 
+	@Autowired // 关键:注入 SqlSessionFactory
+	private SqlSessionFactory sqlSessionFactory;
+
+    public void batchInsert(List<MesClockRecord> records) {
+        SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
+        try {
+            MesClockRecordMapper mapper = sqlSession.getMapper(MesClockRecordMapper.class);
+            int batchSize = 500;
+            for (int i = 0; i < records.size(); i += batchSize) {
+                int end = Math.min(i + batchSize, records.size());
+                List<MesClockRecord> subList = records.subList(i, end);
+                mapper.insertMesClockRecordList(subList);
+                sqlSession.flushStatements(); // 批处理执行
+            }
+            sqlSession.commit(); // 提交事务
+        } catch (Exception e) {
+            sqlSession.rollback();
+            throw new RuntimeException("批量插入失败", e);
+        } finally {
+            sqlSession.close();
+        }
+    }
 }
 
diff --git a/op-modules/op-system/src/main/resources/mapper/system/MesClockRecordMapper.xml b/op-modules/op-system/src/main/resources/mapper/system/MesClockRecordMapper.xml
new file mode 100644
index 00000000..009c6259
--- /dev/null
+++ b/op-modules/op-system/src/main/resources/mapper/system/MesClockRecordMapper.xml
@@ -0,0 +1,87 @@
+<?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="com.op.system.mapper.MesClockRecordMapper">
+
+    <resultMap type="MesClockRecord" id="MesClockRecordResult">
+        <result property="clockTime"    column="clock_time"    />
+        <result property="workno"    column="workno"    />
+        <result property="name"    column="name"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectMesClockRecordVo">
+        select clock_time, workno, name, create_by, create_time, update_by, update_time from mes_clock_record
+    </sql>
+
+    <select id="selectMesClockRecordList" parameterType="MesClockRecord" resultMap="MesClockRecordResult">
+        <include refid="selectMesClockRecordVo"/>
+        <where>
+            <if test="clockTime != null "> and clock_time = #{clockTime}</if>
+            <if test="workno != null  and workno != ''"> and workno = #{workno}</if>
+            <if test="name != null  and name != ''"> and name like ('%' + #{name} + '%')</if>
+        </where>
+    </select>
+
+    <select id="selectMesClockRecordById" parameterType="Date" resultMap="MesClockRecordResult">
+        <include refid="selectMesClockRecordVo"/>
+        where clock_time = #{clockTime}
+    </select>
+
+    <insert id="insertMesClockRecord" parameterType="MesClockRecord">
+        insert into mes_clock_record
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="clockTime != null">clock_time,</if>
+            <if test="workNo != null">workno,</if>
+            <if test="name != null">name,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="clockTime != null">#{clockTime},</if>
+            <if test="workNo != null">#{workNo},</if>
+            <if test="name != null">#{name},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+         </trim>
+    </insert>
+    <insert id="insertMesClockRecordList">
+        INSERT INTO mes_clock_record (clock_time,workno, name) VALUES
+        <foreach collection="list" item="item" separator=",">
+            (#{item.clockTime}, #{item.workNo}, #{item.name})
+        </foreach>
+    </insert>
+
+    <update id="updateMesClockRecord" parameterType="MesClockRecord">
+        update mes_clock_record
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="workno != null">workno = #{workno},</if>
+            <if test="name != null">name = #{name},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where clock_time = #{clockTime}
+    </update>
+
+    <delete id="deleteMesClockRecordById" parameterType="Date">
+        delete from mes_clock_record where clock_time = #{clockTime}
+    </delete>
+
+    <delete id="deleteMesClockRecordByIds" parameterType="String">
+        delete from mes_clock_record where clock_time in
+        <foreach item="clockTime" collection="array" open="(" separator="," close=")">
+            #{clockTime}
+        </foreach>
+    </delete>
+
+</mapper>

From dfde288e87efedc77b076cd78dc929748b54197d Mon Sep 17 00:00:00 2001
From: zhaoxiaolin <khd@123>
Date: Mon, 24 Mar 2025 09:17:43 +0800
Subject: [PATCH 2/2] =?UTF-8?q?=E6=97=A5=E7=94=9F=E4=BA=A7=E6=95=88?=
 =?UTF-8?q?=E7=8E=87=E6=8A=A5=E8=A1=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../core/utils/poi/ExcelMesDayEffMapUtil.java | 164 +++++
 .../MesLineAssistantQtyController.java        | 220 ++++++
 .../controller/MesReportWorksController.java  |   2 +-
 .../com/op/mes/domain/MesLineAssistant.java   | 278 ++++++++
 .../op/mes/domain/MesLineAssistantQty.java    | 181 +++++
 .../com/op/mes/domain/MesLineProduct.java     |  30 +
 .../mes/domain/vo/MesDailyEfficiencyVo.java   | 636 ++++++++++++++++++
 .../mes/domain/vo/MesLineAssistantQtyVo.java  | 278 ++++++++
 .../mes/mapper/MesLineAssistantQtyMapper.java |  87 +++
 .../service/IMesLineAssistantQtyService.java  |  69 ++
 .../impl/MesLineAssistantQtyServiceImpl.java  | 439 ++++++++++++
 .../mapper/mes/MesLineAssistantQtyMapper.xml  | 337 ++++++++++
 .../impl/QcCheckTaskInventoryServiceImpl.java |   8 +-
 13 files changed, 2724 insertions(+), 5 deletions(-)
 create mode 100644 op-common/op-common-core/src/main/java/com/op/common/core/utils/poi/ExcelMesDayEffMapUtil.java
 create mode 100644 op-modules/op-mes/src/main/java/com/op/mes/controller/MesLineAssistantQtyController.java
 create mode 100644 op-modules/op-mes/src/main/java/com/op/mes/domain/MesLineAssistant.java
 create mode 100644 op-modules/op-mes/src/main/java/com/op/mes/domain/MesLineAssistantQty.java
 create mode 100644 op-modules/op-mes/src/main/java/com/op/mes/domain/vo/MesDailyEfficiencyVo.java
 create mode 100644 op-modules/op-mes/src/main/java/com/op/mes/domain/vo/MesLineAssistantQtyVo.java
 create mode 100644 op-modules/op-mes/src/main/java/com/op/mes/mapper/MesLineAssistantQtyMapper.java
 create mode 100644 op-modules/op-mes/src/main/java/com/op/mes/service/IMesLineAssistantQtyService.java
 create mode 100644 op-modules/op-mes/src/main/java/com/op/mes/service/impl/MesLineAssistantQtyServiceImpl.java
 create mode 100644 op-modules/op-mes/src/main/resources/mapper/mes/MesLineAssistantQtyMapper.xml

diff --git a/op-common/op-common-core/src/main/java/com/op/common/core/utils/poi/ExcelMesDayEffMapUtil.java b/op-common/op-common-core/src/main/java/com/op/common/core/utils/poi/ExcelMesDayEffMapUtil.java
new file mode 100644
index 00000000..16d6ba9e
--- /dev/null
+++ b/op-common/op-common-core/src/main/java/com/op/common/core/utils/poi/ExcelMesDayEffMapUtil.java
@@ -0,0 +1,164 @@
+package com.op.common.core.utils.poi;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.op.common.core.domain.ExcelCol;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.xssf.streaming.SXSSFWorkbook;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Excel相关处理
+ *
+ * @author OP
+ */
+public class ExcelMesDayEffMapUtil {
+	//下载
+	public static <T> SXSSFWorkbook initWorkbook(String sheetName, String title, List<ExcelCol> excelCol, List<T> data) {
+		SXSSFWorkbook workbook = new SXSSFWorkbook();
+		int colSize = excelCol.size();
+
+		//创建Sheet(工作簿)
+		Sheet sheet = null;
+		if (!StringUtils.hasText(sheetName)) {
+			sheet = workbook.createSheet();
+		} else {
+			sheet = workbook.createSheet(sheetName);
+		}
+
+		Row sheetHeadRow0 = sheet.createRow(0);
+		Row sheetHeadRow1 = sheet.createRow(1);
+		Row sheetHeadRow2 = sheet.createRow(2);
+		//遍历表头名称,创建表头单元格
+
+		//遍历表头名称,创建表头单元格
+		for (int i = 0; i < colSize; i++) {
+			sheet.setColumnWidth(i, (excelCol.get(i).getWidth()) * 256);//宽度单位是字符的256分之一
+			Cell headCell = sheetHeadRow1.createCell(i);
+			headCell.setCellValue(excelCol.get(i).getTitle());//传值
+			headCell.setCellStyle(getHeaderFont(sheet.getWorkbook()));//设置样式
+		}
+		mergeAndStyleCells2(sheet, sheetHeadRow0, new CellRangeAddress(4, 5, 0, 1), "产品名称", true, true, IndexedColors.GREY_25_PERCENT);
+
+
+		//将data中的值填充到excel
+		int rowNum = sheet.getLastRowNum() + 1;
+		if (!CollectionUtils.isEmpty(data)) {
+			Iterator<T> iterator = data.iterator();
+			//遍历数据
+			for (; iterator.hasNext(); ) {
+				Row dataRow = sheet.createRow(rowNum);//创建行
+				T obj = iterator.next();//获取当前行对应的数据
+				JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(obj));
+				for (int i = 0; i < colSize; i++) {
+					Cell dataCell = dataRow.createCell(i);
+					dataCell.setCellStyle(getDataFont(workbook));
+					if (title != null) {//定量分析
+						dataCell.setCellValue(getValue(jsonObject.get(excelCol.get(i).getField())));
+					} else {
+						if (i >= 2) {
+							dataCell.setCellValue(getValueNum(jsonObject.get(excelCol.get(i).getField())));
+						} else {
+							dataCell.setCellValue(getValue(jsonObject.get(excelCol.get(i).getField())));
+						}
+					}
+				}
+				iterator.remove();
+				rowNum++;
+			}
+		}
+
+		return workbook;
+	}
+
+	//标题样式
+	public static CellStyle getHeaderFont(Workbook workbook) {
+		Font font = workbook.createFont();
+		font.setFontHeightInPoints((short) 15);//字体大小
+		font.setBold(true);//加粗
+		CellStyle cellStyle = workbook.createCellStyle();
+		cellStyle.setFont(font);
+		cellStyle.setAlignment(HorizontalAlignment.CENTER_SELECTION);//设置水平居中
+		cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//设置垂直居中
+		// 设置上边框
+		cellStyle.setBorderTop(BorderStyle.THIN);
+		// 设置下边框
+		cellStyle.setBorderBottom(BorderStyle.THIN);
+		// 设置左边框
+		cellStyle.setBorderLeft(BorderStyle.THIN);
+		// 设置右边框
+		cellStyle.setBorderRight(BorderStyle.THIN);
+		cellStyle.setFillBackgroundColor(IndexedColors.AQUA.getIndex());
+
+		return cellStyle;
+	}
+
+	//内容样式
+	public static CellStyle getDataFont(Workbook workbook) {
+		Font font = workbook.createFont();
+		font.setFontHeightInPoints((short) 12);//字体大小
+		font.setBold(false);//不加粗
+		CellStyle cellStyle = workbook.createCellStyle();
+		cellStyle.setFont(font);
+		cellStyle.setAlignment(HorizontalAlignment.CENTER_SELECTION);//设置水平居中
+		cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//设置垂直居中
+		cellStyle.setWrapText(true);//设置单元格内容自动换行
+		return cellStyle;
+	}
+
+	//处理数据
+	public static String getValue(Object object) {
+		if (object == null) {
+			return "";
+		} else {
+			return object.toString();
+		}
+	}
+
+	//处理数据
+	public static Integer getValueNum(Object object) {
+		if (object == null) {
+			return 0;
+		} else {
+			return Integer.parseInt(object.toString());
+		}
+	}
+
+	private static void mergeAndStyleCells2(Sheet sheet, Row row, CellRangeAddress cellRangeAddress, String cellValue, boolean centered, boolean hasBackground, IndexedColors backgroundColor) {
+		// 合并单元格
+		sheet.addMergedRegion(cellRangeAddress);
+
+		// 创建一个单元格样式
+		CellStyle style = sheet.getWorkbook().createCellStyle();
+
+		// 设置字体居中
+		if (centered) {
+			style.setAlignment(HorizontalAlignment.CENTER);
+			style.setVerticalAlignment(VerticalAlignment.CENTER);
+		}
+
+		// 设置背景颜色(如果有)
+		if (hasBackground && backgroundColor != null) {
+			style.setFillForegroundColor(backgroundColor.getIndex());
+			style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
+		}
+
+		// 设置边框线
+		style.setBorderBottom(BorderStyle.THIN);
+		style.setBorderLeft(BorderStyle.THIN);
+		style.setBorderRight(BorderStyle.THIN);
+		style.setBorderTop(BorderStyle.THIN);
+
+		// 获取合并后的单元格的第一个单元格,并设置值
+		Cell cell = row.getCell(cellRangeAddress.getFirstColumn());
+		if (cell == null) {
+			cell = row.createCell(cellRangeAddress.getFirstColumn());
+		}
+		cell.setCellValue(cellValue); // 设置单元格的值
+		cell.setCellStyle(style); // 应用样式到单元格
+	}
+}
diff --git a/op-modules/op-mes/src/main/java/com/op/mes/controller/MesLineAssistantQtyController.java b/op-modules/op-mes/src/main/java/com/op/mes/controller/MesLineAssistantQtyController.java
new file mode 100644
index 00000000..7192afed
--- /dev/null
+++ b/op-modules/op-mes/src/main/java/com/op/mes/controller/MesLineAssistantQtyController.java
@@ -0,0 +1,220 @@
+package com.op.mes.controller;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+
+import com.op.common.core.domain.ExcelCol;
+import com.op.common.core.utils.poi.ExcelMapUtil;
+import com.op.common.core.utils.poi.ExcelMesDayEffMapUtil;
+import com.op.mes.domain.MesLineAssistant;
+import com.op.mes.domain.vo.DynamicColumnVo;
+import com.op.mes.domain.vo.MesDailyEfficiencyVo;
+import com.op.mes.domain.vo.MesLineAssistantQtyVo;
+import org.apache.poi.xssf.streaming.SXSSFWorkbook;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.op.common.log.annotation.Log;
+import com.op.common.log.enums.BusinessType;
+import com.op.common.security.annotation.RequiresPermissions;
+import com.op.mes.domain.MesLineAssistantQty;
+import com.op.mes.service.IMesLineAssistantQtyService;
+import com.op.common.core.web.controller.BaseController;
+import com.op.common.core.web.domain.AjaxResult;
+import com.op.common.core.utils.poi.ExcelUtil;
+import com.op.common.core.web.page.TableDataInfo;
+
+/**
+ * 辅助工时摊分Controller
+ *
+ * @author Open Platform
+ * @date 2025-03-21
+ */
+@RestController
+@RequestMapping("/reportWorks/assistqty")
+public class MesLineAssistantQtyController extends BaseController {
+    @Autowired
+    private IMesLineAssistantQtyService mesLineAssistantQtyService;
+
+    /**
+     * 查询辅助工时摊分列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo list(MesLineAssistantQty mesLineAssistantQty) {
+        startPage();
+        List<MesLineAssistantQty> list = mesLineAssistantQtyService.selectMesLineAssistantQtyList(mesLineAssistantQty);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出辅助工时摊分列表
+     */
+    @Log(title = "辅助工时摊分", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, MesLineAssistantQty mesLineAssistantQty) {
+        List<MesLineAssistantQty> list = mesLineAssistantQtyService.selectMesLineAssistantQtyList(mesLineAssistantQty);
+        ExcelUtil<MesLineAssistantQty> util = new ExcelUtil<MesLineAssistantQty>(MesLineAssistantQty. class);
+        util.exportExcel(response, list, "辅助工时摊分数据");
+    }
+
+    /**
+     * 获取辅助工时摊分详细信息
+     */
+
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id) {
+        return success(mesLineAssistantQtyService.selectMesLineAssistantQtyById(id));
+    }
+
+    /**
+     * 新增辅助工时摊分
+     */
+
+    @Log(title = "辅助工时摊分", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody MesLineAssistantQty mesLineAssistantQty) {
+        return toAjax(mesLineAssistantQtyService.insertMesLineAssistantQty(mesLineAssistantQty));
+    }
+
+    /**
+     * 修改辅助工时摊分
+     */
+
+    @Log(title = "辅助工时摊分", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody MesLineAssistantQty mesLineAssistantQty) {
+        return toAjax(mesLineAssistantQtyService.updateMesLineAssistantQty(mesLineAssistantQty));
+    }
+
+    /**
+     * 删除辅助工时摊分
+     */
+
+    @Log(title = "辅助工时摊分", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids) {
+        return toAjax(mesLineAssistantQtyService.deleteMesLineAssistantQtyByIds(ids));
+    }
+
+    @Log(title = "辅助工时摊分报表查询", businessType = BusinessType.QUERY)
+    @GetMapping("/listAssistHour")
+    public List<MesLineAssistantQtyVo> listAssistHour(MesLineAssistant mesLineAssistant) {
+        List<MesLineAssistantQtyVo> list = mesLineAssistantQtyService.selectEfficiencyHourList(mesLineAssistant);
+        return list;
+    }
+    @Log(title = "辅助工时摊分导出", businessType = BusinessType.EXPORT)
+    @PostMapping("/listAssistHourExport")
+    public void listAssistHourExport(HttpServletResponse response, MesLineAssistant mesLineAssistant) {
+        List<MesLineAssistantQtyVo> list = mesLineAssistantQtyService.selectEfficiencyHourList(mesLineAssistant);
+        ExcelUtil<MesLineAssistantQtyVo> util = new ExcelUtil<MesLineAssistantQtyVo>(MesLineAssistantQtyVo. class);
+        util.exportExcel(response, list, "辅助工时摊分数据");
+    }
+
+    @Log(title = "生产日效率报表查询", businessType = BusinessType.QUERY)
+    @GetMapping("/listEfficiencyDayList")
+    public List<MesDailyEfficiencyVo> listEfficiencyHourList(MesLineAssistant mesLineAssistant) {
+        List<MesDailyEfficiencyVo> list = mesLineAssistantQtyService.selectEfficiencyDayList(mesLineAssistant);
+        return list;
+    }
+    @Log(title = "生产日效率报表导出", businessType = BusinessType.EXPORT)
+    @PostMapping("/listEfficiencyDayExport")
+    public void listEfficiencyHourExport(HttpServletResponse response, MesLineAssistant mesLineAssistant) {
+        List<MesDailyEfficiencyVo> list = mesLineAssistantQtyService.selectEfficiencyDayList(mesLineAssistant);
+
+//        List<Map<String, Object>> list = mesReportWorksService.getHFProductionList(dto);
+//
+//        ArrayList<ExcelCol> excelCols = new ArrayList<>();
+//        excelCols.add(new ExcelCol("日期","productDate",20));
+//        excelCols.add(new ExcelCol("工厂","factoryCode",20));
+//        excelCols.add(new ExcelCol("车间","totalQuantity",20));
+//        excelCols.add(new ExcelCol("产线编码","totalQuantity",20));
+//        excelCols.add(new ExcelCol("品类","productDate",20));
+//        excelCols.add(new ExcelCol("产品名称","factoryCode",20));
+//        excelCols.add(new ExcelCol("规格","totalQuantity",20));
+//        excelCols.add(new ExcelCol("单位","totalQuantity",20));
+//        excelCols.add(new ExcelCol("计划产量(件/PC)","productDate",20));
+//        excelCols.add(new ExcelCol("实际产量(件)","factoryCode",20));
+//        excelCols.add(new ExcelCol("实际产量(PC)","totalQuantity",20));
+//        excelCols.add(new ExcelCol("产量达成率","totalQuantity",20));
+//        excelCols.add(new ExcelCol("标准工艺效率(PC/H)","productDate",20));
+//        excelCols.add(new ExcelCol("标准用人","factoryCode",20));
+//        excelCols.add(new ExcelCol("实际用人","totalQuantity",20));
+//        excelCols.add(new ExcelCol("产品标准工时","totalQuantity",20));
+//        excelCols.add(new ExcelCol("产品实际工时","factoryCode",20));
+//        excelCols.add(new ExcelCol("一线工时合计","totalQuantity",20));
+//        excelCols.add(new ExcelCol("一线标准效率","totalQuantity",20));
+//        excelCols.add(new ExcelCol("一线实际效率","productDate",20));
+//        excelCols.add(new ExcelCol("效率达成率","factoryCode",20));
+//
+//        excelCols.add(new ExcelCol("辅助用人合计","totalQuantity",20));
+//        excelCols.add(new ExcelCol("班长","totalQuantity",20));
+//        excelCols.add(new ExcelCol("组长","totalQuantity",20));
+//        excelCols.add(new ExcelCol("机操工","totalQuantity",20));
+//        excelCols.add(new ExcelCol("物料员","totalQuantity",20));
+//        excelCols.add(new ExcelCol("配料员","totalQuantity",20));
+//        excelCols.add(new ExcelCol("配药员","totalQuantity",20));
+//        excelCols.add(new ExcelCol("药管员","totalQuantity",20));
+//        excelCols.add(new ExcelCol("锅炉工","totalQuantity",20));
+//        excelCols.add(new ExcelCol("石油气看管员","totalQuantity",20));
+//        excelCols.add(new ExcelCol("库区管理员","totalQuantity",20));
+//        excelCols.add(new ExcelCol("机修工","totalQuantity",20));
+//        excelCols.add(new ExcelCol("清洁工","totalQuantity",20));
+//
+//        excelCols.add(new ExcelCol("辅助工时合计","totalQuantity",20));
+//        excelCols.add(new ExcelCol("班长","totalQuantity",20));
+//        excelCols.add(new ExcelCol("组长","totalQuantity",20));
+//        excelCols.add(new ExcelCol("机操工","totalQuantity",20));
+//        excelCols.add(new ExcelCol("物料员","totalQuantity",20));
+//        excelCols.add(new ExcelCol("配料员","totalQuantity",20));
+//        excelCols.add(new ExcelCol("配药员","totalQuantity",20));
+//        excelCols.add(new ExcelCol("药管员","totalQuantity",20));
+//        excelCols.add(new ExcelCol("锅炉工","totalQuantity",20));
+//        excelCols.add(new ExcelCol("石油气看管员","totalQuantity",20));
+//        excelCols.add(new ExcelCol("库区管理员","totalQuantity",20));
+//        excelCols.add(new ExcelCol("机修工","totalQuantity",20));
+//        excelCols.add(new ExcelCol("清洁工","totalQuantity",20));
+//
+//        excelCols.add(new ExcelCol("总工时","totalQuantity",20));
+//        excelCols.add(new ExcelCol("效率提升基数","totalQuantity",20));
+//        excelCols.add(new ExcelCol("提升目标","totalQuantity",20));
+//        excelCols.add(new ExcelCol("目标效率","totalQuantity",20));
+//        excelCols.add(new ExcelCol("实际效率","totalQuantity",20));
+//        excelCols.add(new ExcelCol("效率提升率","totalQuantity",20));
+//
+//        excelCols.add(new ExcelCol("原因分析","totalQuantity",20));
+//
+//        String titleName = "日生产效率统计报表";
+//        SXSSFWorkbook workbook = null;
+//
+//        try {
+//            //设置响应头
+//            response.setHeader("Content-disposition",
+//                    "attachment; filename="+ titleName);
+//            response.setContentType("application/octet-stream;charset=UTF-8");
+//            ServletOutputStream outputStream = response.getOutputStream();
+//            //调用工具类
+//            workbook = ExcelMesDayEffMapUtil.initWorkbook(titleName, null, excelCols, list);
+//            workbook.write(outputStream);
+//        } catch (IOException e) {
+//            e.printStackTrace();
+//        }finally {
+//            if (workbook!=null){
+//                workbook.dispose();
+//            }
+//        }
+        ExcelUtil<MesDailyEfficiencyVo> util = new ExcelUtil<MesDailyEfficiencyVo>(MesDailyEfficiencyVo. class);
+        util.exportExcel(response, list, "生产日效率报表");
+    }
+
+
+}
diff --git a/op-modules/op-mes/src/main/java/com/op/mes/controller/MesReportWorksController.java b/op-modules/op-mes/src/main/java/com/op/mes/controller/MesReportWorksController.java
index 67c7120c..4ef3d761 100644
--- a/op-modules/op-mes/src/main/java/com/op/mes/controller/MesReportWorksController.java
+++ b/op-modules/op-mes/src/main/java/com/op/mes/controller/MesReportWorksController.java
@@ -27,7 +27,7 @@ import java.util.List;
 import java.util.Map;
 
 import static com.op.common.core.utils.PageUtils.startPage;
-
+/**mes综合分析报表**/
 @RestController
 @RequestMapping("/reportWorks")
 public class MesReportWorksController extends BaseController {
diff --git a/op-modules/op-mes/src/main/java/com/op/mes/domain/MesLineAssistant.java b/op-modules/op-mes/src/main/java/com/op/mes/domain/MesLineAssistant.java
new file mode 100644
index 00000000..dd1edddb
--- /dev/null
+++ b/op-modules/op-mes/src/main/java/com/op/mes/domain/MesLineAssistant.java
@@ -0,0 +1,278 @@
+package com.op.mes.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.op.common.core.annotation.Excel;
+import com.op.common.core.web.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.util.Date;
+
+/**
+ * 辅助工时摊分对象 mes_line_assistant_qty
+ *
+ * @author Open Platform
+ * @date 2025-03-21
+ */
+public class MesLineAssistant extends BaseEntity {
+private static final long serialVersionUID=1L;
+
+    /** 主键 */
+    private String id;
+
+    /** 工厂 */
+   @Excel(name = "工厂")
+   private String factoryCode;
+
+    @Excel(name = "车间")
+    private String carCode;
+
+    @Excel(name = "线体")
+    private String lineCode;
+
+    @Excel(name = "产品编码")
+    private String productCode;
+
+    @Excel(name = "产品名称")
+    private String productName;
+
+    @Excel(name = "产品工时")
+    private String productHour;
+
+    @Excel(name = "工时占比")
+    private String hourRatio;
+
+    @Excel(name = "辅助工时合计")
+    private String assistHourSum;
+
+    @Excel(name = "班长工时")
+    private String monitorHour;
+
+    @Excel(name = "组长工时")
+    private String groupLeaderHour;
+
+    @Excel(name = "物料员工时")
+    private String materialHour;
+
+    @Excel(name = "药管员工时")
+    private String pillMgrHour;
+
+    @Excel(name = "配药员工时")
+    private String pillDisHour;
+
+
+    /** 生产日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "生产日期", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date productDate;
+    private String productDateStr;
+
+    /** 班长人数 */
+    @Excel(name = "班长人数")
+    private Long monitorQty;
+
+    /** 组长人数 */
+    @Excel(name = "组长人数")
+    private Long groupleaderQty;
+
+    /** 物料员人数 */
+    @Excel(name = "物料员人数")
+    private Long materialQty;
+
+    /** 药管员人数 */
+    @Excel(name = "药管员人数")
+    private Long pillMgrQty;
+
+    /** 配药员人数 */
+    @Excel(name = "配药员人数")
+    private Long pillDisQty;
+    //班长10000150 车间组长10000168 物料员10000478 药管员10000271 配药员10000155
+    private String postId;
+
+    public String getPostId() {
+        return postId;
+    }
+
+    public void setPostId(String postId) {
+        this.postId = postId;
+    }
+
+    public void setId(String id){
+            this.id = id;
+            }
+
+    public String getId(){
+            return id;
+            }
+    public void setFactoryCode(String factoryCode){
+            this.factoryCode = factoryCode;
+    }
+
+    public String getFactoryCode(){
+            return factoryCode;
+            }
+    public void setProductDate(Date productDate){
+            this.productDate = productDate;
+            }
+
+    public Date getProductDate(){
+            return productDate;
+            }
+    public void setMonitorQty(Long monitorQty){
+            this.monitorQty = monitorQty;
+            }
+
+    public Long getMonitorQty(){
+            return monitorQty;
+            }
+    public void setGroupleaderQty(Long groupleaderQty){
+            this.groupleaderQty = groupleaderQty;
+            }
+
+    public Long getGroupleaderQty(){
+            return groupleaderQty;
+            }
+    public void setMaterialQty(Long materialQty){
+            this.materialQty = materialQty;
+            }
+
+    public Long getMaterialQty(){
+            return materialQty;
+            }
+    public void setPillMgrQty(Long pillMgrQty){
+            this.pillMgrQty = pillMgrQty;
+            }
+
+    public Long getPillMgrQty(){
+            return pillMgrQty;
+            }
+    public void setPillDisQty(Long pillDisQty){
+            this.pillDisQty = pillDisQty;
+            }
+
+    public Long getPillDisQty(){
+            return pillDisQty;
+            }
+
+    public String getCarCode() {
+        return carCode;
+    }
+
+    public void setCarCode(String carCode) {
+        this.carCode = carCode;
+    }
+
+    public String getLineCode() {
+        return lineCode;
+    }
+
+    public void setLineCode(String lineCode) {
+        this.lineCode = lineCode;
+    }
+
+    public String getProductCode() {
+        return productCode;
+    }
+
+    public void setProductCode(String productCode) {
+        this.productCode = productCode;
+    }
+
+    public String getProductName() {
+        return productName;
+    }
+
+    public void setProductName(String productName) {
+        this.productName = productName;
+    }
+
+    public String getProductHour() {
+        return productHour;
+    }
+
+    public void setProductHour(String productHour) {
+        this.productHour = productHour;
+    }
+
+    public String getHourRatio() {
+        return hourRatio;
+    }
+
+    public void setHourRatio(String hourRatio) {
+        this.hourRatio = hourRatio;
+    }
+
+    public String getAssistHourSum() {
+        return assistHourSum;
+    }
+
+    public void setAssistHourSum(String assistHourSum) {
+        this.assistHourSum = assistHourSum;
+    }
+
+    public String getMonitorHour() {
+        return monitorHour;
+    }
+
+    public void setMonitorHour(String monitorHour) {
+        this.monitorHour = monitorHour;
+    }
+
+    public String getGroupLeaderHour() {
+        return groupLeaderHour;
+    }
+
+    public void setGroupLeaderHour(String groupLeaderHour) {
+        this.groupLeaderHour = groupLeaderHour;
+    }
+
+    public String getMaterialHour() {
+        return materialHour;
+    }
+
+    public void setMaterialHour(String materialHour) {
+        this.materialHour = materialHour;
+    }
+
+    public String getPillMgrHour() {
+        return pillMgrHour;
+    }
+
+    public void setPillMgrHour(String pillMgrHour) {
+        this.pillMgrHour = pillMgrHour;
+    }
+
+    public String getPillDisHour() {
+        return pillDisHour;
+    }
+
+    public void setPillDisHour(String pillDisHour) {
+        this.pillDisHour = pillDisHour;
+    }
+
+    public String getProductDateStr() {
+        return productDateStr;
+    }
+
+    public void setProductDateStr(String productDateStr) {
+        this.productDateStr = productDateStr;
+    }
+
+    @Override
+public String toString(){
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id",getId())
+            .append("factoryCode",getFactoryCode())
+            .append("productDate",getProductDate())
+            .append("monitorQty",getMonitorQty())
+            .append("groupleaderQty",getGroupleaderQty())
+            .append("materialQty",getMaterialQty())
+            .append("pillMgrQty",getPillMgrQty())
+            .append("pillDisQty",getPillDisQty())
+            .append("createBy",getCreateBy())
+            .append("createTime",getCreateTime())
+            .append("updateBy",getUpdateBy())
+            .append("updateTime",getUpdateTime())
+        .toString();
+        }
+}
diff --git a/op-modules/op-mes/src/main/java/com/op/mes/domain/MesLineAssistantQty.java b/op-modules/op-mes/src/main/java/com/op/mes/domain/MesLineAssistantQty.java
new file mode 100644
index 00000000..ee38e887
--- /dev/null
+++ b/op-modules/op-mes/src/main/java/com/op/mes/domain/MesLineAssistantQty.java
@@ -0,0 +1,181 @@
+package com.op.mes.domain;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.op.common.core.annotation.Excel;
+import com.op.common.core.web.domain.BaseEntity;
+
+/**
+ * 辅助工时摊分对象 mes_line_assistant_qty
+ *
+ * @author Open Platform
+ * @date 2025-03-21
+ */
+public class MesLineAssistantQty extends BaseEntity {
+private static final long serialVersionUID=1L;
+
+    /** 主键 */
+    private String id;
+
+    /** 工厂 */
+   @Excel(name = "工厂")
+    private String factoryCode;
+
+    /** 生产日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "生产日期", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date productDate;
+    private String productDateStr;
+    /** 班长人数 */
+    @Excel(name = "班长人数")
+    private Long monitorQty;
+
+    /** 组长人数 */
+    @Excel(name = "组长人数")
+    private Long groupleaderQty;
+
+    /** 物料员人数 */
+    @Excel(name = "物料员人数")
+    private Long materialQty;
+
+    /** 药管员人数 */
+    @Excel(name = "药管员人数")
+    private Long pillMgrQty;
+
+    /** 配药员人数 */
+    @Excel(name = "配药员人数")
+    private Long pillDisQty;
+
+    /** 预留字段1 */
+    @Excel(name = "预留字段1")
+    private String attr1;
+
+    /** 预留字段2 */
+    @Excel(name = "预留字段2")
+    private String attr2;
+
+    /** 预留字段3 */
+    @Excel(name = "预留字段3")
+    private String attr3;
+
+    /** 预留字段4 */
+    @Excel(name = "预留字段4")
+    private String attr4;
+
+    public String getProductDateStr() {
+        return productDateStr;
+    }
+
+    public void setProductDateStr(String productDateStr) {
+        this.productDateStr = productDateStr;
+    }
+
+    public void setId(String id){
+            this.id = id;
+            }
+
+    public String getId(){
+            return id;
+            }
+    public void setFactoryCode(String factoryCode){
+            this.factoryCode = factoryCode;
+    }
+
+    public String getFactoryCode(){
+            return factoryCode;
+            }
+    public void setProductDate(Date productDate){
+            this.productDate = productDate;
+            }
+
+    public Date getProductDate(){
+            return productDate;
+            }
+    public void setMonitorQty(Long monitorQty){
+            this.monitorQty = monitorQty;
+            }
+
+    public Long getMonitorQty(){
+            return monitorQty;
+            }
+    public void setGroupleaderQty(Long groupleaderQty){
+            this.groupleaderQty = groupleaderQty;
+            }
+
+    public Long getGroupleaderQty(){
+            return groupleaderQty;
+            }
+    public void setMaterialQty(Long materialQty){
+            this.materialQty = materialQty;
+            }
+
+    public Long getMaterialQty(){
+            return materialQty;
+            }
+    public void setPillMgrQty(Long pillMgrQty){
+            this.pillMgrQty = pillMgrQty;
+            }
+
+    public Long getPillMgrQty(){
+            return pillMgrQty;
+            }
+    public void setPillDisQty(Long pillDisQty){
+            this.pillDisQty = pillDisQty;
+            }
+
+    public Long getPillDisQty(){
+            return pillDisQty;
+            }
+    public void setAttr1(String attr1){
+            this.attr1 = attr1;
+            }
+
+    public String getAttr1(){
+            return attr1;
+            }
+    public void setAttr2(String attr2){
+            this.attr2 = attr2;
+            }
+
+    public String getAttr2(){
+            return attr2;
+            }
+    public void setAttr3(String attr3){
+            this.attr3 = attr3;
+            }
+
+    public String getAttr3(){
+            return attr3;
+            }
+    public void setAttr4(String attr4){
+            this.attr4 = attr4;
+            }
+
+    public String getAttr4(){
+            return attr4;
+            }
+
+@Override
+public String toString(){
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id",getId())
+            .append("factoryCode",getFactoryCode())
+            .append("productDate",getProductDate())
+            .append("monitorQty",getMonitorQty())
+            .append("groupleaderQty",getGroupleaderQty())
+            .append("materialQty",getMaterialQty())
+            .append("pillMgrQty",getPillMgrQty())
+            .append("pillDisQty",getPillDisQty())
+            .append("attr1",getAttr1())
+            .append("attr2",getAttr2())
+            .append("attr3",getAttr3())
+            .append("attr4",getAttr4())
+            .append("createBy",getCreateBy())
+            .append("createTime",getCreateTime())
+            .append("updateBy",getUpdateBy())
+            .append("updateTime",getUpdateTime())
+        .toString();
+        }
+}
diff --git a/op-modules/op-mes/src/main/java/com/op/mes/domain/MesLineProduct.java b/op-modules/op-mes/src/main/java/com/op/mes/domain/MesLineProduct.java
index aa71949e..f9fb96dc 100644
--- a/op-modules/op-mes/src/main/java/com/op/mes/domain/MesLineProduct.java
+++ b/op-modules/op-mes/src/main/java/com/op/mes/domain/MesLineProduct.java
@@ -2,6 +2,8 @@ package com.op.mes.domain;
 
 import com.op.common.core.web.domain.BaseEntity;
 
+import java.math.BigDecimal;
+
 public class MesLineProduct extends BaseEntity {
     private static final long serialVersionUID = 1L;
 
@@ -21,6 +23,34 @@ public class MesLineProduct extends BaseEntity {
 
     private String attr2;
 
+    private String lineCode;
+    private BigDecimal hourEfficiency;
+    private BigDecimal useMan;
+
+    public BigDecimal getHourEfficiency() {
+        return hourEfficiency;
+    }
+
+    public void setHourEfficiency(BigDecimal hourEfficiency) {
+        this.hourEfficiency = hourEfficiency;
+    }
+
+    public BigDecimal getUseMan() {
+        return useMan;
+    }
+
+    public void setUseMan(BigDecimal useMan) {
+        this.useMan = useMan;
+    }
+
+    public String getLineCode() {
+        return lineCode;
+    }
+
+    public void setLineCode(String lineCode) {
+        this.lineCode = lineCode;
+    }
+
     public String getProductCode() {
         return productCode;
     }
diff --git a/op-modules/op-mes/src/main/java/com/op/mes/domain/vo/MesDailyEfficiencyVo.java b/op-modules/op-mes/src/main/java/com/op/mes/domain/vo/MesDailyEfficiencyVo.java
new file mode 100644
index 00000000..48e147bd
--- /dev/null
+++ b/op-modules/op-mes/src/main/java/com/op/mes/domain/vo/MesDailyEfficiencyVo.java
@@ -0,0 +1,636 @@
+package com.op.mes.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.op.common.core.annotation.Excel;
+import com.op.common.core.web.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.util.Date;
+
+/**
+ * 生产效率日报表
+ *
+ * @author Open Platform
+ * @date 2025-03-21
+ */
+public class MesDailyEfficiencyVo extends BaseEntity {
+private static final long serialVersionUID=1L;
+
+    /** 主键 */
+    private String id;
+
+    /** 生产日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "生产日期", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date productDate;
+
+    /** 工厂 */
+    @Excel(name = "工厂")
+    private String factoryCode;
+
+    @Excel(name = "车间")
+    private String carCode;
+
+    @Excel(name = "SAP线体编码")
+    private String lineCode;
+
+    private String productCode;
+    @Excel(name = "品类")
+    private String category;
+
+    @Excel(name = "产品名称")
+    private String productName;
+
+    @Excel(name = "规格")
+    private String spec;
+
+    @Excel(name = "单位")
+    private String unit;
+
+    @Excel(name = "计划产量(件/PC)")
+    private String planQty;
+
+    @Excel(name = "实际产量(件/PC)")
+    private String actQty;
+
+    @Excel(name = "实际产量(PC)")
+    private String actQtySon;
+
+    @Excel(name = "产量达成率")
+    private String completeRate;
+    //一线
+    @Excel(name = "标准工艺效率(PC/H)")
+    private String standEff;
+    @Excel(name = "标准用人")
+    private String standMan;
+    @Excel(name = "实际用人")
+    private String actMan;
+    @Excel(name = "产品标准工时")
+    private String standHour;
+    @Excel(name = "产品实际工时")
+    private String actHour;
+    @Excel(name = "一线工时合计")
+    private String oneHourSum;
+    @Excel(name = "一线标准效率")
+    private String oneStandEff;
+    @Excel(name = "一线实际效率")
+    private String oneActEff;
+    @Excel(name = "效率达成率")
+    private String effRate;
+    //辅助
+    ////辅助用人数
+    @Excel(name = "辅助用人合计")
+    private String assisManSum;
+    @Excel(name = "班长人数")
+    private String monitorQty;
+    @Excel(name = "组长人数")
+    private String groupleaderQty;
+    @Excel(name = "机操工人数")
+    private String operateMachineQty;
+    @Excel(name = "物料员人数")
+    private String materialQty;
+    @Excel(name = "配料员人数")
+    private String materialDisQty;
+    @Excel(name = "配药员人数")
+    private String pillDisQty;
+    @Excel(name = "药管员人数")
+    private String pillMgrQty;
+    @Excel(name = "锅炉工人数")
+    private String boilerQty;
+    @Excel(name = "石油气看管员人数")
+    private String oilQty;
+    @Excel(name = "库区管理员人数")
+    private String wareMgrQty;
+    @Excel(name = "机修工人数")
+    private String repairQty;
+    @Excel(name = "清洁工人数")
+    private String cleanerQty;
+    ////辅助工时数
+    @Excel(name = "辅助工时合计")
+    private String assisHourSum;
+    @Excel(name = "班长工时")
+    private String monitorHour;
+    @Excel(name = "组长工时")
+    private String groupleaderHour;
+    @Excel(name = "机操工工时")
+    private String operateMachineHour;
+    @Excel(name = "物料员工时")
+    private String materialHour;
+    @Excel(name = "配料员工时")
+    private String materialDisHour;
+    @Excel(name = "配药员工时")
+    private String pillDisHour;
+    @Excel(name = "药管员工时")
+    private String pillMgrHour;
+    @Excel(name = "锅炉工工时")
+    private String boilerHour;
+    @Excel(name = "石油气看管员工时")
+    private String oilHour;
+    @Excel(name = "库区管理员工时")
+    private String wareMgrHour;
+    @Excel(name = "机修工工时")
+    private String repairHour;
+    @Excel(name = "清洁工工时")
+    private String cleanerHour;
+    //一线+辅助
+    @Excel(name = "总工时")
+    private String hourSum;
+    @Excel(name = "效率提升基数")
+    private String effUpBase;
+    @Excel(name = "提升目标")
+    private String upGoal;
+    @Excel(name = "目标效率")
+    private String goalRate;
+    @Excel(name = "实际效率")
+    private String actRate;
+    @Excel(name = "效率提升率")
+    private String effUpRate;
+    @Excel(name = "原因分析")
+    private String reasonAnalysis;
+
+    private String workorderCode;
+
+    //班长10000150 车间组长10000168 物料员10000478 药管员10000271 配药员10000155
+    private String postId;
+
+    public String getPostId() {
+        return postId;
+    }
+
+    public void setPostId(String postId) {
+        this.postId = postId;
+    }
+
+    public void setId(String id){
+        this.id = id;
+    }
+
+    public String getId(){
+        return id;
+    }
+    public void setFactoryCode(String factoryCode){
+        this.factoryCode = factoryCode;
+    }
+
+    public String getFactoryCode(){
+        return factoryCode;
+    }
+    public void setProductDate(Date productDate){
+        this.productDate = productDate;
+    }
+
+    public Date getProductDate(){
+        return productDate;
+    }
+
+    public String getMonitorQty() {
+        return monitorQty;
+    }
+
+    public void setMonitorQty(String monitorQty) {
+        this.monitorQty = monitorQty;
+    }
+
+    public String getGroupleaderQty() {
+        return groupleaderQty;
+    }
+
+    public void setGroupleaderQty(String groupleaderQty) {
+        this.groupleaderQty = groupleaderQty;
+    }
+
+    public String getMaterialQty() {
+        return materialQty;
+    }
+
+    public void setMaterialQty(String materialQty) {
+        this.materialQty = materialQty;
+    }
+
+    public String getPillMgrQty() {
+        return pillMgrQty;
+    }
+
+    public void setPillMgrQty(String pillMgrQty) {
+        this.pillMgrQty = pillMgrQty;
+    }
+
+    public String getPillDisQty() {
+        return pillDisQty;
+    }
+
+    public void setPillDisQty(String pillDisQty) {
+        this.pillDisQty = pillDisQty;
+    }
+
+    public String getCarCode() {
+        return carCode;
+    }
+
+    public void setCarCode(String carCode) {
+        this.carCode = carCode;
+    }
+
+    public String getLineCode() {
+        return lineCode;
+    }
+
+    public void setLineCode(String lineCode) {
+        this.lineCode = lineCode;
+    }
+
+    public String getProductCode() {
+        return productCode;
+    }
+
+    public void setProductCode(String productCode) {
+        this.productCode = productCode;
+    }
+
+    public String getProductName() {
+        return productName;
+    }
+
+    public void setProductName(String productName) {
+        this.productName = productName;
+    }
+
+    public String getMonitorHour() {
+        return monitorHour;
+    }
+
+    public void setMonitorHour(String monitorHour) {
+        this.monitorHour = monitorHour;
+    }
+
+    public String getMaterialHour() {
+        return materialHour;
+    }
+
+    public void setMaterialHour(String materialHour) {
+        this.materialHour = materialHour;
+    }
+
+    public String getPillMgrHour() {
+        return pillMgrHour;
+    }
+
+    public void setPillMgrHour(String pillMgrHour) {
+        this.pillMgrHour = pillMgrHour;
+    }
+
+    public String getPillDisHour() {
+        return pillDisHour;
+    }
+
+    public void setPillDisHour(String pillDisHour) {
+        this.pillDisHour = pillDisHour;
+    }
+
+    public String getWorkorderCode() {
+        return workorderCode;
+    }
+
+    public void setWorkorderCode(String workorderCode) {
+        this.workorderCode = workorderCode;
+    }
+
+    public String getCategory() {
+        return category;
+    }
+
+    public void setCategory(String category) {
+        this.category = category;
+    }
+
+    public String getSpec() {
+        return spec;
+    }
+
+    public void setSpec(String spec) {
+        this.spec = spec;
+    }
+
+    public String getUnit() {
+        return unit;
+    }
+
+    public void setUnit(String unit) {
+        this.unit = unit;
+    }
+
+    public String getPlanQty() {
+        return planQty;
+    }
+
+    public void setPlanQty(String planQty) {
+        this.planQty = planQty;
+    }
+
+    public String getActQty() {
+        return actQty;
+    }
+
+    public void setActQty(String actQty) {
+        this.actQty = actQty;
+    }
+
+    public String getActQtySon() {
+        return actQtySon;
+    }
+
+    public void setActQtySon(String actQtySon) {
+        this.actQtySon = actQtySon;
+    }
+
+    public String getCompleteRate() {
+        return completeRate;
+    }
+
+    public void setCompleteRate(String completeRate) {
+        this.completeRate = completeRate;
+    }
+
+    public String getStandEff() {
+        return standEff;
+    }
+
+    public void setStandEff(String standEff) {
+        this.standEff = standEff;
+    }
+
+    public String getStandMan() {
+        return standMan;
+    }
+
+    public void setStandMan(String standMan) {
+        this.standMan = standMan;
+    }
+
+    public String getActMan() {
+        return actMan;
+    }
+
+    public void setActMan(String actMan) {
+        this.actMan = actMan;
+    }
+
+    public String getStandHour() {
+        return standHour;
+    }
+
+    public void setStandHour(String standHour) {
+        this.standHour = standHour;
+    }
+
+    public String getActHour() {
+        return actHour;
+    }
+
+    public void setActHour(String actHour) {
+        this.actHour = actHour;
+    }
+
+    public String getOneHourSum() {
+        return oneHourSum;
+    }
+
+    public void setOneHourSum(String oneHourSum) {
+        this.oneHourSum = oneHourSum;
+    }
+
+    public String getOneStandEff() {
+        return oneStandEff;
+    }
+
+    public void setOneStandEff(String oneStandEff) {
+        this.oneStandEff = oneStandEff;
+    }
+
+    public String getOneActEff() {
+        return oneActEff;
+    }
+
+    public void setOneActEff(String oneActEff) {
+        this.oneActEff = oneActEff;
+    }
+
+    public String getEffRate() {
+        return effRate;
+    }
+
+    public void setEffRate(String effRate) {
+        this.effRate = effRate;
+    }
+
+    public String getAssisManSum() {
+        return assisManSum;
+    }
+
+    public void setAssisManSum(String assisManSum) {
+        this.assisManSum = assisManSum;
+    }
+
+    public String getOperateMachineQty() {
+        return operateMachineQty;
+    }
+
+    public void setOperateMachineQty(String operateMachineQty) {
+        this.operateMachineQty = operateMachineQty;
+    }
+
+    public String getMaterialDisQty() {
+        return materialDisQty;
+    }
+
+    public void setMaterialDisQty(String materialDisQty) {
+        this.materialDisQty = materialDisQty;
+    }
+
+    public String getBoilerQty() {
+        return boilerQty;
+    }
+
+    public void setBoilerQty(String boilerQty) {
+        this.boilerQty = boilerQty;
+    }
+
+    public String getOilQty() {
+        return oilQty;
+    }
+
+    public void setOilQty(String oilQty) {
+        this.oilQty = oilQty;
+    }
+
+    public String getWareMgrQty() {
+        return wareMgrQty;
+    }
+
+    public void setWareMgrQty(String wareMgrQty) {
+        this.wareMgrQty = wareMgrQty;
+    }
+
+    public String getRepairQty() {
+        return repairQty;
+    }
+
+    public void setRepairQty(String repairQty) {
+        this.repairQty = repairQty;
+    }
+
+    public String getCleanerQty() {
+        return cleanerQty;
+    }
+
+    public void setCleanerQty(String cleanerQty) {
+        this.cleanerQty = cleanerQty;
+    }
+
+    public String getAssisHourSum() {
+        return assisHourSum;
+    }
+
+    public void setAssisHourSum(String assisHourSum) {
+        this.assisHourSum = assisHourSum;
+    }
+
+    public String getGroupleaderHour() {
+        return groupleaderHour;
+    }
+
+    public void setGroupleaderHour(String groupleaderHour) {
+        this.groupleaderHour = groupleaderHour;
+    }
+
+    public String getOperateMachineHour() {
+        return operateMachineHour;
+    }
+
+    public void setOperateMachineHour(String operateMachineHour) {
+        this.operateMachineHour = operateMachineHour;
+    }
+
+    public String getMaterialDisHour() {
+        return materialDisHour;
+    }
+
+    public void setMaterialDisHour(String materialDisHour) {
+        this.materialDisHour = materialDisHour;
+    }
+
+    public String getBoilerHour() {
+        return boilerHour;
+    }
+
+    public void setBoilerHour(String boilerHour) {
+        this.boilerHour = boilerHour;
+    }
+
+    public String getOilHour() {
+        return oilHour;
+    }
+
+    public void setOilHour(String oilHour) {
+        this.oilHour = oilHour;
+    }
+
+    public String getWareMgrHour() {
+        return wareMgrHour;
+    }
+
+    public void setWareMgrHour(String wareMgrHour) {
+        this.wareMgrHour = wareMgrHour;
+    }
+
+    public String getRepairHour() {
+        return repairHour;
+    }
+
+    public void setRepairHour(String repairHour) {
+        this.repairHour = repairHour;
+    }
+
+    public String getCleanerHour() {
+        return cleanerHour;
+    }
+
+    public void setCleanerHour(String cleanerHour) {
+        this.cleanerHour = cleanerHour;
+    }
+
+    public String getHourSum() {
+        return hourSum;
+    }
+
+    public void setHourSum(String hourSum) {
+        this.hourSum = hourSum;
+    }
+
+    public String getEffUpBase() {
+        return effUpBase;
+    }
+
+    public void setEffUpBase(String effUpBase) {
+        this.effUpBase = effUpBase;
+    }
+
+    public String getUpGoal() {
+        return upGoal;
+    }
+
+    public void setUpGoal(String upGoal) {
+        this.upGoal = upGoal;
+    }
+
+    public String getGoalRate() {
+        return goalRate;
+    }
+
+    public void setGoalRate(String goalRate) {
+        this.goalRate = goalRate;
+    }
+
+    public String getActRate() {
+        return actRate;
+    }
+
+    public void setActRate(String actRate) {
+        this.actRate = actRate;
+    }
+
+    public String getEffUpRate() {
+        return effUpRate;
+    }
+
+    public void setEffUpRate(String effUpRate) {
+        this.effUpRate = effUpRate;
+    }
+
+    public String getReasonAnalysis() {
+        return reasonAnalysis;
+    }
+
+    public void setReasonAnalysis(String reasonAnalysis) {
+        this.reasonAnalysis = reasonAnalysis;
+    }
+
+    @Override
+public String toString(){
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id",getId())
+            .append("factoryCode",getFactoryCode())
+            .append("productDate",getProductDate())
+            .append("monitorQty",getMonitorQty())
+            .append("groupleaderQty",getGroupleaderQty())
+            .append("materialQty",getMaterialQty())
+            .append("pillMgrQty",getPillMgrQty())
+            .append("pillDisQty",getPillDisQty())
+            .append("createBy",getCreateBy())
+            .append("createTime",getCreateTime())
+            .append("updateBy",getUpdateBy())
+            .append("updateTime",getUpdateTime())
+        .toString();
+        }
+}
diff --git a/op-modules/op-mes/src/main/java/com/op/mes/domain/vo/MesLineAssistantQtyVo.java b/op-modules/op-mes/src/main/java/com/op/mes/domain/vo/MesLineAssistantQtyVo.java
new file mode 100644
index 00000000..1b769a27
--- /dev/null
+++ b/op-modules/op-mes/src/main/java/com/op/mes/domain/vo/MesLineAssistantQtyVo.java
@@ -0,0 +1,278 @@
+package com.op.mes.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.op.common.core.annotation.Excel;
+import com.op.common.core.web.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.util.Date;
+
+/**
+ * 辅助工时摊分对象 mes_line_assistant_qty
+ *
+ * @author Open Platform
+ * @date 2025-03-21
+ */
+public class MesLineAssistantQtyVo extends BaseEntity {
+private static final long serialVersionUID=1L;
+
+    /** 主键 */
+    private String id;
+
+    /** 生产日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "生产日期", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date productDate;
+
+    /** 工厂 */
+    @Excel(name = "工厂")
+    private String factoryCode;
+
+    @Excel(name = "车间")
+    private String carCode;
+
+    @Excel(name = "SAP线体编码")
+    private String lineCode;
+
+    private String productCode;
+
+    @Excel(name = "产品名称")
+    private String productName;
+
+    @Excel(name = "产品工时")
+    private String productHour;
+
+    @Excel(name = "工时占比")
+    private String hourRatio;
+
+    @Excel(name = "辅助工时合计")
+    private String assistHourSum;
+
+    @Excel(name = "班长人数")
+    private String monitorQty;
+
+    @Excel(name = "班长工时")
+    private String monitorHour;
+
+    @Excel(name = "组长人数")
+    private String groupleaderQty;
+
+    @Excel(name = "组长工时")
+    private String groupLeaderHour;
+
+    @Excel(name = "物料员人数")
+    private String materialQty;
+
+    @Excel(name = "物料员工时")
+    private String materialHour;
+
+    @Excel(name = "药管员人数")
+    private String pillMgrQty;
+
+    @Excel(name = "药管员工时")
+    private String pillMgrHour;
+
+    @Excel(name = "配药员人数")
+    private String pillDisQty;
+
+    @Excel(name = "配药员工时")
+    private String pillDisHour;
+
+    private String workorderCode;
+
+    //班长10000150 车间组长10000168 物料员10000478 药管员10000271 配药员10000155
+    private String postId;
+
+    public String getPostId() {
+        return postId;
+    }
+
+    public void setPostId(String postId) {
+        this.postId = postId;
+    }
+
+    public void setId(String id){
+        this.id = id;
+    }
+
+    public String getId(){
+        return id;
+    }
+    public void setFactoryCode(String factoryCode){
+        this.factoryCode = factoryCode;
+    }
+
+    public String getFactoryCode(){
+        return factoryCode;
+    }
+    public void setProductDate(Date productDate){
+        this.productDate = productDate;
+    }
+
+    public Date getProductDate(){
+        return productDate;
+    }
+
+    public String getMonitorQty() {
+        return monitorQty;
+    }
+
+    public void setMonitorQty(String monitorQty) {
+        this.monitorQty = monitorQty;
+    }
+
+    public String getGroupleaderQty() {
+        return groupleaderQty;
+    }
+
+    public void setGroupleaderQty(String groupleaderQty) {
+        this.groupleaderQty = groupleaderQty;
+    }
+
+    public String getMaterialQty() {
+        return materialQty;
+    }
+
+    public void setMaterialQty(String materialQty) {
+        this.materialQty = materialQty;
+    }
+
+    public String getPillMgrQty() {
+        return pillMgrQty;
+    }
+
+    public void setPillMgrQty(String pillMgrQty) {
+        this.pillMgrQty = pillMgrQty;
+    }
+
+    public String getPillDisQty() {
+        return pillDisQty;
+    }
+
+    public void setPillDisQty(String pillDisQty) {
+        this.pillDisQty = pillDisQty;
+    }
+
+    public String getCarCode() {
+        return carCode;
+    }
+
+    public void setCarCode(String carCode) {
+        this.carCode = carCode;
+    }
+
+    public String getLineCode() {
+        return lineCode;
+    }
+
+    public void setLineCode(String lineCode) {
+        this.lineCode = lineCode;
+    }
+
+    public String getProductCode() {
+        return productCode;
+    }
+
+    public void setProductCode(String productCode) {
+        this.productCode = productCode;
+    }
+
+    public String getProductName() {
+        return productName;
+    }
+
+    public void setProductName(String productName) {
+        this.productName = productName;
+    }
+
+    public String getProductHour() {
+        return productHour;
+    }
+
+    public void setProductHour(String productHour) {
+        this.productHour = productHour;
+    }
+
+    public String getHourRatio() {
+        return hourRatio;
+    }
+
+    public void setHourRatio(String hourRatio) {
+        this.hourRatio = hourRatio;
+    }
+
+    public String getAssistHourSum() {
+        return assistHourSum;
+    }
+
+    public void setAssistHourSum(String assistHourSum) {
+        this.assistHourSum = assistHourSum;
+    }
+
+    public String getMonitorHour() {
+        return monitorHour;
+    }
+
+    public void setMonitorHour(String monitorHour) {
+        this.monitorHour = monitorHour;
+    }
+
+    public String getGroupLeaderHour() {
+        return groupLeaderHour;
+    }
+
+    public void setGroupLeaderHour(String groupLeaderHour) {
+        this.groupLeaderHour = groupLeaderHour;
+    }
+
+    public String getMaterialHour() {
+        return materialHour;
+    }
+
+    public void setMaterialHour(String materialHour) {
+        this.materialHour = materialHour;
+    }
+
+    public String getPillMgrHour() {
+        return pillMgrHour;
+    }
+
+    public void setPillMgrHour(String pillMgrHour) {
+        this.pillMgrHour = pillMgrHour;
+    }
+
+    public String getPillDisHour() {
+        return pillDisHour;
+    }
+
+    public void setPillDisHour(String pillDisHour) {
+        this.pillDisHour = pillDisHour;
+    }
+
+    public String getWorkorderCode() {
+        return workorderCode;
+    }
+
+    public void setWorkorderCode(String workorderCode) {
+        this.workorderCode = workorderCode;
+    }
+
+    @Override
+public String toString(){
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id",getId())
+            .append("factoryCode",getFactoryCode())
+            .append("productDate",getProductDate())
+            .append("monitorQty",getMonitorQty())
+            .append("groupleaderQty",getGroupleaderQty())
+            .append("materialQty",getMaterialQty())
+            .append("pillMgrQty",getPillMgrQty())
+            .append("pillDisQty",getPillDisQty())
+            .append("createBy",getCreateBy())
+            .append("createTime",getCreateTime())
+            .append("updateBy",getUpdateBy())
+            .append("updateTime",getUpdateTime())
+        .toString();
+        }
+}
diff --git a/op-modules/op-mes/src/main/java/com/op/mes/mapper/MesLineAssistantQtyMapper.java b/op-modules/op-mes/src/main/java/com/op/mes/mapper/MesLineAssistantQtyMapper.java
new file mode 100644
index 00000000..a3cd9835
--- /dev/null
+++ b/op-modules/op-mes/src/main/java/com/op/mes/mapper/MesLineAssistantQtyMapper.java
@@ -0,0 +1,87 @@
+package com.op.mes.mapper;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+import com.op.mes.domain.MesLineAssistant;
+import com.op.mes.domain.MesLineAssistantQty;
+import com.op.mes.domain.MesLineProduct;
+import com.op.mes.domain.MesReportWork;
+import com.op.mes.domain.vo.MesDailyEfficiencyVo;
+import com.op.mes.domain.vo.MesLineAssistantQtyVo;
+import org.apache.ibatis.annotations.MapKey;
+
+/**
+ * 辅助工时摊分Mapper接口
+ *
+ * @author Open Platform
+ * @date 2025-03-21
+ */
+public interface MesLineAssistantQtyMapper {
+    /**
+     * 查询辅助工时摊分
+     *
+     * @param id 辅助工时摊分主键
+     * @return 辅助工时摊分
+     */
+    public MesLineAssistantQty selectMesLineAssistantQtyById(String id);
+
+    /**
+     * 查询辅助工时摊分列表
+     *
+     * @param mesLineAssistantQty 辅助工时摊分
+     * @return 辅助工时摊分集合
+     */
+    public List<MesLineAssistantQty> selectMesLineAssistantQtyList(MesLineAssistantQty mesLineAssistantQty);
+
+    /**
+     * 新增辅助工时摊分
+     *
+     * @param mesLineAssistantQty 辅助工时摊分
+     * @return 结果
+     */
+    public int insertMesLineAssistantQty(MesLineAssistantQty mesLineAssistantQty);
+
+    /**
+     * 修改辅助工时摊分
+     *
+     * @param mesLineAssistantQty 辅助工时摊分
+     * @return 结果
+     */
+    public int updateMesLineAssistantQty(MesLineAssistantQty mesLineAssistantQty);
+
+    /**
+     * 删除辅助工时摊分
+     *
+     * @param id 辅助工时摊分主键
+     * @return 结果
+     */
+    public int deleteMesLineAssistantQtyById(String id);
+
+    /**
+     * 批量删除辅助工时摊分
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteMesLineAssistantQtyByIds(String[] ids);
+
+    String getHasdate(MesLineAssistantQty mesLineAssistantQty);
+
+    public List<MesLineAssistantQtyVo> selectEfficiencyHourList(MesLineAssistant mesLineAssistant);
+    BigDecimal getHoursByOrderCode(String workorderCode);
+    @MapKey("productDateStr")
+    Map<String, MesLineAssistantQty> getAssistMaps(MesLineAssistant mesLineAssistant);
+    BigDecimal getKqHourMaps(MesLineAssistant mesLineAssistant);
+
+    public List<MesDailyEfficiencyVo> selectEfficiencyDayList(MesLineAssistant mesLineAssistant);
+
+    BigDecimal getPlanQtyByOrderCode(String workorderCode);
+
+    BigDecimal getActQtyByOrderCode(String workorderCode);
+
+    MesLineProduct getStandarInfo(MesDailyEfficiencyVo effdto);
+
+    MesReportWork getSonActManByOrderCode(String workorderCode);
+}
diff --git a/op-modules/op-mes/src/main/java/com/op/mes/service/IMesLineAssistantQtyService.java b/op-modules/op-mes/src/main/java/com/op/mes/service/IMesLineAssistantQtyService.java
new file mode 100644
index 00000000..018d6c4f
--- /dev/null
+++ b/op-modules/op-mes/src/main/java/com/op/mes/service/IMesLineAssistantQtyService.java
@@ -0,0 +1,69 @@
+package com.op.mes.service;
+
+import java.util.List;
+
+import com.op.mes.domain.MesLineAssistant;
+import com.op.mes.domain.MesLineAssistantQty;
+import com.op.mes.domain.vo.MesDailyEfficiencyVo;
+import com.op.mes.domain.vo.MesLineAssistantQtyVo;
+
+/**
+ * 辅助工时摊分Service接口
+ *
+ * @author Open Platform
+ * @date 2025-03-21
+ */
+public interface IMesLineAssistantQtyService {
+    /**
+     * 查询辅助工时摊分
+     *
+     * @param id 辅助工时摊分主键
+     * @return 辅助工时摊分
+     */
+    public MesLineAssistantQty selectMesLineAssistantQtyById(String id);
+
+    /**
+     * 查询辅助工时摊分列表
+     *
+     * @param mesLineAssistantQty 辅助工时摊分
+     * @return 辅助工时摊分集合
+     */
+    public List<MesLineAssistantQty> selectMesLineAssistantQtyList(MesLineAssistantQty mesLineAssistantQty);
+
+    /**
+     * 新增辅助工时摊分
+     *
+     * @param mesLineAssistantQty 辅助工时摊分
+     * @return 结果
+     */
+    public int insertMesLineAssistantQty(MesLineAssistantQty mesLineAssistantQty);
+
+    /**
+     * 修改辅助工时摊分
+     *
+     * @param mesLineAssistantQty 辅助工时摊分
+     * @return 结果
+     */
+    public int updateMesLineAssistantQty(MesLineAssistantQty mesLineAssistantQty);
+
+    /**
+     * 批量删除辅助工时摊分
+     *
+     * @param ids 需要删除的辅助工时摊分主键集合
+     * @return 结果
+     */
+    public int deleteMesLineAssistantQtyByIds(String[] ids);
+
+    /**
+     * 删除辅助工时摊分信息
+     *
+     * @param id 辅助工时摊分主键
+     * @return 结果
+     */
+    public int deleteMesLineAssistantQtyById(String id);
+
+    public List<MesLineAssistantQtyVo> selectEfficiencyHourList(MesLineAssistant mesLineAssistant);
+
+
+    public List<MesDailyEfficiencyVo> selectEfficiencyDayList(MesLineAssistant mesLineAssistant);
+}
diff --git a/op-modules/op-mes/src/main/java/com/op/mes/service/impl/MesLineAssistantQtyServiceImpl.java b/op-modules/op-mes/src/main/java/com/op/mes/service/impl/MesLineAssistantQtyServiceImpl.java
new file mode 100644
index 00000000..9994afd4
--- /dev/null
+++ b/op-modules/op-mes/src/main/java/com/op/mes/service/impl/MesLineAssistantQtyServiceImpl.java
@@ -0,0 +1,439 @@
+package com.op.mes.service.impl;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+import com.alibaba.nacos.common.utils.CollectionUtils;
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.op.common.core.context.SecurityContextHolder;
+import com.op.common.core.utils.DateUtils;
+import com.op.common.core.utils.StringUtils;
+import com.op.common.core.utils.uuid.IdUtils;
+import com.op.mes.domain.MesLineAssistant;
+import com.op.mes.domain.MesLineProduct;
+import com.op.mes.domain.MesReportWork;
+import com.op.mes.domain.vo.MesDailyEfficiencyVo;
+import com.op.mes.domain.vo.MesLineAssistantQtyVo;
+import com.op.system.api.domain.mes.ProOrderWorkorderDTO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.op.mes.mapper.MesLineAssistantQtyMapper;
+import com.op.mes.domain.MesLineAssistantQty;
+import com.op.mes.service.IMesLineAssistantQtyService;
+
+
+/**
+ * 辅助工时摊分Service业务层处理
+ *
+ * @author Open Platform
+ * @date 2025-03-21
+ */
+@Service
+public class MesLineAssistantQtyServiceImpl implements IMesLineAssistantQtyService {
+    @Autowired
+    private MesLineAssistantQtyMapper mesLineAssistantQtyMapper;
+
+    /**
+     * 查询辅助工时摊分
+     *
+     * @param id 辅助工时摊分主键
+     * @return 辅助工时摊分
+     */
+    @Override
+    @DS("#header.poolName")
+    public MesLineAssistantQty selectMesLineAssistantQtyById(String id) {
+        return mesLineAssistantQtyMapper.selectMesLineAssistantQtyById(id);
+    }
+
+    /**
+     * 查询辅助工时摊分列表
+     *
+     * @param mesLineAssistantQty 辅助工时摊分
+     * @return 辅助工时摊分
+     */
+    @Override
+    @DS("#header.poolName")
+    public List<MesLineAssistantQty> selectMesLineAssistantQtyList(MesLineAssistantQty mesLineAssistantQty) {
+        return mesLineAssistantQtyMapper.selectMesLineAssistantQtyList(mesLineAssistantQty);
+    }
+
+    /**
+     * 新增辅助工时摊分
+     *
+     * @param mesLineAssistantQty 辅助工时摊分
+     * @return 结果
+     */
+    @Override
+    @DS("#header.poolName")
+    public int insertMesLineAssistantQty(MesLineAssistantQty mesLineAssistantQty) {
+        mesLineAssistantQty.setCreateTime(DateUtils.getNowDate());
+        mesLineAssistantQty.setId(IdUtils.fastSimpleUUID());
+        mesLineAssistantQty.setCreateBy(SecurityContextHolder.getUserName());
+        //一个日期只能存一条
+        String dateStr = mesLineAssistantQtyMapper.getHasdate(mesLineAssistantQty);
+        if(StringUtils.isNotBlank(dateStr)){
+            return 0;
+        }
+//        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+//        String key = "#header.poolName";
+//        mesLineAssistantQty.setFactoryCode(request.getHeader(key.substring(8)).replace("ds_", ""));
+        return mesLineAssistantQtyMapper.insertMesLineAssistantQty(mesLineAssistantQty);
+    }
+
+    /**
+     * 修改辅助工时摊分
+     *
+     * @param mesLineAssistantQty 辅助工时摊分
+     * @return 结果
+     */
+    @Override
+    @DS("#header.poolName")
+    public int updateMesLineAssistantQty(MesLineAssistantQty mesLineAssistantQty) {
+                mesLineAssistantQty.setUpdateTime(DateUtils.getNowDate());
+        return mesLineAssistantQtyMapper.updateMesLineAssistantQty(mesLineAssistantQty);
+    }
+
+    /**
+     * 批量删除辅助工时摊分
+     *
+     * @param ids 需要删除的辅助工时摊分主键
+     * @return 结果
+     */
+    @Override
+    @DS("#header.poolName")
+    public int deleteMesLineAssistantQtyByIds(String[] ids) {
+        return mesLineAssistantQtyMapper.deleteMesLineAssistantQtyByIds(ids);
+    }
+
+    /**
+     * 删除辅助工时摊分信息
+     *
+     * @param id 辅助工时摊分主键
+     * @return 结果
+     */
+    @Override
+    @DS("#header.poolName")
+    public int deleteMesLineAssistantQtyById(String id) {
+        return mesLineAssistantQtyMapper.deleteMesLineAssistantQtyById(id);
+    }
+
+    /**辅助工时摊分方式**/
+    @Override
+    @DS("#header.poolName")
+    public List<MesLineAssistantQtyVo> selectEfficiencyHourList(MesLineAssistant mesLineAssistant) {
+        List<MesLineAssistantQtyVo> dtos =  mesLineAssistantQtyMapper.selectEfficiencyHourList(mesLineAssistant);
+        if(CollectionUtils.isEmpty(dtos)){
+            return null;
+        }
+        Map<String,MesLineAssistantQty> assistMaps = mesLineAssistantQtyMapper.getAssistMaps(mesLineAssistant);
+        if(assistMaps.isEmpty()){
+            return dtos;
+        }
+        //班长10000150 车间组长10000168 物料员10000478 药管员10000271 配药员10000155
+        mesLineAssistant.setPostId("10000150");
+        BigDecimal monitorHour = mesLineAssistantQtyMapper.getKqHourMaps(mesLineAssistant);
+        mesLineAssistant.setPostId("10000168");
+        BigDecimal groupleadeHour = mesLineAssistantQtyMapper.getKqHourMaps(mesLineAssistant);
+        mesLineAssistant.setPostId("10000478");
+        BigDecimal materialHour= mesLineAssistantQtyMapper.getKqHourMaps(mesLineAssistant);
+        mesLineAssistant.setPostId("10000271");
+        BigDecimal pillMgrHour = mesLineAssistantQtyMapper.getKqHourMaps(mesLineAssistant);
+        mesLineAssistant.setPostId("10000155");
+        BigDecimal pillDisHour = mesLineAssistantQtyMapper.getKqHourMaps(mesLineAssistant);
+        BigDecimal allProHours = BigDecimal.ZERO;
+        for(MesLineAssistantQtyVo assistdto:dtos){
+            //产品工时(用母单的)
+            BigDecimal hours = mesLineAssistantQtyMapper.getHoursByOrderCode(assistdto.getWorkorderCode());
+            hours = hours==null?BigDecimal.ZERO:hours;
+            assistdto.setProductHour(hours.toString());
+            allProHours = allProHours.add(hours);
+            if(!assistMaps.isEmpty()){
+                MesLineAssistantQty manQty = assistMaps.get(mesLineAssistant.getProductDateStr());
+                if(manQty!=null){
+                    //班长用人=当日人数/线体数
+                    assistdto.setMonitorQty(new BigDecimal(manQty.getMonitorQty())
+                            .divide(new BigDecimal(dtos.size()),2,BigDecimal.ROUND_HALF_UP)
+                            .toString()
+                    );
+                    //班长工时=当日考勤小时数/线体数
+                    assistdto.setMonitorHour(
+                            monitorHour.divide(new BigDecimal(dtos.size()),2,BigDecimal.ROUND_HALF_UP).toString());
+                    //组长用人=当日人数/线体数
+                    assistdto.setGroupleaderQty(new BigDecimal(manQty.getGroupleaderQty())
+                            .divide(new BigDecimal(dtos.size()),2,BigDecimal.ROUND_HALF_UP)
+                            .toString()
+                    );
+                    //组长工时=当日考勤小时数/线体数
+                    assistdto.setGroupLeaderHour(
+                            groupleadeHour.divide(new BigDecimal(dtos.size()),2,BigDecimal.ROUND_HALF_UP).toString());
+                    //物料员用人=当日人数/线体数
+                    assistdto.setMaterialQty(new BigDecimal(manQty.getMaterialQty())
+                            .divide(new BigDecimal(dtos.size()),2,BigDecimal.ROUND_HALF_UP)
+                            .toString()
+                    );
+                    //物料员工时=当日考勤小时数/线体数
+                    assistdto.setMaterialHour(
+                            materialHour.divide(new BigDecimal(dtos.size()),2,BigDecimal.ROUND_HALF_UP).toString());
+                    //药管员用人=当日人数/线体数
+                    assistdto.setPillMgrQty(new BigDecimal(manQty.getPillMgrQty())
+                            .divide(new BigDecimal(dtos.size()),2,BigDecimal.ROUND_HALF_UP)
+                            .toString()
+                    );
+                    //药管员工时=当日考勤小时数/线体数
+                    assistdto.setPillMgrHour(
+                            pillMgrHour.divide(new BigDecimal(dtos.size()),2,BigDecimal.ROUND_HALF_UP).toString());
+                    //配药员用人=当日人数/线体数
+                    assistdto.setPillDisQty(new BigDecimal(manQty.getPillDisQty())
+                            .divide(new BigDecimal(dtos.size()),2,BigDecimal.ROUND_HALF_UP)
+                            .toString()
+                    );
+                    //配药员工时=当日考勤小时数/线体数
+                    assistdto.setPillDisHour(
+                            pillDisHour.divide(new BigDecimal(dtos.size()),2,BigDecimal.ROUND_HALF_UP).toString());
+                }
+            }
+        }
+        for(MesLineAssistantQtyVo assistdto:dtos){
+            //工时占比
+            assistdto.setHourRatio(new BigDecimal(assistdto.getProductHour())
+                    .multiply(new BigDecimal("100.00"))
+                    .divide(allProHours,2,BigDecimal.ROUND_HALF_UP)
+                    .toString()+"%"
+            );
+            //辅助工时合计
+            assistdto.setMonitorHour(StringUtils.isEmpty(assistdto.getMonitorHour())?"0":assistdto.getMonitorHour());
+            assistdto.setGroupLeaderHour(StringUtils.isEmpty(assistdto.getGroupLeaderHour())?"0":assistdto.getGroupLeaderHour());
+            assistdto.setMaterialHour(StringUtils.isEmpty(assistdto.getMaterialHour())?"0":assistdto.getMaterialHour());
+            assistdto.setPillMgrHour(StringUtils.isEmpty(assistdto.getPillMgrHour())?"0":assistdto.getPillMgrHour());
+            assistdto.setPillDisHour(StringUtils.isEmpty(assistdto.getPillDisHour())?"0":assistdto.getPillDisHour());
+            assistdto.setAssistHourSum(
+               new BigDecimal(assistdto.getMonitorHour())
+                    .add(new BigDecimal(assistdto.getGroupLeaderHour()))
+                       .add(new BigDecimal(assistdto.getMaterialHour()))
+                       .add(new BigDecimal(assistdto.getPillMgrHour()))
+                       .add(new BigDecimal(assistdto.getPillDisHour()))
+                    .toString()
+            );
+        }
+
+        MesLineAssistantQtyVo assistdto0 = new MesLineAssistantQtyVo();
+        //assistdto0.setProductDate(dtos.get(0).getProductDate());
+        //assistdto0.setFactoryCode(dtos.get(0).getFactoryCode());
+        //assistdto0.setCarCode(dtos.get(0).getCarCode());
+        assistdto0.setLineCode(dtos.size()+"");
+        assistdto0.setProductName(dtos.size()+"");
+        assistdto0.setProductHour(allProHours.toString());
+        assistdto0.setHourRatio("100%");
+        assistdto0.setAssistHourSum(
+                monitorHour.add(groupleadeHour).add(materialHour).add(pillMgrHour).add(pillDisHour).toString()
+        );
+        MesLineAssistantQty manQty = assistMaps.get(mesLineAssistant.getProductDateStr());
+        assistdto0.setMonitorQty(manQty.getMonitorQty().toString());
+        assistdto0.setMonitorHour(monitorHour.toString());
+        assistdto0.setGroupleaderQty(manQty.getGroupleaderQty().toString());
+        assistdto0.setGroupLeaderHour(groupleadeHour.toString());
+        assistdto0.setMaterialQty(manQty.getMaterialQty().toString());
+        assistdto0.setMaterialHour(materialHour.toString());
+        assistdto0.setPillMgrQty(manQty.getPillMgrQty().toString());
+        assistdto0.setPillMgrHour(pillMgrHour.toString());
+        assistdto0.setPillDisQty(manQty.getPillDisQty().toString());
+        assistdto0.setPillDisHour(pillDisHour.toString());
+        dtos.add(assistdto0);
+        return dtos;
+    }
+    /**生产日效率报表**/
+    @Override
+    @DS("#header.poolName")
+    public List<MesDailyEfficiencyVo> selectEfficiencyDayList(MesLineAssistant mesLineAssistant) {
+        List<MesDailyEfficiencyVo> dtos = mesLineAssistantQtyMapper.selectEfficiencyDayList(mesLineAssistant);
+        if (CollectionUtils.isEmpty(dtos)) {
+            return null;
+        }
+        Map<String, MesLineAssistantQty> assistMaps = mesLineAssistantQtyMapper.getAssistMaps(mesLineAssistant);
+        if (assistMaps.isEmpty()) {
+            return dtos;
+        }
+        for(MesDailyEfficiencyVo effdto:dtos) {
+            //计划产量(件/PC)(用母单的)
+            BigDecimal planQty = mesLineAssistantQtyMapper.getPlanQtyByOrderCode(effdto.getWorkorderCode());
+            effdto.setPlanQty(planQty.toString());
+            //实际产量(件)
+            BigDecimal actQty = mesLineAssistantQtyMapper.getActQtyByOrderCode(effdto.getWorkorderCode());
+            actQty = actQty==null?BigDecimal.ZERO:actQty;
+            effdto.setActQty(actQty.toString());
+            //实际产量(PC)=规格*实际产量(件)
+            effdto.setActQtySon(actQty.multiply(new BigDecimal(effdto.getSpec())).toString());
+            //产量达成率 = 实际产量(件)/计划产量(件/PC)
+            effdto.setCompleteRate(
+                    actQty.multiply(new BigDecimal("100"))
+                    .divide(planQty,2,BigDecimal.ROUND_HALF_UP).toString());
+            //标准效率、标准用人、标准工时
+            MesLineProduct mesStandar = mesLineAssistantQtyMapper.getStandarInfo(effdto);
+            if(mesStandar != null){
+                /****************一线****************/
+                //一线标准效率(PC/H)
+                effdto.setStandEff(mesStandar.getHourEfficiency().toString());
+                //一线标准用人
+                effdto.setStandMan(mesStandar.getUseMan().toString());
+                //一线标准工时=实际产量(PC)/标准工艺效率(PC/H)
+                effdto.setStandHour(
+                    new BigDecimal(effdto.getActQtySon())
+                    .divide(mesStandar.getHourEfficiency(),2,BigDecimal.ROUND_HALF_UP).toString()
+                );
+                //一线实际用人(子单)
+                MesReportWork actManSon = mesLineAssistantQtyMapper.getSonActManByOrderCode(effdto.getWorkorderCode());
+                if(actManSon != null){
+                    effdto.setActMan(actManSon.getUseMan().toString());
+                    //一线实际工时(子单)
+                    effdto.setActHour(actManSon.getWorkTime().toString());
+                    //一线工时合计=实际用人*产品实际工时
+                    effdto.setOneHourSum(
+                            new BigDecimal(actManSon.getUseMan())
+                                    .multiply(actManSon.getWorkTime()).toString()
+                    );
+                }
+                //一线标准效率=实际产量(件)/标准用人/产品标准工时
+                if(new BigDecimal(effdto.getStandMan()).compareTo(BigDecimal.ZERO)!=0
+                        &&new BigDecimal(effdto.getStandHour()).compareTo(BigDecimal.ZERO)!=0){
+                    effdto.setOneStandEff(actQty
+                            .divide(new BigDecimal(effdto.getStandMan()),4,BigDecimal.ROUND_HALF_UP)
+                            .divide(new BigDecimal(effdto.getStandHour()),2,BigDecimal.ROUND_HALF_UP)
+                            .toString()
+                    );
+                }else{
+                    effdto.setOneStandEff("0");
+                }
+
+                //一线实际效率=实际产量(件)/一线工时合计
+                if(StringUtils.isNotBlank(effdto.getOneHourSum())&&
+                        new BigDecimal(effdto.getOneHourSum()).compareTo(BigDecimal.ZERO) !=0){
+                    effdto.setOneActEff(actQty.divide(new BigDecimal(effdto.getOneHourSum()),2,BigDecimal.ROUND_HALF_UP).toString());
+                }else{
+                    effdto.setOneActEff("0");
+                }
+                //效率达成率=一线实际效率/一线标准效率
+                if(new BigDecimal(effdto.getOneStandEff().replace("%","")).compareTo(BigDecimal.ZERO)!=0){
+                    effdto.setEffRate(
+                            (new BigDecimal(effdto.getOneActEff().replace("%","")))
+                                    .multiply(new BigDecimal("100"))
+                                    .divide(new BigDecimal(effdto.getOneStandEff().replace("%","")),2,BigDecimal.ROUND_HALF_UP)
+                                    +"%"
+                    );
+                }else{
+                    effdto.setEffRate("0");
+                }
+            }
+        }
+        /****************辅助****************/
+        //班长10000150 车间组长10000168 物料员10000478 药管员10000271 配药员10000155
+        mesLineAssistant.setPostId("10000150");
+        BigDecimal monitorHour = mesLineAssistantQtyMapper.getKqHourMaps(mesLineAssistant);
+        mesLineAssistant.setPostId("10000168");
+        BigDecimal groupleadeHour = mesLineAssistantQtyMapper.getKqHourMaps(mesLineAssistant);
+        mesLineAssistant.setPostId("10000478");
+        BigDecimal materialHour= mesLineAssistantQtyMapper.getKqHourMaps(mesLineAssistant);
+        mesLineAssistant.setPostId("10000271");
+        BigDecimal pillMgrHour = mesLineAssistantQtyMapper.getKqHourMaps(mesLineAssistant);
+        mesLineAssistant.setPostId("10000155");
+        BigDecimal pillDisHour = mesLineAssistantQtyMapper.getKqHourMaps(mesLineAssistant);
+        //辅助用人合计
+        BigDecimal assisManSum = BigDecimal.ZERO;
+        //辅助工时合计
+        BigDecimal assisHourSum = BigDecimal.ZERO;
+
+        for(MesDailyEfficiencyVo effdto:dtos){
+            //产品工时(用母单的)
+            if(!assistMaps.isEmpty()){
+                MesLineAssistantQty manQty = assistMaps.get(mesLineAssistant.getProductDateStr());
+                if(manQty!=null){
+                    //班长用人=当日人数/线体数
+                    effdto.setMonitorQty(new BigDecimal(manQty.getMonitorQty())
+                            .divide(new BigDecimal(dtos.size()),2,BigDecimal.ROUND_HALF_UP)
+                            .toString()
+                    );
+                    assisManSum = assisManSum.add(new BigDecimal(effdto.getMonitorQty()));//DOSUM;
+                    //班长工时=当日考勤小时数/线体数
+                    effdto.setMonitorHour(
+                            monitorHour.divide(new BigDecimal(dtos.size()),2,BigDecimal.ROUND_HALF_UP).toString());
+                    assisHourSum = assisHourSum.add(new BigDecimal(effdto.getMonitorHour()));//DOSUM;
+                    //组长用人=当日人数/线体数
+                    effdto.setGroupleaderQty(new BigDecimal(manQty.getGroupleaderQty())
+                            .divide(new BigDecimal(dtos.size()),2,BigDecimal.ROUND_HALF_UP)
+                            .toString()
+                    );
+                    assisManSum = assisManSum.add(new BigDecimal(effdto.getGroupleaderQty()));//DOSUM;
+                    //组长工时=当日考勤小时数/线体数
+                    effdto.setGroupleaderHour(
+                            groupleadeHour.divide(new BigDecimal(dtos.size()),2,BigDecimal.ROUND_HALF_UP).toString());
+                    assisHourSum = assisHourSum.add(new BigDecimal(effdto.getGroupleaderHour()));//DOSUM;
+                    //物料员用人=当日人数/线体数
+                    effdto.setMaterialQty(new BigDecimal(manQty.getMaterialQty())
+                            .divide(new BigDecimal(dtos.size()),2,BigDecimal.ROUND_HALF_UP)
+                            .toString()
+                    );
+                    assisManSum = assisManSum.add(new BigDecimal(effdto.getMaterialQty()));//DOSUM;
+                    //物料员工时=当日考勤小时数/线体数
+                    effdto.setMaterialHour(
+                            materialHour.divide(new BigDecimal(dtos.size()),2,BigDecimal.ROUND_HALF_UP).toString());
+                    assisHourSum = assisHourSum.add(new BigDecimal(effdto.getMaterialHour()));//DOSUM;
+                    //药管员用人=当日人数/线体数
+                    effdto.setPillMgrQty(new BigDecimal(manQty.getPillMgrQty())
+                            .divide(new BigDecimal(dtos.size()),2,BigDecimal.ROUND_HALF_UP)
+                            .toString()
+                    );
+                    assisManSum = assisManSum.add(new BigDecimal(effdto.getPillMgrQty()));//DOSUM;
+                    //药管员工时=当日考勤小时数/线体数
+                    effdto.setPillMgrHour(
+                            pillMgrHour.divide(new BigDecimal(dtos.size()),2,BigDecimal.ROUND_HALF_UP).toString());
+                    assisHourSum = assisHourSum.add(new BigDecimal(effdto.getPillMgrHour()));//DOSUM;
+                    //配药员用人=当日人数/线体数
+                    effdto.setPillDisQty(new BigDecimal(manQty.getPillDisQty())
+                            .divide(new BigDecimal(dtos.size()),2,BigDecimal.ROUND_HALF_UP)
+                            .toString()
+                    );
+                    assisManSum = assisManSum.add(new BigDecimal(effdto.getPillDisQty()));//DOSUM;
+                    //配药员工时=当日考勤小时数/线体数
+                    effdto.setPillDisHour(
+                            pillDisHour.divide(new BigDecimal(dtos.size()),2,BigDecimal.ROUND_HALF_UP).toString());
+                    assisHourSum = assisHourSum.add(new BigDecimal(effdto.getPillDisHour()));//DOSUM;
+                    //辅助用人合计
+                    effdto.setAssisManSum(assisManSum.toString());
+                    //辅助工时合计
+                    effdto.setAssisHourSum(assisHourSum.toString());
+                    /******************一线+辅助******************/
+                    //总工时=一线合计工时+辅助工时合计
+                    effdto.setOneHourSum(StringUtils.isEmpty(effdto.getOneHourSum())?"0":effdto.getOneHourSum());
+                    effdto.setAssisHourSum(StringUtils.isEmpty(effdto.getAssisHourSum())?"0":effdto.getAssisHourSum());
+                    effdto.setHourSum(new BigDecimal(effdto.getOneHourSum()).add(new BigDecimal(effdto.getAssisHourSum())).toString());
+                    //目标效率=效率提升基数*(提升目标+1)
+                    effdto.setEffUpBase(StringUtils.isEmpty(effdto.getEffUpBase())?"0":effdto.getEffUpBase());
+                    effdto.setUpGoal(StringUtils.isEmpty(effdto.getUpGoal())?"0":effdto.getUpGoal());
+                    effdto.setGoalRate(new BigDecimal(effdto.getEffUpBase())
+                    .multiply(new BigDecimal(effdto.getUpGoal()).add(new BigDecimal("1"))).toString());
+                    //实际效率=实际产量(件)/总工时
+                    if(new BigDecimal(effdto.getHourSum()).compareTo(BigDecimal.ZERO)!=0){
+                        effdto.setActRate(new BigDecimal(effdto.getActQty())
+                                .divide(new BigDecimal(effdto.getHourSum()),2,BigDecimal.ROUND_HALF_UP).toString());
+                    }else{
+                        effdto.setActRate("0");
+                    }
+
+                    //效率提升率=实际效率/效率提升基数-1
+                    if(StringUtils.isNotBlank(effdto.getEffUpBase())&&
+                            new BigDecimal(effdto.getEffUpBase()).compareTo(BigDecimal.ZERO)!=0
+                    ){
+                        effdto.setEffUpRate(
+                                new BigDecimal(effdto.getActRate())
+                                        .multiply(new BigDecimal("100"))
+                                        .divide(new BigDecimal(effdto.getEffUpBase()),2,BigDecimal.ROUND_HALF_UP)
+                                        .subtract(new BigDecimal("100"))+"%"
+                        );
+                    }
+                }
+
+            }
+        }
+        return dtos;
+    }
+}
diff --git a/op-modules/op-mes/src/main/resources/mapper/mes/MesLineAssistantQtyMapper.xml b/op-modules/op-mes/src/main/resources/mapper/mes/MesLineAssistantQtyMapper.xml
new file mode 100644
index 00000000..ce049510
--- /dev/null
+++ b/op-modules/op-mes/src/main/resources/mapper/mes/MesLineAssistantQtyMapper.xml
@@ -0,0 +1,337 @@
+<?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="com.op.mes.mapper.MesLineAssistantQtyMapper">
+
+    <resultMap type="MesLineAssistantQty" id="MesLineAssistantQtyResult">
+            <result property="id" column="id"/>
+            <result property="factoryCode" column="factory_code"/>
+            <result property="productDate" column="product_date"/>
+            <result property="monitorQty" column="monitor_qty"/>
+            <result property="groupleaderQty" column="groupLeader_qty"/>
+            <result property="materialQty" column="material_qty"/>
+            <result property="pillMgrQty" column="pill_mgr_qty"/>
+            <result property="pillDisQty" column="pill_dis_qty"/>
+            <result property="attr1" column="attr1"/>
+            <result property="attr2" column="attr2"/>
+            <result property="attr3" column="attr3"/>
+            <result property="attr4" column="attr4"/>
+            <result property="createBy" column="create_by"/>
+            <result property="createTime" column="create_time"/>
+            <result property="updateBy" column="update_by"/>
+            <result property="updateTime" column="update_time"/>
+    </resultMap>
+
+    <sql id="selectMesLineAssistantQtyVo">
+		select id, factory_code, product_date, monitor_qty, groupLeader_qty,
+		       material_qty, pill_mgr_qty, pill_dis_qty, attr1, attr2, attr3, attr4, create_by,
+		       create_time, update_by, update_time
+		from mes_line_assistant_qty
+	</sql>
+
+    <select id="selectMesLineAssistantQtyList" parameterType="MesLineAssistantQty" resultMap="MesLineAssistantQtyResult">
+        <include refid="selectMesLineAssistantQtyVo"/>
+        <where>
+                        <if test="factoryCode != null ">
+                            and factory_code = #{factoryCode}
+                        </if>
+                        <if test="productDate != null ">
+                            and product_date = #{productDate}
+                        </if>
+                        <if test="monitorQty != null ">
+                            and monitor_qty = #{monitorQty}
+                        </if>
+                        <if test="groupleaderQty != null ">
+                            and groupLeader_qty = #{groupleaderQty}
+                        </if>
+                        <if test="materialQty != null ">
+                            and material_qty = #{materialQty}
+                        </if>
+                        <if test="pillMgrQty != null ">
+                            and pill_mgr_qty = #{pillMgrQty}
+                        </if>
+                        <if test="pillDisQty != null ">
+                            and pill_dis_qty = #{pillDisQty}
+                        </if>
+                        <if test="attr1 != null  and attr1 != ''">
+                            and attr1 = #{attr1}
+                        </if>
+                        <if test="attr2 != null  and attr2 != ''">
+                            and attr2 = #{attr2}
+                        </if>
+                        <if test="attr3 != null  and attr3 != ''">
+                            and attr3 = #{attr3}
+                        </if>
+                        <if test="attr4 != null  and attr4 != ''">
+                            and attr4 = #{attr4}
+                        </if>
+        </where>
+        order by create_time
+    </select>
+
+    <select id="selectMesLineAssistantQtyById" parameterType="String"
+            resultMap="MesLineAssistantQtyResult">
+            <include refid="selectMesLineAssistantQtyVo"/>
+            where id = #{id}
+    </select>
+    <select id="getHasdate" resultType="java.lang.String">
+        select product_date
+        from mes_line_assistant_qty
+        where product_date = #{productDate}
+    </select>
+    <select id="selectEfficiencyHourList" resultType="com.op.mes.domain.vo.MesLineAssistantQtyVo">
+        select pow.product_date productDate,
+               '小榄' factoryCode,
+               be.department carCode,
+               be.sap_code lineCode,
+               pow.product_name productName,
+               pow.workorder_code workorderCode
+        from pro_order_workorder pow
+        left join base_equipment be on be.equipment_code = pow.workorder_name
+        where pow.parent_order = '0'
+          and pow.del_flag = '0'
+          <if test="productDateStr != null">
+             and pow.product_date = #{productDateStr}
+          </if>
+          <if test="carCode != null">
+             and be.department like concat('%',#{carCode},'%')
+          </if>
+          <if test="lineCode != null">
+            and be.sap_code like concat('%',#{lineCode},'%')
+         </if>
+          <if test="productName != null">
+            and pow.product_name like concat('%',#{productName},'%')
+         </if>
+          and pow.workorder_name is not null and pow.status in('w3','w4')
+    </select>
+    <select id="getHoursByOrderCode" resultType="java.math.BigDecimal">
+        select sum(work_time) from mes_report_work
+        where workorder_code = #{workorderCode}
+          and del_flag ='0' and parent_order = '0'
+    </select>
+    <select id="getAssistMaps" resultType="com.op.mes.domain.MesLineAssistantQty">
+        select
+            product_date productDateStr,
+            monitor_qty monitorQty,
+            groupLeader_qty groupLeaderQty,
+            material_qty materialQty,
+            pill_mgr_qty pillMgrQty,
+            pill_dis_qty pillDisQty
+        from mes_line_assistant_qty
+        where product_date = #{productDateStr}
+    </select>
+    <select id="getKqHourMaps" resultType="java.math.BigDecimal">
+        select sum(
+            case when DATEDIFF ( hour , stime.time0 , etime.time0 ) is null then '0'
+            else DATEDIFF ( hour , stime.time0 , etime.time0 ) end) productHour
+        from lanju_op_cloud.dbo.sys_user su
+                 left join lanju_op_cloud.dbo.sys_user_post sup on su.user_id = sup.user_id
+                 left join (
+            select min(clock_time) time0,workno from mes_clock_record where convert(char(10),clock_time,120) = #{productDateStr} GROUP BY workno
+        ) stime on stime.workno =  su.user_name
+                 left join (
+            select max(clock_time) time0,workno from mes_clock_record where convert(char(10),clock_time,120) = #{productDateStr} GROUP BY workno
+        ) etime on etime.workno =  su.user_name
+        where su.del_flag = '0' and sup.post_id = #{postId}
+    </select>
+    <select id="selectEfficiencyDayList" resultType="com.op.mes.domain.vo.MesDailyEfficiencyVo">
+        select pow.product_date productDate,
+            '小榄' factoryCode,
+            be.department carCode,
+            be.sap_code lineCode,
+            bpa.category,
+            pow.product_code productCode,
+            pow.product_name productName,
+            bp.umrez spec,
+            '件' unit,
+            pow.workorder_code workorderCode,
+            sdd.remark effUpBase,
+            sdd2.dict_value upGoal
+        from pro_order_workorder pow
+        left join base_equipment be on be.equipment_code = pow.workorder_name
+        left join base_product bp on bp.product_code = pow.product_code
+        left join base_product_attached bpa on concat('0000000',bpa.product_code) = pow.product_code
+        left join lanju_op_cloud.dbo.sys_dict_data sdd on sdd.dict_label = bpa.category and sdd.dict_type = 'sys_category'
+        left join base_dict_data sdd2 on sdd2.dict_label = convert(char(4),pow.product_date,120) and sdd2.dict_type = 'year_goal'
+        where pow.parent_order = '0'
+        and pow.del_flag = '0'
+        <if test="productDateStr != null">
+            and pow.product_date = #{productDateStr}
+        </if>
+        <if test="carCode != null">
+            and be.department like concat('%',#{carCode},'%')
+        </if>
+        <if test="lineCode != null">
+            and be.sap_code like concat('%',#{lineCode},'%')
+        </if>
+        <if test="productName != null">
+            and pow.product_name like concat('%',#{productName},'%')
+        </if>
+        and pow.workorder_name is not null and pow.status in('w3','w4')
+    </select>
+    <select id="getPlanQtyByOrderCode" resultType="java.math.BigDecimal">
+        select sum(quantity_split) from pro_order_workorder
+        where workorder_code = #{workorderCode}
+          and del_flag ='0' and parent_order = '0'
+    </select>
+    <select id="getActQtyByOrderCode" resultType="java.math.BigDecimal">
+        select sum(quantity_feedback) from mes_report_work
+        where workorder_code = #{workorderCode}
+          and del_flag ='0' and parent_order = '0'
+    </select>
+    <select id="getStandarInfo" resultType="com.op.mes.domain.MesLineProduct">
+        SELECT
+            mlp.hour_efficiency hourEfficiency,
+            mlp.use_man useMan
+        FROM
+            mes_line_product mlp
+                left join base_equipment be on mlp.line_code = be.equipment_code
+        WHERE
+            mlp.product_code = #{productCode}
+          AND be.sap_code = #{lineCode}
+          AND mlp.del_flag = '0'
+    </select>
+    <select id="getSonActManByOrderCode" resultType="com.op.mes.domain.MesReportWork">
+        select use_man useMan,
+               sum(work_time) workTime
+        from mes_report_work
+        where  del_flag ='0' and parent_order = #{workorderCode}
+        group by use_man
+    </select>
+
+    <insert id="insertMesLineAssistantQty" parameterType="MesLineAssistantQty">
+        insert into mes_line_assistant_qty
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+                    <if test="id != null">id,
+                    </if>
+                    <if test="factoryCode != null">factory_code,
+                    </if>
+                    <if test="productDate != null">product_date,
+                    </if>
+                    <if test="monitorQty != null">monitor_qty,
+                    </if>
+                    <if test="groupleaderQty != null">groupLeader_qty,
+                    </if>
+                    <if test="materialQty != null">material_qty,
+                    </if>
+                    <if test="pillMgrQty != null">pill_mgr_qty,
+                    </if>
+                    <if test="pillDisQty != null">pill_dis_qty,
+                    </if>
+                    <if test="attr1 != null">attr1,
+                    </if>
+                    <if test="attr2 != null">attr2,
+                    </if>
+                    <if test="attr3 != null">attr3,
+                    </if>
+                    <if test="attr4 != null">attr4,
+                    </if>
+                    <if test="createBy != null">create_by,
+                    </if>
+                    <if test="createTime != null">create_time,
+                    </if>
+                    <if test="updateBy != null">update_by,
+                    </if>
+                    <if test="updateTime != null">update_time,
+                    </if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+                    <if test="id != null">#{id},
+                    </if>
+                    <if test="factoryCode != null">#{factoryCode},
+                    </if>
+                    <if test="productDate != null">#{productDate},
+                    </if>
+                    <if test="monitorQty != null">#{monitorQty},
+                    </if>
+                    <if test="groupleaderQty != null">#{groupleaderQty},
+                    </if>
+                    <if test="materialQty != null">#{materialQty},
+                    </if>
+                    <if test="pillMgrQty != null">#{pillMgrQty},
+                    </if>
+                    <if test="pillDisQty != null">#{pillDisQty},
+                    </if>
+                    <if test="attr1 != null">#{attr1},
+                    </if>
+                    <if test="attr2 != null">#{attr2},
+                    </if>
+                    <if test="attr3 != null">#{attr3},
+                    </if>
+                    <if test="attr4 != null">#{attr4},
+                    </if>
+                    <if test="createBy != null">#{createBy},
+                    </if>
+                    <if test="createTime != null">#{createTime},
+                    </if>
+                    <if test="updateBy != null">#{updateBy},
+                    </if>
+                    <if test="updateTime != null">#{updateTime},
+                    </if>
+        </trim>
+    </insert>
+
+    <update id="updateMesLineAssistantQty" parameterType="MesLineAssistantQty">
+        update mes_line_assistant_qty
+        <trim prefix="SET" suffixOverrides=",">
+                    <if test="factoryCode != null">factory_code =
+                        #{factoryCode},
+                    </if>
+                    <if test="productDate != null">product_date =
+                        #{productDate},
+                    </if>
+                    <if test="monitorQty != null">monitor_qty =
+                        #{monitorQty},
+                    </if>
+                    <if test="groupleaderQty != null">groupLeader_qty =
+                        #{groupleaderQty},
+                    </if>
+                    <if test="materialQty != null">material_qty =
+                        #{materialQty},
+                    </if>
+                    <if test="pillMgrQty != null">pill_mgr_qty =
+                        #{pillMgrQty},
+                    </if>
+                    <if test="pillDisQty != null">pill_dis_qty =
+                        #{pillDisQty},
+                    </if>
+                    <if test="attr1 != null">attr1 =
+                        #{attr1},
+                    </if>
+                    <if test="attr2 != null">attr2 =
+                        #{attr2},
+                    </if>
+                    <if test="attr3 != null">attr3 =
+                        #{attr3},
+                    </if>
+                    <if test="attr4 != null">attr4 =
+                        #{attr4},
+                    </if>
+                    <if test="createBy != null">create_by =
+                        #{createBy},
+                    </if>
+                    <if test="createTime != null">create_time =
+                        #{createTime},
+                    </if>
+                    <if test="updateBy != null">update_by =
+                        #{updateBy},
+                    </if>
+                    <if test="updateTime != null">update_time =
+                        #{updateTime},
+                    </if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteMesLineAssistantQtyById" parameterType="String">
+		delete from mes_line_assistant_qty where id = #{id}
+	</delete>
+
+    <delete id="deleteMesLineAssistantQtyByIds" parameterType="String">
+        delete from mes_line_assistant_qty where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>
diff --git a/op-modules/op-quality/src/main/java/com/op/quality/service/impl/QcCheckTaskInventoryServiceImpl.java b/op-modules/op-quality/src/main/java/com/op/quality/service/impl/QcCheckTaskInventoryServiceImpl.java
index 5543b31d..a71dfd99 100644
--- a/op-modules/op-quality/src/main/java/com/op/quality/service/impl/QcCheckTaskInventoryServiceImpl.java
+++ b/op-modules/op-quality/src/main/java/com/op/quality/service/impl/QcCheckTaskInventoryServiceImpl.java
@@ -130,7 +130,7 @@ public class QcCheckTaskInventoryServiceImpl implements IQcCheckTaskInventorySer
     @Override
     @DS("#header.poolName")
     public int insertQcCheckTaskInventory(QcCheckTaskInventory qcCheckTaskInventory) {
-        logger.info("库存检验任务创建参数:"+JSONObject.toJSONString(qcCheckTaskInventory));
+        //logger.info("库存检验任务创建参数:"+JSONObject.toJSONString(qcCheckTaskInventory));
         String factoryCode = "";
         if (StringUtils.isNotBlank(qcCheckTaskInventory.getFactoryCode())) {
             DynamicDataSourceContextHolder.push("ds_" + qcCheckTaskInventory.getFactoryCode());
@@ -433,7 +433,7 @@ public class QcCheckTaskInventoryServiceImpl implements IQcCheckTaskInventorySer
         dto.setCreateBy(dto.getApplicant());//创建人
         qcCheckTaskInventoryMapper.insertQcCheckOaTask(dto);
 
-        logger.info("++++++++++++oa发起仓库检验任务生成" + m + "++++++++++++++");
+        //logger.info("++++++++++++oa发起仓库检验任务生成" + m + "++++++++++++++");
         return success();
     }
 
@@ -449,9 +449,9 @@ public class QcCheckTaskInventoryServiceImpl implements IQcCheckTaskInventorySer
             ccTask.setCheckType("checkTypeCC");//库存检验
             ccTask.setFactoryCode(poolName.replace("ds_",""));
             int m = insertQcCheckTaskInventory(ccTask);
-            logger.info("++++++++++++仓库检验任务生成" + m + "++++++++++++++");
+            //logger.info("++++++++++++仓库检验任务生成" + m + "++++++++++++++");
         }
-        logger.info("++++++++++++" + poolName + "++++仓库检验任务结束++++++++++");
+        //logger.info("++++++++++++" + poolName + "++++仓库检验任务结束++++++++++");
     }
 
 }