main.py 30 KB

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