main.py 54 KB

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