- 新增弹窗客户名称改为 chosen 多选:保存时按选中客户逐条调用原有单条接口 (后端零改动,每条走完整互斥校验),逐条收集成败后统一汇总提示; 部分失败时刷新列表、弹窗保留供修正重试(重试已成功客户会被互斥校验拦截,不重复入库) - 编辑弹窗仍为单条绑定不变 - 删除 isGFSM(广发商贸)定制:客户等级下拉与切换 watchers、Span涨跌幅参数块; 本部署(国联民生)不涉及,后端接口保持原样 - 左栏加 tpl-base 统一控件宽度,多选搜索框隐藏行为与模板编辑页一致
189 lines
7.7 KiB
JavaScript
189 lines
7.7 KiB
JavaScript
//定价格式化(来自配置)
|
||
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()
|
||
}
|
||
}); |