|
@@ -0,0 +1,194 @@
|
|
|
|
+package com.fjhx.service.contract.impl;
|
|
|
|
+
|
|
|
|
+import cn.hutool.core.date.DateUtil;
|
|
|
|
+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.entity.contract.Contract;
|
|
|
|
+import com.fjhx.entity.contract.ContractPay;
|
|
|
|
+import com.fjhx.enums.ContractPayStatusEnum;
|
|
|
|
+import com.fjhx.enums.ContractStatusEnum;
|
|
|
|
+import com.fjhx.mapper.contract.ContractPayMapper;
|
|
|
|
+import com.fjhx.params.contract.ContractPayVo;
|
|
|
|
+import com.fjhx.params.contract.DateStatisticsResult;
|
|
|
|
+import com.fjhx.service.contract.ContractPayService;
|
|
|
|
+import com.fjhx.service.contract.ContractService;
|
|
|
|
+import com.fjhx.utils.WrapperUtil;
|
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
+
|
|
|
|
+import java.math.BigDecimal;
|
|
|
|
+import java.util.Date;
|
|
|
|
+import java.util.LinkedHashMap;
|
|
|
|
+import java.util.List;
|
|
|
|
+import java.util.Map;
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * <p>
|
|
|
|
+ * 合同付款 服务实现类
|
|
|
|
+ * </p>
|
|
|
|
+ *
|
|
|
|
+ * @author ${author}
|
|
|
|
+ * @since 2022-09-29
|
|
|
|
+ */
|
|
|
|
+@Service
|
|
|
|
+public class ContractPayServiceImpl extends ServiceImpl<ContractPayMapper, ContractPay> implements ContractPayService {
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private ContractService contractService;
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public Page<ContractPay> getPage(Map<String, String> condition) {
|
|
|
|
+
|
|
|
|
+ QueryWrapper<ContractPay> wrapper = Wrappers.query();
|
|
|
|
+
|
|
|
|
+ WrapperUtil.init(condition, wrapper)
|
|
|
|
+ .createTimeDesc();
|
|
|
|
+
|
|
|
|
+ Page<ContractPay> page = page(condition, wrapper);
|
|
|
|
+ return page;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void add(ContractPayVo contractPayVo) {
|
|
|
|
+ save(contractPayVo);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void edit(ContractPayVo contractPayVo) {
|
|
|
|
+ updateById(contractPayVo);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void delete(ContractPayVo contractPayVo) {
|
|
|
|
+ removeById(contractPayVo.getId());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public Map<Integer, DateStatisticsResult> dateStatistics() {
|
|
|
|
+
|
|
|
|
+ Date date = new Date();
|
|
|
|
+
|
|
|
|
+ // 获取合同完成但未付款的数据
|
|
|
|
+ List<Contract> contractList = contractService.list(Wrappers.<Contract>lambdaQuery()
|
|
|
|
+ .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);
|
|
|
|
+
|
|
|
|
+ for (Contract contract : contractList) {
|
|
|
|
+ // 付款日期
|
|
|
|
+ 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));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return result;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 合同付款时间段统计返回值初始化
|
|
|
|
+ *
|
|
|
|
+ * @param date 当前日期
|
|
|
|
+ */
|
|
|
|
+ private Map<Integer, DateStatisticsResult> dateStatisticsResultInit(Date date) {
|
|
|
|
+
|
|
|
|
+ Map<Integer, DateStatisticsResult> result = new LinkedHashMap<>();
|
|
|
|
+
|
|
|
|
+ // 本月1号
|
|
|
|
+ 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;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return result;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ private DateStatisticsResult getDateStatisticsResult(Integer type, Date beginTime, Date endTime) {
|
|
|
|
+ DateStatisticsResult dateStatisticsResult = new DateStatisticsResult();
|
|
|
|
+ dateStatisticsResult.setType(type);
|
|
|
|
+ dateStatisticsResult.setShowDate(DateUtil.format(endTime, "MM月dd日"));
|
|
|
|
+ dateStatisticsResult.setBeginTime(beginTime);
|
|
|
|
+ dateStatisticsResult.setEndTime(endTime);
|
|
|
|
+ return dateStatisticsResult;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+}
|