systemConfigurationModule.directive('modelConfiguration', ['$log', function ($log) { 'use strict'; $log.debug('modelConfiguration.ctor()...'); return { restrict: 'E', templateUrl: '/app/admin/systemConfiguration/modelConfiguration/model-configuration.html' + '?_=' + Math.random(), replace: true, scope: { organizationName: '@', organizationId: '@', selectedModelCode: '@' }, controller: 'ModelConfigurationController', link: function (scope, element) { $(".multi-org-container").on("click", function (e) { e.stopPropagation(); }); var ClearSelectedTreeNode = function () { ClearSelectedTreeNodeRecursion(scope.OrgMultiData); scope.selectedCopyOrgIDList = []; scope.checkedSet = {}; }; //递归清除选中的节点 var ClearSelectedTreeNodeRecursion = function (tree) { tree.forEach(function (o) { o.selected = false; if (o.children) { ClearSelectedTreeNodeRecursion(o.children); } }); }; //显示复制对应关系下的组织机构多选列表 scope.displayMultiOrg = function () { ClearSelectedTreeNode(); if ($('.multi-org-container').is(":hidden")) { $(".multi-org-container").show(); } else { $(".multi-org-container").hide(); } $(document).one("click", function () { $(".multi-org-container").hide(); }); event.stopPropagation(); }; scope.closeMultiOrg = function () { $(".multi-org-container").hide(); }; //企业科目列表和标准科目列表切换 scope.SwitchAccount = function () { $('.subject-corresponding-container').toggle(); $('.std-subject-container').toggle(); }; $(".filter-select").on("click", function (e) { e.stopPropagation(); }); scope.showFilter = function () { if ($('.filter-select').is(":hidden")) { $(".filter-select").show(); } else { $(".filter-select").hide(); } $(document).one("click", function () { $(".filter-select").hide(); }); event.stopPropagation(); }; } }; } ]); systemConfigurationModule.directive('modelConfigurationBasicInfo', [ '$log', 'modelConfigurationService', function ($log, modelConfigurationService) { 'use strict'; return { restrict: "A", templateUrl: "model-config-manage-basic-info.html", replace: false, scope: { basicModel: "=", editStatus: "=", serviceList: "=", showType: "=", validationGroupName: "=" }, link: function ($scope, element) { $scope.serviceTypeOptions = { displayExpr: "name", valueExpr: "id", showSelectionControls: true, searchEnabled: true, noDataText: "当前无服务可选", bindingOptions: { dataSource: "serviceList", value: "basicModel.serviceTypeID" }, placeholder: "请选择适用服务", selectAllText: "全选" }; $scope.serviceTypeValidationRules = { validationRules: [ { type: "required", message: "请选择适用服务" } ], validationGroup: $scope.validationGroupName }; $scope.modelDescriptionOptions = { maxLength: 500, bindingOptions: { value: "basicModel.description" } }; $scope.modelNameOptions = { onFocusOut: function (e) { e.component.element().dxValidator("instance").validate(); }, bindingOptions: { value: "basicModel.name" } }; //直接使用父 scope 中对模型名称验证的配置 $scope.modelNameValidationRules = angular.copy($scope.$parent.modelNameValidationRules); var customIndex = _.findIndex($scope.modelNameValidationRules.validationRules, function (item) { return item.type === "custom" }); $scope.modelNameValidationRules.validationRules[customIndex].validationCallback = function (params) { var modelName = $scope.basicModel.name; var modelId = $scope.basicModel.id; var organizationId = $scope.basicModel.organizationID; var flag = $scope.editStatus == 3; $scope.$parent.remoteValidateModelName(params, modelName, modelId, organizationId, flag); return true; }; $scope.modelNameValidationRules.validationGroup = $scope.validationGroupName; } }; } ]); systemConfigurationModule.directive('modelConfigurationDetailInfo', [ '$log', '$translate', '$uibModal', 'KeyValueConfigService', '$timeout', '$compile', 'SweetAlert', "dxDataGridService", function ($log, $translate, $uibModal, KeyValueConfigService, $timeout, $compile, SweetAlert, dxDataGridService) { 'use strict'; return { restrict: "A", templateUrl: "model-config-manage-detail-info.html", replace: false, scope: { detailModel: "=", editStatus: "=", showType: "=", basicModel: "=", validationGroupName: "=", keyValueDataSource: "=", standardAccountList: "=" }, link: function ($scope, element) { $scope.element = element; $scope.featureItems = [ { id: 1, name: "指标分析" }, { id: 2, name: "分录比对" } ]; $scope.showTypeEnus = [ { ID: 1, Name: "金额" }, { ID: 2, Name: "百分比" }, { ID: 3, Name: "异常判断" }]; $scope.conditionType = [ { ID: 1, Name: "主条件" }, { ID: 2, Name: "并列条件" }, { ID: 3, Name: "不包含条件" }, { ID: 4, Name: "分录条件" }]; $scope.acctJudgeType = [ { ID: 1, Name: "N/A" }, { ID: 2, Name: "=" }, { ID: 3, Name: "<>" }]; $scope.acctDirectionType = [ { ID: 0, Name: "借/贷" }, { ID: 1, Name: "借" }, { ID: -1, Name: "贷" }]; $scope.entriesComparisonType = [ { ID: 1, Name: "<" }, { ID: 2, Name: ">" }, { ID: 3, Name: ">=" }, { ID: 4, Name: "<=" }, { ID: 5, Name: "<>" }, { ID: 6, Name: "=" }]; $scope.selectedFeature = $scope.featureItems[0]; $scope.formulaBtnType = 4; //用于记录当前被设为"主要值"数据行的 sequence $scope.isMainValueSequence = -1; $scope.isMainValueSequenceRadioName = "isMainValueSequenceRadio_" + (new Date).getTime(); $scope.$watch("isMainValueSequence", function (newValue, oldValue) { var dataList = $scope.detailModel.dataList; _.each(dataList, function (x) { if (!x.hasOwnProperty("isMainValue")) return; x.isMainValueShow = x.sequence == newValue; x.isMainValue = x.isMainValueShow ? 1 : 0; }); }); var dataListChanged = function () { if ($scope.detailModel.dataList.length < 1 || !$scope.detailModel.dataList[0].hasOwnProperty("isMainValue")) { $scope.isMainValueSequence = -1; } if ($scope.detailModel.dataList.length > 0 && $scope.detailModel.dataList[0].hasOwnProperty("isMainValue")) { var firstIndex = _.findIndex($scope.detailModel.dataList, function (x) { return x.isMainValueShow; }); //当没有设定"主要值"时(firstIndex === -1),设置第一项为默认"主要值" firstIndex = firstIndex < 0 ? 0 : firstIndex; $scope.isMainValueSequence = $scope.detailModel.dataList[firstIndex].sequence; $scope.detailModel.dataList[firstIndex].isMainValueShow = true; $scope.detailModel.dataList[firstIndex].isMainValue = 1; //当存在多个默认值时,除了第一个"主要值"之外其余全部将 isMainValueShow 设为 false var count = _.countBy($scope.detailModel.dataList, function (x) { return x.isMainValueShow; })["true"]; if (count !== (void 0) && count > 1) { for (var i = firstIndex + 1; i < $scope.detailModel.dataList.length; i++) { if ($scope.detailModel.dataList[i] === (void 0)) continue; $scope.detailModel.dataList[i].isMainValueShow = false; $scope.detailModel.dataList[i].isMainValue = 0; } } } }; $scope.$watch("detailModel.dataList", function (newValue, oldValue) { dataListChanged(); }, false); var getDataGrid = function () { var dataGrid = $scope.element.find('[dx-data-grid]').dxDataGrid('instance'); return dataGrid; }; var saveDataInRowOptions = function (rowOptions, dataField, value) { rowOptions.data[dataField] = value; if (rowOptions.hasOwnProperty("oldData")) { rowOptions.oldData[dataField] = value; } }; //生成随机字符串 var randomWord = function (allNumber, stringLength) { var str = ""; var arr = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]; var arrNum = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; for (var i = 0; i < stringLength; i++) { if (allNumber) { var pos = Math.round(Math.random() * (arrNum.length - 1)); str += arrNum[pos]; } else { var pos = Math.round(Math.random() * (arr.length - 1)); str += arr[pos]; } } return str; }; //true 验证通过,false 不通过 var validateBeforeAddRow = function (dataGrid) { if (dataGrid.hasEditData()) { dataGrid.saveEditData(); } var dataGridValidateRst = $scope.$parent.validateDataGrid(dataGrid); if (!dataGridValidateRst.isValid) { if (dataGridValidateRst.message) { SweetAlert.warning(dataGridValidateRst.message); } else { SweetAlert.warning("模型明细存在不符合要求的数据,请修改正确后再添加数据!"); } return false; } if ($scope.detailModel.dataList.length >= 100) { SweetAlert.warning("添加失败,最多添加100行数据!"); return false; } return true; }; $scope.dataGridAddRow = function () { var dataGrid = getDataGrid(); if (!validateBeforeAddRow(dataGrid)) return; if ($scope.detailModel.featureId === 1) { var indexAnalysisDto = { id: '', modelID: '', indexName: '', indexFormula: '', formulaNamae: "", formulaDescribe: "", sequence: '', displayType: '', isVisible: '', isMainValue: '', isYearValue: '', createTime: '', updateTime: '', isVisibleShow: '', isMainValueShow: '', isYearValueShow: '' }; indexAnalysisDto.sequence = $scope.detailModel.dataList.length + 1; indexAnalysisDto.isVisibleShow = true; indexAnalysisDto.isMainValueShow = $scope.detailModel.dataList.length < 1; indexAnalysisDto.isYearValueShow = true; $scope.detailModel.dataList.push(indexAnalysisDto); } if ($scope.detailModel.featureId === 2) { var entriesCheckDto = { id: '', modelID: '', GuideLine: '', acctJudge: '', standardCode: '', stdCodeAndName: '', acctDirection: '', entriesComparison: '', thresholdValue: '', summary: '', isRelevantAmt: null, createTime: '', updateTime: '', indexShow: '', isRelevantAmtShow: '', summaryShow: '' }; entriesCheckDto.indexShow = $scope.detailModel.dataList.length + 1; entriesCheckDto.isRelevantAmtShow = false; entriesCheckDto.thresholdValue = 0; $scope.detailModel.dataList.push(entriesCheckDto); } dataListChanged(); }; $scope.dataGridDeleteRow = function () { var dataGrid = getDataGrid(); var selectedRows = dataGrid.getSelectedRowKeys(); if (selectedRows.length == 1) { var index = -1; if ($scope.detailModel.featureId == 1) { index = selectedRows[0].sequence; } if ($scope.detailModel.featureId == 2) { index = selectedRows[0].indexShow; } $scope.detailModel.dataList.splice(index - 1, 1); var i = 1; $scope.detailModel.dataList.forEach(function (row) { if ($scope.detailModel.featureId == 1) { row.sequence = i; } if ($scope.detailModel.featureId == 2) { row.indexShow = i; } i++; }); dataListChanged(); } }; $scope.dataGridRowUp = function () { var dataGrid = getDataGrid(); var selectedRows = dataGrid.getSelectedRowKeys(); if (selectedRows.length == 1) { var index = selectedRows[0].sequence; if (index > 1) { $scope.detailModel.dataList[index - 1].sequence = index - 1; $scope.detailModel.dataList[index - 2].sequence = index; $scope.detailModel.dataList.sort(function (a, b) { return a.sequence - b.sequence; }); } } }; $scope.dataGridRowDown = function () { var dataGrid = getDataGrid(); var selectedRows = dataGrid.getSelectedRowKeys(); if (selectedRows.length == 1) { var index = selectedRows[0].sequence; if (index < $scope.detailModel.dataList.length) { $scope.detailModel.dataList[index - 1].sequence = index + 1; $scope.detailModel.dataList[index].sequence = index; $scope.detailModel.dataList.sort(function (a, b) { return a.sequence - b.sequence; }); } } }; $scope.dataGridRowCopy = function () { var dataGrid = getDataGrid(); if (!validateBeforeAddRow(dataGrid)) return; var selectedRows = dataGrid.getSelectedRowKeys(); if (selectedRows.length == 1) { var copyMto = angular.copy(selectedRows[0]); copyMto.id = randomWord(false, 10); copyMto.indexShow = $scope.detailModel.dataList.length + 1; if (copyMto.hasOwnProperty('isMainValueShow')) { copyMto.isMainValueShow = $scope.detailModel.dataList.length < 1; } $scope.detailModel.dataList.push(copyMto); } dataListChanged(); }; $scope.indexAnalysisGridColumns = [ { dataField: "sequence", caption: "计算顺序", width: 70, allowEditing: false, alignment: "center", sortIndex: 0, sortOrder: 'asc' }, { dataField: "indexName", caption: "指标名称", allowEditing: true, width: "40%", editorOptions: { placeholder: "请输入指标名称..." }, validationRules: [ { type: 'required', message: '请输入指标名称' }, { type: 'stringLength', max: 50, message: '请输入不超过 50 字的指标名称' }, { type: 'custom', message: '请保证指标名称的唯一性', validationCallback: function (params) { var count = _.countBy($scope.detailModel.dataList, function (item) { return (item.indexName || "").trim() === (params.value || "").trim(); })["true"]; return count === (void 0) || count <= 1; } } ] }, { dataField: "indexFormula", caption: "指标公式", allowEditing: true, width: "60%", editorOptions: { placeholder: "请编辑指标公式...", onValueChanged: function (e) { var rowOptions = $(e.element).parents("tr:first").data().options; saveDataInRowOptions(rowOptions, "indexFormula", e.value); saveDataInRowOptions(rowOptions, "formulaNamae", e.value); saveDataInRowOptions(rowOptions, "formulaDescribe", e.value); rowOptions.component.cancelEditData(); } }, validationRules: [ { type: 'required', message: '请输入指标公式' }, { type: 'stringLength', max: 500, message: '请输入不超过 500 字的指标公式' } ] }, { dataField: "displayType", caption: "显示类型", allowEditing: true, editorOptions: { placeholder: "请选择", searchEnabled: false }, width: 95, lookup: { dataSource: $scope.showTypeEnus, displayExpr: "Name", valueExpr: "ID" }, validationRules: [ { type: 'required', message: '请选择显示类型' } ] }, { dataField: "isVisibleShow", allowEditing: true, caption: "是否显示", width: "6em", dataType: 'boolean' }, { alignment: "center", caption: "主要值", allowEditing: true, width: 60, cellTemplate: "isMainValueTemplate", editCellTemplate: "isMainValueTemplate" }, { dataField: "isYearValueShow", caption: "年度计算值", allowEditing: true, width: "7em", dataType: 'boolean' } ]; $scope.entriesCheckGridColumns = [ { dataField: "indexShow", caption: "序号", width: 80, allowEditing: false, alignment: "center", sortIndex: 0, sortOrder: 'asc' }, { dataField: "guideLine", caption: "条件类型", allowEditing: true, editorOptions: { placeholder: "请选择...", searchEnabled: false }, lookup: { dataSource: $scope.conditionType, displayExpr: "Name", valueExpr: "ID" }, validationRules: [ { type: 'required', message: '请选择条件类型' } ] }, { dataField: "acctJudge", caption: "科目判断公式", allowEditing: true, width: "8em", editorOptions: { placeholder: "请选择...", searchEnabled: false, onValueChanged: function (e) { var rowOptions = $(e.element).parents("tr:first").data().options; saveDataInRowOptions(rowOptions, "acctJudge", e.value); if (e.value === "N/A") { saveDataInRowOptions(rowOptions, "acctDirection", null); saveDataInRowOptions(rowOptions, "standardCode", null); saveDataInRowOptions(rowOptions, "stdCodeAndName", null); saveDataInRowOptions(rowOptions, "entriesComparison", null); saveDataInRowOptions(rowOptions, "thresholdValue", null); } rowOptions.component.cancelEditData(); if (e.value !== "N/A") { $scope.$parent.validateDataGrid(rowOptions.component); } } }, lookup: { dataSource: $scope.acctJudgeType, displayExpr: "Name", valueExpr: "Name" }, validationRules: [ { type: 'required', message: '请选择科目判断公式' } ] }, { dataField: "standardCode", caption: "标准科目", allowEditing: true, editCellTemplate: "standardCodeEditTemplate", validationRules: [ { type: 'required', message: '请选择标准科目' } ] }, { dataField: "acctDirection", caption: "科目方向", allowEditing: true, editorOptions: { placeholder: "请选择...", searchEnabled: false }, lookup: { dataSource: $scope.acctDirectionType, displayExpr: "Name", valueExpr: "ID" }, validationRules: [ { type: 'required', message: '请选择科目方向' } ] }, { dataField: "entriesComparison", caption: "分录比较公式", allowEditing: true, editorOptions: { placeholder: "请选择...", searchEnabled: false }, width: "8em", lookup: { dataSource: $scope.entriesComparisonType, displayExpr: "Name", valueExpr: "Name" }, validationRules: [ { type: 'required', message: '请选择分录比对公式' } ] }, { dataField: "thresholdValue", caption: "阈值", allowEditing: true, editorOptions: { placeholder: "请输入" }, validationRules: [ { type: 'required', message: '请输入阈值' }, { type: "pattern", pattern: "^-?\\d+$", message: '请输入整数值' } ] }, { dataField: "summaryShow", caption: "摘要", allowEditing: true, editorOptions: { placeholder: "请编辑摘要..." } }, { dataField: "isRelevantAmtShow", caption: "借贷方相关金额", allowEditing: true, width: "9em", dataType: 'boolean' } ]; $scope.gridColumns = angular.copy($scope.detailModel.featureId == 1 ? $scope.indexAnalysisGridColumns : $scope.entriesCheckGridColumns); //在编辑时切换 featureId 时需要清除 dataList 中的数据 //在视图模式时不要清空,因为此时 dataList 存放的是当前的有效数据 $scope.$watch("detailModel.featureId", function (newValue, oldValue) { if (newValue !== oldValue) { $scope.gridColumns.splice(0, $scope.gridColumns.length); if ($scope.editStatus != 1) { $scope.detailModel.dataList.splice(0, $scope.detailModel.dataList.length); } if (newValue == 1) { for (var i = 0; i < $scope.indexAnalysisGridColumns.length; i++) { $scope.gridColumns.push($scope.indexAnalysisGridColumns[i]); } } if (newValue == 2) { for (var i = 0; i < $scope.entriesCheckGridColumns.length; i++) { $scope.gridColumns.push($scope.entriesCheckGridColumns[i]); } } } }); $scope.$watch("editStatus", function (newValue, oldValue) { if ($scope.detailModel.featureId === 1) { $scope.gridColumns.forEach(function (row) { if ($scope.basicModel.type === 2) { if (row.dataField === "indexFormula" || row.dataField === "isVisibleShow") { row.allowEditing = true; } else { row.allowEditing = false; } } else { if (row.dataField === "sequence") { row.allowEditing = false; } else { row.allowEditing = true; } } }); } var dataGrid = getDataGrid(); dataGrid.refresh(); dataGrid.option({ editing: { allowUpdating: newValue !== 1 } }); }); $scope.dataGridOptions = { paging: { enabled: false }, editing: { mode: "cell" }, bindingOptions: { dataSource: "detailModel.dataList", columns: "gridColumns" }, selection: { mode: "single" }, height: "auto", allowColumnResizing: true, loadPanel: { enabled: false }, noDataText: "没有数据", sorting: false, showBorders: true, showRowLines: true, onContentReady: function (e) { console.log(e); dxDataGridService.resize(e.component); }, onEditorPreparing: function (e) { if (e.parentType === "dataRow" && e.dataField !== "indexFormula" && e.dataField !== "acctJudge") { e.editorOptions.onValueChanged = function (args) { var rowOptions = $(args.element).parents("tr:first").data().options; saveDataInRowOptions(rowOptions, e.dataField, args.value); rowOptions.component.cancelEditData(); } } }, onCellPrepared: function (e) { if (e.rowType === "data" && e.column.command === "edit") { var isEditing = e.row.isEditing, $links = e.cellElement.find(".dx-link"); $links.text(""); if (isEditing) { $links.filter(".dx-link-save").addClass("dx-icon-save"); $links.filter(".dx-link-cancel").addClass("dx-icon-revert"); } else { $links.filter(".dx-link-edit").addClass("dx-icon-edit"); $links.filter(".dx-link-delete").addClass("dx-icon-trash"); } } if (e.rowType === "data") { var editorBtn = null; if (e.column.dataField === "indexFormula") { editorBtn = $("<button class='fa fa-cogs'></button>"); editorBtn.attr("ng-click", "openFormula(1,$event)"); } if (e.column.dataField === "standardCode") { editorBtn = $("<button class='fa fa-columns'></button>"); editorBtn.attr("ng-click", "stdCodeButtonClicked($event)"); } if (e.column.dataField === "summaryShow") { editorBtn = $("<button class='fa fa-edit'></button>"); editorBtn.attr("ng-click", "summaryButtonClicked($event)"); } if (editorBtn != null) { editorBtn.attr("ng-disabled", "editStatus === 1"); var input = $("<input readonly='readonly' />"); var div = $("<div class='button-container'/>"); // 拥有 dx-texteditor-buttons-container class 的元素,直接将 editorBtn 放到该容器中(一般编辑模式下才会有该 class) //没有该容器的则自己包装一个容器用来盛放 editorBtn if (e.cellElement.find(".dx-texteditor-buttons-container").length > 0) { if (e.column.dataField === "summaryShow") { input.attr("title", e.data.summary); input.val(e.data.summaryShow); div.append(input); div.append(editorBtn); e.cellElement.empty(); e.cellElement.append($compile(div)($scope)); } e.cellElement.find(".dx-texteditor-buttons-container").replaceWith($compile(editorBtn)($scope)); } else { if (e.column.dataField === "indexFormula") { input.attr("title", e.data.formulaDescribe); //无论为标准 keyValue 值还是自定义公式,显示样式内容都有后台处理,显示 formulaNamae 字段 input.val(e.data.formulaNamae); } if (e.column.dataField === "standardCode") { input.attr("title", e.data.stdCodeAndName); input.val(e.data.stdCodeAndName); } if (e.column.dataField === "summaryShow") { input.attr("title", e.data.summary); input.val(e.data.summaryShow); } div.append(input); div.append(editorBtn); e.cellElement.empty(); e.cellElement.append($compile(div)($scope)); } } //当 acctJudge 字段为 "N/A" 时,将关联的 acctDirection,standardCode,entriesComparison,thresholdValue 置空,并不显示任何内容 if (e.data.hasOwnProperty("acctJudge") && e.data.acctJudge === "N/A") { if (e.column.dataField === "acctDirection" || e.column.dataField === "entriesComparison" || e.column.dataField === "standardCode" || e.column.dataField === "thresholdValue") { e.cellElement.empty(); if (e.data[e.column.dataField]) e.data[e.column.dataField] = ""; if (e.column.dataField === "standardCode" && e.data.stdCodeAndName) e.data.stdCodeAndName = ""; } } } }, onCellClick: function (e) { if (e.rowType !== "data") return; var dataGrid = getDataGrid(); var allowUpdating = dataGrid.option("editing.allowUpdating"); var dataField = e.column.dataField; var allowEditingColumn = e.column.allowEditing; if (allowUpdating) { //在编辑模式下,将单元格设为编辑状态 if (!e.isEditing && dataField !== "sequence" && dataField !== "indexShow" && !((dataField === "acctDirection" || dataField === "entriesComparison" || dataField === "thresholdValue") && e.data.acctJudge === "N/A") && allowEditingColumn) { dataGrid.editCell(e.rowIndex, dataField); } } } }; $scope.standardCodeAutocompleteOptions = { dataSource: $scope.standardAccountList, minSearchLength: 1, maxItemCount: 5, searchTimeout: 50, maxlength: 12, placeholder: '请选择科目...', valueExpr: 'code', searchExpr: 'title', searchMode: 'contains', focusStateEnabled: true, itemTemplate: 'autocompleteStandardCodeItemTemplate', onInitialized: function (e) { e.component.option({ value: e.model.item.data.standardCode }); }, onItemClick: function (e) { var data = e.model.item.data; data.standardCode = e.itemData.code; data.stdCodeAndName = e.itemData.code + "/" + e.itemData.fullName; } }; $scope.openFormula = function (type, $event) { // 以下注释代码主要用于 keyValue 选择编辑,该代码主要是自定义实现 var rowOptions = $($event.target).parents("tr:first").data().options; $scope.formulaBtnType = type; var modalInstance = $uibModal.open({ animation: false, ariaLabelledBy: 'modal-title', ariaDescribedBy: 'modal-body', templateUrl: 'model-config-manage-formula-edit-prop.html', scope: $scope, windowClass: "model-configuration-manage-formula-edit-prop" }); $scope.keyValueConfirm = function (event) { var dataGrid = $(event.target).parents(".model-configuration-manage-formula-edit-prop").find(".keyValueGridContainer").dxDataGrid('instance'); var selectedRows = dataGrid.getSelectedRowsData(); var selection = selectedRows.length ? selectedRows[0] : null; if (!_.isEmpty(selection)) { if ($scope.formulaBtnType == 1) { saveDataInRowOptions(rowOptions, "indexFormula", "@" + selection.keyCode); saveDataInRowOptions(rowOptions, "formulaNamae", selection.name); saveDataInRowOptions(rowOptions, "formulaDescribe", selection.description); rowOptions.component.cancelEditData(); } //monthJudge 和 yearJudge,需要显示 formulaNamae,但是存储的值为 keyCode? if ($scope.formulaBtnType == 2) { $scope.detailModel.formulaCriterion.monthJudge = "@" + selection.keyCode; } if ($scope.formulaBtnType == 3) { $scope.detailModel.formulaCriterion.yearJudge = "@" + selection.keyCode; } } modalInstance.close(); }; $scope.selectorClose = function () { modalInstance.dismiss('cancel'); }; //使用统一的 keyValue 编辑器,目前该控件尚未完成 //TODO:修改成 Edmond Meng 的统一控件 } $scope.stdCodeButtonClicked = function ($event) { var rowOptions = $($event.target).parents("tr:first").data().options; var modalInstance = $uibModal.open({ animation: false, ariaLabelledBy: 'modal-title', ariaDescribedBy: 'modal-body', templateUrl: 'model-config-manage-standard-edit-modal.html', scope: $scope, size: 600, windowClass: "model-configuration-manage-standard-edit-modal" }); $scope.saveStdCode = function (event) { var treeList = $(event.target).parents(".model-configuration-manage-standard-edit-modal").find(".dx-treelist").dxTreeList('instance'); var selectedObjects = treeList.getSelectedRowsData(); if (selectedObjects.length < 1) return; var selectedNode = selectedObjects[0]; saveDataInRowOptions(rowOptions, "standardCode", selectedNode.code); saveDataInRowOptions(rowOptions, "stdCodeAndName", selectedNode.code + "/" + selectedNode.fullName); rowOptions.component.cancelEditData(); modalInstance.close(); }; $scope.closeStandardEditModal = function () { modalInstance.dismiss('cancel'); }; }; $scope.summaryDataList = []; $scope.summaryButtonClicked = function ($event) { var rowOptions = $($event.target).parents("tr:first").data().options; $scope.summaryDataList = []; var data = rowOptions.data; var summary = data.summaryShow; var strs = summary.split("或"); for (var i = 0; i < strs.length; i++) { if (!PWC.isNullOrEmpty(strs[i].trim())) { var mto = {}; mto.summaryString = strs[i].trim(); $scope.summaryDataList.push(mto); } } var modalInstance = $uibModal.open({ animation: false, ariaLabelledBy: 'modal-title', ariaDescribedBy: 'modal-body', templateUrl: 'model-config-manage-summary-edit-prop.html', scope: $scope, size: 400, windowClass: "model-configuration-manage-summary-edit-prop" }); $scope.deleteSummaryModule = function (model) { if (model) { $scope.summaryDataList.splice(jQuery.inArray(model, $scope.summaryDataList), 1); } ; }; $scope.newSummaryModuleRow = function () { if ($scope.summaryDataList && $scope.summaryDataList.length >= 20) { SweetAlert.warning("添加失败,最多添加20行数据!"); return; } var row = { summaryString: null }; $scope.summaryDataList.push(row); }; $scope.saveSummary = function () { var summarys = ''; var summaryDb = ''; $scope.summaryDataList.forEach(function (summary) { if (summary.summaryString) { if (summarys) { summarys += " 或 " + summary.summaryString.trim(); } else { summarys = summary.summaryString.trim(); } if (summaryDb) { summaryDb += " or ([" + summary.summaryString.trim() + "])"; } else { summaryDb = "([" + summary.summaryString.trim() + "])"; } } }); saveDataInRowOptions(rowOptions, "summaryShow", summarys); saveDataInRowOptions(rowOptions, "summary", summaryDb); rowOptions.component.cancelEditData(); modalInstance.close(); }; $scope.closeSummaryEditProp = function () { modalInstance.dismiss('cancel'); }; }; $scope.gridOptionsKeyValue = { dataSource: $scope.keyValueDataSource, bindingOptions: { height: 'selectorOptions.gridHeight' }, paging: { pageSize: 7 }, columns: [ { dataField: 'id', visible: false }, { caption: $translate.instant('KeyCode'), dataField: 'keyCode', visible: false, fixed: true }, { caption: $translate.instant('KeyName'), dataField: 'name' }, { caption: $translate.instant('Formula'), dataField: 'formula' }, { caption: $translate.instant('Description'), dataField: 'description' }, { caption: $translate.instant('ApplicationScope'), calculateCellValue: function (rowData) { return $translate.instant(rowData.scopeSummary); }, calculateFilterExpression: function (filterValue, selectedFilterOperation) { return [this.calculateCellValue, selectedFilterOperation || 'contains', filterValue]; } }, { caption: $translate.instant('ApplyService'), dataField: 'serviceTypes' }, { caption: $translate.instant('IndustryID'), dataField: 'industrys' } ], loadPanel: { enabled: false }, //paging: { // pageSize: $scope.selectorOptions.pageSize //}, scrolling: { mode: "standard" }, searchPanel: { visible: true, width: 240 }, selection: { mode: 'single' }, sorting: { mode: 'single' }, filterRow: { visible: true }, allowColumnResizing: true, hoverStateEnabled: true, showBorders: true, showRowLines: true, showColumnLines: true }; //必须使用 validationRules 的拷贝数据,不然 validationRules 会被当做 validator 的 option 对象的一部分进行数据结构上的扩展,导致需要二次使用时数据结构已发生改变无法使用 $scope.dxControlValidationRules = { monthJudge: { required: { type: 'required', message: '请输入月度异常判断公式' }, stringLength: { type: 'stringLength', max: 200, message: '请输入不大于 200 字的月度异常判断公式' } }, monthExplain: { required: { type: 'required', message: '请输入月度异常判断公式的说明' }, stringLength: { type: 'stringLength', max: 200, message: '请输入不大于 200 字的月度异常判断公式的说明' } }, yearJudge: { required: { type: 'required', message: '请输入年度异常判断公式' }, stringLength: { type: 'stringLength', max: 200, message: '请输入不大于 200 字的年度异常判断公式' } }, yearExplain: { required: { type: 'required', message: '请输入年度异常判断公式的说明' }, stringLength: { type: 'stringLength', max: 200, message: '请输入不大于 200 字的年度异常判断公式的说明' } } }; //name 是绑定字段名称,value 为当前控件的值用于进行判断对应控件是否需要添加 required 校验 var fillFormulaCriterion = function (name, value) { var rules = [angular.copy($scope.dxControlValidationRules[name].stringLength)]; if (value) rules.push(angular.copy($scope.dxControlValidationRules[name].required)); $scope.dxControlsOptions[name].validatorInstance.option("validationRules", rules); }; //公式和说明应该同时录入或不录入 $scope.dxControlsOptions = { monthJudge: { ControlOption: { bindingOptions: { readOnly: "editStatus == 1", value: "detailModel.formulaCriterion.monthJudge" }, onContentReady: function (e) { var btn = $("<button class='fa fa-cogs'></button>"); btn.attr("ng-click", "openFormula(2)"); btn.attr("ng-disabled", "editStatus == 1"); e.element.find(".dx-texteditor-buttons-container").replaceWith($compile(btn)($scope)); }, onValueChanged: function (e) { fillFormulaCriterion("monthExplain", e.value); } }, validatorOption: { validationRules: [ { type: 'stringLength', max: 200, message: '请输入不大于 200 字的月度异常判断公式' } ], validationGroup: $scope.validationGroupName, onInitialized: function (e) { $scope.dxControlsOptions.monthJudge.validatorInstance = e.component; } }, validatorInstance: null }, yearJudge: { ControlOption: { bindingOptions: { readOnly: "editStatus == 1", value: "detailModel.formulaCriterion.yearJudge" }, onContentReady: function (e) { var btn = $("<button class='fa fa-cogs'></button>"); btn.attr("ng-click", "openFormula(3)"); btn.attr("ng-disabled", "editStatus == 1"); e.element.find(".dx-texteditor-buttons-container").replaceWith($compile(btn)($scope)); }, onValueChanged: function (e) { fillFormulaCriterion("yearExplain", e.value); } }, validatorOption: { validationRules: [ { type: 'stringLength', max: 200, message: '请输入不大于 200 字的年度异常判断公式' } ], validationGroup: $scope.validationGroupName, onInitialized: function (e) { $scope.dxControlsOptions.yearJudge.validatorInstance = e.component; } }, validatorInstance: null }, monthExplain: { ControlOption: { bindingOptions: { readOnly: "editStatus == 1", value: "detailModel.formulaCriterion.monthExplain" }, onValueChanged: function (e) { fillFormulaCriterion("monthJudge", e.value); } }, validatorOption: { validationRules: [ { type: 'stringLength', max: 200, message: '请输入不大于 200 字的月度异常判断公式的说明' } ], validationGroup: $scope.validationGroupName, onInitialized: function (e) { $scope.dxControlsOptions.monthExplain.validatorInstance = e.component; } }, validatorInstance: null }, yearExplain: { ControlOption: { bindingOptions: { readOnly: "editStatus == 1", value: "detailModel.formulaCriterion.yearExplain" }, onValueChanged: function (e) { fillFormulaCriterion("yearJudge", e.value); } }, validatorOption: { validationRules: [ { type: 'stringLength', max: 200, message: '请输入不大于 200 字的年度异常判断公式的说明' } ], validationGroup: $scope.validationGroupName, onInitialized: function (e) { $scope.dxControlsOptions.yearExplain.validatorInstance = e.component; } }, validatorInstance: null }, feature: { ControlOption: { dataSource: $scope.featureItems, displayExpr: "name", valueExpr: "id", bindingOptions: { value: "detailModel.featureId" } }, validatorOption: { validationRules: [] } }, isFilter: { ControlOption: { text: "可筛选模型", activeStateEnabled: false, bindingOptions: { value: "basicModel.isFilterShow", disabled: "editStatus == 1", readOnly: "editStatus == 1" } }, validatorOption: { validationRules: [] } } }; $scope.standardEditDataGridOptions = { dataSource: $scope.standardAccountList, columns: [ { dataField: "code", caption: "科目代码", width: 150 }, { dataField: "fullName", caption: "科目全称" }, { dataField: "directionName", caption: "借贷方向", width: 100 } ], loadPanel: { enabled: true }, scrolling: { mode: "virtual" }, keyExpr: "code", parentIdExpr: "parentCode", selection: { mode: "single" }, allowColumnResizing: true, columnAutoWidth: true, showRowLines: true, showColumnLines: true, rowAlternationEnabled: true, //单双行颜色 height: 400, showBorders: true, searchPanel: { placeholder: $translate.instant('Search'), visible: true } }; } }; }]);