parent
e27f26b9d8
commit
6cb067babd
|
|
@ -102,6 +102,70 @@ public class MultiSheetExcelExporter {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 转为异常排名导出重载的方法,设置列合并
|
||||
* @param sheet
|
||||
* @param dataList
|
||||
* @param headers
|
||||
* @param orgCounts
|
||||
* @param userCounts
|
||||
*/
|
||||
public void addDataRows(Sheet sheet, List<Map<String, Object>> dataList, List<String> headers,List<Integer> orgCounts, List<Integer> userCounts) {
|
||||
|
||||
// 创建一个样式对象
|
||||
//设置这两列为上下居中
|
||||
CellStyle cellStyle = workbook.createCellStyle();
|
||||
// 设置上下居中
|
||||
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
|
||||
cellStyle.setAlignment(HorizontalAlignment.CENTER); // 可选:设置水平居中
|
||||
|
||||
for (Map<String, Object> rowData : dataList) {
|
||||
Row row = sheet.createRow(currentRowNum++);
|
||||
for (int i = 0; i < headers.size(); i++) {
|
||||
String header = headers.get(i);
|
||||
Cell cell = row.createCell(i);
|
||||
Object value = rowData.get(header);
|
||||
if (value != null) {
|
||||
if (value instanceof Date) {
|
||||
cell.setCellValue(dateFormat.format((Date) value));
|
||||
} else if (value instanceof String) {
|
||||
cell.setCellValue((String) value);
|
||||
} else if (value instanceof Number) {
|
||||
cell.setCellValue(((Number) value).doubleValue());
|
||||
} else if (value instanceof Boolean) {
|
||||
cell.setCellValue((Boolean) value);
|
||||
} else {
|
||||
cell.setCellValue(value.toString());
|
||||
}
|
||||
}
|
||||
cell.setCellStyle(cellStyle);
|
||||
}
|
||||
}
|
||||
//设置数据合并
|
||||
|
||||
int startRow = 2;
|
||||
for (int i = 0; i < orgCounts.size(); i++) {
|
||||
int orgCount = orgCounts.get(i);
|
||||
int endRow = startRow + orgCount - 1;
|
||||
if(endRow-startRow>0){
|
||||
sheet.addMergedRegion(new CellRangeAddress(startRow, endRow, 1, 1));
|
||||
}
|
||||
startRow = endRow + 1;
|
||||
}
|
||||
|
||||
startRow = 2;
|
||||
for (int i = 0; i < userCounts.size(); i++) {
|
||||
int userCount = userCounts.get(i);
|
||||
int endRow = startRow + userCount - 1;
|
||||
if(endRow-startRow>0){
|
||||
sheet.addMergedRegion(new CellRangeAddress(startRow, endRow, 2, 2));
|
||||
}
|
||||
startRow = endRow + 1;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
public void exportToResponse(HttpServletResponse response, String fileName) throws IOException {
|
||||
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
|
||||
response.setCharacterEncoding("UTF-8");
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ import java.time.YearMonth;
|
|||
import java.time.format.DateTimeFormatter;
|
||||
import java.time.format.DateTimeParseException;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 月异常报表
|
||||
|
|
@ -204,16 +205,15 @@ public class AttDetailByMonthController extends BaseController {
|
|||
headers.put("8", "出入异常");
|
||||
headers.put("9", "打卡地异常");
|
||||
headers.put("99", "工作外出");
|
||||
Map<String, String> attStatus = getStringStringMap();
|
||||
Map<Long, String> attStatus = getStringStringMap();
|
||||
if (StringHelper.isNotEmpty(bean.getStartMonth()) && StringHelper.isNotEmpty(bean.getEndMonth())) {
|
||||
// List<String> monthFirstAndLast = getMonthFirstAndLast(bean.getAttCurrentMonth());
|
||||
List<String> monthFirstAndLast = DateTimeHelper.getMonthStartAndEndDay(bean.getStartMonth(),bean.getEndMonth());
|
||||
AttDetailBean dayTable = new AttDetailBean();
|
||||
dayTable.setStartDate(monthFirstAndLast.get(0));
|
||||
dayTable.setEndDate(monthFirstAndLast.get(1));
|
||||
dayTable.setName(bean.getName());
|
||||
if (bean.getOrgId() != null) {
|
||||
dayTable.setOrgId(String.valueOf(bean.getOrgId()));
|
||||
dayTable.setOrgId(Long.valueOf(bean.getOrgId()));
|
||||
} else {
|
||||
//受限于当前登录人
|
||||
if (bean.getOrgList() != null && !bean.getOrgList().isEmpty()) {
|
||||
|
|
@ -321,29 +321,10 @@ public class AttDetailByMonthController extends BaseController {
|
|||
return months;
|
||||
}
|
||||
|
||||
private Map<String, String> getStringStringMap() {
|
||||
Map<String, String> attStatus = new HashMap<>();
|
||||
attStatus.put("1", "正常");
|
||||
attStatus.put("2", "迟到");
|
||||
attStatus.put("3", "旷工");
|
||||
attStatus.put("4", "早退");
|
||||
attStatus.put("5", "轮休");
|
||||
attStatus.put("6", "请假");
|
||||
attStatus.put("7", "外出");
|
||||
attStatus.put("8", "出入异常");
|
||||
attStatus.put("9", "打卡地异常");
|
||||
attStatus.put("10", "出差");
|
||||
attStatus.put("11", "法定节假日");
|
||||
attStatus.put("12", "年休假");
|
||||
attStatus.put("13", "探亲假");
|
||||
attStatus.put("14", "事假");
|
||||
attStatus.put("15", "病假");
|
||||
attStatus.put("16", "产假");
|
||||
attStatus.put("17", "婚假");
|
||||
attStatus.put("18", "丧假");
|
||||
attStatus.put("19", "育儿假");
|
||||
attStatus.put("20", "陪护假");
|
||||
return attStatus;
|
||||
private Map<Long, String> getStringStringMap() {
|
||||
List<MapVo> arrayList = attendanceDetailsService.getAttStatusList();
|
||||
return arrayList.stream()
|
||||
.collect(Collectors.toMap(MapVo::getId, MapVo::getName, (existing, replacement) -> existing));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ public class AttDetailBean {
|
|||
/**
|
||||
* 部门编号
|
||||
*/
|
||||
private String orgId;
|
||||
private Long orgId;
|
||||
|
||||
|
||||
/**
|
||||
|
|
@ -123,4 +123,15 @@ public class AttDetailBean {
|
|||
* 自己项目部所在分公司下的所有项目部id
|
||||
*/
|
||||
private List<String> orgIdList;
|
||||
|
||||
/**
|
||||
* 部门排名
|
||||
*/
|
||||
private Integer orgRanking;
|
||||
|
||||
/**
|
||||
* 用户排名
|
||||
*/
|
||||
private Integer userRanking;
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -139,10 +139,14 @@ public class AttCalServiceImpl implements AttCalService {
|
|||
}
|
||||
});
|
||||
// 插入剩余的元素
|
||||
attSourceDataDao.updateAttStatusData(list);
|
||||
if(!list.isEmpty()){
|
||||
attSourceDataDao.updateAttStatusData(list);
|
||||
}
|
||||
} else if ("2".equals(c.getAttType())) {
|
||||
//自由打卡
|
||||
attSourceDataDao.updateAttStatusData(list);
|
||||
if(!list.isEmpty()){
|
||||
attSourceDataDao.updateAttStatusData(list);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
@ -289,7 +293,9 @@ public class AttCalServiceImpl implements AttCalService {
|
|||
public void updateMonthReportData(String pushDate) {
|
||||
List<AttMonthReportBean> monthReportList = attSourceDataDao.selectAttMonthReport(pushDate);
|
||||
//月报表修改
|
||||
attSourceDataDao.updateAttMonthReport(monthReportList);
|
||||
if(!monthReportList.isEmpty()){
|
||||
attSourceDataDao.updateAttMonthReport(monthReportList);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -299,7 +305,7 @@ public class AttCalServiceImpl implements AttCalService {
|
|||
*/
|
||||
@Override
|
||||
public int getMonthReportTempData(String userId, String nowDate) {
|
||||
return attSourceDataDao.getMonthReportTempDataIsExist( userId, nowDate);
|
||||
return attSourceDataDao.getMonthReportTempDataIsExist(userId, nowDate);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -310,7 +316,7 @@ public class AttCalServiceImpl implements AttCalService {
|
|||
*/
|
||||
@Override
|
||||
public List<AttGroupBean> getAttSettingHistoryByUserAndDate(String userId, String nowDate) {
|
||||
return attSourceDataDao.getAttSettingHistoryByUserAndDate( userId, nowDate);
|
||||
return attSourceDataDao.getAttSettingHistoryByUserAndDate(userId, nowDate);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -337,7 +343,10 @@ public class AttCalServiceImpl implements AttCalService {
|
|||
|
||||
@Override
|
||||
public void insertMonthHalfReportTempData(List<AttMonthReportBean> list) {
|
||||
attSourceDataDao.insertAttMonthReportTemp(list);
|
||||
if(!list.isEmpty()){
|
||||
attSourceDataDao.insertAttMonthReportTemp(list);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -362,7 +371,9 @@ public class AttCalServiceImpl implements AttCalService {
|
|||
List<AttDataBean> listPerson = attSourceDataDao.getAttPerson(pushDate);
|
||||
if (pushType == 1) {
|
||||
//只会在凌晨执行一次
|
||||
attSourceDataDao.insertAttDataList(listPerson);
|
||||
if(!listPerson.isEmpty()) {
|
||||
attSourceDataDao.insertAttDataList(listPerson);
|
||||
}
|
||||
} else if (pushType == 2) {
|
||||
//1.查询出历史当天已插入模版
|
||||
//2.查询出历史当天考勤列表
|
||||
|
|
|
|||
|
|
@ -55,8 +55,7 @@ public class WechatTasks {
|
|||
/**
|
||||
* 人员基础数据同步定时器
|
||||
*/
|
||||
// @Scheduled(cron = "0 0/10 * * * ?")
|
||||
@Scheduled(initialDelay = 60000, fixedDelay = 60000 * 30)
|
||||
@Scheduled(initialDelay = 60000, fixedDelay = 60000 * 10)
|
||||
@Async
|
||||
public void pushPersonTask() {
|
||||
log.info("--------人员基础数据同步定时器开启------");
|
||||
|
|
@ -84,7 +83,7 @@ public class WechatTasks {
|
|||
/**
|
||||
* 休假出差数据同步定时器
|
||||
*/
|
||||
// @Scheduled(initialDelay = 600 * 2, fixedDelay = 60000 * 30)
|
||||
@Scheduled(initialDelay = 60000 * 6, fixedDelay = 60000 * 10)
|
||||
@Async
|
||||
public void leaveTask() {
|
||||
log.info("--------休假出差数据定时器开启------");
|
||||
|
|
@ -169,7 +168,7 @@ public class WechatTasks {
|
|||
/**
|
||||
* 考勤数据同步定时器
|
||||
*/
|
||||
@Scheduled(initialDelay = 6000 * 3, fixedDelay = 60000 * 30)
|
||||
@Scheduled(initialDelay = 60000 * 12, fixedDelay = 60000 * 10)
|
||||
@Async
|
||||
public void wechatAttTask() {
|
||||
log.info("--------考勤数据定时器开启------");
|
||||
|
|
@ -405,8 +404,8 @@ public class WechatTasks {
|
|||
MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
|
||||
RequestBody body = null;
|
||||
try {
|
||||
body = RequestBody.create(mediaType, "username=15240004260wechat&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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -369,8 +369,10 @@ public class SysUserController extends BaseController {
|
|||
if(!"1".equals(bean.getIsCheck())){
|
||||
//没通过重新授权一下
|
||||
bean.setIsFace("1");
|
||||
wechatTasks.updateWechatIsFace(bean);
|
||||
}else {
|
||||
bean.setIsFace("0");
|
||||
}
|
||||
wechatTasks.updateWechatIsFace(bean);
|
||||
return toAjax(userService.checkPersonAssignment(bean));
|
||||
}catch (Exception e){
|
||||
logger.error(e.toString(),e);
|
||||
|
|
|
|||
|
|
@ -623,28 +623,6 @@ public class ExportFileController {
|
|||
}
|
||||
|
||||
private Map<Long, String> getStringStringMap() {
|
||||
// Map<String, String> attStatus = new HashMap<>();
|
||||
//
|
||||
// attStatus.put("1", "正常");
|
||||
// attStatus.put("2", "迟到");
|
||||
// attStatus.put("3", "旷工");
|
||||
// attStatus.put("4", "早退");
|
||||
// attStatus.put("5", "轮休");
|
||||
// attStatus.put("6", "请假");
|
||||
// attStatus.put("7", "外出");
|
||||
// attStatus.put("8", "出入异常");
|
||||
// attStatus.put("9", "打卡地异常");
|
||||
// attStatus.put("10", "出差");
|
||||
// attStatus.put("11", "法定节假日");
|
||||
// attStatus.put("12", "年休假");
|
||||
// attStatus.put("13", "探亲假");
|
||||
// attStatus.put("14", "事假");
|
||||
// attStatus.put("15", "病假");
|
||||
// attStatus.put("16", "产假");
|
||||
// attStatus.put("17", "婚假");
|
||||
// attStatus.put("18", "丧假");
|
||||
// attStatus.put("19", "育儿假");
|
||||
// attStatus.put("20", "陪护假");
|
||||
List<MapVo> arrayList = attendanceDetailsService.getAttStatusList();
|
||||
return arrayList.stream()
|
||||
.collect(Collectors.toMap(MapVo::getId, MapVo::getName, (existing, replacement) -> existing));
|
||||
|
|
@ -739,7 +717,7 @@ public class ExportFileController {
|
|||
dayTable.setEndDate(monthFirstAndLast.get(1));
|
||||
dayTable.setName(bean.getUserName());
|
||||
if (bean.getOrgId() != null) {
|
||||
dayTable.setOrgId(String.valueOf(bean.getOrgId()));
|
||||
dayTable.setOrgId(bean.getOrgId());
|
||||
}else{
|
||||
//受限于当前登录人
|
||||
if(bean.getOrgList() != null && !bean.getOrgList().isEmpty()){
|
||||
|
|
@ -1316,5 +1294,271 @@ public class ExportFileController {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 异常排名导出
|
||||
*
|
||||
* @param response
|
||||
* @param bean
|
||||
* @return void
|
||||
* @author:fly
|
||||
* @date:2025-02-25
|
||||
*/
|
||||
@GetMapping("/exportAbnormalRanking")
|
||||
public void exportAbnormalRanking(HttpServletResponse response, AttDataDetailsBean bean) {
|
||||
try {
|
||||
SysUser sysUser = SecurityUtils.getLoginUser().getSysUser();
|
||||
List<String> roleId = sysUser.getRoleList();
|
||||
//管理员与人资角色可以看到所有
|
||||
if (roleId != null && !roleId.isEmpty()) {
|
||||
if (Collections.frequency(roleId, "1") == 0 && Collections.frequency(roleId, "16") == 0) {
|
||||
// 根据用户id查询是否是管理员或帮忙负责人
|
||||
Long userId = SecurityUtils.getUserId();
|
||||
List<MapVo> orgList = sysOrgDao.getOrgIdList(userId);
|
||||
if (!orgList.isEmpty()) {
|
||||
// 使用 LinkedHashSet 来保证顺序并自动去重
|
||||
Set<String> idsSet = new LinkedHashSet<>();
|
||||
for (MapVo mapVo : orgList) {
|
||||
String id = proDeptRoleDao.getOrgChildById(mapVo.getId());
|
||||
if (id != null && !id.trim().isEmpty()) { // 防止空或仅含空白字符的字符串
|
||||
// 将分割后的数组添加到 Set 中,自动去重
|
||||
Collections.addAll(idsSet, id.split(","));
|
||||
}
|
||||
}
|
||||
// 如果需要转换回 List 类型
|
||||
List<String> uniqueIds = new ArrayList<>(idsSet);
|
||||
bean.setOrgList(uniqueIds);
|
||||
}else{
|
||||
bean.setUserId(userId);
|
||||
}
|
||||
}
|
||||
}
|
||||
MultiSheetExcelExporter exporter = new MultiSheetExcelExporter();
|
||||
//将表格时间区间取出来做标题
|
||||
String title = bean.getStartDate() + " ~ " + bean.getEndDate();
|
||||
//详情的数据导出
|
||||
Map<String, String> headers = new HashMap<>();
|
||||
headers.put("2", "迟到详情");
|
||||
headers.put("3", "旷工详情");
|
||||
headers.put("4", "早退详情");
|
||||
headers.put("5", "轮休详情");
|
||||
headers.put("6", "请假详情");
|
||||
headers.put("9", "打卡地异常");
|
||||
headers.put("99", "工作外出");
|
||||
Map<Long, String> attStatus = getStringStringMap();
|
||||
if (StringHelper.isNotEmpty(bean.getStartDate()) && StringHelper.isNotEmpty(bean.getEndDate())) {
|
||||
AttDetailBean dayTable = new AttDetailBean();
|
||||
dayTable.setStartDate(bean.getStartDate());
|
||||
dayTable.setEndDate(bean.getEndDate());
|
||||
dayTable.setName(bean.getUserName());
|
||||
if (bean.getOrgId() != null) {
|
||||
dayTable.setOrgId(bean.getOrgId());
|
||||
}else{
|
||||
//受限于当前登录人
|
||||
if(bean.getOrgList() != null && !bean.getOrgList().isEmpty()){
|
||||
dayTable.setOrgList(bean.getOrgList());
|
||||
}
|
||||
}
|
||||
headers.entrySet()
|
||||
.forEach(entry -> {
|
||||
if ("99".equals(entry.getKey())) {
|
||||
AttDataDetailsBean att = new AttDataDetailsBean();
|
||||
att.setStartDate(bean.getStartDate());
|
||||
att.setEndDate(bean.getEndDate());
|
||||
if (bean.getOrgId() != null) {
|
||||
att.setOrgId(bean.getOrgId());
|
||||
}else{
|
||||
//受限于当前登录人
|
||||
if(bean.getOrgList() != null && !bean.getOrgList().isEmpty()){
|
||||
att.setOrgList(bean.getOrgList());
|
||||
}
|
||||
}
|
||||
att.setUserName(bean.getUserName());
|
||||
//存在人员换组织情况,先查人再去查工作外出
|
||||
List<AttDataDetailsBean> listOut = attendanceDetailsService.getOrgUserOutCountList(att);
|
||||
//为了方便,将数据转换一下
|
||||
List<AttDetailBean> list = listOut.stream()
|
||||
.map(data -> {
|
||||
AttDetailBean detail = new AttDetailBean();
|
||||
detail.setOrgId(data.getOrgId());
|
||||
detail.setUserId(data.getUserId());
|
||||
detail.setOrgName(data.getOrgName());
|
||||
detail.setName(data.getUserName());
|
||||
detail.setAttCurrent(data.getAttCurrentDay());
|
||||
detail.setGoWorkTime(data.getAttCurrentTime());
|
||||
detail.setGoWorkAddress(data.getAttAddress());
|
||||
// 其他字段可以根据需要设置
|
||||
return detail;
|
||||
})
|
||||
.collect(Collectors.toList());
|
||||
Sheet departmentSheet2 = exporter.createSheet(entry.getValue());
|
||||
List<String> departmentHeaders2 = Arrays.asList("序号", "部门排名", "部门内人员排名", "考勤日期", "姓名", "所属部门", "打卡时间", "打卡地址");
|
||||
exporter.addHeaderRowAndTitle(departmentSheet2, departmentHeaders2, title);
|
||||
List<Map<String, Object>> departmentData2 = new ArrayList<>();
|
||||
//计算排名
|
||||
List<Integer> orgCounts = new ArrayList<>();
|
||||
List<Integer> userCounts = new ArrayList<>();
|
||||
processAttendance(list,orgCounts,userCounts);
|
||||
for (int i = 0; i < list.size(); i++) {
|
||||
Map<String, Object> map = new LinkedHashMap<>();
|
||||
map.put("序号", i + 1);
|
||||
map.put("部门排名", list.get(i).getOrgRanking());
|
||||
map.put("部门内人员排名", list.get(i).getUserRanking());
|
||||
map.put("考勤日期", list.get(i).getAttCurrent());
|
||||
map.put("姓名", list.get(i).getName());
|
||||
map.put("所属部门", list.get(i).getOrgName());
|
||||
map.put("打卡时间", list.get(i).getGoWorkTime());
|
||||
map.put("打卡地址", list.get(i).getGoWorkAddress());
|
||||
departmentData2.add(map);
|
||||
}
|
||||
exporter.addDataRows(departmentSheet2, departmentData2, departmentHeaders2,orgCounts,userCounts);
|
||||
} else {
|
||||
dayTable.setAttStatis(Integer.parseInt(entry.getKey()));
|
||||
List<AttDetailBean> list = attDetailByMonthService.getDetailList(dayTable);
|
||||
Sheet departmentSheet2 = exporter.createSheet(entry.getValue());
|
||||
List<String> departmentHeaders2 = Arrays.asList("序号", "部门排名", "部门内人员排名", "考勤日期", "姓名", "所属部门", "上班打卡时间", "上班状态", "上班打卡地址", "下班打卡时间", "下班状态", "下班打卡地址");
|
||||
exporter.addHeaderRowAndTitle(departmentSheet2, departmentHeaders2, title);
|
||||
List<Map<String, Object>> departmentData2 = new ArrayList<>();
|
||||
//对数据进行排名处理
|
||||
List<Integer> orgCounts = new ArrayList<>();
|
||||
List<Integer> userCounts = new ArrayList<>();
|
||||
processAttendance(list,orgCounts,userCounts);
|
||||
for (int i = 0; i < list.size(); i++) {
|
||||
Map<String, Object> map = new LinkedHashMap<>();
|
||||
map.put("序号", i + 1);
|
||||
map.put("部门排名", list.get(i).getOrgRanking());
|
||||
map.put("部门内人员排名", list.get(i).getUserRanking());
|
||||
map.put("考勤日期", list.get(i).getAttCurrent());
|
||||
map.put("姓名", list.get(i).getName());
|
||||
map.put("所属部门", list.get(i).getOrgName());
|
||||
map.put("上班打卡时间", list.get(i).getGoWorkTime());
|
||||
map.put("上班状态", attStatus.get(Long.parseLong(String.valueOf(list.get(i).getGoWorkStatus()))));
|
||||
map.put("上班打卡地址", list.get(i).getGoWorkAddress());
|
||||
map.put("下班打卡时间", list.get(i).getOffWorkTime());
|
||||
map.put("下班状态", attStatus.get(Long.parseLong(String.valueOf(list.get(i).getOffWorkStatus()))));
|
||||
map.put("下班打卡地址", list.get(i).getOffWorkAddress());
|
||||
departmentData2.add(map);
|
||||
}
|
||||
exporter.addDataRows(departmentSheet2, departmentData2, departmentHeaders2,orgCounts,userCounts);
|
||||
}
|
||||
});
|
||||
// 导出Excel文件
|
||||
exporter.exportToResponse(response, "月报表导出");
|
||||
}
|
||||
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算出部门排名和人员排名
|
||||
* @param list
|
||||
*/
|
||||
public void processAttendance(List<AttDetailBean> list, List<Integer> orgCounts, List<Integer> userCounts) {
|
||||
// 过滤掉考勤日期、部门编号和人编号为null的记录
|
||||
List<AttDetailBean> validList = list.stream()
|
||||
.filter(bean -> bean.getAttCurrent() != null && bean.getOrgId() != null && bean.getUserId() != null)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
// 统计部门出现次数
|
||||
Map<Long, Long> orgCount = validList.stream()
|
||||
.collect(Collectors.groupingBy(AttDetailBean::getOrgId, Collectors.counting()));
|
||||
|
||||
// 统计用户在部门内出现次数
|
||||
Map<Long, Map<Long, Long>> userCount = validList.stream()
|
||||
.collect(Collectors.groupingBy(AttDetailBean::getOrgId,
|
||||
Collectors.groupingBy(AttDetailBean::getUserId, Collectors.counting())));
|
||||
|
||||
// 为部门排名
|
||||
Map<Long, Integer> orgRanking = new HashMap<>();
|
||||
List<Map.Entry<Long, Long>> sortedOrgs = orgCount.entrySet().stream()
|
||||
.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
for (int i = 0; i < sortedOrgs.size(); i++) {
|
||||
orgRanking.put(sortedOrgs.get(i).getKey(), i + 1);
|
||||
}
|
||||
|
||||
// 为用户排名
|
||||
for (Map.Entry<Long, Map<Long, Long>> entry : userCount.entrySet()) {
|
||||
List<Map.Entry<Long, Long>> sortedUsers = entry.getValue().entrySet().stream()
|
||||
.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
for (int i = 0; i < sortedUsers.size(); i++) {
|
||||
Long orgId = entry.getKey();
|
||||
Long userId = sortedUsers.get(i).getKey();
|
||||
int finalI = i;
|
||||
validList.stream()
|
||||
.filter(bean -> bean.getOrgId().equals(orgId) && bean.getUserId().equals(userId))
|
||||
.forEach(bean -> bean.setUserRanking(finalI + 1));
|
||||
}
|
||||
}
|
||||
|
||||
// 设置部门排名
|
||||
validList.forEach(bean -> bean.setOrgRanking(orgRanking.get(bean.getOrgId())));
|
||||
|
||||
// 将有效记录和无效记录合并
|
||||
List<AttDetailBean> invalidList = list.stream()
|
||||
.filter(bean -> bean.getAttCurrent() == null || bean.getOrgId() == null || bean.getUserId() == null)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
// 排序有效记录
|
||||
validList.sort(Comparator.comparingInt(AttDetailBean::getOrgRanking)
|
||||
.thenComparingInt(AttDetailBean::getUserRanking)
|
||||
.thenComparing(AttDetailBean::getAttCurrent, Comparator.reverseOrder()));
|
||||
|
||||
// 合并有效和无效记录
|
||||
validList.addAll(invalidList);
|
||||
// 更新原始列表
|
||||
list.clear();
|
||||
list.addAll(validList);
|
||||
|
||||
//为了后续合并单元格,需要记录每个排名的数量
|
||||
int currentOrgRanking = -1;
|
||||
int currentUserRanking = -1;
|
||||
int orgCountNum = 0;
|
||||
int userCountNum = 0;
|
||||
|
||||
Long currentOrgId = null; // 跟踪当前部门ID
|
||||
Long currentUserId = null; // 跟踪当前用户ID
|
||||
|
||||
for (AttDetailBean bean : list) {
|
||||
// 处理 orgRanking
|
||||
if (bean.getOrgRanking() != currentOrgRanking) {
|
||||
if (currentOrgRanking != -1) {
|
||||
orgCounts.add(orgCountNum); // 记录上一个排名的数量
|
||||
}
|
||||
currentOrgRanking = bean.getOrgRanking();
|
||||
orgCountNum = 1; // 重置计数
|
||||
currentOrgId = bean.getOrgId(); // 更新当前部门ID
|
||||
} else {
|
||||
orgCountNum++; // 增加计数
|
||||
}
|
||||
// 处理 userRanking
|
||||
if (bean.getUserRanking() != currentUserRanking || !bean.getOrgId().equals(currentOrgId) || !bean.getUserId().equals(currentUserId)) {
|
||||
if (currentUserRanking != -1) {
|
||||
userCounts.add(userCountNum); // 记录上一个排名的数量
|
||||
}
|
||||
currentUserRanking = bean.getUserRanking();
|
||||
userCountNum = 1; // 重置计数
|
||||
currentOrgId = bean.getOrgId(); // 更新当前部门ID
|
||||
currentUserId = bean.getUserId(); // 更新当前用户ID
|
||||
} else {
|
||||
userCountNum++; // 增加计数
|
||||
}
|
||||
}
|
||||
// 记录最后一个排名的数量
|
||||
if (orgCountNum > 0) {
|
||||
orgCounts.add(orgCountNum);
|
||||
}
|
||||
if (userCountNum > 0) {
|
||||
userCounts.add(userCountNum);
|
||||
}
|
||||
// 输出结果
|
||||
System.out.println("Org Ranking Counts: " + orgCounts);
|
||||
System.out.println("User Ranking Counts: " + userCounts);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -486,7 +486,9 @@
|
|||
|
||||
<select id="getOrgUserOutCountList" resultType="com.bonus.system.att.entity.AttDataDetailsBean">
|
||||
SELECT
|
||||
suo.user_id,
|
||||
awa.user_name,
|
||||
so.id as org_id,
|
||||
so.org_name,
|
||||
awa.att_current_day,
|
||||
awa.att_current_time,
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@
|
|||
|
||||
<insert id="pushAttDataToQsy">
|
||||
<foreach collection="list" item="item" separator=";">
|
||||
replace INTO gz_cloud.fc_sup_attendance (
|
||||
replace INTO gz_cloud_test.fc_sup_attendance (
|
||||
name,
|
||||
id_number,
|
||||
org_id,
|
||||
|
|
@ -202,7 +202,7 @@
|
|||
If(PROJECT_ID is null,0,PROJECT_ID) AS proId,
|
||||
If(ORG_ID is null,0,ORG_ID) AS orgId
|
||||
FROM
|
||||
gz_cloud.bm_sup_attend_history
|
||||
gz_cloud_test.bm_sup_attend_history
|
||||
WHERE
|
||||
ID_NUMBER = #{idNumber}
|
||||
limit 1
|
||||
|
|
|
|||
Loading…
Reference in New Issue