main.py 54 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377
  1. # fastapi
  2. from fastapi import FastAPI, Request, Response, HTTPException, status, Depends , Form
  3. from fastapi import templating
  4. from fastapi.templating import Jinja2Templates
  5. from fastapi.responses import HTMLResponse, RedirectResponse, JSONResponse
  6. from fastapi.middleware.cors import CORSMiddleware
  7. from fastapi.staticfiles import StaticFiles
  8. # fastapi view function parameters
  9. from typing import List, Optional
  10. import json
  11. # path
  12. import sys
  13. from pydantic.errors import ArbitraryTypeError
  14. from sqlalchemy.sql.elements import False_
  15. # time
  16. # import datetime
  17. from datetime import timedelta, datetime
  18. # db
  19. import dataset
  20. from passlib import context
  21. from sqlalchemy.sql.expression import true
  22. import models
  23. from random import randint,uniform
  24. # authorize
  25. from passlib.context import CryptContext
  26. pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
  27. import jwt
  28. from fastapi_jwt_auth import AuthJWT
  29. from fastapi_jwt_auth.exceptions import AuthJWTException
  30. from fastapi.security import OAuth2AuthorizationCodeBearer, OAuth2PasswordRequestForm
  31. import numpy as np
  32. import pymysql
  33. class dateEncode(json.JSONEncoder):
  34. def default(self, obj):
  35. if isinstance(obj, datetime):
  36. return obj.strftime('%Y-%m-%d %H:%M:%S')
  37. else:
  38. return json.JSONEncoder.default(self, obj)
  39. pymysql.install_as_MySQLdb()
  40. db_settings = {
  41. "host": "db.ptt.cx",
  42. "port": 3306,
  43. "user": "choozmo",
  44. "password": "pAssw0rd",
  45. "db": "Water_tower",
  46. "charset": "utf8mb4"
  47. }
  48. # app
  49. app = FastAPI()
  50. app.add_middleware(
  51. CORSMiddleware,
  52. allow_origins=["*"],
  53. allow_credentials=True,
  54. allow_methods=["*"],
  55. allow_headers=["*"],
  56. )
  57. SECRET_KEY = "df2f77bd544240801a048bd4293afd8eeb7fff3cb7050e42c791db4b83ebadcd"
  58. ALGORITHM = "HS256"
  59. ACCESS_TOKEN_EXPIRE_MINUTES = 3000
  60. pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
  61. #
  62. app.mount(path='/templates', app=StaticFiles(directory='templates'), name='templates')
  63. app.mount(path='/static', app=StaticFiles(directory='static'), name='static ')
  64. #
  65. templates = Jinja2Templates(directory='templates')
  66. @AuthJWT.load_config
  67. def get_config():
  68. return models.Settings()
  69. # view
  70. @app.get('/', response_class=HTMLResponse)
  71. async def index(request: Request):
  72. print(request)
  73. return templates.TemplateResponse(name='index.html', context={'request': request})
  74. @app.get('/login', response_class=HTMLResponse)
  75. async def login(request: Request):
  76. return templates.TemplateResponse(name='login.html', context={'request': request})
  77. @app.post("/login")
  78. async def login_for_access_token(request: Request, form_data: OAuth2PasswordRequestForm = Depends(), Authorize: AuthJWT = Depends()):
  79. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  80. user = authenticate_user(form_data.username, form_data.password)
  81. if not user:
  82. raise HTTPException(
  83. status_code=status.HTTP_401_UNAUTHORIZED,
  84. detail="Incorrect username or password",
  85. headers={"WWW-Authenticate": "Bearer"},
  86. )
  87. access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
  88. access_token = create_access_token(
  89. data={"sub": user.username}, expires_delta=access_token_expires
  90. )
  91. table = db['users']
  92. user.token = access_token
  93. print(user)
  94. table.update(dict(user), ['username'],['password'])
  95. access_token = Authorize.create_access_token(subject=user.username)
  96. refresh_token = Authorize.create_refresh_token(subject=user.username)
  97. Authorize.set_access_cookies(access_token)
  98. Authorize.set_refresh_cookies(refresh_token)
  99. #return templates.TemplateResponse("home.html", {"request": request, "msg": 'Login'})
  100. return {"access_token": access_token, "token_type": "bearer"} # 回傳token給前端
  101. @app.get('/register', response_class=HTMLResponse)
  102. async def login(request: Request):
  103. return templates.TemplateResponse(name='rigister_test.html', context={'request': request})
  104. @app.post('/register')
  105. async def register(request: Request, form_data: OAuth2PasswordRequestForm = Depends()):
  106. user = models.User(**await request.form())
  107. print(form_data.username, form_data.password, user)
  108. user.id = randint(1000, 9999)
  109. user.isAdmin = 0 #預設為非管理者
  110. user.roleType = 0 #預設為employee
  111. # 密碼加密
  112. #user.password = get_password_hash(user.password)
  113. # 存入DB
  114. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  115. user_table = db['users']
  116. user_table.insert(dict(user))
  117. # 跳轉頁面至登入
  118. return templates.TemplateResponse(name='login.html', context={'request': request})
  119. @app.post('/record_tower')
  120. async def record_tower(request: Request,data : models.record_tower_data,key:str):
  121. #data = models.tower_data(**await request.form())
  122. if key!="21232f297a57a5a743894a0e4a801fc3":
  123. return {'msg':'no access'}
  124. loc_dt = datetime.today()
  125. loc_dt_format = loc_dt.strftime("%Y-%m-%d %H:%M:%S")
  126. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  127. # cmd ="SELECT * FROM device"
  128. dict_tmp = data.__dict__
  129. # check = False
  130. # for row in db.query(cmd):
  131. # if row['id']== tower_id:
  132. # check = True
  133. # if check :
  134. # result={'msg':"success"}
  135. # else:
  136. # result = {'msg':"no device"}
  137. dict_tmp['id']=pymysql.NULL
  138. result = db['record_tower'].insert(dict(dict_tmp))
  139. result={'msg':"success"}
  140. return json.dumps(result,ensure_ascii=False)
  141. @app.post('/record_dcs')
  142. async def record_dcs(request: Request,data : models.record_tower_data,key:str):
  143. #data = models.tower_data(**await request.form())
  144. if key!="21232f297a57a5a743894a0e4a801fc3":
  145. return {'msg':'no access'}
  146. loc_dt = datetime.today()
  147. loc_dt_format = loc_dt.strftime("%Y-%m-%d %H:%M:%S")
  148. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  149. dict_tmp = data.__dict__
  150. # cmd ="SELECT * FROM device"
  151. # cmd2={}
  152. # check = False
  153. # if check :
  154. # result={'msg':"success"}
  155. # else:
  156. # result = {'msg':"no device"}
  157. result = db['record_dcs'].insert(dict(dict_tmp))
  158. result={'msg':"success"}
  159. return json.dumps(result,ensure_ascii=False)
  160. @app.post('/record_diagnosis')
  161. async def record_diagnosis(request: Request,data : models.record_diagnosis_data,key:str):
  162. #data = models.tower_data(**await request.form())
  163. if key!="21232f297a57a5a743894a0e4a801fc3":
  164. return {'msg':'no access'}
  165. loc_dt = datetime.today()
  166. loc_dt_format = loc_dt.strftime("%Y-%m-%d %H:%M:%S")
  167. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  168. dict_tmp = data.__dict__
  169. dict_tmp['createTime']=loc_dt_format
  170. result = db['record_diagnosis'].update(dict(dict_tmp),['vibration_id'])
  171. #print(result)
  172. if result :
  173. result={'msg':'success insert'}
  174. else :
  175. result={'msg':'fail to insert'}
  176. return json.dumps(result,ensure_ascii=False)
  177. @app.post('/record_health')
  178. async def record_health(request: Request,data : models.record_health_data,key:str):
  179. #data = models.tower_data(**await request.form())
  180. if key!="21232f297a57a5a743894a0e4a801fc3":
  181. return {'msg':'no access'}
  182. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  183. dict_tmp = data.__dict__
  184. result = db['record_health'].insert(dict(dict_tmp))
  185. #print(result)
  186. if result :
  187. result={'msg':'success insert'}
  188. else :
  189. result={'msg':'fail to insert'}
  190. return json.dumps(result,ensure_ascii=False)
  191. @app.post('/record_performance')
  192. async def record_performance(request: Request,data : models.record_performance_data,key:str):
  193. #data = models.tower_data(**await request.form())
  194. if key!="21232f297a57a5a743894a0e4a801fc3":
  195. return {'msg':'no access'}
  196. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  197. dict_tmp = data.__dict__
  198. result = db['record_performance'].insert(dict(dict_tmp))
  199. #print(result)
  200. if result :
  201. result={'msg':'success insert'}
  202. else :
  203. result={'msg':'fail to insert'}
  204. return json.dumps(result,ensure_ascii=False)
  205. @app.post('/record_prediction')
  206. async def record_prediction(request: Request,data : models.record_prediction_data,key:str):
  207. #data = models.tower_data(**await request.form())
  208. if key!="21232f297a57a5a743894a0e4a801fc3":
  209. return {'msg':'no access'}
  210. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  211. dict_tmp = data.__dict__
  212. result = db['record_prediction'].insert(dict(dict_tmp))
  213. #print(result)
  214. if result :
  215. result={'msg':'success insert'}
  216. else :
  217. result={'msg':'fail to insert'}
  218. return json.dumps(result,ensure_ascii=False)
  219. @app.post('/record_prediction_upd')
  220. async def record_prediction(request: Request,data : models.record_prediction_upd_data,key:str):
  221. #data = models.tower_data(**await request.form())
  222. if key!="21232f297a57a5a743894a0e4a801fc3":
  223. return {'msg':'no access'}
  224. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  225. dict_tmp = data.__dict__
  226. result = db['record_prediction_upd'].insert(dict(dict_tmp))
  227. #print(result)
  228. if result :
  229. result={'msg':'success insert'}
  230. else :
  231. result={'msg':'fail to insert'}
  232. return json.dumps(result,ensure_ascii=False)
  233. @app.get('/add_tower')
  234. async def home(request: Request, Authorize: AuthJWT = Depends()):
  235. return templates.TemplateResponse(name='add_tower.html', context={'request': request})
  236. @app.post('/add_tower')
  237. async def home(request: Request, Authorize: AuthJWT = Depends()):
  238. data=request.form()
  239. print(data.device)
  240. @app.get('/home', response_class=HTMLResponse)
  241. async def home(request: Request, Authorize: AuthJWT = Depends()):
  242. try:
  243. Authorize.jwt_required()
  244. except Exception as e:
  245. print(e)
  246. return RedirectResponse('/login')
  247. #add_data()
  248. return templates.TemplateResponse(name='home.html', context={'request': request})
  249. @app.get('/home/show', response_class=HTMLResponse)
  250. async def home(request: Request, Authorize: AuthJWT = Depends()):
  251. try:
  252. Authorize.jwt_required()
  253. except Exception as e:
  254. print(e)
  255. return RedirectResponse('/login')
  256. current_user = Authorize.get_jwt_subject()
  257. result = [{'user_role':check_role_type(current_user)}]
  258. result.append(check_tower_health(current_user))
  259. #print(result)
  260. return json.dumps(result,ensure_ascii=False)
  261. @app.get('/org', response_class=HTMLResponse)
  262. async def tower(request: Request, Authorize: AuthJWT = Depends()):
  263. try:
  264. Authorize.jwt_required()
  265. except Exception as e:
  266. print(e)
  267. return RedirectResponse('/login')
  268. current_user = Authorize.get_jwt_subject()
  269. result = get_user_under_organization(current_user)
  270. return json.dumps(result,ensure_ascii=False)
  271. @app.get('/user_role', response_class=HTMLResponse)
  272. async def user_role(request: Request, Authorize: AuthJWT = Depends()):
  273. try:
  274. Authorize.jwt_required()
  275. except Exception as e:
  276. print(e)
  277. return RedirectResponse('/login')
  278. current_user = Authorize.get_jwt_subject()
  279. result = {'role':check_role_type(current_user)}
  280. print(result)
  281. return json.dumps(result,ensure_ascii=False)
  282. @app.get('/tower', response_class=HTMLResponse)
  283. async def tower(request: Request, Authorize: AuthJWT = Depends()):
  284. try:
  285. Authorize.jwt_required()
  286. except Exception as e:
  287. print(e)
  288. return RedirectResponse('/login')
  289. current_user = Authorize.get_jwt_subject()
  290. result = get_user_under_organization(current_user)
  291. result.append({'Data' : get_tower_info('dev001')})
  292. return templates.TemplateResponse(name='tower.html', context={"request":request})
  293. @app.get('/tower/org', response_class=HTMLResponse)
  294. async def tower(request: Request, Authorize: AuthJWT = Depends()):
  295. try:
  296. Authorize.jwt_required()
  297. except Exception as e:
  298. print(e)
  299. return RedirectResponse('/login')
  300. current_user = Authorize.get_jwt_subject()
  301. result = get_user_under_organization(current_user)
  302. return json.dumps(result,ensure_ascii=False)
  303. @app.get('/tower/', response_class=HTMLResponse)
  304. async def tower(request: Request,company:str,factory:str,department:str,towerGroup:str, Authorize: AuthJWT = Depends()):
  305. try:
  306. Authorize.jwt_required()
  307. except Exception as e:
  308. print(e)
  309. return RedirectResponse('/login')
  310. #current_user = Authorize.get_jwt_subject()
  311. tower_arr = get_tower(company,factory,department,towerGroup)
  312. result = []
  313. for tower in tower_arr:
  314. result.append({'tower_name': tower,'tower_data': get_tower_info(tower)})
  315. return json.dumps(result,ensure_ascii=False, cls = dateEncode)
  316. @app.get('/tower/performance/{tower_id}', response_class=HTMLResponse)
  317. async def member_authority(request:Request,tower_id: str,Authorize: AuthJWT = Depends()):
  318. """設定成員權限"""
  319. try:
  320. Authorize.jwt_required()
  321. except Exception as e:
  322. print(e)
  323. return RedirectResponse('/login')
  324. result = get_tower_perform(tower_id)
  325. #print(result)
  326. return json.dumps(result,ensure_ascii=False, cls = dateEncode)
  327. @app.get('/optim', response_class=HTMLResponse)
  328. async def optim(request: Request, Authorize: AuthJWT = Depends()):
  329. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  330. statement = 'SELECT value FROM record_tower WHERE record_tower.key = "hotTemp"'
  331. x = 0
  332. y = 0
  333. z = 0
  334. count = 0
  335. waterflow = 0
  336. fannum = 0
  337. savewater = 0
  338. fanchange = 0
  339. saveelec = 0
  340. total = 0
  341. flowchange = 0
  342. try:
  343. Authorize.jwt_required()
  344. except Exception as e:
  345. print(e)
  346. return RedirectResponse('/login')
  347. current_user = Authorize.get_jwt_subject()
  348. print(check_role_type(current_user))
  349. role = int(check_role_type(current_user))
  350. print(check_role_type(current_user))
  351. if role == 1:
  352. statement = 'SELECT value FROM record_tower WHERE record_tower.key = "hotTemp"'
  353. for temp in db.query(statement):
  354. print(temp['value'])
  355. x=temp['value']
  356. statement2 = 'SELECT value FROM record_tower WHERE record_tower.key = "coldTempData1"'
  357. for temp2 in db.query(statement2):
  358. print(temp2['value'])
  359. y=temp2['value']
  360. statement3 = 'SELECT value FROM record_tower WHERE record_tower.key = "wetTemp"'
  361. for temp3 in db.query(statement3):
  362. print(temp3['value'])
  363. z=temp3['value']
  364. statement4 = 'SELECT value FROM record_tower WHERE record_tower.key = "count"'
  365. for tower in db.query(statement4):
  366. print(tower['value'])
  367. count=tower['value']
  368. statement5 = 'SELECT value FROM record_tower WHERE record_tower.key = "waterflow"'
  369. for tower in db.query(statement5):
  370. waterflow=tower['value']
  371. statement6 = 'SELECT value FROM record_tower WHERE record_tower.key = "fannum"'
  372. for tower in db.query(statement6):
  373. fannum=tower['value']
  374. statement7 = 'SELECT value FROM record_tower WHERE record_tower.key = "flowchange"'
  375. for tower in db.query(statement7):
  376. flowchange=tower['value']
  377. statement8 = 'SELECT value FROM record_tower WHERE record_tower.key = "savewater"'
  378. for tower in db.query(statement8):
  379. savewater=tower['value']
  380. statement9 = 'SELECT value FROM record_tower WHERE record_tower.key = "fanchange"'
  381. for tower in db.query(statement9):
  382. fanchange=tower['value']
  383. statement10 = 'SELECT value FROM record_tower WHERE record_tower.key = "saveelec"'
  384. for tower in db.query(statement10):
  385. saveelec=tower['value']
  386. statement11 = 'SELECT value FROM record_tower WHERE record_tower.key = "total"'
  387. for tower in db.query(statement11):
  388. total=tower['value']
  389. elif role == 3 :
  390. statement = 'SELECT value FROM record_tower WHERE record_tower.key = "hotTemp1"'
  391. for temp in db.query(statement):
  392. print(temp['value'])
  393. x=temp['value']
  394. statement2 = 'SELECT value FROM record_tower WHERE record_tower.key = "coldTempData2"'
  395. for temp2 in db.query(statement2):
  396. print(temp2['value'])
  397. y=temp2['value']
  398. statement3 = 'SELECT value FROM record_tower WHERE record_tower.key = "wetTemp1"'
  399. for temp3 in db.query(statement3):
  400. print(temp3['value'])
  401. z=temp3['value']
  402. statement4 = 'SELECT value FROM record_tower WHERE record_tower.key = "count1"'
  403. for tower in db.query(statement4):
  404. print(tower['value'])
  405. count=tower['value']
  406. statement5 = 'SELECT value FROM record_tower WHERE record_tower.key = "waterflow1"'
  407. for tower in db.query(statement5):
  408. waterflow=tower['value']
  409. statement6 = 'SELECT value FROM record_tower WHERE record_tower.key = "fannum1"'
  410. for tower in db.query(statement6):
  411. fannum=tower['value']
  412. statement7 = 'SELECT value FROM record_tower WHERE record_tower.key = "flowchange1"'
  413. for tower in db.query(statement7):
  414. flowchange=tower['value']
  415. statement8 = 'SELECT value FROM record_tower WHERE record_tower.key = "savewater1"'
  416. for tower in db.query(statement8):
  417. savewater=tower['value']
  418. statement9 = 'SELECT value FROM record_tower WHERE record_tower.key = "fanchange1"'
  419. for tower in db.query(statement9):
  420. fanchange=tower['value']
  421. statement10 = 'SELECT value FROM record_tower WHERE record_tower.key = "saveelec1"'
  422. for tower in db.query(statement10):
  423. saveelec=tower['value']
  424. statement11 = 'SELECT value FROM record_tower WHERE record_tower.key = "total1"'
  425. for tower in db.query(statement11):
  426. total=tower['value']
  427. elif role == 4 :
  428. statement = 'SELECT value FROM record_tower WHERE record_tower.key = "hotTemp2"'
  429. for temp in db.query(statement):
  430. print(temp['value'])
  431. x=temp['value']
  432. statement2 = 'SELECT value FROM record_tower WHERE record_tower.key = "coldTempData3"'
  433. for temp2 in db.query(statement2):
  434. print(temp2['value'])
  435. y=temp2['value']
  436. statement3 = 'SELECT value FROM record_tower WHERE record_tower.key = "wetTemp2"'
  437. for temp3 in db.query(statement3):
  438. print(temp3['value'])
  439. z=temp3['value']
  440. statement4 = 'SELECT value FROM record_tower WHERE record_tower.key = "count2"'
  441. for tower in db.query(statement4):
  442. print(tower['value'])
  443. count=tower['value']
  444. statement5 = 'SELECT value FROM record_tower WHERE record_tower.key = "waterflow2"'
  445. for tower in db.query(statement5):
  446. waterflow=tower['value']
  447. statement6 = 'SELECT value FROM record_tower WHERE record_tower.key = "fannum2"'
  448. for tower in db.query(statement6):
  449. fannum=tower['value']
  450. statement7 = 'SELECT value FROM record_tower WHERE record_tower.key = "flowchange2"'
  451. for tower in db.query(statement7):
  452. flowchange=tower['value']
  453. statement8 = 'SELECT value FROM record_tower WHERE record_tower.key = "savewater2"'
  454. for tower in db.query(statement8):
  455. savewater=tower['value']
  456. statement9 = 'SELECT value FROM record_tower WHERE record_tower.key = "fanchange2"'
  457. for tower in db.query(statement9):
  458. fanchange=tower['value']
  459. statement10 = 'SELECT value FROM record_tower WHERE record_tower.key = "saveelec2"'
  460. for tower in db.query(statement10):
  461. saveelec=tower['value']
  462. statement11 = 'SELECT value FROM record_tower WHERE record_tower.key = "total2"'
  463. for tower in db.query(statement11):
  464. total=tower['value']
  465. else :
  466. print("noright")
  467. return templates.TemplateResponse(name='optim.html',context=
  468. {
  469. 'request': request,"x":x,"y":y,"z":z,"count":count,"waterflow":waterflow
  470. ,"fannum":fannum , "flowchange":flowchange , "savewater":savewater
  471. , "fanchange":fanchange , "saveelec":saveelec , "total":total
  472. })
  473. @app.get('/vibration', response_class=HTMLResponse)
  474. async def vibration(request: Request, Authorize: AuthJWT = Depends()):
  475. try:
  476. Authorize.jwt_required()
  477. except Exception as e:
  478. print(e)
  479. return RedirectResponse('/login')
  480. return templates.TemplateResponse(name='vibration_test.html', context={'request': request})
  481. @app.get('/channel', response_class=HTMLResponse)
  482. async def vibration(request: Request, Authorize: AuthJWT = Depends()):
  483. try:
  484. Authorize.jwt_required()
  485. except Exception as e:
  486. print(e)
  487. return RedirectResponse('/login')
  488. return templates.TemplateResponse(name='channel.html', context={'request': request})
  489. @app.get('/channel/{tower_id}/{channel_id}', response_class=HTMLResponse)
  490. async def vibration(request: Request,tower_id:str,channel_id:str,Authorize: AuthJWT = Depends()):
  491. try:
  492. Authorize.jwt_required()
  493. except Exception as e:
  494. print(e)
  495. return RedirectResponse('/login')
  496. print(find_vibration_id(tower_id,channel_id))
  497. result = get_channel_info(find_vibration_id(tower_id,channel_id))
  498. return json.dumps(result,ensure_ascii=False, cls = dateEncode)
  499. @app.get('/channel_chart/{tower_id}/{channel_id}', response_class=HTMLResponse)
  500. async def vibration(request: Request,tower_id:str,channel_id:str,Authorize: AuthJWT = Depends()):
  501. try:
  502. Authorize.jwt_required()
  503. except Exception as e:
  504. print(e)
  505. return RedirectResponse('/login')
  506. print(find_vibration_id(tower_id,channel_id))
  507. result = get_channel_health(find_vibration_id(tower_id,channel_id))
  508. return json.dumps(result,ensure_ascii=False, cls = dateEncode)
  509. @app.get('/channel_predict/{tower_id}/{channel_id}', response_class=HTMLResponse)
  510. async def vibration(request: Request,tower_id:str,channel_id:str,Authorize: AuthJWT = Depends()):
  511. try:
  512. Authorize.jwt_required()
  513. except Exception as e:
  514. print(e)
  515. return RedirectResponse('/login')
  516. #print(find_vibration_id(tower_id,channel_id))
  517. result = get_predect_data(find_vibration_id(tower_id,channel_id))
  518. return json.dumps(result,ensure_ascii=False, cls = dateEncode)
  519. @app.get('/channel_frequency/{tower_id}/{channel_id}', response_class=HTMLResponse)
  520. async def vibration(request: Request,tower_id:str,channel_id:str,Authorize: AuthJWT = Depends()):
  521. try:
  522. Authorize.jwt_required()
  523. except Exception as e:
  524. print(e)
  525. return RedirectResponse('/login')
  526. #print(find_vibration_id(tower_id,channel_id))
  527. result = get_frequency(find_vibration_id(tower_id,channel_id))
  528. return json.dumps(result,ensure_ascii=False, cls = dateEncode)
  529. @app.get('/history', response_class=HTMLResponse)
  530. async def history(request: Request, Authorize: AuthJWT = Depends()):
  531. try:
  532. Authorize.jwt_required()
  533. except Exception as e:
  534. print(e)
  535. return RedirectResponse('/login')
  536. # current_user = Authorize.get_jwt_subject()
  537. return templates.TemplateResponse(name='history.html', context={'request': request})
  538. @app.get('/history/', response_class=HTMLResponse)
  539. async def history(request: Request,company:str,factory:str,department:str,towerGroup:str, Authorize: AuthJWT = Depends()):
  540. try:
  541. Authorize.jwt_required()
  542. except Exception as e:
  543. print(e)
  544. return RedirectResponse('/login')
  545. #current_user = Authorize.get_jwt_subject()
  546. tower_arr = get_tower(company,factory,department,towerGroup)
  547. result = []
  548. for tower in tower_arr:
  549. tmp_arr = get_vibration_info(tower)
  550. for arr in tmp_arr:
  551. result.append(arr)
  552. return json.dumps(result,ensure_ascii=False, cls = dateEncode)
  553. @app.get('/device', response_class=HTMLResponse)
  554. async def device(request: Request, Authorize: AuthJWT = Depends()):
  555. try:
  556. Authorize.jwt_required()
  557. except Exception as e:
  558. print(e)
  559. return RedirectResponse('/login')
  560. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  561. statement = 'SELECT * FROM device '
  562. a = []
  563. print("start")
  564. for row in db.query(statement):
  565. print(row['id'],row['deviceName'],row['hostIP'],row['CompanyCode'],row['FactoryCode'],row['DepartmentCode'])
  566. a.append((row['id'],row['deviceName'],row['hostIP'],row['CompanyCode'],row['FactoryCode'],row['DepartmentCode']))
  567. print(a)
  568. print("over3")
  569. #result = json.dumps(b,ensure_ascii=False)
  570. # current_user = Authorize.get_jwt_subject()
  571. return templates.TemplateResponse(name='device.html', context={'request': request,'a':a})
  572. @app.get('/system', response_class=HTMLResponse)
  573. async def system(request: Request, Authorize: AuthJWT = Depends()):
  574. try:
  575. Authorize.jwt_required()
  576. except Exception as e:
  577. print(e)
  578. return RedirectResponse('/login')
  579. # current_user = Authorize.get_jwt_subject()
  580. return templates.TemplateResponse(name='system.html', context={'request': request})
  581. @app.get('/member', response_class=HTMLResponse)
  582. async def get_member(request: Request, Authorize: AuthJWT = Depends()):
  583. """獲取所有帳號資訊"""
  584. try:
  585. Authorize.jwt_required()
  586. except Exception as e:
  587. print(e)
  588. return RedirectResponse('/login')
  589. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  590. statement = 'SELECT id,username,isAdmin FROM users'
  591. json_dic = []
  592. for row in db.query(statement):
  593. #print(row['id'],row['username'])
  594. json_dic.append({'username':row['username'],'isAdmin':row['isAdmin'],'roleType':check_role_type(row['username']),'role_name' :get_role_name(check_role_type(row['username']))})
  595. result = json.dumps(json_dic,ensure_ascii=False)
  596. return result
  597. @app.get('/member/edit/', response_class=HTMLResponse)
  598. async def login(request: Request, name:str,isAdmin:int,isEnable:int ,Authorize: AuthJWT = Depends()):
  599. try:
  600. Authorize.jwt_required()
  601. except Exception as e:
  602. print(e)
  603. return RedirectResponse('/login')
  604. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  605. current_user = Authorize.get_jwt_subject()
  606. current_user_roleType = check_role_type(current_user)
  607. del_user_roleType = check_role_type(name)
  608. statement = 'SELECT isAdmin FROM users WHERE userName = "'+current_user+'"'
  609. for row in db.query(statement):
  610. if row['isAdmin']!=1:
  611. return json.dumps([{'msg':'你沒有權限'}],ensure_ascii=False)
  612. if del_user_roleType == None:
  613. return json.dumps([{'msg':'不存在使用者'}],ensure_ascii=False)
  614. elif current_user_roleType>del_user_roleType or current_user_roleType==del_user_roleType:
  615. return json.dumps([{'msg':'你沒有權限'}],ensure_ascii=False)
  616. user_dic = get_user(name)
  617. print(user_dic)
  618. user_dic.isAdmin = isAdmin
  619. user_dic.isEnable = isEnable
  620. table = db['users']
  621. table.update(dict(user_dic), ['username'])
  622. return json.dumps([{'msg':"成功更改"}],ensure_ascii=False)
  623. @app.get('/member_delete', response_class=HTMLResponse)
  624. async def login(request: Request, Authorize: AuthJWT = Depends()):
  625. try:
  626. Authorize.jwt_required()
  627. except Exception as e:
  628. print(e)
  629. return RedirectResponse('/login')
  630. return templates.TemplateResponse(name='delete_member_test2.html', context={'request': request})
  631. @app.post('/member_delete')
  632. async def delete_member(request: Request):
  633. """刪除成員"""
  634. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  635. del_user = models.del_user(**await request.form())
  636. delete_name = del_user.del_name
  637. statement = 'SELECT * FROM users'
  638. current_user = ''
  639. for row in db.query(statement):
  640. if row['token'] != None :
  641. if compare_jwt_token(row['token'],del_user.access_token):
  642. current_user = row['username']
  643. if current_user == '':
  644. return {'msg':'尚未登入'}
  645. statement = 'SELECT isAdmin FROM users WHERE userName = "'+current_user+'"'
  646. for row in db.query(statement):
  647. if row['isAdmin']!=1:
  648. return {'msg': ' 你沒有權限'}
  649. current_user_roleType = check_role_type(current_user)
  650. del_user_roleType = check_role_type(delete_name)
  651. if del_user_roleType == None:
  652. return {'msg':'不存在使用者'}
  653. elif current_user_roleType>del_user_roleType or current_user_roleType==del_user_roleType:
  654. return {'msg': ' 你沒有權限'}
  655. else :
  656. table = db['users']
  657. table.delete(username=delete_name)
  658. return {'msg': ' 成功刪除'}
  659. @app.get('/member_authority/{edit_one}', response_class=HTMLResponse)
  660. async def member_authority(request:Request,edit_one: int,Authorize: AuthJWT = Depends()):
  661. """設定成員權限"""
  662. try:
  663. Authorize.jwt_required()
  664. except Exception as e:
  665. print(e)
  666. return RedirectResponse('/login')
  667. context = {'request': request}
  668. current_user = Authorize.get_jwt_subject()
  669. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  670. statement = check_isAdmin(current_user)
  671. if statement == "no user":
  672. return templates.TemplateResponse(name='notice.html', context={"request":request,'msg':'no user' })
  673. elif statement == 0:
  674. return templates.TemplateResponse(name='notice.html', context={"request":request,'msg':"沒有權限" })
  675. current_user_roleType = check_role_type(current_user)
  676. if edit_one == None:
  677. return templates.TemplateResponse(name='notice.html', context={"request":request,'msg':'no role' })
  678. elif int(current_user_roleType)>int(edit_one) or int(current_user_roleType)==int(edit_one):
  679. return templates.TemplateResponse(name='notice.html', context={"request":request,'msg':"沒有權限" })
  680. result = check_role_acl(edit_one)
  681. if result == []:
  682. cmd = 'SELECT id FROM module'
  683. for row in db.query(cmd):
  684. dic_tmp = {'id':0,'isView':0,'isAdd':0 ,'isEdit':0,'isDel':0,'role_id' : edit_one}
  685. context[get_modul_name(row['id']) ] = dic_tmp
  686. else:
  687. for dic in result:
  688. modul_name = get_modul_name(dic['module_id'])
  689. del dic['module_id']
  690. context[modul_name ] = dic
  691. return templates.TemplateResponse(name='member_authority_test.html', context=context)
  692. @app.post('/member_authority')
  693. async def member_authority(request: Request):
  694. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  695. edit_one = models.user_authority(**await request.form())
  696. statement = 'SELECT * FROM users'
  697. current_user = ''
  698. for row in db.query(statement):
  699. if row['token'] != None :
  700. if compare_jwt_token(row['token'],edit_one.access_token):
  701. current_user = row['username']
  702. if current_user == '':
  703. return templates.TemplateResponse(name='notice.html', context={"request":request,'msg':'尚未登入'})
  704. statement = check_isAdmin(current_user)
  705. if statement == "no user":
  706. return templates.TemplateResponse(name='notice.html', context={"request":request,'msg':statement })
  707. elif statement == 0:
  708. return templates.TemplateResponse(name='notice.html', context={"request":request,'msg':'你沒有權限' })
  709. current_user_roleType = check_role_type(current_user)
  710. edit_one_roleType = edit_one.role_id
  711. if current_user_roleType>edit_one_roleType or current_user_roleType==edit_one_roleType:
  712. return templates.TemplateResponse(name='notice.html', context={"request":request,'msg': ' 你沒有權限'})
  713. else :
  714. row = ['ai_prediction' ,'channel' ,'device', 'event', 'index' ,'performance', 'record', 'setting_device' ,'setting_system','tower']
  715. if check_role_acl(edit_one.role_id) == []:
  716. for module in row :
  717. new_dict = edit_one.get_acl_from_module_name(module)
  718. new_dict["id"]= None
  719. table = db['role_acl']
  720. table.insert(new_dict)
  721. else:
  722. for module in row :
  723. new_dict = edit_one.get_acl_from_module_name(module)
  724. table = db['role_acl']
  725. table.update(new_dict, ['id'])
  726. return templates.TemplateResponse(name='notice.html', context={"request":request,'msg': '成功更改權限'})
  727. # 溫度API
  728. @app.get('/temperature')
  729. async def get_temperatures():
  730. """ 撈DB溫度 """
  731. return {'hot_water': 30.48, 'cold_water': 28.10, 'wet_ball': 25.14}
  732. @app.post("/example")
  733. async def example(request: Request,Authorize: AuthJWT = Depends()):
  734. try:
  735. Authorize.jwt_required()
  736. except Exception as e:
  737. print(e)
  738. current_user = Authorize.get_jwt_subject()
  739. #form_data = await request.form()
  740. print( current_user)
  741. return current_user
  742. @app.post('/user')
  743. def user(Authorize: AuthJWT = Depends()):
  744. Authorize.jwt_required()
  745. current_user = Authorize.get_jwt_subject()
  746. return {"user": current_user}
  747. @app.get("/add_data", response_class=HTMLResponse)
  748. async def example(request: Request,Authorize: AuthJWT = Depends()):
  749. try:
  750. Authorize.jwt_required()
  751. except Exception as e:
  752. print(e)
  753. return RedirectResponse('/login')
  754. add_data()
  755. return templates.TemplateResponse(name='test.html', context={'request': request})
  756. @app.get('/health')
  757. async def get_health(date: str):
  758. """ 撈健康指標、預設健康指標 """
  759. date = str(datetime.strptime(date, "%Y-%m-%d"))[:10]
  760. print(date)
  761. print(str(datetime.today()))
  762. print(str(datetime.today()-timedelta(days=1)))
  763. fake_data = {
  764. str(datetime.today())[:10]: {'curr_health': 0.7, 'pred_health': 0.8},
  765. str(datetime.today()-timedelta(days=1))[:10]: {'curr_health': 0.6, 'pred_health': 0.7},
  766. }
  767. return fake_data[date]
  768. @app.get('/history_data')
  769. async def get_history(time_end: str):
  770. """ 透過終點時間,抓取歷史資料。 """
  771. date = str(datetime.strptime(time_end, "%Y-%m-%d"))[:10]
  772. print(date)
  773. print(str(datetime.today()))
  774. print(str(datetime.today()-timedelta(days=1)))
  775. fake_data = {
  776. str(datetime.today())[:10]: {
  777. 'curr_history': {
  778. 'RPM_1X': list(np.random.rand(13)),
  779. 'RPM_2X': list(np.random.rand(13)),
  780. 'RPM_3X': list(np.random.rand(13)),
  781. 'RPM_4X': list(np.random.rand(13)),
  782. 'RPM_5X': list(np.random.rand(13)),
  783. 'RPM_6X': list(np.random.rand(13)),
  784. 'RPM_7X': list(np.random.rand(13)),
  785. 'RPM_8X': list(np.random.rand(13)),
  786. 'Gear_1X': list(np.random.rand(13)),
  787. 'Gear_2X': list(np.random.rand(13)),
  788. 'Gear_3X': list(np.random.rand(13)),
  789. 'Gear_4X': list(np.random.rand(13)),
  790. },
  791. 'past_history': {
  792. 'RPM_1X': list(np.random.rand(13)),
  793. 'RPM_2X': list(np.random.rand(13)),
  794. 'RPM_3X': list(np.random.rand(13)),
  795. 'RPM_4X': list(np.random.rand(13)),
  796. 'RPM_5X': list(np.random.rand(13)),
  797. 'RPM_6X': list(np.random.rand(13)),
  798. 'RPM_7X': list(np.random.rand(13)),
  799. 'RPM_8X': list(np.random.rand(13)),
  800. 'Gear_1X': list(np.random.rand(13)),
  801. 'Gear_2X': list(np.random.rand(13)),
  802. 'Gear_3X': list(np.random.rand(13)),
  803. 'Gear_4X': list(np.random.rand(13)),
  804. }
  805. },
  806. str(datetime.today()-timedelta(days=1))[:10]: {
  807. 'curr_history': {
  808. 'RPM_1X': list(np.random.rand(13)),
  809. 'RPM_2X': list(np.random.rand(13)),
  810. 'RPM_3X': list(np.random.rand(13)),
  811. 'RPM_4X': list(np.random.rand(13)),
  812. 'RPM_5X': list(np.random.rand(13)),
  813. 'RPM_6X': list(np.random.rand(13)),
  814. 'RPM_7X': list(np.random.rand(13)),
  815. 'RPM_8X': list(np.random.rand(13)),
  816. 'Gear_1X': list(np.random.rand(13)),
  817. 'Gear_2X': list(np.random.rand(13)),
  818. 'Gear_3X': list(np.random.rand(13)),
  819. 'Gear_4X': list(np.random.rand(13)),
  820. },
  821. 'past_history': {
  822. 'RPM_1X': list(np.random.rand(13)),
  823. 'RPM_2X': list(np.random.rand(13)),
  824. 'RPM_3X': list(np.random.rand(13)),
  825. 'RPM_4X': list(np.random.rand(13)),
  826. 'RPM_5X': list(np.random.rand(13)),
  827. 'RPM_6X': list(np.random.rand(13)),
  828. 'RPM_7X': list(np.random.rand(13)),
  829. 'RPM_8X': list(np.random.rand(13)),
  830. 'Gear_1X': list(np.random.rand(13)),
  831. 'Gear_2X': list(np.random.rand(13)),
  832. 'Gear_3X': list(np.random.rand(13)),
  833. 'Gear_4X': list(np.random.rand(13)),
  834. }
  835. },
  836. }
  837. return fake_data[date]
  838. # Login funtion part
  839. def check_user_exists(username):
  840. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  841. if int(next(iter(db.query('SELECT COUNT(*) FROM Water_tower.users WHERE userName = "'+username+'"')))['COUNT(*)']) > 0:
  842. return True
  843. else:
  844. return False
  845. def get_user(username: str):
  846. """ 取得使用者資訊(Model) """
  847. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  848. if not check_user_exists(username): # if user don't exist
  849. return False
  850. user_dict = next(
  851. iter(db.query('SELECT * FROM Water_tower.users where userName ="'+username+'"')))
  852. user = models.User(**user_dict)
  853. return user
  854. def user_register(user):
  855. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  856. table = db['users']
  857. #user.password = get_password_hash(user.password)
  858. table.insert(dict(user))
  859. def get_password_hash(password):
  860. """ 加密密碼 """
  861. return pwd_context.hash(password)
  862. def verify_password(plain_password, hashed_password):
  863. """ 驗證密碼(hashed) """
  864. return pwd_context.verify(plain_password, hashed_password)
  865. def authenticate_user(username: str, password: str):
  866. """ 連線DB,讀取使用者是否存在。 """
  867. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  868. if not check_user_exists(username): # if user don't exist
  869. return False
  870. if not check_user_isEnable(username):
  871. return False
  872. user_dict = next(iter(db.query('SELECT * FROM Water_tower.users where userName ="'+username+'"')))
  873. user = models.User(**user_dict)
  874. #if not verify_password(password, user.password):
  875. #return False
  876. return user
  877. def create_access_token(data: dict, expires_delta: Optional[timedelta] = None):
  878. """ 創建token,並設定過期時間。 """
  879. to_encode = data.copy()
  880. if expires_delta:
  881. expire = datetime.utcnow() + expires_delta
  882. else:
  883. expire = datetime.utcnow() + timedelta(minutes=15)
  884. to_encode.update({"exp": expire})
  885. encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
  886. return encoded_jwt
  887. def compare_jwt_token(access_token: str, token: str):
  888. """比對jwt token"""
  889. if len(access_token) < len(token):
  890. if access_token in token:
  891. return True
  892. else :
  893. return False
  894. elif len(access_token) > len(token):
  895. if token in access_token:
  896. return True
  897. else :
  898. return False
  899. else :
  900. if token == access_token:
  901. return True
  902. else :
  903. return False
  904. def check_isAdmin(user_name:str):
  905. """查看是否為管理員"""
  906. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  907. isAdmin = None
  908. cmd = 'SELECT isAdmin FROM users WHERE userName = "'+user_name+'"'
  909. for row in db.query(cmd) :
  910. isAdmin = row['isAdmin']
  911. if isAdmin== None:
  912. return "no user"
  913. return isAdmin
  914. def check_role_type(user_name:str)->int:
  915. """查看使用者權限"""
  916. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  917. cmd = 'SELECT user_role.role_id FROM `users` JOIN `user_role` ON `users`.id = `user_role`.user_id where `users`.username = "'+user_name+'"'
  918. role_type = None
  919. for row in db.query(cmd) :
  920. role_type = row['role_id']
  921. return role_type
  922. def check_role_acl(role:int):
  923. """查看權限"""
  924. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  925. cmd = 'SELECT * FROM role_acl where role_id = '+str(role)
  926. result = []
  927. for row in db.query(cmd) :
  928. dic ={}
  929. for col_name in db['role_acl'].columns:
  930. dic[col_name] = row[col_name]
  931. if dic != {}:
  932. result.append(dic)
  933. return result
  934. def get_role_name(role_id:int):
  935. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  936. cmd = 'SELECT * FROM role where id = '+str(role_id)
  937. role:str
  938. for row in db.query(cmd) :
  939. role = row['name']
  940. return role
  941. def check_user_isEnable(user_name:str)->bool:
  942. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  943. cmd = 'SELECT isEnable FROM users where username = "'+str(user_name)+'"'
  944. able:bool
  945. for row in db.query(cmd) :
  946. able = row['isEnable']
  947. return able
  948. def get_user_under_organization(user_name:str):
  949. """查看所屬公司"""
  950. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  951. user_role = check_role_type(user_name)
  952. print(user_name,user_role)
  953. cmd = 'SELECT * FROM organization'
  954. result = []
  955. if int(user_role) == 1 :
  956. for row in db.query(cmd) :
  957. company = row['Company']
  958. factory = row['Factory']
  959. department = row['Department']
  960. cmd2 = 'SELECT TowerGroupCode FROM device WHERE CompanyCode = "' + company + '" AND FactoryCode = "' + factory + '" AND DepartmentCode = "' + department + '"'
  961. group = []
  962. for row2 in db.query(cmd2):
  963. if row2['TowerGroupCode'] not in group :
  964. group.append(row2['TowerGroupCode'])
  965. result.append({'company':company,'factory':factory,'department':department,'group':group,'able':1})
  966. elif int(user_role) == 2:
  967. cmd2 = 'SELECT company FROM user WHERE user.username ="'+user_name +'"'
  968. company_able:str
  969. for row in db.query(cmd2) :
  970. company_able = row['company']
  971. for row in db.query(cmd) :
  972. company = row['Company']
  973. factory = row['Factory']
  974. department = row['Department']
  975. cmd3 = 'SELECT TowerGroupCode FROM device WHERE CompanyCode = "' + company + '" AND FactoryCode = "' + factory + '" AND DepartmentCode = "' + department + '"'
  976. group = []
  977. for row2 in db.query(cmd3):
  978. if row2['TowerGroupCode'] not in group :
  979. group.append(row2['TowerGroupCode'])
  980. if company == company_able:
  981. result.append({'company':company,'factory':factory,'department':department,'group':group,'able':1})
  982. else:
  983. result.append({'company':company,'factory':factory,'department':department,'group':group,'able':0})
  984. elif int(user_role) == 3:
  985. cmd2 = 'SELECT company,factory FROM users WHERE users.username = "'+user_name +'"'
  986. company_able:str
  987. factory_able:str
  988. num = 0
  989. for row in db.query(cmd2) :
  990. company_able = row['company']
  991. factory_able = row['factory']
  992. for row in db.query(cmd) :
  993. company = row['Company']
  994. factory = row['Factory']
  995. department = row['Department']
  996. cmd3 = 'SELECT TowerGroupCode FROM device WHERE CompanyCode = "' + company + '" AND FactoryCode = "' + factory + '" AND DepartmentCode = "' + department + '"'
  997. group = []
  998. for row2 in db.query(cmd3):
  999. if row2['TowerGroupCode'] not in group :
  1000. group.append(row2['TowerGroupCode'])
  1001. if company == company_able and factory==factory_able:
  1002. result.append({'company':company,'factory':factory,'department':department,'group':group,'able':1})
  1003. else:
  1004. result.append({'company':company,'factory':factory,'department':department,'group':group,'able':0})
  1005. elif int(user_role) == 4:
  1006. cmd2 = 'SELECT company,factory,department FROM users WHERE username = "'+user_name +'"'
  1007. company_able:str
  1008. factory_able:str
  1009. department_able:str
  1010. for row in db.query(cmd2) :
  1011. company_able = row['company']
  1012. factory_able = row['factory']
  1013. department_able = row['department']
  1014. for row in db.query(cmd) :
  1015. company = row['Company']
  1016. factory = row['Factory']
  1017. department = row['Department']
  1018. cmd3 = 'SELECT TowerGroupCode FROM device WHERE CompanyCode = "' + company + '" AND FactoryCode = "' + factory + '" AND DepartmentCode = "' + department + '"'
  1019. group = []
  1020. for row2 in db.query(cmd3):
  1021. if row2['TowerGroupCode'] not in group :
  1022. group.append(row2['TowerGroupCode'])
  1023. if company == company_able and factory==factory_able and department==department_able:
  1024. result.append({'company':company,'factory':factory,'department':department,'group':group,'able':1})
  1025. else:
  1026. result.append({'company':company,'factory':factory,'department':department,'group':group,'able':0})
  1027. else :
  1028. result =[ {'msg':"error"}]
  1029. return result
  1030. def get_user_id(user_name:str):
  1031. """獲取user id"""
  1032. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  1033. cmd = 'SELECT id FROM `users` where username = "'+user_name+'"'
  1034. id = None
  1035. for row in db.query(cmd) :
  1036. id = row['id']
  1037. return id
  1038. def get_user_name(user_id:int):
  1039. """獲取user name"""
  1040. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  1041. cmd = 'SELECT username FROM `users` where id = "'+user_id+'"'
  1042. id = None
  1043. for row in db.query(cmd) :
  1044. id = row['username']
  1045. return id
  1046. def get_modul_name(modul_id:str):
  1047. """獲取modul名稱"""
  1048. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  1049. cmd = 'SELECT moduleName FROM `module` where id = "'+modul_id+'"'
  1050. modul_name = None
  1051. for row in db.query(cmd) :
  1052. modul_name = row['moduleName']
  1053. return modul_name
  1054. def get_tower_info(tower_id:str):
  1055. """獲取水塔資料"""
  1056. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  1057. cmd = 'SELECT * FROM `record_dcs` where device_id = "'+tower_id+'"'
  1058. result ={'DCS':{},'Fan':{},'Moter':{},'Device_info':{}}
  1059. for row in db.query(cmd) :
  1060. result['DCS'][row['key']]=row['value']
  1061. cmd = 'SELECT * FROM `record_tower` where device_id = "'+tower_id+'"'
  1062. for row in db.query(cmd) :
  1063. result['Fan'][row['key']]=row['value']
  1064. result['Moter'] = []
  1065. cmd = 'SELECT * FROM `vibration` where device_id = "'+tower_id+'"'
  1066. tmp = {}
  1067. for row in db.query(cmd) :
  1068. for col in db['vibration'].columns :
  1069. tmp[col] = row[col]
  1070. result['Moter'].append(tmp)
  1071. tmp = {}
  1072. cmd = 'SELECT * FROM `device` where id = "'+tower_id+'"'
  1073. for row in db.query(cmd):
  1074. for col in db['device'].columns :
  1075. if col != 'createTime':
  1076. result['Device_info'][col] = row[col]
  1077. return result
  1078. def get_tower_perform(tower_id:str):
  1079. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  1080. cmd = 'SELECT * FROM `record_performance` where deviceCode = "'+tower_id+'" AND designWFR = 27000'
  1081. result = [{}]
  1082. for row in db.query(cmd):
  1083. for col in db['record_performance'].columns :
  1084. if col != 'createTime':
  1085. result[0][col] = row[col]
  1086. #print(result)
  1087. return result
  1088. def get_tower(company:str,factory:str,department:str,towerGroup:str):
  1089. towergroup_arr =[]
  1090. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  1091. cmd = 'SELECT id FROM `device` where CompanyCode = "'+company+'" AND FactoryCode = "' +factory+'" AND DepartmentCode = "'+department+'" AND TowerGroupCode = "' + towerGroup + '"'
  1092. for row in db.query(cmd) :
  1093. towergroup_arr.append(row['id'])
  1094. return towergroup_arr
  1095. def check_tower_health(user_name:str):
  1096. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  1097. org = get_user_under_organization(user_name)
  1098. #print(org)
  1099. towers : list
  1100. result = []
  1101. for dic in org:
  1102. #print(dic)
  1103. if dic['able'] == 1:
  1104. for group in dic['group']:
  1105. towers = get_tower(dic['company'],dic['factory'],dic['department'],group)
  1106. for tower in towers:
  1107. cmd = 'SELECT CVIndex,threshold FROM `vibration` where device_id = "'+tower+'"'
  1108. health =1
  1109. for row in db.query(cmd) :
  1110. print(row['CVIndex'],row['threshold'])
  1111. if row['CVIndex'] < int(row['threshold']):
  1112. health = 0
  1113. print("heheh")
  1114. print(health)
  1115. result.append({'company':dic['company'], 'factory':dic['factory'], 'department':dic['department'], 'group': group, 'tower': tower, 'health': health})
  1116. return result
  1117. def find_vibration_id(tower_id:str,channel_id:str):
  1118. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  1119. cmd = 'SELECT id FROM `vibration` where device_id = "'+tower_id+'" AND channelName = "' +channel_id+'"'
  1120. for row in db.query(cmd) :
  1121. return row['id']
  1122. def get_channel_info(vibration_id):
  1123. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  1124. cmd = 'SELECT * FROM `record_diagnosis` where vibration_id = "'+vibration_id+'"'
  1125. result = {}
  1126. for row in db.query(cmd) :
  1127. for col in db['record_diagnosis'].columns :
  1128. result[col] = row[col]
  1129. cmd2='SELECT CVIndex,threshold FROM `vibration` where id = "'+vibration_id+'"'
  1130. for row2 in db.query(cmd2) :
  1131. result['CVIndex'] = row2['CVIndex']
  1132. result['threshold'] = row2['threshold']
  1133. print(result)
  1134. return result
  1135. def get_channel_health(vibration_id:str):
  1136. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  1137. result = []
  1138. data_name = ['CV_index', 'Vrms' ,'RPM']
  1139. for row in data_name:
  1140. result.append({'name':row,'data':[]})
  1141. cmd = 'SELECT * FROM record_health where vibration_id = "'+vibration_id+'"'
  1142. for row in db.query(cmd) :
  1143. for dic in result:
  1144. dic['data'].append(row[dic['name']])
  1145. return result
  1146. def get_predect_data(vibration_id:str):
  1147. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  1148. result = {}
  1149. cmd = 'SELECT * FROM record_prediction_upd where vibration_id = "'+vibration_id+'"'
  1150. for row in db.query(cmd) :
  1151. arr = row['predictData'].split(',')
  1152. result['data']=arr
  1153. return result
  1154. def get_frequency(vibration_id:str):
  1155. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  1156. result = {'Hz':[],'value':[]}
  1157. print(vibration_id)
  1158. cmd = 'SELECT * FROM record_frequency where vibration_id = "'+vibration_id+'"'
  1159. for row in db.query(cmd) :
  1160. result['Hz'].append(row['MFHz'])
  1161. result['value'].append(row['MFValue'])
  1162. return result
  1163. def get_vibration_info(deviceCode:str):
  1164. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  1165. cmd = 'SELECT * FROM vibration where device_id = "'+deviceCode+'"'
  1166. tmp = []
  1167. for row in db.query(cmd) :
  1168. result = {}
  1169. for col in db['vibration'].columns :
  1170. result[col] = row[col]
  1171. #print(result)
  1172. tmp.append(result)
  1173. #print(tmp)
  1174. return tmp
  1175. def add_data():
  1176. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  1177. loc_dt = datetime.today()
  1178. loc_dt_format = loc_dt.strftime("%Y-%m-%d %H:%M:%S")
  1179. cmd = "TRUNCATE TABLE record_health"
  1180. db.query(cmd)
  1181. for j in range(1,5):
  1182. for i in range(0,7):
  1183. time_del = timedelta(days=i)
  1184. date=loc_dt-time_del
  1185. db['record_health'].insert(dict(time_stamp=date, CV_index=uniform(0.6, 0.8), Vrms=uniform(1,3),Grms = uniform(1,3),RPM=uniform(1,3),vibration_id = j))
  1186. cmd = "TRUNCATE TABLE record_frequency"
  1187. db.query(cmd)
  1188. for i in range(0,1000):
  1189. print(i)
  1190. db['record_frequency'].insert(dict(time_stamp=loc_dt_format, MFHz=i, MFValue=uniform(0,0.12),vibration_id = 1))
  1191. cmd = "TRUNCATE TABLE record_frequency"
  1192. db.query(cmd)
  1193. for i in range(0,1000):
  1194. print(i)
  1195. db['record_frequency'].insert(dict(time_stamp=loc_dt_format, MFHz=i, MFValue=uniform(0,0.12),vibration_id = 1))
  1196. def add_tower():
  1197. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  1198. loc_dt = datetime.today()
  1199. loc_dt_format = loc_dt.strftime("%Y-%m-%d %H:%M:%S")
  1200. for device in ['dev005','dev006','dev007','dev008','dev009']:
  1201. for key in ['hotTemp','waterFlow','coldTemp','fanMotorCur','fanMotorSpeedFreq']:
  1202. db['record_dcs'].insert(dict(time_stamp=loc_dt_format, MFValue=uniform(0,0.12),vibration_id = 1))