|
|
@@ -9,10 +9,7 @@ import com.management.platform.constant.Constant;
|
|
|
import com.management.platform.controller.WeiXinCorpController;
|
|
|
import com.management.platform.entity.*;
|
|
|
import com.management.platform.mapper.*;
|
|
|
-import com.management.platform.service.OvertimeAllowanceService;
|
|
|
-import com.management.platform.service.TimeTypeService;
|
|
|
-import com.management.platform.service.WxCorpInfoService;
|
|
|
-import com.management.platform.service.WxCorpTemplateService;
|
|
|
+import com.management.platform.service.*;
|
|
|
import com.management.platform.task.SFTPAsyncUploader;
|
|
|
import com.management.platform.util.*;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
@@ -201,6 +198,10 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
|
|
|
private com.management.platform.service.OvertimeService overtimeService;
|
|
|
@Resource
|
|
|
private ExceptionInfosMapper exceptionInfosMapper;
|
|
|
+ @Resource
|
|
|
+ private DepartmentMapper departmentMapper;
|
|
|
+ @Autowired
|
|
|
+ private UserCorpwxTimeService userCorpwxTimeService;
|
|
|
|
|
|
|
|
|
//获取服务商provider_access_token
|
|
|
@@ -1172,21 +1173,21 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
|
|
|
endCardTime.withHour(23).withMinute(59).withSecond(0).withNano(0);
|
|
|
}
|
|
|
if (corpInfo.getCompanyId() == Constant.HUA_YAN_COMPANY_ID) {
|
|
|
- double time = DateTimeUtil.calculateHuaYanWorkHours(minTime, maxTime, baseMorningStart, baseMorningEnd, baseAfternoonStart, baseAfternoonEnd, WorkDayCalculateUtils.isSundayOrHoliday(date));
|
|
|
+ double time = DateTimeUtil.calculateHuaYanWorkHours(minTime, maxTime, WorkDayCalculateUtils.isSundayOrHoliday(date));
|
|
|
if (time < 0) {
|
|
|
time = 0;
|
|
|
}
|
|
|
userCorpwxTime.setWorkHours(time);
|
|
|
} else {
|
|
|
BigDecimal bigDecimal = new BigDecimal(Duration.between(startCardTime,endCardTime).toMinutes());
|
|
|
-// System.out.println("打卡时长(分钟):" + bigDecimal);
|
|
|
+// System.out.println("打卡时长(分钟):" + bigDecimal);
|
|
|
//开始时间在上午,结束时间在下午,要减去午休时长
|
|
|
if (startCardTime.compareTo(LocalTime.parse(baseMorningEnd,df)) <= 0 && endCardTime.compareTo(LocalTime.parse(baseAfternoonStart,df)) >= 0) {
|
|
|
//重新计算打卡工时时,需要减去中间午休时间
|
|
|
- bigDecimal = bigDecimal.divide(BigDecimal.valueOf(60),1,BigDecimal.ROUND_HALF_UP).subtract(new BigDecimal(restTime));
|
|
|
+ bigDecimal = bigDecimal.divide(BigDecimal.valueOf(60),3,BigDecimal.ROUND_HALF_UP).subtract(new BigDecimal(restTime));
|
|
|
if (showLog) System.out.println("午休时间:"+restTime+", 减去后,工作时长="+bigDecimal);
|
|
|
} else {
|
|
|
- bigDecimal = bigDecimal.divide(BigDecimal.valueOf(60),1,BigDecimal.ROUND_HALF_UP);
|
|
|
+ bigDecimal = bigDecimal.divide(BigDecimal.valueOf(60),3,BigDecimal.ROUND_HALF_UP);
|
|
|
}
|
|
|
double time = bigDecimal.doubleValue();
|
|
|
if (time < 0) {
|
|
|
@@ -1206,6 +1207,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
|
|
|
if (userCorpwxTime.getCorpwxUserid().equals("woy9TkCAAACItPe1U_gkLcvivCMgpqRg") && date.isEqual(LocalDate.of(2024, 8, 28))) {
|
|
|
continue;
|
|
|
}
|
|
|
+
|
|
|
synchronized (userLock){
|
|
|
UserCorpwxTime item = userCorpwxTimeMapper.selectOne(new QueryWrapper<UserCorpwxTime>().eq("corpwx_userid", (String) objects[i])
|
|
|
.eq("create_date", date));
|
|
|
@@ -1259,6 +1261,60 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
|
|
|
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public Object calculateOvertime(Integer companyId, String ymonth) {
|
|
|
+ HttpRespMsg msg = new HttpRespMsg();
|
|
|
+ //计算企微考勤加班,只算非一线员工
|
|
|
+ List<Department> allDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
|
|
|
+ List<Department> firstLineDepartments = allDeptList.stream().filter(Department::getFlag).collect(Collectors.toList());
|
|
|
+ List<Department> allFirstLineDepartments = new ArrayList<>(firstLineDepartments);
|
|
|
+ for (Department dept: firstLineDepartments) {
|
|
|
+ //取所有下级部门
|
|
|
+ allFirstLineDepartments.addAll(getSubDepts(dept, allDeptList));
|
|
|
+ }
|
|
|
+ List<Integer> deptIds = allFirstLineDepartments.stream().map(Department::getDepartmentId).collect(Collectors.toList());
|
|
|
+ if (!deptIds.isEmpty()) {
|
|
|
+ List<User> users = userMapper.selectList(new QueryWrapper<User>().in("department_id", deptIds).eq("company_id", companyId));
|
|
|
+ if (!users.isEmpty()) {
|
|
|
+ //获取到所有的考勤
|
|
|
+ DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
|
|
+ LocalDate startDate = LocalDate.parse(ymonth + "-01", dateTimeFormatter);
|
|
|
+ LocalDate endDate = startDate.plusMonths(1).minusDays(1);
|
|
|
+ List<UserCorpwxTime> userCorpwxTimes = userCorpwxTimeMapper.selectList(new QueryWrapper<UserCorpwxTime>().eq("company_id", companyId).in("corpwx_userid", users.stream().map(User::getCorpwxUserid).collect(Collectors.toList()))
|
|
|
+ .between("create_date", startDate, endDate));
|
|
|
+ //遍历,计算加班时长
|
|
|
+ List<UserCorpwxTime> updateList = new ArrayList<>();
|
|
|
+ for (UserCorpwxTime time : userCorpwxTimes) {
|
|
|
+ double overtime = DateTimeUtil.calculateOvertime(time.getStartTime(), time.getEndTime());
|
|
|
+ if (overtime > 0) {
|
|
|
+ UserCorpwxTime copy = new UserCorpwxTime();
|
|
|
+ copy.setId(time.getId());
|
|
|
+ copy.setOtTime(overtime);
|
|
|
+ copy.setOtStatus(1);
|
|
|
+ updateList.add(copy);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!updateList.isEmpty()) {
|
|
|
+ userCorpwxTimeService.updateBatchById(updateList);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ return msg;
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<Department> getSubDepts(Department dp, List<Department> list) {
|
|
|
+ List<Department> collect = list.stream().filter(l -> dp.getDepartmentId().equals(l.getSuperiorId())).collect(Collectors.toList());;
|
|
|
+ List<Department> allList = new ArrayList<>();
|
|
|
+ allList.addAll(collect);
|
|
|
+ if (collect.size() > 0) {
|
|
|
+ collect.forEach(c->{
|
|
|
+ allList.addAll(getSubDepts(c, list));
|
|
|
+ });
|
|
|
+ }
|
|
|
+ return allList;
|
|
|
+ }
|
|
|
+
|
|
|
private void handleAllowance(UserCorpwxTime userCorpwxTime, String baseMorningStart, String baseMorningEnd, String baseAfternoonStart, String baseAfternoonEnd, double restTime, double reportOvertime) {
|
|
|
//注意,为了方便开发,对于表overtime-allowance的type类型增加-1值,表示只有考勤加班但是无补贴。
|
|
|
OvertimeAllowance allowance = new OvertimeAllowance();
|
|
|
@@ -1475,7 +1531,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
|
|
|
String url = GET_CHECKIN_OPTION.replace("ACCESS_TOKEN", getCorpAccessToken(corpInfo));
|
|
|
HttpHeaders headers = new HttpHeaders();
|
|
|
headers.setContentType(MediaType.APPLICATION_JSON);
|
|
|
- System.out.println("" + objects.toString());
|
|
|
+// System.out.println("" + objects.toString());
|
|
|
JSONObject reqParam = new JSONObject();
|
|
|
reqParam.put("datetime", dataTime);
|
|
|
reqParam.put("useridlist", objects);
|
|
|
@@ -1485,7 +1541,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
|
|
|
|
|
|
if (responseEntity.getStatusCode() == HttpStatus.OK) {
|
|
|
String resp = responseEntity.getBody();
|
|
|
- System.out.println("考勤规则:" + resp);
|
|
|
+// System.out.println("考勤规则:" + resp);
|
|
|
return resp;
|
|
|
}
|
|
|
return "";
|
|
|
@@ -1889,7 +1945,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
|
|
|
// DateTimeUtil.calculateWorkHours(ct.getStartTime(), ct.getEndTime());
|
|
|
if (corpInfo.getCompanyId() == Constant.HUA_YAN_COMPANY_ID) {
|
|
|
//指定考勤规则
|
|
|
- timeDelta = DateTimeUtil.calculateHuaYanWorkHours(ct.getStartTime(), ct.getEndTime(), baseMorningStart, baseMorningEnd, baseAfternoonStart, baseAfternoonEnd, WorkDayCalculateUtils.isSundayOrHoliday(ct.getCreateDate()));
|
|
|
+ timeDelta = DateTimeUtil.calculateHuaYanWorkHours(ct.getStartTime(), ct.getEndTime(), WorkDayCalculateUtils.isSundayOrHoliday(ct.getCreateDate()));
|
|
|
} else {
|
|
|
timeDelta = DateTimeUtil.getHoursFromSeconds(DateTimeUtil.getSecondsFromTime(ct.getEndTime()) - DateTimeUtil.getSecondsFromTime(ct.getStartTime()));
|
|
|
//超过下午上班的开始时间,需要减去午休的时间
|