| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533 | BemsWebApplication.Formula = function (params, viewInfo) {    "use strict";    var FACILITY_TYPE_DEPTH = 2,        FACILITY_DEPTH = 3,        FORMULA_DEPTH = 4;    var FNameForSearch = ko.observable(),        PNameForSearch = ko.observable();    var eq = BWA.DataUtil.constructEqualFilter;    // hcLee 2016 01 15 확장    var deferredForSearch = new $.Deferred();    // hcLee 2016 01 15 확장    var works = ko.observableArray();    var facilityTypeDataSource = BemsWebApplication.db.createDataSource('BemsFacilityType'),        facilityDataSource = BemsWebApplication.db.createDataSource('CmFacility', true),        formulaBaseDataSource = BemsWebApplication.db.createDataSource('BemsFormulaBase'),        formulaDataSource = BemsWebApplication.db.createDataSource('BemsFormula'),        tableDataSource = BemsWebApplication.db.createDataSource('BemsFormulaTable'),        parameterDataSource = BWA.DataUtil.createDataSource({            dataSourceOptions: {                select: [                    'SiteId', 'FacilityTypeId', 'FacilityCode', 'FormulaId',                    'ParameterId', 'ParameterFacilityCode', 'ParameterPropertyId',                    'CmFacility/Name', 'BemsMonitoringPoint/Name',                    'BemsMonitoringPoint/CmFacility/Name'                ],                expand: ['CmFacility', 'BemsMonitoringPoint', 'BemsMonitoringPoint/CmFacility'],                extendOptions: {                    forceOriginalField: true,                    alterNames: {                        'CmFacility/Name': 'FacilityName',                        'BemsMonitoringPoint/Name': 'PointName',                    }                }            }        }, 'BemsFormulaParameter'),        formulaDataViewModel = new BWA.BemsFormulaViewModel(),        factory = BemsWebApplication.Factory.PointLocationMapping,        viewModel,        formulaPointPopup = null,        gridView,        popupVisible = ko.observable(false),        parameters = ko.observableArray(),        facilityParameters = ko.observableArray(),        selectedTreeItemData = ko.observable(null),        selectedTreeItem = ko.observable(null), // 2015 11 12 hcLee 추가 기존 TreeItem -> TreeItemData 로 변경 하고 (위) 이거 추가함//        selectedPoints = ko.observableArray(),        pointDataSource = factory.getDataSource(),/*         pointDataSource = BWA.DataUtil.createDataSource({        dataSourceOptions: {            select: [                'SiteId', 'FacilityTypeId', 'FacilityCode', 'PropertyId',                'BuildingId', 'FloorId', 'ZoneId',                'ValueType',                //'IsAccumulated',                'Name', 'Description',                'CmFacility/Name', 'BemsServiceType/Name', 'BemsFacilityType/Name', 'BemsFuelType/Name'            ],            expand: ['CmFacility', 'BemsServiceType', 'BemsFacilityType', 'BemsFuelType'],            extendOptions: {                forceOriginalField: true                //alterNames: {                //    'CmFacility/Name': 'FacilityName',                //}            },            filter: [                ['SiteId', '=', BWA.UserInfo.SiteId()],                'and',                ['FacilityTypeId', '<', 100]            ]},    }, 'BemsMonitoringPoint'),*/        pointDataGridOptions = utils.datagrid.defaultOptions({            // 중요 !!! hcLee 2016 01 15            //dxDataSource: pointDataSource,            dataSource: works,            /*                        filter: [                        //    ['SiteId', '=', BWA.UserInfo.SiteId()]                            eq('FacilityCode', 1002),                        ],                        */            datagridId: 'pointDataGrid',            dbId: 'BemsMonitoringPoint',            width: '100%',            height: 720,            //selection: {            //    mode: 'multiple'            //},            columns: factory.getColumns([                { dataField: 'CmFacility/Name', width: '30%' },                { dataField: 'Name', width: '55%' },                { dataField: 'ValueType', width: '15%' }            ]),            wordWrapEnabled: true,            rowPrepared: function (rowElement, rowInfo) {                if (rowInfo.rowType != 'data') {                    return;                }                rowElement                    .addClass('draggablePointRow')                    .data('data', rowInfo.data)                    .data('keyValue', rowInfo.key);            },            contentReadyAction: function (e) {                e.element.find('.draggablePointRow').draggable({                    cursor: 'point',                    appendTo: '#mainContents',                    cursorAt: { right: 0, bottom: 0 },                    helper: function (e) {                        var div = $('<div>', {                            'overflow': 'auto'                        });                        div.text('test');                        return div;                    },                    start: function (event, ui) {                        var $originalRow = $(this);                        var $originalRowCells = $originalRow.children();                        var key = $originalRow.data('keyValue');                        var data = $originalRow.data('data');                        ui.helper                            .data('keyValue', key)                            .data('data', data)                        //.text('{0} [{1}]'.formati(data.FacilityName(), data.Name()))                        .text('{0} [{1}]'.formati(data['CmFacility/Name'](), data.Name()))                            .addClass('drag-helper');                        //console.log(ui.helper);                        //var $originalRowCells = $originalRow.children(),                        //    $clonedRowCells = $clonedRow.children();                        //$('<div>').text($clonedRowCells.get(1).text());                        ////var $originalRowCells = $originalRow.children(),                        ////    $clonedRowCells = $clonedRow.children();                        ////for (var i = 0; i < $originalRowCells.length; i++)                        ////    $($clonedRowCells.get(i)).width($($originalRowCells.get(i)).width());                        //$clonedRow                        //    .width($originalRow.width())                        //    .addClass('drag-helper');                        //console.log(ui.helper.offset());                        //var offset = ui.helper.offset();                        //ui.helper.appendTo($('#mainContents'));                        //ui.position.top = offset.top;                        //ui.position.left = offset.left;                        //console.log('after');                        //console.log(ui.helper.offset());                        ////ui.helper.offset(offset);                        //ui.helper.css({                        //    left: offset.left,                        //    top: offset.top                        //});                        //console.log(ui.helper.offset());                    }                });            },            handleDataGridRowClick: function () {                formulaPointPopup.handleDataGridRowClick.apply(this, arguments);            },            //    : function (id, dataGrid, clickRow, popupVisible) {            //    viewModel.formulaPointPopup.show();            //}        }),        parameterDataGridOptions = utils.datagrid.defaultOptions({            dataSource: parameters,            datagridId: 'parameterDataGrid',            width: '100%',            height: 320,            pager: {                showPageSizeSelector: false,                allowedPageSizes: []            },            //selection: {            //    mode: 'multiple'            //},            columns: [                { dataField: 'ParameterId', caption: $G('variable'), width: '10%' },                //{ dataField: 'ParameterFacilityCode/CmFacility/Name', width: '30%' },//                { dataField: 'FacilityName', caption: $G('facilityName'), width: '45%' },                { dataField: 'BemsMonitoringPoint/CmFacility/Name', caption: $G('facilityName'), width: '45%' },                { dataField: 'PointName', caption: $G('pointName'), width: '45%' },            ],            wordWrapEnabled: true,            rowPrepared: function (rowElement, rowInfo) {                if (rowInfo.rowType != 'data') {                    return;                }                rowElement                    .addClass('droppableParameterRow')                    .data('keyValue', rowInfo.key)                    .data('data', rowInfo.data);            },            contentReadyAction: function (e) {                e.element.find('.droppableParameterRow').droppable({                    drop: function (event, ui) {                        var draggingRowKey = ui.draggable.data('keyValue');                        var draggingRowData = ui.draggable.data('data');                        var targetRowKey = $(this).data('keyValue');                        var draggingIndex = null,                            targetIndex = null;                        console.log(draggingRowKey);                        console.log(targetRowKey);                        var paramter = _.find(parameters(), function (x) {                            return x.ParameterId === targetRowKey.ParameterId;                        });                        paramter.FacilityKey = draggingRowKey;                        //paramter.FacilityName = draggingRowData.FacilityName();                        //hcLee 2016 03 02                        paramter['BemsMonitoringPoint/CmFacility/Name'] = draggingRowData['CmFacility/Name']();                        paramter.PointName = draggingRowData.Name();                        paramter.ParameterFacilityCode = draggingRowData.FacilityCode();                        paramter.ParameterPropertyId = draggingRowData.PropertyId();                        $('#parameterDataGrid').dxDataGrid('instance').refresh();                        console.log($('#parameterDataGrid').dxDataGrid('instance').option('hoverStateEnabled'));                    }                });            },            handleDataGridRowClick: function (id, dataGrid, clickRow, popupVisible) {            },        }),        tableDataGridOptions = utils.datagrid.defaultOptions({            dxDataSource: tableDataSource,            datagridId: 'tableDataGrid',            dbId: 'BemsFormulaTable',            width: '100%',            height: 240,            pager: {                showPageSizeSelector: false,                allowedPageSizes: []            },            //selection: {            //    mode: 'multiple'            //},            columns: [                { dataField: 'FunctionName', caption: $G('functionName'), width: '20%' },                { dataField: 'Description', caption: $G('description'), width: '80%' },            ],            wordWrapEnabled: true,            handleDataGridRowClick: function (id, dataGrid, clickRow, popupVisible) {            }        });    formulaDataViewModel.Name = ko.observable();    // hcLee 2016 01 15 확장    function handleViewShowing() {        deferredForSearch.resolve();        handleSearchInSearchView();    }    // hcLee 2016 01 15 확장    function handleSearchInSearchView(filter) {        var filterA = [];        filterA.push(['SiteId', '=', BWA.UserInfo.SiteId()]);        filterA.push(['FacilityTypeId', '<', 100]);        _.each(filter, function (x) {            filterA.push(x);        });        pointDataSource.filter(filterA);        pointDataSource.load().done(function (result) {            works(result);        });    }    function refreshList() {    }    function handleClickTreeItem(element, data) {        // 2015 11 16  hcLee 추가        selectedTreeItem(data);        var depth = data.depth;        if (depth !== FORMULA_DEPTH) return;        var parent = data.parentData;        var data = data.data;        selectedTreeItemData(data);        var siteId = BWA.UserInfo.SiteId();        var filter = [            eq('SiteId', siteId),            'and',            eq('FacilityTypeId', data.FacilityTypeId()),            'and',            eq('FormulaId', data.FormulaId()),            'and',            eq('FacilityCode', parent.data.FacilityCode()),        ];        formulaDataViewModel.SiteId(siteId);        formulaDataViewModel.FacilityTypeId(data.FacilityTypeId());        formulaDataViewModel.FacilityCode(parent.data.FacilityCode()); // parent 값을 가져올 수 있도록 treewidget를 수정 하자.        formulaDataViewModel.FormulaId(data.FormulaId());        formulaDataViewModel.Name(data.Name);        formulaDataSource.filter(filter);        formulaDataSource.load().done(function (result) {            if (_.isEmpty(result)) {                //                BWA.DataUtil.resetViewModel(formulaDataViewModel);                formulaDataViewModel.Formula('');                parameters([]);                return;            }            formulaDataViewModel.fromJS(result[0].toJS());            formulaDataViewModel.Name(data.Name());            parameterDataSource.filter([                eq('SiteId', siteId),                'and',                eq('FacilityTypeId', data.FacilityTypeId()),                'and',                //eq('FacilityCode', parent.data.FacilityCode()),                eq('FacilityCode', formulaDataViewModel.FacilityCode()),                'and',                eq('FormulaId', data.FormulaId())            ]);            parameterDataSource.load().done(function (paramterArray) {                //                if (_.isEmpty(paramterArray) === false) {                parameters(paramterArray);                //              }            });        });    }    function handleViewShown() {        // 트리노드 선택 후 다른 화면으로 이동 한 경우,        // 다시 현재 화면으로 들어왔을 때 이전에 선택되어 있던 트리노드가        // 계속 선택된 상태로 표시되는 현상을 막기 위한 코드        if (facilityDataSource._items.length != 0) {            var data = selectedTreeItem();            if (data != null) $('#formulaTreeView').cwTreeView('reload', selectedTreeItem().parentData);        }        var eq = BWA.DataUtil.constructEqualFilter;        $('#formulaTreeView').cwTreeView({            width: '40%',            height: 'auto',            onClickTreeItem: handleClickTreeItem,            delegateDataSource: function (data, alterObj) {                var id = data.id;                var depth = data.depth;                var promise = null;                switch (depth) {                    case 0:                        var typeDeferred = new $.Deferred();                        promise = typeDeferred.promise();                        alterObj.IsFunction = false;                        typeDeferred.resolve([                            { Id: 99, Name: '등록설비' },                            { Id: 100, Name: '시스템' }                        ]);                        break;                    case 1:                        var filter;                        switch (data.data.Id) {                            case 99: filter = [['FacilityTypeId', '<', 99]]; break;                            case 100: filter = [['FacilityTypeId', '>', 99]]; break;                        }                        facilityTypeDataSource.filter(filter);                        promise = facilityTypeDataSource.load();                        break;                    case 2:                        facilityDataSource.filter([                            eq('SiteId', BWA.UserInfo.SiteId()),                            'and',                            eq('FacilityTypeId', data.data.FacilityTypeId())                        ]);                        promise = facilityDataSource.load();                        break;                    case 3:                        formulaBaseDataSource.filter([                            eq('FacilityTypeId', data.data.FacilityTypeId())                        ]);                        promise = formulaBaseDataSource.load();                        break;                }                return promise;            },        });    }    function hanleRemoveSelectedParameter() {        var gridView = $('#parameterDataGrid').dxDataGrid('instance');        var rows = gridView.getSelectedRowsData();        console.log(rows);    }    function getParametersFromFormula() {        var regex = /\b[A-Z]\b/g;        var match;        //        var ps = parameters();        var list = [];        while (match = regex.exec(formulaDataViewModel.Formula())) {            var variable = match[0];            if (_.some(list, function (x) {                return x.ParameterId() === variable;            })) continue;            list.push({                'ParameterId': ko.observable(variable)            });        }        return list;    }    function formulaValueChangeAction(e) {        var savedParameters = parameters();        var formulaParameters = getParametersFromFormula();        console.log(savedParameters);        console.log(formulaParameters);        _.each(formulaParameters, function (p) {            if (_.some(savedParameters, function (x) {                return x.ParameterId() === p.ParameterId();            })) return;            parameters.push(p);        });        for (var i = 0 ; i < savedParameters.length ; i++) {            var p = savedParameters[i];            if (_.some(formulaParameters, function (x) {                console.log(x.ParameterId() + ' !== ' + p.ParameterId());                return x.ParameterId() === p.ParameterId();            })) {                continue;            }            parameters.splice(i, 1);            i--;        }    }    function saveFormula() {        var formula = formulaDataViewModel.toJS();        if (_.some(parameters(), function (x) {            // 아래 코드에서 오류발생하여 변경             //return _.isUndefined(x.ParameterFacilityCode) || _.isUndefined(x.ParameterFacilityCode());            return _.isUndefined(x.ParameterFacilityCode);        })) {            utils.toast.show('관제점이 할당되지 않은 파라미터가 존재합니다.', 'error');            return;        }        formula.Paramters = _.map(parameters(), function (x) {            x = BWA.DataUtil.convertHybridViewModelToJS(x);            x.SiteId = formula.SiteId;            x.FacilityTypeId = formula.FacilityTypeId;            x.FacilityCode = formula.FacilityCode;            x.FormulaId = formula.FormulaId;            return _.pick(x, 'SiteId', 'FacilityTypeId', 'FacilityCode',                'FormulaId', 'ParameterId',                'ParameterFacilityCode', 'ParameterPropertyId');        });        var promise = BWA.api.post('BemsFormula/PostBemsFormula', formula);        promise.done(function () {            utils.toast.show($G('successDatabaseProcessMsg'));        });    }    FNameForSearch("");    PNameForSearch("");    var searchViewOptions = {        searchViewItems: [            { id: 'CmFacility/Name', value: FNameForSearch },            { id: 'Name', value: PNameForSearch },        ],        promiseDataInSearchView: deferredForSearch.promise()    };    viewModel = {        //        viewShown: handleViewShown,        refreshList: refreshList,        saveFormula: saveFormula,        pointDataGridOptions: pointDataGridOptions,        parameterDataGridOptions: parameterDataGridOptions,        tableDataGridOptions: tableDataGridOptions,        formulaDataViewModel: formulaDataViewModel,        formulaValueChangeAction: formulaValueChangeAction,        hanleRemoveSelectedParameter: hanleRemoveSelectedParameter,        // hcLee 2016 01 15 확장        viewShowing: handleViewShowing,    };    formulaPointPopup = viewModel.formulaPointPopup = BWA.Popup.FormulaPointPopup.create(viewModel);    // hcLee 2016 01 15 확장    //return $.extend(BWA.CommonView.create(params, viewInfo, viewModel.options, null, handleViewShown), viewModel);    return $.extend(BWA.CommonView.create(params, viewInfo, searchViewOptions, ko.observable(null), handleViewShown, null, handleSearchInSearchView), viewModel);};
 |