main.js 14 KB
// angular 主程序js,必须先导入,配置一些全局设置

var ScheduleApp = angular.module('ScheduleApp', [
    'ui.router', // ui-route跳转
    'ngAnimate', // ng动画
    'ui.bootstrap', // ui bootstrap封装
    'oc.lazyLoad', // 动态加载模块(html,js,css等)
    'ngSanitize', // 净化html标签,配合ng-bind-html使用
    'ngResource', // resource服务
    'ngHandsontable',
    'ng-sweet-alert'
]);

ScheduleApp.factory('UserPrincipal', [
    '$http',
    function($http) {
        // 登录后获取用户公司信息

        var gsinfos = []; // 原始返回的对象数据
        var gsinfo_strs = []; // 拼装以后的(公司代码_分公司代码)
        var gsinfo_strs_u = []; // 拼装以后的(分公司代码_公司代码)
        var gsinfo_strs_query = []; // 拼装以后的(公司代码_分公司代码),带单引号

        $http({
            method: 'GET',
            url: '/user/companyData'
        }).then(function(result) {
            if (angular.isArray(result.data)) {
                gsinfos = result;
                angular.forEach(result.data, function(obj) {
                    var gsbm = obj.companyCode;
                    angular.forEach(obj.children, function(obj2) {
                        var fgsbm = obj2.code;
                        gsinfo_strs.push(gsbm + "_" + fgsbm);
                        gsinfo_strs_u.push(fgsbm + "_" + gsbm);
                        gsinfo_strs_query.push("'" + gsbm + "_" + fgsbm + "'");
                    });
                });

            }
            console.log(gsinfos);
            console.log(gsinfo_strs);
        });

        return {
            getGsStrs: function() {
                return gsinfo_strs;
            },
            getGsStrsU: function() {
                return gsinfo_strs_u;
            },
            getGsStrsQuery: function() {
                return gsinfo_strs_query;
            }
        };
    }
]);

ScheduleApp.factory('DataStore', [
    '$http',
    '$q',
    function($http, $q) {
        // 本地数据存储,如车辆数据,人员数据
        var dataMap = {
            "cl": [], // 车辆信息
            "ry": [], // 人员信息
            "ddreasons": [ // 调度原因(调度执勤日报里的)
                {code: "0", name: "营运"},
                {code: "1", name: "缺车"},
                {code: "2", name: "气候"},
                {code: "3", name: "肇事"},
                {code: "4", name: "纠纷"},
                {code: "5", name: "抽减"},
                {code: "6", name: "配车"},
                {code: "7", name: "故障"},
                {code: "8", name: "路阻"},
                {code: "9", name: "客稀"},
                {code: "10", name: "吊慢"},
                {code: "11", name: "其他"},
                {code: "12", name: "保养"},
                {code: "13", name: "缺人"},
                {code: "14", name: "援外"}
            ],
            "zdlytype" : [ // 站点路由类型
                {name: "当前版本", value: 1},
                {name: "所有版本(待更新,当前,历史)", value: 2}
            ]
        };

        var dataPromise_cars = function() {
            var deferred = $q.defer();
            $http({
                method: 'GET',
                url: '/cars_sc/all'
            }).then(function(result) {
                // 简拼数据
                var dd = result.data.data;
                angular.forEach(result.data.data, function(obj) {
                    //// 全拼
                    //obj["$fullChars"] = pinyin.getFullChars(obj.insideCode ? obj.insideCode: "");
                    //// 简拼
                    //obj["$camelChars"] = pinyin.getCamelChars(obj.insideCode ? obj.insideCode: "");
                    // 全拼
                    obj["$fullChars"] = obj.insideCode? obj.insideCode: "";
                    // 简拼
                    obj["$camelChars"] = obj.insideCode? obj.insideCode: "";
                    // 原值
                    obj["$calcu_str"] = obj.insideCode? obj.insideCode: "";
                });
                deferred.resolve(dd);
            });
            return deferred.promise;
        };

        var dataPromise_ees = function() {
            var deferred = $q.defer();

            $http({
                method: 'POST',
                url: '/basic/refresh_person_data'
            }).then(function() {
                $http({
                    method: 'GET',
                    url: '/personnel/all_py'
                }).then(function(result) {
                    // 简拼数据
                    var dd = result.data;
                    angular.forEach(result.data, function(obj) {
                        // 全拼
                        obj["$fullChars"] = obj.fullChars;
                        // 简拼
                        obj["$camelChars"] = obj.camelChars;
                        // 原值
                        obj["$calcu_str"] = obj.name + "-" + obj.workId;
                    });
                    deferred.resolve(dd);
                });
            });
            return deferred.promise;
        };

        var refreshCars = function() {
            dataPromise_cars().then(function(res) {
                console.log("refreshCars");
                dataMap.cl = [];
                angular.forEach(res, function(obj) {
                    dataMap.cl.push(obj);
                });
            });
        };

        var refreshEes = function() {
            dataPromise_ees().then(function(res) {
                console.log("refreshEes");
                dataMap.ry = [];
                angular.forEach(res, function(obj) {
                    dataMap.ry.push(obj);
                });
            });
        };

        // 初始化
        refreshCars();
        refreshEes();

        return {
            getData: function(type) {
                if (dataMap[type]) {
                    return dataMap[type];
                } else {
                    return [];
                }
            },
            refreshData: function(type) {
                if (type == 'cl') {
                    refreshCars();
                } else if (type == 'ry') {
                    refreshEes();
                }
            }
        }

    }
]);

/**
 * 用于请求通知。
 */
ScheduleApp.factory('requestNotificationChannel', ['$rootScope', function($rootScope) {
    // 通知消息常量
    var _START_REQUEST_ = '_START_REQUEST_'; // 开始请求通知message
    var _END_REQUEST_ = '_END_REQUEST_'; // 请求结束通知message

    // 计数器
    var activeCalls = 0;

    // 发布开始请求通知
    var requestStarted = function(requestInfo) {
        activeCalls += 1;
        console.log("activeCalls=" + activeCalls);
        $rootScope.$broadcast(_START_REQUEST_, requestInfo);
    };
    // 发布请求结束通知
    var requestEnded = function() {
        activeCalls -= 1;
        console.log("activeCalls=" + activeCalls);
        $rootScope.$broadcast(_END_REQUEST_);
    };

    /**
     * 订阅开始请求通知。
     * @param $scope 作用域
     * @param handler 通知处理器函数
     */
    var onRequestStarted = function($scope, handler) {
        $scope.$on(_START_REQUEST_, function(event, requestInfo) {
            handler(requestInfo);
        });
    };
    /**
     * 订阅请求结束通知。
     * @param $scope 作用域
     * @param handler 通知处理器函数
     */
    var onRequestEnded = function($scope, handler) {
        $scope.$on(_END_REQUEST_, function(event) {
            handler();
        });
    };

    return {
        requestStarted : requestStarted,
        requestEnded : requestEnded,
        onRequestStarted : onRequestStarted,
        onRequestEnded : onRequestEnded
    };

}]);

// http 拦截器
ScheduleApp.factory(
    'myInterceptor',
    [
        'requestNotificationChannel',
        '$q',
        function(requestNotificationChannel, $q) {
            return {
                request: function(config) {
                    requestNotificationChannel.requestStarted(config);
                    return config;
                },
                requestError: function(rejection) {
                    requestNotificationChannel.requestEnded();
                    return rejection;
                },
                response: function(response) {
                    requestNotificationChannel.requestEnded();

                    var data = response.data;
                    var output = [];
                    if (data.status == '407') {
                        alert("请重新登录!");
                        return $q.reject(response);
                    } else if (data.status == '500') {
                        output.push("状态编码:" + data.status);
                        output.push("访问路径:" + data.path);
                        output.push("错误消息:" + data.message);
                        alert("服务端错误:" + "\n" + output.join("\n"));
                        return $q.reject(response);
                    } else {
                        return response;
                    }

                },
                responseError: function(rejection) {
                    requestNotificationChannel.requestEnded();

                    // 处理错误,springboot会包装返回的错误数据
                    // 如:{"timestamp":1478674739246,"status":500,"error":"Internal Server Error","exception":"java.lang.ClassCastException","message":"java.lang.String cannot be cast to java.lang.Long","path":"/tidc/importfile"}

                    var output = [];
                    if (!rejection.status) {
                        alert("我擦,后台返回连个状态码都没返回,见鬼了,服务器可能重启了");
                    } else if (rejection.status == -1) {
                        // 服务器断开了
                        // alert("貌似服务端连接不上");
                        console.log("貌似服务端连接不上");
                    } else {
                        output.push("状态编码:" + rejection.status);
                        output.push("错误内容:" + angular.toJson(rejection.data));
                        if (rejection.status == 500) {
                            alert("服务端错误:" + "\n" + output.join("\n"));
                        } else if (rejection.status == 407) {
                            alert("请重新登录:" + "\n" + output.join("\n"));
                        } else {
                            alert("其他错误:" + "\n" + output.join("\n"));
                        }
                    }

                    return $q.reject(rejection);
                }
            };
        }
    ]
);

ScheduleApp.config(['$httpProvider', function($httpProvider) {
    $httpProvider.defaults.headers.common["X-Requested-With"] = "XMLHttpRequest";
    $httpProvider.interceptors.push('myInterceptor');
}]);

/** ocLazyLoader 配置 */
ScheduleApp.config(['$ocLazyLoadProvider', function($ocLazyLoadProvider) {
    $ocLazyLoadProvider.config({
        // TODO:全局配置在这里
    });
}]);

/** 配置全局配置信息 */
ScheduleApp.factory('settings', ['$rootScope', function($rootScope) {
    // 封装 settings服务,并设置给 $rootScope同名对象
    var settings = {
        // TODO:
    };

    $rootScope.settings = settings;

    return settings;
}]);

/** Schedule App 主应用控制器 */
ScheduleApp.controller('ScheduleAppController', [
    '$scope',
    'UserPrincipal',
    'DataStore',
    function($scope, UserPrincipal, DataStore) {
        $scope.$on('$viewContentLoaded', function(event) {
            console.log("子页面已载入:" + event);
        });

        // 获取一次用户身份信息
        UserPrincipal.getGsStrs();
        // 获取本地数据
        DataStore.getData("cl");
        DataStore.getData("ry");
    }
]);

// JQuery插件,使$ajax支持resposetype=arraybuffer,二进制输出,html5的特性
// use this transport for "binary" data type
$.ajaxTransport("+binary", function(options, originalOptions, jqXHR){
    // check for conditions and support for blob / arraybuffer response type
    if (window.FormData && ((options.dataType && (options.dataType == 'binary')) || (options.data && ((window.ArrayBuffer && options.data instanceof ArrayBuffer) || (window.Blob && options.data instanceof Blob)))))
    {
        return {
            // create new XMLHttpRequest
            send: function(headers, callback){
                // setup all variables
                var xhr = new XMLHttpRequest(),
                    url = options.url,
                    type = options.type,
                    async = options.async || true,
                // blob or arraybuffer. Default is blob
                    dataType = options.responseType || "blob",
                    data = options.data || null,
                    username = options.username || null,
                    password = options.password || null;

                xhr.addEventListener('load', function(){
                    var data = {};
                    data[options.dataType] = xhr.response;
                    // make callback and send data
                    callback(xhr.status, xhr.statusText, data, xhr.getAllResponseHeaders());
                });

                xhr.open(type, url, async, username, password);

                // setup custom headers
                for (var i in headers ) {
                    xhr.setRequestHeader(i, headers[i] );
                }

                xhr.responseType = dataType;
                xhr.send(data);
            },
            abort: function(){
                jqXHR.abort();
            }
        };
    }
});