页面树结构

版本比较

标识

  • 该行被添加。
  • 该行被删除。
  • 格式已经改变。

...

代码块
languagejs
<template>
	<Timeline>
		<TimelineItem color="green" v-for="t in worklist" :key="t.oid">
			<p>{{`${getdate(t.woDeadline || '未知')}`}}</p>
			<p>{{`${t.woTitle}`}}<a @click="openWorkOrder(t)">详情</a>	</p>
		</TimelineItem>
	</Timeline>
</template>

<script>
export default {
	name: "workOrderListOpr",
	data() {
		return {
			worklist: [],
		};
	},
	created() {
		console.log(this.dwf_ctx);
		let queryConditon = {};
		let that = this; // 临时保存上下文以便异步调用
		this.dwf_ctx.dwf_axios
			.post("/omf/entities/WorkOrder/objects", queryConditon)
			.then((res) => {
				if (res.data.success) {
					console.log(res.data.data);
					that.worklist = res.data.data;
				}
			});
	},
	methods: {
		openWorkOrder(wo) {
			// 打开工单对象
			alert(`${wo.woTitle}`);
		},
		// 日期转换辅助函数
		getdate(ts) {
			if (ts == "") return "--";
			var now = new Date(ts),
				y = now.getFullYear(),
				m = now.getMonth() + 1,
				d = now.getDate();
			return (
				y +	"-" + (m < 10 ? "0" + m : m) + "-" +(d < 10 ? "0" + d : d) + " " +
				now.toTimeString().substr(0, 8)
			);
		},
	}
};
</script>

<style>
.ivu-timeline {
	margin-left: 20px;
	margin-top: 20px;
}
</style>

...

代码块
<template>
	<Timeline>
		<TimelineItem color="green" v-for="t in worklist" :key="t.oid">
			<p>{{ `${getdate(t.woDeadline || "未知")}` }}</p>
			<p>
				{{
					`设备代号为 ${t.assetId} 的 ${t.woTitle} 工作由 ${t.engineerName} 负责完成`
				}}
				<a @click="openWorkOrder(t)">详情</a>
			</p>
		</TimelineItem>
	</Timeline>
</template>
 
<script>
export default {
	name: "workOrderListOpr",
	data() {
		return {
			worklist: [],
			userlist: [], //新增了用户列表备用
			assetlist: [], //新增了设备列表备用
		};
	},
	created() {
		console.log(this.dwf_ctx);
		let queryConditon = {
			condition: "order by obj.woDeadline",
			refs: [
				{
					sourceAttr: "assetOid",
					targetAttr: "oid",
					targetClass: "Asset",
					sourceAttrSplit: ",",
				},
				{
					sourceAttr: "engineerOid",
					targetAttr: "oid",
					targetClass: "User",
					sourceAttrSplit: ",",
				},
			],
		};
		let that = this; // 临时保存上下文以便异步调用
		this.dwf_ctx.dwf_axios
			.post("/omf/entities/WorkOrder/objects", queryConditon)
			.then((res) => {
				console.log(res);
				if (res.data.success) {
					let resArr = res.data.data;
					that.assetlist = resArr.refResult.assetOid;
					that.userlist = resArr.refResult.engineerOid;
					// 重新归置工单信息补充新的属性
					that.worklist = resArr.queryResult.map((wo) => {
						let asset = that.assetlist.find((a) => {
							return a.oid === wo.assetOid;
						}); //找到工单提到的设备对象
						let engineer = that.userlist.find((u) => {
							return u.oid === wo.engineerOid;
						}); //找到工单提到的用户对象
						// 如果设备对象不为空则补充设备的代号到工单中
						wo.assetId = typeof asset !== "undefined" ? asset.id : "未知";
						// 如果用户对象不为空则补充用户的名称到工单中
						wo.engineerName =
							typeof engineer !== "undefined" ? engineer.displayName : "未知";
						return wo;
					});
				}
			});
	},
	methods: {
		openWorkOrder(wo) {
			// 打开工单对象
			alert(`${wo.woTitle}`);
		},
		getdate(ts) {
			if (ts == "") return "--";
			var now = new Date(ts),
				y = now.getFullYear(),
				m = now.getMonth() + 1,
				d = now.getDate();
			return (
				y +
				"-" +
				(m < 10 ? "0" + m : m) +
				"-" +
				(d < 10 ? "0" + d : d) +
				" " +
				now.toTimeString().substr(0, 8)
			);
		},
	},
};
</script>
 
<style>
.ivu-timeline {
	margin-left: 20px;
	margin-top: 20px;
}
</style>

...

在下面章节里,我们还将介绍其他更加简便的方法操作DWF中的概念。

3.2 表单按钮操作开发

在上面的例子里,通过使用模块操作插件实现与DWF互动的方法,包括:

  • 如何调用DWF的restful api获得工单数据。
  • 如何利用restful api参数查找引用的用户,设备对象。
  • 如何操纵DWF外壳弹出指定表单的页签,查看工单详情。

如果整个界面的主体是由开发者完全控制,那么采用上面的开发方法制作插件就可以了,但是,如果希望表单的主体是DWF实现的,在表单中希望增加以类似于按钮的操作,通过弹出一些DWF无法定制的界面收集信息之后返回原有表单,那这样的场景如何实现呢?这就要采用表单中的按钮插件开发来实现了。

接下来,再举一个例子,在设备编辑的界面里增加一个按钮插件,弹框显示一个文本框,然后将文本框数据带回上级表单并且更新被选中的设备对象的描述属性,效果如下图所示:

Image Removed

在这个例子里,我们将接管表单绘制过程,绘制一个特殊样式的文字按钮“编码生成工具”,在按钮点击的时候使用iView的弹框示例,来展示对话框本文不对弹框示例进行过多解释,当用户点击确定以后,可以将输入编码返回到设备表单的备注中。

接管绘制逻辑

首先,继续在上一章buttonOpr.vue中继续修改,在单设备编辑表单中,放入一个按钮插件,并且将按钮事件对应的操作设置为动作为implement类型的操作,插件的名字设置为buttonOpr.vue。

在DWF表单引擎中,“按钮”插件允许用户接管其展示方式,这意味着表单引擎放弃绘制默认的按钮界面,而将界面展示的逻辑交给操作开发者实现。通过实现下面两个方法可以实现:

  • canShow:返回布尔值,如果为true则表单引擎放弃绘制,否则表单引擎将根据操作插件的参数配置绘制按钮。
  • setArgs:如果canShow设置为true,那么表单引擎会调用这个函数,将原来在表单引擎中给按钮控件设置的参数传进来,在我们的例子中不需要显示这个参数,直接返回即可。
<script> export default { ...
代码块
代码块
languagejs
title完整操作的源代码
collapsetrue
<template>
	<Timeline>
		<TimelineItem color="green" v-for="t in worklist" :key="t.oid">
			<p>{{ `${getdate(t.woDeadline || "未知")}` }}</p>
			<p>
				{{
					`设备代号为 ${t.assetId} 的 ${t.woTitle} 工作由 ${t.engineerName} 负责完成`
				}}
				<a @click="openWorkOrder(t)">详情</a>
			</p>
		</TimelineItem>
	</Timeline>
</template>
  
<script>
export default {
	props: ["itemValue", "root", "store", "Message"],
	data() {
		return {
			worklist: [],
			userlist: [], //新增了用户列表备用
			assetlist: [], //新增了设备列表备用
		};
	},
	created() {
		console.log(this.dwf_ctx);
		let queryConditon = {
			condition: "order by obj.woDeadline",
			refs: [
				{
					sourceAttr: "assetOid",
					targetAttr: "oid",
					targetClass: "Asset",
					sourceAttrSplit: ",",
				},
				{
					sourceAttr: "engineerOid",
					targetAttr: "oid",
					targetClass: "User",
					sourceAttrSplit: ",",
				},
			],
		};
		let that = this; // 临时保存上下文以便异步调用
		this.dwf_ctx.dwf_axios
			.post("/omf/entities/WorkOrder/objects", queryConditon)
			.then((res) => {
				console.log(res);
				if (res.data.success) {
					let resArr = res.data.data;
					that.assetlist = resArr.refResult.assetOid;
					that.userlist = resArr.refResult.engineerOid;
					// 重新归置工单信息补充新的属性
					that.worklist = resArr.queryResult.map((wo) => {
						let asset = that.assetlist.find((a) => {
							return a.oid === wo.assetOid;
						}); //找到工单提到的设备对象
						let engineer = that.userlist.find((u) => {
							return u.oid === wo.engineerOid;
						}); //找到工单提到的用户对象
						// 如果设备对象不为空则补充设备的代号到工单中
						wo.assetId = typeof asset !== "undefined" ? asset.id : "未知";
						// 如果用户对象不为空则补充用户的名称到工单中
						wo.engineerName =
							typeof engineer !== "undefined" ? engineer.displayName : "未知";
						return wo;
					});
				}
			});
	},
	methods: {
		openWorkOrder(wo) {
			// 打开工单对象
			let opr = {
				targetClass: "WorkOrder", // 设定目标类的名字
				authority: "editWO", // 设定需要执行的操作英文名
				conditionExpre: `and obj.oid = '${wo.oid}'`, // 打开当前被传入的工单
				displayName: "工单详情", // 设置弹出页签的标题
				viewName: "SingleWO", // 打开对象的表单名
				action: "edit", // 打开页签对应的动作:edit, visit, create
				params: "", // 表单打开的处理设置
			};
			// 打开工单对象
			this.root.openTab(opr);
		},
		getdate(ts) {
			if (ts == "") return "--";
			var now = new Date(ts),
				y = now.getFullYear(),
				m = now.getMonth() + 1,
				d = now.getDate();
			return (
				y +	"-" + (m < 10 ? "0" + m : m) +
				"-" + (d < 10 ? "0" + d : d) +
				" " + now.toTimeString().substr(0, 8)
			);
		},
	},
};
</script>
  
<style>
.ivu-timeline {
	margin-left: 20px;
	margin-top: 20px;
}
</style>


3.2 表单按钮操作开发

在上面的例子里,通过使用模块操作插件实现与DWF互动的方法,包括:

  • 如何调用DWF的restful api获得工单数据。
  • 如何利用restful api参数查找引用的用户,设备对象。
  • 如何操纵DWF外壳弹出指定表单的页签,查看工单详情。

如果整个界面的主体是由开发者完全控制,那么采用上面的开发方法制作插件就可以了,但是,如果希望表单的主体是DWF实现的,在表单中希望增加以类似于按钮的操作,通过弹出一些DWF无法定制的界面收集信息之后返回原有表单,那这样的场景如何实现呢?这就要采用表单中的按钮插件开发来实现了。

接下来,再举一个例子,在设备编辑的界面里增加一个按钮插件,弹框显示一个文本框,然后将文本框数据带回上级表单并且更新被选中的设备对象的描述属性,效果如下图所示:

Image Added

在这个例子里,我们将接管表单绘制过程,绘制一个特殊样式的文字按钮“编码生成工具”,在按钮点击的时候使用iView的弹框示例,来展示对话框本文不对弹框示例进行过多解释,当用户点击确定以后,可以将输入编码返回到设备表单的备注中。

接管绘制逻辑

首先,继续在上一章buttonOpr.vue中继续修改,在单设备编辑表单中,放入一个按钮插件,并且将按钮事件对应的操作设置为动作为implement类型的操作,插件的名字设置为buttonOpr.vue。

在DWF表单引擎中,“按钮”插件允许用户接管其展示方式,这意味着表单引擎放弃绘制默认的按钮界面,而将界面展示的逻辑交给操作开发者实现。通过实现下面两个方法可以实现:

  • canShow:返回布尔值,如果为true则表单引擎放弃绘制,否则表单引擎将根据操作插件的参数配置绘制按钮。
  • setArgs:如果canShow设置为true,那么表单引擎会调用这个函数,将原来在表单引擎中给按钮控件设置的参数传进来,在我们的例子中不需要显示这个参数,直接返回即可。
代码块
<script>
export default {
	...
	methods: {
		// 通知DWF表单引擎接管绘制过程
		canShow() {
			return true;
		},
		// 一旦接管,DWF表单引擎传入当前表单的上下文
		setArgs(args) {
			return this;
		},
		...
	},
};
</script>

...

代码块
languageyml
config:
  ignore:
  info:
    part-web:
      name: common
      cname: common
      forms:
      #operations:
 下面是关于操作的配置,在operations文件夹下增加一个新的操作vue文件的时候,需要在下面增加配置以便正确装配       operationscommonOpr.vue: 
       #...commonOpr.vue: commonOpr   name: commonOpr
          cname: "入门插件"
        buttonOpr.vue:
          name: buttonOpr
          cname: "进阶插件"
      dependencies: {}


4 小结

本章深入介绍了操作插件和按钮插件的开发,要点如下:

...