Commit 8303f38f authored by 赵啸非's avatar 赵啸非

Merge remote-tracking branch 'origin/master'

parents 44ce0025 36b438c9
......@@ -280,7 +280,15 @@ export default {
changedate(val) {
if (this.form.startTime && this.form.endTime) {
if (this.form.endTime.valueOf() > this.form.startTime.valueOf()) {
this.form.duration = getSec(this.form.startTime, this.form.endTime);
// this.form.duration = getSec(this.form.startTime, this.form.endTime);
this.$post("/attendance/getTimeCount", {
startTime: this.form.startTime,
endTime: this.form.endTime,
}).then((res) => {
if (res.code == 1) {
this.form.duration = res.data * 3600;
}
});
} else {
this.$message.closeAll();
this.$message.error("结束日期需大于请假日期");
......
......@@ -147,7 +147,7 @@ export default {
return (
(row.sourceDingTime ? row.sourceDingTime : "--") +
(row.duration
? "" + (row.duration / 60 / 60 / 9).toFixed(2) + "" + ""
? "" + (row.duration / 60 / 60 / 8).toFixed(2) + "" + ""
: "(--)")
);
},
......
......@@ -18,9 +18,7 @@
</div>
<div>
出勤率
<span class="num">{{
attendStatInfo.attPercentage
}}</span>
<span class="num">{{ attendStatInfo.attPercentage }}</span>
</div>
</div>
......@@ -34,7 +32,7 @@
</div>
<div>
缺卡
<span class="num">{{attendStatInfo.lackOfCards }}</span>
<span class="num">{{ attendStatInfo.lackOfCards }}</span>
</div>
</div>
</div>
......@@ -129,13 +127,14 @@
<el-checkbox
v-for="(item, index) in setcolum"
:key="index"
:label="item.label"
:label="item.prop"
>
{{ item.label }}
</el-checkbox>
</el-checkbox-group>
<div class="mt20" style="text-align:right">
<el-button>取消</el-button>
<el-button type="primary">确定</el-button>
<el-button @click="handleCancel">取消</el-button>
<el-button type="primary" @click="handleSubmit">确定</el-button>
</div>
</el-dialog>
<!-- 上传 -->
......@@ -207,17 +206,25 @@ export default {
},
},
created() {
this.$post("/attendance/record/stat", {}).then((res) => {
if (res.code === 1) {
this.attendStatInfo = res.data;
}
});
this.initalArr = this.config.columns;
},
methods: {
// 表格设置弹窗取消操作
handleCancel() {
this.checkList = [];
this.isdialog = false;
},
// 表格设置提交操作
handleSubmit() {
this.doExport();
this.isdialog = false;
},
// 表格接收数据后
afterRender(data) {
let addobjArr = [];
......@@ -335,7 +342,9 @@ export default {
if (this.selection.length > 0) {
params["idList"] = this.selection;
}
if (this.checkList.length > 0) {
params["properties"] = this.checkList;
}
this.$download(
"/attendance/record/exportExcel",
{
......@@ -343,7 +352,10 @@ export default {
},
{ type: "excel" }
)
.then(() => (this.isExport = false))
.then(() => {
this.isExport = false;
this.checkList = [];
})
.catch((error) => {
this.isExport = false;
this.$message.error(error.message);
......@@ -354,6 +366,7 @@ export default {
this.setcolum = this.config.columns.filter(
(item) => item.label && item.prop
);
console.log(this.setcolum);
},
renderTable(tableData) {
return (
......@@ -498,10 +511,10 @@ export default {
{ label: "员工工号", prop: "workNum" },
{
label: "考勤组",
prop: "attendanceGroupName"
prop: "attendanceGroupName",
},
{ label: "部门", prop: "deptName" },
{ label: "职位", prop: "positionName"},
{ label: "职位", prop: "positionName" },
{ label: "班次", prop: "classId", formatter: this.formatter },
{
label: "签到结果",
......@@ -521,9 +534,6 @@ export default {
width: 120,
prop: "subColumns",
formatter: (row) => {
let widthsize = this.columnSet.reduce((pre, cur) => {
return pre + Number(cur.width);
}, 50);
......@@ -556,7 +566,7 @@ export default {
exportList: [], //导出记录
baseUrl: process.env.VUE_APP_API_BASE_URL + "/",
initalArr: [],
attendStatInfo:{}
attendStatInfo: {},
};
},
};
......
......@@ -5,17 +5,23 @@ import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.*;
import com.dingtalk.api.response.*;
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.req.UserPageReq;
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.busiz.dingtalk.req.*;
import com.mortals.xhx.common.pdu.ApiRespPdu;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.time.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;
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 {
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 {
switch (jsonArray.get(3).toString()){
case "halfDay":
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()+"天");
break;
default: //除了按天和半天计算的假期 其余都是按小时返回
......@@ -638,7 +638,7 @@ public class DingMessageController {
* @return
*/
private float converMillsToDays(long milliseconds){
float days = ((float) milliseconds) / (60*60*9);
float days = ((float) milliseconds) / (60*60*8);
return days;
}
......
......@@ -202,7 +202,7 @@ public class AttendanceStatServiceImpl extends AbstractCRUDServiceImpl<Attendanc
//汇总当前日期请假情况
List<LeaveSummaryVo> leaveSummaryVoList = attendanceSummaryDao.getLeaveSummary(query);
if (CollectionUtils.isNotEmpty(leaveSummaryVoList)) {
BigDecimal day = new BigDecimal(3600 * 9); //一天按9小时折算
BigDecimal day = new BigDecimal(3600 * 8); //一天按8小时折算
BigDecimal oneDay = new BigDecimal(1);
for (LeaveSummaryVo item : leaveSummaryVoList) {
String attendanceSummary = "";
......
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