|
@@ -1,17 +1,16 @@
|
|
|
package com.management.platform.task;
|
|
|
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
import com.alibaba.fastjson.JSONArray;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.injector.methods.SelectById;
|
|
|
import com.management.platform.controller.WeiXinCorpController;
|
|
|
import com.management.platform.entity.*;
|
|
|
+import com.management.platform.entity.vo.TokenVo;
|
|
|
import com.management.platform.mapper.*;
|
|
|
import com.management.platform.service.*;
|
|
|
-import com.management.platform.util.DockWithMLD;
|
|
|
-import com.management.platform.util.HttpRespMsg;
|
|
|
-import com.management.platform.util.RedisUtil;
|
|
|
-import com.management.platform.util.WorkDayCalculateUtils;
|
|
|
+import com.management.platform.util.*;
|
|
|
import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
|
|
|
import me.chanjar.weixin.mp.api.WxMpService;
|
|
|
import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
|
|
@@ -30,12 +29,18 @@ import org.springframework.util.StringUtils;
|
|
|
import org.springframework.web.client.RestTemplate;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
+import java.math.BigDecimal;
|
|
|
import java.security.SecureRandom;
|
|
|
+import java.sql.Timestamp;
|
|
|
import java.text.DecimalFormat;
|
|
|
import java.time.*;
|
|
|
import java.time.format.DateTimeFormatter;
|
|
|
import java.time.temporal.TemporalAccessor;
|
|
|
+import java.time.temporal.TemporalAdjusters;
|
|
|
import java.util.*;
|
|
|
+import java.util.concurrent.CountDownLatch;
|
|
|
+import java.util.concurrent.Executor;
|
|
|
+import java.util.concurrent.Executors;
|
|
|
import java.util.stream.Collectors;
|
|
|
import java.util.stream.IntStream;
|
|
|
|
|
@@ -51,10 +56,12 @@ public class TimingTask {
|
|
|
//是否是开发环境
|
|
|
@Value("${configEnv.isDev}")
|
|
|
boolean isDev;
|
|
|
+ @Value("${privateDeployURL.pcUrl}")
|
|
|
+ private String pcUrl;
|
|
|
//是否是私有化部署
|
|
|
@Value("${configEnv.isPrivateDeploy}")
|
|
|
boolean isPrivateDeploy;
|
|
|
-
|
|
|
+ private final static Executor executor = Executors.newFixedThreadPool(3);//启用多线程
|
|
|
|
|
|
@Value("${wx.template_report_fill}")
|
|
|
public String TEMPLATE_REPORT_FILL;
|
|
@@ -64,6 +71,8 @@ public class TimingTask {
|
|
|
public String appId;
|
|
|
@Value("${wx.app_secret}")
|
|
|
public String appSecret;
|
|
|
+ @Value("${corpId}")
|
|
|
+ public String corpId;
|
|
|
@Autowired
|
|
|
private RedisUtil redisUtil;
|
|
|
@Autowired
|
|
@@ -81,9 +90,13 @@ public class TimingTask {
|
|
|
@Resource
|
|
|
private ReportMapper reportMapper;
|
|
|
@Resource
|
|
|
+ private TimeAutoExcludeMapper timeAutoExcludeMapper;
|
|
|
+ @Resource
|
|
|
private WxCorpInfoService wxCorpInfoService;
|
|
|
@Resource
|
|
|
private WxCorpInfoMapper wxCorpInfoMapper;
|
|
|
+ @Resource
|
|
|
+ private ReportLogMapper reportLogMapper;
|
|
|
@Value(value = "${upload.path}")
|
|
|
private String path;
|
|
|
|
|
@@ -188,10 +201,69 @@ public class TimingTask {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ //每个月五号推送日报信息
|
|
|
+ @Scheduled(cron = "0 0 1 5 * ?")
|
|
|
+ private void pushReportListByToken(){
|
|
|
+ if(isDev) return;
|
|
|
+ HttpRespMsg msg=new HttpRespMsg();
|
|
|
+ LocalDate now=LocalDate.now().minusMonths(1);
|
|
|
+ DateTimeFormatter df=DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
|
|
+ now.with(TemporalAdjusters.lastDayOfMonth());
|
|
|
+ LocalDate start=now.with(TemporalAdjusters.firstDayOfMonth());
|
|
|
+ LocalDate end=now.with(TemporalAdjusters.lastDayOfMonth());
|
|
|
+ List<TimeType> timeTypeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().eq("push_report_data", 1));
|
|
|
+ for (TimeType timeType : timeTypeList) {
|
|
|
+ List<ReportLog> reportLogList = reportLogMapper.selectList(new QueryWrapper<ReportLog>().eq("company_id", timeType.getCompanyId()).ge("operate_date",start.atTime(LocalTime.now())).orderByAsc("operate_date"));
|
|
|
+ List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", timeType.getCompanyId()));
|
|
|
+ List<HashMap<String, Object>> allReportByDate = reportMapper.getAllReportByDate(start.format(df),timeType.getCompanyId(), null, end.format(df), null, 1, null);
|
|
|
+ final CountDownLatch latch=new CountDownLatch(allReportByDate.size());
|
|
|
+ for (HashMap<String, Object> map : allReportByDate) {
|
|
|
+ java.sql.Date sqlCreateDate= (java.sql.Date) map.get("createDate");
|
|
|
+ java.sql.Timestamp sqlProjectAuditTime= (Timestamp) map.get("projectAuditTime");
|
|
|
+ java.sql.Timestamp sqlTime= (Timestamp) map.get("time");
|
|
|
+ if(sqlCreateDate!=null){
|
|
|
+ LocalDate createDate = sqlCreateDate.toLocalDate();
|
|
|
+ map.put("createDate",df.format(createDate));
|
|
|
+ }
|
|
|
+ if(sqlProjectAuditTime!=null){
|
|
|
+ LocalDateTime projectAuditTime = sqlProjectAuditTime.toLocalDateTime();
|
|
|
+ map.put("projectAuditTime",projectAuditTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
|
|
|
+ }
|
|
|
+ if(sqlTime!=null){
|
|
|
+ LocalDateTime time = sqlTime.toLocalDateTime();
|
|
|
+ map.put("time",time.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
|
|
|
+ }
|
|
|
+ executor.execute(new Runnable(){
|
|
|
+ @Override
|
|
|
+ public void run() {
|
|
|
+ List<ReportLog> item=new ArrayList<>();
|
|
|
+ Integer reportId = (Integer) map.get("id");
|
|
|
+ for (ReportLog reportLog : reportLogList) {
|
|
|
+ List<String> list = Arrays.asList(reportLog.getReportIds().split(","));
|
|
|
+ reportLog.setCreatorName(!userList.stream().filter(
|
|
|
+ ul->ul.getId().equals(reportLog.getCreatorId())).findFirst().isPresent()?"":userList.stream().filter(
|
|
|
+ ul->ul.getId().equals(reportLog.getCreatorId())).findFirst().get().getName());
|
|
|
+ reportLog.setOperateName(!userList.stream().filter(
|
|
|
+ ul->ul.getId().equals(reportLog.getOperatorId())).findFirst().isPresent()?"":userList.stream().filter(
|
|
|
+ ul->ul.getId().equals(reportLog.getOperatorId())).findFirst().get().getName());
|
|
|
+ if(list.contains(String.valueOf(reportId))&&!reportLog.getMsg().contains("提交")){
|
|
|
+ item.add(reportLog);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ map.put("checkLog",item);
|
|
|
+ latch.countDown();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ msg.data=allReportByDate;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
//每天2:11 同步钉钉用户前2天到未来30天时间段的打卡,请假,出差数据
|
|
|
- @Scheduled(cron = "0 11 2 ? * *")
|
|
|
+ @Scheduled(cron = "0 53 15 ? * *")
|
|
|
private void synFanWeiWorkData() {
|
|
|
- if (isDev) return;
|
|
|
+ /*if (isDev) return;*/
|
|
|
List<TimeType> timeTypeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().eq("sync_fanwei", 1));
|
|
|
List<Integer> compIds = timeTypeList.stream().map(TimeType::getCompanyId).collect(Collectors.toList());
|
|
|
if(compIds.isEmpty()){
|
|
@@ -217,24 +289,50 @@ public class TimingTask {
|
|
|
//Todo: 获取打卡数据
|
|
|
HttpRespMsg workDataMsg = dockWithMLD.getResult("http://10.1.10.51:20175/api/cube/restful/interface/getModeDataPageList/getWorkData", jsonString);
|
|
|
List<Map<String,Object>> workDataList= (List<Map<String, Object>>) workDataMsg.data;
|
|
|
- for (Map<String, Object> map : workDataList) {
|
|
|
- UserFvTime userFvTime=new UserFvTime();
|
|
|
- User user = userMapper.selectOne(new QueryWrapper<User>().eq("job_number", map.get("userId")));
|
|
|
- if(user==null){
|
|
|
- continue;
|
|
|
+ List<String> userIds = workDataList.stream().map(map -> String.valueOf(map.get("userId"))).collect(Collectors.toList());
|
|
|
+ List<User> userList = userMapper.selectList(new QueryWrapper<User>().in("job_number", userIds));
|
|
|
+ for (User user : userList) {
|
|
|
+ System.out.println("需要同步的用户列表-----"+userList);
|
|
|
+ LocalTime startTime=null;
|
|
|
+ LocalTime endTime=null;
|
|
|
+ LocalDate workDate=null;
|
|
|
+ for (Map<String, Object> map : workDataList) {
|
|
|
+ if (map.get("userId").equals(user.getJobNumber())) {
|
|
|
+ if(String.valueOf(map.get("signtype")).equals("签到")){
|
|
|
+ startTime=LocalTime.parse(String.valueOf(map.get("signtime")), dtf2);
|
|
|
+ workDate= LocalDate.parse(String.valueOf(map.get("workDate")), dtf);
|
|
|
+ }
|
|
|
+ if(String.valueOf(map.get("signtype")).equals("签退")){
|
|
|
+ endTime=LocalTime.parse(String.valueOf(map.get("signtime")), dtf2);
|
|
|
+ workDate=LocalDate.parse(String.valueOf(map.get("workDate")),dtf);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
+ UserFvTime userFvTime=new UserFvTime();
|
|
|
+ //获取休息设置
|
|
|
+ TimeAutoExclude timeAutoExclude = timeAutoExcludeMapper.selectOne(new QueryWrapper<TimeAutoExclude>().eq("company_id", user.getCompanyId()));
|
|
|
+ System.out.println("泛微同步人员打卡数据----"+user.getName());
|
|
|
if(compIds.contains(user.getCompanyId())){
|
|
|
- userFvTime.setWorkDate(LocalDate.parse(String.valueOf(map.get("workDate")),dtf));
|
|
|
- LocalTime startTime = LocalTime.parse(String.valueOf(map.get("startTime")), dtf2);
|
|
|
- LocalTime endTime = LocalTime.parse(String.valueOf(map.get("endTime")), dtf2);
|
|
|
- LocalDateTime time1= LocalDate.now().atTime(startTime);
|
|
|
- LocalDateTime time2 = LocalDate.now().atTime(endTime);
|
|
|
- Duration between = Duration.between(time1, time2);
|
|
|
- userFvTime.setStartTime((String) map.get("startTime"));
|
|
|
- userFvTime.setEndTime((String) map.get("endTime"));
|
|
|
+ if(startTime==null||endTime==null){
|
|
|
+ System.out.println("缺少上班或者下班打卡时间----"+user.getName());
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ userFvTime.setWorkDate(workDate);
|
|
|
+ Duration between = Duration.between(startTime, endTime);
|
|
|
+ userFvTime.setStartTime(startTime.format(dtf2));
|
|
|
+ userFvTime.setEndTime(endTime.format(dtf2));
|
|
|
userFvTime.setCompanyId(user.getCompanyId());
|
|
|
userFvTime.setUserId(user.getId());
|
|
|
- userFvTime.setWorkHours((float)between.toHours());
|
|
|
+ long workHours = between.toHours();
|
|
|
+ long restHours;
|
|
|
+ if(startTime.isBefore(LocalTime.parse(timeAutoExclude.getStartTime(),dtf2))
|
|
|
+ &&endTime.isAfter(LocalTime.parse(timeAutoExclude.getEndTime(),dtf2))){
|
|
|
+ Duration bt = Duration.between(LocalTime.parse(timeAutoExclude.getStartTime(),dtf2), LocalTime.parse(timeAutoExclude.getEndTime(),dtf2));
|
|
|
+ restHours=bt.toHours();
|
|
|
+ }else {
|
|
|
+ restHours=0;
|
|
|
+ }
|
|
|
+ userFvTime.setWorkHours(BigDecimal.valueOf(workHours).subtract(BigDecimal.valueOf(restHours)).floatValue());
|
|
|
Optional<UserFvTime> first = oldUserFvTimeList.stream().filter(ol -> ol.getWorkDate().isEqual(userFvTime.getWorkDate()) && ol.getUserId().equals(userFvTime.getUserId())).findFirst();
|
|
|
if(first.isPresent()){
|
|
|
userFvTime.setId(first.get().getId());
|
|
@@ -253,24 +351,51 @@ public class TimingTask {
|
|
|
if(user==null){
|
|
|
continue;
|
|
|
}
|
|
|
+ System.out.println("泛微同步人员请假数据----"+user.getName());
|
|
|
if(compIds.contains(user.getCompanyId())){
|
|
|
LeaveSheet leaveSheet=new LeaveSheet();
|
|
|
leaveSheet.setCompanyId(user.getCompanyId());
|
|
|
leaveSheet.setStatus(0);
|
|
|
leaveSheet.setOwnerId(user.getId());
|
|
|
leaveSheet.setOwnerName(user.getName());
|
|
|
- leaveSheet.setStartDate(LocalDate.parse(String.valueOf(map.get("startDate")),dtf));
|
|
|
- leaveSheet.setEndDate(LocalDate.parse(String.valueOf(map.get("endDate")),dtf));
|
|
|
- int timeType = Integer.parseInt(String.valueOf(map.get("timeType")));
|
|
|
+ leaveSheet.setStartDate(LocalDate.parse(String.valueOf(map.get("startDate")),dtf1));
|
|
|
+ leaveSheet.setEndDate(LocalDate.parse(String.valueOf(map.get("endDate")),dtf1));
|
|
|
+ Integer timeType=null;
|
|
|
+ switch (String.valueOf(map.get("timeType"))){
|
|
|
+ case "小时":timeType=1;
|
|
|
+ break;
|
|
|
+ case "天":timeType=0;
|
|
|
+ break;
|
|
|
+ }
|
|
|
leaveSheet.setTimeType(timeType);
|
|
|
- leaveSheet.setTimeDays((Float) map.get("timeDays"));
|
|
|
+ leaveSheet.setTimeDays(Float.parseFloat((String) map.get("timeDays")));
|
|
|
if (timeType == 0){
|
|
|
TimeType allDay = timeTypeMapper.selectOne(new QueryWrapper<TimeType>().eq("company_id", user.getCompanyId()));
|
|
|
leaveSheet.setTimeHours(leaveSheet.getTimeDays()*allDay.getAllday());
|
|
|
}else {
|
|
|
- leaveSheet.setTimeHours((Float) map.get("timeHours"));
|
|
|
+ leaveSheet.setTimeHours(Float.parseFloat((String) map.get("timeHours")));
|
|
|
}
|
|
|
- leaveSheet.setLeaveType(Integer.parseInt(String.valueOf(map.get("leaveType"))));
|
|
|
+ Integer leaveType=null;
|
|
|
+ switch (String.valueOf(map.get("leaveType"))){
|
|
|
+ case "事假":leaveType=0;
|
|
|
+ break;
|
|
|
+ case "病假":leaveType=1;
|
|
|
+ break;
|
|
|
+ case "年假":leaveType=2;
|
|
|
+ break;
|
|
|
+ case "产假":leaveType=3;
|
|
|
+ break;
|
|
|
+ case "婚假":leaveType=4;
|
|
|
+ break;
|
|
|
+ case "丧假":leaveType=5;
|
|
|
+ break;
|
|
|
+ case "调休":leaveType=6;
|
|
|
+ break;
|
|
|
+ case "陪产假":leaveType=7;
|
|
|
+ break;
|
|
|
+ default:leaveType=8;
|
|
|
+ }
|
|
|
+ leaveSheet.setLeaveType(leaveType);
|
|
|
leaveSheet.setProcinstId(String.valueOf(map.get("procinstId")));
|
|
|
leaveSheet.setGmtFinished(String.valueOf(map.get("gmtFinished")));
|
|
|
Optional<LeaveSheet> first = oldLeaveSheetList.stream().filter(ol -> ol.getStartDate().isEqual(leaveSheet.getStartDate())&&ol.getEndDate().isEqual(leaveSheet.getEndDate()) && ol.getOwnerId().equals(leaveSheet.getOwnerId())).findFirst();
|
|
@@ -291,16 +416,39 @@ public class TimingTask {
|
|
|
if(user==null){
|
|
|
continue;
|
|
|
}
|
|
|
+ System.out.println("泛微同步人员出差数据----"+user.getName());
|
|
|
if(compIds.contains(user.getCompanyId())){
|
|
|
BusinessTrip businessTrip=new BusinessTrip();
|
|
|
businessTrip.setCompanyId(user.getCompanyId());
|
|
|
- businessTrip.setStartDate(LocalDate.parse(String.valueOf(map.get("startDate")),dtf));
|
|
|
- businessTrip.setEndDate(LocalDate.parse(String.valueOf(map.get("endDate")),dtf));
|
|
|
- businessTrip.setWay(Integer.valueOf(String.valueOf(map.get("way"))));
|
|
|
+ businessTrip.setOwnerId(user.getId());
|
|
|
+ businessTrip.setOwnerName(user.getName());
|
|
|
+ businessTrip.setStartDate(LocalDate.parse(String.valueOf(map.get("startDate")),dtf1));
|
|
|
+ businessTrip.setEndDate(LocalDate.parse(String.valueOf(map.get("endDate")),dtf1));
|
|
|
+ Integer way=null;
|
|
|
+ switch (String.valueOf(map.get("way"))){
|
|
|
+ case "飞机":way=0;
|
|
|
+ break;
|
|
|
+ case "高铁/火车":way=1;
|
|
|
+ break;
|
|
|
+ case "汽车":way=2;
|
|
|
+ break;
|
|
|
+ case "轮船":way=3;
|
|
|
+ break;
|
|
|
+ case "其他":way=4;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ businessTrip.setWay(way);
|
|
|
businessTrip.setCityFrom((String) map.get("cityFrom"));
|
|
|
businessTrip.setCityTo((String) map.get("cityTo"));
|
|
|
- businessTrip.setGoBack(Integer.valueOf(String.valueOf(map.get("goBack"))));
|
|
|
- businessTrip.setDayCount(Integer.valueOf(String.valueOf(map.get("dayCount"))));
|
|
|
+ Integer goBack=null;
|
|
|
+ switch (String.valueOf(map.get("goBack"))){
|
|
|
+ case "单程":goBack=0;
|
|
|
+ break;
|
|
|
+ case "往返":goBack=1;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ businessTrip.setGoBack(goBack);
|
|
|
+ businessTrip.setDayCount(Integer.parseInt(String.valueOf(map.get("dayCount")).substring(0,1)));
|
|
|
businessTrip.setProcinstId((String) map.get("procinstId"));
|
|
|
businessTrip.setGmtFinished((String)map.get("gmtFinished"));
|
|
|
Optional<BusinessTrip> first = oldBusinessTripList.stream().filter(ol -> ol.getStartDate().isEqual(businessTrip.getStartDate())&&ol.getEndDate().isEqual(businessTrip.getEndDate()) && ol.getOwnerId().equals(businessTrip.getOwnerId())).findFirst();
|
|
@@ -506,6 +654,10 @@ public class TimingTask {
|
|
|
token+=s;
|
|
|
}
|
|
|
System.out.println(token);
|
|
|
+ LocalDate now=LocalDate.now().minusMonths(1);
|
|
|
+ LocalDate end=now.with(TemporalAdjusters.lastDayOfMonth());
|
|
|
+ LocalDate start=now.with(TemporalAdjusters.firstDayOfMonth());
|
|
|
+ System.out.println(start+"----"+end);
|
|
|
}
|
|
|
|
|
|
//发送上周填写的工时统计
|
|
@@ -631,7 +783,7 @@ public class TimingTask {
|
|
|
jsonObj.put("value", StringUtils.isEmpty(t.getAlertMsg())?"":t.getAlertMsg());
|
|
|
dataJson.add(jsonObj);
|
|
|
if(isPrivateDeploy){
|
|
|
- json.put("content",StringUtils.isEmpty(t.getAlertMsg())?"":t.getAlertMsg()+"\\n<a href=\\\"https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect\\\">去填写</a>");
|
|
|
+ json.put("content",StringUtils.isEmpty(t.getAlertMsg())?"":t.getAlertMsg()+"\\n<a href=\\\"https://open.weixin.qq.com/connect/oauth2/authorize?appid="+corpId+"&redirect_uri="+pcUrl+"/api/corpInsideWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect\\\">去填写</a>");
|
|
|
}else {
|
|
|
json.put("template_id","tty9TkCAAAYoevY-40ciWD5lDncDfR5w");
|
|
|
json.put("url", "https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
|