$(function () { "use strict"; BemsWebApplication.Factory.WorkResultContentsPopup = { create: function (viewModel, params, isEdit) { var workResultDataSource = BemsWebApplication.db.createDataSource('FmsWorkResult', true), workProgressDataSource = BemsWebApplication.db.createDataSource('FmsWorkCodeProgress', true), facilityCheckItemDataSource = BemsWebApplication.db.createDataSource('FmsFacilityCheckItem', true), workResultCheckItemDataSource = BemsWebApplication.db.createDataSource('FmsWorkResultCheckItem', true), workResultDataViewModel = new BemsWebApplication.FmsWorkResultViewModel(), workOrderToFacilityDataViewModel = new BemsWebApplication.FmsWorkResultViewModel(), workOrderDataModel = viewModel.dataModel, overlayVisible = ko.observable(false), position = ko.observable(), isEditable = params.isEditableWorkContents || ko.observable(true), isConfirmFunction = params.isConfirmFunction || ko.observable(false), isShowCheckItemList = ko.observable(true), isNewData = ko.observable(false), selectedFacility = null, facilityDataGrid = null, timer = null, mainPopupElement = params.mainPopupElement, progresses = ko.observableArray([]), checkItems = ko.observableArray(); //dataSourceOptions: { // store: BemsWebApplication.odata.Facility, // select: [ 'SiteId' , 'FacilityCode' , 'ParentFacilityName', 'FirstClassName', 'SecondClassName', 'ThirdClassName', 'Name', 'Nickname', // 'BuildingName', 'FloorName', 'ZoneName', 'ManufactureModel', 'MainContactorUserName', 'SubContactorUserName' ] //}, workResultDataViewModel.WorkerUserName = ko.observable(); workResultDataViewModel.ProgressId = ko.observable(); workResultDataViewModel.ProgressName = ko.observable(); workResultDataViewModel.StartTime = ko.observable(); workResultDataViewModel.EndTime = ko.observable(); viewModel.isEditableWorkContents = isEditable; viewModel.isShowCheckItemListInWorkContents = isShowCheckItemList; function updateWorkOrderToFacility(dataModel, deferred) { var db = BemsWebApplication.db; var keys = db.extractKeysObject('FmsWorkOrderToFacility', dataModel); db.FmsWorkOrderToFacility.update(keys, dataModel.toJS()).done(function () { var promise = viewModel.refreshFaciliyList(); promise.done(function (facilities) { var length = facilities.length; var wp = $Code.WorkProgress; var workStandbyCount = 0, workingCount = 0, workCompleteCount = 0, workConfirmCount = 0; $.each(facilities, function (i, f) { switch (f.ProgressId()) { case wp.WorkStandby: workStandbyCount++; break; case wp.Working: workingCount++; break; case wp.WorkComplete: workCompleteCount++; break; case wp.WorkConfirm: workConfirmCount++; break; default: throw new Error('Unknown ProgressId'); } }); var progressId = null; if (workStandbyCount === length) { progressId = wp.WorkStandby; } else if (workConfirmCount === length) { progressId = wp.WorkConfirm; } else if (workCompleteCount === length) { progressId = wp.WorkComplete; } else { progressId = wp.Working; } var wrdm = viewModel.workRequestDataModel; if (progressId !== null && progressId !== wrdm.ProgressId()) { wrdm.ProgressId(progressId); db.FmsWorkRequest.update(db.extractKeysObject('FmsWorkRequest', wrdm), wrdm.toJS()).done(function () { viewModel.refreshList(); deferred.resolve(); }); } else { deferred.resolve(); } }); }); } function handleButtonSave() { workResultDataViewModel.StartDate(BWA.DataUtil.getDateTimeFromDateAndTime( workResultDataViewModel.StartDate(), workResultDataViewModel.StartTime())); workResultDataViewModel.EndDate(BWA.DataUtil.getDateTimeFromDateAndTime( workResultDataViewModel.EndDate(), workResultDataViewModel.EndTime())); var workResultPromise = null; var db = BemsWebApplication.db; if (isNewData()) { workResultPromise = db.FmsWorkResult.insert(workResultDataViewModel.toJS()); } else { var keys = db.extractKeysObject('FmsWorkResult', workResultDataViewModel); workResultPromise = db.FmsWorkResult.update(keys, workResultDataViewModel.toJS()); } var deferred = new $.Deferred(); workResultPromise.done(function (result) { if (selectedFacility === null) { throw new Error('selectedFacility is null!'); } var model = new BemsWebApplication.FmsWorkOrderToFacility(); model.SiteId(workOrderDataModel.SiteId()); model.OrderId(workOrderDataModel.OrderId()); model.FacilityCode(selectedFacility.FacilityCode()); model.ProgressId(workResultDataViewModel.ProgressId()); updateWorkOrderToFacility(model, deferred); var postData = []; var itemKeys = _.keys(new BWA.FmsWorkResultCheckItemViewModel()); var toJS = BWA.DataUtil.convertViewModelToJS; $.each(checkItems(), function (i, item) { item = toJS(_.pick(item, itemKeys)); item.OrderId = workOrderDataModel.OrderId(); if (_.isBoolean(item.BoolResult) === false) { item.BoolResult = false; } postData.push(item); }); var postPromise = BemsWebApplication.api.post( 'FmsWorkResultCheckItem', postData, { SiteId: workResultDataViewModel.SiteId(), OrderId: workResultDataViewModel.OrderId(), FacilityCode: workResultDataViewModel.FacilityCode() } ); $.when(postPromise, deferred.promise()).done(function () { utils.toast.show($G('successDatabaseProcessMsg')); }); }); } function handlePopupButtonConfirm() { var deferred = new $.Deferred(); var keys = BemsWebApplication.db.extractKeysObject('FmsWorkResult', workResultDataViewModel); //var dataModel = new BemsWebApplication.FmsWorkResultViewModel(); //workResultDataViewModel.fromJS( workResultDataSource.toJS() ); workResultDataViewModel.ConfirmedUserId(BWA.UserInfo.UserId()); workResultDataViewModel.ConfirmedDate(moment().toDate()); var db = BemsWebApplication.db; db.FmsWorkResult.update(keys, workResultDataViewModel.toJS()).done(function () { if (selectedFacility === null) { throw new Error('selectedFacility is null!'); } var model = new BemsWebApplication.FmsWorkOrderToFacility(); model.SiteId(workOrderDataModel.SiteId()); model.OrderId(workOrderDataModel.OrderId()); model.FacilityCode(selectedFacility.FacilityCode()); model.ProgressId($Code.WorkProgress.WorkConfirm); updateWorkOrderToFacility(model, deferred); deferred.promise().done(function () { utils.toast.show($G('successDatabaseProcessMsg')); }); }); } workProgressDataSource.filter( ['SiteId', '=', BWA.UserInfo.SiteId()], 'and', ['ProgressId', '>=', $Code.WorkProgress.WorkStandby], 'and', ['ProgressId', '<=', $Code.WorkProgress.WorkComplete] ); overlayVisible.subscribe(function (value) { if (value) { if (timer !== null) { clearInterval(timer); } var top, left; var element = $('#popupWorkContentsDetail').offsetParent(); position({ my: 'left top', at: 'right top', of: element }); timer = setInterval(function () { var offset = element.offset(); if (top !== offset.top || left !== offset.left) { top = offset.top; left = offset.left; position({ my: 'left top', at: 'right top', of: element }); } }, 100); } else { if (timer !== null) { clearInterval(timer); timer = null; } } }); position.subscribe(function (value) { }); viewModel.popupVisible.subscribe(function (value) { if (value === false) { overlayVisible(false); } workProgressDataSource.load().done(function (result) { progresses(result); }); }); viewModel.progressesInWorkResult = progresses; viewModel.workContentsDataModel = workResultDataViewModel; viewModel.workContentsCheckItems = checkItems; viewModel.workContentsResultTypes = $G.FacilityCheckItemResultType; viewModel.workResultContentsViewOptions = { width: '720px', height: '616px', dragEnabled: false, position: position, visible: overlayVisible, showingAction: function () { }, closeOnOutsideClick: false, shading: false, animation: { show: { type: "slide", duration: 150, from: { left: '-=10', opacity: 0 }, to: { opacity: 1 } }, hide: { type: "slide", duration: 150, from: { left: '-=10', opacity: 1 }, to: { opacity: 0 } } //show: { type: "slide", duration: 150, from: { left: screenWidth() - 260, width: '260px', opacity: 0.0 }, to: { left: screenWidth() - 260, width: '260px', opacity: 1 } }, //hide: { type: "slide", duration: 100, from: { left: screenWidth() - 260, width: '260px', opacity: 1 }, to: { left: screenWidth() - 260, width: '260px', opacity: 0 } } } }; //var popup = e.component; viewModel.toolbarItemsInWorkResult = [ { location: 'before', text: $G('workContents') }, { location: 'after', widget: 'button', options: { text: $G('save'), icon: 'save', visible: isEditable, disabled: viewModel.hasnotModificationPermission, clickAction: handleButtonSave } }, { location: 'after', widget: 'button', options: { text: $G('workResultConfirm'), icon: 'save', visible: isConfirmFunction, disabled: viewModel.hasnotModificationPermission, clickAction: handlePopupButtonConfirm } }, { location: 'after', widget: 'button', options: { text: $G('close'), icon: 'close', clickAction: function () { overlayVisible(false); } } } ]; return { visible: overlayVisible, checkItems: checkItems, setFacilityGridViewInstance: function (instance) { facilityDataGrid = instance; }, setSelectedFacility: function (facility) { selectedFacility = facility; isConfirmFunction(selectedFacility.ProgressId() === $Code.WorkProgress.WorkComplete); (function (workResultDataModel) { var eq = BWA.DataUtil.constructEqualFilter; workResultDataSource.filter( eq('SiteId', BWA.UserInfo.SiteId()), 'and', eq('OrderId', workOrderDataModel.OrderId()), 'and', eq('FacilityCode', selectedFacility.FacilityCode()) ); facilityCheckItemDataSource.filter([ eq('SiteId', BWA.UserInfo.SiteId()), 'and', eq('FacilityCode', selectedFacility.FacilityCode()), 'and', eq('WorkTypeId', viewModel.workRequestDataModel.WorkTypeId()) ]); workResultCheckItemDataSource.filter([ eq('SiteId', BWA.UserInfo.SiteId()), 'and', eq('FacilityCode', selectedFacility.FacilityCode()), 'and', eq('OrderId', workOrderDataModel.OrderId()) ]); $.when(workResultDataSource.load(), facilityCheckItemDataSource.load(), workResultCheckItemDataSource.load()) .done(function (workResultArray, facilityCheckItems, workResultCheckItems) { workResultArray = workResultArray[0]; facilityCheckItems = facilityCheckItems[0]; workResultCheckItems = workResultCheckItems[0]; if (workResultArray.length === 0) { isNewData(true); BWA.DataUtil.resetViewModel(workResultDataViewModel); workResultDataViewModel.SiteId(workOrderDataModel.SiteId()); workResultDataViewModel.OrderId(workOrderDataModel.OrderId()); workResultDataViewModel.FacilityCode(selectedFacility.FacilityCode()); workResultDataViewModel.RequestId(workOrderDataModel.RequestId()); var currentDate = moment().toDate(); workResultDataModel.StartDate(currentDate); workResultDataModel.StartTime(currentDate); workResultDataModel.EndDate(currentDate); workResultDataModel.EndTime(currentDate); } else { var model = workResultArray[0]; isNewData(false); BWA.DataUtil.copyViewModel(model, workResultDataModel); workResultDataModel.StartTime(model.StartDate()); workResultDataModel.EndTime(model.EndDate()); } checkItems(_.map(facilityCheckItems, function (item) { var foundItem = BWA.DataUtil.koFindWhere(workResultCheckItems, { CheckItemId: item.CheckItemId() }); if (_.isEmpty(foundItem) === false) { $.extend(item, foundItem); } return item; })); workResultDataModel.ProgressName(selectedFacility.FmsWorkCodeProgress_Name()); workResultDataModel.ProgressId(selectedFacility.ProgressId()); workResultDataModel.WorkerUserId(workOrderDataModel.WorkerUserId()); workResultDataModel.WorkerUserName(workOrderDataModel.WorkerUserName()); }); })(viewModel.workContentsDataModel); } } } } }); /* 한번에 해결하려 했으나 여러가지 상황이 발생해 나눠서 요청하고 합쳐서 처리하기로 결정 var checkItemDataSource = BWA.DataUtil.createDataSource({ dataSourceOptions: { store: BemsWebApplication.odata.FmsWorkResultCheckItem, select: [ 'SiteId', 'FacilityCode', 'CheckItemId', 'WorkTypeId', 'CycleUnitId', 'Name', 'IsYesNoResult', 'CheckItemId', 'OrderId', 'BoolResult', 'TextResult' ], //store: BemsWebApplication.db.FmsFacilityCheckItem, //select: [ // 'SiteId', 'FacilityCode', 'CheckItemId', 'WorkTypeId', 'CycleUnitId', 'Name', // 'IsYesNoResult', 'IsUse', // 'FmsWorkResultCheckItem/CheckItemId', // 'FmsWorkResultCheckItem/OrderId', // 'FmsWorkResultCheckItem/BoolResult', // 'FmsWorkResultCheckItem/TextResult' //], //expand: [ 'FmsWorkResultCheckItem' ], //extendOptions: { // alterNames: { // 'FmsWorkResultCheckItem/CheckItemId': 'ResultCheckItemId', // 'FmsWorkResultCheckItem/OrderId': 'OrderId', // 'FmsWorkResultCheckItem/BoolResult': 'BoolResult', // 'FmsWorkResultCheckItem/TextResult': 'TextResult', // } //} } }); */