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
                    }
                };
            }
        };
    }]);