bc436ad445409555692abcba7fb27c700667a9dd.svn-base 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. BemsWebApplication.User = function (params, viewInfo) {
  2. 'use strict';
  3. var companyDataSource = BemsWebApplication.db.createDataSource('CmCompany', true, true),
  4. departmentDataSource = BemsWebApplication.db.createDataSource('CmDepartment', true, true),
  5. positionDataSource = BemsWebApplication.db.createDataSource('CmPosition', true, true),
  6. businessFieldDataSource = BemsWebApplication.db.createDataSource('CmBusinessField', true, true, true),
  7. userGroupDataSource = BemsWebApplication.db.createDataSource('CmUserGroup', true);
  8. var CmUserDataSource = BemsWebApplication.db.createDataSource('CmUser');
  9. var UserInfo = ko.observableArray();
  10. var companies = ko.observableArray(),
  11. departments = ko.observableArray(),
  12. positions = ko.observableArray(),
  13. businessFields = ko.observableArray(),
  14. userGroups = ko.observableArray(),
  15. tabIndex = ko.observable(0);
  16. var deferredForSearch = new $.Deferred();
  17. var searchEmploymentTypes = $SearchView.createObservableCodeNamesOfSelectBoxForSearch($G.EmploymentTypeNames),
  18. searchEmploymentStatus = $SearchView.createObservableCodeNamesOfSelectBoxForSearch($G.EmploymentStatusNames),
  19. searchCompanies = ko.observableArray(),
  20. searchDepartments = ko.observableArray(),
  21. employmentTypeForSerach = ko.observable(),
  22. employmentStatusForSerach = ko.observable(),
  23. companyIdForSerach = ko.observable(),
  24. departmentIdForSerach = ko.observable();
  25. var eq = BWA.DataUtil.constructEqualFilter;
  26. var noteq = BWA.DataUtil.constructNotEqualFilter;
  27. // 2016 07 06 hcLee 이 주석이 보인다면 복사 잘못했음, user.js는 센터버젼이 최신임....
  28. function getFilter() {
  29. if (BWA.LoginManager.isCenterLogin()) {
  30. return [['SiteId', '=', 0]];
  31. }
  32. return [
  33. eq('SiteId', BWA.UserInfo.SiteId()),
  34. 'and',
  35. noteq('UserId', 'admin'),
  36. ];
  37. }
  38. function Encrypt(theText) {
  39. var output = new String;
  40. var Temp = new Array();
  41. var Temp2 = new Array();
  42. var TextSize = theText.length;
  43. for (var i = 0; i < TextSize; i++) {
  44. var rnd = Math.round(Math.random() * 122) + 68;
  45. Temp[i] = theText.charCodeAt(i) + rnd;
  46. Temp2[i] = rnd;
  47. }
  48. for (i = 0; i < TextSize; i++) {
  49. output += String.fromCharCode(Temp[i], Temp2[i]);
  50. }
  51. return output;
  52. }
  53. var viewModel = BWA.DataGrid.createViewWithDataGrid(params, viewInfo, 'CmUser', {
  54. dataSourceOptions: {
  55. select: [
  56. 'SiteId', 'CompanyId', 'DepartmentId', 'UserId', 'Name', 'UserGroupId', 'Certificated', 'BusinessFieldId', 'EmploymentType', 'EmploymentStatus',
  57. 'CmPosition/Name', 'CmDepartment/Name', 'CmCompany/Name', 'CmBusinessField/Name', 'CmUserGroup/Name', 'IsScheduleUser', 'IsSI', 'IsMobile'
  58. ],
  59. expand: ['CmPosition', 'CmDepartment', 'CmCompany', 'CmBusinessField', 'CmUserGroup'],
  60. //filter: getFilter(), // 2016 07 06 hcLee 이 주석이 보인다면 복사 잘못했음, user.js는 센터버젼이 최신임....
  61. filter: [
  62. //['UserId', '<>', 'admin']
  63. eq('SiteId', BWA.UserInfo.SiteId()),
  64. 'and',
  65. noteq('UserId', 'admin'),
  66. ],
  67. extendOptions: {
  68. forceOriginalField: true
  69. }
  70. },
  71. /*"export": {
  72. enabled: true,
  73. fileName: "사용자정보관리"
  74. },*/
  75. columns: [
  76. { caption: $G('number'), width: '10%', alignment: 'center' },
  77. { dataField: 'UserId', caption: $G('userId'), width: '15%', alignment: 'center' },
  78. { dataField: 'Name', caption: $G('userName'), width: '15%', alignment: 'center' },
  79. {
  80. dataField: 'CmUserGroup/Name', caption: $G('permissionGroupName'), width: '15%', alignment: 'center',
  81. //customizeText: function(cellInfo) {
  82. // return $Name($G.EmploymentTypeNames, cellInfo.value);
  83. //}
  84. },
  85. {
  86. dataField: 'EmploymentStatus', caption: $G('employmentStatus'), width: '15%', alignment: 'center',
  87. customizeText: function (cellInfo) {
  88. return $Name($G.EmploymentStatusNames, cellInfo.value);
  89. }
  90. },
  91. { dataField: 'CmCompany/Name', caption: $G('companyName'), width: '15%', alignment: 'center' },
  92. { dataField: 'CmDepartment/Name', caption: $G('departmentName'), width: '15%', alignment: 'center' }
  93. // { caption: $G( 'affiliation' ), width: '15%', alignment: 'center' }
  94. ],
  95. // 2019.04.17 엑셀 출력 기능 추가 ~~~
  96. "export": {
  97. enabled: true,
  98. fileName: '사용자 목록'
  99. },
  100. onExporting: function (e) {
  101. e.component.columnOption($G('number'), "visible", false);
  102. },
  103. onExported: function (e) {
  104. e.component.columnOption($G('number'), "visible", true);
  105. },
  106. // ~~~ 2019.04.17 엑셀 출력 기능 추가
  107. //cellPrepared: function( cellElement, cellInfo ) {
  108. // if( cellInfo.columnIndex == 5 ) {
  109. // //cellInfo.value = cellInfo.displayValue = cellInfo.rowIndex + 1;
  110. // //cellInfo.text = cellInfo.rowIndex + 1;
  111. // $( cellElement ).text( cellInfo.data.CmCompany_Name() + ' / ' + cellInfo.data.CmDepartment_Name() );
  112. // }
  113. //},
  114. promiseDataInSearchView: deferredForSearch.promise(),
  115. searchViewItems: [
  116. { id: 'EmploymentType', ignoreValue: 0, defaultValue: 0, value: employmentTypeForSerach, dataSource: searchEmploymentTypes },
  117. { id: 'EmploymentStatus', ignoreValue: 0, defaultValue: 1, value: employmentStatusForSerach, dataSource: searchEmploymentStatus, isChecked: true, },
  118. { id: 'CompanyId', ignoreValue: 0, defaultValue: 0, dataSource: searchCompanies, value: companyIdForSerach, handleChangedValue: handleCompanyChangedValueInSearchView, entityForCheckingUse: 'CmCompany' },
  119. { id: 'DepartmentId', ignoreValue: 0, defaultValue: 0, withCheckId: 'CompanyId', value: departmentIdForSerach, dataSource: searchDepartments, entityForCheckingUse: 'CmDepartment' },
  120. { id: 'Name' }],
  121. popupWidth: 720,
  122. // hcLee 2016 04 14
  123. handlePopupButtonEdit: function (dataModel) {
  124. $("#enddate").dxDateBox({ min: dataModel.StartDate });
  125. },
  126. handleViewShown: function () {
  127. /*
  128. var dataGrid = $("#gridContainer").dxDataGrid("instance");
  129. dataGrid.option({
  130. "export": {
  131. enabled: true,
  132. fileName: "사용자정보관리"
  133. },
  134. });*/
  135. //searchViewItems.EmploymentStatus.check(true);
  136. businessFieldDataSource.load().done(function (dbBusinessFields) {
  137. businessFields(dbBusinessFields);
  138. });
  139. userGroupDataSource.load().done(function (dbUserGroups) {
  140. userGroups(dbUserGroups);
  141. });
  142. companyDataSource.load().done(function (dbCompanies) {
  143. companies(dbCompanies);
  144. searchCompanies($SearchView.createArrayOfSelectBox('CompanyId', dbCompanies));
  145. departments([]);
  146. searchDepartments(getDefaultDepartmentsForSearch());
  147. deferredForSearch.resolve();
  148. //BemsWebApplication.app.currentViewInfo.model.handleSearchInSearchView(); // 2016 09 28
  149. });
  150. $("#gridContainer").dxDataGrid({
  151. paging: {
  152. pageSize: 18,
  153. enabled: true
  154. }
  155. });
  156. },
  157. handleAfterLoadingModelByKey: function (data, dataViewModel, isNewInPopup) {
  158. if (!isNewInPopup()) {
  159. BWA.DataUtil.setArrayDataSourceFilter(departmentDataSource, 'CompanyId', dataViewModel.CompanyId(), departments);
  160. }
  161. else {
  162. }
  163. },
  164. /*
  165. beforeUpdateDataViewModel: function () {
  166. var keys = BWA.db.extractKeysObject('CmUser', viewModel.dataModel);
  167. BWA.db.CmUser.update(keys, viewModel.dataModel.toJS()).done(function (response, responseKey) {
  168. //if (popup && popup.handleAfterSave) {
  169. // popup.handleAfterSave(response, responseKey);
  170. //}
  171. });
  172. return 1;
  173. }, */
  174. afterUpdateDataViewModel: function (data) {
  175. if (data.EmploymentStatus() != 1) {
  176. var user = new BemsWebApplication['CmUserViewModel']();
  177. user.SiteId = data.SiteId();
  178. user.UserId = data.UserId();
  179. var promise = BemsWebApplication.api.post('BemsMonitoringPoint/RemovePatrolGroupUser', user);
  180. promise.done(function (r) {
  181. if (r > 0)
  182. utils.toast.show('데이터 수정 작업이 성공하였습니다. (휴직이나 퇴직으로 변경되어 ( ' + r + ') 건이 순찰조에서 자동으로 삭제 되었습니다)');
  183. });
  184. }
  185. },
  186. // 2016 09 28 hcLee 사용자의 상태가 휴직이나 퇴직이되는 경우 순찰조에서 삭제한다
  187. /*
  188. handleSaveButtonInPopup: function (isInsert) {
  189. if (isInsert === false) {
  190. var user = new BemsWebApplication['CmUserViewModel']();
  191. if (viewModel.dataModel.EmploymentStatus() != 1) {
  192. //var dataViewModel = new BemsWebApplication['CmUser']();
  193. //utils.toast.show('휴직이나 퇴직으로 변경된 사용자는 순찰조에서 자동으로 삭제 됩니다', 'error');
  194. DevExpress.ui.dialog.confirm($G('deleteConfirmMsg'), "삭제").then(function (result) {
  195. if (result) {
  196. //handleConfirmDelete();
  197. user.SiteId = viewModel.dataModel.SiteId();
  198. user.UserId = viewModel.dataModel.UserId();
  199. var promise = BemsWebApplication.api.post('BemsMonitoringPoint/RemovePatrolGroupUser', user); 사
  200. promise.done(function () {
  201. ;
  202. });
  203. }
  204. });
  205. }
  206. }
  207. },*/
  208. handleDataGridRowClick: function (id, dataGrid, clickRow, popupVisible) {
  209. dataGrid.clearSelection();
  210. viewModel.isNewInPopup(false);
  211. var data = clickRow.data;
  212. var dataModel = viewModel.dataModel;
  213. dataModel.CompanyName = $KoSet(dataModel.CompanyName, data['CmCompany/Name']);
  214. dataModel.DepartmentName = $KoSet(dataModel.DepartmentName, data['CmDepartment/Name']);
  215. dataModel.BusinessFieldName = $KoSet(dataModel.BusinessFieldName, data['CmBusinessField/Name']);
  216. dataModel.UserGroupName = $KoSet(dataModel.UserGroupName, data['CmUserGroup/Name']);
  217. dataModel.IsScheduleUser = $KoSet(dataModel.IsScheduleUser, data.IsScheduleUser());
  218. dataModel.IsSI = $KoSet(dataModel.IsSI, data.IsSI());
  219. dataModel.IsMobile = $KoSet(dataModel.IsMobile, data.IsMobile());
  220. popupVisible(true);
  221. },
  222. handlePopupShowing: function (that) {
  223. positionDataSource.load().done(function (result) {
  224. positions(result);
  225. });
  226. CmUserDataSource.filter([
  227. ["SiteId", "=", BWA.UserInfo.SiteId()]
  228. ]);
  229. CmUserDataSource.load().done(function (result) {
  230. UserInfo(result);
  231. });
  232. },
  233. // hcLee 2015 12 23
  234. beforeInsertingDataViewModel: function (dataModel, dbModelId) {
  235. var dfd = $.Deferred();
  236. //alert(dataModel.Name());
  237. var isDuplicated = false;
  238. for (var i = 0; i < UserInfo().length; i++) {
  239. if (dataModel.UserId() == UserInfo()[i].UserId()) {
  240. isDuplicated = true;
  241. break;
  242. }
  243. }
  244. if (dataModel.UserId() == null || dataModel.Name() == null || dataModel.Passwd() == null ||
  245. dataModel.CompanyId() == null || dataModel.DepartmentId() == null || dataModel.PositionId() == null || dataModel.BusinessFieldId() == null || dataModel.UserGroupId() == null)
  246. dfd.resolve(false, '(*) 표시 항목은 필수 입력 사항 입니다!');
  247. if (!BWA.DataUtil.isValidInputValue(viewModel.dataModel.UserId()))
  248. dfd.resolve(false, '아이디에 공백이 포함되어있습니다. (앞뒤공백 허용안함)');
  249. if (isDuplicated)
  250. return dfd.resolve(false, '이미 동일 아이디가 존재합니다.');
  251. else
  252. return dfd.resolve(true);
  253. if (!chekPassword())
  254. return dfd.resolve(false);
  255. },
  256. beforeUpdateDataViewModel: function () {
  257. //handlePopupButtonSave: function () {
  258. if (_.isEmpty(viewModel.dataModel.UserId()) || _.isEmpty(viewModel.dataModel.Name()) || _.isEmpty(viewModel.dataModel.Passwd()) ||
  259. viewModel.dataModel.CompanyId() == null || viewModel.dataModel.DepartmentId() == null || viewModel.dataModel.PositionId() == null ||
  260. viewModel.dataModel.BusinessFieldId() == null || viewModel.dataModel.UserGroupId() == null) {
  261. utils.toast.show('(*) 표시 항목은 필수 입력 사항 입니다.', 'error');
  262. return 0;
  263. }
  264. if (!BWA.DataUtil.isValidInputValue(viewModel.dataModel.UserId()))
  265. utils.toast.show(false, '아이디에 공백이 포함되어있습니다. (앞뒤공백 허용안함)', 'error');
  266. if (chekPassword())
  267. return 2;
  268. else
  269. return 0;
  270. }
  271. });
  272. function chekPassword() {
  273. var mbrId = viewModel.dataModel.UserId(); // id 값 입력
  274. var mbrPwd = viewModel.dataModel.Passwd(); // pw 입력
  275. var check1 = /^(?=.*[a-zA-Z])(?=.*[0-9]).{10,20}$/.test(mbrPwd); //영문,숫자
  276. var check2 = /^(?=.*[a-zA-Z])(?=.*[^a-zA-Z0-9]).{10,20}$/.test(mbrPwd); //영문,특수문자
  277. var check3 = /^(?=.*[^a-zA-Z0-9])(?=.*[0-9]).{10,20}$/.test(mbrPwd); //특수문자, 숫자
  278. if (!(check1 || check2 || check3)) {
  279. utils.toast.show('비밀번호는 10자~20자리의 영문+숫자+특수문자 중 2종류 이상을 조합하여 사용할 수 있습니다.', 'error');
  280. return false;
  281. }
  282. if (mbrPwd.search(mbrId) > -1) {
  283. utils.toast.show('비밀번호에 아이디가 포함되었습니다.', 'error');
  284. return false;
  285. }
  286. viewModel.dataModel.Passwd(Encrypt(viewModel.dataModel.Passwd()));
  287. return true;
  288. }
  289. function getDefaultDepartmentsForSearch() {
  290. return $SearchView.createDefaultArray('DepartmentId');
  291. }
  292. function handleCompanyChangedValueInSearchView(e) {
  293. if (e.value === 0) {
  294. searchDepartments(getDefaultDepartmentsForSearch());
  295. }
  296. else {
  297. BWA.DataUtil.setArrayDataSourceFilter(departmentDataSource, 'CompanyId', e.value, searchDepartments, getDefaultDepartmentsForSearch());
  298. }
  299. departmentIdForSerach(0);
  300. }
  301. viewModel.handleSelectBoxChangeCompanyInPopup = function (e) {
  302. BWA.DataUtil.setArrayDataSourceFilter(departmentDataSource, 'CompanyId', e.value, departments);
  303. viewModel.dataModel.DepartmentId(null);
  304. }
  305. viewModel.companyDataSource = companies;
  306. viewModel.departmentDataSource = departments;
  307. viewModel.positionDataSource = positions;
  308. viewModel.businessFieldDataSource = businessFields;
  309. viewModel.userGroupDataSource = userGroups;
  310. viewModel.employmentTypeNames = $G.EmploymentTypeNames;
  311. viewModel.employmentStatusNames = $G.EmploymentStatusNames;
  312. viewModel.userLicensePopup = BWA.Popup.UserLicense.create(viewModel, params);
  313. // 2016 02 18 hcLee 등록팝업 최초 수행후 안보이는 현상 해결
  314. viewModel.dataModel.CompanyName = ko.observable();
  315. viewModel.dataModel.DepartmentName = ko.observable();
  316. viewModel.dataModel.BusinessFieldName = ko.observable();
  317. viewModel.dataModel.UserGroupName = ko.observable();
  318. //$SearchView.searchViewItems.EmploymentStatus.check(true);
  319. //viewModel.searchViewItems.EmploymentStatus.check(true);
  320. //viewModel.handleSearchInSearchView = handleSearchInSearchView;
  321. return viewModel;
  322. };