|
|
@@ -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;
|
|
|
}
|
|
|
|
|
|
@@ -204,6 +215,12 @@ public class WorkOvertimeController {
|
|
|
List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", targetUser.getCompanyId()));
|
|
|
Company company = companyMapper.selectById(targetUser.getCompanyId());
|
|
|
|
|
|
+ /*
|
|
|
+ 导出的部门顺序写死
|
|
|
+ * */
|
|
|
+ String[] departmentReportOV = {"生产办公室","维修班","折弯成型工位","下料工位","数控加工工位","铆焊一工位","铆焊二工位","铆焊三工位","铆焊四工位","铆焊五工位","铆焊六工位"
|
|
|
+ ,"牵枕缓一工位","牵枕缓二工位","车顶工位","动车车钩工位","司机室工位","搅拌摩擦焊工位","组装工位","硫化工位","机加工工位","热处理工位"};
|
|
|
+
|
|
|
//非管理员只能看到自己的
|
|
|
if (!targetUser.getRoleName().equals("超级管理员") && !targetUser.getRoleName().equals("系统管理员") && !sysFunctionService.hasPriviledge(targetUser.getRoleId(),"查看全部人员加班")) {
|
|
|
applicant = token;
|
|
|
@@ -280,25 +297,40 @@ public class WorkOvertimeController {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
/*
|
|
|
- * 每日加班申请按照部门id-加班时段排序
|
|
|
+ * 每日加班申请按照部门写死的顺排序
|
|
|
* */
|
|
|
- dateOvertimes.sort((s1,s2) ->{
|
|
|
- int res = -1;
|
|
|
- if(s1.getWorkstationId() != null && s2.getWorkstationId() != null){
|
|
|
- res = s1.getWorkstationId().compareTo(s2.getWorkstationId());
|
|
|
+ List<Map.Entry<String,List<WorkOvertime>>> worksationMaps = new ArrayList<>();
|
|
|
+ for (String s : departmentReportOV) {
|
|
|
+ Integer departmentId;
|
|
|
+ List<Department> departments = departmentMapper.selectList(new QueryWrapper<Department>().eq("department_name", s));
|
|
|
+ if (departments != null && !departments.isEmpty()) {
|
|
|
+ departmentId = departments.get(0).getDepartmentId();
|
|
|
+ } else {
|
|
|
+ departmentId = null;
|
|
|
}
|
|
|
- if(res == 0){
|
|
|
- if (s1.getTimeTypeId() != null && s2.getTimeTypeId() != null) {
|
|
|
- res = s1.getTimeTypeId().compareTo(s2.getTimeTypeId());
|
|
|
+ /*
|
|
|
+ 只有找到对应的需要导出的记录才增加数据
|
|
|
+ * */
|
|
|
+ if (departmentId != null) {
|
|
|
+ List<WorkOvertime> list =
|
|
|
+ dateOvertimes.stream().filter(workOvertime -> workOvertime.getWorkstationId().equals(departmentId)).sorted(Comparator.comparing(WorkOvertime::getTimeTypeId)).collect(Collectors.toList());
|
|
|
+ /*
|
|
|
+ 只有找到对应的需要导出的记录才增加数据
|
|
|
+ * */
|
|
|
+ if (!list.isEmpty()) {
|
|
|
+ worksationMaps.add(new AbstractMap.SimpleEntry<>(s,list));
|
|
|
}
|
|
|
}
|
|
|
- return res;
|
|
|
- });
|
|
|
+ }
|
|
|
+
|
|
|
+ List<WorkOvertime> dateOvertimesResult = new ArrayList<>();
|
|
|
+ for (Map.Entry<String,List<WorkOvertime>> entry :worksationMaps){
|
|
|
+ dateOvertimesResult.addAll(entry.getValue());
|
|
|
+ }
|
|
|
|
|
|
List<ExcelUtil.WorkstationData> workstationDataList = new ArrayList<>();
|
|
|
- for (WorkOvertime workOvertime : dateOvertimes) {
|
|
|
+ for (WorkOvertime workOvertime : dateOvertimesResult) {
|
|
|
ExcelUtil.WorkstationData overtimeStatisticsData = createWorkstationData(workOvertime);
|
|
|
if(overtimeStatisticsData == null){
|
|
|
continue;
|