From 1b77c2724e38d087f3eab4a2f27b3b165f4265dc Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期一, 25 五月 2026 14:37:34 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_tide' into dev_tide

---
 src/main/java/com/ruoyi/safety/service/impl/SafetyAssessmentTaskEmployeeServiceImpl.java |  141 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 141 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/ruoyi/safety/service/impl/SafetyAssessmentTaskEmployeeServiceImpl.java b/src/main/java/com/ruoyi/safety/service/impl/SafetyAssessmentTaskEmployeeServiceImpl.java
new file mode 100644
index 0000000..cef0b03
--- /dev/null
+++ b/src/main/java/com/ruoyi/safety/service/impl/SafetyAssessmentTaskEmployeeServiceImpl.java
@@ -0,0 +1,141 @@
+package com.ruoyi.safety.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.safety.mapper.SafetyAssessmentTaskEmployeeMapper;
+import com.ruoyi.safety.pojo.SafetyAssessmentTask;
+import com.ruoyi.safety.pojo.SafetyAssessmentTaskEmployee;
+import com.ruoyi.safety.service.SafetyAssessmentTaskEmployeeService;
+import com.ruoyi.safety.service.SafetyAssessmentTaskService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+
+@Service
+public class SafetyAssessmentTaskEmployeeServiceImpl
+        extends SafetyBaseServiceImpl<SafetyAssessmentTaskEmployeeMapper, SafetyAssessmentTaskEmployee>
+        implements SafetyAssessmentTaskEmployeeService {
+
+    @Autowired
+    private SafetyAssessmentTaskService taskService;
+
+    @Override
+    public IPage<SafetyAssessmentTaskEmployee> queryPage(Page<SafetyAssessmentTaskEmployee> page,
+                                                         SafetyAssessmentTaskEmployee query) {
+        QueryWrapper<SafetyAssessmentTaskEmployee> wrapper =
+                new QueryWrapper<SafetyAssessmentTaskEmployee>().orderByDesc("create_time");
+        if (query != null) {
+            if (query.getTaskId() != null) {
+                wrapper.eq("task_id", query.getTaskId());
+            }
+            if (query.getEmployeeId() != null) {
+                wrapper.eq("employee_id", query.getEmployeeId());
+            }
+            if (hasText(query.getEmployeeName())) {
+                wrapper.like("employee_name", query.getEmployeeName());
+            }
+            if (query.getStatus() != null) {
+                wrapper.eq("status", query.getStatus());
+            }
+        }
+        return page(page, wrapper);
+    }
+
+    @Override
+    public boolean start(SafetyAssessmentTaskEmployee request) {
+        if (request == null || request.getTaskId() == null) {
+            return false;
+        }
+        fillCurrentEmployeeIfMissing(request);
+        if (request.getEmployeeId() == null) {
+            return false;
+        }
+        SafetyAssessmentTaskEmployee existing = getOne(new QueryWrapper<SafetyAssessmentTaskEmployee>()
+                .eq("task_id", request.getTaskId())
+                .eq("employee_id", request.getEmployeeId())
+                .last("limit 1"));
+        if (existing != null) {
+            return true;
+        }
+        if (request.getStatus() == null) {
+            request.setStatus(0);
+        }
+        updateTaskStatus(request.getTaskId(), 1);
+        return saveSafety(request);
+    }
+
+    @Override
+    public boolean submit(SafetyAssessmentTaskEmployee request) {
+        if (request == null) {
+            return false;
+        }
+        fillCurrentEmployeeIfMissing(request);
+        SafetyAssessmentTaskEmployee target = findSubmitTarget(request);
+        if (target == null) {
+            if (request.getTaskId() == null || request.getEmployeeId() == null) {
+                return false;
+            }
+            request.setStatus(1);
+            if (request.getCompleteTime() == null) {
+                request.setCompleteTime(LocalDateTime.now());
+            }
+            boolean saved = saveSafety(request);
+            finishTaskWhenAllSubmitted(request.getTaskId());
+            return saved;
+        }
+        target.setStatus(1);
+        target.setScore(request.getScore());
+        target.setRemark(request.getRemark());
+        target.setCompleteTime(request.getCompleteTime() == null ? LocalDateTime.now() : request.getCompleteTime());
+        boolean updated = updateSafety(target);
+        finishTaskWhenAllSubmitted(target.getTaskId());
+        return updated;
+    }
+
+    private SafetyAssessmentTaskEmployee findSubmitTarget(SafetyAssessmentTaskEmployee request) {
+        if (request.getId() != null) {
+            SafetyAssessmentTaskEmployee byId = getById(request.getId());
+            if (byId != null) {
+                return byId;
+            }
+        }
+        if (request.getTaskId() != null && request.getEmployeeId() != null) {
+            return getOne(new QueryWrapper<SafetyAssessmentTaskEmployee>()
+                    .eq("task_id", request.getTaskId())
+                    .eq("employee_id", request.getEmployeeId())
+                    .last("limit 1"));
+        }
+        return null;
+    }
+
+    private void fillCurrentEmployeeIfMissing(SafetyAssessmentTaskEmployee request) {
+        if (request.getEmployeeId() == null) {
+            request.setEmployeeId(currentUserId());
+        }
+        if (!hasText(request.getEmployeeName())) {
+            request.setEmployeeName(currentUsername());
+        }
+    }
+
+    private void updateTaskStatus(Long taskId, Integer status) {
+        SafetyAssessmentTask task = taskService.getById(taskId);
+        if (task != null && (task.getStatus() == null || task.getStatus() < status)) {
+            task.setStatus(status);
+            taskService.updateSafety(task);
+        }
+    }
+
+    private void finishTaskWhenAllSubmitted(Long taskId) {
+        if (taskId == null) {
+            return;
+        }
+        long pending = count(new QueryWrapper<SafetyAssessmentTaskEmployee>()
+                .eq("task_id", taskId)
+                .eq("status", 0));
+        if (pending == 0) {
+            updateTaskStatus(taskId, 2);
+        }
+    }
+}

--
Gitblit v1.9.3