云服务器内容精选

  • 创建“查询工单”脚本 在“我的应用”中,单击“设备维修管理系统”,进入应用。 在“WorkOrder”目录中,将鼠标放在“Script”上,单击界面上出现的“+”,在弹出菜单中选择“脚本”。 在弹窗中,选中“创建一个新脚本”,在“名称”文本框中输入“queryWorkOrder”,单击“添加”。 系统实际创建的脚本名称为“HW__queryWorkOrder”,“HW__”前缀由租户命名空间namespace决定。新建创建的脚本,默认是当前用户锁定状态,可以进行编辑保存等操作。 当编辑已有脚本时,为防止编辑时多人篡改,编辑前请单击进行锁定。 在代码编辑器中插入如下脚本代码。 脚本中红色内容请替换为实际的对象名、字段名。 import * as context from 'context'; import * as db from 'db'; import * as decimal from 'decimal';//导入decimal数据类型相关的标准库 @useObject(['HW__WorkOrder__ CS T']) @action.object({ type: "param" }) export class ActionInput { @action.param({ type: 'String' }) title: string; @action.param({ type: 'String' }) status: string; @action.param({ type: 'String' }) createdBy: string; @action.param({ type: 'Boolean' }) isFME: boolean; @action.param({ type: 'Number', min: 0 }) start: decimal.Decimal;//分页信息,表示从第几条数据开始查询 @action.param({ type: 'Number', min: 0 }) limit: decimal.Decimal;//分页信息,表示一次查询几条数据 } @action.object({ type: "param" }) export class ActionOutput { @action.param({ type: 'Any', label: 'object', isCollection: true }) workOrderList: object[]; @action.param({ type: 'String' }) total: string;//总共查到几条数据 } @action.object({ type: "method" }) export class QueryWorkOrder { @action.method({ input: 'ActionInput', output: 'ActionOutput' }) public queryWorkOrder(input: ActionInput): ActionOutput { let out = new ActionOutput(); //新建出参ActionOutput类型的实例,作为返回值 let error = new Error(); //新建错误类型的实例,用于在发生错误时保存错误信息 try { let s = db.object('HW__WorkOrder__CST'); //获取HW__WorkOrder__CST这个Object的操作实例 //condition是db标准库queryByCondition方法的入参(查询条件) let condition = { "conjunction": "AND", "conditions": [] }; //基本查询条件 condition.conditions.push({ "field": "id", "operator": "isnotnull", }); condition.conditions.push({ "field": "id", "operator": "ne", "value": "" }); //按title查询 if (input.title && input.title != "") { condition.conditions.push({ "field": "HW__title__CST",//与对象中的字段名保持一致 "operator": "contains", "value": input.title }); } //按status查询 if (input.status && input.status != "") { condition.conditions.push({ "field": "HW__status__CST",//与对象中的字段名保持一致 "operator": "eq", "value": input.status }); } //按title查询 if (input.createdBy && input.createdBy != "") { condition.conditions.push({ "field": "createdBy",//与对象中的字段名保持一致 "operator": "eq", "value": input.createdBy }); } if (input.isFME) { condition.conditions.push({ "field": "HW__assignedFme__CST", "operator": "eq", "value": context.getUserName() }); } let option = { "options": { "orderby": [{ "field": "createdDate", "order": "desc" }] } }; //如果有分页 if (input.start && input.limit) { let start = decimal.toNumber(input.start);//将decimal类型转换为接口需要的number类型 let limit = decimal.toNumber(input.limit); option.options['limit'] = limit; option.options['skip'] = start; } let workOrderList = s.queryByCondition(condition, option); for (let i in workOrderList) { if (workOrderList[i].HW__status__CST == "关闭") { workOrderList[i].isDeal = true; } } out.workOrderList = workOrderList; //调用查询符合condition条件的数据总数的接口 out.total = s.count(condition) + ""; } catch (error) { console.error(error.name, error.message); context.setError(error.name, error.message); } return out; } } 单击编辑器上方的,保存图标。 测试脚本能否正常执行。 单击编辑器上方的,执行脚本。 在界面底部,查询脚本可以不提供输入参数,直接单击测试窗口右上角执行图标。 执行成功,会在“输出”页签返回查询结果。 图1 输出结果示例 测试成功,单击编辑器上方的,启用发布脚本。
  • 创建“查询工单”公共接口 在“我的应用”中,单击“设备维修管理系统”,进入应用。 单击页面下方的“服务”,进入公共接口创建页面。 单击“新建”,创建“查询工单”脚本“HW__queryWorkOrder”的公共接口。 设置接口参数信息:操作名称为“queryWorkOrder”,版本为“1.0.0”,URL为“/queryWorkOrder”,“类型”选择“脚本”,“资源”为“HW__queryWorkOrder”,方法为“POST”,然后单击“保存”。 其中,“HW__”前缀由租户命名空间namespace决定,请根据实际情况进行选择。 图2 新建queryWorkOrder接口
  • 操作步骤 在“我的应用”中,单击“设备维修管理系统”,进入应用。 在“WorkOrder”中,在鼠标放在“Page”上,单击界面上出现的“+”,在弹出菜单中选择“标准页面”。 在“标签”和“名称”文本框中输入“workOrderList”,单击“添加”。 当编辑已有标准页面时,为防止编辑时多人篡改,编辑前请单击进行锁定。 定义模型“queryWorkOrder”。 在“模型视图”中,单击“新增模型”。 添加服务模型,模型名称“queryWorkOrder”,单击“下一步”。 “选择服务类型”为“公共接口”,“项目”为“设备维修管理系统”,“选择服务”为“queryWorkOrder”,单击“下一步”,再单击“确定”。 单击页面上方的,保存模型。 定义模型“workOrderInstance”。 在“模型视图”中,单击“新增模型”。 来源选择“自定义”,模型名称“workOrderInstance”,单击“下一步”。 单击模型名后的“新增节点”,新增表1所示的节点,然后单击“下一步”,再单击“确定”。 以下字段要与“工单对象”中的字段一致,其中加粗斜体内容部分要替换为当前账号对应的命名空间前缀。 表1 新增节点 字段名称 字段类型 字段描述 id Text 记录ID HW__workOrderId__CST Text 工单Id HW__priority__CST Text 优先级 HW__title__CST Text 工单标题 HW__status__CST Text 状态 HW__assignedFme__CST Text 当前处理人 createdDate 日期/时间 创单时间 HW__createdBy__CST Text 创建人 单击页面上方的,保存模型。 单击“设计视图”,从“模型视图”切换到“设计视图”。 拖拽页面标题。 从基本组件列表区拖拽一个“标题”组件到“页面内容”中。 在右侧“属性”页签中,将“标题内容”修改为“现场工单列表”。 单击页面上方的,保存页面标题。 从组件列表区拖拽一个“表格”组件到“标题”的下方。 绑定表格数据模型,并设置查询结果区域。 在“设计视图”中,选中“表格”,单击右侧“属性”页签,如图2所示。 图2 为表格绑定数据模型 在“选择模型”对话框中,选中“workOrderInstance”模型,单击“确定”。绑定模型后,系统自动将模型的所有字段添加为查询结果列。 单击上图中每个字段后的,修改列标题等字段属性。 以“工单ID”为例,其属性配置如图3所示,各个字段及修改后的列名如表2所示。 图3 设置“工单ID”列的属性 表2 修改各字段的显示属性 字段名 列标题 备注 id 记录ID 启用“隐藏”属性,即设置为true HW__workOrderId__CST 工单Id - HW__priority__CST 优先级 - HW__title__CST 工单标题 - HW__status__CST 状态 - HW__assignedFme__CST 当前处理人 - createdDate 创单时间 - HW__createdBy__CST 创建人 - 单击页面上方的,保存设置。 添加“创建工单”按钮。 选中“表格”,单击右侧“属性”页签中“表格区块”中“工具栏”后的“添加”按钮。 图4 增加查询条件区域 删除工具栏中多余的按钮,只保留“新增行”。 修改“新增行”的“显示名称”为“创建工单”。 单击页面上方的,保存设置。 创建查询条件区域。 单击“模型视图”,切换到模型视图,在表格模型“table_0_condition”后,单击编辑图标。 表格组件拖入后,页面将自动生成一个表格模型。“table_0_condition”即是在前面拖入的表格对应的表格模型,模型名可能跟拖入顺序及个数有关,一般情况下模型名称为“table_0_condition”,如果名称不一致,请根据实际情况修改。 图5 编辑表格模型 在表格模型“table_0_condition”中,单击“新增节点”,添加一个“queryInfo”节点,“数据类型”为“Any”,然后在“queryInfo”下,再单击“新增节点”添加3个子节点“createdBy”、“ title”、“status”。 图6 创建完成后的模型节点 单击页面上方的,保存设置。 单击“设计视图”,切换到设计视图,从左侧组件列表中,拖一个“表单”组件到“表格容器”的最上部(表格容器内部最上部),在“元数据表单配置向导”弹窗中,单击“取消”。 图7 向表格容器拖入表单 选中表单,在属性中“数据绑定”下,单击,为表单绑定“table_0_condition”中的“queryInfo”节点,并在提示弹窗中,单击“绑定并生成表单”,单击“确定”。 在表单中,分别选中并删除“createdBy”、“重置”按钮。 调整“title”、“status”、“保存”为1行,并删除多余分栏及容器,调整后,如图8所示。 图8 调整后表单 修改表单中输入框属性。 修改“title”的“标签”为“工单标题”。 修改“status”的“标签”修改为“状态”。 选中“保存”按钮,修改“显示名称”为“搜索”,设置单击“事件”页签,再单击,删除“提交表单”事件,然后单击“点击”后的“+”,进入事件编排页面,在“自定义动作”中,输入以下事件代码,单击“创建”。 图9 修改按钮事件代码 脚本中红色内容请替换为实际的对象名、字段名、页面名、组件ID。其中“table_0_condition”为当前表格组件的ID号,中间数字默认为“0”,如果有多次修改或创建该ID号会变化,选中表格后,在组件树上可以查看实际组件ID。 let pageInfo = $model.ref('table_0_condition').getData().pageInfo; let queryInfo = $model.ref('table_0_condition').getData().queryInfo; if (!queryInfo) { queryInfo = {}; } let queryData = { "title": queryInfo.title, "status": queryInfo.status, "createdBy": queryInfo.createdBy, "start": 0, "limit": pageInfo.pageSize }; $model.ref('queryWorkOrder').setData({ inputParam: queryData }); $model.ref('queryWorkOrder').run().then(function (data) { $model.ref('workOrderInstance').setData(data.workOrderList); pageInfo.total = parseInt(data.total); $model.ref('table_0_condition').setData({ "pageInfo": pageInfo }); }).catch(function (error) { console.log('error is', error); }); 选中“搜索”按钮所在的栏,在右侧“样式”下的“布局”中,设置上方外边距为“30”,使“搜索”按钮上下居中显示。 图10 设置搜索按钮布局样式(位置) 查询条件区域创建后,如图11所示。 图11 查询区域 单击页面上方的,保存设置。 添加页面事件代码。 在“设计视图”中选中最外层的“页面”,在右侧“事件”页签中,单击“加载”后的“+”,进入编辑动作页面。 在“自定义动作”中,输入如下脚本代码。 let pageInfo = $model.ref('table_0_condition').getData().pageInfo; let queryData = { "start": (pageInfo.curPage - 1) * pageInfo.pageSize, "limit": pageInfo.pageSize }; $model.ref('queryWorkOrder').setData({ inputParam: queryData }); $model.ref('queryWorkOrder').run().then(function (data) { $model.ref('workOrderInstance').setData(data.workOrderList); pageInfo.total = parseInt(data.total); $model.ref('table_0_condition').setData({ "pageInfo": pageInfo }); }).catch(function (error) { console.log('error is', error); }); 单击页面上方的,并退出事件编排。 添加“创建工单”按钮跳转事件,跳转事件功能是将页面跳转到“生成工单”页面。 选中“创建工单”按钮,在右侧“事件”页签中,单击“新增行”后的,进入事件编排页面。 在“自定义动作”中,输入以下事件代码,单击“保存”。 //打开创建工单页面,需要根据实际页面名称修改 context.$page.load('/besBaas/page#/HW__createWorkOrder') 单击页面上方的,并退出事件编排。
  • 创建“查询工单”公共接口 在APP视图下,单击下方“服务”,进入公共接口创建页面。 单击“新建”,创建“查询工单”脚本“HW__queryWorkOrder”的公共接口。 设置接口参数信息:操作名称为“queryWorkOrder”,版本为“1.0.0”,URL为“/queryWorkOrder”,“类型”选择“脚本”,“资源”为“HW__queryWorkOrder”,方法为“POST”,然后单击“保存”。 图2 新建queryWorkOrder接口
  • 创建“查询工单”脚本 在“我的应用”中,单击“设备维修管理系统”,进入应用。 在“WorkOrder”目录中,将鼠标放在“Script”上,单击界面上出现的“+”,在弹出菜单中选择“脚本”。 在弹窗中,选中“创建一个新脚本”,在“名称”文本框中输入“queryWorkOrder”,单击“添加”。 系统实际创建的脚本名称为“HW__queryWorkOrder”,“HW__”前缀由租户命名空间namespace决定。新建创建的脚本,默认是当前用户锁定状态,可以进行编辑保存等操作。 当编辑已有脚本时,为防止编辑时多人篡改,编辑前请单击进行锁定。 在代码编辑器中插入如下脚本代码。 脚本中红色内容请替换为实际的对象名、字段名。 import * as context from 'context';import * as db from 'db';import * as decimal from 'decimal';//导入decimal数据类型相关的标准库 @useObject(['HW__WorkOrder__CST']) @action.object({ type: "param" })export class ActionInput { @action.param({ type: 'String' }) title: string; @action.param({ type: 'String' }) status: string; @action.param({ type: 'String' }) createdBy: string; @action.param({ type: 'Boolean' }) isFME: boolean; @action.param({ type: 'Number', min: 0 }) start: decimal.Decimal;//分页信息,表示从第几条数据开始查询 @action.param({ type: 'Number', min: 0 }) limit: decimal.Decimal;//分页信息,表示一次查询几条数据} @action.object({ type: "param" })export class ActionOutput { @action.param({ type: 'Any', label: 'object', isCollection: true }) workOrderList: object[]; @action.param({ type: 'String' }) total: string;//总共查到几条数据} @action.object({ type: "method" })export class QueryWorkOrder { @action.method({ input: 'ActionInput', output: 'ActionOutput' }) public queryWorkOrder(input: ActionInput): ActionOutput { let out = new ActionOutput(); //新建出参ActionOutput类型的实例,作为返回值 let error = new Error(); //新建错误类型的实例,用于在发生错误时保存错误信息 try { let s = db.object('HW__WorkOrder__CST'); //获取HW__WorkOrder__CST这个Object的操作实例 //condition是db标准库queryByCondition方法的入参(查询条件) let condition = { "conjunction": "AND", "conditions": [] }; //基本查询条件 condition.conditions.push({ "field": "id", "operator": "isnotnull", }); condition.conditions.push({ "field": "id", "operator": "ne", "value": "" }); //按title查询 if (input.title && input.title != "") { condition.conditions.push({ "field": "HW__title__CST",//与对象中的字段名保持一致 "operator": "contains", "value": input.title }); } //按status查询 if (input.status && input.status != "") { condition.conditions.push({ "field": "HW__status__CST",//与对象中的字段名保持一致 "operator": "eq", "value": input.status }); } //按title查询 if (input.createdBy && input.createdBy != "") { condition.conditions.push({ "field": "createdBy",//与对象中的字段名保持一致 "operator": "eq", "value": input.createdBy }); } if (input.isFME) { condition.conditions.push({ "field": "HW__assignedFme__CST", "operator": "eq", "value": context.getUserName() }); } let option = { "options": { "orderby": [{ "field": "createdDate", "order": "desc" }] } }; //如果有分页 if (input.start && input.limit) { let start = decimal.toNumber(input.start);//将decimal类型转换为接口需要的number类型 let limit = decimal.toNumber(input.limit); option.options['limit'] = limit; option.options['skip'] = start; } let workOrderList = s.queryByCondition(condition, option); for (let i in workOrderList) { if (workOrderList[i].HW__status__CST == "关闭") { workOrderList[i].isDeal = true; } } out.workOrderList = workOrderList; //调用查询符合condition条件的数据总数的接口 out.total = s.count(condition) + ""; } catch (error) { console.error(error.name, error.message); context.setError(error.name, error.message); } return out; }} 单击编辑器上方的,保存图标。 测试脚本能否正常执行。 单击编辑器上方的,执行脚本。 在界面底部,查询脚本可以不提供输入参数,直接单击测试窗口右上角执行图标。 执行成功,会在“输出”页签返回查询结果。 图1 输出结果示例 测试成功,单击编辑器上方的,启用发布脚本。