小程序表结构修改,考勤数据同步问题修改

请假同步数据修改
删除废弃的功能
This commit is contained in:
fl 2025-02-20 19:43:38 +08:00
parent b37c6af313
commit c8fed6540d
11 changed files with 1290 additions and 1339 deletions

View File

@ -392,15 +392,6 @@ public class AttendanceDetailsController extends BaseController {
return getDataTableError(new ArrayList<>());
}
/**
* 用户新增
*/
@PostMapping("/synchronous")
@Log(title = "考勤报表-> 考勤明细->数据同步", businessType = BusinessType.INSERT)
public AjaxResult synchronous(@Validated @RequestBody AttDataDetailsBean bean) {
return attendanceDetailsService.synchronous(bean);
}
/**
* 获取日报表-详细记录

View File

@ -82,7 +82,7 @@ public interface AttSourceDataDao {
Integer getPersonLeaveApplyStatus(AttSourceDataBean bean);
/**
* 查出最近三天的人员考勤记录
* 查出人员考勤记录
* @return list bean
*/
List<AttSourceDataBean> getSourceAttData(@Param("pushDate")String pushDate, @Param("pushType")int pushType);

View File

@ -1,21 +1,16 @@
package com.bonus.system.att.dao;
import com.bonus.system.api.domain.MapVo;
import com.bonus.system.api.domain.SysUser;
import com.bonus.system.att.entity.AttFaceBean;
import com.bonus.system.att.entity.AttSourceDataBean;
import com.bonus.system.att.entity.LeaveBean;
import com.bonus.system.att.entity.OrgChangeBean;
import com.bonus.system.basic.domain.SysOrg;
import com.bonus.system.evection.entity.EvectionBean;
import com.bonus.system.holiday.entity.HolidayBean;
import com.bonus.system.holiday.entity.WorkReportBean;
import com.bonus.system.index.entity.MapBean;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Map;
/**
* 小程序同步定时器
@ -42,7 +37,7 @@ public interface WechatPushDao {
*/
SysOrg getOrgInfoByUserId(Long userId);
void insertWebLeave(EvectionBean bean);
int insertWebLeave(EvectionBean bean);
List<EvectionBean> getWebLeaveList();

View File

@ -115,7 +115,7 @@ public class AttSourceDataBean {
/**
* 0 默认 1 外勤 2 正常
*/
private String isOutsideAtt;
private String isOutsideAtt = "0";
private String remark;

View File

@ -103,8 +103,6 @@ public interface AttendanceDetailsService {
List<AttDataDetailsBean> getOutCountList(AttDataDetailsBean bean);
AjaxResult synchronous(AttDataDetailsBean bean);
List<AttDataDetailsBean> getAttDayList(AttDataDetailsBean bean);
List<AttDataDetailsBean> getAttCountList(AttDataDetailsBean bean);

View File

@ -5,23 +5,17 @@ import com.bonus.common.core.utils.poi.ExcelUtil;
import com.bonus.common.core.web.domain.AjaxResult;
import com.bonus.common.security.utils.SecurityUtils;
import com.bonus.system.api.domain.MapVo;
import com.bonus.system.api.domain.SysUser;
import com.bonus.system.att.dao.AttendanceDetailsDao;
import com.bonus.system.att.entity.*;
import com.bonus.system.att.tasks.AttTasks;
import com.bonus.system.att.tasks.WechatTasks;
import com.bonus.system.att.tasks.NewAttTask;
import com.bonus.system.basic.domain.SysNotice;
import com.bonus.system.basic.service.SysNoticeService;
import com.bonus.system.dept.dao.ProDeptRoleDao;
import com.bonus.system.file.service.FileUploadService;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
@ -36,12 +30,8 @@ public class AttendanceDetailsServiceImpl implements AttendanceDetailsService {
@Resource(name = "attendanceDetailsDao")
private AttendanceDetailsDao attendanceDetailsDao;
@Resource(name = "ProDeptRoleDao")
private ProDeptRoleDao proDeptRoleDao;
@Resource
private AttTasks attTasks;
private NewAttTask newAttTask;
/**
* 消息推送库表
@ -142,7 +132,6 @@ public class AttendanceDetailsServiceImpl implements AttendanceDetailsService {
}
});
int i = attendanceDetailsDao.updateAttDetailsDataExamine(list);
// todo 更新月报表和日报表
if (i > 0) {
Set<String> keys = new HashSet<>();
for (AttDataDetailsBean attDataDetailsBean : list) {
@ -150,8 +139,8 @@ public class AttendanceDetailsServiceImpl implements AttendanceDetailsService {
}
// 使用增强的 for 循环遍历 Set
for (String item : keys) {
List<AttGroupBean> groupList = attTasks.getGroupData(item);
attTasks.createReportData(groupList, item, 2);
newAttTask.insertDayReportData(item);
newAttTask.updateMonthReportData(item);
}
}
return i;
@ -229,29 +218,6 @@ public class AttendanceDetailsServiceImpl implements AttendanceDetailsService {
return attendanceDetailsDao.getOutCountList(bean);
}
@Override
public AjaxResult synchronous(AttDataDetailsBean bean) {
try {
List<String> dateList = AttTasks.getStrDateListBetween(bean.getStartDate(), bean.getEndDate());
//只执行今天之前的时间包含今天
// 获取今天的日期
LocalDate today = LocalDate.now();
// 定义日期格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
dateList = dateList.stream()
.map(date -> LocalDate.parse(date, formatter)) // 将字符串转换为LocalDate
.filter(date -> !date.isAfter(today)) // 筛选出今天及之前的日期
.sorted() // 按日期排序可选
.map(formatter::format) // 将LocalDate转回为字符串
.collect(Collectors.toList());
attTasks.hisAttPush(dateList);
return AjaxResult.success("数据同步成功");
} catch (Exception e) {
log.error(e.toString(), e);
return AjaxResult.error("数据同步失败");
}
}
@Override
public List<AttDataDetailsBean> getAttDayList(AttDataDetailsBean bean) {
return attendanceDetailsDao.getAttDayList(bean);

View File

@ -1,20 +1,8 @@
package com.bonus.system.att.tasks;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.bonus.common.core.utils.DateTimeHelper;
import com.bonus.common.core.utils.DateUtils;
import com.bonus.system.att.dao.AttGroupDao;
import com.bonus.system.att.dao.AttSourceDataDao;
import com.bonus.system.att.entity.*;
import com.bonus.system.att.service.AttCalService;
import com.bonus.system.att.utils.AddressCoordinateFormatUtil;
import com.bonus.system.att.utils.AttTimeUtil;
import com.bonus.system.att.utils.WorkdayCalculator;
import com.bonus.system.holiday.dao.HolidayDao;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.beanutils.BeanUtils;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
@ -22,18 +10,8 @@ import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import javax.annotation.Resource;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
/**
* @author zys
@ -52,7 +30,6 @@ public class NewAttTask {
* 考勤模版数据定时器 凌晨10分启动一次一天仅仅一次
*/
@Scheduled(cron = "0 10 0 * * ?")
// @Scheduled(initialDelay = 60000, fixedDelay = 60000 * 10)
@Async
public void getAttTempDataTask() {
log.info("--------考勤模版数据定时器开启------");
@ -68,7 +45,6 @@ public class NewAttTask {
* 2.考勤数据应用步骤一考勤数据更新
*/
@Scheduled(cron = "0 0 5-23 * * ?")
// @Scheduled(initialDelay = 60000, fixedDelay = 60000 * 10)
@Async
public void getAttDataPullTask() {
log.info("--------数据拉取(考勤)定时器开启------");
@ -85,7 +61,6 @@ public class NewAttTask {
* 每天晚上22点将下班未打卡置为旷工
*/
@Scheduled(cron = "0 0 12,22 * * ?")
// @Scheduled(initialDelay = 60000, fixedDelay = 60000 * 10)
@Async
public void getAbsenteeismDataTask() {
log.info("--------旷工判断定时器开启------");
@ -100,7 +75,6 @@ public class NewAttTask {
* 每天7点将昨天数据更新一下
*/
@Scheduled(cron = "0 0 7 * * ?")
// @Scheduled(initialDelay = 60000, fixedDelay = 60000 * 10)
@Async
public void getYesterdayAttDataTask() {
log.info("--------昨日下班卡更新定时器开启------");
@ -109,16 +83,16 @@ public class NewAttTask {
// 格式化输出
String yesterdayStr = yesterday.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
updateAttData(yesterdayStr,2);
//日报表更新 TODO
//日报表更新
insertDayReportData(yesterdayStr);
log.info("--------昨日下班卡更新定时器完毕------");
}
/**
* 请假数据应用--法假
* 每天更新一次点更新
* 每天更新一次1点更新
*/
@Scheduled(cron = "0 0 1 * * ?")
// @Scheduled(initialDelay = 60000, fixedDelay = 60000 * 10)
@Async
public void getLegalHolidayDataTask() {
log.info("--------请假数据应用--法假定时器开启------");
@ -132,7 +106,6 @@ public class NewAttTask {
* 每天更新两次上午8点下午18点45天前数据
*/
@Scheduled(cron = "0 0 8,18 * * ?")
// @Scheduled(initialDelay = 60000, fixedDelay = 60000 * 10)
@Async
public void getLeaveDataTask() {
log.info("--------请假数据应用--请假定时器开启------");
@ -147,7 +120,6 @@ public class NewAttTask {
* 6点10分开始,一小时更新一次
*/
@Scheduled(cron = "0 10 6-23 * * ?")
// @Scheduled(initialDelay = 60000, fixedDelay = 60000 * 10)
@Async
public void getDayReportDataTask() {
log.info("--------报表数据生成--日报表定时器开启------");
@ -162,7 +134,6 @@ public class NewAttTask {
* 月初生成之后修改
*/
@Scheduled(cron = "0 15 1 1 * ?")
// @Scheduled(initialDelay = 60000, fixedDelay = 60000 * 10)
@Async
public void getMonthReportDataTempTask() {
log.info("--------报表数据生成--月报表定时器开启------");
@ -176,7 +147,6 @@ public class NewAttTask {
* 每日数据变化修改之后修改
*/
@Scheduled(cron = "0 0 8,10,17,19,23 * * ?")
// @Scheduled(initialDelay = 60000, fixedDelay = 60000 * 10)
@Async
public void getMonthReportDataTask() {
log.info("--------报表数据生成--月报表定时器开启------");

View File

@ -12,6 +12,7 @@ import com.bonus.system.att.dao.WechatPushDao;
import com.bonus.system.att.entity.AttFaceBean;
import com.bonus.system.att.entity.AttSourceDataBean;
import com.bonus.system.att.service.AttCalService;
import com.bonus.system.att.utils.AddressCoordinateFormatUtil;
import com.bonus.system.att.utils.AttTimeUtil;
import com.bonus.system.att.utils.DistanceCalculator;
import com.bonus.system.att.utils.IpAndPathConfig;
@ -55,7 +56,7 @@ public class WechatTasks {
* 人员基础数据同步定时器
*/
// @Scheduled(cron = "0 0/10 * * * ?")
// @Scheduled(initialDelay = 60000, fixedDelay = 60000 * 30)
@Scheduled(initialDelay = 60000, fixedDelay = 60000 * 30)
@Async
public void pushPersonTask() {
log.info("--------人员基础数据同步定时器开启------");
@ -83,7 +84,7 @@ public class WechatTasks {
/**
* 休假出差数据同步定时器
*/
// @Scheduled(initialDelay = 60000 * 2, fixedDelay = 60000 * 30)
// @Scheduled(initialDelay = 600 * 2, fixedDelay = 60000 * 30)
@Async
public void leaveTask() {
log.info("--------休假出差数据定时器开启------");
@ -107,18 +108,20 @@ public class WechatTasks {
bean.setOrgId(orgInfo.getId());
bean.setOrgName(orgInfo.getOrgName());
}
String jsonStr2 = FastJsonHelper.beanToJsonStr(bean);
if(bean.getId() != 0L){
//修改的数据
dao.updateWechatLeave(bean);
}else{
//首次推送的数据
dao.insertWebLeave(bean);
int i = dao.insertWebLeave(bean);
//根据uuid将小程序id换成考勤端id
//返回了id不能在前面生成
String jsonStr2 = FastJsonHelper.beanToJsonStr(bean);
String method2 = "updateWechatLeave";
String string2 = httpPost(method2, jsonStr2);
}
//将所有数据同步限制解除
String jsonStr2 = FastJsonHelper.beanToJsonStr(bean);
String method2 = "updateWechatIsSync";
String string3 = httpPost(method2, jsonStr2);
}
@ -166,7 +169,7 @@ public class WechatTasks {
/**
* 考勤数据同步定时器
*/
// @Scheduled(initialDelay = 6000 * 3, fixedDelay = 60000 * 30)
@Scheduled(initialDelay = 6000 * 3, fixedDelay = 60000 * 30)
@Async
public void wechatAttTask() {
log.info("--------考勤数据定时器开启------");
@ -202,6 +205,21 @@ public class WechatTasks {
//外勤
bean.setIsOutsideAtt("1");
}
//省内省外
String address;
String province;
try {
JSONObject result = AddressCoordinateFormatUtil.
coordinateToAddress2(bean.getAttLon(), bean.getAttLat());
address = result.getString("formatted_address");
province = result.getJSONObject("addressComponent").getString("province");
} catch (Exception e) {
e.printStackTrace();
address = "地址未转化成功";
province = "地址未转化成功";
}
bean.setAttAddress(address);
bean.setProvince(province);
});
//新增数据
//新增考勤到考勤来源表(数据过多时分批次插入)
@ -387,8 +405,8 @@ public class WechatTasks {
MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
RequestBody body = null;
try {
// body = RequestBody.create(mediaType, "username=15240004260&password=GZkq@123456!");
body = RequestBody.create(mediaType, "username=" + AESCBCUtil.encrypt("15240004260wechat") + "&password=" + AESCBCUtil.encrypt("GZkq@123456!"));
body = RequestBody.create(mediaType, "username=15240004260wechat&password=GZkq@123456!");
// body = RequestBody.create(mediaType, "username=" + AESCBCUtil.encrypt("15240004260wechat") + "&password=" + AESCBCUtil.encrypt("GZkq@123456!"));
} catch (Exception e) {
throw new RuntimeException(e);
}

View File

@ -7,10 +7,10 @@
<insert id="insertAttSourceData">
<foreach collection="list" item="params" separator=";">
replace into att_source_data(name, id_number, org_id, org_name, att_current_day,
att_current_time, att_type, att_address, province, att_lon, att_lat, data_source, remark)
att_current_time, att_type, att_address, province,is_outside_att, att_lon, att_lat, data_source, remark)
values (#{params.name}, #{params.idNumber}, #{params.orgId}, #{params.orgName},
#{params.attCurrentDay}, #{params.attCurrentTime}, #{params.attType},
#{params.attAddress}, #{params.province}, #{params.attLon}, #{params.attLat}, #{params.dataSource},
#{params.attAddress}, #{params.province},#{params.isOutsideAtt}, #{params.attLon}, #{params.attLat}, #{params.dataSource},
#{params.remark})
</foreach>
</insert>
@ -93,8 +93,10 @@
<update id="updateAttStatusData">
<foreach collection="list" item="params" separator=";">
update att_data set att_current_time = #{params.attCurrentTime},
att_address = #{params.attAddress}, province = #{params.province}, att_lon = #{params.attLon}, att_lat =
#{params.attLat},
att_address = #{params.attAddress}, province = #{params.province},
is_outside_att = #{params.isOutsideAtt},
att_lon = #{params.attLon},
att_lat = #{params.attLat},
data_source = #{params.dataSource},
error_remake = #{params.remark},
att_status = CASE
@ -107,8 +109,10 @@
AND att_current_day = #{params.attCurrentDay} and att_type = #{params.attType};
update att_data_update set att_current_time = #{params.attCurrentTime},
att_address = #{params.attAddress}, province = #{params.province}, att_lon = #{params.attLon}, att_lat =
#{params.attLat},
att_address = #{params.attAddress}, province = #{params.province},
is_outside_att = #{params.isOutsideAtt},
att_lon = #{params.attLon},
att_lat = #{params.attLat},
data_source = #{params.dataSource},
error_remake = #{params.remark},
att_status = CASE
@ -377,7 +381,6 @@
LEFT JOIN att_setting_history ag ON ag.user_id = su.user_id
AND ag.current_day = #{pushDate}
LEFT JOIN att_group g ON g.id = ag.group_id;
</select>
<select id="selectAttIsExist" resultType="java.lang.Boolean">

View File

@ -116,26 +116,37 @@
</update>
<select id="getPersonList" resultType="com.bonus.system.api.domain.SysUser">
SELECT distinct
SELECT DISTINCT
su.user_id,
su.user_name,
su.phone,
su.`password`,
IF(applied_face is null,1,su.is_face) as isFace,
pd.org_id,
IF(pd.org_id IS NOT NULL, 1, 0) isPd,
IF
( applied_face IS NULL, 1, su.is_face ) AS isFace,
suo.org_id,
IF
( pd.user_id IS NOT NULL, 1, 0 ) isPd,
su.update_time,
su.open_id
FROM sys_user su
FROM
sys_user su
LEFT JOIN sys_user_org suo ON suo.user_id = su.user_id
AND suo.is_active = 1
LEFT JOIN (
SELECT gp.user_id,gp.org_id
FROM att_group g
LEFT JOIN att_group_person_relation gp on g.id = gp.group_id
WHERE g.is_active = 1 and g.att_type = 2
SELECT
gp.user_id
FROM
att_group g
LEFT JOIN att_group_person_relation gp ON g.id = gp.group_id
WHERE
g.is_active = 1
AND g.att_type = 2
) pd ON pd.user_id = su.user_id
LEFT JOIN sys_user_face sw ON sw.user_id = su.user_id
WHERE is_active = '1'
GROUP BY user_id
WHERE
su.is_active = '1'
GROUP BY
user_id
</select>
<select id="getWebFaceList" resultType="com.bonus.system.att.entity.AttFaceBean">
@ -146,20 +157,17 @@
</select>
<select id="getOrgInfoByUserId" resultType="com.bonus.system.basic.domain.SysOrg">
SELECT
distinct
SELECT DISTINCT
user_id,
org_id AS id,
org_name,
att_range,
so.lon,
so.lat
FROM att_group_person_relation ag
LEFT JOIN sys_organization so ON so.id = ag.org_id
LEFT JOIN att_group_setting agt on agt.group_id = ag.group_id and agt.is_active = '1'
org_name
FROM
sys_user_org suo
LEFT JOIN sys_organization so ON so.id = suo.org_id
AND so.is_active = '1'
WHERE ag.user_id = #{userId}
limit 1
WHERE
suo.user_id = #{userId}
LIMIT 1
</select>
<select id="getWebLeaveList" resultType="com.bonus.system.evection.entity.EvectionBean">
SELECT
@ -172,7 +180,7 @@
SELECT
distinct
ag.user_id,
ag.org_id AS id,
suo.org_id AS id,
so.org_name,
agt.att_range,
so.lon,
@ -180,12 +188,14 @@
su.id_number
FROM
att_group_person_relation ag
LEFT JOIN sys_organization so ON so.id = ag.org_id AND so.is_active = '1'
LEFT JOIN att_group_setting agt on agt.group_id = ag.group_id and agt.is_active = '1'
LEFT JOIN sys_user su ON su.user_id = ag.user_id AND su.is_active = '1'
LEFT JOIN sys_user_org suo ON suo.user_id = su.user_id and suo.is_active = '1'
LEFT JOIN sys_organization so ON so.id = suo.org_id AND so.is_active = '1'
LEFT JOIN att_group_setting agt on agt.group_id = ag.group_id and agt.is_active = '1'
WHERE
su.user_name = #{userName}
limit 1
LIMIT 1
</select>
<select id="getProOrgToQsy" resultType="com.bonus.system.index.entity.MapBean">
SELECT