注意点

  • 脚本必须使用ES5以下的语法规则编写

表单(适用于主子表表单)

  1. // 使用对象
  2. dataForm
  3. // 获取表单信息
  4. getDataFormInfo()
  5. // 获取所有子表组件
  6. getAllSubTable()
  7. // 获取子表组件,subCode表示子表code
  8. getSubTable(subCode)
  9. /**
  10. * 添加表单字段监听
  11. * code: 表单字段code
  12. * callback: 子表字段值改变的回调
  13. */
  14. addFieldListening(code, callback)
  15. /**
  16. * 添加子表监听
  17. * code: 子表code
  18. * callback: 回调
  19. */
  20. addSubTableListening(code, callback)
  21. // 获取字段结构,code为表单字段code
  22. getDataItem(code)
  23. // 获取表单字段的值,code为表单字段code
  24. getDataItemValue(code)
  25. // 设置表单字段的值,code为表单字段code
  26. setDataItemValue(code, value)
  27. /**
  28. * 获取业务规则结果
  29. * rule: 规则字符串
  30. * 返回值: Promise对象
  31. */
  32. getBusinessRuleResult(rule)
  33. /**
  34. * 添加按钮前置
  35. * title: 按钮名称
  36. * callback: 回调
  37. */
  38. addButtonBefore(title, callback)
  39. /**
  40. * 隐藏表单字段或子表列
  41. * 当隐藏表单字段时,code为字段code
  42. * 当隐藏子表列时,code为[子表code].[子表列code]
  43. */
  44. hideComponentByCode(code, isHidden)
  45. // 隐藏显示表单按钮
  46. isHiddenButton(title, isHidden)
  47. // 刷新子表,subCode为子表code
  48. refreshSubTable(subCode)
  49. // 添加表单按钮加载完成的回调
  50. addformBtnLoadedListening(callback)
  51. // 关闭表单
  52. closeView()
  53. // 设置某个字段的附属属性
  54. setExtendAttributeByCode(code, key, value)
  55. /**
  56. * 执行按钮动作(仅在铁四院质量分支可用)
  57. */
  58. executeFormButtonAction(title)
  59. // 效验表单数据(仅在铁四院质量分支可用)
  60. validateData()

子表

  1. // 使用对象
  2. subTable
  3. // 添加子表加载完成的回调
  4. addLoadedCallback()
  5. /**
  6. * 显示或隐藏操作按钮
  7. * title: 按钮名称
  8. * isHidden: 是否隐藏
  9. */
  10. isHiddenButton(title, isHidden)
  11. /**
  12. * 添加按钮前置
  13. * title: 按钮名称
  14. * callback: 回调
  15. */
  16. addButtonBefore(title, callback)
  17. /**
  18. * 添加按钮后置
  19. * title: 按钮名称
  20. * callback: 回调
  21. */
  22. addButtonAfter(title, callback)
  23. /**
  24. * 列表数据拷贝
  25. * code: 拷贝的列
  26. * targetCode: 赋值的列
  27. */
  28. columnDataCopy(code, targetCode)

主表

  1. // 使用对象
  2. dataTable
  3. /**
  4. * 添加按钮前置
  5. * title: 按钮名称
  6. * callback: 回调
  7. */
  8. addButtonBefore(title, callback(datas, resolve))
  9. /**
  10. * 添加按钮后置-仅支持'删除'按钮
  11. * title: 按钮名称
  12. * callback: 回调
  13. */
  14. addButtonAfter(title, callback)
  15. /**
  16. * 获取选中的数据
  17. */
  18. getSelectedItems()
  19. /**
  20. * 设置列表的高级搜索值
  21. * value,必须为一对象,key为组件code
  22. * 如 {f_2b8984cbcd: '男','f_2b8984abcd':'一年级'}
  23. * 数字控件:必须为一数字区间,例 :{f_3da0dd965a: [4,7]}
  24. * 日期组件,CreatedTime,ModifiedTime,必须为一时间区间,例 : f_61834d2e76: ['2020-09-01 00:00:00','2020-10-01 23:59:59']
  25. * 下拉,多选,单选,必须为一数组 f_8d60829d65 :[{
  26. * name: "选项2",
  27. * selectionId: "选项2"
  28. * },{
  29. * name: "选项1",
  30. * selectionId: "选项1"
  31. * }]
  32. * 如果下拉关联其它数据源,则为: f_8d60829d65:[{
  33. * name: "湖北",
  34. * value: '01',
  35. * },{
  36. * name: "湖南",
  37. * value: '02',
  38. * }],
  39. * 如果为状态,则为一数组:'State':[{code: '0', name: '草稿'}]
  40. *
  41. * isSearchImmediate 是否设置后立即刷新列表
  42. */
  43. setSearchConditionValue(value,isSearchImmediate)

公共组件

  1. // 使用对象
  2. dataFormsubTabledataTable
  3. /**
  4. * element提供的公共组件
  5. * 请参考element文档[https://element.eleme.cn/#/zh-CN/component/message-box]
  6. */
  7. $message$alert
  8. // message目前支持warning,error,info
  9. dataForm.$message({
  10. type: "warning",
  11. message: "保存失败",
  12. });
  13. dataForm.$alert('保存失败,是否继续', '提示', {
  14. confirmButtonText: '确定',
  15. cancelButtonText: '取消',
  16. showCancelButton: true
  17. }).then(function () {
  18. // 确定回调
  19. }).catch(function () {
  20. // 取消回调
  21. });
  22. // 是否是移动端
  23. dataForm.$isMobile

公共接口

网络请求

  1. dataForm.$axios.get('http://localhost:8080/user?ID=12345')
  2. .then(function (response) {
  3. // handle success
  4. console.log(response);
  5. })
  6. .catch(function (error) {
  7. // handle error
  8. console.log(error);
  9. });
  10. dataForm.$axios.post('http://localhost:8080/user', {
  11. firstName: 'Fred',
  12. lastName: 'Flintstone'
  13. })
  14. .then(function (response) {
  15. console.log(response);
  16. })
  17. .catch(function (error) {
  18. console.log(error);
  19. });
  20. // response结构
  21. {
  22. // 接口返回的数据
  23. data: {},
  24. // 来自服务器响应的HTTP状态码
  25. status: 200,
  26. }

注意:禁止设置$axios.defaults.baseURL

  • $http: 基于axios的封装,用于平台的接口请求,例: ```javascript // 用户登录 dataForm.$http.GET(‘api/Organization/LoginByCode/‘ + code) .then(function (response) {
    1. if (response.Status !== 1) {
    2. dataForm.$message({
    3. type: "error",
    4. message: response.Message || '登录失败',
    });
    1. return;
    2. }
    3. console.log('登录信息', response.Result);
    }).catch(function (error) {
    1. console.log(error);
    });

// 获取表单信息 dataForm.$http.POST(‘api/Form/GetFormInfo’, parameters) .then(function (response) { if (response.Status !== 1) { dataForm.$message({ type: “error”, message: response.Message || ‘获取表单信息错误’, }); return; } console.log(‘表单信息’, response.Result); }).catch(function (error) { console.log(error); });

// response结构 { // 状态,1表示成功 Status: 1, // 数据 Result: {}, // 消息 Message: ‘’, }

  1. <a name="fHFZq"></a>
  2. ### 获取当前登录人信息
  3. ```javascript
  4. var userInfo = dataForm.$getUserInfo();
  5. console.log('当前登录人姓名:', userInfo.Name);
  6. console.log('当前登录人UserID:', userInfo.ObjectID);
  7. console.log('当前登录人Code:', userInfo.Code);
  8. console.log('当前登录人所在部门:', userInfo.ParentName);
  9. console.log('当前登录人所在部门ID:', userInfo.ParentID);

脚本占位符

脚本里的 ##keyName## 形式的字符串会被替换成全局配置字段keyName的内容。

  1. console.log('##RESTfulUrl##');
  2. dataForm.$axios('##RESTfulUrl##/api/getUserInfo').then(function(res) {
  3. // do something
  4. });

实例

实例一:统计行编辑子表的某个字段为是的数据数量

  1. // 监听子表
  2. dataForm.addSubTableListening(subCode,
  3. function() {
  4. var formInfo = dataForm.getDataFormInfo();
  5. var subCode = '6457f7126e';
  6. // 统计数据条数
  7. var rule1 = "ExecuteSql(\"select count(*) from i_" + subCode + " where ParentObjectID='" + formInfo.dataId + "'\")";
  8. dataForm.getBusinessRuleResult(rule1).then(function(res) {
  9. if (!res.Success) return;
  10. // 返回值必须经常两次JSON装换
  11. var count = JSON.parse(JSON.parse(res.Result));
  12. dataForm.setDataItemValue('f_3ce454dfce', count)
  13. });
  14. // 统计f_7ab2df8515值为1的数据条数
  15. var rule2 = "ExecuteSql(\"select count(*) from i_" + subCode + " where ParentObjectID='" + formInfo.dataId + "' and f_7ab2df8515='1'\")";
  16. dataForm.getBusinessRuleResult(rule2).then(function(res) {
  17. if (!res.Success) return;
  18. // 返回值必须经常两次JSON装换
  19. var count = JSON.parse(JSON.parse(res.Result));
  20. dataForm.setDataItemValue('f_3a72b3ba7a', count)
  21. });
  22. // 统计f_9c767352a2的合计
  23. var rule3 = "ExecuteSql(\"select sum(f_9c767352a2) from i_" + subCode + " where ParentObjectID='" + formInfo.dataId + "'\")";
  24. dataForm.getBusinessRuleResult(rule3).then(function(res) {
  25. if (!res.Success) return;
  26. // 返回值必须经常两次JSON装换
  27. var count = JSON.parse(JSON.parse(res.Result));
  28. dataForm.setDataItemValue('f_77f3b062f8', count)
  29. })
  30. });

image.png

实例二:在特定节点监听选人控件赋值

  1. // 获取表单信息
  2. var formInfo = dataForm.getDataFormInfo();
  3. // 判断当前表单是审批节点且不是查看模式
  4. if (formInfo.formExtensionInfo.CurrentActivityName === '审批' && formInfo.formViewType !== 'view') {
  5. // 回调
  6. var callback = function callback() {
  7. var rule = 'ExecuteSQLForObject("select name,code from t_user where ObjectID=\'{0}\'",{f_d48c24dac2_Id})';
  8. // 获取业务规则结果
  9. dataForm.getBusinessRuleResult(rule).then(function (res) {
  10. if (!res.Success) return;
  11. // 业务规则返回的是字符串,需要装换成自己需要的结构,比如字典或者数组
  12. var obj = JSON.parse(res.Result);
  13. // 设置表单字段的值
  14. dataForm.setDataItemValue('f_aa4c70edad', obj.name);
  15. dataForm.setDataItemValue('f_539d6ad0be', obj.code);
  16. });
  17. };
  18. // 获取人员控件是否有值,如果有值手动调用回调
  19. var value = dataForm.getDataItemValue('f_d48c24dac2');
  20. if (typeof value === 'string' && value.length > 0) {
  21. callback();
  22. }
  23. // 监听人员控件
  24. dataForm.addFieldListening('f_d48c24dac2', callback);
  25. }

image.png

实例三:主表字段控制子表按钮

  1. // 获取子表组件
  2. var table1 = dataForm.getSubTable('8fb1958f70');
  3. var table2 = dataForm.getSubTable('6e22eaa41f');
  4. var table3 = dataForm.getSubTable('195e075ebc');
  5. // 添加主表字段监听
  6. dataForm.addFieldListening('f_2b0901480f', function (val) {
  7. // 隐藏子表按钮
  8. table1.isHiddenButton('新建', val === '1');
  9. table2.isHiddenButton('新建', val === '1');
  10. table2.isHiddenButton('插入', val === '1');
  11. table3.isHiddenButton('新建', val === '1');
  12. table1.isHiddenButton('百度', val === '2');
  13. table2.isHiddenButton('谷歌', val === '2');
  14. });
  15. // 添加主表字段监听
  16. dataForm.addFieldListening('f_09607846f4', function (val) {
  17. // 隐藏子表按钮
  18. table1.isHiddenButton('查看', val === '1');
  19. table3.isHiddenButton('查看', val === '1');
  20. table1.isHiddenButton('编辑', val === '2');
  21. table3.isHiddenButton('编辑', val === '2');
  22. table1.isHiddenButton('删除', val === '3');
  23. table2.isHiddenButton('删除', val === '3');
  24. table3.isHiddenButton('删除', val === '3');
  25. });

实例四:表单提交效验字段是否填值

  1. // 添加保存按钮前置
  2. dataForm.addButtonBefore('保存', function (resolve) {
  3. // 获取表单字段的值
  4. var value = dataForm.getDataItemValue('f_e60d3a48cd');
  5. // 判断值是否为空
  6. if (typeof value !== 'string' || value.length <= 0) {
  7. // 弹出提示 目前message的type只支持error,warning,info
  8. dataForm.$message({
  9. type: "error",
  10. message: "字段a不能为空",
  11. });
  12. } else {
  13. // 不为空,继续后面的处理
  14. resolve();
  15. }
  16. });

实例五:子表删除按钮的前置和后置处理

  1. var subTable1 = dataForm.getSubTable('83be1068e6');
  2. // 添加删除按钮前置处理,同步处理,必须手动调用resolve才能让删除继续
  3. subTable1.addButtonBefore('删除', function (data, resolve) {
  4. // data为key-value的格式
  5. console.log('subTable1 delete before: ', data['f_123afsb2']);
  6. setTimeout(function () {
  7. resolve();
  8. }, 1000);
  9. });
  10. // 添加删除按钮后置处理,异步处理,不会等待回调处理
  11. subTable1.addButtonAfter('删除', function (data) {
  12. // data为key-value的格式
  13. console.log('subTable1 delete after: ', data['f_123afsb2']);
  14. });

实例六:隐藏表单字段和子表列

  1. // 添加字段监听
  2. dataForm.addFieldListening('f_57b8661128',
  3. function(val) {
  4. // 当监听的字段的值为1和3时隐藏字段`f_33aa1a4410`
  5. dataForm.hideComponentByCode('f_33aa1a4410', val === '1' || val === '3');
  6. // 当监听的字段的值为2和3时隐藏字段`f_5968a4e8c7`
  7. dataForm.hideComponentByCode('f_5968a4e8c7', val === '2' || val === '3');
  8. // 当监听的字段的值为1和3时隐藏子表`9411739038`的`f_33aa1a4410`列
  9. dataForm.hideComponentByCode('9411739038.f_28cbf99d7e', val === '1' || val === '3');
  10. // 当监听的字段的值为2和3时隐藏子表`9411739038`的`f_5968a4e8c7`列
  11. dataForm.hideComponentByCode('9411739038.f_8b4bb9ea39', val === '2' || val === '3')
  12. });

实例七:隐藏表单按钮

  1. var callback = function callback() {
  2. // 获取字段 f_81f0821c4e 的值
  3. var value = dataForm.getDataItemValue('f_81f0821c4e');
  4. // 隐藏按钮
  5. dataForm.isHiddenButton('保存', value === '1');
  6. dataForm.isHiddenButton('百度', value === '2');
  7. };
  8. // 添加表单按钮加载完成的回调
  9. dataForm.addformBtnLoadedListening(callback);
  10. // 添加字段 f_81f0821c4e 的监听
  11. dataForm.addFieldListening('f_81f0821c4e', callback);

实例八:移动端在某个流程节点下只能查看不能审批或编辑

  1. // 获取表单信息
  2. var formInfo = dataForm.getDataFormInfo();
  3. // 获取表单状态,新增、查看、编辑
  4. var formViewType = formInfo.formViewType;
  5. // 获取当前流程节点
  6. var activityName = formInfo.formExtensionInfo.CurrentActivityName;
  7. // 判断是否是移动端,表单的流程节点是审批且不是查看模式
  8. if (dataForm.$isMobile && activityName == '审批' && formViewType !== 'view') {
  9. // 提示
  10. dataForm.$alert('此流程无法在移动端上处理,请使用PC端处理',{
  11. callback:function callback(){
  12. // 关闭表单
  13. dataForm.closeView();
  14. }
  15. });
  16. }

实例九:根据某个字段的值设置数据范围的组是否显示

  1. // 设置阅读范围控件的属性的方法
  2. var setReadRangeGroup = function setReadRangeGroup(value) {
  3. if (value === '是') {
  4. // 设置数据范围的组显示
  5. dataForm.setExtendAttributeByCode('ReadRange', 'isReadRangeGroup', true);
  6. // 设置扩展的部门范围
  7. dataForm.setExtendAttributeByCode('ReadRange', 'extendScopeUnitIds', ['68901fc4-eaeb-4d60-9944-2f5b2be6e690', '374f3843-e91c-4621-92ab-b915a0014907']);
  8. // 设置扩展的组织类型
  9. dataForm.setExtendAttributeByCode('ReadRange', 'extendCategories', ['bu', 'ke'])
  10. } else if (value === '否') {
  11. // 设置数据范围的组不显示
  12. dataForm.setExtendAttributeByCode('ReadRange', 'isReadRangeGroup', false);
  13. // 清空扩展的部门范围
  14. dataForm.setExtendAttributeByCode('ReadRange', 'extendScopeUnitIds', null);
  15. // 清空扩展的组织类型
  16. dataForm.setExtendAttributeByCode('ReadRange', 'extendCategories', null)
  17. }
  18. };
  19. // 获取字段的值
  20. var value = dataForm.getDataItemValue('f_0862164c8e');
  21. // 根据字段的值设置阅读范围的组
  22. setReadRangeGroup(value);
  23. // 监听字段的值
  24. dataForm.addFieldListening('f_0862164c8e', setReadRangeGroup);

实例十:主列表按钮前置验证及传值

  1. // 控制非完成状态的行数据无法启动
  2. /**
  3. * datas:列表选中的行数据
  4. * resolve:回调函数
  5. */
  6. dataTable.addButtonBefore('启动', function (datas,resolve) {
  7. // 判断某值是否符合要求
  8. if (datas[0]["f_f585b8afa7"]!=='已完成') {
  9. // 弹出提示 目前message的type只支持error,warning,info
  10. dataTable.$message({
  11. type: "warning",
  12. message: "非完成状态无法启动",
  13. });
  14. } else {
  15. // 继续后面的处理
  16. resolve();
  17. }
  18. });

实例十一:子表行编辑模式保存前置验证及传值

  1. // 验证机构代码是否可用
  2. var subTable1 = dataForm.getSubTable('68dc4a6640');
  3. //行编辑模式:保存前置
  4. subTable1.addButtonBefore('保存', function(data, resolve) {
  5. // data为key-value的格式
  6. const bh = data['f_b954f24e4c']
  7. if (bh === '010') {
  8. subTable1.$message({
  9. type: "warning",
  10. message: "该机构代码不可用!",
  11. });
  12. resolve(false); // 验证不通过,返回false
  13. } else {
  14. resolve(true); // 验证通过,返回true。或写:resolve()
  15. }
  16. });

实例十二:获取字段权限

  1. var dataItem = dataForm.getDataItem('f_b954f24e4c');
  2. console.log('isView, isMust, isEdit: ', dataItem.isView, dataItem.isMust, dataItem.isEdit);

实例十三:字段赋值

  1. // 单行文本、多行文本赋值
  2. dataForm.setDataItemValue('f_xxx', 'xxx');
  3. // 选人、选部门、多选控件赋值
  4. dataForm.setDataItemValue('f_xxx', [{
  5. Name: '张三',
  6. ObjectID: 'xxxx-xxxx'
  7. }]);

实例十四:执行表单按钮动作(仅在铁四院质量分支可用)

  1. // 执行提交按钮的动作
  2. dataForm.executeFormButtonAction('提交').then(function(resolve) {
  3. // 提交成功的回调
  4. ...
  5. // 直接调用会完成平台的后续操作
  6. resolve();
  7. });

实例十五:效验表单数据(仅在铁四院质量分支可用)

  1. dataForm.validateData().then(function(result) {
  2. // result为true时,表示效验通过
  3. });