Przeglądaj źródła

加班申请提交并发

lxy_01 2 tygodni temu
rodzic
commit
ce22105c55

+ 39 - 28
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/WorkOvertimeController.java

@@ -30,6 +30,7 @@ import javax.servlet.http.HttpServletRequest;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.concurrent.locks.ReentrantLock;
 import java.util.stream.Collectors;
 
 /**
@@ -57,6 +58,9 @@ public class WorkOvertimeController {
     private OvertimeSettingMapper overtimeSettingMapper;
     @Resource
     private SysFunctionService sysFunctionService;
+
+    // 定义本地锁:全局唯一,保证同一时间只有一个线程执行核心逻辑
+    private final ReentrantLock lock = new ReentrantLock();
     
     @Value(value = "${upload.path}")
     private String path;
@@ -74,40 +78,47 @@ public class WorkOvertimeController {
             return msg;
         }
 
-        //判断是否有员工已经存在申请的记录
-        String[] ids = workOvertime.getEmployeeIds().split(",");
-        for (int i = 0; i < ids.length; i++) {
-            QueryWrapper<WorkOvertime> queryWrapper = new QueryWrapper<>();
-            queryWrapper.like("employee_ids", ids[i]);
-            queryWrapper.eq("work_date", workOvertime.getWorkDate());
-            if (workOvertimeService.list(queryWrapper).size() > 0) {
-                msg.setError("员工["+userMapper.selectById(ids[i]).getName()+"]已经存在"+ dtf.format(workOvertime.getWorkDate())+"的加班申请");
-                return msg;
-            }
-        }
-        //生产车间主任(生产车间主管)代工位提交加班申请,只会按照同一工位依次提交,若申请中员工id不为同一工位,则报错返回,若相同则设置为申请工位id
-        if (Objects.equals(user.getId(), departmentMapper.selectById(31).getManagerId())) {
-            String[] employeeIds = workOvertime.getEmployeeIds().split(",");
-            Integer Workstaion = null;
-            for (int i = 0; i < employeeIds.length; i++) {
-                if (Workstaion == null) {
-                    Workstaion = userMapper.selectById(employeeIds[i]).getDepartmentId();
+        lock.lock();
+        try{
+
+            //判断是否有员工已经存在申请的记录
+            String[] ids = workOvertime.getEmployeeIds().split(",");
+            for (int i = 0; i < ids.length; i++) {
+                QueryWrapper<WorkOvertime> queryWrapper = new QueryWrapper<>();
+                queryWrapper.like("employee_ids", ids[i]);
+                queryWrapper.eq("work_date", workOvertime.getWorkDate());
+                if (workOvertimeService.list(queryWrapper).size() > 0) {
+                    msg.setError("员工["+userMapper.selectById(ids[i]).getName()+"]已经存在"+ dtf.format(workOvertime.getWorkDate())+"的加班申请");
+                    return msg;
                 }
-                else {
-                    if(!Workstaion.equals(userMapper.selectById(employeeIds[i]).getDepartmentId())){
-                        msg.setError("车间主任代工位提交加班申请,所选员工需要为同一工位");
-                        return msg;
+            }
+            //生产车间主任(生产车间主管)代工位提交加班申请,只会按照同一工位依次提交,若申请中员工id不为同一工位,则报错返回,若相同则设置为申请工位id
+            if (Objects.equals(user.getId(), departmentMapper.selectById(31).getManagerId())) {
+                String[] employeeIds = workOvertime.getEmployeeIds().split(",");
+                Integer Workstaion = null;
+                for (int i = 0; i < employeeIds.length; i++) {
+                    if (Workstaion == null) {
+                        Workstaion = userMapper.selectById(employeeIds[i]).getDepartmentId();
+                    }
+                    else {
+                        if(!Workstaion.equals(userMapper.selectById(employeeIds[i]).getDepartmentId())){
+                            msg.setError("车间主任代工位提交加班申请,所选员工需要为同一工位");
+                            return msg;
+                        }
                     }
                 }
+                if (Workstaion != null) {
+                    workOvertime.setWorkstationId(Workstaion);
+                }
             }
-            if (Workstaion != null) {
-                workOvertime.setWorkstationId(Workstaion);
+            else {
+                workOvertime.setWorkstationId(user.getDepartmentId());
             }
+            msg.data = workOvertimeService.saveOrUpdate(workOvertime);
+
+        }finally {
+            lock.unlock();
         }
-        else {
-            workOvertime.setWorkstationId(user.getDepartmentId());
-        }
-        msg.data = workOvertimeService.saveOrUpdate(workOvertime);
         return msg;
     }