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

dev
yinq 3 months 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 * payment_stage_id
*/ */
private Long planStageId; 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 Date receivableDate;
private BigDecimal actualRepaymentAmount; private BigDecimal actualRepaymentAmount;
/** /**
* (%) erp_project_plan_stage * (%) = / * 100 erp_project_plan_stage
*/ */
private BigDecimal actualRepaymentRate; private BigDecimal actualRepaymentRate;
private Long collectionConfirmUserId; private Long collectionConfirmUserId;
/**
* sys_user.nick_name
*/
private String collectionConfirmNickName;
private Date collectionConfirmTime; private Date collectionConfirmTime;
private String collectionConfirmStatus; private String collectionConfirmStatus;
private String collectionConfirmRemark; private String collectionConfirmRemark;

@ -84,13 +84,13 @@ public class ErpProjectPlanStageVo implements Serializable {
* (%) * (%)
*/ */
@ExcelProperty(value = "预计回款比例(%)") @ExcelProperty(value = "预计回款比例(%)")
private Long repaymentRate; private BigDecimal repaymentRate;
/** /**
* *
*/ */
@ExcelProperty(value = "预计回款金额") @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.common.tenant.helper.TenantHelper;
import org.dromara.oa.erp.constant.ProjectCategoryConstant; import org.dromara.oa.erp.constant.ProjectCategoryConstant;
import org.dromara.oa.base.domain.BasePaymentStage; 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.ErpProjectPlan;
import org.dromara.oa.erp.domain.ErpProjectPlanStage; import org.dromara.oa.erp.domain.ErpProjectPlanStage;
import org.dromara.oa.erp.domain.bo.ErpProjectPlanBo; 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.ContractCollectionStageDetailVo;
import org.dromara.oa.erp.domain.vo.ErpProjectPlanStageVo; import org.dromara.oa.erp.domain.vo.ErpProjectPlanStageVo;
import org.dromara.oa.erp.domain.vo.ErpProjectPlanVo; 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.ErpProjectPlanMapper;
import org.dromara.oa.erp.mapper.ErpProjectPlanStageMapper; import org.dromara.oa.erp.mapper.ErpProjectPlanStageMapper;
import org.dromara.oa.erp.service.IErpProjectPlanService; import org.dromara.oa.erp.service.IErpProjectPlanService;
@ -63,6 +65,8 @@ public class ErpProjectPlanServiceImpl implements IErpProjectPlanService {
private final ErpProjectPlanStageMapper planStageMapper; private final ErpProjectPlanStageMapper planStageMapper;
private final ErpProjectInfoMapper projectInfoMapper;
@DubboReference(timeout = 30000) @DubboReference(timeout = 30000)
private RemoteWorkflowService remoteWorkflowService; private RemoteWorkflowService remoteWorkflowService;
@ -391,22 +395,21 @@ public class ErpProjectPlanServiceImpl implements IErpProjectPlanService {
} }
stage.setReceivableDate(bo.getReceivableDate()); stage.setReceivableDate(bo.getReceivableDate());
stage.setActualRepaymentAmount(bo.getActualRepaymentAmount()); 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.setCollectionConfirmRemark(bo.getCollectionConfirmRemark());
stage.setCollectionConfirmUserId(LoginHelper.getUserId()); stage.setCollectionConfirmUserId(LoginHelper.getUserId());
stage.setCollectionConfirmTime(new Date()); stage.setCollectionConfirmTime(new Date());
String confirmStatus = bo.getCollectionConfirmStatus(); String confirmStatus = "0";
if (StringUtils.isBlank(confirmStatus)) { BigDecimal expected = stage.getRepaymentAmount() == null ? BigDecimal.ZERO : stage.getRepaymentAmount();
BigDecimal expected = stage.getRepaymentAmount() == null ? BigDecimal.ZERO : BigDecimal.valueOf(stage.getRepaymentAmount()); BigDecimal actual = bo.getActualRepaymentAmount() == null ? BigDecimal.ZERO : bo.getActualRepaymentAmount();
BigDecimal actual = bo.getActualRepaymentAmount() == null ? BigDecimal.ZERO : bo.getActualRepaymentAmount(); if (actual.compareTo(BigDecimal.ZERO) <= 0) {
if (actual.compareTo(BigDecimal.ZERO) <= 0) { confirmStatus = "0";
confirmStatus = "0"; } else if (expected.compareTo(BigDecimal.ZERO) > 0 && actual.compareTo(expected) >= 0) {
} else if (expected.compareTo(BigDecimal.ZERO) > 0 && actual.compareTo(expected) >= 0) { confirmStatus = "2";
confirmStatus = "2"; } else {
} else { confirmStatus = "1";
confirmStatus = "1";
}
} }
stage.setCollectionConfirmStatus(confirmStatus); stage.setCollectionConfirmStatus(confirmStatus);
@ -416,23 +419,80 @@ public class ErpProjectPlanServiceImpl implements IErpProjectPlanService {
if (StringUtils.isNotBlank(bo.getReasonsExplanation())) { if (StringUtils.isNotBlank(bo.getReasonsExplanation())) {
stage.setReasonsExplanation(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 * actual_repayment_rate(%) erp_project_info.order_payment_rate
*
* @param actualRepaymentAmount
* @param repaymentAmount
*/ */
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 actual = actualRepaymentAmount == null ? BigDecimal.ZERO : actualRepaymentAmount;
BigDecimal expected = repaymentAmount == null ? BigDecimal.ZERO : BigDecimal.valueOf(repaymentAmount); BigDecimal total = contractOrderAmount == null ? BigDecimal.ZERO : contractOrderAmount;
if (expected.compareTo(BigDecimal.ZERO) <= 0) { if (total.compareTo(BigDecimal.ZERO) <= 0) {
return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP); return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
} }
return actual return actual
.divide(expected, 6, RoundingMode.HALF_UP) .divide(total, 6, RoundingMode.HALF_UP)
.multiply(BigDecimal.valueOf(100)) .multiply(BigDecimal.valueOf(100))
.setScale(2, RoundingMode.HALF_UP); .setScale(2, RoundingMode.HALF_UP);
} }

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

Loading…
Cancel
Save