diff --git a/backend/app/api/qc.py b/backend/app/api/qc.py index 9809225f..6f4fcb0d 100644 --- a/backend/app/api/qc.py +++ b/backend/app/api/qc.py @@ -25,6 +25,7 @@ QC_THIRD_PARTY_FEE_FIELD_NAMES = ("feeAmount", "thirdPartyFeeTotal") from app.core.response import error_response, success_response from app.core.utils import parse_datetime from app.crud import qc_lab_test_item as lab_svc +from app.crud import qc_inspection_item_template as iit_svc from app.crud import qc_item_param as param_svc from app.crud import qc_task_result as result_svc from app.crud import qc_task as task_svc @@ -398,6 +399,31 @@ class LabTestItemUpdateBody(BaseModel): remark: Optional[str] = None +# ---------- 检测项目模版(项目组合) ---------- + + +class InspectionItemTemplateBody(BaseModel): + model_config = ConfigDict(populate_by_name=True) + + template_name: str = Field(..., alias="templateName") + lab_item_ids: List[str] = Field(default_factory=list, alias="labItemIds") + third_party_item_ids: List[str] = Field(default_factory=list, alias="thirdPartyItemIds") + status: Optional[str] = "1" + order_num: Optional[int] = Field(None, alias="orderNum") + remark: Optional[str] = None + + +class InspectionItemTemplateUpdateBody(BaseModel): + model_config = ConfigDict(populate_by_name=True) + + template_name: Optional[str] = Field(None, alias="templateName") + lab_item_ids: Optional[List[str]] = Field(None, alias="labItemIds") + third_party_item_ids: Optional[List[str]] = Field(None, alias="thirdPartyItemIds") + status: Optional[str] = None + order_num: Optional[int] = Field(None, alias="orderNum") + remark: Optional[str] = None + + # ---------- 检测项目参数模板 ---------- @@ -533,6 +559,148 @@ async def delete_qc_lab_test_item( return error_response(400, str(e)) +@router.get("/qc-inspection-item-templates") +async def list_qc_inspection_item_templates( + page: int = Query(1, ge=1), + pageSize: int = Query(10, ge=1, le=100), + keyword: Optional[str] = None, + status: Optional[str] = None, + db: Session = Depends(get_db), + user: dict = Depends(require_menu_code("biz:qcInspectionItemTemplate:list")), +): + try: + tenant_no = _get_tenant_no(db, user) + items, total = iit_svc.list_templates( + db, + page=page, + page_size=pageSize, + keyword=keyword, + status=status, + tenant_no=tenant_no, + user_info=user, + ) + return success_response(_page_payload(items, total, page, pageSize)) + except PermissionError as e: + return error_response(403, str(e)) + except Exception as e: + return error_response(400, str(e)) + + +@router.get("/qc-inspection-item-templates/active") +async def list_qc_inspection_item_templates_active( + db: Session = Depends(get_db), + user: dict = Depends( + require_any_menu_code( + "biz:qcInspectionItemTemplate:list", "biz:qcWorkOrder:list" + ) + ), +): + try: + tenant_no = _get_tenant_no(db, user) + return success_response( + iit_svc.list_active_templates(db, tenant_no, user_info=user) + ) + except PermissionError as e: + return error_response(403, str(e)) + except Exception as e: + return error_response(400, str(e)) + + +@router.get("/qc-inspection-item-templates/{template_id}") +async def get_qc_inspection_item_template( + template_id: str, + db: Session = Depends(get_db), + user: dict = Depends(require_menu_code("biz:qcInspectionItemTemplate:list")), +): + try: + tenant_no = _get_tenant_no(db, user) + obj = iit_svc.get_template(db, template_id, tenant_no=tenant_no) + if not obj: + return error_response(404, "模版不存在") + return success_response(iit_svc._row_to_dict(obj)) + except PermissionError as e: + return error_response(403, str(e)) + except Exception as e: + return error_response(400, str(e)) + + +@router.post("/qc-inspection-item-templates") +async def create_qc_inspection_item_template( + body: InspectionItemTemplateBody, + db: Session = Depends(get_db), + user: dict = Depends(require_menu_code("biz:qcInspectionItemTemplate:add")), +): + try: + tenant_no = _get_tenant_no(db, user) + obj = iit_svc.create_template( + db, + template_name=body.template_name, + lab_item_ids=body.lab_item_ids, + third_party_item_ids=body.third_party_item_ids, + status=body.status or "1", + tenant_no=tenant_no, + order_num=body.order_num, + remark=body.remark, + user_id=_get_current_user_id(user), + create_dept_id=user.get("dept_id", "") or "", + ) + return success_response(iit_svc._row_to_dict(obj), message="创建成功") + except PermissionError as e: + return error_response(403, str(e)) + except ValueError as e: + return error_response(400, str(e)) + except Exception as e: + return error_response(400, str(e)) + + +@router.put("/qc-inspection-item-templates/{template_id}") +async def update_qc_inspection_item_template( + template_id: str, + body: InspectionItemTemplateUpdateBody, + db: Session = Depends(get_db), + user: dict = Depends(require_menu_code("biz:qcInspectionItemTemplate:edit")), +): + try: + tenant_no = _get_tenant_no(db, user) + obj = iit_svc.update_template( + db, + template_id, + template_name=body.template_name, + lab_item_ids=body.lab_item_ids, + third_party_item_ids=body.third_party_item_ids, + status=body.status, + order_num=body.order_num, + remark=body.remark, + user_id=_get_current_user_id(user), + tenant_no=tenant_no, + ) + return success_response(iit_svc._row_to_dict(obj), message="更新成功") + except PermissionError as e: + return error_response(403, str(e)) + except ValueError as e: + return error_response(400, str(e)) + except Exception as e: + return error_response(400, str(e)) + + +@router.delete("/qc-inspection-item-templates/{template_id}") +async def delete_qc_inspection_item_template( + template_id: str, + db: Session = Depends(get_db), + user: dict = Depends(require_menu_code("biz:qcInspectionItemTemplate:remove")), +): + try: + tenant_no = _get_tenant_no(db, user) + iit_svc.soft_delete_template(db, template_id, tenant_no=tenant_no) + return success_response(None, message="删除成功") + except PermissionError as e: + return error_response(403, str(e)) + except ValueError as e: + return error_response(400, str(e)) + except Exception as e: + return error_response(400, str(e)) + + # ---------- 检测项目参数模板 ----------