:feat: 项目变更合规推送增加同步状态回写闭环,仅原项目已推送合规的变更单参与推送

This commit is contained in:
刘泉佳
2026-10-28 14:16:25 +08:00
parent 632e0e5971
commit b3b299edcc
3 changed files with 33 additions and 10 deletions
@@ -33,6 +33,7 @@ import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.secure.annotation.PreAuth;
import org.springblade.core.tool.api.R;
import org.springblade.transport.constant.HcsSyncConstant;
import org.springblade.transport.pojo.entity.ProjectChange;
import org.springblade.transport.pojo.vo.ProjectChangeVO;
import org.springblade.transport.service.IProjectChangeService;
@@ -110,17 +111,12 @@ public class ProjectChangeController extends BladeController {
hcsImmediatePushSupport.pushProjectAndWait(projectId);
String syncFailure = HcsImmediatePushSupport.pollSyncFailure();
if (syncFailure != null) {
ProjectChange projectChange = projectChangeService.getById(id);
if (projectChange != null) {
projectChange.setSyncStatus("failed");
projectChangeService.updateById(projectChange);
}
projectChangeService.writeBackSyncStatus(projectId, HcsSyncConstant.HCS_STATUS_FAILED);
return R.data(Boolean.FALSE, "审批通过,但合规推送失败:" + syncFailure);
}
ProjectChange projectChange = projectChangeService.getById(id);
if (projectChange != null) {
projectChange.setSyncStatus("synced");
projectChangeService.updateById(projectChange);
// 即时推送未开启时(开关关闭不触发推送)不标记已推送,待推送状态由定时扫描任务推送后闭环
if (hcsImmediatePushSupport.isImmediateEnabled()) {
projectChangeService.writeBackSyncStatus(projectId, HcsSyncConstant.HCS_STATUS_SYNCED);
}
return R.success("审批通过");
}
@@ -67,4 +67,13 @@ public interface IProjectChangeService extends BaseService<ProjectChange> {
boolean removeDraft(String ids);
/**
* 按原项目回写最近一条待同步变更单的同步状态(审批即时推送/定时任务推送后调用)
*
* @param projectId 原项目ID
* @param syncStatus 同步状态(synced/failed)
* @return 是否回写成功(无待同步变更单时返回 false)
*/
boolean writeBackSyncStatus(Long projectId, String syncStatus);
}
@@ -188,7 +188,11 @@ public class ProjectChangeServiceImpl extends BaseServiceImpl<ProjectChangeMappe
String processor = TransportBusinessSupport.trimToNull(AuthUtil.getUserName());
projectChange.setCurrentProcessor(processor == null ? "系统" : processor);
projectChange.setApprovedTime(LocalDateTime.now());
projectChange.setSyncStatus(HcsSyncConstant.HCS_STATUS_UNSYNCED);
// 仅原项目已推送合规(有合规单据ID标识 hcs_fd_id)的变更单参与合规推送(C102-2),存量未推送项目不置同步状态
ProjectApply projectApply = projectApplyService.getById(projectChange.getProjectId());
if (projectApply != null && Func.isNotBlank(projectApply.getHcsFdId())) {
projectChange.setSyncStatus(HcsSyncConstant.HCS_STATUS_UNSYNCED);
}
updateById(projectChange);
projectApplyService.applyChangeFromRecord(projectChange);
return projectChange.getProjectId();
@@ -230,6 +234,20 @@ public class ProjectChangeServiceImpl extends BaseServiceImpl<ProjectChangeMappe
return deleteLogic(idList);
}
@Override
public boolean writeBackSyncStatus(Long projectId, String syncStatus) {
if (projectId == null) {
return false;
}
// 仅回写该项目最近一条审批通过且未同步/失败的变更单,历史已闭环单据不翻动
return update(Wrappers.<ProjectChange>lambdaUpdate()
.eq(ProjectChange::getProjectId, projectId)
.eq(ProjectChange::getApprovalStatus, STATUS_APPROVED)
.in(ProjectChange::getSyncStatus, List.of(HcsSyncConstant.HCS_STATUS_UNSYNCED, HcsSyncConstant.HCS_STATUS_FAILED))
.set(ProjectChange::getSyncStatus, syncStatus)
.last("order by approved_time desc limit 1"));
}
private LambdaQueryWrapper<ProjectChange> buildQuery(ProjectChangeVO projectChange) {
TransportBusinessSupport.validateAllDept(projectChange.getAllDept(), "项目变更");
LambdaQueryWrapper<ProjectChange> queryWrapper = Wrappers.<ProjectChange>lambdaQuery().eq(ProjectChange::getIsDeleted, 0);