|
|
@@ -28,7 +28,7 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|
|
* 工时审批含两个明细子表(项目/非项目工时),其他工时审批含一个明细子表。
|
|
|
* 明细按「填报人 + 工时日期(天) + 项目编号/Activity」1:1 对应工时汇总表(人+天一条)里的子表行:
|
|
|
* - 拒绝 → 对应子表行「已提交工时」置 0
|
|
|
- * - 同意 → 对应子表行「已审批工时」= 该明细工时
|
|
|
+ * - 同意 → 对应子表行「已审批工时」= 该明细工时,且「已提交工时」不得低于已审批工时
|
|
|
* 主表合计按子表行重算(幂等,撤销/重发不翻倍)。
|
|
|
* <p>
|
|
|
* 设计文档:后端/阿科德斯/审批结果回写工时汇总表/02-程序实现与接口.md
|
|
|
@@ -489,11 +489,13 @@ public class ApprovalWriteBackService {
|
|
|
log.warn("[审批回写] 子表行未匹配 cat={} key={} userId={} day={}", cat, dr.key, userId, dayText);
|
|
|
continue;
|
|
|
}
|
|
|
+ double submittedBefore = num(target, submittedField);
|
|
|
if (dr.approve) {
|
|
|
target.put(approvedField, dr.hours);
|
|
|
- } else {
|
|
|
- target.put(submittedField, 0);
|
|
|
}
|
|
|
+ // fixme 拒绝仍清零;同意时兜底恢复已提交,避免补发审批只写 approved 后形成 submitted=0。
|
|
|
+ target.put(submittedField, resolveSubmittedAfterWriteBack(
|
|
|
+ dr.approve, submittedBefore, dr.hours));
|
|
|
updated++;
|
|
|
}
|
|
|
|
|
|
@@ -569,6 +571,24 @@ public class ApprovalWriteBackService {
|
|
|
return "暂存";
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 计算审批回写后的已提交工时。
|
|
|
+ *
|
|
|
+ * @param approve 是否审批同意
|
|
|
+ * @param currentSubmitted 当前已提交工时
|
|
|
+ * @param approvedHours 本次审批明细工时
|
|
|
+ * @return 拒绝时为 0;同意时不低于本次审批工时且不降低当前已提交值
|
|
|
+ */
|
|
|
+ static double resolveSubmittedAfterWriteBack(
|
|
|
+ boolean approve,
|
|
|
+ double currentSubmitted,
|
|
|
+ double approvedHours) {
|
|
|
+ if (!approve) {
|
|
|
+ return 0d;
|
|
|
+ }
|
|
|
+ return Math.max(currentSubmitted, approvedHours);
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 加载审批单某类别明细(内联子表优先,必要时递归取全)
|
|
|
*/
|