|
@ -83,6 +83,7 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe |
|
|
private final TbsActivityCenterGoodsService activityCenterGoodsService; |
|
|
private final TbsActivityCenterGoodsService activityCenterGoodsService; |
|
|
private final TbsActivityCenterService activityCenterService; |
|
|
private final TbsActivityCenterService activityCenterService; |
|
|
private final TbsActivityPayConditionService activityPayConditionService; |
|
|
private final TbsActivityPayConditionService activityPayConditionService; |
|
|
|
|
|
private final VtbVerificationSubjectCenterService vtbVerificationSubjectCenterService; |
|
|
private final TbsBudgetCostItemService budgetCostItemService; |
|
|
private final TbsBudgetCostItemService budgetCostItemService; |
|
|
private final TbsBudgetLogService budgetLogService; |
|
|
private final TbsBudgetLogService budgetLogService; |
|
|
private final TbsBudgetService budgetService; |
|
|
private final TbsBudgetService budgetService; |
|
@ -577,6 +578,12 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe |
|
|
SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); |
|
|
SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); |
|
|
sysUser.checkSyAccount(); |
|
|
sysUser.checkSyAccount(); |
|
|
TbsActivity activity = activityService.getById(verificationBo.getActivityId()); |
|
|
TbsActivity activity = activityService.getById(verificationBo.getActivityId()); |
|
|
|
|
|
//自定义成本中心核销
|
|
|
|
|
|
List<VtbVerificationSubjectCenterBo> subjectCenterBoList = verificationBo.getSubjectCenterList(); |
|
|
|
|
|
boolean isCenterCheck = CollectionUtil.isNotEmpty(subjectCenterBoList); |
|
|
|
|
|
if(activity.getVtbMatchTypeFlag().equals(1) && !isCenterCheck){ |
|
|
|
|
|
Assert.throwEx("页面参数异常,请刷新页面重试"); |
|
|
|
|
|
} |
|
|
TbsCostApply costApply = costApplyService.getById(activity.getCostApplyId()); |
|
|
TbsCostApply costApply = costApplyService.getById(activity.getCostApplyId()); |
|
|
if(costApply.getContractFlag().equals(1)){ |
|
|
if(costApply.getContractFlag().equals(1)){ |
|
|
Assert.throwEx("协议类申请不支持CRM核销"); |
|
|
Assert.throwEx("协议类申请不支持CRM核销"); |
|
@ -625,10 +632,19 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe |
|
|
if(verificationBo.getPayConditionId()==null){ |
|
|
if(verificationBo.getPayConditionId()==null){ |
|
|
Assert.throwEx("请选择支付条件"); |
|
|
Assert.throwEx("请选择支付条件"); |
|
|
} |
|
|
} |
|
|
List<VtbVerificationSubjectBo> subjectBoList = verificationBo.getSubjectList(); |
|
|
|
|
|
BigDecimal totalSubjectAmt = BigDecimal.ZERO; |
|
|
BigDecimal totalSubjectAmt = BigDecimal.ZERO; |
|
|
for (VtbVerificationSubjectBo subjectBo : subjectBoList) { |
|
|
if(isCenterCheck){ |
|
|
totalSubjectAmt = totalSubjectAmt.add(subjectBo.getAmount()); |
|
|
List<VtbVerificationSubjectCenterBo> subjectCenterList = verificationBo.getSubjectCenterList(); |
|
|
|
|
|
for (VtbVerificationSubjectCenterBo subjectCenterBo : subjectCenterList) { |
|
|
|
|
|
for (VtbVerificationSubjectCenterBo.ChangeSubjectCenter subjectCenter : subjectCenterBo.getCenterAmount()) { |
|
|
|
|
|
totalSubjectAmt = totalSubjectAmt.add(subjectCenter.getAmount()); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
}else { |
|
|
|
|
|
List<VtbVerificationSubjectBo> subjectBoList = verificationBo.getSubjectList(); |
|
|
|
|
|
for (VtbVerificationSubjectBo subjectBo : subjectBoList) { |
|
|
|
|
|
totalSubjectAmt = totalSubjectAmt.add(subjectBo.getAmount()); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
TbsActivityPayCondition payCondition = activityPayConditionService.getById(verificationBo.getPayConditionId()); |
|
|
TbsActivityPayCondition payCondition = activityPayConditionService.getById(verificationBo.getPayConditionId()); |
|
|
if(payCondition.getPaymentPrice().compareTo(totalSubjectAmt)>1){ |
|
|
if(payCondition.getPaymentPrice().compareTo(totalSubjectAmt)>1){ |
|
@ -714,7 +730,16 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe |
|
|
verificationChannelPointList.add(channelPoint1); |
|
|
verificationChannelPointList.add(channelPoint1); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
List<VtbVerificationSubject> verificationSubjects = validCreateVeriSubject(verification.getVerificationCode(),verificationBo, activity, costApply, supplier); |
|
|
List<VtbVerificationSubject> verificationSubjects = new ArrayList<>(); |
|
|
|
|
|
List<VtbVerificationSubjectCenter> verificationCenters = new ArrayList<>(); |
|
|
|
|
|
String verificationCode = verification.getVerificationCode(); |
|
|
|
|
|
if(isCenterCheck){ |
|
|
|
|
|
//建立核销 VtbVerificationSubjectCenter
|
|
|
|
|
|
this.validCreateVeriSubjectAndCenter(activity, subjectCenterBoList, costApply, supplier, verificationSubjects, verificationCenters, verificationCode); |
|
|
|
|
|
}else { |
|
|
|
|
|
//建立核销 VtbVerificationSubject
|
|
|
|
|
|
verificationSubjects = this.validCreateVeriSubject(verificationCode,verificationBo, activity, costApply, supplier); |
|
|
|
|
|
} |
|
|
//设置总金额
|
|
|
//设置总金额
|
|
|
BigDecimal totalAmount = BigDecimal.ZERO; |
|
|
BigDecimal totalAmount = BigDecimal.ZERO; |
|
|
for (VtbVerificationSubject verificationSubject : verificationSubjects) { |
|
|
for (VtbVerificationSubject verificationSubject : verificationSubjects) { |
|
@ -734,6 +759,7 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe |
|
|
verificationChannelService.removeByVerificationId(verificationBo.getId()); |
|
|
verificationChannelService.removeByVerificationId(verificationBo.getId()); |
|
|
verificationChannelPointService.removeByVerificationId(verificationBo.getId()); |
|
|
verificationChannelPointService.removeByVerificationId(verificationBo.getId()); |
|
|
verificationSubjectService.removeByVerificationId(verificationBo.getId()); |
|
|
verificationSubjectService.removeByVerificationId(verificationBo.getId()); |
|
|
|
|
|
vtbVerificationSubjectCenterService.removeByVerificationId(verificationBo.getId()); |
|
|
} |
|
|
} |
|
|
if(CollectionUtil.isNotEmpty(vtbVerificationChannelList)){ |
|
|
if(CollectionUtil.isNotEmpty(vtbVerificationChannelList)){ |
|
|
vtbVerificationChannelList.forEach(obj->obj.setVerificationId(verification.getId())); |
|
|
vtbVerificationChannelList.forEach(obj->obj.setVerificationId(verification.getId())); |
|
@ -745,6 +771,10 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe |
|
|
} |
|
|
} |
|
|
//保存科目费用
|
|
|
//保存科目费用
|
|
|
verificationSubjects.forEach(obj->obj.setVerificationId(verification.getId())); |
|
|
verificationSubjects.forEach(obj->obj.setVerificationId(verification.getId())); |
|
|
|
|
|
verificationCenters.forEach(obj->obj.setVerificationId(verification.getId())); |
|
|
|
|
|
if(CollectionUtil.isNotEmpty(verificationCenters)){ |
|
|
|
|
|
vtbVerificationSubjectCenterService.saveBatch(verificationCenters); |
|
|
|
|
|
} |
|
|
verificationSubjectService.saveBatch(verificationSubjects); |
|
|
verificationSubjectService.saveBatch(verificationSubjects); |
|
|
TbsActivity activityParam = new TbsActivity(); |
|
|
TbsActivity activityParam = new TbsActivity(); |
|
|
activityParam.setId(activity.getId()); |
|
|
activityParam.setId(activity.getId()); |
|
@ -764,6 +794,118 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void validCreateVeriSubjectAndCenter(TbsActivity activity, List<VtbVerificationSubjectCenterBo> subjectCenterBoList, TbsCostApply costApply, BmsSupplier supplier, List<VtbVerificationSubject> verificationSubjects, List<VtbVerificationSubjectCenter> verificationCenters, String verificationCode) { |
|
|
|
|
|
List<TbsActivitySubject> activitySubjects = activitySubjectService.listByActivityId(activity.getId()); |
|
|
|
|
|
List<TbsActivityCenter> activityCenters = activityCenterService.listByActivity(activity.getId()); |
|
|
|
|
|
List<VtbFundFlow> existFundFlowList = fundFlowService.listByActivity(activity.getId(), VtbFundFlowType.Verification); |
|
|
|
|
|
Map<Long,List<VtbFundFlow>> funFlowListMap = existFundFlowList.stream().collect(Collectors.groupingBy(VtbFundFlow::getSubjectId)); |
|
|
|
|
|
//校验余额
|
|
|
|
|
|
int countCode = 1; |
|
|
|
|
|
for (VtbVerificationSubjectCenterBo subjectCenterBo : subjectCenterBoList) { |
|
|
|
|
|
//科目总金额
|
|
|
|
|
|
BmsSubject subject = subjectService.getById(subjectCenterBo.getSubjectId()); |
|
|
|
|
|
BigDecimal totalSubjectAmt = BigDecimal.ZERO; |
|
|
|
|
|
for (VtbVerificationSubjectCenterBo.ChangeSubjectCenter centerBo : subjectCenterBo.getCenterAmount()) { |
|
|
|
|
|
BigDecimal centerAmt = centerBo.getAmount(); |
|
|
|
|
|
if(centerAmt==null){ |
|
|
|
|
|
Assert.throwEx("SubjectCenterId: "+centerBo.getSubjectCenterId()+" amount is null"); |
|
|
|
|
|
} |
|
|
|
|
|
if (centerAmt.compareTo(BigDecimal.ZERO)==0){ |
|
|
|
|
|
//0核销,成本中心维度不进行保存
|
|
|
|
|
|
continue; |
|
|
|
|
|
} |
|
|
|
|
|
totalSubjectAmt = totalSubjectAmt.add(centerAmt); |
|
|
|
|
|
//当前活动成本中心进行校验,再构建
|
|
|
|
|
|
TbsActivityCenter currActivityCenter = null; |
|
|
|
|
|
for (TbsActivityCenter activityCenter : activityCenters) { |
|
|
|
|
|
if(activityCenter.getSubjectId().equals(subjectCenterBo.getSubjectId())&&activityCenter.getId().equals(centerBo.getSubjectCenterId())){ |
|
|
|
|
|
currActivityCenter = activityCenter; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
if(currActivityCenter==null){ |
|
|
|
|
|
Assert.throwEx("SubjectCenterId: "+centerBo.getSubjectCenterId()+" 不匹配"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//判断是否够核销
|
|
|
|
|
|
BigDecimal surplus = currActivityCenter.getCenterAmount() |
|
|
|
|
|
.subtract(currActivityCenter.getUsedAmount()) |
|
|
|
|
|
.subtract(centerAmt); |
|
|
|
|
|
if(surplus.compareTo(BigDecimal.ZERO)<0){ |
|
|
|
|
|
Assert.throwEx("SubjectCenterId: "+centerBo.getSubjectCenterId()+" 金额不足"); |
|
|
|
|
|
} |
|
|
|
|
|
VtbVerificationSubjectCenter subjectCenter = new VtbVerificationSubjectCenter(); |
|
|
|
|
|
subjectCenter.setVerificationSubCode(verificationCode +"_"+countCode); |
|
|
|
|
|
subjectCenter.setCostApplyId(costApply.getId()); |
|
|
|
|
|
subjectCenter.setActivityId(activity.getId()); |
|
|
|
|
|
subjectCenter.setSubjectId(subject.getId()); |
|
|
|
|
|
subjectCenter.setSubjectCode(subject.getSubjectCode()); |
|
|
|
|
|
subjectCenter.setSubjectName(subject.getSubjectName()); |
|
|
|
|
|
subjectCenter.setSupplierId(Long.parseLong(supplier.getId())); |
|
|
|
|
|
subjectCenter.setSupplierCode(supplier.getCode()); |
|
|
|
|
|
subjectCenter.setSupplierName(supplier.getName()); |
|
|
|
|
|
subjectCenter.setUsedAmount(centerAmt); |
|
|
|
|
|
subjectCenter.setUsedAmountRecord(centerAmt); |
|
|
|
|
|
subjectCenter.setCenterType(currActivityCenter.getCenterType()); |
|
|
|
|
|
subjectCenter.setCenterId(currActivityCenter.getCenterId()); |
|
|
|
|
|
subjectCenter.setCenterCode(currActivityCenter.getCenterCode()); |
|
|
|
|
|
subjectCenter.setCenterName(currActivityCenter.getCenterName()); |
|
|
|
|
|
subjectCenter.setActivityCenterId(currActivityCenter.getId()); |
|
|
|
|
|
verificationCenters.add(subjectCenter); |
|
|
|
|
|
} |
|
|
|
|
|
boolean isCheckZero = totalSubjectAmt.compareTo(BigDecimal.ZERO)==0; |
|
|
|
|
|
//忽略金额为0的数据
|
|
|
|
|
|
if (!isCheckZero && totalSubjectAmt.compareTo(BigDecimal.ZERO) < 1) { |
|
|
|
|
|
continue; |
|
|
|
|
|
} |
|
|
|
|
|
//判断是否超额
|
|
|
|
|
|
TbsActivitySubject currentActivitySubject = null; |
|
|
|
|
|
for (TbsActivitySubject activitySubject : activitySubjects) { |
|
|
|
|
|
if (activitySubject.getSubjectId().equals(subject.getId())) { |
|
|
|
|
|
currentActivitySubject = activitySubject; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
//兼容支持非0元核销
|
|
|
|
|
|
if(!isCheckZero){ |
|
|
|
|
|
List<VtbFundFlow> subjectFundFlowItems = funFlowListMap.get(subject.getId()); |
|
|
|
|
|
BigDecimal totalSubjectUsedAmount = BigDecimal.ZERO; |
|
|
|
|
|
if (CollectionUtil.isNotEmpty(subjectFundFlowItems)) { |
|
|
|
|
|
for (VtbFundFlow subjectFundFlowItem : subjectFundFlowItems) { |
|
|
|
|
|
totalSubjectUsedAmount = totalSubjectUsedAmount.add(subjectFundFlowItem.getUsedAmount()); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
totalSubjectUsedAmount = totalSubjectUsedAmount.add(totalSubjectAmt); |
|
|
|
|
|
if (totalSubjectUsedAmount.compareTo(currentActivitySubject.getAmount()) > 0) { |
|
|
|
|
|
Assert.throwEx("费用类型[" + subject.getSubjectName() + "]超额"); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
//保存费用结果
|
|
|
|
|
|
VtbVerificationSubject verificationSubject = new VtbVerificationSubject(); |
|
|
|
|
|
verificationSubject.setVerificationSubCode(verificationCode +"_"+countCode); |
|
|
|
|
|
countCode++; |
|
|
|
|
|
verificationSubject.setCostApplyId(costApply.getId()); |
|
|
|
|
|
verificationSubject.setActivityId(activity.getId()); |
|
|
|
|
|
verificationSubject.setSubjectId(subject.getId()); |
|
|
|
|
|
verificationSubject.setSubjectCode(subject.getSubjectCode()); |
|
|
|
|
|
verificationSubject.setSubjectName(subject.getSubjectName()); |
|
|
|
|
|
verificationSubject.setSupplierId(Long.parseLong(supplier.getId())); |
|
|
|
|
|
verificationSubject.setSupplierCode(supplier.getCode()); |
|
|
|
|
|
verificationSubject.setSupplierName(supplier.getName()); |
|
|
|
|
|
verificationSubject.setUsedAmount(totalSubjectAmt); |
|
|
|
|
|
verificationSubject.setUsedAmountRecord(totalSubjectAmt); |
|
|
|
|
|
verificationSubject.setCountPerson(subjectCenterBo.getCountPerson()); |
|
|
|
|
|
verificationSubject.setCountSession(subjectCenterBo.getCountSession()); |
|
|
|
|
|
verificationSubject.setRemark(subjectCenterBo.getRemark()); |
|
|
|
|
|
verificationSubject.setFormId(subjectCenterBo.getFormId()); |
|
|
|
|
|
verificationSubject.setFormTitle(subjectCenterBo.getFormTitle()); |
|
|
|
|
|
verificationSubject.setFormVersion(subjectCenterBo.getFormVersion()); |
|
|
|
|
|
verificationSubject.setFormContext(subjectCenterBo.getFormContext()); |
|
|
|
|
|
verificationSubject.setFormContextValue(subjectCenterBo.getFormContextValue()); |
|
|
|
|
|
verificationSubjects.add(verificationSubject); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* 提交到致远审批流程 |
|
|
* 提交到致远审批流程 |
|
|