|
@@ -33,7 +33,8 @@ import java.util.concurrent.ConcurrentHashMap;
|
|
|
* 即前端 submitApprovalProcess 链路失败(startInstance 挂了/静默丢),导致部分员工工时从未进入审批。
|
|
* 即前端 submitApprovalProcess 链路失败(startInstance 挂了/静默丢),导致部分员工工时从未进入审批。
|
|
|
* <p>
|
|
* <p>
|
|
|
* 逻辑完全参考前端 TimeCard 的 submitApprovalProcess:
|
|
* 逻辑完全参考前端 TimeCard 的 submitApprovalProcess:
|
|
|
- * 1. collectApprovalData — 遍历汇总表每天子表,delta = submitted - approved - change, delta>0 才 push;
|
|
|
|
|
|
|
+ * 1. collectApprovalData — 遍历汇总表每天子表,delta = submitted - approved, delta>0 才 push;
|
|
|
|
|
+ * prd 历史变更工时独立核算,不抵扣或放大正常待审批量。
|
|
|
* 普通 PM 按审批人分组,Raymond 兜底按项目拆组
|
|
* 普通 PM 按审批人分组,Raymond 兜底按项目拆组
|
|
|
* 2. processManagerApproval — queryProcess(month + PM + RUNNING) 有同项目可用分片则 update / 无则 create
|
|
* 2. processManagerApproval — queryProcess(month + PM + RUNNING) 有同项目可用分片则 update / 无则 create
|
|
|
* COMPLETED 明细先进入覆盖索引;汇总尚未落值时归回写处理,不重复发起
|
|
* COMPLETED 明细先进入覆盖索引;汇总尚未落值时归回写处理,不重复发起
|
|
@@ -199,7 +200,7 @@ public class ReSubmitApprovalService {
|
|
|
long dayTs; // epoch ms
|
|
long dayTs; // epoch ms
|
|
|
String projectCode;
|
|
String projectCode;
|
|
|
String projectName;
|
|
String projectName;
|
|
|
- double hours; // delta = submitted - approved - change
|
|
|
|
|
|
|
+ double hours; // delta = submitted - approved,历史变更独立核算
|
|
|
String submitterUid;
|
|
String submitterUid;
|
|
|
String monthText; // yyyyMM
|
|
String monthText; // yyyyMM
|
|
|
}
|
|
}
|
|
@@ -278,7 +279,7 @@ public class ReSubmitApprovalService {
|
|
|
McException.assertAccessException(StringUtils.isBlank(whConf.getApprovalOriginatorUserId()),
|
|
McException.assertAccessException(StringUtils.isBlank(whConf.getApprovalOriginatorUserId()),
|
|
|
"审批补发起真人账号未配置(workhours.approvalOriginatorUserId)");
|
|
"审批补发起真人账号未配置(workhours.approvalOriginatorUserId)");
|
|
|
|
|
|
|
|
- // 1) 查汇总表:按月份 + 可选员工取全,是否待审批由子表 submitted-approved-change 实际差额判定。
|
|
|
|
|
|
|
+ // 1) 查汇总表:按月份 + 可选员工取全,是否待审批由子表 submitted-approved 正常工时差额判定。
|
|
|
Map<String, Object> search = new HashMap<>();
|
|
Map<String, Object> search = new HashMap<>();
|
|
|
search.put(S_MONTH_TEXT, monthText);
|
|
search.put(S_MONTH_TEXT, monthText);
|
|
|
if (StringUtils.isNotBlank(submitterUserId)) {
|
|
if (StringUtils.isNotBlank(submitterUserId)) {
|
|
@@ -705,8 +706,8 @@ public class ReSubmitApprovalService {
|
|
|
for (Map row : listOrEmpty(fd, S_BIL_TABLE)) {
|
|
for (Map row : listOrEmpty(fd, S_BIL_TABLE)) {
|
|
|
double submitted = num(row, S_BIL_SUBMITTED);
|
|
double submitted = num(row, S_BIL_SUBMITTED);
|
|
|
double approved = num(row, S_BIL_APPROVED);
|
|
double approved = num(row, S_BIL_APPROVED);
|
|
|
- double change = num(row, S_BIL_CHANGE);
|
|
|
|
|
- double delta = submitted - approved - change;
|
|
|
|
|
|
|
+ // fixme 负数历史变更不能转成正常补发工时,正数变更也不能吞掉正常提交。
|
|
|
|
|
+ double delta = submitted - approved;
|
|
|
if (delta <= 0) {
|
|
if (delta <= 0) {
|
|
|
continue;
|
|
continue;
|
|
|
}
|
|
}
|
|
@@ -716,7 +717,7 @@ public class ReSubmitApprovalService {
|
|
|
String coverageKey = approvalKey("billable", uid, dayText,
|
|
String coverageKey = approvalKey("billable", uid, dayText,
|
|
|
approvalDetailKey(projectCode, projectName));
|
|
approvalDetailKey(projectCode, projectName));
|
|
|
if (!seenBillableKeys.add(coverageKey)
|
|
if (!seenBillableKeys.add(coverageKey)
|
|
|
- || approvalCoverage.shouldSkip(coverageKey, approved + change)) {
|
|
|
|
|
|
|
+ || approvalCoverage.shouldSkip(coverageKey, approved)) {
|
|
|
continue;
|
|
continue;
|
|
|
}
|
|
}
|
|
|
String pmRaw = firstIdOrText(row, S_BIL_MANAGER);
|
|
String pmRaw = firstIdOrText(row, S_BIL_MANAGER);
|
|
@@ -746,8 +747,7 @@ public class ReSubmitApprovalService {
|
|
|
for (Map row : listOrEmpty(fd, S_NON_TABLE)) {
|
|
for (Map row : listOrEmpty(fd, S_NON_TABLE)) {
|
|
|
double submitted = num(row, S_NON_SUBMITTED);
|
|
double submitted = num(row, S_NON_SUBMITTED);
|
|
|
double approved = num(row, S_NON_APPROVED);
|
|
double approved = num(row, S_NON_APPROVED);
|
|
|
- double change = num(row, S_NON_CHANGE);
|
|
|
|
|
- double delta = submitted - approved - change;
|
|
|
|
|
|
|
+ double delta = submitted - approved;
|
|
|
if (delta <= 0) {
|
|
if (delta <= 0) {
|
|
|
continue;
|
|
continue;
|
|
|
}
|
|
}
|
|
@@ -757,7 +757,7 @@ public class ReSubmitApprovalService {
|
|
|
String coverageKey = approvalKey("nonBillable", uid, dayText,
|
|
String coverageKey = approvalKey("nonBillable", uid, dayText,
|
|
|
approvalDetailKey(projectCode, projectName));
|
|
approvalDetailKey(projectCode, projectName));
|
|
|
if (!seenNonBillableKeys.add(coverageKey)
|
|
if (!seenNonBillableKeys.add(coverageKey)
|
|
|
- || approvalCoverage.shouldSkip(coverageKey, approved + change)) {
|
|
|
|
|
|
|
+ || approvalCoverage.shouldSkip(coverageKey, approved)) {
|
|
|
continue;
|
|
continue;
|
|
|
}
|
|
}
|
|
|
String pmRaw = firstIdOrText(row, S_NON_MANAGER);
|
|
String pmRaw = firstIdOrText(row, S_NON_MANAGER);
|
|
@@ -787,8 +787,7 @@ public class ReSubmitApprovalService {
|
|
|
for (Map row : listOrEmpty(fd, S_OTH_TABLE)) {
|
|
for (Map row : listOrEmpty(fd, S_OTH_TABLE)) {
|
|
|
double submitted = num(row, S_OTH_SUBMITTED);
|
|
double submitted = num(row, S_OTH_SUBMITTED);
|
|
|
double approved = num(row, S_OTH_APPROVED);
|
|
double approved = num(row, S_OTH_APPROVED);
|
|
|
- double change = num(row, S_OTH_CHANGE);
|
|
|
|
|
- double delta = submitted - approved - change;
|
|
|
|
|
|
|
+ double delta = submitted - approved;
|
|
|
if (delta <= 0) {
|
|
if (delta <= 0) {
|
|
|
continue;
|
|
continue;
|
|
|
}
|
|
}
|
|
@@ -796,7 +795,7 @@ public class ReSubmitApprovalService {
|
|
|
String coverageKey = approvalKey("other", uid, dayText,
|
|
String coverageKey = approvalKey("other", uid, dayText,
|
|
|
approvalDetailKey(activity, ""));
|
|
approvalDetailKey(activity, ""));
|
|
|
if (!seenOtherKeys.add(coverageKey)
|
|
if (!seenOtherKeys.add(coverageKey)
|
|
|
- || approvalCoverage.shouldSkip(coverageKey, approved + change)) {
|
|
|
|
|
|
|
+ || approvalCoverage.shouldSkip(coverageKey, approved)) {
|
|
|
continue;
|
|
continue;
|
|
|
}
|
|
}
|
|
|
OtherRow or = new OtherRow();
|
|
OtherRow or = new OtherRow();
|