certflow.services package¶
Subpackages¶
- certflow.services.printer package
- Submodules
- certflow.services.printer.escp_commands module
- certflow.services.printer.lq635kii_printer module
- certflow.services.printer.print_queue module
- certflow.services.printer.print_strategy module
- certflow.services.printer.printer_service module
- certflow.services.printer.template_field_formatter module
- certflow.services.printer.template_manager module
- Module contents
LQ635KIICommandLQ635KIICommand.ESCLQ635KIICommand.LFLQ635KIICommand.FFLQ635KIICommand.CRLQ635KIICommand.BELLQ635KIICommand.BSLQ635KIICommand.CANLQ635KIICommand.DELLQ635KIICommand.INITLQ635KIICommand.HOMELQ635KIICommand.DC1LQ635KIICommand.DC3LQ635KIICommand.LINE_SPACING_1_8LQ635KIICommand.LINE_SPACING_1_6LQ635KIICommand.LINE_SPACING_N_180LQ635KIICommand.LINE_SPACING_N_60LQ635KIICommand.LINE_SPACING_N_360LQ635KIICommand.PAGE_LENGTH_INCHLQ635KIICommand.PAGE_LENGTH_LINESLQ635KIICommand.PAGE_SKIP_PERFLQ635KIICommand.PAGE_SKIP_OFFLQ635KIICommand.LEFT_MARGINLQ635KIICommand.RIGHT_MARGINLQ635KIICommand.ALIGN_LEFTLQ635KIICommand.ALIGN_CENTERLQ635KIICommand.ALIGN_RIGHTLQ635KIICommand.ALIGN_JUSTIFYLQ635KIICommand.HORIZONTAL_TABLQ635KIICommand.SET_HORIZONTAL_TABSLQ635KIICommand.ABSOLUTE_HORIZONTALLQ635KIICommand.RELATIVE_HORIZONTALLQ635KIICommand.VERTICAL_TABLQ635KIICommand.SET_VERTICAL_TABSLQ635KIICommand.ABSOLUTE_VERTICALLQ635KIICommand.RELATIVE_VERTICALLQ635KIICommand.RELATIVE_VERTICAL_MOVELQ635KIICommand.REVERSE_VERTICAL_MOVELQ635KIICommand.DRAFT_QUALITYLQ635KIICommand.LETTER_QUALITYLQ635KIICommand.PITCH_10CPILQ635KIICommand.PITCH_12CPILQ635KIICommand.PITCH_15CPILQ635KIICommand.PROPORTIONAL_ONLQ635KIICommand.PROPORTIONAL_OFFLQ635KIICommand.CHARACTER_SPACELQ635KIICommand.CONDENSED_ONLQ635KIICommand.CONDENSED_OFFLQ635KIICommand.DOUBLE_WIDTH_ONLQ635KIICommand.DOUBLE_WIDTH_OFFLQ635KIICommand.DOUBLE_HEIGHT_ONLQ635KIICommand.DOUBLE_HEIGHT_OFFLQ635KIICommand.FONT_ROMANLQ635KIICommand.FONT_SANS_SERIFLQ635KIICommand.FONT_COURIERLQ635KIICommand.FONT_PRESTIGELQ635KIICommand.FONT_SCRIPTLQ635KIICommand.SUPERSCRIPTLQ635KIICommand.SUBSCRIPTLQ635KIICommand.SUPERSUB_OFFLQ635KIICommand.UNDERLINE_ONLQ635KIICommand.UNDERLINE_OFFLQ635KIICommand.ITALIC_ONLQ635KIICommand.ITALIC_OFFLQ635KIICommand.BOLD_ONLQ635KIICommand.BOLD_OFFLQ635KIICommand.DOUBLE_STRIKE_ONLQ635KIICommand.DOUBLE_STRIKE_OFFLQ635KIICommand.PRINT_MODELQ635KIICommand.GRAPHICS_8PIN_SINGLELQ635KIICommand.GRAPHICS_8PIN_DOUBLELQ635KIICommand.GRAPHICS_8PIN_HS_DOUBLELQ635KIICommand.GRAPHICS_8PIN_QUADLQ635KIICommand.GRAPHICS_24PIN_SINGLELQ635KIICommand.GRAPHICS_24PIN_DOUBLELQ635KIICommand.GRAPHICS_24PIN_CRTLQ635KIICommand.GRAPHICS_24PIN_TRIPLELQ635KIICommand.GRAPHICS_24PIN_HEXLQ635KIICommand.REDEFINE_GRAPHICSLQ635KIICommand.GRAPHICS_COMPRESSLQ635KIICommand.GRAPHICS_DATALQ635KIICommand.CHARACTER_TABLE_ITALICLQ635KIICommand.CHARACTER_TABLE_GRAPHICSLQ635KIICommand.CHARACTER_TABLE_DOWNLOADLQ635KIICommand.DOWNLOAD_CHARLQ635KIICommand.COPY_ROM_TO_RAMLQ635KIICommand.USE_DOWNLOADLQ635KIICommand.SINGLE_LINE_WIDTHLQ635KIICommand.SINGLE_LINE_WIDTH_OFFLQ635KIICommand.SET_VERTICAL_TABS_CHANNELLQ635KIICommand.SELECT_VFU_CHANNELLQ635KIICommand.TOP_MARGINLQ635KIICommand.PAGE_FORMATLQ635KIICommand.PAGE_LENGTH_EXT
AlignPrintQualityFontPaperSizePrinterDPILQ635KIIPrinterLQ635KIIPrinter.open()LQ635KIIPrinter.close()LQ635KIIPrinter.__enter__()LQ635KIIPrinter.__exit__()LQ635KIIPrinter.flush()LQ635KIIPrinter.enable_raw_monitoring()LQ635KIIPrinter.disable_raw_monitoring()LQ635KIIPrinter.carriage_return()LQ635KIIPrinter.backspace()LQ635KIIPrinter.cancel_line()LQ635KIIPrinter.delete_char()LQ635KIIPrinter.online()LQ635KIIPrinter.offline()LQ635KIIPrinter.init()LQ635KIIPrinter.home()LQ635KIIPrinter.beep()LQ635KIIPrinter.feed()LQ635KIIPrinter.form_feed()LQ635KIIPrinter.set_paper_size()LQ635KIIPrinter.set_left_margin()LQ635KIIPrinter.set_right_margin()LQ635KIIPrinter.set_line_spacing()LQ635KIIPrinter.set_line_spacing_1_6()LQ635KIIPrinter.set_line_spacing_1_8()LQ635KIIPrinter.set_skip_perf()LQ635KIIPrinter.cancel_skip_perf()LQ635KIIPrinter.set_page_length_lines()LQ635KIIPrinter.set_page_length_inch()LQ635KIIPrinter.set_align()LQ635KIIPrinter.left_align()LQ635KIIPrinter.center()LQ635KIIPrinter.right_align()LQ635KIIPrinter.justify()LQ635KIIPrinter.set_quality()LQ635KIIPrinter.set_draft()LQ635KIIPrinter.set_letter()LQ635KIIPrinter.set_font()LQ635KIIPrinter.set_pitch()LQ635KIIPrinter.set_proportional()LQ635KIIPrinter.set_character_space()LQ635KIIPrinter.set_double_width()LQ635KIIPrinter.set_double_height()LQ635KIIPrinter.set_condensed()LQ635KIIPrinter.set_single_line_width()LQ635KIIPrinter.set_bold()LQ635KIIPrinter.set_italic()LQ635KIIPrinter.set_underline()LQ635KIIPrinter.set_double_strike()LQ635KIIPrinter.set_superscript()LQ635KIIPrinter.set_subscript()LQ635KIIPrinter.cancel_super_sub()LQ635KIIPrinter.set_print_mode()LQ635KIIPrinter.set_absolute_x()LQ635KIIPrinter.set_absolute_x_mm()LQ635KIIPrinter.move_y_relative()LQ635KIIPrinter.move_y_mm()LQ635KIIPrinter.set_absolute_y_mm()LQ635KIIPrinter.set_absolute_xy_mm()LQ635KIIPrinter.move_y_up()LQ635KIIPrinter.move_x_relative()LQ635KIIPrinter.set_absolute_y()LQ635KIIPrinter.set_character_table()LQ635KIIPrinter.set_italic_table()LQ635KIIPrinter.set_graphics_table()LQ635KIIPrinter.print_text()LQ635KIIPrinter.println()LQ635KIIPrinter.print_line()LQ635KIIPrinter.newline()LQ635KIIPrinter.print_graphics_8pin()LQ635KIIPrinter.print_graphics_24pin()LQ635KIIPrinter.redefine_graphics()LQ635KIIPrinter.set_horizontal_tabs()LQ635KIIPrinter.tab_horizontal()LQ635KIIPrinter.set_vertical_tabs()LQ635KIIPrinter.tab_vertical()LQ635KIIPrinter.set_vertical_tabs_channel()LQ635KIIPrinter.select_vfu_channel()LQ635KIIPrinter.print_barcode()
PrinterServicePrinterService.CERT_FIELDSPrinterService.get_printer()PrinterService.last_os_job_idPrinterService.print_certificate()PrinterService.print_by_template()PrinterService.print_by_template_config()PrinterService.render_certificate_bytes()PrinterService.get_available_printers()PrinterService.get_default_printer()PrinterService.is_printer_ready()
- Submodules
- certflow.services.report_migration package
- Submodules
- certflow.services.report_migration.material_provider module
- certflow.services.report_migration.report_fill_engine module
- certflow.services.report_migration.report_template_spec module
zhibaoshu_6hang()zhibaoshu_5hang()zhibaoshu_9hang_biaozhunhao()zhibaoshu_9hang_bianhao_biaozhun()zhibaoshu_9hang_bianhao_biaozhun_wendu()zhibaoshu_9hang()shiyan_report_zhong()shiyan_report_shao()shiyan_report_zhongwen_shao()shiyan_report_zhongying()caizhi_1hang()caizhi_2hang()caizhi_3hang()
- Module contents
ReportFillEngineZhiBaoShuSpecZhiBaoShuSpec.nameZhiBaoShuSpec.kZhiBaoShuSpec.单条行数ZhiBaoShuSpec.page_row_countZhiBaoShuSpec.page_col_countZhiBaoShuSpec.title_rowsZhiBaoShuSpec.product_startZhiBaoShuSpec.material_header_rowsZhiBaoShuSpec.material_startZhiBaoShuSpec.footer_rowsZhiBaoShuSpec.has_materialZhiBaoShuSpec.date_rowZhiBaoShuSpec.date_colZhiBaoShuSpec.number_rowZhiBaoShuSpec.number_colZhiBaoShuSpec.number_prefixZhiBaoShuSpec.report_codeZhiBaoShuSpec.date_labelZhiBaoShuSpec.date_fmtZhiBaoShuSpec.product_row_spanZhiBaoShuSpec.product_blockZhiBaoShuSpec.caizhiZhiBaoShuSpec.product_colsZhiBaoShuSpec.product_mergesZhiBaoShuSpec.material_cols
zhibaoshu_5hang()zhibaoshu_6hang()zhibaoshu_9hang_biaozhunhao()zhibaoshu_9hang_bianhao_biaozhun()zhibaoshu_9hang_bianhao_biaozhun_wendu()shiyan_report_zhong()shiyan_report_shao()shiyan_report_zhongwen_shao()shiyan_report_zhongying()caizhi_1hang()caizhi_2hang()caizhi_3hang()
- Submodules
Submodules¶
- certflow.services.bom_material_service module
BomMaterialBomMaterial.idBomMaterial.production_order_noBomMaterial.seqBomMaterial.part_noBomMaterial.part_nameBomMaterial.material_gradeBomMaterial.material_sourceBomMaterial.material_noteBomMaterial.quantityBomMaterial.material_formBomMaterial.source_fileBomMaterial.created_atBomMaterial.updated_at
BomImportModeensure_bom_material_columns()scan_and_import()query_by_production_order_no()list_production_order_nos()build_hyperlink_index()export_bom_table()
- certflow.services.bom_part_classifier module
- certflow.services.caliber_mapping_service module
CaliberMappingCaliberMapping.idCaliberMapping.raw_textCaliberMapping.caliber_valueCaliberMapping.is_imperialCaliberMapping.sourceCaliberMapping.usage_countCaliberMapping.idCaliberMapping.raw_textCaliberMapping.caliber_valueCaliberMapping.is_imperialCaliberMapping.sourceCaliberMapping.usage_countCaliberMapping.created_atCaliberMapping.updated_atCaliberMapping.to_mm()
CaliberMappingServiceCaliberMappingService.CSV_COLUMNSCaliberMappingService.CSV_FIELD_TYPESCaliberMappingService.CSV_UNIQUE_KEYSCaliberMappingService.list_all()CaliberMappingService.get_by_id()CaliberMappingService.create()CaliberMappingService.update()CaliberMappingService.delete()CaliberMappingService.seed_common_calibers()CaliberMappingService.export_csv()CaliberMappingService.import_csv()
- certflow.services.cert_export_service module
- certflow.services.cert_log_service module
- certflow.services.cert_numbering module
- certflow.services.cert_numbering_policy module
resolve_number_model()resolve_sn_kks_position()parse_number_range()get_military_prefix()parse_military_code_meta()parse_product_code_meta()get_numbering_timing()get_issue_date_source()get_number_model()get_sn_kks_position()get_range_regex()get_no_cert_categories()is_auto_calc_dn_pn()is_yellow_skip_enabled()derive_needs_numbering()
- certflow.services.cert_print_engine module
- certflow.services.certificate_number_service module
CertificateNumberServiceCertificateNumberService.stage_separator()CertificateNumberService.list_separator()CertificateNumberService.prefix_source()CertificateNumberService.military_prefix()CertificateNumberService.to_list_format()CertificateNumberService.generate_numbers()CertificateNumberService.generate_batch()CertificateNumberService.get_prefix()CertificateNumberService.peek_next_serial()CertificateNumberService.generate_military_numbers()CertificateNumberService.allocate_report_serials()
- certflow.services.certificate_print_service module
CertificatePrintServiceCertificatePrintService.sessionCertificatePrintService.output_dirCertificatePrintService.printer_nameCertificatePrintService.auto_number()CertificatePrintService.manual_number()CertificatePrintService.copy_number()CertificatePrintService.create_certificates()CertificatePrintService.export_to_access()CertificatePrintService.export_sign_tb_csv()CertificatePrintService.generate_print_certificates()CertificatePrintService.print_single()CertificatePrintService.last_os_job_idCertificatePrintService.print_html_fallback()CertificatePrintService.check_and_supplement_params()CertificatePrintService.batch_print()CertificatePrintService.record_print_log()CertificatePrintService.get_print_history()CertificatePrintService.apply_template_to_certificate()CertificatePrintService.writeback_template_to_xlsx()
- certflow.services.certificate_service module
CertificateServiceCertificateService._sessionCertificateService.generate_certificate_no()CertificateService.get_certificate_by_sale_plan_id()CertificateService.get_sale_plan_by_id()CertificateService.count_certificates_created_today()CertificateService.CERT_EDITABLE_FIELDSCertificateService.FORM_TO_CERT_MAPCertificateService.CERT_TO_SALEPLAN_CERT_MAPCertificateService.update_fields()CertificateService.correct_print_fields()CertificateService.get_certificate_by_unique_key()CertificateService.get_certificates_by_ids()CertificateService.get_certificates_by_status()CertificateService.get_certificates_by_product()CertificateService.get_all_certificates()CertificateService.get_ungenerated_sale_plans()CertificateService.add()CertificateService.merge_certificate()CertificateService.flush()CertificateService.commit()CertificateService.mark_as_engraved()CertificateService.get_print_statistics()CertificateService.get_certificate()CertificateService.create_certificate()CertificateService.update_certificate()CertificateService.delete_certificate()
- certflow.services.correction_queue_service module
CorrectionQueueServiceCorrectionQueueService.list_flagged()CorrectionQueueService.list_quarantined()CorrectionQueueService.get_quarantine()CorrectionQueueService.get_sale_plan()CorrectionQueueService.correct_sale_plan()CorrectionQueueService.release_quarantine()CorrectionQueueService.delete_quarantine()CorrectionQueueService.quarantine_stats()
- certflow.services.db_source_adapter module
- certflow.services.dict_csv_sync module
- certflow.services.dn_service module
- certflow.services.dual_code module
- certflow.services.import_gate_service module
- certflow.services.material_grade_service module
MaterialGradeServiceMaterialGradeService.list_all()MaterialGradeService.get_by_id()MaterialGradeService.get_by_grade()MaterialGradeService.get_distinct_grades()MaterialGradeService.get_grades_by_category()MaterialGradeService.create()MaterialGradeService.update()MaterialGradeService.delete()MaterialGradeService.generate_composition()MaterialGradeService.generate_composition_values()MaterialGradeService.seed_common_grades()MaterialGradeService.find_incomplete_records()MaterialGradeService.count_incomplete_records()MaterialGradeService.get_data_quality_summary()
- certflow.services.model_param_mapping_service module
ModelParamMappingModelParamMapping.idModelParamMapping.product_modelModelParamMapping.pressure_valueModelParamMapping.test_standardModelParamMapping.working_tempModelParamMapping.working_mediumModelParamMapping.sourceModelParamMapping.usage_countModelParamMapping.created_atModelParamMapping.updated_atModelParamMapping.idModelParamMapping.product_modelModelParamMapping.pressure_valueModelParamMapping.test_standardModelParamMapping.working_tempModelParamMapping.working_mediumModelParamMapping.sourceModelParamMapping.usage_countModelParamMapping.created_atModelParamMapping.updated_at
ModelParamMappingServiceModelParamMappingService.CSV_COLUMNSModelParamMappingService.CSV_FIELD_TYPESModelParamMappingService.CSV_UNIQUE_KEYSModelParamMappingService.list_all()ModelParamMappingService.get_by_id()ModelParamMappingService.get_by_model()ModelParamMappingService.create()ModelParamMappingService.update()ModelParamMappingService.delete()ModelParamMappingService.seed_common_models()ModelParamMappingService.upsert_for_learnback()ModelParamMappingService.export_csv()ModelParamMappingService.import_csv()
- certflow.services.model_spec_parser module
- certflow.services.output_guard module
- certflow.services.pn_service module
- certflow.services.pressure_calc_service module
lb_to_mpa()PressureCalcInputPressureCalcInput.standardPressureCalcInput.nominal_pressure_mpaPressureCalcInput.caliber_mmPressureCalcInput.is_check_valvePressureCalcInput.is_butterfly_valvePressureCalcInput.is_metricPressureCalcInput.is_imperialPressureCalcInput.standardPressureCalcInput.nominal_pressure_mpaPressureCalcInput.caliber_mmPressureCalcInput.is_check_valvePressureCalcInput.is_butterfly_valvePressureCalcInput.is_metricPressureCalcInput.is_imperial
PressureCalcResultPressureCalcResult.strength_test_pressurePressureCalcResult.strength_test_pressure_displayPressureCalcResult.upper_seal_pressurePressureCalcResult.upper_seal_pressure_displayPressureCalcResult.main_seal_pressurePressureCalcResult.main_seal_pressure_displayPressureCalcResult.strength_hold_timePressureCalcResult.upper_seal_hold_timePressureCalcResult.main_seal_hold_timePressureCalcResult.errorsPressureCalcResult.strength_test_pressurePressureCalcResult.strength_test_pressure_displayPressureCalcResult.upper_seal_pressurePressureCalcResult.upper_seal_pressure_displayPressureCalcResult.main_seal_pressurePressureCalcResult.main_seal_pressure_displayPressureCalcResult.strength_hold_timePressureCalcResult.upper_seal_hold_timePressureCalcResult.main_seal_hold_timePressureCalcResult.errors
PressureCalcServicePressureCalcService.calculate()PressureCalcService.calc_strength_pressure()PressureCalcService.calc_upper_seal_pressure()PressureCalcService.calc_main_seal_pressure()PressureCalcService.calc_strength_hold_time()PressureCalcService.calc_upper_seal_hold_time()PressureCalcService.calc_main_seal_hold_time()
compute_pressure_params()
- certflow.services.print_history_service module
- certflow.services.printer_manager module
PrinterStatusPaperSizePrinterInfoPrintJobPrinterManagerPrinterManager.printer_addedPrinterManager.printer_removedPrinterManager.printer_status_changedPrinterManager.print_startedPrinterManager.print_completedPrinterManager.print_failedPrinterManager.progress_updatedPrinterManager.printersPrinterManager.current_printerPrinterManager.pending_jobsPrinterManager.get_printers()PrinterManager.get_printer_names()PrinterManager.get_default_printer()PrinterManager.set_default_printer()PrinterManager.get_printer_status()PrinterManager.is_printer_ready()PrinterManager.print_text_only()PrinterManager.print_file()PrinterManager.print_html()PrinterManager.get_print_queue()PrinterManager.cancel_job()PrinterManager.pause_printer()PrinterManager.resume_printer()PrinterManager.save_settings()PrinterManager.load_settings()PrinterManager.cleanup_temp_files()PrinterManager.staticMetaObject
- certflow.services.query_builder module
QueryBuilderQueryBuilder.FIELD_MAPPINGQueryBuilder.set_condition()QueryBuilder.set_dn_range()QueryBuilder.set_pn_range()QueryBuilder.set_id_range()QueryBuilder.set_quantity_range()QueryBuilder.set_print_date_range()QueryBuilder.set_signed_only()QueryBuilder.set_has_certificate()QueryBuilder.set_combo_filter()QueryBuilder.set_full_fields()QueryBuilder.build_query()QueryBuilder.execute()
TempTableManagerBatchUpdaterStatisticsReporter
- certflow.services.query_service module
QueryServiceQueryService.OPERATORSQueryService.saleplan_fieldsQueryService.certificate_fieldsQueryService.HYBRID_FIELDSQueryService.FIELD_ALIASESQueryService.build_status_filter()QueryService.build_query()QueryService.query()QueryService.get_field_values()QueryService.get_distinct_field_combos()QueryService.search()QueryService.get_statistics()QueryService.get_records_by_ids()QueryService.get_certificate_count()QueryService.delete_records()QueryService.delete_with_certificates()QueryService.batch_update_field()QueryService.batch_update_production_status()QueryService.copy_cert_info_to_plan()QueryService.fill_plan_no()QueryService.get_certificates_by_plan_ids()QueryService.get_latest_certificate()
- certflow.services.report_bom_enricher module
BomEnrichResultBomEnrichResult.production_order_noBomEnrichResult.matchedBomEnrichResult.detail_countBomEnrichResult.classifiedBomEnrichResult.detailBomEnrichResult.production_order_noBomEnrichResult.matchedBomEnrichResult.detail_countBomEnrichResult.classifiedBomEnrichResult.detailBomEnrichResult.leftover_parts
enrich_parts()enrich()
- certflow.services.report_fill_service module
- certflow.services.report_output_service module
ReportOutputServiceReportOutputRequestReportOutputRequest.report_typeReportOutputRequest.xlsx_sourceReportOutputRequest.plan_dateReportOutputRequest.customerReportOutputRequest.projectReportOutputRequest.is_outsourcedReportOutputRequest.languageReportOutputRequest.product_noReportOutputRequest.variantReportOutputRequest.report_dateReportOutputRequest.serialReportOutputRequest.seal_imageReportOutputRequest.sales_order_noReportOutputRequest.records_per_pageReportOutputRequest.variant_label
- certflow.services.sale_plan_service module
SalePlanServiceSalePlanService.sessionSalePlanService.excel_handlerSalePlanService.cleanerSalePlanService.sorterSalePlanService.save_handlerSalePlanService.read_excel()SalePlanService.clean_sale_plan()SalePlanService.detect_header_row()SalePlanService.extract_year_from_filename()SalePlanService.apply_range_filter()SalePlanService.record_shipment()SalePlanService.sessionSalePlanService.excel_handlerSalePlanService.cleanerSalePlanService.sorterSalePlanService.save_handlerSalePlanService.shipped_handlerSalePlanService.import_from_excel_with_config()SalePlanService.get_all_sale_plans()SalePlanService.get_by_sort_group()SalePlanService.get_by_product_model()SalePlanService.clear_all()SalePlanService.get_statistics()SalePlanService.get_by_status()SalePlanService.get_status_statistics()SalePlanService.get_exportable_plans()SalePlanService.find_by_unique_key()SalePlanService.find_by_id()SalePlanService.find_by_production_order_no()SalePlanService.find_by_contract_and_model()SalePlanService.add_sale_plan()SalePlanService.add_change()SalePlanService.flush_session()SalePlanService.commit_session()SalePlanService.rollback_session()SalePlanService.CERT_EDITABLE_FIELDSSalePlanService.update_cert_fields()SalePlanService.count_sale_plans()SalePlanService.archive_to_shipped()SalePlanService.export_and_delete()SalePlanService.export_selected_records()SalePlanService.export_query_result()
- certflow.services.scan_service module
- certflow.services.workflow_service module
Module contents¶
服务层模块
提供系统核心业务服务的统一导入接口。 包含销售计划服务、证书打印服务、报告服务和查询服务等业务逻辑层组件。
分层约束:本包属 L3 服务层,须保证在无 X11 / 无 PySide6 的 headless
环境下可被导入。printer_manager 仍持有 Qt 信号壳(待阶段 B 上移至
controllers 层),因此本模块采用 PEP 562 __getattr__ 惰性导出:
仅在真正访问 PrinterManager / PrinterStatus / PrinterInfo
时才导入该子模块,避免 import certflow.services 即拉起 Qt。
注意:query_builder``(QueryBuilder/BatchUpdater/TempTableManager/
StatisticsReporter)为 Access ``SignTb 直连 SQL 的旧体系残留,仅供
scripts/sync_databases_cli.py 同步脚本专用,不在此公共导出中,
亦不纳入 ORM 版 QueryService 体系(见 BLUEPRINT §2.3 偏差 6)。
示例
>>> from certflow.services import QueryService # 不触发 Qt 加载
>>> from certflow.services import PrinterManager # 此时才导入 printer_manager
- class certflow.services.CertificatePrintService(session, output_dir='output/certificates', printer_name='')[源代码]¶
基类:
object合格证打印服务(编排层)
组合编号、打印引擎、日志等子模块,提供完整的打印业务流程。
- 编号模式(委托 CertNumberingService):
auto_number: 自动编号(正则解析 production_order_no / supply_type,最常用)
manual_number: 手动指定前缀和起始序号
copy_number: 复制已有编号(单件直接复制)
- 打印(委托 CertPrintEngine):
print_single: 单台 GDI 精确打印
batch_print: 批量展开编号 → 逐台打印 → 记录日志
print_html_fallback: HTML 降级打印
- 持久化(委托 CertNumberingService):
create_certificates: 将已编号的 SalePlan 写入 Certificate 表
export_to_access: 导出到 Access 数据库
export_sign_tb_csv: 导出 CSV
- 日志与历史:
record_print_log: 记录打印日志到 SQLite print_logs 表
get_print_history: 查询打印历史
- session¶
SQLAlchemy 数据库会话对象
- output_dir¶
输出目录路径
- printer_name¶
默认打印机名称
示例
>>> service = CertificatePrintService(session) >>> # 自动编号 >>> count = service.auto_number([1, 2, 3], prefix_override="2506") >>> # 写入 Certificate >>> cert_count = service.create_certificates([1, 2, 3]) >>> # 逐台打印 >>> service.batch_print(certificate_id=1, printer_name="EPSON LQ-635KII")
- auto_number(ids, prefix_override=None)[源代码]¶
自动编号(委托 CertNumberingService)
通过正则解析 production_order_no / supply_type 自动生成前缀并编号。
- create_certificates(ids, printer_name='', print_status='已打印')[源代码]¶
将已编号的记录写入 Certificate 表(委托 CertNumberingService)
- generate_print_certificates(ids, prefix_override=None, print_status='待打印')[源代码]¶
为选中的销售计划生成合格证(去重安全)。
跳过已生成 Certificate 的计划(避免证书重复生成与唯一约束冲突), 对剩余计划自动编号并写入 Certificate 表。编号与写库均委托 ``CertNumberingService``(数据访问层),本方法仅做编排与去重判定。
- print_single(data, serial_number, printer_name=None, print_fields=None)[源代码]¶
打印单台合格证(委托 CertPrintEngine)
- property last_os_job_id: int | None¶
最近一次打印提交的 OS 作业 ID(委托 CertPrintEngine 捕获)。
偏差 5 作业 ID 捕获链路末端:队列的
_default_print_func经此属性 拿到 spooler 作业 ID,写入PrintJob.os_job_id,供 OS 级取消使用。
- check_and_supplement_params(cert, parent=None, supplement_callback=None)[源代码]¶
检查 Certificate 参数完整性,必要时弹出参数补充对话框
对标 VBA print.vb 中一连串的 InputBox 调用: - 阀体材质 InputBox(dd.vb:1066) - 阀杆材质 InputBox(dd.vb:1074) - 启闭件材质 InputBox(dd.vb:1082) - 检验工号 InputBox(dd.vb:894-906) - 出厂年月修正 InputBox(dd.vb:986,1009)
- 参数:
- 返回类型:
- batch_print(certificate_id, printer_name=None, progress_callback=None, skip_supplement=False, parent=None, supplement_callback=None)[源代码]¶
批量打印:参数补充 → 解析编号 → 展开逐台编号 → 打印 → 记录日志
对标 VBA print.vb 批量打印流程: 1. 检查参数完整性,缺失则弹出补充对话框(对标 InputBox) 2. 解析 Certificate 编号范围 3. 展开为逐台编号后依次打印 4. 每台记录一条 print_log
- 参数:
certificate_id (int) -- Certificate.id
printer_name (str | None) -- 打印机名称
progress_callback (Callable[[int, int], None] | None) -- 进度回调 fn(current, total)
skip_supplement (bool) -- 跳过参数补充对话框(批量自动化时使用)
parent (object | None) -- 父窗口(用于对话框模态),服务层不感知其具体类型,原样透传
supplement_callback (Callable | None) -- 参数补充对话框回调 (model, prefill, material_grades, parent) → (confirmed, skip_all, params)
- 返回:
int, "failed": int, "serials": [...], "message": str}
- 返回类型:
{"success"
- record_print_log(certificate_id, certificate_no, cert_data=None, printer_name='', status='success', error_message='', content_summary='')[源代码]¶
记录打印日志到 SQLite print_logs 表(字段名与 Access SignTb 兼容)
每次打印操作(单台或批量中的每台)都写入一条记录。 字段命名与 Access SignTb 保持一致,方便铭牌刻印系统直接读取。
SN 和 KKS 赋值遵循 VBA 逻辑: - SN = 短编号(去掉中间4位年月),如 V520Y - KKS = 完整编码(含年月),如 V2604520Y - 编码模式5/6时 SN/KKS 互换 - KKS 截断到12位
字段清理对齐VBA(温度去≤/℃,PN去MPA后缀等)。
- class certflow.services.CertificateService(session)[源代码]¶
基类:
object证书服务类
提供合格证数据的CRUD操作服务,供控制器层调用。 封装业务逻辑,协调数据访问层完成各类证书操作。
- 参数:
session (Session)
- _session¶
数据库会话对象(当前为占位,实际实现时需注入)
示例
>>> service = CertificateService() >>> # 创建证书 >>> cert = service.create_certificate({ ... "certificate_no": "CERT-20231201-0001", ... "product_model": "阀门A", ... "customer": "某某公司" ... }) >>> print(cert.get("success")) True >>> >>> # 查询证书 >>> cert_info = service.get_certificate(1) >>> if cert_info: ... print(f"证书编号: {cert_info['certificate_no']}")
- static generate_certificate_no(prefix='CERT', sequence=None)[源代码]¶
生成合格证编号
生成格式为 PREFIX-YYYYMMDD-NNNN 的合格证编号,序号部分自动补零至4位。
- get_certificate_by_sale_plan_id(sale_plan_id)[源代码]¶
根据销售计划 ID 查询已存在的合格证
- 参数:
sale_plan_id (int) -- 销售计划 ID
- 返回:
合格证对象,未找到返回 None
- 返回类型:
Certificate | None
- get_sale_plan_by_id(sale_plan_id)[源代码]¶
根据 ID 查询销售计划
- 参数:
sale_plan_id (int) -- 销售计划 ID
- 返回:
销售计划对象,未找到返回 None
- 返回类型:
SalePlan | None
- CERT_EDITABLE_FIELDS: tuple[str, ...] = ('product_name', 'product_model', 'product_spec', 'customer', 'project_name', 'test_standard', 'supplier', 'issue_date', 'working_temp', 'working_medium', 'remarks', 'pn_display', 'inspector_id', 'template_type')¶
- FORM_TO_CERT_MAP: dict[str, str] = {'check_standard': 'test_standard', 'dn': 'product_spec', 'inspector_id': 'inspector_id', 'manufacture_date': 'issue_date', 'medium': 'working_medium', 'pn': 'pn_display', 'product_model': 'product_model', 'product_name': 'product_name', 'temperature': 'working_temp', 'template_type': 'template_type'}¶
- CERT_TO_SALEPLAN_CERT_MAP: dict[str, str] = {'product_model': 'cert_product_model', 'product_name': 'cert_product_name', 'product_spec': 'cert_product_spec'}¶
- update_fields(cert_id, fields)[源代码]¶
仅更新合格证记录的白名单字段(订正合格证记录)
与
SalePlanService.update_cert_fields对称:只写允许订正的打印字段, 非白名单字段被静默忽略,绝不触动编号/状态等系统字段。certificate_no是唯一键,不在白名单内,避免误改导致唯一约束冲突。
- correct_print_fields(cert_id, sale_plan_id, fields)[源代码]¶
回源改正(蓝图 §10.7 / §10.8-6):白名单写 Certificate 打印层 + SalePlan 合格证覆盖层(cert_*) 同步,并对型号/压力/标准自学习字典。
表单键(dn/pn/…) 归一化为 Certificate 列(product_spec/pn_display/…);
产品名称/型号/规格同时落到 SalePlan.cert_product_* 覆盖层,两层副本一致;
绝不写 SalePlan.product_name/model/spec 合同层(参与导入唯一键);
压力/温度/介质/标准额外自学习 ModelParamMapping / CaliberMapping。
- get_certificate_by_unique_key(unique_key)[源代码]¶
根据唯一键查询合格证(取最新一条)
- 参数:
unique_key (str) -- 合格证唯一键
- 返回:
合格证对象,未找到返回 None
- 返回类型:
Certificate | None
- merge_certificate(certificate)[源代码]¶
合并更新合格证(用于 force_regenerate 场景)
- 参数:
certificate (Certificate) -- 合格证对象
- 返回类型:
None
- get_certificate(cert_id)[源代码]¶
获取证书信息
根据证书ID查询并返回证书详细信息。
- 参数:
cert_id (int) -- 证书的唯一标识ID
- 返回:
证书信息字典,包含以下字段:
id: 证书ID
certificate_no: 合格证编号
product_model: 产品型号
order_no: 订单号
customer: 客户名称
status: 合格证状态
print_time: 打印时间
is_engraved: 是否已刻印
未找到时返回 None。
- 返回类型:
Optional[Dict[str, Any]]
示例
>>> service = CertificateService() >>> cert = service.get_certificate(100) >>> if cert: ... print(f"编号: {cert['certificate_no']}, 状态: {cert['status']}")
- create_certificate(data)[源代码]¶
创建证书
根据提供的数据创建新的证书记录。
- 参数:
data (dict[str, Any]) -- 证书数据字典,应包含以下字段: - certificate_no: 合格证编号(必填) - sale_plan_id: 关联销售计划ID(必填) - unique_key: 唯一键(必填) - product_model: 产品型号 - order_no: 订单号 - customer: 客户名称 - status: 合格证状态,默认为"待打印"
- 返回:
- 创建结果字典,包含以下字段:
success: 是否成功(布尔值)
message: 结果消息
certificate_id: 成功时返回新创建的证书ID
error: 失败时返回错误信息
- 返回类型:
Dict[str, Any]
示例
>>> service = CertificateService() >>> result = service.create_certificate({ ... "certificate_no": "CERT-20231201-0001", ... "sale_plan_id": 100, ... "unique_key": "abc123", ... "product_model": "阀门A", ... "customer": "某某公司" ... }) >>> if result["success"]: ... print(f"证书创建成功,ID: {result['certificate_id']}") ... else: ... print(f"创建失败: {result['error']}")
- update_certificate(cert_id, data)[源代码]¶
更新证书
根据证书ID更新证书的指定字段。
- 参数:
- 返回:
- 更新结果字典,包含以下字段:
success: 是否成功(布尔值)
message: 结果消息
error: 失败时返回错误信息
- 返回类型:
Dict[str, Any]
示例
>>> service = CertificateService() >>> result = service.update_certificate(100, { ... "status": "已打印", ... "print_time": "2024-01-15 10:30:00" ... }) >>> if result["success"]: ... print("证书更新成功")
- delete_certificate(cert_id)[源代码]¶
删除证书
根据证书ID删除对应的证书记录。
- 参数:
cert_id (int) -- 证书的唯一标识ID
- 返回:
- 删除结果字典,包含以下字段:
success: 是否成功(布尔值)
message: 结果消息
error: 失败时返回错误信息
- 返回类型:
Dict[str, Any]
示例
>>> service = CertificateService() >>> result = service.delete_certificate(100) >>> if result["success"]: ... print("证书删除成功") ... else: ... print(f"删除失败: {result['error']}")
- class certflow.services.PrinterInfo(name, port='', driver='', status=PrinterStatus.UNKNOWN, is_default=False, paper_sizes=<factory>)[源代码]¶
基类:
object打印机信息
- 参数:
- status: PrinterStatus = '未知'¶
- class certflow.services.PrinterManager[源代码]¶
基类:
QObject打印机管理器
封装 Windows 打印子系统,提供打印机枚举、状态监控、 GDI 精确文字打印、文件打印等功能。
分层说明:本模块归属 services 层,不应被 UI 库强制绑定导入。 在无 PySide6(headless / 无 X11)环境下,信号与监控定时器自动降级为空操作, 模块仍可导入与实例化,仅丢失 GUI 事件通知能力。
- Signals(仅 Qt 环境生效):
printer_added: 新增打印机 (name) printer_removed: 移除打印机 (name) printer_status_changed: 状态变化 (name, status) print_started: 打印开始 (doc_name, job_id) print_completed: 打印完成 (doc_name, job_id) print_failed: 打印失败 (doc_name, error_msg) progress_updated: 进度更新 (current, total)
- printer_added¶
- printer_removed¶
- printer_status_changed¶
- print_started¶
- print_completed¶
- print_failed¶
- progress_updated¶
- printers: dict[str, PrinterInfo]¶
- get_printer_status(printer_name=None)[源代码]¶
获取打印机状态。
- 参数:
printer_name (str | None) -- 打印机名称,为 None 时使用默认打印机。
- 返回:
对应打印机状态,未知时返回 PrinterStatus.UNKNOWN。
- 返回类型:
- print_text_only(data, serial_number, printer_name=None)[源代码]¶
使用 win32 GDI 精确打印文字到预印卡纸
在 60mm × 100mm 预印卡纸的指定坐标位置输出文字。 卡纸已预印底板(边框、标题、品保章等),打印机只输出动态文字。 跳过空值字段,避免覆盖卡纸原有内容。
- save_settings(settings_file='printer_settings.json')[源代码]¶
保存打印机设置到 JSON 文件。
- 参数:
settings_file (str) -- 设置文件路径,默认为 "printer_settings.json"。
- 返回类型:
None
- load_settings(settings_file='printer_settings.json')[源代码]¶
从 JSON 文件加载并设置默认打印机。
- 参数:
settings_file (str) -- 设置文件路径,默认为 "printer_settings.json"。
- 返回类型:
None
- staticMetaObject = PySide6.QtCore.QMetaObject("PrinterManager" inherits "QObject": Methods: #4 type=Signal, signature=printer_added(QString), parameters=QString #5 type=Signal, signature=printer_removed(QString), parameters=QString #6 type=Signal, signature=printer_status_changed(QString,PyObject), parameters=QString, PyObject #7 type=Signal, signature=print_started(QString,int), parameters=QString, int #8 type=Signal, signature=print_completed(QString,int), parameters=QString, int #9 type=Signal, signature=print_failed(QString,QString), parameters=QString, QString #10 type=Signal, signature=progress_updated(int,int), parameters=int, int )¶
- class certflow.services.PrinterStatus(*values)[源代码]¶
基类:
Enum打印机状态枚举
- READY = '就绪'¶
- PAUSED = '暂停'¶
- ERROR = '错误'¶
- PENDING = '待机'¶
- PAPER_OUT = '缺纸'¶
- OFFLINE = '离线'¶
- UNKNOWN = '未知'¶
- class certflow.services.QueryService(session)[源代码]¶
基类:
object销售计划查询服务
提供灵活的多条件组合查询功能: - 支持模糊匹配、精确匹配、范围查询 - 支持多字段组合查询 - 支持分页和排序 - 支持关联 Certificate 表查询
示例
>>> service = QueryService(session) >>> results = service.query( ... conditions={ ... "product_model": {"value": "阀门", "operator": "contains"}, ... "customer": {"value": "东方电气", "operator": "contains"}, ... "quantity": {"value": 10, "operator": "gte"} ... } ... )
- 参数:
session (Session)
- OPERATORS = {'contains': <function QueryService.<lambda>>, 'endswith': <function QueryService.<lambda>>, 'eq': <function QueryService.<lambda>>, 'gt': <function QueryService.<lambda>>, 'gte': <function QueryService.<lambda>>, 'in': <function QueryService.<lambda>>, 'is_not_null': <function QueryService.<lambda>>, 'is_null': <function QueryService.<lambda>>, 'lt': <function QueryService.<lambda>>, 'lte': <function QueryService.<lambda>>, 'ne': <function QueryService.<lambda>>, 'not_contains': <function QueryService.<lambda>>, 'startswith': <function QueryService.<lambda>>}¶
- property saleplan_fields: set[str]¶
SalePlan 表全部列名集合。
惰性计算并缓存(
_salepian_fields),用于判定查询字段归属 SalePlan 表。
- property certificate_fields: set[str]¶
Certificate 表全部列名集合。
惰性计算并缓存(
_certificate_fields),用于判定查询字段归属 Certificate 表。
- FIELD_ALIASES = {'cert_status': 'print_status', 'print_status': 'print_status'}¶
- build_status_filter(status)[源代码]¶
构建状态筛选条件(同时匹配 production_status 和 execution_status)
当用户筛选标准化状态时,同时模糊匹配 execution_status 原始文本, 避免因原始文本包含状态关键词而遗漏记录。
关键词从 StatusInference 配置中获取(config.yaml production_status.query_keywords)。
- build_query(conditions, or_filters=None)[源代码]¶
根据条件构建查询对象
自动识别字段所属表: - SalePlan 字段直接过滤 - Certificate 字段通过 LEFT JOIN 过滤
- query(conditions=None, page=1, page_size=50, order_by='sort_group', order_desc=False, or_filters=None)[源代码]¶
执行多条件组合查询
- get_distinct_field_combos(fields, conditions=None)[源代码]¶
返回指定字段组合的去重值列表(全量,不受分页影响),用于快查框候选项。
跨整个结果集(尊重 conditions,但忽略分页)计算去重组合, 避免候选项仅来自当前页导致「越查越窄 / 只能选已显示项」。
- search(conditions=None, page=1, page_size=50, order_by='sort_group', order_desc=False)[源代码]¶
执行查询并返回与
query一致的结果字典兼容旧测试/调用方:在
query基础上将记录字段命名为results(query使用records),其余字段(total/page/page_size/ total_pages/conditions)保持一致。
- fill_plan_no(ids, sequence)[源代码]¶
填充计划单号(批量更新版本)
使用每条记录的 plan_date 生成对应的年月格式 plan_no。 如果 plan_date 为空,则回退到当前年月。
- class certflow.services.SalePlanService(db_session)[源代码]¶
基类:
object销售计划服务
提供销售计划数据的完整业务流程管理,包括: - Excel文件导入(支持带格式和不带格式两种模式) - 数据清洗和校验 - 分组排序(先按业务分组,组内按产品排序) - 数据库持久化 - 查询和统计
- 参数:
db_session (Session)
- session¶
SQLAlchemy数据库会话对象
- excel_handler¶
Excel文件处理器实例
- cleaner¶
数据清洗器实例
- sorter¶
排序器实例
- save_handler¶
保存处理器实例
示例
>>> from sqlalchemy import create_engine >>> from sqlalchemy.orm import sessionmaker >>> >>> engine = create_engine("sqlite:///certflow.db") >>> Session = sessionmaker(bind=engine) >>> session = Session() >>> >>> service = SalePlanService(session) >>> >>> # 导入Excel文件 >>> result = service.import_from_excel_with_config({ ... "file_path": "sales_plan.xlsx", ... "sheet_name": "Sheet1", ... "preserve_formatting": True ... }) >>> print(f"导入成功: {result['new_count']}条")
- static detect_header_row(df_raw, keywords, max_rows=20)[源代码]¶
自动检测表头行(委托
ExcelHandler.detect_header_row)。
- static extract_year_from_filename(file_path)[源代码]¶
从工作簿文件名提取年份后两位(委托
Sorter._extract_year_from_filename)。
- static apply_range_filter(records, range_filter, selected_rows)[源代码]¶
B0-8 导入范围筛选。
selected_rows:勾选行模式,传入 0-based 数据行序号集合,仅保留这些行。
range_filter:按订单筛选模式,dict 含 plan_date/customer/project_name/plan_no 中若干非空字段,仅保留这些字段**全部精确匹配**的行(空值字段视为通配)。
两者均未指定:返回原 records(整表导入)。
临时字段 _src_row 用后即清,不污染落库数据。
- record_shipment(sale_plan_id, quantity, ship_date=None, operator='', note='')[源代码]¶
记录一次分批发货(B0-3 分批发货数量追踪)。
将本次发货追加到
shipment_batchesJSON 列表,累加shipped_quantity; 当累计已发货量达到订单总量quantity时,标记shipping_status='已发货'(仅更新发货状态,不动生产状态),并记录发货日期。
- import_from_excel_with_config(config_params)[源代码]¶
使用自定义配置从Excel导入销售计划
根据配置参数选择带格式或不带格式的导入方式。
- 参数:
config_params (dict[str, Any]) -- 导入配置参数字典,包含以下字段: - file_path: Excel文件路径(必填) - sheet_name: 工作表名称或索引,默认为0 - header_row: 表头行号(可选) - skip_rows: 跳过的行数,默认为0 - column_mapping: 自定义列映射字典(可选) - preserve_formatting: 是否保留单元格格式,默认为False
- 返回:
导入结果字典
- 返回类型:
Dict[str, Any]
- 抛出:
Exception -- 导入失败时抛出异常
示例
>>> service = SalePlanService(session) >>> result = service.import_from_excel_with_config({ ... "file_path": "sales.xlsx", ... "sheet_name": "1月", ... "header_row": 1, ... "skip_rows": 0, ... "preserve_formatting": True, ... }) >>> print(result["new_count"])
- get_all_sale_plans()[源代码]¶
获取所有销售计划
- 返回:
按分组键排序的所有销售计划列表
- 返回类型:
List[SalePlan]
示例
>>> service = SalePlanService(session) >>> plans = service.get_all_sale_plans() >>> print(len(plans))
- get_by_sort_group(sort_group)[源代码]¶
根据分组键获取销售计划
- 参数:
sort_group (str) -- 分组键值
- 返回:
指定分组的销售计划列表
- 返回类型:
List[SalePlan]
- get_by_product_model(product_model)[源代码]¶
根据产品型号获取销售计划
- 参数:
product_model (str) -- 产品型号
- 返回:
指定产品型号的销售计划列表
- 返回类型:
List[SalePlan]
- get_statistics()[源代码]¶
获取销售计划统计信息
- 返回:
- 统计信息字典,包含:
total_records: 总记录数
group_count: 分组数
status_stats: 按生产状态分组统计
- 返回类型:
Dict[str, Any]
- get_by_status(status)[源代码]¶
根据格式状态获取销售计划
- 参数:
status (str) -- 格式状态值(如"已开票"、"已发货"等)
- 返回:
指定格式状态的销售计划列表
- 返回类型:
List[SalePlan]
- get_exportable_plans()[源代码]¶
获取可导出的销售计划(排除已发货、外购未回、隐藏行)
对应 VBA 中导出合格证时的过滤逻辑: - 排除字体蓝色(已发货)的记录 - 排除背景橙棕色(外购未回)的记录 - 排除行高=0(隐藏/取消)的记录
- 返回:
可导出的销售计划列表
- 返回类型:
List[SalePlan]
- find_by_unique_key(unique_key)[源代码]¶
根据唯一键查找已存在的销售计划
- 参数:
unique_key (str) -- 唯一键
- 返回:
已存在的 SalePlan 或 None
- 返回类型:
SalePlan | None
- find_by_id(plan_id)[源代码]¶
按主键查询销售计划。
- 参数:
plan_id (int) -- 销售计划主键
- 返回:
命中的 SalePlan 或 None
- 返回类型:
SalePlan | None
- find_by_production_order_no(production_order_no)[源代码]¶
根据生产令号查找已存在的销售计划
用于老数据模式降级去重:当唯一键匹配失败但生产令号有值时, 按生产令号查找已有记录,避免同一记录从不同来源重复导入。
- 参数:
production_order_no (str) -- 生产令号
- 返回:
已存在的 SalePlan 或 None
- 返回类型:
SalePlan | None
- find_by_contract_and_model(contract_no, product_model)[源代码]¶
根据合同号 + 产品型号查找已存在的销售计划
用于跨来源补充场景的兜底匹配:当唯一键和生产令号都匹配失败时, 通过合同号 + 产品型号定位已有记录,实现缺失字段补充。
- CERT_EDITABLE_FIELDS: tuple[str, ...] = ('cert_product_name', 'cert_product_model', 'cert_product_spec', 'certificate_remarks')¶
- update_cert_fields(plan_id, fields)[源代码]¶
仅更新合格证打印字段(蓝图 §4.2.3:查询视图 cert-only 订正)
只写入
cert_product_name/model/spec与certificate_remarks, 绝不触碰合同字段(product_*等)。这是合格证清单/打印的数据源, 订正即时生效于后续create_certificates。
- archive_to_shipped(sale_plan_ids)[源代码]¶
将选中的 SalePlan 归档到 sale_plans_shipped 表并从主表移除
三层模型的 Layer 1 → Layer 2: - 将记录完整拷贝到 sale_plans_shipped(设置 shipped_at / shipped_by="archive") - 从 sale_plans 表删除对应记录 - 同时将 production_status 设为"已发货"(如果还不是)
- export_and_delete(sale_plan_ids, output_dir)[源代码]¶
导出选中 SalePlan 的完整字段 Excel,归档到 shipped 表,并从主表删除
三层模型的 Layer 1 → Layer 3: - 生成完整字段 Excel 文件 - 将记录拷贝到 sale_plans_shipped(shipped_by="export_delete") - 从 sale_plans 表删除
- class certflow.services.ScanService(session=None)[源代码]¶
基类:
object扫描件生成服务
封装扫描件生成的业务逻辑,支持单张与多张拼接两种模式, 并委托底层 Handler 完成画布创建、字段绘制与文件导出。
- 参数:
session (Session | None)
- generate_scans(certificate_ids, output_dir, template_type='全中文', output_format='JPG', rows=1, cols=1, paper_width_mm=60, paper_height_mm=100, data_overrides=None, dual_code=False, progress_callback=None)[源代码]¶
生成扫描件
- 参数:
output_dir (str) -- 输出目录
template_type (str) -- 模板类型 (全中文/中英文/俄英文)
output_format (str) -- 输出格式 (JPG/PDF)
rows (int) -- 每页行数
cols (int) -- 每页列数
paper_width_mm (float) -- 纸张宽度 (mm)
paper_height_mm (float) -- 纸张高度 (mm)
progress_callback (Callable[[int, int, str], None] | None) -- 进度回调函数 fn(current, total, message)
dual_code (bool)
- 返回:
- {
"success": int, # 成功生成的文件数 "failed": int, # 失败的数量 "files": list[str], # 生成的文件路径列表 "message": str # 结果消息
}
- 返回类型:
生成结果字典
- class certflow.services.WorkflowService(session)[源代码]¶
基类:
object工作流服务 - 管理文档完成状态
自动升级规则由 config.yaml production_status.auto_upgrade 配置驱动。 新增升级规则只需修改 YAML,无需改动代码。
- 参数:
session (Session)