machaoyi преди 1 година
родител
ревизия
699509fb04
променени са 30 файла, в които са добавени 545 реда и са изтрити 54 реда
  1. 41 6
      .idea/workspace.xml
  2. 24 0
      core/pom.xml
  3. 0 0
      core/src/main/java/com/ctsi/System/SysDic/controller/SysDicController.java
  4. 0 0
      core/src/main/java/com/ctsi/System/SysDic/entity/SysDic.java
  5. 0 0
      core/src/main/java/com/ctsi/System/SysDic/mapper/SysDicMapper.java
  6. 0 0
      core/src/main/java/com/ctsi/System/SysDic/mapper/SysDicMapper.xml
  7. 0 0
      core/src/main/java/com/ctsi/System/SysDic/service/SysDicService.java
  8. 0 0
      core/src/main/java/com/ctsi/System/SysDic/service/impl/SysDicServiceImpl.java
  9. 0 0
      core/src/main/java/com/ctsi/System/SysDicItem/controller/SysDicItemController.java
  10. 0 0
      core/src/main/java/com/ctsi/System/SysDicItem/entity/SysDicItem.java
  11. 0 0
      core/src/main/java/com/ctsi/System/SysDicItem/entity/SysDicItemSearchPO.java
  12. 0 0
      core/src/main/java/com/ctsi/System/SysDicItem/entity/SysDicItemSearchVO.java
  13. 0 1
      core/src/main/java/com/ctsi/System/SysDicItem/mapper/SysDicItemMapper.java
  14. 0 0
      core/src/main/java/com/ctsi/System/SysDicItem/mapper/SysDicItemMapper.xml
  15. 2 0
      core/src/main/java/com/ctsi/System/SysDicItem/service/SysDicItemService.java
  16. 13 1
      core/src/main/java/com/ctsi/System/SysDicItem/service/impl/SysDicItemServiceImpl.java
  17. 17 0
      core/src/main/java/com/ctsi/annotation/DicCode.java
  18. 1 0
      core/src/main/java/com/ctsi/utils/ApiResult.java
  19. 19 0
      core/src/main/java/com/ctsi/utils/DateUtil.java
  20. 80 0
      core/src/main/java/com/ctsi/utils/DicCodeUtils.java
  21. 3 2
      work/src/main/java/com/ctsi/work/WorkAddr/controller/WorkAddrController.java
  22. 13 6
      work/src/main/java/com/ctsi/work/WorkAddr/entity/WorkAddr.java
  23. 0 12
      work/src/main/java/com/ctsi/work/WorkAddr/service/impl/WorkAddrServiceImpl.java
  24. 73 4
      work/src/main/java/com/ctsi/work/WorkClock/controller/WorkClockController.java
  25. 9 9
      work/src/main/java/com/ctsi/work/WorkClock/entity/WorkClock.java
  26. 136 0
      work/src/main/java/com/ctsi/work/WorkClock/entity/WorkClockPO.java
  27. 76 0
      work/src/main/java/com/ctsi/work/WorkClock/entity/WorkClockVO.java
  28. 2 1
      work/src/main/java/com/ctsi/work/WorkClock/mapper/WorkClockMapper.java
  29. 5 3
      work/src/main/java/com/ctsi/work/WorkClock/service/WorkClockService.java
  30. 31 9
      work/src/main/java/com/ctsi/work/WorkClock/service/impl/WorkClockServiceImpl.java

+ 41 - 6
.idea/workspace.xml

@@ -5,9 +5,36 @@
   </component>
   <component name="ChangeListManager">
     <list default="true" id="1dc46973-e6f5-473b-a131-bf2bbc2dca15" name="更改" comment="1、pom版本整理">
+      <change afterPath="$PROJECT_DIR$/core/src/main/java/com/ctsi/annotation/DicCode.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/core/src/main/java/com/ctsi/utils/DateUtil.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/core/src/main/java/com/ctsi/utils/DicCodeUtils.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/work/src/main/java/com/ctsi/work/WorkClock/entity/WorkClockPO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/work/src/main/java/com/ctsi/work/WorkClock/entity/WorkClockVO.java" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/application/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/application/pom.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/application/src/main/java/com/ctsi/System/SysDic/controller/SysDicController.java" beforeDir="false" afterPath="$PROJECT_DIR$/core/src/main/java/com/ctsi/System/SysDic/controller/SysDicController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/application/src/main/java/com/ctsi/System/SysDic/entity/SysDic.java" beforeDir="false" afterPath="$PROJECT_DIR$/core/src/main/java/com/ctsi/System/SysDic/entity/SysDic.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/application/src/main/java/com/ctsi/System/SysDic/mapper/SysDicMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/core/src/main/java/com/ctsi/System/SysDic/mapper/SysDicMapper.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/application/src/main/java/com/ctsi/System/SysDic/mapper/SysDicMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/core/src/main/java/com/ctsi/System/SysDic/mapper/SysDicMapper.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/application/src/main/java/com/ctsi/System/SysDic/service/SysDicService.java" beforeDir="false" afterPath="$PROJECT_DIR$/core/src/main/java/com/ctsi/System/SysDic/service/SysDicService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/application/src/main/java/com/ctsi/System/SysDic/service/impl/SysDicServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/core/src/main/java/com/ctsi/System/SysDic/service/impl/SysDicServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/application/src/main/java/com/ctsi/System/SysDicItem/controller/SysDicItemController.java" beforeDir="false" afterPath="$PROJECT_DIR$/core/src/main/java/com/ctsi/System/SysDicItem/controller/SysDicItemController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/application/src/main/java/com/ctsi/System/SysDicItem/entity/SysDicItem.java" beforeDir="false" afterPath="$PROJECT_DIR$/core/src/main/java/com/ctsi/System/SysDicItem/entity/SysDicItem.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/application/src/main/java/com/ctsi/System/SysDicItem/entity/SysDicItemSearchPO.java" beforeDir="false" afterPath="$PROJECT_DIR$/core/src/main/java/com/ctsi/System/SysDicItem/entity/SysDicItemSearchPO.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/application/src/main/java/com/ctsi/System/SysDicItem/entity/SysDicItemSearchVO.java" beforeDir="false" afterPath="$PROJECT_DIR$/core/src/main/java/com/ctsi/System/SysDicItem/entity/SysDicItemSearchVO.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/application/src/main/java/com/ctsi/System/SysDicItem/mapper/SysDicItemMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/core/src/main/java/com/ctsi/System/SysDicItem/mapper/SysDicItemMapper.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/application/src/main/java/com/ctsi/System/SysDicItem/mapper/SysDicItemMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/core/src/main/java/com/ctsi/System/SysDicItem/mapper/SysDicItemMapper.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/application/src/main/java/com/ctsi/System/SysDicItem/service/SysDicItemService.java" beforeDir="false" afterPath="$PROJECT_DIR$/core/src/main/java/com/ctsi/System/SysDicItem/service/SysDicItemService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/application/src/main/java/com/ctsi/System/SysDicItem/service/impl/SysDicItemServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/core/src/main/java/com/ctsi/System/SysDicItem/service/impl/SysDicItemServiceImpl.java" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/core/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/core/pom.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/core/src/main/java/com/ctsi/utils/ApiResult.java" beforeDir="false" afterPath="$PROJECT_DIR$/core/src/main/java/com/ctsi/utils/ApiResult.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/work/src/main/java/com/ctsi/work/WorkAddr/controller/WorkAddrController.java" beforeDir="false" afterPath="$PROJECT_DIR$/work/src/main/java/com/ctsi/work/WorkAddr/controller/WorkAddrController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/work/src/main/java/com/ctsi/work/WorkAddr/entity/WorkAddr.java" beforeDir="false" afterPath="$PROJECT_DIR$/work/src/main/java/com/ctsi/work/WorkAddr/entity/WorkAddr.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/work/src/main/java/com/ctsi/work/WorkAddr/service/impl/WorkAddrServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/work/src/main/java/com/ctsi/work/WorkAddr/service/impl/WorkAddrServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/work/src/main/java/com/ctsi/work/WorkClock/controller/WorkClockController.java" beforeDir="false" afterPath="$PROJECT_DIR$/work/src/main/java/com/ctsi/work/WorkClock/controller/WorkClockController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/work/src/main/java/com/ctsi/work/WorkClock/entity/WorkClock.java" beforeDir="false" afterPath="$PROJECT_DIR$/work/src/main/java/com/ctsi/work/WorkClock/entity/WorkClock.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/work/src/main/java/com/ctsi/work/WorkClock/mapper/WorkClockMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/work/src/main/java/com/ctsi/work/WorkClock/mapper/WorkClockMapper.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/work/src/main/java/com/ctsi/work/WorkClock/service/WorkClockService.java" beforeDir="false" afterPath="$PROJECT_DIR$/work/src/main/java/com/ctsi/work/WorkClock/service/WorkClockService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/work/src/main/java/com/ctsi/work/WorkClock/service/impl/WorkClockServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/work/src/main/java/com/ctsi/work/WorkClock/service/impl/WorkClockServiceImpl.java" afterDir="false" />
     </list>
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -116,11 +143,11 @@
       <recent name="C:\Users\setin\IdeaProjects\GeneralFrame\application\src\main\java\com\ctsi" />
     </key>
     <key name="CopyClassDialog.RECENTS_KEY">
-      <recent name="com.ctsi.entity" />
+      <recent name="com.ctsi.work.WorkClock.entity" />
+      <recent name="com.ctsi.annotation" />
       <recent name="com.ctsi.utils" />
+      <recent name="com.ctsi.entity" />
       <recent name="com.ctsi.Enum" />
-      <recent name="com.ctsi.System.SysDicItem.entity" />
-      <recent name="com.ctsi.Auth.entity" />
     </key>
   </component>
   <component name="RunManager">
@@ -155,7 +182,7 @@
       <workItem from="1705392945258" duration="4784000" />
       <workItem from="1705397771531" duration="2808000" />
       <workItem from="1705452083011" duration="7637000" />
-      <workItem from="1705460446625" duration="3516000" />
+      <workItem from="1705460446625" duration="13755000" />
     </task>
     <task id="LOCAL-00001" summary="基础框架配置">
       <option name="closed" value="true" />
@@ -469,7 +496,15 @@
       <option name="project" value="LOCAL" />
       <updated>1705460362540</updated>
     </task>
-    <option name="localTasksCounter" value="40" />
+    <task id="LOCAL-00040" summary="1、pom版本整理">
+      <option name="closed" value="true" />
+      <created>1705471205915</created>
+      <option name="number" value="00040" />
+      <option name="presentableId" value="LOCAL-00040" />
+      <option name="project" value="LOCAL" />
+      <updated>1705471205915</updated>
+    </task>
+    <option name="localTasksCounter" value="41" />
     <servers />
   </component>
   <component name="TypeScriptGeneratedFilesManager">

+ 24 - 0
core/pom.xml

@@ -38,6 +38,30 @@
             <version>1.18.26</version>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.github.yulichang</groupId>
+            <artifactId>mybatis-plus-join-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context</artifactId>
+        </dependency>
     </dependencies>
 
 </project>

+ 0 - 0
application/src/main/java/com/ctsi/System/SysDic/controller/SysDicController.java → core/src/main/java/com/ctsi/System/SysDic/controller/SysDicController.java


+ 0 - 0
application/src/main/java/com/ctsi/System/SysDic/entity/SysDic.java → core/src/main/java/com/ctsi/System/SysDic/entity/SysDic.java


+ 0 - 0
application/src/main/java/com/ctsi/System/SysDic/mapper/SysDicMapper.java → core/src/main/java/com/ctsi/System/SysDic/mapper/SysDicMapper.java


+ 0 - 0
application/src/main/java/com/ctsi/System/SysDic/mapper/SysDicMapper.xml → core/src/main/java/com/ctsi/System/SysDic/mapper/SysDicMapper.xml


+ 0 - 0
application/src/main/java/com/ctsi/System/SysDic/service/SysDicService.java → core/src/main/java/com/ctsi/System/SysDic/service/SysDicService.java


+ 0 - 0
application/src/main/java/com/ctsi/System/SysDic/service/impl/SysDicServiceImpl.java → core/src/main/java/com/ctsi/System/SysDic/service/impl/SysDicServiceImpl.java


+ 0 - 0
application/src/main/java/com/ctsi/System/SysDicItem/controller/SysDicItemController.java → core/src/main/java/com/ctsi/System/SysDicItem/controller/SysDicItemController.java


+ 0 - 0
application/src/main/java/com/ctsi/System/SysDicItem/entity/SysDicItem.java → core/src/main/java/com/ctsi/System/SysDicItem/entity/SysDicItem.java


+ 0 - 0
application/src/main/java/com/ctsi/System/SysDicItem/entity/SysDicItemSearchPO.java → core/src/main/java/com/ctsi/System/SysDicItem/entity/SysDicItemSearchPO.java


+ 0 - 0
application/src/main/java/com/ctsi/System/SysDicItem/entity/SysDicItemSearchVO.java → core/src/main/java/com/ctsi/System/SysDicItem/entity/SysDicItemSearchVO.java


+ 0 - 1
application/src/main/java/com/ctsi/System/SysDicItem/mapper/SysDicItemMapper.java → core/src/main/java/com/ctsi/System/SysDicItem/mapper/SysDicItemMapper.java

@@ -1,7 +1,6 @@
 package com.ctsi.System.SysDicItem.mapper;
 
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.github.yulichang.base.MPJBaseMapper;

+ 0 - 0
application/src/main/java/com/ctsi/System/SysDicItem/mapper/SysDicItemMapper.xml → core/src/main/java/com/ctsi/System/SysDicItem/mapper/SysDicItemMapper.xml


+ 2 - 0
application/src/main/java/com/ctsi/System/SysDicItem/service/SysDicItemService.java → core/src/main/java/com/ctsi/System/SysDicItem/service/SysDicItemService.java

@@ -54,4 +54,6 @@ public interface SysDicItemService{
     boolean deleteById(Long id);
 
     List<SysDicItemSearchPO> getDicItemList(SysDicItemSearchVO sysDicItemSearchVO);
+
+    String getItemValueByCode(String dicCode, String itemCode);
 }

+ 13 - 1
application/src/main/java/com/ctsi/System/SysDicItem/service/impl/SysDicItemServiceImpl.java → core/src/main/java/com/ctsi/System/SysDicItem/service/impl/SysDicItemServiceImpl.java

@@ -4,7 +4,6 @@ import cn.hutool.core.util.StrUtil;
 import com.ctsi.System.SysDic.entity.SysDic;
 import com.ctsi.System.SysDicItem.entity.SysDicItemSearchPO;
 import com.ctsi.System.SysDicItem.entity.SysDicItemSearchVO;
-import com.ctsi.System.SysOrg.entity.PO.SysOrgSearchPO;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -133,6 +132,19 @@ public class SysDicItemServiceImpl implements SysDicItemService{
          return sysDicItemList;
      }
 
+     public String getItemValueByCode(String dicCode, String itemCode) {
+         MPJLambdaWrapper<SysDicItem> wrapper = new MPJLambdaWrapper<>();
+         wrapper.leftJoin(SysDic.class,SysDic::getId,SysDicItem::getDicId);
+         wrapper.eq(SysDic::getDicCode,dicCode);
+         wrapper.eq(SysDicItem::getItemCode,itemCode);
+         wrapper.selectAll(SysDicItem.class);
+         SysDicItem sysDicItem = sysDicItemMapper.selectJoinOne(SysDicItem.class,wrapper);
+         if (sysDicItem != null) {
+             return sysDicItem.getItemValue();
+         }
+         return null;
+     }
+
     public static List<SysDicItemSearchPO> buildTree(List<SysDicItemSearchPO> nodeList) {
         Map<Long, SysDicItemSearchPO> nodeMap = new LinkedHashMap<>();
 

+ 17 - 0
core/src/main/java/com/ctsi/annotation/DicCode.java

@@ -0,0 +1,17 @@
+package com.ctsi.annotation;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Author:machaoyi
+ * 字典编码注解
+ * 用于标识字段对应的字典编码
+ * 用于字典编码转换
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+public @interface DicCode {
+    String value() default "";
+}

+ 1 - 0
core/src/main/java/com/ctsi/utils/ApiResult.java

@@ -61,6 +61,7 @@ public class ApiResult<T> {
      * @return 成功
      */
     public static <T> ApiResult<T> success(String message, T result) {
+        DicCodeUtils.processResultObject(result);
         return new ApiResult<>(DEFAULT_SUCCEED_CODE, message, result);
     }
 

+ 19 - 0
core/src/main/java/com/ctsi/utils/DateUtil.java

@@ -0,0 +1,19 @@
+package com.ctsi.utils;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.ZoneOffset;
+
+public class DateUtil {
+    public static Long getZeroTimestamp() {
+        // 获取当前日期
+        LocalDate today = LocalDate.now();
+
+        // 获取今日零点时间
+        LocalDateTime midnight = today.atTime(LocalTime.MIN);
+
+        // 获取今日零点时间戳(秒级)
+        return midnight.toInstant(ZoneOffset.UTC).toEpochMilli();
+    }
+}

+ 80 - 0
core/src/main/java/com/ctsi/utils/DicCodeUtils.java

@@ -0,0 +1,80 @@
+package com.ctsi.utils;
+
+import com.ctsi.System.SysDicItem.service.SysDicItemService;
+import com.ctsi.annotation.DicCode;
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.Field;
+
+@Component
+public class DicCodeUtils implements ApplicationContextAware {
+    private static ApplicationContext applicationContext;
+
+
+    public static void processResultObject(Object resultObject) {
+        if (resultObject != null) {
+            SysDicItemService sysDicItemService = null;
+            if (applicationContext != null) {
+                sysDicItemService = applicationContext.getBean(SysDicItemService.class);
+            }
+            // 获取对象的所有字段,包括私有字段
+            Class<?> currentClass = resultObject.getClass();
+            while (currentClass != null) {
+                // 获取对象的所有字段
+                Field[] fields = currentClass.getDeclaredFields();
+                for (Field field : fields) {
+                    // 设置字段的可访问性
+                    field.setAccessible(true);
+                    try {
+                        // 如果字段的类型是一个类(非基本类型),则递归遍历该字段的类
+                        if (field.getType().getName().equals("java.util.List")) {
+                            Object nestedObject = field.get(resultObject);
+                            if (nestedObject != null) {
+                                for (Object o : (java.util.List) nestedObject) {
+                                    processResultObject(o);
+                                }
+                            }
+                        }
+                    }  catch (IllegalAccessException e) {
+                        e.printStackTrace();
+                    }
+                    // 检查字段是否有 FieldName 注解
+                    if (field.isAnnotationPresent(DicCode.class)) {
+                        // 获取注解的值
+                        DicCode annotation = field.getAnnotation(DicCode.class);
+                        String dicCode = annotation.value();
+                        // 设置原字段名+"Name"字段的值
+                        try {
+                            String originalFieldName = field.getName();
+                            if (!originalFieldName.endsWith("Name")) {
+                                continue;
+                            }
+                            // 获取原字段名
+                            String oldFieldName = originalFieldName.substring(0, originalFieldName.length() - 4);
+                            Field oldField = currentClass.getDeclaredField(oldFieldName);
+                            oldField.setAccessible(true);
+                            Object oldFileValue = oldField.get(resultObject);
+
+                            if (sysDicItemService != null) {
+                                field.set(resultObject, sysDicItemService.getItemValueByCode(dicCode, (String) oldFileValue));
+                            }
+                        } catch (NoSuchFieldException | IllegalAccessException e) {
+                            e.printStackTrace();
+                        }
+                    }
+                }
+                // 获取父类,继续遍历
+                currentClass = currentClass.getSuperclass();
+            }
+
+        }
+    }
+
+    @Override
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+        DicCodeUtils.applicationContext = applicationContext;
+    }
+}

+ 3 - 2
work/src/main/java/com/ctsi/work/WorkAddr/controller/WorkAddrController.java

@@ -8,6 +8,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import com.ctsi.work.WorkAddr.entity.WorkAddr;
 import com.ctsi.work.WorkAddr.service.WorkAddrService;
@@ -69,7 +70,7 @@ public class WorkAddrController{
      */
     @ApiOperation("新增数据")
     @PostMapping
-    public ApiResult<WorkAddr> add(@RequestBody WorkAddr workAddr){
+    public ApiResult<WorkAddr> add(@RequestBody @Validated WorkAddr workAddr){
         try {
             workAddr.setCreatedBy(StpUtil.getLoginIdAsLong());
             return ApiResult.success(workAddrService.insert(workAddr));
@@ -87,7 +88,7 @@ public class WorkAddrController{
      */
     @ApiOperation("更新数据")
     @PutMapping
-    public ApiResult<WorkAddr> edit(@RequestBody WorkAddr workAddr){
+    public ApiResult<WorkAddr> edit(@RequestBody @Validated WorkAddr workAddr){
         try {
             return ApiResult.success(workAddrService.update(workAddr));
         } catch (Exception e) {

+ 13 - 6
work/src/main/java/com/ctsi/work/WorkAddr/entity/WorkAddr.java

@@ -6,6 +6,9 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.TableId;
+import org.springframework.validation.annotation.Validated;
+
+import javax.validation.constraints.Max;
 import java.io.Serializable;
 import java.util.Date;
 
@@ -45,10 +48,14 @@ public class WorkAddr implements Serializable,Cloneable{
     private String addrRange ;
     /** 上班打卡时间 */
     @ApiModelProperty(value = "上班打卡时间",notes = "")
-    private String addrIn ;
+    @Max(value = 86400000,message = "打卡时间不能大于24点")
+    @JsonSerialize(using = LongtoStringSerialize.class)
+    private Long addrIn ;
     /** 下班打卡时间 */
     @ApiModelProperty(value = "下班打卡时间",notes = "")
-    private String addrQuit ;
+    @Max(value = 86400000,message = "打卡时间不能大于24点")
+    @JsonSerialize(using = LongtoStringSerialize.class)
+    private Long addrQuit ;
 
     /** 主键id */
     public Long getId(){
@@ -115,19 +122,19 @@ public class WorkAddr implements Serializable,Cloneable{
         this.addrRange=addrRange;
     }
     /** 上班打卡时间 */
-    public String getAddrIn(){
+    public Long getAddrIn(){
         return this.addrIn;
     }
     /** 上班打卡时间 */
-    public void setAddrIn(String addrIn){
+    public void setAddrIn(Long addrIn){
         this.addrIn=addrIn;
     }
     /** 下班打卡时间 */
-    public String getAddrQuit(){
+    public Long getAddrQuit(){
         return this.addrQuit;
     }
     /** 下班打卡时间 */
-    public void setAddrQuit(String addrQuit){
+    public void setAddrQuit(Long addrQuit){
         this.addrQuit=addrQuit;
     }
 }

+ 0 - 12
work/src/main/java/com/ctsi/work/WorkAddr/service/impl/WorkAddrServiceImpl.java

@@ -53,12 +53,6 @@ public class WorkAddrServiceImpl implements WorkAddrService{
         if(StrUtil.isNotBlank(workAddr.getAddrRange())){
             queryWrapper.eq(WorkAddr::getAddrRange, workAddr.getAddrRange());
         }
-        if(StrUtil.isNotBlank(workAddr.getAddrIn())){
-            queryWrapper.eq(WorkAddr::getAddrIn, workAddr.getAddrIn());
-        }
-        if(StrUtil.isNotBlank(workAddr.getAddrQuit())){
-            queryWrapper.eq(WorkAddr::getAddrQuit, workAddr.getAddrQuit());
-        }
         //2. 执行分页查询
         Page<WorkAddr> pagin = new Page<>(current , size , true);
         IPage<WorkAddr> selectResult = workAddrMapper.selectPage(pagin , queryWrapper);
@@ -101,12 +95,6 @@ public class WorkAddrServiceImpl implements WorkAddrService{
         if(StrUtil.isNotBlank(workAddr.getAddrRange())){
             chainWrapper.set(WorkAddr::getAddrRange, workAddr.getAddrRange());
         }
-        if(StrUtil.isNotBlank(workAddr.getAddrIn())){
-            chainWrapper.set(WorkAddr::getAddrIn, workAddr.getAddrIn());
-        }
-        if(StrUtil.isNotBlank(workAddr.getAddrQuit())){
-            chainWrapper.set(WorkAddr::getAddrQuit, workAddr.getAddrQuit());
-        }
         //2. 设置主键,并更新
         chainWrapper.eq(WorkAddr::getId, workAddr.getId());
         boolean ret = chainWrapper.update();

+ 73 - 4
work/src/main/java/com/ctsi/work/WorkClock/controller/WorkClockController.java

@@ -1,19 +1,27 @@
 package com.ctsi.work.WorkClock.controller;
 
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ctsi.entity.FramePage;
 import com.ctsi.utils.ApiResult;
+import com.ctsi.work.WorkAddr.entity.WorkAddr;
+import com.ctsi.work.WorkAddr.service.WorkAddrService;
+import com.ctsi.work.WorkClock.entity.WorkClockPO;
+import com.ctsi.work.WorkClock.entity.WorkClockVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
 import org.springframework.web.bind.annotation.*;
 import com.ctsi.work.WorkClock.entity.WorkClock;
 import com.ctsi.work.WorkClock.service.WorkClockService;
 
 import javax.annotation.Resource;
+import java.util.Objects;
 
- /**
+/**
  * 员工打卡表;(work_clock)表控制层
  * @author : machaoyi
  * @date : 2024-1-17
@@ -24,6 +32,8 @@ import javax.annotation.Resource;
 public class WorkClockController{
     @Resource
     private WorkClockService workClockService;
+     @Resource
+     private WorkAddrService workAddrService;
     private static final Logger log = LoggerFactory.getLogger(WorkClockController.class);
     
     /** 
@@ -51,7 +61,7 @@ public class WorkClockController{
      */
     @ApiOperation("分页查询")
     @GetMapping
-    public ApiResult<Page<WorkClock>> paginQuery(WorkClock workClock, FramePage framePage){
+    public ApiResult<Page<WorkClockPO>> paginQuery(WorkClock workClock, FramePage framePage){
         try {
             return ApiResult.success(workClockService.paginQuery(workClock, framePage.getPageNum(), framePage.getPageSize()));
         } catch (Exception e) {
@@ -59,6 +69,25 @@ public class WorkClockController{
             return ApiResult.failure("分页查询失败",null);
         }    
     }
+
+    /**
+     * 员工打卡记录
+     *
+     * @param
+     * @return 查询结果
+     */
+    @ApiOperation("员工打卡记录")
+    @GetMapping("/clockRecord")
+    public ApiResult<Page<WorkClockPO>> clockRecord(FramePage framePage){
+        try {
+            WorkClock workClock = new WorkClock();
+            workClock.setUserId(StpUtil.getLoginIdAsLong());
+            return ApiResult.success(workClockService.paginQuery(workClock, framePage.getPageNum(), framePage.getPageSize()));
+        } catch (Exception e) {
+            log.error(e.getMessage());
+            return ApiResult.failure("分页查询失败",null);
+        }
+    }
     
     /** 
      * 新增数据
@@ -68,14 +97,54 @@ public class WorkClockController{
      */
     @ApiOperation("新增数据")
     @PostMapping
-    public ApiResult<WorkClock> add(@RequestBody WorkClock workClock){
+    public ApiResult add(@RequestBody WorkClock workClock){
         try {
-            return ApiResult.success(workClockService.insert(workClock));
+            return workClockService.insert(workClock);
         } catch (Exception e) {
             log.error(e.getMessage());
             return ApiResult.failure("新增数据失败",null);
         }
     }
+
+     /**
+      * 员工打卡接口
+      *
+      * @param workClockVO 实例对象
+      * @return 实例对象
+      */
+     @ApiOperation("员工打卡接口")
+     @PostMapping("/clock")
+     public ApiResult clock(@RequestBody WorkClockVO workClockVO){
+         try {
+             WorkClock workClock = new WorkClock();
+             BeanUtils.copyProperties(workClockVO,workClock);
+             workClock.setUserId(StpUtil.getLoginIdAsLong());
+             workClock.setClockTime(DateUtil.current());
+             WorkAddr workAddr = workAddrService.queryById(workClockVO.getWorkAddrId());
+             if (workAddr == null) {
+                 return ApiResult.failure("打卡地址不存在",null);
+             }
+             if (Objects.equals(workClockVO.getClockType(), "1")) {//打卡上班
+                 Long inTime = DateUtil.beginOfDay(DateUtil.date()).getTime() + workAddr.getAddrIn();
+                 if (workClock.getClockTime() <= inTime) {//打卡时间小于上班时间,正常
+                     workClock.setClockStatus("1");
+                 } else {//迟到
+                     workClock.setClockStatus("2");
+                 }
+             } else if (Objects.equals(workClockVO.getClockType(), "2")) {//打卡下班
+                 Long quitTIme = DateUtil.beginOfDay(DateUtil.date()).getTime() + workAddr.getAddrQuit();
+                 if (workClock.getClockTime() >= quitTIme) {//打卡时间大于下班时间,正常
+                     workClock.setClockStatus("1");
+                 } else {//早退
+                     workClock.setClockStatus("3");
+                 }
+             }
+             return workClockService.insert(workClock);
+         } catch (Exception e) {
+             log.error(e.getMessage());
+             return ApiResult.failure("新增数据失败",null);
+         }
+     }
     
     /** 
      * 更新数据

+ 9 - 9
work/src/main/java/com/ctsi/work/WorkClock/entity/WorkClock.java

@@ -24,10 +24,10 @@ public class WorkClock implements Serializable,Cloneable{
     private Long id ;
     /** 用户id */
     @ApiModelProperty(value = "用户id",notes = "")
-    private String userId ;
+    private Long userId ;
     /** 打卡类型 */
     @ApiModelProperty(value = "打卡类型",notes = "")
-    private Integer clockType ;
+    private String clockType ;
     /** 打卡时间 */
     @ApiModelProperty(value = "打卡时间",notes = "")
     private Long clockTime ;
@@ -36,7 +36,7 @@ public class WorkClock implements Serializable,Cloneable{
     private String clockAddr ;
     /** 打卡状态 */
     @ApiModelProperty(value = "打卡状态",notes = "")
-    private Integer clockStatus ;
+    private String clockStatus ;
     /** 经度 */
     @ApiModelProperty(value = "经度",notes = "")
     private String lng ;
@@ -53,19 +53,19 @@ public class WorkClock implements Serializable,Cloneable{
         this.id=id;
     }
     /** 用户id */
-    public String getUserId(){
+    public Long getUserId(){
         return this.userId;
     }
     /** 用户id */
-    public void setUserId(String userId){
+    public void setUserId(Long userId){
         this.userId=userId;
     }
     /** 打卡类型 */
-    public Integer getClockType(){
+    public String getClockType(){
         return this.clockType;
     }
     /** 打卡类型 */
-    public void setClockType(Integer clockType){
+    public void setClockType(String clockType){
         this.clockType=clockType;
     }
     /** 打卡时间 */
@@ -85,11 +85,11 @@ public class WorkClock implements Serializable,Cloneable{
         this.clockAddr=clockAddr;
     }
     /** 打卡状态 */
-    public Integer getClockStatus(){
+    public String getClockStatus(){
         return this.clockStatus;
     }
     /** 打卡状态 */
-    public void setClockStatus(Integer clockStatus){
+    public void setClockStatus(String clockStatus){
         this.clockStatus=clockStatus;
     }
     /** 经度 */

+ 136 - 0
work/src/main/java/com/ctsi/work/WorkClock/entity/WorkClockPO.java

@@ -0,0 +1,136 @@
+package com.ctsi.work.WorkClock.entity;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ctsi.annotation.DicCode;
+import com.ctsi.utils.LongtoStringSerialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+* 员工打卡表;
+* @author : machaoyi
+* @date : 2024-1-17
+*/
+@ApiModel(value = "员工打卡表PO",description = "")
+@TableName("work_clock")
+public class WorkClockPO implements Serializable,Cloneable{
+   /** 主键id */
+   @ApiModelProperty(value = "主键id",notes = "")
+   @TableId
+   @JsonSerialize(using = LongtoStringSerialize.class)
+   private Long id ;
+   /** 用户id */
+   @ApiModelProperty(value = "用户id",notes = "")
+   private Long userId ;
+   /** 打卡类型 */
+   @ApiModelProperty(value = "打卡类型",notes = "")
+   private String clockType ;
+   /** 打卡类型 */
+   @ApiModelProperty(value = "打卡类型",notes = "")
+   @DicCode("CLOCK-TYPE")
+   private String clockTypeName ;
+   /** 打卡时间 */
+   @ApiModelProperty(value = "打卡时间",notes = "")
+   private Long clockTime ;
+   /** 打卡地址 */
+   @ApiModelProperty(value = "打卡地址",notes = "")
+   private String clockAddr ;
+   /** 打卡状态 */
+   @ApiModelProperty(value = "打卡状态",notes = "")
+   private String clockStatus ;
+   /** 打卡状态 */
+   @ApiModelProperty(value = "打卡状态",notes = "")
+   @DicCode("CLOCK-STATUS")
+   private String clockStatusName ;
+   /** 经度 */
+   @ApiModelProperty(value = "经度",notes = "")
+   private String lng ;
+   /** 纬度 */
+   @ApiModelProperty(value = "纬度",notes = "")
+   private String lat ;
+
+   /** 主键id */
+   public Long getId(){
+       return this.id;
+   }
+   /** 主键id */
+   public void setId(Long id){
+       this.id=id;
+   }
+   /** 用户id */
+   public Long getUserId(){
+       return this.userId;
+   }
+   /** 用户id */
+   public void setUserId(Long userId){
+       this.userId=userId;
+   }
+   /** 打卡类型 */
+   public String getClockType(){
+       return this.clockType;
+   }
+   /** 打卡类型 */
+   public void setClockType(String clockType){
+       this.clockType=clockType;
+   }
+   /** 打卡时间 */
+   public Long getClockTime(){
+       return this.clockTime;
+   }
+   /** 打卡时间 */
+   public void setClockTime(Long clockTime){
+       this.clockTime=clockTime;
+   }
+   /** 打卡地址 */
+   public String getClockAddr(){
+       return this.clockAddr;
+   }
+   /** 打卡地址 */
+   public void setClockAddr(String clockAddr){
+       this.clockAddr=clockAddr;
+   }
+   /** 打卡状态 */
+   public String getClockStatus(){
+       return this.clockStatus;
+   }
+   /** 打卡状态 */
+   public void setClockStatus(String clockStatus){
+       this.clockStatus=clockStatus;
+   }
+   /** 经度 */
+   public String getLng(){
+       return this.lng;
+   }
+   /** 经度 */
+   public void setLng(String lng){
+       this.lng=lng;
+   }
+   /** 纬度 */
+   public String getLat(){
+       return this.lat;
+   }
+   /** 纬度 */
+   public void setLat(String lat){
+       this.lat=lat;
+   }
+
+   public String getClockTypeName() {
+      return clockTypeName;
+   }
+
+   public void setClockTypeName(String clockTypeName) {
+      this.clockTypeName = clockTypeName;
+   }
+
+   public String getClockStatusName() {
+      return clockStatusName;
+   }
+
+   public void setClockStatusName(String clockStatusName) {
+      this.clockStatusName = clockStatusName;
+   }
+}

+ 76 - 0
work/src/main/java/com/ctsi/work/WorkClock/entity/WorkClockVO.java

@@ -0,0 +1,76 @@
+package com.ctsi.work.WorkClock.entity;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ctsi.utils.LongtoStringSerialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+* 员工打卡表;
+* @author : machaoyi
+* @date : 2024-1-17
+*/
+@ApiModel(value = "员工打卡VO",description = "")
+@TableName("work_clock")
+public class WorkClockVO implements Serializable,Cloneable{
+   /** 打卡类型 */
+   @ApiModelProperty(value = "打卡类型",notes = "")
+   private String clockType ;
+   /** 考勤地址表id */
+   @ApiModelProperty(value = "考勤地址表id",notes = "")
+   private Long workAddrId ;
+   /** 打卡地址 */
+   @ApiModelProperty(value = "打卡地址",notes = "")
+   private String clockAddr ;
+   /** 经度 */
+   @ApiModelProperty(value = "经度",notes = "")
+   private String lng ;
+   /** 纬度 */
+   @ApiModelProperty(value = "纬度",notes = "")
+   private String lat ;
+
+   /** 打卡类型 */
+   public String getClockType(){
+       return this.clockType;
+   }
+   /** 打卡类型 */
+   public void setClockType(String clockType){
+       this.clockType=clockType;
+   }
+   /** 打卡地址 */
+   public String getClockAddr(){
+       return this.clockAddr;
+   }
+   /** 打卡地址 */
+   public void setClockAddr(String clockAddr){
+       this.clockAddr=clockAddr;
+   }
+   /** 经度 */
+   public String getLng(){
+       return this.lng;
+   }
+   /** 经度 */
+   public void setLng(String lng){
+       this.lng=lng;
+   }
+   /** 纬度 */
+   public String getLat(){
+       return this.lat;
+   }
+   /** 纬度 */
+   public void setLat(String lat){
+       this.lat=lat;
+   }
+
+   public Long getWorkAddrId() {
+      return workAddrId;
+   }
+
+   public void setWorkAddrId(Long workAddrId) {
+      this.workAddrId = workAddrId;
+   }
+}

+ 2 - 1
work/src/main/java/com/ctsi/work/WorkClock/mapper/WorkClockMapper.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.github.yulichang.base.MPJBaseMapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import com.ctsi.work.WorkClock.entity.WorkClock;
@@ -14,7 +15,7 @@ import com.ctsi.work.WorkClock.entity.WorkClock;
  * @date : 2024-1-17
  */
 @Mapper
-public interface WorkClockMapper  extends BaseMapper<WorkClock>{
+public interface WorkClockMapper  extends MPJBaseMapper<WorkClock> {
     /** 
      * 分页查询指定行数据
      *

+ 5 - 3
work/src/main/java/com/ctsi/work/WorkClock/service/WorkClockService.java

@@ -1,9 +1,11 @@
 package com.ctsi.work.WorkClock.service;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ctsi.utils.ApiResult;
 import com.ctsi.work.WorkClock.entity.WorkClock;
+import com.ctsi.work.WorkClock.entity.WorkClockPO;
 
- /**
+/**
  * 员工打卡表;(work_clock)表服务接口
  * @author : machaoyi
  * @date : 2024-1-17
@@ -26,14 +28,14 @@ public interface WorkClockService{
      * @param size  每页大小
      * @return
      */
-    Page<WorkClock> paginQuery(WorkClock workClock, long current, long size);
+    Page<WorkClockPO> paginQuery(WorkClock workClock, long current, long size);
     /** 
      * 新增数据
      *
      * @param workClock 实例对象
      * @return 实例对象
      */
-    WorkClock insert(WorkClock workClock);
+    ApiResult insert(WorkClock workClock);
     /** 
      * 更新数据
      *

+ 31 - 9
work/src/main/java/com/ctsi/work/WorkClock/service/impl/WorkClockServiceImpl.java

@@ -1,6 +1,13 @@
 package com.ctsi.work.WorkClock.service.impl;
 
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
+import com.ctsi.System.SysDic.entity.SysDic;
+import com.ctsi.System.SysDicItem.entity.SysDicItem;
+import com.ctsi.utils.ApiResult;
+import com.ctsi.work.WorkAddr.service.WorkAddrService;
+import com.ctsi.work.WorkClock.entity.WorkClockPO;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -10,7 +17,11 @@ import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWra
 import com.ctsi.work.WorkClock.entity.WorkClock;
 import com.ctsi.work.WorkClock.mapper.WorkClockMapper;
 import com.ctsi.work.WorkClock.service.WorkClockService;
- /**
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
  * 员工打卡表;(work_clock)表服务实现类
  * @author : machaoyi
  * @date : 2024-1-17
@@ -38,10 +49,10 @@ public class WorkClockServiceImpl implements WorkClockService{
      * @param size  每页大小
      * @return
      */
-    public Page<WorkClock> paginQuery(WorkClock workClock, long current, long size){
+    public Page<WorkClockPO> paginQuery(WorkClock workClock, long current, long size){
         //1. 构建动态查询条件
-        LambdaQueryWrapper<WorkClock> queryWrapper = new LambdaQueryWrapper<>();
-        if(StrUtil.isNotBlank(workClock.getUserId())){
+        MPJLambdaWrapper<WorkClock> queryWrapper = new MPJLambdaWrapper<>();
+        if (workClock.getUserId() != null && workClock.getUserId() != 0) {
             queryWrapper.eq(WorkClock::getUserId, workClock.getUserId());
         }
         if(StrUtil.isNotBlank(workClock.getClockAddr())){
@@ -53,9 +64,10 @@ public class WorkClockServiceImpl implements WorkClockService{
         if(StrUtil.isNotBlank(workClock.getLat())){
             queryWrapper.eq(WorkClock::getLat, workClock.getLat());
         }
+        queryWrapper.orderByDesc(WorkClock::getClockTime);
         //2. 执行分页查询
-        Page<WorkClock> pagin = new Page<>(current , size , true);
-        IPage<WorkClock> selectResult = workClockMapper.selectPage(pagin , queryWrapper);
+        Page<WorkClockPO> pagin = new Page<>(current , size , true);
+        IPage<WorkClockPO> selectResult = workClockMapper.selectJoinPage(pagin ,WorkClockPO.class, queryWrapper);;
         pagin.setPages(selectResult.getPages());
         pagin.setTotal(selectResult.getTotal());
         pagin.setRecords(selectResult.getRecords());
@@ -69,9 +81,19 @@ public class WorkClockServiceImpl implements WorkClockService{
      * @param workClock 实例对象
      * @return 实例对象
      */
-    public WorkClock insert(WorkClock workClock){
+    public ApiResult insert(WorkClock workClock){
+        Long zeroTimestamp = DateUtil.beginOfDay(DateUtil.date()).getTime();
+        LambdaQueryWrapper<WorkClock> queryWrapper = new LambdaQueryWrapper<>();
+        // 同一个员工,同一天,同一种打卡类型,只能打一次卡
+        queryWrapper.ge(WorkClock::getClockTime, zeroTimestamp);
+        queryWrapper.eq(WorkClock::getUserId, workClock.getUserId());
+        queryWrapper.eq(WorkClock::getClockType, workClock.getClockType());
+        List<WorkClock> workClockList = workClockMapper.selectList(queryWrapper);
+        if (!workClockList.isEmpty()) {//已打过卡
+            ApiResult.failure("已打过卡",null);
+        }
         workClockMapper.insert(workClock);
-        return workClock;
+        return ApiResult.success(workClock);
     }
     
     /** 
@@ -83,7 +105,7 @@ public class WorkClockServiceImpl implements WorkClockService{
     public WorkClock update(WorkClock workClock){
         //1. 根据条件动态更新
         LambdaUpdateChainWrapper<WorkClock> chainWrapper = new LambdaUpdateChainWrapper<WorkClock>(workClockMapper);
-        if(StrUtil.isNotBlank(workClock.getUserId())){
+        if (workClock.getUserId() != null && workClock.getUserId() != 0) {
             chainWrapper.set(WorkClock::getUserId, workClock.getUserId());
         }
         if(StrUtil.isNotBlank(workClock.getClockAddr())){