baoyubo 5 месяцев назад
Родитель
Сommit
f847c2dbed

+ 41 - 0
common/barcode.py

@@ -0,0 +1,41 @@
+import barcode
+from barcode.writer import ImageWriter
+import traceback
+import qrcode
+
+# 更多了解:https://pypi.org/project/python-barcode/0.8.1/
+# pip install python-barcode
+
+# 查看 python-barcode 支持的条形码格式
+# print(f"python-barcode支持的条形码格式:\n{barcode.PROVIDED_BARCODES}")
+
+# 创建条形码格式对象,参数为支持的格式
+
+def create_bar(message,filename):
+    try:
+        EAN = barcode.get_barcode_class('code39')
+
+        # 创建条形码对象
+        ean = EAN(message, writer=ImageWriter())
+        ean.save(f"/data/upload/mergefile/uploads/{filename}")
+        return True
+    except Exception as e:
+        traceback.print_exc()
+        return False
+
+
+def create_qr(message,filename):
+    try:
+        qr = qrcode.QRCode(version=1, error_correction=qrcode.ERROR_CORRECT_M, box_size=10, border=5)
+
+        qr.add_data(message)
+
+        qr.make(fit=True)
+
+        img = qr.make_image(fill_color='black', back_color='white')
+        # img.show()
+        img.save(f"/data/upload/mergefile/uploads/{filename}")
+        return True
+    except Exception as e:
+        traceback.print_exc()
+        return False

+ 18 - 1
models/resource_provision_base.py

@@ -447,4 +447,21 @@ class ResourceProvisionFile(Base):
     del_flag = Column(String(1), default='0', comment='删除标志(0代表存在 2代表删除)') #更新预案信息的时候 先将原有的进行备注删除
 
     class Config:
-        orm_mode = True
+        orm_mode = True
+
+
+class ResourceProvisionMaterialBarcode(Base):
+    __tablename__ = 'resource_provision_material_barcode'
+
+    id = Column(String(255), primary_key=True, comment='ID')
+    material_code = Column(String(50), nullable=True, comment='物资编码')
+    barcode = Column(String(255), nullable=True, comment='条形码')
+    qr_code = Column(String(255), nullable=True, comment='二维码')
+    status = Column(String(50), default='1',nullable=True, 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='创建者')
+    del_flag = Column(String(1), default='0', comment='删除标志(0代表存在 2代表删除)')
+    class Config:
+        orm_mode = True

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

@@ -16,7 +16,7 @@ from models import *
 from utils import *
 from utils.spatial import *
 from utils.ry_system_util import *
-from common.websocketManager import *
+from common.barcode import create_bar,create_qr
 import json
 import traceback
 
@@ -38,6 +38,14 @@ 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')
@@ -127,6 +135,16 @@ async def create_pattern(
                 status=status
             )
             db.add(new_file)
+        bar_fileanme = new_guid()+'.png'
+        qr_fileanme = new_guid()+'.png'
+        if create_bar(str(new_material.material_id),bar_fileanme) and create_qr(str(new_material.material_id),qr_fileanme):
+            barcode = ResourceProvisionMaterialBarcode(
+                id=new_guid(),
+                material_code = new_material.material_id,
+                barcode = bar_fileanme,
+                qr_code = qr_fileanme
+            )
+            db.add(barcode)
         db.commit()
         return {"code": 200, "msg": "创建成功", "data": None}
     except Exception as e:
@@ -391,10 +409,84 @@ async def delete_pattern(
         info = material_id_get_material_info(db, id)
         if not info:
             return JSONResponse(status_code=404, content={"code": 404, "msg": "warehouse room not found"})
+        bar_info = material_id_get_material_barcode_info(db,id)
         info.del_flag='2'
+        bar_info.del_flag = '2'
         delete_resource_provision_file(db, 'ResourceProvisionMaterialInfo', 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("/barcode/list")
+async def get_pattern_list(
+    name: str = Query(None, description='名称'),
+    page: int = Query(1, gt=0, description='页码'),
+    pageSize: int = Query(None, gt=0, description='每页条目数量'),
+    db: Session = Depends(get_db)
+):
+    try:
+        material_code_list=None
+        if name:
+            query_1 = db.query(ResourceProvisionMaterialInfo.material_id)
+            query_1 = query_1.filter(ResourceProvisionMaterialInfo.del_flag=='0')
+            query_1 = query_1.filter(ResourceProvisionMaterialInfo.material_name.like(f'%{name}%'))
+            material_code_list =[i.material_id  for i in  query_1.all()]
+        query = db.query(ResourceProvisionMaterialBarcode)
+        query = query.filter_by(del_flag='0')
+        if material_code_list is not None:
+            query = query.filter(ResourceProvisionMaterialBarcode.material_code.in_(material_code_list))
+        total_items = query.count()
+        # 排序
+        if pageSize is None:
+            pageSize=total_items
+        query = query.order_by(ResourceProvisionMaterialBarcode.create_time.desc())
+        # 执行分页查询
+        lists = query.offset((page - 1) * pageSize).limit(pageSize).all()
+        data = []
+        for info in lists:
+            material_info = material_id_get_material_info(db, info.material_code)
+            data.append({"id": info.id,
+                "material_name": material_info.material_name,
+                "material_code": info.material_code,
+                "barcode": info.barcode,
+                "qr_code": info.qr_code,
+                "status": info.status,
+                "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.put('/barcode/changeStatus')
+async def change_barcode_status(
+        db: Session = Depends(get_db),
+        body=Depends(remove_xss_json),
+        user_id=Depends(valid_access_token)
+):
+    try:
+        barcode_id = body['id']
+        status = body['status']
+        info = material_barcode_id_get_material_barcode_info(db, barcode_id)
+        if not info:
+            return JSONResponse(status_code=404, content={"code": 404, "msg": "barcode not found"})
+        info.status= status
+        info.update_by=user_id
+        db.commit()
+        return {
+            "code": 200,
+            "msg": "操作成功"
+        }
+    except Exception as e:
+        # 处理异常
+        traceback.print_exc()
+        raise HTTPException(status_code=500, detail=str(e))