From 28d799c2e493392f77131dd662a72af187728d5b Mon Sep 17 00:00:00 2001 From: nebula_chen Date: Fri, 3 Apr 2026 20:22:52 +0800 Subject: [PATCH] =?UTF-8?q?refactor(pisadmin)=EF=BC=9A=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=9D=90=E6=96=99=E5=88=B6=E7=A8=8B=E6=9C=80=E4=BD=8E=E4=BB=B7?= =?UTF-8?q?=E4=B8=8E=E6=9D=82=E9=87=87=E6=9D=90=E6=96=99=E8=A1=A8=E7=9A=84?= =?UTF-8?q?=E5=85=B3=E8=81=94=E9=80=BB=E8=BE=91=EF=BC=9B=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=B1=A5=E5=8E=86=E8=A1=A8=E7=9A=84=E5=86=99=E5=85=A5=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E4=B8=8E=E5=89=8D=E7=AB=AF=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apps/pisadmin/miscprocurement/models.py | 10 ----- .../apps/pisadmin/miscprocurement/views.py | 43 ++++++++++--------- .../miscprocurement/rfqmiscellaneous/api.ts | 2 +- .../rfqmiscellaneous/comparePrice.vue | 27 ++++++------ .../miscprocurement/rfqmiscellaneous/crud.tsx | 33 +++++++------- .../rfqmiscellaneous/miscInquiryDetail.vue | 40 ++++++++--------- 6 files changed, 74 insertions(+), 81 deletions(-) diff --git a/backend/apps/pisadmin/miscprocurement/models.py b/backend/apps/pisadmin/miscprocurement/models.py index 9f90360..47264bc 100644 --- a/backend/apps/pisadmin/miscprocurement/models.py +++ b/backend/apps/pisadmin/miscprocurement/models.py @@ -373,16 +373,6 @@ class Inquiry(CoreModel): else None ) submitter_name = (getattr(qm_submit, "supplier_name", None) or "").strip() or "—" - RFQOperationLogs.try_append( - inquiry_no=inq.inquiry_no, - purchase_type=int(inq.purchase_type), - operation_type=6, - operation_user=username, - quotation_no=qn, - per_status=old_status, - cur_status=5, - operation_desc=f"供应商({submitter_name})提交报价,受邀供应商均提交报价,询价单报价结束", - ) try: from apps.pisadmin.basicinfo.views.email_utils import send_quote_ended_notice_to_purchaser diff --git a/backend/apps/pisadmin/miscprocurement/views.py b/backend/apps/pisadmin/miscprocurement/views.py index 0abcc1e..8917c2e 100644 --- a/backend/apps/pisadmin/miscprocurement/views.py +++ b/backend/apps/pisadmin/miscprocurement/views.py @@ -85,11 +85,10 @@ def build_invited_supplier_quotation_rows(inquiry) -> list: rows_out.append( { - "operation_time": op_time or "—", "supplier_full_name": full_name, - "operator": op_user, "quotation_status": _quotation_master_status_label(qm.status), - "operation_desc": "", + "operation_time": op_time or "—", + "operator": op_user, "quotation_no": (qm.quotation_no or "").strip(), } ) @@ -292,6 +291,7 @@ def _sync_misc_low_price_records(inquiry: Inquiry, part_id: str) -> None: from collections import defaultdict spec_weight_candidates: dict[str, list[tuple[Decimal, str]]] = defaultdict(list) spec_unit_candidates: dict[str, list[tuple[Decimal, str]]] = defaultdict(list) + spec_quote_data: dict[str, dict[str, dict]] = {} for m in materials: qn_src = getattr(m, "quotation_no_id", None) or "" @@ -326,25 +326,26 @@ def _sync_misc_low_price_records(inquiry: Inquiry, part_id: str) -> None: except Exception: pass - # 杂采材料信息:单价适用于所有材质分组 - misc_unit_candidates: list[tuple[Decimal, str]] = [] - for mi in MiscProcurementMaterialInfo.objects.filter(status=1).only("price", "factory"): - if mi.price is not None: - try: - up = Decimal(str(mi.price)) - fac = (getattr(mi, "factory", None) or "").strip() or "MISC" - misc_unit_candidates.append((up, fac)) - except Exception: - pass + # 杂采材料信息:按「材质」与报价 material_spec 对齐;不得把其它材质的最低单价并入本组 + misc_by_spec: dict[str, list[tuple[Decimal, str]]] = defaultdict(list) + for mi in MiscProcurementMaterialInfo.objects.filter(status=1).only("price", "factory", "materialtype"): + if mi.price is None: + continue + mat = (getattr(mi, "materialtype", None) or "").strip() + if not mat: + continue + try: + up = Decimal(str(mi.price)) + fac = (getattr(mi, "factory", None) or "").strip() or "MISC" + misc_by_spec[mat].append((up, fac)) + except Exception: + pass qty_dec = _rfq_qty_decimal(inquiry, pid) total_material_low = Decimal("0") all_src_w_list: list[str] = [] all_src_up_list: list[str] = [] - # 收集每个材质规格的报价数据,用于按材质分组判断是否所有报价单相等 - spec_quote_data: dict[str, dict[str, dict]] = {} - # 获取所有材质规格(有重量或单价数据的) all_specs = set(spec_weight_candidates.keys()) | set(spec_unit_candidates.keys()) @@ -352,8 +353,8 @@ def _sync_misc_low_price_records(inquiry: Inquiry, part_id: str) -> None: weight_candidates = spec_weight_candidates.get(spec, []) unit_candidates = spec_unit_candidates.get(spec, []) - # 杂采单价也加入该分组的单价候选 - unit_candidates = unit_candidates + misc_unit_candidates + # 仅与同 material_spec 一致的杂采材质行参与该组最低价 + unit_candidates = unit_candidates + list(misc_by_spec.get(spec, [])) # 按材质分组判断所有报价单是否相等 spec_quote_values = spec_quote_data.get(spec, {}) @@ -404,10 +405,10 @@ def _sync_misc_low_price_records(inquiry: Inquiry, part_id: str) -> None: src_w = earliest_qn src_up = earliest_qn - # 判断是否来自杂采材料信息 + # 判断是否来自杂采材料信息(本材质分组) is_misc_src = False - if min_up is not None and misc_unit_candidates: - for misc_up, misc_fac in misc_unit_candidates: + if min_up is not None and misc_by_spec.get(spec): + for misc_up, misc_fac in misc_by_spec[spec]: if abs(min_up - misc_up) < Decimal("0.0001"): is_misc_src = True break diff --git a/web/src/views/pisadmin/miscprocurement/rfqmiscellaneous/api.ts b/web/src/views/pisadmin/miscprocurement/rfqmiscellaneous/api.ts index d69ecad..a39f5f4 100644 --- a/web/src/views/pisadmin/miscprocurement/rfqmiscellaneous/api.ts +++ b/web/src/views/pisadmin/miscprocurement/rfqmiscellaneous/api.ts @@ -20,7 +20,7 @@ export const SubmitPriceAuditObj = (id: string | number) => request({ url: `${ba /** 询价单操作日志(按主键,返回该单 inquiry_no 下全部记录,时间倒序) */ export const GetOperationLogs = (id: string | number) => request({ url: `${baseUrl}${id}/operation_logs/`, method: 'get' }) -/** 受邀供应商报价单一览(与发布生成的报价主表一致,操作日志嵌套表用) */ +/** 受邀供应商一览(与发布生成的报价主表一致,操作日志嵌套表用) */ export const GetInvitedSupplierQuotations = (id: string | number) => request({ url: `${baseUrl}${id}/invited_supplier_quotations/`, method: 'get' }) /** 查询杂采议价记录(比价议价价格存此表,非报价明细「中标价格」) */ diff --git a/web/src/views/pisadmin/miscprocurement/rfqmiscellaneous/comparePrice.vue b/web/src/views/pisadmin/miscprocurement/rfqmiscellaneous/comparePrice.vue index f68351a..782fa06 100644 --- a/web/src/views/pisadmin/miscprocurement/rfqmiscellaneous/comparePrice.vue +++ b/web/src/views/pisadmin/miscprocurement/rfqmiscellaneous/comparePrice.vue @@ -216,9 +216,7 @@