|
@@ -5,9 +5,11 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.fjhx.base.StorageBaseEntity;
|
|
|
import com.fjhx.entity.contract.Contract;
|
|
|
import com.fjhx.entity.contract.ContractPay;
|
|
|
import com.fjhx.enums.ContractPayStatusEnum;
|
|
|
+import com.fjhx.enums.ContractPayTypeEnum;
|
|
|
import com.fjhx.enums.ContractStatusEnum;
|
|
|
import com.fjhx.mapper.contract.ContractPayMapper;
|
|
|
import com.fjhx.params.contract.ContractPayVo;
|
|
@@ -23,6 +25,7 @@ import java.util.Date;
|
|
|
import java.util.LinkedHashMap;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* <p>
|
|
@@ -34,6 +37,17 @@ import java.util.Map;
|
|
|
*/
|
|
|
@Service
|
|
|
public class ContractPayServiceImpl extends ServiceImpl<ContractPayMapper, ContractPay> implements ContractPayService {
|
|
|
+ // 上半月
|
|
|
+ private static final String THE_FIRST_HALF_MONTH = "1";
|
|
|
+ // 下半月
|
|
|
+ private static final String THE_SECOND_HALF_MONTH = "2";
|
|
|
+
|
|
|
+ // 历史账期
|
|
|
+ private static final Integer HISTORICAL_ACCOUNTING_PERIOD = 1;
|
|
|
+ // 当前账期
|
|
|
+ private static final Integer CURRENT_ACCOUNTING_PERIOD = 2;
|
|
|
+ // 未来账期
|
|
|
+ private static final Integer FUTURE_ACCOUNTING_PERIOD = 3;
|
|
|
|
|
|
@Autowired
|
|
|
private ContractService contractService;
|
|
@@ -72,53 +86,69 @@ public class ContractPayServiceImpl extends ServiceImpl<ContractPayMapper, Contr
|
|
|
|
|
|
// 获取合同完成但未付款的数据
|
|
|
List<Contract> contractList = contractService.list(Wrappers.<Contract>lambdaQuery()
|
|
|
+ .select(Contract::getAdjustAmount, Contract::getBackAmount, Contract::getHadPayAmount,
|
|
|
+ Contract::getExpressAmount, Contract::getCompleteTime, Contract::getAccountDate)
|
|
|
.lt(Contract::getPayStatus, ContractPayStatusEnum.COMPLETED)
|
|
|
.and(q -> q.eq(Contract::getAccountDate, 0)
|
|
|
.or(w -> w.gt(Contract::getAccountDate, 0)
|
|
|
.eq(Contract::getStatus, ContractStatusEnum.COMPLETED.getType()))));
|
|
|
|
|
|
// 初始化返回结果
|
|
|
- Map<Integer, DateStatisticsResult> result = dateStatisticsResultInit(date);
|
|
|
+ Map<Integer, DateStatisticsResult> result = initResult(date);
|
|
|
|
|
|
+ // 赋值合同未付款
|
|
|
for (Contract contract : contractList) {
|
|
|
+
|
|
|
+ // 未付金额 = 质检金额 - 退货金额 - 已付金额 - 运费
|
|
|
+ BigDecimal notHadPayAmount = contract.getAdjustAmount().subtract(contract.getBackAmount())
|
|
|
+ .subtract(contract.getHadPayAmount()).subtract(contract.getExpressAmount());
|
|
|
+
|
|
|
// 付款日期
|
|
|
Date paymentDate = DateUtil.offsetDay(contract.getCompleteTime(), contract.getAccountDate());
|
|
|
- // 已付金额
|
|
|
- BigDecimal hadPayAmount = contract.getHadPayAmount();
|
|
|
- // 未付金额 = 质检金额 - 退货金额 - 已付金额 + 冲抵金额
|
|
|
- BigDecimal notHadPayAmount = contract.getAdjustAmount().subtract(contract.getBackAmount())
|
|
|
- .subtract(hadPayAmount).add(contract.getOffsetAmount());
|
|
|
-
|
|
|
- for (DateStatisticsResult item : result.values()) {
|
|
|
- if (paymentDate.compareTo(item.getEndTime()) < 0) {
|
|
|
- // 预付款
|
|
|
- if (contract.getAccountDate() == 0) {
|
|
|
- // 未付预付款
|
|
|
- if (item.getType() == 1) {
|
|
|
- result.get(2).setUnpaidPayInAdvance(item.getUnpaidPayInAdvance().add(notHadPayAmount));
|
|
|
- } else {
|
|
|
- item.setUnpaidPayInAdvance(item.getUnpaidPayInAdvance().add(notHadPayAmount));
|
|
|
- }
|
|
|
- // 已付预付款
|
|
|
- item.setPaidPayInAdvance(item.getPaidPayInAdvance().add(hadPayAmount));
|
|
|
- }
|
|
|
- // 有账期
|
|
|
- else {
|
|
|
- // 未付有账期
|
|
|
- if (item.getType() == 1) {
|
|
|
- result.get(2).setUnpaidAccountingPeriod(item.getUnpaidAccountingPeriod().add(notHadPayAmount));
|
|
|
- } else {
|
|
|
- item.setUnpaidAccountingPeriod(item.getUnpaidAccountingPeriod().add(notHadPayAmount));
|
|
|
- }
|
|
|
- // 已付有账期
|
|
|
- item.setPaidAccountingPeriod(item.getPaidAccountingPeriod().add(hadPayAmount));
|
|
|
- }
|
|
|
|
|
|
+ for (DateStatisticsResult dateStatisticsResult : result.values()) {
|
|
|
+ if (paymentDate.compareTo(dateStatisticsResult.getEndTime()) < 0) {
|
|
|
+
|
|
|
+ // 如果统计历史账期未付款,顺延到当前账期之中
|
|
|
+ DateStatisticsResult item = HISTORICAL_ACCOUNTING_PERIOD.equals(dateStatisticsResult.getType())
|
|
|
+ ? result.get(2) : dateStatisticsResult;
|
|
|
+
|
|
|
+ if (contract.getAccountDate() == 0) { // 未付预付款
|
|
|
+ item.setUnpaidPayInAdvance(item.getUnpaidPayInAdvance().add(notHadPayAmount));
|
|
|
+ } else { // 未付有账期
|
|
|
+ item.setUnpaidAccountingPeriod(item.getUnpaidAccountingPeriod().add(notHadPayAmount));
|
|
|
+ }
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ // 获取本月付款记录
|
|
|
+ List<ContractPay> contractPayList = list(Wrappers.<ContractPay>lambdaQuery()
|
|
|
+ .between(StorageBaseEntity::getCreateTime, DateUtil.beginOfMonth(date), DateUtil.endOfMonth(date)));
|
|
|
+
|
|
|
+ // 分别统计出上半月和下班月的付款
|
|
|
+ Map<String, Map<Integer, BigDecimal>> collect = contractPayList.stream().collect(Collectors.groupingBy(
|
|
|
+ contractPay -> DateUtil.betweenDay(contractPay.getCreateTime(), date, true) < 15 ? THE_FIRST_HALF_MONTH : THE_SECOND_HALF_MONTH,
|
|
|
+ Collectors.toMap(ContractPay::getType, ContractPay::getPayAmount, BigDecimal::add)
|
|
|
+ ));
|
|
|
+
|
|
|
+ // 赋值上半月付款
|
|
|
+ Map<Integer, BigDecimal> theFirstHalfMonthMap = collect.get(THE_FIRST_HALF_MONTH);
|
|
|
+ if (theFirstHalfMonthMap != null) {
|
|
|
+ DateStatisticsResult dateStatisticsResult = result.get(1);
|
|
|
+ dateStatisticsResult.setPaidPayInAdvance(theFirstHalfMonthMap.get(ContractPayTypeEnum.ADVANCE_CHARGE.getType()));
|
|
|
+ dateStatisticsResult.setPaidAccountingPeriod(theFirstHalfMonthMap.get(ContractPayTypeEnum.ACCOUNTING_PERIOD.getType()));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 赋值下半月付款
|
|
|
+ Map<Integer, BigDecimal> theSecondHalfMonthMap = collect.get(THE_SECOND_HALF_MONTH);
|
|
|
+ if (theSecondHalfMonthMap != null) {
|
|
|
+ DateStatisticsResult dateStatisticsResult = result.get(2);
|
|
|
+ dateStatisticsResult.setPaidPayInAdvance(theSecondHalfMonthMap.get(ContractPayTypeEnum.ADVANCE_CHARGE.getType()));
|
|
|
+ dateStatisticsResult.setPaidAccountingPeriod(theSecondHalfMonthMap.get(ContractPayTypeEnum.ACCOUNTING_PERIOD.getType()));
|
|
|
+ }
|
|
|
+
|
|
|
return result;
|
|
|
}
|
|
|
|
|
@@ -127,7 +157,7 @@ public class ContractPayServiceImpl extends ServiceImpl<ContractPayMapper, Contr
|
|
|
*
|
|
|
* @param date 当前日期
|
|
|
*/
|
|
|
- private Map<Integer, DateStatisticsResult> dateStatisticsResultInit(Date date) {
|
|
|
+ private Map<Integer, DateStatisticsResult> initResult(Date date) {
|
|
|
|
|
|
Map<Integer, DateStatisticsResult> result = new LinkedHashMap<>();
|
|
|
|
|
@@ -135,52 +165,44 @@ public class ContractPayServiceImpl extends ServiceImpl<ContractPayMapper, Contr
|
|
|
Date beginOfMonth = DateUtil.beginOfMonth(date);
|
|
|
// 本月15号
|
|
|
Date midOfMonth = DateUtil.offsetDay(beginOfMonth, 14);
|
|
|
- // 本月最后一天
|
|
|
- Date endOfMonth = DateUtil.endOfMonth(date);
|
|
|
// 下月1号
|
|
|
Date nextBeginOfMonth = DateUtil.offsetMonth(beginOfMonth, 1);
|
|
|
// 下月15号
|
|
|
Date nextMidOfMonth = DateUtil.offsetMonth(midOfMonth, 1);
|
|
|
- // 下月最后一天
|
|
|
- Date nextEndOfMonth = DateUtil.endOfMonth(nextBeginOfMonth);
|
|
|
// 下下月1号
|
|
|
Date nextTwoBeginOfMonth = DateUtil.offsetMonth(beginOfMonth, 2);
|
|
|
// 下下月15号
|
|
|
Date nextTwoMidOfMonth = DateUtil.offsetMonth(midOfMonth, 2);
|
|
|
- // 下下月最后一天
|
|
|
- Date nextTwoEndOfMonth = DateUtil.endOfMonth(nextTwoBeginOfMonth);
|
|
|
|
|
|
// 距离月初有几天
|
|
|
long day = DateUtil.betweenDay(date, beginOfMonth, true);
|
|
|
|
|
|
// 当前月和未来2个月一共6个账期
|
|
|
- for (int i = 1; i <= 6; i++) {
|
|
|
- switch (i) {
|
|
|
- case 1:
|
|
|
- result.put(i, getDateStatisticsResult(day < 15 ? 2 : 1, beginOfMonth, DateUtil.endOfDay(midOfMonth)));
|
|
|
- break;
|
|
|
- case 2:
|
|
|
- result.put(i, getDateStatisticsResult(day < 15 ? 3 : 2, DateUtil.offsetDay(midOfMonth, 1), endOfMonth));
|
|
|
- break;
|
|
|
- case 3:
|
|
|
- result.put(i, getDateStatisticsResult(3, nextBeginOfMonth, DateUtil.endOfDay(nextMidOfMonth)));
|
|
|
- break;
|
|
|
- case 4:
|
|
|
- result.put(i, getDateStatisticsResult(3, DateUtil.offsetDay(nextMidOfMonth, 1), nextEndOfMonth));
|
|
|
- break;
|
|
|
- case 5:
|
|
|
- result.put(i, getDateStatisticsResult(3, nextTwoBeginOfMonth, DateUtil.endOfDay(nextTwoMidOfMonth)));
|
|
|
- break;
|
|
|
- case 6:
|
|
|
- result.put(i, getDateStatisticsResult(3, DateUtil.offsetDay(nextTwoMidOfMonth, 1), nextTwoEndOfMonth));
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
+ result.put(1, getDateStatisticsResult(day > 15 ? HISTORICAL_ACCOUNTING_PERIOD : CURRENT_ACCOUNTING_PERIOD,
|
|
|
+ beginOfMonth, DateUtil.endOfDay(midOfMonth)));
|
|
|
+
|
|
|
+ result.put(2, getDateStatisticsResult(day > 15 ? CURRENT_ACCOUNTING_PERIOD : FUTURE_ACCOUNTING_PERIOD,
|
|
|
+ DateUtil.offsetDay(midOfMonth, 1), DateUtil.endOfMonth(date)));
|
|
|
+
|
|
|
+ result.put(3, getDateStatisticsResult(FUTURE_ACCOUNTING_PERIOD,
|
|
|
+ nextBeginOfMonth, DateUtil.endOfDay(nextMidOfMonth)));
|
|
|
+
|
|
|
+ result.put(4, getDateStatisticsResult(FUTURE_ACCOUNTING_PERIOD,
|
|
|
+ DateUtil.offsetDay(nextMidOfMonth, 1), DateUtil.endOfMonth(nextBeginOfMonth)));
|
|
|
+
|
|
|
+ result.put(5, getDateStatisticsResult(FUTURE_ACCOUNTING_PERIOD,
|
|
|
+ nextTwoBeginOfMonth, DateUtil.endOfDay(nextTwoMidOfMonth)));
|
|
|
+
|
|
|
+ result.put(6, getDateStatisticsResult(FUTURE_ACCOUNTING_PERIOD,
|
|
|
+ DateUtil.offsetDay(nextTwoMidOfMonth, 1), DateUtil.endOfMonth(nextTwoBeginOfMonth)));
|
|
|
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
+ * 生成返回结果集
|
|
|
+ */
|
|
|
private DateStatisticsResult getDateStatisticsResult(Integer type, Date beginTime, Date endTime) {
|
|
|
DateStatisticsResult dateStatisticsResult = new DateStatisticsResult();
|
|
|
dateStatisticsResult.setType(type);
|