2b23c68be348a3204858b51aee74509c9fb79e1f.svn-base 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486
  1. BemsWebApplication.WorkApproval = function (params, viewInfo) {
  2. "use strict";
  3. //권한설정
  4. var hasnotModificationPermission = ko.observable(true);
  5. var useBusinessFiltering = BWA.UserInfo.isDependBusinessField(viewInfo.viewName);
  6. var businessFieldDataSource = BemsWebApplication.db.createDataSource('CmBusinessField', true, true, true),
  7. workTypeDataSource = BemsWebApplication.db.createDataSource('FmsWorkCodeType'),
  8. progressDataSource = BemsWebApplication.db.createDataSource('FmsWorkCodeProgress'),
  9. businessFields = ko.observableArray(),
  10. workTypes = ko.observableArray(),
  11. ExdataSource = ko.observableArray(),
  12. progresses = ko.observableArray();
  13. var isAddHistoryButton = ko.observable(false);
  14. var isWorkDone = ko.observable(true);
  15. var isEditHistoryButton = ko.observable(false);
  16. var isVisibleExecutionButton = ko.observable(true);
  17. var isVisibleApproalButton = ko.observable(true);
  18. var popup, addWorkResultCheckItemPopup, confirmDueDatePopup = null;
  19. var workResultCheckItemMaterialPopup = null;
  20. var WorkResultCheckItemFacilityPopup = null;
  21. //var workApprovalMaterialPopup = null;
  22. //workExecutionRegisterPopup
  23. var FmsMaterialExdataSource = new DevExpress.data.DataSource({
  24. store: BemsWebApplication.odata.FmsMaterialEx,
  25. requireTotalCount: true,
  26. pageSize: 10000
  27. });
  28. FmsMaterialExdataSource.filter([
  29. ["SiteId", "=", BWA.UserInfo.SiteId()]
  30. ]);
  31. // hcLee 2018 01 29 -->
  32. var imagefileUrl1 = ko.observable(),
  33. imagefileUrl2 = ko.observable(),
  34. dropZone1 = null,
  35. dropZone2 = null,
  36. uploadedFileInfo = {},
  37. uploadedFileInfo2 = {};
  38. // <-- hcLee 2018 01 29
  39. var deferredForSearch = new $.Deferred();
  40. var workTypesForSearch = ko.observableArray(), businessFieldsForSearch = ko.observableArray(), progressesForSearch = ko.observableArray();
  41. var eq = BWA.DataUtil.constructEqualFilter, and = BWA.DataUtil.andFilter, noteq = BWA.DataUtil.constructNotEqualFilter;
  42. var selectedFacilityData = ko.observable(), selectedUserData = params.selectedUserData || ko.observable();
  43. var dataSourceOptions = {
  44. select: [
  45. 'SiteId', 'WorkRequestId',
  46. 'StartDate', 'EndDate',
  47. 'ConfirmedDate', 'ConfirmedUserId', 'IsConfirmed',
  48. 'CauseClassId', 'Content',
  49. 'FmsWorkRequest/WorkTypeId',
  50. 'FmsWorkOrder/Title',
  51. 'FmsWorkOrder/OrderDate',
  52. 'FmsWorkRequest/WorkProgressId',
  53. 'CmUser/Name', // 작업자
  54. 'CmUser1/Name', // 승인자
  55. 'FmsWorkRequest/FmsWorkCodeType/Name',
  56. 'FmsWorkRequest/CmBusinessField/Name',
  57. 'FmsWorkRequest/FmsWorkCodeProgress/Name',
  58. 'FmsWorkRequest/BusinessFieldId',
  59. 'FmsWorkOrder/Content',
  60. 'FmsWorkRequest/Content',
  61. 'FmsWorkRequest/StartWorkDate',
  62. 'ConfirmDesc',
  63. ],
  64. expand: [
  65. 'FmsWorkRequest',
  66. 'FmsWorkOrder',
  67. 'FmsWorkRequest/FmsWorkCodeType',
  68. 'FmsWorkRequest/CmBusinessField',
  69. 'FmsWorkRequest/FmsWorkCodeProgress',
  70. 'FmsWorkOrder/CmBusinessField', 'CmUser', 'CmUser1'],
  71. extendOptions: {
  72. forceOriginalField: true
  73. }
  74. };
  75. if (!useBusinessFiltering) {
  76. dataSourceOptions.filter = [
  77. eq('SiteId', BWA.UserInfo.SiteId()),
  78. and,
  79. ['FmsWorkRequest/WorkProgressId', '=', 5],
  80. ];
  81. }
  82. else {
  83. dataSourceOptions.filter = [
  84. eq('SiteId', BWA.UserInfo.SiteId()),
  85. and,
  86. ['FmsWorkRequest/WorkProgressId', '=', 5],
  87. and,
  88. [eq('FmsWorkRequest/BusinessFieldId', BWA.UserInfo.BusinessFieldId()), 'or', eq('FmsWorkRequest/BusinessFieldId', 1)]];
  89. }
  90. var viewModel = BWA.DataGrid.createViewWithDataGrid(params, viewInfo, 'FmsWorkResult', {
  91. popupWidth: 890,
  92. dataSourceOptions: dataSourceOptions,
  93. columns: [
  94. { dataField: 'WorkRequestId', caption: $G('number'), width: '8%', alignment: 'center' },
  95. { dataField: 'FmsWorkRequest/CmBusinessField/Name', caption: $G('businessFieldName'), width: '10%', alignment: 'center' },
  96. { dataField: 'FmsWorkRequest/FmsWorkCodeType/Name', caption: $G('workTypeName'), width: '10%', alignment: 'center' },
  97. {
  98. dataField: 'FmsWorkOrder/OrderDate', caption: $G('orderedDate'), width: '12%', alignment: 'center', sortOrder: 'desc', visible: false,
  99. customizeText: function (cellInfo) {
  100. return $G.date(cellInfo.value);
  101. }
  102. },
  103. {
  104. dataField: 'StartDate', caption: $G('startDate'), width: '12%', alignment: 'center',
  105. customizeText: function (cellInfo) {
  106. return $G.date(cellInfo.value);
  107. }
  108. },
  109. {
  110. dataField: 'EndDate', caption: '종료일', width: '12%', alignment: 'center',
  111. customizeText: function (cellInfo) {
  112. return $G.date(cellInfo.value);
  113. }
  114. },
  115. { dataField: 'FmsWorkOrder/Title', caption: '작업명', width: '35%', alignment: 'center' },
  116. { dataField: 'FmsWorkRequest/FmsWorkCodeProgress/Name', caption: $G('workProgressName'), width: '10%', alignment: 'center' },
  117. { dataField: 'CmUser/Name', caption: '작업자', width: '15%', alignment: 'center' },
  118. { dataField: 'CmUser1/Name', caption: '승인자', width: '15%', alignment: 'center', visible: false },
  119. { dataField: 'FmsWorkRequest/Content', caption: '신청내용', width: '0%', alignment: 'center' },
  120. ],
  121. promiseDataInSearchView: deferredForSearch.promise(),
  122. searchViewItems: _.compact([
  123. { id: 'FmsWorkRequest/BusinessFieldId', ignoreValue: 0, defaultValue: 0, dataSource: businessFieldsForSearch },
  124. //{ id: 'WorkTypeId', ignoreValue: 0, defaultValue: 0, dataSource: workTypesForSearch },
  125. { id: 'CmUser/Name' },
  126. { id: 'CmUser1/Name' },
  127. { id: 'FmsWorkOrder/Title' },
  128. //{ id: 'FmsWorkRequest/WorkProgressId', ignoreValue: 0, defaultValue: 0, dataSource: progressesForSearch }, 2016 02 26
  129. { id: 'StartDate', type: 'dateRange', isOnlyDate: true },
  130. { id: 'EndDate', type: 'dateRange', isOnlyDate: true }
  131. ]),
  132. getAddedToolbarItemsInPopup: function (e) {
  133. var isEditModeInPopup = e.isEditModeInPopup;
  134. //var isVisibleApproalButton = e.dataViewModel.IsConfirmed;
  135. return [
  136. {
  137. location: 'after', widget: 'button', options: {
  138. text: '승인', icon: 'add', type: 'success', visible: isVisibleApproalButton, clickAction: showConfirmDueDate, disabled: hasnotModificationPermission
  139. }
  140. },
  141. //{
  142. // location: 'after', widget: 'button', options: {
  143. // text: '작업이력수정', icon: 'save',
  144. // clickAction: function () {
  145. // if (popup && popup.modifyWorkItem) {
  146. // popup.modifyWorkItem();
  147. // }
  148. // }
  149. // }
  150. //},
  151. //{
  152. // location: 'after', widget: 'button', options: {
  153. // text: $G('facilityInsertion'), icon: 'search', visible: isEditModeInPopup,
  154. // clickAction: function () {
  155. // popup.facilitySearchPopup.show();
  156. // }
  157. // }
  158. //},
  159. //{
  160. // location: 'after', widget: 'button', options: {
  161. // text: $G('facilityDeletion'), icon: 'remove', type: 'danger', visible: isEditModeInPopup,
  162. // clickAction: function () {
  163. // if (popup && popup.handleDeleteSelectedFacilities) {
  164. // popup.handleDeleteSelectedFacilities();
  165. // }
  166. // }
  167. // }
  168. //}
  169. ];
  170. },
  171. beforeInsertingDataViewModel: function (dataModel) {
  172. return true;
  173. },
  174. handleDataGridRowClick: function (id, dataGrid, clickRow, popupVisible) {
  175. dataGrid.clearSelection();
  176. var data = clickRow.data;
  177. var dataModel = viewModel.dataModel;
  178. dataModel.WorkTypeId(data['FmsWorkRequest/WorkTypeId']());
  179. viewModel.dataModel.BusinessFieldId = ko.observable();
  180. viewModel.dataModel.BusinessFieldId(data['FmsWorkRequest/BusinessFieldId']());
  181. if (data.IsConfirmed()) {
  182. isVisibleApproalButton(false);
  183. }
  184. else {
  185. isVisibleApproalButton(true);
  186. }
  187. if (popup && popup.handleBeforeShowingPopupForEdit) {
  188. //hcLee 2015 12 29
  189. popup.IsConfirmJob(true);
  190. popup.handleBeforeShowingPopupForEdit(data, dataModel);//추가
  191. }
  192. popupVisible(true);
  193. workResultCheckItemMaterialPopup.visible(true);
  194. //workApprovalMaterialPopup.visible(true);
  195. },
  196. handleBeforePopupShowingPromise: function () {
  197. if (popup && popup.handleBeforePopupShowingPromise) {
  198. popup.handleBeforePopupShowingPromise.apply(popup, arguments);
  199. }
  200. },
  201. handleAfterLoadingModelByKey: function () {
  202. if (popup && popup.handleAfterLoadingModelByKey) {
  203. popup.handleAfterLoadingModelByKey.apply(popup, arguments);
  204. }
  205. },
  206. handlePopupShowing: function () {
  207. if (popup && popup.handlePopupShowing) {
  208. popup.handlePopupShowing.apply(this, arguments);
  209. }
  210. },
  211. handlePopupShown: function (editMode, isNewInPopup, dataModel) {
  212. if (popup && popup.handlePopupShown) {
  213. popup.handlePopupShown.apply(this, arguments);
  214. }
  215. },
  216. handleSaveButtonInPopup: function (isInsert) {
  217. if (isInsert === false) {
  218. if (popup && popup.handleAfterSave) {
  219. popup.handleAfterSave(undefined);
  220. }
  221. }
  222. },
  223. handleAfterSaveInPopup: function (responseKey, response) {
  224. if (popup && popup.handleAfterSave) {
  225. popup.handleAfterSave(responseKey, response);
  226. var commonParameters = {
  227. SiteId: dataModel.SiteId(),
  228. WorkRequestId: dataModel.WorkRequestId()
  229. };
  230. BWA.api.post('WorkScheduleRun', null, commonParameters);
  231. }
  232. },
  233. handleViewShowing: function (dataModel) {
  234. //권한설정
  235. hasnotModificationPermission(!BWA.UserInfo.hasPermissionOfModification(viewInfo.viewName));
  236. FmsMaterialExdataSource.load().done(function (result) {
  237. if (result != null) {
  238. viewModel.dataModel.MaterialExdataSource(result);
  239. }
  240. }).fail(function (error) {
  241. utils.toast.show(error);
  242. });
  243. var useBusinessFiltering = BWA.UserInfo.isDependBusinessField(viewInfo.viewName)
  244. if (useBusinessFiltering) {
  245. dataSourceOptions.filter.push('and');
  246. dataSourceOptions.filter.push([eq('FmsWorkRequest/BusinessFieldId', BWA.UserInfo.BusinessFieldId()), 'or', eq('FmsWorkRequest/BusinessFieldId', 1)]);
  247. businessFieldDataSource.filter([
  248. eq('SiteId', BWA.UserInfo.SiteId()),
  249. and,
  250. [eq('BusinessFieldId', BWA.UserInfo.BusinessFieldId()), 'or', eq('BusinessFieldId', 1)]
  251. ]);
  252. }
  253. $.when(
  254. businessFieldDataSource.load(),
  255. workTypeDataSource.load(),
  256. progressDataSource.load()
  257. ).done(function (businessFieldResult, workTypeResult, progressResult) {
  258. businessFields(businessFieldResult[0]);
  259. workTypes(workTypeResult[0]);
  260. progresses(progressResult[0]);
  261. businessFieldsForSearch($SearchView.createArrayOfSelectBox('BusinessFieldId', businessFields()));
  262. workTypesForSearch($SearchView.createArrayOfSelectBox('WorkTypeId', workTypes()));
  263. progressesForSearch($SearchView.createArrayOfSelectBox('ProgressId', progresses()));
  264. deferredForSearch.resolve();
  265. });
  266. },
  267. handleViewShown: function () {
  268. setupDropZone(addWorkResultCheckItemPopup.isEditMode, addWorkResultCheckItemPopup.workCheckItemViewModel);
  269. },
  270. hasnotModificationPermission: hasnotModificationPermission //권한설정
  271. });
  272. viewModel.isEditHistoryButton = isEditHistoryButton;
  273. viewModel.isAddHistoryButton = isAddHistoryButton;
  274. viewModel.isWorkDone = isWorkDone;
  275. viewModel.dataModel.MaterialExdataSource = ko.observable();
  276. viewModel.businessFields = businessFields;
  277. viewModel.workTypes = workTypes;
  278. viewModel.dataModel.WorkTypeId = ko.observable();
  279. viewModel.dataModel.ConfirmDueDate = ko.observable();
  280. viewModel.dataModel.IsConfirmDueDate = ko.observable(false);
  281. viewModel.isAddPopup = ko.observable(false);
  282. viewModel.isApprovalMode = ko.observable(true);
  283. viewModel.isWorkHistory = ko.observable(false);
  284. // hcLee 2018 01 29 -->
  285. viewModel.imagefileUrl1 = imagefileUrl1;
  286. viewModel.imagefileUrl2 = imagefileUrl2;
  287. // <-- hcLee 2018 01 29
  288. popup = viewModel.popup = BWA.Popup.CurrentWork.create(viewInfo, viewModel);
  289. addWorkResultCheckItemPopup = viewModel.addWorkResultCheckItemPopup = BWA.Popup.AddWorkResultCheckItem.create(viewInfo, viewModel, popup.refreshListData);
  290. confirmDueDatePopup = viewModel.confirmDueDatePopup = BWA.Popup.ConfirmDueDate.create(viewModel);
  291. workResultCheckItemMaterialPopup = viewModel.workResultCheckItemMaterialPopup = BWA.Popup.WorkResultCheckItemMaterial.create(viewInfo, viewModel);
  292. WorkResultCheckItemFacilityPopup = viewModel.WorkResultCheckItemFacilityPopup = BWA.Popup.WorkResultCheckItemFacility.create(viewInfo, viewModel);
  293. //workApprovalMaterialPopup = viewModel.workApprovalMaterialPopup = BWA.Popup.WorkApprovalMaterial.create(viewInfo, viewModel);
  294. //workExecutionRegisterPopup = viewModel.workExecutionRegisterPopup = BWA.Popup.WorkExecutionRegister.create(viewInfo, viewModel);
  295. function showConfirmDueDate() {
  296. // 정기검사/법정검사 인 경우 작업확정일자 선택 팝업 띄움
  297. if (viewModel.dataModel.WorkTypeId() <= $Code.WorkType.LEGAL_CHECK) {
  298. confirmDueDatePopup.show();
  299. }
  300. else { // 그 외 작업인 경우 바로 승인 실행
  301. approvalWorkResult();
  302. }
  303. }
  304. viewModel.popupOptions.position = { offset: '-200 0' };
  305. viewModel.popupOptions.height = '930px';
  306. // 작업확정일자 팝업 Visible Subscription...
  307. confirmDueDatePopup.popupVisible.subscribe(function (value) {
  308. if (value === true) {
  309. confirmDueDatePopup.handlePopupShown();
  310. }
  311. else {
  312. if (viewModel.dataModel.IsConfirmDueDate()) {
  313. approvalWorkResult();
  314. }
  315. }
  316. });
  317. function approvalWorkResult() {
  318. viewModel.dataModel.ConfirmedDate(new Date());
  319. viewModel.dataModel.IsConfirmed(true);
  320. viewModel.dataModel.ConfirmedUserId(BWA.UserInfo.UserId());
  321. // hcLee 여기서 작업마감일 업데이트가 필요하다? 일단 여기다 추가
  322. //viewModel.dataModel.EndDate(new Date());
  323. var keys = BWA.db.extractKeysObject('FmsWorkResult', viewModel.dataModel);
  324. BWA.db.FmsWorkResult.update(keys, viewModel.dataModel.toJS()).done(function (res) {
  325. var OrderContent = viewModel.dataModel.OrderContent();
  326. var RequestContent = viewModel.dataModel.RequestContent();
  327. var FmsWorkOrderkeys = BWA.db.extractKeysObject('FmsWorkOrder', viewModel.dataModel);
  328. var FmsWorkRequestkeys = BWA.db.extractKeysObject('FmsWorkRequest', viewModel.dataModel);
  329. BWA.db.FmsWorkOrder.update(FmsWorkOrderkeys, { Content: OrderContent }).done(function () {
  330. BWA.db.FmsWorkRequest.update(FmsWorkRequestkeys, { Content: RequestContent }).done(function () {
  331. var parameters = {
  332. SiteId: viewModel.dataModel.SiteId(),
  333. WorkRequestId: viewModel.dataModel.WorkRequestId(),
  334. WorkProgressId: $Code.WorkProgress.WORK_CONFIRM,
  335. IsConfirmDueDate: viewModel.dataModel.IsConfirmDueDate(),
  336. ConfirmDueDate: $G.date(viewModel.dataModel.ConfirmDueDate()),
  337. UserId: BWA.UserInfo.UserId(),
  338. };
  339. // FmsWorkRequest 업데이트: WorkProgressId(6)
  340. BWA.api.post('FmsWorkRequest', null, parameters).done(function () {
  341. var cP = {
  342. SiteId: 1,
  343. //WorkRequestId: dataModel.WorkRequestId()
  344. };
  345. BWA.api.post('WorkScheduleRun', null, cP).done(function () {
  346. // 자재 테이블 업데이트 필요, 작업 승인 , API 에서 처리 완료
  347. utils.toast.show($G('successDatabaseUpdateMsg'));
  348. viewModel.popupOptions.visible(false);
  349. viewModel.gridView().refresh();
  350. });
  351. });
  352. });
  353. });
  354. });
  355. }
  356. ///////////////////////2019-11-25 변경
  357. function setupDropZone(isEditModeInPopup, dataViewModel) {
  358. var timer = null;
  359. isEditModeInPopup.subscribe(function (value) {
  360. if (value) {
  361. if (timer) { clearInterval(timer); }
  362. timer = setInterval(function () {
  363. if ($('#workcheckitemDropZone1').length) {
  364. if (_.isNull(dropZone1)) {
  365. dropZone1 = BWA.DropZone.create({
  366. id: '#workcheckitemDropZone1',
  367. categoryId: $Code.FileCategory.WORK,
  368. uploadedFileInfo: uploadedFileInfo,
  369. handleRemoveBeforePromise: function () {
  370. var keys = BWA.db.extractKeysObject('FmsWorkResultCheckItem', dataViewModel);
  371. return BWA.db.FmsWorkResultCheckItem.update(keys, { FileId1: null });
  372. },
  373. handleSuccess: function (fileInfo) {
  374. if (uploadedFileInfo.FileId) {
  375. dataViewModel.FileId1(fileInfo.FileId);
  376. var keys = BWA.db.extractKeysObject('FmsWorkResultCheckItem', dataViewModel);
  377. if (keys.CheckItemId != null) {
  378. return BWA.db.FmsWorkResultCheckItem.update(keys, { FileId1: fileInfo.FileId })
  379. .done(function (res) {
  380. popup.refreshListData();
  381. });
  382. }
  383. }
  384. },
  385. handleRemovedFile: function () {
  386. dataViewModel.FileId1(null);
  387. },
  388. });
  389. viewModel.dropZone1 = dropZone1;
  390. }
  391. }
  392. if ($('#workcheckitemDropZone2').length) {
  393. if (_.isNull(dropZone2)) {
  394. dropZone2 = BWA.DropZone.create({
  395. id: '#workcheckitemDropZone2',
  396. categoryId: $Code.FileCategory.WORK,
  397. uploadedFileInfo: uploadedFileInfo2,
  398. handleRemoveBeforePromise: function () {
  399. var keys = BWA.db.extractKeysObject('FmsWorkResultCheckItem', dataViewModel);
  400. return BWA.db.FmsWorkResultCheckItem.update(keys, { FileId2: null });
  401. },
  402. handleSuccess: function (fileInfo) {
  403. if (uploadedFileInfo.FileId) {
  404. dataViewModel.FileId2(fileInfo.FileId);
  405. var keys = BWA.db.extractKeysObject('FmsWorkResultCheckItem', dataViewModel);
  406. if (keys.CheckItemId != null) {
  407. return BWA.db.FmsWorkResultCheckItem.update(keys, { FileId2: fileInfo.FileId })
  408. .done(function (res) {
  409. popup.refreshListData();
  410. });
  411. }
  412. }
  413. },
  414. handleRemovedFile: function () {
  415. dataViewModel.FileId2(null);
  416. },
  417. });
  418. viewModel.dropZone2 = dropZone2;
  419. }
  420. }
  421. }, 100);
  422. }
  423. else {
  424. if (timer) {
  425. clearInterval(timer);
  426. timer = null;
  427. }
  428. dropZone1 = null;
  429. dropZone2 = null;
  430. }
  431. });
  432. }
  433. return viewModel;
  434. };