Browse Source

成本中心维度核销(审批完成回调)

v1.0
Yen 2 years ago
parent
commit
c3c2ce52d2
  1. 5
      src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityCenterGoods.java
  2. 9
      src/main/java/com/qs/serve/modules/vtb/service/VtbFundFlowService.java
  3. 9
      src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationSubjectCenterService.java
  4. 63
      src/main/java/com/qs/serve/modules/vtb/service/impl/VtbFundFlowServiceImpl.java
  5. 37
      src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationServiceImpl.java
  6. 14
      src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationSubjectCenterServiceImpl.java

5
src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityCenterGoods.java

@ -265,11 +265,14 @@ public class TbsActivityCenterGoods implements Serializable {
@TableField(exist = false) @TableField(exist = false)
private List<TbsCenterGoodsGroupDTO> queryGoodsGroups; private List<TbsCenterGoodsGroupDTO> queryGoodsGroups;
/** */
@JsonIgnore @JsonIgnore
@TableField(exist = false) @TableField(exist = false)
private List<TbsScheduleItemBudget> match2ScheduleItemBudgetList ; private List<TbsScheduleItemBudget> match2ScheduleItemBudgetList ;
@JsonIgnore
@TableField(exist = false)
private String subjectCenterKey ;
public TbsBudgetCostItem toBudgetCostItem(){ public TbsBudgetCostItem toBudgetCostItem(){
TbsBudgetCostItem budgetCostItem = CopierUtil.copy(this,new TbsBudgetCostItem()); TbsBudgetCostItem budgetCostItem = CopierUtil.copy(this,new TbsBudgetCostItem());
budgetCostItem.setId(null); budgetCostItem.setId(null);

9
src/main/java/com/qs/serve/modules/vtb/service/VtbFundFlowService.java

@ -20,6 +20,15 @@ public interface VtbFundFlowService extends IService<VtbFundFlow> {
*/ */
List<VtbFundFlow> listByActivity(Long activityId,String... fundTypes); List<VtbFundFlow> listByActivity(Long activityId,String... fundTypes);
/**
* 获取相关活动列表
* @param notInVerificationIds 不包含当前核销的id
* @param activityId 不能空
* @param fundTypes 可空
* @return
*/
List<VtbFundFlow> listByActivity(List<Long> notInVerificationIds ,Long activityId,String... fundTypes);
/** /**
* 判断释放 * 判断释放
* @param activityId * @param activityId

9
src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationSubjectCenterService.java

@ -15,5 +15,14 @@ public interface VtbVerificationSubjectCenterService extends IService<VtbVerific
List<VtbVerificationSubjectCenter> listByVerificationId(Long id); List<VtbVerificationSubjectCenter> listByVerificationId(Long id);
List<VtbVerificationSubjectCenter> listByActivityId(Long id);
/**
* 获取生效的
* @param id
* @return
*/
List<VtbVerificationSubjectCenter> listEffectiveByActivityId(Long id);
} }

63
src/main/java/com/qs/serve/modules/vtb/service/impl/VtbFundFlowServiceImpl.java

@ -11,6 +11,8 @@ import com.qs.serve.modules.tbs.mapper.TbsCostApplyMapper;
import com.qs.serve.modules.tbs.service.*; import com.qs.serve.modules.tbs.service.*;
import com.qs.serve.modules.vtb.common.VtbFundFlowType; import com.qs.serve.modules.vtb.common.VtbFundFlowType;
import com.qs.serve.modules.vtb.entity.VtbVerificationSubject; import com.qs.serve.modules.vtb.entity.VtbVerificationSubject;
import com.qs.serve.modules.vtb.entity.VtbVerificationSubjectCenter;
import com.qs.serve.modules.vtb.service.VtbVerificationSubjectCenterService;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -42,14 +44,25 @@ public class VtbFundFlowServiceImpl extends ServiceImpl<VtbFundFlowMapper,VtbFun
private final TbsActivitySubjectService activitySubjectService; private final TbsActivitySubjectService activitySubjectService;
private final TbsActivityCenterService activityCenterService; private final TbsActivityCenterService activityCenterService;
private final TbsActivityCenterGoodsService activityCenterGoodsService; private final TbsActivityCenterGoodsService activityCenterGoodsService;
private final VtbVerificationSubjectCenterService verificationSubjectCenterService;
@Override @Override
public List<VtbFundFlow> listByActivity(Long activityId,String... fundTypes) { public List<VtbFundFlow> listByActivity(Long activityId,String... fundTypes) {
return this.listByActivity(null,activityId,fundTypes);
}
@Override
public List<VtbFundFlow> listByActivity(List<Long> notInVerificationIds, Long activityId, String... fundTypes) {
LambdaQueryWrapper<VtbFundFlow> lqw = new LambdaQueryWrapper<>(); LambdaQueryWrapper<VtbFundFlow> lqw = new LambdaQueryWrapper<>();
lqw.eq(VtbFundFlow::getActivityId,activityId); lqw.eq(VtbFundFlow::getActivityId,activityId);
if(CollectionUtil.isNotEmpty(fundTypes)){ if(CollectionUtil.isNotEmpty(fundTypes)){
lqw.in(VtbFundFlow::getFundType, Arrays.asList(fundTypes)); lqw.in(VtbFundFlow::getFundType, Arrays.asList(fundTypes));
} }
if(notInVerificationIds!=null){
//防止空in查询
notInVerificationIds.add(0L);
lqw.notIn(VtbFundFlow::getVerificationId,notInVerificationIds);
}
return this.list(lqw); return this.list(lqw);
} }
@ -63,9 +76,18 @@ public class VtbFundFlowServiceImpl extends ServiceImpl<VtbFundFlowMapper,VtbFun
@Override @Override
public void flushActivityAmount(Long activityId) { public void flushActivityAmount(Long activityId) {
//活动自定义提交记录
List<VtbVerificationSubjectCenter> subjectCenterList = verificationSubjectCenterService.listEffectiveByActivityId(activityId);
boolean centerCommitFlag = subjectCenterList.size()>0;
//旧流程按比例分配,新流程按比例分配后,进行再分配
log.info("刷新活动金额,ActId:{}",activityId); log.info("刷新活动金额,ActId:{}",activityId);
TbsActivity orgActivity = activityService.getById(activityId); TbsActivity orgActivity = activityService.getById(activityId);
List<VtbFundFlow> allFunFlow = this.listByActivity(activityId,VtbFundFlowType.Verification); List<VtbFundFlow> allFunFlow = this.listByActivity(activityId,VtbFundFlowType.Verification);
List<VtbFundFlow> notCenterCommitFunFlow = allFunFlow;
if(centerCommitFlag){
List<Long> verificationIds = subjectCenterList.stream().map(VtbVerificationSubjectCenter::getVerificationId).collect(Collectors.toList());
notCenterCommitFunFlow = this.listByActivity(verificationIds,activityId,VtbFundFlowType.Verification);
}
//总使用额 //总使用额
BigDecimal activityUsedAmount = BigDecimal.ZERO; BigDecimal activityUsedAmount = BigDecimal.ZERO;
for (VtbFundFlow fundFlow : allFunFlow) { for (VtbFundFlow fundFlow : allFunFlow) {
@ -75,7 +97,43 @@ public class VtbFundFlowServiceImpl extends ServiceImpl<VtbFundFlowMapper,VtbFun
List<TbsActivitySubject> activitySubject4Update = new ArrayList<>(); List<TbsActivitySubject> activitySubject4Update = new ArrayList<>();
List<TbsActivityCenter> centerParam4Update = new ArrayList<>(); List<TbsActivityCenter> centerParam4Update = new ArrayList<>();
List<TbsActivityCenterGoods> allUpdateCenterGoodsList = new ArrayList<>(); List<TbsActivityCenterGoods> allUpdateCenterGoodsList = new ArrayList<>();
this.buildActivityResUpdateList(activityId,allFunFlow, activitySubject4Update, centerParam4Update, allUpdateCenterGoodsList); this.buildActivityResUpdateList(activityId,notCenterCommitFunFlow, activitySubject4Update, centerParam4Update, allUpdateCenterGoodsList);
//二次分配
if(centerCommitFlag){
for (VtbVerificationSubjectCenter verCenter : subjectCenterList) {
//成本中心提交金额
BigDecimal centerAmount = verCenter.getUsedAmount();
if(centerAmount.compareTo(BigDecimal.ZERO)<=0){
continue;
}
//统计科目的金额
for (TbsActivitySubject activitySubject : activitySubject4Update) {
if(activitySubject.getSubjectId().equals(verCenter.getSubjectId())){
BigDecimal activitySubjectAmt = activitySubject.getUsedAmount().add(centerAmount);
activitySubject.setUsedAmount(activitySubjectAmt);
}
}
//统计成本中心的金额
for (TbsActivityCenter activityCenter : centerParam4Update) {
if(activityCenter.getId().equals(verCenter.getActivityCenterId())){
BigDecimal activityCenterAmt = activityCenter.getUsedAmount().add(centerAmount);
activityCenter.setUsedAmount(activityCenterAmt);
//分配到商品明细
String subjectCenterKey = verCenter.getSubjectId()+":"+verCenter.getCenterType()+"_"+verCenter.getCenterId();
for (TbsActivityCenterGoods centerGoods : allUpdateCenterGoodsList) {
if(centerGoods.getSubjectCenterKey().equals(subjectCenterKey)){
BigDecimal goodAmt = activityCenterAmt
.multiply(centerGoods.getCenterGoodsRate())
.divide(new BigDecimal("100"),2,BigDecimal.ROUND_DOWN);
BigDecimal totalGoodAmt = centerGoods.getUsedAmount().add(goodAmt);
centerGoods.setUsedAmount(totalGoodAmt);
}
}
}
}
}
}
//更新活动相关数据 //更新活动相关数据
this.activitySubjectService.updateBatchById(activitySubject4Update); this.activitySubjectService.updateBatchById(activitySubject4Update);
this.activityCenterService.updateBatchById(centerParam4Update); this.activityCenterService.updateBatchById(centerParam4Update);
@ -179,6 +237,9 @@ public class VtbFundFlowServiceImpl extends ServiceImpl<VtbFundFlowMapper,VtbFun
TbsActivityCenterGoods centerGoodsParam = new TbsActivityCenterGoods(); TbsActivityCenterGoods centerGoodsParam = new TbsActivityCenterGoods();
centerGoodsParam.setId(centerGoods.getId()); centerGoodsParam.setId(centerGoods.getId());
centerGoodsParam.setUsedAmount(goodsAmount); centerGoodsParam.setUsedAmount(goodsAmount);
centerGoodsParam.setCenterGoodsRate(centerGoods.getCenterGoodsRate());
String subjectCenterKey = centerGoods.getSubjectId()+":"+centerGoods.getCenterType()+"_"+centerGoods.getCenterId();
centerGoodsParam.setSubjectCenterKey(subjectCenterKey);
updateCenterGoodsList.add(centerGoodsParam); updateCenterGoodsList.add(centerGoodsParam);
} }
} }

37
src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationServiceImpl.java

@ -257,6 +257,7 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe
if(CollectionUtil.isNotEmpty(activityCenterGoods4Update)){ if(CollectionUtil.isNotEmpty(activityCenterGoods4Update)){
activityCenterGoodsService.updateBatchById(activityCenterGoods4Update); activityCenterGoodsService.updateBatchById(activityCenterGoods4Update);
List<VtbFundFlow> addFundFlowList = new ArrayList<>(); List<VtbFundFlow> addFundFlowList = new ArrayList<>();
//协议类支持自动分配
buildFundFlows(verification.getId(), addFundFlowList, activityCenterGoods4Update,currentSubjectAmt); buildFundFlows(verification.getId(), addFundFlowList, activityCenterGoods4Update,currentSubjectAmt);
if(CollectionUtil.isNotEmpty(addFundFlowList)){ if(CollectionUtil.isNotEmpty(addFundFlowList)){
fundFlowService.saveBatch(addFundFlowList); fundFlowService.saveBatch(addFundFlowList);
@ -1164,9 +1165,19 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe
log.info("活动核销提交成功。verificationId:{}",verificationId); log.info("活动核销提交成功。verificationId:{}",verificationId);
VtbVerification verification = this.getById(verificationId); VtbVerification verification = this.getById(verificationId);
boolean checkZero = verification.getAmount().compareTo(BigDecimal.ZERO)==0; boolean checkZero = verification.getAmount().compareTo(BigDecimal.ZERO)==0;
List<VtbVerificationSubjectCenter> subjectCenterList = vtbVerificationSubjectCenterService.listByVerificationId(verificationId);
boolean isCenterCommit = subjectCenterList.size()>0;
//0元核销只改变状态 //0元核销只改变状态
if(checkZero){ if(checkZero){
//自定义成本中心提交后,无法再自动分配刷新金额
if(isCenterCommit){
//TODO 刷洗自定义金额
}else {
//自动分配刷新金额
fundFlowService.flushActivityAmount(verification.getActivityId()); fundFlowService.flushActivityAmount(verification.getActivityId());
}
verification = new VtbVerification(); verification = new VtbVerification();
verification.setId(verificationId); verification.setId(verificationId);
verification.setVerificationState(VtbVerificationState.Finished.getCode()); verification.setVerificationState(VtbVerificationState.Finished.getCode());
@ -1191,6 +1202,7 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe
List<VtbFundFlow> addFundFlowList = new ArrayList<>(); List<VtbFundFlow> addFundFlowList = new ArrayList<>();
LocalDateTime now = LocalDateTime.now(); LocalDateTime now = LocalDateTime.now();
Date now2 = Date.from(now.atZone(ZoneId.systemDefault()).toInstant()); Date now2 = Date.from(now.atZone(ZoneId.systemDefault()).toInstant());
for (VtbVerificationSubject verificationSubject : verificationSubjects) { for (VtbVerificationSubject verificationSubject : verificationSubjects) {
Long subjectId = verificationSubject.getSubjectId(); Long subjectId = verificationSubject.getSubjectId();
BigDecimal usedAmount = verificationSubject.getUsedAmount(); BigDecimal usedAmount = verificationSubject.getUsedAmount();
@ -1206,7 +1218,17 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe
String subjectCenterKey = activityCenter.getCenterType()+":"+activityCenter.getCenterId(); String subjectCenterKey = activityCenter.getCenterType()+":"+activityCenter.getCenterId();
List<TbsActivityCenterGoods> activityGoodsListOfSubjectCenter = activityGoodsOfSubjectCenter.get(subjectCenterKey); List<TbsActivityCenterGoods> activityGoodsListOfSubjectCenter = activityGoodsOfSubjectCenter.get(subjectCenterKey);
//当前成本中心分配金额 //当前成本中心分配金额
BigDecimal currentCenterAmount; BigDecimal currentCenterAmount = BigDecimal.ZERO;
if(isCenterCommit){
//刷洗自定义成本中心金额
for (VtbVerificationSubjectCenter subjectCenter : subjectCenterList) {
if(subjectCenter.getActivityCenterId().equals(activityCenter.getId())){
currentCenterAmount = subjectCenter.getUsedAmount();
}
}
buildFundFlows(verificationId, addFundFlowList, activityGoodsListOfSubjectCenter,currentCenterAmount);
}else {
//按比例分配
if(i == activityCenters.size()-1){ if(i == activityCenters.size()-1){
currentCenterAmount = usedAmount.subtract(preCenterAmount); currentCenterAmount = usedAmount.subtract(preCenterAmount);
}else { }else {
@ -1218,6 +1240,9 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe
buildFundFlows(verificationId, addFundFlowList, activityGoodsListOfSubjectCenter,currentCenterAmount); buildFundFlows(verificationId, addFundFlowList, activityGoodsListOfSubjectCenter,currentCenterAmount);
} }
}
//调用支付接口
BmsSubject subject = new BmsSubject(); BmsSubject subject = new BmsSubject();
subject.setSubjectCode(verificationSubject.getSubjectCode()); subject.setSubjectCode(verificationSubject.getSubjectCode());
subject.setSubjectName(verificationSubject.getSubjectName()); subject.setSubjectName(verificationSubject.getSubjectName());
@ -1267,6 +1292,9 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe
// log.error("发送对象到OA服务失败,数据内容如下:{}",JsonUtil.objectToJson(apticlaim)); // log.error("发送对象到OA服务失败,数据内容如下:{}",JsonUtil.objectToJson(apticlaim));
// } // }
} }
fundFlowService.saveBatch(addFundFlowList); fundFlowService.saveBatch(addFundFlowList);
//更新已用费用记录,并更新活动状态是否完成 //更新已用费用记录,并更新活动状态是否完成
fundFlowService.flushActivityAmount(verification.getActivityId()); fundFlowService.flushActivityAmount(verification.getActivityId());
@ -1276,6 +1304,7 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe
VtbVerificationSubject subjectParam = new VtbVerificationSubject(); VtbVerificationSubject subjectParam = new VtbVerificationSubject();
subjectParam.setEffectiveFlag(1); subjectParam.setEffectiveFlag(1);
verificationSubjectService.update(subjectParam,subjectLqw); verificationSubjectService.update(subjectParam,subjectLqw);
//TODO 更新成本中心维度
BigDecimal totalCostApplyUsed = costApply.getTotalActivityUsedAmount().add(verification.getAmount()); BigDecimal totalCostApplyUsed = costApply.getTotalActivityUsedAmount().add(verification.getAmount());
TbsCostApply updCost = new TbsCostApply(); TbsCostApply updCost = new TbsCostApply();
@ -1323,7 +1352,7 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe
* @param verificationId * @param verificationId
* @param addFundFlowList * @param addFundFlowList
* @param activityCenterGoodsOfSubject * @param activityCenterGoodsOfSubject
* @param usedAmount * @param usedAmount 成本中心维度
*/ */
private void buildFundFlows(Long verificationId, private void buildFundFlows(Long verificationId,
List<VtbFundFlow> addFundFlowList, List<VtbFundFlow> addFundFlowList,
@ -1343,9 +1372,9 @@ public class VtbVerificationServiceImpl extends ServiceImpl<VtbVerificationMappe
currentTimeAmount = usedAmount.subtract(totalPrefixAmount); currentTimeAmount = usedAmount.subtract(totalPrefixAmount);
}else { }else {
currentTimeAmount = usedAmount.multiply(centerGoods.getCenterGoodsRate()) currentTimeAmount = usedAmount.multiply(centerGoods.getCenterGoodsRate())
.multiply(centerGoods.getCenterRate()) //.multiply(centerGoods.getCenterRate())
//四舍五入保留两位小数 //四舍五入保留两位小数
.divide(new BigDecimal("10000"), RoundingMode.HALF_DOWN) .divide(new BigDecimal("100"), RoundingMode.HALF_DOWN)
.setScale(2, RoundingMode.DOWN);; .setScale(2, RoundingMode.DOWN);;
} }
//可用金额 //可用金额

14
src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationSubjectCenterServiceImpl.java

@ -36,5 +36,19 @@ public class VtbVerificationSubjectCenterServiceImpl extends ServiceImpl<VtbVeri
return this.list(lqw); return this.list(lqw);
} }
@Override
public List<VtbVerificationSubjectCenter> listByActivityId(Long id) {
LambdaQueryWrapper<VtbVerificationSubjectCenter> lqw = new LambdaQueryWrapper<>();
lqw.eq(VtbVerificationSubjectCenter::getActivityId,id);
return this.list(lqw);
}
@Override
public List<VtbVerificationSubjectCenter> listEffectiveByActivityId(Long id) {
LambdaQueryWrapper<VtbVerificationSubjectCenter> lqw = new LambdaQueryWrapper<>();
lqw.eq(VtbVerificationSubjectCenter::getActivityId,id);
lqw.eq(VtbVerificationSubjectCenter::getEffectiveFlag,1);
return this.list(lqw);
}
} }

Loading…
Cancel
Save