Xiaopeng Zhang 5 месяцев назад
Родитель
Сommit
4e25947e80
3 измененных файлов с 117 добавлено и 30 удалено
  1. 2 0
      README
  2. 65 0
      inmemory.py
  3. 50 30
      main.py

+ 2 - 0
README

@@ -33,3 +33,5 @@ JD_PeiBiF 表很有用,它可以用来找一个材料的组成。
 
 钢筋工程,铁件制作,铁件安装的定额有意思5-28
 安装工程有蛮大的不同
+
+一个清单可以有普通定额跟单项定额,单项定额的特点是不算管理费跟利润

+ 65 - 0
inmemory.py

@@ -0,0 +1,65 @@
+import time
+from asyncio import Lock
+from dataclasses import dataclass
+from typing import Dict, Optional, Tuple
+
+from fastapi_cache.types import Backend
+
+
+@dataclass
+class Value:
+    data: bytes
+    ttl_ts: int
+
+
+class InMemoryBackend(Backend):
+    _store: Dict[str, Value] = {}
+    _lock = Lock()
+
+    @property
+    def _now(self) -> int:
+        return int(time.time())
+
+    def _get(self, key: str) -> Optional[Value]:
+        v = self._store.get(key)
+        if v:
+            if v.ttl_ts < self._now:
+                del self._store[key]
+            else:
+                return v
+        return None
+
+    async def get_with_ttl(self, key: str) -> Tuple[int, Optional[bytes]]:
+        
+       
+        async with self._lock:
+            v = self._get(key)
+            if v:
+                return v.ttl_ts - self._now, v.data
+            return 0, None
+
+    async def get(self, key: str) -> Optional[bytes]:
+        
+        async with self._lock:
+            v = self._get(key)
+            if v:
+                return v.data
+            return None
+
+    async def set(self, key: str, value: bytes, expire: Optional[int] = None) -> None:
+        
+        async with self._lock:
+            self._store[key] = Value(value, self._now + (expire or 0))
+
+    async def clear(self, namespace: Optional[str] = None, key: Optional[str] = None) -> int:
+        count = 0
+        if namespace:
+            keys = list(self._store.keys())
+            for key in keys:
+                if key.startswith(namespace):
+                    del self._store[key]
+                    count += 1
+        elif key:
+            del self._store[key]
+            count += 1
+        return count

+ 50 - 30
main.py

@@ -19,9 +19,13 @@ from fastapi.staticfiles import StaticFiles
 from pymongo import AsyncMongoClient
 client = AsyncMongoClient()
 from fastapi.responses import FileResponse
-
+from fastapi_cache import FastAPICache
+from inmemory import InMemoryBackend
+from fastapi_cache.decorator import cache
+from contextlib import asynccontextmanager
 from fastapi import WebSocket, WebSocketDisconnect
 from fastapi import UploadFile
+from collections.abc import AsyncIterator
 class ConnectionManager:
     """Class defining socket events"""
     def __init__(self):
@@ -42,7 +46,13 @@ class ConnectionManager:
         self.active_connections.remove(websocket)
 
 
-app = FastAPI()
+@asynccontextmanager
+async def lifespan(_: FastAPI) -> AsyncIterator[None]:
+    FastAPICache.init(InMemoryBackend(), prefix="default")
+    yield
+
+
+app = FastAPI(lifespan=lifespan)
 
 
 origins = [
@@ -247,11 +257,15 @@ async def read_rcj(item : Rcj):
         return await db.getDjcsQingdanrcj(client, item.name, item.bh, item.bt, item.bm)
     return await db.getQingdanrcj(client, item.name, item.bh, item.bt, item.bm)
 
-@app.post("/qingdantuijian/")
-async def read_tuijian(item : Rcj):
+
+
+
+@app.get("/qingdantuijian/{bm}")
+@cache(expire=86400)
+async def read_tuijian(bm: str):
     
         
-    return service.getQingdanTuijian(item.bh, item.bt, item.bm)
+    return service.getQingdanTuijian("", "", bm)
 
 
 @app.post("/dingercj/")
@@ -298,10 +312,11 @@ async def delete(r: Info):
     result = await db.delete_files(client, r.name)
     return result
 
-@app.post("/des/")
-async def read_des(r: DingeshuRequest):
-    result = service.getDes(r.value)
-    if r.value == 30:
+@app.get("/des/{value}")
+@cache(expire=86400)
+async def read_des(value: int):
+    result = service.getDes(value)
+    if value == 30:
         result.append({
             "id": "2075",
             "key" : "2075",
@@ -412,20 +427,23 @@ async def read_des(r: DingeshuRequest):
         })
     return result
 
-@app.post("/pbs/")
-async def read_pbs(r: DingeshuRequest):
-    result = service.getPbs(r.value)
+@app.get("/pbs/{value}")
+@cache(expire=86400)
+async def read_pbs(value:int):
+    result = service.getPbs(value)
     #print(result)
     result.insert(0, {"id": "0","key": "0", "label": "全部", "title": "全部"})
     return result
 
-@app.post("/pbxl/")
-async def read_pbxl(r: Info):
-    result = service.getPbxl(r.name)
+@app.get("/pbxl/{name}")
+@cache(expire=86400)
+async def read_pbxl(name: str):
+    result = service.getPbxl(name)
     #print(result)
     return result
 
-@app.post("/cankao/")
+@app.get("/cankao/")
+@cache(expire=86400)
 async def cankao():
     result = service.getCankao()
     #print(result)
@@ -435,30 +453,32 @@ async def cankao():
 async def read_qufei(r: Info):
     return await db.getQufei(client, r.name)
 
-@app.post("/dexilie/")
-async def read_dexilie(r: DingeXilieRequest):
-    if r.value == 30 and int(r.id) > 2074:
-        return service.getDeXilie_azfy(r.value, r.id)
-    result = service.getDeXilie(r.value, r.id)
+@app.get("/dexilie/{value}/{id}")
+@cache(expire=86400)
+async def read_dexilie(value: int, id: str):
+    if value == 30 and int(id) > 2074:
+        return service.getDeXilie_azfy(value, id)
+    result = service.getDeXilie(value, id)
     #print(result)
     return result
 
-@app.post("/singledexilie/")
-async def read_singledexilie(r: SingleDingeXilieRequest):
-    if r.debh.startswith("D") :
+@app.get("/singledexilie/{zhuanye}/{debh}")
+@cache(expire=86400)
+async def read_singledexilie(zhuanye: int, debh: str):
+    if debh.startswith("D") :
         return json.dumps({
             "reverse": "None", 
             "rgde": None,
             "jxde": None,
             "clde": None,
-            "actual_zhuanye": r.zhuanye,
+            "actual_zhuanye": zhuanye,
             "bz_selected": {"BZBH": {}},
             "bz_selected2": {"BZBH": {}}
         }, ensure_ascii=False)
-    if "-F" in r.debh:
-        return service.read_singledexilie_azfy(r.debh)
-    r_debh = r.debh.split("#")[0]
-    result1, result2, rgde, jxde, clde, bz_selected, bz_selected2, actual_zhuanye= service.getSingleDeXilie(r.zhuanye, r_debh)
+    if "-F" in debh:
+        return service.read_singledexilie_azfy(debh)
+    r_debh = debh.split("#")[0]
+    result1, result2, rgde, jxde, clde, bz_selected, bz_selected2, actual_zhuanye= service.getSingleDeXilie(zhuanye, r_debh)
     print("get result ***************************************")
     if result1:
         result3 = json.loads(result1)
@@ -525,7 +545,7 @@ async def read_singledexilie(r: SingleDingeXilieRequest):
         else:
             result3["reverse"] = 'None'
             return json.dumps(result3, ensure_ascii=False)
-        result1_, result2_, rgde_, jxde_, clde_, bz_selected_, bz_selected2_, actual_zhuanye_ = service.getSingleDeXilie(r.zhuanye, debh)
+        result1_, result2_, rgde_, jxde_, clde_, bz_selected_, bz_selected2_, actual_zhuanye_ = service.getSingleDeXilie(zhuanye, debh)
         if result1_:
             util.mergerg(rgde, rgde_, coef)
             util.mergejx(jxde, jxde_, coef)