feat(finance): 优化应付单付款与收票逻辑

- 修改计算工具函数,确保数值运算精度
- 更新应付单页面字段映射,统一命名规范
- 增加税率输入框并同步到库存信息
- 调整应付单合并支付与收票计划的处理方式
- 完善应付单实体类结构及数据库映射关系
- 优化采购订单关联应付单的生成逻辑
- 引入厂家开票时间字段以完善票据管理流程
dev_1.0.0
chenhao 2025-12-15 09:27:08 +08:00
parent a19909d1bf
commit 3e45254fc1
36 changed files with 669 additions and 235 deletions

View File

@ -19,17 +19,17 @@ export function toFixed(value, dp = DEFAULT_DP) {
// 加法
export function add(a, b, dp = DEFAULT_DP) {
return D(a).plus(b).toDecimalPlaces(dp).toNumber()
return D(a).plus(D(b)).toDecimalPlaces(dp).toNumber()
}
// 减法
export function sub(a, b, dp = DEFAULT_DP) {
return D(a).minus(b).toDecimalPlaces(dp).toNumber()
return D(a).minus(D(b)).toDecimalPlaces(dp).toNumber()
}
// 乘法
export function mul(a, b, dp = DEFAULT_DP) {
return D(a).times(b).toDecimalPlaces(dp).toNumber()
return D(a).times(D(b)).toDecimalPlaces(dp).toNumber()
}
// 除法

View File

@ -50,24 +50,24 @@
</el-row>
<el-row :gutter="20">
<el-col :span="8">
<div class="detail-item"><strong>未付款金额:</strong> {{ formData.unpaidAmount }}</div>
<div class="detail-item"><strong>未付款金额:</strong> {{ formData.unpaidPaymentAmount }}</div>
</el-col>
<el-col :span="8">
<div class="detail-item"><strong>已付款金额:</strong> {{ formData.paidAmount }}</div>
<div class="detail-item"><strong>已付款金额:</strong> {{ formData.paidPaymentAmount }}</div>
</el-col>
<el-col :span="8">
<div class="detail-item"><strong>付款中金额:</strong> {{ formData.payingAmount }}</div>
<div class="detail-item"><strong>付款中金额:</strong> {{ this.$calc.sub(this.$calc.sub(formData.totalPriceWithTax,formData.paidPaymentAmount),formData.unpaidPaymentAmount) }}</div>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">
<div class="detail-item"><strong>未收票金额:</strong> {{ formData.unInvoicedAmount }}</div>
<div class="detail-item"><strong>未收票金额:</strong> {{ formData.unreceivedTicketAmount }}</div>
</el-col>
<el-col :span="8">
<div class="detail-item"><strong>已收票金额:</strong> {{ formData.invoicedAmount }}</div>
<div class="detail-item"><strong>已收票金额:</strong> {{ formData.receivedTicketAmount }}</div>
</el-col>
<el-col :span="8">
<div class="detail-item"><strong>收票中金额:</strong> {{ formData.invoicingAmount }}</div>
<div class="detail-item"><strong>收票中金额:</strong> {{ this.$calc.sub(this.$calc.sub(formData.totalPriceWithTax,formData.receivedTicketAmount),formData.unreceivedTicketAmount)}}</div>
</el-col>
</el-row>
</div>

View File

@ -36,11 +36,8 @@
<el-divider content-position="left">采购应付单表</el-divider>
<el-table :data="payableOrdersWithPlans" border max-height="300px" style="margin-bottom: 20px;">
<el-table-column label="应付单编号" align="center" prop="payableBillCode" width="150"/>
<el-table-column label="预计付款时间" align="center" prop="estimatedPaymentTime" width="180"/>
<el-table-column label="付款计划" align="center" width="100">
<template slot-scope="scope">
<span>{{ scope.row.paymentPlans ? scope.row.paymentPlans.length : 0 }} 条计划</span>
</template>
<el-table-column label="预计付款时间" align="center" prop="planPaymentDate" width="180"/>
<el-table-column label="付款计划" align="center" width="100" prop="planAmount">
</el-table-column>
<el-table-column label="项目名称" align="center" prop="projectName" width="150"/>
<el-table-column label="合同编号" align="center" prop="orderCode" width="150"/>
@ -192,24 +189,35 @@ export default {
this.form.paymentBillType = 'FROM_PAYABLE'; // Default
// Initialize payableOrdersWithPlans
this.payableOrdersWithPlans = this.payableOrders.map(order => ({
...order,
paymentPlans: order.paymentPlans || [], // Retain existing plans if any, otherwise empty
totalPriceWithTax: order.totalPriceWithTax || 0, // Ensure numeric for calculations
unpaidAmount: order.unpaidAmount || 0,
paidAmount: order.paidAmount || 0, // Ensure numeric for calculations
}));
this.payableOrdersWithPlans = this.payableOrders.map(order => {
const paymentPlans = order.paymentPlans ? [...order.paymentPlans] : [];
if (paymentPlans.length === 0 && order.lastPaymentPlanId) {
paymentPlans.push({
id: order.lastPaymentPlanId,
planAmount: order.planAmount,
planPaymentDate: order.planPaymentDate,
planRate: this.$calc.mul(this.$calc.div(order.planAmount, order.totalPriceWithTax, 4), 100)
});
}
return {
...order,
paymentPlans: paymentPlans, // Retain existing plans if any, otherwise empty
totalPriceWithTax: order.totalPriceWithTax || 0, // Ensure numeric for calculations
unpaidAmount: order.unpaidAmount || 0,
paidAmount: order.paidAmount || 0, // Ensure numeric for calculations
}
});
},
handleClose() {
this.dialogVisible = false;
this.resetForm();
},
handleChooseConfirm() {
if (!this.$refs.planSelector || !this.$refs.planSelector.selectedPlan) {
this.$modal.msgError('无法获取计划选择器组件或其选择的计划');
if (!this.$refs.planSelector) {
this.$modal.msgError('无法获取计划选择器组件');
return;
}
const selectedPlans = this.$refs.planSelector.selectedPlan;
const selectedPlans = this.$refs.planSelector.selectedPlan || [];
const orderIndex = this.payableOrdersWithPlans.findIndex(o => o.id === this.choosePayable.id);
if (orderIndex === -1) {
@ -219,27 +227,11 @@ export default {
const currentOrder = this.payableOrdersWithPlans[orderIndex];
// Ensure the paymentPlans array exists
if (!currentOrder.paymentPlans) {
this.$set(currentOrder, 'paymentPlans', []);
}
// Add new plans, checking for duplicates by plan ID
let addedCount = 0;
selectedPlans.forEach(newPlan => {
const existingPlan = currentOrder.paymentPlans.find(p => p.id === newPlan.id);
if (!existingPlan) {
currentOrder.paymentPlans.push(newPlan);
addedCount++;
}
});
// Update the payment plans for the specific order
this.$set(currentOrder, 'paymentPlans', [...selectedPlans]);
this.isPaymentPlanSelectorOpen = false;
if (addedCount > 0) {
this.$modal.msgSuccess(`成功补充 ${addedCount} 条付款计划`);
} else {
this.$modal.msgWarning('没有新的付款计划被添加');
}
this.$modal.msgSuccess(`已更新付款计划选择,共 ${selectedPlans.length}`);
},
handleConfirm() {
// Validate main form fields
@ -283,6 +275,7 @@ export default {
// Collect all payable orders with their updated payment plans
payableOrders: this.payableOrdersWithPlans.map(order => ({
id: order.id,
taxRate: order.taxRate,
payableBillCode: order.payableBillCode,
paymentPlans: order.paymentPlans.map(plan => ({
planPaymentDate: plan.planPaymentDate,

View File

@ -30,17 +30,24 @@
></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="厂家开票时间" prop="vendorTicketTime">
<el-date-picker
v-model="form.vendorTicketTime"
type="date"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="选择日期"
></el-date-picker>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-divider content-position="left">采购应付单表</el-divider>
<el-table :data="payableOrdersWithPlans" border max-height="300px" style="margin-bottom: 20px;">
<el-table-column label="应付单编号" align="center" prop="payableBillCode" width="150"/>
<el-table-column label="预计收票时间" align="center" prop="estimatedPaymentTime" width="180"/>
<el-table-column label="收票计划" align="center" width="100">
<template slot-scope="scope">
<span>{{ scope.row.ticketPlans ? scope.row.ticketPlans.length : 0 }} 条计划</span>
</template>
<el-table-column label="预计收票时间" align="center" prop="planTicketDate" width="180"/>
<el-table-column label="收票计划" align="center" width="100" prop="planTicketAmount">
</el-table-column>
<el-table-column label="项目名称" align="center" prop="projectName" width="150"/>
<el-table-column label="合同编号" align="center" prop="orderCode" width="150"/>
@ -134,6 +141,7 @@ export default {
ticketBillType: 'FROM_PAYABLE', // Default to a type, or make it dynamic
vendorName: '',
ticketTime: null,
vendorTicketTime: null,
},
payableOrdersWithPlans: [], // Each order will now have its own ticketPlans array
isTicketPlanSelectorOpen: false,
@ -185,31 +193,44 @@ export default {
const allSameVendor = this.payableOrders.every(order => order.vendorName === firstVendorName);
this.form.vendorName = allSameVendor ? firstVendorName : '多个制造商';
this.form.ticketTime = null; // Reset time
this.form.vendorTicketTime = null;
} else {
this.form.vendorName = '';
this.form.ticketTime = null;
this.form.vendorTicketTime = null;
}
this.form.ticketBillType = 'FROM_PAYABLE'; // Default
// Initialize payableOrdersWithPlans
this.payableOrdersWithPlans = this.payableOrders.map(order => ({
...order,
ticketPlans: order.ticketPlans || [], // Retain existing plans if any, otherwise empty
totalPriceWithTax: order.totalPriceWithTax || 0, // Ensure numeric for calculations
unInvoicedAmount: order.unInvoicedAmount || 0,
invoicedAmount: order.invoicedAmount || 0, // Ensure numeric for calculations
}));
this.payableOrdersWithPlans = this.payableOrders.map(order => {
const ticketPlans = order.ticketPlans ? [...order.ticketPlans] : [];
if (ticketPlans.length === 0 && order.lastTicketPlanId) {
ticketPlans.push({
id: order.lastTicketPlanId,
planAmount: order.planTicketAmount,
planTicketDate: order.planTicketDate,
planRate: this.$calc.mul(this.$calc.div(order.planTicketAmount, order.totalPriceWithTax, 4), 100)
});
}
return {
...order,
ticketPlans: ticketPlans, // Retain existing plans if any, otherwise empty
totalPriceWithTax: order.totalPriceWithTax || 0, // Ensure numeric for calculations
unInvoicedAmount: order.unInvoicedAmount || 0,
invoicedAmount: order.invoicedAmount || 0, // Ensure numeric for calculations
}
});
},
handleClose() {
this.dialogVisible = false;
this.resetForm();
},
handleChooseConfirm() {
if (!this.$refs.planSelector || !this.$refs.planSelector.selectedPlan) {
this.$modal.msgError('无法获取计划选择器组件或其选择的计划');
if (!this.$refs.planSelector) {
this.$modal.msgError('无法获取计划选择器组件');
return;
}
const selectedPlans = this.$refs.planSelector.selectedPlan;
const selectedPlans = this.$refs.planSelector.selectedPlan || [];
const orderIndex = this.payableOrdersWithPlans.findIndex(o => o.id === this.choosePayable.id);
if (orderIndex === -1) {
@ -219,27 +240,11 @@ export default {
const currentOrder = this.payableOrdersWithPlans[orderIndex];
// Ensure the ticketPlans array exists
if (!currentOrder.ticketPlans) {
this.$set(currentOrder, 'ticketPlans', []);
}
// Add new plans, checking for duplicates by plan ID
let addedCount = 0;
selectedPlans.forEach(newPlan => {
const existingPlan = currentOrder.ticketPlans.find(p => p.id === newPlan.id);
if (!existingPlan) {
currentOrder.ticketPlans.push(newPlan);
addedCount++;
}
});
// Update the ticket plans for the specific order
this.$set(currentOrder, 'ticketPlans', [...selectedPlans]);
this.isTicketPlanSelectorOpen = false;
if (addedCount > 0) {
this.$modal.msgSuccess(`成功补充 ${addedCount} 条收票计划`);
} else {
this.$modal.msgWarning('没有新的收票计划被添加');
}
this.$modal.msgSuccess(`已更新收票计划选择,共 ${selectedPlans.length}`);
},
handleConfirm() {
// Validate main form fields
@ -251,6 +256,10 @@ export default {
this.$modal.msgError('请选择预计收票时间');
return;
}
if (!this.form.vendorTicketTime) {
this.$modal.msgError('请选择厂家开票时间');
return;
}
// Validate each payable order's ticket plans
for (const order of this.payableOrdersWithPlans) {
@ -280,6 +289,7 @@ export default {
const mergedReceiptData = {
ticketBillType: this.form.ticketBillType,
ticketTime: this.form.ticketTime,
vendorTicketTime: this.form.vendorTicketTime,
// Collect all payable orders with their updated ticket plans
payableOrders: this.payableOrdersWithPlans.map(order => ({
id: order.id,
@ -307,6 +317,7 @@ export default {
ticketBillType: 'FROM_PAYABLE',
vendorName: '',
ticketTime: null,
vendorTicketTime: null,
};
this.payableOrdersWithPlans = [];

View File

@ -128,8 +128,8 @@
<el-table-column label="项目名称" align="center" prop="projectName" width="150" />
<el-table-column label="应付单编号" align="center" prop="payableBillCode" width="150" />
<!-- <el-table-column label="生成时间" align="center" prop="createTime" width="180"/>-->
<el-table-column label="预计付款时间" align="center" prop="estimatedPaymentTime" width="180"/>
<el-table-column label="预计付款金额" align="center" prop="totalPriceWithTax" width="120" />
<el-table-column label="预计付款时间" align="center" prop="planPaymentDate" width="180"/>
<el-table-column label="预计付款金额" align="center" prop="planAmount" width="120" />
<el-table-column label="该制造商是否有预付单" align="center" prop="hasAdvancePayment" width="150" />
<!-- <el-table-column label="预付金额" align="center" prop="advancePaymentAmount" width="120" />-->
<el-table-column label="制造商名称" align="center" prop="vendorName" width="150" />
@ -167,7 +167,8 @@
<!-- >生成收票单</el-button>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="未付款金额" align="center" prop="unpaidAmount" width="120" />
<el-table-column label="未付款金额" align="center" prop="unpaidPaymentAmount" width="120" />
<el-table-column label="未收票金额" align="center" prop="unreceivedTicketAmount" width="120" />
<!-- <el-table-column label="付款中金额" align="center" prop="payingAmount" width="120" />-->
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="160" fixed="right">
<template slot-scope="scope">

View File

@ -191,7 +191,6 @@
size="mini"
type="text"
icon="el-icon-refresh-left"
v-show="scope.row.approveStatus=='1'"
@click="handleReturn(scope.row)"
>退回</el-button>
<el-button

View File

@ -411,7 +411,8 @@ export default {
productDesc: this.form.productDesc,
innerPrice: this.form.price,
warehouseId: this.form.warehouseId,
warehouseName: this.form.warehouseName
warehouseName: this.form.warehouseName,
taxRate: this.form.taxRate
});
}
this.form.inventoryInfoList.push(...productsToAdd);
@ -479,6 +480,7 @@ export default {
innerPrice: order.price,
quantity: order.quantity,
warehouseId: order.warehouseId,
taxRate:order.taxRate
}];
}
@ -600,6 +602,7 @@ export default {
item.warehouseId=this.form.warehouseId;
item.warehouseName=this.form.warehouseName;
item.innerPrice=this.form.price;
item.taxRate=this.form.taxRate;
})
this.$modal.msgSuccess("导入成功");
} else {

View File

@ -45,6 +45,13 @@
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="6" v-if="isImported">
<el-form-item label="税率" prop="taxRate">
<el-input v-model="taxRate" placeholder="请输入税率"/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-row :gutter="10" class="mb8">
@ -214,7 +221,6 @@ export default {
item.warehouseName = this.warehouseName;
item.warehouseId = this.warehouseId;
item.innerPrice = this.price;
item.taxRate = this.taxRate;
});
}
this.total = this.snList.length;
@ -240,6 +246,9 @@ export default {
return;
}
if (this.isImported) {
this.snList.forEach(item => item.taxRate = this.taxRate)
}
const data = {
...this.form,
productSnList: this.selectedSnList.map(item => item.productSn),

View File

@ -2,7 +2,6 @@ package com.ruoyi.sip.controller;
import java.util.List;
import com.ruoyi.sip.domain.OmsPaymentBill;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@ -18,8 +17,6 @@ import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.sip.service.IOmsPaymentBillService;
import com.ruoyi.sip.service.IOmsInvoiceReceiptBillService;
import com.ruoyi.sip.domain.OmsInvoiceReceiptBill;
import org.springframework.ui.ModelMap;
import com.ruoyi.sip.domain.dto.MergedPaymentDataDto;
import com.ruoyi.sip.domain.dto.MergedReceiptDataDto;
@ -89,17 +86,17 @@ public class OmsPayableBillController extends BaseController
return prefix + "/add";
}
/**
*
*/
@RequiresPermissions("finance:payable:add")
@Log(title = "采购应付单", businessType = BusinessType.INSERT)
@PostMapping("/add")
@ResponseBody
public AjaxResult addSave(OmsPayableBill omsPayableBill)
{
return toAjax(omsPayableBillService.insertOmsPayableBill(omsPayableBill));
}
// /**
// * 新增保存采购应付单
// */
// @RequiresPermissions("finance:payable:add")
// @Log(title = "采购应付单", businessType = BusinessType.INSERT)
// @PostMapping("/add")
// @ResponseBody
// public AjaxResult addSave(OmsPayableBill omsPayableBill)
// {
// return toAjax(omsPayableBillService.insertOmsPayableBill(omsPayableBill, vendorInfo.getPayConfigDay()));
// }
@RequiresPermissions("finance:payable:query")
@Log(title = "采购应付单", businessType = BusinessType.INSERT)
@GetMapping("/{id}")

View File

@ -1,5 +1,6 @@
package com.ruoyi.sip.domain;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

View File

@ -24,6 +24,7 @@ public class OmsPayableBill extends BaseEntity
/** 主键ID */
private Long id;
private List<Long> idList;
/** 应付单编号 */
@Excel(name = "应付单编号")
@ -32,10 +33,10 @@ public class OmsPayableBill extends BaseEntity
@Excel(name = "生成时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/** 预计付款时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@Excel(name = "预计付款时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date estimatedPaymentTime;
/** 最后付款计划ID */
private Long lastPaymentPlanId;
/** 最后票据计划ID */
private Long lastTicketPlanId;
/** 制造商编码 */
@Excel(name = "制造商编码")
@ -71,6 +72,7 @@ public class OmsPayableBill extends BaseEntity
/** 税额 */
@Excel(name = "税额")
private BigDecimal taxAmount;
private BigDecimal taxRate;
@ -82,12 +84,34 @@ public class OmsPayableBill extends BaseEntity
private Date estimatedPaymentTimeEnd;
private Date estimatedPaymentTimeStart;
private BigDecimal unpaidAmount;
private BigDecimal paidAmount;
private BigDecimal payingAmount;
/** 已付款金额 */
@Excel(name = "已付款金额")
private BigDecimal paidPaymentAmount;
/** 未付款金额 */
@Excel(name = "未付款金额")
private BigDecimal unpaidPaymentAmount;
/** 已收票金额 */
@Excel(name = "已收票金额")
private BigDecimal receivedTicketAmount;
/** 未收票金额 */
@Excel(name = "未收票金额")
private BigDecimal unreceivedTicketAmount;
/** 计划付款日期 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date planPaymentDate;
private Date planTicketDate;
/** 计划金额 */
private BigDecimal planAmount;
private BigDecimal planTicketAmount;
private Date planPaymentDateStart;
private Date planPaymentDateEnd;
private List<OmsPayablePaymentDetail> detailList;

View File

@ -124,13 +124,13 @@ public class VendorInfo extends BaseEntity
@Getter
public enum PayTypeEnum {
INNER_PAY("0", "入库付款"),
OUTER_PAY("1", "出库付款"),
INNER_PAY(0, "入库付款"),
OUTER_PAY(1, "出库付款"),
;
private final String desc;
private final String code;
private final Integer code;
PayTypeEnum(String code, String desc) {
PayTypeEnum(Integer code, String desc) {
this.desc = desc;
this.code = code;
}

View File

@ -10,6 +10,7 @@ import java.util.List;
public class MergedReceiptDataDto {
private String ticketBillType;
private Date ticketTime;
private Date vendorTicketTime;
private List<PayableOrderReceiptDto> payableOrders;
private BigDecimal totalMergeTicketAmount;
}

View File

@ -3,12 +3,14 @@ package com.ruoyi.sip.domain.dto;
import com.ruoyi.sip.domain.OmsPayablePaymentPlan;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
public class PayableOrderDto {
private Long id;
private String payableBillCode;
private BigDecimal taxRate;
private List<OmsPayablePaymentPlan> paymentPlans;

View File

@ -3,11 +3,13 @@ package com.ruoyi.sip.domain.dto;
import com.ruoyi.sip.domain.OmsPayableTicketPlan;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
public class PayableOrderReceiptDto {
private Long id;
private String payableBillCode;
private BigDecimal taxRate;
private List<OmsPayableTicketPlan> ticketPlans;
}

View File

@ -59,5 +59,15 @@ public interface OmsPayableBillMapper
*/
public int deleteOmsPayableBillByIds(String[] ids);
/**
*
*
* @param payableBills
* @return
*/
public int updateBatchPayableBillPaymentInfo(List<OmsPayableBill> payableBills);
Integer selectMaxCodeByPrefix(String codePrefix);
int updateBatchPayableBillTicketInfo(List<OmsPayableBill> omsPayableBills);
}

View File

@ -14,4 +14,6 @@ public interface OmsPayablePaymentDetailMapper {
void insertBatch(List<OmsPayablePaymentDetail> addList);
List<PaymentBillPayableDetailDTO> listPayableByPaymentCode(List<String> paymentBillCodeList);
List<OmsPayablePaymentDetail> selectByPaymentPlanIds(@Param("paymentPlanIds") List<Long> paymentPlanIds);
}

View File

@ -59,4 +59,8 @@ public interface OmsPayablePaymentPlanMapper {
* @return ID
*/
public List<Long> selectOmsPayablePaymentPlanIdsByPayableBillId(Long payableBillId);
OmsPayablePaymentPlan firstUnPayPlan(Long payableBillId);
List<OmsPayablePaymentPlan> listDetailByPayableBillIdList(List<Long> idList);
}

View File

@ -70,4 +70,6 @@ public interface OmsPayableTicketDetailMapper
List<OmsPayableTicketDetail> listByPayableBillIdList(List<Long> payableBillId);
List<OmsPayableTicketDetail> selectByTicketPlanIds(List<Long> ticketPlanIds);
}

View File

@ -58,4 +58,6 @@ public interface OmsPayableTicketPlanMapper
* @return
*/
public int deleteOmsPayableTicketPlanByIds(Long[] ids);
OmsPayableTicketPlan firstUnPayPlan(Long payableBillId);
}

View File

@ -34,9 +34,10 @@ public interface IOmsPayableBillService
*
*
* @param omsPayableBill
* @param payConfigDay
* @return
*/
public int insertOmsPayableBill(OmsPayableBill omsPayableBill);
public int insertOmsPayableBill(OmsPayableBill omsPayableBill, Integer payConfigDay);
/**
*
@ -77,6 +78,8 @@ public interface IOmsPayableBillService
* @return
*/
public int mergeAndInitiateReceipt(MergedReceiptDataDto dto);
public int updatePaymentAmount(List<Long> idList);
public int updateTicketAmount(List<Long> idList);
OmsPayableBill query(Long id);
}

View File

@ -13,4 +13,6 @@ public interface IOmsPayablePaymentDetailService {
void applyRefund(String payableBillCode, String payableBillCode1);
List<PaymentBillPayableDetailDTO> listPayableByPaymentCode(String paymentBillCode);
List<OmsPayablePaymentDetail> selectByPaymentPlanIds(List<Long> paymentPlanIds);
}

View File

@ -68,4 +68,6 @@ public interface IOmsPayableTicketDetailService
void clearRelationPayable(String ticketBillCode);
List<OmsPayableTicketDetail> listByPayableBillIdList(List<Long> collect);
List<OmsPayableTicketDetail> selectByTicketPlanIds(List<Long> ticketPlanIds);
}

View File

@ -6,7 +6,6 @@ import java.util.*;
import java.util.stream.Collectors;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.ShiroUtils;
@ -62,7 +61,7 @@ public class InventoryDeliveryServiceImpl implements IInventoryDeliveryService {
@Autowired
private IOmsPayableBillService payableBillService;
@Value("${oms.inventory.innerTax:1.13}")
@Value("${oms.inventory.innerTax:0.13}")
private String defaultTax;
/**
*
@ -247,23 +246,26 @@ public class InventoryDeliveryServiceImpl implements IInventoryDeliveryService {
}
OmsPayableBill payableBill = new OmsPayableBill();
payableBill.setProductCode(inventoryOuter.getProductCode());
payableBill.setEstimatedPaymentTime(DateUtils.addDays(DateUtils.getNowDate(), vendorInfo.getPayConfigDay()));
// payableBill.setEstimatedPaymentTime(DateUtils.addDays(DateUtils.getNowDate(), vendorInfo.getPayConfigDay()));
payableBill.setProductType(productInfo.getType());
payableBill.setVendorCode(productInfo.getVendorCode());
payableBill.setInventoryCode(inventoryDelivery.getOuterCode());
BigDecimal allPrice = inventoryInfos.stream().map(InventoryInfo::getInnerPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
payableBill.setTotalPriceWithTax(allPrice);
payableBill.setTotalPriceWithoutTax(allPrice.divide(new BigDecimal(defaultTax), 2, RoundingMode.HALF_UP));
BigDecimal defaultTaxRate = new BigDecimal(defaultTax);
BigDecimal allPriceWithOutTax = inventoryInfos.stream().map(item ->
{
BigDecimal taxRate = item.getTaxRate() == null ? defaultTaxRate : item.getTaxRate();
return item.getInnerPrice().divide(BigDecimal.ONE.add(taxRate), 2, RoundingMode.HALF_UP);
})
.reduce(BigDecimal.ZERO, BigDecimal::add);
payableBill.setTaxRate(inventoryInfos.get(0).getTaxRate() == null ? defaultTaxRate : inventoryInfos.get(0).getTaxRate());
payableBill.setTotalPriceWithoutTax(allPriceWithOutTax);
payableBill.setTaxAmount(allPrice.subtract(payableBill.getTotalPriceWithoutTax()));
payableBill.setProjectCode(inventoryDelivery.getProjectCode());
payableBill.setProductCode(inventoryDelivery.getProductCode());
payableBill.setOrderCode(inventoryDelivery.getOrderCode());
payableBillService.insertOmsPayableBill(payableBill);
List<InventoryInfo> saveList = inventoryInfos.stream().map(item -> {
InventoryInfo inventoryInfo = new InventoryInfo();
inventoryInfo.setProductSn(item.getProductSn());
inventoryInfo.setPayableBillCode(payableBill.getPayableBillCode());
return inventoryInfo;
}).collect(Collectors.toList());
payableBillService.insertOmsPayableBill(payableBill, vendorInfo.getPayConfigDay());
List<InventoryInfo> saveList = inventoryInfos.stream().peek(item -> item.setPayableBillCode(payableBill.getPayableBillCode())).collect(Collectors.toList());
inventoryInfoService.saveBatch(saveList);
}
@ -311,6 +313,10 @@ public class InventoryDeliveryServiceImpl implements IInventoryDeliveryService {
@Override
public void recall(Long id) {
//todo 判断应付或应收状态 不允许退
InventoryDelivery inventoryDelivery = inventoryDeliveryMapper.selectInventoryDeliveryById(id);
deleteInventoryOuterById(id);
List<ProjectProductInfo> projectProductInfos = projectProductInfoService.listDeliveryProductByOrderCode(Collections.singletonList(inventoryDelivery.getOrderCode()));
@ -345,7 +351,6 @@ public class InventoryDeliveryServiceImpl implements IInventoryDeliveryService {
//修改累计发货数量
productInfoService.updateCumulativeCount(-inventoryDelivery.getQuantity(), inventoryDelivery.getProductCode());
}
@Override

View File

@ -14,6 +14,7 @@ import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.sip.domain.*;
import com.ruoyi.sip.dto.inventory.InventoryInfoExcelDto;
import com.ruoyi.sip.dto.inventory.OmsPurchaseOrderItemDto;
import com.ruoyi.sip.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
@ -49,9 +50,10 @@ public class OmsInventoryInnerServiceImpl implements IOmsInventoryInnerService {
@Autowired
private IOmsPurchaseOrderService purchaseOrderService;
@Autowired
private IOmsPayableBillService payableBillService;
@Value("${oms.inventory.innerTax:1.13}")
@Value("${oms.inventory.innerTax:0.13}")
private String defaultTax;
/**
*
@ -147,19 +149,32 @@ public class OmsInventoryInnerServiceImpl implements IOmsInventoryInnerService {
if (vendorInfo != null && VendorInfo.PayTypeEnum.INNER_PAY.getCode().equals(vendorInfo.getPayType())) {
BigDecimal reduce = inventoryInfoList.stream().map(InventoryInfo::getInnerPrice).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
//服务金额为单价* 数量 没有具体的详情
BigDecimal totalPriceWithTax =Arrays.asList("11","22").contains(omsInventoryInner.getProductCode())?
BigDecimal totalPriceWithTax = Arrays.asList("11", "22").contains(omsInventoryInner.getProductType()) ?
reduce.multiply(new BigDecimal(omsInventoryInner.getQuantity())).setScale(2, RoundingMode.HALF_UP)
: reduce;
//生成应付单
payableBill.setInventoryCode(omsInventoryInner.getInnerCode());
payableBill.setVendorCode(omsInventoryInner.getVendorCode());
payableBill.setProductType(productInfos.get(0).getType());
payableBill.setProjectCode(omsInventoryInner.getProductCode());
payableBill.setEstimatedPaymentTime(DateUtils.addDays(DateUtils.getNowDate(), vendorInfo.getPayConfigDay()));
payableBill.setProductCode(omsInventoryInner.getProductCode());
payableBill.setTotalPriceWithTax(totalPriceWithTax);
payableBill.setTotalPriceWithoutTax(totalPriceWithTax.divide(new BigDecimal(defaultTax), 2, RoundingMode.HALF_UP));
String purchaseNo = omsInventoryInner.getPurchaseNo();
BigDecimal taxRate = null;
if (StringUtils.isNotEmpty(purchaseNo)) {
OmsPurchaseOrderItemDto query = new OmsPurchaseOrderItemDto();
query.setPurchaseNo(purchaseNo);
List<OmsPurchaseOrderItemDto> omsPurchaseOrderItemDtos = purchaseOrderService.listItem(query);
Map<String, BigDecimal> decimalMap = omsPurchaseOrderItemDtos.stream().collect(Collectors.toMap(OmsPurchaseOrderItemDto::getProductCode, OmsPurchaseOrderItemDto::getTaxRate, (v1, v2) -> v1));
taxRate = decimalMap.get(omsInventoryInner.getProductCode());
}
BigDecimal finalTaxRate = taxRate == null ? new BigDecimal(defaultTax) : taxRate;
BigDecimal withoutTax = inventoryInfoList.stream().reduce(BigDecimal.ZERO, (a, b) -> a.add(b.getInnerPrice().divide(BigDecimal.ONE.add(finalTaxRate), 2, RoundingMode.HALF_UP)), BigDecimal::add);
payableBill.setTotalPriceWithoutTax(withoutTax);
payableBill.setTaxRate(finalTaxRate);
payableBill.setTaxAmount(totalPriceWithTax);
payableBill.setTaxAmount(totalPriceWithTax.subtract(payableBill.getTotalPriceWithoutTax()));
payableBillService.insertOmsPayableBill(payableBill);
payableBillService.insertOmsPayableBill(payableBill, vendorInfo.getPayConfigDay());
}
inventoryInfoList.forEach(item->{
item.setInnerCode(omsInventoryInner.getInnerCode());

View File

@ -4,9 +4,11 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.PageUtils;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.sip.domain.*;
import com.ruoyi.sip.domain.dto.MergedPaymentDataDto;
import com.ruoyi.sip.domain.dto.MergedReceiptDataDto;
@ -14,8 +16,10 @@ import com.ruoyi.sip.domain.dto.PayableOrderDto;
import com.ruoyi.sip.domain.dto.PayableOrderReceiptDto;
import com.ruoyi.sip.mapper.OmsPayableBillMapper;
import com.ruoyi.sip.mapper.OmsPayablePaymentPlanMapper;
import com.ruoyi.sip.mapper.OmsPayableTicketPlanMapper;
import com.ruoyi.sip.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -32,6 +36,7 @@ import java.util.stream.Collectors;
* @date 2025-10-22
*/
@Service
@Transactional(rollbackFor = Exception.class)
public class OmsPayableBillServiceImpl implements IOmsPayableBillService {
@Autowired
private OmsPayableBillMapper omsPayableBillMapper;
@ -39,6 +44,8 @@ public class OmsPayableBillServiceImpl implements IOmsPayableBillService {
@Autowired
private OmsPayablePaymentPlanMapper omsPayablePaymentPlanMapper;
@Autowired
private OmsPayableTicketPlanMapper omsPayableTicketPlanMapper;
@Autowired
private IOmsPaymentBillService omsPaymentBillService;
@ -52,7 +59,8 @@ public class OmsPayableBillServiceImpl implements IOmsPayableBillService {
@Autowired
private IOmsPayableTicketDetailService omsPayableTicketDetailService;
@Value("${oms.inventory.innerTax:0.13}")
private String defaultTax;
/**
*
*
@ -73,27 +81,7 @@ public class OmsPayableBillServiceImpl implements IOmsPayableBillService {
@Override
public List<OmsPayableBill> selectOmsPayableBillList(OmsPayableBill omsPayableBill) {
List<OmsPayableBill> omsPayableBills = omsPayableBillMapper.selectOmsPayableBillList(omsPayableBill);
PageUtils.clearPage();
if (CollUtil.isNotEmpty(omsPayableBills)){
List<Long> idList = omsPayableBills.stream().map(OmsPayableBill::getId).distinct().collect(Collectors.toList());
List<OmsPayablePaymentDetail> omsPayablePaymentDetails = omsPayablePaymentDetailService.listByPayableBillIdList(idList);
Map<Long, Map<String, BigDecimal>> 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
))));
omsPayableBills.forEach(bill -> {
bill.setPaidAmount(planMap.getOrDefault(bill.getId(), Collections.emptyMap()).getOrDefault(OmsPaymentBill.PaymentStatusEnum.PAYMENT.getCode(), BigDecimal.ZERO));
bill.setPayingAmount(planMap.getOrDefault(bill.getId(), Collections.emptyMap()).getOrDefault(OmsPaymentBill.PaymentStatusEnum.WAIT_PAYMENT.getCode(), BigDecimal.ZERO));
bill.setUnpaidAmount(bill.getTotalPriceWithTax().subtract(bill.getPaidAmount()).subtract(bill.getPayingAmount()));
});
}
//todo 是否有预付单信息
return omsPayableBills;
}
@ -102,12 +90,19 @@ public class OmsPayableBillServiceImpl implements IOmsPayableBillService {
*
*
* @param omsPayableBill
* @param payConfigDay
* @return
*/
@Override
@Transactional
public int insertOmsPayableBill(OmsPayableBill omsPayableBill) {
public int insertOmsPayableBill(OmsPayableBill omsPayableBill, Integer payConfigDay) {
//生成采购应付单编号
omsPayableBill.setUnpaidPaymentAmount(omsPayableBill.getTotalPriceWithTax());
omsPayableBill.setUnreceivedTicketAmount(omsPayableBill.getTotalPriceWithTax());
omsPayableBill.setPaidPaymentAmount(BigDecimal.ZERO);
omsPayableBill.setReceivedTicketAmount(BigDecimal.ZERO);
omsPayableBill.setPayableBillCode(generatePayableBillCode());
omsPayableBill.setCreateTime(DateUtils.getNowDate());
omsPayableBill.setCreateBy(ShiroUtils.getUserId().toString());
@ -117,13 +112,33 @@ public class OmsPayableBillServiceImpl implements IOmsPayableBillService {
if (rows > 0) {
OmsPayablePaymentPlan defaultPlan = new OmsPayablePaymentPlan();
defaultPlan.setPayableBillId(omsPayableBill.getId());
defaultPlan.setPlanPaymentDate(omsPayableBill.getEstimatedPaymentTime());
defaultPlan.setPlanPaymentDate(DateUtils.addDays(DateUtils.getNowDate(), payConfigDay));
defaultPlan.setPlanAmount(omsPayableBill.getTotalPriceWithTax());
defaultPlan.setPlanRate(new java.math.BigDecimal(100));
defaultPlan.setPlanRate(new java.math.BigDecimal("100"));
defaultPlan.setRemark("默认付款计划");
defaultPlan.setCreateBy(ShiroUtils.getLoginName());
omsPayablePaymentPlanMapper.batchOmsPayablePaymentPlan(java.util.Collections.singletonList(defaultPlan));
defaultPlan.setCreateBy(ShiroUtils.getUserId().toString());
omsPayablePaymentPlanMapper.insertOmsPayablePaymentPlan(defaultPlan);
omsPayableBill.setLastPaymentPlanId(defaultPlan.getId());
//创建收票计划
OmsPayableTicketPlan omsPayableTicketPlan = new OmsPayableTicketPlan();
omsPayableTicketPlan.setPayableBillId(omsPayableBill.getId());
omsPayableTicketPlan.setPlanTicketDate(DateUtils.addDays(DateUtils.getNowDate(), payConfigDay));
omsPayableTicketPlan.setPlanAmount(omsPayableBill.getTotalPriceWithTax());
omsPayableTicketPlan.setPlanRate(new java.math.BigDecimal("100"));
omsPayableTicketPlan.setRemark("默认收票计划");
omsPayableTicketPlan.setCreateBy(ShiroUtils.getUserId().toString());
omsPayableTicketPlan.setCreateTime(DateUtils.getNowDate());
omsPayableTicketPlanMapper.insertOmsPayableTicketPlan(omsPayableTicketPlan);
omsPayableBill.setLastTicketPlanId(omsPayableTicketPlan.getId());
updateOmsPayableBill(omsPayableBill);
}
return rows;
}
@ -152,6 +167,7 @@ public class OmsPayableBillServiceImpl implements IOmsPayableBillService {
@Override
public int updateOmsPayableBill(OmsPayableBill omsPayableBill) {
omsPayableBill.setUpdateTime(DateUtils.getNowDate());
omsPayableBill.setUpdateBy(ShiroUtils.getUserId().toString());
return omsPayableBillMapper.updateOmsPayableBill(omsPayableBill);
}
@ -184,25 +200,25 @@ public class OmsPayableBillServiceImpl implements IOmsPayableBillService {
}
@Override
@Transactional
public int mergeAndInitiatePayment(MergedPaymentDataDto dto) {
// 1. Calculate Tax Totals
BigDecimal totalWithoutTax = BigDecimal.ZERO;
Map<Long, OmsPayableBill> billMap = new java.util.HashMap<>();
if (CollUtil.isEmpty(dto.getPayableOrders())) {
return 0;
}
// Fetch bills once
for (PayableOrderDto order : dto.getPayableOrders()) {
OmsPayableBill bill = omsPayableBillMapper.selectOmsPayableBillById(order.getId());
billMap.put(order.getId(), bill);
// todo 此处存疑 税额的计算到底应该怎么计算
for (OmsPayablePaymentPlan plan : order.getPaymentPlans()) {
if (bill.getTotalPriceWithTax() != null && bill.getTotalPriceWithTax().compareTo(BigDecimal.ZERO) != 0) {
// ratio = planAmount / totalWithTax
BigDecimal ratio = plan.getPlanAmount().divide(bill.getTotalPriceWithTax(), 10, java.math.RoundingMode.HALF_UP);
// planWithoutTax = totalWithoutTax * ratio
BigDecimal planWithoutTax = bill.getTotalPriceWithoutTax().multiply(ratio).setScale(2, java.math.RoundingMode.HALF_UP);
totalWithoutTax = totalWithoutTax.add(planWithoutTax);
// 计算每个 plan 的未税金额 = planAmount / (1 + 税率),保留两位小数
BigDecimal taxRate = order.getTaxRate();
if (taxRate == null || taxRate.compareTo(BigDecimal.ZERO) < 0) {
// 如果税率为空或小于0则默认为0
taxRate = new BigDecimal(defaultTax);
}
// 计算未税金额 = planAmount / (1 + 税率)
BigDecimal divisor = BigDecimal.ONE.add(taxRate);
BigDecimal planWithoutTax = plan.getPlanAmount().divide(divisor, 2, java.math.RoundingMode.HALF_UP);
totalWithoutTax = totalWithoutTax.add(planWithoutTax);
}
}
@ -221,9 +237,40 @@ public class OmsPayableBillServiceImpl implements IOmsPayableBillService {
paymentBill.setPaymentBillType(OmsPaymentBill.PaymentBillTypeEnum.FROM_PAYABLE.getCode());
omsPaymentBillService.insertOmsPaymentBill(paymentBill);
// 3. 创建付款明细
// 3. 创建付款明细 - 防止重复付款
// 收集所有支付计划ID
List<Long> allPaymentPlanIds = dto.getPayableOrders().stream()
.flatMap(order -> order.getPaymentPlans().stream())
.map(OmsPayablePaymentPlan::getId)
.collect(Collectors.toList());
// 查询现有的付款明细记录
Map<Long, OmsPayablePaymentDetail> existingDetailsMap = new java.util.HashMap<>();
if (!allPaymentPlanIds.isEmpty()) {
List<OmsPayablePaymentDetail> existingDetails = omsPayablePaymentDetailService.selectByPaymentPlanIds(allPaymentPlanIds);
// 使用stream将查询结果转化为Map以planId为keydetail为value取createtime最新的数据
existingDetailsMap = existingDetails.stream()
.collect(Collectors.toMap(
OmsPayablePaymentDetail::getPaymentPlanId,
detail -> detail,
// 如果有重复数据取createtime最新的数据
(existing, replacement) -> existing.getCreateTime().compareTo(replacement.getCreateTime()) >= 0 ? existing : replacement
));
}
// 遍历所有计划并检查是否有已付款的记录
for (PayableOrderDto payableOrderDto : dto.getPayableOrders()) {
for (OmsPayablePaymentPlan paymentPlanDto : payableOrderDto.getPaymentPlans()) {
// 检查是否存在已付款的记录
OmsPayablePaymentDetail existingDetail = existingDetailsMap.get(paymentPlanDto.getId());
if (existingDetail != null) {
// 检查是否是已付款状态,如果是则抛出异常
if (!OmsPayablePaymentDetail.PayableDetailTypeEnum.REFUND.getCode().equals(existingDetail.getPayableDetailType())) {
throw new ServiceException("计划ID为 " + paymentPlanDto.getId() + " 的付款已处理,请刷新页面后重试");
}
}
OmsPayablePaymentDetail detail = new OmsPayablePaymentDetail();
detail.setPayableBillId(payableOrderDto.getId());
detail.setPaymentPlanId(paymentPlanDto.getId());
@ -237,41 +284,49 @@ public class OmsPayableBillServiceImpl implements IOmsPayableBillService {
omsPayablePaymentDetailService.insertOmsPayablePaymentDetail(detail);
}
// 3. 更新应付单状态
// OmsPayableBill payableBill = omsPayableBillMapper.selectOmsPayableBillById(payableOrderDto.getId());
// // 这里可以根据业务逻辑更新状态,例如 "付款中"
// // payableBill.setPaymentStatus("1");
// omsPayableBillMapper.updateOmsPayableBill(payableBill);
// 3. 更新应付单最新付款id和已付和未付金额
}
// 批量更新应付单的付款相关信息
SpringUtils.getAopProxy(this).updatePaymentAmount(dto.getPayableOrders().stream().map(PayableOrderDto::getId).collect(Collectors.toList()));
return 1;
}
@Override
@Transactional
public int mergeAndInitiateReceipt(MergedReceiptDataDto dto) {
// 1. Calculate Tax Totals
BigDecimal totalWithoutTax = BigDecimal.ZERO;
Map<Long, OmsPayableBill> billMap = new java.util.HashMap<>();
if (CollUtil.isEmpty(dto.getPayableOrders())) {
return 0;
}
// Fetch bills once
for (PayableOrderReceiptDto order : dto.getPayableOrders()) {
OmsPayableBill bill = omsPayableBillMapper.selectOmsPayableBillById(order.getId());
billMap.put(order.getId(), bill);
for (OmsPayableTicketPlan plan : order.getTicketPlans()) {
if (bill.getTotalPriceWithTax() != null && bill.getTotalPriceWithTax().compareTo(BigDecimal.ZERO) != 0) {
BigDecimal ratio = plan.getPlanAmount().divide(bill.getTotalPriceWithTax(), 10, java.math.RoundingMode.HALF_UP);
BigDecimal planWithoutTax = bill.getTotalPriceWithoutTax().multiply(ratio).setScale(2, java.math.RoundingMode.HALF_UP);
totalWithoutTax = totalWithoutTax.add(planWithoutTax);
// 计算每个 plan 的未税金额 = planAmount / (1 + 税率),保留两位小数
BigDecimal taxRate = order.getTaxRate();
if (taxRate == null || taxRate.compareTo(BigDecimal.ZERO) < 0) {
// 如果税率为空或小于0则默认为0
taxRate = new BigDecimal(defaultTax);
}
// 计算未税金额 = planAmount / (1 + 税率)
BigDecimal divisor = BigDecimal.ONE.add(taxRate);
BigDecimal planWithoutTax = plan.getPlanAmount().divide(divisor, 2, java.math.RoundingMode.HALF_UP);
totalWithoutTax = totalWithoutTax.add(planWithoutTax);
}
}
// 2. 创建收票单
OmsTicketBill ticketBill = new OmsTicketBill();
OmsPayableBill firstPayableBill = billMap.get(dto.getPayableOrders().get(0).getId());
OmsPayableBill firstPayableBill = omsPayableBillMapper.selectOmsPayableBillById(dto.getPayableOrders().get(0).getId());
ticketBill.setTicketBillType(dto.getTicketBillType());
ticketBill.setVendorTicketTime(dto.getVendorTicketTime());
ticketBill.setVendorCode(firstPayableBill.getVendorCode());
ticketBill.setVendorName(firstPayableBill.getVendorName());
ticketBill.setTicketTime(dto.getTicketTime());
@ -285,9 +340,40 @@ public class OmsPayableBillServiceImpl implements IOmsPayableBillService {
ticketBill.setTicketStatus(OmsTicketBill.TicketStatusEnum.WAIT_TICKET.getCode());
omsTicketBillService.insertOmsTicketBill(ticketBill);
// 3. 创建收票明细
// 3. 创建收票明细 - 防止重复收票
// 收集所有收票计划ID
List<Long> allTicketPlanIds = dto.getPayableOrders().stream()
.flatMap(order -> order.getTicketPlans().stream())
.map(OmsPayableTicketPlan::getId)
.collect(Collectors.toList());
// 查询现有的收票明细记录
Map<Long, OmsPayableTicketDetail> existingDetailsMap = new java.util.HashMap<>();
if (!allTicketPlanIds.isEmpty()) {
List<OmsPayableTicketDetail> existingDetails = omsPayableTicketDetailService.selectByTicketPlanIds(allTicketPlanIds);
// 使用stream将查询结果转化为Map以planId为keydetail为value取createtime最新的数据
existingDetailsMap = existingDetails.stream()
.collect(Collectors.toMap(
OmsPayableTicketDetail::getTicketPlanId,
detail -> detail,
// 如果有重复数据取createtime最新的数据
(existing, replacement) -> existing.getCreateTime().compareTo(replacement.getCreateTime()) >= 0 ? existing : replacement
));
}
// 遍历所有计划并检查是否有已收票的记录
for (PayableOrderReceiptDto payableOrderDto : dto.getPayableOrders()) {
for (OmsPayableTicketPlan ticketPlanDto : payableOrderDto.getTicketPlans()) {
// 检查是否存在已收票的记录
OmsPayableTicketDetail existingDetail = existingDetailsMap.get(ticketPlanDto.getId());
if (existingDetail != null) {
// 检查是否是已收票状态,如果是则抛出异常
if (!OmsPayableTicketDetail.PayableDetailTypeEnum.RED_RUSH.getCode().equals(existingDetail.getPayableDetailType())) {
throw new ServiceException("计划ID为 " + ticketPlanDto.getId() + " 的收票已处理,请刷新页面后重试");
}
}
OmsPayableTicketDetail detail = new OmsPayableTicketDetail();
detail.setPayableBillId(payableOrderDto.getId());
detail.setTicketPlanId(ticketPlanDto.getId());
@ -296,12 +382,88 @@ public class OmsPayableBillServiceImpl implements IOmsPayableBillService {
detail.setPaymentAmount(ticketPlanDto.getPlanAmount());
detail.setPaymentRate(ticketPlanDto.getPlanRate());
detail.setPaymentTime(ticketPlanDto.getPlanTicketDate());
detail.setRemark(ticketPlanDto.getRemark());
detail.setCreateBy(ShiroUtils.getLoginName());
detail.setPayableDetailType(OmsPayableTicketDetail.PayableDetailTypeEnum.TICKET.getCode());
omsPayableTicketDetailService.insertOmsPayableTicketDetail(detail);
}
}
return 1;
// 批量更新应付单的收票相关信息
return SpringUtils.getAopProxy(this).updateTicketAmount(dto.getPayableOrders().stream().map(PayableOrderReceiptDto::getId).collect(Collectors.toList()));
}
@Override
public int updatePaymentAmount(List<Long> idList) {
if (CollUtil.isEmpty(idList)) {
return 0;
}
OmsPayableBill omsPayableBill = new OmsPayableBill();
omsPayableBill.setIdList(idList);
List<OmsPayableBill> omsPayableBills = omsPayableBillMapper.selectOmsPayableBillList(omsPayableBill);
if (CollUtil.isEmpty(omsPayableBills)) {
return 0;
}
List<OmsPayablePaymentDetail> omsPayablePaymentDetails = omsPayablePaymentDetailService.listByPayableBillIdList(idList);
Map<Long, Map<String, BigDecimal>> 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
))));
for (OmsPayableBill payableBill : omsPayableBills) {
Map<String, BigDecimal> 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)));
}
OmsPayablePaymentPlan payablePaymentPlan = omsPayablePaymentPlanMapper.firstUnPayPlan(payableBill.getId());
payableBill.setLastPaymentPlanId(payablePaymentPlan == null ? -1 : payablePaymentPlan.getId());
}
return omsPayableBillMapper.updateBatchPayableBillPaymentInfo(omsPayableBills);
}
@Override
public int updateTicketAmount(List<Long> idList) {
if (CollUtil.isEmpty(idList)) {
return 0;
}
OmsPayableBill omsPayableBill = new OmsPayableBill();
omsPayableBill.setIdList(idList);
List<OmsPayableBill> omsPayableBills = omsPayableBillMapper.selectOmsPayableBillList(omsPayableBill);
if (CollUtil.isEmpty(omsPayableBills)) {
return 0;
}
List<OmsPayableTicketDetail> omsPayableTicketDetails = omsPayableTicketDetailService.listByPayableBillIdList(idList);
Map<Long, Map<String, BigDecimal>> 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
))));
for (OmsPayableBill payableBill : omsPayableBills) {
Map<String, BigDecimal> 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))));
}
OmsPayableTicketPlan omsPayableTicketPlan = omsPayableTicketPlanMapper.firstUnPayPlan(payableBill.getId());
payableBill.setLastTicketPlanId(omsPayableTicketPlan == null ? -1 : omsPayableTicketPlan.getId());
}
return omsPayableBillMapper.updateBatchPayableBillTicketInfo(omsPayableBills);
}
@Override
@ -309,20 +471,20 @@ public class OmsPayableBillServiceImpl implements IOmsPayableBillService {
OmsPayableBill omsPayableBill = selectOmsPayableBillById(id);
List<OmsPayablePaymentDetail> omsPayablePaymentDetails = omsPayablePaymentDetailService.listByPayableBillId(id);
omsPayableBill.setDetailList(omsPayablePaymentDetails);
Map<String, BigDecimal> 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
)
));
// Map<String, BigDecimal> 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);
// 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);

View File

@ -100,4 +100,9 @@ public class OmsPayablePaymentDetailServiceImpl implements IOmsPayablePaymentDet
return paymentBillPayableDetailDTOS;
}
@Override
public List<OmsPayablePaymentDetail> selectByPaymentPlanIds(List<Long> paymentPlanIds) {
return omsPayablePaymentDetailMapper.selectByPaymentPlanIds(paymentPlanIds);
}
}

View File

@ -10,8 +10,8 @@ import java.util.stream.Collectors;
import cn.hutool.core.collection.CollUtil;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.sip.domain.OmsPayablePaymentDetail;
import com.ruoyi.sip.domain.OmsPayableTicketPlan;
import com.ruoyi.sip.domain.*;
import com.ruoyi.sip.mapper.OmsPayableBillMapper;
import com.ruoyi.sip.service.IOmsPayablePaymentDetailService;
import com.ruoyi.sip.service.IOmsPayableTicketPlanService;
import com.ruoyi.common.exception.ServiceException;
@ -19,15 +19,17 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.ruoyi.sip.mapper.OmsPayablePaymentPlanMapper;
import com.ruoyi.sip.domain.OmsPayablePaymentPlan;
import com.ruoyi.sip.service.IOmsPayablePaymentPlanService;
@Service
@Transactional(rollbackFor = Exception.class)
public class OmsPayablePaymentPlanServiceImpl implements IOmsPayablePaymentPlanService {
@Autowired
private OmsPayablePaymentPlanMapper omsPayablePaymentPlanMapper;
@Autowired
private OmsPayableBillMapper billMapper;
@Autowired
private IOmsPayablePaymentDetailService omsPayablePaymentDetailService;
@ -81,6 +83,12 @@ public class OmsPayablePaymentPlanServiceImpl implements IOmsPayablePaymentPlanS
for (Long idToDelete : existingPlanIdSet) {
omsPayablePaymentPlanMapper.deleteOmsPayablePaymentPlanById(idToDelete);
}
OmsPayablePaymentPlan payablePaymentPlan = omsPayablePaymentPlanMapper.firstUnPayPlan(payableBillId);
OmsPayableBill payableBill = new OmsPayableBill();
payableBill.setId(payableBillId);
payableBill.setLastPaymentPlanId(payablePaymentPlan == null ? -1 : payablePaymentPlan.getId());
billMapper.updateOmsPayableBill(payableBill);
}
@Override

View File

@ -152,4 +152,9 @@ public class OmsPayableTicketDetailServiceImpl implements IOmsPayableTicketDetai
public List<OmsPayableTicketDetail> listByPayableBillIdList(List<Long> payableBillId) {
return omsPayableTicketDetailMapper.listByPayableBillIdList(payableBillId);
}
@Override
public List<OmsPayableTicketDetail> selectByTicketPlanIds(List<Long> ticketPlanIds) {
return omsPayableTicketDetailMapper.selectByTicketPlanIds(ticketPlanIds);
}
}

View File

@ -9,14 +9,12 @@ import java.util.stream.Collectors;
import cn.hutool.core.collection.CollUtil;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.sip.domain.OmsPayablePaymentDetail;
import com.ruoyi.sip.domain.OmsPayablePaymentPlan;
import com.ruoyi.sip.domain.OmsPayableTicketDetail;
import com.ruoyi.sip.domain.*;
import com.ruoyi.sip.mapper.OmsPayableBillMapper;
import com.ruoyi.sip.service.IOmsPayableTicketDetailService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.sip.mapper.OmsPayableTicketPlanMapper;
import com.ruoyi.sip.domain.OmsPayableTicketPlan;
import com.ruoyi.sip.service.IOmsPayableTicketPlanService;
/**
@ -31,6 +29,8 @@ public class OmsPayableTicketPlanServiceImpl implements IOmsPayableTicketPlanSer
private OmsPayableTicketPlanMapper omsPayableTicketPlanMapper;
@Autowired
private IOmsPayableTicketDetailService detailService;
@Autowired
private OmsPayableBillMapper billMapper;
/**
*
@ -148,5 +148,11 @@ public class OmsPayableTicketPlanServiceImpl implements IOmsPayableTicketPlanSer
for (Long idToDelete : existingPlanIdSet) {
omsPayableTicketPlanMapper.deleteOmsPayableTicketPlanById(idToDelete);
}
OmsPayableTicketPlan payablePaymentPlan = omsPayableTicketPlanMapper.firstUnPayPlan(payableBillId);
OmsPayableBill payableBill = new OmsPayableBill();
payableBill.setId(payableBillId);
payableBill.setLastTicketPlanId(payablePaymentPlan == null ? -1 : payablePaymentPlan.getId());
billMapper.updateOmsPayableBill(payableBill);
}
}

View File

@ -7,7 +7,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<resultMap type="OmsPayableBill" id="OmsPayableBillResult">
<result property="id" column="id" />
<result property="payableBillCode" column="payable_bill_code" />
<result property="estimatedPaymentTime" column="estimated_payment_time" />
<result property="vendorCode" column="vendor_code" />
<result property="orderCode" column="order_code" />
<result property="inventoryCode" column="inventory_code" />
@ -15,6 +14,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="totalPriceWithTax" column="total_price_with_tax" />
<result property="totalPriceWithoutTax" column="total_price_without_tax" />
<result property="taxAmount" column="tax_amount" />
<result property="lastPaymentPlanId" column="last_payment_plan_id" />
<result property="lastTicketPlanId" column="last_ticket_plan_id" />
<result property="paidPaymentAmount" column="paid_payment_amount" />
<result property="unpaidPaymentAmount" column="unpaid_payment_amount" />
<result property="receivedTicketAmount" column="received_ticket_amount" />
<result property="unreceivedTicketAmount" column="unreceived_ticket_amount" />
<result property="planPaymentDate" column="plan_payment_date" />
<result property="planAmount" column="plan_amount" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
@ -24,13 +31,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</resultMap>
<sql id="selectOmsPayableBillVo">
select id, payable_bill_code, estimated_payment_time, vendor_code, order_code, inventory_code, product_type, total_price_with_tax, total_price_without_tax, tax_amount, create_by, create_time, update_by, update_time, remark, del_flag from oms_payable_bill
</sql>
<sql id="selectOmsPayableBillRelationVo">
SELECT
select
t1.id,
t1.payable_bill_code,
t1.estimated_payment_time,
t1.vendor_code,
t1.order_code,
t1.inventory_code,
@ -38,7 +41,37 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
t1.total_price_with_tax,
t1.total_price_without_tax,
t1.tax_amount,
t1.paid_payment_amount,
t1.unpaid_payment_amount,
t1.received_ticket_amount,
t1.unreceived_ticket_amount,
t1.last_payment_plan_id,
t1.last_ticket_plan_id,
t1.create_by,
t1.create_time,
t1.update_by,
t1.update_time,
t1.remark,
t1.del_flag
from oms_payable_bill t1
</sql>
<sql id="selectOmsPayableBillRelationVo">
SELECT
t1.id,
t1.payable_bill_code,
t1.vendor_code,
t1.order_code,
t1.inventory_code,
t1.product_type,
t1.total_price_with_tax,
t1.total_price_without_tax,
t1.tax_amount,
t1.paid_payment_amount,
t1.unpaid_payment_amount,
t1.received_ticket_amount,
t1.unreceived_ticket_amount,
t1.last_payment_plan_id,
t1.last_ticket_plan_id,
t1.create_by,
t1.create_time,
t1.update_by,
@ -47,18 +80,24 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
t1.del_flag ,
t3.project_code,
t3.project_name,
t4.vendor_name
t4.vendor_name,
ppp.plan_payment_date,
ppp.plan_amount,
t5.plan_ticket_date,
t5.plan_amount as plan_ticket_amount
FROM
oms_payable_bill t1
left join project_order_info t2 on t1.order_code=t2.order_code
left join project_info t3 on t2.project_id=t3.id
left join oms_vendor_info t4 on t1.vendor_code=t4.vendor_code
left join oms_payable_payment_plan ppp on t1.last_payment_plan_id = ppp.id
left join oms_payable_ticket_plan t5 on t1.last_ticket_plan_id = t5.id
</sql>
<select id="selectOmsPayableBillList" parameterType="OmsPayableBill" resultMap="OmsPayableBillResult">
<include refid="selectOmsPayableBillRelationVo"/>
<where>
<if test="payableBillCode != null and payableBillCode != ''"> and t1.payable_bill_code like concat( #{payableBillCode},'%') </if>
<if test="estimatedPaymentTime != null "> and t1.estimated_payment_time = #{estimatedPaymentTime}</if>
<if test="idList != null and idList.size>0"> and t1.id in <foreach item="item" collection="idList" separator="," open="(" close=")" index="">#{item}</foreach></if>
<if test="vendorCode != null and vendorCode != ''"> and t1.vendor_code = #{vendorCode}</if>
<if test="vendorName != null and vendorName != ''"> and t4.vendor_name = #{vendorName}</if>
<if test="projectCode != null and projectCode != ''"> and t3.project_code = #{projectCode}</if>
@ -69,6 +108,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="totalPriceWithTax != null "> and t1.total_price_with_tax = #{totalPriceWithTax}</if>
<if test="totalPriceWithoutTax != null "> and t1.total_price_without_tax = #{totalPriceWithoutTax}</if>
<if test="taxAmount != null "> and t1.tax_amount = #{taxAmount}</if>
<if test="paidPaymentAmount != null "> and t1.paid_payment_amount = #{paidPaymentAmount}</if>
<if test="unpaidPaymentAmount != null "> and t1.unpaid_payment_amount = #{unpaidPaymentAmount}</if>
<if test="receivedTicketAmount != null "> and t1.received_ticket_amount = #{receivedTicketAmount}</if>
<if test="unreceivedTicketAmount != null "> and t1.unreceived_ticket_amount = #{unreceivedTicketAmount}</if>
<if test="lastPaymentPlanId != null"> and t1.last_payment_plan_id = #{lastPaymentPlanId}</if>
<if test="lastTicketPlanId != null"> and t1.last_ticket_plan_id = #{lastTicketPlanId}</if>
<if test="planPaymentDate != null "> and ppp.plan_payment_date = #{planPaymentDate}</if>
<if test="planAmount != null "> and ppp.plan_amount = #{planAmount}</if>
<if test="createTimeStart != null or createTimeEnd != null">
<choose>
<when test="createTimeStart != null and createTimeEnd != null">
@ -83,18 +130,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</choose>
</if>
<if test="estimatedPaymentTimeStart != null or estimatedPaymentTimeEnd != null">
<if test="planPaymentDateStart != null or planPaymentDateEnd != null">
<choose>
<when test="estimatedPaymentTimeStart != null and estimatedPaymentTimeEnd != null">
and t1.estimated_payment_time between date_format(#{estimatedPaymentTimeStart}, '%Y-%m-%d 00:00:00') and date_format(#{estimatedPaymentTimeEnd}, '%Y-%m-%d 23:59:59')
<when test="planPaymentDateStart != null and planPaymentDateEnd != null">
and ppp.plan_payment_date between date_format(#{planPaymentDateStart}, '%Y-%m-%d 00:00:00') and date_format(#{planPaymentDateEnd}, '%Y-%m-%d 23:59:59')
</when>
<when test="estimatedPaymentTimeStart != null">
and t1.estimated_payment_time <![CDATA[ >= ]]> date_format(#{estimatedPaymentTimeStart}, '%Y-%m-%d 00:00:00')
<when test="planPaymentDateStart != null">
and ppp.plan_payment_date <![CDATA[ >= ]]> date_format(#{planPaymentDateStart}, '%Y-%m-%d 00:00:00')
</when>
<when test="estimatedPaymentTimeEnd != null">
and t1.estimated_payment_time <![CDATA[ <= ]]> date_format(#{estimatedPaymentTimeEnd}, '%Y-%m-%d 23:59:59')
<when test="planPaymentDateEnd != null">
and ppp.plan_payment_date <![CDATA[ <= ]]> date_format(#{planPaymentDateEnd}, '%Y-%m-%d 23:59:59')
</when>
</choose>
</if>
</where>
@ -114,14 +160,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
insert into oms_payable_bill
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="payableBillCode != null and payableBillCode != ''">payable_bill_code,</if>
<if test="estimatedPaymentTime != null">estimated_payment_time,</if>
<if test="vendorCode != null">vendor_code,</if>
<if test="orderCode != null">order_code,</if>
<if test="inventoryCode != null">inventory_code,</if>
<if test="productType != null">product_type,</if>
<if test="productCode != null">product_code,</if>
<if test="totalPriceWithTax != null">total_price_with_tax,</if>
<if test="totalPriceWithoutTax != null">total_price_without_tax,</if>
<if test="taxAmount != null">tax_amount,</if>
<if test="paidPaymentAmount != null">paid_payment_amount,</if>
<if test="unpaidPaymentAmount != null">unpaid_payment_amount,</if>
<if test="receivedTicketAmount != null">received_ticket_amount,</if>
<if test="unreceivedTicketAmount != null">unreceived_ticket_amount,</if>
<if test="lastPaymentPlanId != null">last_payment_plan_id,</if>
<if test="lastTicketPlanId != null">last_ticket_plan_id,</if>
<if test="taxRate != null">tax_rate,</if>
<if test="createBy != null">create_by,</if>
@ -133,15 +186,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="payableBillCode != null and payableBillCode != ''">#{payableBillCode},</if>
<if test="estimatedPaymentTime != null">#{estimatedPaymentTime},</if>
<if test="vendorCode != null">#{vendorCode},</if>
<if test="orderCode != null">#{orderCode},</if>
<if test="inventoryCode != null">#{inventoryCode},</if>
<if test="productType != null">#{productType},</if>
<if test="productCode != null">#{productCode},</if>
<if test="totalPriceWithTax != null">#{totalPriceWithTax},</if>
<if test="totalPriceWithoutTax != null">#{totalPriceWithoutTax},</if>
<if test="taxAmount != null">#{taxAmount},</if>
<if test="paidPaymentAmount != null">#{paidPaymentAmount},</if>
<if test="unpaidPaymentAmount != null">#{unpaidPaymentAmount},</if>
<if test="receivedTicketAmount != null">#{receivedTicketAmount},</if>
<if test="unreceivedTicketAmount != null">#{unreceivedTicketAmount},</if>
<if test="lastPaymentPlanId != null">#{lastPaymentPlanId},</if>
<if test="lastTicketPlanId != null">#{lastTicketPlanId},</if>
<if test="taxRate != null">#{taxRate},</if>
<if test="createBy != null">#{createBy},</if>
<if test="createTime != null">#{createTime},</if>
@ -156,7 +215,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
update oms_payable_bill
<trim prefix="SET" suffixOverrides=",">
<if test="payableBillCode != null and payableBillCode != ''">payable_bill_code = #{payableBillCode},</if>
<if test="estimatedPaymentTime != null">estimated_payment_time = #{estimatedPaymentTime},</if>
<if test="vendorCode != null">vendor_code = #{vendorCode},</if>
<if test="orderCode != null">order_code = #{orderCode},</if>
<if test="inventoryCode != null">inventory_code = #{inventoryCode},</if>
@ -164,6 +222,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="totalPriceWithTax != null">total_price_with_tax = #{totalPriceWithTax},</if>
<if test="totalPriceWithoutTax != null">total_price_without_tax = #{totalPriceWithoutTax},</if>
<if test="taxAmount != null">tax_amount = #{taxAmount},</if>
<if test="paidPaymentAmount != null">paid_payment_amount = #{paidPaymentAmount},</if>
<if test="unpaidPaymentAmount != null">unpaid_payment_amount = #{unpaidPaymentAmount},</if>
<if test="receivedTicketAmount != null">received_ticket_amount = #{receivedTicketAmount},</if>
<if test="unreceivedTicketAmount != null">unreceived_ticket_amount = #{unreceivedTicketAmount},</if>
<if test="lastPaymentPlanId != null">last_payment_plan_id = #{lastPaymentPlanId},</if>
<if test="lastTicketPlanId != null">last_ticket_plan_id = #{lastTicketPlanId},</if>
<if test="createBy != null">create_by = #{createBy},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="updateBy != null">update_by = #{updateBy},</if>
@ -185,4 +249,29 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</foreach>
</delete>
<update id="updateBatchPayableBillPaymentInfo">
<foreach collection="list" item="item" separator=";">
UPDATE oms_payable_bill
SET
last_payment_plan_id = #{item.lastPaymentPlanId},
paid_payment_amount = #{item.paidPaymentAmount},
unpaid_payment_amount = #{item.unpaidPaymentAmount},
update_time = NOW(),
update_by = #{item.updateBy}
WHERE id = #{item.id}
</foreach>
</update>
<update id="updateBatchPayableBillTicketInfo">
<foreach collection="list" item="item" separator=";">
UPDATE oms_payable_bill
SET
last_ticket_plan_id = #{item.lastTicketPlanId},
received_ticket_amount = #{item.receivedTicketAmount},
unreceived_ticket_amount = #{item.unreceivedTicketAmount},
update_time = NOW(),
update_by = #{item.updateBy}
WHERE id = #{item.id}
</foreach>
</update>
</mapper>

View File

@ -75,6 +75,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</if>
</where>
</select>
<select id="selectByPaymentPlanIds" resultType="com.ruoyi.sip.domain.OmsPayablePaymentDetail">
SELECT
t1.id, t1.payment_plan_id, t1.payable_bill_id, t1.payment_time,
t1.payment_amount, t1.payment_rate, t1.payment_bill_code, t1.remark,
t1.create_time, t1.create_by, t1.update_time, t1.payable_detail_type
FROM
oms_payable_payment_detail t1
WHERE t1.payment_plan_id IN
<foreach collection="paymentPlanIds" item="item" open="(" separator="," close=")">
#{item}
</foreach>
ORDER BY t1.create_time DESC
</select>
<select id="listPayableByPaymentCode" resultType="com.ruoyi.sip.domain.dto.PaymentBillPayableDetailDTO">
select t1.payment_amount, t2.payable_bill_code, t4.project_name, t4.project_code, t2.total_price_with_tax
from (SELECT sum(payment_amount) payment_amount,

View File

@ -21,7 +21,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</resultMap>
<sql id="selectInventoryInfoVo">
select t1.id, t1.product_code, t1.product_sn, t1.inventory_status, t1.inner_code, t1.outer_code, t1.warehouse_id, t1.inner_price,
select t1.id, t1.product_code, t1.product_sn, t1.inventory_status, t1.inner_code, t1.outer_code, t1.warehouse_id, t1.inner_price,t1.tax_rate,
t1.outer_price, t1.create_by, t1.create_time, t1.update_by, t1.update_time ,
t2.warehouse_name,t3.description as 'product_desc',t3.model
from oms_inventory_info t1
@ -135,10 +135,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</insert>
<insert id="saveBatch">
insert into oms_inventory_info (product_code, product_sn, inventory_status, inner_code, outer_code
, warehouse_id, inner_price, outer_price, create_by, create_time, update_by, update_time,payable_bill_code) values
, warehouse_id, inner_price, outer_price, create_by, create_time, update_by, update_time,payable_bill_code,tax_rate) values
<foreach item="item" index="index" collection="list" separator=",">
(#{item.productCode}, #{item.productSn}, #{item.inventoryStatus}, #{item.innerCode}, #{item.outerCode}
, #{item.warehouseId}, #{item.innerPrice}, #{item.outerPrice}, #{item.createBy}, #{item.createTime}, #{item.updateBy}, #{item.updateTime},#{item.payableBillCode})
, #{item.warehouseId}, #{item.innerPrice}, #{item.outerPrice}, #{item.createBy}, #{item.createTime}, #{item.updateBy}, #{item.updateTime},#{item.payableBillCode},#{item.taxRate})
</foreach>
ON DUPLICATE KEY UPDATE
inventory_status = VALUES(inventory_status),

View File

@ -40,6 +40,40 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectOmsPayablePaymentPlanIdsByPayableBillId" parameterType="Long" resultType="Long">
select id from oms_payable_payment_plan where payable_bill_id = #{payableBillId}
</select>
<select id="firstUnPayPlan" resultType="com.ruoyi.sip.domain.OmsPayablePaymentPlan">
select t1.id,
t1.payable_bill_id,
t1.plan_payment_date,
t1.plan_amount,
t1.plan_rate,
t1.remark,
t1.create_time,
t1.create_by,
t1.update_time
from oms_payable_payment_plan t1
left join oms_payable_payment_detail t2 on t1.id = t2.payment_plan_id
where t2.id is null and t1.payable_bill_id = #{payableBillId}
order by plan_payment_date
limit 1
</select>
<select id="listDetailByPayableBillIdList" resultType="com.ruoyi.sip.domain.OmsPayablePaymentPlan">
select t1.id,
t1.payable_bill_id,
t1.plan_payment_date,
t1.plan_amount,
t1.plan_rate,
t1.remark,
t1.create_time,
t1.create_by,
t1.update_time
from oms_payable_payment_plan t1
left join oms_payable_payment_detail t2 on t1.id = t2.payment_plan_id
left join oms_payment_bill t3 on t1.id = t3.id
where t1.payable_bill_id in
<foreach item="item" index="index" collection="list" separator="," open="(" close=")">
#{item}
</foreach>
</select>
<insert id="insertOmsPayablePaymentPlan" parameterType="OmsPayablePaymentPlan" useGeneratedKeys="true" keyProperty="id">
insert into oms_payable_payment_plan(

View File

@ -66,6 +66,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</where>
</select>
<select id="selectByTicketPlanIds" resultType="com.ruoyi.sip.domain.OmsPayableTicketDetail">
<include refid="selectOmsPayableTicketDetailVo"/>
<where>
<if test="list != null and list.size > 0">
and ticket_plan_id in
<foreach item="item" collection="list" separator="," open="(" close=")" index="">
#{item}
</foreach>
</if>
</where>
</select>
<select id="selectOmsPayableTicketDetailById" parameterType="Long" resultMap="OmsPayableTicketDetailResult">
<include refid="selectOmsPayableTicketDetailVo"/>
where id = #{id}

View File

@ -55,6 +55,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<include refid="selectOmsPayableTicketPlanVo"/>
where id = #{id}
</select>
<select id="firstUnPayPlan" resultType="com.ruoyi.sip.domain.OmsPayableTicketPlan">
select t1.id, t1.payable_bill_id, t1.plan_ticket_date, t1.plan_amount, t1.plan_rate, t1.create_by, t1.create_time, t1.update_by,
t1.update_time
from oms_payable_ticket_plan t1
left join oms_payable_ticket_detail t2 on t1.id=t2.ticket_plan_id
where t2.id is null and t1.payable_bill_id=#{payableBillId}
order by t1.plan_ticket_date
limit 1
</select>
<insert id="insertOmsPayableTicketPlan" parameterType="com.ruoyi.sip.domain.OmsPayableTicketPlan" useGeneratedKeys="true" keyProperty="id">
insert into oms_payable_ticket_plan