Commit 0c5c9d31 authored by 周亚武's avatar 周亚武

工作时间计算接口

parent 006e4091
...@@ -5,17 +5,23 @@ import com.dingtalk.api.DingTalkClient; ...@@ -5,17 +5,23 @@ import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.*; import com.dingtalk.api.request.*;
import com.dingtalk.api.response.*; import com.dingtalk.api.response.*;
import com.mortals.framework.annotation.UnAuth; import com.mortals.framework.annotation.UnAuth;
import com.mortals.framework.common.Rest;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
import com.mortals.xhx.busiz.dingtalk.config.TalkConfiguration; import com.mortals.xhx.busiz.dingtalk.config.TalkConfiguration;
import com.mortals.xhx.busiz.dingtalk.req.UserPageReq; import com.mortals.xhx.busiz.dingtalk.req.*;
import com.mortals.xhx.busiz.dingtalk.req.CodeReq;
import com.mortals.xhx.busiz.dingtalk.req.LinkMessageReq;
import com.mortals.xhx.busiz.dingtalk.req.MobileReq;
import com.mortals.xhx.common.pdu.ApiRespPdu; import com.mortals.xhx.common.pdu.ApiRespPdu;
import lombok.Data;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.time.DateUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.List; import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
/** /**
* 钉钉相关外部接口 * 钉钉相关外部接口
...@@ -309,4 +315,274 @@ public class TalkApiController { ...@@ -309,4 +315,274 @@ public class TalkApiController {
return apiRespPdu; return apiRespPdu;
} }
/**
* 根据两个日期计算其中的工作时间 返回单位小时
* @return
*/
@PostMapping("/attendance/getTimeCount")
@UnAuth
public Rest<Float> getUserInfoByCode(@RequestBody TimeReq timeReq){
Rest<Float> ret = new Rest();
try {
String startTime = timeReq.getStartTime();
String endTime = timeReq.getEndTime();
Date startMoningStart = getDate(startTime, 1);
Date startMoningEnd = getDate(startTime,2);
Date startAfternoonStart = getDate(startTime,3);
Date startAfternoonEnd = getDate(startTime,4);
Date endMoningStart = getDate(endTime,1);
Date endMoningEnd = getDate(endTime,2);
Date endAfternoonStart = getDate(endTime,3);
Date endAfternoonEnd = getDate(endTime,4);
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date start = format.parse(startTime);
Date end = format.parse(endTime);
int hours = 1000*60*60;
float result = 0;
//若开始时间和结束时间是同一天
SimpleDateFormat simple1 = new SimpleDateFormat("yyyy-MM-dd");
simple1.format(simple1.parse(startTime)).equals(simple1.format(simple1.parse(endTime)));
if(simple1.format(simple1.parse(startTime)).equals(simple1.format(simple1.parse(endTime)))){
//如果结束时间比上班时间早,或者结束时间比开始时间早 或者开始时间晚于下午下班时间,则出差时长为0
if(end.getTime() <= startMoningStart.getTime() || end.getTime()<=start.getTime() || start.getTime()>=startAfternoonEnd.getTime()
|| isHolidays(startTime)){
result = 0;
System.out.println("出差时长为:"+result);
ret.setCode(Rest.FAIL);
ret.setMsg("时间不正确");
return ret;
}
//如果结束时间在上午时间段
if(end.getTime()<=startMoningEnd.getTime()){
//判断开始时间是否早与上午上班时间
if(start.getTime()<startMoningStart.getTime()){
result = (end.getTime()-startMoningStart.getTime()+0f)/hours;
}else{
result = (end.getTime()-start.getTime()+0f)/hours;
}
}
//如果结束时间在中午时间段
if(end.getTime()>startMoningEnd.getTime() && end.getTime()<=startAfternoonStart.getTime()){
//如果开始时间在上午上班之前
if(start.getTime()<=startMoningStart.getTime()){
result = 4;
}else if(start.getTime()>startMoningStart.getTime() && start.getTime()<startMoningEnd.getTime()){
//开始时间在上午上班时间段
result = (startMoningEnd.getTime()-start.getTime()+0f)/hours;
} else if (start.getTime()>=startMoningStart.getTime()) {
//开始时间也在中午
result = 0;
}
}
//如果结束时间在下午上班时间段
if(end.getTime()>startAfternoonStart.getTime() && end.getTime()<=startAfternoonEnd.getTime()){
if(start.getTime()<=startMoningStart.getTime()){
//如果开始时间在上午上班之前
result = 4 + (end.getTime()-startAfternoonStart.getTime()+0f)/hours;
} else if (start.getTime()>startMoningStart.getTime() && start.getTime()<startMoningEnd.getTime()) {
//如果开始时间在上午上班时间
result = (startMoningEnd.getTime()-start.getTime() + end.getTime()-startAfternoonStart.getTime()+0f)/hours;
} else if (start.getTime()>=startMoningEnd.getTime() && start.getTime()<=startAfternoonStart.getTime()) {
//开始时间在中午时间段
result = (end.getTime() - startAfternoonStart.getTime()+0f)/hours;
}else if(start.getTime()>startAfternoonStart.getTime()){
//开始时间也在下午上班时间段
result = (end.getTime()-start.getTime()+0f)/hours;
}
}
//如果结束时间在下午下班之后
if(end.getTime() > startAfternoonEnd.getTime()){
if(start.getTime() <= startMoningStart.getTime()){
//如果开始时间在上午上班之前
result = 8;
}else if(start.getTime()>startMoningStart.getTime() && start.getTime()<startMoningEnd.getTime()){
//开始时间在上午上班时间段
result = 4 + (startMoningEnd.getTime() - start.getTime()+0f)/hours;
} else if (start.getTime()>=startMoningEnd.getTime() && start.getTime()<=startAfternoonStart.getTime()) {
//如果开始时间在中午时间段
result = 4;
} else if (start.getTime()>startAfternoonStart.getTime() && start.getTime()<startAfternoonEnd.getTime()) {
//开始时间在下午上班时间段
result = (startAfternoonEnd.getTime()-start.getTime()+0f)/hours;
}
}
}else {
if( end.getTime()<=start.getTime() ){
result = 0f;
System.out.println("出差时长为:"+result);
ret.setCode(Rest.FAIL);
ret.setMsg("开始时间晚于结束时间!");
return ret;
}
//开始时间和结束时间不在同一天
float startDayHours = getStartDayHours(start,startMoningStart,startMoningEnd,startAfternoonStart,startAfternoonEnd);
float endDayHours = 8 - getStartDayHours(end,endMoningStart,endMoningEnd,endAfternoonStart,endAfternoonEnd);
//计算开始时间和结束时间之间隔了几天
int days = getDays(startTime,endTime);
float daysHours = (days-1)*8;
result = daysHours + startDayHours + endDayHours;
result = deleteHolidays(startTime,endTime,startDayHours,endDayHours,result);
}
BigDecimal bigResult = new BigDecimal(result);
float finalResult = bigResult.setScale(1, BigDecimal.ROUND_HALF_UP).floatValue();
System.out.println("出差时长为:"+finalResult);
ret.setCode(Rest.SUCCESS);
ret.setData(finalResult);
ret.setMsg("成功!");
return ret;
}catch (Exception e){
ret.setCode(Rest.FAIL);
ret.setMsg("日期格式不正确");
return ret;
}
}
//排除出差时长中的节假日时间 这里不考虑休息半天的情况
// 开始时间startTime 结束时间endTime 开始时间当前的时长startDayHours 结束时间当天的时长endDayHours 排除节假日之前的时长
//只有startTime 和endTime不在同一天才调用
private static float deleteHolidays(String startTime,String endTime,float startDayHours,float endDayHours, float hours) throws ParseException {
float result = hours+0f;
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
//1判断startTime是否是节假日,周末
if(isHolidays(startTime)){
result = result - startDayHours;
}
//轮循开始时间到结束时间 当前时间
String nowDate = startTime;
do{
nowDate = format.format(DateUtils.addDays(format.parse(nowDate), 1));
if(format.format(format.parse(nowDate)).equals(format.format(format.parse(endTime)))){
break;
}
if(isHolidays(nowDate)){
result = result - 8;
}
}while(true);//
if(isHolidays(endTime)){
result = result -endDayHours;
}
return result;
}
//判断一个日期是否是节假日 或者周末
private static boolean isHolidays(String time) throws ParseException {
String queryCalenderSql = "";
//IRowSet query = DbUtil.executeQuery(ctx, queryCalenderSql);
// if(query.next()){
// return true;
// }
//判断是否是周末
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Calendar cal = Calendar.getInstance();
cal.setTime(format.parse(time));
if(cal.get(Calendar.DAY_OF_WEEK)==1 || cal.get(Calendar.DAY_OF_WEEK)==7){
return true;
}
return false;
}
private static int getDays(String startTime,String endTime) throws ParseException {
//计算开始和结束时间之间相差的天数
int result = 0;
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Date start = format.parse(startTime);
Date end = format.parse(endTime);
Calendar calStart = Calendar.getInstance();
calStart.setTime(start);
Calendar calEnd = Calendar.getInstance();
calEnd.setTime(end);
int startDay = calStart.get(Calendar.DAY_OF_YEAR);
int endDay = calEnd.get(Calendar.DAY_OF_YEAR);
int yearStart = calStart.get(Calendar.YEAR);
int yearEnd = calEnd.get(Calendar.YEAR);
if(yearEnd != yearStart) //不同年
{
int timeDistance = 0 ;
for(int i = yearStart ; i < yearEnd ; i ++)
{
if(i%4==0 && i%100!=0 || i%400==0) //闰年
{
timeDistance += 366;
}
else //不是闰年
{
timeDistance += 365;
}
}
System.out.println(timeDistance + (endDay-startDay));
result = timeDistance + (endDay-startDay);
}
else //同一年
{
result = endDay-startDay;
System.out.println("判断day2 - day1 : " + (endDay-startDay));
//return day2-day1;
}
return result;
}
//计算开始时间那天的出差时长
private static float getStartDayHours(Date start,Date moningStart,Date moningEnd,Date afternoonStart,Date afternoonEnd){
float result = 0f;
//开始时间早与上午上班时间
if(start.getTime()<=moningStart.getTime()){
result = 8;
}else if(start.getTime()>moningStart.getTime() && start.getTime() <moningEnd.getTime()){
//开始时间在上午时间段
result = 4 + (moningEnd.getTime()-start.getTime()+0f)/(1000*60*60);
} else if (start.getTime()>=moningEnd.getTime() && start.getTime()<=afternoonStart.getTime()) {
//开始时间在中午时间段
result = 4;
}else if(start.getTime()>afternoonStart.getTime() && start.getTime()<afternoonEnd.getTime()){
result = (afternoonEnd.getTime() - start.getTime()+0f)/(1000*60*60);
}else if(start.getTime()>=afternoonEnd.getTime()){
result = 0;
}
return result;
}
//获取给定日期工作时间
private static Date getDate(String date, int type) throws ParseException {
Calendar calendar = Calendar.getInstance();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
calendar.setTime(format.parse(date));
StringBuilder result = new StringBuilder();
if(calendar.get(Calendar.MONTH)<9){
result.append(calendar.get(Calendar.YEAR)).append("-0");
}else{
result.append(calendar.get(Calendar.YEAR)).append("-");
}
result.append(calendar.get(Calendar.MONTH)+1).append("-");
result.append(calendar.get(Calendar.DATE)).append(" ");
//1上午开始时间09:00 ;2上午结束时间12:00 3下午开始时间13:00 4下午结束时间18:00
switch (type){
case 1:result.append("09:00");
break;
case 2:result.append("12:00");
break;
case 3:result.append("13:00");
break;
case 4:result.append("18:00");
break;
}
return format.parse(String.valueOf(result));
}
} }
package com.mortals.xhx.busiz.dingtalk.req;
/**
* @author ZYW
* @date 2023-07-13 20:11
*/
public class TimeReq {
String startTime;
String endTime;
public String getStartTime() {
return startTime;
}
public void setStartTime(String startTime) {
this.startTime = startTime;
}
public String getEndTime() {
return endTime;
}
public void setEndTime(String endTime) {
this.endTime = endTime;
}
}
...@@ -170,7 +170,7 @@ public class DingMessageController { ...@@ -170,7 +170,7 @@ public class DingMessageController {
switch (jsonArray.get(3).toString()){ switch (jsonArray.get(3).toString()){
case "halfDay": case "halfDay":
case "day": case "day":
leaveRecordEntity.setDuration((int) (Float.parseFloat(jsonArray.get(2).toString())*60*60*9)); //天转换成秒 一天工作时间9小时 leaveRecordEntity.setDuration((int) (Float.parseFloat(jsonArray.get(2).toString())*60*60*8)); //天转换成秒 一天工作时间9小时
leaveRecordEntity.setSourceDingTime(jsonArray.get(2).toString()+"天"); leaveRecordEntity.setSourceDingTime(jsonArray.get(2).toString()+"天");
break; break;
default: //除了按天和半天计算的假期 其余都是按小时返回 default: //除了按天和半天计算的假期 其余都是按小时返回
...@@ -638,7 +638,7 @@ public class DingMessageController { ...@@ -638,7 +638,7 @@ public class DingMessageController {
* @return * @return
*/ */
private float converMillsToDays(long milliseconds){ private float converMillsToDays(long milliseconds){
float days = ((float) milliseconds) / (60*60*9); float days = ((float) milliseconds) / (60*60*8);
return days; return days;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment