Commit bd57cde4 董杰

佳仕达三楼看板最近修改内容

1 个父辈 c2e944ca
......@@ -9,13 +9,139 @@
@time: 2020/9/17 13:45
@desc:
'''
from flask import jsonify,render_template
from flask import jsonify,render_template,request,send_from_directory
from app.api import bp
from config import Config
from pyecharts.charts import Bar,Line
from pyecharts.charts import Bar,Line,Grid, Liquid,Pie
from pyecharts.options.global_options import ThemeType
from pyecharts.faker import Faker
import pyecharts.options as opts
from pyecharts.commons.utils import JsCode
import urllib,json,operator,re
import os
import pymongo
import pandas as pd
import time
def open_url(url):
resp = urllib.request.urlopen(url)
ele_json = json.loads(resp.read())
return ele_json
def format_data():
url = Config.BOX_RATIO_URL
ele_json = open_url(url)
ratio_list = []
for info in ele_json:
current_type_list = []
if info['type'] != 'PACKAGE':
usecount = 0
totalcount = 0
for nummap in info['usageMap'].values():
use_list = []
# if int(nummap['usedCount'])
use_list.append(nummap['sizeStr'])
use_list.append(int(nummap['usedCount']))
usecount += int(nummap['usedCount'])
totalcount += int(nummap['totalCount'])
current_type_list.append(use_list)
current_ratio = usecount / totalcount
current_ratio = round(float(current_ratio),4)
# print (current_ratio)
# current_ratio = float(('%.2f' % current_ratio))
number = int(re.findall(r"\d+", info['cid'])[0])
# name = info['cid']
ratio_dict = {
'name':info['name'],
'type_map':current_type_list,
'ratio': current_ratio,
'box_num':totalcount,
'number': number
}
ratio_list.append(ratio_dict)
ratio_list = sorted(ratio_list, key=operator.itemgetter('number'))[0:20]
print (ratio_list)
return ratio_list
@bp.route('/boxstate')
def boxstate():
return render_template("boxstate.html")
\ No newline at end of file
data = format_data()
# print (type(data[0]['ratio']))
# print (data[0]['ratio'])
grid_list = []
for current in data:
# print (current['ratio'])
l = (
Liquid()
.add("lq", [current['ratio']], center=["75%", "50%"],is_outline_show=False,label_opts=opts.LabelOpts(formatter=JsCode(
"""function (param) {
return (Math.floor(param.value * 10000) / 100) + '%';
}"""
),position="inside",font_size=50))
.set_global_opts(title_opts=opts.TitleOpts(title='总容量' + str(current['box_num']),title_textstyle_opts=opts.TextStyleOpts(color="yellow"),))
.set_series_opts(type='liquidFill',radius='80%'))
c = (
Pie()
.add("", current['type_map'],center=["30%", "50%"])
# .set_colors(["blue", "green", "yellow", "red", "pink", "orange", "purple"])
.set_global_opts(legend_opts=opts.LegendOpts(is_show=False))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}",color="rgba(255, 255, 255, 1)"))
)
grid = Grid().add(l, grid_opts=opts.GridOpts()).add(c, grid_opts=opts.GridOpts())
grid_list.append(grid.dump_options())
return render_template("boxstate.html",grid=grid_list)
# 连接数据库
def conn_mongo(table,path):
mongo_client = pymongo.MongoClient(host='localhost', port=27017)
db = mongo_client['qisda']
db.authenticate("admin", "123")
if table == 'alarmagv':
cach = db.alarmagv
elif table == 'ng':
cach = db.collectNg
else:
cach = db.stockqty
data=cach.find()
mongo_client.close()
df = pd.DataFrame(data)
df = df.drop('_id', 1)
if table == 'stock':
cols = list(df)
# move the column to head of list using index, pop and insert
cols.insert(1, cols.pop(cols.index('qty_out')))
# use ix to reorder
df = df.loc[:, cols]
df.to_csv(path,encoding="utf_8_sig")
# 下载agv错误信息
@bp.route('/downloadagv/', methods=['GET'], strict_slashes=False)
def downloadagv():
# basepath = os.path.dirname(__file__)
c_path = "D:/qisda_charts/app/static/data/"
file_path = os.path.join(c_path, 'agverror.csv')
table = 'alarmagv'
conn_mongo(table,file_path)
if request.method == "GET":
if os.path.isfile(os.path.join(c_path, 'agverror.csv')):
return send_from_directory(c_path, 'agverror.csv', as_attachment=True)
@bp.route('/downloadstock/', methods=['GET'], strict_slashes=False)
def downloadstock():
c_path = "D:/qisda_charts/app/static/data/"
file_path = os.path.join(c_path, 'stock.csv')
table = 'stock'
conn_mongo(table, file_path)
if request.method == "GET":
if os.path.isfile(os.path.join(c_path, 'stock.csv')):
return send_from_directory(c_path, 'stock.csv', as_attachment=True)
@bp.route('/downloadng/', methods=['GET'], strict_slashes=False)
def downloadng():
c_path = "D:/qisda_charts/app/static/data/"
file_path = os.path.join(c_path, 'collectNg.csv')
table = 'ng'
conn_mongo(table, file_path)
if request.method == "GET":
if os.path.isfile(os.path.join(c_path, 'collectNg.csv')):
return send_from_directory(c_path, 'collectNg.csv', as_attachment=True)
\ No newline at end of file
......@@ -13,6 +13,12 @@ from datetime import datetime,timedelta
import urllib.request
import operator
import re
import threading
import logging
agv_error = {}
is_start = True
bar_data = {}
def iso2timestamp(datestamp, format='%Y-%m-%d %H:%M:%S',timespec='seconds'):
......@@ -38,71 +44,43 @@ def local2utc(local_st):
utc_st = datetime.utcfromtimestamp(time_struct)
return utc_st
# def get_data():
# # Get the top10 products
# conn = pymysql.connect(host="127.0.0.1", user="root", password="", db="test", charset="utf8")
# cur = conn.cursor()
# sql = '''
# SELECT
# DATE(更新时间) AS date,
# COUNT(*) AS num
# FROM
# erp_source1_v1
# WHERE
# `类型` = '入库'
# AND DATE(更新时间) > '2020-08-21'
# GROUP BY
# date
# ORDER BY
# date;
# '''
# cur.execute(sql)
# see = cur.fetchall()
# date_list = []
# count_list = []
# jsonData = {}
# for data in see:
# # legname.append(data[0])
# date_list.append(data[0]) # 获取日期数据
# count_list.append(data[1]) # 获取count数据
# jsonData['date'] = date_list
# jsonData['count'] = count_list
#
# return (date_list,count_list)
def conn_mongo_datalog(start,end):
mongo_client = pymongo.MongoClient(host='localhost', port=27017)
# current_dbname=Config.DB_NAME
# db = mongo_client[current_dbname]
db = mongo_client['qisda']
db.authenticate("admin", "123")
cach = db.dataLog
start_date = local2utc(start)
end_date = local2utc(end)
# start_date = datetime(2020,8,25,16,00,00)
# end_date = datetime(2020,8,26,16,00,00)
# start_date = datetime(2020,8,25,8,00,00)
# end_date = datetime(2020,8,31,8,00,00)
data=list(cach.find({"updateDate": {"$gte": start_date, "$lt": end_date}}))
mongo_client.close()
df = pd.DataFrame(data)
return (df)
def process_datalog_hour():
def process_datalog_hour(start,end):
# now = datetime.now()
start=datetime.now() - timedelta(hours=12)
start = datetime(start.year, start.month, start.day, start.hour, start.minute, start.second)
end = datetime.now() + timedelta(hours=12)
end = datetime(end.year, end.month, end.day, end.hour, end.minute, end.second)
print("*********************datalog**24小时数据准备中*******************")
# start=datetime.now() - timedelta(hours=24)
# start = datetime(start.year, start.month, start.day, start.hour, start.minute, start.second)
# end = datetime.now() + timedelta(hours=12)
# end = datetime(end.year, end.month, end.day, end.hour, end.minute, end.second)
df = conn_mongo_datalog(start,end)
if not df.empty:
if not df.empty and 'posName' in df:
df['updateDate'] = df['updateDate'].apply(iso2timestamp)
temp_df_in = df[(df['type'] == 1) & (df['status'] != 'CANCEL') & (df['status'] != 'WAIT') & (df['posName'] !="")]
temp_df_in = df[(df['type'] == 1) & (df['status'] != 'CANCEL') & (df['status'] != 'WAIT') & (df['posName'].notnull())]
df_in = temp_df_in[['updateDate', 'status']]
datalog_hour_in = df_in['updateDate'].groupby(df_in['updateDate'].map(lambda x: x[5:13])).count()
hour_list_in = datalog_hour_in.index.to_list()
count_list_in = datalog_hour_in.values.tolist()
hour_list_in,count_list_in = check_hour_zero(start,end,hour_list_in,count_list_in)
# check_hour_zero(start, now, hour_list_in, count_list_in)
temp_df_out = df[(df['type'] == 2) & (df['status'] != 'CANCEL') & (df['status'] != 'WAIT') & (df['posName'] !="")]
if 'operator' in df.columns.to_list():
temp_df_out = df[(df['type'] == 2) & (df['status'] != 'CANCEL') & (df['status'] != 'WAIT') & (df['posName'].notnull()) & (df['operator'] != 'admin-clear')]
else:
temp_df_out = df[(df['type'] == 2) & (df['status'] != 'CANCEL') & (df['status'] != 'WAIT') & (df['posName'].notnull())]
df_out = temp_df_out[['updateDate', 'status']]
datalog_hour_out = df_out['updateDate'].groupby(df_out['updateDate'].map(lambda x: x[5:13])).count()
hour_list_out = datalog_hour_out.index.to_list()
......@@ -140,12 +118,16 @@ def process_datalog_day(n=5):#默认取前10天(含当天)
while n >=0:
start = get_days_before_today(n)
start = datetime(start.year,start.month,start.day,8,0,0)
# start = datetime(2020, 11, 27, 8, 0, 0)
end = start + timedelta(days=1)
df = conn_mongo_datalog(start, end)
if not df.empty:
if not df.empty and 'posName' in df:
# df['updateDate'] = df['updateDate'].apply(iso2timestamp)
temp_df_in = df[(df['type'] == 1) & (df['status'] != 'CANCEL') & (df['status'] != 'WAIT') & (df['posName'] != "")]
temp_df_out = df[(df['type'] == 2) & (df['status'] != 'CANCEL') & (df['status'] != 'WAIT') & (df['posName'] != "")]
temp_df_in = df[(df['type'] == 1) & (df['status'] != 'CANCEL') & (df['status'] != 'WAIT') & (df['posName'].notnull())]
if 'operator' in df.columns.to_list():
temp_df_out = df[(df['type'] == 2) & (df['status'] != 'CANCEL') & (df['status'] != 'WAIT') & (df['posName'].notnull()) & (df['operator'] != 'admin-clear')]
else:
temp_df_out = df[(df['type'] == 2) & (df['status'] != 'CANCEL') & (df['status'] != 'WAIT') & (df['posName'].notnull())]
current_num_in = temp_df_in.shape[0]
current_num_out = temp_df_out.shape[0]
day_count_list_in.append(current_num_in)
......@@ -157,10 +139,13 @@ def process_datalog_day(n=5):#默认取前10天(含当天)
add_start = end
add_end = end + timedelta(days=1)
df = conn_mongo_datalog(add_start, add_end)
if not df.empty:
if not df.empty and 'posName' in df:
# df['updateDate'] = df['updateDate'].apply(iso2timestamp)
temp_df_in = df[(df['type'] == 1) & (df['status'] != 'CANCEL') & (df['status'] != 'WAIT') & (df['posName'] != "")]
temp_df_out = df[(df['type'] == 2) & (df['status'] != 'CANCEL') & (df['status'] != 'WAIT') & (df['posName'] != "")]
temp_df_in = df[(df['type'] == 1) & (df['status'] != 'CANCEL') & (df['status'] != 'WAIT') & (df['posName'].notnull())]
if 'operator' in df.columns.to_list():
temp_df_out = df[(df['type'] == 2) & (df['status'] != 'CANCEL') & (df['status'] != 'WAIT') & (df['posName'].notnull()) & (df['operator'] != 'admin-clear')]
else:
temp_df_out = df[(df['type'] == 2) & (df['status'] != 'CANCEL') & (df['status'] != 'WAIT') & (df['posName'].notnull())]
current_num_in = temp_df_in.shape[0]
current_num_out = temp_df_out.shape[0]
day_count_list_in.append(current_num_in)
......@@ -176,22 +161,22 @@ def conn_mongo_outinfo(start,end):
# current_dbname = Config.DB_NAME
# db = mongo_client[current_dbname]
db = mongo_client['qisda']
db.authenticate("admin", "123")
cach = db.outInfo
start_date = local2utc(start)
end_date = local2utc(end)
# start_date = datetime(2020,8,25,16,00,00)
# end_date = datetime(2020,8,26,16,00,00)
# start_date = datetime(2020,8,25,8,00,00)
# end_date = datetime(2020,8,31,8,00,00)
data = list(cach.find({"taskNeedOutDate": {"$gte": start_date, "$lt": end_date}}))
mongo_client.close()
df = pd.DataFrame(data)
return (df)
def process_outinfo_hour():
start = datetime.now() - timedelta(hours=12)
start = datetime(start.year, start.month, start.day, start.hour, start.minute, start.second)
end = datetime.now() + timedelta(hours=12)
end = datetime(end.year, end.month, end.day, end.hour, end.minute, end.second)
print("*******************outinfo**24小时数据准备中*********************")
def process_outinfo_hour(start,end):
# start = datetime.now() - timedelta(hours=24)
# start = datetime(start.year, start.month, start.day, start.hour, start.minute, start.second)
# end = datetime.now() + timedelta(hours=12)
# end = datetime(end.year, end.month, end.day, end.hour, end.minute, end.second)
df = conn_mongo_outinfo(start,end)
if not df.empty:
df['taskNeedOutDate'] = df['taskNeedOutDate'].apply(iso2timestamp)
......@@ -221,6 +206,8 @@ def process_outinfo_day(n=5):#默认取前6天(含当天)
else:
current_num = df['totalBindNum'].sum()
outcount_list.append(current_num)
else:
outcount_list.append(0)
n -= 1
# 处理向后一天数据
add_start = end
......@@ -233,32 +220,18 @@ def process_outinfo_day(n=5):#默认取前6天(含当天)
else:
current_num = df['totalBindNum'].sum()
outcount_list.append(current_num)
else:
outcount_list.append(0)
# outday_list.append(add_start)
date = pd.date_range(first_start, add_start)
outday_list = [datetime.strftime(x, '%F') for x in date]
return (outday_list,outcount_list)
# def check_zero(start,end,day_list,count_list):
# print ("7天原始数据,日期{},数量{}".format(day_list,count_list))
# date = pd.date_range(start, end)
# date_list = [datetime.strftime(x, '%F') for x in date]
# if len(day_list) == len(date_list):
# return (day_list,count_list)
# else:
# l = len(date_list)
# new_l = [0]*l
# for index,value in enumerate(date_list):
# for index1,value1 in enumerate(day_list):
# if value == value1:
# new_l[index] = count_list[index1]
# print ("7天补全数据,日期{},数量{}".format(date_list,new_l))
# return (date_list,new_l)
# # print (date_list)
def check_hour_zero(start,end,hour_list,count_list):
print ("24小时原始数据,时间{},数量{}".format(hour_list,count_list))
date_hour_list = []
for i in range(25):
for i in range(24):
date_hour = (end - timedelta(hours=(i))).strftime('%m-%d %H')
date_hour_list.append(date_hour)
date_hour_list = list(reversed(date_hour_list))
......@@ -275,28 +248,59 @@ def check_hour_zero(start,end,hour_list,count_list):
print("24小时补全数据,时间{},数量{}".format(date_hour_list, new_l))
return (date_hour_list,new_l)
@bp.route('/')
@bp.route('/index')
def index():
stop=0
def get_hour_date():
hour_now = datetime.now()
if hour_now.hour >= 8:
b_start = hour_now-timedelta(days=1)
b_start = datetime(b_start.year, b_start.month, b_start.day, 8, 0, 0)
b_end = datetime(hour_now.year, hour_now.month, hour_now.day, 7, 59, 59)
c_start = datetime(hour_now.year, hour_now.month, hour_now.day, 8, 0, 0)
c_end = hour_now+timedelta(days=1)
c_end = datetime(c_end.year, c_end.month, c_end.day, 7, 59, 59)
print (b_start,b_end,c_start,c_end)
else:
b_start = hour_now-timedelta(days=2)
b_start_before = hour_now-timedelta(days=1)
b_start = datetime(b_start.year, b_start.month, b_start.day, 8, 0, 0)
b_end = datetime(b_start_before.year, b_start_before.month, b_start_before.day, 7, 59, 59)
c_start = datetime(b_start_before.year, b_start_before.month, b_start_before.day, 8, 0, 0)
c_end = datetime(hour_now.year, hour_now.month, hour_now.day, 7, 59, 59)
print (b_start,b_end,c_start,c_end)
return b_start,b_end,c_start,c_end
def cach_data():
global bar_data
b_start_hour,b_end_hour,c_start_hour,c_end_hour = get_hour_date()
print("*******************outinfo**7天数据准备中*********************")
outday_list,outcount_list=process_outinfo_day()
print("outinfo**7天数据{}{}".format(outday_list,outcount_list))
outcount_list1 = [int(x) for x in outcount_list]
outhour_list, outcounthour_list = process_outinfo_hour()
print ("24小时需求总数量{}".format(sum(outcounthour_list)))
print("*******************outinfo**前24h数据准备中*********************")
outhour_list, outcounthour_list = process_outinfo_hour(b_start_hour,b_end_hour)
print("*******************outinfo**后24h数据准备中*********************")
c_outhour_list, c_outcounthour_list = process_outinfo_hour(c_start_hour,c_end_hour)
print ("前24小时需求总数量{}".format(sum(outcounthour_list)))
print ("后24小时需求总数量{}".format(sum(c_outcounthour_list)))
print("*******************datalog**7天数据准备中*********************")
day_count_list_in,day_count_list_out = process_datalog_day()
print("datalog**7天数据出库--{},入库--{}".format(day_count_list_in, day_count_list_in))
log_data=process_datalog_hour()
print("datalog**7天数据出库--{},入库--{}".format(day_count_list_out, day_count_list_in))
print("*******************datalog**前24h数据准备中*********************")
log_data=process_datalog_hour(b_start_hour,b_end_hour)
hour_list_in = log_data.get('hour_list_in')
count_list_in = log_data.get('count_list_in')
print ("24小时入库总数量{}".format(sum(count_list_in)))
print ("24小时入库总数量{}".format(sum(count_list_in)))
hour_list_out = log_data.get('hour_list_out')
count_list_out = log_data.get('count_list_out')
print("24小时出库总数量{}".format(sum(count_list_out)))
print("前24小时出库总数量{}".format(sum(count_list_out)))
print("*******************datalog**后24h数据准备中*********************")
log_data=process_datalog_hour(c_start_hour,c_end_hour)
c_hour_list_in = log_data.get('hour_list_in')
c_count_list_in = log_data.get('count_list_in')
print ("后24小时入库总数量{}".format(sum(c_count_list_in)))
c_hour_list_out = log_data.get('hour_list_out')
c_count_list_out = log_data.get('count_list_out')
print("后24小时出库总数量{}".format(sum(c_count_list_out)))
y_total = [i + j for i, j in zip(day_count_list_in, day_count_list_out)]
bar = (
Bar(init_opts=opts.InitOpts(bg_color='rgba(255,255,255,0.7)',
......@@ -307,9 +311,22 @@ def index():
.add_yaxis("需求数量", outcounthour_list, stack="outinfo")
.add_yaxis("实际出库数量", count_list_out,stack="datalog")
.add_yaxis("实际入库数量", count_list_in, stack="datalog")
.set_series_opts(label_opts=opts.LabelOpts(is_show=False, font_size=14))
.set_series_opts(label_opts=opts.LabelOpts(is_show=False, font_size=14),markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(y=500, name="达标线=500")],linestyle_opts=opts.LineStyleOpts(width = 3,color = 'red',)))
.set_global_opts(xaxis_opts=opts.AxisOpts(name='时间/小时',axislabel_opts=opts.LabelOpts(rotate=-60)),
yaxis_opts=opts.AxisOpts(name='单位:盘',max_=600,split_number=6))
)
barc = (
Bar(init_opts=opts.InitOpts(bg_color='rgba(255,255,255,0.7)',
theme=ThemeType.LIGHT
)
)
.add_xaxis(c_hour_list_in)
.add_yaxis("需求数量", c_outcounthour_list, stack="outinfo")
.add_yaxis("实际出库数量", c_count_list_out,stack="datalog")
.add_yaxis("实际入库数量", c_count_list_in, stack="datalog")
.set_series_opts(label_opts=opts.LabelOpts(is_show=False, font_size=14),markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(y=500, name="达标线=500")],linestyle_opts=opts.LineStyleOpts(width = 3,color = 'red',)))
.set_global_opts(xaxis_opts=opts.AxisOpts(name='时间/小时',axislabel_opts=opts.LabelOpts(rotate=-60)),
yaxis_opts=opts.AxisOpts(name='单位:盘',splitline_opts=False,splitarea_opts=True))
yaxis_opts=opts.AxisOpts(name='单位:盘',max_=600,split_number=6))
)
bar1 = (
Bar(init_opts=opts.InitOpts(bg_color='rgba(255,255,255,0.7)',
......@@ -320,11 +337,7 @@ def index():
.add_yaxis("需求数量", outcount_list1, stack="outinfo_day")
.add_yaxis("实际出库数量", day_count_list_out, stack="datalog_day",)
.add_yaxis("实际入库数量", day_count_list_in, stack="datalog_day")
.set_series_opts(label_opts=opts.LabelOpts(is_show=True,position='inside', font_size=12),
markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(y=12000, name="达标线=12000")],linestyle_opts=opts.LineStyleOpts(width = 3,color = 'red',)))
# .set_global_opts(title_opts=opts.TitleOpts(title='7天实际出入库', subtitle='需求-实际'),
# xaxis_opts=opts.AxisOpts(name='时间'),
# yaxis_opts=opts.AxisOpts(name='单位:盘'))
.set_series_opts(label_opts=opts.LabelOpts(is_show=True,position='inside', font_size=12),markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(y=12000, name="达标线=12000")],linestyle_opts=opts.LineStyleOpts(width = 3,color = 'red',)))
.set_global_opts(xaxis_opts=opts.AxisOpts(name='时间/天',axislabel_opts=opts.LabelOpts(rotate=-40)),
yaxis_opts=opts.AxisOpts(name='单位:盘',max_=13000,split_number=13),
)
......@@ -340,19 +353,37 @@ def index():
)
)
bar1.overlap(line)
# print(bar.render_embed())
# print(bar.dump_options())
return render_template(
"index.html",
bar_data=bar.dump_options(),
bar_data1 = bar1.dump_options(),
stop=stop
)
# hourdata=bar.dump_options(),
# daydata = bar1.dump_options()
bar_data['hourdata'] = bar
bar_data['chourdata'] = barc
bar_data['daydata'] = bar1
try:
qty = []
# day_count_list_in, day_count_list_out = process_datalog_day()
# outday_list, outcount_list = process_outinfo_day()
# outcount_list1 = [int(x) for x in outcount_list]
n = len(outday_list)
for i in range(n):
qty_dict = {
'Date': outday_list[i],
'qty_in': day_count_list_in[i],
'qty_out': day_count_list_out[i],
'qty_need': outcount_list1[i],
}
qty.append(qty_dict)
upload_qty(qty)
print("出入库数据上传成功")
except Exception as e:
print("数据上传失败:{}".format(e))
def open_url(url):
resp = urllib.request.urlopen(url)
ele_json = json.loads(resp.read())
return ele_json
try:
resp = urllib.request.urlopen(url,timeout=0.5)
ele_json = json.loads(resp.read())
return ele_json
except Exception as e:
print("出现异常:" + str(e))
def add_outinfo(equip_info,origin_equip,sign):
equips = []
......@@ -377,12 +408,20 @@ def add_outinfo(equip_info,origin_equip,sign):
add_equip = [y for y in (equips + origin_equip) if y not in c]
for add in add_equip:
number = int(re.findall(r"\d+", add)[1])
add_dict = {
'name':add,
'des':'状态正常',
'state':'正常',
'number':number
}
if add in ['4D-7线','4D-13线','4D-14线','4D-15线']:
add_dict = {
'name': add,
'des': '--',
'state': '--',
'number': number
}
else:
add_dict = {
'name':add,
'des':'状态正常',
'state':'正常',
'number':number
}
equip_info.append(add_dict)
elif sign == 'box':
for equip in equip_info:
......@@ -400,9 +439,113 @@ def add_outinfo(equip_info,origin_equip,sign):
equip_info.append(add_dict)
return equip_info
def process_agv_error(info):
alarm_agv = []
global agv_error
for agv in info:
if agv['state'] == '异常':
if agv['name'] in agv_error.keys():
agv_error[agv['name']]['des'] = agv['des']
agv_error[agv['name']]['updatetime'] = datetime.utcnow()
else:
current_dict = {}
current_dict['name'] = agv['name']
current_dict['des'] = agv['des']
current_dict['starttime'] = datetime.utcnow()
current_dict['updatetime'] = datetime.utcnow()
agv_error[agv['name']] = current_dict
else:
if agv['name'] in agv_error.keys():
current_name = agv['name']
if (datetime.utcnow() - agv_error[current_name]['updatetime']).seconds > 10:
if '分钟' in agv_error[current_name]['des']:
total_time = re.findall(r"(\d+.\d+)分钟",agv_error[current_name]['des'])
total_time = str(total_time[0]) + '分钟'
elif '秒' in agv_error[current_name]['des']:
total_time = re.findall(r"(\d+.\d+)秒", agv_error[current_name]['des'])
total_time = str(total_time[0]) + '秒'
else:
total_time = '未定义时间'
alarm_dict = {
'name':agv_error[current_name]['name'],
'des':agv_error[current_name]['des'],
'starttime':agv_error[current_name]['starttime'],
'updatetime':datetime.utcnow(),
'endtime':datetime.utcnow(),
'totaltime':total_time
}
alarm_agv.append(alarm_dict)
del agv_error[current_name]
logging.info('agv erroring:{},ready upload:{}'.format(agv_error, alarm_agv))
return alarm_agv
def put_agv_error(alarm_agv):
if alarm_agv:
mongo_client = pymongo.MongoClient(host='localhost', port=27017)
db = mongo_client['qisda']
db.authenticate("admin", "123")
cach = db.alarmagv
cach.insert(alarm_agv)
mongo_client.close()
print ("agv错误信息写入成功")
def autoagvinfo():
url = Config.URL
ele_json = open_url(url)
info_agvs = []
info_agv = {}
info_agv_error = {}
for info in ele_json:
if (info['name'])[-2:] == '号车':
if info['type'] == 0:
state = '异常'
des = info['msgValue']
else:
if info['msgValue'] == 'Standby':
state = '正常'
des = '待机位'
elif info['msgValue'] == 'AutoCharge':
state = '充电中'
des = '充电'
else:
state = '正常'
des = info['msgValue']
number = int(re.findall(r"\d+", info['name'])[0])
# print (number)
c_dict = {
'name':info['name'],
'des':des,
'state':state,
'number':number}
if state == '异常':
info_agv_error[info['name']] = c_dict
else:
info_agv[info['name']] = c_dict
if info_agv_error:
for key, value in info_agv_error.items():
if key in info_agv.keys():
del info_agv[key]
info_agvs.append(value)
for key,value in info_agv.items():
info_agvs.append(value)
return info_agvs
def upload_qty(qty):
mongo_client = pymongo.MongoClient(host='localhost', port=27017)
db = mongo_client['qisda']
db.authenticate("admin", "123")
for line in qty:
date = line['Date']
cach = db.stockqty
data = cach.find_one({"Date":date})
if data:
cach.update({"Date": date}, {'$set': {"qty_in": line['qty_in'],"qty_out":line['qty_out'],"qty_need":line['qty_need']}})
else:
cach.insert(line)
mongo_client.close()
#def download_stockqty():
@bp.route('/getagvinfo',methods=['POST'])
......@@ -415,8 +558,13 @@ def getagvinfo():
for info in ele_json:
if (info['name'])[-2:] == '号车':
if info['type'] == 0:
state = '异常'
des = info['msgValue']
if info['msgValue'] == '停用':
state = '停用'
elif info['msgValue'] == '离线':
state = '离线'
else:
state = '异常'
else:
if info['msgValue'] == 'Standby':
state = '正常'
......@@ -447,16 +595,16 @@ def get4cinfo():
current_4c = Config.CONFIG_4C
info_4c = []
for info in ele_json:
if info['msgKey'][8:9] == 'C':
if info['msgKey'][8:9] == 'C' and 'Feed' not in info['name']:
if info['type'] == 0:
if info['name'] in ['4C-15线','4C-14线','4C-10线']:
if info['name'] in ['4C-15线','4C-14线','4C-10线','4C-2线']:
state = '--'
else:
state = '异常'
else:
state = '正常'
number = int(re.findall(r"\d+", info['name'])[1])
if info['name'] in ['4C-15线', '4C-14线', '4C-10线']:
if info['name'] in ['4C-15线', '4C-14线', '4C-10线','4C-2线']:
des = '--'
else:
des=info['msgValue']
......@@ -481,15 +629,22 @@ def get4dinfo():
current_4d = Config.CONFIG_4D
info_4d = []
for info in ele_json:
if info['msgKey'][8:9] == 'D':
if info['msgKey'][8:9] == 'D' and 'Feed' not in info['name']:
if info['type'] == 0:
state = '异常'
if info['name'] in ['4D-7线','4D-13线','4D-14线']:
state = '--'
else:
state = '异常'
else:
state = '正常'
number = int(re.findall(r"\d+", info['name'])[1])
if info['name'] in ['4D-7线','4D-13线','4D-14线']:
des = '--'
else:
des=info['msgValue']
c_dict = {
'name': info['name'],
'des': info['msgValue'],
'des': des,
'state': state,
'number':number}
info_4d.append(c_dict)
......@@ -507,7 +662,7 @@ def getboxinfo():
ele_json = open_url(url)
current_box = Config.CONFIG_BOX
current_box_status = Config.CONFIG_BOX_STATUS
ratio_list = get_boxratio()
ratio_dict = get_boxratio()
info_box = []
for info in ele_json:
if info['cid'][0:7] == 'line-ac':
......@@ -529,6 +684,13 @@ def getboxinfo():
'state': state,
'number':number}
info_box.append(c_dict)
# if number not in [25,26]:
# c_dict = {
# 'name': info['cid'],
# 'des': des,
# 'state': state,
# 'number':number}
# info_box.append(c_dict)
else:
pass
# info_4d = json.dumps(info_4d)
......@@ -536,21 +698,58 @@ def getboxinfo():
info_box = add_outinfo(info_box, current_box,sign)
info_box = sorted(info_box, key=operator.itemgetter('number'))
info_boxs = [info_box[i:i + 2] for i in range(0, len(info_box), 2)]
temp_list = []
for index,value in enumerate(info_boxs):
str1 = '云料仓' + str(index+1) + '-' +'1'
str2 = '云料仓' + str(index+1) + '-' +'2'
temp_list.append(str1)
temp_list.append(str2)
for index,s in enumerate(info_box):
info_box[index]['name'] = temp_list[index]
info_box[index]['ratio'] = ratio_list[index]
return json.dumps(info_box)
box_trans = Config.CONFIG_BOX_TRANS
# temp_list = []
# for index,value in enumerate(info_boxs):
# str1 = '云料仓' + str(index+1) + '-' +'1'
# str2 = '云料仓' + str(index+1) + '-' +'2'
# temp_list.append(str1)
# temp_list.append(str2)
# for index,s in enumerate(info_box):
# info_box[index]['name'] = temp_list[index]
# info_box[index]['ratio'] = ratio_list[index]
# return json.dumps(info_box)
json_data = []
for s in info_box:
ratio = ratio_dict.get(s['name'],0)
trans_name = box_trans.get(s['name'],'')
if trans_name:
json_dict = {
'name': trans_name,
'des': s['des'],
'state': s['state'],
'number':s['number'],
'ratio':ratio
}
json_data.append(json_dict)
return json.dumps(json_data)
@bp.route('/drawchartday')
def drawchartday():
global bar_data
if bar_data:
daydata = bar_data.get('daydata','')
return daydata.dump_options_with_quotes()
@bp.route('/drawcharthour')
def drawcharthour():
global bar_data
if bar_data:
hourdata = bar_data.get('hourdata','')
return hourdata.dump_options_with_quotes()
@bp.route('/drawcharthourc')
def drawcharthourc():
global bar_data
if bar_data:
chourdata = bar_data.get('chourdata','')
return chourdata.dump_options_with_quotes()
def get_boxratio():
url = Config.BOX_RATIO_URL
ele_json = open_url(url)
ratio_list = []
# ratio_list = []
ratio_dict = {}
for info in ele_json:
usecount = 0
totalcount = 0
......@@ -558,24 +757,126 @@ def get_boxratio():
usecount += int(nummap['usedCount'])
totalcount += int(nummap['totalCount'])
current_ratio = usecount/totalcount
if current_ratio > 1:
current_ratio = 1
current_ratio = ('%.2f%%' % (current_ratio * 100))
number = int(re.findall(r"\d+", info['cid'])[0])
# number = int(re.findall(r"\d+", info['cid'])[0])
ratio_dict[info['cid']] = current_ratio
# name = info['cid']
ratio_dict = {
'ratio':current_ratio,
'number':number
}
ratio_list.append(ratio_dict)
ratio_list = sorted(ratio_list, key=operator.itemgetter('number'))
out_list = []
for m in ratio_list:
out_list.append(m['ratio'])
return out_list
# ratio_dict = {
# 'ratio':current_ratio,
# 'number':number
# }
# ratio_list.append(ratio_dict)
# ratio_list = sorted(ratio_list, key=operator.itemgetter('number'))
# out_list = []
# for m in ratio_list:
# out_list.append(m['ratio'])
# out_list = out_list[0:18]
# print (out_list)
return ratio_dict
def conn_mongo_alarminfo(start,end):
mongo_client = pymongo.MongoClient(host='localhost', port=27017)
db = mongo_client['qisda']
db.authenticate("admin", "123")
cach = db.alarmInfo
start_date = local2utc(start)
end_date = local2utc(end)
data = list(cach.find({"createDate": {"$gte": start_date, "$lt": end_date}}))
mongo_client.close()
return (data)
def check_type(date,data):
count1 = count2 = count3 = count4 = count5 = 0
info_list = [x['alarmMsg'] for x in data]
for line in info_list:
if '未扫到条码' in line or '未找到有效条码' in line:
count1 += 1
elif '入库判定NG' in line or '找到多个有效条码' in line or '已在' in line or '操作未完成' in line:
count2 += 1
elif '对应数量<=0' in line or '收料接口处理异常' in line:
count3 += 1
elif '无法收料' in line:
count4 += 1
elif '未找到可用的' in line or '已满' in line:
count5 += 1
else:
pass
mongo_client = pymongo.MongoClient(host='localhost', port=27017)
db = mongo_client['qisda']
cach = db.collectNg
data = cach.find_one({"Date": date})
if data:
cach.update({"Date": date},{'$set': {"codetype": count1, "operation": count2, "api": count3,"DN": count4,"stock": count5,'updateDate':datetime.utcnow()}})
else:
ks = {'Date':date,"codetype": count1, "operation": count2, "api": count3,"DN": count4,"stock": count5,'createDate':datetime.utcnow(),'updateDate':datetime.utcnow()}
cach.insert(ks)
logging.info('ng统计消息上传成功')
mongo_client.close()
def serverpost():
global is_start
while is_start:
try:
info_agv = autoagvinfo()
error_info = process_agv_error(info_agv)
put_agv_error(error_info)
logging.info('agv error info collecting')
except Exception as e:
logging.info('agv error info collecting failed:{}'.format(e))
finally:
time.sleep(2)
def upload_nginfo():
global is_start
while is_start:
try:
now = datetime.now()
start = datetime(now.year,now.month,now.day,0,0,0)
end = datetime(now.year,now.month,now.day,23,59,59)
date=now.strftime("%Y-%m-%d")
data = conn_mongo_alarminfo(start,end)
check_type(date,data)
except Exception as e:
logging.info('NG info collecting failed:{}'.format(e))
finally:
time.sleep(60*60)
def servermongo():
global is_start
while is_start:
try:
cach_data()
except Exception as e:
logging.info('获取图表数据失败:{}'.format(e))
finally:
time.sleep(300)
@bp.route('/')
@bp.route('/index')
def index():
return render_template("index.html")
@bp.route('/state')
def state():
return render_template("state.html")
@bp.route('/dataload')
def dataload():
return render_template("download.html")
threads = []
threads.append(threading.Thread(target=serverpost))
threads.append(threading.Thread(target=upload_nginfo))
threads.append(threading.Thread(target=servermongo))
for t in threads:
t.start()
print ("启动成功")
from datetime import datetime,timedelta
hour_now = datetime.now()
if hour_now.hour >= 8:
b_start = hour_now-timedelta(days=1)
b_start = datetime(b_start.year, b_start.month, b_start.day, 8, 0, 0)
print (b_start)
b_end = datetime(hour_now.year, hour_now.month, hour_now.day, 7, 59, 59)
print (b_end)
c_start = datetime(hour_now.year, hour_now.month, hour_now.day, 8, 0, 0)
c_end = hour_now+timedelta(days=1)
c_end = datetime(c_end.year, c_end.month, c_end.day, 7, 59, 59)
print (c_start,c_end)
else:
b_start = hour_now-timedelta(days=2)
b_start_before = hour_now-timedelta(days=1)
b_start = datetime(b_start.year, b_start.month, b_start.day, 8, 0, 0)
b_end = datetime(b_start_before.year, b_start_before.month, b_start_before.day, 7, 59, 59)
c_start = datetime(b_start_before.year, b_start_before.month, b_start_before.day, 8, 0, 0)
c_end = datetime(hour_now.year, hour_now.month, hour_now.day, 7, 59, 59)
print (b_start,b_end,c_start,c_end)
\ No newline at end of file
......@@ -474,7 +474,7 @@ a:hover{
}
.table_p table tbody{
color: #ffffff;
font-size: 15px;
font-size: 16px;
}
.table_p table tbody tr:nth-child(2n+1){
background-color: #072951;
......
此文件的差异太大,无法显示。
此文件的差异太大,无法显示。
,Date,codetype,operation,api,DN,stock,createDate,updateDate
0,2020-12-22,0,0,0,0,0,2020-12-22 06:56:29.824,2020-12-22 07:37:10.060
,Date,qty_in,qty_out,qty_need
0,2020-12-16,3557,4643,3277
1,2020-12-17,4623,3923,2893
2,2020-12-18,354,427,172
3,2020-12-19,0,0,0
4,2020-12-20,0,0,0
5,2020-12-21,0,0,0
6,2020-12-22,0,0,0
此文件的差异太大,无法显示。
......@@ -9,9 +9,7 @@
<link href="/static/css/common.css?v=3" rel="stylesheet">
<script src="/static/jquery-3.3.1.min.js"></script>
<script src="/static/echarts.min.js"></script>
<script src="/static/common.js"></script>
<script src="/static/index.js"></script>
<script src="/static/laydate.js"></script>
<script src="/static/echarts-liquidfill.js"></script>
</head>
<body>
<!--顶部-->
......@@ -21,6 +19,7 @@
<li><i class="nav_1"></i><a href="{{ url_for('api.index') }}">数据概况</a> </li>
<li><i class="nav_2"></i><a href="{{ url_for('api.state') }}">设备状态信息</a> </li>
<li class="nav_active"><i class="nav_3"></i><a href="{{ url_for('api.boxstate') }}">料仓库存信息</a> </li>
<li><i class="nav_3"></i><a href="http://10.85.36.58/dashboards/7034c5af-28bb-11ea-873a-94c691a7387d" target="_blank">AGV</a></li>
</ul>
</div>
<div class="header_center left" style="position:relative">
......@@ -30,7 +29,7 @@
</div>
<div class="right nav text_right">
<ul>
<li><i class="nav_3"></i><a href="{{ url_for('api.dataload') }}">数据下载</a></li>
</ul>
</div>
......@@ -38,46 +37,240 @@
<div class="con left">
<!--统计分析图-->
<div class="div_any">
<div class="div_any">
<div class="left div_any01">
<div class="div_any_child" style="height: 300px;">
<div class="div_any_title"><img src="static/images/title_5.png">云料仓1-1</div>
<p id="histogramChart1" class="p_chart"></p>
<div id="main1" style="width:98%;height:93%;display: inline-block;padding-left: 1.25%;padding-right: 1.25%;padding-top:1.25%"></div>
<script type="text/javascript">
var myChart = echarts.init(document.getElementById('main1'));
myChart.setOption({{ grid[0] | safe }});
</script>
</div>
<div class="div_any_child" style="height: 300px;">
<div class="div_any_title"><img src="static/images/title_6.png">云料仓1-2</div>
<p id="histogramChart2" class="p_chart"></p>
<div class="div_any_title"><img src="static/images/title_6.png">云料仓2-1</div>
<div id="main2" style="width:98%;height:93%;display: inline-block;padding-left: 1.25%;padding-right: 1.25%;padding-top:1.25%"></div>
<script type="text/javascript">
var myChart = echarts.init(document.getElementById('main2'));
myChart.setOption({{ grid[2] | safe }});
</script>
</div>
</div>
<div class="left div_any01">
<<div class="div_any_child" style="height: 300px;">
<div class="div_any_title"><img src="static/images/title_5.png">云料仓1-1</div>
<p id="histogramChart1" class="p_chart"></p>
<div class="div_any_child" style="height: 300px;">
<div class="div_any_title"><img src="static/images/title_5.png">云料仓1-2</div>
<div id="main3" style="width:98%;height:93%;display: inline-block;padding-left: 1.25%;padding-right: 1.25%;padding-top:1.25%"></div>
<script type="text/javascript">
var myChart = echarts.init(document.getElementById('main3'));
myChart.setOption({{ grid[1] | safe }});
</script>
</div>
<div class="div_any_child" style="height: 300px;">
<div class="div_any_title"><img src="static/images/title_6.png">云料仓1-2</div>
<p id="histogramChart2" class="p_chart"></p>
<div class="div_any_title"><img src="static/images/title_6.png">云料仓2-2</div>
<div id="main4" style="width:98%;height:93%;display: inline-block;padding-left: 1.25%;padding-right: 1.25%;padding-top:1.25%"></div>
<script type="text/javascript">
var myChart = echarts.init(document.getElementById('main4'));
myChart.setOption({{ grid[3] | safe }});
</script>
</div>
</div>
<div class="left div_any01">
<div class="div_any_child" style="height: 300px;">
<div class="div_any_title"><img src="static/images/title_5.png">云料仓1-1</div>
<p id="histogramChart1" class="p_chart"></p>
<div class="div_any_title"><img src="static/images/title_5.png">云料仓3-1</div>
<div id="main5" style="width:98%;height:93%;display: inline-block;padding-left: 1.25%;padding-right: 1.25%;padding-top:1.25%"></div>
<script type="text/javascript">
var myChart = echarts.init(document.getElementById('main5'));
myChart.setOption({{ grid[4] | safe }});
</script>
</div>
<div class="div_any_child" style="height: 300px;">
<div class="div_any_title"><img src="static/images/title_6.png">云料仓1-2</div>
<p id="histogramChart2" class="p_chart"></p>
<div class="div_any_title"><img src="static/images/title_6.png">云料仓4-1</div>
<div id="main6" style="width:98%;height:93%;display: inline-block;padding-left: 1.25%;padding-right: 1.25%;padding-top:1.25%"></div>
<script type="text/javascript">
var myChart = echarts.init(document.getElementById('main6'));
myChart.setOption({{ grid[6] | safe }});
</script>
</div>
</div>
<div class="left div_any01">
<div class="div_any_child" style="height: 300px;">
<div class="div_any_title"><img src="static/images/title_5.png">云料仓1-1</div>
<p id="histogramChart1" class="p_chart"></p>
<div class="div_any_title"><img src="static/images/title_5.png">云料仓3-2</div>
<div id="main7" style="width:98%;height:93%;display: inline-block;padding-left: 1.25%;padding-right: 1.25%;padding-top:1.25%"></div>
<script type="text/javascript">
var myChart = echarts.init(document.getElementById('main7'));
myChart.setOption({{ grid[5] | safe }});
</script>
</div>
<div class="div_any_child" style="height: 300px;">
<div class="div_any_title"><img src="static/images/title_6.png">云料仓4-2</div>
<div id="main8" style="width:98%;height:93%;display: inline-block;padding-left: 1.25%;padding-right: 1.25%;padding-top:1.25%"></div>
<script type="text/javascript">
var myChart = echarts.init(document.getElementById('main8'));
myChart.setOption({{ grid[7] | safe }});
</script>
</div>
</div>
<!-- <div class="left div_any01">
<div class="div_any_child" style="height: 300px;">
<div class="div_any_title"><img src="static/images/title_5.png">云料仓3-2</div>
<div id="main6" style="width:98%;height:93%;display: inline-block;padding-left: 1.25%;padding-right: 1.25%;padding-top:1.25%"></div>
<script type="text/javascript">
var myChart = echarts.init(document.getElementById('main6'));
myChart.setOption({{ grid[5] | safe }});
</script>
</div>
<div class="div_any_child" style="height: 300px;">
<div class="div_any_title"><img src="static/images/title_6.png">云料仓4-2</div>
<div id="main8" style="width:98%;height:93%;display: inline-block;padding-left: 1.25%;padding-right: 1.25%;padding-top:1.25%"></div>
<script type="text/javascript">
var myChart = echarts.init(document.getElementById('main8'));
myChart.setOption({{ grid[7] | safe }});
</script>
</div>
</div> -->
<div class="left div_any01">
<div class="div_any_child" style="height: 300px;">
<div class="div_any_title"><img src="static/images/title_5.png">云料仓5-1</div>
<div id="main9" style="width:98%;height:93%;display: inline-block;padding-left: 1.25%;padding-right: 1.25%;padding-top:1.25%"></div>
<script type="text/javascript">
var myChart = echarts.init(document.getElementById('main9'));
myChart.setOption({{ grid[8] | safe }});
</script>
</div>
<div class="div_any_child" style="height: 300px;">
<div class="div_any_title"><img src="static/images/title_6.png">云料仓6-1</div>
<div id="main10" style="width:98%;height:93%;display: inline-block;padding-left: 1.25%;padding-right: 1.25%;padding-top:1.25%"></div>
<script type="text/javascript">
var myChart = echarts.init(document.getElementById('main10'));
myChart.setOption({{ grid[10] | safe }});
</script>
</div>
</div>
<div class="left div_any01">
<div class="div_any_child" style="height: 300px;">
<div class="div_any_title"><img src="static/images/title_5.png">云料仓5-2</div>
<div id="main11" style="width:98%;height:93%;display: inline-block;padding-left: 1.25%;padding-right: 1.25%;padding-top:1.25%"></div>
<script type="text/javascript">
var myChart = echarts.init(document.getElementById('main11'));
myChart.setOption({{ grid[9] | safe }});
</script>
</div>
<div class="div_any_child" style="height: 300px;">
<div class="div_any_title"><img src="static/images/title_6.png">云料仓6-2</div>
<div id="main12" style="width:98%;height:93%;display: inline-block;padding-left: 1.25%;padding-right: 1.25%;padding-top:1.25%"></div>
<script type="text/javascript">
var myChart = echarts.init(document.getElementById('main12'));
myChart.setOption({{ grid[11] | safe }});
</script>
</div>
</div>
<div class="left div_any01">
<div class="div_any_child" style="height: 300px;">
<div class="div_any_title"><img src="static/images/title_5.png">云料仓7-1</div>
<div id="main13" style="width:98%;height:93%;display: inline-block;padding-left: 1.25%;padding-right: 1.25%;padding-top:1.25%"></div>
<script type="text/javascript">
var myChart = echarts.init(document.getElementById('main13'));
myChart.setOption({{ grid[12] | safe }});
</script>
</div>
<div class="div_any_child" style="height: 300px;">
<div class="div_any_title"><img src="static/images/title_6.png">云料仓8-1</div>
<div id="main14" style="width:98%;height:93%;display: inline-block;padding-left: 1.25%;padding-right: 1.25%;padding-top:1.25%"></div>
<script type="text/javascript">
var myChart = echarts.init(document.getElementById('main14'));
myChart.setOption({{ grid[14] | safe }});
</script>
</div>
</div>
<div class="left div_any01">
<div class="div_any_child" style="height: 300px;">
<div class="div_any_title"><img src="static/images/title_5.png">云料仓7-2</div>
<div id="main15" style="width:98%;height:93%;display: inline-block;padding-left: 1.25%;padding-right: 1.25%;padding-top:1.25%"></div>
<script type="text/javascript">
var myChart = echarts.init(document.getElementById('main15'));
myChart.setOption({{ grid[13] | safe }});
</script>
</div>
<div class="div_any_child" style="height: 300px;">
<div class="div_any_title"><img src="static/images/title_6.png">云料仓8-2</div>
<div id="main16" style="width:98%;height:93%;display: inline-block;padding-left: 1.25%;padding-right: 1.25%;padding-top:1.25%"></div>
<script type="text/javascript">
var myChart = echarts.init(document.getElementById('main16'));
myChart.setOption({{ grid[15] | safe }});
</script>
</div>
</div>
<div class="left div_any01">
<div class="div_any_child" style="height: 300px;">
<div class="div_any_title"><img src="static/images/title_5.png">云料仓9-1</div>
<div id="main17" style="width:98%;height:93%;display: inline-block;padding-left: 1.25%;padding-right: 1.25%;padding-top:1.25%"></div>
<script type="text/javascript">
var myChart = echarts.init(document.getElementById('main17'));
myChart.setOption({{ grid[16] | safe }});
</script>
</div>
<!-- <div class="div_any_child" style="height: 300px;">
<div class="div_any_title"><img src="static/images/title_6.png">云料仓4-2</div>
<div id="main8" style="width:98%;height:93%;display: inline-block;padding-left: 1.25%;padding-right: 1.25%;padding-top:1.25%"></div>
<script type="text/javascript">
var myChart = echarts.init(document.getElementById('main8'));
myChart.setOption({{ grid[7] | safe }});
</script>
</div> -->
</div>
<div class="left div_any01">
<div class="div_any_child" style="height: 300px;">
<div class="div_any_title"><img src="static/images/title_5.png">云料仓9-2</div>
<div id="main18" style="width:98%;height:93%;display: inline-block;padding-left: 1.25%;padding-right: 1.25%;padding-top:1.25%"></div>
<script type="text/javascript">
var myChart = echarts.init(document.getElementById('main18'));
myChart.setOption({{ grid[17] | safe }});
</script>
</div>
<!-- <div class="div_any_child" style="height: 300px;">
<div class="div_any_title"><img src="static/images/title_6.png">云料仓4-2</div>
<div id="main8" style="width:98%;height:93%;display: inline-block;padding-left: 1.25%;padding-right: 1.25%;padding-top:1.25%"></div>
<script type="text/javascript">
var myChart = echarts.init(document.getElementById('main8'));
myChart.setOption({{ grid[7] | safe }});
</script>
</div> -->
</div>
<div class="left div_any01">
<div class="div_any_child" style="height: 300px;">
<div class="div_any_title"><img src="static/images/title_5.png">云料仓10-1</div>
<div id="main19" style="width:98%;height:93%;display: inline-block;padding-left: 1.25%;padding-right: 1.25%;padding-top:1.25%"></div>
<script type="text/javascript">
var myChart = echarts.init(document.getElementById('main19'));
myChart.setOption({{ grid[18] | safe }});
</script>
</div>
<!-- <div class="div_any_child" style="height: 300px;">
<div class="div_any_title"><img src="static/images/title_6.png">云料仓4-2</div>
<div id="main8" style="width:98%;height:93%;display: inline-block;padding-left: 1.25%;padding-right: 1.25%;padding-top:1.25%"></div>
<script type="text/javascript">
var myChart = echarts.init(document.getElementById('main8'));
myChart.setOption({{ grid[7] | safe }});
</script>
</div> -->
</div>
<div class="left div_any01">
<div class="div_any_child" style="height: 300px;">
<div class="div_any_title"><img src="static/images/title_6.png">云料仓1-2</div>
<p id="histogramChart2" class="p_chart"></p>
<div class="div_any_title"><img src="static/images/title_5.png">云料仓10-2</div>
<div id="main20" style="width:98%;height:93%;display: inline-block;padding-left: 1.25%;padding-right: 1.25%;padding-top:1.25%"></div>
<script type="text/javascript">
var myChart = echarts.init(document.getElementById('main20'));
myChart.setOption({{ grid[19] | safe }});
</script>
</div>
<!-- <div class="div_any_child" style="height: 300px;">
<div class="div_any_title"><img src="static/images/title_6.png">云料仓4-2</div>
<div id="main8" style="width:98%;height:93%;display: inline-block;padding-left: 1.25%;padding-right: 1.25%;padding-top:1.25%"></div>
<script type="text/javascript">
var myChart = echarts.init(document.getElementById('main8'));
myChart.setOption({{ grid[7] | safe }});
</script>
</div> -->
</div>
</div>
</div>
......
<!DOCTYPE html>
<html lang="zh-cn">
<head>
{# <meta charset="UTF-8">#}
{% if 0 == stop %}
<meta charset="UTF-8" http-equiv="refresh" content="1200;url={{ url_for('api.index') }}">
{% endif %}
<title>Neotel Datashow</title>
<link href="/static/css/common.css?v=3" rel="stylesheet">
<script src="/static/jquery-3.3.1.min.js"></script>
<script src="/static/common.js"></script>
</head>
<body>
<!--顶部-->
<header class="header left">
<div class="left nav">
<ul>
<li><i class="nav_1"></i><a href="{{ url_for('api.index') }}">数据概况</a> </li>
<li><i class="nav_2"></i><a href="{{ url_for('api.state') }}">设备状态信息</a> </li>
<li><i class="nav_3"></i><a href="{{ url_for('api.boxstate') }}">料仓库存信息</a></li>
<li><i class="nav_3"></i><a href="http://10.85.199.3/dashboards/7034c5af-28bb-11ea-873a-94c691a7387d" target="_blank">AGV</a></li>
</ul>
</div>
<div class="header_center left" style="position:relative">
<h2><strong>大数据展示</strong></h2>
</div>
<div class="right nav text_right">
<ul>
<li class="nav_active"><i class="nav_3"></i><a href="{{ url_for('api.dataload') }}">数据下载</a></li>
</ul>
</div>
</header>
<div class="con left">
<!--数据总概-->
<div class="con_div">
<div class="con_div_text left">
<div class="con_div_text01 left">
<div class="left text01_div">
<p></p>
<p class="sky">AGV错误信息</p>
</div>
</div>
<div class="con_div_text01 right">
<div class="left text01_div">
<p></p>
<a type="button" style="font-size: x-large;color: coral;" href="{{ url_for('api.downloadagv',id=1) }}">下载</a>
</div>
</div>
</div>
<div class="con_div_text left">
<div class="con_div_text01 left">
<div class="left text01_div">
<!-- <p class="sky">AGV错误信息数据</p>
<a type="button" class="btn btn-info" href="{{ url_for('api.dataload') }}">下载日志</a> -->
<p></p>
<p class="sky">出入库数据</p>
</div>
</div>
<div class="con_div_text01 right">
<div class="left text01_div">
<p></p>
<a type="button" style="font-size: x-large;color: coral;" href="{{ url_for('api.downloadstock',id=1) }}">下载</a>
</div>
</div>
</div>
<div class="con_div_text left">
<div class="con_div_text01 left">
<div class="left text01_div">
<!-- <p class="sky">AGV错误信息数据</p>
<a type="button" class="btn btn-info" href="{{ url_for('api.dataload') }}">下载日志</a> -->
<p></p>
<p class="sky">NG信息</p>
</div>
</div>
<div class="con_div_text01 right">
<div class="left text01_div">
<p></p>
<a type="button" style="font-size: x-large;color: coral;" href="{{ url_for('api.downloadng',id=1) }}">下载</a>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
\ No newline at end of file
......@@ -9,9 +9,6 @@
<link href="/static/css/common.css?v=3" rel="stylesheet">
<script src="/static/jquery-3.3.1.min.js"></script>
<script src="/static/echarts.min.js"></script>
<script src="/static/common.js"></script>
<script src="/static/index.js"></script>
<script src="/static/laydate.js"></script>
</head>
<body>
<!--顶部-->
......@@ -20,7 +17,8 @@
<ul>
<li class="nav_active"><i class="nav_1"></i><a href="{{ url_for('api.index') }}">数据概况</a> </li>
<li><i class="nav_2"></i><a href="{{ url_for('api.state') }}">设备状态信息</a> </li>
<li><i class="nav_3"></i><a href="{{ url_for('api.boxstate') }}">料仓库存信息</a> </li>
<li><i class="nav_3"></i><a href="{{ url_for('api.boxstate') }}">料仓库存信息</a></li>
<li><i class="nav_3"></i><a href="http://10.85.199.3/dashboards/7034c5af-28bb-11ea-873a-94c691a7387d" target="_blank">AGV</a></li>
</ul>
</div>
<div class="header_center left" style="position:relative">
......@@ -30,7 +28,7 @@
</div>
<div class="right nav text_right">
<ul>
<li><i class="nav_3"></i><a href="{{ url_for('api.dataload') }}">数据下载</a></li>
</ul>
</div>
......@@ -40,30 +38,89 @@
<div class="div_any">
<div class="div_any02">
<div class="div_any_child div_height">
<div class="div_any_title any_title_width">24小时出入库</div>
<div id="main" style="width:98%;height:93%;display: inline-block;padding-left: 1.25%;padding-right: 1.25%;padding-top:1.25%"></div>
<script type="text/javascript">
// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById('main'));
// 使用刚指定的配置项和数据显示图表。
myChart.setOption({{ bar_data | safe }});
</script>
<div class="div_any_title any_title_width">48小时出入库</div>
<div id="hour" style="width:98%;height:46%;display: inline-block;padding-left: 1.25%;padding-right: 1.25%;padding-top:1.25%"></div>
<div id="hour1" style="width:98%;height:46%;display: inline-block;padding-left: 1.25%;padding-right: 1.25%;padding-top:1.25%"></div>
</div>
</div>
<div class="div_any02">
<div class="div_any_child div_height">
<div class="div_any_title any_title_width">7天出入库</div>
<div id="main2" style="width:98%;height:93%;display: inline-block;padding-left: 1.25%;padding-right: 1.25%;padding-top:1.25%"></div>
<div id="day" style="width:98%;height:93%;display: inline-block;padding-left: 1.25%;padding-right: 1.25%;padding-top:1.25%"></div>
<!-- <p id="main2" class="p_chart"></p> -->
<script type="text/javascript">
<!-- <script type="text/javascript">
// 基于准备好的dom,初始化echarts实例
var myChart2 = echarts.init(document.getElementById('main2'));
// 使用刚指定的配置项和数据显示图表。
myChart2.setOption({{ bar_data1 | safe }});
</script>
</script> -->
</div>
</div>
</div>
</div>
<script>
var app = {
};
// 发送ajax请求,从后台获取json数据
$(document).ready(function () {
drawchartday();
drawcharthour();
drawcharthourc();
console.log('success');
});
function drawchartday() {
$.ajax({
url: '/drawchartday',
type: "GET",
dataType: "json",
success: function(result) {
//$('#agv tr:gt(0)').remove();//删除之前的数据
var dayChart = echarts.init(document.getElementById('day'));
dayChart.clear();
dayChart.setOption(result);
},
error: function(e) {
}
})
}
function drawcharthour() {
$.ajax({
url: '/drawcharthour',
type: "GET",
dataType: "json",
success: function(result) {
//$('#agv tr:gt(0)').remove();//删除之前的数据
var hourChart = echarts.init(document.getElementById('hour'));
hourChart.clear();
hourChart.setOption(result);
},
error: function(e) {
}
})
}
function drawcharthourc() {
$.ajax({
url: '/drawcharthourc',
type: "GET",
dataType: "json",
success: function(result) {
//$('#agv tr:gt(0)').remove();//删除之前的数据
var hourChart1 = echarts.init(document.getElementById('hour1'));
hourChart1.clear();
hourChart1.setOption(result);
},
error: function(e) {
}
})
}
setInterval(function(){
drawchartday();
drawcharthour();
drawcharthourc();
}, 50000);
</script>
</body>
</html>
\ No newline at end of file
......@@ -3,12 +3,9 @@
<head>
<meta charset="UTF-8">
<title>Neotel Datashow</title>
<link href="/static/css/common.css" rel="stylesheet">
<link href="/static/css/common.css?id=1" rel="stylesheet">
<script src="/static/jquery-3.3.1.min.js"></script>
<script src="/static/echarts.min.js"></script>
<script src="/static/common.js"></script>
<script src="/static/index.js"></script>
<script src="/static/laydate.js"></script>
</head>
<body>
<!--顶部-->
......@@ -18,6 +15,7 @@
<li><i class="nav_1"></i><a href="{{ url_for('api.index') }}">数据概况</a> </li>
<li class="nav_active"><i class="nav_2"></i><a href="{{ url_for('api.state') }}">设备状态信息</a> </li>
<li><i class="nav_3"></i><a href="{{ url_for('api.boxstate') }}">料仓库存信息</a> </li>
<li><i class="nav_3"></i><a href="http://10.85.36.58/dashboards/7034c5af-28bb-11ea-873a-94c691a7387d" target="_blank">AGV</a></li>
</ul>
</div>
<div class="header_center left" style="position:relative">
......@@ -27,7 +25,7 @@
</div>
<div class="right nav text_right">
<ul>
<li><i class="nav_3"></i><a href="{{ url_for('api.dataload') }}">数据下载</a></li>
</ul>
</div>
......@@ -47,19 +45,6 @@
</tr>
</thead>
<tbody id="agv">
<!-- <tr><td>1号车</td><td>演示数据</td><td>正常</td></tr>
<tr><td>2号车</td><td>演示数据</td><td>正常</td></tr>
<tr><td>3号车</td><td>演示数据</td><td>异常</td></tr>
<tr><td>4号车</td><td>演示数据</td><td>异常</td></tr>
<tr><td>5号车</td><td>演示数据</td><td>异常</td></tr>
<tr><td>6号车</td><td>演示数据</td><td>异常</td></tr>
<tr><td>7号车</td><td>演示数据</td><td>正常</td></tr>
<tr><td>8号车</td><td>演示数据</td><td>正常</td></tr>
<tr><td>9号车</td><td>演示数据</td><td>异常</td></tr>
<tr><td>10号车</td><td>演示数据</td><td>正常</td></tr>
<tr><td>11号车</td><td>演示数据</td><td>充电</td></tr>
<tr><td>12号车</td><td>演示数据</td><td>正常</td></tr>
<tr><td>13号车</td><td>演示数据</td><td>正常</td></tr> -->
</tbody>
</table>
</div>
......
......@@ -9,7 +9,8 @@ class Config(object):
CONFIG_4C = ['4C-1线', '4C-2线', '4C-3线', '4C-4线', '4C-5线', '4C-6线', '4C-7线', '4C-8线', '4C-9线', '4C-10线', '4C-14线', '4C-15线']
CONFIG_AGV = ['1号车','2号车','3号车','4号车','5号车','6号车','7号车','8号车','9号车','10号车','11号车','12号车','13号车']
CONFIG_4D = ['4D-1线','4D-2线','4D-3线','4D-4线','4D-5线','4D-6线','4D-7线','4D-8线','4D-9线','4D-10线','4D-11线','4D-12线','4D-13线','4D-14线','4D-15线','4D-16线']
CONFIG_BOX = ['line-ac-01','line-ac-02','line-ac-03','line-ac-04','line-ac-05','line-ac-06','line-ac-07','line-ac-08','line-ac-09','line-ac-10','line-ac-11','line-ac-12','line-ac-13','line-ac-14','line-ac-15','line-ac-16','line-ac-17','line-ac-18']
CONFIG_BOX = ['line-ac-01','line-ac-02','line-ac-03','line-ac-04','line-ac-05','line-ac-06','line-ac-07','line-ac-08','line-ac-09','line-ac-10','line-ac-11','line-ac-12','line-ac-13','line-ac-14','line-ac-15','line-ac-16','line-ac-17','line-ac-18','line-ac-25','line-ac-26']
CONFIG_BOX_TRANS = {'line-ac-01':'云料仓1-1','line-ac-02':'云料仓1-2','line-ac-03':'云料仓2-1','line-ac-04':'云料仓2-2','line-ac-05':'云料仓3-1','line-ac-06':'云料仓3-2','line-ac-07':'云料仓4-1','line-ac-08':'云料仓4-2','line-ac-09':'云料仓5-1','line-ac-10':'云料仓5-2','line-ac-11':'云料仓6-1','line-ac-12':'云料仓6-2','line-ac-13':'云料仓7-1','line-ac-14':'云料仓7-2','line-ac-15':'云料仓8-1','line-ac-16':'云料仓8-2','line-ac-17':'云料仓9-1','line-ac-18':'云料仓9-2','line-ac-25':'云料仓10-1','line-ac-26':'云料仓10-2'}
# CONFIG_BOX = ['云料仓1', '云料仓1', '云料仓1', '云料仓4', '云料仓5', '云料仓6', '云料仓7', '云料仓8', '云料仓9', '云料仓10', '云料仓11', '云料仓12']
CONFIG_BOX_STATUS = {1:'准备就绪',2:'急停',3:'故障',4:'警告',5:'调试中',6:'入库执行中',7:'入仓位完成',8:'入库失败',9:'出库执行中',10:'出仓位完成',11:'出库失败',12:'出库移载中',13:'远点返回中'}
DB_NAME = 'qisada2'
......
[
{
"type": 1,
"name": "6号车",
"msgKey": "lineAgv.6号车.Place",
"msgValue": "Standby",
"startTime": 1600405799121,
"updateTime": 1600411128021,
"infoMsg": true,
"timeout": false
},
{
"type": 0,
"name": "4C-14线",
"msgKey": "lineAgv.C14.OffLine",
"msgValue": "离线",
"startTime": 1600405799121,
"updateTime": 1600411128021,
"infoMsg": false,
"timeout": false
},
{
"type": 0,
"name": "4D-10线",
"msgKey": "lineAgv.D10.OffLine",
"msgValue": "离线",
"startTime": 1600408331109,
"updateTime": 1600411128021,
"infoMsg": false,
"timeout": false
},
{
"type": 0,
"name": "4D-15线",
"msgKey": "lineAgv.D15.OffLine",
"msgValue": "离线",
"startTime": 1600405799115,
"updateTime": 1600411128021,
"infoMsg": false,
"timeout": false
},
{
"type": 0,
"name": " _入料_1 ",
"msgKey": "line. _入料_1 _IoSingleTimeOut",
"msgValue": "[_入料_1-Move][InStore][FI_18_WaitNoLocationCheck]等待 [X123-SL1伺服定位料盘检测-SL_AxisLocationCheck=LOW]超时[247.3]秒",
"startTime": 1600410895963,
"updateTime": 1600411127350,
"infoMsg": false,
"timeout": false
},
{
"type": 0,
"name": "4C-10线",
"msgKey": "lineAgv.C10.OffLine",
"msgValue": "离线",
"startTime": 1600405799121,
"updateTime": 1600411128021,
"infoMsg": false,
"timeout": false
},
{
"type": 0,
"name": "双层线任务",
"msgKey": "doubleLine.AllTaskInfo",
"msgValue": " 剩余任务: 小料=0,大料=0,包装料=0 ",
"startTime": 1600405804587,
"updateTime": 1600411124811,
"infoMsg": false,
"timeout": false
},
{
"type": 0,
"name": "4C-15线",
"msgKey": "lineAgv.C15.OffLine",
"msgValue": "离线",
"startTime": 1600405799121,
"updateTime": 1600411128021,
"infoMsg": false,
"timeout": false
},
{
"type": 1,
"name": "5号车",
"msgKey": "lineAgv.5号车.Place",
"msgValue": "Standby",
"startTime": 1600405799121,
"updateTime": 1600411128021,
"infoMsg": true,
"timeout": false
},
{
"type": 0,
"name": "4D-11线",
"msgKey": "lineAgv.D11.OffLine",
"msgValue": "离线",
"startTime": 1600409966855,
"updateTime": 1600411128021,
"infoMsg": false,
"timeout": false
},
{
"type": 1,
"name": "7号车",
"msgKey": "lineAgv.7号车.Place",
"msgValue": "AutoCharge",
"startTime": 1600405799122,
"updateTime": 1600411128021,
"infoMsg": true,
"timeout": false
},
{
"type": 0,
"name": "4D-14线",
"msgKey": "lineAgv.D14.OffLine",
"msgValue": "离线",
"startTime": 1600405799115,
"updateTime": 1600411128021,
"infoMsg": false,
"timeout": false
},
{
"type": 0,
"name": "4D-12线",
"msgKey": "lineAgv.D12.OffLine",
"msgValue": "离线",
"startTime": 1600405799115,
"updateTime": 1600411128021,
"infoMsg": false,
"timeout": false
},
{
"type": 0,
"name": " _入料_2 ",
"msgKey": "line. _入料_2 _IoSingleTimeOut",
"msgValue": "[_入料_2-Move][InStore][FI_18_WaitNoLocationCheck] 等待 [X163-SL2伺服定位料盘检测-SL_AxisLocationCheck=LOW] 超时 55.7秒",
"startTime": 1600410670377,
"updateTime": 1600411127350,
"infoMsg": false,
"timeout": false
},
{
"type": 0,
"name": "A5入口状态",
"msgKey": "doubleLine.packageLine.benQInStepLeft.Msg",
"msgValue": "[topFull=False bottomFull=True] A5_None ",
"startTime": 1600405799068,
"updateTime": 1600411128811,
"infoMsg": false,
"timeout": false
},
{
"type": 0,
"name": "9号车",
"msgKey": "lineAgv.9号车.StandTimeOut",
"msgValue": "在Standby停留超时38.94分钟",
"startTime": 1600407982002,
"updateTime": 1600411128021,
"infoMsg": false,
"timeout": false
},
{
"type": 1,
"name": "8号车",
"msgKey": "lineAgv.8号车.Msg",
"msgValue": "双层线暂不需要空料架,从产线[D1]到待机位",
"startTime": 1600405799122,
"updateTime": 1600411128021,
"infoMsg": true,
"timeout": false
},
{
"type": 0,
"name": "line-ac-08",
"msgKey": "box.line-ac-08",
"msgValue": "料仓BOX_8 入库 等待料仓门口检测到料盘 [R035042020060512250] [4D0814DD0010] 超时 [83]秒 ",
"startTime": null,
"updateTime": 1600411129057,
"infoMsg": false,
"timeout": false
}
]
\ No newline at end of file
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!