main.py 36 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190
  1. import xml.etree.ElementTree as ET
  2. from typing import Union, Annotated
  3. from fastapi import FastAPI, HTTPException, status, Depends
  4. import os
  5. import uuid
  6. import re
  7. import zipfile
  8. import json
  9. import chromadb
  10. from datetime import timedelta
  11. from fastapi.middleware.cors import CORSMiddleware
  12. from fastapi.middleware.gzip import GZipMiddleware
  13. from sentence_transformers import SentenceTransformer
  14. model = SentenceTransformer("BAAI/bge-small-zh-v1.5")
  15. import base64
  16. from pydantic import BaseModel
  17. from subdir import service
  18. from subdir import db
  19. from subdir import util
  20. import xml.dom.minidom as MD
  21. import numpy as np
  22. from fastapi.staticfiles import StaticFiles
  23. import httpx
  24. httpClient = httpx.AsyncClient()
  25. from pymongo import AsyncMongoClient
  26. uri = "mongodb://owner:Pheecian1@47.101.198.30:27017/baojia"
  27. uri2 = "mongodb://owner:Pheecian1@47.101.198.30:27017/dinge"
  28. client = AsyncMongoClient(uri)
  29. dingeclient = AsyncMongoClient(uri2)
  30. chroma_client = chromadb.HttpClient(host='47.101.198.30', port=8000)
  31. from fastapi.responses import FileResponse, RedirectResponse
  32. from fastapi_cache import FastAPICache
  33. from inmemory import InMemoryBackend
  34. from fastapi_cache.decorator import cache
  35. from contextlib import asynccontextmanager
  36. from fastapi import WebSocket, WebSocketDisconnect
  37. from fastapi import UploadFile, File, Form
  38. from collections.abc import AsyncIterator
  39. from tasks import process_data
  40. from celery.result import AsyncResult
  41. from fastapi_login import LoginManager
  42. class ConnectionManager:
  43. """Class defining socket events"""
  44. def __init__(self):
  45. """init method, keeping track of connections"""
  46. self.active_connections = []
  47. async def connect(self, websocket: WebSocket):
  48. """connect event"""
  49. await websocket.accept()
  50. self.active_connections.append(websocket)
  51. async def send_personal_message(self, message: str, websocket: WebSocket):
  52. """Direct Message"""
  53. await websocket.send_text(message)
  54. def disconnect(self, websocket: WebSocket):
  55. """disconnect event"""
  56. self.active_connections.remove(websocket)
  57. @asynccontextmanager
  58. async def lifespan(_: FastAPI) -> AsyncIterator[None]:
  59. FastAPICache.init(InMemoryBackend(), prefix="default")
  60. yield
  61. SECRET = '400687251779e65aca22ef5bb52b9cc4c218c63571004aeb'
  62. app = FastAPI(lifespan=lifespan)
  63. origins = [
  64. "http://localhost.tiangolo.com",
  65. "https://localhost.tiangolo.com",
  66. "http://localhost",
  67. "http://localhost:9002",
  68. "http://127.0.0.1:9002",
  69. ]
  70. app.add_middleware(
  71. CORSMiddleware,
  72. allow_origins=["*"],
  73. allow_credentials=True,
  74. allow_methods=["*"],
  75. allow_headers=["*"],
  76. )
  77. ##app.add_middleware(GZipMiddleware, minimum_size=1000, compresslevel=5)
  78. ##app.mount("/static", StaticFiles(directory="front/dist"), name="static")
  79. ##manager = ConnectionManager()
  80. manager = LoginManager(SECRET, token_url='/token')
  81. @manager.user_loader()
  82. def load_user(id: str): # could also be an asynchronous function
  83. return id
  84. class Task(BaseModel):
  85. bianma: str
  86. mc: str
  87. tz: str
  88. dw: str
  89. sl: str
  90. n: int
  91. label: str
  92. name: str
  93. bh: str
  94. class Jxtz(BaseModel):
  95. biao_id: str
  96. bh: str
  97. glf: str
  98. lr: str
  99. bz: int
  100. gong: str
  101. chaiyou: str
  102. qiyou: str
  103. dian: str
  104. class Lsj(BaseModel):
  105. bianma: str
  106. mingcheng: str
  107. danwei: str
  108. class Xxj(BaseModel):
  109. city: str
  110. month: str
  111. class Rgtz(BaseModel):
  112. biao_id: str
  113. bh: str
  114. yi: str
  115. er: str
  116. san: str
  117. glf: str
  118. lr: str
  119. bz: int
  120. class Zcfx(BaseModel):
  121. biao_id: str
  122. bh: str
  123. class Zcfx2(BaseModel):
  124. biao_id: str
  125. bh: str
  126. prefix: str
  127. class Info(BaseModel):
  128. name: str
  129. class DingeshuRequest(BaseModel):
  130. value: int
  131. class DingeXilieRequest(BaseModel):
  132. value: int
  133. id: str
  134. class SingleDingeXilieRequest(BaseModel):
  135. zhuanye: int
  136. debh: str
  137. class InfoWithID(BaseModel):
  138. name: str
  139. id: str
  140. class Tiaojia(BaseModel):
  141. biao_id: str
  142. bh: str
  143. bm: str
  144. mingcheng: str
  145. danwei: str
  146. jiage: str
  147. glf: str
  148. lr: str
  149. bz: int
  150. class SearchDe(BaseModel):
  151. zhuanye: str
  152. text: str
  153. class UpdateZjcs(BaseModel):
  154. biao_id: str
  155. bh: str
  156. mc: str
  157. fl: str
  158. class Item(BaseModel):
  159. bh: str
  160. bt: str
  161. name: str
  162. class Rcj(BaseModel):
  163. bh: str
  164. bt: str
  165. bm: str
  166. name: str
  167. class Dercj(BaseModel):
  168. bh: str
  169. bt: str
  170. qdbm: str
  171. debm: str
  172. name: str
  173. class Zjcs(BaseModel):
  174. bh: str
  175. name: str
  176. @app.post("/pushtask/")
  177. async def pushtask(r: Task, user=Depends(manager)):
  178. task = process_data.apply_async(kwargs={"data": {"bianma": r.bianma, "mc": r.mc, "tz": r.tz, "dw": r.dw, "sl": r.sl, "n": r.n, "label": r.label, 'name': r.name, 'bh': r.bh}})
  179. return {"id": task.id}
  180. @app.get("/checktask/{id}")
  181. async def checktask(id, user=Depends(manager)):
  182. print(id)
  183. result = AsyncResult(id)
  184. return {
  185. "status": result.status,
  186. "result": result.result if result.ready() else None
  187. }
  188. @app.post("/outline2")
  189. async def read_root2(info: Info, user=Depends(manager)):
  190. return await db.getOutline(client, info.name, user)
  191. @app.post("/detail2")
  192. async def read_detail2(info: Info, user=Depends(manager)):
  193. return await db.getDetail(client, info.name, user)
  194. @app.post("/baojiahuizong2/")
  195. async def read_bjhz2(info: InfoWithID, user=Depends(manager)):
  196. raw = await db.getBjhz(client, info.name, info.id)
  197. raw2 = []
  198. for entry in raw:
  199. if "__children" in entry:
  200. entry["_children"] = entry["__children"]
  201. for grandchild in entry["_children"]:
  202. if "__children" in grandchild:
  203. grandchild['_children'] = grandchild['__children']
  204. del grandchild['__children']
  205. del entry["__children"]
  206. raw2.append(entry)
  207. return raw2
  208. @app.post("/guifeishuijin2/")
  209. async def read_gfsj2(info: InfoWithID, user=Depends(manager)):
  210. raw = await db.getGfsj(client, info.name, info.id)
  211. raw2 = []
  212. for entry in raw:
  213. if "__children" in entry:
  214. entry["_children"] = entry["__children"]
  215. del entry["__children"]
  216. raw2.append(entry)
  217. return raw2
  218. @app.post("/qitaxiangmu2/")
  219. async def read_qtxm2(info: InfoWithID, user=Depends(manager)):
  220. raw = await db.getQtxm(client, info.name, info.id)
  221. raw2 = []
  222. for entry in raw:
  223. if "__children" in entry:
  224. entry["_children"] = entry["__children"]
  225. del entry["__children"]
  226. raw2.append(entry)
  227. return raw2
  228. @app.post("/zygczgj/")
  229. async def zygczgj(info: InfoWithID, user=Depends(manager)):
  230. return await db.getZygczgj(client, info.name, info.id)
  231. @app.post("/zanliejine2/")
  232. async def read_zlje2(info: InfoWithID, user=Depends(manager)):
  233. return await db.getZlje(client, info.name, info.id)
  234. @app.post("/jirigong2/")
  235. async def read_jrg2(info: InfoWithID, user=Depends(manager)):
  236. return await db.getJrg(client, info.name, info.id)
  237. @app.post("/zongchengbaofuwufei2/")
  238. async def read_zcbfwf2(info: InfoWithID, user=Depends(manager)):
  239. return await db.getZcbfwf(client, info.name, info.id)
  240. @app.post("/fabaorengongyingcailiao2/")
  241. async def read_fbrgycl2(info: InfoWithID, user=Depends(manager)):
  242. return await db.getFbrgycl(client, info.name, info.id)
  243. @app.post("/rencaijihuizong2/")
  244. async def read_rcjhz2(info: InfoWithID, user=Depends(manager)):
  245. return await db.getRcjhz(client, info.name, info.id)
  246. @app.post("/qingdanxiangmu2/")
  247. async def read_qdxm2(info: InfoWithID, user=Depends(manager)):
  248. return await db.getQdxm(client, info.name, info.id)
  249. @app.post("/qingdanmingxi/")
  250. async def read_qdmx(item : Item, user=Depends(manager)):
  251. return await db.getQdmx(client, item.name, item.bh, item.bt)
  252. @app.get("/qingdantuijian/{bm}")
  253. @cache(expire=86400)
  254. async def read_tuijian(bm: str):
  255. return service.getQingdanTuijian("", "", bm)
  256. @app.post("/zjcs/")
  257. async def read_zjcs(item : Zjcs, user=Depends(manager)):
  258. raw = await db.getZjcs(client, item.name, item.bh)
  259. raw2 = []
  260. for entry in raw:
  261. if "__children" in entry:
  262. entry["_children"] = entry["__children"]
  263. del entry["__children"]
  264. raw2.append(entry)
  265. return raw2
  266. @app.post("/djcs/")
  267. async def read_djcs(item : Zjcs, user=Depends(manager)):
  268. raw = await db.getDjcs(client, item.name, item.bh)
  269. raw2 = []
  270. for entry in raw:
  271. if "__children" in entry:
  272. entry["_children"] = entry["__children"]
  273. del entry["__children"]
  274. raw2.append(entry)
  275. return raw2
  276. @app.post("/files2/")
  277. async def read_files2(user=Depends(manager)):
  278. result = await db.list_files(client, user)
  279. return result
  280. @app.post("/deleteFile/")
  281. async def delete(r: Info, user=Depends(manager)):
  282. result = await db.delete_files(client, r.name, user)
  283. return result
  284. @app.get("/qingdanshu/{zhuanye}")
  285. @cache(expire=86400)
  286. async def read_qds(zhuanye : str):
  287. result = service.getQds()
  288. if zhuanye == '10':
  289. return [result[0]]
  290. elif zhuanye == '20':
  291. return [result[2]]
  292. elif zhuanye == '30':
  293. return [result[3]]
  294. elif zhuanye == '40':
  295. return [result[4]]
  296. else:
  297. return result
  298. @app.get("/qingdan/{bm}")
  299. @cache(expire=86400)
  300. async def read_qingdan(bm: str):
  301. result = service.getQingdan(bm)
  302. return result
  303. @app.get("/des/{value}")
  304. @cache(expire=86400)
  305. async def read_des(value: int):
  306. result = service.getDes(value)
  307. if value == 30:
  308. result.append({
  309. "id": "2075",
  310. "key" : "2075",
  311. "value" : "2075",
  312. "label" : "安装费用",
  313. "title" : "安装费用",
  314. "children" : [
  315. {
  316. "id": "2076",
  317. "key" : "2076",
  318. "value" : "2076",
  319. "label" : "脚手架搭拆费",
  320. "title" : "脚手架搭拆费",
  321. "children" : []
  322. },
  323. {
  324. "id": "2077",
  325. "key" : "2077",
  326. "value" : "2077",
  327. "label" : "施工超高增加费",
  328. "title" : "施工超高增加费",
  329. "children" : []
  330. },
  331. {
  332. "id": "2080",
  333. "key" : "2080",
  334. "value" : "2080",
  335. "label" : "高层建筑增加费",
  336. "title" : "高层建筑增加费",
  337. "children" : [
  338. {
  339. "id": "2081",
  340. "key" : "2081",
  341. "value" : "2081",
  342. "label" : "第四册",
  343. "title" : "第四册",
  344. "children" : []
  345. },
  346. {
  347. "id": "2082",
  348. "key" : "2082",
  349. "value" : "2082",
  350. "label" : "第五册",
  351. "title" : "第五册",
  352. "children" : []
  353. },
  354. {
  355. "id": "2083",
  356. "key" : "2083",
  357. "value" : "2083",
  358. "label" : "第七册",
  359. "title" : "第七册",
  360. "children" : []
  361. },
  362. {
  363. "id": "2084",
  364. "key" : "2084",
  365. "value" : "2084",
  366. "label" : "第九册",
  367. "title" : "第九册",
  368. "children" : []
  369. },
  370. {
  371. "id": "2085",
  372. "key" : "2085",
  373. "value" : "2085",
  374. "label" : "第十册",
  375. "title" : "第十册",
  376. "children" : []
  377. },
  378. {
  379. "id": "2086",
  380. "key" : "2086",
  381. "value" : "2086",
  382. "label" : "第十一册",
  383. "title" : "第十一册",
  384. "children" : []
  385. },
  386. ]
  387. },
  388. {
  389. "id": "2078",
  390. "key" : "2078",
  391. "value" : "2078",
  392. "label" : "安装生产同时增加费",
  393. "title" : "安装生产同时增加费",
  394. "children" : []
  395. },
  396. {
  397. "id": "2079",
  398. "key" : "2079",
  399. "value" : "2079",
  400. "label" : "有害环境操作增加费",
  401. "title" : "有害环境操作增加费",
  402. "children" : []
  403. },
  404. {
  405. "id": "2087",
  406. "key" : "2087",
  407. "value" : "2087",
  408. "label" : "系统调试费",
  409. "title" : "系统调试费",
  410. "children" : []
  411. },
  412. ]
  413. })
  414. if value == 60:
  415. result.append({
  416. "id": "184",
  417. "key" : "184",
  418. "value" : "184",
  419. "label" : "安装费用",
  420. "title" : "安装费用",
  421. "children" : [
  422. {
  423. "id": "185",
  424. "key" : "185",
  425. "value" : "185",
  426. "label" : "脚手架搭拆费",
  427. "title" : "脚手架搭拆费",
  428. "children" : []
  429. },
  430. {
  431. "id": "186",
  432. "key" : "186",
  433. "value" : "186",
  434. "label" : "施工超高增加费",
  435. "title" : "施工超高增加费",
  436. "children" : []
  437. },
  438. {
  439. "id": "187",
  440. "key" : "187",
  441. "value" : "187",
  442. "label" : "高层建筑增加费",
  443. "title" : "高层建筑增加费",
  444. "children" : []
  445. }
  446. ]
  447. })
  448. return result
  449. @app.get("/pbs/{value}")
  450. @cache(expire=86400)
  451. async def read_pbs(value:int):
  452. result = service.getPbs(value)
  453. #print(result)
  454. result.insert(0, {"id": "0","key": "0", "label": "全部", "title": "全部"})
  455. return result
  456. @app.get("/jxs/{value}")
  457. @cache(expire=86400)
  458. async def read_jxs(value:int):
  459. result = service.getJxs(value)
  460. #print(result)
  461. result.insert(0, {"id": "0","key": "0", "label": "全部", "title": "全部"})
  462. return result
  463. @app.get("/cls/{value}")
  464. @cache(expire=86400)
  465. async def read_cls(value:int):
  466. result = service.getCls(value)
  467. #print(result)
  468. result.insert(0, {"id": "0","key": "0", "label": "全部", "title": "全部"})
  469. return result
  470. @app.get("/pbxl/{name}/{zhuanye}")
  471. @cache(expire=86400)
  472. async def read_pbxl(name: str, zhuanye: int):
  473. result = service.getPbxl(name, zhuanye)
  474. #print(result)
  475. return result
  476. @app.get("/jxxl/{name}/{zhuanye}")
  477. @cache(expire=86400)
  478. async def read_jxxl(name: str, zhuanye: int):
  479. result = service.getJxxl(name, zhuanye)
  480. #print(result)
  481. return result
  482. @app.get("/clxl/{name}/{zhuanye}")
  483. @cache(expire=86400)
  484. async def read_clxl(name: str, zhuanye: int):
  485. result = service.getClxl(name, zhuanye)
  486. #print(result)
  487. return result
  488. @app.get("/cankao/")
  489. @cache(expire=86400)
  490. async def cankao():
  491. result = service.getCankao()
  492. #print(result)
  493. return result
  494. @app.post("/qufei/")
  495. async def read_qufei(r: Info, user=Depends(manager)):
  496. return await db.getQufei(client, r.name, user)
  497. @app.post("/jiagongcai/")
  498. async def read_jiagongcai(r: Info, user=Depends(manager)):
  499. return await db.getJiagongcai(client, r.name)
  500. @app.get("/dexilie/{value}/{id}")
  501. @cache(expire=86400)
  502. async def read_dexilie(value: int, id: str):
  503. if value == 30 and int(id) > 2074:
  504. return service.getDeXilie_azfy(value, id)
  505. if value == 60 and int(id) > 183:
  506. return service.getDeXilie_xsazfy(value, id)
  507. result = service.getDeXilie(value, id)
  508. #print(result)
  509. return result
  510. @app.get("/singledexilie2/{zhuanye}/{debh}")##debh = debh!description
  511. @cache(expire=86400)
  512. async def read_singledexilie2(zhuanye: int, debh: str):
  513. if debh.startswith("D") :
  514. return json.dumps({
  515. "reverse": "None",
  516. "rgde": None,
  517. "jxde": None,
  518. "clde": None,
  519. "actual_zhuanye": zhuanye,
  520. "bz_selected": {"BZBH": {}},
  521. "bz_selected2": {"BZBH": {}}
  522. }, ensure_ascii=False)
  523. if "-F" in debh and zhuanye == 30:
  524. return service.read_singledexilie_azfy(debh)
  525. if "-F" in debh and zhuanye == 60:
  526. return service.read_singledexilie_xsazfy(debh)
  527. if debh == '19-19':
  528. return service.read_singledexilie_tjazfy(debh)
  529. if debh == '19-20':
  530. return service.read_singledexilie_tjazfy(debh)
  531. if debh == '19-21':
  532. return service.read_singledexilie_tjazfy(debh)
  533. if debh == '19-22':
  534. return service.read_singledexilie_tjazfy(debh)
  535. if debh == '19-23':
  536. return service.read_singledexilie_tjazfy(debh)
  537. if debh == '19-24':
  538. return service.read_singledexilie_tjazfy(debh)
  539. if debh == '19-25':
  540. return service.read_singledexilie_tjazfy(debh)
  541. if debh == '19-26':
  542. return service.read_singledexilie_tjazfy(debh)
  543. if debh == '19-27':
  544. return service.read_singledexilie_tjazfy(debh)
  545. if debh == '19-28':
  546. return service.read_singledexilie_tjazfy(debh)
  547. if debh == '19-29':
  548. return service.read_singledexilie_tjazfy(debh)
  549. if debh == '19-30':
  550. return service.read_singledexilie_tjazfy(debh)
  551. if debh == '19-31':
  552. return service.read_singledexilie_tjazfy(debh)
  553. if debh == '19-32':
  554. return service.read_singledexilie_tjazfy(debh)
  555. if debh == '19-33':
  556. return service.read_singledexilie_tjazfy(debh)
  557. if debh == '19-34':
  558. return service.read_singledexilie_tjazfy(debh)
  559. if debh == '19-35':
  560. return service.read_singledexilie_tjazfy(debh)
  561. if debh == '19-36':
  562. return service.read_singledexilie_tjazfy(debh)
  563. r_debh = debh.split("!")[0]
  564. if "附注" in r_debh:
  565. position = r_debh.find("附注")
  566. r_debh = r_debh[:position]
  567. ##print(r_debh)
  568. result1, result2, rgde, jxde, clde, bz_selected, bz_selected2, actual_zhuanye= service.getSingleDeXilie(zhuanye, r_debh)
  569. ##print("get result ***************************************")
  570. if result1:
  571. result3 = json.loads(result1)
  572. else:
  573. result3 = {}
  574. result3["reverse"] = str(result2)
  575. result3["rgde"] = rgde
  576. result3["jxde"] = jxde
  577. result3["clde"] = clde
  578. result3["actual_zhuanye"] = actual_zhuanye
  579. if bz_selected != None:
  580. result3["bz_selected"] = json.loads(bz_selected)
  581. else:
  582. result3["bz_selected"] = {"BZBH": {}}
  583. if bz_selected2 != None:
  584. result3["bz_selected2"] = json.loads(bz_selected2)
  585. else:
  586. result3["bz_selected2"] = {"BZBH": {}}
  587. ####14-227+[14-228]*-2
  588. ####3-409*1.2
  589. ##print(r_debh)
  590. if "[" in r_debh:
  591. position3 = r_debh.find("*")
  592. coef = 1
  593. if position3 == -1:
  594. pass
  595. else:
  596. coef = r_debh[1 + position3:]
  597. ##print(coef)
  598. tail = 0
  599. for i in range(0, len(coef) + 1):
  600. if i == len(coef):
  601. tail = i
  602. break
  603. if (coef[i] > '9' or coef[i] < '0') and coef[i] != '-' and coef[i] != '.':
  604. tail = i
  605. break
  606. if tail == 0:
  607. ##print("1113111")
  608. result3["reverse"] = 'None'
  609. return json.dumps(service.chaifen(result3, actual_zhuanye), ensure_ascii=False)
  610. coef = float(coef[0:tail])
  611. position1 = r_debh.find("[")
  612. position2 = r_debh.find("]")
  613. if position2 == -1:
  614. ##print("1121111")
  615. result3["reverse"] = 'None'
  616. return json.dumps(service.chaifen(result3, actual_zhuanye), ensure_ascii=False)
  617. if r_debh[position1-1] == "+":
  618. pass
  619. elif r_debh[position1-1] == "-":
  620. coef = -coef
  621. else:
  622. ##print("111111")
  623. result3["reverse"] = 'None'
  624. return json.dumps(service.chaifen(result3, actual_zhuanye), ensure_ascii=False)
  625. debh = r_debh[position1+1: position2]
  626. if result3['GLDE']: ##csv文件里的字段,表示这个定额有没有配套的增减定额
  627. hit = False
  628. for key, value in result3['GLDE'].items():
  629. if debh in value:
  630. hit = True
  631. if not hit:
  632. result3["reverse"] = 'None'
  633. return json.dumps(service.chaifen(result3, actual_zhuanye), ensure_ascii=False)
  634. else:
  635. result3["reverse"] = 'None'
  636. return json.dumps(service.chaifen(result3, actual_zhuanye), ensure_ascii=False)
  637. result1_, result2_, rgde_, jxde_, clde_, bz_selected_, bz_selected2_, actual_zhuanye_ = service.getSingleDeXilie(zhuanye, debh)
  638. if result1_:
  639. rgde=util.mergerg(rgde, rgde_, coef)
  640. jxde=util.mergejx(jxde, jxde_, coef)
  641. clde=util.mergecl(clde, clde_, coef)
  642. result3["rgde"] = rgde
  643. result3["jxde"] = jxde
  644. result3["clde"] = clde
  645. item_ = None
  646. for item in result3['DW'].keys():
  647. item_ = item
  648. result3['DEBH'] = {item_: util.cleanBM(r_debh)}
  649. else:
  650. result3["reverse"] = 'None'
  651. elif "*" in r_debh:##1-234*1.2
  652. position3 = r_debh.find("*")
  653. coef = 1
  654. coef = r_debh[1 + position3:]
  655. ##print(coef)
  656. tail = 0
  657. for i in range(0, len(coef) + 1):
  658. if i == len(coef):
  659. tail = i
  660. break
  661. if (coef[i] > '9' or coef[i] < '0') and coef[i] != '-' and coef[i] != '.':
  662. tail = i
  663. break
  664. if tail == 0:
  665. ##print("1113111")
  666. result3["reverse"] = 'None'
  667. return json.dumps(service.chaifen(result3, actual_zhuanye), ensure_ascii=False)
  668. coef = float(coef[0:tail])
  669. util.multirg(result3["rgde"], coef)
  670. util.multijx(result3["jxde"], coef)
  671. util.multicl(result3["clde"], coef)
  672. item_ = None
  673. for item in result3['DW'].keys():
  674. item_ = item
  675. result3['DEBH'] = {item_: (r_debh)}
  676. ##print(result3)
  677. return json.dumps(service.chaifen(result3, actual_zhuanye), ensure_ascii=False)
  678. @app.get("/singledexilie/{zhuanye}/{debh}/{mc}")
  679. @cache(expire=86400)
  680. async def read_singledexilie(zhuanye: int, debh: str, mc: str):
  681. if debh.startswith("D") :
  682. return json.dumps({
  683. "reverse": "None",
  684. "rgde": None,
  685. "jxde": None,
  686. "clde": None,
  687. "actual_zhuanye": zhuanye,
  688. "bz_selected": {"BZBH": {}},
  689. "bz_selected2": {"BZBH": {}}
  690. }, ensure_ascii=False)
  691. if "-F" in debh:
  692. if mc == '第一章' or mc == '第二章' or mc == '第三章':
  693. return service.read_singledexilie_xsazfy(debh)
  694. return service.read_singledexilie_azfy(debh)
  695. if debh == '19-19':
  696. return service.read_singledexilie_tjazfy(debh)
  697. if debh == '19-20':
  698. return service.read_singledexilie_tjazfy(debh)
  699. if debh == '19-21':
  700. return service.read_singledexilie_tjazfy(debh)
  701. if debh == '19-22':
  702. return service.read_singledexilie_tjazfy(debh)
  703. if debh == '19-23':
  704. return service.read_singledexilie_tjazfy(debh)
  705. if debh == '19-24':
  706. return service.read_singledexilie_tjazfy(debh)
  707. if debh == '19-25':
  708. return service.read_singledexilie_tjazfy(debh)
  709. if debh == '19-26':
  710. return service.read_singledexilie_tjazfy(debh)
  711. if debh == '19-27':
  712. return service.read_singledexilie_tjazfy(debh)
  713. if debh == '19-28':
  714. return service.read_singledexilie_tjazfy(debh)
  715. if debh == '19-29':
  716. return service.read_singledexilie_tjazfy(debh)
  717. if debh == '19-30':
  718. return service.read_singledexilie_tjazfy(debh)
  719. if debh == '19-31':
  720. return service.read_singledexilie_tjazfy(debh)
  721. if debh == '19-32':
  722. return service.read_singledexilie_tjazfy(debh)
  723. if debh == '19-33':
  724. return service.read_singledexilie_tjazfy(debh)
  725. if debh == '19-34':
  726. return service.read_singledexilie_tjazfy(debh)
  727. if debh == '19-35':
  728. return service.read_singledexilie_tjazfy(debh)
  729. if debh == '19-36':
  730. return service.read_singledexilie_tjazfy(debh)
  731. r_debh = debh.split("!")[0]
  732. if "附注" in r_debh:
  733. position = r_debh.find("附注")
  734. r_debh = r_debh[:position]
  735. ##print(r_debh)
  736. result1, result2, rgde, jxde, clde, bz_selected, bz_selected2, actual_zhuanye= await db.getSingleDeXilie(model, dingeclient, zhuanye, r_debh, mc)
  737. ###print("get result ***************************************")
  738. if result1:
  739. result3 = json.loads(result1)
  740. else:
  741. result3 = {}
  742. result3["reverse"] = str(result2)
  743. result3["rgde"] = rgde
  744. result3["jxde"] = jxde
  745. result3["clde"] = clde
  746. result3["actual_zhuanye"] = actual_zhuanye
  747. if bz_selected != None:
  748. result3["bz_selected"] = json.loads(bz_selected)
  749. else:
  750. result3["bz_selected"] = {"BZBH": {}}
  751. if bz_selected2 != None:
  752. result3["bz_selected2"] = json.loads(bz_selected2)
  753. else:
  754. result3["bz_selected2"] = {"BZBH": {}}
  755. ####14-227+[14-228]*-2
  756. ####3-409*2
  757. ##print(r_debh)
  758. if "[" in r_debh:
  759. position3 = r_debh.find("*")
  760. coef = 1
  761. if position3 == -1:
  762. pass
  763. else:
  764. coef = r_debh[1 + position3:]
  765. ##print(coef)
  766. tail = 0
  767. for i in range(0, len(coef) + 1):
  768. if i == len(coef):
  769. tail = i
  770. break
  771. if (coef[i] > '9' or coef[i] < '0') and coef[i] != '-' and coef[i] != '.':
  772. tail = i
  773. break
  774. if tail == 0:
  775. ##print("1113111")
  776. result3["reverse"] = 'None'
  777. return json.dumps(service.chaifen(result3, actual_zhuanye), ensure_ascii=False)
  778. coef = float(coef[0:tail])
  779. position1 = r_debh.find("[")
  780. position2 = r_debh.find("]")
  781. if position2 == -1:
  782. ##print("1121111")
  783. result3["reverse"] = 'None'
  784. return json.dumps(service.chaifen(result3, actual_zhuanye), ensure_ascii=False)
  785. if r_debh[position1-1] == "+":
  786. pass
  787. elif r_debh[position1-1] == "-":
  788. coef = -coef
  789. else:
  790. ##print("111111")
  791. result3["reverse"] = 'None'
  792. return json.dumps(service.chaifen(result3, actual_zhuanye), ensure_ascii=False)
  793. debh = r_debh[position1+1: position2]
  794. if result3['GLDE']: ##csv文件里的字段,表示这个定额有没有配套的增减定额
  795. hit = False
  796. for key, value in result3['GLDE'].items():
  797. if debh in value:
  798. hit = True
  799. if not hit:
  800. result3["reverse"] = 'None'
  801. return json.dumps(service.chaifen(result3, actual_zhuanye), ensure_ascii=False)
  802. else:
  803. result3["reverse"] = 'None'
  804. return json.dumps(service.chaifen(result3, actual_zhuanye), ensure_ascii=False)
  805. result1_, result2_, rgde_, jxde_, clde_, bz_selected_, bz_selected2_, actual_zhuanye_ = await db.getSingleDeXilie(model, dingeclient, zhuanye, debh, mc)
  806. if result1_:
  807. rgde=util.mergerg(rgde, rgde_, coef)
  808. jxde=util.mergejx(jxde, jxde_, coef)
  809. clde=util.mergecl(clde, clde_, coef)
  810. result3["rgde"] = rgde
  811. result3["jxde"] = jxde
  812. result3["clde"] = clde
  813. item_ = None
  814. for item in result3['DW'].keys():
  815. item_ = item
  816. result3['DEBH'] = {item_: util.cleanBM(r_debh)}
  817. else:
  818. result3["reverse"] = 'None'
  819. elif "*" in r_debh:##1-234*1.2
  820. position3 = r_debh.find("*")
  821. coef = 1
  822. coef = r_debh[1 + position3:]
  823. ##print(coef)
  824. tail = 0
  825. for i in range(0, len(coef) + 1):
  826. if i == len(coef):
  827. tail = i
  828. break
  829. if (coef[i] > '9' or coef[i] < '0') and coef[i] != '-' and coef[i] != '.':
  830. tail = i
  831. break
  832. if tail == 0:
  833. ##print("1113111")
  834. result3["reverse"] = 'None'
  835. return json.dumps(service.chaifen(result3, actual_zhuanye), ensure_ascii=False)
  836. coef = float(coef[0:tail])
  837. util.multirg(result3["rgde"], coef)
  838. util.multijx(result3["jxde"], coef)
  839. util.multicl(result3["clde"], coef)
  840. item_ = None
  841. for item in result3['DW'].keys():
  842. item_ = item
  843. result3['DEBH'] = {item_: (r_debh)}
  844. ##print(result3)
  845. return json.dumps(service.chaifen(result3, actual_zhuanye), ensure_ascii=False)
  846. @app.post("/save/")
  847. async def save(r: Info, user=Depends(manager)):
  848. data = json.loads(r.name)
  849. ##print(data)
  850. return await db.save(client, data)
  851. @app.post("/statistics/")
  852. async def statistics(r: Info, user=Depends(manager)):
  853. ##print(data)
  854. return await db.statistics(client, r.name, user)
  855. @app.post("/zujia/")
  856. async def zujia(r: Info, user=Depends(manager)):
  857. ##print(data)
  858. return await db.zujia(client, r.name, user)
  859. @app.post("/tuijian/")
  860. async def tuijian(r: Info, user=Depends(manager)):
  861. ##print(data)
  862. return await db.tuijian(chroma_client, r.name)
  863. @app.post("/frequency/")
  864. async def frequency(r: InfoWithID, user=Depends(manager)):
  865. ##print(data)
  866. return await db.frequency(client, r.name, r.id, user)
  867. @app.post("/savedjcs/")
  868. async def savedjcs(r: Info, user=Depends(manager)):
  869. data = json.loads(r.name)
  870. ##print(data)
  871. return await db.savedjcs(client, data)
  872. @app.post("/applyFL/")
  873. async def applyFL(r: InfoWithID, user=Depends(manager)):
  874. data = json.loads(r.name)
  875. ##print(data)
  876. return await db.applyFL(client, r.id, data, user)
  877. @app.post("/xxj/")
  878. async def xxj(r: Xxj, user=Depends(manager)):
  879. return service.xxj(r.city, r.month)
  880. @app.post("/jgfb/")
  881. async def jgfb(r: Lsj, user=Depends(manager)):
  882. if r.bianma.startswith('D'):
  883. embedding = model.encode([r.mingcheng])
  884. return await db.jgfb(chroma_client, r.bianma, r.mingcheng, r.danwei, embedding)
  885. return service.jgfb(r.bianma, r.mingcheng, r.danwei)
  886. @app.post("/lsj/")
  887. async def lsj(r: Lsj, user=Depends(manager)):
  888. if r.bianma.startswith('D'):
  889. embedding = model.encode([r.mingcheng])
  890. return await db.lsj(chroma_client, r.bianma, r.mingcheng, r.danwei, embedding)
  891. return service.lsj(r.bianma, r.mingcheng, r.danwei)
  892. @app.post("/rgtz/")
  893. async def rgtz(r: Rgtz, user=Depends(manager)):
  894. glf = r.glf
  895. lr = r.lr
  896. if r.glf == '':
  897. glf = '0'
  898. if r.lr == "":
  899. lr = '0'
  900. ##return []
  901. yi = r.yi
  902. er = r.er
  903. san = r.san
  904. return await db.rgtz(client, r.biao_id, r.bh, yi, er, san, glf, lr, r.bz)
  905. @app.post("/zcfx/")
  906. async def zcfx(r: Zcfx, user=Depends(manager)):
  907. return await db.zcfx(client, r.biao_id, r.bh)
  908. @app.post("/zcfx2/")
  909. async def zcfx2(r: Zcfx2, user=Depends(manager)):
  910. return await db.zcfx2(client, r.biao_id, r.bh, r.prefix)
  911. @app.post("/jxtz/")
  912. async def jxtz(r: Jxtz, user=Depends(manager)):
  913. glf = r.glf
  914. lr = r.lr
  915. if r.glf == '':
  916. glf = '0'
  917. if r.lr == "":
  918. lr = '0'
  919. return await db.jxtz(client, r.biao_id, r.bh, r.gong, r.chaiyou, r.qiyou, r.dian, glf, lr, r.bz)
  920. @app.post("/tiaojia/")
  921. async def tiaojia(r: Tiaojia, user=Depends(manager)):
  922. ##return []
  923. glf = r.glf
  924. lr = r.lr
  925. if r.glf == '':
  926. glf = '0'
  927. if r.lr == "":
  928. lr = '0'
  929. return await db.tiaojia(client, r.biao_id, r.bh, r.bm, r.mingcheng, r.danwei, r.jiage, glf, lr, r.bz)
  930. @app.post("/searchde/")
  931. async def searchde(r: SearchDe):
  932. ##return []
  933. return await db.searchde(dingeclient, r.zhuanye, r.text)
  934. @app.post("/updatezjcs/")
  935. async def updatezjcs(r: UpdateZjcs, user=Depends(manager)):
  936. ##return []
  937. return await db.updatezjcs(client, r.biao_id, r.bh, r.mc, r.fl)
  938. @app.post("/upload/")
  939. async def upload(file: Annotated[UploadFile, File()], token: Annotated[str, Form()]):
  940. user = await manager.get_current_user(token)
  941. print(user)
  942. if file.filename.endswith('13jz') or file.filename.endswith("13jt"):
  943. content = await file.read()
  944. string = content.decode('utf-8')
  945. await resolve(string, user)
  946. return [file.filename]
  947. elif file.filename.endswith("jszf") or file.filename.endswith("JSZF") or file.filename.endswith('jscf') or file.filename.endswith('JSCF'):
  948. content = await file.read()
  949. string = content.decode('utf-8')
  950. root = ET.fromstring(string)
  951. for child in root:
  952. ##print(child)
  953. if child.tag == "ZBFileContent" or child.tag == 'DYFileContent':
  954. base64_bytes = child.text.encode("ascii")
  955. sample_string_bytes = base64.b64decode(base64_bytes)
  956. tmp = str(uuid.uuid4())
  957. os.mkdir(os.path.join("tmp", tmp))
  958. with open(tmp, "wb") as file_:
  959. file_.write(sample_string_bytes)
  960. with zipfile.ZipFile(tmp, 'r') as zip_ref:
  961. zip_ref.extractall(os.path.join("tmp", tmp))
  962. dir_list = os.listdir(os.path.join("tmp", tmp))
  963. ##print(dir_list)
  964. for entry in dir_list:
  965. if entry.endswith("13jz"):
  966. with open(os.path.join("tmp", tmp, entry), 'r') as f:
  967. await resolve(f.read(), user)
  968. return [file.filename]
  969. else:
  970. return [file.filename]
  971. @app.get("/download/{item_id}")
  972. async def download_file(item_id, user=Depends(manager)):
  973. print(user)
  974. tmp = str(uuid.uuid4())
  975. file_path = "export/contacts.xml.b"
  976. # Create the root element
  977. root = ET.Element("JingJiBiao")
  978. # Create a sub-element
  979. ##TouBiaoXx = ET.SubElement(root, "TouBiaoXx")
  980. await db.build(client, root, item_id)
  981. # Create the tree and write to a file
  982. tree = ET.ElementTree(root)
  983. tree.write("export/contacts.xml"+tmp, encoding="utf-8")
  984. dom = MD.parse("export/contacts.xml"+tmp)
  985. with open("export/contacts.xml.b" + tmp, 'w') as f:
  986. f.write("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n")
  987. content = (dom.toprettyxml(indent=" "))
  988. content_ = content.split("\n")
  989. f.write("\n".join(content_[1:]))
  990. return FileResponse(file_path+tmp, media_type='application/octet-stream', filename="contacts.xml")
  991. async def resolve(data, user):
  992. await db.resolve(data, user, client)##manager.send_personal_message(f"You wrote: {data}", websocket)
  993. ##@app.websocket("/ws")
  994. ##async def websocket_endpoint(websocket: WebSocket):
  995. ## await manager.connect(websocket)
  996. ## try:
  997. ## while True:
  998. ## data = await websocket.receive_text()
  999. ## await resolve(websocket, data)
  1000. ## ##await manager.broadcast(f"Client #{client_id} says: {data}")
  1001. ## except WebSocketDisconnect:
  1002. ## manager.disconnect(websocket)
  1003. ## ##await manager.broadcast(f"Client left the chat")
  1004. ## {'access_token': '96__yNpsN6UIOtAgfNOmu34wdt4BBnN9vZLbzCq94NCQnKoDNu7H217eM7ZMS-KZDcV9CyfpLmY80829lbJ20EFasEtBbqetdazuTYHn_8IZ34', 'expires_in': 7200, 'refresh_token': '96_JMFvhYr0scOw9pWs_ygdwYZbku9FwSbO-hcI0OVchVHoqUsXeZtZpQKCJOiq4y-LwIacvlC9huClMLTqE0CUcwugvyOV_pnr2rBYw3aTRWg', 'openid': 'oEcfS62dGXuzzAADYPzjr6OXYdJk', 'scope': 'snsapi_login', 'unionid': 'o1X7S67iVGRVbqvrjr1_UzBE4xdg'}
  1005. @app.post("/token/")
  1006. async def token(r : Info):
  1007. response = await httpClient.get("https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx74b45ac9983e4b3e&secret=bf6741ce4209a0af45f267be2abf560b&code="+ r.name + "&grant_type=authorization_code")
  1008. info = (response.json())
  1009. response = await httpClient.get("https://api.weixin.qq.com/sns/userinfo?access_token=" + info['access_token'] + "&openid="+ info['openid'])
  1010. info = (response.json())
  1011. token = manager.create_access_token(data=dict(sub=info['openid']), expires=timedelta(hours=12))
  1012. return {'token' : token, 'token_type' : 'bearer', "nickname": info['nickname'], "img" : info['headimgurl'], "openid" : info["openid"]}