Browse Source

Merge remote-tracking branch 'origin/master'

lfy 2 weeks ago
parent
commit
afc2fbbcd5

+ 29 - 0
delivery-framework/delivery-spring-boot-starter-web/src/main/java/com/unis/framework/jackson/core/databind/StringLocalDateTimeSerializer.java

@@ -0,0 +1,29 @@
1
+package com.unis.framework.jackson.core.databind;
2
+
3
+import com.fasterxml.jackson.core.JsonGenerator;
4
+import com.fasterxml.jackson.databind.JsonSerializer;
5
+import com.fasterxml.jackson.databind.SerializerProvider;
6
+
7
+import java.io.IOException;
8
+import java.time.LocalDateTime;
9
+import java.time.format.DateTimeFormatter;
10
+
11
+import static com.unis.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
12
+
13
+/**
14
+ * 自定义序列化器:
15
+ *  LocalDateTime类型对象返回给前端时,返回的时间格式为:yyyy-MM-dd HH:mm:ss
16
+ *  应用:在需要转换的字段上添加:@JsonSerialize(using = CustomLocalDateTimeSerializer.class) // 使用自定义序列化器
17
+ */
18
+public class StringLocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
19
+    private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern(FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND);
20
+
21
+    @Override
22
+    public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
23
+        if (value != null) {
24
+            gen.writeString(value.format(formatter));
25
+        } else {
26
+            gen.writeNull();
27
+        }
28
+    }
29
+}

+ 1 - 1
delivery-module-core/delivery-module-core-biz/src/main/java/com/unis/module/coding/controller/admin/task/TaskController.java

@@ -88,7 +88,7 @@ public class TaskController {
88
 
88
 
89
     @PostMapping("/setDkxxByKqId")
89
     @PostMapping("/setDkxxByKqId")
90
     @Operation(summary = "打卡(传 id 是变更(传图片),不传 id 是新增")
90
     @Operation(summary = "打卡(传 id 是变更(传图片),不传 id 是新增")
91
-    public CommonResult<Boolean> setDkxxByKqId(@RequestBody TaskDkxxSaveVO saveVO) {
91
+    public CommonResult<TaskDkxxRespVO> setDkxxByKqId(@RequestBody TaskDkxxSaveVO saveVO) {
92
         return success(taskService.setDkxxByKqId(saveVO));
92
         return success(taskService.setDkxxByKqId(saveVO));
93
     }
93
     }
94
 
94
 

+ 3 - 0
delivery-module-core/delivery-module-core-biz/src/main/java/com/unis/module/coding/controller/admin/task/vo/TaskDkxxRespVO.java

@@ -1,6 +1,8 @@
1
 package com.unis.module.coding.controller.admin.task.vo;
1
 package com.unis.module.coding.controller.admin.task.vo;
2
 
2
 
3
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
3
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
4
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
5
+import com.unis.framework.jackson.core.databind.StringLocalDateTimeSerializer;
4
 import io.swagger.v3.oas.annotations.media.Schema;
6
 import io.swagger.v3.oas.annotations.media.Schema;
5
 import lombok.Data;
7
 import lombok.Data;
6
 
8
 
@@ -21,6 +23,7 @@ public class TaskDkxxRespVO {
21
     private Long userId;
23
     private Long userId;
22
 
24
 
23
     @Schema(description = "打卡时间")
25
     @Schema(description = "打卡时间")
26
+    @JsonSerialize(using = StringLocalDateTimeSerializer.class) // 使用自定义序列化器
24
     private LocalDateTime dksj;
27
     private LocalDateTime dksj;
25
 
28
 
26
     @Schema(description = "打卡地点")
29
     @Schema(description = "打卡地点")

+ 1 - 1
delivery-module-core/delivery-module-core-biz/src/main/java/com/unis/module/coding/service/task/TaskService.java

@@ -29,7 +29,7 @@ public interface TaskService {
29
 
29
 
30
     TaskDkxxRespVO getDkxxByKqId(TaskPageReqVO reqVO);
30
     TaskDkxxRespVO getDkxxByKqId(TaskPageReqVO reqVO);
31
 
31
 
32
-    Boolean setDkxxByKqId(TaskDkxxSaveVO saveVO);
32
+    TaskDkxxRespVO setDkxxByKqId(TaskDkxxSaveVO saveVO);
33
 
33
 
34
     Boolean getStoreroom(TaskPageReqVO reqVO);
34
     Boolean getStoreroom(TaskPageReqVO reqVO);
35
 
35
 

+ 31 - 23
delivery-module-core/delivery-module-core-biz/src/main/java/com/unis/module/coding/service/task/TaskServiceImpl.java

@@ -39,6 +39,7 @@ import org.springframework.transaction.annotation.Transactional;
39
 import org.springframework.validation.annotation.Validated;
39
 import org.springframework.validation.annotation.Validated;
40
 
40
 
41
 import javax.annotation.Resource;
41
 import javax.annotation.Resource;
42
+import java.time.LocalDateTime;
42
 import java.util.ArrayList;
43
 import java.util.ArrayList;
43
 import java.util.List;
44
 import java.util.List;
44
 import java.util.Set;
45
 import java.util.Set;
@@ -83,9 +84,7 @@ public class TaskServiceImpl implements TaskService {
83
         addParamDeptIds(pageReqVO);
84
         addParamDeptIds(pageReqVO);
84
 
85
 
85
         IPage<TaskRespVO> page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());
86
         IPage<TaskRespVO> page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());
86
-        dkMapper.getTaskList(page, pageReqVO);
87
-
88
-        return page;
87
+        return dkMapper.getTaskList(page, pageReqVO);
89
     }
88
     }
90
 
89
 
91
     @Override
90
     @Override
@@ -254,37 +253,45 @@ public class TaskServiceImpl implements TaskService {
254
         return BeanUtils.toBean(dkDO, TaskDkxxRespVO.class);
253
         return BeanUtils.toBean(dkDO, TaskDkxxRespVO.class);
255
     }
254
     }
256
 
255
 
256
+    /**
257
+     * 打卡(传 id 是变更(传图片),不传 id 是新增
258
+     * @param saveVO 打卡对象
259
+     * @return 结果
260
+     */
257
     @Override
261
     @Override
258
     @Transactional(rollbackFor = Exception.class)
262
     @Transactional(rollbackFor = Exception.class)
259
-    public Boolean setDkxxByKqId(TaskDkxxSaveVO saveVO) {
263
+    public TaskDkxxRespVO setDkxxByKqId(TaskDkxxSaveVO saveVO) {
260
 
264
 
261
         if(ObjectUtils.isEmpty(saveVO) || ObjectUtils.isEmpty(saveVO.getKqId())) {
265
         if(ObjectUtils.isEmpty(saveVO) || ObjectUtils.isEmpty(saveVO.getKqId())) {
262
             throw exception(ErrorCodeConstants.APP_PARAM_ERROR);
266
             throw exception(ErrorCodeConstants.APP_PARAM_ERROR);
263
         }
267
         }
264
-        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
268
+        Long loginUserId = SecurityFrameworkUtils.getLoginUserIdNotNull();
265
         DkDO dkDO = dkMapper.selectByKqIdAndUserId(saveVO.getKqId(), loginUserId);
269
         DkDO dkDO = dkMapper.selectByKqIdAndUserId(saveVO.getKqId(), loginUserId);
270
+        synchronized (loginUserId){ //上锁 避免重复提交
271
+            if(ObjectUtils.isEmpty(saveVO.getId())) {
272
+                if(ObjectUtils.isNotEmpty(dkDO)) {
273
+                    throw exception(ErrorCodeConstants.APP_TASK_RECEIVE_ERROR_RETRY);
274
+                }
266
 
275
 
267
-        if(ObjectUtils.isEmpty(saveVO.getId())) {
268
-            if(ObjectUtils.isNotEmpty(dkDO)) {
269
-                throw exception(ErrorCodeConstants.APP_TASK_RECEIVE_ERROR_RETRY);
270
-            }
271
-
272
-            // 查询登录人角色标识,填充[打卡类型]
273
-            setDkType(saveVO, loginUserId);
276
+                // 查询登录人角色标识,填充[打卡类型]
277
+                setDkType(saveVO, loginUserId);
274
 
278
 
275
-            //新增
276
-            DkDO saveDo = getDkDO(saveVO, loginUserId);
277
-            dkMapper.insert(saveDo);
278
-        } else {
279
-            //变更
280
-            if(ObjectUtils.isNotEmpty(dkDO) && dkDO.getId().equals(saveVO.getId())) {
281
-                dkMapper.updateById(BeanUtils.toBean(saveVO, DkDO.class));
279
+                //新增
280
+                DkDO saveDo = getDkDO(saveVO, loginUserId);
281
+                dkMapper.insert(saveDo);
282
+                return BeanUtils.toBean(saveDo, TaskDkxxRespVO.class); //返回打卡对象
282
             } else {
283
             } else {
283
-                throw exception(ErrorCodeConstants.APP_PARAM_ERROR);
284
+                //变更
285
+                if(ObjectUtils.isNotEmpty(dkDO) && dkDO.getId().equals(saveVO.getId())) {
286
+                    DkDO updateDo = BeanUtils.toBean(saveVO, DkDO.class);
287
+                    updateDo.setDksj(LocalDateTime.now());
288
+                    dkMapper.updateById(updateDo);
289
+                    return BeanUtils.toBean(updateDo, TaskDkxxRespVO.class);
290
+                } else {
291
+                    throw exception(ErrorCodeConstants.APP_PARAM_ERROR);
292
+                }
284
             }
293
             }
285
         }
294
         }
286
-
287
-        return null;
288
     }
295
     }
289
 
296
 
290
     @Override
297
     @Override
@@ -319,6 +326,7 @@ public class TaskServiceImpl implements TaskService {
319
         DkDO saveDo = BeanUtils.toBean(saveVO, DkDO.class);
326
         DkDO saveDo = BeanUtils.toBean(saveVO, DkDO.class);
320
         saveDo.setId(YitIdHelper.nextId());// 雪花id
327
         saveDo.setId(YitIdHelper.nextId());// 雪花id
321
         saveDo.setUserId(loginUserId);
328
         saveDo.setUserId(loginUserId);
329
+        saveDo.setDksj(LocalDateTime.now());
322
         return saveDo;
330
         return saveDo;
323
     }
331
     }
324
 
332
 
@@ -343,7 +351,7 @@ public class TaskServiceImpl implements TaskService {
343
 
351
 
344
         IPage<TaskRespVO> taskList = getTaskList(pageReqVO);
352
         IPage<TaskRespVO> taskList = getTaskList(pageReqVO);
345
 
353
 
346
-        if(taskList.getTotal() != reqVO.getKqIds().size()) {
354
+        if(taskList.getRecords().size() != reqVO.getKqIds().size()) {
347
             throw exception(ErrorCodeConstants.APP_TASK_RECEIVE_ERROR);
355
             throw exception(ErrorCodeConstants.APP_TASK_RECEIVE_ERROR);
348
         }
356
         }
349
     }
357
     }

+ 0 - 8
delivery-module-core/delivery-module-core-biz/src/main/resources/mapper/dk/DkMapper.xml

@@ -1,15 +1,7 @@
1
 <?xml version="1.0" encoding="UTF-8"?>
1
 <?xml version="1.0" encoding="UTF-8"?>
2
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
2
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
3
-<!--suppress SqlNoDataSourceInspection -->
4
 <mapper namespace="com.unis.module.coding.dal.mysql.dk.DkMapper">
3
 <mapper namespace="com.unis.module.coding.dal.mysql.dk.DkMapper">
5
 
4
 
6
-    <!--
7
-        一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
8
-        无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
9
-        代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
10
-        文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
11
-     -->
12
-
13
     <select id="getTaskList" resultType="com.unis.module.coding.controller.admin.task.vo.TaskRespVO">
5
     <select id="getTaskList" resultType="com.unis.module.coding.controller.admin.task.vo.TaskRespVO">
14
         SELECT
6
         SELECT
15
             dk.ID AS kqId,
7
             dk.ID AS kqId,