// web service proxy for voucher webservices.factory('dataProcessService', ['$log', 'vatReportService', function ($log, vatReportService) { 'use strict'; function Job(serviceType, tplId, month, status) { this.serviceType = serviceType; this.tplId = tplId; this.month = month; this.status = status; } var jobsArr = []; //执行更新项目状态的任务 function status_job() { var job = jobsArr.shift(); if (job) { //更新每个状态值 vatReportService.updateProcInfo(job.serviceType, job.tplId, job.month, job.status).then(function (resData) { setTimeout(status_job, 100); $log.log("status_job request: " + job.tplId + ", " + job.status); }); } else { setTimeout(status_job, 1000); } } //页面容错机制 //1. 后台查询当前项目有没有正在 处理中的报表, 间隔连续两次没查询到,证明没有处理中的,更新页面状态 var timeInterval = 15 * 1000; var noProcItemCount = 0; var _serviceType, _projectId, _month, _status,_cb; function heartBeat() { vatReportService.heartBeat(_projectId, _month).then(function (resData) { //if ($scope.isStartProcData) {//如果是当前处理页面 $log.info("heartBeat......" + noProcItemCount); if (resData && resData.data.result) { //没有处理中加一次 noProcItemCount++; //超过两次,就更新状态 if (noProcItemCount > 3) { //1. 更新项目状态,当前项目状态更改为 处理已完成 //vatReportService.updateProcInfo($scope.serviceType, vatSessionService.project.id, vatSessionService.month, getStatus('completed')).then(function (resData) { vatReportService.updateProcInfo(_serviceType, _projectId, _month, _status).then(function (resData) { //更新页面状态 _cb(); timeInterval = 60 * 1000;//60s }); //注意后台要考虑的问题, 为了防止 signalR 的断线情况,将报表完成状态放到后台更新,前台通知更新显示而已 } } else { //表示有处理中 noProcItemCount = 0; } if (noProcItemCount == 0) { timeInterval = 60 * 1000 * 3;//正在处理中,降低频率 } else { timeInterval = 15 * 1000; } setTimeout(heartBeat, timeInterval); //} }); } return { startJob: function () { setTimeout(status_job, 100); }, addJob: function (serviceType, tplId, month, status) { jobsArr.push(new Job(serviceType, tplId, month, status)); }, startHeartBeat: function (serviceType, projectId, month, status,cb) { _serviceType = serviceType; _projectId = projectId; _month = month; _status = status; _cb = cb; setTimeout(heartBeat, timeInterval); } }; }]);