Przeglądaj źródła

support suanshi

Xiaopeng Zhang 6 miesięcy temu
rodzic
commit
2393ec5af1
7 zmienionych plików z 348 dodań i 17 usunięć
  1. 159 3
      front/src/App2.js
  2. 18 1
      front/src/Qingdan2.js
  3. 22 0
      front/src/Service.js
  4. 75 1
      main.py
  5. 9 0
      subdir/db.py
  6. 12 12
      subdir/service.py
  7. 53 0
      subdir/util.py

+ 159 - 3
front/src/App2.js

@@ -7,6 +7,9 @@ import Paper from '@mui/material/Paper';
 import TextField from '@mui/material/TextField';
 import InputAdornment from '@mui/material/InputAdornment';
 import CancelIcon from '@mui/icons-material/Cancel';
+import Autocomplete from '@mui/material/Autocomplete';
+import { debounce } from '@mui/material/utils';
+import throttle from 'lodash/throttle';
 
 import { HandsonTable } from 'handsontable/base';
 import {HotTable} from "@handsontable/react";
@@ -225,6 +228,7 @@ const MUI_X_PRODUCTS = [
     const [value, setValue] = React.useState('1');
     const [dwgc, setDwgc] = React.useState(null);
     const [zhuanye, setZhuanye] = React.useState(10);
+    const [zhuanye2, setZhuanye2] = React.useState(10);
     const [expandedQd, setExpandedQd] = React.useState(true);
     const [expandedPb, setExpandedPb] = React.useState(false);
     const [expandedDe, setExpandedDe] = React.useState(false);
@@ -238,7 +242,9 @@ const MUI_X_PRODUCTS = [
     const [jxde, setJxde] = React.useState(null);
     const [open, setOpen] = React.useState(false);
     const [dopen, setDopen] = React.useState(false);
-    
+
+    const [dopen2, setDopen2] = React.useState(false);
+
     const [dingeclick, setDingeclick] = React.useState(null);
     const [tihuanClick, setTihuanClick] = React.useState(null);
     const tihuanRowRef = React.useRef(null);
@@ -261,6 +267,13 @@ const MUI_X_PRODUCTS = [
     let location = useParams();
 
 
+    const [acvalue, setAcvalue] = React.useState('');
+    const [acinputvalue, setAcinputvalue] = React.useState('');
+    const [options, setOptions] = React.useState([]);
+    const [suanshiError, setSuanshiError] = React.useState(false);
+    const [helperText, setHelperText] = React.useState('');
+
+    
     const traverse = (shu) => {
        for(let i = 0; i < shu.length; i++) {
           let id = shu[i]["id"];
@@ -278,13 +291,19 @@ const MUI_X_PRODUCTS = [
        traverse(x);
       
     };
-       const handleChangeZhuanye = (event) => {
+    const handleChangeZhuanye = (event) => {
            //console.log(event.target.value);
            Service.generateDingeshu(event.target.value).then(x=>{
                setOutlineDes_(x);
            });
            setZhuanye(event.target.value);
-        };
+    };
+
+    const handleChangeZhuanye2 = (event) => {
+      //console.log(event.target.value);
+      
+      setZhuanye2(event.target.value);
+};
 
     const handleChange = (event, newValue) => {
       setValue(newValue);
@@ -308,6 +327,10 @@ const MUI_X_PRODUCTS = [
       });
     };
 
+    const suanshiCallback = () => {
+      setDopen2(true);
+    };
+
     const loadingCallback_djcs = () => {
       setOpen(true); 
       Service.save_djcs().then(x=>{
@@ -341,6 +364,39 @@ const MUI_X_PRODUCTS = [
     const handleClose = () => {
       setDopen(false);
     };
+
+
+    const handleSuanshi = () => {
+      //console.log(acinputvalue);
+      if (/^[A-Z0-9\.\-\[\]\+\*\(\)盐常镇泰补扬南通苏新市附录]+$/.test(acinputvalue)) {
+        //console.log();
+        
+        Service.generateSingleDingeXilie(zhuanye2, acinputvalue).then(x=>{
+          let res = JSON.parse(x);
+          let id = res['reverse'];
+          if (id && id != "None") {
+            setSuanshiError(false);
+            setHelperText('');
+            setDopen2(false);
+            res["date"] = Date.now().toString();
+            setDingeclick(JSON.stringify(res));
+          } else {
+            setSuanshiError(true);
+            setHelperText('无效输入');
+            console.log("error");
+          }
+
+        });
+      } else {
+        setSuanshiError(true);
+        setHelperText('无效输入');
+        console.log("error");
+      }
+    };
+
+    const handleClose2 = () => {
+      setDopen2(false);
+    };
   
 
     const clickCallback = (qdbm, debh) => {
@@ -840,6 +896,41 @@ const MUI_X_PRODUCTS = [
       }, [zhuanye]
     );
 
+    /**  <MenuItem value={10}>土建</MenuItem>
+                     <MenuItem value={20}>市政</MenuItem>
+                     <MenuItem value={30}>安装</MenuItem>
+                     <MenuItem value={40}>园林</MenuItem>
+                     <MenuItem value={50}>修缮(土建)</MenuItem>
+                     <MenuItem value={60}>修缮(安装)</MenuItem> */
+
+    const throttled = React.useRef(throttle((zhuanye2, newValue) => {
+      if (zhuanye2 == 10) {
+        Service.searchDe('土建', newValue).then(x=>{setOptions(x)});
+      }
+      if (zhuanye2 == 20) {
+        Service.searchDe('市政', newValue).then(x=>{setOptions(x)});
+      }
+      if (zhuanye2 == 30) {
+        Service.searchDe('安装', newValue).then(x=>{setOptions(x)});
+      }
+      if (zhuanye2 == 40) {
+        Service.searchDe('园林', newValue).then(x=>{setOptions(x)});
+      }
+      if (zhuanye2 == 50) {
+        Service.searchDe('修缮(土建)', newValue).then(x=>{setOptions(x)});
+      }
+      if (zhuanye2 == 60) {
+        Service.searchDe('修缮(安装)', newValue).then(x=>{setOptions(x)});
+      }
+
+      
+    }, 1000));
+    React.useEffect(
+      () => {
+        throttled.current(zhuanye2, acinputvalue);
+      }, [acinputvalue]
+    );
+
     return (
 
         <Box sx={{ flexGrow: 1  }}>
@@ -996,6 +1087,7 @@ const MUI_X_PRODUCTS = [
                                 dingeclick={dingeclick}
                                 tihuanCallback={tihuanCallback}
                                 tihuanClick={tihuanClick}
+                                suanshiCallback={suanshiCallback}
                              />                     
                      </TabPanel>
                       )}
@@ -1113,6 +1205,70 @@ const MUI_X_PRODUCTS = [
           
            </DialogContent>
          </Dialog>
+         <Dialog
+           onClose={handleClose2}
+           aria-labelledby="customized-dialog-title"
+           open={dopen2}
+           fullWidth={true}
+           maxWidth="md"
+          >
+            <DialogTitle sx={{ m: 0, p: 2 }} id="customized-dialog-title">
+             定额(算式)
+            </DialogTitle>
+            <IconButton
+             aria-label="close"
+             onClick={handleClose2}
+             sx={(theme) => ({
+               position: 'absolute',
+               right: 8,
+               top: 8,
+               color: theme.palette.grey[500],
+             })}
+            >
+             <CloseIcon />
+            </IconButton>
+            <DialogContent dividers>
+            <Stack direction='row' spacing={2}>
+            <FormControl  size="small">
+                     <InputLabel id="demo-multiple-name-label">专业</InputLabel>
+                     <Select
+                       labelId="demo-multiple-name-label"
+                       id="demo-multiple-name"
+                       value={zhuanye2}
+                       onChange={handleChangeZhuanye2}
+                       label="专业" 
+                     >
+                     <MenuItem value={10}>土建</MenuItem>
+                     <MenuItem value={20}>市政</MenuItem>
+                     <MenuItem value={30}>安装</MenuItem>
+                     <MenuItem value={40}>园林</MenuItem>
+                     <MenuItem value={50}>修缮(土建)</MenuItem>
+                     <MenuItem value={60}>修缮(安装)</MenuItem>
+                     </Select>
+              </FormControl> 
+              <Autocomplete sx={{ width: 300 }} size="small" disableClearable
+                id="free-solo-demo"
+                freeSolo
+                filterOptions={(x) => x}
+                options={options}
+                value={acvalue}
+                inputValue={acinputvalue}
+                onChange={(event, newValue) => {
+                  //setOptions(newValue ? [newValue, ...options] : options);
+                  setAcvalue(newValue);
+                }}
+                getOptionDisabled={()=>true}
+                onInputChange={(event, newInputValue) => {
+                  setAcinputvalue(newInputValue);
+                }}
+                renderInput={(params) => <TextField {...params} error={suanshiError}  helperText={helperText}/>}
+               />
+
+                <Button variant="outlined" size="small" onClick={handleSuanshi}>确定</Button>   
+              </Stack>
+          
+           </DialogContent>
+         </Dialog>
             
         </Box>
     );

+ 18 - 1
front/src/Qingdan2.js

@@ -63,7 +63,7 @@ registerAllModules();
 
 
 
-export default function Qingdan2({name, bh, bt, rgde, jxde, clde, beizhu/*后台传回来的附注信息,要整理后才能成为展示用的行*/ , beizhuFK, clickCallback, loadingCallback, dingeclick, tihuanCallback, tihuanClick}) {
+export default function Qingdan2({name, bh, bt, rgde, jxde, clde, beizhu/*后台传回来的附注信息,要整理后才能成为展示用的行*/ , beizhuFK, clickCallback, loadingCallback, dingeclick, tihuanCallback, tihuanClick, suanshiCallback}) {
      registerRenderer('customStylesRenderer', (hotInstance, TD, row, column, prop, value, ...rest) => {
           let newValue = value; 
           if (( column == 11 || column == 5) && row > 0) {
@@ -608,6 +608,23 @@ export default function Qingdan2({name, bh, bt, rgde, jxde, clde, beizhu/*后台
 
                    <Box>
                    <Stack direction='row' spacing={2}>
+                   <Button variant="outlined" size="small" onClick={() => {
+                      if (selectedRowKeysTable.current.length > 0) {
+                         let getRow = myTable.current.getRows(); //get array of currently selected row components.
+                         let hit = false;
+                         for(let i = 0; i < getRow.length; i++) {
+                              if (getRow[i]._row.data['key'] == selectedRowKeysTable.current[0]) {
+                                   hit = true;
+                              }
+                         }
+                         if (hit) {
+                              suanshiCallback();
+                         }
+                      }
+                 
+                      
+                      }}
+                   >定额(算式)</Button>
                    <Button variant="outlined" size="small" onClick={() => {
                       if (selectedRowKeysTable.current.length > 0) {
                          const [success, data] = danxiangdinge(selectedRowKeysTable.current[0]);

+ 22 - 0
front/src/Service.js

@@ -595,6 +595,28 @@ class Service{
         }
     }
 
+    async searchDe(zhuanye, text) {
+        const response = await fetch(this.ip().concat( ":8000/searchde/"), {
+            method : "POST",
+            headers: {
+                "Content-type": "application/json"
+            },
+            body: JSON.stringify({
+                zhuanye: zhuanye,
+                text: text
+            })
+        });
+        if (!response.ok) {
+            //const error = await response.json();
+            console.error('error');
+        } else {
+            const data = await response.json();
+            return data;
+        }
+    }
+
+   
+
 
     /////////////////////////////////////qingdan//////////////////////////////////////
 

+ 75 - 1
main.py

@@ -11,6 +11,7 @@ from fastapi.middleware.gzip import GZipMiddleware
 from pydantic import BaseModel
 from subdir import service
 from subdir import db
+from subdir import util
 
 import numpy as np
 from fastapi.staticfiles import StaticFiles
@@ -148,6 +149,11 @@ class Tiaojia(BaseModel):
     lr: str
     bz: int
 
+class SearchDe(BaseModel):
+    zhuanye: str
+    text: str
+    
+
 @app.post("/outline")
 async def read_root(info: Info):
     for root, dirs, files in os.walk("./data", topdown=False):
@@ -461,7 +467,69 @@ async def read_singledexilie(r: SingleDingeXilieRequest):
         result3["bz_selected2"] = json.loads(bz_selected2)
     else:
         result3["bz_selected2"] = {"BZBH": {}}
-    print(result3)
+    if "[" in r.debh:
+        position3 = r.debh.find("*")
+        coef = 1
+        if position3 == -1:
+            pass
+        else:
+            coef = r.debh[1 + position3:]
+            print(coef)
+            tail = 0
+            for i in range(0, len(coef) + 1):
+                if i == len(coef):
+                    tail = i
+                    break
+                if coef[i] > '9' or coef[i] < '0':
+                    tail = i
+                    break
+            if tail == 0:
+                print("1113111")
+                result3["reverse"] = 'None'
+                return json.dumps(result3, ensure_ascii=False)
+            coef = int(coef[0:tail])
+
+        position1 = r.debh.find("[")
+        position2 = r.debh.find("]")
+        if position2 == -1:
+            print("1121111")
+            result3["reverse"] = 'None'
+            return json.dumps(result3, ensure_ascii=False)
+        if r.debh[position1-1] == "+":
+            pass
+        elif r.debh[position1-1] == "-":
+            coef = -coef
+        else:
+            print("111111")
+            result3["reverse"] = 'None'
+            return json.dumps(result3, ensure_ascii=False)
+        debh = r.debh[position1+1: position2]
+        if result3['GLDE']:
+            hit = False
+            for key, value in result3['GLDE'].items():
+                if value == debh:
+                    hit = True
+            if not hit:
+                result3["reverse"] = 'None'
+                return json.dumps(result3, ensure_ascii=False)
+        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)
+        if result1_:
+            util.mergerg(rgde, rgde_, coef)
+            util.mergejx(jxde, jxde_, coef)
+            util.mergecl(clde, clde_, coef)
+            result3["rgde"] = rgde
+            result3["jxde"] = jxde
+            result3["clde"] = clde
+            item_ = None
+            for item in result3['DW'].keys():
+                item_ = item
+            result3['DEBH'] = {item_: util.cleanBM(r.debh)}
+        else:
+            result3["reverse"] = 'None'
+        
     return json.dumps(result3, ensure_ascii=False)
 
 
@@ -500,6 +568,12 @@ async def tiaojia(r: Tiaojia):
         lr = '0'
     return await db.tiaojia(client, r.biao_id, r.bh, r.bm, r.mingcheng, r.danwei, r.jiage, glf, lr, r.bz)
 
+@app.post("/searchde/")
+async def searchde(r: SearchDe):
+    ##return []
+    
+    return await db.searchde(client, r.zhuanye, r.text)
+
 
 
 

+ 9 - 0
subdir/db.py

@@ -701,6 +701,15 @@ async def getQufei(client, id):
     document = await collection.find_one({'biao_id': id})
     return document['qufei']
 
+async def searchde(client, zhuanye, text):
+    db = client["dinge"]
+    collection = db["de-collection"]
+    result = []
+    async for post in  collection.find({'$text': {"$search": "\"" + text + "\""}, "zhuanye": zhuanye}):
+        result.append(post["DEBH"] + " " + post['GCLMC'] )
+        if len(result) > 10:
+            break
+    return result
 
 async def save(client, data):
     db = client["baojia"]

+ 12 - 12
subdir/service.py

@@ -1550,9 +1550,9 @@ def getSingleDeXilie_sz(debh):
             rgde_["CLBH"] = CLBH
             rgde_["CLMC"] = CLMC
             rgde_["JLDW"] = JLDW
-            rgde_["YSJG"] = YSJG
-            rgde_["gr"] = gr
-            rgde_["gf"] = gf
+            rgde_["YSJG"] = YSJG.item() if type(YSJG) == float64 else YSJG
+            rgde_["gr"] = gr.item() if type(gr) == float64 else gr
+            rgde_["gf"] = gf.item() if type(gf) == float64 else gf
         rgde.append(rgde_)
     ##print(rgde)
     ####jixie
@@ -1574,9 +1574,9 @@ def getSingleDeXilie_sz(debh):
             jxde_["jxbh"] = jxbh
             jxde_["jxmc"] = jxmc
             jxde_["DW"] = DW
-            jxde_["tbdj"] = tbdj
-            jxde_["sl"] = sl
-            jxde_["hj"] = hj
+            jxde_["tbdj"] = tbdj.item() if type(tbdj) == float64 else tbdj
+            jxde_["sl"] = sl.item() if type(sl) == float64 else sl
+            jxde_["hj"] = hj.item() if type(hj) == float64 else hj
         jxde.append(jxde_)
     ####cailiao
     clde = []
@@ -1597,9 +1597,9 @@ def getSingleDeXilie_sz(debh):
             clde_["CLBH"] = CLBH
             clde_["CLMC"] = CLMC
             clde_["JLDW"] = JLDW
-            clde_["YSJG"] = YSJG
-            clde_["SL"] = SL
-            clde_["HJ"] = HJ
+            clde_["YSJG"] = YSJG.item() if type(YSJG) == float64 else YSJG
+            clde_["SL"] = SL.item() if type(SL) == float64 else SL
+            clde_["HJ"] = HJ.item() if type(HJ) == float64 else HJ
             clde.append(clde_)
         else:
             detail = pd.read_csv("de/sz/JD_PeiBi.csv")
@@ -1612,9 +1612,9 @@ def getSingleDeXilie_sz(debh):
                 clde_["CLBH"] = CLBH
                 clde_["CLMC"] = CLMC
                 clde_["JLDW"] = JLDW
-                clde_["YSJG"] = YSJG
-                clde_["SL"] = SL
-                clde_["HJ"] = HJ
+                clde_["YSJG"] = YSJG.item() if type(YSJG) == float64 else YSJG 
+                clde_["SL"] = SL.item() if type(SL) == float64 else SL
+                clde_["HJ"] = HJ.item() if type(HJ) == float64 else HJ
                 clde.append(clde_)
     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
         

+ 53 - 0
subdir/util.py

@@ -34,6 +34,59 @@ def huizongrcj(data):
                        value[0][14], value[0][15], value[0][9], value[0][12]])
     return result
 
+
+
+def mergerg(rg1, rg2, coef):
+    
+    for entry in rg2:
+        CLBH = entry['CLBH']
+        for toMerge in rg1:
+            if toMerge['CLBH'] == CLBH:
+                toMerge['gr'] = float(toMerge['gr']) + coef * float(entry['gr'])
+                toMerge['gf'] = float(toMerge['gf']) + coef * float(entry['gf'])
+
+
+def mergejx(rg1, rg2, coef):
+    
+    for entry in rg2:
+        jxbh = entry['jxbh']
+        for toMerge in rg1:
+            if toMerge['jxbh'] == jxbh:
+                toMerge['sl'] = float(toMerge['sl']) + coef * float(entry['sl'])
+                toMerge['hj'] = float(toMerge['hj']) + coef * float(entry['hj'])
+
+
+def mergecl(rg1, rg2, coef):
+    
+    for entry in rg2:
+        CLBH = entry['CLBH']
+        for toMerge in rg1:
+            if toMerge['CLBH'] == CLBH:
+                toMerge['SL'] = float(toMerge['SL']) + coef * float(entry['SL'])
+                toMerge['HJ'] = float(toMerge['HJ']) + coef * float(entry['HJ'])
+
+
+
+def cleanBM(raw):
+    if raw.find("]") == -1:
+        return raw
+    if raw.endswith(']'):
+        return raw
+    pos = raw.find("*")
+    tail = 0
+    for i in range(pos + 1, len(raw) + 1):
+        if i == len(raw):
+            tail = i
+            break
+        
+        if raw[i] > '9' or raw[i] < '0':
+            tail = i
+            break
+    return raw[0:tail]
+    
+
+    
+