From 433dadf8b639eea84ea2401c1a0433bae3cf9262 Mon Sep 17 00:00:00 2001
From: hyingbo <1363390067@qq.com>
Date: 星期三, 11 六月 2025 10:40:00 +0800
Subject: [PATCH] 上下班打卡接口

---
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentPunchController.java    |   70 +++++++
 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/entity/MdcEquipmentPunch.java                  |  145 ++++++++++++++++
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentPunchMapper.java            |   18 ++
 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 ++
 6 files changed, 530 insertions(+), 0 deletions(-)

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/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/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/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/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/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);
+    }
+}

--
Gitblit v1.9.3