浏览代码

梳理问题

Xiaopeng Zhang 5 月之前
父节点
当前提交
5ad6a0c0a9
共有 4 个文件被更改,包括 171 次插入62 次删除
  1. 2 1
      README
  2. 53 43
      specialdetection.py
  3. 103 5
      subdir/db.py
  4. 13 13
      subdir/service.py

+ 2 - 1
README

@@ -39,7 +39,8 @@ JD_PeiBiF 表很有用,它可以用来找一个材料的组成。
 
 有套定额直接在清单下面加材料,这个目前不支持
 然后材料替换,这个不光砂浆混凝土会换,好像有人换其他的,比如换涂料啊什么的,感觉这个换算很通用?换汽车式起重机吨位, 镀锌铁皮换压型钢板 33110701 园林要加主材 600*300*50厚五莲花花岗岩火烧面路平石
-土建 淮补4-1 这个定额没有,土建定额的定额书应该是有问题
+土建 淮补4-1 这个定额没有,土建定额的定额书应该是有问题(2003土建)
+3-9-S4 2021 市政
 安装补充,神奇的编号 110000F,  侧墙轴流风机  910000F 可燃气体探测器 燃气声光报警器 410000F 编号跟册子有关
 土建也能补充,而且跟安装不一样,土建会具体补充某些材料
 

+ 53 - 43
specialdetection.py

@@ -1,13 +1,16 @@
 import pymongo
 import pandas
 import json
+import asyncio
+from subdir import db as dbservice
+from sentence_transformers  import SentenceTransformer
+model = SentenceTransformer("BAAI/bge-small-zh-v1.5")
 from pymongo import MongoClient
 client = MongoClient()
 client2 = MongoClient()
 db = client["baojia"]
 collection = db["qdxm"]
-db2 = client2["dinge"]
-collection2 = db2["de-collection"]
+
 def clean(debh):
     if "附注" in debh:
         position = debh.find("附注")
@@ -21,50 +24,57 @@ def clean(debh):
         position = debh.find("[")
         debh = debh[:position-1]
     return debh
-
-for post in collection.find({"biao_id": '688990c88230558391ff533c', 'Dwgcbh': '004'}):
-    for entry in (post['__children']):
+async def main():
+    for post in collection.find({"biao_id": '688990c88230558391ff533c', 'Dwgcbh': '001'}):
+        for entry in (post['__children']):
         ##print(entry['清单编码'])
-        cleaned = clean(entry['清单编码'])
-        if cleaned.startswith("D"):
-            continue
-        dercj = (entry['dercj'])
-        post2 = collection2.find_one({'zhuanye': '土建', 'DEBH' : cleaned })
-        if post2 == None:
-            if  '-F' in cleaned  :
-                pass
-            else:
-                print("DE not found")
-                print(cleaned)
-                print(post)
-        else:
-            mongo_cl = post2['mongo_cl']
-            mongo_jx = post2['mongo_jx']
-            mongo_rg = post2['mongo_rg']
-            for item in dercj:
-                bm = item[1]
-                if bm == '人材机编码':
-                    continue
-                if "商品砼" in item[2]:
-                    continue
-                hit = False
-                for rg in mongo_rg:
-                    if rg['CLBH'] == bm:
-                        hit = True
-                for cl in mongo_cl:
-                    if cl['CLBH'] == bm:
-                        hit = True
-                for jx in mongo_jx:
-                    if jx['jxbh'] == bm:
-                        hit = True
-                if (not hit) and item[1] != 'S00001' and item[1] != '410000F' and item[1] != 'JD0001' and (not '二类工' in item[2]) and (not '水泥' in item[2]) and item[1] != '01270100' and cleaned !='5-28' and cleaned != '4-3' and (not '砂浆' in item[2]):
+            cleaned = clean(entry['清单编码'])
+            if cleaned.startswith("D"):
+                continue
+            dercj = (entry['dercj'])
+            A1, A2, rg, jx, cl, A6, A7, zhuanye = await dbservice.getSingleDeXilie_(model, client2, 10, cleaned, entry['名称'])
+            if A1 == None:
+                if  '-F' in cleaned  :
+                    pass
+                else:
+                    print("DE not found")
                     print(cleaned)
-                    print("special case found for" + str(item))
-                    
-                    print("来自清单")
-                    print(post['bt'])
                     print(post)
-                    break
+            else:
+                mongo_cl = cl
+                mongo_jx = jx
+                mongo_rg = rg
+                for item in dercj:
+                    bm = item[1]
+                    if bm == '人材机编码':
+                        continue
+                    if "商品砼" in item[2]:
+                        continue
+                    hit = False
+                    for rg in mongo_rg:
+                        if rg['CLBH'] == bm:
+                            hit = True
+                    for cl in mongo_cl:
+                        if cl['CLBH'] == bm:
+                            hit = True
+                    for jx in mongo_jx:
+                        if jx['jxbh'] == bm:
+                            hit = True
+                #and item[1] != '01270100' 
+                #and cleaned !='5-28' 
+                #and cleaned != '4-3' 
+                    if (not hit) and item[1] != 'S00001' and item[1] != '410000F' and item[1] != 'JD0001' and (not '二类工' in item[2]) and (not '水泥' in item[2]) \
+                    and (not '砂浆' in item[2]):
+                        print(cleaned)
+                        print("special case found for" + str(item))
+                    
+                        print("来自清单")
+                        print(post['bt'])
+                        print(post)
+                        break
+
+
+asyncio.run(main())
 
                    
                 

+ 103 - 5
subdir/db.py

@@ -1384,7 +1384,105 @@ async def getJiagongcai(client, id):
     return result
 
 
+async def getSingleDeXilie_(model, client, zhuanye, debh, mc):
+    db = client["dinge"]
+    collection = db["de-collection"]
+    count = 0
+    actual_zhuanye = []
+    mcs = []
+    if "附注" in debh:
+        position = debh.find("附注")
+        debh = debh[:position]
+    if "*" in debh:
+        position = debh.find("*")
+        debh = debh[:position]
+    if debh.endswith("换"):
+        debh = debh[:-1]
+    if "[" in debh:
+        position = debh.find("[")
+        debh = debh[:position-1]
+    for post in collection.find({'DEBH': debh}):
+        ##print(post)
+        actual_zhuanye.append(post['zhuanye'])
+        mcs.append(post['GCLMC'])
+        count = count + 1
+    if count == 0:
+        return  None, None, None, None, None, None, None, zhuanye
+    elif count == 1:
+        if actual_zhuanye[0] == '土建':
+            A1, A2, A3, A4, A5, A6, A7 = service.getSingleDeXilie_tj(debh)
+            return A1, A2, A3, A4, A5, A6, A7, 10
+        elif actual_zhuanye[0] == '市政':
+            A1, A2, A3, A4, A5, A6, A7 = service.getSingleDeXilie_sz(debh)
+            return A1, A2, A3, A4, A5, A6, A7, 20
+        elif actual_zhuanye[0] == '安装':
+            A1, A2, A3, A4, A5, A6, A7 = service.getSingleDeXilie_az(debh)
+            return A1, A2, A3, A4, A5, A6, A7, 30
+        elif actual_zhuanye[0] == '园林':
+            A1, A2, A3, A4, A5, A6, A7 = service.getSingleDeXilie_yl(debh)
+            return A1, A2, A3, A4, A5, A6, A7,  40  
+        elif actual_zhuanye[0] == '修缮工程土建':
+            A1, A2, A3, A4, A5, A6, A7 = service.getSingleDeXilie_xstj(debh)
+            return A1, A2, A3, A4, A5, A6, A7, 50   
+        elif actual_zhuanye[0] == '修缮工程安装':
+            A1, A2, A3, A4, A5, A6, A7 = service.getSingleDeXilie_xsaz(debh)
+            return A1, A2, A3, A4, A5, A6, A7, 60   
+    else:
+        hit = False
+        for i in range(0, count):
+            if mcs[i] == mc:
+                hit = True
+                actual_zhuanye[0] = actual_zhuanye[i]
+        if hit:
+            if actual_zhuanye[0] == '土建':
+                A1, A2, A3, A4, A5, A6, A7 = service.getSingleDeXilie_tj(debh)
+                return A1, A2, A3, A4, A5, A6, A7, 10
+            elif actual_zhuanye[0] == '市政':
+                A1, A2, A3, A4, A5, A6, A7 = service.getSingleDeXilie_sz(debh)
+                return A1, A2, A3, A4, A5, A6, A7, 20
+            elif actual_zhuanye[0] == '安装':
+                A1, A2, A3, A4, A5, A6, A7 = service.getSingleDeXilie_az(debh)
+                return A1, A2, A3, A4, A5, A6, A7, 30
+            elif actual_zhuanye[0] == '园林':
+                A1, A2, A3, A4, A5, A6, A7 = service.getSingleDeXilie_yl(debh)
+                return A1, A2, A3, A4, A5, A6, A7,  40  
+            elif actual_zhuanye[0] == '修缮工程土建':
+                A1, A2, A3, A4, A5, A6, A7 = service.getSingleDeXilie_xstj(debh)
+                return A1, A2, A3, A4, A5, A6, A7, 50   
+            elif actual_zhuanye[0] == '修缮工程安装':
+                A1, A2, A3, A4, A5, A6, A7 = service.getSingleDeXilie_xsaz(debh)
+                return A1, A2, A3, A4, A5, A6, A7, 60   
+        else:
+            mcs.append(mc)
+            embeddings = model.encode(mcs)
+            similarities = model.similarity( embeddings[-1], embeddings)
+            ##array([1.0000002, 0.7662151, 1.0000002], dtype=float32)
+            ##print(similarities)
+            sim = similarities[0].numpy()[:-1]
+            ##print(sim)
+            index = np.argmax(sim).item()
+            ##print(index)
+            ##print(actual_zhuanye)
 
+            actual_zhuanye[0] = actual_zhuanye[index]
+            if actual_zhuanye[0] == '土建':
+                A1, A2, A3, A4, A5, A6, A7 = service.getSingleDeXilie_tj(debh)
+                return A1, A2, A3, A4, A5, A6, A7, 10
+            elif actual_zhuanye[0] == '市政':
+                A1, A2, A3, A4, A5, A6, A7 = service.getSingleDeXilie_sz(debh)
+                return A1, A2, A3, A4, A5, A6, A7, 20
+            elif actual_zhuanye[0] == '安装':
+                A1, A2, A3, A4, A5, A6, A7 = service.getSingleDeXilie_az(debh)
+                return A1, A2, A3, A4, A5, A6, A7, 30
+            elif actual_zhuanye[0] == '园林':
+                A1, A2, A3, A4, A5, A6, A7 = service.getSingleDeXilie_yl(debh)
+                return A1, A2, A3, A4, A5, A6, A7,  40  
+            elif actual_zhuanye[0] == '修缮工程土建':
+                A1, A2, A3, A4, A5, A6, A7 = service.getSingleDeXilie_xstj(debh)
+                return A1, A2, A3, A4, A5, A6, A7, 50   
+            elif actual_zhuanye[0] == '修缮工程安装':
+                A1, A2, A3, A4, A5, A6, A7 = service.getSingleDeXilie_xsaz(debh)
+                return A1, A2, A3, A4, A5, A6, A7, 60   
 
 async def getSingleDeXilie(model, client, zhuanye, debh, mc):
     db = client["dinge"]
@@ -1404,7 +1502,7 @@ async def getSingleDeXilie(model, client, zhuanye, debh, mc):
         position = debh.find("[")
         debh = debh[:position-1]
     async for post in collection.find({'DEBH': debh}):
-        print(post)
+        ##print(post)
         actual_zhuanye.append(post['zhuanye'])
         mcs.append(post['GCLMC'])
         count = count + 1
@@ -1459,12 +1557,12 @@ async def getSingleDeXilie(model, client, zhuanye, debh, mc):
             embeddings = model.encode(mcs)
             similarities = model.similarity( embeddings[-1], embeddings)
             ##array([1.0000002, 0.7662151, 1.0000002], dtype=float32)
-            print(similarities)
+            ##print(similarities)
             sim = similarities[0].numpy()[:-1]
-            print(sim)
+            ##print(sim)
             index = np.argmax(sim).item()
-            print(index)
-            print(actual_zhuanye)
+            ##print(index)
+            ##print(actual_zhuanye)
 
             actual_zhuanye[0] = actual_zhuanye[index]
             if actual_zhuanye[0] == '土建':

+ 13 - 13
subdir/service.py

@@ -1321,7 +1321,7 @@ def getSingleDeXilie_xsaz(debh):
         debh = debh[:position-1]
     gj = pd.read_csv("de/xsaz/JD_DanWeiGJ.csv")
     filtered = gj[gj["DEBH"]==debh]
-    print(filtered)
+    ##print(filtered)
     if len(filtered) > 0:
         index = (filtered.iloc[0]["YSDELBH"])
         shu = pd.read_csv("de/xsaz/JD_DingEShu.csv")
@@ -1333,7 +1333,7 @@ def getSingleDeXilie_xsaz(debh):
             pass
         else:
             beizhus = beizhu.split(";")
-            print(beizhus)
+            ##print(beizhus)
             bzfile = pd.read_csv("de/xsaz/JD_BeiZhuZK.csv")
             bzfile2 = pd.read_csv("de/xsaz/JD_BeiZhuFK.csv", dtype=str)
             bz_selected = bzfile[bzfile["BZBH"].isin(beizhus)] 
@@ -1449,7 +1449,7 @@ def getSingleDeXilie_xstj(debh):
         debh = debh[:position-1]
     gj = pd.read_csv("de/xstj/JD_DanWeiGJ.csv")
     filtered = gj[gj["DEBH"]==debh]
-    print(filtered)
+    ##print(filtered)
     if len(filtered) > 0:
         index = (filtered.iloc[0]["YSDELBH"])
         shu = pd.read_csv("de/xstj/JD_DingEShu.csv")
@@ -1461,7 +1461,7 @@ def getSingleDeXilie_xstj(debh):
             pass
         else:
             beizhus = beizhu.split(";")
-            print(beizhus)
+            ##print(beizhus)
             bzfile = pd.read_csv("de/xstj/JD_BeiZhuZK.csv")
             bzfile2 = pd.read_csv("de/xstj/JD_BeiZhuFK.csv", dtype=str)
             bz_selected = bzfile[bzfile["BZBH"].isin(beizhus)] 
@@ -1574,7 +1574,7 @@ def getSingleDeXilie_yl(debh):
         debh = debh[:position-1]
     gj = pd.read_csv("de/yl/JD_DanWeiGJ.csv")
     filtered = gj[gj["DEBH"]==debh]
-    print(filtered)
+    ##print(filtered)
     if len(filtered) > 0:
         index = (filtered.iloc[0]["YSDELBH"])
         shu = pd.read_csv("de/yl/JD_DingEShu.csv")
@@ -1586,7 +1586,7 @@ def getSingleDeXilie_yl(debh):
             pass
         else:
             beizhus = beizhu.split(";")
-            print(beizhus)
+            ##print(beizhus)
             bzfile = pd.read_csv("de/yl/JD_BeiZhuZK.csv")
             bzfile2 = pd.read_csv("de/yl/JD_BeiZhuFK.csv", dtype=str)
             bz_selected = bzfile[bzfile["BZBH"].isin(beizhus)] 
@@ -1700,7 +1700,7 @@ def getSingleDeXilie_az(debh):
         debh = debh[:position-1]
     gj = pd.read_csv("de/az/JD_DanWeiGJ.csv")
     filtered = gj[gj["DEBH"]==debh]
-    print(filtered)
+    ##print(filtered)
     if len(filtered) > 0:
         index = (filtered.iloc[0]["YSDELBH"])
         shu = pd.read_csv("de/az/JD_DingEShu.csv")
@@ -1712,7 +1712,7 @@ def getSingleDeXilie_az(debh):
             pass
         else:
             beizhus = beizhu.split(";")
-            print(beizhus)
+            ##print(beizhus)
             bzfile = pd.read_csv("de/az/JD_BeiZhuZK.csv")
             bzfile2 = pd.read_csv("de/az/JD_BeiZhuFK.csv", dtype=str)
             bz_selected = bzfile[bzfile["BZBH"].isin(beizhus)] 
@@ -1805,7 +1805,7 @@ def getSingleDeXilie_az(debh):
                 clde_["HJ"] = HJ.item() if type(HJ) == float64 else HJ
                 clde.append(clde_)
     filtered = filtered.drop(['BH1', 'BH2', "GCLCLF", "GCLCLF1", "GCLGG", "GCLGLF", "GCLJJ", "GCLJXF", "GCLLR", "GCLRGF", "GCLRGR", "GCLSJDJ", "GCPBHJ",  "GLFFL", "LRFL", "PBBH", "PBBHM", "PBDJ", "PBSL", "THMC", "THSL", "dejb", "is_lock",  "mcxz", "qfbz",  "sptfl"], axis=1)
-    print(filtered)
+    ##print(filtered)
     return filtered.to_json(force_ascii=False), id, rgde, jxde, clde, bz_selected.to_json(force_ascii=False) if len(bz_selected) > 0 else None, bz_selected2.to_json(force_ascii=False) if len(bz_selected2) > 0 else None
 
 
@@ -1827,7 +1827,7 @@ def getSingleDeXilie_sz(debh):
         debh = debh[:position-1]
     gj = pd.read_csv("de/sz/JD_DanWeiGJ.csv")
     filtered = gj[gj["DEBH"]==debh]
-    print(filtered)
+    ##print(filtered)
     if len(filtered) > 0:
         index = (filtered.iloc[0]["YSDELBH"])
         shu = pd.read_csv("de/sz/JD_DingEShu.csv")
@@ -1839,7 +1839,7 @@ def getSingleDeXilie_sz(debh):
             pass
         else:
             beizhus = beizhu.split(";")
-            print(beizhus)
+            ##print(beizhus)
             bzfile = pd.read_csv("de/sz/JD_BeiZhuZK.csv")
             bzfile2 = pd.read_csv("de/sz/JD_BeiZhuFK.csv", dtype=str)
             bz_selected = bzfile[bzfile["BZBH"].isin(beizhus)] 
@@ -1954,7 +1954,7 @@ def getSingleDeXilie_tj(debh):
         debh = debh[:position-1]
     gj = pd.read_csv("de/tj/JD_DanWeiGJ.csv")
     filtered = gj[gj["DEBH"]==debh]
-    print(filtered)
+    ##print(filtered)
     if len(filtered) > 0:
         index = int(filtered.iloc[0]["YSDELBH"])
         shu = pd.read_csv("de/tj/JD_DingEShu.csv")
@@ -1966,7 +1966,7 @@ def getSingleDeXilie_tj(debh):
             pass
         else:
             beizhus = beizhu.split(";")
-            print(beizhus)
+            ##print(beizhus)
             bzfile = pd.read_csv("de/tj/JD_BeiZhuZK.csv")
             bzfile2 = pd.read_csv("de/tj/JD_BeiZhuFK.csv", dtype=str)
             bz_selected = bzfile[bzfile["BZBH"].isin(beizhus)]