|
@@ -1,5 +1,7 @@
|
|
|
package com.fjhx.service.contract.impl;
|
|
|
|
|
|
+import cn.hutool.core.convert.Convert;
|
|
|
+import cn.hutool.core.date.DateTime;
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
@@ -8,6 +10,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.fjhx.base.Condition;
|
|
|
import com.fjhx.base.StorageBaseEntity;
|
|
|
+import com.fjhx.constants.StatusConstant;
|
|
|
import com.fjhx.entity.contract.Contract;
|
|
|
import com.fjhx.entity.contract.ContractPay;
|
|
|
import com.fjhx.enums.ContractPayStatusEnum;
|
|
@@ -20,6 +23,7 @@ import com.fjhx.params.contract.SupplierInfo;
|
|
|
import com.fjhx.params.contract.SupplierStatisticsResult;
|
|
|
import com.fjhx.service.contract.ContractPayService;
|
|
|
import com.fjhx.service.contract.ContractService;
|
|
|
+import com.fjhx.utils.BigDecimalUtil;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
@@ -79,7 +83,7 @@ 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)
|
|
|
+ .lt(Contract::getPayStatus, ContractPayStatusEnum.COMPLETED.getType())
|
|
|
.and(q -> q.eq(Contract::getAccountDate, 0)
|
|
|
.or(w -> w.gt(Contract::getAccountDate, 0)
|
|
|
.eq(Contract::getStatus, ContractStatusEnum.COMPLETED.getType()))));
|
|
@@ -101,11 +105,11 @@ public class ContractPayServiceImpl extends ServiceImpl<ContractPayMapper, Contr
|
|
|
DateStatisticsResult item = HISTORICAL_ACCOUNTING_PERIOD.equals(dateStatisticsResult.getType())
|
|
|
? result.get(2) : dateStatisticsResult;
|
|
|
|
|
|
- if (contract.getAccountDate() == 0) { // 未付预付款
|
|
|
- item.setUnpaidPayInAdvance(item.getUnpaidPayInAdvance().add(notHadPayAmount));
|
|
|
- } else { // 未付有账期
|
|
|
+ // 未付有账期
|
|
|
+ if (contract.getAccountDate() > 0) {
|
|
|
item.setUnpaidAccountingPeriod(item.getUnpaidAccountingPeriod().add(notHadPayAmount));
|
|
|
}
|
|
|
+
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
@@ -198,11 +202,39 @@ public class ContractPayServiceImpl extends ServiceImpl<ContractPayMapper, Contr
|
|
|
@Override
|
|
|
public Page<Map<String, Object>> getPage(Condition condition) {
|
|
|
|
|
|
+ // 历史账期没有待付款记录
|
|
|
+ if (HISTORICAL_ACCOUNTING_PERIOD.equals(condition.getType())) {
|
|
|
+ return new Page<>();
|
|
|
+ }
|
|
|
+
|
|
|
+ Date date = new Date();
|
|
|
+
|
|
|
QueryWrapper<Object> wrapper = Wrappers.query();
|
|
|
+
|
|
|
+ // 拼接合同查询条件
|
|
|
splicingContractSelectCondition(wrapper);
|
|
|
|
|
|
+ // 拼接传入查询条件
|
|
|
+ splicingPageWrapper(wrapper, condition);
|
|
|
+
|
|
|
Page<Map<String, Object>> page = baseMapper.getPage(condition.getPage(), wrapper);
|
|
|
|
|
|
+ List<Map<String, Object>> records = page.getRecords();
|
|
|
+
|
|
|
+ if (records.size() == 0) {
|
|
|
+ return page;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (Map<String, Object> record : records) {
|
|
|
+ // 赋值付款期限
|
|
|
+ setTermsPayment(date, record);
|
|
|
+ // 质检是否完成
|
|
|
+ record.put("qualityTestingComplete", ObjectUtil.equals(record.get("batchCount"), record.get("qualityTestingCount")));
|
|
|
+ // 合同是否完成
|
|
|
+ record.put("contractComplete", Convert.toInt(record.get("contractFileCount")) > 0);
|
|
|
+ // 发票是否完成
|
|
|
+ record.put("invoiceComplete", BigDecimalUtil.ge(record.get("invoiceAmount"), record.get("adjustAmount")));
|
|
|
+ }
|
|
|
|
|
|
return page;
|
|
|
}
|
|
@@ -284,10 +316,115 @@ public class ContractPayServiceImpl extends ServiceImpl<ContractPayMapper, Contr
|
|
|
* 拼接合同查询条件
|
|
|
*/
|
|
|
private void splicingContractSelectCondition(QueryWrapper<Object> wrapper) {
|
|
|
- wrapper.lt("c.pay_status", ContractPayStatusEnum.COMPLETED)
|
|
|
+ wrapper.eq("c.del_flag", StatusConstant.NOT_DELETED)
|
|
|
+ .lt("c.pay_status", ContractPayStatusEnum.COMPLETED.getType())
|
|
|
.and(q -> q.eq("c.account_date", 0)
|
|
|
.or(w -> w.gt("c.account_date", 0)
|
|
|
.eq("c.status", ContractStatusEnum.COMPLETED.getType())));
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 赋值付款期限
|
|
|
+ */
|
|
|
+ private void setTermsPayment(Date date, Map<String, Object> record) {
|
|
|
+ // 完成时间
|
|
|
+ Date completeTime = Convert.toDate(record.get("completeTime"));
|
|
|
+ // 账期
|
|
|
+ Integer accountDate = Convert.toInt(record.get("accountDate"));
|
|
|
+ // 完成时间到今天距离多少天
|
|
|
+ long day = DateUtil.betweenDay(completeTime, date, true);
|
|
|
+
|
|
|
+ // 赋值付钱期限(距离账期还要多少天,负值为超过付款日期多少天)
|
|
|
+ record.put("termsPayment", accountDate - day);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 拼接分页查询条件
|
|
|
+ */
|
|
|
+ private void splicingPageWrapper(QueryWrapper<Object> wrapper, Condition condition) {
|
|
|
+
|
|
|
+ Long supplierId = condition.getLong("supplierId");
|
|
|
+ Integer type = condition.getType();
|
|
|
+ String beginTime = condition.getStr("beginTime");
|
|
|
+ String endTime = condition.getStr("endTime");
|
|
|
+
|
|
|
+ Integer status = condition.getStatus();
|
|
|
+ Integer accountStatus = condition.getInt("accountStatus");
|
|
|
+
|
|
|
+ Date date = new Date();
|
|
|
+
|
|
|
+ // 付款时间:最后入库时间 + 账期
|
|
|
+ String whereTime = "date_add( c.complete_time , interval c.account_date day)";
|
|
|
+
|
|
|
+ wrapper
|
|
|
+ // 供应商
|
|
|
+ .eq(ObjectUtil.isNotEmpty(supplierId), "c.supplier_id", supplierId)
|
|
|
+ // 账期
|
|
|
+ .func(type != null, q -> {
|
|
|
+ if (CURRENT_ACCOUNTING_PERIOD.equals(type)) {
|
|
|
+ q.le(whereTime, endTime);
|
|
|
+ } else {
|
|
|
+ q.between(whereTime, beginTime, endTime);
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ .func(q -> {
|
|
|
+ // 可发起
|
|
|
+ if (ObjectUtil.equals(status, 1)) {
|
|
|
+ q.apply("c.apply_pay_amount = 0 " +
|
|
|
+ "and t.batchCount = t.qualityTestingCount " +
|
|
|
+ "and t.contractFileCount > 0 " +
|
|
|
+ "and c.invoice_amount >= c.adjust_amount");
|
|
|
+ }
|
|
|
+ // 待补齐
|
|
|
+ else if (ObjectUtil.equals(status, 2)) {
|
|
|
+ q.apply("t.batchCount != t.qualityTestingCount " +
|
|
|
+ "or t.contractFileCount <= 0 " +
|
|
|
+ "or c.invoice_amount < c.adjust_amount");
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ .func(q -> {
|
|
|
+ // 本周期
|
|
|
+ if (ObjectUtil.equals(accountStatus, 1)) {
|
|
|
+ q.between(whereTime, getCurrentAccountBeginTime(date), getCurrentAccountEndTime(date));
|
|
|
+ }
|
|
|
+ // 上周期顺延
|
|
|
+ else if (ObjectUtil.equals(accountStatus, 2)) {
|
|
|
+ q.lt(whereTime, getCurrentAccountBeginTime(date));
|
|
|
+ }
|
|
|
+ // 其他(未来账期)
|
|
|
+ else if (ObjectUtil.equals(accountStatus, 3)) {
|
|
|
+ q.gt(whereTime, getCurrentAccountEndTime(date));
|
|
|
+ }
|
|
|
+ })
|
|
|
+ ;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取当前账期开始时间
|
|
|
+ */
|
|
|
+ private Date getCurrentAccountBeginTime(Date date) {
|
|
|
+ // 本月1号
|
|
|
+ DateTime beginOfMonth = DateUtil.beginOfMonth(date);
|
|
|
+ // 距离月初有几天
|
|
|
+ long day = DateUtil.betweenDay(date, beginOfMonth, true);
|
|
|
+
|
|
|
+ return day > 15 ? DateUtil.offsetDay(beginOfMonth, 15) : beginOfMonth;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取当前账期结束时间
|
|
|
+ */
|
|
|
+ private Date getCurrentAccountEndTime(Date date) {
|
|
|
+ // 本月1号
|
|
|
+ DateTime beginOfMonth = DateUtil.beginOfMonth(date);
|
|
|
+ // 距离月初有几天
|
|
|
+ long day = DateUtil.betweenDay(date, beginOfMonth, true);
|
|
|
+
|
|
|
+ return day > 15 ? DateUtil.endOfMonth(date) : DateUtil.endOfDay(DateUtil.offsetDay(beginOfMonth, 14));
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
}
|