# 培训任务表单 · JNPF 设计器配置 对着设计器逐项勾。表单名建议:**培训任务**;设计表:`tms_task`;主键系统自带。 老表:`LIMS_TRAINING_TASK`。发布后还会写个人任务、培训记录、视频进度、考试计划,那些用按钮事件/代码块,不要全堆进这一张表单。 --- ## 1. 表单属性 | 项 | 建议值 | |---|---| | 表单类型 | 普通表单(跨月/在岗/临时走流程时,另做流程表单或本表开启流程) | | 表名 | tms_task | | 列表 | 开启 | | 树形 | 否 | | 单据规则 | 培训任务流水号 → serial_no;发布后再生成培训编号 → task_no | | 权限 | 培训管理员可增改发;学员只读个人任务,不进本表 | 状态驱动编辑(整表公式,后文字段「能否编辑」都引用它): - 新增 / `status == 培训未发布`:可编辑 - `status == 培训已发布`:只许改地点冲突以外的非关键字段,建议整单只读,仅保留终止、归档、发起评估 - `status == 培训已完成` 或 `培训已终止`:只读 --- ## 2. 页面布局(4 个页签 + 1 个子表) | 页签 | 放什么 | |---|---| | 基本信息 | 主题、编号、来源、分类、方式、状态 | | 时间地点 | 开始/结束/关闭、月份、地点 | | 人员组织 | 对象、培训师、发起人、部门 | | 教材考核 | 教材、视频、考核、试卷、掌握程度、评估状态 | | 底部子表 | 教材/附件清单 tms_task_file | 不要把签到人员子表做进本表(那是培训记录的子表)。本表用「关联列表」挂:个人任务、培训记录。 --- ## 3. 字段清单(设计器逐行配) 控件名按 JNPF 6.x:单行 / 多行 / 数字 / 日期时间 / 下拉 / 开关 / 用户 / 组织 / 岗位 / 关联表单 / 弹窗选择 / 附件 / 流水号。 ### 3.1 页签「基本信息」 | 字段名 | 显示名 | 控件 | 必填 | 默认 | 数据源 | 能否编辑 | 说明 | |---|---|---|---|---|---|---|---| | subject | 培训主题 | 单行 | 是 | | | 未发布 | 老 LTT01 | | serial_no | 任务流水号 | 流水号 | 是 | 规则自动 | 单据规则「培训任务流水号」 | 只读 | 老 LTT49,保存即生成 | | task_no | 培训编号 | 单行 | 否 | | | 只读 | 老 LTT19,**发布时**生成,列表检索用 | | first_no | 首次编号 | 单行 | 否 | | | 只读 | 老 LTT50,二次培训才有 | | category | 培训分类 | 下拉 | 是 | | 字典:来源类型里的分类,或单独「培训分类」 | 未发布 | 老 LTT04。选项至少含:计划培训、临时培训。送审/发布按钮靠它判断 | | train_mode | 培训方式 | 下拉 | 是 | | 字典「培训方式」 | 未发布 | 老 LTT05。现场讲课/现场开课 → 地点必填;在线学习 → 教材必填 | | source_type | 来源类型 | 下拉 | 是 | | 字典:年度计划 / 岗位计划 / 临时培训 / 文件培训 | 未发布 | 老 LTT35。年计划=1、临时=3 | | source_form | 来源单据 | 关联表单 | 条件必填 | | 按 source_type 切:年计划 / 岗计划 / 临时需求 | 未发布 | 带出 source_no、source_item_id、主题、对象等 | | source_no | 来源编号 | 单行 | 否 | 关联带出 | | 只读 | 老 LTT23 | | source_item_id | 来源子表ID | 单行 | 否 | 关联带出 | | 隐藏 | 老 LTT20 / LTT54,归档回写计划行 | | source_kind | 来源类别 | 下拉 | 否 | | 字典「来源类别」 | 隐藏或只读 | 老 LTT55 | | status | 任务状态 | 下拉 | 是 | 培训未发布 | 字典「任务状态」 | 只读 | 老 LTT16,只允许按钮改 | | second_flag | 二次培训 | 开关 | 否 | 关 | | 只读 | 老 LTT63 | **联动(基本信息)** 1. `source_type` 变化 → 切换 `source_form` 关联的目标表单;清空已选来源。 2. 选中年计划子表行 → 带出:subject←内容,train_mode,trainees,teacher,exam_type,mastery,month,material。 3. 选中临时需求子表行 → 带出:subject,start_time,train_mode,exam_type,material,exec_dept,starter,belong_dept。 4. `category == 临时培训` 时,列表「发布」隐藏,走「临时送审」。 5. 岗计划且计划类型=在岗培训:隐藏「发布」,只显示「送审」(老 `fabu`:在岗培训需走送审)。 ### 3.2 页签「时间地点」 | 字段名 | 显示名 | 控件 | 必填 | 默认 | 说明 | |---|---|---|---|---|---| | start_time | 培训开始时间 | 日期时间 | 是 | | 老 LTT02。未发布时可改。校验:不得早于当前时间(已发布回看时跳过) | | end_time | 培训结束时间 | 日期时间 | 是 | | 老 LTT21。须 ≥ start_time | | close_time | 培训关闭时间 | 日期时间 | 是 | | 老 LTT14。须 ≥ end_time | | month | 培训月份 | 下拉 1-12 | 否 | 取 start_time 的月 | 老 LTT47。年计划带入。**跨月判断用 start_time 的月份,不是这个字段单独判断** | | place | 培训地点 | 关联表单「培训地点」 | 条件 | | 老 LTT22(前端校验用的地点)/ LTT03。方式含「现场」时必填 | | place_occupied | 地点占用 | 开关 | 否 | | 隐藏,接口回写;冲突时阻止保存 | | publish_time | 发布时间 | 日期时间 | 否 | | 只读,发布按钮写入,老 LTT31 | | plan_time | 通知用培训时间 | 日期时间 | 否 | 同 start_time | 可隐藏,老 LTT11 | | next_train_time | 下次培训时间 | 日期 | 否 | | 老 LTT37 | | notified | 是否已通知 | 开关 | 否 | 关 | 只读,老 LTT12 | **校验(保存 / 发布前,公式或 JS)** ``` start_time <= end_time end_time <= close_time 若可编辑且 start_time < 当前时间 → 报「开始时间不能小于当前时间」 若 train_mode 含 现场讲课/现场开课 且 place 空 → 报「请选择培训地点」 start_time 不得早于 publish_time(发布后的二次校验,老 isEarly) 同一 place 在 [start_time, end_time] 内不得与其他未终止任务重叠(老地点占用) ``` 地点变化时,若 place 被清空,同步清空显示名(老 emptyPlace)。 ### 3.3 页签「人员组织」 | 字段名 | 显示名 | 控件 | 必填 | 多选 | 说明 | |---|---|---|---|---|---| | trainees | 培训对象 | 用户选择(可兼岗位/部门,能展开到人) | 是 | 是 | 老 LTT06。发布时按人拆个人任务 | | teacher | 培训师 | 用户选择 | 条件 | 是 | 老 LTT07。自学/外派可空 | | author | 制定人 | 用户 | 否 | 否 | 老 LTT13,默认当前用户 | | starter | 发起人 | 用户 | 否 | 否 | 老 LTT30,临时需求=申请人 | | belong_dept | 所属部门 | 组织 | 否 | 否 | 老 LTT33 | | start_dept | 发起部门 | 组织 | 否 | 否 | 不要和 source_type 共用字段 | | exec_dept | 执行部门 | 组织 | 否 | 否 | 老 LTT36 / LTT52 | | train_dept | 培训部门 | 组织 | 否 | 否 | 老 LTT42 | | floor_no | 楼层 | 单行 | 否 | | 老 LTT65,岗计划带出 | | area_no | 车间/功能区 | 单行 | 否 | | 老 LTT64 | 对象组件建议:JNPF「用户选择」开启部门/岗位,保存存用户 ID 数组。发布事件里按 ID 展开,不要把部门 ID 直接写进个人任务。 ### 3.4 页签「教材考核」 | 字段名 | 显示名 | 控件 | 必填 | 显示条件 | 说明 | |---|---|---|---|---|---| | material_id | 培训教材 | 关联表单 tms_material | 条件 | 在线学习必填 | 带出 material_no、media_no、version、是否视频 | | material_no | 教材编号 | 单行 | 否 | | 只读,老 LTT17 | | media_no | 媒体号 | 单行 | 否 | | 只读,老 LTT18 | | version | 资料版本 | 单行 | 否 | | 只读,老 LTT60 | | video_id | 培训视频 | 关联表单/附件 | 否 | 教材类型=视频时显示 | 老 LTT38 / LTT22 | | exam_type | 考核方式 | 下拉 | 是 | | 字典:考试 / 实操 / 评估 / 无。老 LTT29、前端校验读的是 LTT09,JNPF 只保留 exam_type | | paper_id | 试卷 | 关联表单「试卷」 | 条件 | exam_type==考试 | 老 LTT25。送审/发布前必填 | | exam_start | 开考时间 | 日期时间 | 否 | exam_type==考试 | 对应挂卷 LTT26,**不要**和个人任务来源表混用 | | exam_end | 结考时间 | 日期时间 | 否 | exam_type==考试 | 老 LTT27 | | mastery | 掌握程度 | 下拉 | 否 | | 了解/熟悉/掌握,老 LTT48 | | eval_status | 课程评估状态 | 下拉 | 否 | | 只读。未发起 / 已发布 / 已停止。老 LTT59 | | hours | 学时 | 数字 | 否 | | 可从岗计划课时带入 | **显示/必填公式** ``` place 必填:train_mode 包含「现场」 material_id 必填:train_mode 包含「在线」或「自学」 paper_id 必填:exam_type == 考试 teacher 必填:train_mode 不是自学/外派 ``` ### 3.5 子表 tms_task_file(教材/附件清单) 对应老 `LIMS_TRAINING_TASK_SUB`。 | 字段名 | 显示名 | 控件 | 必填 | |---|---|---|---| | file_no | 编号 | 单行 / 关联教材带出 | 否 | | file_name | 文件名称 | 单行 | 是 | | version | 版本 | 单行 | 否 | | media | 多媒体/附件 | 附件 | 否 | 选主表教材后,可自动往子表插一行(老 setTrainTaskMedia)。 ### 3.6 系统字段(设计器默认勾上) 创建人、创建时间、修改人、修改时间。不必再建 author,除非业务上「制定人」≠ 创建人。 --- ## 4. 列表设计 | 列 | 字段 | 排序 | 检索 | |---|---|---|---| | 培训编号 | task_no | | 是 | | 培训主题 | subject | | 是 | | 来源类型 | source_type | | 是 | | 培训方式 | train_mode | | 是 | | 开始时间 | start_time | 默认倒序 | 日期范围 | | 结束时间 | end_time | | | | 地点 | place | | | | 状态 | status | | 是 | | 培训师 | teacher | | | | 发起人 | starter | | | | 所属部门 | belong_dept | | 是 | 列表按钮:新增、编辑(仅未发布)、删除(仅未发布且未生成个人任务)、发布、送审、终止、查看。 行样式:未发布灰、已发布蓝、已完成绿、已终止红。 --- ## 5. 按钮(设计器「按钮设置」+ 显示条件) | 按钮 | 位置 | 显示条件 | 动作 | |---|---|---|---| | 保存 | 表单 | 未发布 | 普通保存 | | 发布任务 | 表单+列表 | status=未发布 且 开始月份=当前月 且 category≠临时培训 且 不是在岗培训 | 先跑第 6 节校验,再跑发布脚本 | | 送审 | 表单 | 未发布 且(开始月份≠当前月 或 临时培训 或 在岗培训) | 提交流程 | | 临时送审 | 表单 | category=临时培训 | 提交「临时培训」流程,禁止拿计划任务走这条(老 tempsend) | | 计划送审 | 表单 | category≠临时培训 且 跨月 | 提交年/岗计划任务流程(老 notempsend / tempTraining 互斥) | | 实操送审 | 表单 | exam_type=实操 | 走实操考核流程;非实操点了要提示「考核方式不是实操考试」 | | 终止 | 表单+列表 | 已发布且未终止 | 调终止,防重复(老 isTaskStop) | | 归档 | 表单 | 已发布 | 校验全员签到/合格后改已完成,回写计划行 | | 发起课程评估 | 表单 | 已发布且 eval_status=未发起 | 生成评估单,eval_status=已发布;已发起则提示勿重复 | | 二次培训 | 表单 | 已完成或不合格需补训 | 复制任务,second_flag=开,first_no=原 task_no | | 在线签到入口 | 表单 | 已发布 | 先调「方式是否允许在线签到」,不允许则提示 | **当月 vs 跨月(老 songshenDate)** - 取 `start_time` 的月份。 - 等于当前月 且 不是临时培训:提示「执行时间在当月,无需送审,点发布即可」,拦截送审。 - 不等于当前月:提示「不在当前月份,如需提前执行请先送审」,拦截直接发布。 - 临时培训:即使当月也走临时送审,不走发布。 --- ## 6. 发布前校验(按这个顺序做公式 / JS) 1. subject、trainees、start_time、end_time、close_time 非空 2. 时间关系:现在 ≤ 开始 ≤ 结束 ≤ 关闭(已保存回看跳过「现在」) 3. 现场方式必须有 place 4. 在线/自学必须有 material_id 5. exam_type=考试 必须有 paper_id(老提示「请选择试卷」) 6. 地点时段未占用 7. 当月才能点发布;跨月请送审 8. 临时培训不能点发布 9. 在岗培训不能点发布,走送审 10. 来源单据若已生成过任务,拦截(老 checkPxxqPlan / isExist) --- ## 7. 发布成功脚本(代码块对照) 伪代码,JNPF 用「数据接口 + 代码块」实现: ``` status = 培训已发布 publish_time = now if task_no 空: task_no = 生成培训编号 notified = 是 for user in 展开(trainees): 插入 tms_person_task( task_id, train_no=task_no, subject, start_time, end_time, place, category, train_mode, user_id=user, teacher, material_no, video_id, person_status=未完成, exam_type, source_table=tms_task ) 若有视频章节: 插入 tms_video_learn(人 × 章节, progress=0, pass_flag=未完成) 插入 tms_record 主表(主题/编号/地点/方式/task_id/archived=否) for user in 展开(trainees): 插入 tms_record_person(user, sign_time 空, pass_flag 空) 若 exam_type==考试 且 paper_id: 插入或更新 tms_exam_plan(task_id, paper_id, exam_start, exam_end, status=1) 若来源是年计划子表: 该行 row_status=任务已发布 若来源是岗计划子表: 同上 发消息给 trainees + teacher ``` 归档脚本: ``` 校验:每个 record_person 都有 sign_time;exam_type 需要成绩/合格的,LZC19 等价字段已填 status = 培训已完成 record.archived = 是 来源计划行 row_status = 任务已完成 每人写一条 tms_person_file 子表(主题、时间、方式、合格、培训师) 按合格结果回写上岗/资质(若该课影响上岗) ``` --- ## 8. 关联表单「带出」映射 从年计划子表带出: | 目标字段 | 来源 | |---|---| | subject | content / LATPC03 | | train_mode | LATPC04 | | trainees | LATPC05 | | teacher | LATPC07 | | exam_type | LATPC08 | | material_id | LATPC12 | | mastery | LATPC19 | | month | LATPC02 | | source_item_id | 子表id | | source_no | 主表 plan_no | | source_type | 年度计划 | 从教材带出:material_no、media_no、version;类型=视频则赋 video_id。 从临时需求带出:见总册 3.3。 --- ## 9. 流程(仅送审走) 节点建议(按现场改):发起人 → 部门负责人 → 质量部 → 结束。 流程表单可复用本表,流程中锁定来源/对象,允许改时间地点。 通过后不要再手工点发布:流程结束事件直接跑第 7 节发布脚本。 驳回:保持未发布,可改后重提。 --- ## 10. 和「个人任务」「培训记录」的分工 | 谁用 | 表单 | 不要做的事 | |---|---|---| | 培训管理员 | 本表 培训任务 | 不要在本表里签到、打分 | | 学员 | tms_person_task | 不要改对象/教材/状态机 | | 签到/成绩 | tms_record 子表 | 不要把签到人做成任务子表 | 本表设计器「关联列表」建议挂两个: - 个人任务:过滤 task_id = 当前主键 - 培训记录:过滤 task_id = 当前主键 --- ## 11. 设计器勾选顺序(半小时过一遍) 1. 新建表 tms_task,先加第 3 节全部字段(先不要子表) 2. 配字典:任务状态、培训方式、考核方式、来源类型 3. 拖 4 个页签,把字段丢进去 4. 配必填和显示条件 5. 配流水号 serial_no 6. 加子表 tms_task_file 7. 配列表列和行按钮 8. 配发布/送审显示条件 9. 发布校验公式 10. 发布代码块先打日志,用一条测试数据跑通再写个人任务 配完字段后,下一步通常是:同样格式拆「个人任务」学员端,或先把发布代码块写成 JNPF 数据接口。