跳转至

操作脚本(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";
})()