考勤汇总报表 二开暂存

This commit is contained in:
dxfeng 2025-07-07 11:10:16 +08:00
parent fe2d0322dd
commit 3f9fd19504
11 changed files with 438 additions and 4 deletions

View File

@ -49,8 +49,8 @@ public class AttendanceSchedulingController {
}
@PostMapping("/createSummaryApprovalFlow")
private WeaResult<WfcRequestOperationResultDto> createSummaryApprovalFlow(@RequestBody Map<String, String> params) throws UnsupportedEncodingException {
return attendanceSchedulingService.createSummaryApprovalFlow(params);
private WeaResult<WfcRequestOperationResultDto> createSummaryApprovalFlow(@RequestHeader Map<String, String> header,@RequestBody Map<String, String> params) throws UnsupportedEncodingException {
return attendanceSchedulingService.createSummaryApprovalFlow(header,params);
}
@PostMapping("/updateAttendStatus")

View File

@ -0,0 +1,14 @@
package com.weaver.seconddev.attend.entity.po;
import lombok.Data;
/**
* @author:dxfeng
* @createTime: 2025/06/24
* @version: 1.0
*/
@Data
public class ShiftStatistics {
private String id;
private String name;
}

View File

@ -0,0 +1,22 @@
package com.weaver.seconddev.attend.hook;
import com.weaver.loom.api.enums.WeaHookModuleInfo;
import com.weaver.loom.context.annotation.WeaHook;
import com.weaver.loom.context.annotation.WeaHookDef;
/**
* @author:dxfeng
* @createTime: 2025/06/25
* @version: 1.0
*/
@WeaHookDef(moduleInfo = WeaHookModuleInfo.ATTEND)
public class AttendSecHookEvent {
@WeaHook(code = "ATTEND_CUSTOM_HOOK_001",owner = "attend",desc = "ATTEND_CUSTOM_HOOK_001" ,descLabelId = 0L)
private final static String ATTEND_CUSTOM_HOOK_001 = "ATTEND_CUSTOM_HOOK_001";
@WeaHook(code = "ATTEND_CUSTOM_HOOK_002",owner = "attend",desc = "ATTEND_CUSTOM_HOOK_002" ,descLabelId = 0L)
private final static String ATTEND_CUSTOM_HOOK_002 = "ATTEND_CUSTOM_HOOK_002";
@WeaHook(code = "ATTEND_CUSTOM_HOOK_003",owner = "attend",desc = "ATTEND_CUSTOM_HOOK_003" ,descLabelId = 0L)
private final static String ATTEND_CUSTOM_HOOK_003 = "ATTEND_CUSTOM_HOOK_003";
@WeaHook(code = "ATTEND_CUSTOM_HOOK_004",owner = "attend",desc = "ATTEND_CUSTOM_HOOK_004" ,descLabelId = 0L)
private final static String ATTEND_CUSTOM_HOOK_004 = "ATTEND_CUSTOM_HOOK_004";
}

View File

@ -0,0 +1,19 @@
package com.weaver.seconddev.attend.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.weaver.seconddev.attend.entity.po.ShiftStatistics;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* @author:dxfeng
* @createTime: 2025/06/24
* @version: 1.0
*/
@Mapper
public interface ShiftStatisticMapper extends BaseMapper<ShiftStatistics> {
ShiftStatistics getShiftStatistics(@Param("tenantKey") String tenantKey,@Param("targetId") Long targetId,@Param("attendDate") String attendDate);
}

View File

@ -28,7 +28,7 @@ public interface AttendanceSchedulingService {
String saveSheet(Map<String, String> header,Map<String, Object> body);
WeaResult<WfcRequestOperationResultDto> createSummaryApprovalFlow(Map<String, String> params) throws UnsupportedEncodingException;
WeaResult<WfcRequestOperationResultDto> createSummaryApprovalFlow(Map<String, String> header,Map<String, String> params) throws UnsupportedEncodingException;

View File

@ -15,6 +15,7 @@ import com.weaver.common.form.dto.data.FormDataDtoParam;
import com.weaver.common.form.dto.data.FormDataOptionDto;
import com.weaver.common.form.metadata.ModuleSource;
import com.weaver.common.hrm.dao.HrmCommonEmployeeDao;
import com.weaver.datasecurity.util.DateUtil;
import com.weaver.framework.rpc.annotation.RpcReference;
import com.weaver.seconddev.attend.entity.param.SummaryApprovalParam;
import com.weaver.seconddev.attend.entity.po.SchedulingStatusPo;
@ -505,11 +506,20 @@ public class AttendanceSchedulingServiceImpl implements AttendanceSchedulingServ
}
@Override
public WeaResult<WfcRequestOperationResultDto> createSummaryApprovalFlow(Map<String, String> params) throws UnsupportedEncodingException {
public WeaResult<WfcRequestOperationResultDto> createSummaryApprovalFlow(Map<String, String> header, Map<String, String> params) throws UnsupportedEncodingException {
String workflowId = params.get("workflowId");
String formId = params.get("formId");
String detailData = params.get("detailData");
String month = params.get("month");
// 该月份的最后一天
String firstDayOfMonth = month + "-01";
String lastDayOfMonth = DateUtil.getLastDayOfMonth(firstDayOfMonth);
String origin = header.get("origin");
String realUrl = String.valueOf(params.get("realUrl"));
String url = origin + realUrl;
log.error("url===" + url);
WfcRequestOperateParamDataEntity wfcRequestOperateParamDataEntity = new WfcRequestOperateParamDataEntity();
wfcRequestOperateParamDataEntity.setWorkflowId(Long.parseLong(workflowId));
@ -573,6 +583,42 @@ public class AttendanceSchedulingServiceImpl implements AttendanceSchedulingServ
summaryApprovalParams.add(new SummaryApprovalParam("未签到次数", "wqdcs", 1144950543713460227L, "absenseNumOfMonth"));
summaryApprovalParams.add(new SummaryApprovalParam("未签退次数", "wqtcs", 1144950543713460228L, "unSignOutNumOfMonth"));
summaryApprovalParams.add(new SummaryApprovalParam("未打卡次数", "wdkcs", 1144950818599755777L, "unSignNum"));
//TODO 班次统计
// 每日统计数据
List<SummaryApprovalParam> daysApprovalParams = new ArrayList<>();
daysApprovalParams.add(new SummaryApprovalParam("1", "fhlijij", 1149047126405562370L, "week0"));
daysApprovalParams.add(new SummaryApprovalParam("2", "fm1g5yo", 1149047126405562371L, "week1"));
daysApprovalParams.add(new SummaryApprovalParam("3", "f73udpv", 1149047126405562372L, "week2"));
daysApprovalParams.add(new SummaryApprovalParam("4", "fg0dh8k", 1149047126405562373L, "week3"));
daysApprovalParams.add(new SummaryApprovalParam("5", "fl1tf66", 1149047126405562374L, "week4"));
daysApprovalParams.add(new SummaryApprovalParam("6", "fcmjzu8", 1149047130583089152L, "week5"));
daysApprovalParams.add(new SummaryApprovalParam("7", "f8xfoy5", 1149047130583089153L, "week6"));
daysApprovalParams.add(new SummaryApprovalParam("8", "fsgffnx", 1149047130583089154L, "week7"));
daysApprovalParams.add(new SummaryApprovalParam("9", "f376xdt", 1149047130583089155L, "week8"));
daysApprovalParams.add(new SummaryApprovalParam("10", "fe8big9", 1149047130583089156L, "week9"));
daysApprovalParams.add(new SummaryApprovalParam("11", "fqa461f", 1149047134936776704L, "week10"));
daysApprovalParams.add(new SummaryApprovalParam("12", "frbyuxd", 1149047134936776705L, "week11"));
daysApprovalParams.add(new SummaryApprovalParam("13", "fiomojc", 1149047134936776706L, "week12"));
daysApprovalParams.add(new SummaryApprovalParam("14", "fmtp80q", 1149047134936776707L, "week13"));
daysApprovalParams.add(new SummaryApprovalParam("15", "fuv82an", 1149047134936776708L, "week14"));
daysApprovalParams.add(new SummaryApprovalParam("16", "fowflx1", 1149047199503892481L, "week15"));
daysApprovalParams.add(new SummaryApprovalParam("17", "fvcwt2b", 1149047199503892482L, "week16"));
daysApprovalParams.add(new SummaryApprovalParam("18", "fvfs6t3", 1149047199503892483L, "week17"));
daysApprovalParams.add(new SummaryApprovalParam("19", "f3705rp", 1149047199503892484L, "week18"));
daysApprovalParams.add(new SummaryApprovalParam("20", "fzgrlhe", 1149047199503892485L, "week19"));
daysApprovalParams.add(new SummaryApprovalParam("21", "fnz5psm", 1149047229459611651L, "week20"));
daysApprovalParams.add(new SummaryApprovalParam("22", "f7yp3y9", 1149047229459611652L, "week21"));
daysApprovalParams.add(new SummaryApprovalParam("23", "f5ykr53", 1149047229459611653L, "week22"));
daysApprovalParams.add(new SummaryApprovalParam("24", "fkh3rim", 1149047229459611654L, "week23"));
daysApprovalParams.add(new SummaryApprovalParam("25", "fqqlv6h", 1149047229459611655L, "week24"));
daysApprovalParams.add(new SummaryApprovalParam("26", "flj98m9", 1149047272509947904L, "week25"));
daysApprovalParams.add(new SummaryApprovalParam("27", "fibgwfm", 1149047272509947905L, "week26"));
daysApprovalParams.add(new SummaryApprovalParam("28", "fc2ryya", 1149047272509947906L, "week27"));
daysApprovalParams.add(new SummaryApprovalParam("29", "fwchanv", 1149047272509947907L, "week28"));
daysApprovalParams.add(new SummaryApprovalParam("30", "fvcdy8x", 1149047272509947908L, "week29"));
daysApprovalParams.add(new SummaryApprovalParam("31", "f5c8acn", 1149047276637143040L, "week30"));
//表单字段集合
@ -606,6 +652,59 @@ public class AttendanceSchedulingServiceImpl implements AttendanceSchedulingServ
formDataDetailDtos.add(detailDto);
}
Long empId = detailRow.getLong("empId");
// 处理每日统计数据
// 构建请求参数
JSONObject jsonObject = new JSONObject();
jsonObject.put("beginDate", firstDayOfMonth);
jsonObject.put("endDate", lastDayOfMonth);
jsonObject.put("keyword", "");
jsonObject.put("rules", new ArrayList<>());
jsonObject.put("current", 1);
jsonObject.put("pageSize", 10);
jsonObject.put("resourceType", Collections.singletonList("1"));
jsonObject.put("searchAndOr", "");
jsonObject.put("showAddTime", false);
jsonObject.put("shiftGroup", false);
jsonObject.put("abnormalLength", false);
jsonObject.put("otherParams", new JSONObject());
jsonObject.put("deptScope", new ArrayList<>());
jsonObject.put("resourceScope", new ArrayList<>());
jsonObject.put("rulebrowsers", new ArrayList<>());
Map<Object, Object> resourceMap = new HashMap<>();
resourceMap.put("id", empId.toString());
jsonObject.put("resource", Collections.singletonList(resourceMap));
jsonObject.put("hrmStatus", Arrays.asList("1", "2", "3", "4", "5"));
jsonObject.put("empId", empId);
log.error("jsonObject==" + jsonObject);
String resultStr = HttpRequest.post(url).headerMap(header, true).body(jsonObject.toJSONString()).execute().body();
JSONObject resultObject = JSONObject.parseObject(resultStr);
log.error("resultObject===" + resultObject);
if (resultObject.getBoolean("status") && 200 == resultObject.getIntValue("code")) {
JSONObject data = resultObject.getJSONObject("data");
if (data != null) {
JSONArray datas = data.getJSONArray("datas");
if (datas.size() > 0) {
JSONObject dataObj = datas.getJSONObject(0);
// 遍历每日统计数据
for (SummaryApprovalParam daysApprovalParam : daysApprovalParams) {
String content = dataObj.getString(daysApprovalParam.getRowKey());
if (StringUtils.isBlank(content)) {
// 如果为空,置为null
content = "";
}
FormDataDetailDto detailDto = new FormDataDetailDto();
detailDto.setFieldId(daysApprovalParam.getFieldId());
detailDto.setDataIndex((long) rowNum);
detailDto.setContent(content);
formDataDetailDtos.add(detailDto);
}
}
}
}
log.error("formDataDetailDtos==" + JSON.toJSONString(formDataDetailDtos));
}

View File

@ -0,0 +1,71 @@
package com.weaver.seconddev.attend.summary;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
import com.weaver.loom.context.annotation.WeaHookReg;
import com.weaver.loom.context.domain.AppInfo;
import com.weaver.loom.context.domain.WeaHookRequest;
import com.weaver.loom.context.domain.WeaHookResponse;
import com.weaver.loom.context.register.RegHookEvent;
import com.weaver.seconddev.attend.entity.po.ShiftStatistics;
import com.weaver.seconddev.attend.mapper.ShiftStatisticMapper;
import com.weaver.workflow.common.entity.org.WeaUser;
import com.weaver.workflow.common.util.OrgUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* @author:dxfeng
* @createTime: 2025/06/24
* @version: 1.0
*/
@Slf4j
@WeaHookReg(code = "ATTEND_CUSTOM_HOOK_001", order = 0)
public class AttendCustomHook001 extends RegHookEvent {
@Autowired
ShiftStatisticMapper shiftStatisticMapper;
@Override
public WeaHookResponse handle(WeaHookRequest request, WeaHookResponse response, AppInfo appInfo) {
//入参修改入参并不会影响到埋点的原始数据
Map<String, Object> params = request.getParams();
String attendDate = String.valueOf(params.get("attendDate"));
log.error("ATTEND_CUSTOM_HOOK_001获取入参,params==" + JSON.toJSONString(params));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date newD = new Date(attendDate);
String kqdate = sdf.format(newD);
List empIdsList = (List) params.get("empIds");
Table<Long, Long, Double> result = HashBasedTable.create();
for (int i = 0, n = empIdsList.size(); i < n; i++) {
String id = String.valueOf(empIdsList.get(i));
WeaUser user = OrgUtil.getUser(Long.parseLong(id));
String tenantKey = user.getTenantKey();
log.error("tenantKey==" + tenantKey + ",id==" + id + ",kqdate==" + kqdate + ",attendDate==" + attendDate);
ShiftStatistics shiftStatistics = shiftStatisticMapper.getShiftStatistics(tenantKey, Long.valueOf(id), kqdate);
Double value = 0.0;
log.error("shiftStatistics==" + JSON.toJSONString(shiftStatistics));
if (null != shiftStatistics && "夜班".equals(shiftStatistics.getName())) {
value = 1.0;
}
log.error("value==" + value);
result.put(Long.parseLong(id), Long.parseLong(id), value);
}
response.setResult(result);
return response;
}
@Override
public void rollBack(WeaHookRequest request, WeaHookResponse response, AppInfo appInfo) throws Exception {
log.info("执行事件回滚机制 => {}, {}", DateUtil.now(), appInfo.getAppName());
}
}

View File

@ -0,0 +1,52 @@
package com.weaver.seconddev.attend.summary;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
import com.weaver.loom.context.annotation.WeaHookReg;
import com.weaver.loom.context.domain.AppInfo;
import com.weaver.loom.context.domain.WeaHookRequest;
import com.weaver.loom.context.domain.WeaHookResponse;
import com.weaver.loom.context.register.RegHookEvent;
import com.weaver.seconddev.attend.mapper.ShiftStatisticMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Map;
/**
* @author:dxfeng
* @createTime: 2025/06/24
* @version: 1.0
*/
@Slf4j
@WeaHookReg(code = "ATTEND_CUSTOM_HOOK_002", order = 0)
@Component()
public class AttendCustomHook002 extends RegHookEvent {
@Autowired
ShiftStatisticMapper shiftStatisticMapper;
@Override
public WeaHookResponse handle(WeaHookRequest request, WeaHookResponse response, AppInfo appInfo) throws Exception {
//入参修改入参并不会影响到埋点的原始数据
Map<String, Object> params = request.getParams();
log.error("ATTEND_CUSTOM_HOOK_002获取入参,params==" + JSON.toJSONString(params));
Table<Long, Long, Double> result = HashBasedTable.create();
log.error("result111=="+JSON.toJSONString(result));
result.put(1L, 1L, 1D);
log.error("result222=="+JSON.toJSONString(result));
response.setResult(result);
return response;
}
@Override
public void rollBack(WeaHookRequest request, WeaHookResponse response, AppInfo appInfo) throws Exception {
log.error("执行事件回滚机制 => {}, {}", DateUtil.now(), appInfo.getAppName());
}
}

View File

@ -0,0 +1,70 @@
package com.weaver.seconddev.attend.summary;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
import com.weaver.loom.context.annotation.WeaHookReg;
import com.weaver.loom.context.domain.AppInfo;
import com.weaver.loom.context.domain.WeaHookRequest;
import com.weaver.loom.context.domain.WeaHookResponse;
import com.weaver.loom.context.register.RegHookEvent;
import com.weaver.seconddev.attend.entity.po.ShiftStatistics;
import com.weaver.seconddev.attend.mapper.ShiftStatisticMapper;
import com.weaver.workflow.common.entity.org.WeaUser;
import com.weaver.workflow.common.util.OrgUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* @author:dxfeng
* @createTime: 2025/06/24
* @version: 1.0
*/
@Slf4j
@WeaHookReg(code = "ATTEND_CUSTOM_HOOK_003", order = 0)
public class AttendCustomHook003 extends RegHookEvent {
@Autowired
ShiftStatisticMapper shiftStatisticMapper;
@Override
public WeaHookResponse handle(WeaHookRequest request, WeaHookResponse response, AppInfo appInfo) {
//入参修改入参并不会影响到埋点的原始数据
Map<String, Object> params = request.getParams();
String attendDate = String.valueOf(params.get("attendDate"));
log.error("ATTEND_CUSTOM_HOOK_003获取入参,params==" + JSON.toJSONString(params));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date newD = new Date(attendDate);
String kqdate = sdf.format(newD);
List empIdsList = (List) params.get("empIds");
Table<Long, Long, Double> result = HashBasedTable.create();
for (int i = 0, n = empIdsList.size(); i < n; i++) {
String id = String.valueOf(empIdsList.get(i));
WeaUser user = OrgUtil.getUser(Long.parseLong(id));
String tenantKey = user.getTenantKey();
log.error("tenantKey==" + tenantKey + ",id==" + id + ",kqdate==" + kqdate + ",attendDate==" + attendDate);
ShiftStatistics shiftStatistics = shiftStatisticMapper.getShiftStatistics(tenantKey, Long.valueOf(id), kqdate);
Double value = 0.0;
log.error("shiftStatistics==" + JSON.toJSONString(shiftStatistics));
if (null != shiftStatistics && "大夜".equals(shiftStatistics.getName())) {
value = 1.0;
}
log.error("value==" + value);
result.put(Long.parseLong(id), Long.parseLong(id), value);
}
response.setResult(result);
return response;
}
@Override
public void rollBack(WeaHookRequest request, WeaHookResponse response, AppInfo appInfo) throws Exception {
log.info("执行事件回滚机制 => {}, {}", DateUtil.now(), appInfo.getAppName());
}
}

View File

@ -0,0 +1,70 @@
package com.weaver.seconddev.attend.summary;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
import com.weaver.loom.context.annotation.WeaHookReg;
import com.weaver.loom.context.domain.AppInfo;
import com.weaver.loom.context.domain.WeaHookRequest;
import com.weaver.loom.context.domain.WeaHookResponse;
import com.weaver.loom.context.register.RegHookEvent;
import com.weaver.seconddev.attend.entity.po.ShiftStatistics;
import com.weaver.seconddev.attend.mapper.ShiftStatisticMapper;
import com.weaver.workflow.common.entity.org.WeaUser;
import com.weaver.workflow.common.util.OrgUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* @author:dxfeng
* @createTime: 2025/06/24
* @version: 1.0
*/
@Slf4j
@WeaHookReg(code = "ATTEND_CUSTOM_HOOK_004", order = 0)
public class AttendCustomHook004 extends RegHookEvent {
@Autowired
ShiftStatisticMapper shiftStatisticMapper;
@Override
public WeaHookResponse handle(WeaHookRequest request, WeaHookResponse response, AppInfo appInfo) {
//入参修改入参并不会影响到埋点的原始数据
Map<String, Object> params = request.getParams();
String attendDate = String.valueOf(params.get("attendDate"));
log.error("ATTEND_CUSTOM_HOOK_004获取入参,params==" + JSON.toJSONString(params));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date newD = new Date(attendDate);
String kqdate = sdf.format(newD);
List empIdsList = (List) params.get("empIds");
Table<Long, Long, Double> result = HashBasedTable.create();
for (int i = 0, n = empIdsList.size(); i < n; i++) {
String id = String.valueOf(empIdsList.get(i));
WeaUser user = OrgUtil.getUser(Long.parseLong(id));
String tenantKey = user.getTenantKey();
log.error("tenantKey==" + tenantKey + ",id==" + id + ",kqdate==" + kqdate + ",attendDate==" + attendDate);
ShiftStatistics shiftStatistics = shiftStatisticMapper.getShiftStatistics(tenantKey, Long.valueOf(id), kqdate);
Double value = 0.0;
log.error("shiftStatistics==" + JSON.toJSONString(shiftStatistics));
if (null != shiftStatistics && "中班".equals(shiftStatistics.getName())) {
value = 1.0;
}
log.error("value==" + value);
result.put(Long.parseLong(id), Long.parseLong(id), value);
}
response.setResult(result);
return response;
}
@Override
public void rollBack(WeaHookRequest request, WeaHookResponse response, AppInfo appInfo) throws Exception {
log.info("执行事件回滚机制 => {}, {}", DateUtil.now(), appInfo.getAppName());
}
}

View File

@ -0,0 +1,17 @@
<?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="com.weaver.seconddev.attend.mapper.ShiftStatisticMapper">
<resultMap id="shiftStatisticsMap" type="com.weaver.seconddev.attend.entity.po.ShiftStatistics">
<id column="shift_id" property="id"/>
<id column="name" property="name"/>
</resultMap>
<select id="getShiftStatistics" resultMap="shiftStatisticsMap">
select shift_id,(select name from attend_shift where id = shift_id) as name from attend_scheduling where
range_id = #{targetId} and delete_type = 0 and
TO_CHAR(attend_date,'yyyy-MM-dd') = #{attendDate} and tenant_key = #{tenantKey}
</select>
</mapper>