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 + "++++仓库检验任务结束++++++++++"); } }