feat(finance): 实现手工匹配核销功能
- 新增付款单与应付单的手工匹配核销界面 - 支持应付单和付款单的独立过滤查询 - 实现核销金额的实时计算与校验逻辑 - 添加应付计划选择弹窗及交互逻辑 - 集成税务相关金额的自动计算功能 - 提供核销明细数据的批量插入接口支持 - 优化表格展示与分页查询用户体验dev_1.0.1
parent
8d6ca0b64f
commit
f79150abc9
|
|
@ -150,3 +150,23 @@ export function listPaymentApproved(query) {
|
|||
})
|
||||
}
|
||||
|
||||
// 查询付款单列表 (核销专用)
|
||||
export function listPaymentForWriteOff(query) {
|
||||
return request({
|
||||
url: '/finance/payment/write-off/list',
|
||||
method: 'post',
|
||||
headers: {
|
||||
'Content-Type': 'application/x-www-form-urlencoded'
|
||||
},
|
||||
data: tansParams(query)
|
||||
})
|
||||
}
|
||||
|
||||
// 手工匹配核销
|
||||
export function manualWriteOff(data) {
|
||||
return request({
|
||||
url: '/finance/writeoff',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
|
@ -1,395 +0,0 @@
|
|||
<template>
|
||||
<div class="app-container">
|
||||
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" label-width="120px">
|
||||
<el-form-item label="制造商名称" prop="vendorName">
|
||||
<el-input
|
||||
v-model="queryParams.vendorName"
|
||||
placeholder="请输入制造商名称"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="采购应付单编号" prop="payableBillCode">
|
||||
<el-input
|
||||
v-model="queryParams.payableBillCode"
|
||||
placeholder="请输入采购应付单编号"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="采购付款单编号" prop="paymentCode">
|
||||
<el-input
|
||||
v-model="queryParams.paymentCode"
|
||||
placeholder="请输入采购付款单编号"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="应付单生成时间">
|
||||
<el-date-picker
|
||||
v-model="payableDateRange"
|
||||
style="width: 240px"
|
||||
value-format="yyyy-MM-dd HH:mm:ss"
|
||||
type="daterange"
|
||||
range-separator="-"
|
||||
start-placeholder="开始日期"
|
||||
end-placeholder="结束日期"
|
||||
></el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item label="付款单生成时间">
|
||||
<el-date-picker
|
||||
v-model="paymentDateRange"
|
||||
style="width: 240px"
|
||||
value-format="yyyy-MM-dd HH:mm:ss"
|
||||
type="daterange"
|
||||
range-separator="-"
|
||||
start-placeholder="开始日期"
|
||||
end-placeholder="结束日期"
|
||||
></el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
|
||||
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<div v-if="showTables">
|
||||
<!-- 采购应付单表格 -->
|
||||
<h3>采购应付单</h3>
|
||||
<div class="table-summary" style="margin-bottom: 10px;">
|
||||
<span style="font-weight: bold; margin-right: 20px;">应付单本次核销总额: <span style="color: #409EFF">{{ totalPayableWriteOffAmount.toFixed(2) }}</span></span>
|
||||
</div>
|
||||
<el-table v-loading="loadingPayable" :data="payableList" border>
|
||||
<el-table-column label="采购应付单编号" align="center" prop="payableBillCode" width="150" show-overflow-tooltip/>
|
||||
<el-table-column label="制造商名称" align="center" prop="vendorName" width="150" show-overflow-tooltip/>
|
||||
|
||||
<el-table-column label="本次核销金额" align="center" width="150">
|
||||
<template slot-scope="scope">
|
||||
<el-input
|
||||
v-model="scope.row.currentWriteOffAmount"
|
||||
placeholder="点击选择计划"
|
||||
readonly
|
||||
@click.native="handleOpenPlanSelector(scope.row)"
|
||||
style="cursor: pointer;"
|
||||
>
|
||||
<i slot="suffix" class="el-input__icon el-icon-search"></i>
|
||||
</el-input>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="未核销金额" align="center" prop="unpaidAmount" width="120" />
|
||||
<el-table-column label="未核销含税总价" align="center" prop="unpaidAmount" width="120">
|
||||
<template slot-scope="scope">
|
||||
{{ scope.row.unpaidAmount }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="未核销税额" align="center" width="120">
|
||||
<template slot-scope="scope">
|
||||
{{ calculateTax(scope.row.unpaidAmount, scope.row.taxRate) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="已核销含税总价" align="center" prop="paidAmount" width="120" />
|
||||
<el-table-column label="已核销未税总价" align="center" width="120">
|
||||
<template slot-scope="scope">
|
||||
{{ calculateExcludingTax(scope.row.paidAmount, scope.row.taxRate) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="已核销税额" align="center" width="120">
|
||||
<template slot-scope="scope">
|
||||
{{ calculateTax(scope.row.paidAmount, scope.row.taxRate) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="应付单生成时间" align="center" prop="createTime" width="160">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ parseTime(scope.row.createTime) }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<pagination
|
||||
v-show="payableTotal>0"
|
||||
:total="payableTotal"
|
||||
:page.sync="payableQueryParams.pageNum"
|
||||
:limit.sync="payableQueryParams.pageSize"
|
||||
@pagination="getPayableList"
|
||||
/>
|
||||
|
||||
<!-- 采购付款单表格 -->
|
||||
<h3 style="margin-top: 30px;">采购付款单</h3>
|
||||
<div class="table-summary" style="margin-bottom: 10px;">
|
||||
<span style="font-weight: bold; margin-right: 20px;">付款单本次核销总额: <span :style="{color: isWriteOffAmountValid ? '#67C23A' : '#F56C6C'}">{{ totalPaymentWriteOffAmount.toFixed(2) }}</span></span>
|
||||
<span v-if="!isWriteOffAmountValid" style="color: #F56C6C; font-size: 12px;"><i class="el-icon-warning"></i> 总价之和不能大于应付单本次核销总价之和</span>
|
||||
</div>
|
||||
<el-table v-loading="loadingPayment" :data="paymentList" border>
|
||||
<el-table-column label="采购付款单号" align="center" prop="paymentBillCode" width="150" show-overflow-tooltip/>
|
||||
<el-table-column label="制造商名称" align="center" prop="vendorName" width="150" show-overflow-tooltip/>
|
||||
|
||||
<el-table-column label="本次核销含税总价" align="center" width="150">
|
||||
<template slot-scope="scope">
|
||||
<el-input-number
|
||||
v-model="scope.row.currentWriteOffAmount"
|
||||
:precision="2"
|
||||
:step="100"
|
||||
:min="0"
|
||||
:max="scope.row.unWrittenAmount || scope.row.paymentAmount"
|
||||
size="small"
|
||||
style="width: 100%"
|
||||
/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="未核销含税总价" align="center" width="120">
|
||||
<template slot-scope="scope">
|
||||
{{ scope.row.unWrittenAmount || scope.row.paymentAmount }} <!-- Assuming paymentAmount is total initially -->
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="未核销未税总价" align="center" width="120">
|
||||
<template slot-scope="scope">
|
||||
{{ calculateExcludingTax(scope.row.unWrittenAmount || scope.row.paymentAmount, 0) }} <!-- Payment usually doesn't have tax rate per se, using 0 or need logic -->
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="未核销税额" align="center" width="120">
|
||||
<template slot-scope="scope">0.00</template> <!-- Placeholder if payment has no tax logic -->
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="已核销含税总价" align="center" prop="writtenAmount" width="120">
|
||||
<template slot-scope="scope">{{ scope.row.writtenAmount || 0 }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="已核销未税总价" align="center" width="120">
|
||||
<template slot-scope="scope">
|
||||
{{ calculateExcludingTax(scope.row.writtenAmount || 0, 0) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="已核销税额" align="center" width="120">
|
||||
<template slot-scope="scope">0.00</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="付款单类型" align="center" prop="paymentBillType" width="120">
|
||||
<template slot-scope="scope">
|
||||
<dict-tag :options="dict.type.payment_bill_type" :value="scope.row.paymentBillType"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="付款单生成时间" align="center" prop="createTime" width="160">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ parseTime(scope.row.createTime) }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<pagination
|
||||
v-show="paymentTotal>0"
|
||||
:total="paymentTotal"
|
||||
:page.sync="paymentQueryParams.pageNum"
|
||||
:limit.sync="paymentQueryParams.pageSize"
|
||||
@pagination="getPaymentList"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<!-- 弹窗:选择应付计划 -->
|
||||
<el-dialog :title="planDialogTitle" :visible.sync="planDialogVisible" width="70%" append-to-body>
|
||||
<payment-plan-selector
|
||||
v-if="planDialogVisible"
|
||||
ref="planSelector"
|
||||
:payable-data="currentPayableRow"
|
||||
:selected-plans="currentPayableRow ? currentPayableRow.selectedPlans : []"
|
||||
:is-init-edit="false"
|
||||
/>
|
||||
<!-- Note: is-init-edit=false makes it read-only for editing plans generally, but we want to SELECT.
|
||||
PaymentPlanSelector logic: 'selection-change' works.
|
||||
If PaymentPlanSelector allows selection only in some mode, we need to check.
|
||||
Looking at PaymentPlan.vue: <el-table ... @selection-change="selectPlan">
|
||||
It seems selection is always enabled.
|
||||
-->
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button @click="planDialogVisible = false">取 消</el-button>
|
||||
<el-button type="primary" @click="handlePlanSelectionConfirm">确 定</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { listPayable } from "@/api/finance/payable";
|
||||
import { listPayment } from "@/api/finance/payment";
|
||||
import PaymentPlanSelector from "../payable/components/PaymentPlan.vue";
|
||||
|
||||
export default {
|
||||
name: "ManualWriteOff",
|
||||
components: { PaymentPlanSelector },
|
||||
dicts: ['payment_status', 'payment_bill_type'],
|
||||
data() {
|
||||
return {
|
||||
// 遮罩层
|
||||
loadingPayable: false,
|
||||
loadingPayment: false,
|
||||
// 显示表格
|
||||
showTables: false,
|
||||
// 搜索表单
|
||||
queryParams: {
|
||||
vendorName: undefined,
|
||||
payableBillCode: undefined,
|
||||
paymentCode: undefined,
|
||||
},
|
||||
payableDateRange: [],
|
||||
paymentDateRange: [],
|
||||
// 应付单数据
|
||||
payableList: [],
|
||||
payableTotal: 0,
|
||||
payableQueryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
vendorName: undefined,
|
||||
payableBillCode: undefined,
|
||||
params: {}
|
||||
},
|
||||
// 付款单数据
|
||||
paymentList: [],
|
||||
paymentTotal: 0,
|
||||
paymentQueryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
vendorName: undefined,
|
||||
paymentCode: undefined,
|
||||
params: {}
|
||||
},
|
||||
|
||||
// 弹窗相关
|
||||
planDialogVisible: false,
|
||||
currentPayableRow: null,
|
||||
planDialogTitle: "选择应付计划"
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
totalPayableWriteOffAmount() {
|
||||
return this.payableList.reduce((sum, row) => sum + (row.currentWriteOffAmount || 0), 0);
|
||||
},
|
||||
totalPaymentWriteOffAmount() {
|
||||
return this.paymentList.reduce((sum, row) => sum + (row.currentWriteOffAmount || 0), 0);
|
||||
},
|
||||
isWriteOffAmountValid() {
|
||||
// use a small epsilon for float comparison if needed, but direct comparison is usually okay for UI validation
|
||||
return this.totalPaymentWriteOffAmount <= this.totalPayableWriteOffAmount + 0.01;
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
/** 搜索按钮操作 */
|
||||
handleQuery() {
|
||||
if (!this.queryParams.vendorName) {
|
||||
this.$modal.msgError("请输入制造商名称");
|
||||
return;
|
||||
}
|
||||
|
||||
this.showTables = true;
|
||||
this.payableQueryParams.pageNum = 1;
|
||||
this.paymentQueryParams.pageNum = 1;
|
||||
|
||||
this.syncParams();
|
||||
|
||||
this.getPayableList();
|
||||
this.getPaymentList();
|
||||
},
|
||||
/** 重置按钮操作 */
|
||||
resetQuery() {
|
||||
this.payableDateRange = [];
|
||||
this.paymentDateRange = [];
|
||||
this.resetForm("queryForm");
|
||||
this.showTables = false;
|
||||
this.payableList = [];
|
||||
this.paymentList = [];
|
||||
},
|
||||
syncParams() {
|
||||
this.payableQueryParams.vendorName = this.queryParams.vendorName;
|
||||
this.payableQueryParams.payableBillCode = this.queryParams.payableBillCode;
|
||||
this.payableQueryParams.params = {};
|
||||
if (null != this.payableDateRange && '' != this.payableDateRange) {
|
||||
this.payableQueryParams.params["beginTime"] = this.payableDateRange[0];
|
||||
this.payableQueryParams.params["endTime"] = this.payableDateRange[1];
|
||||
}
|
||||
|
||||
this.paymentQueryParams.vendorName = this.queryParams.vendorName;
|
||||
this.paymentQueryParams.paymentCode = this.queryParams.paymentCode;
|
||||
this.paymentQueryParams.params = {};
|
||||
if (null != this.paymentDateRange && '' != this.paymentDateRange) {
|
||||
this.paymentQueryParams.params["beginTime"] = this.paymentDateRange[0];
|
||||
this.paymentQueryParams.params["endTime"] = this.paymentDateRange[1];
|
||||
}
|
||||
},
|
||||
getPayableList() {
|
||||
this.loadingPayable = true;
|
||||
listPayable(this.payableQueryParams).then(response => {
|
||||
this.payableList = response.rows.map(item => ({
|
||||
...item,
|
||||
currentWriteOffAmount: 0, // Initialize
|
||||
selectedPlans: [] // Initialize
|
||||
}));
|
||||
this.payableTotal = response.total;
|
||||
this.loadingPayable = false;
|
||||
});
|
||||
},
|
||||
getPaymentList() {
|
||||
this.loadingPayment = true;
|
||||
listPayment(this.paymentQueryParams).then(response => {
|
||||
this.paymentList = response.rows.map(item => ({
|
||||
...item,
|
||||
currentWriteOffAmount: 0, // Initialize
|
||||
// Mocking fields not yet in standard listPayment (or assuming defaults)
|
||||
unWrittenAmount: item.paymentAmount - (item.writtenAmount || 0),
|
||||
writtenAmount: item.writtenAmount || 0
|
||||
}));
|
||||
this.paymentTotal = response.total;
|
||||
this.loadingPayment = false;
|
||||
});
|
||||
},
|
||||
|
||||
// Logic for Plan Selection
|
||||
handleOpenPlanSelector(row) {
|
||||
this.currentPayableRow = row;
|
||||
this.planDialogTitle = `选择应付计划 - ${row.payableBillCode}`;
|
||||
this.planDialogVisible = true;
|
||||
},
|
||||
handlePlanSelectionConfirm() {
|
||||
if (this.$refs.planSelector && this.$refs.planSelector.selectedPlan) {
|
||||
const selected = this.$refs.planSelector.selectedPlan;
|
||||
this.currentPayableRow.selectedPlans = selected;
|
||||
// Calculate sum
|
||||
const sum = selected.reduce((acc, plan) => acc + (plan.planAmount || 0), 0);
|
||||
this.currentPayableRow.currentWriteOffAmount = sum;
|
||||
|
||||
this.$modal.msgSuccess(`已选择 ${selected.length} 个计划,总金额 ${sum.toFixed(2)}`);
|
||||
}
|
||||
this.planDialogVisible = false;
|
||||
},
|
||||
|
||||
// Tax Calculations
|
||||
calculateTax(amount, taxRate) {
|
||||
if (!amount) return '0.00';
|
||||
if (!taxRate) return '0.00';
|
||||
// Formula depends on if amount is tax-inclusive.
|
||||
// Typically unpaidAmount is Tax Inclusive.
|
||||
// Tax = Amount - Amount / (1 + Rate/100)
|
||||
// = Amount * (1 - 1/(1+Rate/100))
|
||||
const rate = Number(taxRate) / 100;
|
||||
const tax = amount - (amount / (1 + rate));
|
||||
return tax.toFixed(2);
|
||||
},
|
||||
calculateExcludingTax(amount, taxRate) {
|
||||
if (!amount) return '0.00';
|
||||
// Amount / (1 + Rate/100)
|
||||
const rate = Number(taxRate || 0) / 100;
|
||||
const excl = amount / (1 + rate);
|
||||
return excl.toFixed(2);
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.table-summary {
|
||||
background-color: #f8f8f9;
|
||||
padding: 10px;
|
||||
border-radius: 4px;
|
||||
border: 1px solid #ebeef5;
|
||||
}
|
||||
</style>
|
||||
|
|
@ -0,0 +1,567 @@
|
|||
<template>
|
||||
<div class="app-container">
|
||||
<!-- 顶部按钮工具栏 -->
|
||||
<div style="margin-bottom: 20px;">
|
||||
<el-button type="primary" icon="el-icon-search" size="small" @click="handleOpenPayableFilter">应付单过滤
|
||||
</el-button>
|
||||
<el-button type="primary" icon="el-icon-search" size="small" @click="handleOpenPaymentFilter">付款单过滤
|
||||
</el-button>
|
||||
<el-button type="success" icon="el-icon-check" size="small" @click="handleManualWriteOff">手工匹配核销</el-button>
|
||||
</div>
|
||||
|
||||
<!-- 应付单过滤弹窗 -->
|
||||
<el-dialog title="应付单查询条件" :visible.sync="payableFilterVisible" width="500px" append-to-body>
|
||||
<el-form :model="queryParams" ref="payableQueryForm" size="small" label-width="120px">
|
||||
<el-form-item label="制造商名称" prop="vendorName">
|
||||
<el-select v-model="queryParams.vendorName" placeholder="请选择制造商名称" filterable clearable
|
||||
style="width: 100%">
|
||||
<el-option
|
||||
v-for="item in vendorList"
|
||||
:key="item.vendorCode"
|
||||
:label="item.vendorName"
|
||||
:value="item.vendorName"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="采购应付单编号" prop="payableBillCode">
|
||||
<el-input v-model="queryParams.payableBillCode" placeholder="请输入采购应付单编号" clearable
|
||||
@keyup.enter.native="handleQuery"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="应付单生成时间">
|
||||
<el-date-picker
|
||||
v-model="payableDateRange"
|
||||
style="width: 100%"
|
||||
value-format="yyyy-MM-dd HH:mm:ss"
|
||||
type="daterange"
|
||||
range-separator="-"
|
||||
start-placeholder="开始日期"
|
||||
end-placeholder="结束日期"
|
||||
></el-date-picker>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button icon="el-icon-refresh" size="small" @click="resetPayableQuery">重 置</el-button>
|
||||
<el-button type="primary" icon="el-icon-search" size="small" @click="handleQuery">查 询</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
|
||||
<!-- 付款单过滤弹窗 -->
|
||||
<el-dialog title="付款单查询条件" :visible.sync="paymentFilterVisible" width="500px" append-to-body>
|
||||
<el-form :model="queryParams" ref="paymentQueryForm" size="small" label-width="120px">
|
||||
<el-form-item label="制造商名称" prop="vendorName">
|
||||
<el-select v-model="queryParams.vendorName" placeholder="请选择制造商名称" filterable clearable
|
||||
style="width: 100%">
|
||||
<el-option
|
||||
v-for="item in vendorList"
|
||||
:key="item.vendorCode"
|
||||
:label="item.vendorName"
|
||||
:value="item.vendorName"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="采购付款单编号" prop="paymentCode">
|
||||
<el-input v-model="queryParams.paymentCode" placeholder="请输入采购付款单编号" clearable
|
||||
@keyup.enter.native="handleQuery"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="付款单生成时间">
|
||||
<el-date-picker
|
||||
v-model="paymentDateRange"
|
||||
style="width: 100%"
|
||||
value-format="yyyy-MM-dd HH:mm:ss"
|
||||
type="daterange"
|
||||
range-separator="-"
|
||||
start-placeholder="开始日期"
|
||||
end-placeholder="结束日期"
|
||||
></el-date-picker>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button icon="el-icon-refresh" size="small" @click="resetPaymentQuery">重 置</el-button>
|
||||
<el-button type="primary" icon="el-icon-search" size="small" @click="handleQuery">查 询</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
|
||||
<div v-if="showTables">
|
||||
<!-- 采购应付单表格 -->
|
||||
<h3>采购应付单</h3>
|
||||
<div class="table-summary" style="margin-bottom: 10px;">
|
||||
<span style="font-weight: bold; margin-right: 20px;">应付单本次核销总额: <span
|
||||
style="color: #409EFF">{{ totalPayableWriteOffAmount.toFixed(2) }}</span></span>
|
||||
</div>
|
||||
<el-table
|
||||
v-loading="loadingPayable"
|
||||
:data="payableList"
|
||||
border
|
||||
@selection-change="handlePayableSelectionChange"
|
||||
ref="payableTable"
|
||||
row-key="id"
|
||||
>
|
||||
<el-table-column type="selection" width="55" align="center"/>
|
||||
<el-table-column label="本次核销金额(元)" align="center" width="150">
|
||||
<template slot-scope="scope">
|
||||
<el-input
|
||||
v-model="scope.row.currentWriteOffAmount"
|
||||
placeholder="点击选择计划"
|
||||
readonly
|
||||
@click.native="handleOpenPlanSelector(scope.row)"
|
||||
style="cursor: pointer;"
|
||||
>
|
||||
<i slot="suffix" class="el-input__icon el-icon-search"></i>
|
||||
</el-input>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="未核销含税总价(元)" align="center" prop="unpaidPaymentAmount" width="150"/>
|
||||
<el-table-column label="未核销未税总价(元)" align="center" prop="unpaidAmount" width="150">
|
||||
<template slot-scope="scope">
|
||||
{{ calculateExcludingTax(scope.row.unpaidPaymentAmount, scope.row.taxRate) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="未核销税额(元)" align="center" width="150">
|
||||
<template slot-scope="scope">
|
||||
{{ calculateTax(scope.row.unpaidPaymentAmount, scope.row.taxRate) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="核销中含税总价(元)" align="center" prop="paidAmount" width="150">
|
||||
<template slot-scope="scope">
|
||||
{{
|
||||
$calc.sub($calc.sub(scope.row.totalPriceWithTax, scope.row.paidPaymentAmount), scope.row.unpaidPaymentAmount)
|
||||
}}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="已核销含税总价(元)" align="center" prop="paidPaymentAmount" width="150"/>
|
||||
<el-table-column label="已核销未税总价(元)" align="center" width="150">
|
||||
<template slot-scope="scope">
|
||||
{{ calculateExcludingTax(scope.row.paidPaymentAmount, scope.row.taxRate) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="已核销税额(元)" align="center" width="120">
|
||||
<template slot-scope="scope">
|
||||
{{ calculateTax(scope.row.paidPaymentAmount, scope.row.taxRate) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="含税总价(元)" align="center" prop="totalPriceWithTax" width="120"/>
|
||||
<el-table-column label="制造商名称" fixed="right" align="center" prop="vendorName" width="150"
|
||||
show-overflow-tooltip/>
|
||||
<el-table-column label="采购应付单编号" fixed="right" align="center" prop="payableBillCode" width="150"
|
||||
show-overflow-tooltip/>
|
||||
<el-table-column label="应付单生成时间" fixed="right" align="center" prop="createTime" width="160">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ parseTime(scope.row.createTime) }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<pagination
|
||||
v-show="payableTotal>0"
|
||||
:total="payableTotal"
|
||||
:pageSizes="[5,10,20,50]"
|
||||
:page.sync="payableQueryParams.pageNum"
|
||||
:limit.sync="payableQueryParams.pageSize"
|
||||
@pagination="getPayableList"
|
||||
/>
|
||||
|
||||
<!-- 采购付款单表格 -->
|
||||
<h3 style="margin-top: 30px;">采购付款单</h3>
|
||||
<div class="table-summary" style="margin-bottom: 10px;">
|
||||
<span style="font-weight: bold; margin-right: 20px;">付款单本次核销总额: <span
|
||||
:style="{color: isWriteOffAmountValid ? '#67C23A' : '#F56C6C'}">{{
|
||||
totalPaymentWriteOffAmount.toFixed(2)
|
||||
}}</span></span>
|
||||
<span v-if="!isWriteOffAmountValid" style="color: #F56C6C; font-size: 12px;"><i class="el-icon-warning"></i> 总价之和不能大于应付单本次核销总价之和</span>
|
||||
</div>
|
||||
<el-table v-loading="loadingPayment" :data="paymentList" border highlight-current-row
|
||||
@current-change="handlePaymentSelectionChange" row-key="id">
|
||||
<el-table-column width="55" align="center">
|
||||
<template slot-scope="scope">
|
||||
<el-radio v-model="selectedPaymentId" :label="scope.row.paymentBillCode"><i></i></el-radio>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
|
||||
<el-table-column label="本次核销含税总价(元)" align="center" width="150">
|
||||
<template slot-scope="scope">
|
||||
<el-input-number
|
||||
v-model="scope.row.currentWriteOffAmount"
|
||||
:precision="2"
|
||||
:step="100"
|
||||
:min="0"
|
||||
:max="scope.row.unWrittenAmount || scope.row.paymentAmount"
|
||||
size="small"
|
||||
style="width: 100%"
|
||||
:disabled="selectedPaymentId !== scope.row.paymentBillCode"
|
||||
/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="未核销含税总价(元)" align="center" width="150">
|
||||
<template slot-scope="scope">
|
||||
{{ scope.row.preResidueAmount || '0.00' }} <!-- Assuming paymentAmount is total initially -->
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="已核销含税总价(元)" align="center" prop="writeOffAmount" width="150"/>
|
||||
<el-table-column label="已核销未税总价(元)" align="center" width="150" prop="writeOffAmountWithoutTax"/>
|
||||
<el-table-column label="已核销税额(元)" align="center" width="150" prop="writeOffTaxAmount"/>
|
||||
|
||||
<el-table-column label="含税总价(元)" align="center" prop="totalPriceWithTax"/>
|
||||
<el-table-column label="制造商名称" fixed="right" align="center" prop="vendorName" width="150"
|
||||
show-overflow-tooltip/>
|
||||
<el-table-column label="采购付款单号" fixed="right" align="center" prop="paymentBillCode" width="150"
|
||||
show-overflow-tooltip/>
|
||||
<el-table-column label="付款单生成时间" fixed="right" align="center" prop="createTime" width="160">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ parseTime(scope.row.createTime) }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<pagination
|
||||
v-show="paymentTotal>0"
|
||||
:total="paymentTotal"
|
||||
:page.sync="paymentQueryParams.pageNum"
|
||||
:limit.sync="paymentQueryParams.pageSize"
|
||||
@pagination="getPaymentList"
|
||||
:pageSizes="[5,10,20,50]"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<!-- 弹窗:选择应付计划 -->
|
||||
<el-dialog :title="planDialogTitle" :visible.sync="planDialogVisible" width="70%" append-to-body>
|
||||
<payment-plan-selector
|
||||
v-if="planDialogVisible"
|
||||
ref="planSelector"
|
||||
:payable-data="currentPayableRow"
|
||||
:selected-plans="currentPayableRow ? currentPayableRow.selectedPlans : []"
|
||||
:is-init-edit="false"
|
||||
/>
|
||||
<!-- Note: is-init-edit=false makes it read-only for editing plans generally, but we want to SELECT.
|
||||
PaymentPlanSelector logic: 'selection-change' works.
|
||||
If PaymentPlanSelector allows selection only in some mode, we need to check.
|
||||
Looking at PaymentPlan.vue: <el-table ... @selection-change="selectPlan">
|
||||
It seems selection is always enabled.
|
||||
-->
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button @click="planDialogVisible = false">取 消</el-button>
|
||||
<el-button type="primary" @click="handlePlanSelectionConfirm">确 定</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {listPayable} from "@/api/finance/payable";
|
||||
import {listPaymentForWriteOff, manualWriteOff} from "@/api/finance/payment";
|
||||
import {listAllVendors} from "@/api/inventory/info";
|
||||
import PaymentPlanSelector from "../../payable/components/PaymentPlan.vue";
|
||||
|
||||
export default {
|
||||
name: "ManualWriteOff",
|
||||
components: {PaymentPlanSelector},
|
||||
dicts: ['payment_status', 'payment_bill_type'],
|
||||
data() {
|
||||
return {
|
||||
// 弹窗控制
|
||||
payableFilterVisible: false,
|
||||
paymentFilterVisible: false,
|
||||
// 遮罩层
|
||||
loadingPayable: false,
|
||||
loadingPayment: false,
|
||||
// 显示表格
|
||||
showTables: false,
|
||||
// 搜索表单
|
||||
queryParams: {
|
||||
vendorName: undefined,
|
||||
payableBillCode: undefined,
|
||||
paymentCode: undefined,
|
||||
},
|
||||
payableDateRange: [],
|
||||
paymentDateRange: [],
|
||||
vendorList: [], // 供应商列表
|
||||
// 应付单数据
|
||||
payableList: [],
|
||||
payableTotal: 0,
|
||||
payableQueryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 5,
|
||||
vendorName: undefined,
|
||||
payableBillCode: undefined,
|
||||
unpaidPaymentAmount: -1,
|
||||
params: {}
|
||||
},
|
||||
selectedPayables: [], // 选中的应付单
|
||||
// 付款单数据
|
||||
paymentList: [],
|
||||
paymentTotal: 0,
|
||||
paymentQueryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 5,
|
||||
vendorName: undefined,
|
||||
paymentCode: undefined,
|
||||
paymentBillType: 'PRE_PAYMENT', // 默认查询条件
|
||||
paymentStatus: '2',
|
||||
params: {}
|
||||
},
|
||||
selectedPaymentId: null, // 选中的付款单ID (目前使用 BillCode)
|
||||
selectedPaymentRow: null, // 选中的付款单行
|
||||
|
||||
// 弹窗相关
|
||||
planDialogVisible: false,
|
||||
currentPayableRow: null,
|
||||
planDialogTitle: "选择应付计划"
|
||||
};
|
||||
},
|
||||
watch: {
|
||||
totalPayableWriteOffAmount(newVal) {
|
||||
this.updatePaymentWriteOffAmount();
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
totalPayableWriteOffAmount() {
|
||||
return this.selectedPayables.reduce((sum, row) => sum + (row.currentWriteOffAmount || 0), 0);
|
||||
},
|
||||
totalPaymentWriteOffAmount() {
|
||||
if (!this.selectedPaymentRow) return 0;
|
||||
return this.selectedPaymentRow.currentWriteOffAmount || 0;
|
||||
},
|
||||
isWriteOffAmountValid() {
|
||||
// use a small epsilon for float comparison if needed, but direct comparison is usually okay for UI validation
|
||||
return this.totalPaymentWriteOffAmount <= this.totalPayableWriteOffAmount + 0.01;
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.getVendorList();
|
||||
this.payableFilterVisible = true; // 首次进入自动弹出应付过滤
|
||||
},
|
||||
methods: {
|
||||
getVendorList() {
|
||||
listAllVendors().then(response => {
|
||||
// 假设接口返回 { data: [...] } 或直接数组,根据之前 search_file 看到的 controller 是返回 AjaxResult,通常是 .data 或 .rows
|
||||
// Ruoyi 风格通常是 response.data
|
||||
this.vendorList = response.data || [];
|
||||
});
|
||||
},
|
||||
handleOpenPayableFilter() {
|
||||
this.payableFilterVisible = true;
|
||||
},
|
||||
handleOpenPaymentFilter() {
|
||||
this.paymentFilterVisible = true;
|
||||
},
|
||||
/** 搜索按钮操作 */
|
||||
handleQuery() {
|
||||
if (!this.queryParams.vendorName) {
|
||||
this.$modal.msgError("请选择制造商名称");
|
||||
return;
|
||||
}
|
||||
|
||||
this.payableFilterVisible = false;
|
||||
this.paymentFilterVisible = false;
|
||||
this.showTables = true;
|
||||
this.payableQueryParams.pageNum = 1;
|
||||
this.paymentQueryParams.pageNum = 1;
|
||||
|
||||
this.syncParams();
|
||||
|
||||
this.getPayableList();
|
||||
this.getPaymentList();
|
||||
},
|
||||
/** 重置按钮操作 */
|
||||
resetPayableQuery() {
|
||||
this.payableDateRange = [];
|
||||
this.queryParams.vendorName = undefined;
|
||||
this.queryParams.payableBillCode = undefined;
|
||||
},
|
||||
resetPaymentQuery() {
|
||||
this.paymentDateRange = [];
|
||||
this.queryParams.vendorName = undefined;
|
||||
this.queryParams.paymentCode = undefined;
|
||||
},
|
||||
syncParams() {
|
||||
this.payableQueryParams.vendorName = this.queryParams.vendorName;
|
||||
this.payableQueryParams.payableBillCode = this.queryParams.payableBillCode;
|
||||
this.payableQueryParams.params = {};
|
||||
if (null != this.payableDateRange && '' != this.payableDateRange) {
|
||||
this.payableQueryParams.params["beginTime"] = this.payableDateRange[0];
|
||||
this.payableQueryParams.params["endTime"] = this.payableDateRange[1];
|
||||
}
|
||||
|
||||
this.paymentQueryParams.vendorName = this.queryParams.vendorName;
|
||||
this.paymentQueryParams.paymentCode = this.queryParams.paymentCode;
|
||||
this.paymentQueryParams.paymentBillType = 'PRE_PAYMENT'; // 确保每次查询都带上
|
||||
this.paymentQueryParams.params = {};
|
||||
if (null != this.paymentDateRange && '' != this.paymentDateRange) {
|
||||
this.paymentQueryParams.params["beginTime"] = this.paymentDateRange[0];
|
||||
this.paymentQueryParams.params["endTime"] = this.paymentDateRange[1];
|
||||
}
|
||||
},
|
||||
getPayableList() {
|
||||
this.loadingPayable = true;
|
||||
listPayable(this.payableQueryParams).then(response => {
|
||||
this.payableList = response.rows.map(item => ({
|
||||
...item,
|
||||
currentWriteOffAmount: 0, // Initialize
|
||||
selectedPlans: [] // Initialize
|
||||
}));
|
||||
this.payableTotal = response.total;
|
||||
this.loadingPayable = false;
|
||||
// 清空选中
|
||||
this.$refs.payableTable.clearSelection();
|
||||
this.selectedPayables = [];
|
||||
});
|
||||
},
|
||||
getPaymentList() {
|
||||
this.loadingPayment = true;
|
||||
listPaymentForWriteOff(this.paymentQueryParams).then(response => {
|
||||
this.paymentList = response.rows.map(item => ({
|
||||
...item,
|
||||
currentWriteOffAmount: 0, // Initialize
|
||||
// Mocking fields not yet in standard listPayment (or assuming defaults)
|
||||
unWrittenAmount: item.paymentAmount - (item.writtenAmount || 0),
|
||||
writtenAmount: item.writtenAmount || 0
|
||||
}));
|
||||
this.paymentTotal = response.total;
|
||||
this.loadingPayment = false;
|
||||
// 清空选中
|
||||
this.selectedPaymentId = null;
|
||||
this.selectedPaymentRow = null;
|
||||
});
|
||||
},
|
||||
handlePayableSelectionChange(selection) {
|
||||
this.selectedPayables = selection;
|
||||
},
|
||||
handlePaymentSelectionChange(currentRow) {
|
||||
if (currentRow) {
|
||||
this.selectedPaymentId = currentRow.paymentBillCode;
|
||||
this.selectedPaymentRow = currentRow;
|
||||
// 选中时触发同步
|
||||
this.updatePaymentWriteOffAmount();
|
||||
} else {
|
||||
this.selectedPaymentId = null;
|
||||
this.selectedPaymentRow = null;
|
||||
}
|
||||
},
|
||||
|
||||
// Logic for Plan Selection
|
||||
handleOpenPlanSelector(row) {
|
||||
this.currentPayableRow = row;
|
||||
this.planDialogTitle = `选择应付计划 - ${row.payableBillCode}`;
|
||||
this.planDialogVisible = true;
|
||||
},
|
||||
handlePlanSelectionConfirm() {
|
||||
if (this.$refs.planSelector && this.$refs.planSelector.selectedPlan) {
|
||||
const selected = this.$refs.planSelector.selectedPlan;
|
||||
this.currentPayableRow.selectedPlans = selected;
|
||||
// Calculate sum
|
||||
const sum = selected.reduce((acc, plan) => acc + (plan.planAmount || 0), 0);
|
||||
this.currentPayableRow.currentWriteOffAmount = sum;
|
||||
|
||||
this.$modal.msgSuccess(`已选择 ${selected.length} 个计划,总金额 ${sum.toFixed(2)}`);
|
||||
|
||||
// 1. 默认选中该笔应付单
|
||||
if (selected.length > 0) {
|
||||
this.$refs.payableTable.toggleRowSelection(this.currentPayableRow, true);
|
||||
} else {
|
||||
this.$refs.payableTable.toggleRowSelection(this.currentPayableRow, false);
|
||||
}
|
||||
}
|
||||
this.planDialogVisible = false;
|
||||
},
|
||||
|
||||
// Tax Calculations
|
||||
calculateTax(amount, taxRate) {
|
||||
let calculateExcludingTax = this.calculateExcludingTax(amount, taxRate);
|
||||
return this.$calc.sub(amount, calculateExcludingTax)
|
||||
},
|
||||
calculateExcludingTax(amount, taxRate) {
|
||||
if (!amount) return '0.00';
|
||||
// Amount / (1 + Rate/100)
|
||||
const rate = taxRate ?? 0.13;
|
||||
return this.$calc.div(amount, this.$calc.add(1, rate))
|
||||
},
|
||||
|
||||
// 更新付款单核销金额逻辑
|
||||
updatePaymentWriteOffAmount() {
|
||||
if (this.selectedPaymentRow) {
|
||||
const payableSum = this.totalPayableWriteOffAmount;
|
||||
const maxAmount = this.selectedPaymentRow.unWrittenAmount || this.selectedPaymentRow.preResidueAmount || 0; // Use preResidueAmount if unWrittenAmount is not reliable or prefered
|
||||
|
||||
if (payableSum > maxAmount) {
|
||||
// 校验:不能大于未核销含税总价
|
||||
this.selectedPaymentRow.currentWriteOffAmount = maxAmount;
|
||||
this.$modal.msgWarning(`应付单核销总额(${payableSum.toFixed(2)})超过付款单剩余额度(${maxAmount}),已自动调整为最大可核销额度。`);
|
||||
} else {
|
||||
this.selectedPaymentRow.currentWriteOffAmount = payableSum;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// 手工匹配核销
|
||||
handleManualWriteOff() {
|
||||
if (!this.selectedPaymentRow) {
|
||||
this.$modal.msgError("请选择一个付款单");
|
||||
return;
|
||||
}
|
||||
if (this.selectedPayables.length === 0) {
|
||||
this.$modal.msgError("请至少选择一个应付单");
|
||||
return;
|
||||
}
|
||||
|
||||
// 校验:应付单本次核销总额与付款单本次核销总额必须相等
|
||||
// 使用一个较小的 epsilon 值处理浮点数比较
|
||||
if (Math.abs(this.totalPaymentWriteOffAmount - this.totalPayableWriteOffAmount) > 0.01) {
|
||||
this.$modal.msgError(`付款单核销金额(${this.totalPaymentWriteOffAmount.toFixed(2)})必须等于应付单核销总额(${this.totalPayableWriteOffAmount.toFixed(2)})`);
|
||||
return;
|
||||
}
|
||||
|
||||
const detailList = [];
|
||||
this.selectedPayables.forEach(payable => {
|
||||
if (payable.selectedPlans && payable.selectedPlans.length > 0) {
|
||||
payable.selectedPlans.forEach(plan => {
|
||||
const amount = plan.planAmount;
|
||||
detailList.push({
|
||||
paymentPlanId: plan.id,
|
||||
payableBillId: payable.id,
|
||||
paymentBillCode: this.selectedPaymentRow.paymentBillCode,
|
||||
paymentAmount: amount,
|
||||
paymentRate: plan.planRate,
|
||||
paymentAmountWithoutTax: this.calculateExcludingTax(amount, payable.taxRate),
|
||||
paymentAmountTax: this.calculateTax(amount, payable.taxRate)
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
if (detailList.length === 0) {
|
||||
this.$modal.msgError("请为选中的应付单选择计划(点击放大镜图标)");
|
||||
return;
|
||||
}
|
||||
|
||||
let vendorCode = this.selectedPaymentRow.vendorCode;
|
||||
// Fallback for vendorCode if not in row but in list
|
||||
if (!vendorCode && this.selectedPaymentRow.vendorName) {
|
||||
const vendor = this.vendorList.find(v => v.vendorName === this.selectedPaymentRow.vendorName);
|
||||
if (vendor) vendorCode = vendor.vendorCode;
|
||||
}
|
||||
|
||||
const data = {
|
||||
paymentBillId: this.selectedPaymentRow.paymentBillId || this.selectedPaymentRow.id,
|
||||
vendorCode: vendorCode,
|
||||
detailList: detailList
|
||||
};
|
||||
|
||||
manualWriteOff(data).then(response => {
|
||||
this.$modal.msgSuccess("核销成功");
|
||||
this.handleQuery();
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.table-summary {
|
||||
background-color: #f8f8f9;
|
||||
padding: 10px;
|
||||
border-radius: 4px;
|
||||
border: 1px solid #ebeef5;
|
||||
}
|
||||
</style>
|
||||
|
|
@ -1,29 +1,21 @@
|
|||
package com.ruoyi.sip.controller;
|
||||
|
||||
import java.util.List;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import org.apache.shiro.authz.annotation.RequiresPermissions;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.PutMapping;
|
||||
import org.springframework.web.bind.annotation.DeleteMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import com.ruoyi.common.annotation.Log;
|
||||
import com.ruoyi.common.core.controller.BaseController;
|
||||
import com.ruoyi.common.core.domain.AjaxResult;
|
||||
import com.ruoyi.common.core.page.TableDataInfo;
|
||||
import com.ruoyi.common.enums.BusinessType;
|
||||
import com.ruoyi.common.utils.poi.ExcelUtil;
|
||||
import com.ruoyi.sip.domain.OmsPayableWriteOff;
|
||||
import com.ruoyi.sip.dto.WriteOffRequestDto;
|
||||
import com.ruoyi.sip.dto.WriteOffQueryDto;
|
||||
import com.ruoyi.sip.dto.WriteOffDetailResultDto;
|
||||
import com.ruoyi.sip.dto.WriteOffRequestDto;
|
||||
import com.ruoyi.sip.service.IOmsPayableWriteOffService;
|
||||
import com.ruoyi.common.core.page.TableDataInfo;
|
||||
import org.apache.shiro.authz.annotation.RequiresPermissions;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 采购应付核销单Controller
|
||||
|
|
@ -32,7 +24,7 @@ import com.ruoyi.common.core.page.TableDataInfo;
|
|||
* @date 2025-12-16
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/sip/writeOff")
|
||||
@RequestMapping("/finance/writeoff")
|
||||
public class OmsPayableWriteOffController extends BaseController
|
||||
{
|
||||
@Autowired
|
||||
|
|
@ -43,7 +35,7 @@ public class OmsPayableWriteOffController extends BaseController
|
|||
*/
|
||||
@RequiresPermissions("sip:writeOff:list")
|
||||
@GetMapping("/list")
|
||||
public TableDataInfo list(WriteOffQueryDto writeOffQueryDto)
|
||||
public TableDataInfo list(OmsPayableWriteOff writeOffQueryDto)
|
||||
{
|
||||
startPage();
|
||||
List<OmsPayableWriteOff> list = omsPayableWriteOffService.selectOmsPayableWriteOffList(writeOffQueryDto);
|
||||
|
|
@ -56,7 +48,7 @@ public class OmsPayableWriteOffController extends BaseController
|
|||
@RequiresPermissions("sip:writeOff:export")
|
||||
@Log(title = "采购应付核销单", businessType = BusinessType.EXPORT)
|
||||
@PostMapping("/export")
|
||||
public void export(HttpServletResponse response, WriteOffQueryDto writeOffQueryDto)
|
||||
public void export(HttpServletResponse response, OmsPayableWriteOff writeOffQueryDto)
|
||||
{
|
||||
List<OmsPayableWriteOff> list = omsPayableWriteOffService.selectOmsPayableWriteOffList(writeOffQueryDto);
|
||||
ExcelUtil<OmsPayableWriteOff> util = new ExcelUtil<OmsPayableWriteOff>(OmsPayableWriteOff.class);
|
||||
|
|
|
|||
|
|
@ -68,6 +68,14 @@ public class OmsPaymentBillController extends BaseController
|
|||
, OmsPaymentBill::getPaymentBillCode, (a, b) -> a.setApproveNode(b.get(a.getPaymentBillCode())));
|
||||
return getDataTable(list);
|
||||
}
|
||||
@PostMapping("/write-off/list")
|
||||
@ResponseBody
|
||||
public TableDataInfo listWriteOff(OmsPaymentBill omsPaymentBill)
|
||||
{
|
||||
startPage();
|
||||
List<OmsPaymentBill> list = omsPaymentBillService.listWriteOff(omsPaymentBill);
|
||||
return getDataTable(list);
|
||||
}
|
||||
|
||||
|
||||
@RequiresPermissions("finance:payment:approve")
|
||||
|
|
|
|||
|
|
@ -20,9 +20,12 @@ public class OmsPayablePaymentDetail extends BaseEntity {
|
|||
|
||||
private Date paymentTime;
|
||||
private BigDecimal paymentAmount;
|
||||
private BigDecimal paymentAmountWithoutTax;
|
||||
private BigDecimal paymentAmountTax;
|
||||
private BigDecimal paymentRate;
|
||||
private String paymentBillCode;
|
||||
private Long paymentBillId;
|
||||
private Long writeOffId;
|
||||
|
||||
private Date actualPaymentTime;
|
||||
private String paymentStatus;
|
||||
|
|
@ -36,6 +39,7 @@ public class OmsPayablePaymentDetail extends BaseEntity {
|
|||
/** 已确认 */
|
||||
PREPAY_WRITE_OFF("2", "预付核销"),
|
||||
REFUND("3", "退款"),
|
||||
REFUND_WRITE_OFF("4", "反核销"),
|
||||
|
||||
|
||||
;
|
||||
|
|
|
|||
|
|
@ -2,11 +2,14 @@ package com.ruoyi.sip.domain;
|
|||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.ruoyi.common.annotation.Excel;
|
||||
import com.ruoyi.common.core.domain.BaseEntity;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* 采购应付核销单对象 oms_payable_write_off
|
||||
|
|
@ -34,10 +37,12 @@ public class OmsPayableWriteOff extends BaseEntity
|
|||
/** 付款单编号 */
|
||||
@Excel(name = "付款单编号")
|
||||
private String paymentBillCode;
|
||||
private List<String> paymentBillCodeList;
|
||||
|
||||
/** 供应商编码 */
|
||||
@Excel(name = "供应商编码")
|
||||
private String vendorCode;
|
||||
private String vendorName;
|
||||
|
||||
/** 本次核销总金额 */
|
||||
@Excel(name = "本次核销总金额")
|
||||
|
|
@ -62,6 +67,7 @@ public class OmsPayableWriteOff extends BaseEntity
|
|||
|
||||
/** 创建人 */
|
||||
private String createBy;
|
||||
private String createByName;
|
||||
|
||||
/** 创建时间 */
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
|
|
@ -73,4 +79,20 @@ public class OmsPayableWriteOff extends BaseEntity
|
|||
/** 更新时间 */
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date updateTime;
|
||||
|
||||
@Getter
|
||||
public enum WriteOffTypeEnum {
|
||||
|
||||
AUTO("AUTO", "自动核销"),
|
||||
USER("USER", "手动核销"),
|
||||
|
||||
;
|
||||
private final String code;
|
||||
private final String desc;
|
||||
WriteOffTypeEnum(String code, String desc) {
|
||||
this.code = code;
|
||||
this.desc = desc;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -135,6 +135,10 @@ public class OmsPaymentBill extends BaseEntity
|
|||
private String taskId;
|
||||
|
||||
|
||||
private BigDecimal writeOffAmount;
|
||||
private BigDecimal writeOffAmountWithoutTax;
|
||||
private BigDecimal writeOffTaxAmount;
|
||||
|
||||
@Getter
|
||||
public enum PaymentBillTypeEnum {
|
||||
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@ public class WriteOffItemDto
|
|||
* 本次核销税额
|
||||
*/
|
||||
private BigDecimal writeOffTaxAmount;
|
||||
private BigDecimal paymentRate;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
|
|
|
|||
|
|
@ -1,38 +0,0 @@
|
|||
package com.ruoyi.sip.dto;
|
||||
|
||||
import com.ruoyi.common.core.domain.BaseEntity;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 采购应付核销单记录查询DTO
|
||||
*
|
||||
* @author zghz
|
||||
* @date 2025-12-16
|
||||
*/
|
||||
public class WriteOffQueryDto extends BaseEntity
|
||||
{
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/** 核销单号 */
|
||||
private String writeOffCode;
|
||||
|
||||
/** 供货商代码 */
|
||||
private String vendorCode;
|
||||
|
||||
// Getters and Setters
|
||||
public String getWriteOffCode() {
|
||||
return writeOffCode;
|
||||
}
|
||||
|
||||
public void setWriteOffCode(String writeOffCode) {
|
||||
this.writeOffCode = writeOffCode;
|
||||
}
|
||||
|
||||
public String getVendorCode() {
|
||||
return vendorCode;
|
||||
}
|
||||
|
||||
public void setVendorCode(String vendorCode) {
|
||||
this.vendorCode = vendorCode;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
package com.ruoyi.sip.dto;
|
||||
|
||||
import com.ruoyi.sip.domain.OmsPayablePaymentDetail;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
|
@ -24,7 +25,7 @@ public class WriteOffRequestDto
|
|||
/**
|
||||
* 核销项列表
|
||||
*/
|
||||
private List<WriteOffItemDto> writeOffItems;
|
||||
private List<OmsPayablePaymentDetail> detailList;
|
||||
|
||||
/**
|
||||
* 供应商代码
|
||||
|
|
|
|||
|
|
@ -1,85 +0,0 @@
|
|||
package com.ruoyi.sip.mapper;
|
||||
|
||||
import java.util.List;
|
||||
import com.ruoyi.sip.domain.OmsPayableWriteOffDetail;
|
||||
|
||||
/**
|
||||
* 应付单付款计划核销明细Mapper接口
|
||||
*
|
||||
* @author zghz
|
||||
* @date 2025-12-16
|
||||
*/
|
||||
public interface OmsPayableWriteOffDetailMapper
|
||||
{
|
||||
/**
|
||||
* 查询应付单付款计划核销明细
|
||||
*
|
||||
* @param id 应付单付款计划核销明细ID
|
||||
* @return 应付单付款计划核销明细
|
||||
*/
|
||||
public OmsPayableWriteOffDetail selectOmsPayableWriteOffDetailById(Long id);
|
||||
|
||||
/**
|
||||
* 查询应付单付款计划核销明细列表
|
||||
*
|
||||
* @param omsPayableWriteOffDetail 应付单付款计划核销明细
|
||||
* @return 应付单付款计划核销明细集合
|
||||
*/
|
||||
public List<OmsPayableWriteOffDetail> selectOmsPayableWriteOffDetailList(OmsPayableWriteOffDetail omsPayableWriteOffDetail);
|
||||
|
||||
/**
|
||||
* 新增应付单付款计划核销明细
|
||||
*
|
||||
* @param omsPayableWriteOffDetail 应付单付款计划核销明细
|
||||
* @return 结果
|
||||
*/
|
||||
public int insertOmsPayableWriteOffDetail(OmsPayableWriteOffDetail omsPayableWriteOffDetail);
|
||||
|
||||
/**
|
||||
* 修改应付单付款计划核销明细
|
||||
*
|
||||
* @param omsPayableWriteOffDetail 应付单付款计划核销明细
|
||||
* @return 结果
|
||||
*/
|
||||
public int updateOmsPayableWriteOffDetail(OmsPayableWriteOffDetail omsPayableWriteOffDetail);
|
||||
|
||||
/**
|
||||
* 删除应付单付款计划核销明细
|
||||
*
|
||||
* @param id 应付单付款计划核销明细ID
|
||||
* @return 结果
|
||||
*/
|
||||
public int deleteOmsPayableWriteOffDetailById(Long id);
|
||||
|
||||
/**
|
||||
* 批量删除应付单付款计划核销明细
|
||||
*
|
||||
* @param ids 需要删除的数据ID
|
||||
* @return 结果
|
||||
*/
|
||||
public int deleteOmsPayableWriteOffDetailByIds(Long[] ids);
|
||||
|
||||
/**
|
||||
* 根据核销单ID删除应付单付款计划核销明细
|
||||
*
|
||||
* @param writeOffId 核销单ID
|
||||
* @return 结果
|
||||
*/
|
||||
public int deleteOmsPayableWriteOffDetailByWriteOffId(Long writeOffId);
|
||||
|
||||
/**
|
||||
* 批量删除应付单付款计划核销明细
|
||||
*
|
||||
* @param writeOffIds 核销单ID数组
|
||||
* @return 结果
|
||||
*/
|
||||
public int deleteOmsPayableWriteOffDetailByWriteOffIds(Long[] writeOffIds);
|
||||
|
||||
/**
|
||||
* 根据核销单ID查询核销明细
|
||||
*
|
||||
* @param writeOffId 核销单ID
|
||||
* @return 核销明细集合
|
||||
*/
|
||||
public List<OmsPayableWriteOffDetail> selectOmsPayableWriteOffDetailByWriteOffId(Long writeOffId);
|
||||
}
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
package com.ruoyi.sip.service;
|
||||
|
||||
import com.ruoyi.sip.domain.OmsPayablePaymentDetail;
|
||||
import com.ruoyi.sip.domain.OmsPayableWriteOffDetail;
|
||||
import com.ruoyi.sip.domain.dto.PaymentBillPayableDetailDTO;
|
||||
|
||||
import java.util.List;
|
||||
|
|
@ -17,4 +18,8 @@ public interface IOmsPayablePaymentDetailService {
|
|||
List<OmsPayablePaymentDetail> selectByPaymentPlanIds(List<Long> paymentPlanIds);
|
||||
|
||||
List<OmsPayablePaymentDetail> listBypaymentCode(String paymentBillCode);
|
||||
|
||||
void insertBatch(List<OmsPayablePaymentDetail> detailList);
|
||||
|
||||
// List<OmsPayableWriteOffDetail> listWriteOffByPaymentCode(List<String> );
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
package com.ruoyi.sip.service;
|
||||
|
||||
import java.util.List;
|
||||
import com.ruoyi.sip.domain.OmsPayableWriteOff;
|
||||
import com.ruoyi.sip.dto.WriteOffRequestDto;
|
||||
import com.ruoyi.sip.dto.WriteOffQueryDto;
|
||||
import com.ruoyi.sip.dto.WriteOffDetailResultDto;
|
||||
import com.ruoyi.sip.dto.WriteOffRequestDto;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 采购应付核销单Service接口
|
||||
|
|
@ -28,7 +28,7 @@ public interface IOmsPayableWriteOffService
|
|||
* @param writeOffQueryDto 核销查询条件
|
||||
* @return 采购应付核销单集合
|
||||
*/
|
||||
public List<OmsPayableWriteOff> selectOmsPayableWriteOffList(WriteOffQueryDto writeOffQueryDto);
|
||||
public List<OmsPayableWriteOff> selectOmsPayableWriteOffList(OmsPayableWriteOff writeOffQueryDto);
|
||||
|
||||
/**
|
||||
* 新增采购应付核销单
|
||||
|
|
@ -69,4 +69,6 @@ public interface IOmsPayableWriteOffService
|
|||
* @return 核销详情列表
|
||||
*/
|
||||
public List<WriteOffDetailResultDto> selectWriteOffDetailsByWriteOffId(Long writeOffId);
|
||||
|
||||
List<OmsPayableWriteOff> listByPaymentBillCodeList(List<String> collect);
|
||||
}
|
||||
|
|
@ -103,4 +103,6 @@ public interface IOmsPaymentBillService
|
|||
AjaxResult revoke(OmsPaymentBill paymentBill);
|
||||
|
||||
AjaxResult applyRefundApprove(OmsPaymentBill paymentBill);
|
||||
|
||||
List<OmsPaymentBill> listWriteOff(OmsPaymentBill omsPaymentBill);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -112,4 +112,9 @@ public class OmsPayablePaymentDetailServiceImpl implements IOmsPayablePaymentDet
|
|||
omsPayablePaymentDetail.setPaymentBillCode(paymentBillCode);
|
||||
return omsPayablePaymentDetailMapper.list(omsPayablePaymentDetail);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void insertBatch(List<OmsPayablePaymentDetail> detailList) {
|
||||
omsPayablePaymentDetailMapper.insertBatch(detailList);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,27 +1,29 @@
|
|||
package com.ruoyi.sip.service;
|
||||
package com.ruoyi.sip.service.impl;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import com.ruoyi.common.exception.ServiceException;
|
||||
import com.ruoyi.common.utils.DateUtils;
|
||||
import com.ruoyi.common.utils.ShiroUtils;
|
||||
import com.ruoyi.sip.domain.OmsPayablePaymentDetail;
|
||||
import com.ruoyi.sip.domain.OmsPayableWriteOff;
|
||||
import com.ruoyi.sip.domain.OmsPayableWriteOffDetail;
|
||||
import com.ruoyi.sip.domain.OmsPaymentBill;
|
||||
import com.ruoyi.sip.dto.WriteOffDetailResultDto;
|
||||
import com.ruoyi.sip.dto.WriteOffRequestDto;
|
||||
import com.ruoyi.sip.mapper.OmsPayableWriteOffMapper;
|
||||
import com.ruoyi.sip.mapper.OmsPaymentBillMapper;
|
||||
import com.ruoyi.sip.service.IOmsPayableBillService;
|
||||
import com.ruoyi.sip.service.IOmsPayablePaymentDetailService;
|
||||
import com.ruoyi.sip.service.IOmsPayableWriteOffService;
|
||||
import com.ruoyi.sip.utils.WriteOffCodeGenerator;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import com.ruoyi.sip.domain.OmsPayableWriteOff;
|
||||
import com.ruoyi.sip.domain.OmsPayableWriteOffDetail;
|
||||
import com.ruoyi.sip.domain.OmsPayableBill;
|
||||
import com.ruoyi.sip.domain.OmsPaymentBill;
|
||||
import com.ruoyi.sip.domain.OmsPayablePaymentPlan;
|
||||
import com.ruoyi.sip.mapper.OmsPayableWriteOffMapper;
|
||||
import com.ruoyi.sip.mapper.OmsPayableWriteOffDetailMapper;
|
||||
import com.ruoyi.sip.mapper.OmsPayableBillMapper;
|
||||
import com.ruoyi.sip.mapper.OmsPaymentBillMapper;
|
||||
import com.ruoyi.sip.mapper.OmsPayablePaymentPlanMapper;
|
||||
import com.ruoyi.sip.dto.WriteOffRequestDto;
|
||||
import com.ruoyi.sip.dto.WriteOffItemDto;
|
||||
import com.ruoyi.sip.dto.WriteOffQueryDto;
|
||||
import com.ruoyi.sip.dto.WriteOffDetailResultDto;
|
||||
import com.ruoyi.sip.utils.WriteOffCodeGenerator;
|
||||
|
||||
/**
|
||||
* 采购应付核销单Service业务层处理
|
||||
|
|
@ -35,14 +37,14 @@ public class OmsPayableWriteOffServiceImpl implements IOmsPayableWriteOffService
|
|||
@Autowired
|
||||
private OmsPayableWriteOffMapper omsPayableWriteOffMapper;
|
||||
|
||||
@Autowired
|
||||
private OmsPayableWriteOffDetailMapper omsPayableWriteOffDetailMapper;
|
||||
|
||||
@Autowired
|
||||
private OmsPayableBillMapper omsPayableBillMapper;
|
||||
|
||||
@Autowired
|
||||
private OmsPaymentBillMapper omsPaymentBillMapper;
|
||||
@Autowired
|
||||
private IOmsPayablePaymentDetailService omsPayablePaymentDetailService;
|
||||
@Autowired
|
||||
private IOmsPayableBillService payableBillService;
|
||||
|
||||
|
||||
/**
|
||||
|
|
@ -64,12 +66,8 @@ public class OmsPayableWriteOffServiceImpl implements IOmsPayableWriteOffService
|
|||
* @return 采购应付核销单集合
|
||||
*/
|
||||
@Override
|
||||
public List<OmsPayableWriteOff> selectOmsPayableWriteOffList(WriteOffQueryDto writeOffQueryDto)
|
||||
public List<OmsPayableWriteOff> selectOmsPayableWriteOffList(OmsPayableWriteOff omsPayableWriteOff)
|
||||
{
|
||||
OmsPayableWriteOff omsPayableWriteOff = new OmsPayableWriteOff();
|
||||
omsPayableWriteOff.setWriteOffCode(writeOffQueryDto.getWriteOffCode());
|
||||
omsPayableWriteOff.setVendorCode(writeOffQueryDto.getVendorCode());
|
||||
|
||||
return omsPayableWriteOffMapper.selectOmsPayableWriteOffList(omsPayableWriteOff);
|
||||
}
|
||||
|
||||
|
|
@ -83,17 +81,20 @@ public class OmsPayableWriteOffServiceImpl implements IOmsPayableWriteOffService
|
|||
@Transactional
|
||||
public Long insertOmsPayableWriteOff(WriteOffRequestDto writeOffRequestDto)
|
||||
{
|
||||
if (CollUtil.isEmpty(writeOffRequestDto.getDetailList())){
|
||||
throw new ServiceException("请选择核销明细");
|
||||
}
|
||||
// 获取付款单信息
|
||||
OmsPaymentBill paymentBill = omsPaymentBillMapper.selectOmsPaymentBillById(writeOffRequestDto.getPaymentBillId());
|
||||
if (paymentBill == null) {
|
||||
throw new RuntimeException("付款单不存在");
|
||||
throw new ServiceException("付款单不存在");
|
||||
}
|
||||
|
||||
// 创建核销主记录
|
||||
OmsPayableWriteOff writeOff = new OmsPayableWriteOff();
|
||||
writeOff.setWriteOffCode(WriteOffCodeGenerator.generateWriteOffCode());
|
||||
// 默认为用户手动核销
|
||||
writeOff.setWriteOffType("USER");
|
||||
writeOff.setWriteOffType(OmsPayableWriteOff.WriteOffTypeEnum.USER.getCode());
|
||||
writeOff.setPaymentBillCode(paymentBill.getPaymentBillCode());
|
||||
writeOff.setVendorCode(writeOffRequestDto.getVendorCode());
|
||||
writeOff.setWriteOffTime(new Date());
|
||||
|
|
@ -104,51 +105,40 @@ public class OmsPayableWriteOffServiceImpl implements IOmsPayableWriteOffService
|
|||
BigDecimal totalAmountWithoutTax = BigDecimal.ZERO;
|
||||
BigDecimal totalTaxAmount = BigDecimal.ZERO;
|
||||
|
||||
for (WriteOffItemDto item : writeOffRequestDto.getWriteOffItems()) {
|
||||
totalAmount = totalAmount.add(item.getWriteOffAmount());
|
||||
totalAmountWithoutTax = totalAmountWithoutTax.add(item.getWriteOffAmountWithoutTax());
|
||||
totalTaxAmount = totalTaxAmount.add(item.getWriteOffTaxAmount());
|
||||
for (OmsPayablePaymentDetail item : writeOffRequestDto.getDetailList()) {
|
||||
totalAmount = totalAmount.add(item.getPaymentAmount());
|
||||
totalAmountWithoutTax = totalAmountWithoutTax.add(item.getPaymentAmountWithoutTax());
|
||||
totalTaxAmount = totalTaxAmount.add(item.getPaymentAmountTax());
|
||||
}
|
||||
|
||||
writeOff.setWriteOffAmount(totalAmount);
|
||||
writeOff.setWriteOffAmountWithoutTax(totalAmountWithoutTax);
|
||||
writeOff.setWriteOffTaxAmount(totalTaxAmount);
|
||||
|
||||
//预付额度减少
|
||||
OmsPaymentBill updateBill = new OmsPaymentBill();
|
||||
BigDecimal decimal = paymentBill.getPreResidueAmount().subtract(totalAmount);
|
||||
if (decimal.compareTo(BigDecimal.ZERO) < 0) {
|
||||
throw new RuntimeException("核销金额不能大于预付剩余额度");
|
||||
}
|
||||
updateBill.setPreResidueAmount(decimal);
|
||||
updateBill.setId(paymentBill.getId());
|
||||
omsPaymentBillMapper.updateOmsPaymentBill(updateBill);
|
||||
// 设置创建时间
|
||||
writeOff.setCreateTime(new Date());
|
||||
writeOff.setCreateBy(ShiroUtils.getUserId().toString());
|
||||
writeOff.setUpdateTime(new Date());
|
||||
|
||||
// 保存核销主记录
|
||||
omsPayableWriteOffMapper.insertOmsPayableWriteOff(writeOff);
|
||||
|
||||
// 保存核销明细
|
||||
for (WriteOffItemDto item : writeOffRequestDto.getWriteOffItems())
|
||||
{
|
||||
OmsPayableWriteOffDetail detail = new OmsPayableWriteOffDetail();
|
||||
detail.setWriteOffId(writeOff.getId());
|
||||
detail.setPayableBillId(item.getPayableBillId());
|
||||
detail.setPaymentPlanId(item.getPaymentPlanId());
|
||||
detail.setPaymentBillId(item.getPaymentBillId());
|
||||
detail.setWriteOffAmount(item.getWriteOffAmount());
|
||||
detail.setWriteOffAmountWithoutTax(item.getWriteOffAmountWithoutTax());
|
||||
detail.setWriteOffTaxAmount(item.getWriteOffTaxAmount());
|
||||
detail.setRemark(item.getRemark());
|
||||
detail.setCreateTime(new Date());
|
||||
detail.setUpdateTime(new Date());
|
||||
|
||||
// 获取应付单编号
|
||||
OmsPayableBill payableBill = omsPayableBillMapper.selectOmsPayableBillById(item.getPayableBillId());
|
||||
if (payableBill != null) {
|
||||
detail.setPayableBillCode(payableBill.getPayableBillCode());
|
||||
for (OmsPayablePaymentDetail omsPayablePaymentDetail : writeOffRequestDto.getDetailList()) {
|
||||
omsPayablePaymentDetail.setPayableDetailType(OmsPayablePaymentDetail.PayableDetailTypeEnum.PREPAY_WRITE_OFF.getCode());
|
||||
omsPayablePaymentDetail.setPaymentTime(DateUtils.getNowDate());
|
||||
omsPayablePaymentDetail.setCreateBy(ShiroUtils.getUserId().toString());
|
||||
omsPayablePaymentDetail.setWriteOffId(writeOff.getId());
|
||||
}
|
||||
|
||||
// 设置付款单编号
|
||||
detail.setPaymentBillCode(paymentBill.getPaymentBillCode());
|
||||
|
||||
// 保存核销明细记录
|
||||
omsPayableWriteOffDetailMapper.insertOmsPayableWriteOffDetail(detail);
|
||||
}
|
||||
|
||||
omsPayablePaymentDetailService.insertBatch( writeOffRequestDto.getDetailList());
|
||||
payableBillService.updatePaymentAmount(writeOffRequestDto.getDetailList().stream().map(OmsPayablePaymentDetail::getPayableBillId).collect(Collectors.toList()));
|
||||
return writeOff.getId();
|
||||
}
|
||||
|
||||
|
|
@ -174,8 +164,11 @@ public class OmsPayableWriteOffServiceImpl implements IOmsPayableWriteOffService
|
|||
@Transactional
|
||||
public int deleteOmsPayableWriteOffByIds(Long[] ids)
|
||||
{
|
||||
//反核销逻辑 todo
|
||||
|
||||
|
||||
// 先删除明细记录
|
||||
omsPayableWriteOffDetailMapper.deleteOmsPayableWriteOffDetailByWriteOffIds(ids);
|
||||
// omsPayablePaymentDetailService.deleteOmsPayableWriteOffDetailByWriteOffIds(ids);
|
||||
// 再删除主记录
|
||||
return omsPayableWriteOffMapper.deleteOmsPayableWriteOffByIds(ids);
|
||||
}
|
||||
|
|
@ -190,10 +183,8 @@ public class OmsPayableWriteOffServiceImpl implements IOmsPayableWriteOffService
|
|||
@Transactional
|
||||
public int deleteOmsPayableWriteOffById(Long id)
|
||||
{
|
||||
// 先删除明细记录
|
||||
omsPayableWriteOffDetailMapper.deleteOmsPayableWriteOffDetailByWriteOffId(id);
|
||||
// 再删除主记录
|
||||
return omsPayableWriteOffMapper.deleteOmsPayableWriteOffById(id);
|
||||
return deleteOmsPayableWriteOffByIds(new Long[]{id});
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -205,8 +196,16 @@ public class OmsPayableWriteOffServiceImpl implements IOmsPayableWriteOffService
|
|||
@Override
|
||||
public List<WriteOffDetailResultDto> selectWriteOffDetailsByWriteOffId(Long writeOffId)
|
||||
{
|
||||
List<OmsPayableWriteOffDetail> details = omsPayableWriteOffDetailMapper.selectOmsPayableWriteOffDetailByWriteOffId(writeOffId);
|
||||
return details.stream().map(this::convertToWriteOffDetailResultDto).collect(Collectors.toList());
|
||||
// List<OmsPayableWriteOffDetail> details = omsPayableWriteOffDetailMapper.selectOmsPayableWriteOffDetailByWriteOffId(writeOffId);
|
||||
// return details.stream().map(this::convertToWriteOffDetailResultDto).collect(Collectors.toList());
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<OmsPayableWriteOff> listByPaymentBillCodeList(List<String> collect) {
|
||||
OmsPayableWriteOff omsPayableWriteOff = new OmsPayableWriteOff();
|
||||
omsPayableWriteOff.setPaymentBillCodeList(collect);
|
||||
return omsPayableWriteOffMapper.selectOmsPayableWriteOffList(omsPayableWriteOff);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
package com.ruoyi.sip.service.impl;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
|
@ -63,6 +64,8 @@ public class OmsPaymentBillServiceImpl implements IOmsPaymentBillService , TodoC
|
|||
private ProcessConfig processConfig;
|
||||
@Autowired
|
||||
protected ManagementService managementService;
|
||||
@Autowired
|
||||
private IOmsPayableWriteOffService writeOffService;
|
||||
/**
|
||||
* 查询采购付款单
|
||||
*
|
||||
|
|
@ -462,4 +465,34 @@ public class OmsPaymentBillServiceImpl implements IOmsPaymentBillService , TodoC
|
|||
|
||||
return AjaxResult.success("申请退款成功");
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<OmsPaymentBill> listWriteOff(OmsPaymentBill omsPaymentBill) {
|
||||
omsPaymentBill.setPreResidueAmount(new BigDecimal("-1"));
|
||||
List<OmsPaymentBill> omsPaymentBills = omsPaymentBillMapper.selectOmsPaymentBillList(omsPaymentBill);
|
||||
if (CollUtil.isEmpty(omsPaymentBills)) {
|
||||
return omsPaymentBills;
|
||||
}
|
||||
//实时计算已核销金额 查询核销数据
|
||||
List<OmsPayableWriteOff> omsPayableWriteOffs = writeOffService.listByPaymentBillCodeList(omsPaymentBills.stream().map(OmsPaymentBill::getPaymentBillCode).collect(Collectors.toList()));
|
||||
Map<String, List<OmsPayableWriteOff>> writeOffListMap = omsPayableWriteOffs.stream().collect(Collectors.groupingBy(OmsPayableWriteOff::getPaymentBillCode));
|
||||
for (OmsPaymentBill paymentBill : omsPaymentBills) {
|
||||
List<OmsPayableWriteOff> writeOffList = writeOffListMap.get(paymentBill.getPaymentBillCode());
|
||||
BigDecimal writeOffAmount = BigDecimal.ZERO;
|
||||
BigDecimal writeOffAmountWithoutTax = BigDecimal.ZERO;
|
||||
BigDecimal writeOffTaxAmount = BigDecimal.ZERO;
|
||||
if (CollUtil.isNotEmpty(writeOffList)) {
|
||||
for (OmsPayableWriteOff omsPayableWriteOff : writeOffList) {
|
||||
writeOffAmount = writeOffAmount.add(omsPayableWriteOff.getWriteOffAmount());
|
||||
writeOffAmountWithoutTax = writeOffAmountWithoutTax.add(omsPayableWriteOff.getWriteOffAmountWithoutTax());
|
||||
writeOffTaxAmount = writeOffTaxAmount.add(omsPayableWriteOff.getWriteOffTaxAmount());
|
||||
}
|
||||
}
|
||||
paymentBill.setWriteOffAmount(writeOffAmount);
|
||||
paymentBill.setWriteOffAmountWithoutTax(writeOffAmountWithoutTax);
|
||||
paymentBill.setWriteOffTaxAmount(writeOffTaxAmount);
|
||||
}
|
||||
|
||||
return omsPaymentBills;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,128 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE mapper
|
||||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.ruoyi.sip.mapper.OmsPayableWriteOffDetailMapper">
|
||||
|
||||
<resultMap type="com.ruoyi.sip.domain.OmsPayableWriteOffDetail" id="OmsPayableWriteOffDetailResult">
|
||||
<result property="id" column="id" />
|
||||
<result property="writeOffId" column="write_off_id" />
|
||||
<result property="payableBillId" column="payable_bill_id" />
|
||||
<result property="payableBillCode" column="payable_bill_code" />
|
||||
<result property="paymentPlanId" column="payment_plan_id" />
|
||||
<result property="paymentBillId" column="payment_bill_id" />
|
||||
<result property="paymentBillCode" column="payment_bill_code" />
|
||||
<result property="writeOffAmount" column="write_off_amount" />
|
||||
<result property="writeOffAmountWithoutTax" column="write_off_amount_without_tax" />
|
||||
<result property="writeOffTaxAmount" column="write_off_tax_amount" />
|
||||
<result property="remark" column="remark" />
|
||||
<result property="createBy" column="create_by" />
|
||||
<result property="createTime" column="create_time" />
|
||||
<result property="updateBy" column="update_by" />
|
||||
<result property="updateTime" column="update_time" />
|
||||
</resultMap>
|
||||
|
||||
<sql id="selectOmsPayableWriteOffDetailVo">
|
||||
select id, write_off_id, payable_bill_id, payable_bill_code, payment_plan_id, payment_bill_id, payment_bill_code,
|
||||
write_off_amount, write_off_amount_without_tax, write_off_tax_amount,
|
||||
remark, create_by, create_time, update_by, update_time
|
||||
from oms_payable_write_off_detail
|
||||
</sql>
|
||||
|
||||
<select id="selectOmsPayableWriteOffDetailById" parameterType="Long" resultMap="OmsPayableWriteOffDetailResult">
|
||||
<include refid="selectOmsPayableWriteOffDetailVo"/>
|
||||
where id = #{id}
|
||||
</select>
|
||||
|
||||
<select id="selectOmsPayableWriteOffDetailList" parameterType="com.ruoyi.sip.domain.OmsPayableWriteOffDetail" resultMap="OmsPayableWriteOffDetailResult">
|
||||
<include refid="selectOmsPayableWriteOffDetailVo"/>
|
||||
<where>
|
||||
<if test="writeOffId != null"> and write_off_id = #{writeOffId}</if>
|
||||
<if test="payableBillId != null"> and payable_bill_id = #{payableBillId}</if>
|
||||
<if test="paymentPlanId != null"> and payment_plan_id = #{paymentPlanId}</if>
|
||||
<if test="paymentBillId != null"> and payment_bill_id = #{paymentBillId}</if>
|
||||
</where>
|
||||
</select>
|
||||
|
||||
<select id="selectOmsPayableWriteOffDetailByWriteOffId" parameterType="Long" resultMap="OmsPayableWriteOffDetailResult">
|
||||
<include refid="selectOmsPayableWriteOffDetailVo"/>
|
||||
where write_off_id = #{writeOffId}
|
||||
</select>
|
||||
|
||||
<insert id="insertOmsPayableWriteOffDetail" parameterType="com.ruoyi.sip.domain.OmsPayableWriteOffDetail" useGeneratedKeys="true" keyProperty="id">
|
||||
insert into oms_payable_write_off_detail
|
||||
<trim prefix="(" suffix=")" suffixOverrides=",">
|
||||
<if test="writeOffId != null">write_off_id,</if>
|
||||
<if test="payableBillId != null">payable_bill_id,</if>
|
||||
<if test="payableBillCode != null and payableBillCode != ''">payable_bill_code,</if>
|
||||
<if test="paymentPlanId != null">payment_plan_id,</if>
|
||||
<if test="paymentBillId != null">payment_bill_id,</if>
|
||||
<if test="paymentBillCode != null and paymentBillCode != ''">payment_bill_code,</if>
|
||||
<if test="writeOffAmount != null">write_off_amount,</if>
|
||||
<if test="writeOffAmountWithoutTax != null">write_off_amount_without_tax,</if>
|
||||
<if test="writeOffTaxAmount != null">write_off_tax_amount,</if>
|
||||
<if test="remark != null">remark,</if>
|
||||
<if test="createBy != null">create_by,</if>
|
||||
<if test="createTime != null">create_time,</if>
|
||||
<if test="updateBy != null">update_by,</if>
|
||||
<if test="updateTime != null">update_time,</if>
|
||||
</trim>
|
||||
<trim prefix="values (" suffix=")" suffixOverrides=",">
|
||||
<if test="writeOffId != null">#{writeOffId},</if>
|
||||
<if test="payableBillId != null">#{payableBillId},</if>
|
||||
<if test="payableBillCode != null and payableBillCode != ''">#{payableBillCode},</if>
|
||||
<if test="paymentPlanId != null">#{paymentPlanId},</if>
|
||||
<if test="paymentBillId != null">#{paymentBillId},</if>
|
||||
<if test="paymentBillCode != null and paymentBillCode != ''">#{paymentBillCode},</if>
|
||||
<if test="writeOffAmount != null">#{writeOffAmount},</if>
|
||||
<if test="writeOffAmountWithoutTax != null">#{writeOffAmountWithoutTax},</if>
|
||||
<if test="writeOffTaxAmount != null">#{writeOffTaxAmount},</if>
|
||||
<if test="remark != null">#{remark},</if>
|
||||
<if test="createBy != null">#{createBy},</if>
|
||||
<if test="createTime != null">#{createTime},</if>
|
||||
<if test="updateBy != null">#{updateBy},</if>
|
||||
<if test="updateTime != null">#{updateTime},</if>
|
||||
</trim>
|
||||
</insert>
|
||||
|
||||
<update id="updateOmsPayableWriteOffDetail" parameterType="com.ruoyi.sip.domain.OmsPayableWriteOffDetail">
|
||||
update oms_payable_write_off_detail
|
||||
<trim prefix="SET" suffixOverrides=",">
|
||||
<if test="writeOffId != null">write_off_id = #{writeOffId},</if>
|
||||
<if test="payableBillId != null">payable_bill_id = #{payableBillId},</if>
|
||||
<if test="payableBillCode != null and payableBillCode != ''">payable_bill_code = #{payableBillCode},</if>
|
||||
<if test="paymentPlanId != null">payment_plan_id = #{paymentPlanId},</if>
|
||||
<if test="paymentBillId != null">payment_bill_id = #{paymentBillId},</if>
|
||||
<if test="paymentBillCode != null and paymentBillCode != ''">payment_bill_code = #{paymentBillCode},</if>
|
||||
<if test="writeOffAmount != null">write_off_amount = #{writeOffAmount},</if>
|
||||
<if test="writeOffAmountWithoutTax != null">write_off_amount_without_tax = #{writeOffAmountWithoutTax},</if>
|
||||
<if test="writeOffTaxAmount != null">write_off_tax_amount = #{writeOffTaxAmount},</if>
|
||||
<if test="remark != null">remark = #{remark},</if>
|
||||
<if test="updateBy != null">update_by = #{updateBy},</if>
|
||||
<if test="updateTime != null">update_time = #{updateTime},</if>
|
||||
</trim>
|
||||
where id = #{id}
|
||||
</update>
|
||||
|
||||
<delete id="deleteOmsPayableWriteOffDetailById" parameterType="Long">
|
||||
delete from oms_payable_write_off_detail where id = #{id}
|
||||
</delete>
|
||||
|
||||
<delete id="deleteOmsPayableWriteOffDetailByWriteOffId" parameterType="Long">
|
||||
delete from oms_payable_write_off_detail where write_off_id = #{writeOffId}
|
||||
</delete>
|
||||
|
||||
<delete id="deleteOmsPayableWriteOffDetailByWriteOffIds" parameterType="String">
|
||||
delete from oms_payable_write_off_detail where write_off_id in
|
||||
<foreach item="writeOffId" collection="array" open="(" separator="," close=")">
|
||||
#{writeOffId}
|
||||
</foreach>
|
||||
</delete>
|
||||
|
||||
<delete id="deleteOmsPayableWriteOffDetailByIds" parameterType="String">
|
||||
delete from oms_payable_write_off_detail where id in
|
||||
<foreach item="id" collection="array" open="(" separator="," close=")">
|
||||
#{id}
|
||||
</foreach>
|
||||
</delete>
|
||||
</mapper>
|
||||
|
|
@ -22,10 +22,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
</resultMap>
|
||||
|
||||
<sql id="selectOmsPayableWriteOffVo">
|
||||
select id, write_off_code, write_off_type, payment_bill_code, vendor_code,
|
||||
write_off_amount, write_off_amount_without_tax, write_off_tax_amount, write_off_time,
|
||||
remark, create_by, create_time, update_by, update_time
|
||||
from oms_payable_write_off
|
||||
select t1.id, t1.write_off_code, t1.write_off_type, t1.payment_bill_code, t1.vendor_code,
|
||||
t1.write_off_amount, t1.write_off_amount_without_tax, t1.write_off_tax_amount, t1.write_off_time,
|
||||
t1.remark, t1.create_by, t1.create_time, t1.update_by, t1.update_time,
|
||||
t2.vendor_name,t3.user_name as create_by_name
|
||||
from oms_payable_write_off t1
|
||||
left join oms_vendor_info t2 on t1.vendor_code=t2.vendor_code
|
||||
left join sys_user t3 on t1.create_by=t3.user_id
|
||||
</sql>
|
||||
|
||||
<select id="selectOmsPayableWriteOffById" parameterType="Long" resultMap="OmsPayableWriteOffResult">
|
||||
|
|
@ -39,6 +42,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
<if test="writeOffCode != null and writeOffCode != ''"> and write_off_code = #{writeOffCode}</if>
|
||||
<if test="writeOffType != null and writeOffType != ''"> and write_off_type = #{writeOffType}</if>
|
||||
<if test="paymentBillCode != null and paymentBillCode != ''"> and payment_bill_code = #{paymentBillCode}</if>
|
||||
<if test="paymentBillCodeList != null and paymentBillCodeList.size>0"> and payment_bill_code in
|
||||
<foreach index="index" collection="paymentBillCodeList" item="paymentBillCode" separator="," open="(" close=")">
|
||||
#{paymentBillCode}
|
||||
</foreach>
|
||||
</if>
|
||||
<if test="vendorCode != null and vendorCode != ''"> and vendor_code = #{vendorCode}</if>
|
||||
</where>
|
||||
</select>
|
||||
|
|
|
|||
|
|
@ -96,30 +96,57 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
<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="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>
|
||||
<if test="projectName != null and projectName != ''"> and t3.project_name = #{projectName}</if>
|
||||
<if test="orderCode != null and orderCode != ''"> and t1.order_code like concat( #{orderCode},'%') </if>
|
||||
<if test="inventoryCode != null and inventoryCode != ''"> and t1.inventory_code like concat( #{inventoryCode},'%') </if>
|
||||
<if test="productType != null and productType != ''"> and t1.product_type = #{productType}</if>
|
||||
<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="payableBillCode != null and payableBillCode != ''">and t1.payable_bill_code like concat(
|
||||
#{payableBillCode},'%')
|
||||
</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>
|
||||
<if test="projectName != null and projectName != ''">and t3.project_name = #{projectName}</if>
|
||||
<if test="orderCode != null and orderCode != ''">and t1.order_code like concat( #{orderCode},'%')</if>
|
||||
<if test="inventoryCode != null and inventoryCode != ''">and t1.inventory_code like concat(
|
||||
#{inventoryCode},'%')
|
||||
</if>
|
||||
<if test="productType != null and productType != ''">and t1.product_type = #{productType}</if>
|
||||
<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 ">
|
||||
<choose>
|
||||
<when test="unpaidPaymentAmount==-1">
|
||||
and t1.unpaid_payment_amount != 0
|
||||
</when>
|
||||
|
||||
<otherwise>
|
||||
and t1.unpaid_payment_amount = #{unpaidPaymentAmount}
|
||||
</otherwise>
|
||||
</choose>
|
||||
</if>
|
||||
<if test="receivedTicketAmount != null ">and t1.received_ticket_amount = #{receivedTicketAmount}</if>
|
||||
<if test="unreceivedTicketAmount != null ">
|
||||
<choose>
|
||||
<when test="unreceivedTicketAmount==-1">
|
||||
and t1.unreceived_ticket_amount != 0
|
||||
</when>
|
||||
|
||||
<otherwise>
|
||||
and t1.unreceived_ticket_amount = #{unreceivedTicketAmount}
|
||||
</otherwise>
|
||||
</choose>
|
||||
</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">
|
||||
and t1.create_time between date_format(#{createTimeStart}, '%Y-%m-%d 00:00:00') and date_format(#{createTimeEnd}, '%Y-%m-%d 23:59:59')
|
||||
and t1.create_time between date_format(#{createTimeStart}, '%Y-%m-%d 00:00:00') and
|
||||
date_format(#{createTimeEnd}, '%Y-%m-%d 23:59:59')
|
||||
</when>
|
||||
<when test="createTimeStart != null">
|
||||
and t1.create_time <![CDATA[ >= ]]> date_format(#{createTimeStart}, '%Y-%m-%d 00:00:00')
|
||||
|
|
@ -133,13 +160,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
<if test="planPaymentDateStart != null or planPaymentDateEnd != null">
|
||||
<choose>
|
||||
<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')
|
||||
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="planPaymentDateStart != null">
|
||||
and ppp.plan_payment_date <![CDATA[ >= ]]> date_format(#{planPaymentDateStart}, '%Y-%m-%d 00:00:00')
|
||||
and ppp.plan_payment_date <![CDATA[ >= ]]> date_format(#{planPaymentDateStart}, '%Y-%m-%d
|
||||
00:00:00')
|
||||
</when>
|
||||
<when test="planPaymentDateEnd != null">
|
||||
and ppp.plan_payment_date <![CDATA[ <= ]]> date_format(#{planPaymentDateEnd}, '%Y-%m-%d 23:59:59')
|
||||
and ppp.plan_payment_date <![CDATA[ <= ]]> date_format(#{planPaymentDateEnd}, '%Y-%m-%d
|
||||
23:59:59')
|
||||
</when>
|
||||
</choose>
|
||||
</if>
|
||||
|
|
|
|||
|
|
@ -11,6 +11,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
<result property="paymentStatus" column="payment_status" />
|
||||
<result property="paymentTime" column="payment_time" />
|
||||
<result property="paymentAmount" column="payment_amount" />
|
||||
<result property="paymentAmountWithoutTax" column="payment_amount_without_tax" />
|
||||
<result property="paymentAmountTax" column="payment_amount_tax" />
|
||||
<result property="writeOffId" column="write_off_id" />
|
||||
<result property="paymentRate" column="payment_rate" />
|
||||
<result property="paymentBillCode" column="payment_bill_code" />
|
||||
<result property="remark" column="remark" />
|
||||
|
|
@ -25,6 +28,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
<if test="payableBillId != null">payable_bill_id,</if>
|
||||
<if test="paymentTime != null">payment_time,</if>
|
||||
<if test="paymentAmount != null">payment_amount,</if>
|
||||
<if test="paymentAmountWithoutTax != null">payment_amount_without_tax,</if>
|
||||
<if test="paymentAmountTax != null">payment_amount_tax,</if>
|
||||
<if test="writeOffId != null">write_off_id,</if>
|
||||
<if test="paymentRate != null">payment_rate,</if>
|
||||
<if test="paymentBillCode != null and paymentBillCode != ''">payment_bill_code,</if>
|
||||
<if test="payableDetailType != null and payableDetailType != ''">payable_detail_type,</if>
|
||||
|
|
@ -36,6 +42,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
<if test="payableBillId != null">#{payableBillId},</if>
|
||||
<if test="paymentTime != null">#{paymentTime},</if>
|
||||
<if test="paymentAmount != null">#{paymentAmount},</if>
|
||||
<if test="paymentAmountWithoutTax != null">#{paymentAmountWithoutTax},</if>
|
||||
<if test="paymentAmountTax != null">#{paymentAmountTax},</if>
|
||||
<if test="writeOffId != null">#{writeOffId},</if>
|
||||
<if test="paymentRate != null">#{paymentRate},</if>
|
||||
<if test="paymentBillCode != null and paymentBillCode != ''">#{paymentBillCode},</if>
|
||||
<if test="payableDetailType != null and payableDetailType != ''">#{payableDetailType},</if>
|
||||
|
|
@ -46,12 +55,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
</insert>
|
||||
<insert id="insertBatch">
|
||||
insert into oms_payable_payment_detail (
|
||||
payment_plan_id, payable_bill_id, payment_time, payment_amount, payment_rate,
|
||||
payment_bill_code, payable_detail_type, remark, create_by, create_time )
|
||||
payment_plan_id, payable_bill_id, payment_time, payment_amount, payment_amount_without_tax,
|
||||
payment_amount_tax, write_off_id, payment_rate, payment_bill_code, payable_detail_type, remark,
|
||||
create_by, create_time )
|
||||
values
|
||||
<foreach item="item" collection="list" separator="," index="">
|
||||
(#{item.paymentPlanId},#{item.payableBillId},#{item.paymentTime},#{item.paymentAmount},
|
||||
#{item.paymentRate},#{item.paymentBillCode},#{item.payableDetailType},#{item.remark},
|
||||
(#{item.paymentPlanId},#{item.payableBillId},#{item.paymentTime},#{item.paymentAmount},#{item.paymentAmountWithoutTax},
|
||||
#{item.paymentAmountTax},#{item.writeOffId},#{item.paymentRate},#{item.paymentBillCode},#{item.payableDetailType},#{item.remark},
|
||||
#{item.createBy},
|
||||
sysdate())
|
||||
</foreach>
|
||||
|
|
@ -77,12 +87,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
</foreach>
|
||||
</if>
|
||||
</where>
|
||||
order by t1.create_time desc
|
||||
</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.payment_amount, t1.payment_amount_without_tax, t1.payment_amount_tax, t1.write_off_id, 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
|
||||
|
|
|
|||
|
|
@ -111,29 +111,56 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
<select id="selectOmsPaymentBillList" parameterType="OmsPaymentBill" resultMap="OmsPaymentBillResult">
|
||||
<include refid="selectOmsPaymentBillVo"/>
|
||||
<where>
|
||||
<if test="paymentBillCode != null and paymentBillCode != ''"> and pb.payment_bill_code like concat('%', #{paymentBillCode}, '%')</if>
|
||||
<if test="paymentBillType != null and paymentBillType != ''"> and pb.payment_bill_type = #{paymentBillType}</if>
|
||||
<if test="paymentTime != null "> and date_format(pb.payment_time,'%Y-%m-%d') = date_format(#{paymentTime},'%Y-%m-%d')</if>
|
||||
<if test="vendorCode != null and vendorCode != ''"> and pb.vendor_code like concat('%', #{vendorCode}, '%')</if>
|
||||
<if test="orderCode != null and orderCode != ''"> and pb.order_code like concat('%', #{orderCode}, '%')</if>
|
||||
<if test="totalPriceWithTax != null "> and pb.total_price_with_tax = #{totalPriceWithTax}</if>
|
||||
<if test="totalPriceWithoutTax != null "> and pb.total_price_without_tax = #{totalPriceWithoutTax}</if>
|
||||
<if test="taxAmount != null "> and pb.tax_amount = #{taxAmount}</if>
|
||||
<if test="projectCode != null and projectCode != ''"> and pb.project_code like concat('%', #{projectCode}, '%')</if>
|
||||
<if test="projectName != null and projectName != ''"> and pb.project_name like concat('%', #{projectName}, '%')</if>
|
||||
<if test="paymentStatus != null and paymentStatus != ''"> and pb.payment_status = #{paymentStatus}</if>
|
||||
<if test="approveStatus != null and approveStatus != ''"> and pb.approve_status = #{approveStatus}</if>
|
||||
<if test="approveNode != null and approveNode != ''"> and pb.approve_node = #{approveNode}</if>
|
||||
<if test="approveTime != null "> and date_format(pb.approve_time,'%Y-%m-%d') = date_format(#{approveTime},'%Y-%m-%d')</if>
|
||||
<if test="actualPaymentTime != null "> and date_format(pb.actual_payment_time,'%Y-%m-%d') = date_format(#{actualPaymentTime},'%Y-%m-%d')</if>
|
||||
<if test="paymentMethod != null and paymentMethod != ''"> and pb.payment_method = #{paymentMethod}</if>
|
||||
<if test="payableBillCode != null and payableBillCode != ''"> and apb.payable_bill_code like concat('%', #{payableBillCode}, '%')</if>
|
||||
<if test="paymentBillCode != null and paymentBillCode != ''">and pb.payment_bill_code like concat('%',
|
||||
#{paymentBillCode}, '%')
|
||||
</if>
|
||||
<if test="paymentBillType != null and paymentBillType != ''">and pb.payment_bill_type =
|
||||
#{paymentBillType}
|
||||
</if>
|
||||
<if test="paymentTime != null ">and date_format(pb.payment_time,'%Y-%m-%d') =
|
||||
date_format(#{paymentTime},'%Y-%m-%d')
|
||||
</if>
|
||||
<if test="vendorCode != null and vendorCode != ''">and pb.vendor_code like concat('%', #{vendorCode},
|
||||
'%')
|
||||
</if>
|
||||
<if test="orderCode != null and orderCode != ''">and pb.order_code like concat('%', #{orderCode}, '%')</if>
|
||||
<if test="totalPriceWithTax != null ">and pb.total_price_with_tax = #{totalPriceWithTax}</if>
|
||||
<if test="totalPriceWithoutTax != null ">and pb.total_price_without_tax = #{totalPriceWithoutTax}</if>
|
||||
<if test="taxAmount != null ">and pb.tax_amount = #{taxAmount}</if>
|
||||
<if test="projectCode != null and projectCode != ''">and pb.project_code like concat('%', #{projectCode},
|
||||
'%')
|
||||
</if>
|
||||
<if test="projectName != null and projectName != ''">and pb.project_name like concat('%', #{projectName},
|
||||
'%')
|
||||
</if>
|
||||
<if test="paymentStatus != null and paymentStatus != ''">and pb.payment_status = #{paymentStatus}</if>
|
||||
<if test="approveStatus != null and approveStatus != ''">and pb.approve_status = #{approveStatus}</if>
|
||||
<if test="approveNode != null and approveNode != ''">and pb.approve_node = #{approveNode}</if>
|
||||
<if test="approveTime != null ">and date_format(pb.approve_time,'%Y-%m-%d') =
|
||||
date_format(#{approveTime},'%Y-%m-%d')
|
||||
</if>
|
||||
<if test="actualPaymentTime != null ">and date_format(pb.actual_payment_time,'%Y-%m-%d') =
|
||||
date_format(#{actualPaymentTime},'%Y-%m-%d')
|
||||
</if>
|
||||
<if test="paymentMethod != null and paymentMethod != ''">and pb.payment_method = #{paymentMethod}</if>
|
||||
<if test="payableBillCode != null and payableBillCode != ''">and apb.payable_bill_code like concat('%',
|
||||
#{payableBillCode}, '%')
|
||||
</if>
|
||||
<if test="preResidueAmount != null and preResidueAmount != ''">
|
||||
<choose>
|
||||
<when test="preResidueAmount == -1">
|
||||
and pb.pre_residue_amount != 0
|
||||
</when>
|
||||
<when test="preResidueAmount !== -1">
|
||||
and pb.pre_residue_amount = #{preResidueAmount}
|
||||
</when>
|
||||
</choose>
|
||||
</if>
|
||||
|
||||
and pb.del_flag = '0'
|
||||
</where>
|
||||
group by pb.id
|
||||
order by pb.create_time desc
|
||||
</select>
|
||||
|
||||
<select id="selectOmsPaymentBillById" parameterType="Long" resultMap="OmsPaymentBillResult">
|
||||
<include refid="selectOmsPaymentBillVo"/>
|
||||
where pb.id = #{id}
|
||||
|
|
|
|||
Loading…
Reference in New Issue