@beparallel/grouping

中文文档
1.3.1发布于 2026/10/14TypeScriptESM + CJS近 30 天下载 1746

法国医院医疗编码中使用的官方ATIH分组引擎(PMSI GHM/GHS)的Node.js包装器. 该套件提供了本地C组群模块,用于将住院病人分类为GHM和GHS代码,作为PMSI/T2A系统的一部分

中文使用文档
文档目录24 节
  1. 概览
  2. 法国医学编码背景
  3. 技术架构
  4. 仓库布局
  5. 公共 API
  6. 编辑选择 : grpMco
  7. 投入
  8. 产出
  9. 错误模式
  10. FG SMR(医学和适应学院)
  11. 如何建造
  12. 土著汇编
  13. 类型脚本汇编
  14. 地方发展
  15. 运行测试
  16. 测试固定装置
  17. 预建二进制
  18. CI 管道
  19. 软件包管理器
  20. 安装
  21. 所需资源
  22. * 额外资源
  23. 释放过程
  24. 东帝汶

分组

法国PMSI(英语:Programme de Médicalization des Systèmes d'Information)中使用的官方ATIH分组引擎的节点js包装.

这个软件包可以将本地的C类组群模块整合起来,将住院时间分类为: 德国 (Homogène de Malades集团)和 全球统一制度 (Groupe Homogène de Séjours)代码,符合法国的T2A计费制度.

概览

本项目使用 : 节点- API 来包装官方的 ATIH 分组引擎。 分组引擎是法国医疗系统计费和分类基础设施的重要组成部分.

法国医学编码背景

法国的卫生保健系统使用PMSI(信息系统医疗方案),在T2A(Tadization Àl'Activité)系统下进行医疗活动编码和医院收费。 这个项目具体解决了将医疗停留自动分为标准化类别的必要性.

关于法国分组算法和医学编码的综合背景,请参见此 详细概览。 。 。 .

技术架构

该套装包括:

  1. 原产地 C/C++ 模块: 核心 ATIH 分组引擎 atih/ 文件夹(参见 doc/atih/分组 方法.md(中文(简体) )
  2. Java脚本接口:高级节点js API in src/ 将 JS 对象转换为 ATIH RSS 字符串并解析本地结果
  3. 类型定义: 用于发展支持的脚本类型定义
  4. 运行时间数据: ATIH 参考表,随包一起运出 tables/V2024, (中文(简体) ), tables/V2025, (中文(简体) ), tables/V2026

仓库布局

路径目的
atih/ATIH分组引擎的原生C源(grouping/)和FICUM控制模块(ficum/(中文(简体) )
src/类型脚本 API : exports/ (公共职能+类型), utils/ (RUM型号,022/023格式序列器,enums)
tables/V{2024,2025,2026}/ATIH 按年在运行时间装入的参考表格
atih/smr/, (中文(简体) ), tables/SMR/{2025,2026}/, (中文(简体) ), lib/SMR/FG SMR: ATIH 源 (未修改), N- API 包装器, 二进制表格, 标签文件(参见 FG 工管关系(中文(简体) )
lib/, (中文(简体) ), txt/支持 ATIH 数据文件
doc/ATIH 格式规格和出版的运行本
tools/grouping-fixtures/从AlphaCode API中获取确定性测试固定装置的工具(见它 读取(中文(简体) )
src/tests/fixtures/已捕获 .case.json 组合测试套件所主张的固定装置

本地引擎加载相对于 软件包根 (通过 require.resolve('@beparallel/grouping/package.json')),而不是消费应用程序的工作目录. 这个 tables/, (中文(简体) ), lib/,以及 txt/ 文件夹是已出版的 tarball (files 内 package.json) (中文(简体) ).

公共 API

软件包的切入点导出分组函数、错误模型和所有类型:

import {
  grpMco, // grpMco(input) picks the engine from the discharge dates; grpMco(input, { edition }) forces one
  selectMcoEdition,
  MCO_EDITIONS,
  McoEngineUnavailableError,
  grp, // deprecated: like grpMco(input), but silently falls back to 2026
  grp2024,
  grp2025,
  grp2026,
  GroupingError,
  BlockingErrorGroup,
  RUMEnums // TYPE_ETAB, RUM_ENTRY_MODE, RUM_EXIT_MODE, ...
} from '@beparallel/grouping'

导入包装入没有本地加通: 每个 .node 文件被第一个需要它的呼叫所装入,一个缺失的被丢到那里,它的预期路径在下面 build/Release/ 以及如何获得pnpm prebuild:install 或者说 pnpm build:c:native) (中文(简体) ).

这个 RUMObject 财务报告和审定财务报表 TYPE_ETAB 用于构建输入的类型也可以从生成的类型路径中获取(这就是 AlphaCode 如何构建的) valuation 服务进口:

import type { RUMObject } from '@beparallel/grouping/dist/types/utils'

编辑选择 : grpMco

grpMco(input, options?) 第一组保留一个FG MCO版MCO_EDITIONS =: '2024', (中文(简体) ), '2025', (中文(简体) ), '2026')返回引擎的结果+ engineYear (单位:千美元)2024 | 2025 | 2026,运行的引擎;类型 GrpMcoResult:

  • grpMco(input, { edition: '2025' }) 运行精确 grp2025(input)不论出院日期如何 外边的版本 MCO_EDITIONS (单位:千美元)'2027',数字... ) McoEngineUnavailableError。 。 。 .
  • grpMco(input) 运行 selectMcoEdition(input.rumObjects): 第一个 2026, 2025, 2024 (英语) 结束 任意 卢姆 exitDate (单位:千美元)DDMMYYYY; RUM 无 exitDate (见注5) 两年内与退伍日期有关的缓期执行是最新的(31122025 + 键 02012026 → '2026') (中文(简体) ). 当卸货日期与发货版本不符时(完全没有,或 2023, (中文(简体) ), 2027...,它抛出 McoEngineUnavailableError 指定所看到的日期和已发运的版本.
  • selectMcoEdition(rumObjects) 被导出,以便调用者能够在分组前知道(或日志)版本,而无需重新执行规则.
  • 输入由 GrpMcoInputSchema (zod,严格在上层: { rumObjects, typeEtab }1至99卢比);a ZodError 否则会被扔出去。 RUM 字段由引擎检查(error code),和以前一样.

每版将 RUM 序列化为自己的格式: 023 (英语) 用于2026年, 022 (英语) 2025年和2024年的拨款. grp2024 编号 : grp2025 编号 : grp2026 仍可使用,也可返回 engineYear。 。 。 .

grp(input) 实值 已贬值: 它适用与 grpMco(input) 但是,当没有放出日期匹配时,记录一个控制台警告并默默运行2026引擎. 它维持现有呼叫者的行为 grpMco(input) (或 grpMco(input, { edition })相反.

投入

所有分组函数都取由 Zod 验证的单个对象 :

interface GroupingInput {
  rumObjects: RUMObject[] // one or more Résumés d'Unité Médicale
  typeEtab: TYPE_ETAB // 1 = PUBLIC_HOSPITAL (ex-DGF), 2 = PRIVATE_HOSPITAL (ex-OQN)
}

A 类 RUMObject 镜像 ATIH RSS 线条。 日期为 DDMMYYYY 字符串;诊断是CIM-10代码; ZAs 是CCAM的动作行。 一个真实( 抓取) 的例子 :

const input = {
  typeEtab: 1, // PUBLIC_HOSPITAL
  rumObjects: [
    {
      FINESS: '511928447',
      RSS: '22676886701954659349',
      RUM: '7319798297',
      birthDate: '22011959',
      sex: '1',
      uMed: 'RAC',
      entryDate: '19122025',
      entryMode: '8',
      exitDate: '22122025',
      exitMode: '8',
      nDA: 2,
      nZA: 5,
      DP: 'G553', // principal diagnosis
      DAs: ['M4806', 'E6694'], // associated diagnoses
      ZAs: [
        // CCAM acts
        { date: '19122025', code: 'LFFA001', phase: '0', act: '1', mod: 'JK', AN: '1', qty: '1' },
        { date: '19122025', code: 'LFAA002', phase: '0', act: '4', diag: '1', AN: '2', qty: '1' }
      ]
    }
  ]
}

const result = grpMco(input) // → 2025 engine (2025 discharge), result.engineYear === 2025

整个球场在 RUMObjectSchema (单位:千美元)src/utils/类型/rum.types.ts; 桶(出入境方式、性别、RAAC等) src/utils/类型/rum.enum.ts 和再出口为 RUMEnums对于更为完整的案例,请浏览以下所记录的案件: 弧/测试/固定/。 。 。 .

产出

每个函数都返回一年的具体结果(Grp2024Result 编号 : Grp2025Result 编号 : Grp2026Result,参见 市场/出口/类型/),加 (中文(简体) ) engineYear,形状像:

interface Grp2026Result {
  engineYear: 2026 // engine that ran (2024 | 2025 | 2026)
  returnCode: number // raw ATIH return code
  returnError: GroupingError | null // mapped error (null when grouping succeeded)
  grp_res: {
    // classification result
    cmd: string // Catégorie Majeure de Diagnostic
    ghm: string // Groupe Homogène de Malades
    version: string
    cret: string
  }
  ghs_val: { ghs: string /* + supplement/billing counters */ }
  rss_inf: { agea: number; dstot: number /* + diag/act lists, signatures */ }
}

错误模式

当引擎无法分组时, 它返回一个非零 returnCode,它被映射为 GroupingError 通过词典 市场/出口/管理不当/集团-管理不当数字 :

interface GroupingError {
  code: number
  errorName: string
  scope: string | null
  blockingErrorGroup: BlockingErrorGroup | null // 90Z00Z, 90Z01Z, 90Z02Z, 90Z03Z
  description: string
}

BlockingErrorGroup 区分强制控制错误与组-1/组-2阻塞错误和FG执行错误. 关于成功, returnError 实值 null 财务报告和审定财务报表 returnCode 实值 0。 。 。 .

FG SMR(医学和适应学院)

包件还包了 ATIH FG 工管关系 (分发) SourcesFGSMR2026_15,它搭载了2025和2026引擎). 留宿是周刊的套间 生殖健康; 引擎返回 a 格林尼治平时 (例如:. 0871UC1翻译: 0871,重新调整级别 U,重度级别 C严重性 1)和a 数据 格林尼治标准时 (关税类,例如:. 0858· ; 9999 = 未估值).

import { grpSmr, grpSmr2025, grpSmr2026, RHSObject, TYPE_ETAB, toSmrWeek } from '@beparallel/grouping'

const result = grpSmr({ rhsObjects: weeks /* RHSObject[], one per week, sorted */, typeEtab: TYPE_ETAB.PUBLIC_HOSPITAL })
result.gme // '0871UC1' (HC stays; HTP stays: per RHS in result.rhs[i].htp)
result.gmt // '0858'
result.severity // 1
result.returnCode // 0, or the smallest blocking error code (HTP: smallest non-zero rhs[i].returnCode)
result.returnError // SmrGroupingError | null (label from LIBERR.TXT)
result.rhs // per-week rows: GME, return code, errors, 90-day threshold position, weekly GMT...
  • 投入数字 : RHSObject 编号 : RHSObjectSchema (单位:千美元)斜弧/斜角/斜角/斜角/斜角/斜角)是一个RHS的命名域模型,序列化为固定宽度 M0D 软件 格式 (单位:千美元)m0d-格式图每个字段的M0D位置都在它的JSDoc. 日期为 DDMMYYYY· ; weekNumber 实值 WWYYYY (ISO周+ISO年,见 toSmrWeek()(三); presenceDays 是 7× 个 0/1,星期一至星期日; CIM-10 代码不写出点。 输入用 zod 验证(GrpSmrInputSchema,严格:未知密钥为出错; 1 smrStayNumber,周排序,38,210-特征引擎缓冲器内的每行;医学有效性作为引擎出错代码回来.
  • 引擎选择数字 : grpSmr2025 编号 : grpSmr2026 强制引擎( r)annee_transmission =该年). grpSmr 跟着ATIH的调度器 fgsmrmain.c页:1 上次访问 决定HC vs HTP;HC去FG 2026,当其上个星期为 01/2026,其他FG 2025,并在第90个存在日(或排出日)于01/01/2026之前被重新组合为FG 2025;HTP RHS跟随自己的一周(绕一周) 01/2026) (中文(简体) ). 它会扔 SmrEngineUnavailableError 当 FG 2024 (前几周) 09/2025)或需要FG 2027+. result.routing 说哪条规则适用. grpSmr(input, { edition: '2025' | '2026' }) 强迫一个版本(结果与 grpSmr2025 编号 : grpSmr2026; 未在 SMR_EDITIONS 掷出 SmrEngineUnavailableError 而不是回到调度员。 2025版开始于ISO周 09/2025 (2025年2月24日星期一,日内瓦), SMR_FIRST_WEEK_2025在2025年竞选活动正式开始前一周(2025年3月3日星期一,第10周).
  • 估价:在自己的竞选活动中停留的每个部分. grpSmr 复制 fgsmrmain.c 用于路由,GMEE,还原代码,出错和每2026个值,但故意不用于2025个部分. ATIH的可执行性在2026年的传输模式下运行了FG 2025(英语:annee_transmission = 2026N -1重新集结的HC会报告GMT的停留 9999 从90天起,每周格林尼治标准时间 9999 前几周为零天 01/2026; HTP RHS 2025周获得0个值日. grpSmr 返回那里真实的 FG 2025 值(FG 2025 运行与 annee_transmission = 2025在一个HTP 分裂的周01/2026 页:1 previousEditionValuation (加上该行自己的2026年估值). 定值价格(gmt, (中文(简体) ), hc关税: engineYear 编号 : version,每星期格林尼治平时加收 rhs[i].weeklyGmtEngineYear中,每行HTP的关税 rhs[i].engineYear 联合国 previousEditionValuation 那个部分 engineYear2025年竞选时的账单. src/tests/grouping-smr-reference.test.ts 比较 grpSmr 产出 fgsmrmain.c 和钉住这些差异.
  • 模式数字 : mode: SmrGroupingMode.VALORISATION (违约,“第1组”,用于计费)或 DESCRIPTION (“第2组”,GMED).
  • 原生边: 一个加词 grpsmr.node (两个引擎),与MCO加法分开;表格 tables/SMR/<year>/。ATIH 文档下 atih/smr/SRCV2025|SRCV2026 可移植性处理于 binding.gyp (见关于 grpsmr 目标)和 atih/smr/compat/malloc.h,以及 .gitattributes 保持正常的CRLF线的结束。 引擎状态为 process-global:不要调用几个 SMR 函数 worker_threads 马上.

如何建造

构建管道有两个阶段:本土C编译和TypeScript编译. 预建二进制通过GitHub Releases发售,因此消费者不需要本地C工具链.

土著汇编

node-gyp 汇编定义的 ATIH C 源文件 binding.gyp 输入 .node 二进制加分. 确定了四个目标:

  • 缩写 - FG MCO 2025 + 2026 在一个加法中(FG分布与 2025+ 2026 保持: fgmco_2026 + SRCV2025/2026,一次编译),出口 grp_2025_wrapper (使用时间: grp2025和 grp_2026_wrapper (使用时间: grp2026) (中文(简体) ). 两种包装没有修改: grp_mco_2025_unit.c 编号 : grp_mco_2026_unit.c 编译每个 Init 重新命名及其编号 NAPI_MODULE 已删除,以及 grp_mco_module.c 注册模块。 (在此之前,同一来源曾两次连通,与 grp2025.node 财务报告和审定财务报表 grp2026.node. ) (中文(简体) )
  • grp2024 (英语) - 留下2024个fgmco_2025 + SRCV2024/2025 (中文(简体) )
  • grpsmr (英语) - FG SMR 2025 + 2026年(atih/smr/,参见 FG 工管关系(中文(简体) )
  • 事实 - FICUM控制模块(UM授权文件生成/验证)

以 :

pnpm build:c:native

类型脚本汇编

tsc 汇编 src/ 输入普通JS输出的目录 dist/,将类型声明发布到 dist/types/。 。 。 .

pnpm build:ts

地方发展

# Use the pinned Node version (.nvmrc → 24.14.0)
nvm use 24

pnpm install

# Install prebuilt native binaries. `prebuild:install` resolves them in this order:
#   1. If GITHUB_TOKEN is set -> download from the GitHub Release.
#   2. Otherwise -> extract a matching tarball committed under prebuilds/.
#   3. If neither works -> prints guidance to build from source.
pnpm prebuild:install

# Optional: only needed for the remote download path
# cp .env-example .env.dev   # set GITHUB_TOKEN
# export GITHUB_TOKEN=...    # token with access to the GitHub Releases

# ...or compile the native modules from source (needs python3, make, g++)
pnpm build:c:native

pnpm test

运行测试

测试需要首先编译本土C模块. 这个 pretest 脚本自动处理 :

pnpm test

这个运行 pnpm build:c:native (通过 pretest 钩子) jest。当 C 代码不变时跳过本地重建:

npx jest

只运行分组固定套件 :

pnpm test:fixtures

要运行特定测试文件 :

npx jest src/tests/grouping.test.ts
npx jest src/tests/ficum.test.ts

在有意改变行为后更新快照:

npx jest --updateSnapshot

测试固定装置

组合套房由捕获驱动 .case.json 固定装置 src/tests/fixtures/**自动发现 斜弧/测试/固定/装载器.ts 并声称 src/测试/分组. test.ts。 。 。 .

由 AlphaCode 生成固定元件 compare-to-reference-grouping 使用 API 响应 pnpm capture-fixtures。见 工具/分组固定/README.md 用于完整抓取工作流程,Metabase基线查询,以及匹配与匹配的地块.

预建二进制

为避免要求消费者在当地编译C代码,该项目使用 prebuild 财务报告和审定财务报表 prebuild-install 加上一个小包装, 加一个本地反弹:

  • 目录: 每个焦油球包括: 全部 本地目标来自 binding.gyp—— 说build/Release/grp2024.node, (中文(简体) ), grpmco.node, (中文(简体) ), grpsmr.node,以及 ficum.node在与本地人相同的道路上 node-gyp 建筑(scripts/install-prebuild.cjs 检查这四个。 这个 binary.module_name 输入 package.json (单位:千美元)grpmco)是资产名称 prebuild-install 解析此软件包; 它确实 没有 表示只运出单一文件 .
  • 出版: 在版本标签上, .github/workflows/prebuild.yml 创建 GitHub 发布并运行 prebuild 打开 最高级 财务报告和审定财务报表 最高级 (节点ABI与CI对齐),每OS/arch矩阵行上传一发柏油球. 同样的工作流程也支持 workflow_dispatch (手工运行),在这种情况下,它会构建相同的矩阵,但上传到 工作流程文物 而不是释放 - 所以维护者可以将其拉到本地 pnpm prebuild:download 并将它们置于 prebuilds/。 。 。 .
  • 安装: 消费者运行 pnpm prebuild:install (见 scripts/install-prebuild.cjs) (中文(简体) ). 包装器按此顺序解决二进制 :
    1. 若为 GITHUB_TOKEN 已经确定,代表 prebuild-install -T $GITHUB_TOKEN (从 GitHub 发布主机下载).
    2. 否则( 或失败时) 检测 libc 通过 detect-libc 并按顺序将候选柏油球列表放入 prebuilds/<scope>/数字 :
      • glibc Linux : linuxglibc-{arch} 接下来 linux-{arch}
      • macOS / 其他 : {platform}-{arch}
    3. 第一个现有候选人被提取到包根中, 充入 build/Release/如果不存在,则用指向 pnpm prebuild:create (建造当地柏油球)或 pnpm build:c:native (编自出处. 使用 pnpm prebuild:install:remote 绕过包装并运行原始 prebuild-install -T $GITHUB_TOKEN 直接说.
  • 坚固的焦油丸: 手册制作的矩阵 prebuild.yml 运行可以在 prebuilds/ 并经由 files 阵列 package.json。在匹配中结束消费者 node_abi + 键 platform + 键 arch 因此,不需要安装一个符号。 承诺集的被钉住的节点ABI是 .nvmrc 发布时(目前) 24.14.0 (简体中文)) (中文(简体) ).
  • 邮购数字 : postinstall 运行 pnpm build,用于汇编 仅类型脚本。下载预建为 没有 自动; 运行 prebuild:install 安装后,或从源头编译出所有信息 pnpm build:c:native 在软件包目录中.

CI 管道

工作流程触发目的
prebuild.yml推动标签 v* 手动Tag push:创建 GitHub 释放并上传预建(macos x64/arm64,linux glibc x64/arm64). 手动发送: 建立相同的矩阵并上传工作流程的文物( 下载与 pnpm prebuild:download(中文(简体) )
test.yml调取请求使用节点版本运行测试 .nvmrc

软件包管理器

项目使用 小时,通过 corepack 通过 packageManager 输入 package.json。 。 。 .

安装

  1. 安装软件包
pnpm add @beparallel/grouping
  1. (可选)导出一个 GitHub 托肯

包裹船在下方装了预制的柏油丸 prebuilds/ 支助 node_abi + 键 platform + 键 arch 组合,所以一个符号是 没有 当您的运行时间符合此设定时需要。 只有在您需要从 GitHub Release 主机下载新构建时( 如在节点版本或未覆盖的拱上) 设置一个符号 :

export GITHUB_TOKEN=your_github_token

或设置在.env.dev文件中并运行 dotenv -f .env.dev run XXX。 。 。 .

  1. 安装本地模块
cd node_modules/@beparallel/grouping && pnpm prebuild:install

prebuild:install 将尝试 GITHUB_TOKEN 如果设定了,则先取出承诺的本地焦油丸。 如果两个路径都没有产生二进制,则会打印指导 pnpm prebuild:create 或者说 pnpm build:c:native。 。 。 .

在AlphaCode的单列上,这个步骤被接入 valuation 作为 grouping:build 剧本.

所需资源

  • 节点.js 24.0.0以上(回波针) 24.14.0 (简体中文) 内 .nvmrc(中文(简体) )
  • 兼容 macOS 和 Linux( Windows 不支持)
  • 对于 本地语言 分组: 运行 prebuild:install 添加依赖性后( 编译了下载) .node 文件),或安装 C 工具链(python3, (中文(简体) ), make, (中文(简体) ), g++运行 pnpm build:c:native 包内

* 额外资源

释放过程

东帝汶

非分组 022/023 (中文(简体) ) RSS 序列化在以下代码中执行 rum/formats/surc/ utils/rum/formats/ (中文(简体) ) 而不是一个独立的医生.

版本与发布记录

@beparallel/grouping 共发布 103 个版本,首次发布于 2025/06/07;过去 12 个月发布了 28 个版本。

版本发布日期距今
1.3.1latest2026/10/1427 天前
1.3.02026/10/1228 天前
1.2.12026/09/221 个月前
1.2.02026/09/072 个月前
1.1.12026/08/262 个月前
1.1.02026/08/252 个月前

关于 @beparallel/grouping 的常见问题

@beparallel/grouping 是什么?

法国医院医疗编码中使用的官方ATIH分组引擎(PMSI GHM/GHS)的Node.js包装器. 该套件提供了本地C组群模块,用于将住院病人分类为GHM和GHS代码,作为PMSI/T2A系统的一部分

如何安装 @beparallel/grouping?

在项目目录运行 npm install @beparallel/grouping,或使用 pnpm add / yarn add / bun add。它还提供命令行工具 grouping-build,可以用 npx grouping-build 直接运行。

@beparallel/grouping 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@beparallel/grouping 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@beparallel/grouping 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=24.0.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@beparallel/grouping 可以商用吗?

@beparallel/grouping 使用 未声明 许可。package.json 没有声明许可证。没有许可证的代码默认保留全部权利,商用前请联系作者或查看仓库中的 LICENSE 文件。以上为概括,不构成法律意见,请以许可原文为准。

@beparallel/grouping 的下载量有多少?

根据 npm 官方下载统计,@beparallel/grouping 在 2026/10/08 – 2026/11/06 这 30 天内被下载 1,746 次,日均约 58 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@beparallel/grouping 还在维护吗?

最新版本 1.3.1 发布于 2026/10/14(27 天前);至今共发布 103 个版本,其中过去 12 个月发布了 28 个;首次发布于 2025/06/07。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。