citModule.controller('citVoucherMappingController', ['$scope', '$log', '$timeout', '$q', '$interval', '$translate', 'loginContext', 'apiInterceptor', 'Upload', 'dataImportService', 'SweetAlert', 'vatImportService', 'vatSessionService', 'citSessionService', 'uiGridConstants', 'enums', 'vatCommonService', function ($scope, $log, $timeout, $q, $interval, $translate, loginContext, apiInterceptor, Upload, dataImportService, SweetAlert, vatImportService, vatSessionService, citSessionService, uiGridConstants, enums, vatCommonService) { 'use strict'; $log.debug('citVoucherMappingController.ctor()...'); var uploadUrl = apiInterceptor.vatWebApiHostUrl + '/FileUpload/NewFile'; var successCount = 0; var resumable = true; var period = citSessionService.month; var projectDbName = vatSessionService.project.dbName; $scope.chunkSize = 100000; $scope.columnNum = 1; $scope.showErrorTable = false; $scope.showInitTable = false; $scope.showImportTable = false $scope.period = citSessionService.month; var validationErrorType = { PeriodParseErrorType: $translate.instant('PeriodParseErrorType'), ItemIDParseErrorType: $translate.instant('ItemIDParseErrorType'), DuplicateInDBErrorType: $translate.instant('DuplicateInDBErrorType'), DuplicateInFileErrorType: $translate.instant('DuplicateInFileErrorType'), EmptyFieldErrorType: $translate.instant('EmptyFieldErrorType'), OverLengthFieldErrorType: $translate.instant('OverLengthFieldErrorType') }; var serverErrorType = { DuplicateInDBErrorType: 'DuplicateInDB', DuplicateInFileErrorType: 'DuplicateInFile', EmptyFieldErrorType: 'EmptyField', OverLengthFieldErrorType: 'OverLengthField' }; var initColumns = function () { $scope.allColumns = [ $translate.instant('PleaseSelectColumn'), $translate.instant('tranCode'), $translate.instant('period'), $translate.instant('vGroup'), $translate.instant('vid'), $translate.instant('itemID') ]; $scope.necessoryColumns = [ $translate.instant('tranCode'), $translate.instant('period'), $translate.instant('vGroup'), $translate.instant('vid'), $translate.instant('itemID') ]; }; var initGrid = function () { $scope.gridOptions = { rowHeight: constant.UIGrid.rowHeight, selectionRowHeaderWidth: constant.UIGrid.rowHeight, enableFullRowSelection: false, enableRowSelection: false, enableSorting: false, enableFiltering: false, enableColumnMenus: false, enableRowHeaderSelection: false, enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER, columnDefs: [ { field: 'index', name: $translate.instant('ImportErrorPopUpNoCol'), width: '10%', headerCellClass: '', enableFiltering: false, cellTemplate: '<div class="ui-grid-cell-contents"><span>{{row.entity.index}}<span></div>' }, { field: 'tranCode', name: $translate.instant('tranCode'), width: '18%', headerCellClass: '', cellTemplate: '<div class="ui-grid-cell-contents"><span title="{{row.entity.tranCode}}">{{row.entity.tranCode}}<span></div>' }, { field: 'period', name: $translate.instant('period'), width: '18%', headerCellClass: 'right', cellTemplate: '<div class="ui-grid-cell-contents right"><span title="{{row.entity.period}}">{{row.entity.period}}</span></div>' }, { field: 'group', name: $translate.instant('vGroup'), width: '18%', headerCellClass: '', cellTemplate: '<div class="ui-grid-cell-contents"><span title="{{row.entity.group}}">{{row.entity.group}}</span></div>' }, { field: 'vid', name: $translate.instant('vid'), width: '18%', headerCellClass: '', cellTemplate: '<div class="ui-grid-cell-contents"><span title="{{row.entity.vid}}">{{row.entity.vid}}</span></div>' }, { field: 'itemID', name: $translate.instant('itemID'), width: '18%', headerCellClass: '', cellTemplate: '<div class="ui-grid-cell-contents"><span title="{{row.entity.itemID}}">{{row.entity.itemID}}</span></div>' } ], onRegisterApi: function (gridApi) { $scope.gridApiTotal = gridApi; } }; $scope.gridOptions.noData = false; }; $scope.$on(enums.vatEvent.layoutChanged, function () { $scope.gridApiTotal.core.handleWindowResize(); $scope.errorGridApi.core.handleWindowResize(); }); //parentIndex:column index //index:selecteditem index var mappingColumn = function (parentIndex, index, colName) { if (colName) { var oldColumn = $scope.selectedColumnMap[parentIndex]; var newColumn = $scope.allColumns[index]; if (oldColumn === newColumn) { return; } else { $scope.selectedColumnMap[parentIndex] = colName; if (colName !== $translate.instant('PleaseSelectColumn')) { $scope.allColumns.splice(index, 1); if (oldColumn && oldColumn !== $translate.instant('PleaseSelectColumn')) { $scope.allColumns.push(oldColumn); } } else { if (oldColumn) { $scope.allColumns.push(oldColumn); } } } } $log.debug($scope.selectedColumnMap); }; var UploadFile = function (file) { if (file) { if (!file.name.endsWith('.xls') && !file.name.endsWith('.xlsx')) { SweetAlert.warning($translate.instant('ImportFileInvalidType')); return; }; $scope.initIncomeInvoiceList = []; successCount = 0; if (!file.$error) { var tempFileName = PWC.newGuid() + '.dat'; Upload.upload({ url: uploadUrl, data: { filename: file.name, tempFileName: tempFileName, file: file }, resumeChunkSize: resumable ? $scope.chunkSize : null, headers: { 'Access-Control-Allow-Origin': '*', Authorization: apiInterceptor.tokenType + ' ' + apiInterceptor.apiToken }, __RequestVerificationToken: $scope.token, withCredentials: true }).then(function (resp) { successCount++; $scope.fileName = file.name; if (successCount === 1) { $scope.tempFileName = resp.data; changeSheet(0); } }); } } } var resetMappingRow = function () { initColumns(); $scope.selectedColumnMap = []; }; var changeSheet = function (index) { $scope.showErrorTable = false; $scope.selectedSheet.sheetIndex = index; resetMappingRow(); if (_.isString($scope.tempFileName)) { $scope.excelSource = { sheetNameList: [], dataList: [] }; vatImportService.getFileContent($scope.tempFileName, $scope.selectedSheet.sheetIndex, $scope.selectedSheet.topRowNumber).success(function (data) { if (data && data.result === false) { $scope.showInitTable = true; $scope.showImportTable = false; SweetAlert.warning(data.resultMsg); return; } $scope.showInitTable = false; $scope.showImportTable = true $scope.excelSource = data; $scope.columnNum = data.dataList[0].length; $scope.firstDataRow = data.dataList[0]; $scope.startRowList = _.range(data.lastRowIndex); $scope.selectedSheet.sheetName = $scope.excelSource.sheetNameList[$scope.selectedSheet.sheetIndex]; citSessionService.dataChanged = true; }).error(function () { SweetAlert.error($translate.instant('PleaseContactAdministrator')); }); } }; var validateClientSide = function (dataList) { var periodIntCheckMsg = ''; var periodCnt = 0; if (parseInt($scope.StartRowNum) > $scope.excelSource.dataList.length) { SweetAlert.warning($translate.instant('StartRowNumberCheckMsg')); return; } for (var i = $scope.StartRowNum - 1; i < $scope.excelSource.dataList.length; i++) { var period1 = $scope.excelSource.dataList[i][$.inArray($translate.instant('period'), $scope.selectedColumnMap)]; if (isNaN(parseInt(period1))) { periodIntCheckMsg += $translate.instant('tranCode') + ':' + $scope.excelSource.dataList[i][$.inArray($translate.instant('tranCode'), $scope.selectedColumnMap)] + ',' + $translate.instant('period') + ':' + period1 + ',' + $translate.instant('vGroup') + ':' + $scope.excelSource.dataList[i][$.inArray($translate.instant('vGroup'), $scope.selectedColumnMap)] + ',' + $translate.instant('vid') + ':' + $scope.excelSource.dataList[i][$.inArray($translate.instant('vid'), $scope.selectedColumnMap)] + ',' + $translate.instant('itemID') + ':' + itemID + ';<br />'; periodCnt++; } else { if (period1 != period) continue; } if (periodCnt == 0) { var item = { 'TranCode': $scope.excelSource.dataList[i][$.inArray($translate.instant('tranCode'), $scope.selectedColumnMap)], 'Period': period1, 'Group': $scope.excelSource.dataList[i][$.inArray($translate.instant('vGroup'), $scope.selectedColumnMap)], 'VID': $scope.excelSource.dataList[i][$.inArray($translate.instant('vid'), $scope.selectedColumnMap)], 'ItemID': $scope.excelSource.dataList[i][$.inArray($translate.instant('itemID'), $scope.selectedColumnMap)] }; dataList.push(item); } } $scope.errorMsgMap = []; if (periodCnt > 0) { $scope.errorMsgMap.push( { 'errorType': validationErrorType.PeriodParseErrorType, 'errorCount': periodCnt, 'errorContent': $translate.instant('PeriodParseErrorMsg').formatObj({ rows: periodIntCheckMsg }) }); }; if ($scope.errorMsgMap.length > 0) { $('#errorListModal').modal('show'); return false; } return true; }; function doSave2Server(saveType) { // saveType 1:override,2:append if ($scope.excelSource.sheetNameList.length == 0) { SweetAlert.warning($translate.instant('PleaseSelectFileFirst')); return; } var notMappedColumns = ''; if ($scope.selectedColumnMap.length >= 0) { var count1 = 0; $scope.necessoryColumns.forEach(function (m) { if (m !== $translate.instant('PleaseSelectColumn')) { if ($.inArray(m, $scope.selectedColumnMap) < 0) { notMappedColumns += m + ','; count1++; } } }); if (notMappedColumns) { SweetAlert.warning($translate.instant('ColumnsMapErrorMsg').formatObj({ columns: notMappedColumns.substring(0, notMappedColumns.length - 1) })); return; } } var dataList = []; if (!validateClientSide(dataList)) return; if (dataList.length == 0) { SweetAlert.warning($translate.instant('noCurMonthRecordErrorMsg')); return; }; $scope.errorMsgMap = []; if ($scope.errorMsgMap.length > 0) { $('#errorListModal').modal('show'); return; } else { vatImportService.SaveVourcherMappings(dataList, period, saveType).success(function (data) { if (data) { if (data.result) { $scope.showInitTable = true; $scope.showImportTable = false; $scope.showErrorTable = false; $scope.ImportErrorTab = false; $scope.ImportErrorTag = false; vatCommonService.importSetProjectStatus(projectDbName, period, constant.DictionaryDictKey.WFImportVoucherMap , enums.FinishStatusEnum.Finished); vatCommonService.setImportSubStatus(enums.VatImportSubStatus.isVoucherMapImport, true); $log.debug("import voucherMapping save2Server: " + vatSessionService.project.importSubStatus.isVoucherMapImport); SweetAlert.success($translate.instant('ImportSuccess')); resetMappingRow(); getMappings(); $scope.fileName = ''; } else { processValidateMsg(data.data); } } }).error(function () { SweetAlert.error($translate.instant('PleaseContactAdministrator')); }); } } var save2Server = function (saveType) { if (vatSessionService.project.projectStatusList[$scope.period] >= constant.ProjectStatusEnum.Generated) { swal({ title: "warning!", text: $translate.instant('IsConfirmToReImport').formatObj({ status: vatCommonService.getProjectStautsEnumDesc(vatSessionService.project.projectStatusList[$scope.period]) }), type: "warning", showCancelButton: true, confirmButtonColor: "#DD6B55", confirmButtonText: $translate.instant('Yes'), cancelButtonText: $translate.instant('No'), closeOnConfirm: true, closeOnCancel: true }, function (isConfirm) { if (isConfirm) { doSave2Server(saveType); } else { swal.close(); } }); } else { doSave2Server(saveType); } }; var buildDataStr = function (p) { var empty = '<' + $translate.instant('empty') + '>'; return $translate.instant('tranCode') + ':' + (PWC.isNullOrEmpty(p.tranCode) ? empty : p.tranCode) + ',' + $translate.instant('period') + ':' + (PWC.isNullOrEmpty(p.period) ? empty : p.period) + ',' + $translate.instant('vid') + ':' + (PWC.isNullOrEmpty(p.vid) ? empty : p.vid) + ',' + $translate.instant('vGroup') + ':' + (PWC.isNullOrEmpty(p.group) ? empty : p.group) + ',' + $translate.instant('itemID') + ':' + (PWC.isNullOrEmpty(p.itemID) ? empty : p.itemID) + ';<br />'; }; var processValidateMsg = function (errorList) { if (errorList && errorList.length > 0) { errorList.forEach(function (v) { if (v.resultMsg === serverErrorType.DuplicateInFileErrorType) { var vString = ''; v.data.forEach(function (p) { vString += buildDataStr(p); }); $scope.errorMsgMap.push( { 'errorType': validationErrorType.DuplicateInFileErrorType, 'errorCount': v.data.length, 'errorContent': $translate.instant('DuplicateInFileErrorMsg').formatObj({ rows: vString }) }); } else if (v.resultMsg === serverErrorType.DuplicateInDBErrorType) { var vString = ''; v.data.forEach(function (p) { vString += buildDataStr(p); }); $scope.errorMsgMap.push( { 'errorType': validationErrorType.DuplicateInDBErrorType, 'errorCount': v.data.length, 'errorContent': $translate.instant('DuplicateInDBErrorMsg').formatObj({ rows: vString }) }); } else if (v.resultMsg === serverErrorType.EmptyFieldErrorType) { var vString = ''; v.data.forEach(function (p) { vString += buildDataStr(p); }); $scope.errorMsgMap.push( { 'errorType': validationErrorType.EmptyFieldErrorType, 'errorCount': v.data.length, 'errorContent': $translate.instant('EmptyFieldErrorMsg').formatObj({ rows: vString }) }); } else if (v.resultMsg === serverErrorType.OverLengthFieldErrorType) { var vString = ''; v.data.forEach(function (p) { vString += buildDataStr(p); }); $scope.errorMsgMap.push( { 'errorType': validationErrorType.OverLengthFieldErrorType, 'errorCount': v.data.length, 'errorContent': $translate.instant('OverLengthErrorMsg').formatObj({ rows: vString }) }); } }); }; if ($scope.errorMsgMap.length > 0) { $('#errorListModal').modal('show'); } }; var clear = function () { swal({ title: "warning!", text: $translate.instant('ClearTips'), type: "warning", showCancelButton: true, confirmButtonColor: "#DD6B55", confirmButtonText: $translate.instant('Yes'), cancelButtonText: $translate.instant('No'), closeOnConfirm: true, closeOnCancel: true }, function (isConfirm) { if (isConfirm) { var dataList = []; var saveType = 1;//overide vatImportService.SaveVourcherMappings(dataList, period, saveType).success(function (data) { if (data && data.result) { $scope.showInitTable = true; $scope.showImportTable = false; $scope.showErrorTable = false; $scope.ImportErrorTab = false; $scope.ImportErrorTag = false; vatCommonService.clearProjectStatus(projectDbName, period, constant.DictionaryDictKey.WFImportVoucherMap, enums.FinishStatusEnum.NotFinished); vatCommonService.setImportSubStatus(enums.VatImportSubStatus.isVoucherMapImport, false); $log.debug("clear voucherMapping clear: " + vatSessionService.project.importSubStatus.isVoucherMapImport); SweetAlert.success($translate.instant('ClearSuccess')); resetMappingRow(); getMappings(); } }); } }).error(function () { SweetAlert.error($translate.instant('PleaseContactAdministrator')); }); }; var getMappings = function () { vatImportService.GetVourcherMappings(period).success(function (data) { if (data.length > 0) { GetValidationList(); } else { $scope.haveImported = false; $scope.showErrorTable = false; $scope.ImportErrorTab = false; $scope.ImportErrorTag = false; } $scope.excelSource = { sheetNameList: [], dataList: [] }; $scope.mapppingList = data; var seqNo = 1; $scope.mapppingList.forEach(function (i) { i.index = seqNo; seqNo++; }); $scope.gridOptions.data = $scope.mapppingList; $scope.gridOptions.noData = $scope.mapppingList.length === 0; $scope.firstDataRow = null; citSessionService.dataChanged = false; }).error(function () { SweetAlert.error($translate.instant('PleaseContactAdministrator')); }); }; $scope.$watch('selectedFileName', function (newValue, oldValue) { if (newValue && newValue !== oldValue) { UploadFile($scope.selectedFileName); $scope.ImportErrorTab = false; $scope.ImportErrorTag = false; resetMappingRow(); } }); //验证信息数据源 $scope.gridOptionsErrorMsg = { rowHeight: constant.UIGrid.rowHeight, selectionRowHeaderWidth: constant.UIGrid.selectionRowHeaderWidth, enableSorting: false, enableColumnMenus: false, enableHorizontalScrollbar: uiGridConstants.scrollbars.enableHorizontalScrollbar, enableVerticalScrollbar: uiGridConstants.scrollbars.enableVerticalScrollbar, columnDefs: [ { name: $translate.instant('Icon'), width: '5%', cellTemplate: '<div class="ui-grid-cell-contents"><span><img data-ng-src="{{grid.appScope.errorLevelToString(row.entity.errorLevel)}}"><span></div>' }, { name: $translate.instant('SequenceNo'), width: '5%', cellTemplate: '<div class="ui-grid-cell-contents"><span>{{row.entity.index}}<span></div>' }, { name: $translate.instant('ErrorResult'), width: '20%', cellTemplate: '<div class="ui-grid-cell-contents"><span>{{row.entity.validationResult}}<span></div>' }, { name: $translate.instant('ErrorCount'), width: '10%', cellTemplate: '<div class="ui-grid-cell-contents"><span>{{row.entity.number}}<span></div>' }, { name: $translate.instant('ErrorDetail'), width: '35%', cellTemplate: '<div class="ui-grid-cell-contents"><span>{{row.entity.validationDetails}}<span></div>' }, { name: $translate.instant('ValidationTips'), width: '25%', cellTemplate: '<div class="ui-grid-cell-contents" title="{{row.entity.validationTips}}"><span>{{row.entity.validationTips}}<span></div>' }, ], onRegisterApi: function (gridApi) { $scope.errorGridApi = gridApi; } }; //获取验证信息 function GetValidationList() { //改成海关清单类型 $scope.validationType = 9; vatImportService.getValidationList($scope.validationType, $scope.period).success(function (data) { if (data.length > 0) { var index = 1; data.forEach(function (v) { v.index = index++; }); $scope.errorList = data; $scope.gridOptionsErrorMsg.data = data; showErrTab(); $scope.toggleErrorTab(); $scope.showErrorTable = true; } else { $scope.errorList = []; $scope.gridOptionsErrorMsg.data = []; $scope.showErrorTable = false; $scope.ImportErrorTab = false; $scope.ImportErrorTag = false; } }); } //显示图标 $scope.errorLevelToString = function (errorLevel) { if (errorLevel === 0) { return '/app-resources/images/vat/error.png'; } if (errorLevel === 1) { return '/app-resources/images/vat/warning.png'; } if (errorLevel === 2) { return '/app-resources/images/vat/tips.png'; } else { return '/app-resources/images/vat/tips.png'; } } //显示验证信息 $scope.toggleErrorTab = function () { $scope.ImportErrorTag = !$scope.ImportErrorTag; // topIcon and content-resize gapBottom 15px if (!$scope.ImportErrorTag) { setErrorWrapCssDefault(); } else { if (parseInt($('#content-resizer').css('bottom')) < 100) { $('#content-resizer').css('bottom', '190px'); $('#topIcon').css({ bottom: '-381px' }); $('.error-info-wrapper').css('height', '190px'); } } }; var setErrorWrapCssDefault = function () { $('#content-resizer').css('bottom', '65px'); $('#topIcon').css({ bottom: '-501px' }); $('.error-info-wrapper').css('height', '65px'); }; function showErrTab() { $scope.ImportErrorTab = true; $scope.ImportErrorTag = true; $scope.errorMsg = $translate.instant('ImportErrorMsg').formatObj({ "NumberOfError": $scope.errorList.length }); }; $scope.getGridHeight = function () { if ($scope.isLoadComplete) { return { height: ($('.balance-ouput-grid-wrapper').height()) + "px" }; } else { return { height: 0 + "px" }; } }; $scope.getErrorGridHeight = function () { if ($scope.isLoadComplete) { var y = $("#error-info-wrapper").height(); // Enough space if (y > constant.UIGrid.gapHeight) { y = y - constant.UIGrid.gapHeight; return { height: y + "px" }; } else { return { height: '0px' }; } } return {}; }; (function initialize() { $scope.StartRowNum = 2; $scope.mapppingList = []; $scope.mappingRow = null; $scope.firstDataRow = null; $scope.selectedColumnMap = []; $scope.selectedFileName = ''; $scope.excelSource = { sheetNameList: [], dataList: [] }; $scope.selectedSheet = { sheetName: '', sheetIndex: 0, topRowNumber: 0 }; $scope.refresh = getMappings; $scope.clear = clear; $scope.changeSheet = changeSheet; $scope.mappingColumn = mappingColumn; $scope.save2Server = save2Server; $scope.showInitTable = true; $scope.showImportTable = false; initColumns(); initGrid(); getMappings(); $timeout(function () { $scope.isLoadComplete = true; }, 500); })(); } ]);