certflow.services.certificate_number_service module

合格证自动编号服务(配置驱动)

后缀判定规则从 config.yaml → numbering.suffix_rules 读取, 可在不修改代码的情况下添加/修改后缀规则。

class certflow.services.certificate_number_service.CertificateNumberService(prefix_override=None)[源代码]

基类:object

合格证自动编号服务(配置驱动)

后缀判定规则按 numbering.suffix_rules 顺序匹配,命中即返回。

编号格式:V{YYMM}{起始序号:03d}{后缀}-{结束序号:03d}{后缀} 单台时: V{YYMM}{序号:03d}{后缀}

参数:

prefix_override (str | None)

classmethod stage_separator()[源代码]

编号阶段分隔符(默认 '---')。

返回类型:

str

classmethod list_separator()[源代码]

清单保存分隔符(默认 '-')。

返回类型:

str

classmethod prefix_source()[源代码]

前缀(编号年月)来源:now / plan_date / shipped_date。

返回类型:

str

classmethod military_prefix()[源代码]

军工三位流水模式前缀(mode:7,无 V+YYMM,如 "JG")。

返回类型:

str

classmethod to_list_format(code)[源代码]

把编号阶段格式(含 '---')转换为清单保存格式('-')。

仅替换首尾范围串中的 stage 分隔符为 list 分隔符,不影响前缀内的 '-' (前缀形如 V2607 不含连字符);多段区间也一并处理。

参数:

code (str)

返回类型:

str

generate_numbers(session, sale_plan_ids)[源代码]

为指定销售计划记录批量生成产品编号

仅对 product_code 为空或以「【空白」开头的记录编号,按 sort_group/sort_order 顺序分配连续流水号,并写入 SalePlan。

参数:
  • session (Session) -- SQLAlchemy 数据库会话对象

  • sale_plan_ids (list[int]) -- 待编号的 SalePlan.id 列表

返回:

成功编号并更新入库的记录数

返回类型:

int

generate_batch(session, sale_plan_id, batch_qty, ym=None, start_override=None)[源代码]

按「本批台数」为单个销售计划生成一批产品编号(批次 0.5 / G4)

合同总数从 SalePlan.quantity 读取,用户只传 batch_qty; 用 shipped_quantity``(已发累计)判定剩余与最后一批,从根上消除 ``(4,1) 类参数歧义(见 OPERATOR_WORKFLOW §11.4.5)。生成的范围串 写入 SalePlan.product_code``(本批区间),并累加 ``shipped_quantity; 发满则标记 shipping_status='已发货'``(与 B0-3 ``record_shipment 一致)。

编号前缀默认取当前月(V+YYMM);传 ym``(如 ``"2604")可生成 **历史年月**批次,流水从该月已用最大流水续号(peek_next_serial)。 ``start_override``(特殊插入)强制起始流水为指定值,并把计数器压到该起点。

参数:
  • session (Session) -- SQLAlchemy 会话

  • sale_plan_id (int) -- 销售计划 ID

  • batch_qty (int) -- 本批发货台数(必须 > 0 且 <= 剩余可发)

  • ym (str | None) -- 目标编号年月(4 位 YYMM,如 2604);None 取当前月

  • start_override (int | None) -- 起始流水手填覆盖(特殊插入);None 表示自动续号

返回:

含 product_code / seq_start / seq_end / prefix / ym /

shipped_quantity / remaining / fully_shipped

返回类型:

dict

抛出:

ValueError -- 计划不存在 / batch_qty 非法 / 超过剩余可发

get_prefix()[源代码]

获取当前编号前缀(V + YYYYMM 或覆盖前缀)

返回:

编号前缀字符串

返回类型:

str

peek_next_serial(session, prefix)[源代码]

只读预瞄某前缀下一个可用流水号(不消耗、不建计数器)。

优先读 AutoNumberCounter``(已分配则 ``current_serial+1); 计数器缺失时回退跨表最大流水 + 1。供 UI 自动续号与「下一号」预览。

参数:
  • session (Session) -- SQLAlchemy 会话

  • prefix (str) -- 编号前缀(如 V2604

返回:

下一可用流水号(从 1 起)

返回类型:

int

static generate_military_numbers(prefix, start_number, quantity, suffix='')[源代码]

军工三位流水模式:前缀 + Format(i, "000") + 后缀

对齐 VBA dd.vb 第468-512行「军工 三位流水无V年月前缀」模式。 不包含 V+年月前缀,完全由用户手动指定。

参数:
  • prefix (str) -- 用户指定的前缀字符串(如 "JG")

  • start_number (int) -- 起始编号

  • quantity (int) -- 打印份数

  • suffix (str) -- 编号后缀

返回:

编号列表,如 ["JG001A", "JG002A", ...]

返回类型:

list[str]

示例

>>> CertificateNumberService.generate_military_numbers("JG", 1, 3, "A")
['JG001A', 'JG002A', 'JG003A']
allocate_report_serials(session, make_date, count)[源代码]

为报告分配按「制作日期」归组的连续流水号(一页一个,返回 count 个)。

复用与合格证产品编号(V+YYMM)同源的 AutoNumberCounter 计数器, rule_code 固定为 report_serial,group_key 为制作日期 YYMMDD; 按日归组、每日从 1 起连续递增,跨页/跨单整体续号,不依赖 JSON 文件或 report_serial_seq 表。

编号渲染交由调用方(如 report_fill_service)拼成 C/1 编号:YYMMDDNNN 形态,本方法只负责分配底层连续流水。

参数:
  • session (Session) -- SQLAlchemy 会话

  • make_date -- 报告制作日期(date 或 ISO 字符串);流水按此日期归组。

  • count (int) -- 需分配的流水号个数(= 报告页数,每页一个编号)。

返回:

长度 = count 的连续流水号(从当前计数器 +1 起);

count<=0 时返回空列表。

返回类型:

list[int]