华为云用户手册

  • 入门指引 硬件开发工具链平台云服务(CraftArts IPDCenter)是基于统一数据模型,实现端到端数据管理和协同的平台云服务。 CraftArts IPDCenter依托华为产品数字化转型及IPD协同最佳实践,基于统一同源的产品生命周期数据模型,打造围绕产品、面向业务对象的数据管理能力,构建以角色和业务流为中心的数字化协同,提升作业效率和数据质量,助力企业数字化转型。 通过快速入门您可以快速了解硬件开发工具链平台云服务(CraftArts IPDCenter)的基本操作流程,按照操作流程进行服务开通和后续的配置操作,如图1所示。 图1 入门流程 父主题: CraftArts IPDCenter快速入门
  • 步骤3:创建工厂 在“公司注册”页面左侧公司列表中选中公司记录“虚拟A”,单击“添加工厂”。 在弹出的“添加工厂”窗口中,填写表2信息。 图3 添加工厂 表2 添加工厂参数 参数 说明 工厂编号 填写工厂编号,需为系统唯一值。 示例:“GC1001” 公司编号 选中公司后添加工厂时系统自动填充公司编号。 时区 选择“(UTC+08:00)北京,重庆,香港特别行政区,乌鲁木齐”。 中文描述 可选参数,可不填写。 英文描述 可选参数,可不填写。 中文缩写 填写工厂的中文缩写。 示例:“A工厂” 英文缩写 可选参数,可不填写。 区域 可选参数,可不填写。 是否有效 默认“是”。有效的工厂下才能创建车间。 单击“保存”。
  • 步骤5:创建线体 在“工厂建模”页面的“工厂结构定义”页签左侧工厂结构树中,选中车间节点“Workshop[A车间]”,单击其右侧的,或者单击“新增线体”。 在弹出的“创建线体/作业区”窗口中,填写表4信息。 图5 创建线体/作业区 表4 创建线体/作业区参数 参数 说明 线体种类 填写线体的种类。 示例:“ALine” 线体编号 线体编号支持手动输入,也支持根据设置的ID生成器规则自动生成。生成规则:线体种类+三位流水号,例如Line001。 示例:“ALine004” 线体名称 填写线体的名称。 示例:“A线体” 线体描述 可选参数,可不填写。 生产单元类别 选择“Line(生产线体)”。 部门 可选参数,可不填写。 位置 可选参数,可不填写。 业务负责人 填写线体的业务负责人。 示例:“张三” 车间 可选参数,关联已创建的车间。如果不填写该参数,默认将该线体添加到被选中车间的节点“Workshop[A车间]”下。 示例:“A车间” 是否生效 默认“是”。有效的线体数据才能被其他功能模块引用。 信息填写完成后,单击“保存后关闭”。 本示例创建的工厂模型的结构树如图6所示。 图6 工厂结构树
  • 操作步骤 在应用中,单击下方“服务”,进入公共接口创建页面。 图1 创建公共接口入口 单击“新建”,进入新建公共接口页面。 图2 公共接口创建 创建“编辑设备”脚本“HW__editEquipment”的公共接口。 设置接口参数信息,设置标签和操作名称为“editEquipment”,版本为“1.0.0”,URL为“/editEquipment”,“类型”选择“脚本”,“资源”为“HW__editEquipment”,方法为“POST”,然后单击“保存”。 如果在“资源”下拉框中,未找到需要关联的脚本,请检查相关脚本是否已启用。 图3 设置“编辑设备”脚本的公共接口参数 在应用开发页面,单击左下角的“服务”,进入公共接口页面,查看上一步中新建的自定义接口URL“/service/HW__MyApp/1.0.0/editEquipment”,后续开发页面时,会使用这个URL。 图4 查看自定义接口URL 参照上一步,创建“按ID查询设备详情”脚本“HW__queryEquipmentDetail”的公共接口,详细接口信息如图5所示。 标签和操作名称为“queryEquipmentDetail”,版本为“1.0.0”,URL为“/queryEquipmentDetail”,“类型”选择“脚本”,“资源”为“HW__queryEquipmentDetail”,“方法”为“GET”。 图5 “HW__queryEquipmentDetail”的公共接口参数
  • 实现原理 图1 用户登录服务编排大致设想 如图1所示,用户登录服务编排业务逻辑实现过程如下: 通过调用“用户登录”脚本,查询登录账户密码,然后使用“决策”图元进行判断,判断当前登录的账号密码是否正确。 如果判断账户密码错误,直接执行“账户密码错误”,判断账户密码正确,则使用“决策”图元,继续判断是否有验证码。 如果判断当前登录没有验证码,则直接执行登录,判断当前有验证码,则继续判断验证码是否正确。 如果判断验证码正确,则执行登录操作,判断验证码错误,则执行验证失败。
  • 操作步骤 “用户登录”服务编排开发的大致过程:先拖拽1个脚本图元,3个决策图元以及3个赋值图元,再分别配置各个图元属性,然后配置各个图元之间连线类型,最后保存启用。 在“我的应用”中,单击“设备维修管理系统”,进入应用。 在“User”目录中,将鼠标放在“Flow”上,单击界面上出现的“+”,在弹出菜单中选择“服务编排”。 选中“创建一个新的服务编排”,在“标签”和“名称”文本框中输入“login”,并设置类型为“Autolaunched Flow”,单击“添加”。 定义服务编排用到的变量。 单击,展开全局上下文,再单击“变量”后的,设置参数名称为“username”,如图2所示。 图2 新增变量 重复上一步,定义其他变量。 需要定义的变量如表1所示。 表1 服务编排变量说明 变量名称(唯一标识) 数据类型 username(上一步已创建) 文本 password 文本 msg 文本 userId 文本 loginMsg 文本 captcha 文本 profile 文本 单击“公式”后的,在左侧公式弹窗中,设置“名称”为“portalUserLogin”,“表达式”为“PORTALUSER LOG IN({!username})”,单击“保存”。 图3 添加公式变量“portalUserLogin” 参考上一步,创建公式变量“verifyCode”,需要定义的变量如表2所示。 表2 公式变量说明 名称 表达式 verifyCode VERIFYCODEWITHTYPE({!captcha},"login") 拖拽图元到服务编排画布,并配置图元的基本属性。 从图元区分别拖拽脚本(1个)、决策(3个)、赋值(3个)图元到画布中,排列,如图4所示。 图4 拖拽脚本(1个)、决策(3个)、赋值(3个)图元 选中“Script0”图元,在右侧基本信息中,设置“标签”为“查询用户”。 参考5.b,设置其他图元的“标签”属性,具体值如表3所示。 表3 图元基本属性 名称(变量唯一标识,不需要修改) 标签 Script0(上一步已设置) 查询用户 Decision0 判断账号密码 Decision1 判断是否包含验证码 Decision2 校验验证码 Assignment0 账号密码错误 Assignment1 执行登录 Assignment2 验证失败 图5 修改后图元 配置“查询用户”脚本图元。 单击,指定图元对应的脚本名称 (HW__login),并配置脚本的输入输出参数。 单击“全局上下文”,显示变量列表,从“变量”中,拖拽“username”、“password”、“captcha”到“输入参数”下对应的“源”输入框中。 在“输出参数”下,单击5次“新增行”,依次添加下拉选项中的输出参数字段,并从“变量”中拖拽相应的字段到“目标”输入框下,字段与变量对应关系如图6所示。 请直接从全局上下文拖拽“变量”到对应的输入输出参数下,请勿手动输入,手动输入的值系统可能不识别。 图6 拖拽脚本的输入输出参数 配置“判断账号密码”决策图元。 选择“判断账号密码”图元,在右侧单击图标,修改“默认”的“名称”为“loginFail”。 图7 修改“默认”结果名称 单击“新增”,增加一个可编辑的结果,修改结果为“loginSuccess”,在“可视”下单击“新增行”,并拖拽变量中的“msg”到“资源”下,设置“比较符”为“==”,“值”为“"登录成功!"”。 请直接从全局上下文拖拽变量“msg”到“资源”下,请勿手动输入,手动输入的值系统可能不识别。 "登录成功!"需要与“login”脚本中的输出参数一致。 图8 修改可编辑的结果 配置“判断是否包含验证码”决策图元。 选择“判断是否包含验证码”图元,在右侧单击图标,修改“默认”的“名称”为“hasVerifyCode”。 图9 修改“默认”结果名称 单击“新增”,增加一个可编辑的结果,修改结果为“noVerifyCode”,在“可视”下单击“新增行”,并拖拽变量中的“captcha”到“资源”下,设置“比较符”为“==”,“值”为“""”。 图10 修改可编辑的结果 配置“校验验证码”决策图元。 选择“校验验证码”图元,在右侧单击图标,修改“默认”的“名称”为“verifyCodeFail”。 图11 修改“默认”名称 单击“新增”,增加一个可编辑的结果,修改结果为“verifyCodeSuccess”,在右侧选择“公式”,并从全局上下文中,拖拽“verifyCode”到“公式”下。 图12 修改可编辑的结果 配置“账号密码错误”赋值图元。 选择“账号密码错误”图元,在右侧单击图标,单击“新增行”,从全局上下文的“系统变量”中,拖拽“$Flow.ResMsg”到“赋值”下,并设置“操作符”为“=”,拖拽“msg”到“值”;然后再拖拽“系统变量”下的“$Flow.ResCode”到“赋值”的“变量”下,设置“操作符”为“=”,设置“值”为“"1"”。 请直接从全局上下文拖拽变量到“赋值”下的对应位置,请勿手动输入,手动输入的值系统可能不识账。 图13 配置“账号密码错误”图元 配置“执行登录”赋值图元。 选择“执行登录”图元,在右侧单击图标,单击5次“新增行”。 从全局上下文,拖拽“msg”等字段到“赋值”的“变量”下,并设置“操作符”为“=”,然后再拖拽“值”下的各个值,具体字段对应关系,如图14所示。 图14 拖拽“执行登录”赋值的变量及值 请直接从全局上下文拖拽变量到“值”下的对应位置,请勿手动输入,手动输入的值系统可能不识别。 表4 变量与值对应关系 变量 操作符 值 loginMsg = portalUserLogin msg = msg profile = profile username = username userId = userId 配置“验证失败”赋值图元。 选择“验证失败”图元,在右侧单击图标,单击“新增行”,从全局上下文“系统变量”,拖拽“$Flow.ResMsg”、“$Flow.ResCode”到“赋值”下,并设置操作符为“=”,分别设置“值”为“"验证码错误!"”、“"1"”。 表5 赋值 变量 操作符 值 $Flow.ResMsg = "验证码错误!" $Flow.ResCode = "1" 图15 配置“验证失败”赋值图元 拖拽图元连线,并配置连线属性。 在画布上,把鼠标放在起点图元图元上,从“+”拖动鼠标,在起点图元和“查询用户”图元间增加连线;即将当前脚本设置为服务编排的起始节点。 依次在“查询用户”、“判断账号密码”、“判断是否包含验证码”、“执行登录”图元直接拖拽连线。 图16 拖拽连线 单击“判断账号密码”与“判断是否包含验证码”图元之间的连线,在右侧属性单击,在“连线”中修改“连线类型”为“loginSuccess”。 图17 选中连线 图18 修改连线类型 单击“判断是否包含验证码”与“执行登录”图元之间的连线,在右侧属性单击,在“连线”中修改“连线类型”为“noVerifyCode” 从“判断账号密码”图元上拖拽一条连线到“账号密码错误”图元。 从“判断是否包含验证码”图元上拖拽一条连线到“校验验证码”图元。 从“校验验证码”图元上拖拽一条连线到“验证失败”图元。 从“校验验证码”图元上拖拽一条连线到“执行登录”图元,并设置该连线的“连线类型”为“verifyCodeSuccess”。 连线拖拽完成,如图19所示。 图19 拖拽图元连线 定义服务编排的输入、输出参数,并保存服务编排。 鼠标在画布空白处点一下,单击右侧,设置服务编排的输入输出参数,如图20所示。 图20 拖拽服务编排的输入输出参数 单击服务编排页面上方的,保存服务编排。 系统会弹出窗口,显示编译结果。 测试服务编排能否正常执行。 单击服务编排编辑器上方的,执行服务编排。 在“Flow Run”界面中输入测试数据,单击“运行”。其中,“test_cs”、“{XXXXXXXX}”为用户注册脚本中测试数据。 { "username": "test_cs", "password": "{XXXXXXXX}", "captcha": "" } 执行成功,界面上会返回设备对象中的全部信息,样例如下: { "interviewId": "002N000000jjQ95dKbCK", "outputs": { "loginMsg": "null", "msg": "登录成功!", "profile": "cs", "userId": "10gg0XXXXXXXXXXXXX", "username": "test_cs" }} (可选)在服务编排编辑器单击“跟踪”,可以查看到上一步的执行日志,方便定位错误。 测试成功,单击服务编排编辑器上方的,启用发布服务编排。
  • 操作步骤 进入创建“设备维修管理系统”应用中创建的应用。 在“Equipment”目录中,将鼠标放在“Flow”上,单击界面上出现的,在弹出菜单中选择“服务编排”。 选中“创建一个新的服务编排”,在“标签”和“名称”文本框中输入“queryEquipments”,并设置类型为“Autolaunched Flow”,单击“添加”。 系统实际创建的脚本名称为“HW__queryEquipments”,“HW__”前缀由租户命名空间namespace决定。新建创建的服务编排,默认是当前用户锁定状态,可以进行编辑保存等操作。 当编辑已有服务编排时,为防止编辑时多人篡改,编辑前请单击进行锁定。 定义服务编排用到的变量。 单击页面右侧的,再单击结构体中的“新增”,在弹出窗口中输入结构体类型名称“Equipment”,单击“保存”。 图1 创建私有结构体 单击,再单击“对象变量”后的“+”,在弹出窗口中定义私有结构体变量“equipments”,选中“是否为数组”(该变量将作为服务编排的输出参数,且因为查询结果可能是多条记录,所以要选)。单击“保存”,如图2所示。 图2 新增私有结构体变量 单击“变量”后的“+”,设置参数名称为“name”。 单击变量后的“...”,选择“设置”,修改变量的名称、类型,选择默认值“{!$GlobalConstant.EmptyString}”信息,如图4所示。 图3 新增变量 图4 设置变量 重复上一步,定义表1中的其他变量。 表1 服务编排变量说明 变量唯一标识 描述 数据类型 默认值 name(上一步已定义) 设备名称 文本 {!$GlobalConstant.EmptyString} fullAddress 完整地址 文本 {!$GlobalConstant.EmptyString} limit 分页查询的条目数 数字 {!$GlobalConstant.Null} start 分页查询开始条目 数字 {!$GlobalConstant.Null} total 查询到的总条目数 文本 不设置 在服务编排中添加并配置脚本图元。 从左侧拖拽脚本图元到画布中。 修改图元的基本信息,“标签”和“名称”都设置为“queryEquipments”。 图5 设置脚本图元基本信息 单击,指定图元对应的脚本名称 (HW__queryEquipments),并配置脚本的输入输出参数,如果下拉选项中没有目标脚本,请检查脚本是否已启用。 单击“全局上下文”,显示变量列表。在“输入参数”中,单击“新增行”,在下拉框中选择输入参数、依次拖拽变量到输入参数的“源”下。 在“输出参数”中,单击“新增行”,在下拉框中选择输出参数,并从变量和对象变量中拖拽“目标”,如图6所示。 请直接从全局上下文拖拽变量到输入输出参数下的对应位置,请勿手动输入,手动输入的值系统可能不识别。 图6 拖拽脚本的输入输出参数 定义服务编排的输入、输出参数,并保存服务编排。 在画布上,把鼠标放在起点图元图元上,从“+”拖动鼠标,在起点图元和脚本图元间增加连线;即将当前脚本设置为服务编排的起始节点。 鼠标在画布空白处点一下,单击右侧,设置服务编排的输入输出参数,如图7所示。 图7 拖拽服务编排的输入输出参数 单击服务编排界面上方的,保存服务编排。 测试服务编排能否正常执行。 单击服务编排编辑器上方的,执行服务编排。 在“输入参数”中,输入测试数据,单击“运行”。 执行成功,界面上会返回设备对象中的全部信息,样例如下: 图8 返回样例 (可选)在服务编排编辑器单击“跟踪”,可以查看到上一步的执行日志,方便定位错误。 测试成功,单击服务编排编辑器上方的,发布服务编排。
  • 操作步骤 在经典版应用开发页面,单击左侧导航栏下方的“配置”。 图1 应用配置入口 在“导航条”页签单击“菜单树”右侧的“+”,选择“添加页签”。 图2 添加页签 定义“新增用户”页签。在“添加页签”弹窗中,设置以下信息,然后单击“保存”。 页面类型:设置为“标准页面页签”。 标签:设置为“新增用户”。 名称:设置为“addUser”。 页面:设置为“portalUserList”。 图3 添加“新增用户”页面 在应用左侧导航下,单击,进入应用预览页面。 图4 查看应用 在应用菜单上,单击“新增用户”,进入用户管理页面。 图5 新增用户 在用户管理页面,单击“新增用户”,在弹窗中设置用户名、密码及角色。 图6 添加新用户 创建完成后,在用户列表中,查看是否已存在刚刚添加的用户, 如果有,则说明页面及事件代码设置正确。如果页面有报错,请根据页面报错定位问题。
  • 操作步骤 在“我的应用”中,单击“设备维修管理系统”,进入应用。 在应用中,单击下方“配置”,进入应用配置。 图1 应用配置入口 在应用配置页面,单击“业务权限凭证”页签,进入业务权限凭证。 图2 业务权限凭证 单击“导入”,在弹窗中勾选“cs”、“ds”、“ms”、“Login”,然后单击“导入”。 图3 导入业务权限凭证 在页面下方,单击“服务”,进入公共接口页面。 图4 创建公共接口入口 为“createWorkOrder”公共接口,添加客服人员业务凭证“cs”。 在接口列表中,单击“createWorkOrder”接口,进入接口详情。 在接口详情页面,单击“业务权限凭证”下的“编辑”。 图5 编辑业务权限凭证 在编辑业务权限凭证弹窗中,勾选“cs”,再单击,然后单击“保存”。 图6 选择客服人员业务凭证cs 参考6,给其他公共接口添加业务权限凭证,详细接口名及业务凭证如表1所示。 表1 需要添加业务凭证的公共接口 编号 公共接口名 需要添加的业务凭证 涉及业务用户 1 createWorkOrder(上一步已添加) cs 客服人员 2 equipmentSelectListQuery cs 客服人员 3 judgeNextStatus ms 维修人员 4 modifyOrderStatus ms 维修人员 5 queryWorkOrder cs、ds、ms 客服人员、派单人员、维修人员 6 queryWorker ds 派单人员 7 login Login 客服人员、派单人员、维修人员
  • 操作步骤 在“我的应用”中,单击“设备维修管理系统”,进入应用。 在“User”目录中,将鼠标放在“Script”上,单击界面上出现的“+”,在弹出菜单中选择“脚本”。 在弹窗中,选中“创建一个新脚本”,在“名称”文本框中输入“registerPortalUser”,单击“添加”。 在代码编辑器中,插入如下脚本代码。 import * as buffer from "buffer";import * as crypto from "crypto";import * as db from "db";import * as context from 'context';import * as http from 'http';import * as permission from 'permission'; //定义入参结构,包括注册账号的用户名、密码和角色,为必填字段@action.object({ type: "param" })export class ActionInput { @action.param({ type: 'String', required: true, label: 'string' }) username: string; @action.param({ type: 'String', required: true, label: 'string' }) password: string; @action.param({ type: 'String', required: true, label: 'string' }) role: string;}//定义出参结构,出参包含1个参数,portaluser的记录id@action.object({ type: "param" })export class ActionOutput { @action.param({ type: 'String' }) msg: string;}//使用数据对象PortalUser@useObject(['PortalUser'])@action.object({ type: "method" })export class RegisterPortalUser { //定义接口类,接口的入参为ActionInput,出参为ActionOutput @action.method({ input: 'ActionInput', output: 'ActionOutput' }) public registerPortalUser(input: ActionInput): ActionOutput { let out = new ActionOutput(); //新建出参ActionOutput类型的实例,作pu为返回值 let error = new Error(); //新建错误类型的实例,用于在发生错误时保存错误信息 try { let s = db.object('PortalUser'); let saltedPassword = salt(input.password); let userMsg = { "usrName": input.username, "name": input.username, "userPassword": saltedPassword['saltedPassword'], "passwordSalt": saltedPassword['salt'], "userType": input.role }; let userId = s.insert(userMsg); if (userId) { out.msg = "注册成功!"; } else { error.name = "USERERROR"; error.message = "注册失败!"; throw error; } } catch (error) { if (error.name == "405230618") { error.message = "该用户名已注册!" } console.error(error.name, error.message); context.setError(error.name, error.message); } return out; }} function _salt(password: string, saltBuf: buffer.Buffer, encoding: buffer.Encoding = buffer.Encoding.Base64): string { const passwordBuf = buffer.from(password) const crypt = crypto.pbkdf2(passwordBuf, saltBuf, 1000, 32, crypto.Hashs.SHA1) return crypt.toString(encoding)} function salt(password: string, encoding: buffer.Encoding = buffer.Encoding.Base64): object { const saltBuf = crypto.randomBytes(6) const saltedPassword = _salt(password, saltBuf, encoding) return { salt: saltBuf.toString(encoding), saltedPassword: saltedPassword }} 单击编辑器上方的,保存脚本。 测试脚本能否正常执行。 单击编辑器上方的,执行脚本。 在界面底部输入测试数据,单击测试窗口右上角执行图标。 { "username": "test_cs", "password": "***", "role": "cs"} 执行成功,会在“输出”页签返回查询结果。 { "msg": "注册成功!"} 测试成功,单击编辑器上方的,启用发布脚本。
  • 操作步骤 在经典版应用开发页面,单击左侧导航栏下方的“配置”。 图1 应用配置入口 在“导航条”页签,单击“菜单树”右侧的“+”,选择“添加页签”。 图2 导航条添加页签 定义“设备管理”页签。 在“添加页签”弹窗中,设置以下信息,然后单击“保存”。 页面类型:设置为“标准页面页签”。 标签:设置为“设备管理”。 名称:设置为“equipmentManage”。 页面:设置为“HW__equipmentManage”。 图3 设备管理页签 请按照以上方式,创建表1的导航菜单。 表1 导航菜单 页签类型 标签 名称 页面 标准页面页签 工单管理 manageWorkOrderList HW__manageWorkOrder 标准页面页签 工单列表(客服人员) workOrderList HW__workOrderList 标准页面页签 工单列表(派单员) dispatchWorkOrder HW__dispatchWorkOrder 标准页面页签 工单列表(维修人员) workOrderListM HW__workOrderListM (可选)设置导航的布局及颜色。 您可以根据自己的喜好,设置导航的布局及颜色,默认导航菜单是靠左,蓝色。 如图4所示,单击红框中的布局,即可将导航菜单设置为横向菜单,然后单击“保存”。 图4 切换为横向导航
  • 操作步骤 在经典版应用开发页面的设计视图下,单击“服务”,进入公共接口创建页面。 图1 服务入口 单击“新建”,如下图所示。 图2 公共接口创建 创建“处理工单”、“判断下一步状态”脚本对应的公共接口,详细接口信息如表1所示。 表1 公共接口 设置操作 版本 URL 方法 类型 资源 modifyOrderStatus 1.0.0 /modifyOrderStatus POST 脚本 HW__modifyOrderStatus judgeNextStatus 1.0.0 /judgeNextStatus POST 脚本 HW__judgeNextStatus
  • 操作步骤 在“HW__workOrderList”页面中,单击界面上方预览图标。 系统会弹出预览页面。 查看页面中页面布局、样式是否符合预期。 查看当前表格中的工单记录。当前表格中仅有一条测试数据,此数据是在生成工单脚本中输入的一条测试数据。 图1 查看工单记录 验证搜索功能。 在“工单标题”中,输入“电梯维修”,进行搜索,因为当前没有该标题的工单,因此搜索结果为空,然后再输入“电梯无法关门”,如果显示该工单记录,则说明搜索功能正确。 在“状态”中输入“待处理”,然后单击“搜索”,当前暂时没有“待处理”工单,因此搜索结果为空,再输入“待派单”后,单击“搜索”,则显示已存在工单,则说明搜索功能正常。 验证页面跳转事件。 单击“创建工单”,验证是否跳转到“生成工单”页面。如果页面跳转到工单列表页面,则说明验证成功。 因当前生成工单页面相关的BPM尚未创建,这里还无法验证创建工单功能。
  • 验证 因当前还未创建工单状态流转的BPM,因此派单功能还不能正常测试运行。本节只验证页面显示及跳转相关内容。 在“HW__dispatchWorkOrder”页面中,单击界面上方的,进入页面预览,在页面预览中进行以下验证。 查看页面显示:正常情况下,系统会显示客服人员创建的工单,且每条记录后都有派单图标,如果工单状态为“待派单”,则派单按钮为高亮可用状态,如果不是“待派单”状态,则按钮灰度不可用。 如果当前工单列表中没有“待派单”状态的工单,可以在“生成工单”脚本中输入一条测试数据,生成一条工单。 图1 页面预览 查看页面跳转。 选择一条“工单状态”为“待派单”的工单记录,单击“派单”按钮,查看是否弹出“处理工单对话框”,如果未跳转,请检查操作列“派单”按钮上的事件。 在“处理工单对话框”中,查看是否显示“工单ID”,“选择工程师”下拉框是否显示正常,如果不正常,需要检查“派单”对话框相关事件代码及属性值绑定。 图2 处理工单对话框 父主题: 开发“派单员派发工单”功能
  • 操作步骤 在“我的应用”中,单击“设备维修管理系统”,进入应用。 在“WorkOrder”目录中,将鼠标放在“Script”上,单击界面上出现的“+”,在弹出菜单中选择“脚本”。 在弹窗中,选中“创建一个新脚本”,在“名称”文本框中输入“queryWorker”,单击“添加”。 当编辑已有脚本时,为防止编辑时多人篡改,编辑前请单击进行锁定。 在代码编辑器中插入如下脚本代码。 import * as context from 'context';import * as db from 'db'; //使用数据对象PortalUser(业务用户)@useObject(['PortalUser']) @action.object({ type: "param" })export class ActionInput {} @action.object({ type: "param" })export class ActionOutput { @action.param({ type: 'Any', label: 'object', isCollection: true }) userList: object[];} @action.object({ type: "method" })export class QueryWorker { @action.method({ input: 'ActionInput', output: 'ActionOutput' }) public queryWorker(input: ActionInput): ActionOutput { let out = new ActionOutput(); let portalUserObject = db.object('PortalUser'); //查询用户类型为ms(维修人员)的用户。(注册用户的脚本中设置了用户类型) let portalUsers = portalUserObject.queryByCondition({ "conjunction": "AND", "conditions": [{ "field": "userType", "operator": "eq", "value": "ms" }] }); //将查询结果转换为选项列表的形式(id和name)。 let selectValue = portalUsers.map(function (v, i, a) { return { 'value': { "id": v['id'], "name": v['usrName'] }, 'display': v['usrName'] } }); //当前登录的用户为平台用户(非业务用户),则加入到维修人员列表中,用于测试。 if (context.getUserType() == context.UserType.User) { selectValue.push({ 'value': { "id": context.getUserId(), "name": context.getUserName() }, 'display': context.getUserName() }); } out.userList = selectValue; return out; }} 单击编辑器上方的,保存脚本。 测试脚本能否正常执行。 单击编辑器上方的,执行脚本。 在界面底部,单击测试窗口右上角执行图标。 执行成功,会在“输出”页签返回查询结果,请记录“name”值,此参数在创建“派单功能”脚本会作为输入参数使用。 图1 输出查询出的维修人员信息 测试成功,单击编辑器上方的,启用发布脚本。
  • 操作步骤 在“我的应用”中,单击“设备维修管理系统”,进入应用。 在“User”目录中,鼠标放在“Page”上,单击界面上出现的“+”,在弹出菜单中选择“标准页面”。 在“标签”和“名称”文本框中输入“registerPortalUser”,单击“添加”。 当编辑已有标准页面时,为防止编辑时多人篡改,编辑前请单击进行锁定。 定义模型“userInfo”。 在页面底部单击“模型视图”,然后在“模型视图”中,单击“新增模型”。 添加自定义模型,模型名称“userInfo”,单击“下一步”。 单击“新增节点”,为模型添加节点“username”、“password”、“role”字段,字段类型都采用默认的Text。单击“下一步”,再单击“确定”。 图2 新增节点 单击页面上方的,保存模型。 拖拽页面组件。 单击“设计视图”,从“模型视图”切换到“设计视图”。 从左侧基本组件列表区中,拖拽1个“表单”到“页面内容”中。 因为当前还没有定义数据源,在“元数据表单配置向导”弹窗底部,单击“取消”,创建一个空的表单控件。 图3 拖拽一个空表单 拖拽1个“容器”到“表单”。 拖拽1个“分栏”到“容器”。 修改“分栏”为1栏(1行1列)。 图4 设置分栏为1行1列 选择“分栏”下的2次,新增2个分栏。 向前两个分栏,分别拖拽1个“输入框”组件,向第三个分栏中,拖拽一个“下拉框”组件。 图5 拖拽输入框、下拉框 配置组件属性,及数据绑定。 设置第一个“输入框”属性。 添加值绑定。 选中“输入框”组件,单击“数据绑定”下“值绑定”的,在弹窗中选择“ userInfo”下的“username”字段。 修改“标签”为“用户名”,“占位符”为“请输入用户名”。 设置第二个“输入框”属性。 添加值绑定。 选中“输入框”组件,单击“数据绑定”下“值绑定”的,在弹窗中选择“ userInfo”下的“password”字段。 修改“标签”为“密码”,“占位符”为“请输入密码”。 设置“下拉框”属性。 添加值绑定。 单击“数据绑定”下“值绑定”的,在弹窗中选择“userInfo”下的“role”字段。 修改“标签”为“角色”,并设置“选项”为“cs,客服人员”,“ds,派单人员”、“ms,维修人员”。 图6 设置选项值 单击页面上方的,保存设置。 单击页面上方的,进入预览页面,查看页面是否符合预期,并单击查看是否有下拉框选项。 图7 页面预览
  • 操作步骤 创建流程大致是先创建3个泳道,再拖拽泳道图元,然后配置相关图元,保存并启用。 在“我的应用”中,单击“设备维修管理系统”,进入应用。 在“WorkOrder”目录中,将鼠标放在“Bpm”上,单击界面上出现的“+”,在弹出菜单中选择“BPM”。 在弹窗中,设置“标签”、“名称”为“WorkOrderBpm”,单击“添加”。 图2 添加BPM 在设计区域,单击2次“AddLane”,为BPM添加2个角色泳道。 图3 添加泳道 修改泳道基础属性。 选中“Lane”,在右侧属性配置区域,设置泳道标签为“客服人员”,“工作队列”设置为创建工作队列中创建的“客服人员”。 图4 修改客服人员泳道基本信息 参考上一步,分别设置其他两个泳道的“标签”及“工作队列”。 表2 泳道标签及工作队列 泳道初始标签 泳道修改后标签 工作队列 Lane(上一步已配置) 客服人员 客服人员 lane1 派单员 派单员 lane2 维修人员 维修人员 创建BPM中用的变量及对象变量。 在右侧属性面板区域,单击,展开全局上下文。 图5 展开全局上下文 单击“变量”后的图标4次,分别创建以下变量,单击变量后的,可以修改字段类型,创建完成后,如图6所示。 表3 BPM变量 变量名 字段类型 id 文本 status 文本 assignedFme 文本 transInfo 任意 图6 创建变量 单击“对象变量”的,在弹窗中设置“名称”为“workOrderData”,“对象”设置为“HW__WorkOrder__ CS T”(工单对象),加粗斜体内容请以实际命名空间前缀为准,然后单击“保存”。 图7 新增对象变量 再次单击“对象变量”的,在弹窗中设置“名称”为“statusInfo”,“对象”设置为“HW__WorkOrder__CST”(工单对象),然后单击“保存”。 拖拽并配置“客服人员”泳道。 从左侧“活动”图元区域,拖拽一个“数据映射”图元到“客服人员”泳道中。 选中“Data Mapper”图元,然后在右侧导航菜单上单击,进入数据映射配置,再单击,展开全局上下文。 图8 拖拽并设置“数据映射”图元 分别从全局上下文的“对象变量”、“系统变量”中拖拽参数到数据映射配置下: 拖拽对象变量“workOrderData”下的“HW__instanceId__CST”字段到“变量”下,“操作符”为“=”,拖拽“系统变量”下的“{!$Flow.RootID}”作为“值”。 图9 拖拽赋值变量 从左侧“活动”图元区域,拖拽一个“调用脚本”图元到“客服人员”泳道中,并设置“标签”为“创建工单”、“名称”为“createWorkOrder”。 图10 设置创建工单图元 选中“创建工单”图元,单击,再单击“全局上下文”,配置“创建工单”图元绑定的脚本以及输入输出参数。 在“脚本配置”下选择“生成工单”脚本“HW__createWorkOrder”。 从全局上下文中拖拽对象变量“workOrderData”到“输入参数”的“源”输入框中,作为输入参数的值。 设置“输出参数”为“id”,并拖拽变量“id”作为“目标”输入框中的值。 图11 配置“创建工单”图元 从“Start”图元中拖拽一条连线到“Data Mapper”图元,然后从“Data Mapper”图元拖拽一条连线到“创建工单”图元,默认“连线类型”为“下一步”。 图12 拖拽连线 拖拽并配置“派单员”泳道。 从左侧“活动”图元区域,依次拖拽一个“用户任务”、“调用脚本”图标到“派单员”泳道中。 设置“用户任务”图元的“标签”为“派单员派单”、“名称”为“dispatchWorkOrderList”。 设置“调用脚本”图元的“标签”为“派单”、“名称”为“dispatch”。 选中“派单员派单”图元,单击,设置“任务标题”、“任务描述”为“派单员派单”,“渲染类型”为“标准页面”,“页面”设置为“HW__dispatchWorkOrder”。 图13 用户任务配置 选中“派单”图元,单击,再单击“全局上下文”,配置“派单”图元绑定的脚本以及输入输出参数。 在“脚本配置”下选择“生成工单”脚本“HW__dispatchWorkOrder”。 从全局上下文中,拖拽变量“transInfo”到“输入参数”的“源”输入框中,作为输入参数的值。 在“输出参数”下,单击“新增行”,设置“输入参数”为“id”、“assignedFme”,并从全局上下文中,拖拽变量“id”、“assignedFme”作为“目标”输入框中的值。 图14 配置“派单”图元 从“派单员派单”图元中拖拽一条连线到“派单”图元,然后再从“创建工单”图元中拖拽一条连线到“派单员派单”图元,默认“连线类型”均为“下一步”。 图15 拖拽连线 拖拽并配置“维修人员”泳道。 从左侧“活动”图标区域,拖拽2个“用户任务”、2个“调用脚本”、1个“排他网关”以及“终止”图元到“维修人员”泳道中,然后调整图元顺序。 图16 拖拽并调整图元顺序 从左到右,分别设置2个“用户任务”、2个“调用脚本”图元的基本属性,具体如表4所示,设置完成后如图17所示。 表4 图元基本属性设置 图元(从左向右) 标签 名称 用户任务1 维修人员接单 takeWorkOrder 调用脚本1 接单 takeWorkOrder1 用户任务2 维修人员关单 dealWorkOrder 调用脚本2 关闭工单 closeWorkOrder 终止 End end 图17 图元基本属性设置 配置“维修人员接单”图元。 选中“维修人员接单”图元,单击,并展开全局上下文,配置“维修人员接单”图元,详细配置如表5所示。 图18 用户任务配置 表5 用户任务配置 参数项 值 任务标题 维修人员接单 任务描述 维修人员任务列表 渲染类型 标准页面 页面 HW__workOrderListM 接收人下“类型” 名称和表达式 参与者下“类型” 表达式 参与者下“取值” “变量”下的“assignedFme” 说明: 请直接从全局上下文拖拽“assignedFme”到“取值”下,请勿手动输入,手动输入的值系统可能不识别。 配置“接单”图元。 选中“接单”图元,单击,再单击“全局上下文”,并展开全局上下文,配置“维修人员接单”图元,详细配置如表5所示。 请直接从全局上下文拖拽“statusInfo”、“id”、“status”到输入输出参数对应“源”或“目标”下,请勿手动输入,手动输入的值系统可能不识别。 图19 配置“接单”图元 表6 接单图元配置 参数项 值 脚本 HW__modifyOrderStatus 输入参数“statusInfo” 对象变量下“statusInfo” 输出参数“id” 变量下“id” 输出参数“status” 变量下“status” 配置“维修人员关单”图元。 选中“维修人员关单”图元,单击,设置“任务标题”为“维修人员关单”,“任务描述”为“维修人员任务列表”,“渲染类型”为“标准页面”,“页面”设置为“HW__workOrderListM”,并设置“当前泳道中的上一个任务被分配的人员”,如图20所示。 图20 配置“维修人员关单”图元 配置“关闭工单”图元。 选中“关闭工单”图元,单击,再单击“全局上下文”,并展开全局上下文,配置“关闭工单”图元,详细配置如表5所示。 请直接从全局上下文拖拽“statusInfo”、“id”、“status”到输入输出参数对应“源”或“目标”下,请勿手动输入,手动输入的值系统可能不识别。 图21 拖拽关闭工单输入输出值 表7 接单图元配置 参数项 值 脚本 HW__modifyOrderStatus 输入参数“statusInfo” 对象变量下“statusInfo” 输出参数“id” 变量下“id” 输出参数“status” 变量下“status” 拖拽图元直接的关系连线,具体如图22所示。 图22 添加图元之间连线 配置“排他网关”图元连线属性。 选中“派单员派单”与“排他网关”之间的连线,单击鼠标右键,选择“配置”,设置“标签”为“拒单”,再单击“新增行”,拖拽变量“status”到“资源”下,设置“比较符”为“==”,“值”为“"拒单"”。 图23 选中排他网关图元连线 图24 配置“拒单”连线 选择“排他网关”图元与“维修人员关单”图元之间的连线,参考上一步,设置连线,设置“标签”为“接单”,再单击“新增行”,拖拽变量“status”到“资源”下,设置“比较符”为“==”,“值”为“"接单"”。 图25 配置“接单”连线 单击页面上方的,再单击,启用BPM。
  • 创建公共接口 在经典版应用开发页面,单击左侧导航栏下方的“服务”,进入公共接口创建页面。 图1 服务入口 在公共接口中,单击“新建”。 图2 公共接口创建 创建“用户登录”、“用户注册”脚本对应的公共接口,详细接口信息如表1所示。 如果在“资源”下拉框中,未找到需要关联的脚本或服务编排,请检查相关脚本和服务编排是否已启用,加粗斜体内容以实际命名空间前缀为准。 表1 公共接口 设置操作 版本 URL 方法 类型 资源 login 1.0.0 /login POST 服务编排 HW__login registerPortalUser 1.0.0 /registerPortalUser POST 脚本 HW__registerPortalUser 父主题: 开发业务逻辑
  • 操作步骤 在“我的应用”中,单击“设备维修管理系统”,进入应用。 在“User”目录中,将鼠标放在“Script”上,单击界面上出现的“+”,在弹出菜单中选择“脚本”。 在弹窗中,选中“创建一个新脚本”,在“名称”文本框中输入“login”,单击“添加”。 在代码编辑器中,插入如下脚本代码。 import * as buffer from "buffer";import * as crypto from "crypto";import * as db from "db";import * as context from 'context'; //定义入参结构,包括账号的用户名、密码为必填字段,验证码为非必填字段@action.object({ type: "param" })export class ActionInput { @action.param({ type: 'String', required: true, label: 'string' }) username: string; @action.param({ type: 'String', required: true, label: 'string' }) password: string; @action.param({ type: 'String', required: true, label: 'string' }) captcha: string;}//定义出参结构,出参包含5个参数,登录结果和用户角色@action.object({ type: "param" })export class ActionOutput { @action.param({ type: 'String' }) msg: string; @action.param({ type: 'String' }) username: string; @action.param({ type: 'String' }) userId: string; @action.param({ type: 'String' }) captcha: string; @action.param({ type: 'String' }) profile: string;}//使用数据对象PortalUser@useObject(['PortalUser'])@action.object({ type: "method" })export class Login { //定义接口类,接口的入参为ActionInput,出参为ActionOutput @action.method({ input: 'ActionInput', output: 'ActionOutput' }) public login(input: ActionInput): ActionOutput { let out = new ActionOutput(); //新建出参ActionOutput类型的实例,作为返回值 let error = new Error(); //新建错误类型的实例,用于在发生错误时保存错误信息 try { out.captcha = input.captcha; let s = db.object('PortalUser'); let condition = { "conjunction": "AND", "conditions": [{ "field": "usrName", "operator": "eq", "value": input.username }] }; let user = s.queryByCondition(condition); if (user && user.length == 1) { if (validate(user[0].passwordSalt, user[0].userPassword, input.password)) { out.msg = "登录成功!"; out.username = user[0].usrName; out.userId = user[0].id; out.profile = user[0].userType; } else { out.msg = "密码错误!"; } } else { out.msg = "用户不存在!"; } } catch (error) { console.error(error.name, error.message); context.setError(error.name, error.message); out.msg = error.message; } return out; }} function _salt(password: string, saltBuf: buffer.Buffer, encoding: buffer.Encoding = buffer.Encoding.Base64): string { const passwordBuf = buffer.from(password) const crypt = crypto.pbkdf2(passwordBuf, saltBuf, 1000, 32, crypto.Hashs.SHA1) return crypt.toString(encoding)} function validate(salt: string, userSaltedPassword: string, password: string, encoding: buffer.Encoding = buffer.Encoding.Base64): boolean { const saltBuf = buffer.from(salt, encoding); const saltedPassword = _salt(password, saltBuf, encoding); return saltedPassword === userSaltedPassword} 单击编辑器上方的,保存脚本。 测试脚本能否正常执行。 单击编辑器上方的,执行脚本。 在界面底部输入测试数据,单击测试窗口右上角执行图标,其中“test_cs”、变量“{XXXXXXXX}”为用户注册脚本中测试数据。 { "username": "test_cs", "password": "{XXXXXXXX}", "captcha": "" } 执行成功,会在“输出”页签返回查询结果。 { "captcha": "", "msg": "登录成功!", "profile": "cs", "userId": "10gg0XXXXXXXXXXXXX", "username": "test_cs"} 测试成功,单击编辑器上方的,启动发布脚本。
  • 公共接口 公共接口是对脚本、服务编排和对象进行再包装的一种方式。将创建的脚本、服务编排、对象包装成一个新公共服务,可以使得接口的URL地址的表达形式更规范,方便让前端页面或第三方系统进行调用。 因此,在创建完后台逻辑后(服务编排、脚本、对象),就需要先将此接口包装成标准的公共接口,才能被调用。本章节中创建了2个业务脚本,因此需要对应创建2个公共接口,供前端页面调用。 创建公共接口的入口:在APP视图下,单击下方“服务”,即可进入公共接口创建页面。 图1 创建公共接口入口 图2 公共接口基本信息 图3 公共接口URL 父主题: 背景和原理
  • 更新自定义组件 当开发的自定义组件功能有变动,即组件代码发生变动后,需要更新组件版本。更新后,组件所在的页面也会随之生效。 在应用中,单击左下方的“页面设置”,再选择“插件”页签,找到需要更新的组件(例如userLogin),单击组件所在行右侧“查看详情”,进入组件详情页。 图4 页面设置下的组件列表 如果页面图标高亮,则需要先单击解锁页面。 单击“更新”按钮进入组件更新页面。 图5 选择更新按钮 单击“请选择源文件(.zip)”,上传本地的组件zip包,再单击“更新”。 图6 上传本地组件包 返回“插件”页签,单击刚刚上传组件(userLogin)的升级按钮,然后单击保存升级,最后单击发布即可。 图7 更新组件
  • 操作步骤 在设计视图下,单击下方的“服务”,进入公共接口创建页面。 图1 创建公共接口入口 在公共接口页面,单击“新建”。 图2 公共接口创建 创建“查询维修人员”、“派单功能”脚本对应的公共接口,详细接口信息如表1所示。 加粗斜体内容请替换为实际命名空间前缀。 表1 公共接口 设置操作 版本 URL 方法 类型 资源 queryWorker 1.0.0 /queryWorker GET 脚本 HW__queryWorker dispatchWorkOrder 1.0.0 /dispatchWorkOrder POST 脚本 HW__dispatchWorkOrder
  • 操作步骤 在经典版应用开发页面,单击左侧导航栏下方的,进入应用预览页面。 图1 查看应用 验证创建工单。 选择“工单列表(客服人员)”,然后在工单列表(客服人员)页面,单击“创建工单”,进入创建工单页面。 在“设备名称”下拉框中选择一个设备,检查“设备详情”区域显示了对应的设备详情。显示正确,则说明组件与模型的绑定,以及下拉框“数据改变”事件执行正确。 如果“设备名称”下,没有设备名,请先在“设备管理”页面,单击“新增行”进行添加。 检查是否正常提交工单。 填写工单信息, 单击“提交”。如果页面跳转到工单列表页面,且在查询结果中,显示新创建的工单,则说明提交按钮的“点击”事件执行正确。 如果页面跳转到工单列表页面,且在查询结果中显示新创建的工单,则说明验证成功。 图2 验证结果样例 验证派单功能。 单击“工单列表(派单员)”,进入“工单列表(派单员)”页面,查看页面是否显示上一步创建的工单,且每条记录后都有派单图标。 选择上一步新建的一条工单记录,并单击该记录的,弹出处理工单弹窗。 图3 状态为“待派单”工单记录 在处理工单弹窗中,设置下拉框“选择工程师”为当前租户账号,然后单击“确定”,返回“工单列表(派单员)”页面。 查看工单记录的“状态”、“当前处理人”是否已更新为“待接单”、当前租户名。如果已更新,说明派单流程正常。如未改变请检查“派单”按钮上事件代码以及“处理工单”弹窗中数据绑定及事件代码。 验证待接工单。 进入“工单列表(维修人员)”页面,检查系统显示派单员刚刚派的工单,如图4所示。 如未正常显示请检查当前页面标签组件的属性值绑定及页面事件代码。 图4 待处理工单 单击“处理”按钮,进入处理工单弹窗,“选择下一步操作”设置为“接单”,单击“提交”按钮。 处理完成后,返回“待处理工单”页面,查看“状态”是否已经更新为“处理中”。 如果有多条工单,“待处理”状态的工单,优先显示,“处理中”的工单可能会显示在页面的下面,工单状态改变后,可以拖动滚动条查找该工单。 如果在“选择下一步操作”中,选择了“拒单”,流程将返回“派单员”处,状态将变为“待派单”。 图5 处理工单-关单 图6 查看处理中的工单 单击“处理中”工单的“处理”按钮,选择“关单”,单击“提交”,返回页面后,查看该条工单的状态是否变成“关闭”,如果已关闭,则说明关单流程正常。 图7 关闭工单 参考以上步骤,验证工单管理页面。 在应用菜单中,选择“工单管理”页面,进入工单管理,查看页面工单列表中的工单信息。 进行“创建工单”、派单及删除工单操作,验证工单管理功能。
  • 计费说明 设备接入服务 的计费项具体内容如表1所示。 表1 设备接入服务计费项 实例类型 计费项 计费模式 计费公式 基础版(2023年1月1日前) 消息数 按需计费 3.6元/百万条消息,每月前一百万条消息免费。 标准版 实例规格(单元类型、单元数量),购买时长 按需计费、包年/包月 单元类型单价 * 单元数量 * 购买时长 企业版 实例规格(同时在线设备数、消息上下行TPS),购买时长 包年/包月 实例规格 * 购买时长 表2说明了哪些消息会作为计费消息数算入实例的每日消息数和消息上下行TPS。 表2 设备接入服务计费消息说明 消息类型 消息描述 计费方式 设备端消息 设备调用MQTT协议Pub接口发的消息 算入计费消息数 设备调用MQTT协议Sub接口接收的消息 设备调用LWM2M协议Update/Notify接口发的消息 设备调用LWM2M协议Update接口收到的响应消息 设备调用http接口上报的消息、属性 平台调用LWM2M协议Read/Write/Write-Attributes/Execute接口发的和响应的消息 设备调用MQTT协议的Connect消息 标准版和企业版免费 基础版算入计费消息数 设备调用LWM2M协议的Register消息 应用端消息 应用端调用 物联网平台 API发送的消息 算入计费消息数 规则引擎转发消息 使用规则引擎转发到其他 华为云产品 的消息 当低于设备上报消息数时免费赠送,超过部分算入计费消息数。 例如: 上报100万条,流转110万条,消息数按110万条计算。 上报100万条,流转90万条,消息数按100万条计算。 物联网平台向第三方应用端服务器推送的消息 算入计费消息数 协议消息 登出消息 心跳消息 协议层Ack应答消息 订阅消息 取消订阅消息 免费 OTA升级 使用OBS存储升级包场景,在OBS侧会产生计费,详情请参考软固件包上传 OTA升级免费,但如果使用OBS服务,会在OBS侧产生计费
  • 成本优化 企业可以在成本中心的“预算管理”页面创建精细粒度的预算来管理成本和使用量,在实际或预测超过预算阈值时,自动发送通知给指定消息接收人。企业还可以创建预算报告,定期将指定预算进展通知给指定消息接收人。 例如企业需要创建一个弹性云服务器的按需成本预算,每月预算金额为2000元,当预测金额高于预算金额的80%时发送预算告警。那么,创建的预算如下: 图2 新建预算 详细介绍请参见使用预测和预算来跟踪成本和使用量。
  • 核对资源用量是否与实际相符 假设用户在2023/04/08 10:09:06开通了设备接入S1单元,单元数量2,并在2023/04/08 12:09:06时刻将其删除。 设备接入流水账单 按需计费设备接入标准版实例按小时计费,不足1小时按实际使用时长计算,每小时0分结算一次费用,您可以在流水账单中核对每一个计费周期的信息是否和实际相符,具体如表 设备接入流水账单所示。 表1 设备接入流水账单 产品类型 设备接入 IoTDA 产品 设备接入标准实例 计费模式 按需 消费时间 2023/04/08 10:09:06 ~ 2023/04/08 12:09:06时段计费系统将生成3笔流水账单,对应每一个计费周期,分别如下: 2023/04/08 10:09:06 ~ 2023/04/08 11:00:00 2023/04/08 11:00:00 ~ 2023/04/08 12:00:00 2023/04/08 12:00:00 ~ 2023/04/08 12:09:06 官网价 官网价=使用量*单价 本例中,在第一个计费周期内IoTDA的使用时长为3054秒,单价可在设备接入价格详情中查询,以1.7元/S1单元/小时为例,单元数量为2,那么官网价=(3054 ÷ 3600) * 2 * 1.7 = 2.88433333 元。同理,您可以计算剩余计费周期内资源的官网价。 优惠金额 用户使用云服务享受折扣优惠如商务折扣、伙伴授予折扣以及促销优惠等减免的金额。基于官网价的优惠金额。 抹零金额 华为云产品 定价 精度为小数点后8位(单位:元),因此在计费过程中会产生小数点后8位的资源使用费用。而在实际扣费时,仅扣除到小数点后2位,小数点后第3位到第8位部分金额会被舍弃,这种舍弃部分的金额称作抹零金额。 以第一个计费周期为例,抹零金额为:0.00433333 元 应付金额 应付金额=官网价-优惠金额-抹零金额 以第一个计费周期为例,假设优惠金额为0,那么应付金额=2.88433333 - 0 - 0.00433333 = 2.88 元 设备接入明细账单 明细账单可以通过多维度展示客户账单的详细信息。一般通过设置统计维度为“按使用量”、统计周期为“按账期”来统计资源在某个月份的总开销,建议您核对表 设备接入明细账单所示的信息是否和实际相符。 表2 设备接入明细账单 产品类型 设备接入 IoTDA 产品 设备接入标准实例 计费模式 按需 资源名称/ID 设备接入实例的名称和ID 例如:iotda-test-instance,4cdeb1cd-7071-4890-9ce4-e6c2299e960e 规格 设备接入标准实例|S1低频单元 使用量类型 按需计费设备接入实例的使用量类型为“时长” 单价 按需计费模式为简单定价(使用量*单价)时提供单价信息,其他的定价(如EIP公网带宽的阶梯定价)等不提供单价。 按需计费设备接入实例属于简单定价,您可以在设备接入价格详情中查询单价。 单价单位 在设备接入价格详情中查询到的单价单位:元/小时 使用量 按产品单价单位显示使用量,设备接入的单价单位为元/小时,因此使用量以小时为单位。本例中,2023/04/08 10:09:06 ~ 2023/04/08 12:09:06时段使用时长为2小时,单元数量为2,那么总计使用量 = 2 * 2 = 4。 使用量单位 小时 官网价 官网价=使用量*单价 本例中,使用时长为2小时,单价可在设备接入价格详情中查询,以1.7元/个/小时为例,单元数量为2,那么官网价=1.7 * 2 * 2 = 6.8元。 优惠金额 用户使用云服务享受折扣优惠如商务折扣、伙伴授予折扣以及促销优惠等减免的金额。基于官网价的优惠金额。 应付金额 用户使用云服务享受折扣优惠后需要支付的费用金额。
  • 成本分配 成本管理的基础是树立成本责任制,让各部门、各业务团队、各责任人参与进来,为各自消耗云服务产生的成本负责。企业可以通过成本分配的方式,将云上成本分组,归集到特定的团队或项目业务中,让各责任组织及时了解各自的成本情况。 华为云成本中心支持通过多种不同的方式对成本进行归集和重新分配,您可以根据需要选择合适的分配工具。 通过关联账号进行成本分配 企业主客户可以使用关联账号对子客户的成本进行归集,从而对子账号进行财务管理。详细介绍请参见通过关联账号维度查看成本分配。 通过成本标签进行成本分配 标签是华为云为了标识云资源,按各种维度(例如用途、所有者或环境)对云资源进行分类的标记。推荐企业使用预定义标签进行成本归集,具体流程如下: 图1 为云资源添加标签 详细介绍请参见通过成本标签维度查看成本分配。 使用成本单元进行成本分配 企业可以使用成本中心的“成本单元”来拆分公共成本。公共成本是指多个部门共享的计算、网络、存储或资源包产生的云成本,或无法直接通过企业项目、成本标签分配的云成本。这些成本不能直接归属于单一所有者,因此不能直接归属到某一类别。使用拆分规则,可以在各团队或业务部门之间公平地分配这些成本。详细介绍请参见使用成本单元查看成本分配。
  • 包年/包月资源 对于包年/包月计费模式的资源,例如包年/包月的设备接入实例,用户在购买时会一次性付费,服务将在到期后自动停止使用。 如果在计费周期内不再使用包年/包月资源,您可以执行退订操作,系统将根据资源是否属于五天无理由退订、是否使用代金券和折扣券等条件返还一定金额到您的账户。详细的退订规则请参见云服务退订规则概览。 如果您已开启“自动续费”功能,为避免继续产生费用,请在自动续费扣款日(默认为到期前7日)之前关闭自动续费。
  • 计费模式概述 设备接入服务提供按需计费、包年/包月两种计费模式,以满足不同场景下的用户需求。 包年/包月:一种预付费模式,即先付费再使用,按照订单的购买周期进行结算。购买周期越长,享受的折扣越大。一般适用于设备需求量长期稳定的成熟业务。 按需计费:一种后付费模式,即先使用再付费,按照实际使用时长计费。按需计费模式允许您根据实际业务需求灵活地调整资源使用。 表1列出了两种计费模式的区别。 表1 计费模式 计费模式 包年/包月 按需计费 付费方式 预付费 后付费 计费周期 按订单的购买周期计费。 标准版实例:按小时结算。 基础版实例(2023年1月1日前):按照实际产生的消息数计费。 适用计费项 标准版实例、企业版实例。 标准版实例、基础版实例。 变更规格 支持变更实例规格。 标准版实例支持变更实例规格。 基础版实例不支持变更实例规格。 适用场景 适用于可预估资源使用周期的场景,价格比按需计费模式更优惠。对于长期使用者,推荐该方式。 适用于资源需求波动的场景,可以随时开通,随时删除。 父主题: 计费模式
  • 续费相关的功能 包年/包月设备接入实例续费相关的功能如表1所示。 表1 续费相关的功能 功能 说明 手动续费 包年/包月设备接入实例从购买到被自动删除之前,您可以随时在IoTDA控制台为实例续费,以延长实例的使用时间。 自动续费 开通自动续费后,设备接入实例会在每次到期前自动续费,避免因忘记手动续费而导致资源被自动删除。 在一个设备接入实例生命周期的不同阶段,您可以根据需要选择一种方式进行续费,具体如图1 设备接入实例生命周期所示。 图1 设备接入实例生命周期 设备接入实例从购买到到期前,处于正常运行阶段,资源状态为“运行中”。到期后,资源状态变为“已过期”。 到期未续费时,实例首先会进入宽限期,宽限期到期后仍未续费,资源状态变为“已冻结”。 超过宽限期仍未续费将进入保留期,如果保留期内仍未续费,资源将被自动删除。 华为云根据客户等级定义了不同客户的宽限期和保留期时长。 在设备接入实例到期前均可开通自动续费,到期前7日凌晨3:00首次尝试自动续费,如果扣款失败,每天凌晨3:00尝试一次,直至设备接入实例到期或者续费成功。到期前7日自动续费扣款是系统默认配置,您也可以根据需要修改此扣款日。
共100000条
提示

您即将访问非华为云网站,请注意账号财产安全