diff --git a/src/main/java/cn/timer/api/bean/kqmk/AttendanceSocks.java b/src/main/java/cn/timer/api/bean/kqmk/AttendanceSocks.java
new file mode 100644
index 0000000..0d2f97e
--- /dev/null
+++ b/src/main/java/cn/timer/api/bean/kqmk/AttendanceSocks.java
@@ -0,0 +1,46 @@
+package cn.timer.api.bean.kqmk;
+
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author lal 2020-05-19
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Table(name = "attendance_socks")
+@ApiModel("考勤定时")
+public class AttendanceSocks extends Model<AttendanceSocks> {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	@GeneratedValue
+	@TableId(type = IdType.AUTO)
+	@ApiModelProperty(value = "id id", example = "101")
+	private Integer cronId;
+
+	@ApiModelProperty(value = "cron_name ", example = "cron_name")
+	private String cronName;
+
+	@ApiModelProperty(value = "cron ", example = "cron")
+	private String cron;
+
+}
\ No newline at end of file
diff --git a/src/main/java/cn/timer/api/bean/kqmk/KqglAssoDkmx.java b/src/main/java/cn/timer/api/bean/kqmk/KqglAssoDkmx.java
index ac8dcea..9f882ec 100644
--- a/src/main/java/cn/timer/api/bean/kqmk/KqglAssoDkmx.java
+++ b/src/main/java/cn/timer/api/bean/kqmk/KqglAssoDkmx.java
@@ -91,4 +91,13 @@ public class KqglAssoDkmx extends Model<KqglAssoDkmx> {
 	@ApiModelProperty(value = "打卡时间 打卡时间", example = "101")
 	private Long dksj;
 
+	@ApiModelProperty(value = "严重迟到次数 严重迟到次数", example = "101")
+	private Integer yzcdcs;
+
+	@ApiModelProperty(value = "严重迟到时长(分钟) ", example = "严重迟到时长(分钟)")
+	private Double yzcdsc;
+
+	@ApiModelProperty(value = "旷工迟到次数 旷工迟到次数", example = "101")
+	private Integer kgcdfzs;
+
 }
\ No newline at end of file
diff --git a/src/main/java/cn/timer/api/bean/kqmk/KqglAssoMonthPunchSummary.java b/src/main/java/cn/timer/api/bean/kqmk/KqglAssoMonthPunchSummary.java
index 113eff4..2ed1556 100644
--- a/src/main/java/cn/timer/api/bean/kqmk/KqglAssoMonthPunchSummary.java
+++ b/src/main/java/cn/timer/api/bean/kqmk/KqglAssoMonthPunchSummary.java
@@ -227,6 +227,6 @@ public class KqglAssoMonthPunchSummary extends Model<KqglAssoMonthPunchSummary> 
 	private Integer orgCode;
 
 	@ApiModelProperty(value = "最后修改时间 最后修改时间", example = "101")
-	private Integer lastModified;
+	private Long lastModified;
 
 }
\ No newline at end of file
diff --git a/src/main/java/cn/timer/api/bean/kqmk/KqglAssoRelationSummary.java b/src/main/java/cn/timer/api/bean/kqmk/KqglAssoRelationSummary.java
new file mode 100644
index 0000000..dce334f
--- /dev/null
+++ b/src/main/java/cn/timer/api/bean/kqmk/KqglAssoRelationSummary.java
@@ -0,0 +1,63 @@
+package cn.timer.api.bean.kqmk;
+
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author lal 2020-05-19
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Table(name = "kqgl_asso_relation_summary")
+@ApiModel("打卡月汇总关联表")
+public class KqglAssoRelationSummary extends Model<KqglAssoRelationSummary> {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	@GeneratedValue
+	@TableId(type = IdType.AUTO)
+	@ApiModelProperty(value = "id id", example = "101")
+	private Integer id;
+
+	@ApiModelProperty(value = "用户id 用户id", example = "101")
+	private Integer userId;
+
+	@ApiModelProperty(value = "时间 ", example = "年月日")
+	private String appTime;
+
+	@ApiModelProperty(value = "审批id 审批id", example = "101")
+	private Integer approvalId;
+
+	@ApiModelProperty(value = "审批类型 1:加班 2:请假 3:出差 4:外出 5:补卡", example = "101")
+	private Integer approvalType;
+
+	@ApiModelProperty(value = "时长 时长", example = "101")
+	private double duration;
+	
+	@ApiModelProperty(value="假期类型id",example="101")
+    private Integer leaveTypeId;
+    
+	@ApiModelProperty(value="加班类型id",example="101")
+    private Integer overtimeTypeId;
+    
+	@ApiModelProperty(value="加班补偿方式 1:转调休;2:转加班费;3:转调休或加班费",example="101")
+    private Integer compensateId;
+}
\ No newline at end of file
diff --git a/src/main/java/cn/timer/api/bean/kqmk/KqglTaskTiming.java b/src/main/java/cn/timer/api/bean/kqmk/KqglTaskTiming.java
new file mode 100644
index 0000000..8891ecb
--- /dev/null
+++ b/src/main/java/cn/timer/api/bean/kqmk/KqglTaskTiming.java
@@ -0,0 +1,51 @@
+package cn.timer.api.bean.kqmk;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author Tang 2020-05-19
+ */
+@Entity
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Table(name = "kqgl_task_timing")
+@ApiModel("考勤任务定时")
+public class KqglTaskTiming extends Model<KqglTaskTiming> {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	@GeneratedValue
+	@TableId(type = IdType.AUTO)
+	@ApiModelProperty(value = "id id", example = "101")
+	private Integer id;
+
+	@ApiModelProperty(value = "任务 ", example = "任务")
+	private String task;
+
+	@ApiModelProperty(value = "任务执行状态 0:未执行;1:执行中", example = "101")
+	private Integer executionStatus;
+
+	@ApiModelProperty(value = "最后一次执行时间 最后一次执行时间", example = "101")
+	private Long lastExecutionTime;
+
+}
\ No newline at end of file
diff --git a/src/main/java/cn/timer/api/controller/kqgl/ClockInController.java b/src/main/java/cn/timer/api/controller/kqgl/ClockInController.java
index c605d14..f652e8c 100644
--- a/src/main/java/cn/timer/api/controller/kqgl/ClockInController.java
+++ b/src/main/java/cn/timer/api/controller/kqgl/ClockInController.java
@@ -4,8 +4,6 @@ import java.math.BigDecimal;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
 
@@ -20,29 +18,18 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 
 import cn.hutool.json.JSONObject;
-import cn.timer.api.bean.kqgl.AttendanceWeeklySch;
-import cn.timer.api.bean.kqgl.PunchCardDetails;
-import cn.timer.api.bean.kqgl.Schedule;
 import cn.timer.api.bean.kqmk.KqglAssoBcsz;
 import cn.timer.api.bean.kqmk.KqglAssoDkjl;
 import cn.timer.api.bean.kqmk.KqglAssoDkmx;
 import cn.timer.api.bean.kqmk.KqglAssoKqj;
 import cn.timer.api.bean.kqmk.KqglAssoKqzdkfs;
-import cn.timer.api.bean.kqmk.KqglAssoMonthPunchSummary;
 import cn.timer.api.bean.kqmk.KqglAssoTeshu;
 import cn.timer.api.bean.kqmk.KqglAssoZhoupaiban;
 import cn.timer.api.bean.kqmk.KqglMainKqz;
 import cn.timer.api.bean.yggl.YgglMainEmp;
 import cn.timer.api.config.exception.CustomException;
-import cn.timer.api.dao.kqgl.AttendanceWeeklySchMapper;
-import cn.timer.api.dao.kqgl.PunchCardDetailsMapper;
-import cn.timer.api.dao.kqgl.PunchRecordMapper;
-import cn.timer.api.dao.kqgl.ScheduleMapper;
-import cn.timer.api.dao.kqmk.KqglAssoLeaveBalanceMapper;
 import cn.timer.api.dao.kqmk.KqglAssoPbmxMapper;
-import cn.timer.api.dao.kqmk.KqglAssoTeshuMapper;
 import cn.timer.api.dao.kqmk.KqglMainKqzMapper;
-import cn.timer.api.dto.kqmk.AdditionalDto;
 import cn.timer.api.dto.kqmk.AttLateLate;
 import cn.timer.api.dto.kqmk.AttSchedule;
 import cn.timer.api.dto.kqmk.AttendanceCardListDto;
@@ -61,17 +48,7 @@ import io.swagger.annotations.ApiOperation;
 public class ClockInController {
 	@Autowired
 	private KqglMainKqzMapper kqglmainkqzmapper;
-	@Autowired
-	private KqglAssoLeaveBalanceMapper kqglassoleavebalancemapper;
-	@Autowired
-	private KqglAssoTeshuMapper kqglassoteshumapper;
 	
-	@Autowired
-	private PunchCardDetailsMapper punchcarddetailsmapper;
-	@Autowired
-	private AttendanceWeeklySchMapper attendanceweeklyschservice;
-	@Autowired
-	private ScheduleMapper scheduleservice;
 	
 	SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
 	SimpleDateFormat sdf2 = new SimpleDateFormat("EEE");
@@ -91,6 +68,7 @@ public class ClockInController {
 		String asUserId = jsonArray.get("user_id").toString();//打卡用户id
 		String asVerifyMode = jsonArray.get("verify_mode").toString();//考勤机打卡方式(1:指纹;20:人脸;40:掌纹;60:密码(猜的^v^))
 		String sStdIoTime = jsonArray.get("io_time").toString();//打卡时间
+		
 		KqglAssoKqj kqjdev = KqglAssoKqj.builder().build().selectOne(new QueryWrapper<KqglAssoKqj>().lambda().eq(KqglAssoKqj::getCode, asDevId));
 		if (kqjdev == null) 
 			return ResultUtil.error("考勤机不存在!");
@@ -182,15 +160,22 @@ public class ClockInController {
 						 }
 					 }
 					if(isRange) {
+						int yzcd = shif.getYzcdfzs();//严重迟到分钟数
+						int kgcdfzs  = shif.getKgcdfzs();//旷工迟到分钟数 
 						 if(dkmc == null) {//上班1   ****新增
-							 int sbdk1jg = 0;
+							 int sbdk1jg = 0,yzcdsc = 0,yzcdcs = 0,kgcdcs = 0;
 							 if(punchcardtime != 0){//有应打卡时间时
 								 Long time = (time_ - punchcardtime)/1000/60;
 								 if(time > 0){sbdk1jg = Math.abs(Integer.valueOf(time.toString()));}//上班1打卡结果
 							 }
 							 int ydkcs = 0;
 							 if(shif != null){ydkcs = shif.getSxbcs()*2;}//应打卡次数
-							 KqglAssoDkmx pcd = KqglAssoDkmx.builder().userid(userid).data(putime).sbdk1(time_).sbdk1jg(sbdk1jg).ydkcs(ydkcs).qyid(qyid).dksj(startDate).build();
+							 if(sbdk1jg > yzcd) {
+								 yzcdcs++;
+								 yzcdsc = sbdk1jg - yzcd;
+							 }
+							 if(sbdk1jg > kgcdfzs) {kgcdcs++;}
+							 KqglAssoDkmx pcd = KqglAssoDkmx.builder().userid(userid).data(putime).sbdk1(time_).sbdk1jg(sbdk1jg).ydkcs(ydkcs).qyid(qyid).dksj(startDate).yzcdcs(yzcdcs).yzcdsc(Double.valueOf(yzcdsc)).kgcdfzs(kgcdcs).build();
 							 if (!pcd.insert()) {
 								throw new CustomException("打卡明细-新增异常-1");
 							 }
@@ -208,15 +193,21 @@ public class ClockInController {
 									Long time = (time_ - dkmc.getSbdk1())/1000/60;
 									gzsc = Math.abs(Double.valueOf(time.toString()));//只打一次卡时计算工作时长
 								 }
+								 
 								 KqglAssoDkmx.builder().id(dkmc.getId()).xbdk1(time_).xbdk1jg(xbdk1jg).gzsc(gzsc).build().updateById();
 						     }else if((!("").equals(dkmc.getSbdk1()) || dkmc.getSbdk1() != null) && (!("").equals(dkmc.getXbdk1()) || dkmc.getXbdk1() != null)
 						    		 && (("").equals(dkmc.getSbdk2()) || dkmc.getSbdk2() == null)){//上班2
-						    	 int sbdk2jg = 0;
+						    	 int sbdk2jg = 0,yzcdsc = 0,yzcdcs = 0,kgcdcs = 0;
 								 if(punchcardtime != 0){//有应打卡时间时
 									 Long time = (time_ - punchcardtime)/1000/60;
 									 if(time > 0){sbdk2jg = Math.abs(Integer.valueOf(time.toString()));}
 								 }
-								 KqglAssoDkmx.builder().id(dkmc.getId()).sbdk2(time_).sbdk2jg(sbdk2jg).build().updateById();
+								 if(sbdk2jg > yzcd) {
+									 yzcdcs = dkmc.getYzcdcs()+1;
+									 yzcdsc = sbdk2jg - yzcd;
+								 }
+								 if(sbdk2jg > kgcdfzs) {kgcdcs++;}
+								 KqglAssoDkmx.builder().id(dkmc.getId()).sbdk2(time_).sbdk2jg(sbdk2jg).yzcdcs(yzcdcs).yzcdsc(Double.valueOf(yzcdsc)).kgcdfzs(kgcdcs).build().updateById();
 						     }else if((!("").equals(dkmc.getSbdk1()) || dkmc.getSbdk1() != null) && (!("").equals(dkmc.getXbdk1()) || dkmc.getXbdk1() != null)
 						    		 && (!("").equals(dkmc.getSbdk2()) || dkmc.getSbdk2() != null) && (("").equals(dkmc.getXbdk2()) || dkmc.getXbdk2() == null)){//下班2
 						    	 int xbdk2jg = 0;
@@ -236,12 +227,17 @@ public class ClockInController {
 						     }else if((!("").equals(dkmc.getSbdk1()) || dkmc.getSbdk1() != null) && (!("").equals(dkmc.getXbdk1()) || dkmc.getXbdk1() != null)
 						    		 && (!("").equals(dkmc.getSbdk2()) || dkmc.getSbdk2() != null) && (!("").equals(dkmc.getXbdk2()) || dkmc.getXbdk2() != null)
 						    		 && (("").equals(dkmc.getSbdk3()) || dkmc.getSbdk3() == null)){//上班3
-						    	 int sbdk3jg = 0;
+						    	 int sbdk3jg = 0,yzcdsc = 0,yzcdcs = 0,kgcdcs = 0;
 								 if(punchcardtime != 0){//有应打卡时间时
 									 Long time = (time_ - punchcardtime)/1000/60;
 									 if(time > 0){sbdk3jg = Math.abs(Integer.valueOf(time.toString()));}
 								 }
-								 KqglAssoDkmx.builder().id(dkmc.getId()).sbdk3(time_).sbdk3jg(sbdk3jg).build().updateById();
+								 if(sbdk3jg > yzcd) {
+									 yzcdcs = dkmc.getYzcdcs()+1;
+									 yzcdsc = sbdk3jg - yzcd;
+								 }
+								 if(sbdk3jg > kgcdfzs) {kgcdcs++;}
+								 KqglAssoDkmx.builder().id(dkmc.getId()).sbdk3(time_).sbdk3jg(sbdk3jg).yzcdcs(yzcdcs).yzcdsc(Double.valueOf(yzcdsc)).kgcdfzs(kgcdcs).build().updateById();
 						     }else if((!("").equals(dkmc.getSbdk1()) || dkmc.getSbdk1() != null) && (!("").equals(dkmc.getXbdk1()) || dkmc.getXbdk1() != null)
 						    		 && (!("").equals(dkmc.getSbdk2()) || dkmc.getSbdk2() != null) && (!("").equals(dkmc.getXbdk2()) || dkmc.getXbdk2() != null)
 						    		 && (!("").equals(dkmc.getSbdk3()) || dkmc.getSbdk3() != null) && (("").equals(dkmc.getXbdk3()) || dkmc.getXbdk3() == null)){//下班3
@@ -265,112 +261,6 @@ public class ClockInController {
 							 }
 						 }
 						 
-						 //具体打卡时间入汇总表(打卡成功才会录入汇总表)
-						 KqglAssoMonthPunchSummary isyessum = KqglAssoMonthPunchSummary.builder().build().selectOne(new QueryWrapper<KqglAssoMonthPunchSummary>().lambda()
-								 .eq(KqglAssoMonthPunchSummary::getNum, asUserId).eq(KqglAssoMonthPunchSummary::getOrgCode, user.getOrgCode()));
-						 
-						 AdditionalDto kqry = kqglassoleavebalancemapper.selectAdditional(user.getOrgCode(), user.getEmpNum());						 
-						 /*******************************************************/
-							int year = Calendar.getInstance().get(Calendar.YEAR);
-							int month = Calendar.getInstance().get(Calendar.MONTH) + 1;
-							if(attgro != null){//该员工是否加入到考勤组  排班方式 1:固定排班;2:自由排班;3:自由工时         计算出应出勤,实际出勤,休息天数
-								//休息天数,应出勤天数,实际出勤
-								double daysOff = 0,daysOnDuty = 0,actualAttDays = 0;
-								if(attgro.getPbfs() == 1){
-									List<KqglAssoTeshu> bxdklist = kqglassoteshumapper.ShouldSpecialDatessetByKqzid(attgro.getId(), month,1);//当前月     必须打卡日期
-									int bxdk = bxdklist.size();
-									List<KqglAssoTeshu> wxdk = kqglassoteshumapper.ShouldSpecialDatessetByKqzid(attgro.getId(), month,2);//当前月     无需打卡日期
-									String[] appmaps= new String[wxdk.size()];
-									int d1 = 0;
-									for(KqglAssoTeshu spe:wxdk){
-										appmaps[d1] = spe.getTsrq();
-										d1++;
-									}
-									List<AttendanceWeeklySch> atwek = attendanceweeklyschservice.selectAttendanceMadeByUserid(Integer.valueOf(user.getEmpNum()));
-									String[] week= new String[atwek.size()];
-									int e = 0;
-									for(AttendanceWeeklySch awek : atwek){
-										week[e] = awek.getWekmc();
-										e++;
-									}
-									String yemo = year + "-" + month;
-									sdf1.setLenient(false);
-									int y = 0,q = 0;
-									 for(int i = 1; i <= ClockInTool.getDaysByYearMonth(year,month); i++){
-											Date date1 = sdf1.parse(yemo + "-" + i);
-											for(int u=0;u<week.length;u++){
-												if(sdf2.format(date1).equals(week[u])){
-													q++;
-													y++;
-													if(Arrays.asList(appmaps).contains(String.valueOf(sdf1.format(date1)))){
-														y = y-1;
-													}
-												}
-											}
-									 }
-									 int xiuxi = ClockInTool.getDaysByYearMonth(year,month) - q - bxdk + wxdk.size();
-									 daysOff = xiuxi;
-									 daysOnDuty = y+bxdk;
-								}else if(attgro.getPbfs() == 2){
-									List<Schedule> ycqs = scheduleservice.getAttendanceShouldList(Integer.valueOf(user.getEmpNum()),startDate,endDate);
-									int xiuxi = 0;
-									int shangban = 0;
-									for(Schedule sc : ycqs){
-										if(sc.getBcid().equals(0)){
-											xiuxi++;
-										}else{
-											shangban++;
-										}
-									}
-									daysOff = xiuxi;
-									daysOnDuty = shangban;
-								}else{
-									List<AttendanceWeeklySch> atwek = attendanceweeklyschservice.selectAttendanceMadeByUserid(Integer.valueOf(user.getEmpNum()));
-									String[] week= new String[atwek.size()];
-									int e = 0;
-									for(AttendanceWeeklySch awek : atwek){
-										week[e] = awek.getWekmc();
-										e++;
-									}
-									String yemo = year + "-" + month;
-									sdf1.setLenient(false);
-									int y = 0;
-									 for(int i = 1; i <= ClockInTool.getDaysByYearMonth(year,month); i++){
-										 try {
-											Date date1 = sdf1.parse(yemo + "-" + i);
-											for(int u=0;u<week.length;u++){
-												if(sdf2.format(date1).equals(week[u])){
-													y++;
-												}
-											}
-										} catch (ParseException c) {
-											c.printStackTrace();
-										}
-									 }
-									 
-									 int xiuxi = ClockInTool.getDaysByYearMonth(year,month) - y;
-									 daysOff = xiuxi;
-								     daysOnDuty = y;
-								}
-							    List<PunchCardDetails> attendance = punchcarddetailsmapper.selectAttendanceDays(Integer.valueOf(user.getEmpNum()), startDate, endDate);//打卡记录
-							    actualAttDays = attendance.size();
-							}else {
-								System.out.println("该员工未加入考勤组");
-							}
-						 
-						 /****************************************************/
-						 
-						int answer = shif.getSxbcs();//1=2次  2=4次  3=6次
-						
-							
-						 if(isyessum == null) {//无汇总记录
-							 KqglAssoMonthPunchSummary summary = KqglAssoMonthPunchSummary.builder().name(user.getName()).num(user.getEmpNum()).dept(kqry.getDepartment())
-									 .post(kqry.getPosition()).attGroup(attgro.getId()).shift(shif.getId()).build();
-							 
-						 }else {
-							 int id = isyessum.getId();
-						 }
-						 
 					 }else {
 						 System.out.println("当前打卡时间不在范围内");
 					 }
diff --git a/src/main/java/cn/timer/api/controller/kqgl/ClockInTool.java b/src/main/java/cn/timer/api/controller/kqgl/ClockInTool.java
index 17987ae..9d3a17b 100644
--- a/src/main/java/cn/timer/api/controller/kqgl/ClockInTool.java
+++ b/src/main/java/cn/timer/api/controller/kqgl/ClockInTool.java
@@ -14,40 +14,92 @@ import java.util.Locale;
 import java.util.Set;
 
 /**
- * @author Yl123 2020-05-11
+ * @author lal 2020-05-11
  *
  */
 public class ClockInTool {
-	
+
 	static SimpleDateFormat famt = new SimpleDateFormat("yyyy-MM-dd");
-	
-	/** 
-     * 使用java正则表达式去掉多余的.与0 
-     * @param s 
-     * @return  string
-     */  
-    public static String replace(String s){  
-        if(null != s && s.indexOf(".") > 0){  
-            s = s.replaceAll("0+?$", "");//去掉多余的0  
-            s = s.replaceAll("[.]$", "");//如最后一位是.则去掉  
-        }  
-        return s;  
-    }  
-	
+
+	/**
+	 * 获取两个日期之间的所有日期
+	 */
+	public static List<String> getDays(String startTime, String endTime) {
+		// 返回的日期集合
+		List<String> days = new ArrayList<String>();
+		DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+		try {
+			Date start = dateFormat.parse(startTime);
+			Date end = dateFormat.parse(endTime);
+
+			Calendar tempStart = Calendar.getInstance();
+			tempStart.setTime(start);
+
+			Calendar tempEnd = Calendar.getInstance();
+			tempEnd.setTime(end);
+			tempEnd.add(Calendar.DATE, +1);// 日期加1(包含结束)
+			while (tempStart.before(tempEnd)) {
+				days.add(dateFormat.format(tempStart.getTime()));
+				tempStart.add(Calendar.DAY_OF_YEAR, 1);
+			}
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+
+		return days;
+	}
+
+	/**
+	 * 拼接字符串
+	 */
+	public static String listToString(List<String> list) {
+
+		if (list == null) {
+			return null;
+		}
+
+		StringBuilder result = new StringBuilder();
+		boolean first = true;
+
+		// 第一个前面不拼接","
+		for (String string : list) {
+			if (first) {
+				first = false;
+			} else {
+				result.append(",");
+			}
+			result.append(string);
+		}
+		return result.toString();
+	}
+
+	/**
+	 * 使用java正则表达式去掉多余的.与0
+	 * 
+	 * @param s
+	 * @return string
+	 */
+	public static String replace(String s) {
+		if (null != s && s.indexOf(".") > 0) {
+			s = s.replaceAll("0+?$", "");// 去掉多余的0
+			s = s.replaceAll("[.]$", "");// 如最后一位是.则去掉
+		}
+		return s;
+	}
+
 	/**
 	 * 根据 年、月 获取对应的月份 的 天数
-     */
-	 public static int getDaysByYearMonth(int year, int month)
-	 {
-	     Calendar a = Calendar.getInstance();
-	     a.set(Calendar.YEAR, year);
-	     a.set(Calendar.MONTH, month - 1);
-	     a.set(Calendar.DATE, 1);
-	     a.roll(Calendar.DATE, -1);
-	     int maxDate = a.get(Calendar.DATE);
-	     return maxDate;
-	 }
-	
+	 */
+	public static int getDaysByYearMonth(int year, int month) {
+		Calendar a = Calendar.getInstance();
+		a.set(Calendar.YEAR, year);
+		a.set(Calendar.MONTH, month - 1);
+		a.set(Calendar.DATE, 1);
+		a.roll(Calendar.DATE, -1);
+		int maxDate = a.get(Calendar.DATE);
+		return maxDate;
+	}
+
 	/**
 	 * 获取月份起始日期
 	 * 
@@ -58,8 +110,7 @@ public class ClockInTool {
 	public static String getMinMonthDate(String date) throws ParseException {
 		Calendar calendar = Calendar.getInstance();
 		calendar.setTime(famt.parse(date));
-		calendar.set(Calendar.DAY_OF_MONTH,
-				calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
+		calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
 		return famt.format(calendar.getTime());
 	}
 
@@ -73,72 +124,71 @@ public class ClockInTool {
 	public static String getMaxMonthDate(String date) throws ParseException {
 		Calendar calendar = Calendar.getInstance();
 		calendar.setTime(famt.parse(date));
-		calendar.set(Calendar.DAY_OF_MONTH,
-				calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
+		calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
 		return famt.format(calendar.getTime());
 	}
-	
+
 	/**
 	 * 对比两个字符串数组
+	 * 
 	 * @param t1
 	 * @param t2
 	 * @return
 	 */
-	public static <T> List<T> compare(T[] t1, T[] t2) {    
-	      List<T> list1 = Arrays.asList(t1); //将t1数组转成list数组   
-	      List<T> list2 = new ArrayList<T>();//用来存放2个数组中不相同的元素    
-	      for (T t : t2) {    
-	          if (!list1.contains(t)) {    
-	              list2.add(t);    
-	          }    
-	      }    
-	      return list2;    
-	  }
-	
+	public static <T> List<T> compare(T[] t1, T[] t2) {
+		List<T> list1 = Arrays.asList(t1); // 将t1数组转成list数组
+		List<T> list2 = new ArrayList<T>();// 用来存放2个数组中不相同的元素
+		for (T t : t2) {
+			if (!list1.contains(t)) {
+				list2.add(t);
+			}
+		}
+		return list2;
+	}
+
 	public static String[] array_unique(String[] ss) {
-		Set<String> set=new HashSet<String>(Arrays.asList(ss));
+		Set<String> set = new HashSet<String>(Arrays.asList(ss));
 		return set.toArray(new String[set.size()]);
-		//或者return new HashSet<String>(Arrays.asList(ss)).toArray(new String[0]);
+		// 或者return new HashSet<String>(Arrays.asList(ss)).toArray(new String[0]);
 	}
 
-	public static byte[] CreateBSCommBufferFromString(String sCmdParam,byte[] bytCmd) {
-		try{
-			if (sCmdParam.length() == 0){
+	public static byte[] CreateBSCommBufferFromString(String sCmdParam, byte[] bytCmd) {
+		try {
+			if (sCmdParam.length() == 0) {
 				return bytCmd;
 			}
 			byte[] bytText = sCmdParam.getBytes("UTF-8");
 			byte[] bytTextLen = int2byte(bytText.length + 1);
-			bytCmd=new byte[4 + bytText.length + 1];
-			System.arraycopy(bytTextLen,0,bytCmd,0,bytTextLen.length);
-			System.arraycopy(bytText,0,bytCmd,4,bytText.length);
+			bytCmd = new byte[4 + bytText.length + 1];
+			System.arraycopy(bytTextLen, 0, bytCmd, 0, bytTextLen.length);
+			System.arraycopy(bytText, 0, bytCmd, 4, bytText.length);
 			bytCmd[4 + bytText.length] = 0;
 			return bytCmd;
-		}catch(Exception e){
+		} catch (Exception e) {
 			e.printStackTrace();
-			bytCmd=new byte[0];
+			bytCmd = new byte[0];
 			return bytCmd;
 		}
 	}
-	
-	public static byte[] int2byte(int res) {  
-		byte[] targets = new byte[4];  
+
+	public static byte[] int2byte(int res) {
+		byte[] targets = new byte[4];
 		targets[0] = (byte) (res & 0xff);
 		targets[1] = (byte) ((res >> 8) & 0xff);
 		targets[2] = (byte) ((res >> 16) & 0xff);
 		targets[3] = (byte) (res >>> 24);
-		return targets;   
+		return targets;
 	}
-	
+
 	public static byte[] ConcateByteArray(byte[] abytDest, byte[] abytSrc) {
-        int len_dest = abytDest.length + abytSrc.length;
-        if (abytSrc.length == 0)
-            return abytDest;
-        byte[] bytTmp = new byte[len_dest];
-        System.arraycopy(abytDest, 0, bytTmp, 0, abytDest.length);
-        System.arraycopy(abytSrc, 0, bytTmp, abytDest.length, abytSrc.length);
-        return bytTmp;
+		int len_dest = abytDest.length + abytSrc.length;
+		if (abytSrc.length == 0)
+			return abytDest;
+		byte[] bytTmp = new byte[len_dest];
+		System.arraycopy(abytDest, 0, bytTmp, 0, abytDest.length);
+		System.arraycopy(abytSrc, 0, bytTmp, abytDest.length, abytSrc.length);
+		return bytTmp;
 	}
-	
 
 	public static String dateToWeek2(String datetime) {
 
diff --git a/src/main/java/cn/timer/api/controller/kqgl/atttimer/AttendanceTaskTiming.java b/src/main/java/cn/timer/api/controller/kqgl/atttimer/AttendanceTaskTiming.java
new file mode 100644
index 0000000..aef39bd
--- /dev/null
+++ b/src/main/java/cn/timer/api/controller/kqgl/atttimer/AttendanceTaskTiming.java
@@ -0,0 +1,374 @@
+package cn.timer.api.controller.kqgl.atttimer;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.scheduling.annotation.SchedulingConfigurer;
+import org.springframework.scheduling.config.ScheduledTaskRegistrar;
+import org.springframework.scheduling.support.CronTrigger;
+import org.springframework.stereotype.Component;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+
+import cn.timer.api.bean.kqgl.AttendanceWeeklySch;
+import cn.timer.api.bean.kqgl.PunchCardDetails;
+import cn.timer.api.bean.kqgl.Schedule;
+import cn.timer.api.bean.kqmk.KqglAssoBcsz;
+import cn.timer.api.bean.kqmk.KqglAssoDkjl;
+import cn.timer.api.bean.kqmk.KqglAssoDkmx;
+import cn.timer.api.bean.kqmk.KqglAssoMonthPunchSummary;
+import cn.timer.api.bean.kqmk.KqglAssoPbmx;
+import cn.timer.api.bean.kqmk.KqglAssoTeshu;
+import cn.timer.api.bean.kqmk.KqglAssoZhoupaiban;
+import cn.timer.api.bean.kqmk.KqglMainKqz;
+import cn.timer.api.bean.kqmk.KqglTaskTiming;
+import cn.timer.api.bean.qyzx.QyzxEntInfoM;
+import cn.timer.api.controller.kqgl.ClockInTool;
+import cn.timer.api.dao.kqgl.AttendanceWeeklySchMapper;
+import cn.timer.api.dao.kqgl.PunchCardDetailsMapper;
+import cn.timer.api.dao.kqgl.ScheduleMapper;
+import cn.timer.api.dao.kqmk.KqglAssoDkjlMapper;
+import cn.timer.api.dao.kqmk.KqglAssoLeaveBalanceMapper;
+import cn.timer.api.dao.kqmk.KqglAssoTeshuMapper;
+import cn.timer.api.dao.kqmk.KqglMainKqzMapper;
+import cn.timer.api.dao.qyzx.QyzxEntInfoMMapper;
+import cn.timer.api.dto.kqmk.AdditionalDto;
+import cn.timer.api.utils.DateUtil;
+
+/**
+ * @author lal
+ *
+ */
+@Component
+@Lazy
+public class AttendanceTaskTiming implements SchedulingConfigurer {
+
+	private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
+	static String tablename = null;
+	
+	@Autowired
+	private KqglMainKqzMapper kqglmainkqzmapper;
+	@Autowired
+	private QyzxEntInfoMMapper qyzxentinfommapper;
+	@Autowired
+	private KqglAssoLeaveBalanceMapper kqglassoleavebalancemapper;
+	@Autowired
+	private KqglAssoTeshuMapper kqglassoteshumapper;
+	@Autowired
+	private KqglAssoDkjlMapper kqglassodkjlmapper;
+	@Autowired
+	private PunchCardDetailsMapper punchcarddetailsmapper;
+	@Autowired
+	private AttendanceWeeklySchMapper attendanceweeklyschmapper;
+	@Autowired
+	private ScheduleMapper schedulemapper;
+
+	
+	SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
+	SimpleDateFormat sdf2 = new SimpleDateFormat("EEE");
+	
+	/**
+	 *	数据库动态更改定时配置(attendance_socks)
+	 */
+	@Override
+	public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
+		taskRegistrar.addTriggerTask(() -> {
+			// 任务逻辑
+			try {
+				tablename = AttendanceTask();
+			} catch (ParseException e) {
+				e.printStackTrace();
+			}
+		}, triggerContext -> {
+			CronTrigger cron = new CronTrigger(AttendanceUtil.getCron(tablename)); // cron配置
+			return cron.nextExecutionTime(triggerContext); // 下次执行任务的时间
+		});
+	}
+	
+	
+
+	/**
+	 * @return
+	 * @throws ParseException 
+	 */
+//	@Scheduled(cron = "0/5 * * * * ?") // 测试:5秒执行一次
+	@SuppressWarnings("unused")
+	public  String AttendanceTask() throws ParseException {
+		boolean implement = false;
+		KqglTaskTiming sock = KqglTaskTiming.builder().build().selectOne(new QueryWrapper<KqglTaskTiming>().lambda().eq(KqglTaskTiming::getTask, "AttendanceTask"));
+		if(sock == null) {
+			KqglTaskTiming.builder().task("AttendanceTask").executionStatus(1).lastExecutionTime(new Date().getTime()).build().insert();
+			implement = true;
+		}else {
+			if(sock.getExecutionStatus() == 0) {
+				KqglTaskTiming.builder().task("AttendanceTask").id(sock.getId()).executionStatus(1).lastExecutionTime(new Date().getTime()).build().updateById();
+				implement = true;
+			}
+		}
+		//逻辑
+		if(false) {
+			
+			System.err.println("当前时间:" + dateFormat.format(new Date()));
+			
+			Calendar c = Calendar.getInstance();    
+			c.add(Calendar.MONTH, 0);
+			c.set(Calendar.DAY_OF_MONTH,1);//设置为1号,当前日期既为本月第一天 
+			Long startDate = DateUtil.getStartTime(0,DateUtil.getStringTime(sdf1.format(c.getTime()),"yyyy-MM-dd")).getTime();
+			//获取当前月最后一天
+			Calendar ca = Calendar.getInstance();    
+			ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));  
+			Long endDate = DateUtil.getnowEndTime(23,DateUtil.getStringTime(sdf1.format(ca.getTime()),"yyyy-MM-dd")).getTime();
+			
+			List<QyzxEntInfoM> orgcodelist = qyzxentinfommapper.selectList(new QueryWrapper<QyzxEntInfoM>());//系统中的所有公司  所有未到期的公司
+			
+			String str = new SimpleDateFormat("yyyy-MM-dd").format(new Date()).toString();//
+			String[] range=ClockInTool.listToString(ClockInTool.getDays(sdf1.format(c.getTime()),str)).split(";");//目前为止所有日期
+			
+			for(int t = 0;t<orgcodelist.size();t++){
+				int org_code = orgcodelist.get(t).getId();//企业组织代码
+				List<AdditionalDto> userlist = kqglassoleavebalancemapper.selectAdditionalList(org_code);
+				for(AdditionalDto user : userlist) {
+	/*****/			for(String num : range) {//遍历目前为止所有日期
+		
+						Long startDatestop = DateUtil.getStartTime(0,DateUtil.getStringTime(num,"yyyy-MM-dd")).getTime();
+						Long endDatestop = DateUtil.getnowEndTime(23,DateUtil.getStringTime(num,"yyyy-MM-dd")).getTime();
+		
+						//考勤组信息
+						KqglMainKqz attgro = kqglmainkqzmapper.getAttendanceGroupInformationByUserid(user.getEmpnum(),org_code); 
+						//目前为止打卡记录
+						List<PunchCardDetails> attendance = punchcarddetailsmapper.selectAttendanceDays(Integer.valueOf(user.getEmpnum()), startDate, new Date().getTime());
+						int dkjl = 0;//目前为止打卡次数
+						if(attendance.size() > 0) { dkjl = attendance.size(); }
+						//具体打卡时间入汇总表(打卡成功才会录入汇总表)
+						 KqglAssoMonthPunchSummary isyessum = KqglAssoMonthPunchSummary.builder().build().selectOne(new QueryWrapper<KqglAssoMonthPunchSummary>().lambda()
+								 .eq(KqglAssoMonthPunchSummary::getNum, user.getEmpnum()).eq(KqglAssoMonthPunchSummary::getOrgCode, org_code));
+							int year = Calendar.getInstance().get(Calendar.YEAR);
+							int month = Calendar.getInstance().get(Calendar.MONTH) + 1;
+							if(attgro != null){//该员工是否加入到考勤组  排班方式 1:固定排班;2:自由排班;3:自由工时         计算出应出勤,实际出勤,休息天数
+								KqglAssoBcsz shif = KqglAssoBcsz.builder().build();
+								//休息天数,应出勤天数,实际出勤
+								double daysOff = 0,daysOnDuty = 0;//,actualAttDays = 0;
+								int zjgzts = 0;//目前为止应该出勤的天数
+								if(attgro.getPbfs() == 1){	//固定排班
+									int several = Integer.valueOf(ClockInTool.dateToWeek(str));//
+									KqglAssoTeshu tesu = KqglAssoTeshu.builder().build().selectOne(new QueryWrapper<KqglAssoTeshu>().lambda().eq(KqglAssoTeshu::getKqzid, attgro.getId()).eq(KqglAssoTeshu::getTsrq, str));
+									if(tesu == null) {
+										//获取该员工最新班次
+										KqglAssoZhoupaiban gudingpb = KqglAssoZhoupaiban.builder().build().selectOne(new QueryWrapper<KqglAssoZhoupaiban>().lambda().eq(KqglAssoZhoupaiban::getKqzid, attgro.getId())
+												.eq(KqglAssoZhoupaiban::getType, several));
+										shif = shif.selectOne(new QueryWrapper<KqglAssoBcsz>().lambda().eq(KqglAssoBcsz::getId, gudingpb.getBcid()));
+									}else {
+										shif = shif.selectOne(new QueryWrapper<KqglAssoBcsz>().lambda().eq(KqglAssoBcsz::getId, tesu.getBcid()));
+									}
+									
+									//获取该员工最新班次
+									KqglAssoZhoupaiban gudingpb = KqglAssoZhoupaiban.builder().build().selectOne(new QueryWrapper<KqglAssoZhoupaiban>().lambda().eq(KqglAssoZhoupaiban::getKqzid, attgro.getId())
+											.eq(KqglAssoZhoupaiban::getType, several));
+									shif = shif.selectOne(new QueryWrapper<KqglAssoBcsz>().lambda().eq(KqglAssoBcsz::getId, gudingpb.getBcid()));
+									
+									List<KqglAssoTeshu> bxdklist = kqglassoteshumapper.ShouldSpecialDatessetByKqzid(attgro.getId(), month,1);//当前月     必须打卡日期
+									int bxdk = bxdklist.size();
+									String[] bxdkss = new String[bxdk];
+									int b = 0;
+									for(KqglAssoTeshu bxd : bxdklist) {
+										bxdkss[b] = bxd.getTsrq();
+										b++;
+									}
+									List<KqglAssoTeshu> wxdk = kqglassoteshumapper.ShouldSpecialDatessetByKqzid(attgro.getId(), month,2);//当前月     无需打卡日期
+									String[] appmaps= new String[wxdk.size()];
+									int d1 = 0;
+									for(KqglAssoTeshu spe:wxdk){
+										appmaps[d1] = spe.getTsrq();
+										d1++;
+									}
+									List<AttendanceWeeklySch> atwek = attendanceweeklyschmapper.selectAttendanceMadeByUserid(Integer.valueOf(user.getEmpnum()));
+									String[] week= new String[atwek.size()];
+									String[] needfig = new String[atwek.size()];
+									int e = 0;
+									for(AttendanceWeeklySch awek : atwek){
+										week[e] = awek.getWekmc();
+										needfig[e] = String.valueOf(awek.getType());//获取设置的应打卡周几
+										e++;
+									}
+									String yemo = year + "-" + month;
+									sdf1.setLenient(false);
+									int y = 0,q = 0;
+									 for(int i = 1; i <= ClockInTool.getDaysByYearMonth(year,month); i++){
+											Date date1 = sdf1.parse(yemo + "-" + i);
+											for(int u=0;u<week.length;u++){
+												if(sdf2.format(date1).equals(week[u])){
+													q++;
+													y++;
+													if(Arrays.asList(appmaps).contains(String.valueOf(sdf1.format(date1)))){
+														y = y-1;
+													}
+												}
+											}
+									 }
+									 int xiuxi = ClockInTool.getDaysByYearMonth(year,month) - q - bxdk + wxdk.size();
+									 daysOff = xiuxi;
+									 daysOnDuty = y+bxdk;
+									 
+//									 String[] range=ClockInTool.listToString(ClockInTool.getDays(sdf1.format(c.getTime()),str)).split(";");//目前为止所有日期
+//									 int zjgzts = 0;//目前为止应该出勤的天数
+									//目前为止应出勤天数
+									if(Arrays.binarySearch(needfig, Integer.valueOf(ClockInTool.dateToWeek(num))) >= 0) {//对比排班应打卡时间
+										zjgzts++;
+									}
+									if(Arrays.binarySearch(bxdkss, num) >= 0) {//检查是否存在 必须打卡名单中
+										zjgzts++;
+									}
+									if(Arrays.binarySearch(appmaps, num) >= 0) {//检查是否存在 无需打卡名单中
+										zjgzts = zjgzts - 1;
+									}
+								}else if(attgro.getPbfs() == 2){	//自由排班
+									KqglAssoPbmx pbmxx = KqglAssoPbmx.builder().build().selectOne(new QueryWrapper<KqglAssoPbmx>().lambda().eq(KqglAssoPbmx::getUserid, user.getEmpnum()).eq(KqglAssoPbmx::getData, str).eq(KqglAssoPbmx::getKqzid, attgro.getId()));
+									shif = shif.selectOne(new QueryWrapper<KqglAssoBcsz>().lambda().eq(KqglAssoBcsz::getId, pbmxx.getBcid()));
+									List<Schedule> ycqs = schedulemapper.getAttendanceShouldList(Integer.valueOf(user.getEmpnum()),startDate,endDate);
+									int xiuxi = 0,shangban = 0,z=0;
+									String[] ziyoupb = new String[ycqs.size()];
+									for(Schedule sc : ycqs){
+										ziyoupb[z] = String.valueOf(sc.getData());
+										z++;
+										if(sc.getBcid().equals(0)){
+											xiuxi++;
+										}else{
+											shangban++;
+										}
+									}
+									daysOff = xiuxi;
+									daysOnDuty = shangban;
+									//目前为止应出勤天数
+									if(Arrays.binarySearch(ziyoupb, num) >= 0) {
+										KqglAssoPbmx pbx = KqglAssoPbmx.builder().build().selectOne(new QueryWrapper<KqglAssoPbmx>().lambda().eq(KqglAssoPbmx::getUserid, user.getEmpnum()).eq(KqglAssoPbmx::getData, num).eq(KqglAssoPbmx::getKqzid, attgro.getId()));
+										if(pbx!=null && pbx.getBcid()!=0) {
+											zjgzts++;
+										}
+									}
+								}else{
+									List<AttendanceWeeklySch> atwek = attendanceweeklyschmapper.selectAttendanceMadeByUserid(Integer.valueOf(user.getEmpnum()));
+									String[] week= new String[atwek.size()];
+									int e = 0;
+									String[] ziyoupb = new String[atwek.size()];
+									for(AttendanceWeeklySch awek : atwek){
+										week[e] = awek.getWekmc();
+										ziyoupb[e] = String.valueOf(awek.getType());
+										e++;
+									}
+									String yemo = year + "-" + month;
+									sdf1.setLenient(false);
+									int y = 0;
+									 for(int i = 1; i <= ClockInTool.getDaysByYearMonth(year,month); i++){
+											Date date1 = sdf1.parse(yemo + "-" + i);
+											for(int u=0;u<week.length;u++){
+												if(sdf2.format(date1).equals(week[u])){
+													y++;
+												}
+											}
+									 }
+									 int xiuxi = ClockInTool.getDaysByYearMonth(year,month) - y;
+									 daysOff = xiuxi;
+								     daysOnDuty = y;
+								     //目前为止应出勤天数
+							    	 if(Arrays.binarySearch(ziyoupb, Integer.valueOf(ClockInTool.dateToWeek(num))) >= 0) {//对比排班应打卡时间
+											zjgzts++;
+										}
+								}
+							    int answer = shif.getSxbcs();//1=2次  2=4次  3=6次
+								//当天打卡是否是最后一次   --- 归档
+								List<KqglAssoDkjl> zdkcs = kqglassodkjlmapper.selectList(new QueryWrapper<KqglAssoDkjl>().lambda().eq(KqglAssoDkjl::getUserId, user.getEmpnum())
+										 .ne(KqglAssoDkjl::getStatus, 0).gt(KqglAssoDkjl::getDktime, startDatestop).lt(KqglAssoDkjl::getDktime, endDatestop));
+								
+								KqglAssoDkmx dkmc1 = KqglAssoDkmx.builder().build().selectOne(new QueryWrapper<KqglAssoDkmx>().lambda().eq(KqglAssoDkmx::getUserid, user.getEmpnum())
+										.gt(KqglAssoDkmx::getDksj, startDatestop).lt(KqglAssoDkmx::getDksj, endDatestop));
+									if(isyessum == null) {//无汇总记录
+										 KqglAssoMonthPunchSummary summary = KqglAssoMonthPunchSummary.builder().name(user.getEmpname()).num(user.getEmpnum()).dept(user.getDepartment())
+												 .post(user.getPosition()).attGroup(attgro.getId()).build();
+										 summary.setDaysOnDuty(daysOnDuty);//应出勤天数
+										 summary.setActualAttDays(Double.valueOf(dkjl));//实际出勤天数
+										 summary.setDaysOff(daysOff);//休息天数
+										 summary.setWorkingHours(dkmc1.getGzsc());
+										 int lateTimes = 0,leavetimes = 0,sbqkcs = 0,xbqkcs = 0;double lateHours = 0,earlyleave=0;
+										 if(answer == 1 || answer == 2 || answer == 3) {
+											 if(dkmc1.getSbdk1jg() > 0) {lateTimes++;}
+											 if(dkmc1.getXbdk1jg() > 0) {leavetimes++;}
+											 lateHours =  dkmc1.getSbdk1jg();
+											 earlyleave = dkmc1.getXbdk1jg();
+											 if(dkmc1.getSbdk1() == null) {sbqkcs++;}
+											 if(dkmc1.getXbdk1() == null) {xbqkcs++;}
+										 }
+										 if(answer == 2 || answer == 3) {
+											 if(dkmc1.getSbdk2jg() > 0) {lateTimes++;}
+											 if(dkmc1.getXbdk2jg() > 0) {leavetimes++;}
+											 lateHours = lateHours + dkmc1.getSbdk2jg();
+											 earlyleave = earlyleave + dkmc1.getXbdk2jg();
+											 if(dkmc1.getSbdk2() == null) {sbqkcs++;}
+											 if(dkmc1.getXbdk2() == null) {xbqkcs++;}
+										 }
+										 if(answer == 3) {
+											 if(dkmc1.getSbdk3jg() > 0) {lateTimes++;}
+											 if(dkmc1.getXbdk3jg() > 0) {leavetimes++;}
+											 lateHours = lateHours + dkmc1.getSbdk3jg();
+											 earlyleave = earlyleave + dkmc1.getXbdk3jg();
+											 if(dkmc1.getSbdk3() == null) {sbqkcs++;}
+											 if(dkmc1.getXbdk3() == null) {xbqkcs++;}
+										 }
+										 summary.setLateTimes(Double.valueOf(lateTimes));//迟到次数
+										 summary.setLateHours(lateHours);//迟到时长(分钟)
+										 summary.setSeriousLateTimes(Double.valueOf(dkmc1.getYzcdcs()));
+										 summary.setSeriousLateHours(dkmc1.getYzcdsc());
+										 summary.setAbsenLateTimes(Double.valueOf(dkmc1.getKgcdfzs()));
+										 summary.setEarlyLeaveTimes(Double.valueOf(leavetimes));//早退次数
+										 summary.setLengthEarlyLeave(earlyleave);//早退时长(分钟)
+										 summary.setNumberWorkCardShortage(Double.valueOf(sbqkcs));
+										 summary.setNumberDutyCardShortage(Double.valueOf(xbqkcs));
+										 int absenteeismdays=0;
+										 if(zjgzts-dkjl > 0) { absenteeismdays = zjgzts-dkjl; }
+										 summary.setAbsenteeismDays(Double.valueOf(absenteeismdays));//旷工天数
+										 
+										 //出差时长
+										 //外出时长
+										 //加班总时长
+										 //工作日(转调休)
+										 //休息日(转调休)
+										 //节假日(转调休)
+										 //工作日(转加班费)
+										 //休息日(转加班费)
+										 //节假日(转加班费)
+										 
+										 summary.setBelongYear(ca.get(Calendar.YEAR));
+										 summary.setBelongMonth(ca.get(Calendar.MONTH)+1);
+										 summary.setOrgCode(org_code);
+										 summary.setLastModified(new Date().getTime());
+										 /******审批接口----对接*******/
+										 
+									 }else {
+										 int id = isyessum.getId();
+										 
+									 }
+							    
+							    
+							}else {
+								System.out.println("该员工未加入考勤组");
+							}
+						
+					}
+				}
+			}
+			/****************************************************************/
+			KqglTaskTiming.builder().task("AttendanceTask").id(sock.getId()).executionStatus(0).lastExecutionTime(new Date().getTime()).build().updateById();
+			return new Exception().getStackTrace()[0].getMethodName();
+			
+		}else {
+			return null;
+		}
+	}
+	
+  
+}
diff --git a/src/main/java/cn/timer/api/controller/kqgl/atttimer/AttendanceUtil.java b/src/main/java/cn/timer/api/controller/kqgl/atttimer/AttendanceUtil.java
new file mode 100644
index 0000000..abb7823
--- /dev/null
+++ b/src/main/java/cn/timer/api/controller/kqgl/atttimer/AttendanceUtil.java
@@ -0,0 +1,20 @@
+package cn.timer.api.controller.kqgl.atttimer;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+
+import cn.timer.api.bean.kqmk.AttendanceSocks;
+
+public class AttendanceUtil {
+	    // 默认cron 5秒一次
+		private static String cron = "0/5 * * * * ?";
+
+		// 数据库cron
+		public static String getCron(String tablename) {
+			AttendanceSocks task = AttendanceSocks.builder().build().selectOne(new LambdaQueryWrapper<AttendanceSocks>().eq(AttendanceSocks::getCronName, tablename)); // 数据库查询
+
+			if (task != null && task.getCron() != null) {
+				cron = task.getCron();
+			}
+			return cron;
+		}
+}
diff --git a/src/main/java/cn/timer/api/controller/kqgl/service/KqglServiceImpl.java b/src/main/java/cn/timer/api/controller/kqgl/service/KqglServiceImpl.java
index 9ae08a4..040b746 100644
--- a/src/main/java/cn/timer/api/controller/kqgl/service/KqglServiceImpl.java
+++ b/src/main/java/cn/timer/api/controller/kqgl/service/KqglServiceImpl.java
@@ -1,21 +1,59 @@
 package cn.timer.api.controller.kqgl.service;
 
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+
+import cn.timer.api.bean.kqmk.KqglAssoLeaveBalance;
+import cn.timer.api.bean.kqmk.KqglAssoRelationSummary;
+import cn.timer.api.bean.yggl.YgglMainEmp;
+import cn.timer.api.controller.kqgl.ClockInTool;
+import cn.timer.api.dao.kqmk.KqglAssoLeaveBalanceMapper;
 import cn.timer.api.dto.kqmk.AttEvectionApprovalDto;
 import cn.timer.api.dto.kqmk.AttLeaveApprovalDto;
 import cn.timer.api.dto.kqmk.AttOvertimeApprovalDto;
 import cn.timer.api.dto.kqmk.AttRepairApprovalDto;
 
+/**
+ * @author lal
+ *	记录用户假期审批流程  对应减去剩余余额
+ */
 @Service
 public class KqglServiceImpl implements KqglService {
 
+	@Autowired
+	private KqglAssoLeaveBalanceMapper kqglassoleavebalancemapper;
+	
 	/**
 	 * 考勤请假审批
 	 */
 	@Override
 	public boolean attleaveapproval(AttLeaveApprovalDto leaveappr) {
-
+		
+		String startdate = new SimpleDateFormat("yyyy-MM-dd").format(leaveappr.getStarttime());
+		String enddate = new SimpleDateFormat("yyyy-MM-dd").format(leaveappr.getEndtime());
+		String[] days=ClockInTool.listToString(ClockInTool.getDays(startdate,enddate)).split(";");
+		for(String num : days) {
+			//记入打卡月汇总关联表
+			KqglAssoRelationSummary.builder().userId(leaveappr.getUserid()).appTime(num).approvalId(leaveappr.getLeaveid()).approvalType(2).duration(leaveappr.getDuration())
+				.leaveTypeId(leaveappr.getLeavetype()).build().insert();
+		}
+		
+		YgglMainEmp emp = YgglMainEmp.builder().build().selectOne(new QueryWrapper<YgglMainEmp>().lambda().eq(YgglMainEmp::getEmpNum, leaveappr.getUserid()));
+		int modifynumber = 1;
+		KqglAssoLeaveBalance balan = kqglassoleavebalancemapper.selectOne(new QueryWrapper<KqglAssoLeaveBalance>().lambda().eq(KqglAssoLeaveBalance::getUserid, leaveappr.getUserid())
+				.orderByDesc(KqglAssoLeaveBalance :: getModifyNumber).last("LIMIT 1"));
+		if(balan != null) {
+			modifynumber = balan.getModifyNumber()+1;
+		}
+		
+		KqglAssoLeaveBalance.builder().leaveRulesId(leaveappr.getLeavetype()).userid(leaveappr.getUserid()).modifyAction(2).balanceDays("-"+leaveappr.getDuration())
+		.reason("系统按照规则自动").modifyUserid(emp.getEmpNum()).modifyTimer(new Date().getTime()).orgCode(emp.getOrgCode()).isAutomatic(1).modifyNumber(modifynumber).build().insert();//员工假期余额
+		
 		return true;
 	}
 
@@ -24,7 +62,19 @@ public class KqglServiceImpl implements KqglService {
 	 */
 	@Override
 	public boolean attovertimeapproval(AttOvertimeApprovalDto overappr) {
-
+		
+		String startdate = new SimpleDateFormat("yyyy-MM-dd").format(overappr.getStarttime());
+		String enddate = new SimpleDateFormat("yyyy-MM-dd").format(overappr.getEndtime());
+		String[] days=ClockInTool.listToString(ClockInTool.getDays(startdate,enddate)).split(";");
+		for(String num : days) {
+			
+			//记入打卡月汇总关联表
+			KqglAssoRelationSummary.builder().userId(overappr.getUserid()).appTime(num).approvalId(overappr.getOvertimeid()).approvalType(1).duration(overappr.getDuration())
+				.overtimeTypeId(overappr.getOvertimetype()).compensateId(overappr.getCompensate()).build().insert();
+		}
+		
+		
+		
 		return true;
 	}
 
@@ -33,7 +83,23 @@ public class KqglServiceImpl implements KqglService {
 	 */
 	@Override
 	public boolean attevectionapproval(AttEvectionApprovalDto evecappr) {
-
+		if(evecappr.getEvectiontype() == 1) {	//出差
+			String startdate = new SimpleDateFormat("yyyy-MM-dd").format(evecappr.getStarttime());
+			String enddate = new SimpleDateFormat("yyyy-MM-dd").format(evecappr.getEndtime());
+			String[] days=ClockInTool.listToString(ClockInTool.getDays(startdate,enddate)).split(";");
+			for(String num : days) {
+				//记入打卡月汇总关联表
+				KqglAssoRelationSummary.builder().userId(evecappr.getUserid()).appTime(num).approvalId(evecappr.getEvectionid()).approvalType(3).build().insert();
+			}
+		}else {	//外出
+			String startdate = new SimpleDateFormat("yyyy-MM-dd").format(evecappr.getStarttime());
+			String enddate = new SimpleDateFormat("yyyy-MM-dd").format(evecappr.getEndtime());
+			String[] days=ClockInTool.listToString(ClockInTool.getDays(startdate,enddate)).split(";");
+			for(String num : days) {
+				//记入打卡月汇总关联表
+				KqglAssoRelationSummary.builder().userId(evecappr.getUserid()).appTime(num).approvalId(evecappr.getEvectionid()).approvalType(4).build().insert();
+			}
+		}
 		return true;
 	}
 
@@ -42,7 +108,12 @@ public class KqglServiceImpl implements KqglService {
 	 */
 	@Override
 	public boolean attrepairapproval(AttRepairApprovalDto repaappr) {
-
+		
+		String cardrepltime = new SimpleDateFormat("yyyy-MM-dd").format(repaappr.getCardrepltime());//补卡时间
+		
+		//记入打卡月汇总关联表
+		KqglAssoRelationSummary.builder().userId(repaappr.getUserid()).appTime(cardrepltime).approvalId(repaappr.getRepairid()).approvalType(5).build().insert();
+		
 		return true;
 	}
 
diff --git a/src/main/java/cn/timer/api/dao/kqmk/AttendanceSocksMapper.java b/src/main/java/cn/timer/api/dao/kqmk/AttendanceSocksMapper.java
new file mode 100644
index 0000000..c3ed400
--- /dev/null
+++ b/src/main/java/cn/timer/api/dao/kqmk/AttendanceSocksMapper.java
@@ -0,0 +1,16 @@
+package cn.timer.api.dao.kqmk;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springframework.stereotype.Repository;
+
+import cn.timer.api.bean.kqmk.AttendanceSocks;
+
+/**
+ * 考勤定时
+ * 
+ * @author Tang 2020-05-19
+ */
+@Repository
+public interface AttendanceSocksMapper extends BaseMapper<AttendanceSocks> {
+
+}
diff --git a/src/main/java/cn/timer/api/dao/kqmk/KqglAssoLeaveBalanceMapper.java b/src/main/java/cn/timer/api/dao/kqmk/KqglAssoLeaveBalanceMapper.java
index a2f35b5..f1eefc1 100644
--- a/src/main/java/cn/timer/api/dao/kqmk/KqglAssoLeaveBalanceMapper.java
+++ b/src/main/java/cn/timer/api/dao/kqmk/KqglAssoLeaveBalanceMapper.java
@@ -24,4 +24,6 @@ public interface KqglAssoLeaveBalanceMapper extends BaseMapper<KqglAssoLeaveBala
 	IPage<EmployeeLeaveBalanceDto> selectPageByQueryLeaveBalance(IPage<EmployeeLeaveBalanceDto> page,@Param("param") AttqueryCriteriaDto attquerycriteriadto);
 	
 	AdditionalDto selectAdditional(int orgcode,int empnum);
+	
+	List<AdditionalDto> selectAdditionalList(int orgcode);
 }
diff --git a/src/main/java/cn/timer/api/dao/kqmk/KqglAssoRelationSummaryMapper.java b/src/main/java/cn/timer/api/dao/kqmk/KqglAssoRelationSummaryMapper.java
new file mode 100644
index 0000000..2128969
--- /dev/null
+++ b/src/main/java/cn/timer/api/dao/kqmk/KqglAssoRelationSummaryMapper.java
@@ -0,0 +1,16 @@
+package cn.timer.api.dao.kqmk;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springframework.stereotype.Repository;
+
+import cn.timer.api.bean.kqmk.KqglAssoRelationSummary;
+
+/**
+ * 打卡月汇总关联表
+ * 
+ * @author Tang 2020-05-19
+ */
+@Repository
+public interface KqglAssoRelationSummaryMapper extends BaseMapper<KqglAssoRelationSummary> {
+
+}
diff --git a/src/main/java/cn/timer/api/dao/kqmk/KqglTaskTimingMapper.java b/src/main/java/cn/timer/api/dao/kqmk/KqglTaskTimingMapper.java
new file mode 100644
index 0000000..bdb3b52
--- /dev/null
+++ b/src/main/java/cn/timer/api/dao/kqmk/KqglTaskTimingMapper.java
@@ -0,0 +1,17 @@
+package cn.timer.api.dao.kqmk;
+
+import org.springframework.stereotype.Repository;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import cn.timer.api.bean.kqmk.KqglTaskTiming;
+
+/**
+ * 考勤任务定时
+ * 
+ * @author Tang 2020-05-19
+ */
+@Repository
+public interface KqglTaskTimingMapper extends BaseMapper<KqglTaskTiming> {
+
+}
diff --git a/src/main/java/cn/timer/api/dto/kqmk/AttLeaveApprovalDto.java b/src/main/java/cn/timer/api/dto/kqmk/AttLeaveApprovalDto.java
index d714e76..e37b658 100644
--- a/src/main/java/cn/timer/api/dto/kqmk/AttLeaveApprovalDto.java
+++ b/src/main/java/cn/timer/api/dto/kqmk/AttLeaveApprovalDto.java
@@ -30,6 +30,6 @@ public class AttLeaveApprovalDto {
 	@ApiModelProperty(value = "结束时间", example = "时间戳")
 	private long endtime;
 
-	@ApiModelProperty(value = "时长(分钟)", example = "")
+	@ApiModelProperty(value = "时长", example = "")
 	private double duration;
 }
diff --git a/src/main/java/cn/timer/api/dto/kqmk/AttOvertimeApprovalDto.java b/src/main/java/cn/timer/api/dto/kqmk/AttOvertimeApprovalDto.java
index 827595f..9b5f29f 100644
--- a/src/main/java/cn/timer/api/dto/kqmk/AttOvertimeApprovalDto.java
+++ b/src/main/java/cn/timer/api/dto/kqmk/AttOvertimeApprovalDto.java
@@ -30,7 +30,7 @@ public class AttOvertimeApprovalDto {
 	@ApiModelProperty(value = "结束时间", example = "时间戳")
 	private long endtime;
 
-	@ApiModelProperty(value = "时长(分钟)", example = "")
+	@ApiModelProperty(value = "时长", example = "")
 	private double duration;
 
 	@ApiModelProperty(value = "加班补偿方式", example = "1:转调休;2:转加班费;3:转调休或加班费")
diff --git a/src/main/resources/mapping/kqmk/AttendanceSocksMapper.xml b/src/main/resources/mapping/kqmk/AttendanceSocksMapper.xml
new file mode 100644
index 0000000..68d7508
--- /dev/null
+++ b/src/main/resources/mapping/kqmk/AttendanceSocksMapper.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.timer.api.dao.kqmk.AttendanceSocksMapper">
+
+    <resultMap id="BaseResultMap" type="cn.timer.api.bean.kqmk.AttendanceSocks" >
+                <result column="cron_id" property="cronId" />
+                <result column="cron_name" property="cronName" />
+                <result column="cron" property="cron" />
+    </resultMap>
+
+    <sql id="Base_Column_List">
+                cron_id,
+                cron_name,
+                cron
+    </sql>
+    
+    <sql id="Base_Column_List_Alias">
+                cron_id AttendanceSocks_cron_id,
+                cron_name AttendanceSocks_cron_name,
+                cron AttendanceSocks_cron
+    </sql>
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapping/kqmk/KqglAssoDkmxMapper.xml b/src/main/resources/mapping/kqmk/KqglAssoDkmxMapper.xml
index 5b06289..069d43f 100644
--- a/src/main/resources/mapping/kqmk/KqglAssoDkmxMapper.xml
+++ b/src/main/resources/mapping/kqmk/KqglAssoDkmxMapper.xml
@@ -23,6 +23,9 @@
                 <result column="gzsc" property="gzsc" />
                 <result column="qyid" property="qyid" />
                 <result column="dksj" property="dksj" />
+                <result column="yzcdcs" property="yzcdcs" />
+                <result column="yzcdsc" property="yzcdsc" />
+                <result column="kgcdfzs" property="kgcdfzs" />
     </resultMap>
 
     <sql id="Base_Column_List">
@@ -44,7 +47,10 @@
                 ydkcs,
                 gzsc,
                 qyid,
-                dksj
+                dksj,
+                yzcdcs,
+                yzcdsc,
+                kgcdfzs
     </sql>
     
     <sql id="Base_Column_List_Alias">
@@ -66,7 +72,10 @@
                 ydkcs KqglAssoDkmx_ydkcs,
                 gzsc KqglAssoDkmx_gzsc,
                 qyid KqglAssoDkmx_qyid,
-                dksj KqglAssoDkmx_dksj
+                dksj KqglAssoDkmx_dksj,
+                yzcdcs KqglAssoDkmx_yzcdcs,
+                yzcdsc KqglAssoDkmx_yzcdsc,
+                kgcdfzs KqglAssoDkmx_kgcdfzs
     </sql>
 
 	<!-- 
@@ -126,7 +135,16 @@
                         qyid,
                         </if>
                         <if test ='null != dksj'>
-                        dksj
+                        dksj,
+                        </if>
+                        <if test ='null != yzcdcs'>
+                        yzcdcs,
+                        </if>
+                        <if test ='null != yzcdsc'>
+                        yzcdsc,
+                        </if>
+                        <if test ='null != kgcdfzs'>
+                        kgcdfzs
                         </if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
@@ -182,7 +200,16 @@
                         #{qyid},
                         </if>
                         <if test ='null != dksj'>
-                        #{dksj}
+                        #{dksj},
+                        </if>
+                        <if test ='null != yzcdcs'>
+                        #{yzcdcs},
+                        </if>
+                        <if test ='null != yzcdsc'>
+                        #{yzcdsc},
+                        </if>
+                        <if test ='null != kgcdfzs'>
+                        #{kgcdfzs}
                         </if>
         </trim>
     </insert>
@@ -212,7 +239,10 @@
                     <if test ='null != ydkcs'>ydkcs = #{ydkcs},</if>
                     <if test ='null != gzsc'>gzsc = #{gzsc},</if>
                     <if test ='null != qyid'>qyid = #{qyid},</if>
-                    <if test ='null != dksj'>dksj = #{dksj}</if>
+                    <if test ='null != dksj'>dksj = #{dksj},</if>
+                    <if test ='null != yzcdcs'>yzcdcs = #{yzcdcs},</if>
+                    <if test ='null != yzcdsc'>yzcdsc = #{yzcdsc},</if>
+                    <if test ='null != kgcdfzs'>kgcdfzs = #{kgcdfzs}</if>
         </set>
         WHERE id = #{id}
     </update>
diff --git a/src/main/resources/mapping/kqmk/KqglAssoLeaveBalanceMapper.xml b/src/main/resources/mapping/kqmk/KqglAssoLeaveBalanceMapper.xml
index a884445..4d24d49 100644
--- a/src/main/resources/mapping/kqmk/KqglAssoLeaveBalanceMapper.xml
+++ b/src/main/resources/mapping/kqmk/KqglAssoLeaveBalanceMapper.xml
@@ -98,6 +98,17 @@
 			where emp.org_code = #{orgcode} 
 			and emp.emp_num = #{empnum}
     </select>
+    
+    <select id="selectAdditionalList" resultMap="AdditionalMap">
+    	SELECT emp.emp_num as empnum,
+				   emp.`name` as empname,
+				   IFNULL(c.name,'') as department,
+			     gw.`name` as position
+			from yggl_main_emp emp
+			LEFT JOIN zzgl_bmgw_m as gw on gw.id = emp.bmgw_id
+			LEFT JOIN zzgl_bmgw_m as c ON c.id = gw.up_id
+			where emp.org_code = #{orgcode} 
+    </select>
 
 	<!-- 
 
diff --git a/src/main/resources/mapping/kqmk/KqglAssoRelationSummaryMapper.xml b/src/main/resources/mapping/kqmk/KqglAssoRelationSummaryMapper.xml
new file mode 100644
index 0000000..bc8fcc1
--- /dev/null
+++ b/src/main/resources/mapping/kqmk/KqglAssoRelationSummaryMapper.xml
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.timer.api.dao.kqmk.KqglAssoRelationSummaryMapper">
+
+    <resultMap id="BaseResultMap" type="cn.timer.api.bean.kqmk.KqglAssoRelationSummary" >
+                <id column="id" property="id" />
+                <result column="user_id" property="userId" />
+                <result column="app_time" property="appTime" />
+                <result column="approval_id" property="approvalId" />
+                <result column="approval_type" property="approvalType" />
+                <result column="duration" property="duration" />
+                <result column="leave_type_id" property="leaveTypeId" />
+                <result column="overtime_type_id" property="overtimeTypeId" />
+                <result column="compensate_id" property="compensateId" />
+    </resultMap>
+
+    <sql id="Base_Column_List">
+                id,
+                user_id,
+                app_time,
+                approval_id,
+                approval_type,
+                duration,
+                leave_type_id,
+                overtime_type_id,
+                compensate_id
+    </sql>
+    
+    <sql id="Base_Column_List_Alias">
+                id KqglAssoRelationSummary_id,
+                user_id KqglAssoRelationSummary_user_id,
+                app_time KqglAssoRelationSummary_app_time,
+                approval_id KqglAssoRelationSummary_approval_id,
+                approval_type KqglAssoRelationSummary_approval_type,
+                duration KqglAssoRelationSummary_duration,
+                leave_type_id KqglAssoRelationSummary_leave_type_id,
+                overtime_type_id KqglAssoRelationSummary_overtime_type_id,
+                compensate_id KqglAssoRelationSummary_compensate_id
+    </sql>
+
+	<!-- 
+
+    <insert id="insert" useGeneratedKeys="true" keyColumn="id" parameterType="cn.timer.api.bean.kqmk.KqglAssoRelationSummary">
+        INSERT INTO kqgl_asso_relation_summary
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+                        <if test ='null != userId'>
+                        user_id,
+                        </if>
+                        <if test ='null != appTime'>
+                        app_time,
+                        </if>
+                        <if test ='null != approvalId'>
+                        approval_id,
+                        </if>
+                        <if test ='null != approvalType'>
+                        approval_type,
+                        </if>
+                        <if test ='null != duration'>
+                        duration,
+                        </if>
+                        <if test ='null != leaveTypeId'>
+                        leave_type_id,
+                        </if>
+                        <if test ='null != overtimeTypeId'>
+                        overtime_type_id,
+                        </if>
+                        <if test ='null != compensateId'>
+                        compensate_id
+                        </if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+                        <if test ='null != userId'>
+                        #{userId},
+                        </if>
+                        <if test ='null != appTime'>
+                        #{appTime},
+                        </if>
+                        <if test ='null != approvalId'>
+                        #{approvalId},
+                        </if>
+                        <if test ='null != approvalType'>
+                        #{approvalType},
+                        </if>
+                        <if test ='null != duration'>
+                        #{duration},
+                        </if>
+                        <if test ='null != leaveTypeId'>
+                        #{leaveTypeId},
+                        </if>
+                        <if test ='null != overtimeTypeId'>
+                        #{overtimeTypeId},
+                        </if>
+                        <if test ='null != compensateId'>
+                        #{compensateId}
+                        </if>
+        </trim>
+    </insert>
+
+    <delete id="delete" >
+        DELETE FROM kqgl_asso_relation_summary
+        WHERE id = #{id}
+    </delete>
+
+    <update id="update" parameterType="cn.timer.api.bean.kqmk.KqglAssoRelationSummary">
+        UPDATE kqgl_asso_relation_summary
+        <set>
+                    <if test ='null != userId'>user_id = #{userId},</if>
+                    <if test ='null != appTime'>app_time = #{appTime},</if>
+                    <if test ='null != approvalId'>approval_id = #{approvalId},</if>
+                    <if test ='null != approvalType'>approval_type = #{approvalType},</if>
+                    <if test ='null != duration'>duration = #{duration},</if>
+                    <if test ='null != leaveTypeId'>leave_type_id = #{leaveTypeId},</if>
+                    <if test ='null != overtimeTypeId'>overtime_type_id = #{overtimeTypeId},</if>
+                    <if test ='null != compensateId'>compensate_id = #{compensateId}</if>
+        </set>
+        WHERE id = #{id}
+    </update>
+
+
+    <select id="load" resultMap="BaseResultMap">
+        SELECT <include refid="Base_Column_List" />
+        FROM kqgl_asso_relation_summary
+        WHERE id = #{id}
+    </select>
+
+    <select id="pageList" resultMap="BaseResultMap">
+        SELECT <include refid="Base_Column_List" />
+        FROM kqgl_asso_relation_summary
+        LIMIT #{offset}, #{pageSize}
+    </select>
+
+    <select id="pageListCount" resultType="java.lang.Integer">
+        SELECT count(1)
+        FROM kqgl_asso_relation_summary
+    </select>
+
+	 -->
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapping/kqmk/KqglTaskTimingMapper.xml b/src/main/resources/mapping/kqmk/KqglTaskTimingMapper.xml
new file mode 100644
index 0000000..02c8e9d
--- /dev/null
+++ b/src/main/resources/mapping/kqmk/KqglTaskTimingMapper.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.timer.api.dao.kqmk.KqglTaskTimingMapper">
+
+    <resultMap id="BaseResultMap" type="cn.timer.api.bean.kqmk.KqglTaskTiming" >
+                <id column="id" property="id" />
+                <result column="task" property="task" />
+                <result column="execution_status" property="executionStatus" />
+                <result column="last_execution_time" property="lastExecutionTime" />
+    </resultMap>
+
+    <sql id="Base_Column_List">
+                id,
+                task,
+                execution_status,
+                last_execution_time
+    </sql>
+    
+    <sql id="Base_Column_List_Alias">
+                id KqglTaskTiming_id,
+                task KqglTaskTiming_task,
+                execution_status KqglTaskTiming_execution_status,
+                last_execution_time KqglTaskTiming_last_execution_time
+    </sql>
+
+	<!-- 
+
+    <insert id="insert" useGeneratedKeys="true" keyColumn="id" parameterType="cn.timer.api.bean.kqmk.KqglTaskTiming">
+        INSERT INTO kqgl_task_timing
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+                        <if test ='null != task'>
+                        task,
+                        </if>
+                        <if test ='null != executionStatus'>
+                        execution_status,
+                        </if>
+                        <if test ='null != lastExecutionTime'>
+                        last_execution_time
+                        </if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+                        <if test ='null != task'>
+                        #{task},
+                        </if>
+                        <if test ='null != executionStatus'>
+                        #{executionStatus},
+                        </if>
+                        <if test ='null != lastExecutionTime'>
+                        #{lastExecutionTime}
+                        </if>
+        </trim>
+    </insert>
+
+    <delete id="delete" >
+        DELETE FROM kqgl_task_timing
+        WHERE id = #{id}
+    </delete>
+
+    <update id="update" parameterType="cn.timer.api.bean.kqmk.KqglTaskTiming">
+        UPDATE kqgl_task_timing
+        <set>
+                    <if test ='null != task'>task = #{task},</if>
+                    <if test ='null != executionStatus'>execution_status = #{executionStatus},</if>
+                    <if test ='null != lastExecutionTime'>last_execution_time = #{lastExecutionTime}</if>
+        </set>
+        WHERE id = #{id}
+    </update>
+
+
+    <select id="load" resultMap="BaseResultMap">
+        SELECT <include refid="Base_Column_List" />
+        FROM kqgl_task_timing
+        WHERE id = #{id}
+    </select>
+
+    <select id="pageList" resultMap="BaseResultMap">
+        SELECT <include refid="Base_Column_List" />
+        FROM kqgl_task_timing
+        LIMIT #{offset}, #{pageSize}
+    </select>
+
+    <select id="pageListCount" resultType="java.lang.Integer">
+        SELECT count(1)
+        FROM kqgl_task_timing
+    </select>
+
+	 -->
+
+</mapper>
\ No newline at end of file