diff --git a/src/main/java/com/qs/serve/modules/vtb/controller/VtbVerificationController.java b/src/main/java/com/qs/serve/modules/vtb/controller/VtbVerificationController.java index d8f0f32d..80f11dc6 100644 --- a/src/main/java/com/qs/serve/modules/vtb/controller/VtbVerificationController.java +++ b/src/main/java/com/qs/serve/modules/vtb/controller/VtbVerificationController.java @@ -128,7 +128,7 @@ public class VtbVerificationController { @PostMapping("/commit") @SysLog(module = SystemModule.Verification, title = "核销", biz = BizType.UPDATE) @PreAuthorize("hasRole('vtb:verification:commit')") - public R updateById(@RequestBody @Valid VtbVerificationBo param){ + public R commit(@RequestBody @Valid VtbVerificationBo param){ vtbVerificationService.commit(param); return R.ok(); } diff --git a/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationApplication.java b/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationApplication.java index 93c49101..a70a04f9 100644 --- a/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationApplication.java +++ b/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationApplication.java @@ -24,6 +24,7 @@ import com.qs.serve.modules.vtb.entity.VtbVerificationYardItem; import lombok.AllArgsConstructor; import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.RequestBody; import javax.validation.Valid; @@ -56,90 +57,128 @@ public class VtbVerificationApplication { if(!verification.getVerificationState().equals(VtbVerificationState.Commiting.getCode())){ return R.error("费用申请处于未非审批状态!"); } - VtbVerificationYard yard = new VtbVerificationYard(); - yard.setVerificationId(verification.getId()); - yard.setVerificationSubCode(verification.getVerificationCode()); - yard.setState(affairCommit.getState()); - yard.setAffairId(affairCommit.getAffairId()); - yard.setComment(affairCommit.getComment()); + boolean isBackCommit = affairCommit.getState()==2; R result = seeYonService.commonCommit(affairCommit, TbsSeeYonConst.VERIFICATION_CODE); if(result.getStatus()==200){ // 判断是否含有下个节点 String flag = result.getData(); - //审批中(next)、完成(finish)、拒绝(refused) - if("finish".equals(flag)){ + return commitAffairSuccess(affairCommit, verification, isBackCommit, flag); + }else if (result.getStatus()==500){ + return result; + } + return R.error("远程调用失败"); + } + + @NotNull + @Transactional(rollbackFor = Exception.class) + public R commitAffairSuccess(TbsAffairCommitBo affairCommit, VtbVerification verification, boolean isBackCommit, String flag) { + //保存审批线结果 + VtbVerificationYard yard = new VtbVerificationYard(); + yard.setVerificationId(verification.getId()); + yard.setVerificationSubCode(verification.getVerificationCode()); + yard.setState(affairCommit.getState()); + yard.setAffairId(affairCommit.getAffairId()); + yard.setComment(affairCommit.getComment()); + //审批中(next)、完成(finish)、拒绝(refused) + boolean isFinish = "finish".equals(flag); + boolean isNext = "next".equals(flag); + boolean isStop = "stop".equals(flag); + if (isStop){ + backCommitAndStop(verification, isBackCommit); + }else if (!isFinish && !isNext){ + return R.error("远程调用返回,非指定状态"); + } + yardService.save(yard); + //非终止或者驳回,保存审批线金额明细 + if(!isStop){ + List verificationSubjects = vtbVerificationSubjectService.listByVerificationId(verification.getId()); + List yardItemList = new ArrayList<>(); + List verSubject4Update = new ArrayList<>(); + BigDecimal totalAmount = BigDecimal.ZERO; + for (VtbVerificationSubject currVs : verificationSubjects) { + BigDecimal changeAmount = null; + if(CollectionUtil.isNotEmpty(affairCommit.getAffairSubjectLines())){ + for (TbsAffairCommitBo.AffairSubjectLine affairSubjectLine : affairCommit.getAffairSubjectLines()) { + if(currVs.getId().equals(affairSubjectLine.getVerificationSubjectId())){ + changeAmount = affairSubjectLine.getAmount(); + break; + } + } + } + //保存明细判断是否更变金额 + VtbVerificationYardItem yardItem = CopierUtil.copy(currVs,new VtbVerificationYardItem()); + yardItem.setYardId(yard.getId()); + yardItem.initSetNull(); + BigDecimal lastAmount = currVs.getUsedAmount(); + yardItem.setLastAmount(lastAmount); + //金额有更变 + if(changeAmount!=null&&changeAmount.compareTo(lastAmount)!=0){ + yardItem.setCurrAmount(changeAmount); + BigDecimal diff = changeAmount.subtract(lastAmount); + if(diff.compareTo(BigDecimal.ZERO)>0){ + yardItem.setRemark(currVs.getSubjectName()+"["+currVs.getSubjectCode()+"]增加费用:"+diff); + }else { + yardItem.setRemark(currVs.getSubjectName()+"["+currVs.getSubjectCode()+"]减少费用:"+diff.negate()); + } + VtbVerificationSubject verSub4Upd = new VtbVerificationSubject(); + verSub4Upd.setId(currVs.getId()); + verSub4Upd.setUsedAmount(changeAmount); + verSubject4Update.add(verSub4Upd); + }else { + yardItem.setCurrAmount(lastAmount); + } + totalAmount = totalAmount.add(yardItem.getCurrAmount()); + yardItemList.add(yardItem); + } + yardItemService.saveBatch(yardItemList); + vtbVerificationSubjectService.updateBatchById(verSubject4Update); + //重新计算合计 + if(isFinish){ + //更新金额,已完成 VtbVerification vtbVer = new VtbVerification(); vtbVer.setId(verification.getId()); vtbVer.setVerificationState(VtbVerificationState.Finished.getCode()); + vtbVer.setAmount(totalAmount); vtbVer.setFinishedTime(LocalDateTime.now()); vtbVerificationService.updateById(vtbVer); vtbVerificationService.successCommit(verification.getId()); - }else if ("stop".equals(flag)){ - if(isBackCommit){ - VtbVerification vtbVer = new VtbVerification(); - vtbVer.setId(verification.getId()); - vtbVer.setVerificationState(VtbVerificationState.Rollback.getCode()); - vtbVer.setSyFormId(""); - vtbVer.setSyFlowId(""); - vtbVerificationService.updateById(vtbVer); - }else { - VtbVerification vtbVer = new VtbVerification(); - vtbVer.setId(verification.getId()); - vtbVer.setVerificationState(VtbVerificationState.Stop.getCode()); - vtbVerificationService.updateById(vtbVer); - } - //还原活动为待核销状态 - TbsActivity activity = new TbsActivity(); - activity.setId(verification.getActivityId()); - activity.setActivityState(TbsActivityState.STATE_0_Todo); - tbsActivityService.updateById(activity); - }else if (!"next".equals(flag)){ - return R.error("远程调用返回,非指定状态"); - } - yardService.save(yard); - //非终止或者驳回,保存审批线金额明细 - if(!"stop".equals(flag)){ - List verificationSubjects = vtbVerificationSubjectService.listByVerificationId(verification.getId()); - List yardItemList = new ArrayList<>(); - for (VtbVerificationSubject currVs : verificationSubjects) { - BigDecimal changeAmount = null; - if(CollectionUtil.isNotEmpty(affairCommit.getAffairSubjectLines())){ - for (TbsAffairCommitBo.AffairSubjectLine affairSubjectLine : affairCommit.getAffairSubjectLines()) { - if(currVs.getId().equals(affairSubjectLine.getVerificationSubjectId())){ - changeAmount = affairSubjectLine.getAmount(); - break; - } - } - } - //保存明细判断是否更变金额 - VtbVerificationYardItem yardItem = CopierUtil.copy(currVs,new VtbVerificationYardItem()); - yardItem.setYardId(yard.getId()); - yardItem.initSetNull(); - BigDecimal lastAmount = currVs.getUsedAmount(); - yardItem.setLastAmount(lastAmount); - //金额有更变 - if(changeAmount!=null&&changeAmount.compareTo(lastAmount)!=0){ - yardItem.setCurrAmount(changeAmount); - BigDecimal diff = changeAmount.subtract(lastAmount); - if(diff.compareTo(BigDecimal.ZERO)>0){ - yardItem.setRemark(currVs.getSubjectName()+"["+currVs.getSubjectCode()+"]增加费用:"+diff); - }else { - yardItem.setRemark(currVs.getSubjectName()+"["+currVs.getSubjectCode()+"]减少费用:"+diff.negate()); - } - }else { - yardItem.setCurrAmount(lastAmount); - } - yardItemList.add(yardItem); - } - yardItemService.saveBatch(yardItemList); + }else { + //更新金额 + VtbVerification vtbVer = new VtbVerification(); + vtbVer.setId(verification.getId()); + vtbVer.setAmount(totalAmount); + vtbVerificationService.updateById(vtbVer); } - return R.ok(); - }else if (result.getStatus()==500){ - return result; } - return R.error("远程调用失败"); + return R.ok(); + } + + /** + * 回滚或中止 + * @param verification + * @param isBackCommit + */ + private void backCommitAndStop(VtbVerification verification, boolean isBackCommit) { + if(isBackCommit){ + VtbVerification vtbVer = new VtbVerification(); + vtbVer.setId(verification.getId()); + vtbVer.setVerificationState(VtbVerificationState.Rollback.getCode()); + vtbVer.setSyFormId(""); + vtbVer.setSyFlowId(""); + vtbVerificationService.updateById(vtbVer); + }else { + VtbVerification vtbVer = new VtbVerification(); + vtbVer.setId(verification.getId()); + vtbVer.setVerificationState(VtbVerificationState.Stop.getCode()); + vtbVerificationService.updateById(vtbVer); + } + //还原活动为待核销状态 + TbsActivity activity = new TbsActivity(); + activity.setId(verification.getActivityId()); + activity.setActivityState(TbsActivityState.STATE_0_Todo); + tbsActivityService.updateById(activity); } @NotNull