<!DOCTYPE html>
<html>
<head>
<title>东方财富网-龙虎榜大数据处理[单页面-无数据库]——powered by WangXinsheng</title>
<meta charset="utf-8">
<script src="jquery-3.1.1.min.js"></script>
<script src="echarts.min.js"></script>
<script src="angular.min.js"></script>
</head>
<body>
<div ng-app="myApp" ng-controller="myCtrl">
<div class='srchBar'>
个股分析数量:<input type="number" min="1" required max="{{ggMax}}" ng-model="ggNum" />
起始日期:<input type="date" required max="{{((!timeTo || timeTo.getTime() >= timeFromMax.getTime()) ? timeFromMax : addDate(timeTo,-1)) | date:'yyyy-MM-dd'}}" ng-model="timeFrom" />
截至日期:<input type="date" required max="{{timeToMax | date:'yyyy-MM-dd'}}" ng-model="timeTo" />
营业部分析数量:<input type="number" min="1" required max="{{yybMax}}" ng-model="yybNum" />
<br />
<button ng_disabled="!(ggNum && ggMax>=ggNum && yybNum && yybMax>=yybNum && dateValide())" ng-click="getData()">查询</button>
<button ng-click="doDownloadAll()">下载关联个股通达信自选股文件</button>
<button ng-click="doDownloadYYB()">下载选中营业部通达信自选股文件</button>
<a style="display: none;" id="download1"></a>
<a style="display: none;" id="download2"></a>
</div>
<!-- 为 ECharts 准备一个具备大小(宽高)的 DOM -->
<div id="main" style="width: 1100px;height:900px;float:left;"></div>
<div id="bar" style="width:700px;height:900px;float:right;"></div>
</div>
<script>
var ggDatas,yybData={},selSalesCode=""; // 存储个股龙虎榜数据和营业部数据
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope,$http,$filter) {
$scope.addDate = function(a,dadd){
a = a.valueOf();
a = a + dadd * 24 * 60 * 60 * 1000;
a = new Date(a);
return a;
};
$scope.ggAllCount=0;
$scope.ggCurCount=0;
$scope.ggNum = 50;
$scope.ggMax = 200;
$scope.yybMax = 50;
$scope.yybNum = 10;
$scope.timeTo = new Date();
$scope.timeFrom = $scope.addDate(new Date(),-1);
$scope.timeFromMax = $scope.addDate(new Date(),-1);
$scope.timeToMax = new Date();
$scope.ggVarName = "ggDatas";
$scope.yybVarName = "yybData";
$scope.yybGGCodeTag = ".SC";
$scope.yybGGCodeTag2 = "SC";
$scope.dateValide = function(){
if(!$scope.timeTo)
$scope.timeTo = new Date();
if(!$scope.timeFrom)
$scope.timeFrom = $scope.addDate(new Date(),-1);
return $scope.timeTo && $scope.timeFrom && $scope.timeTo.getTime() > $scope.timeFrom.getTime();
}
$scope.doDownloadYYB = function(){
curSalesCode = selSalesCode;
if(curSalesCode ==""){
alert("请点击选择营业部");
return;
}
var YYBList = $scope.jsonData.edges.filter(function(e){
return e.other.data2.SalesCode == curSalesCode;
});
var fileStr = "\n";
for (var i = 0 ; i < YYBList.length; i++) {
var yyb = YYBList[i].other.data2;
var gg = YYBList[i].other.data1;
fileStr += ''+(gg.SCode.substring(0,1)=="6"?"1":"0") + gg.SCode + "\n";
}
var blob = new Blob([fileStr],{type:"text/plain"});
var fileName = "龙虎榜_"
+$filter("date")($scope.timeFrom,'yyyyMMdd')
+"_"
+$filter("date")($scope.timeFrom,'yyyyMMdd')
+"_"
+(yyb.SalesName?yyb.SalesName
.replace("责任","")
.replace("股份","")
.replace("有限","")
.replace("公司","")
.replace("证券营业部","")
.replace("营业部",""):"")
+".ebk";
var download2 = $("#download2")[0];
download2.download = fileName;
download2.href = URL.createObjectURL(blob);
download2.click();
}
$scope.doDownloadAll = function(){
if($scope.ggAllCount ==0 || $scope.ggCurCount < $scope.ggAllCount){
alert("数据尚未准备完毕,请等待...");
return;
}
var fileStr = "\n";
for (var i = 0 ; i < ggDatas.data.length; i++) {
var gg = ggDatas.data[i];
fileStr += ''+(gg.SCode.substring(0,1)=="6"?"1":"0") + gg.SCode + "\n";
}
console.log(fileStr);
var blob = new Blob([fileStr],{type:"text/plain"});
var fileName = "龙虎榜_"
+$filter("date")($scope.timeFrom,'yyyyMMdd')
+"_"
+$filter("date")($scope.timeFrom,'yyyyMMdd')
+"_前"
+$scope.ggNum
+"只股票"
+".ebk";
var download1 = $("#download1")[0];
download1.download = fileName;
download1.href = URL.createObjectURL(blob);
download1.click();
}
$scope.getData = function(){
if($scope.ggCurCount < $scope.ggAllCount){
alert("正在检索,请稍后...");
return;
}
ggDatas,yybData={},$scope.ggAllCount=1,$scope.ggCurCount=0,selSalesCode="";
$scope.drawECharts();
// 个股龙虎榜
var ggUrl =
"http://data.eastmoney.com/DataCenter_V3/stock2016/StockStatistic/pagesize="
+ $scope.ggNum
+",page=1,sortRule=-1,sortType="
+",startDate="
+$filter("date")($scope.timeFrom?$scope.timeFrom:new Date(),'yyyy-MM-dd')
+",endDate="
+$filter("date")($scope.timeTo?$scope.timeTo:new Date(),'yyyy-MM-dd')
+",gpfw=0"
+",js="
+$scope.ggVarName
+".html"
+"?rt="
+ new Date().getTime();
//console.log(ggUrl);
$.getScript(ggUrl,function success(response,status){
if(status=='success'){
//console.log($scope.ggVarName,ggDatas);
$scope.ggAllCount = ggDatas.data.length;
if($scope.ggAllCount==0){
alert('期间内没有个股龙虎榜数据。');
$scope.myChart.hideLoading();
return;
}
$scope.getYybData();
} else {
alert('暂时无法抓取个股龙虎榜数据。');
$scope.myChart.hideLoading();
}
});
};
$scope.getYybData = function(){
// 相关营业部统计
for (var i = ggDatas.data.length - 1; i >= 0; i--) {
var gg = ggDatas.data[i];
var yybVarName = $scope.yybVarName + $scope.yybGGCodeTag + gg.SCode;
eval(yybVarName+'={}');
var yybUrl =
"http://data.eastmoney.com/DataCenter_V3/stock2016/BusinessSalesStatistics.ashx?pagesize="
+ $scope.yybNum
+"&page=1&sortRule=-1&sortType="
+"&startDate="
+$filter("date")($scope.timeFrom?$scope.timeFrom:new Date(),'yyyy-MM-dd')
+"&endDate="
+$filter("date")($scope.timeTo?$scope.timeTo:new Date(),'yyyy-MM-dd')
+"&gpfw=0"
+"&js="
+ yybVarName
+"&code="
+gg.SCode
+"&rt="
+ new Date().getTime();
//console.log(yybUrl);
$.getScript(yybUrl,function success(response,status){
if(status=='success'){
//console.log(yybData);
} else {
console.log("没有营业部数据。");
}
$scope.ggCurCount++;
if($scope.ggCurCount>=$scope.ggAllCount){
$scope.makeJson();
}
});
}
};
$scope.makeJson = function(){
var jsonData = {
nodes:[]
,edges:[]
,categories:[]
};
var yybCode = {};
for (var i = 0 ; i < ggDatas.data.length; i++) {
var gg = ggDatas.data[i];
var rgbColor = "#4f19c7";
if(gg.JmMoney){
rgbColor = gg.JmMoney>0?"red":(gg.JmMoney<0?"green":rgbColor);
}
jsonData.categories.push({name:gg.SName});
jsonData.nodes.push({
"color": rgbColor,
"label": gg.SName,
"attributes": {
category: gg.SName
//name:gg.SName
},
"y": Math.random() * 800,
"x": Math.random() * 1000,
"id": gg.SCode,
"other": {type:"gg",data:gg},
"size": (gg.SumCount * 10)>20?20:(gg.SumCount * 10)
});
for (var j = 0 ; j < yybData[$scope.yybGGCodeTag2+gg.SCode].data.length; j++) {
var yyb = yybData[$scope.yybGGCodeTag2+gg.SCode].data[j];
var yybKey = $scope.yybGGCodeTag2+yyb.SalesCode;
var yybTmp = $.exten