2021-双十二版-培训手册
页面树结构
跳到banner的尾部
回到标题开始

第八章 后端脚本扩展数据模型管理

转至元数据结尾
转至元数据起始

本章主要介绍如何利用后端脚本能力扩展DWF的数据模型中实体类与关联类后端事件管理机制。

1. 数据模型扩展简介

之前的学习中,读者应该已经大量的接触了数据模型的基本概念,包括:实体类,实体类对象,关联类,关联类对象。数据模型的后端脚本扩展能力,是DWF在服务器端提供的一套事件机制,通过这套事件机制允许用户在实体类、关联类对象被创建、删除、修改的前后执行一段指定的脚本,从而丰富数据变化过程中相关的业务逻辑。

通过数据模型扩展的后端脚本可以完成的典型任务举例如下:

  • 在订单对象创建之后,级联更新商品上的订货数量。
  • 在设备对象被删除之后,级联删除掉相关的工单对象。

上述任务也可以通过数据库的触发器实现,熟悉数据库的读者可能会怀疑DWF提供这种扩展机制的必要性,事实上,随着技术的发展某些任务很难在数据库中利用触发器实现,例如:

  • 当设备对象的属性变更之后,向消息队列中发送消息。
  • 当设备对象变更之后,根据变更的动作启动关联的大数据分析集群进行计算。

因此,提供基于后端脚本的扩展能力对于快速实现低代码量的应用而言有在的的必要性。

2. 如何实现扩展

了解了数据模型的后端脚本机制扩展存在的意义后,接下来介绍如何实现对数据模型的扩展。

  1. 打开DWF的建模工具,点击“数据模型”,点击实体类或者关联类管理,进入管理页面;
  2. 选择任何一个实体类或者关联类,点击编辑实体类/关联类;
  3. 在编辑对话框中看到“事件”页签,会显示创建前、创建后、删除前、删除后、更新前、更新后的选项;
  4. 根据需要选择事件,填入脚本。

图-绑定类事件的脚本过程

在脚本区域中可以根据上一章提到的全局关键字进行编写,这里重点解释一下几个关键的变量:

  • this.obj:在前处理脚本中表示即将更新到数据库中的JSON对象。
  • this.oldObj:在更新和删除的后处理脚本中表示完成之前原始的JSON对象。
  • this.className:在脚本正在处理及的实体类或者关联类的英文名。

3. 脚本案例:工单和设备属性联动

接下来,结合之前介绍的设备管理应用的案例,介绍如何编写数据模型扩展脚本。

3.1 新增工单和删除工单自动更新设备属性

在  第五章 多对象表单控件脚本 中介绍了一个例子:如何实现在工单创建完毕以后更新设备的总工单数量,这个例子使用了操作的后处理脚本动态更新了设备的总工单数+1,这个例子虽然实现了创建工单的时候修改设备属性的目的,但是其存在如下的两点局限性:

  • 第一、工单的创建会在其它功能中同样实现,因此,很有可能遗漏更新设备属性这个工作,后端事件脚本可以保证只要是工单被创建,那么其设备的工单属性一定更新。
  • 第二、在前端调用时,创建工单和更改设备属性是分别进行的,在这个环节中如果出现不可预料的错误,例如:断网,或者关闭浏览器,那么就会遗漏更新属性的环节,因为后端脚本是由数据库保证完整性的,因此可以保证要么两个动作都执行,要么都不执行。

克服这个局限性的方法就是采用数据模型扩展脚本实现,我们只需要在每张工单创建后,根据其填写的设备代号将设备查询出来,然后修改设备属性并更新数据库即可,工单创建后事件脚本如下:

// 工单对象创建后更新设备的工单数量
var assetID = this.obj.assetOid;
if (assetID) {
	// 得到工单上填写设备对应的实体类对象
    var asset = this.omf.getByOid(assetID, "Asset");
    if (asset.woCount){
        asset.woCount += 1;
    } else {
        asset.woCount = 0;
    }
	// 将设备对象更新到数据库中
    this.omf.edit(asset, "Asset");
}

同样的道理,每当工单删除后,将对应设备的总工单数减1脚本如下?

// 工单对象删除后更新设备的工单数量
var assetID = this.obj.assetOid;
if (assetID) {
	// 得到工单上填写设备对应的实体类对象
    var asset = this.omf.getByOid(assetID, "Asset");
    if (asset.woCount){
        asset.woCount -= 1;
    } else {
        asset.woCount = 0;
    }
	// 将设备对象更新到数据库中
    this.omf.edit(asset, "Asset");
}

3.2 删除设备级联删除工单

完成了工单和设备属性的联动之后,如果是设备删除,那么需要将与设备有关的工单一并删除怎么办呢?同样也可以在设备类对象删除后的事件里,删除工单。

这里需要注意一点,由于工单删除后也附加了事件,那么在删除设备时触发了级联删除工单,而工单删除同样继而又会触发其关联设备的更新,但此时由于设备已被删除,因此就会导致异常提示。

此时就可考虑使用数据库SQL语句处理工单删除,这种通过SQL语句完成的删除操作不会触发工单删除后的事件,就能规避这种循环事件引发的异常。

具体脚本如下:

// 删除设备的时候,级联删除工单,用SQL语句,避免事件触发事件
var curAssetId = this.obj.oid;
if (curAssetId) {
    var query = this.em.createNativeQuery("delete from plt_cus_workorder where plt_assetoid = ?");
    query.setParameter(1, curAssetId);
    query.executeUpdate();
}

在这段脚本中,利用this.em.createNativeQuery方法创建了一个查询语句的引用,通过executeUpdate方法驱动数据库完成级联删除。

在这个脚本中删除工单类的SQL语句,针对的表名是plt_cus_workorder,而DWF中工单类的英文名是WorkOrder,这中间的对应关系是按照如下的规则实现的:

对于实体类,命名规则是:PLT_[前缀]_[类名],对于关联类,命名规则是:PLT_[前缀]_R_[类名]。其中【前缀】是在类属性界面中指定的,默认为CUS代表自定义。

所以,根据这个规则,工单类在数据库中的对应的表名是:plt_cus_workorder

4. 小结

本章着重介绍了后端数据模型的事件机制,利用数据模型的事件扩展机制,类似数据库的触发器,可以有效解决很多实际应用需求。

本章主要结合工单与设备之间的业务关系,解释了设备的总工单数属性和工单的新增与删除之间如何实现自动联动。

此外,还通过设备删除与工单的级联删除的例子解释了DWF数据库表的命名规则,这也是二次开发必须了解掌握内容。

5. 附件

第八章 后端脚本扩展数据模型.zip

  • 无标签

PHP网站源码民治seo优化大浪推广网站光明百度竞价包年推广坪地外贸网站制作广州网站推广系统民治百姓网标王推广盐田百度网站优化福永百搜标王荷坳关键词按天计费罗湖百姓网标王推广布吉关键词排名包年推广南山优化丹竹头网站优化塘坑网站排名优化广州关键词按天扣费大鹏百度标王永湖优秀网站设计吉祥外贸网站制作永湖英文网站建设龙岗网站改版南联网站搜索优化坑梓网站搜索优化宝安百姓网标王塘坑关键词按天收费荷坳建设网站石岩网站开发吉祥网站优化按天计费木棉湾seo排名龙华企业网站建设龙华seo优化歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化