From 6a31114515df20724a3396580d89992c31e5ca2a Mon Sep 17 00:00:00 2001
From: cuilei <ray_tsu1@163.com>
Date: 星期四, 12 六月 2025 10:39:40 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/mapper/DtBoardMapper.java                    |   17 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/IDtBoardService.java                 |    2 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquRepair.java                            |   26 +
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/AndonOrderMapper.java                   |   14 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/AndonOrderWebSocketVo.java                  |   52 ++
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/AndonOrderServiceImpl.java        |   89 ++++
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentPunch.java                  |  145 +++++++
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/impl/DtBoardServiceImpl.java         |   28 +
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/AndonOrder.java                         |  164 ++++++++
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentPunchMapper.xml         |   42 ++
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentPunchService.java         |   21 +
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentPunchController.java    |   70 +++
 /dev/null                                                                                          |   62 ---
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IAndonOrderService.java                |   15 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentPunchServiceImpl.java |  234 ++++++++++++
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/AndonOrderController.java           |   44 ++
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/AndonOrderMapper.xml                |    5 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/mapper/xml/DtBoardMapper.xml                 |   27 +
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentPunchMapper.java            |   18 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/controller/DtBoardController.java            |   11 
 20 files changed, 1,019 insertions(+), 67 deletions(-)

diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/controller/DtBoardController.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/controller/DtBoardController.java
index 909ed5c..f238759 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/controller/DtBoardController.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/controller/DtBoardController.java
@@ -85,11 +85,12 @@
         return Result.OK(result);
     }
 
-//    @ApiOperation(value = "鏁板瓧瀛敓鐪嬫澘-璁惧鏁呴殰", notes = "鏁板瓧瀛敓鐪嬫澘-璁惧鏁呴殰")
-//    @GetMapping("/equAlarmList")
-//    public Result<?> equAlarmList(@ApiParam(value = "productionId", required = true) String productionId) {
-//        dtBoardService.
-//    }
+    @ApiOperation(value = "鏁板瓧瀛敓鐪嬫澘-璁惧鏁呴殰", notes = "鏁板瓧瀛敓鐪嬫澘-璁惧鏁呴殰")
+    @GetMapping("/equRepairList")
+    public Result<?> equRepairList(@ApiParam(value = "productionId", required = true) String productionId) {
+        List<EquRepair> result = dtBoardService.equRepairList(productionId);
+        return Result.OK(result);
+    }
 
 
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/mapper/DtBoardMapper.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/mapper/DtBoardMapper.java
new file mode 100644
index 0000000..12e64b6
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/mapper/DtBoardMapper.java
@@ -0,0 +1,17 @@
+package org.jeecg.modules.board.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.board.vo.EquRepair;
+
+import java.util.List;
+
+/**
+ * @Author: Lius
+ * @CreateTime: 2025-06-11
+ * @Description:
+ */
+@Mapper
+public interface DtBoardMapper {
+    List<EquRepair> equRepairList(@Param("equipmentIdList") List<String> equipmentIdList, @Param("date") String date);
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/mapper/xml/DtBoardMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/mapper/xml/DtBoardMapper.xml
new file mode 100644
index 0000000..566cd4b
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/mapper/xml/DtBoardMapper.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.board.mapper.DtBoardMapper">
+
+    <select id="equRepairList" resultType="org.jeecg.modules.board.vo.EquRepair">
+        SELECT
+            t3.equipment_code equipmentId,
+            COUNT(*) faultNum,
+            ROUND(
+                    SUM(DATEDIFF(MINUTE, t2.fault_start_time, t1.actual_end_time)) / 60.0,
+                    2
+            ) faultTime
+        FROM
+            eam_repair_order t1
+                LEFT JOIN eam_report_repair t2 ON t1.report_id = t2.id
+                LEFT JOIN eam_equipment t3 ON t1.equipment_id = t3.id
+        WHERE
+            t1.repair_status = 'COMPLETE'
+            AND t2.fault_start_time > #{date}
+            AND t3.equipment_code IN
+            <foreach collection="equipmentIdList" item="id" index="index" open="(" close=")" separator=",">
+                #{ id }
+            </foreach>
+        GROUP BY
+            t3.equipment_code
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/IDtBoardService.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/IDtBoardService.java
index 07069e7..be4172a 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/IDtBoardService.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/IDtBoardService.java
@@ -27,4 +27,6 @@
     List<EquDowntimeInfo> equDowntimeStatistics(String productionId);
 
     List<EquAlarm> equAlarmList(String productionId);
+
+    List<EquRepair> equRepairList(String productionId);
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/impl/DtBoardServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/impl/DtBoardServiceImpl.java
index bf79693..ebea97e 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/impl/DtBoardServiceImpl.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/impl/DtBoardServiceImpl.java
@@ -5,8 +5,10 @@
 import org.apache.commons.lang3.StringUtils;
 import org.jeecg.common.constant.CommonConstant;
 import org.jeecg.common.system.vo.DictModel;
+import org.jeecg.modules.board.mapper.DtBoardMapper;
 import org.jeecg.modules.board.service.IDtBoardService;
 import org.jeecg.modules.board.vo.*;
+import org.jeecg.modules.eam.service.IEamRepairOrderService;
 import org.jeecg.modules.mdc.constant.MdcConstant;
 import org.jeecg.modules.mdc.entity.*;
 import org.jeecg.modules.mdc.service.*;
@@ -20,6 +22,8 @@
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -63,6 +67,9 @@
 
     @Resource
     private IMdcAlarmInfoService mdcAlarmInfoService;
+
+    @Resource
+    private DtBoardMapper dtBoardMapper;
 
     /**
      * 杞﹂棿淇℃伅
@@ -337,4 +344,25 @@
         return result;
     }
 
+    /**
+     * 璁惧鏁呴殰
+     * @param productionId
+     * @return
+     */
+    @Override
+    public List<EquRepair> equRepairList(String productionId) {
+        List<String> proIds = mdcProductionService.findChildByProId(productionId);
+        if (proIds == null || proIds.isEmpty()) {
+            return null;
+        }
+        List<String> equipmentIdList = mdcEquipmentService.getEquIdsByProIds(proIds);
+        if (equipmentIdList == null || equipmentIdList.isEmpty()) {
+            return null;
+        }
+        LocalDateTime currentDate = LocalDate.now().minusMonths(1).atStartOfDay();
+        String format = currentDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+        List<EquRepair> result = dtBoardMapper.equRepairList(equipmentIdList, format);
+        return result;
+    }
+
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquRepair.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquRepair.java
new file mode 100644
index 0000000..8122dfc
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquRepair.java
@@ -0,0 +1,26 @@
+package org.jeecg.modules.board.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @Author: Lius
+ * @CreateTime: 2025-06-10
+ * @Description: 璁惧鏁呴殰
+ */
+@Data
+public class EquRepair {
+    /**
+     * 璁惧缂栧彿
+     */
+    private String equipmentId;
+    /**
+     *  鏁呴殰娆℃暟
+     */
+    private BigDecimal faultNum;
+    /**
+     * 鏁呴殰鏃堕暱
+     */
+    private BigDecimal faultTime;
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/AndonOrderController.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/AndonOrderController.java
new file mode 100644
index 0000000..a9a33ee
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/AndonOrderController.java
@@ -0,0 +1,44 @@
+package org.jeecg.modules.mdc.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.jeecg.modules.mdc.entity.AndonOrder;
+import org.jeecg.modules.mdc.service.IAndonOrderService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+ /**
+ * @Description: andon_order
+ * @Author: jeecg-boot
+ * @Date:   2025-06-11
+ * @Version: V1.0
+ */
+@Api(tags="andon_order")
+@RestController
+@RequestMapping("/AndonOrder/andonOrder")
+@Slf4j
+public class AndonOrderController extends JeecgController<AndonOrder, IAndonOrderService> {
+	@Autowired
+	private IAndonOrderService andonOrderService;
+
+	 /**
+	  * 绋嬪簭鍛煎彨
+	  *
+	  * @param andonOrder
+	  * @return
+	  */
+	 @AutoLog(value = "瀹夌伅宸ュ崟-绋嬪簭鍛煎彨")
+	 @ApiOperation(value = "瀹夌伅宸ュ崟-绋嬪簭鍛煎彨", notes = "瀹夌伅宸ュ崟-绋嬪簭鍛煎彨")
+	 @PostMapping(value = "/procedureCall")
+	 public Result<?> procedureCall(@RequestBody AndonOrder andonOrder) {
+		 andonOrderService.procedureCall(andonOrder);
+		 return Result.OK("鍛煎彨鎴愬姛锛�");
+	 }
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentPunchController.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentPunchController.java
new file mode 100644
index 0000000..482612f
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentPunchController.java
@@ -0,0 +1,70 @@
+package org.jeecg.modules.mdc.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.jeecg.modules.mdc.entity.MdcEquipmentPunch;
+import org.jeecg.modules.mdc.service.IMdcEquipmentPunchService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @Description: mdc_equipment_punch
+ * @Author: jeecg-boot
+ * @Date:   2025-06-09
+ * @Version: V1.0
+ */
+@Api(tags="涓婁笅鐝墦鍗¤褰曡〃")
+@RestController
+@RequestMapping("/mdcEquipmentPunch")
+@Slf4j
+public class MdcEquipmentPunchController extends JeecgController<MdcEquipmentPunch, IMdcEquipmentPunchService> {
+	@Autowired
+	private IMdcEquipmentPunchService mdcEquipmentPunchService;
+
+	private static final String msg = "鎵撳崱鎴愬姛锛�";
+	
+	/**
+	 * 鏌ヨ褰撳墠鐧诲綍浜烘墍璐熻矗璁惧鎵撳崱鎯呭喌
+	 *
+	 * @return
+	 */
+	@ApiOperation(value="鏌ヨ褰撳墠鐧诲綍浜烘墍璐熻矗璁惧鎵撳崱鎯呭喌", notes="鏌ヨ褰撳墠鐧诲綍浜烘墍璐熻矗璁惧鎵撳崱鎯呭喌")
+	@GetMapping(value = "/list")
+	public Result<List<MdcEquipmentPunch>> queryList() {
+		return Result.OK(mdcEquipmentPunchService.queryList());
+	}
+
+	/**
+	 *   涓婄彮鎵撳崱
+	 *
+	 * @param mdcEquipmentPunch
+	 * @return
+	 */
+	@AutoLog(value = "涓婄彮鎵撳崱")
+	@ApiOperation(value="涓婄彮鎵撳崱", notes="涓婄彮鎵撳崱")
+	@PostMapping(value = "/workUp")
+	public Result<String> workUp(@RequestBody MdcEquipmentPunch mdcEquipmentPunch) {
+		mdcEquipmentPunchService.workUp(mdcEquipmentPunch);
+		return Result.OK(msg);
+	}
+
+	/**
+	 *   涓嬬彮鎵撳崱
+	 *
+	 * @param mdcEquipmentPunch
+	 * @return
+	 */
+	@AutoLog(value = "涓嬬彮鎵撳崱")
+	@ApiOperation(value="涓嬬彮鎵撳崱", notes="涓嬬彮鎵撳崱")
+	@PostMapping(value = "/workDown")
+	public Result<String> workDown(@RequestBody MdcEquipmentPunch mdcEquipmentPunch) {
+		mdcEquipmentPunchService.workDown(mdcEquipmentPunch);
+		return Result.OK(msg);
+	}
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/AndonOrder.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/AndonOrder.java
new file mode 100644
index 0000000..5321b7a
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/AndonOrder.java
@@ -0,0 +1,164 @@
+package org.jeecg.modules.mdc.entity;
+
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.util.Date;
+import java.math.BigDecimal;
+
+import cn.hutool.core.date.DatePattern;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.jeecg.common.aspect.annotation.Dict;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @Description: andon_order
+ * @Author: jeecg-boot
+ * @Date: 2025-06-11
+ * @Version: V1.0
+ */
+@Data
+@TableName("andon_order")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value = "andon_order瀵硅薄", description = "andon_order")
+public class AndonOrder implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "涓婚敭")
+    private String id;
+    /**
+     * 璁惧缂栧彿
+     */
+    @Excel(name = "璁惧缂栧彿", width = 15)
+    @ApiModelProperty(value = "璁惧缂栧彿")
+    private String equipmentId;
+    /**
+     * 鎵�灞炲巶鎴�
+     */
+    @Excel(name = "鎵�灞炲巶鎴�", width = 15)
+    @ApiModelProperty(value = "鎵�灞炲巶鎴�")
+    private String plantName;
+    /**
+     * 瀹夌伅绫诲瀷
+     */
+    @Excel(name = "瀹夌伅绫诲瀷", width = 15)
+    @ApiModelProperty(value = "瀹夌伅绫诲瀷")
+    private String andonType;
+    /**
+     * 瀹夌伅浜�(鍛煎彨浜�)
+     */
+    @Excel(name = "瀹夌伅浜�", width = 15)
+    @ApiModelProperty(value = "瀹夌伅浜�")
+    private String operator;
+    /**
+     * 鍛煎彨鍘熷洜
+     */
+    @Excel(name = "鍛煎彨鍘熷洜", width = 15)
+    @ApiModelProperty(value = "鍛煎彨鍘熷洜")
+    private String callReason;
+    /**
+     * 瀹夌伅鏃堕棿
+     */
+    @Excel(name = "瀹夌伅鏃堕棿", width = 15, format = DatePattern.NORM_DATETIME_PATTERN)
+    @JsonFormat(timezone = "GMT+8", pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @ApiModelProperty(value = "瀹夌伅鏃堕棿")
+    private Date operateTime;
+    /**
+     * 鍝嶅簲浜�(璐d换浜�)
+     */
+    @Excel(name = "鍝嶅簲浜�", width = 15)
+    @ApiModelProperty(value = "鍝嶅簲浜�")
+    private String responder;
+    /**
+     * 鍝嶅簲鏃堕棿
+     */
+    @Excel(name = "鍝嶅簲鏃堕棿", width = 15, format = DatePattern.NORM_DATETIME_PATTERN)
+    @JsonFormat(timezone = "GMT+8", pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @ApiModelProperty(value = "鍝嶅簲鏃堕棿")
+    private Date responseTime;
+    /**
+     * 澶勭悊浜�
+     */
+    @Excel(name = "澶勭悊浜�", width = 15)
+    @ApiModelProperty(value = "澶勭悊浜�")
+    private String processor;
+    /**
+     * 澶勭悊瀹屾垚鏃堕棿
+     */
+    @Excel(name = "澶勭悊瀹屾垚鏃堕棿", width = 15, format = DatePattern.NORM_DATETIME_PATTERN)
+    @JsonFormat(timezone = "GMT+8", pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @ApiModelProperty(value = "澶勭悊瀹屾垚鏃堕棿")
+    private Date processTime;
+    /**
+     * 瀹夌伅鐘舵��;寰呭搷搴斻�佸緟澶勭悊銆佸凡瀹屾垚
+     */
+    @Excel(name = "瀹夌伅鐘舵��;寰呭搷搴斻�佸緟澶勭悊銆佸凡瀹屾垚", width = 15)
+    @ApiModelProperty(value = "瀹夌伅鐘舵��;寰呭搷搴斻�佸緟澶勭悊銆佸凡瀹屾垚")
+    private String orderStatus;
+    /**
+     * 闂鎻忚堪
+     */
+    @Excel(name = "闂鎻忚堪", width = 15)
+    @ApiModelProperty(value = "闂鎻忚堪")
+    private String problemDescreption;
+    /**
+     * 澶勭悊缁撴灉鎻忚堪
+     */
+    @Excel(name = "澶勭悊缁撴灉鎻忚堪", width = 15)
+    @ApiModelProperty(value = "澶勭悊缁撴灉鎻忚堪")
+    private String resolutionDescreption;
+    /**
+     * 澶勭悊缁撴灉鍥剧墖
+     */
+    @Excel(name = "澶勭悊缁撴灉鍥剧墖", width = 15)
+    @ApiModelProperty(value = "澶勭悊缁撴灉鍥剧墖")
+    private String imageFiles;
+    /**
+     * 鍒犻櫎鏍囪
+     */
+    @Excel(name = "鍒犻櫎鏍囪", width = 15)
+    @ApiModelProperty(value = "鍒犻櫎鏍囪")
+    @TableLogic
+    private Integer delFlag;
+    /**
+     * 鍒涘缓浜�
+     */
+    @ApiModelProperty(value = "鍒涘缓浜�")
+    private String createBy;
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    private Date createTime;
+    /**
+     * 鏇存柊浜�
+     */
+    @ApiModelProperty(value = "鏇存柊浜�")
+    private String updateBy;
+    /**
+     * 鏇存柊鏃堕棿
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    private Date updateTime;
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentPunch.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentPunch.java
new file mode 100644
index 0000000..b64bcc4
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentPunch.java
@@ -0,0 +1,145 @@
+package org.jeecg.modules.mdc.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import cn.hutool.core.date.DatePattern;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.jeecg.common.aspect.annotation.Dict;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @Description: mdc_equipment_punch
+ * @Author: jeecg-boot
+ * @Date: 2025-06-09
+ * @Version: V1.0
+ */
+@Data
+@TableName("mdc_equipment_punch")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value = "mdc_equipment_punch瀵硅薄", description = "mdc_equipment_punch")
+public class MdcEquipmentPunch implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "id")
+    private String id;
+    /**
+     * 璁惧缂栧彿
+     */
+    @Excel(name = "璁惧缂栧彿", width = 15)
+    @ApiModelProperty(value = "璁惧缂栧彿")
+    private String equipmentId;
+    /**
+     * 鎵撳崱鐢ㄦ埛
+     */
+    @Excel(name = "鎵撳崱鐢ㄦ埛", width = 15)
+    @ApiModelProperty(value = "鎵撳崱鐢ㄦ埛")
+    private String punchUser;
+    /**
+     * 鎵撳崱鐢ㄦ埛璐﹀彿
+     */
+    @Excel(name = "鎵撳崱鐢ㄦ埛璐﹀彿", width = 15)
+    @ApiModelProperty(value = "鎵撳崱鐢ㄦ埛璐﹀彿")
+    @TableField(exist = false)
+    private String punchUserRealName;
+    /**
+     * 鎵撳崱鐢ㄦ埛鍚嶇О
+     */
+    @Excel(name = "鎵撳崱鐢ㄦ埛鍚嶇О", width = 15)
+    @ApiModelProperty(value = "鎵撳崱鐢ㄦ埛鍚嶇О")
+    @TableField(exist = false)
+    private String punchUserUserName;
+    /**
+     * 涓婄彮鏃堕棿
+     */
+    @Excel(name = "涓婄彮鏃堕棿", width = 15, format = DatePattern.NORM_DATETIME_PATTERN)
+    @JsonFormat(timezone = "GMT+8", pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @ApiModelProperty(value = "涓婄彮鏃堕棿")
+    private Date checkInTime;
+    /**
+     * 涓嬬彮鏃堕棿
+     */
+    @Excel(name = "涓嬬彮鏃堕棿", width = 15, format = DatePattern.NORM_DATETIME_PATTERN)
+    @JsonFormat(timezone = "GMT+8", pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @ApiModelProperty(value = "涓嬬彮鏃堕棿")
+    private Date checkOutTime;
+    /**
+     * 璁板綍鏃ユ湡
+     */
+    @Excel(name = "璁板綍鏃ユ湡", width = 15)
+    @ApiModelProperty(value = "璁板綍鏃ユ湡")
+    private String recordDate;
+    /**
+     * 鐝
+     */
+    @Excel(name = "鐝", width = 15)
+    @ApiModelProperty(value = "鐝")
+    @Dict(dicCode = "shift_schedule")
+    private Integer shiftSchedule;
+    /**
+     * 鐝鍚嶇О
+     */
+    @Excel(name = "鐝鍚嶇О", width = 15)
+    @ApiModelProperty(value = "鐝鍚嶇О")
+    @TableField(exist = false)
+    private String shiftScheduleName;
+    /**
+     * 鏄惁缂哄崱
+     */
+    @Excel(name = "鏄惁缂哄崱", width = 15)
+    @ApiModelProperty(value = "鏄惁缂哄崱")
+    private Integer isAbsent;
+    /**
+     * 鏄惁杩熷埌
+     */
+    @Excel(name = "鏄惁杩熷埌", width = 15)
+    @ApiModelProperty(value = "鏄惁杩熷埌")
+    private Integer isLate;
+    /**
+     * 鏄惁鏃╅��
+     */
+    @Excel(name = "鏄惁鏃╅��", width = 15)
+    @ApiModelProperty(value = "鏄惁鏃╅��")
+    private Integer isEarly;
+    /**
+     * 鍒涘缓浜�
+     */
+    @ApiModelProperty(value = "鍒涘缓浜�")
+    private String createBy;
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    private Date createTime;
+    /**
+     * 鏇存柊浜�
+     */
+    @ApiModelProperty(value = "鏇存柊浜�")
+    private String updateBy;
+    /**
+     * 鏇存柊鏃堕棿
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    private Date updateTime;
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/AndonOrderMapper.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/AndonOrderMapper.java
new file mode 100644
index 0000000..c624816
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/AndonOrderMapper.java
@@ -0,0 +1,14 @@
+package org.jeecg.modules.mdc.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.mdc.entity.AndonOrder;
+
+/**
+ * @Description: andon_order
+ * @Author: jeecg-boot
+ * @Date:   2025-06-11
+ * @Version: V1.0
+ */
+public interface AndonOrderMapper extends BaseMapper<AndonOrder> {
+
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentPunchMapper.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentPunchMapper.java
new file mode 100644
index 0000000..3b45151
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentPunchMapper.java
@@ -0,0 +1,18 @@
+package org.jeecg.modules.mdc.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.mdc.entity.MdcEquipmentPunch;
+
+import java.util.List;
+
+/**
+ * @Description: mdc_equipment_punch
+ * @Author: jeecg-boot
+ * @Date:   2025-06-09
+ * @Version: V1.0
+ */
+public interface MdcEquipmentPunchMapper extends BaseMapper<MdcEquipmentPunch> {
+
+    List<MdcEquipmentPunch> list(@Param("equipmentIds") List<String> equipmentIds, @Param("date") String date);
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/AndonOrderMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/AndonOrderMapper.xml
new file mode 100644
index 0000000..cd37885
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/AndonOrderMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.mdc.mapper.AndonOrderMapper">
+
+</mapper>
\ No newline at end of file
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentPunchMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentPunchMapper.xml
new file mode 100644
index 0000000..48cc0e8
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentPunchMapper.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.mdc.mapper.MdcEquipmentPunchMapper">
+
+    <select id="list" resultType="org.jeecg.modules.mdc.entity.MdcEquipmentPunch">
+        SELECT
+          p.id,
+          p.equipment_id,
+          p.punch_user,
+          p.check_in_time,
+          p.check_out_time,
+          p.record_date,
+          p.is_absent,
+          p.is_late,
+          p.is_early,
+          p.create_by,
+          p.create_time,
+          p.update_by,
+          p.update_time,
+          p.shift_schedule,
+          u.realname punchUserRealName,
+          u.username punchUserUserName,
+          d1.item_text shiftScheduleName
+        FROM
+          mdc_equipment_punch p
+          INNER JOIN sys_user u ON u.id = p.punch_user
+          INNER JOIN (SELECT i1.item_text, i1.item_value
+                      FROM sys_dict_item i1
+                          LEFT JOIN sys_dict i2 ON i2.id = i1.dict_id
+                      WHERE i2.dict_code = 'shift_schedule') d1
+              ON d1.item_value = CAST (p.shift_schedule AS nvarchar)
+        where 1=1
+        AND p.equipment_id IN
+        <foreach collection="equipmentIds" item="equipmentId" open="(" close=")" separator=",">
+            #{equipmentId}
+        </foreach>
+        <if test="date != null and date != ''">
+            AND p.record_date = #{date}
+        </if>
+        order by p.equipment_id desc, p.shift_schedule asc
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IAndonOrderService.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IAndonOrderService.java
new file mode 100644
index 0000000..c0ae7dd
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IAndonOrderService.java
@@ -0,0 +1,15 @@
+package org.jeecg.modules.mdc.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.mdc.entity.AndonOrder;
+
+/**
+ * @Description: andon_order
+ * @Author: jeecg-boot
+ * @Date:   2025-06-11
+ * @Version: V1.0
+ */
+public interface IAndonOrderService extends IService<AndonOrder> {
+
+    void procedureCall(AndonOrder andonOrder);
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentPunchService.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentPunchService.java
new file mode 100644
index 0000000..79be14a
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentPunchService.java
@@ -0,0 +1,21 @@
+package org.jeecg.modules.mdc.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.mdc.entity.MdcEquipmentPunch;
+
+import java.util.List;
+
+/**
+ * @Description: mdc_equipment_punch
+ * @Author: jeecg-boot
+ * @Date:   2025-06-09
+ * @Version: V1.0
+ */
+public interface IMdcEquipmentPunchService extends IService<MdcEquipmentPunch> {
+
+    List<MdcEquipmentPunch> queryList();
+
+    void workUp(MdcEquipmentPunch mdcEquipmentPunch);
+
+    void workDown(MdcEquipmentPunch mdcEquipmentPunch);
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/AndonOrderServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/AndonOrderServiceImpl.java
new file mode 100644
index 0000000..813d192
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/AndonOrderServiceImpl.java
@@ -0,0 +1,89 @@
+package org.jeecg.modules.mdc.service.impl;
+
+import cn.hutool.core.date.DatePattern;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.compress.utils.Lists;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.constant.WebsocketConst;
+import org.jeecg.common.exception.JeecgBootException;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.modules.mdc.dto.MdcEquProDto;
+import org.jeecg.modules.mdc.entity.AndonOrder;
+import org.jeecg.modules.mdc.mapper.AndonOrderMapper;
+import org.jeecg.modules.mdc.service.IAndonOrderService;
+import org.jeecg.modules.mdc.service.IMdcEquipmentService;
+import org.jeecg.modules.mdc.util.DateUtils;
+import org.jeecg.modules.mdc.vo.AndonOrderWebSocketVo;
+import org.jeecg.modules.message.websocket.WebSocket;
+import org.jeecg.modules.system.service.ISysUserService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Description: andon_order
+ * @Author: jeecg-boot
+ * @Date:   2025-06-11
+ * @Version: V1.0
+ */
+@Service
+public class AndonOrderServiceImpl extends ServiceImpl<AndonOrderMapper, AndonOrder> implements IAndonOrderService {
+
+    @Resource
+    private IMdcEquipmentService mdcEquipmentService;
+    @Resource
+    private WebSocket webSocket;
+    @Resource
+    private ISysUserService userService;
+    @Override
+    public void procedureCall(AndonOrder andonOrder) {
+        if (StringUtils.isBlank(andonOrder.getEquipmentId())) {
+            throw new JeecgBootException("璇烽�夋嫨璁惧锛�");
+        }
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        String userId = user.getId();
+        List<String> equipmentIds = Arrays.asList(andonOrder.getEquipmentId().split(StringPool.COMMA));
+
+        List<MdcEquProDto> equipmentList = mdcEquipmentService.findEquProList(equipmentIds);
+        Map<String, MdcEquProDto> equipmentIdToProductionIdMap = equipmentList.stream().collect(Collectors.toMap(MdcEquProDto::getEquipmentId, comRateDto -> comRateDto));
+        List<AndonOrder> list = Lists.newArrayList();
+        for (String equipmentId : equipmentIds) {
+            AndonOrder andonOrderInfo = new AndonOrder();
+            andonOrderInfo.setEquipmentId(equipmentId);
+            andonOrderInfo.setPlantName(equipmentIdToProductionIdMap != null && equipmentIdToProductionIdMap.containsKey(equipmentId) ? equipmentIdToProductionIdMap.get(equipmentId).getId() : null);
+            andonOrderInfo.setAndonType(StringPool.ONE);
+            andonOrderInfo.setOperator(andonOrder.getOperator());
+            andonOrderInfo.setOperateTime(new Date());
+            andonOrderInfo.setResponder(userId);
+            andonOrderInfo.setCallReason(andonOrder.getCallReason());
+            list.add(andonOrderInfo);
+        }
+
+        if (this.saveBatch(list)) {
+            List<AndonOrderWebSocketVo> andonOrderWebSocketVoList = Lists.newArrayList();
+            //璁剧疆websocket璇锋眰娑堟伅鏁版嵁
+            for (AndonOrder order : list) {
+                AndonOrderWebSocketVo andonOrderWebSocketVo = new AndonOrderWebSocketVo();
+                andonOrderWebSocketVo.setEquipmentId(order.getEquipmentId());
+                andonOrderWebSocketVo.setCallPersonnel(userService.getById(order.getOperator()).getRealname());
+                andonOrderWebSocketVo.setCallTime(DateUtils.format(order.getOperateTime(), DatePattern.NORM_DATE_PATTERN));
+                andonOrderWebSocketVo.setCallReason(order.getCallReason());
+                andonOrderWebSocketVo.setAndonType("绋嬪簭鍛煎彨");
+                andonOrderWebSocketVo.setPersonResponsible(user.getRealname());
+                andonOrderWebSocketVo.setPlantName(equipmentIdToProductionIdMap != null && equipmentIdToProductionIdMap.containsKey(order.getEquipmentId()) ? equipmentIdToProductionIdMap.get(order.getEquipmentId()).getProductionName() : null);
+                andonOrderWebSocketVoList.add(andonOrderWebSocketVo);
+            }
+
+            //鍙戦�亀ebsocket璇锋眰
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put(WebsocketConst.MSG_CMD, "andon");
+            jsonObject.put("data", andonOrderWebSocketVoList);
+            webSocket.sendMessage(jsonObject.toJSONString());
+        }
+    }
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentPunchServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentPunchServiceImpl.java
new file mode 100644
index 0000000..8b79829
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentPunchServiceImpl.java
@@ -0,0 +1,234 @@
+package org.jeecg.modules.mdc.service.impl;
+
+
+import cn.hutool.core.date.DatePattern;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.compress.utils.Lists;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.exception.JeecgBootException;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.modules.mdc.entity.MdcEquipmentPunch;
+import org.jeecg.modules.mdc.mapper.MdcEquipmentPunchMapper;
+import org.jeecg.modules.mdc.service.IMdcEquipmentPunchService;
+import org.jeecg.modules.mdc.service.IMdcEquipmentService;
+import org.jeecg.modules.mdc.util.DateUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Description: mdc_equipment_punch
+ * @Author: jeecg-boot
+ * @Date:   2025-06-09
+ * @Version: V1.0
+ */
+@Service
+public class MdcEquipmentPunchServiceImpl extends ServiceImpl<MdcEquipmentPunchMapper, MdcEquipmentPunch> implements IMdcEquipmentPunchService {
+
+    @Resource
+    private IMdcEquipmentService mdcEquipmentService;
+
+    /**
+     * 鏌ヨ褰撳墠鐧诲綍浜烘墍璐熻矗璁惧鎵撳崱鎯呭喌
+     * @return
+     */
+    @Override
+    public List<MdcEquipmentPunch> queryList() {
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        String userId = user.getId();
+        List<String> equipmentIds = Lists.newArrayList();
+        if (StringUtils.isNotBlank(user.getEquipmentIds())) {
+            equipmentIds = Arrays.asList(user.getEquipmentIds().split(StringPool.COMMA));
+        }else {
+            equipmentIds = mdcEquipmentService.getEquipmentIdsProduction(userId, null);
+        }
+
+        if (CollectionUtils.isEmpty(equipmentIds)) {
+            return Lists.newArrayList();
+        }
+
+        if (StringUtils.isBlank(userId)) {
+            return Lists.newArrayList();
+        }
+
+        //鏍规嵁璁惧銆佸綋鍓嶆棩鏈熸煡璇㈡墦鍗¤褰�
+        List<MdcEquipmentPunch> mdcEquipmentPunches = this.baseMapper.list(equipmentIds, DateUtils.format(new Date(), DatePattern.PURE_DATE_PATTERN));
+        return mdcEquipmentPunches;
+    }
+
+    /**
+     * 涓婄彮鎵撳崱
+     * @param mdcEquipmentPunch
+     */
+    @Override
+    public void workUp(MdcEquipmentPunch mdcEquipmentPunch) {
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        String userId = user.getId();
+
+        if (StringUtils.isBlank(mdcEquipmentPunch.getEquipmentId())) {
+            throw new JeecgBootException("璇烽�夋嫨鎵撳崱璁惧锛�");
+        }
+
+        /**
+         * 鏍¢獙鏄惁鍦ㄦ湁鏁堟墦鍗¤寖鍥翠箣鍐�
+         *      鏃╃彮涓婄彮鍗℃湁鏁堣寖鍥翠负锛�00:00:00 ~ 17:30:00
+         *      鏅氱彮涓婄彮鍗℃湁鏁堣寖鍥翠负锛�00:00:00 ~ 23:00:00
+         */
+        Date startDate = DateUtils.getFormatDate(
+                DateUtils.format(mdcEquipmentPunch.getCheckInTime(), DatePattern.NORM_DATE_PATTERN) + " 00:00:00",
+                DatePattern.NORM_DATETIME_PATTERN
+        );
+        Date endDate = DateUtils.getFormatDate(
+                DateUtils.format(mdcEquipmentPunch.getCheckInTime(), DatePattern.NORM_DATE_PATTERN) + " 17:30:00",
+                DatePattern.NORM_DATETIME_PATTERN
+        );
+        if (mdcEquipmentPunch.getShiftSchedule() == 2) {
+            //鏅氱彮鏃犳晥鎵撳崱鏃堕棿鑼冨洿
+            endDate = DateUtils.getFormatDate(
+                    DateUtils.format(mdcEquipmentPunch.getCheckInTime(), DatePattern.NORM_DATE_PATTERN) + " 23:00:00",
+                    DatePattern.NORM_DATETIME_PATTERN
+            );
+        }
+
+        if (startDate.compareTo(mdcEquipmentPunch.getCheckInTime()) == 1 || endDate.compareTo(mdcEquipmentPunch.getCheckInTime()) == -1) {
+            throw new JeecgBootException("鏈湪鏈夋晥涓婄彮鎵撳崱鏃堕棿鍐咃紝涓嶈兘鎵撳崱锛�");
+        }
+
+        //鏌ヨ鎵�閫夎澶囧綋澶╂槸鍚﹀凡鎵撲笂鐝崱
+        List<String> equipmentIdList = Arrays.asList(mdcEquipmentPunch.getEquipmentId().split(StringPool.COMMA));
+        String currentDate = DateUtils.format(mdcEquipmentPunch.getCheckInTime(), DatePattern.PURE_DATE_PATTERN);
+
+        //鏃╃彮涓婄彮姝e父鏈�鏅氭墦鍗℃椂闂�
+        String checkInTime = DateUtils.format(mdcEquipmentPunch.getCheckInTime(), DatePattern.NORM_DATE_PATTERN) + " 08:30:00";
+
+        //鏌ヨ褰撳墠璁惧銆佸綋鍓嶆墦鍗$被鍨嬫墦鍗¤褰�
+        List<MdcEquipmentPunch> equipmentPunchList = this.list(new LambdaQueryWrapper<MdcEquipmentPunch>()
+                .eq(MdcEquipmentPunch::getShiftSchedule, mdcEquipmentPunch.getShiftSchedule())
+                .eq(MdcEquipmentPunch::getRecordDate, currentDate)
+                .in(MdcEquipmentPunch::getEquipmentId, equipmentIdList));
+        List<MdcEquipmentPunch> mdcEquipmentPunchList = equipmentPunchList.stream().filter(equipmentPunch -> Objects.nonNull(equipmentPunch.getCheckInTime())).collect(Collectors.toList());
+        if (CollectionUtils.isNotEmpty(mdcEquipmentPunchList)) {
+            List<String> equipmentIds = equipmentPunchList.stream()
+                    .filter(mdcEquipmentPunchInfo -> Objects.nonNull(mdcEquipmentPunchInfo.getCheckInTime()))
+                    .map(MdcEquipmentPunch::getEquipmentId)
+                    .distinct()
+                    .collect(Collectors.toList());
+            throw new JeecgBootException("璁惧[" + StringUtils.join(equipmentIds, StringPool.COMMA) + "]宸叉墦鍗★紝鏃犻渶閲嶅鎵撳崱");
+        }
+
+        List<MdcEquipmentPunch> list = Lists.newArrayList();
+
+        //鐗规畩澶勭悊鏅氱彮涓婄彮鍗�
+        if (mdcEquipmentPunch.getShiftSchedule() == 2) {
+            //鏅氱彮姝e父涓婄彮鍗℃渶鏅氭墦鍗℃椂闂�
+            checkInTime = DateUtils.format(mdcEquipmentPunch.getCheckInTime(), DatePattern.NORM_DATE_PATTERN) + " 17:00:00";
+        }
+
+
+        for (String equipment : equipmentIdList) {
+            Optional<MdcEquipmentPunch> first = equipmentPunchList.stream().filter(equipmentPunch -> Objects.isNull(equipmentPunch.getCheckInTime()) && equipment.equals(equipmentPunch.getEquipmentId())).findFirst();
+            MdcEquipmentPunch equipmentPunch = new MdcEquipmentPunch();
+            if (first.isPresent()) {
+                equipmentPunch = first.get();
+            }else {
+                equipmentPunch.setEquipmentId(equipment);
+                equipmentPunch.setPunchUser(userId);
+                equipmentPunch.setRecordDate(currentDate);
+                equipmentPunch.setShiftSchedule(mdcEquipmentPunch.getShiftSchedule());
+                equipmentPunch.setIsAbsent(0);
+                equipmentPunch.setIsEarly(0);
+            }
+            equipmentPunch.setCheckInTime(mdcEquipmentPunch.getCheckInTime());
+            //鎵撳崱鏃堕棿澶т簬8锛�30/17:00鏃朵负杩熷埌鎵撳崱
+            equipmentPunch.setIsLate(mdcEquipmentPunch.getCheckInTime().compareTo(DateUtils.getFormatDate(checkInTime, DatePattern.NORM_DATETIME_PATTERN)) == 1 ? 1 : 0);
+
+            list.add(equipmentPunch);
+        }
+        this.saveOrUpdateBatch(list);
+    }
+
+    @Override
+    public void workDown(MdcEquipmentPunch mdcEquipmentPunch) {
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        String userId = user.getId();
+
+        if (StringUtils.isBlank(mdcEquipmentPunch.getEquipmentId())) {
+            throw new JeecgBootException("璇烽�夋嫨鎵撳崱璁惧锛�");
+        }
+
+        /**
+         * 鏍¢獙褰撳墠涓嬬彮鍗℃槸鍚﹀湪鏈夋晥涓嬬彮鎵撳崱鑼冨洿涔嬪唴
+         *      鏃╃彮涓嬬彮鏃犳晥鎵撳崱鏃堕棿鑼冨洿涓�00:00:00 ~ 08:30:00
+         *      鏅氱彮涓嬬彮鏃犳晥鎵撳崱鏃堕棿鑼冨洿涓�00:00:00 ~ 17:00:00
+         */
+        Date startDate = DateUtils.getFormatDate(
+                DateUtils.format(mdcEquipmentPunch.getCheckOutTime(), DatePattern.NORM_DATE_PATTERN) + " 00:00:00",
+                DatePattern.NORM_DATETIME_PATTERN
+        );
+        Date endDate = DateUtils.getFormatDate(
+                DateUtils.format(mdcEquipmentPunch.getCheckOutTime(), DatePattern.NORM_DATE_PATTERN) + " 08:30:00",
+                DatePattern.NORM_DATETIME_PATTERN
+        );
+        Date checkOutTime = DateUtils.getFormatDate(
+                DateUtils.format(mdcEquipmentPunch.getCheckOutTime(), DatePattern.NORM_DATE_PATTERN) + " 17:30:00",
+                DatePattern.NORM_DATETIME_PATTERN
+        );
+        if (mdcEquipmentPunch.getShiftSchedule() == 2) {
+            //鏅氱彮鏃犳晥鎵撳崱鏃堕棿鑼冨洿
+            endDate = DateUtils.getFormatDate(
+                    DateUtils.format(mdcEquipmentPunch.getCheckOutTime(), DatePattern.NORM_DATE_PATTERN) + " 17:00:00",
+                    DatePattern.NORM_DATETIME_PATTERN
+            );
+            //鏅氱彮姝e父涓嬬彮鏈�鏃╂墦鍗℃椂闂�
+            checkOutTime = DateUtils.getFormatDate(
+                    DateUtils.format(mdcEquipmentPunch.getCheckOutTime(), DatePattern.NORM_DATE_PATTERN) + " 23:00:00",
+                    DatePattern.NORM_DATETIME_PATTERN
+            );
+        }
+
+        if (startDate.compareTo(mdcEquipmentPunch.getCheckOutTime()) == 1
+                || endDate.compareTo(mdcEquipmentPunch.getCheckOutTime()) == 1) {
+            throw new JeecgBootException("鏈湪鏈夋晥涓嬬彮鎵撳崱鏃堕棿鍐咃紝涓嶈兘鎵撳崱锛�");
+        }
+
+        //鏌ヨ褰撳墠鎵�閫夎澶囨槸鍚﹀瓨鍦ㄤ笂鐝墦鍗¤褰�
+        List<String> equipmentIdList = Arrays.asList(mdcEquipmentPunch.getEquipmentId().split(StringPool.COMMA));
+        String currentDate = DateUtils.format(mdcEquipmentPunch.getCheckOutTime(), DatePattern.PURE_DATE_PATTERN);
+        List<MdcEquipmentPunch> equipmentPunchList = this.list(new LambdaQueryWrapper<MdcEquipmentPunch>()
+                .eq(MdcEquipmentPunch::getShiftSchedule, mdcEquipmentPunch.getShiftSchedule())
+                .eq(MdcEquipmentPunch::getRecordDate, currentDate)
+                .in(MdcEquipmentPunch::getEquipmentId, equipmentIdList));
+
+        List<MdcEquipmentPunch> list = Lists.newArrayList();
+
+        for (String equipmentId : equipmentIdList) {
+            Optional<MdcEquipmentPunch> mdcEquipmentPunchOptional = equipmentPunchList.stream()
+                    .filter(mdcEquipmentPunch1 -> mdcEquipmentPunch1.getEquipmentId().equals(equipmentId))
+                    .findFirst();
+            MdcEquipmentPunch equipmentPunch = new MdcEquipmentPunch();
+            if (mdcEquipmentPunchOptional.isPresent()) {
+                equipmentPunch = mdcEquipmentPunchOptional.get();
+            }else {
+                equipmentPunch.setIsAbsent(1);
+                equipmentPunch.setIsLate(0);
+                equipmentPunch.setEquipmentId(equipmentId);
+                equipmentPunch.setShiftSchedule(mdcEquipmentPunch.getShiftSchedule());
+                equipmentPunch.setPunchUser(userId);
+                equipmentPunch.setRecordDate(currentDate);
+            }
+            equipmentPunch.setCheckOutTime(mdcEquipmentPunch.getCheckOutTime());
+
+            //涓嬬彮鎵撳崱鏃堕棿鏃╀簬17:30/23:00鍒欎负鏃╅��
+            equipmentPunch.setIsEarly(checkOutTime.compareTo(mdcEquipmentPunch.getCheckOutTime()) == 1 ? 1 : 0);
+            list.add(equipmentPunch);
+        }
+
+        this.saveOrUpdateBatch(list);
+    }
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/AndonOrderWebSocketVo.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/AndonOrderWebSocketVo.java
new file mode 100644
index 0000000..411a4ec
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/AndonOrderWebSocketVo.java
@@ -0,0 +1,52 @@
+package org.jeecg.modules.mdc.vo;
+
+import lombok.Data;
+
+@Data
+public class AndonOrderWebSocketVo {
+
+    /**
+     * 璁惧缂栧彿
+     */
+    private String equipmentId;
+
+    /**
+     * 鍛煎彨浜哄憳
+     */
+    private String callPersonnel;
+
+    /**
+     * 瀹夌伅绫诲瀷
+     */
+    private String andonType;
+
+    /**
+     * 鍛煎彨鏃堕棿
+     */
+    private String callTime;
+
+    /**
+     * 鍛煎彨鍘熷洜
+     */
+    private String callReason;
+
+    /**
+     * 璐d换浜�
+     */
+    private String personResponsible;
+
+    /**
+     * 鎶ヤ慨鏃堕棿
+     */
+    private String repairTime;
+
+    /**
+     * 鏁呴殰鎻忚堪
+     */
+    private String faultInfo;
+
+    /**
+     * 鎵�灞炲巶鎴�
+     */
+    private String plantName;
+}
diff --git a/lxzn-module-msi/src/main/java/org/jeecg/modules/msi/utils/WebServiceUtil.java b/lxzn-module-msi/src/main/java/org/jeecg/modules/msi/utils/WebServiceUtil.java
deleted file mode 100644
index a104726..0000000
--- a/lxzn-module-msi/src/main/java/org/jeecg/modules/msi/utils/WebServiceUtil.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package org.jeecg.modules.msi.utils;
-
-
-import org.apache.cxf.endpoint.Client;
-import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
-import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
-
-
-public class WebServiceUtil {
-    /**
-     * 1.浠g悊绫诲伐鍘傜殑鏂瑰紡,闇�瑕佹嬁鍒板鏂圭殑鎺ュ彛鍦板潃, 鍚屾椂闇�瑕佸紩鍏ユ帴鍙�
-     */
-    public static void invokeService_1(String address, Class<?> tClass){
-        // 鎺ュ彛鍦板潃
-        //String address = "http://localhost:8080/services/ws/api?wsdl";
-        // 浠g悊宸ュ巶
-        JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
-        // 璁剧疆浠g悊鍦板潃
-        jaxWsProxyFactoryBean.setAddress(address);
-        // 璁剧疆鎺ュ彛绫诲瀷
-        jaxWsProxyFactoryBean.setServiceClass(tClass);
-        // 鍒涘缓涓�涓唬鐞嗘帴鍙e疄鐜�
-        Object us = jaxWsProxyFactoryBean.create();
-        // 鏁版嵁鍑嗗
-        String data = "hello world";
-        // 璋冪敤浠g悊鎺ュ彛鐨勬柟娉曡皟鐢ㄥ苟杩斿洖缁撴灉
-        //String result = us.emrService(data);
-        //System.out.println("杩斿洖缁撴灉:" + result);
-    }
-
-    /**
-     * 3. 鍔ㄦ�佽皟鐢�
-     */
-    public static String invokeService(String uri, String data, String method)
-    {
-        JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
-        Client client = dcf.createClient(uri);
-        Object[] objects = new Object[0];
-        try {
-            objects = client.invoke(method, data);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return String.valueOf(objects[0]);
-    }
-
-    /**
-     * 2. 鍔ㄦ�佽皟鐢�
-     */
-    public static String invokeServiceObJect(String uri,Object[] datas, String method)
-    {
-        JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
-        Client client = dcf.createClient(uri);
-        Object[] objects = new Object[0];
-        try {
-            objects = client.invoke(method, datas);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return String.valueOf(objects[0]);
-    }
-}

--
Gitblit v1.9.3