3150e2dcf150bac9f098e2f48c9c12b06615fc0f.svn-base 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533
  1. BemsWebApplication.Formula = function (params, viewInfo) {
  2. "use strict";
  3. var FACILITY_TYPE_DEPTH = 2,
  4. FACILITY_DEPTH = 3,
  5. FORMULA_DEPTH = 4;
  6. var FNameForSearch = ko.observable(),
  7. PNameForSearch = ko.observable();
  8. var eq = BWA.DataUtil.constructEqualFilter;
  9. // hcLee 2016 01 15 확장
  10. var deferredForSearch = new $.Deferred();
  11. // hcLee 2016 01 15 확장
  12. var works = ko.observableArray();
  13. var facilityTypeDataSource = BemsWebApplication.db.createDataSource('BemsFacilityType'),
  14. facilityDataSource = BemsWebApplication.db.createDataSource('CmFacility', true),
  15. formulaBaseDataSource = BemsWebApplication.db.createDataSource('BemsFormulaBase'),
  16. formulaDataSource = BemsWebApplication.db.createDataSource('BemsFormula'),
  17. tableDataSource = BemsWebApplication.db.createDataSource('BemsFormulaTable'),
  18. parameterDataSource = BWA.DataUtil.createDataSource({
  19. dataSourceOptions: {
  20. select: [
  21. 'SiteId', 'FacilityTypeId', 'FacilityCode', 'FormulaId',
  22. 'ParameterId', 'ParameterFacilityCode', 'ParameterPropertyId',
  23. 'CmFacility/Name', 'BemsMonitoringPoint/Name',
  24. 'BemsMonitoringPoint/CmFacility/Name'
  25. ],
  26. expand: ['CmFacility', 'BemsMonitoringPoint', 'BemsMonitoringPoint/CmFacility'],
  27. extendOptions: {
  28. forceOriginalField: true,
  29. alterNames: {
  30. 'CmFacility/Name': 'FacilityName',
  31. 'BemsMonitoringPoint/Name': 'PointName',
  32. }
  33. }
  34. }
  35. }, 'BemsFormulaParameter'),
  36. formulaDataViewModel = new BWA.BemsFormulaViewModel(),
  37. factory = BemsWebApplication.Factory.PointLocationMapping,
  38. viewModel,
  39. formulaPointPopup = null,
  40. gridView,
  41. popupVisible = ko.observable(false),
  42. parameters = ko.observableArray(),
  43. facilityParameters = ko.observableArray(),
  44. selectedTreeItemData = ko.observable(null),
  45. selectedTreeItem = ko.observable(null), // 2015 11 12 hcLee 추가 기존 TreeItem -> TreeItemData 로 변경 하고 (위) 이거 추가함
  46. // selectedPoints = ko.observableArray(),
  47. pointDataSource = factory.getDataSource(),
  48. /*
  49. pointDataSource = BWA.DataUtil.createDataSource({
  50. dataSourceOptions: {
  51. select: [
  52. 'SiteId', 'FacilityTypeId', 'FacilityCode', 'PropertyId',
  53. 'BuildingId', 'FloorId', 'ZoneId',
  54. 'ValueType',
  55. //'IsAccumulated',
  56. 'Name', 'Description',
  57. 'CmFacility/Name', 'BemsServiceType/Name', 'BemsFacilityType/Name', 'BemsFuelType/Name'
  58. ],
  59. expand: ['CmFacility', 'BemsServiceType', 'BemsFacilityType', 'BemsFuelType'],
  60. extendOptions: {
  61. forceOriginalField: true
  62. //alterNames: {
  63. // 'CmFacility/Name': 'FacilityName',
  64. //}
  65. },
  66. filter: [
  67. ['SiteId', '=', BWA.UserInfo.SiteId()],
  68. 'and',
  69. ['FacilityTypeId', '<', 100]
  70. ]}, }, 'BemsMonitoringPoint'),
  71. */
  72. pointDataGridOptions = utils.datagrid.defaultOptions({
  73. // 중요 !!! hcLee 2016 01 15
  74. //dxDataSource: pointDataSource,
  75. dataSource: works,
  76. /*
  77. filter: [
  78. // ['SiteId', '=', BWA.UserInfo.SiteId()]
  79. eq('FacilityCode', 1002),
  80. ],
  81. */
  82. datagridId: 'pointDataGrid',
  83. dbId: 'BemsMonitoringPoint',
  84. width: '100%',
  85. height: 720,
  86. //selection: {
  87. // mode: 'multiple'
  88. //},
  89. columns: factory.getColumns([
  90. { dataField: 'CmFacility/Name', width: '30%' },
  91. { dataField: 'Name', width: '55%' },
  92. { dataField: 'ValueType', width: '15%' }
  93. ]),
  94. wordWrapEnabled: true,
  95. rowPrepared: function (rowElement, rowInfo) {
  96. if (rowInfo.rowType != 'data') {
  97. return;
  98. }
  99. rowElement
  100. .addClass('draggablePointRow')
  101. .data('data', rowInfo.data)
  102. .data('keyValue', rowInfo.key);
  103. },
  104. contentReadyAction: function (e) {
  105. e.element.find('.draggablePointRow').draggable({
  106. cursor: 'point',
  107. appendTo: '#mainContents',
  108. cursorAt: { right: 0, bottom: 0 },
  109. helper: function (e) {
  110. var div = $('<div>', {
  111. 'overflow': 'auto'
  112. });
  113. div.text('test');
  114. return div;
  115. },
  116. start: function (event, ui) {
  117. var $originalRow = $(this);
  118. var $originalRowCells = $originalRow.children();
  119. var key = $originalRow.data('keyValue');
  120. var data = $originalRow.data('data');
  121. ui.helper
  122. .data('keyValue', key)
  123. .data('data', data)
  124. //.text('{0} [{1}]'.formati(data.FacilityName(), data.Name()))
  125. .text('{0} [{1}]'.formati(data['CmFacility/Name'](), data.Name()))
  126. .addClass('drag-helper');
  127. //console.log(ui.helper);
  128. //var $originalRowCells = $originalRow.children(),
  129. // $clonedRowCells = $clonedRow.children();
  130. //$('<div>').text($clonedRowCells.get(1).text());
  131. ////var $originalRowCells = $originalRow.children(),
  132. //// $clonedRowCells = $clonedRow.children();
  133. ////for (var i = 0; i < $originalRowCells.length; i++)
  134. //// $($clonedRowCells.get(i)).width($($originalRowCells.get(i)).width());
  135. //$clonedRow
  136. // .width($originalRow.width())
  137. // .addClass('drag-helper');
  138. //console.log(ui.helper.offset());
  139. //var offset = ui.helper.offset();
  140. //ui.helper.appendTo($('#mainContents'));
  141. //ui.position.top = offset.top;
  142. //ui.position.left = offset.left;
  143. //console.log('after');
  144. //console.log(ui.helper.offset());
  145. ////ui.helper.offset(offset);
  146. //ui.helper.css({
  147. // left: offset.left,
  148. // top: offset.top
  149. //});
  150. //console.log(ui.helper.offset());
  151. }
  152. });
  153. },
  154. handleDataGridRowClick: function () {
  155. formulaPointPopup.handleDataGridRowClick.apply(this, arguments);
  156. },
  157. // : function (id, dataGrid, clickRow, popupVisible) {
  158. // viewModel.formulaPointPopup.show();
  159. //}
  160. }),
  161. parameterDataGridOptions = utils.datagrid.defaultOptions({
  162. dataSource: parameters,
  163. datagridId: 'parameterDataGrid',
  164. width: '100%',
  165. height: 320,
  166. pager: {
  167. showPageSizeSelector: false,
  168. allowedPageSizes: []
  169. },
  170. //selection: {
  171. // mode: 'multiple'
  172. //},
  173. columns: [
  174. { dataField: 'ParameterId', caption: $G('variable'), width: '10%' },
  175. //{ dataField: 'ParameterFacilityCode/CmFacility/Name', width: '30%' },
  176. // { dataField: 'FacilityName', caption: $G('facilityName'), width: '45%' },
  177. { dataField: 'BemsMonitoringPoint/CmFacility/Name', caption: $G('facilityName'), width: '45%' },
  178. { dataField: 'PointName', caption: $G('pointName'), width: '45%' },
  179. ],
  180. wordWrapEnabled: true,
  181. rowPrepared: function (rowElement, rowInfo) {
  182. if (rowInfo.rowType != 'data') {
  183. return;
  184. }
  185. rowElement
  186. .addClass('droppableParameterRow')
  187. .data('keyValue', rowInfo.key)
  188. .data('data', rowInfo.data);
  189. },
  190. contentReadyAction: function (e) {
  191. e.element.find('.droppableParameterRow').droppable({
  192. drop: function (event, ui) {
  193. var draggingRowKey = ui.draggable.data('keyValue');
  194. var draggingRowData = ui.draggable.data('data');
  195. var targetRowKey = $(this).data('keyValue');
  196. var draggingIndex = null,
  197. targetIndex = null;
  198. console.log(draggingRowKey);
  199. console.log(targetRowKey);
  200. var paramter = _.find(parameters(), function (x) {
  201. return x.ParameterId === targetRowKey.ParameterId;
  202. });
  203. paramter.FacilityKey = draggingRowKey;
  204. //paramter.FacilityName = draggingRowData.FacilityName();
  205. //hcLee 2016 03 02
  206. paramter['BemsMonitoringPoint/CmFacility/Name'] = draggingRowData['CmFacility/Name']();
  207. paramter.PointName = draggingRowData.Name();
  208. paramter.ParameterFacilityCode = draggingRowData.FacilityCode();
  209. paramter.ParameterPropertyId = draggingRowData.PropertyId();
  210. $('#parameterDataGrid').dxDataGrid('instance').refresh();
  211. console.log($('#parameterDataGrid').dxDataGrid('instance').option('hoverStateEnabled'));
  212. }
  213. });
  214. },
  215. handleDataGridRowClick: function (id, dataGrid, clickRow, popupVisible) {
  216. },
  217. }),
  218. tableDataGridOptions = utils.datagrid.defaultOptions({
  219. dxDataSource: tableDataSource,
  220. datagridId: 'tableDataGrid',
  221. dbId: 'BemsFormulaTable',
  222. width: '100%',
  223. height: 240,
  224. pager: {
  225. showPageSizeSelector: false,
  226. allowedPageSizes: []
  227. },
  228. //selection: {
  229. // mode: 'multiple'
  230. //},
  231. columns: [
  232. { dataField: 'FunctionName', caption: $G('functionName'), width: '20%' },
  233. { dataField: 'Description', caption: $G('description'), width: '80%' },
  234. ],
  235. wordWrapEnabled: true,
  236. handleDataGridRowClick: function (id, dataGrid, clickRow, popupVisible) {
  237. }
  238. });
  239. formulaDataViewModel.Name = ko.observable();
  240. // hcLee 2016 01 15 확장
  241. function handleViewShowing() {
  242. deferredForSearch.resolve();
  243. handleSearchInSearchView();
  244. }
  245. // hcLee 2016 01 15 확장
  246. function handleSearchInSearchView(filter) {
  247. var filterA = [];
  248. filterA.push(['SiteId', '=', BWA.UserInfo.SiteId()]);
  249. filterA.push(['FacilityTypeId', '<', 100]);
  250. _.each(filter, function (x) {
  251. filterA.push(x);
  252. });
  253. pointDataSource.filter(filterA);
  254. pointDataSource.load().done(function (result) {
  255. works(result);
  256. });
  257. }
  258. function refreshList() {
  259. }
  260. function handleClickTreeItem(element, data) {
  261. // 2015 11 16 hcLee 추가
  262. selectedTreeItem(data);
  263. var depth = data.depth;
  264. if (depth !== FORMULA_DEPTH) return;
  265. var parent = data.parentData;
  266. var data = data.data;
  267. selectedTreeItemData(data);
  268. var siteId = BWA.UserInfo.SiteId();
  269. var filter = [
  270. eq('SiteId', siteId),
  271. 'and',
  272. eq('FacilityTypeId', data.FacilityTypeId()),
  273. 'and',
  274. eq('FormulaId', data.FormulaId()),
  275. 'and',
  276. eq('FacilityCode', parent.data.FacilityCode()),
  277. ];
  278. formulaDataViewModel.SiteId(siteId);
  279. formulaDataViewModel.FacilityTypeId(data.FacilityTypeId());
  280. formulaDataViewModel.FacilityCode(parent.data.FacilityCode()); // parent 값을 가져올 수 있도록 treewidget를 수정 하자.
  281. formulaDataViewModel.FormulaId(data.FormulaId());
  282. formulaDataViewModel.Name(data.Name);
  283. formulaDataSource.filter(filter);
  284. formulaDataSource.load().done(function (result) {
  285. if (_.isEmpty(result)) {
  286. // BWA.DataUtil.resetViewModel(formulaDataViewModel);
  287. formulaDataViewModel.Formula('');
  288. parameters([]);
  289. return;
  290. }
  291. formulaDataViewModel.fromJS(result[0].toJS());
  292. formulaDataViewModel.Name(data.Name());
  293. parameterDataSource.filter([
  294. eq('SiteId', siteId),
  295. 'and',
  296. eq('FacilityTypeId', data.FacilityTypeId()),
  297. 'and',
  298. //eq('FacilityCode', parent.data.FacilityCode()),
  299. eq('FacilityCode', formulaDataViewModel.FacilityCode()),
  300. 'and',
  301. eq('FormulaId', data.FormulaId())
  302. ]);
  303. parameterDataSource.load().done(function (paramterArray) {
  304. // if (_.isEmpty(paramterArray) === false) {
  305. parameters(paramterArray);
  306. // }
  307. });
  308. });
  309. }
  310. function handleViewShown() {
  311. // 트리노드 선택 후 다른 화면으로 이동 한 경우,
  312. // 다시 현재 화면으로 들어왔을 때 이전에 선택되어 있던 트리노드가
  313. // 계속 선택된 상태로 표시되는 현상을 막기 위한 코드
  314. if (facilityDataSource._items.length != 0) {
  315. var data = selectedTreeItem();
  316. if (data != null) $('#formulaTreeView').cwTreeView('reload', selectedTreeItem().parentData);
  317. }
  318. var eq = BWA.DataUtil.constructEqualFilter;
  319. $('#formulaTreeView').cwTreeView({
  320. width: '40%',
  321. height: 'auto',
  322. onClickTreeItem: handleClickTreeItem,
  323. delegateDataSource: function (data, alterObj) {
  324. var id = data.id;
  325. var depth = data.depth;
  326. var promise = null;
  327. switch (depth) {
  328. case 0:
  329. var typeDeferred = new $.Deferred();
  330. promise = typeDeferred.promise();
  331. alterObj.IsFunction = false;
  332. typeDeferred.resolve([
  333. { Id: 99, Name: '등록설비' },
  334. { Id: 100, Name: '시스템' }
  335. ]);
  336. break;
  337. case 1:
  338. var filter;
  339. switch (data.data.Id) {
  340. case 99: filter = [['FacilityTypeId', '<', 99]]; break;
  341. case 100: filter = [['FacilityTypeId', '>', 99]]; break;
  342. }
  343. facilityTypeDataSource.filter(filter);
  344. promise = facilityTypeDataSource.load();
  345. break;
  346. case 2:
  347. facilityDataSource.filter([
  348. eq('SiteId', BWA.UserInfo.SiteId()),
  349. 'and',
  350. eq('FacilityTypeId', data.data.FacilityTypeId())
  351. ]);
  352. promise = facilityDataSource.load();
  353. break;
  354. case 3:
  355. formulaBaseDataSource.filter([
  356. eq('FacilityTypeId', data.data.FacilityTypeId())
  357. ]);
  358. promise = formulaBaseDataSource.load();
  359. break;
  360. }
  361. return promise;
  362. },
  363. });
  364. }
  365. function hanleRemoveSelectedParameter() {
  366. var gridView = $('#parameterDataGrid').dxDataGrid('instance');
  367. var rows = gridView.getSelectedRowsData();
  368. console.log(rows);
  369. }
  370. function getParametersFromFormula() {
  371. var regex = /\b[A-Z]\b/g;
  372. var match;
  373. // var ps = parameters();
  374. var list = [];
  375. while (match = regex.exec(formulaDataViewModel.Formula())) {
  376. var variable = match[0];
  377. if (_.some(list, function (x) {
  378. return x.ParameterId() === variable;
  379. })) continue;
  380. list.push({
  381. 'ParameterId': ko.observable(variable)
  382. });
  383. }
  384. return list;
  385. }
  386. function formulaValueChangeAction(e) {
  387. var savedParameters = parameters();
  388. var formulaParameters = getParametersFromFormula();
  389. console.log(savedParameters);
  390. console.log(formulaParameters);
  391. _.each(formulaParameters, function (p) {
  392. if (_.some(savedParameters, function (x) {
  393. return x.ParameterId() === p.ParameterId();
  394. })) return;
  395. parameters.push(p);
  396. });
  397. for (var i = 0 ; i < savedParameters.length ; i++) {
  398. var p = savedParameters[i];
  399. if (_.some(formulaParameters, function (x) {
  400. console.log(x.ParameterId() + ' !== ' + p.ParameterId());
  401. return x.ParameterId() === p.ParameterId();
  402. })) {
  403. continue;
  404. }
  405. parameters.splice(i, 1);
  406. i--;
  407. }
  408. }
  409. function saveFormula() {
  410. var formula = formulaDataViewModel.toJS();
  411. if (_.some(parameters(), function (x) {
  412. // 아래 코드에서 오류발생하여 변경
  413. //return _.isUndefined(x.ParameterFacilityCode) || _.isUndefined(x.ParameterFacilityCode());
  414. return _.isUndefined(x.ParameterFacilityCode);
  415. })) {
  416. utils.toast.show('관제점이 할당되지 않은 파라미터가 존재합니다.', 'error');
  417. return;
  418. }
  419. formula.Paramters = _.map(parameters(), function (x) {
  420. x = BWA.DataUtil.convertHybridViewModelToJS(x);
  421. x.SiteId = formula.SiteId;
  422. x.FacilityTypeId = formula.FacilityTypeId;
  423. x.FacilityCode = formula.FacilityCode;
  424. x.FormulaId = formula.FormulaId;
  425. return _.pick(x, 'SiteId', 'FacilityTypeId', 'FacilityCode',
  426. 'FormulaId', 'ParameterId',
  427. 'ParameterFacilityCode', 'ParameterPropertyId');
  428. });
  429. var promise = BWA.api.post('BemsFormula/PostBemsFormula', formula);
  430. promise.done(function () {
  431. utils.toast.show($G('successDatabaseProcessMsg'));
  432. });
  433. }
  434. FNameForSearch("");
  435. PNameForSearch("");
  436. var searchViewOptions = {
  437. searchViewItems: [
  438. { id: 'CmFacility/Name', value: FNameForSearch },
  439. { id: 'Name', value: PNameForSearch },
  440. ],
  441. promiseDataInSearchView: deferredForSearch.promise()
  442. };
  443. viewModel = {
  444. // viewShown: handleViewShown,
  445. refreshList: refreshList,
  446. saveFormula: saveFormula,
  447. pointDataGridOptions: pointDataGridOptions,
  448. parameterDataGridOptions: parameterDataGridOptions,
  449. tableDataGridOptions: tableDataGridOptions,
  450. formulaDataViewModel: formulaDataViewModel,
  451. formulaValueChangeAction: formulaValueChangeAction,
  452. hanleRemoveSelectedParameter: hanleRemoveSelectedParameter,
  453. // hcLee 2016 01 15 확장
  454. viewShowing: handleViewShowing,
  455. };
  456. formulaPointPopup = viewModel.formulaPointPopup = BWA.Popup.FormulaPointPopup.create(viewModel);
  457. // hcLee 2016 01 15 확장
  458. //return $.extend(BWA.CommonView.create(params, viewInfo, viewModel.options, null, handleViewShown), viewModel);
  459. return $.extend(BWA.CommonView.create(params, viewInfo, searchViewOptions, ko.observable(null), handleViewShown, null, handleSearchInSearchView), viewModel);
  460. };