feat(order): 添加订单付款方式和比例功能

- 在订单添加、编辑和审批页面增加付款方式和比例相关字段
- 实现付款方式选择时自动生成描述和设置比例
- 在数据库中增加付款方式、比例和描述字段
- 优化订单页面布局,增加备注字段显示
dev_1.0.0
chenhao 2025-09-18 10:15:08 +08:00
parent 1d25ea9dd3
commit 6b4fd7e441
5 changed files with 372 additions and 3 deletions

View File

@ -305,6 +305,24 @@
<input name="remark" class="form-control" type="text">
</td>
</tr>
<tr>
<td>付款方式</td>
<td colspan="2">
<select name="paymentMethod" id="paymentMethod" class="form-control" onchange="changePaymentDescription()">
<option value="">请选择</option>
</select>
</td>
<td>付款比例</td>
<td colspan="2">
<input type="number" name="paymentRatio" id="paymentRatio" class="form-control" min="0" max="100" oninput="updateDescriptionText()">
</td>
</tr>
<tr>
<td>描述</td>
<td colspan="5">
<textarea name="paymentDescription" id="paymentDescription" class="form-control" rows="3"></textarea>
</td>
</tr>
</table>
<div class="layui-tab">
@ -517,6 +535,86 @@
})
}
var descriptionTemplates = {
'1-2': '总代预付{ratio}%订单金额作为备货押金后开始备货生产备货完成供货商发起付款通知后总代需1个月内支付尾款完成提货否则备货押金不予退还。',
'2-2': '进货商预付{ratio}%订单金额作为备货押金后开始备货生产备货完成供货商发起付款通知后进货商需3个工作日内付全部剩余款项即可享受订单约定的现金折扣。',
'2-3': '进货商预付{ratio}%订单金额作为备货押金后开始备货生产备货完成供货商发起付款通知后供货商需在1个月内提交剩余款项额度的商业汇票完成提货否则备货押金不予退还。'
};
function updateDescriptionText() {
var paymentMethod = $('#paymentMethod').val();
var ratio = $('#paymentRatio').val();
var descriptionTemplate = descriptionTemplates[paymentMethod];
if (descriptionTemplate) {
$('#paymentDescription').val(descriptionTemplate.replace('{ratio}', ratio));
}
}
function changePaymentDescription() {
var paymentMethod = $('#paymentMethod').val();
var description = '';
var paymentRatio = 0;
var setRatio = false;
var isFullPayment = false;
if (paymentMethod === '1-1') {
description = '备货完成供货商发起付款通知后,总代按照订单金额支付全款。';
paymentRatio = 100;
setRatio = true;
isFullPayment = true;
} else if (paymentMethod === '1-2') {
description = descriptionTemplates['1-2'];
paymentRatio = 30;
setRatio = true;
} else if (paymentMethod === '2-1') {
description = '备货完成供货商发起付款通知后进货商需3个工作日内付订单全部款项即可享受订单约定的现金折扣。';
paymentRatio = 100;
setRatio = true;
isFullPayment = true;
} else if (paymentMethod === '2-2') {
description = descriptionTemplates['2-2'];
paymentRatio = 30;
setRatio = true;
} else if (paymentMethod === '2-3') {
description = descriptionTemplates['2-3'];
paymentRatio = 30;
setRatio = true;
}
$('#paymentDescription').val(description.replace('{ratio}', paymentRatio));
if (setRatio) {
$('#paymentRatio').val(paymentRatio);
} else {
$('#paymentRatio').val('');
}
if (isFullPayment) {
$('#paymentRatio').prop('readonly', true);
} else {
$('#paymentRatio').prop('readonly', false);
}
}
function updatePaymentOptions() {
var orderChannel = $('[name="orderChannel"]').val();
var $paymentMethodSelect = $('#paymentMethod');
$paymentMethodSelect.empty();
$paymentMethodSelect.append('<option value="">请选择</option>');
if (orderChannel == '1') { // 总代
$paymentMethodSelect.append('<option value="1-1">全款支付,无需预付款</option>');
$paymentMethodSelect.append('<option value="1-2">全款支付需单独备货生产预付订单总货款30%</option>');
} else if (orderChannel == '2') { // 直签
$paymentMethodSelect.append('<option value="2-1">全款支付</option>');
$paymentMethodSelect.append('<option value="2-2">全款支付需单独备货生产预付订单总货款30%</option>');
$paymentMethodSelect.append('<option value="2-3">商业汇票支付预付订单总货款30%</option>');
}
// Clear description and ratio when channel changes
$('#paymentDescription').val('');
$('#paymentRatio').val('');
}
$(function () {
initProductList()
initProjcet()
@ -562,6 +660,7 @@
$("input[name='dutyPhone']").val(user.phonenumber)
}
$('[name="orderChannel"]').on('change', updatePaymentOptions);
})
function searchProject() {

View File

@ -363,6 +363,34 @@
<input name="remark" class="form-control" type="text" th:field="*{remark}">
</td>
</tr>
<tr>
<td>付款方式</td>
<td colspan="2">
<select name="paymentMethod" id="paymentMethod" class="form-control" onchange="changePaymentDescription()">
<option value="">请选择</option>
<th:block th:if="${projectOrderInfo.orderChannel == '1'}">
<option value="1-1" th:selected="${projectOrderInfo.paymentMethod == '1-1'}">全款支付,无需预付款</option>
<option value="1-2" th:selected="${projectOrderInfo.paymentMethod == '1-2'}">全款支付需单独备货生产预付订单总货款30%</option>
</th:block>
<th:block th:if="${projectOrderInfo.orderChannel == '2'}">
<option value="2-1" th:selected="${projectOrderInfo.paymentMethod == '2-1'}">全款支付</option>
<option value="2-2" th:selected="${projectOrderInfo.paymentMethod == '2-2'}">全款支付需单独备货生产预付订单总货款30%</option>
<option value="2-3" th:selected="${projectOrderInfo.paymentMethod == '2-3'}">商业汇票支付预付订单总货款30%</option>
</th:block>
</select>
</td>
<td>付款比例</td>
<td colspan="2">
<input type="number" name="paymentRatio" id="paymentRatio" class="form-control" min="0" max="100" th:field="*{paymentRatio}">
</td>
</tr>
<tr>
<tr>
<td>描述</td>
<td colspan="5">
<textarea name="paymentDescription" id="paymentDescription" class="form-control" rows="3" th:field="*{paymentDescription}"></textarea>
</td>
</tr>
</table>
<div th:replace="layout/product-list::configInfoTable()"></div>
</form>
@ -823,7 +851,7 @@
$("input[name='dutyPhone']").val(user.phonenumber)
}
}
$('#approve-detail').find('input,select').each(function () {
$('#approve-detail').find('input,select,textarea').each(function () {
$(this).prop("disabled", true);
})
let headerHtml=$(`
@ -852,6 +880,30 @@
`)
$wrapper.after(footHtmlShow);
// Set payment method from database
var initialPaymentMethod = /*[[${projectOrderInfo.paymentMethod}]]*/ null;
if(initialPaymentMethod) {
$('#paymentMethod').val(initialPaymentMethod);
}
var initialPaymentDescription = /*[[${projectOrderInfo.paymentDescription}]]*/ null;
if (initialPaymentDescription) {
$('#paymentDescription').val(initialPaymentDescription);
} else {
changePaymentDescription(); // Generate description only if it's empty
}
// Set payment ratio from database, which might have been edited
var initialPaymentRatio = /*[[${projectOrderInfo.paymentRatio}]]*/ null;
if(initialPaymentRatio) {
$('#paymentRatio').val(initialPaymentRatio);
}
// After setting initial values, check if the payment method is full payment and set readonly
var paymentMethod = $('#paymentMethod').val();
if (paymentMethod === '1-1' || paymentMethod === '2-1') {
$('#paymentRatio').prop('readonly', true);
}
})
function searchProject() {
@ -1231,6 +1283,64 @@ ${
}
const descriptionTemplates = {
'1-1': '备货完成供货商发起付款通知后,总代按照订单金额支付全款。',
'1-2': '总代预付{ratio}%订单金额作为备货押金后开始备货生产备货完成供货商发起付款通知后总代需1个月内支付尾款完成提货否则备货押金不予退还。',
'2-1': '备货完成供货商发起付款通知后进货商需3个工作日内付订单全部款项即可享受订单约定的现金折扣。',
'2-2': '进货商预付{ratio}%订单金额作为备货押金后开始备货生产备货完成供货商发起付款通知后进货商需3个工作日内付全部剩余款项即可享受订单约定的现金折扣。',
'2-3': '进货商预付{ratio}%订单金额作为备货押金后开始备货生产备货完成供货商发起付款通知后供货商需在1个月内提交剩余款项额度的商业汇票完成提货否则备货押金不予退还。'
};
function changePaymentDescription() {
var paymentMethod = $('#paymentMethod').val();
var description = '';
var paymentRatio = 0;
var setRatio = false;
var isFullPayment = false;
description = descriptionTemplates[paymentMethod];
if (paymentMethod === '1-1') {
paymentRatio = 100;
setRatio = true;
isFullPayment = true;
} else if (paymentMethod === '1-2') {
paymentRatio = 30;
setRatio = true;
} else if (paymentMethod === '2-1') {
paymentRatio = 100;
setRatio = true;
isFullPayment = true;
} else if (paymentMethod === '2-2') {
paymentRatio = 30;
setRatio = true;
} else if (paymentMethod === '2-3') {
paymentRatio = 30;
setRatio = true;
}
if(description){
$('#paymentDescription').val(description.replace('{ratio}', paymentRatio));
}
if (setRatio) {
$('#paymentRatio').val(paymentRatio);
} else {
$('#paymentRatio').val('');
}
if (isFullPayment) {
$('#paymentRatio').prop('readonly', true);
} else {
$('#paymentRatio').prop('readonly', false);
}
}
</script>
</body>

View File

@ -365,6 +365,27 @@
<input name="remark" class="form-control" type="text" th:field="*{remark}">
</td>
</tr>
<tr>
<td>付款方式</td>
<td colspan="2">
<select name="paymentMethod" id="paymentMethod" class="form-control"
onchange="changePaymentDescription()">
<option value="">请选择</option>
</select>
</td>
<td>付款比例</td>
<td colspan="2">
<input type="number" name="paymentRatio" id="paymentRatio" class="form-control" min="0"
max="100" th:field="*{paymentRatio}" oninput="updateDescriptionText()">
</td>
</tr>
<tr>
<td>描述</td>
<td colspan="5">
<textarea name="paymentDescription" id="paymentDescription" class="form-control" rows="3"
th:field="*{paymentDescription}"></textarea>
</td>
</tr>
</table>
<div class="layui-tab">
@ -886,6 +907,33 @@
$(this).prop("disabled", true);
})
}
$('[name="orderChannel"]').on('change', updatePaymentOptions);
updatePaymentOptions();
// Set payment method from database
var initialPaymentMethod = /*[[${projectOrderInfo.paymentMethod}]]*/ null;
if(initialPaymentMethod) {
$('#paymentMethod').val(initialPaymentMethod);
}
var initialPaymentDescription = /*[[${projectOrderInfo.paymentDescription}]]*/ null;
if (initialPaymentDescription) {
$('#paymentDescription').val(initialPaymentDescription);
} else {
changePaymentDescription(); // Generate description only if it's empty
}
// Set payment ratio from database, which might have been edited
var initialPaymentRatio = /*[[${projectOrderInfo.paymentRatio}]]*/ null;
if(initialPaymentRatio) {
$('#paymentRatio').val(initialPaymentRatio);
}
// After setting initial values, check if the payment method is full payment and set readonly
var paymentMethod = $('#paymentMethod').val();
if (paymentMethod === '1-1' || paymentMethod === '2-1') {
$('#paymentRatio').prop('readonly', true);
}
})
function searchProject() {
@ -1254,6 +1302,88 @@
}
}
const descriptionTemplates = {
'1-1': '备货完成供货商发起付款通知后,总代按照订单金额支付全款。',
'1-2': '总代预付{ratio}%订单金额作为备货押金后开始备货生产备货完成供货商发起付款通知后总代需1个月内支付尾款完成提货否则备货押金不予退还。',
'2-1': '备货完成供货商发起付款通知后进货商需3个工作日内付订单全部款项即可享受订单约定的现金折扣。',
'2-2': '进货商预付{ratio}%订单金额作为备货押金后开始备货生产备货完成供货商发起付款通知后进货商需3个工作日内付全部剩余款项即可享受订单约定的现金折扣。',
'2-3': '进货商预付{ratio}%订单金额作为备货押金后开始备货生产备货完成供货商发起付款通知后供货商需在1个月内提交剩余款项额度的商业汇票完成提货否则备货押金不予退还。'
};
function updateDescriptionText() {
var paymentMethod = $('#paymentMethod').val();
var ratio = $('#paymentRatio').val();
var descriptionTemplate = descriptionTemplates[paymentMethod];
if (descriptionTemplate) {
$('#paymentDescription').val(descriptionTemplate.replace('{ratio}', ratio));
}
}
function changePaymentDescription() {
var paymentMethod = $('#paymentMethod').val();
var description = '';
var paymentRatio = 0;
var setRatio = false;
var isFullPayment = false;
description = descriptionTemplates[paymentMethod];
if (paymentMethod === '1-1') {
paymentRatio = 100;
setRatio = true;
isFullPayment = true;
} else if (paymentMethod === '1-2') {
paymentRatio = 30;
setRatio = true;
} else if (paymentMethod === '2-1') {
paymentRatio = 100;
setRatio = true;
isFullPayment = true;
} else if (paymentMethod === '2-2') {
paymentRatio = 30;
setRatio = true;
} else if (paymentMethod === '2-3') {
paymentRatio = 30;
setRatio = true;
}
if(description){
$('#paymentDescription').val(description.replace('{ratio}', paymentRatio));
}
if (setRatio) {
$('#paymentRatio').val(paymentRatio);
} else {
$('#paymentRatio').val('');
}
if (isFullPayment) {
$('#paymentRatio').prop('readonly', true);
} else {
$('#paymentRatio').prop('readonly', false);
}
}
function updatePaymentOptions() {
var orderChannel = $('[name="orderChannel"]').val();
var $paymentMethodSelect = $('#paymentMethod');
var paymentMethod = /*[[${projectOrderInfo.paymentMethod}]]*/ null;
$paymentMethodSelect.empty();
$paymentMethodSelect.append('<option value="">请选择</option>');
if (orderChannel == '1') { // 总代
$paymentMethodSelect.append('<option value="1-1">全款支付,无需预付款</option>');
$paymentMethodSelect.append('<option value="1-2">全款支付需单独备货生产预付订单总货款30%</option>');
} else if (orderChannel == '2') { // 直签
$paymentMethodSelect.append('<option value="2-1">全款支付</option>');
$paymentMethodSelect.append('<option value="2-2">全款支付需单独备货生产预付订单总货款30%</option>');
$paymentMethodSelect.append('<option value="2-3">商业汇票支付预付订单总货款30%</option>');
}
if (paymentMethod) {
$paymentMethodSelect.val(paymentMethod);
}
}
function initSaveDraft() {
if (!canUpdate) {
parent.$('.layui-layer-btn0').css('display', 'none')

View File

@ -248,6 +248,21 @@ public class ProjectOrderInfo extends BaseEntity {
private String supplier;
private String approve;
/**
*
*/
private String paymentMethod;
/**
*
*/
private Integer paymentRatio;
/**
*
*/
private String paymentDescription;
private List<ProjectOrderFileLog> contractFileList;
private List<ProjectOrderFileLog> configFileList;
private Map<String, List<ProjectOrderFileLog>> contractTableData;

View File

@ -34,6 +34,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
<result property="paymentMethod" column="payment_method" />
<result property="paymentRatio" column="payment_ratio" />
<result property="paymentDescription" column="payment_description" />
</resultMap>
<sql id="selectProjectOrderInfoVo">
@ -41,7 +44,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
shipment_amount, actual_purchase_amount, order_end_time, delivery_time, company_delivery, notifier,
notifier_email, notifier_phone, duty, duty_email, duty_phone, order_channel, partner_code, supplier,notifier_address,
remark, order_status, create_by, create_time, update_by, update_time,version_code,process_type,process_template,discount_fold,
delivery_status,sign_status,outer_status,approve_time
delivery_status,sign_status,outer_status,approve_time,payment_method,payment_ratio,payment_description
from project_order_info t1
</sql>
@ -51,7 +54,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
t1.notifier_email, t1.notifier_phone, t1.duty, t1.duty_email, t1.duty_phone, t1.order_channel, t1.partner_code, t1.supplier,
t1.remark, t1.order_status, t1.create_by, t1.create_time, t1.update_by, t1.update_time,t1.partner_user_name,t1.partner_email
,t1.partner_phone,t1.version_code,t1.process_type,t1.process_template,t1.discount_fold,t1.notifier_address,
t1.delivery_status,t1.sign_status,t1.outer_status,t1.approve_time
t1.delivery_status,t1.sign_status,t1.outer_status,t1.approve_time,t1.payment_method,t1.payment_ratio,t1.payment_description
,t2.project_code,t2.project_name,t2.province,t2.customer_name,t2.customer_code,t2.industry_type,t2.bg_property,t2.agent_code,t2.estimated_order_time
,t2.customer_phone,t2.customer_user_name,t2.agent_code,t2.customer_code,t2.partner_name project_partner_name
,t3.partner_name,t3.level,t3.system_user_id
@ -307,6 +310,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="processType != null and processType!=''">process_type,</if>
<if test="processTemplate != null and processTemplate!=''">process_template,</if>
<if test="discountFold != null and discountFold!=''">discount_fold,</if>
<if test="paymentMethod != null and paymentMethod != ''">payment_method,</if>
<if test="paymentRatio != null">payment_ratio,</if>
<if test="paymentDescription != null and paymentDescription != ''">payment_description,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="projectId != null">#{projectId},</if>
@ -345,6 +351,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="processType != null and processType!=''">#{processType},</if>
<if test="processTemplate != null and processTemplate!=''">#{processTemplate},</if>
<if test="discountFold != null and discountFold!=''">#{discountFold},</if>
<if test="paymentMethod != null and paymentMethod != ''">#{paymentMethod},</if>
<if test="paymentRatio != null">#{paymentRatio},</if>
<if test="paymentDescription != null and paymentDescription != ''">#{paymentDescription},</if>
</trim>
</insert>
<insert id="bakData">
@ -477,6 +486,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="updateBy != null">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="approveTime != null">approve_time = #{approveTime},</if>
<if test="paymentMethod != null and paymentMethod != ''">payment_method = #{paymentMethod},</if>
<if test="paymentRatio != null">payment_ratio = #{paymentRatio},</if>
<if test="paymentDescription != null and paymentDescription != ''">payment_description = #{paymentDescription},</if>
</trim>
where id = #{id}
</update>
@ -490,6 +502,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="businessEmail != null">business_email = #{businessEmail},</if>
<if test="businessPhone != null">business_phone = #{businessPhone},</if>
<if test="approveTime != null">approve_time = #{approveTime},</if>
<if test="paymentMethod != null and paymentMethod != ''">payment_method = #{paymentMethod},</if>
<if test="paymentRatio != null">payment_ratio = #{paymentRatio},</if>
<if test="paymentDescription != null and paymentDescription != ''">payment_description = #{paymentDescription},</if>
<if test="versionCode != null">
<choose>