diff --git a/oms_web/oms_vue/src/api/finance/writeoff.js b/oms_web/oms_vue/src/api/finance/writeoff.js
index 82dfb83c..7e89b545 100644
--- a/oms_web/oms_vue/src/api/finance/writeoff.js
+++ b/oms_web/oms_vue/src/api/finance/writeoff.js
@@ -8,6 +8,13 @@ export function listWriteOff(query) {
params: query
})
}
+export function listTicketWriteOff(query) {
+ return request({
+ url: '/finance/ticketWriteoff/list',
+ method: 'get',
+ params: query
+ })
+}
// 查询核销详情
export function getWriteOff(id) {
@@ -16,6 +23,12 @@ export function getWriteOff(id) {
method: 'get'
})
}
+export function getTicketWriteoff(id) {
+ return request({
+ url: '/finance/ticketWriteoff/' + id,
+ method: 'get'
+ })
+}
// 删除核销记录
export function delWriteOff(ids) {
@@ -24,3 +37,9 @@ export function delWriteOff(ids) {
method: 'delete'
})
}
+export function delTicketWriteoff(ids) {
+ return request({
+ url: '/finance/ticketWriteoff/' + ids,
+ method: 'delete'
+ })
+}
diff --git a/oms_web/oms_vue/src/views/finance/payable/components/EditForm.vue b/oms_web/oms_vue/src/views/finance/payable/components/EditForm.vue
index 35d7019c..bb57ec97 100644
--- a/oms_web/oms_vue/src/views/finance/payable/components/EditForm.vue
+++ b/oms_web/oms_vue/src/views/finance/payable/components/EditForm.vue
@@ -6,36 +6,38 @@
采购-应付单
+
+ 项目编号: {{ formData.projectCode }}
+
+
+ 项目名称: {{ formData.projectName }}
+
应付单编号: {{ formData.payableBillCode }}
-
+
+
+
+
生成时间: {{ formData.createTime }}
+
+ 该制造商是否有预付单: {{ formData.preResidueAmount == 0 ? '否' : '是' }}
+
+
+ 预付金额: {{ formData.preResidueAmount }}
+
制造商名称: {{ formData.vendorName }}
-
- 项目编号: {{ formData.projectCode }}
-
-
- 项目名称: {{ formData.projectName }}
-
-
-
合同编号: {{ formData.orderCode }}
出入库单号: {{ formData.inventoryCode }}
-
- 产品类型:
-
-
-
@@ -70,6 +72,19 @@
收票中金额: {{ this.$calc.sub(this.$calc.sub(formData.totalPriceWithTax,formData.receivedTicketAmount),formData.unreceivedTicketAmount)}}
+
+
+ 生成付款单: {{ formData.totalPriceWithTax == formData.unpaidPaymentAmount ? '未生成' : formData.unpaidPaymentAmount == 0 ? '已生成' : '部分生成' }}
+
+
+ 生成收票单: {{ formData.totalPriceWithTax == formData.unreceivedTicketAmount ? '未生成' : formData.unreceivedTicketAmount == 0 ? '已生成' : '部分生成' }}
+
+
+ 产品类型:
+
+
+
+
@@ -105,12 +120,40 @@
+ 采购收票单
+
+
+
+
+
+
+
+
+
+ {{ scope.row.vendorTicketTime || '-' }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.finAttachment && scope.row.finAttachment.fileName || '-'}}
+ 下载
+
+
+
-
+
-
+
@@ -127,11 +170,13 @@
import PaymentPlan from './PaymentPlan.vue';
import ReceivingTicketPlan from './ReceivingTicketPlan.vue';
import { getPayable } from "@/api/finance/payable";
+import ReceiptPlan from "@/views/finance/receivable/components/ReceiptPlan.vue";
export default {
name: "EditForm",
- dicts: ['product_type','payment_status','payable_detail_type'],
+ dicts: ['product_type','payment_status','payable_detail_type', 'ticket_detail_type', 'receipt_status'],
components: {
+ ReceiptPlan,
PaymentPlan,
ReceivingTicketPlan
},
@@ -167,6 +212,9 @@ export default {
}
},
methods: {
+ refreshTicketPlan(){
+ this.$refs.ticketPlan.fetchTicketPlans(this.formData.id);
+ },
getDetails() {
getPayable(this.data.id).then(res => {
this.formData = res.data;
diff --git a/oms_web/oms_vue/src/views/finance/payable/components/MergeReceiptDialog.vue b/oms_web/oms_vue/src/views/finance/payable/components/MergeReceiptDialog.vue
index 3261b345..17bd97c9 100644
--- a/oms_web/oms_vue/src/views/finance/payable/components/MergeReceiptDialog.vue
+++ b/oms_web/oms_vue/src/views/finance/payable/components/MergeReceiptDialog.vue
@@ -208,6 +208,7 @@ export default {
ticketPlans.push({
id: order.lastTicketPlanId,
planAmount: order.planTicketAmount,
+ taxRate: order.taxRate,
planTicketDate: order.planTicketDate,
planRate: this.$calc.mul(this.$calc.div(order.planTicketAmount, order.totalPriceWithTax, 4), 100)
});
@@ -298,6 +299,7 @@ export default {
planTicketDate: plan.planTicketDate,
planAmount: plan.planAmount,
planRate: plan.planRate,
+ taxRate: order.taxRate,
remark: plan.remark,
id: plan.id,
})),
diff --git a/oms_web/oms_vue/src/views/finance/payable/index.vue b/oms_web/oms_vue/src/views/finance/payable/index.vue
index fa45f006..6811f29b 100644
--- a/oms_web/oms_vue/src/views/finance/payable/index.vue
+++ b/oms_web/oms_vue/src/views/finance/payable/index.vue
@@ -130,7 +130,11 @@
-
+
+
+ {{ scope.row.preResidueAmount == 0 ? '否' : '是' }}
+
+
diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsPayableBill.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsPayableBill.java
index 0b9693ec..3233f059 100644
--- a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsPayableBill.java
+++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsPayableBill.java
@@ -84,7 +84,7 @@ public class OmsPayableBill extends BaseEntity
private Date estimatedPaymentTimeEnd;
private Date estimatedPaymentTimeStart;
-
+ private BigDecimal preResidueAmount;
/** 已付款金额 */
@Excel(name = "已付款金额")
private BigDecimal paidPaymentAmount;
@@ -114,6 +114,7 @@ public class OmsPayableBill extends BaseEntity
private Date planPaymentDateEnd;
private List detailList;
+ private List ticketDetailList;
diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsPayableTicketDetail.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsPayableTicketDetail.java
index dcc7fe16..ed96b722 100644
--- a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsPayableTicketDetail.java
+++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsPayableTicketDetail.java
@@ -34,14 +34,23 @@ public class OmsPayableTicketDetail extends BaseEntity {
private Long ticketBillId;
// 实际收票时间
private Date actualTicketTime;
+ private Date vendorTicketTime;
// 收票状态
private String ticketStatus;
-
+ // 不含税支付金额
+ private BigDecimal paymentAmountWithoutTax;
+ // 核销ID
+ private Long writeOffId;
+ private List writeOffIdList;
+ // 税额
+ private BigDecimal paymentAmountTax;
+ private OmsFinAttachment finAttachment;
@Getter
public enum PayableDetailTypeEnum {
TICKET("1", "收票"),
RED_RUSH("2", "红冲"),
+ TICKET_WRITE_OFF("3", "收票核销"),
diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsPayableTicketPlan.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsPayableTicketPlan.java
index 49724c54..e6025d4b 100644
--- a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsPayableTicketPlan.java
+++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsPayableTicketPlan.java
@@ -30,6 +30,7 @@ public class OmsPayableTicketPlan extends BaseEntity {
/** 计划收票比例 */
private BigDecimal planRate;
+ private BigDecimal taxRate;
private Long detailId;
diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsTicketBill.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsTicketBill.java
index 4cc9d143..82cb0b38 100644
--- a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsTicketBill.java
+++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsTicketBill.java
@@ -31,6 +31,7 @@ public class OmsTicketBill extends BaseEntity
/** 收票单编号 */
@Excel(name = "收票单编号")
private String ticketBillCode;
+ private List ticketBillCodeList;
/** 票据类型 */
@Excel(name = "票据类型")
diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsPayableTicketDetailMapper.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsPayableTicketDetailMapper.java
index 7afcd2a5..e9f774d5 100644
--- a/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsPayableTicketDetailMapper.java
+++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsPayableTicketDetailMapper.java
@@ -2,7 +2,6 @@ package com.ruoyi.sip.mapper;
import java.util.List;
-import com.ruoyi.sip.domain.OmsPayablePaymentDetail;
import com.ruoyi.sip.domain.OmsPayableTicketDetail;
import com.ruoyi.sip.domain.dto.PaymentBillPayableDetailDTO;
@@ -68,8 +67,11 @@ public interface OmsPayableTicketDetailMapper
void clearRelationPayable(String ticketBillCode);
- List listByPayableBillIdList(List payableBillId);
+ List list(OmsPayableTicketDetail payableBillId);
List selectByTicketPlanIds(List ticketPlanIds);
+ List listPayableByWriteOffId(List longs);
+
+ void deleteByWriteOffIds(Long[] ids);
}
\ No newline at end of file
diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsPaymentBillMapper.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsPaymentBillMapper.java
index b59036cb..0b86293a 100644
--- a/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsPaymentBillMapper.java
+++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsPaymentBillMapper.java
@@ -98,4 +98,6 @@ public interface OmsPaymentBillMapper
void updateReturnWriteOffBatch(List updateBills);
+ List listPreResidueAmountByVendorCodeList(List collect);
+
}
diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsTicketBillMapper.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsTicketBillMapper.java
index d4209677..9b255bd4 100644
--- a/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsTicketBillMapper.java
+++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsTicketBillMapper.java
@@ -65,4 +65,9 @@ public interface OmsTicketBillMapper
void updateOmsTicketBillByCode(OmsTicketBill omsTicketBill);
List listApprove(@Param("entity") OmsTicketBill omsTicketBill, @Param("tableName")String buTodo);
+
+ OmsTicketBill selectOmsTicketBillByCode(String ticketBillCode);
+
+ void updateReturnWriteOffBatch(List updateBills);
+
}
\ No newline at end of file
diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsPayableTicketDetailService.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsPayableTicketDetailService.java
index 69855c1f..096f2580 100644
--- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsPayableTicketDetailService.java
+++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsPayableTicketDetailService.java
@@ -72,4 +72,12 @@ public interface IOmsPayableTicketDetailService
List selectByTicketPlanIds(List ticketPlanIds);
List listDetailByTicketCode(String ticketBillCode);
+
+ List listPayableByWriteOffId(List longs);
+
+ List listByWriteOffIds(Long[] ids);
+
+ void deleteByWriteOffIds(Long[] ids);
+
+ void insertBatch(List detailList);
}
\ No newline at end of file
diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsPaymentBillService.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsPaymentBillService.java
index eb9262f1..d2f6b61b 100644
--- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsPaymentBillService.java
+++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsPaymentBillService.java
@@ -110,4 +110,6 @@ public interface IOmsPaymentBillService
void returnWriteOff(List collect,List omsPayablePaymentDetails);
OmsPaymentBill selectOmsPaymentBillByCode(String paymentBillCode);
+
+ List listPreResidueAmountByVendorCodeList(List collect);
}
diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsTicketBillService.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsTicketBillService.java
index 9486e3bf..86b48021 100644
--- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsTicketBillService.java
+++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsTicketBillService.java
@@ -3,6 +3,7 @@ package com.ruoyi.sip.service;
import java.util.List;
import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.sip.domain.OmsPayableTicketDetail;
import com.ruoyi.sip.domain.OmsTicketBill;
import org.springframework.web.multipart.MultipartFile;
@@ -71,4 +72,8 @@ public interface IOmsTicketBillService
List listApprove(OmsTicketBill omsTicketBill);
List listApproved(OmsTicketBill omsTicketBill);
+
+ OmsTicketBill selectOmsTicketBillByCode(String ticketBillCode);
+
+ void returnTicketWriteOff(List collect, List omsPayableTicketDetails);
}
\ No newline at end of file
diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsPayableBillServiceImpl.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsPayableBillServiceImpl.java
index c0077345..254671fd 100644
--- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsPayableBillServiceImpl.java
+++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsPayableBillServiceImpl.java
@@ -24,9 +24,8 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.function.Function;
import java.util.stream.Collectors;
/**
@@ -81,8 +80,14 @@ public class OmsPayableBillServiceImpl implements IOmsPayableBillService {
@Override
public List selectOmsPayableBillList(OmsPayableBill omsPayableBill) {
List omsPayableBills = omsPayableBillMapper.selectOmsPayableBillList(omsPayableBill);
- //todo 是否有预付单信息
-
+ if (CollUtil.isNotEmpty(omsPayableBills)) {
+ PageUtils.clearPage();
+ List omsPaymentBills = omsPaymentBillService.listPreResidueAmountByVendorCodeList(omsPayableBills.stream().map(OmsPayableBill::getVendorCode).collect(Collectors.toList()));
+ Map decimalMap = omsPaymentBills.stream().filter(item -> item.getPreResidueAmount() != null).collect(Collectors.toMap(OmsPaymentBill::getVendorCode, OmsPaymentBill::getPreResidueAmount, BigDecimal::add));
+ for (OmsPayableBill payableBill : omsPayableBills) {
+ payableBill.setPreResidueAmount(decimalMap.getOrDefault(payableBill.getVendorCode(), BigDecimal.ZERO));
+ }
+ }
return omsPayableBills;
}
@@ -383,6 +388,8 @@ public class OmsPayableBillServiceImpl implements IOmsPayableBillService {
detail.setTicketBillId(ticketBill.getId());
detail.setPaymentAmount(ticketPlanDto.getPlanAmount());
detail.setPaymentRate(ticketPlanDto.getPlanRate());
+ detail.setPaymentAmountWithoutTax(detail.getPaymentAmount().divide(BigDecimal.ONE.add(ticketPlanDto.getTaxRate()), 2, java.math.RoundingMode.HALF_UP));
+ detail.setPaymentAmountTax(detail.getPaymentAmount().subtract(detail.getPaymentAmountWithoutTax()));
detail.setPaymentTime(ticketPlanDto.getPlanTicketDate());
detail.setRemark(ticketPlanDto.getRemark());
detail.setCreateBy(ShiroUtils.getLoginName());
@@ -408,26 +415,59 @@ public class OmsPayableBillServiceImpl implements IOmsPayableBillService {
}
List omsPayablePaymentDetails = omsPayablePaymentDetailService.listByPayableBillIdList(idList);
- Map> planMap = omsPayablePaymentDetails.stream().collect(Collectors.groupingBy(OmsPayablePaymentDetail::getPayableBillId,
- Collectors.groupingBy(
- item -> item.getPaymentStatus() == null ? OmsPaymentBill.PaymentStatusEnum.WAIT_PAYMENT.getCode() : item.getPaymentStatus(),
- Collectors.reducing(
- BigDecimal.ZERO,
- detail -> (detail.getPaymentAmount() != null) ? detail.getPaymentAmount() : BigDecimal.ZERO,
- BigDecimal::add
- ))));
+// 1. 构建 payableBillId -> (paymentPlanId -> 最新PaymentDetail) 的 Map
+ Map> planMap =
+ omsPayablePaymentDetails.stream()
+ .collect(Collectors.groupingBy(
+ OmsPayablePaymentDetail::getPayableBillId,
+ Collectors.toMap(
+ OmsPayablePaymentDetail::getPaymentPlanId,
+ Function.identity(),
+ (d1, d2) -> d1.getCreateTime().after(d2.getCreateTime()) ? d1 : d2
+ )
+ ));
+
for (OmsPayableBill payableBill : omsPayableBills) {
- Map amountMap = planMap.get(payableBill.getId());
- if (CollUtil.isNotEmpty(amountMap)) {
- //已付金额 = 已付款金额-退款金额
- payableBill.setPaidPaymentAmount(amountMap.getOrDefault(OmsPaymentBill.PaymentStatusEnum.PAYMENT.getCode(), BigDecimal.ZERO)
- .subtract(amountMap.getOrDefault(OmsPaymentBill.PaymentStatusEnum.REFUNDED.getCode(), BigDecimal.ZERO)));
- //未付金额=总金额-已付金额-付款中金额
- payableBill.setUnpaidPaymentAmount(payableBill.getTotalPriceWithTax().subtract(payableBill.getPaidPaymentAmount())
- .subtract(amountMap.getOrDefault(OmsPaymentBill.PaymentStatusEnum.WAIT_PAYMENT.getCode(), BigDecimal.ZERO)));
+
+ // 2. 获取当前账单的支付明细 Map(避免 NPE)
+ Map paymentDetailMap =
+ planMap.getOrDefault(payableBill.getId(), Collections.emptyMap());
+
+ if (CollUtil.isNotEmpty(paymentDetailMap)) {
+
+ // 3. 按支付状态汇总金额
+ Map amountMap =
+ paymentDetailMap.values().stream()
+ .filter(d -> d.getPaymentAmount() != null)
+ .collect(Collectors.toMap(
+ OmsPayablePaymentDetail::getPaymentStatus,
+ OmsPayablePaymentDetail::getPaymentAmount,
+ BigDecimal::add
+ ));
+
+ // 4. 金额计算(集中处理,逻辑更清晰)
+ BigDecimal paidAmount = amountMap
+ .getOrDefault(OmsPaymentBill.PaymentStatusEnum.PAYMENT.getCode(), BigDecimal.ZERO)
+ .add(amountMap.getOrDefault(
+ OmsPaymentBill.PaymentStatusEnum.REFUNDED.getCode(), BigDecimal.ZERO));
+
+ BigDecimal waitPayAmount =
+ amountMap.getOrDefault(
+ OmsPaymentBill.PaymentStatusEnum.WAIT_PAYMENT.getCode(), BigDecimal.ZERO);
+
+ payableBill.setPaidPaymentAmount(paidAmount);
+
+ payableBill.setUnpaidPaymentAmount(
+ payableBill.getTotalPriceWithTax()
+ .subtract(paidAmount)
+ .subtract(waitPayAmount)
+ );
}
- OmsPayablePaymentPlan payablePaymentPlan = omsPayablePaymentPlanMapper.firstUnPayPlan(payableBill.getId());
- payableBill.setLastPaymentPlanId(payablePaymentPlan == null ? -1 : payablePaymentPlan.getId());
+
+ // 5. 获取首个未支付计划
+ OmsPayablePaymentPlan unpaidPlan = omsPayablePaymentPlanMapper.firstUnPayPlan(payableBill.getId());
+
+ payableBill.setLastPaymentPlanId(unpaidPlan == null ? -1L : unpaidPlan.getId());
}
return omsPayableBillMapper.updateBatchPayableBillPaymentInfo(omsPayableBills);
}
@@ -444,23 +484,51 @@ public class OmsPayableBillServiceImpl implements IOmsPayableBillService {
return 0;
}
List omsPayableTicketDetails = omsPayableTicketDetailService.listByPayableBillIdList(idList);
- Map> planMap = omsPayableTicketDetails.stream().collect(Collectors.groupingBy(OmsPayableTicketDetail::getPayableBillId,
- Collectors.groupingBy(
- item -> item.getTicketStatus() == null ? OmsTicketBill.TicketStatusEnum.WAIT_TICKET.getCode() : item.getTicketStatus(),
- Collectors.reducing(
- BigDecimal.ZERO,
- detail -> (detail.getPaymentAmount() != null) ? detail.getPaymentAmount() : BigDecimal.ZERO,
- BigDecimal::add
- ))));
+ Map> planMap =
+ omsPayableTicketDetails.stream()
+ .collect(Collectors.groupingBy(
+ OmsPayableTicketDetail::getPayableBillId,
+ Collectors.toMap(
+ OmsPayableTicketDetail::getTicketPlanId,
+ Function.identity(),
+ (d1, d2) -> d1.getCreateTime().after(d2.getCreateTime()) ? d1 : d2
+ )
+ ));
for (OmsPayableBill payableBill : omsPayableBills) {
- Map amountMap = planMap.get(payableBill.getId());
- if (CollUtil.isNotEmpty(amountMap)) {
- //已付金额 = 已付款金额-退款金额
- payableBill.setReceivedTicketAmount(amountMap.getOrDefault(OmsTicketBill.TicketStatusEnum.TICKET.getCode(), BigDecimal.ZERO)
- .subtract(amountMap.getOrDefault(OmsPaymentBill.PaymentStatusEnum.REFUNDED.getCode(), BigDecimal.ZERO)));
- //未付金额=总金额-已付金额-付款中金额
- payableBill.setUnreceivedTicketAmount(payableBill.getTotalPriceWithTax().subtract(payableBill.getPaidPaymentAmount()
- .subtract(amountMap.getOrDefault(OmsTicketBill.TicketStatusEnum.WAIT_TICKET.getCode(), BigDecimal.ZERO))));
+
+ // 2. 获取当前账单的支付明细 Map(避免 NPE)
+ Map paymentDetailMap =
+ planMap.getOrDefault(payableBill.getId(), Collections.emptyMap());
+
+ if (CollUtil.isNotEmpty(paymentDetailMap)) {
+
+ // 3. 按支付状态汇总金额
+ Map amountMap =
+ paymentDetailMap.values().stream()
+ .filter(d -> d.getPaymentAmount() != null)
+ .collect(Collectors.toMap(
+ OmsPayableTicketDetail::getTicketStatus,
+ OmsPayableTicketDetail::getPaymentAmount,
+ BigDecimal::add
+ ));
+
+ // 4. 金额计算(集中处理,逻辑更清晰)
+ BigDecimal paidAmount = amountMap
+ .getOrDefault(OmsTicketBill.TicketStatusEnum.TICKET.getCode(), BigDecimal.ZERO)
+ .add(amountMap.getOrDefault(
+ OmsTicketBill.TicketStatusEnum.RED_RUSH.getCode(), BigDecimal.ZERO));
+
+ BigDecimal waitPayAmount =
+ amountMap.getOrDefault(
+ OmsTicketBill.TicketStatusEnum.WAIT_TICKET.getCode(), BigDecimal.ZERO);
+
+ payableBill.setPaidPaymentAmount(paidAmount);
+
+ payableBill.setUnpaidPaymentAmount(
+ payableBill.getTotalPriceWithTax()
+ .subtract(paidAmount)
+ .subtract(waitPayAmount)
+ );
}
OmsPayableTicketPlan omsPayableTicketPlan = omsPayableTicketPlanMapper.firstUnPayPlan(payableBill.getId());
payableBill.setLastTicketPlanId(omsPayableTicketPlan == null ? -1 : omsPayableTicketPlan.getId());
@@ -473,22 +541,11 @@ public class OmsPayableBillServiceImpl implements IOmsPayableBillService {
OmsPayableBill omsPayableBill = selectOmsPayableBillById(id);
List omsPayablePaymentDetails = omsPayablePaymentDetailService.listByPayableBillId(id);
omsPayableBill.setDetailList(omsPayablePaymentDetails);
-// Map decimalMap = omsPayablePaymentDetails.stream()
-// .collect(Collectors.groupingBy(
-// item->item.getPaymentStatus()==null?OmsPaymentBill.PaymentStatusEnum.WAIT_PAYMENT.getCode(): item.getPaymentStatus(),
-// Collectors.reducing(
-// BigDecimal.ZERO,
-// detail -> (detail.getPaymentAmount() != null) ? detail.getPaymentAmount() : BigDecimal.ZERO,
-// BigDecimal::add
-// )
-// ));
-
-// omsPayableBill.setPaidAmount(decimalMap.getOrDefault(OmsPaymentBill.PaymentStatusEnum.PAYMENT.getCode(), BigDecimal.ZERO));
-// omsPayableBill.setPayingAmount(decimalMap.getOrDefault(OmsPaymentBill.PaymentStatusEnum.WAIT_PAYMENT.getCode(), BigDecimal.ZERO));
-// BigDecimal decimal = omsPayableBill.getTotalPriceWithTax().subtract(omsPayableBill.getPaidAmount()).subtract(omsPayableBill.getPayingAmount());
-// omsPayableBill.setUnpaidAmount(decimal);
-
-
+ List ticketDetailList = omsPayableTicketDetailService.listByPayableBillIdList(Collections.singletonList(id));
+ omsPayableBill.setTicketDetailList(ticketDetailList);
+ List omsPaymentBills = omsPaymentBillService.listPreResidueAmountByVendorCodeList(Collections.singletonList(omsPayableBill.getVendorCode()));
+ Map decimalMap = omsPaymentBills.stream().filter(item -> item.getPreResidueAmount() != null).collect(Collectors.toMap(OmsPaymentBill::getVendorCode, OmsPaymentBill::getPreResidueAmount, BigDecimal::add));
+ omsPayableBill.setPreResidueAmount(decimalMap.getOrDefault(omsPayableBill.getVendorCode(), BigDecimal.ZERO));
return omsPayableBill;
}
diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsPayableTicketDetailServiceImpl.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsPayableTicketDetailServiceImpl.java
index 75dafb18..591ebf54 100644
--- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsPayableTicketDetailServiceImpl.java
+++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsPayableTicketDetailServiceImpl.java
@@ -1,17 +1,18 @@
package com.ruoyi.sip.service.impl;
import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.ShiroUtils;
+import com.ruoyi.sip.domain.OmsFinAttachment;
import com.ruoyi.sip.domain.OmsPayablePaymentDetail;
import com.ruoyi.sip.domain.dto.PaymentBillPayableDetailDTO;
-import org.apache.commons.lang3.StringUtils;
+import com.ruoyi.sip.service.IOmsFinAttachmentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.sip.mapper.OmsPayableTicketDetailMapper;
@@ -30,6 +31,8 @@ public class OmsPayableTicketDetailServiceImpl implements IOmsPayableTicketDetai
@Autowired
private OmsPayableTicketDetailMapper omsPayableTicketDetailMapper;
+ @Autowired
+ private IOmsFinAttachmentService finAttachmentService;
/**
* 查询应付单收票明细
*
@@ -150,7 +153,22 @@ public class OmsPayableTicketDetailServiceImpl implements IOmsPayableTicketDetai
@Override
public List listByPayableBillIdList(List payableBillId) {
- return omsPayableTicketDetailMapper.listByPayableBillIdList(payableBillId);
+ OmsPayableTicketDetail omsPayableTicketDetail = new OmsPayableTicketDetail();
+ omsPayableTicketDetail.setPayableBillIdList(payableBillId);
+ List list = omsPayableTicketDetailMapper.list(omsPayableTicketDetail);
+ if (CollUtil.isNotEmpty(list)){
+ OmsFinAttachment omsFinAttachment = new OmsFinAttachment();
+ omsFinAttachment.setRelatedBillIdList(list.stream().map(OmsPayableTicketDetail::getTicketBillId).distinct().collect(Collectors.toList()));
+ omsFinAttachment.setRelatedBillType(OmsFinAttachment.RelatedBillTypeEnum.INVOICE.getCode());
+ omsFinAttachment.setDelFlag("0");
+ List attachmentList = finAttachmentService.selectOmsFinAttachmentList(omsFinAttachment);
+ Map collect = attachmentList.stream().collect(Collectors.toMap(OmsFinAttachment::getRelatedBillId, Function.identity()));
+ for (OmsPayableTicketDetail payableTicketDetail : list) {
+ payableTicketDetail.setFinAttachment(collect.get(payableTicketDetail.getTicketBillId()));
+ }
+ }
+
+ return list;
}
@Override
@@ -164,4 +182,32 @@ public class OmsPayableTicketDetailServiceImpl implements IOmsPayableTicketDetai
omsPayableTicketDetail.setTicketBillCode(ticketBillCode);
return omsPayableTicketDetailMapper.selectOmsPayableTicketDetailList(omsPayableTicketDetail);
}
+
+ @Override
+ public List listPayableByWriteOffId(List longs) {
+ return omsPayableTicketDetailMapper.listPayableByWriteOffId(longs);
+ }
+
+ @Override
+ public List listByWriteOffIds(Long[] ids) {
+ if (ids == null || ids.length == 0) {
+ return new ArrayList<>();
+ }
+ OmsPayableTicketDetail omsPayableTicketDetail = new OmsPayableTicketDetail();
+ omsPayableTicketDetail.setWriteOffIdList(Arrays.asList(ids));
+ return omsPayableTicketDetailMapper.list(omsPayableTicketDetail);
+ }
+
+ @Override
+ public void deleteByWriteOffIds(Long[] ids) {
+ if (ids == null || ids.length == 0) {
+ return ;
+ }
+ omsPayableTicketDetailMapper.deleteByWriteOffIds(ids);
+ }
+
+ @Override
+ public void insertBatch(List detailList) {
+ omsPayableTicketDetailMapper.insertBatch(detailList);
+ }
}
\ No newline at end of file
diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsPaymentBillServiceImpl.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsPaymentBillServiceImpl.java
index 728dd6a8..e323f85f 100644
--- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsPaymentBillServiceImpl.java
+++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsPaymentBillServiceImpl.java
@@ -601,4 +601,12 @@ public class OmsPaymentBillServiceImpl implements IOmsPaymentBillService , TodoC
return omsPaymentBillMapper.selectOmsPaymentBillByCode(paymentBillCode);
}
+
+ @Override
+ public List listPreResidueAmountByVendorCodeList(List collect) {
+ if (CollUtil.isEmpty(collect)){
+ return Collections.emptyList();
+ }
+ return omsPaymentBillMapper.listPreResidueAmountByVendorCodeList(collect);
+ }
}
diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsTicketBillServiceImpl.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsTicketBillServiceImpl.java
index 677cbe3b..d18aadc4 100644
--- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsTicketBillServiceImpl.java
+++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsTicketBillServiceImpl.java
@@ -1,8 +1,7 @@
package com.ruoyi.sip.service.impl;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
+import java.math.BigDecimal;
+import java.util.*;
import java.util.stream.Collectors;
import cn.hutool.core.collection.CollUtil;
@@ -17,17 +16,16 @@ import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.sip.domain.*;
import com.ruoyi.sip.domain.dto.PaymentBillPayableDetailDTO;
+import com.ruoyi.sip.dto.WriteOffTicketRequestDto;
import com.ruoyi.sip.flowable.domain.Todo;
import com.ruoyi.sip.flowable.service.TodoCommonTemplate;
import com.ruoyi.sip.flowable.service.TodoService;
-import com.ruoyi.sip.service.IOmsFinAttachmentService;
-import com.ruoyi.sip.service.IOmsPayableBillService;
-import com.ruoyi.sip.service.IOmsPayableTicketDetailService;
+import com.ruoyi.sip.service.*;
import org.flowable.engine.runtime.ProcessInstance;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import com.ruoyi.sip.mapper.OmsTicketBillMapper;
-import com.ruoyi.sip.service.IOmsTicketBillService;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import org.springframework.transaction.annotation.Transactional;
@@ -56,6 +54,9 @@ public class OmsTicketBillServiceImpl implements IOmsTicketBillService, TodoComm
@Autowired
private ProcessConfig processConfig;
+ @Autowired
+ @Lazy
+ private IOmsPayableTicketWriteOffService writeOffService;
/**
* 查询采购收票单
*
@@ -303,6 +304,90 @@ public class OmsTicketBillServiceImpl implements IOmsTicketBillService, TodoComm
return omsTicketBillMapper.listApprove(omsTicketBill, "bu_todo_completed");
}
+ @Override
+ public OmsTicketBill selectOmsTicketBillByCode(String ticketBillCode) {
+ return omsTicketBillMapper.selectOmsTicketBillByCode(ticketBillCode);
+ }
+
+ @Override
+ public void returnTicketWriteOff(List collect, List omsPayableTicketDetails) {
+ OmsTicketBill ticketBill = new OmsTicketBill();
+ ticketBill.setTicketBillCodeList(collect);
+ List omsPaymentBills = selectOmsTicketBillList(ticketBill);
+ Map> listMap = omsPaymentBills.stream()
+ .collect(Collectors.groupingBy(OmsTicketBill::getTicketBillType));
+
+ // 处理预付
+ List prePaymentBillList = listMap.remove(OmsPaymentBill.PaymentBillTypeEnum.PRE_PAYMENT.getCode());
+
+// // 预付处理逻辑
+// // 1:通过omsPayablePaymentDetailService查询对应的详情,然后根据paymentBillCode分组,
+// // 将含税金额总和计算出来,加在预付单的剩余额度上
+// if (CollUtil.isNotEmpty(prePaymentBillList)) {
+// // 按付款单code分组核销详情
+// Map> groupedDetails =
+// omsPayablePaymentDetails.stream()
+// .filter(detail -> detail.getPaymentBillCode() != null)
+// .collect(Collectors.groupingBy(OmsPayablePaymentDetail::getPaymentBillCode));
+//
+// // 计算每个付款单的核销金额合计
+// Map paymentBillWriteOffAmountMap = groupedDetails.entrySet().stream()
+// .collect(Collectors.toMap(
+// Map.Entry::getKey,
+// entry -> entry.getValue().stream()
+// .map(OmsPayablePaymentDetail::getPaymentAmount)
+// .reduce(BigDecimal.ZERO, BigDecimal::add)
+// ));
+//
+// // 更新预付单的剩余额度 - 批量操作
+// List updateBills = prePaymentBillList.stream()
+// .map(prePaymentBill -> {
+// BigDecimal increaseAmount = paymentBillWriteOffAmountMap.getOrDefault(
+// prePaymentBill.getPaymentBillCode(), BigDecimal.ZERO);
+//
+// if (increaseAmount.compareTo(BigDecimal.ZERO) > 0) {
+// OmsPaymentBill updateBill = new OmsPaymentBill();
+// updateBill.setId(prePaymentBill.getId());
+// // 在原剩余额度基础上加回本次核销金额
+// BigDecimal newResidueAmount = prePaymentBill.getPreResidueAmount()
+// .add(increaseAmount);
+// updateBill.setPreResidueAmount(newResidueAmount);
+// return updateBill;
+// }
+// return null;
+// })
+// .filter(Objects::nonNull)
+// .collect(Collectors.toList());
+//
+// if (CollUtil.isNotEmpty(updateBills)) {
+// for (OmsPaymentBill bill : updateBills) {
+// updateOmsPaymentBill(bill);
+// }
+// }
+// }
+ //处理其余数据
+ if (CollUtil.isNotEmpty(listMap.values())) {
+ List updateBills = new ArrayList<>();
+
+ for (List omsPaymentBillList : listMap.values()) {
+ for (OmsTicketBill tempBill : omsPaymentBillList) {
+
+ OmsTicketBill updateBill = new OmsTicketBill();
+ updateBill.setId(tempBill.getId());
+ updateBill.setTicketStatus(OmsTicketBill.TicketStatusEnum.WAIT_TICKET.getCode());
+ updateBill.setActualTicketTime(null);
+ updateBills.add(updateBill);
+ }
+ }
+ if (CollUtil.isNotEmpty(updateBills)) {
+ omsTicketBillMapper.updateReturnWriteOffBatch(updateBills);
+ omsFinAttachmentService.deleteOmsFinAttachmentByPayment(updateBills.stream().map(OmsTicketBill::getId).collect(Collectors.toList()),
+ OmsFinAttachment.RelatedBillTypeEnum.INVOICE.getCode());
+ }
+
+ }
+ }
+
@Override
public Object todoDetail(String businessKey, String processKey, String todoId) {
@@ -345,8 +430,16 @@ public class OmsTicketBillServiceImpl implements IOmsTicketBillService, TodoComm
OmsTicketBill omsTicketBill = new OmsTicketBill();
omsTicketBill.setTicketBillCode(businessKey);
omsTicketBill.setApproveStatus(ApproveStatusEnum.APPROVE_COMPLETE.getCode());
+ omsTicketBill.setTicketStatus(OmsTicketBill.TicketStatusEnum.TICKET.getCode());
omsTicketBill.setApproveTime(DateUtils.getNowDate());
omsTicketBillMapper.updateOmsTicketBillByCode(omsTicketBill);
+ OmsTicketBill existBill = selectOmsTicketBillByCode(businessKey);
+ WriteOffTicketRequestDto writeOffRequestDto = new WriteOffTicketRequestDto();
+ writeOffRequestDto.setTicketBillId(existBill.getId());
+ writeOffRequestDto.setVendorCode(existBill.getVendorCode());
+ List omsPayableTicketDetails = payableTicketDetailService.listDetailByTicketCode(existBill.getTicketBillCode());
+ writeOffRequestDto.setDetailList(omsPayableTicketDetails);
+ writeOffService.autoTicketWriteOff(writeOffRequestDto);
}
diff --git a/ruoyi-sip/src/main/resources/mapper/finance/OmsPayableBillMapper.xml b/ruoyi-sip/src/main/resources/mapper/finance/OmsPayableBillMapper.xml
index ce67ec4e..a8adc7a1 100644
--- a/ruoyi-sip/src/main/resources/mapper/finance/OmsPayableBillMapper.xml
+++ b/ruoyi-sip/src/main/resources/mapper/finance/OmsPayableBillMapper.xml
@@ -76,6 +76,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
t1.create_time,
t1.update_by,
t1.update_time,
+ t1.tax_rate,
t1.remark,
t1.del_flag ,
t3.project_code,
diff --git a/ruoyi-sip/src/main/resources/mapper/finance/OmsPayablePaymentDetailMapper.xml b/ruoyi-sip/src/main/resources/mapper/finance/OmsPayablePaymentDetailMapper.xml
index 790e0892..b1c1a138 100644
--- a/ruoyi-sip/src/main/resources/mapper/finance/OmsPayablePaymentDetailMapper.xml
+++ b/ruoyi-sip/src/main/resources/mapper/finance/OmsPayablePaymentDetailMapper.xml
@@ -114,7 +114,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
from (SELECT sum(payment_amount) payment_amount,
payable_bill_id
FROM oms_payable_payment_detail
- WHERE payment_bill_code in
+ WHERE write_off_id is null and payment_bill_code in
#{item}
@@ -142,7 +142,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
DELETE FROM oms_payable_payment_detail WHERE write_off_id IN
-
+
#{item}
diff --git a/ruoyi-sip/src/main/resources/mapper/finance/OmsPaymentBillMapper.xml b/ruoyi-sip/src/main/resources/mapper/finance/OmsPaymentBillMapper.xml
index 445ec210..fdce8d5f 100644
--- a/ruoyi-sip/src/main/resources/mapper/finance/OmsPaymentBillMapper.xml
+++ b/ruoyi-sip/src/main/resources/mapper/finance/OmsPaymentBillMapper.xml
@@ -414,6 +414,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
and pb.del_flag = '0'
+
\ No newline at end of file
diff --git a/ruoyi-sip/src/main/resources/mapper/sip/OmsPayableTicketDetailMapper.xml b/ruoyi-sip/src/main/resources/mapper/sip/OmsPayableTicketDetailMapper.xml
index 9ea35ceb..63cac6dd 100644
--- a/ruoyi-sip/src/main/resources/mapper/sip/OmsPayableTicketDetailMapper.xml
+++ b/ruoyi-sip/src/main/resources/mapper/sip/OmsPayableTicketDetailMapper.xml
@@ -8,6 +8,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+
@@ -19,12 +20,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+
+
+
- select id, ticket_plan_id, payable_bill_id, payment_time, payment_amount, payment_rate, ticket_bill_code,
- create_by, create_time, update_by, update_time, remark
- from oms_payable_ticket_detail
+ select id, ticket_plan_id, payable_bill_id, payable_detail_type, payment_time, payment_amount, payment_rate, ticket_bill_code,
+ create_by, create_time, update_by, update_time, remark,
+ payment_amount_without_tax, write_off_id, payment_amount_tax
+ from oms_payable_ticket_detail t1
-
+
+
+
+ where ticket_bill_code = #{ticketBillCode}
\ No newline at end of file