Files
zszq-trs/YLErpWeb/wwwroot/Scripts/app/client/clientMarginTemplateEdit.js
T
hjhan 3f331f0e83 feat: 客户预付金新增支持客户多选批量绑定,移除广发商贸定制分支
- 新增弹窗客户名称改为 chosen 多选:保存时按选中客户逐条调用原有单条接口
  (后端零改动,每条走完整互斥校验),逐条收集成败后统一汇总提示;
  部分失败时刷新列表、弹窗保留供修正重试(重试已成功客户会被互斥校验拦截,不重复入库)
- 编辑弹窗仍为单条绑定不变
- 删除 isGFSM(广发商贸)定制:客户等级下拉与切换 watchers、Span涨跌幅参数块;
  本部署(国联民生)不涉及,后端接口保持原样
- 左栏加 tpl-base 统一控件宽度,多选搜索框隐藏行为与模板编辑页一致
2026-08-28 09:54:30 +08:00

189 lines
7.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//定价格式化(来自配置)
const inputFormatPercent = Object.freeze({ precision: 2, append: '%' });
const inputFormatPercentNegative = Object.freeze({ precision: 2, append: '%', negative: true });
const inputFormatNegative = Object.freeze({ precision: 2, negative: true });
const vue = new Vue({
el: '#marginTemplateV2Form',
data: {
clientMarginTemplate: page.clientMarginTemplate,
marginTemplates: page.marginTemplates,
marginTemplate: page.marginTemplate,
clientNames: [],
//新增模式的客户多选(编辑模式仍为单条绑定,走 clientMarginTemplate.ClientId
selectedClientIds: [],
isAdd: page.isAdd
},
created: function () {
this.clientMarginTemplate.ValueDate = new moment(this.clientMarginTemplate.ValueDate).format("YYYY-MM-DD");
},
methods: {
changeMarginTemplate() {
this.marginTemplates.forEach(x => {
if (this.clientMarginTemplate.MarginTemplateId === x.id) {
this.marginTemplate = x;
$('#suitableType').prop('title', this.marginTemplate.TradeTypes);
}
});
},
//新增=多选:按选中客户逐条调用原有单条保存接口(后端不变,每条走完整互斥校验);
//编辑=单条,保持原行为。逐条收集成败,结束统一汇总——部分失败时列表刷新已成功部分,弹窗留在
//当前内容上供修正重试(已成功的客户重试会因同天同结构互斥校验失败,不会重复入库)
saveMarginTemplateV2() {
var thisObj = this;
var ids = this.isAdd ? (this.selectedClientIds || []) : [this.clientMarginTemplate.ClientId];
if (!ids.length) {
main.message("请至少选择一个客户");
return;
}
if (!this.clientMarginTemplate.MarginTemplateId) {
main.message("请选择有效的预付金模板");
return;
}
var okCount = 0;
var fails = [];
var chain = Promise.resolve();
ids.forEach(function (clientId) {
chain = chain.then(function () {
//深拷贝:逐条改写 ClientId/id,绝不污染 Vue 表单对象(部分失败时弹窗保持打开)
var payload = _.cloneDeep(thisObj.clientMarginTemplate);
payload.ClientId = clientId;
payload.id = thisObj.isAdd ? 0 : thisObj.clientMarginTemplate.id;
//alertFn 置空:单条失败不逐个弹窗,由循环结束后统一汇总
return main.post("/client_margin_template/saveClientMarginTemplate",
{ clientMarginTemplate: payload },
{ alertFn: function () { }, suppressError: true }
).then(function () {
okCount++;
}, function (resp) {
fails.push({ id: clientId, msg: (resp && (resp.msg || resp.errmsg)) || "保存失败" });
});
});
});
chain.then(function () {
try { window.parent.reloadmargin_template(); } catch (e) { }
if (!fails.length) {
try { (parent || window).layer.closeAll(); } catch (e) { }
return;
}
var nameOf = function (cid) {
var c = thisObj.clientNames.find(function (x) { return String(x.Value) === String(cid); });
return c ? c.Text : cid;
};
var detail = fails.map(function (f) { return nameOf(f.id) + "" + f.msg; }).join("<br>");
main.alert("成功 " + okCount + " 条,失败 " + fails.length + " 条:<br>" + detail);
});
},
showTemplateDetail(detail) {
vueDetail.backupDetail = _.cloneDeep(detail);
detail.ValueDate = new moment(detail.ValueDate).format("YYYY-MM-DD");
vueDetail.detail = detail;
vueDetail.isAdd = false;
vueDetail.ruleType = vue.marginTemplate.RuleType;
$("#myModal").modal("show");
},
SetClientNameDropDown() {
$.ajax({
type: "get",
url: "/client_margin_template/GetAllClients",
success: function (data) {
if (data.obj) {
for (var i = 0; i < data.obj.length; i++) {
vue.clientNames.push(data.obj[i]);
}
}
//选项就位后再初始化/刷新 chosen(多选客户),并同步"有选中即隐藏搜索框"行为
Vue.nextTick(function () {
SetAceDropDown();
$('.chosen-select').trigger('chosen:updated');
$('select.chosen-select[multiple]').each(function () {
refreshChosenSearchField(this);
});
});
},
error: function (msg) {
alert("error:" + msg);
}
});
}
},
mounted() {
this.SetClientNameDropDown();
if (this.marginTemplate.TradeTypes != null && this.marginTemplate.TradeTypes != 'undefined') {
$('#suitableType').prop('title', this.marginTemplate.TradeTypes);
}
},
components: {
'vue-datepicker': FastVue.vueDatePicker(),
'vue-number-input': FastVue.vueNumberInput()
}
});
//多选 chosen:已有选中项后隐藏搜索框(与 marginTemplateV2*Edit.js 同款行为)——
//空框没有输入内容却占一行,放不下时还会换行留白;全部取消后恢复占位提示。
//须为顶层函数:SetClientNameDropDown 的 nextTick 回调也会调用
function refreshChosenSearchField(select) {
var $sel = $(select);
var $container = $sel.next('.chosen-container-multi');
if ($container.length === 0) return;
var noneSelected = $sel.find('option:selected').length === 0;
$container.find('li.search-field').toggle(noneSelected);
}
$(function () {
$(".datepicker").change(function () {
var dateVal = $(this).val();
if (!dateVal) return;
dateVal = dateVal.replace(/\D/g, '').padStart(4, '0');
switch (dateVal.length) {
case 4:
dateVal = new Date().getFullYear() + dateVal; break;
case 6:
dateVal = '20' + dateVal; break;
case 8: break;
default:
dateVal = dateVal.length > 8 ? dateVal.substring(0, 8) : ''; break;
}
if (dateVal) {
dateVal = moment(dateVal).format('YYYY-MM-DD');
!/^\d+/.test(dateVal) && (dateVal = '');
}
$(this).datepicker("setDate", dateVal);
});
//勾选变化走原 select 的 jQuery change 委托(chosen trigger_form_field_change),在此统一刷新搜索框
$(document).on('change chosen:updated', 'select.chosen-select[multiple]', function () {
refreshChosenSearchField(this);
});
SetAceDropDown();
$('select.chosen-select[multiple]').each(function () {
refreshChosenSearchField(this);
});
});
var vueDetail = new Vue({
el: "#myModal",
data: {
detail: {},
backupDetail: {},
isAdd: true,
ruleType: 0,
},
created: function () {
},
methods: {
closeModal: function () {
$('#myModal').modal('hide');
}
},
components: {
'vue-datepicker': FastVue.vueDatePicker(),
'vue-number-input': FastVue.vueNumberInput()
}
});