Browse Source

241223-1代码。

baoyubo 4 tháng trước cách đây
mục cha
commit
94f764c606

+ 2 - 2
models/resource_provision_base.py

@@ -651,14 +651,14 @@ class ResourceProvisionInboundBasic(Base):
     grading_info = Column(String(255), comment='分级信息')
     type = Column(Integer, nullable=False, comment='类型(1 调拨入库、2 归还入库、3 回收入库)')
     supplier_name = Column(String(255), comment='供应商名称')
-    creation_time = Column(DateTime, comment='创建时间')
+    creation_time = Column(DateTime,default=datetime.now, comment='创建时间')
     remark = Column(Text, comment='备注')
     supplier_code = Column(String(255), comment='供应商编号')
     completion_time = Column(DateTime, comment='完成时间')
     planned_completion_time = Column(DateTime, comment='计划完成时间')
     room_id = Column(String(255), comment='库房id')
     inbound_order_number = Column(String(255), comment='入库单号')
-    new_time = Column(DateTime, comment='新增时间')
+    new_time = 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='创建部门')

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

@@ -11,6 +11,8 @@ from . import m_count
 from . import procurement
 from . import dispatch
 from . import warehouse_movement
+from . import warehouse_inbound
+from . import warehouse_outbound
 router = APIRouter()
 
 
@@ -22,3 +24,5 @@ router.include_router(m_count.router, prefix="/count", tags=["物资统计"])
 router.include_router(procurement.router, prefix="/procurement", tags=["物资申报"])
 router.include_router(dispatch.router, prefix="/dispatch", tags=["物资调度"])
 router.include_router(warehouse_movement.router, prefix="/warehouse_movement", tags=["库存明细"])
+router.include_router(warehouse_inbound.router, prefix="/warehouse_inbound", tags=["入库"])
+router.include_router(warehouse_outbound.router, prefix="/warehouse_outbound", tags=["出库"])

+ 228 - 0
routers/api/resourceProvison/MaterialReserveManagement/warehouse_inbound.py

@@ -0,0 +1,228 @@
+#!/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 pandas as pd
+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:
+        new_inbound = ResourceProvisionInboundBasic(
+            # id = new_guid(),
+            warehouse_id=body['warehouse_id'],
+            purchase_order_number=body['purchase_order_number'],
+            is_donation=body['is_donation'],
+            transport_order_number=body['transport_order_number'],
+            donator_phone=body['donator_phone'],
+            donator_name=body['donator_name'],
+            reviewer=body['reviewer'],
+            enterprise_name=body['enterprise_name'],
+            enterprise_code=body['enterprise_code'],
+            grading_info=body['grading_info'],
+            type=body['type'],
+            supplier_name=body['supplier_name'],
+            remark=body['remark'],
+            supplier_code=body['supplier_code'],
+            completion_time=body['completion_time'],
+            planned_completion_time=body['planned_completion_time'],
+            room_id=body['room_id'],
+            # inbound_order_number=body['inbound_order_number'],
+            create_by = user_id
+        )
+        db.add(new_inbound)
+        db.commit()
+        new_inbound.inbound_order_number= f'{time.strftime("%Y%m%d", time.localtime())}1{str(new_inbound.id).zfill(7)}'
+        filePath = f'/data/upload/mergefile/uploads/{body["filename"]}'
+        movementData = pd.read_excel(filePath).to_dict(orient='records')
+        create_movement(db, movementData, new_inbound.inbound_order_number, 'I', user_id)
+        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:
+#         info = warehouse_room_id_get_warehouse_room_info(db,id)
+#         if not info:
+#             return JSONResponse(status_code=404,content={"code":404,"msg":"warehouse room not found"})
+#         info.room_name = body['room_name']
+#         info.warehouse = body['warehouse_id']
+#         info.room_area = body['room_area']
+#         info.available_area = body['available_area']
+#         info.height = body['height']
+#         info.room_volume = body['room_volume']
+#         info.available_volume = body['available_volume']
+#         info.storage_type = body['storage_type']
+#         info.level = body['level']
+#         info.storage_type_code = body['storage_type_code']
+#         info.last_inventory_time = body['last_inventory_time']
+#         info.update_by = user_id
+#         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 = inbound_id_get_inbound_info(db,id)
+        if not info:
+            return JSONResponse(status_code=404,content={"code":404,"msg":"warehouse room not found"})
+        warehouse_info = warehouse_id_get_warehouse_info(db,info.warehouse_id)
+        if  warehouse_info:
+            warehouse_name = warehouse_info.warehouse_name
+        else:
+            warehouse_name = None
+        room_info = warehouse_room_id_get_warehouse_room_info(db,info.room_id)
+        if  room_info:
+            room_name = room_info.room_name
+        else:
+            room_name = None
+        data = {
+                "id":info.id,
+                "warehouse_id": info.warehouse_id,
+                "warehouse_name": warehouse_name,
+                "room_id": info.room_id,
+                "room_name": room_name,
+                "purchase_order_number": info.purchase_order_number,
+                "is_donation": info.is_donation,
+                "transport_order_number": info.transport_order_number,
+                "donator_phone": info.donator_phone,
+                "donator_name": info.donator_name,
+                "reviewer": info.reviewer,
+                "grading_info": info.grading_info,
+                "enterprise_name": info.enterprise_name,
+                "enterprise_code": info.enterprise_code,
+                "type": info.type,
+                "supplier_name": info.supplier_name,
+                "creation_time": info.creation_time,
+                "remark": info.remark,
+                "supplier_code": info.supplier_code,
+                "completion_time": info.completion_time,
+                "inbound_order_number":info.inbound_order_number,
+                "new_time":info.new_time,
+                "create_time":info.create_time}
+        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(
+    # warehouse_id: str = Query(None, description='名称'),
+    page: int = Query(1, gt=0, description='页码'),
+    pageSize: int = Query(100, gt=0, description='每页条目数量'),
+    db: Session = Depends(get_db)
+):
+    try:
+        query = db.query(ResourceProvisionInboundBasic)
+        query = query.filter_by(del_flag='0')
+        # if warehouse_id:
+        #     query = query.filter(ResourceProvisionWarehouseInfo.warehouse_id==warehouse_id)
+        total_items = query.count()
+        # 排序
+        query = query.order_by(ResourceProvisionInboundBasic.create_time.desc())
+        # 执行分页查询
+        lists = query.offset((page - 1) * pageSize).limit(pageSize).all()
+        data = []
+        for info in lists:
+            warehouse_info = warehouse_id_get_warehouse_info(db, info.warehouse_id)
+            if warehouse_info:
+                warehouse_name = warehouse_info.warehouse_name
+            else:
+                warehouse_name = None
+            room_info = warehouse_room_id_get_warehouse_room_info(db, info.room_id)
+            if room_info:
+                room_name = room_info.room_name
+            else:
+                room_name = None
+            data.append({
+                "id":info.id,
+                "warehouse_id": info.warehouse_id,
+                "warehouse_name": warehouse_name,
+                "room_id": info.room_id,
+                "room_name": room_name,
+                "purchase_order_number": info.purchase_order_number,
+                "is_donation": info.is_donation,
+                "transport_order_number": info.transport_order_number,
+                "donator_phone": info.donator_phone,
+                "donator_name": info.donator_name,
+                "reviewer": info.reviewer,
+                "grading_info": info.grading_info,
+                "enterprise_name": info.enterprise_name,
+                "enterprise_code": info.enterprise_code,
+                "type": info.type,
+                "supplier_name": info.supplier_name,
+                "creation_time": info.creation_time,
+                "remark": info.remark,
+                "supplier_code": info.supplier_code,
+                "completion_time": info.completion_time,
+                "inbound_order_number":info.inbound_order_number,
+                "new_time":info.new_time,
+                "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 = warehouse_room_id_get_warehouse_room_info(db, id)
+#         if not info:
+#             return JSONResponse(status_code=404, content={"code": 404, "msg": "warehouse room not found"})
+#         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)}")

+ 211 - 0
routers/api/resourceProvison/MaterialReserveManagement/warehouse_outbound.py

@@ -0,0 +1,211 @@
+#!/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 pandas as pd
+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:
+        new_outbound = ResourceProvisionOutboundBasic(
+            # id = new_guid(),
+            warehouse_id=body['warehouse_id'],
+            total_volume=body['total_volume'],
+            total_weight=body['total_weight'],
+            total_shipping_volume=body['total_shipping_volume'],
+            total_shipping_weight=body['total_shipping_weight'],
+            total_quantity=body['total_quantity'],
+            shipping_time=body['shipping_time'],
+            disaster_type=body['disaster_type'],
+            dispatching_agency=body['dispatching_agency'],
+            shipper_name=body['shipper_name'],
+            shipper_mobile=body['shipper_mobile'],
+            shipper_address=body['shipper_address'],
+            shipper_remark=body['shipper_remark'],
+            receiver_name=body['receiver_name'],
+            receiver_mobile=body['receiver_mobile'],
+            receiver_address=body['receiver_address'],
+            create_by = user_id
+        )
+        db.add(new_outbound)
+        db.commit()
+        new_outbound.outbound_number= f'{time.strftime("%Y%m%d", time.localtime())}0{str(new_outbound.id).zfill(7)}'
+        filePath = f'/data/upload/mergefile/uploads/{body["filename"]}'
+        movementData = pd.read_excel(filePath).to_dict(orient='records')
+        create_movement(db, movementData, new_outbound.inbound_order_number, 'I', user_id)
+        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:
+#         info = warehouse_room_id_get_warehouse_room_info(db,id)
+#         if not info:
+#             return JSONResponse(status_code=404,content={"code":404,"msg":"warehouse room not found"})
+#         info.room_name = body['room_name']
+#         info.warehouse = body['warehouse_id']
+#         info.room_area = body['room_area']
+#         info.available_area = body['available_area']
+#         info.height = body['height']
+#         info.room_volume = body['room_volume']
+#         info.available_volume = body['available_volume']
+#         info.storage_type = body['storage_type']
+#         info.level = body['level']
+#         info.storage_type_code = body['storage_type_code']
+#         info.last_inventory_time = body['last_inventory_time']
+#         info.update_by = user_id
+#         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 = outbound_id_get_outbound_info(db,id)
+        if not info:
+            return JSONResponse(status_code=404,content={"code":404,"msg":"warehouse room not found"})
+        warehouse_info = warehouse_id_get_warehouse_info(db,info.warehouse_id)
+        if  warehouse_info:
+            warehouse_name = warehouse_info.warehouse_name
+        else:
+            warehouse_name = None
+
+        data = {
+                "id":info.id,
+                "warehouse_id": info.warehouse_id,
+                "warehouse_name": warehouse_name,
+                "outbound_number": info.outbound_number,
+                "total_volume": info.total_volume,
+                "total_weight": info.total_weight,
+                "total_shipping_volume": info.total_shipping_volume,
+                "total_shipping_weight": info.total_shipping_weight,
+                "total_quantity": info.total_quantity,
+                "shipping_time": info.shipping_time,
+                "disaster_type": info.disaster_type,
+                "dispatching_agency": info.dispatching_agency,
+                "shipper_name": info.shipper_name,
+                "shipper_mobile": info.shipper_mobile,
+                "shipper_address": info.shipper_address,
+                "shipper_remark": info.shipper_remark,
+                "receiver_name": info.receiver_name,
+                "receiver_mobile": info.receiver_mobile,
+                "receiver_address":info.receiver_address,
+                "create_time":info.create_time}
+        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(
+    # warehouse_id: str = Query(None, description='名称'),
+    page: int = Query(1, gt=0, description='页码'),
+    pageSize: int = Query(100, gt=0, description='每页条目数量'),
+    db: Session = Depends(get_db)
+):
+    try:
+        query = db.query(ResourceProvisionOutboundBasic)
+        query = query.filter_by(del_flag='0')
+        # if warehouse_id:
+        #     query = query.filter(ResourceProvisionWarehouseInfo.warehouse_id==warehouse_id)
+        total_items = query.count()
+        # 排序
+        query = query.order_by(ResourceProvisionOutboundBasic.create_time.desc())
+        # 执行分页查询
+        lists = query.offset((page - 1) * pageSize).limit(pageSize).all()
+        data = []
+        for info in lists:
+            warehouse_info = warehouse_id_get_warehouse_info(db, info.warehouse_id)
+            if warehouse_info:
+                warehouse_name = warehouse_info.warehouse_name
+            else:
+                warehouse_name = None
+            data.append({
+                "id":info.id,
+                "warehouse_id": info.warehouse_id,
+                "warehouse_name": warehouse_name,
+                "outbound_number": info.outbound_number,
+                "total_volume": info.total_volume,
+                "total_weight": info.total_weight,
+                "total_shipping_volume": info.total_shipping_volume,
+                "total_shipping_weight": info.total_shipping_weight,
+                "total_quantity": info.total_quantity,
+                "shipping_time": info.shipping_time,
+                "disaster_type": info.disaster_type,
+                "dispatching_agency": info.dispatching_agency,
+                "shipper_name": info.shipper_name,
+                "shipper_mobile": info.shipper_mobile,
+                "shipper_address": info.shipper_address,
+                "shipper_remark": info.shipper_remark,
+                "receiver_name": info.receiver_name,
+                "receiver_mobile": info.receiver_mobile,
+                "receiver_address":info.receiver_address,
+                "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 = warehouse_room_id_get_warehouse_room_info(db, id)
+#         if not info:
+#             return JSONResponse(status_code=404, content={"code": 404, "msg": "warehouse room not found"})
+#         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)}")

+ 38 - 0
utils/resource_provision_util.py

@@ -222,3 +222,41 @@ def get_dispatch_review_list(db):
     query = db.query(ResourceProvisionDispatchReview)
     query = query.filter_by(del_flag = '0')
     return query.all()
+def inbound_id_get_inbound_info(db,id):
+    query = db.query(ResourceProvisionInboundBasic)
+    query = query.filter_by(id = id,del_flag = '0')
+    return query.first()
+def outbound_id_get_outbound_info(db,id):
+    query = db.query(ResourceProvisionOutboundBasic)
+    query = query.filter_by(id = id,del_flag = '0')
+    return query.first()
+def create_movement(db,movement:list,io_number,io_flag,user_id):
+    for data in movement:
+        material_id= data['物资编码']
+        changed_stock = data['数量']
+        remaining_stock = 0
+        query = db.query(ResourceProvisionWarehouseMovement)
+        query = query.filter_by(del_flag='0')
+        if material_id:
+            query = query.filter(ResourceProvisionWarehouseMovement.material_id==material_id)
+        material_info = query.order_by(ResourceProvisionWarehouseMovement.create_time.desc()).first()
+        if material_info:
+            if io_flag=='I':
+                remaining_stock = material_info.remaining_stock+changed_stock
+            else:
+                if material_info.remaining_stock<changed_stock:
+
+                    return '剩余库存小于出库量'
+                remaining_stock =  material_info.remaining_stock-changed_stock
+
+        new_movement = ResourceProvisionWarehouseMovement(
+            material_id=material_id,#Column(String(255), nullable=False, comment='物资id')
+            io_number = io_number,#Column(String(255), nullable=False, comment='出入库单号')
+            io_flag = io_flag,#Column(String(10), nullable=False, comment='出入库标识')
+            changed_stock = changed_stock,#Column(Integer, nullable=False, comment='变动库存')
+            remaining_stock = remaining_stock,#Column(Integer, nullable=False, comment='剩余库存')
+            create_by=user_id
+        )
+        db.add(new_movement)
+        db.commit()
+    return '成功'