Jelajahi Sumber

241211-1代码。

baoyubo 6 bulan lalu
induk
melakukan
8751b79ab0

+ 61 - 0
models/resource_provision_base.py

@@ -326,6 +326,7 @@ class ResourceProvisionMaterialType(Base):
     create_dept = Column(BigInteger, default=None, comment='创建部门')
     create_by = Column(BigInteger, default=None, comment='创建者')
     update_by = Column(BigInteger, default=None, comment='更新者')
+    remark = Column(Text, nullable=True, comment='备注')
     def __repr__(self):
         return f"<MaterialType(name='{self.material_category_name}', level='{self.material_category_level}')>"
 
@@ -444,7 +445,9 @@ class ResourceProvisionFile(Base):
     update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment='数据更新时间')
     create_dept = Column(BigInteger, default=None, comment='创建部门')
     create_by = Column(BigInteger, default=None, comment='创建者')
+    update_by = Column(BigInteger, default=None, comment='更新者')
     del_flag = Column(String(1), default='0', comment='删除标志(0代表存在 2代表删除)') #更新预案信息的时候 先将原有的进行备注删除
+    remark = Column(Text, nullable=True, comment='备注')
 
     class Config:
         orm_mode = True
@@ -462,6 +465,64 @@ class ResourceProvisionMaterialBarcode(Base):
     update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment='数据更新时间')
     create_dept = Column(BigInteger, default=None, comment='创建部门')
     create_by = Column(BigInteger, default=None, comment='创建者')
+    update_by = Column(BigInteger, default=None, comment='更新者')
     del_flag = Column(String(1), default='0', comment='删除标志(0代表存在 2代表删除)')
+    remark = Column(Text, nullable=True, comment='备注')
     class Config:
         orm_mode = True
+
+
+class ResourceProvisionProcurementDeclaration(Base):
+    __tablename__ = 'resource_provision_procurement_declaration'
+
+    id = Column(Integer, primary_key=True, comment='ID')
+    declaration_date = Column(DateTime, default=datetime.now, nullable=False, comment='申报日期')
+    declaration_amount = Column(Numeric(15, 2), nullable=False, comment='申报金额(元)')
+    declaration_unit = Column(String(255), nullable=False, comment='申报单位')
+    declaration_person = Column(String(255), nullable=False, comment='申报人')
+    declaration_details = Column(String(255), nullable=False, comment='申报情况')
+    create_time = Column(DateTime, default=datetime.now, comment='数据创建时间')
+    update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment='数据更新时间')
+    create_dept = Column(BigInteger, default=None, comment='创建部门')
+    create_by = Column(BigInteger, default=None, comment='创建者')
+    update_by = Column(BigInteger, default=None, comment='更新者')
+    del_flag = Column(String(1), default='0', comment='删除标志(0代表存在 2代表删除)')
+    remark = Column(Text, nullable=True, comment='备注')
+
+
+class ResourceProvisionProcurementDeclarationDetail(Base):
+    __tablename__ = 'resource_provision_procurement_declaration_detail'
+
+    id = Column(Integer, primary_key=True, comment='ID')
+    serial_number = Column(Integer, nullable=False, comment='序号')
+    declaration_id = Column(Integer, nullable=False, comment='申报基础表id')
+    material_type = Column(String(255), nullable=False, comment='物资类型')
+    material_code = Column(String(255), nullable=False, comment='物资名称')
+    material_quantity = Column(Integer, nullable=False, comment='物资数量(件)')
+    material_unit_price = Column(Numeric(15, 2), nullable=False, comment='物资单价')
+    material_purpose = Column(Text, nullable=False, comment='物资用途')
+    create_time = Column(DateTime, default=datetime.now, comment='数据创建时间')
+    update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment='数据更新时间')
+    create_dept = Column(BigInteger, default=None, comment='创建部门')
+    create_by = Column(BigInteger, default=None, comment='创建者')
+    update_by = Column(BigInteger, default=None, comment='更新者')
+    del_flag = Column(String(1), default='0', comment='删除标志(0代表存在 2代表删除)')
+    remark = Column(Text, nullable=True, comment='备注')
+
+
+class ResourceProvisionProcurementReview(Base):
+    __tablename__ = 'resource_provision_procurement_review'
+
+    id = Column(Integer, primary_key=True, comment='ID')
+    reviewer = Column(String(255), nullable=False, comment='审核人')
+    declaration_id = Column(Integer, nullable=False, comment='申报基础表id')
+    review_result = Column(String(50), nullable=False, comment='审核结果')
+    review_comments = Column(Text, comment='审核意见')
+    review_date = Column(DateTime, default=datetime.now, comment='审核时间')
+    create_time = Column(DateTime, default=datetime.now, comment='数据创建时间')
+    update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment='数据更新时间')
+    create_dept = Column(BigInteger, default=None, comment='创建部门')
+    create_by = Column(BigInteger, default=None, comment='创建者')
+    update_by = Column(BigInteger, default=None, comment='更新者')
+    del_flag = Column(String(1), default='0', comment='删除标志(0代表存在 2代表删除)')
+    remark = Column(Text, nullable=True, comment='备注')

+ 4 - 1
routers/api/pattern/classification.py

@@ -49,7 +49,10 @@ async def create_pattern(
             order_num=body['order_num']
         else:
             info = db.query(func.max(TpPatternClassification.order_num).label('max_value')).filter_by(template_id=body['template_id']).first()
-            order_num=info.max_value+1
+            if info.max_value:
+                order_num=info.max_value+1
+            else:
+                order_num=1
         if 'visible'in body:
             visible=body['visible']
         else:

+ 2 - 0
routers/api/resourceProvison/MaterialReserveManagement/__init__.py

@@ -8,6 +8,7 @@ from . import warehouse
 from . import warehouse_root
 from . import material
 from . import m_count
+from . import procurement
 
 router = APIRouter()
 
@@ -17,3 +18,4 @@ router.include_router(warehouse.router, prefix="/warehouse", tags=["仓库"])
 router.include_router(warehouse_root.router, prefix="/warehouse_root", tags=["仓库库房"])
 router.include_router(material.router, prefix="/material", tags=["物资"])
 router.include_router(m_count.router, prefix="/count", tags=["物资统计"])
+router.include_router(procurement.router, prefix="/procurement", tags=["物资申报"])

+ 1 - 118
routers/api/resourceProvison/MaterialReserveManagement/m_count.py

@@ -16,130 +16,13 @@ from models import *
 from utils import *
 from utils.spatial import *
 from utils.ry_system_util import *
+from utils.resource_provision_util import *
 from common.websocketManager import *
 import json
 import traceback
 
 router = APIRouter()
 
-def count_warehouse(db):
-    query = db.query(ResourceProvisionWarehouseInfo)
-    query = query.filter_by(del_flag = '0')
-    return query.count()
-
-def count_material(db):
-    query = db.query(func.sum(ResourceProvisionMaterialInfo.inventory).label('warehouse_num'))
-    query = query.filter_by(del_flag = '0')
-    result = query.first()
-    warehouse_num = result.warehouse_num if result else 0
-    return warehouse_num
-
-def count_area_material(db):
-    query = db.query(
-        ResourceProvisionWarehouseInfo.area_name.label('name'),
-        func.sum(ResourceProvisionMaterialInfo.inventory).label('value')
-    ).select_from(
-        ResourceProvisionMaterialInfo
-    ).join(
-        ResourceProvisionWarehouseInfo,
-        ResourceProvisionMaterialInfo.warehouse_id == ResourceProvisionWarehouseInfo.warehouse_id
-    ).filter(
-        ResourceProvisionMaterialInfo.del_flag == '0',
-        ResourceProvisionWarehouseInfo.del_flag == '0'
-    ).group_by(
-        ResourceProvisionWarehouseInfo.area_name
-    )
-
-    # 执行查询并获取结果
-    results = query.all()
-    data = {"茂南区":0,"电白区":0,"高州市":0,"化州市":0,"信宜市":0,"高新区":0,"滨海新区":0}
-    # 打印结果
-    for result in results:
-        data[result.name]=result.value
-    return [{"name": key, "value": value} for key, value in data.items()]
-def count_warehouse_material(db):
-    query = db.query(
-        ResourceProvisionWarehouseInfo.warehouse_name.label('name'),
-        func.sum(ResourceProvisionMaterialInfo.inventory).label('value')
-    ).select_from(
-        ResourceProvisionMaterialInfo
-    ).join(
-        ResourceProvisionWarehouseInfo,
-        ResourceProvisionMaterialInfo.warehouse_id == ResourceProvisionWarehouseInfo.warehouse_id
-    ).filter(
-        ResourceProvisionMaterialInfo.del_flag == '0',
-        ResourceProvisionWarehouseInfo.del_flag == '0'
-    ).group_by(
-        ResourceProvisionWarehouseInfo.warehouse_name
-    )
-    # 执行查询并获取结果
-    results = query.all()
-    data = []
-    # 打印结果
-    for result in results:
-        data.append({"name":result.name,"value":result.value})
-    return data
-def count_type_material(db):
-    query = db.query(
-        ResourceProvisionMaterialType.material_category_name.label('name'),
-        func.sum(ResourceProvisionMaterialInfo.inventory).label('value')
-    ).select_from(
-        ResourceProvisionMaterialInfo
-    ).join(
-        ResourceProvisionMaterialType,
-        ResourceProvisionMaterialInfo.material_type == ResourceProvisionMaterialType.id
-    ).filter(
-        ResourceProvisionMaterialInfo.del_flag == '0',
-        ResourceProvisionMaterialType.del_flag == '0'
-    ).group_by(
-        ResourceProvisionMaterialType.material_category_name
-    )
-    # 执行查询并获取结果
-    results = query.all()
-    data = []
-    # 打印结果
-    for result in results:
-        data.append({"name":result.name,"value":result.value})
-    return data
-def count_room_material(db,warehouseId):
-    room_list = db.query(ResourceProvisionWarehouseRoomInfo)\
-        .filter(ResourceProvisionWarehouseRoomInfo.del_flag == '0',
-                ResourceProvisionWarehouseRoomInfo.warehouse == warehouseId).all()
-    data = []
-    for room in room_list:
-        inventory = db.query(func.sum(ResourceProvisionMaterialInfo.inventory).label('value'))\
-            .filter( ResourceProvisionMaterialInfo.del_flag == '0',
-                     ResourceProvisionMaterialInfo.room_id ==room.id).first()
-        value = 0
-        if inventory.value:
-            value = inventory.value
-        data.append({"name":room.room_name,"value":value})
-    # query = db.query(
-    #     ResourceProvisionWarehouseRoomInfo.room_name.label('name'),
-    #     func.coalesce(func.sum(ResourceProvisionMaterialInfo.inventory), 0).label('value')
-    # ).select_from(
-    #     ResourceProvisionWarehouseRoomInfo
-    # ).outerjoin(
-    #     ResourceProvisionMaterialInfo,
-    #     ResourceProvisionMaterialInfo.room_id == ResourceProvisionWarehouseRoomInfo.id
-    # ).filter(
-    #     ResourceProvisionMaterialInfo.del_flag == '0',
-    #     ResourceProvisionWarehouseRoomInfo.del_flag == '0',
-    # ResourceProvisionWarehouseRoomInfo.warehouse == warehouseId
-    # ).group_by(
-    #     ResourceProvisionWarehouseRoomInfo.room_name
-    # )
-
-    # 执行查询并获取结果
-    # print(str(query))
-    # results = query.all()
-
-
-
-    # 打印结果
-    # for result in results:
-    #     data.append({"name":result.name,"value":result.value})
-    return data
 
 @router.get("/data")
 async def get_count_info(

+ 1 - 45
routers/api/resourceProvison/MaterialReserveManagement/material.py

@@ -16,57 +16,13 @@ from models import *
 from utils import *
 from utils.spatial import *
 from utils.ry_system_util import *
+from utils.resource_provision_util import *
 from common.barcode import create_bar,create_qr
 import json
 import traceback
 
 router = APIRouter()
 
-def warehouse_room_id_get_warehouse_room_info(db,id):
-    query = db.query(ResourceProvisionWarehouseRoomInfo)
-    query = query.filter_by(id = id,del_flag = '0')
-    return query.first()
-def warehouse_id_get_warehouse_info(db,id):
-    query = db.query(ResourceProvisionWarehouseInfo)
-    query = query.filter_by(warehouse_id = id,del_flag = '0')
-    return query.first()
-def type_id_get_material_type_info(db,id):
-    query = db.query(ResourceProvisionMaterialType)
-    query = query.filter_by(id = id,del_flag = '0')
-    return query.first()
-def material_id_get_material_info(db,id):
-    query = db.query(ResourceProvisionMaterialInfo)
-    query = query.filter_by(material_id = id,del_flag = '0')
-    return query.first()
-def material_id_get_material_barcode_info(db,id):
-    query = db.query(ResourceProvisionMaterialBarcode)
-    query = query.filter_by(material_code = id,del_flag = '0')
-    return query.first()
-def material_barcode_id_get_material_barcode_info(db,id):
-    query = db.query(ResourceProvisionMaterialBarcode)
-    query = query.filter_by(id = id,del_flag = '0')
-    return query.first()
-def delete_resource_provision_file(db,from_scenario,foreign_key):
-    file_query = db.query(ResourceProvisionFile)
-    file_query = file_query.filter(ResourceProvisionFile.del_flag != '2')
-    file_query = file_query.filter(ResourceProvisionFile.from_scenario == from_scenario)
-    file_query = file_query.filter(ResourceProvisionFile.foreign_key == foreign_key)
-    files = file_query.all()
-    for file in files:
-        file.del_flag = '2'
-def get_resource_provision_file_query_fun(db,from_scenario,foreign_key):
-    file_query = db.query(ResourceProvisionFile)
-    file_query = file_query.filter(ResourceProvisionFile.del_flag != '2')
-    file_query = file_query.filter(ResourceProvisionFile.from_scenario == from_scenario)
-    file_query = file_query.filter(ResourceProvisionFile.foreign_key == foreign_key)
-    files = file_query.all()
-    result = [{
-        "uid": file.file_id,
-        "status": file.status,
-        "name": file.file_name_desc,
-        "url":  file.file_name  #"/api/file/download/%s" %
-    } for file in files]
-    return result
 
 @router.post("/create")
 async def create_pattern(

+ 1 - 11
routers/api/resourceProvison/MaterialReserveManagement/material_type.py

@@ -16,23 +16,13 @@ from models import *
 from utils import *
 from utils.spatial import *
 from utils.ry_system_util import *
+from utils.resource_provision_util import *
 from common.websocketManager import *
 import json
 import traceback
 
 router = APIRouter()
 
-def type_id_get_material_type_info(db,id):
-    query = db.query(ResourceProvisionMaterialType)
-    query = query.filter_by(id = id,del_flag = '0')
-    return query.first()
-def parent_id_get_type_info(db,parent_id):
-    query = db.query(ResourceProvisionMaterialType)
-    query = query.filter(ResourceProvisionMaterialType.del_flag != '2')
-    query = query.filter(ResourceProvisionMaterialType.parent_id == parent_id)
-    query = query.filter(ResourceProvisionMaterialType.display_status == '1')
-    query = query.order_by(ResourceProvisionMaterialType.sort_order.asc())
-    return query.all()
 
 
 @router.post("/create")

+ 313 - 0
routers/api/resourceProvison/MaterialReserveManagement/procurement.py

@@ -0,0 +1,313 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+from fastapi import APIRouter, Request, Depends, Query, HTTPException, status,WebSocket,WebSocketDisconnect
+from common.security import valid_access_token,valid_websocket_token
+from fastapi.responses import JSONResponse
+from sqlalchemy.orm import Session
+from sqlalchemy.sql import func
+from common.auth_user import *
+from sqlalchemy import  text
+from pydantic import BaseModel
+from common.BigDataCenterAPI import *
+from database import get_db
+from typing import List
+from models import *
+from utils import *
+from utils.spatial import *
+from utils.ry_system_util import *
+from utils.resource_provision_util import *
+from common.websocketManager import *
+import json
+import traceback
+
+router = APIRouter()
+
+
+@router.post("/create")
+async def create_pattern(
+    user_id=Depends(valid_access_token),
+    body = Depends(remove_xss_json),
+    db: Session = Depends(get_db)
+):
+    try:
+        dept_info = user_id_get_user_info(db,user_id)
+        new_declaration = ResourceProvisionMaterialType(
+            id = new_guid(),
+            declaration_amount=body['declaration_amount'],
+            declaration_person=user_id,
+            declaration_unit=dept_info.dept_id,
+            create_by = user_id
+        )
+        db.add(new_declaration)
+        for info in body['detail']:
+            new_detail = ResourceProvisionProcurementDeclarationDetail(
+                id=new_guid(),
+                serial_number=info['serial_number'],
+                declaration_id = new_declaration.id,
+                material_type = info['material_type'],
+                material_code = info['material_code'],
+                material_quantity = info['material_quantity'],
+                material_unit_price = info['material_unit_price'],
+                material_purpose = info['material_purpose'],
+                create_by = user_id
+            )
+            db.add(new_detail)
+        db.commit()
+        return {"code": 200, "msg": "创建成功", "data": None}
+    except Exception as e:
+        traceback.print_exc()
+        raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
+
+
+
+@router.put("/update/{id}")
+async def update_pattern(
+    id :str ,
+    user_id=Depends(valid_access_token),
+    body=Depends(remove_xss_json),
+    db: Session = Depends(get_db)
+):
+    try:
+        update_declaration = declaration_id_get_declaration_info(db,id)
+        if not update_declaration:
+            return JSONResponse(status_code=404,content={"code":404,"msg":"declaration not found"})
+        if str(update_declaration.declaration_person) != str(user_id):
+            return JSONResponse(status_code=404, content={"code": 404, "msg": "declaration not permission"})
+        update_declaration.declaration_amount = body['declaration_amount']
+        update_declaration.update_by = user_id
+
+        detail_list = []
+        for info in body['detail']:
+            if info['id']=='':
+                new_detail = ResourceProvisionProcurementDeclarationDetail(
+                    id=new_guid(),
+                    serial_number=info['serial_number'],
+                    declaration_id=update_declaration.id,
+                    material_type=info['material_type'],
+                    material_code=info['material_code'],
+                    material_quantity=info['material_quantity'],
+                    material_unit_price=info['material_unit_price'],
+                    material_purpose=info['material_purpose'],
+                    create_by=user_id
+                )
+                db.add(new_detail)
+                detail_list.append(new_detail.id)
+            else:
+                detail = detail_id_get_declaration_detail_info(db,info['id'])
+                if detail is None:
+                    new_detail = ResourceProvisionProcurementDeclarationDetail(
+                        id=new_guid(),
+                        serial_number=info['serial_number'],
+                        declaration_id=update_declaration.id,
+                        material_type=info['material_type'],
+                        material_code=info['material_code'],
+                        material_quantity=info['material_quantity'],
+                        material_unit_price=info['material_unit_price'],
+                        material_purpose=info['material_purpose'],
+                        create_by=user_id
+                    )
+                    db.add(new_detail)
+                    detail_list.append(new_detail.id)
+                else:
+                    detail.serial_number = info['serial_number']
+                    detail.material_type = info['material_type']
+                    detail.material_code = info['material_code']
+                    detail.material_quantity = info['material_quantity']
+                    detail.material_unit_price = info['material_unit_price']
+                    detail.material_purpose = info['material_purpose']
+                    detail.update_by = user_id
+                    detail_list.append(info['id'])
+            query = db.query(ResourceProvisionProcurementDeclarationDetail)
+            query = query.filter_by(declaration_id=id, del_flag='0').filter(~ResourceProvisionProcurementDeclarationDetail.id.in_(detail_list))
+            for i in query.all():
+                i.del_flag='2'
+        db.commit()
+        return {"code": 200, "msg": "更新成功"}
+    except Exception as e:
+        traceback.print_exc()
+        raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
+
+@router.get("/info/{id}")
+async def get_pattern_info(
+    id: str,
+    db: Session = Depends(get_db)
+):
+    try:
+
+        info = declaration_id_get_declaration_info(db,id)
+        if not info:
+            return JSONResponse(status_code=404,content={"code":404,"msg":"type not found"})
+        dept_info = dept_id_get_dept_info(db,info.declaration_unit)
+        user_info = user_id_get_user_info(db,info.declaration_person)
+        review_info = declaration_id_get_declaration_review_info(db,id)
+        if review_info is None:
+            declaration_details = info.declaration_details
+        else:
+            declaration_details = review_info.review_result
+        data = {"id": info.id,
+                "declaration_date": info.declaration_date,
+                "declaration_amount": info.declaration_amount,
+                "declaration_unit": info.declaration_unit,
+                "declaration_unit_name": dept_info.dept_name,
+                "declaration_person": info.declaration_person,
+                "declaration_person_name": user_info.user_name,
+                "declaration_details": declaration_details,
+                "create_time": info.create_time}
+        detail=[]
+        for detail_info in declaration_id_get_declaration_detail_list(db,id):
+            material_type_info = type_id_get_material_type_info(db,detail_info.material_type)
+            material_into = material_id_get_material_info(db,detail_info.material_code)
+            detail.append({"id":detail_info.id,
+                    "serial_number":detail_info.serial_number,
+                    "material_type":detail_info.material_type,
+                    "material_category_name":material_type_info.material_category_name,
+                    "material_code":detail_info.material_code,
+                    "material_name":material_into.material_name,
+                    "material_quantity":detail_info.material_quantity,
+                    "material_unit_price":detail_info.material_unit_price,
+                    "material_purpose":detail_info.material_purpose})
+        return {"code": 200, "msg": "获取成功", "data": data}
+    except Exception as e:
+        traceback.print_exc()
+        raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
+
+@router.get("/list")
+async def get_pattern_list(
+    # declaration_details: str = Query(None, description='名称'),
+    page: int = Query(1, gt=0, description='页码'),
+    pageSize: int = Query(None, gt=0, description='每页条目数量'),
+    db: Session = Depends(get_db)
+):
+    try:
+        query = db.query(ResourceProvisionProcurementDeclaration)
+        query = query.filter_by(del_flag='0')
+        # if declaration_details:
+        #     query = query.filter(ResourceProvisionProcurementDeclaration.declaration_details==declaration_details)
+        total_items = query.count()
+        # 排序
+        if pageSize is None:
+            pageSize=total_items
+        query = query.order_by(ResourceProvisionProcurementDeclaration.declaration_date.desc())
+        # 执行分页查询
+        lists = query.offset((page - 1) * pageSize).limit(pageSize).all()
+        data = []
+        for info in lists:
+            dept_info = dept_id_get_dept_info(db, info.declaration_unit)
+            user_info = user_id_get_user_info(db, info.declaration_person)
+            review_info = declaration_id_get_declaration_review_info(db, info.id)
+            if review_info is None:
+                declaration_details = info.declaration_details
+            else:
+                declaration_details = review_info.review_result
+            data = {"id": info.id,
+                    "declaration_date": info.declaration_date,
+                    "declaration_amount": info.declaration_amount,
+                    "declaration_unit": info.declaration_unit,
+                    "declaration_unit_name": dept_info.dept_name,
+                    "declaration_person": info.declaration_person,
+                    "declaration_person_name": user_info.user_name,
+                    "declaration_details": declaration_details,
+                    "create_time": info.create_time}
+
+        return {"code": 200, "msg": "查询成功", "data": data,
+                "total": total_items,
+                "page": page,
+                "pageSize": pageSize,
+                "totalPages": (total_items + pageSize - 1) // pageSize
+                }
+    except Exception as e:
+        traceback.print_exc()
+        raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
+
+# @router.delete("/delete/{id}")
+# async def delete_pattern(
+#     id: str,
+#     db: Session = Depends(get_db)
+# ):
+#     try:
+#         # 检查图案是否存在
+#         info = declaration_id_get_declaration_info(db, id)
+#         if not info:
+#             return JSONResponse(status_code=404, content={"code": 404, "msg": "type not found"})
+#         info.del_flag='2'
+#         review_info = declaration_id_get_declaration_review_info(db, id)
+#         review_info.del_flag ='2'
+#         for detail_info in declaration_id_get_declaration_detail_list(db, id):
+#             detail_info.del_flag='2'
+#         db.commit()
+#         return {"code": 200, "msg": "删除成功"}
+#     except Exception as e:
+#         traceback.print_exc()
+#         raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
+
+
+@router.post("/review")
+async def create_pattern(
+    user_id=Depends(valid_access_token),
+    body = Depends(remove_xss_json),
+    db: Session = Depends(get_db)
+):
+    try:
+        new_review = ResourceProvisionProcurementReview(
+            id=new_guid(),
+            reviewer=user_id,
+            declaration_id=body['declaration_id'],
+            review_result=body['review_result'],
+            review_comments=body['review_comments'],
+            create_by = user_id
+        )
+        db.add(new_review)
+        db.commit()
+        return {"code": 200, "msg": "审核成功", "data": None}
+    except Exception as e:
+        traceback.print_exc()
+        raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
+
+
+@router.get("/review/list")
+async def get_pattern_list(
+    page: int = Query(1, gt=0, description='页码'),
+    pageSize: int = Query(None, gt=0, description='每页条目数量'),
+    db: Session = Depends(get_db)
+):
+    try:
+        review_list = [info.declaration_id for info in get_declaration_review_list(db)]
+        query = db.query(ResourceProvisionProcurementDeclaration)
+        query = query.filter_by(del_flag='0')
+        query = query.filter(~ResourceProvisionProcurementDeclaration.id.in_(review_list))
+        total_items = query.count()
+        # 排序
+        if pageSize is None:
+            pageSize=total_items
+        query = query.order_by(ResourceProvisionProcurementDeclaration.declaration_date.desc())
+        # 执行分页查询
+        lists = query.offset((page - 1) * pageSize).limit(pageSize).all()
+        data = []
+        for info in lists:
+            dept_info = dept_id_get_dept_info(db, info.declaration_unit)
+            user_info = user_id_get_user_info(db, info.declaration_person)
+            # review_info = declaration_id_get_declaration_review_info(db, info.id)
+            # if review_info is None:
+            #     declaration_details = info.declaration_details
+            # else:
+            #     declaration_details = review_info.review_result
+            data = {"id": info.id,
+                    "declaration_date": info.declaration_date,
+                    "declaration_amount": info.declaration_amount,
+                    "declaration_unit": info.declaration_unit,
+                    "declaration_unit_name": dept_info.dept_name,
+                    "declaration_person": info.declaration_person,
+                    "declaration_person_name": user_info.user_name,
+                    "declaration_details": info.declaration_details,
+                    "create_time": info.create_time}
+
+        return {"code": 200, "msg": "查询成功", "data": data,
+                "total": total_items,
+                "page": page,
+                "pageSize": pageSize,
+                "totalPages": (total_items + pageSize - 1) // pageSize
+                }
+    except Exception as e:
+        traceback.print_exc()
+        raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")

+ 1 - 4
routers/api/resourceProvison/MaterialReserveManagement/warehouse.py

@@ -16,16 +16,13 @@ from models import *
 from utils import *
 from utils.spatial import *
 from utils.ry_system_util import *
+from utils.resource_provision_util import *
 from common.websocketManager import *
 import json
 import traceback
 
 router = APIRouter()
 
-def warehouse_id_get_warehouse_info(db,id):
-    query = db.query(ResourceProvisionWarehouseInfo)
-    query = query.filter_by(warehouse_id = id,del_flag = '0')
-    return query.first()
 
 
 

+ 1 - 10
routers/api/resourceProvison/MaterialReserveManagement/warehouse_root.py

@@ -16,22 +16,13 @@ from models import *
 from utils import *
 from utils.spatial import *
 from utils.ry_system_util import *
+from utils.resource_provision_util import *
 from common.websocketManager import *
 import json
 import traceback
 
 router = APIRouter()
 
-def warehouse_room_id_get_warehouse_room_info(db,id):
-    query = db.query(ResourceProvisionWarehouseRoomInfo)
-    query = query.filter_by(id = id,del_flag = '0')
-    return query.first()
-def warehouse_id_get_warehouse_info(db,id):
-    query = db.query(ResourceProvisionWarehouseInfo)
-    query = query.filter_by(warehouse_id = id,del_flag = '0')
-    # query = query.filter(ResourceProvisionWarehouseInfo.warehouse_id== id)
-    # query = query.filter(ResourceProvisionWarehouseInfo.del_flag != '2')
-    return query.first()
 
 
 @router.post("/create")

+ 197 - 0
utils/resource_provision_util.py

@@ -0,0 +1,197 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+from models import *
+def warehouse_room_id_get_warehouse_room_info(db,id):
+    query = db.query(ResourceProvisionWarehouseRoomInfo)
+    query = query.filter_by(id = id,del_flag = '0')
+    return query.first()
+def warehouse_id_get_warehouse_info(db,id):
+    query = db.query(ResourceProvisionWarehouseInfo)
+    query = query.filter_by(warehouse_id = id,del_flag = '0')
+    # query = query.filter(ResourceProvisionWarehouseInfo.warehouse_id== id)
+    # query = query.filter(ResourceProvisionWarehouseInfo.del_flag != '2')
+    return query.first()
+def type_id_get_material_type_info(db,id):
+    query = db.query(ResourceProvisionMaterialType)
+    query = query.filter_by(id = id,del_flag = '0')
+    return query.first()
+def parent_id_get_type_info(db,parent_id):
+    query = db.query(ResourceProvisionMaterialType)
+    query = query.filter(ResourceProvisionMaterialType.del_flag != '2')
+    query = query.filter(ResourceProvisionMaterialType.parent_id == parent_id)
+    query = query.filter(ResourceProvisionMaterialType.display_status == '1')
+    query = query.order_by(ResourceProvisionMaterialType.sort_order.asc())
+    return query.all()
+def count_warehouse(db):
+    query = db.query(ResourceProvisionWarehouseInfo)
+    query = query.filter_by(del_flag = '0')
+    return query.count()
+def count_material(db):
+    query = db.query(func.sum(ResourceProvisionMaterialInfo.inventory).label('warehouse_num'))
+    query = query.filter_by(del_flag = '0')
+    result = query.first()
+    warehouse_num = result.warehouse_num if result else 0
+    return warehouse_num
+
+def count_area_material(db):
+    query = db.query(
+        ResourceProvisionWarehouseInfo.area_name.label('name'),
+        func.sum(ResourceProvisionMaterialInfo.inventory).label('value')
+    ).select_from(
+        ResourceProvisionMaterialInfo
+    ).join(
+        ResourceProvisionWarehouseInfo,
+        ResourceProvisionMaterialInfo.warehouse_id == ResourceProvisionWarehouseInfo.warehouse_id
+    ).filter(
+        ResourceProvisionMaterialInfo.del_flag == '0',
+        ResourceProvisionWarehouseInfo.del_flag == '0'
+    ).group_by(
+        ResourceProvisionWarehouseInfo.area_name
+    )
+
+    # 执行查询并获取结果
+    results = query.all()
+    data = {"茂南区":0,"电白区":0,"高州市":0,"化州市":0,"信宜市":0,"高新区":0,"滨海新区":0}
+    # 打印结果
+    for result in results:
+        data[result.name]=result.value
+    return [{"name": key, "value": value} for key, value in data.items()]
+def count_warehouse_material(db):
+    query = db.query(
+        ResourceProvisionWarehouseInfo.warehouse_name.label('name'),
+        func.sum(ResourceProvisionMaterialInfo.inventory).label('value')
+    ).select_from(
+        ResourceProvisionMaterialInfo
+    ).join(
+        ResourceProvisionWarehouseInfo,
+        ResourceProvisionMaterialInfo.warehouse_id == ResourceProvisionWarehouseInfo.warehouse_id
+    ).filter(
+        ResourceProvisionMaterialInfo.del_flag == '0',
+        ResourceProvisionWarehouseInfo.del_flag == '0'
+    ).group_by(
+        ResourceProvisionWarehouseInfo.warehouse_name
+    )
+    # 执行查询并获取结果
+    results = query.all()
+    data = []
+    # 打印结果
+    for result in results:
+        data.append({"name":result.name,"value":result.value})
+    return data
+def count_type_material(db):
+    query = db.query(
+        ResourceProvisionMaterialType.material_category_name.label('name'),
+        func.sum(ResourceProvisionMaterialInfo.inventory).label('value')
+    ).select_from(
+        ResourceProvisionMaterialInfo
+    ).join(
+        ResourceProvisionMaterialType,
+        ResourceProvisionMaterialInfo.material_type == ResourceProvisionMaterialType.id
+    ).filter(
+        ResourceProvisionMaterialInfo.del_flag == '0',
+        ResourceProvisionMaterialType.del_flag == '0'
+    ).group_by(
+        ResourceProvisionMaterialType.material_category_name
+    )
+    # 执行查询并获取结果
+    results = query.all()
+    data = []
+    # 打印结果
+    for result in results:
+        data.append({"name":result.name,"value":result.value})
+    return data
+def count_room_material(db,warehouseId):
+    room_list = db.query(ResourceProvisionWarehouseRoomInfo)\
+        .filter(ResourceProvisionWarehouseRoomInfo.del_flag == '0',
+                ResourceProvisionWarehouseRoomInfo.warehouse == warehouseId).all()
+    data = []
+    for room in room_list:
+        inventory = db.query(func.sum(ResourceProvisionMaterialInfo.inventory).label('value'))\
+            .filter( ResourceProvisionMaterialInfo.del_flag == '0',
+                     ResourceProvisionMaterialInfo.room_id ==room.id).first()
+        value = 0
+        if inventory.value:
+            value = inventory.value
+        data.append({"name":room.room_name,"value":value})
+    # query = db.query(
+    #     ResourceProvisionWarehouseRoomInfo.room_name.label('name'),
+    #     func.coalesce(func.sum(ResourceProvisionMaterialInfo.inventory), 0).label('value')
+    # ).select_from(
+    #     ResourceProvisionWarehouseRoomInfo
+    # ).outerjoin(
+    #     ResourceProvisionMaterialInfo,
+    #     ResourceProvisionMaterialInfo.room_id == ResourceProvisionWarehouseRoomInfo.id
+    # ).filter(
+    #     ResourceProvisionMaterialInfo.del_flag == '0',
+    #     ResourceProvisionWarehouseRoomInfo.del_flag == '0',
+    # ResourceProvisionWarehouseRoomInfo.warehouse == warehouseId
+    # ).group_by(
+    #     ResourceProvisionWarehouseRoomInfo.room_name
+    # )
+
+    # 执行查询并获取结果
+    # print(str(query))
+    # results = query.all()
+
+
+
+    # 打印结果
+    # for result in results:
+    #     data.append({"name":result.name,"value":result.value})
+    return data
+def material_id_get_material_info(db,id):
+    query = db.query(ResourceProvisionMaterialInfo)
+    query = query.filter_by(material_id = id,del_flag = '0')
+    return query.first()
+def material_id_get_material_barcode_info(db,id):
+    query = db.query(ResourceProvisionMaterialBarcode)
+    query = query.filter_by(material_code = id,del_flag = '0')
+    return query.first()
+def material_barcode_id_get_material_barcode_info(db,id):
+    query = db.query(ResourceProvisionMaterialBarcode)
+    query = query.filter_by(id = id,del_flag = '0')
+    return query.first()
+def delete_resource_provision_file(db,from_scenario,foreign_key):
+    file_query = db.query(ResourceProvisionFile)
+    file_query = file_query.filter(ResourceProvisionFile.del_flag != '2')
+    file_query = file_query.filter(ResourceProvisionFile.from_scenario == from_scenario)
+    file_query = file_query.filter(ResourceProvisionFile.foreign_key == foreign_key)
+    files = file_query.all()
+    for file in files:
+        file.del_flag = '2'
+def get_resource_provision_file_query_fun(db,from_scenario,foreign_key):
+    file_query = db.query(ResourceProvisionFile)
+    file_query = file_query.filter(ResourceProvisionFile.del_flag != '2')
+    file_query = file_query.filter(ResourceProvisionFile.from_scenario == from_scenario)
+    file_query = file_query.filter(ResourceProvisionFile.foreign_key == foreign_key)
+    files = file_query.all()
+    result = [{
+        "uid": file.file_id,
+        "status": file.status,
+        "name": file.file_name_desc,
+        "url":  file.file_name  #"/api/file/download/%s" %
+    } for file in files]
+    return result
+def declaration_id_get_declaration_info(db,id):
+    query = db.query(ResourceProvisionProcurementDeclaration)
+    query = query.filter_by(id = id,del_flag = '0')
+    return query.first()
+def declaration_id_get_declaration_detail_list(db,id):
+    query = db.query(ResourceProvisionProcurementDeclarationDetail)
+    query = query.filter_by(declaration_id = id,del_flag = '0')
+    query = query.order_by(ResourceProvisionProcurementDeclarationDetail.serial_number)
+    return query.all()
+def detail_id_get_declaration_detail_info(db,id):
+    query = db.query(ResourceProvisionProcurementDeclarationDetail)
+    query = query.filter_by(id = id,del_flag = '0')
+    return query.first()
+
+def declaration_id_get_declaration_review_info(db,id):
+    query = db.query(ResourceProvisionProcurementReview)
+    query = query.filter_by(declaration_id = id,del_flag = '0')
+    return query.first()
+def get_declaration_review_list(db):
+    query = db.query(ResourceProvisionProcurementReview)
+    query = query.filter_by(del_flag = '0')
+    return query.all()
+