dataProcessService.js 3.22 KB
Newer Older
gary's avatar
gary committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
// 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);
        }

    };
Ken you's avatar
Ken you committed
86
}]);