1.1.11 回款确认同步合同订单回款比例。

dev
yinq 4 weeks ago
parent 35f68d7584
commit e09ca4407c

@ -63,12 +63,12 @@ public class ErpProjectPlanStage extends TenantEntity {
/**
* (%)
*/
private Long repaymentRate;
private BigDecimal repaymentRate;
/**
*
*/
private Long repaymentAmount;
private BigDecimal repaymentAmount;
/**
*

@ -62,12 +62,12 @@ public class ErpProjectPlanStageBo extends BaseEntity {
/**
* (%)
*/
private Long repaymentRate;
private BigDecimal repaymentRate;
/**
*
*/
private Long repaymentAmount;
private BigDecimal repaymentAmount;
/**
*

@ -29,20 +29,28 @@ public class ContractCollectionStageDetailVo {
* payment_stage_id
*/
private Long planStageId;
private Long repaymentRate;
private BigDecimal repaymentRate;
/**
*
*
*/
private Long repaymentAmount;
private BigDecimal repaymentAmount;
/**
* erp_project_info.amount
*/
private BigDecimal contractTotalPrice;
private Date receivableDate;
private BigDecimal actualRepaymentAmount;
/**
* (%) erp_project_plan_stage
* (%) = / * 100 erp_project_plan_stage
*/
private BigDecimal actualRepaymentRate;
private Long collectionConfirmUserId;
/**
* sys_user.nick_name
*/
private String collectionConfirmNickName;
private Date collectionConfirmTime;
private String collectionConfirmStatus;
private String collectionConfirmRemark;

@ -84,13 +84,13 @@ public class ErpProjectPlanStageVo implements Serializable {
* (%)
*/
@ExcelProperty(value = "预计回款比例(%)")
private Long repaymentRate;
private BigDecimal repaymentRate;
/**
*
*/
@ExcelProperty(value = "预计回款金额")
private Long repaymentAmount;
private BigDecimal repaymentAmount;
/**
*

@ -22,6 +22,7 @@ import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.oa.erp.constant.ProjectCategoryConstant;
import org.dromara.oa.base.domain.BasePaymentStage;
import org.dromara.oa.erp.domain.ErpProjectInfo;
import org.dromara.oa.erp.domain.ErpProjectPlan;
import org.dromara.oa.erp.domain.ErpProjectPlanStage;
import org.dromara.oa.erp.domain.bo.ErpProjectPlanBo;
@ -30,6 +31,7 @@ import org.dromara.oa.erp.domain.vo.ContractCollectionPageVo;
import org.dromara.oa.erp.domain.vo.ContractCollectionStageDetailVo;
import org.dromara.oa.erp.domain.vo.ErpProjectPlanStageVo;
import org.dromara.oa.erp.domain.vo.ErpProjectPlanVo;
import org.dromara.oa.erp.mapper.ErpProjectInfoMapper;
import org.dromara.oa.erp.mapper.ErpProjectPlanMapper;
import org.dromara.oa.erp.mapper.ErpProjectPlanStageMapper;
import org.dromara.oa.erp.service.IErpProjectPlanService;
@ -63,6 +65,8 @@ public class ErpProjectPlanServiceImpl implements IErpProjectPlanService {
private final ErpProjectPlanStageMapper planStageMapper;
private final ErpProjectInfoMapper projectInfoMapper;
@DubboReference(timeout = 30000)
private RemoteWorkflowService remoteWorkflowService;
@ -391,22 +395,21 @@ public class ErpProjectPlanServiceImpl implements IErpProjectPlanService {
}
stage.setReceivableDate(bo.getReceivableDate());
stage.setActualRepaymentAmount(bo.getActualRepaymentAmount());
stage.setActualRepaymentRate(calcActualRepaymentRate(bo.getActualRepaymentAmount(), stage.getRepaymentAmount()));
BigDecimal contractOrderAmount = resolveContractOrderAmount(stage.getProjectPlanId(), stage.getProjectId());
stage.setActualRepaymentRate(calcActualRepaymentRate(bo.getActualRepaymentAmount(), contractOrderAmount));
stage.setCollectionConfirmRemark(bo.getCollectionConfirmRemark());
stage.setCollectionConfirmUserId(LoginHelper.getUserId());
stage.setCollectionConfirmTime(new Date());
String confirmStatus = bo.getCollectionConfirmStatus();
if (StringUtils.isBlank(confirmStatus)) {
BigDecimal expected = stage.getRepaymentAmount() == null ? BigDecimal.ZERO : BigDecimal.valueOf(stage.getRepaymentAmount());
BigDecimal actual = bo.getActualRepaymentAmount() == null ? BigDecimal.ZERO : bo.getActualRepaymentAmount();
if (actual.compareTo(BigDecimal.ZERO) <= 0) {
confirmStatus = "0";
} else if (expected.compareTo(BigDecimal.ZERO) > 0 && actual.compareTo(expected) >= 0) {
confirmStatus = "2";
} else {
confirmStatus = "1";
}
String confirmStatus = "0";
BigDecimal expected = stage.getRepaymentAmount() == null ? BigDecimal.ZERO : stage.getRepaymentAmount();
BigDecimal actual = bo.getActualRepaymentAmount() == null ? BigDecimal.ZERO : bo.getActualRepaymentAmount();
if (actual.compareTo(BigDecimal.ZERO) <= 0) {
confirmStatus = "0";
} else if (expected.compareTo(BigDecimal.ZERO) > 0 && actual.compareTo(expected) >= 0) {
confirmStatus = "2";
} else {
confirmStatus = "1";
}
stage.setCollectionConfirmStatus(confirmStatus);
@ -416,23 +419,80 @@ public class ErpProjectPlanServiceImpl implements IErpProjectPlanService {
if (StringUtils.isNotBlank(bo.getReasonsExplanation())) {
stage.setReasonsExplanation(bo.getReasonsExplanation());
}
return planStageMapper.updateById(stage) > 0;
boolean updated = planStageMapper.updateById(stage) > 0;
if (updated) {
refreshContractOrderPaymentRate(stage.getProjectPlanId(), stage.getProjectId());
}
return updated;
}
/**
* (%) = / * 100
*
* @param actualRepaymentAmount
* @param repaymentAmount
* actual_repayment_rate(%) erp_project_info.order_payment_rate
*/
private BigDecimal calcActualRepaymentRate(BigDecimal actualRepaymentAmount, Long repaymentAmount) {
private void refreshContractOrderPaymentRate(Long projectPlanId, Long projectIdFromStage) {
if (projectPlanId == null) {
return;
}
List<ErpProjectPlanStage> stages = planStageMapper.selectList(
Wrappers.lambdaQuery(ErpProjectPlanStage.class)
.eq(ErpProjectPlanStage::getProjectPlanId, projectPlanId)
.eq(ErpProjectPlanStage::getDelFlag, "0"));
BigDecimal sumRate = stages.stream()
.map(s -> s.getActualRepaymentRate() != null ? s.getActualRepaymentRate() : BigDecimal.ZERO)
.reduce(BigDecimal.ZERO, BigDecimal::add)
.setScale(2, RoundingMode.HALF_UP);
Long projectId = projectIdFromStage;
if (projectId == null) {
ErpProjectPlan plan = baseMapper.selectById(projectPlanId);
if (plan == null) {
return;
}
projectId = plan.getProjectId();
}
if (projectId == null) {
return;
}
projectInfoMapper.update(null, Wrappers.<ErpProjectInfo>lambdaUpdate()
.set(ErpProjectInfo::getOrderPaymentRate, sumRate)
.eq(ErpProjectInfo::getProjectId, projectId));
}
/**
* erp_project_info.amount
*/
private BigDecimal resolveContractOrderAmount(Long projectPlanId, Long projectIdFromStage) {
Long projectId = projectIdFromStage;
if (projectId == null && projectPlanId != null) {
ErpProjectPlan plan = baseMapper.selectById(projectPlanId);
if (plan != null) {
projectId = plan.getProjectId();
}
}
if (projectId == null) {
return null;
}
ErpProjectInfo project = projectInfoMapper.selectById(projectId);
if (project == null || project.getAmount() == null) {
return null;
}
return project.getAmount();
}
/**
* (%) = / * 100
*
* @param actualRepaymentAmount
* @param contractOrderAmount erp_project_info.amount
*/
private BigDecimal calcActualRepaymentRate(BigDecimal actualRepaymentAmount, BigDecimal contractOrderAmount) {
BigDecimal actual = actualRepaymentAmount == null ? BigDecimal.ZERO : actualRepaymentAmount;
BigDecimal expected = repaymentAmount == null ? BigDecimal.ZERO : BigDecimal.valueOf(repaymentAmount);
if (expected.compareTo(BigDecimal.ZERO) <= 0) {
BigDecimal total = contractOrderAmount == null ? BigDecimal.ZERO : contractOrderAmount;
if (total.compareTo(BigDecimal.ZERO) <= 0) {
return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
}
return actual
.divide(expected, 6, RoundingMode.HALF_UP)
.divide(total, 6, RoundingMode.HALF_UP)
.multiply(BigDecimal.valueOf(100))
.setScale(2, RoundingMode.HALF_UP);
}

@ -420,25 +420,29 @@
ps.repayment_amount,
ps.receivable_date,
ps.actual_repayment_amount,
pi.amount as contractTotalPrice,
case
when ps.plan_stage_id is null then null
when ps.actual_repayment_rate is not null then ps.actual_repayment_rate
when ps.repayment_amount is null or ps.repayment_amount = 0 then 0
else round(ifnull(ps.actual_repayment_amount, 0) * 100 / ps.repayment_amount, 2)
when pi.amount is null or pi.amount = 0 then 0
else round(ifnull(ps.actual_repayment_amount, 0) * 100 / pi.amount, 2)
end as actual_repayment_rate,
ps.collection_confirm_user_id,
ps.collection_confirm_time,
ps.collection_confirm_status,
ps.collection_confirm_remark
ps.collection_confirm_remark,
ucc.nick_name as collectionConfirmNickName
from erp_project_plan pp
inner join erp_contract_payment_method pm
on pm.contract_id = pp.contract_id and pm.del_flag = '0'
left join erp_project_info pi on pi.project_id = pp.project_id and pi.del_flag = '0'
left join base_payment_stage bps on bps.payment_stage_id = pm.payment_stage_id
left join erp_project_plan_stage ps
on ps.project_plan_id = pp.project_plan_id
and ps.del_flag = '0'
and ps.payment_stage_id is not null
and ps.payment_stage_id = pm.payment_stage_id
left join sys_user ucc on ps.collection_confirm_user_id = ucc.user_id
where pp.project_plan_id = #{projectPlanId}
and pp.del_flag = '0'
order by pm.sort_order asc

Loading…
Cancel
Save