操作脚本(ACTIVITY)
配套:表单/视图下 {名}.activity(见 generate-form-file / generate-view-file)。属性多为 camelCase + CDATA。
标签
| 项 |
内容 |
| Label |
ACTIVITY:LABEL |
| 属性 |
动态名称脚本(若启用) |
| 触发 |
渲染操作按钮 |
| 返回 |
String;按钮显示名 |
(function () {
return "提交";
})()
前置
执行前
| 项 |
内容 |
| Label |
ACTIVITY:BEFORE |
| 属性 |
beforeActionScript |
| 触发 |
动作执行前 |
| 返回 |
空 / 警告 String / Message(Confirm、Alert);阻止或确认依返回 |
(function () {
return createConfirm("确定继续?");
})()
映射表单唯一(保存前置)
映射表单(type=65536)业务键唯一:**不要**在前置里调 checkFieldUnique / $SQL。用 queryBySQL 查 mappingStr.tableName,命中则 createAlert 阻止保存。建议同时写字段 validaterule(见 form.md#字段唯一编码重复)与「保存」「保存并返回」的 beforeActionScript。
(function () {
var code = getItemValueAsString("code");
if (code == null || code === "") {
return "";
}
var mappingId = getItemValueAsString("MAPPINGID");
var safe = String(code).replace(/'/g, "''");
var sql = "SELECT ID FROM MD_ISO_CATEGORY WHERE CODE='" + safe + "'";
if (mappingId != null && mappingId !== "") {
sql += " AND ID<>'" + String(mappingId).replace(/'/g, "''") + "'";
}
try {
var docs = queryBySQL(sql);
if (docs != null && docs.size() > 0) {
return createAlert("分类编码已存在,不能重复");
}
} catch (e) {
return createAlert("分类编码唯一性校验失败:" + e);
}
return "";
})()
表名/列名按实际 mappingStr 替换;编辑态用 MAPPINGID 排除本行。
业务引用键:用编码查主数据(硬规则)
在业务实现过程中,避免使用 XXID,而应用由业务含义的 XX编码。ID 通常为无意义的非重复序列号。
- 库存扣减、时段冲突、主数据存在性校验等:
queryBySQL / UPDATE 优先按 CODE(或车牌等业务键)定位 MD_* 行;名称仅作辅助
- **禁止**默认用流水里存的文档 id /
getId() 去等值匹配 MD_*.ID(易与 T_DOCUMENT.ID 混淆导致「用品不存在」)
- 若存量字段仍是
*Id,脚本侧至少做:ID → T_DOCUMENT.MAPPINGID → NAME/CODE 回退;**新建**一律落 *Code
会议室/用车时段冲突(保存前置)
普通事务表(TLK_*)同资源时段互斥:在「保存」「保存并返回」「流程处理」的 beforeActionScript 用 queryBySQL 查重叠行,命中则 createAlert。重叠条件:EXIST.START < NEW.END AND EXIST.END > NEW.START;排除本单 ID、已取消状态;资源键优先用业务编码/车牌,缺省才用名称快照(勿默认无含义 *Id)。结束时间字段可另写 validaterule(返回提示字符串,勿用 createAlert)。
(function () {
var roomId = getItemValueAsString("roomId");
var roomName = getItemValueAsString("roomName");
var startTime = getItemValueAsString("startTime");
var endTime = getItemValueAsString("endTime");
if ((!roomId && !roomName) || !startTime || !endTime) return "";
function esc(s) { return String(s).replace(/'/g, "''"); }
var sql = "SELECT ID FROM TLK_MEETING WHERE ";
sql += roomId
? ("ITEM_ROOMID='" + esc(roomId) + "'")
: ("ITEM_ROOMNAME='" + esc(roomName) + "'");
sql += " AND ITEM_STARTTIME < '" + esc(endTime) + "'"
+ " AND ITEM_ENDTIME > '" + esc(startTime) + "'"
+ " AND (ITEM_STATUS IS NULL OR ITEM_STATUS='' OR ITEM_STATUS<>'已取消')";
var id = String(getCurrentDocument().getId() || "");
if (id && id !== "null") sql += " AND ID<>'" + esc(id) + "'";
var docs = queryBySQL(sql);
if (docs != null && docs.size() > 0) {
return createAlert("会议室时段冲突:该会议室在所选时间段内已被预约,请调整时间或更换会议室");
}
return "";
})()
列名随动态表约定:ITEM_ + 字段 name 全大写(如 roomName→ITEM_ROOMNAME,startTime→ITEM_STARTTIME)。勿按 SCHEMA 文档里的下划线列名去查库。改盘后须 clear_cache。
用车同理:表 TLK_VEHICLEUSE,资源列 ITEM_VEHICLEID / ITEM_VEHICLEPLATE;起止建议 YMD_HM;旧纯日期(起止相等)用 DATE_ADD(ITEM_STARTTIME, INTERVAL 1 DAY) 视作结束;命中提示「用车时段冲突:…」。
回撤前
| 项 |
内容 |
| Label |
ACTIVITY:BEFORE_RETRACT |
| 属性 |
retractBeforeActionScript |
| 触发 |
回撤前 |
| 返回 |
同前置 |
动作
自定义脚本动作
| 项 |
内容 |
| Label |
ACTIVITY:SCRIPT_ACTION |
| 属性 |
actionScript(如 type=13 且脚本模式) |
| 触发 |
点击操作 |
| 返回 |
依动作设计(常副作用;可配合 actionType 跳转等) |
(function () {
println("custom action");
})()
后置
执行后
| 项 |
内容 |
| Label |
ACTIVITY:AFTER |
| 属性 |
afterActionScript |
| 触发 |
动作成功后 |
| 返回 |
无强制 |
(function () {
// 通知、写日志等
})()
回撤后
| 项 |
内容 |
| Label |
ACTIVITY:AFTER_RETRACT |
| 属性 |
retractAfterActionScript |
| 触发 |
回撤后 |
| 返回 |
无强制 |
隐藏只读
隐藏
| 项 |
内容 |
| Label |
ACTIVITY:HIDDEN |
| 属性 |
hiddenScript |
| 触发 |
渲染工具栏 |
| 返回 |
Boolean;true=隐藏按钮 |
(function () {
return false;
})()
只读
| 项 |
内容 |
| Label |
ACTIVITY:READONLY |
| 属性 |
readonlyScript |
| 触发 |
渲染工具栏 |
| 返回 |
Boolean;true=只读/不可点 |
(function () {
return false;
})()
跳转 / 文件名 / 启动流程
跳转 URL
| 项 |
内容 |
| Label |
ACTIVITY:DISPATCHERURL |
| 属性 |
actionDispatcherUrlScript |
| 触发 |
跳转类动作 |
| 返回 |
String URL |
(function () {
return "/portal/index";
})()
下载文件名
| 项 |
内容 |
| Label |
ACTIVITY:FILENAME |
| 属性 |
fileNameScript |
| 触发 |
文件下载类动作 |
| 返回 |
String;文件名 |
(function () {
return "export.xlsx";
})()
启动流程
| 项 |
内容 |
| Label |
ACTIVITY:STARTFLOW |
| 属性 |
startFlowScript(editMode=1) |
| 触发 |
流程启动操作 |
| 返回 |
流程定义 id(或产品约定标识) |
(function () {
return "FLOW_DEFINITION_ID";
})()