Ver código fonte

【功能开发】app 端:省核验人员:打卡:返回打卡对象,自定义时间序列化器,返回格式化时间字符串@StringLocalDateTimeSerializer

duhuajie 2 semanas atrás
pai
commit
276a0e21c8

+ 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 89
     @PostMapping("/setDkxxByKqId")
90 90
     @Operation(summary = "打卡(传 id 是变更(传图片),不传 id 是新增")
91
-    public CommonResult<Boolean> setDkxxByKqId(@RequestBody TaskDkxxSaveVO saveVO) {
91
+    public CommonResult<TaskDkxxRespVO> setDkxxByKqId(@RequestBody TaskDkxxSaveVO saveVO) {
92 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 1
 package com.unis.module.coding.controller.admin.task.vo;
2 2
 
3 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 6
 import io.swagger.v3.oas.annotations.media.Schema;
5 7
 import lombok.Data;
6 8
 
@@ -21,6 +23,7 @@ public class TaskDkxxRespVO {
21 23
     private Long userId;
22 24
 
23 25
     @Schema(description = "打卡时间")
26
+    @JsonSerialize(using = StringLocalDateTimeSerializer.class) // 使用自定义序列化器
24 27
     private LocalDateTime dksj;
25 28
 
26 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 30
     TaskDkxxRespVO getDkxxByKqId(TaskPageReqVO reqVO);
31 31
 
32
-    Boolean setDkxxByKqId(TaskDkxxSaveVO saveVO);
32
+    TaskDkxxRespVO setDkxxByKqId(TaskDkxxSaveVO saveVO);
33 33
 
34 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 39
 import org.springframework.validation.annotation.Validated;
40 40
 
41 41
 import javax.annotation.Resource;
42
+import java.time.LocalDateTime;
42 43
 import java.util.ArrayList;
43 44
 import java.util.List;
44 45
 import java.util.Set;
@@ -83,9 +84,7 @@ public class TaskServiceImpl implements TaskService {
83 84
         addParamDeptIds(pageReqVO);
84 85
 
85 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 90
     @Override
@@ -254,37 +253,45 @@ public class TaskServiceImpl implements TaskService {
254 253
         return BeanUtils.toBean(dkDO, TaskDkxxRespVO.class);
255 254
     }
256 255
 
256
+    /**
257
+     * 打卡(传 id 是变更(传图片),不传 id 是新增
258
+     * @param saveVO 打卡对象
259
+     * @return 结果
260
+     */
257 261
     @Override
258 262
     @Transactional(rollbackFor = Exception.class)
259
-    public Boolean setDkxxByKqId(TaskDkxxSaveVO saveVO) {
263
+    public TaskDkxxRespVO setDkxxByKqId(TaskDkxxSaveVO saveVO) {
260 264
 
261 265
         if(ObjectUtils.isEmpty(saveVO) || ObjectUtils.isEmpty(saveVO.getKqId())) {
262 266
             throw exception(ErrorCodeConstants.APP_PARAM_ERROR);
263 267
         }
264
-        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
268
+        Long loginUserId = SecurityFrameworkUtils.getLoginUserIdNotNull();
265 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 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 297
     @Override
@@ -319,6 +326,7 @@ public class TaskServiceImpl implements TaskService {
319 326
         DkDO saveDo = BeanUtils.toBean(saveVO, DkDO.class);
320 327
         saveDo.setId(YitIdHelper.nextId());// 雪花id
321 328
         saveDo.setUserId(loginUserId);
329
+        saveDo.setDksj(LocalDateTime.now());
322 330
         return saveDo;
323 331
     }
324 332
 
@@ -343,7 +351,7 @@ public class TaskServiceImpl implements TaskService {
343 351
 
344 352
         IPage<TaskRespVO> taskList = getTaskList(pageReqVO);
345 353
 
346
-        if(taskList.getTotal() != reqVO.getKqIds().size()) {
354
+        if(taskList.getRecords().size() != reqVO.getKqIds().size()) {
347 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 1
 <?xml version="1.0" encoding="UTF-8"?>
2 2
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
3
-<!--suppress SqlNoDataSourceInspection -->
4 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 5
     <select id="getTaskList" resultType="com.unis.module.coding.controller.admin.task.vo.TaskRespVO">
14 6
         SELECT
15 7
             dk.ID AS kqId,