-
触发条件
+
审批条件
diff --git a/YLErpWeb/Views/trade/quotaTrial.cshtml b/YLErpWeb/Views/trade/quotaTrial.cshtml
index 7751409d..b04ecd25 100644
--- a/YLErpWeb/Views/trade/quotaTrial.cshtml
+++ b/YLErpWeb/Views/trade/quotaTrial.cshtml
@@ -101,6 +101,9 @@
case YLErp.Enums.QuotaTrialStatusEnum.Warning:
预警
break;
+ case YLErp.Enums.QuotaTrialStatusEnum.RiskWarning:
+ 风控需审批
+ break;
case YLErp.Enums.QuotaTrialStatusEnum.Error:
不通过
break;
diff --git a/YLErpWeb/wwwroot/Scripts/app/swaptrade/swapTradeView.js b/YLErpWeb/wwwroot/Scripts/app/swaptrade/swapTradeView.js
index f32dc0ea..7b832f3c 100644
--- a/YLErpWeb/wwwroot/Scripts/app/swaptrade/swapTradeView.js
+++ b/YLErpWeb/wwwroot/Scripts/app/swaptrade/swapTradeView.js
@@ -49,18 +49,86 @@ function showSwapRate(timeRate, isMarginLeg) {
$("#swapIntervalModal").modal("show");
}
var layerIndex = -1;
-var confirmFunc = function (id, additionalProcessing) {
+var confirmFunc = function (id, additionalProcessing, ignoreRiskRuleIds, trialDataId) {
var pData = { tradeids: id };
if (!main.isEmpty(additionalProcessing)) {
pData.additionalProcessing = additionalProcessing;
}
+ if (ignoreRiskRuleIds && ignoreRiskRuleIds.length > 0) {
+ pData.ignoreRiskRuleIds = ignoreRiskRuleIds.join(',');
+ }
+ if (trialDataId) {
+ pData.trialDataId = trialDataId;
+ }
main.post("/trade/tradeConfirm", pData).done(function (data) {
if (!data.success) {
main.message(data.msg);
return;
}
+
+ if (data.obj && data.obj.proccessType === "QuotaTrialError") {
+ //限额试算不通过(老风控检查失败),展示详情表格但不允许审批
+ if (data.obj.TrialDataId) {
+ var quotaTrialErrorLayerSetting = {
+ type: 2,
+ title: "提示",
+ shadeClose: false,
+ shade: 0.4,
+ area: ['800px', '500px'],
+ content: "/trade/showQuotaTrial?id=" + data.obj.TrialDataId,
+ yes: function (index) {
+ layer.close(layerIndex);
+ },
+ cancel: function () {
+ if (window.parent && window.parent.reloadtrade) {
+ window.parent.reloadtrade();
+ }
+ layer.close(layerIndex);
+ }
+ };
+ quotaTrialErrorLayerSetting.btn = ["关闭"];
+ layerIndex = layer.open(quotaTrialErrorLayerSetting);
+ }
+ else if (data.obj.message) {
+ main.message(data.obj.message);
+ }
+ return;
+ }
if (data.obj && data.obj.proccessType === "AdditionalProcessing") {
if (data.obj.TrialDataId) {
+ // 交易特批来源,优先使用后端新增的 source 字段区分老风控/新风控,同时兼容旧返回结构。
+ var additionalProcessingSource = data.obj.source || "";
+ // 新风控需审批场景:source=RiskWarning 或 type=RiskWarningConfirm,二次确认时需要继续透传 ignoreRiskRuleIds。
+ var isRiskWarningConfirm = data.obj.type === "RiskWarningConfirm" || additionalProcessingSource === "RiskWarning";
+ // 老风控兼容特批场景:source=OldRiskQuotaTrialError 或 type=LackOfMoney,保持 master 原有“交易特批”按钮逻辑。
+ var isOldRiskSpecialApproval = additionalProcessingSource === "OldRiskQuotaTrialError" || data.obj.type === "LackOfMoney";
+ // 新风控特批走 RiskWarningConfirm,老风控特批继续走 LackOfMoney,兼容当前 confirmFunc 的入参约定。
+ var additionalProcessingType = isRiskWarningConfirm ? "RiskWarningConfirm" : "LackOfMoney";
+ // 新风控需审批时由后端返回本次命中的审批规则 id,前端二次确认时原样透传。
+ var currentIgnoreRiskRuleIds = data.obj.ignoreRiskRuleIds || [];
+ var currentTrialDataId = data.obj.TrialDataId;
+ var saveQuotaTrial = function (obj) {
+ var saveSuccess = true;
+ if (obj.Data.Remark && obj.Data.Remark.length > 0) {
+ main.post("/trade/SaveQuotaTrial", obj.Data, { async: false }).done(function (res) {
+ if (!res || !res.success) {
+ saveSuccess = false;
+ main.message(res.msg);
+ }
+ });
+ }
+ return saveSuccess;
+ };
+ var saveRiskWarningDecisionLog = function (quotaTrialId, decision) {
+ var saveSuccess = true;
+ main.post("/trade/SaveRiskWarningDecisionLog", { quotaTrialId: quotaTrialId, decision: decision }, { async: false }).done(function (res) {
+ if (!res || !res.success) {
+ saveSuccess = false;
+ main.message(res.msg);
+ }
+ });
+ return saveSuccess;
+ };
var layerSetting = {
type: 2,
title: "提示",
@@ -70,19 +138,30 @@ var confirmFunc = function (id, additionalProcessing) {
content: "/trade/showQuotaTrial?id=" + data.obj.TrialDataId,
yes: function (index) {
var obj = window["layui-layer-iframe" + index].page;
- if (obj.Data.Remark && obj.Data.Remark.length > 0) {
- main.post("/trade/SaveQuotaTrial", obj.Data, { async: false }).done(function (res) {
- if (!res || !res.success) {
- main.message(res.msg);
- }
- });
- layer.close(layerIndex);
- confirmFunc(id, "LackOfMoney");
+ if (!obj.Data.Remark || obj.Data.Remark.length <= 0) {
+ main.message("必须填写说明内容,才可以录入交易");
return;
}
- main.message("必须填写说明内容,才可以录入交易");
+ if (!saveQuotaTrial(obj)) {
+ return;
+ }
+ if (isRiskWarningConfirm) {
+ if (!saveRiskWarningDecisionLog(obj.Data.id, "确认通过")) {
+ return;
+ }
+ }
+ if (isOldRiskSpecialApproval) {
+ obj.Data.Remark = (obj.Data.Remark || "").trim();
+ }
+ layer.close(layerIndex);
+ confirmFunc(id, additionalProcessingType, currentIgnoreRiskRuleIds, currentTrialDataId);
},
cancel: function () {
+ var iframeWindow = window["layui-layer-iframe" + this.index];
+ var pageObj = iframeWindow && iframeWindow.page;
+ if (isRiskWarningConfirm && pageObj && pageObj.Data && pageObj.Data.id) {
+ saveRiskWarningDecisionLog(pageObj.Data.id, "取消不通过");
+ }
if (window.parent && window.parent.reloadtrade) {
window.parent.reloadtrade();
}
@@ -92,8 +171,11 @@ var confirmFunc = function (id, additionalProcessing) {
if (data.obj.type === "LackOfMoney") {
layerSetting.btn = [page.buttonStr, '取消'];
}
- // 只展示"资金状况"的情况
- if (data.obj.typecode === "FundStatus") {
+ else if (isRiskWarningConfirm) {
+ layerSetting.btn = ["交易特批", '取消'];
+ }
+ // 只展示“资金状况”的情况
+ else if (data.obj.typecode === "FundStatus") {
layerSetting.btn = ["确认", '取消'];
}
@@ -106,6 +188,38 @@ var confirmFunc = function (id, additionalProcessing) {
}
return;
}
+ if (data.msg && data.msg !== "操作完成") {
+ //新风控 ShowTip 提示:交易已确认成功,但触发提示规则,弹窗展示试算详情
+ if (data.obj && data.obj.TrialDataId) {
+ var showTipLayerSetting = {
+ type: 2,
+ title: "提示",
+ shadeClose: false,
+ shade: 0.4,
+ area: ['800px', '500px'],
+ content: "/trade/showQuotaTrial?id=" + data.obj.TrialDataId,
+ yes: function (index) {
+ layer.close(layerIndex);
+ closetradeWindow();
+ },
+ cancel: function () {
+ if (window.parent && window.parent.reloadtrade) {
+ window.parent.reloadtrade();
+ }
+ layer.close(layerIndex);
+ closetradeWindow();
+ }
+ };
+ showTipLayerSetting.btn = ["关闭"];
+ layerIndex = layer.open(showTipLayerSetting);
+ }
+ else {
+ main.alert(data.msg, function () {
+ closetradeWindow();
+ });
+ }
+ return;
+ }
if (window.parent && window.parent.reloadtrade) {
window.parent.reloadtrade();
}
@@ -115,6 +229,8 @@ var confirmFunc = function (id, additionalProcessing) {
}
}
closetradeWindow();
+ }).fail(function (err) {
+ console.log("[swapTradeView.tradeConfirm] fail, err=", err);
});
};
function confirmTrade(id) {
@@ -197,7 +313,7 @@ function unWindSwap(id) {
main.open(title,
srcurl,
{
- area: ["90%", "800px"],
+ area: ["90%", "780px"],
end: function () {
if (window.parent && window.parent.reloadtrade) {
window.parent.reloadtrade();
diff --git a/YLErpWeb/wwwroot/Scripts/app/system/Approvalprocess.js b/YLErpWeb/wwwroot/Scripts/app/system/Approvalprocess.js
index b86af4fd..73ef253b 100644
--- a/YLErpWeb/wwwroot/Scripts/app/system/Approvalprocess.js
+++ b/YLErpWeb/wwwroot/Scripts/app/system/Approvalprocess.js
@@ -15,6 +15,12 @@ function initSelectize(selector, options) {
}
function setRuleDiv() {
+ // 先销毁已有的 selectize 实例,避免在隐藏容器(v-show)里初始化后尺寸错位
+ $("[name='selectRule']").each(function () {
+ if (this.selectize) {
+ this.selectize.destroy();
+ }
+ });
initSelectize("[name='selectRule']", {
options: getRules(),
valueField: 'Value',
@@ -42,7 +48,7 @@ var app = new Vue({
{ text: '--请选择--', value: '0' },
{ text: '客户开户', value: '1' },
{ text: '客户信息修改', value: '5' },
- { text: '交易', value: '2' },
+ { text: '交易新增和修改', value: '2' },
{ text: '交易了结', value: '6' },
/* { text: '资信与授信', value: '3' },*/
{ text: '出金', value: '4' }
@@ -79,11 +85,11 @@ var app = new Vue({
],
conditionOps: [
{ value: 'gt', text: '>' },
- { value: 'lt', text: '<' },
+ //{ value: 'lt', text: '<' },
{ value: 'gte', text: '>=' },
- { value: 'lte', text: '<=' },
- { value: 'eq', text: '=' },
- { value: 'neq', text: '≠' }
+ //{ value: 'lte', text: '<=' },
+ //{ value: 'eq', text: '=' },
+ //{ value: 'neq', text: '≠' }
],
conditionLogics: [
{ value: 'AND', text: '满足全部条件时触发' },
@@ -1456,6 +1462,7 @@ var app = new Vue({
handler(val, oldVal) {
this.$nextTick(function () {
setRuleDiv();
+ this.initRuleType();
})
},
},
@@ -1464,6 +1471,7 @@ var app = new Vue({
handler(val, oldVal) {
this.$nextTick(function () {
setRuleDiv();
+ this.initRuleType();
})
},
}
diff --git a/YLErpWeb/wwwroot/Scripts/app/trade/tradeview.js b/YLErpWeb/wwwroot/Scripts/app/trade/tradeview.js
index 85b56acb..67ad44db 100644
--- a/YLErpWeb/wwwroot/Scripts/app/trade/tradeview.js
+++ b/YLErpWeb/wwwroot/Scripts/app/trade/tradeview.js
@@ -128,7 +128,7 @@ var confirmFunc = function (id, additionalProcessing) {
if (data.obj.type === "LackOfMoney") {
layerSetting.btn = [page.buttonStr, '取消'];
}
- // 只展示"资金状况"的情况
+ // 只展示“资金状况”的情况
if (data.obj.typecode === "FundStatus") {
layerSetting.btn = ["确认", '取消'];
}
diff --git a/YLErpWeb/wwwroot/Statics/libs/selectize/css/accountOpeningProcess.css b/YLErpWeb/wwwroot/Statics/libs/selectize/css/accountOpeningProcess.css
index 30516b45..f7bd261e 100644
--- a/YLErpWeb/wwwroot/Statics/libs/selectize/css/accountOpeningProcess.css
+++ b/YLErpWeb/wwwroot/Statics/libs/selectize/css/accountOpeningProcess.css
@@ -569,6 +569,20 @@ html {
opacity: 1;
}
+/* 修复审批规则 selectize 标签初始加载时下沉、不居中问题 */
+/* 关键:bundle.min.css 里设置了 .selectize-input.items.not-full.has-options { height:28px },
+ 固定高度导致标签在 baseline 对齐下下沉。这里把高度改回 auto,并强制标签垂直居中。 */
+.selectize-control.multi .selectize-input.items.not-full.has-options,
+.selectize-control.multi .selectize-input.items.not-full.has-options.has-items {
+ height: auto;
+ min-height: 20px;
+}
+
+.selectize-control.multi .selectize-input > div[data-value],
+.selectize-control.multi .selectize-input > div.item {
+ vertical-align: middle !important;
+}
+
/* 需求③:多分支连线。多个 .col-box 时,中间列(非首非尾)的右覆盖线宽度置 0,避免连线断裂 */
.col-box:not(:first-child):not(:last-child) .top-right-cover-line {
width: 0;