表单模块目前由3部分组成:schema定义、renderer渲染器、runtime运行时
schema定义
schema下定义了所有表单控件的类型、选项;基础的控件通过类型确定选项,复杂控件通过继承的方式扩展属性。
表单控件类型
FormControl 表单设计控件
FormSheet 子表控件,继承FormControl
FormSheetStatistic 子表统计控件,继承FormControl
FormControl
/** * 数据项code * 布局控件的key为type */ key: string /** * 控件选项 */ options: FormControlOptions /** * 控件类型 */ type: FormControlType /** * 父级key */ parentKey?: string
FormSheetStatistic
/**
* 子表统计控件
*/
export interface FormSheetStatistic extends FormControl {
columnKey: string
}FormSheet
/**
* 子表
*/
export interface FormSheet extends FormControl {
/**
* 列
*/
columns: FormControl[]
/**
* 统计
*/
statistics: FormSheetStatistic[]
}FormControlType 表单控件类型
/**
* 表单控件类型
*/
export enum FormControlType {
/**
* 标签
*/
Label = 0,
/**
* 单文本
*/
Text = 1,
/**
* 长文本
*/
Textarea = 2,
/**
* 日期
*/
Date = 3,
/**
* 数值
*/
Number = 4,
/**
* 单选
*/
Radio = 5,
/**
* 复选
*/
Checkbox = 6,
/**
* 下拉
*/
Dropdown = 7,
/**
* 逻辑
*/
Logic = 8,
/**
* 附件
*/
Attachment = 9,
/**
* 图片
*/
Image = 10,
/**
* 位置
*/
Location = 11,
/**
* 日期范围
*/
DateRange = 12,
/**
* 数值范围
*/
NumberRange = 13,
/**
* 地址
*/
Address = 14,
/**
* 签名
*/
Signature = 15,
/**
* 人员单选
*/
StaffSelector = 50,
/**
* 人员多选
*/
StaffMultiSelector = 51,
/**
* 部门单选
*/
DepartmentSelector = 60,
/**
* 部门多选
*/
DepartmentMultiSelector = 61,
/**
* 审批意见
*/
ApprovalOpinion = 70,
/**
* 关联表单
*/
RelevanceForm = 80,
/**
* 反向关联
*/
ReverseRelevance = 90,
/**
* 系统-流水号
*/
SequenceNo = 100,
/**
* 系统-创建人
*/
CreateBy = 101,
/**
* 系统-创建人部门
*/
CreateByParentId = 102,
/**
* 系统-修改人
*/
ModifyBy = 103,
/**
* 系统-创建时间
*/
CreatedTime = 104,
/**
* 系统-修改时间
*/
ModifiedTime = 105,
/**
* 系统-拥有者
*/
OwnerId = 106,
/**
* 系统-其他
*/
SystemOther = 107,
/**
* 布局-分组标题
*/
Group = 200,
/**
* 子表
*/
Sheet = 201,
/**
* 描述说明
*/
Description = 202,
/**
* 表单标题
*/
Title = 203,
/**
* 子表统计
*/
SheetStatistic = 300
}FormControlOptions 表单控件选项
FormControlOptions只是一个约束性的接口,具体属性声明在几个公共子类中,具体的控件选项基本都继承自这几个子类
export class StyleControlOptions implements FormControlOptions {
/**
* 控件名称
*/
name: string = ''
/**
* 是否可见
*/
visible: boolean = true
/**
* 控件样式
*/
style: string | null = null
}
export class EditableControlOptions extends StyleControlOptions {
/**
* 显示条件
*/
displayFormula = ''
/**
* 变更事件
*/
onChange: string | null = null
}
export class InputControlOptions extends EditableControlOptions {
/**
* 必填条件
*/
requiredFormula = ''
}renderer渲染器
renderer渲染器由pc、mobile渲染器,控件值服务,和一些抽象类构成;目前在列表查询表单、表单详情中有使用。
如何使用
引用
<template> <pc-form-renderer ref="formRenderer" :controls="controls"></pc-form-renderer> </template>
import { schema, renderer, runtime } from "@cloudpivot/form";
@Component({
name: "pc-form-detail",
components: {
PcFormRenderer: renderer.components.pc.FormRenderer
},合并controls
// 表单设计器控件属性json const formControls = JSON.parse(formDefine.publishedAttributesJson); // 表单设计器布局json const layout = JSON.parse(formDefine.publishedViewJson); this.controls = components.FormRendererHelper.convertDesign(formControls, layout);
FormRenderer
FormRenderer是pc、mobile渲染器的抽象父类,它实现了以下方法
/** * 查找所有表单控件 */ findFormControls(keys?: string[]): RendererFormControl[] /** * 校验表单 * @param excludes 不校验的控件 */ validate(excludes?: string[]): boolean /** * 表单所有错误 */ getErrors(): any /** * 获取错误 * @param controlId 控件ID * @param errCode 错误码 */ getErrorMessage(controlId: string, errCode: FormControlErrorCodes): string /** * 获取表单值对象 */ getValue(): any /** * 表单重置 */ reset(): void /** * 进入编辑状态 * @param keys 指定的控件ID */ edit(keys?: string[]): void /** * 进入只读状态 * @param keys 指定的控件ID */ readonly(keys?: string[]): void
可以通过refs的方式获取组件实例,调用方法
const formRenderer = this.$refs.formRenderer as any as FormRendererLike; formRenderer.validate();
服务注入
渲染器中一些控件运行依赖于外部服务、或者环境,为了实现关注与实现分离,有一些服务需要在项目中注入
FileService 文件服务,上传控件使用,上传下载相关服务
UserService 用户服务,选人控件使用,获取当前用户、当前用户部门
LocationService 位置服务,定位导航具体实现,移动端使用钉钉服务实现
RelevanceFormService 关联表单服务,列表相关数据获取、关联表单打开
ReverseRelevanceService 反向关联服务,反向关联数据获取,关联表单打开
renderer.RelevanceFormControl.listSelectorLoad 列表组件异步加载,列表模块依赖表单模块,使用这种方式解决循环依赖的问题
目前服务的配置在项目src/config/h3-form目录下
runtime运行时
runtime运行时由表单运行相关组件组成,下列组件都具有pc、mobile版
FormActionModal 操作弹窗组件
FormActions 表单按钮组件
FormDetail 表单详情
FormActionModal
方法
show (options: FormActionModalOptions) 显示
chose 关闭
事件
ok (ac: runtime.FormActionButton, data: any) 弹窗确认
FormActions
props
actions : runtime.FormActionButton[] 按钮列表
事件
action (ac: runtime.FormActionButton) 按钮点击
FormDetail
表单详情是一个组件抽象类,实现有默认表单运行相关的方法:
load 加载
save 暂存
submit 提交、同意、不同意
cancel 作废
delete 删除
finish 结束
retrieve 撤回
print 打印
edit 编辑
forword 转办
reject 驳回
除了运行相关方法,还有一些辅助方法:
loadCustomForm 加载自定义表单模板
initCustomForm 初始化自定义表单
initForm 初始化表单
onAction 表单按钮事件分发方法,处理按钮交互
doAction 表单按钮事件流程控制方法,如触发前,触发后
beforeAction 表单按钮操作前事件调用方法
executeAction 表单事件执行分发方法
onActionDone 表单按钮操作后事件调用方法
onCustomAction 自定义按钮事件调用方法
showActionModal 表单按钮弹窗
onActionModalOk 表单按钮弹窗确认事件执行方法
除load方法外,其他都由按钮事件驱动,不需要手动调用。
pc和mobile的差别
审批意见
pc、mobile的审批意见控件交互处理不同,mobile端的审批意见控件是在按钮点击通过校验后,再显示审批意见控件。校验
pc、mobile的错误消息交互不同,导致校验方法的是分开实现的
多语言
import Vue from 'vue';
import VueI18n from 'vue-i18n';
import form_zh from '@cloudpivot/form/locales/zh-CN';
Vue.use(VueI18n);
const i18n = new VueI18n({
locale: localStorage.getItem('locale') || 'zh',
messages: {
zh: {
cloudpivot: {
form: form_zh
},
},
en: {
}
}
});流程模块目前由2部分组成:components组件、typings声明
typings声明
typings下声明了流程相关的所有状态的枚举,包括:流程行为状态、流程任务状态、流程的节点状态、流程状态、流程行为样式、参与者的类型
workflow-enum
/**
* 流程行为状态
*/
export const workflowActionStatus: { [key: string]: string } = {
'0': '提交',
'1': '提交',
'2': '作废',
'3': '同意',
'4': '不同意',
'5': '加签',
'6': '协办',
'7': '转办',
'8': '驳回',
'9': '结束流程',
'10': '待阅',
'11': '已阅'
};
/**
* 流程任务状态
*/
export const workItemStatus: { [key: string]: string } = {
'1': '未启动',
'2': '进行中',
'3': '已完成',
'4': '被取消',
'5': '草稿'
};
/**
* 流程的节点状态
*/
export const workflowNode: { [key: string]: string } = {
'0': '已办节点',
'1': '进行中节点',
'2': '异常节点',
};
/**
* 流程状态
*/
export enum WorkflowState {
DRAFT = '草稿',
PROCESSING = '进行中',
COMPLETED = '已完成',
CANCELED = '已作废',
EXCEPTION = '异常'
}
//@workflowActionClassName: gray, green, blue, red;
/**
* 流程行为样式
*/
export enum WorkflowAction {
DRAFT = 'gray',
PROCESSING = 'green',
COMPLETED = 'blue',
CANCELED = 'red'
}
/**
* 参与者的类型
*/
export enum WorkflowParticipantType {
MORMAL = 0,
FORWARD = 1,
ASSIST = 2,
ADD_WORKITEM = 3,
CIRCULATE_ITEM = 4
}components组件
components组件由pc、mobile、shared渲染器构成;目前在流程信息、流程跟踪(包含流程基本信息、流程图、审批日志、操作日志等)中有使用。
flow组件列表-PC端
WorkflowInfo 流程信息
WorkflowTrack 流程跟踪
WorkflowTrackActions 流程跟踪顶部操作按钮
WorkflowChart 流程图展示
Approval 表单审批记录
flow组件列表-移动端
WorkflowInfo 流程信息
Approval 审批记录展示
WorkflowChart 流程图展示
如何使用
组件引入路径: import * as flow from "@cloudpivot/flow";
组件调用路径: flow.components.[端].[组件名]
例如:
flow.components.pc.WorkflowInfo, flow.components.mobile.WorkflowChart
###1. 引用示例
1.1 流程信息
<template> <!-- 移动端存在参数user、pc端不需要这个参数 --> <workflow-info v-if="workflowInstanceId" :id="workflowInstanceId" :itemId="formObj.workItemId" :user="creater" @flowTrack="flowTrack" ></workflow-info> </template>
import * as flow from "@cloudpivot/flow";
@Component({
name: "pc-form-detail",
components: {
WorkflowInfo: flow.components.pc.WorkflowInfo,
},
)}1.2 流程跟踪--pc
<template> <!-- 流程跟踪Header的按钮 --> <workflow-track-actions :headerAction="headerAction" :workflowInstanceId="workflowInstanceId" :workItemId="workItemId" @edit="onEdit" @logs="onLogs" ></workflow-track-actions> <!-- 流程跟踪内容主体 --> <workflow-track-main :loading="loading" :baseInfo="baseInfo" :chart="chart" :logs="logs" ></workflow-track-main> </template>
import * as flow from "@cloudpivot/flow";
import { workflowApi } from "@cloudpivot/api";
@Component({
name: "workflow-track",
components: {
WorkflowTrackMain: flow.components.pc.WorkflowTrack,
WorkflowTrackActions: flow.components.pc.WorkflowTrackActions
}
})1.3 流程跟踪--mobile
<template> <!-- 审批记录 --> <approvals :approvals="approvals" :creater="creater" :workflowInfo="workflowInfo" :participants="participants" v-show="!index" @preview="onPreview" @detail="onDetail" ></approvals> <!-- 流程图 --> <Chart :chart="chart" :show="!!index" v-show="index" >1 Container </Chart> </template>
import * as flow from "@cloudpivot/flow";
import { workflowApi } from "@cloudpivot/api";
@Component({
name: "workflow-track",
components: {
Approvals : flow.components.mobile.Approval,
Chart : flow.components.mobile.WorkflowChart
}
})###2. 组件传参prop
2.1 流程信息组件参数
// id: 流程实例ID workflowInstanceId:string // itemId:流程workItemId workItemId:string // user:创建人对象(仅移动端需要) user:any /** * flowTrack:点击流程跟踪回调事件 */ flowTrack:function
2.2.2 流程跟踪内容主体组件参数--pc
// loading: 流程跟踪页面加载时是否展示loading loading:Boolean // baseInfo:流程跟踪基础信息 baseInfo:any // chart:流程图数据 chart:any // logs:审批日志数据 logs:any
2.3.1 审批记录组件参数--mobile
// approvals: 审批记录的数据数组 approvals:Array // creater:创建人对象 creater:any // workflowInfo:流程信息对象 workflowInfo:any // participants: 当前处理人对象 participants:any /** * preview:图片预览回调事件 */ preview:function /** * detail:查看审批记录回调事件 */ detail:function
2.3.2 流程图组件参数--mobile
// show: 流程跟踪页面加载时滚动条定位到流程图位置 show:Boolean // chart:流程图数据 chart:any
流程中心包含两块内容,列表与发起流程。其中,列表分为我的待办、我的待阅、我的已办、我的已阅、我的流程、流程查询,流程查询分为任务查询和流程实例查询两块。
流程中心区分移动端和PC端,区别差异于文末提供。
flow-center组件列表-PC端
MyUnFinishedWorkItem 我的待办
MyUnReadWorkItem 我的待阅
MyFinishedWorkItem 我的已办
MyReadWorkItem 我的已阅
MyWorkflow 我的流程
QueryInstance 流程实例查询
TaskSearch 任务查询
WorkflowCenterMenu 流程中心菜单树
StartWorkflow 发起流程
flow-center组件列表-移动端
MyUnFinishedWorkItem 我的待办
MyUnReadWorkItem 我的待阅
MyFinishedWorkItem 我的已办
MyReadWorkItem 我的已阅
InitialInstance 发起流程
MyInstanceItem 我的流程
引入flow-center包
import * as FlowCenter from '@cloudpivot/flow-center';
flow-center组件调用
FlowCenter.components.[端].[组件名]
如:
FlowCenter.components.pc.MyFinishedWorkItem FlowCenter.components.mobile.MyInstanceItem
组件使用具体细节
PC端
自定义表格的列
解释: 目前只能基于默认列改变表格列的数量
参数列表:
我的待办、我的待阅、我的已办、我的已阅:
/** * 自定义表格的列 */ @Prop() tableColumns!: any;
我的流程:
/** * 自定义表格的列 */ @Prop() tableProcessingColumns!: any; // 进行中 @Prop() tableCompletedColumns!: any; // 已完成 @Prop() tableCanceledColumns!: any; // 已作废
流程实例查询:
/** * 自定义表格的列 */ @Prop() tableAllColumns!: any; // 全部 @Prop() tableProcessingColumns!: any; // 进行中 @Prop() tableCompletedColumns!: any; // 已完成 @Prop() tableCanceledColumns!: any; // 已作废
任务查询:
/** * 自定义表格的列 */ @Prop() tableProcessingColumns!: any; // 处理中 @Prop() tableCompletedColumns!: any; // 已完成 @Prop() tableCanceledColumns!: any; // 被取消
表格默认列
defaultTableColumns:any = [
{
dataIndex: 'orderNumber',
width: 80,
slots: { title: 'indexTitle' },
scopedSlots: { customRender: 'orderNumber' }
},
{
dataIndex: 'instanceName',
width: 220,
slots: { title: 'instanceNameTitle' },
scopedSlots: { customRender: 'instanceName' }
},
{
dataIndex: 'activityName',
width: 130,
slots: { title: 'activityNameTitle' },
scopedSlots: { customRender: 'activityName' }
},
{
dataIndex: 'stayTime',
width: 220,
slots: { title: 'stayTimeTitle' },
scopedSlots: { customRender: 'stayTime' }
},
{
dataIndex: 'originatorName',
width: 130,
slots: { title: 'originatorNameTitle' },
scopedSlots: { customRender: 'originatorName' }
},
{
dataIndex: 'departmentName',
width: 220,
slots: { title: 'departmentNameTitle' },
scopedSlots: { customRender: 'departmentName' }
}
]我的待阅:
defaultTableColumns:any = [
{
dataIndex: 'orderNumber',
width: 120,
slots: { title: 'indexTitle' },
scopedSlots: { customRender: 'orderNumber' }
},
{
dataIndex: 'workflowName',
width: 130,
slots: { title: 'workflowNameTitle' }
},
{
dataIndex: 'sourceName',
width: 130,
slots: { title: 'sourceNameTitle' },
scopedSlots: { customRender: 'sourceName' }
},
{
dataIndex: 'startTime',
width: 180,
slots: { title: 'startTimeTitle' },
scopedSlots: { customRender: 'startTime' }
},
{
dataIndex: 'originatorName',
width: 130,
slots: { title: 'originatorNameTitle' },
scopedSlots: { customRender: 'originatorName' }
},
{
dataIndex: 'departmentName',
width: 200,
slots: { title: 'departmentNameTitle' },
scopedSlots: { customRender: 'departmentName' }
}
]我的已办:
defaultTableColumns:any = [
{
dataIndex: 'orderNumber',
width: 80,
slots: { title: 'indexTitle' }
},
{
dataIndex: 'instanceName',
width: 220,
slots: { title: 'instanceTitle' },
scopedSlots: { customRender: 'instanceName' }
},
{
dataIndex: 'activityName',
width: 130,
slots: { title: 'activityNameTitle' },
scopedSlots: { customRender: 'activityName' }
},
{
dataIndex: 'approvalTxt',
width: 130,
slots: { title: 'approvalTxtTitle' },
scopedSlots: { customRender: 'approvalTxt' }
},
{
dataIndex: 'finishTime',
width: 180,
slots: { title: 'finishTimeTitle' },
scopedSlots: { customRender: 'finishTime' }
},
{
dataIndex: 'originatorName',
width: 130,
slots: { title: 'originatorNameTitle' },
scopedSlots: { customRender: 'originatorName' }
},
{
dataIndex: 'workflowInstanceState',
width: 130,
slots: { title: 'workflowInstanceStateTitle' },
scopedSlots: { customRender: 'workflowInstanceState' }
},
]我的已阅:
defaultTableColumns:any = [
{
dataIndex: 'orderNumber',
width: 80,
align: 'center',
slots: { title: 'indexTitle' }
},
{
dataIndex: 'instanceName',
width: 220,
align: 'center',
slots: { title: 'instanceNameTitle' },
scopedSlots: { customRender: 'instanceName' }
},
{
dataIndex: 'workflowName',
width: 130,
align: 'center',
slots: { title: 'workflowNameTitle' },
scopedSlots: { customRender: 'workflowName' }
},
{
dataIndex: 'sourceName',
width: 130,
align: 'center',
slots: { title: 'sourceNameTitle' },
scopedSlots: { customRender: 'sourceName' }
},
{
dataIndex: 'receiveTime',
width: 180,
align: 'center',
slots: { title: 'receiveTimeTitle' },
scopedSlots: { customRender: 'receiveTime' }
},
{
dataIndex: 'originatorName',
width: 130,
align: 'center',
slots: { title: 'originatorNameTitle' },
scopedSlots: { customRender: 'originatorName' }
},
{
dataIndex: 'departmentName',
width: 200,
align: 'center',
slots: { title: 'departmentNameTitle' },
scopedSlots: { customRender: 'departmentName' }
}
]我的流程:
defaultProcessingColumns:any = [
{
title: '序号',
dataIndex: 'index',
width: 60,
align: 'center'
},
{
dataIndex: 'instanceName',
width: 296,
slots: { title: 'instanceNameTitle' },
scopedSlots: { customRender: 'instanceName' }
},
{
dataIndex: 'workflowName',
width: 130,
slots: { title: 'workflowNameTitle' },
},
{
dataIndex: 'participants',
width: 130,
slots: { title: 'participantNameTitle' },
scopedSlots: { customRender: 'participantName' }
},
{
width: 180,
dataIndex: 'stayTime',
slots: { title: 'stayTimeTitle' },
}
];
defaultCompletedColumns:any = [
{
title: '序号',
dataIndex: 'index',
width: 60,
align: 'center'
},
{
dataIndex: 'instanceName',
width: 296,
slots: { title: 'instanceNameTitle' },
scopedSlots: { customRender: 'instanceName' }
},
{
dataIndex: 'workflowName',
slots: { title: 'workflowNameTitle' },
width: 130
},
{
dataIndex: 'startTime',
slots: { title: 'startTimeTitle' },
width: 180
},
{
dataIndex: 'finishTime',
slots: { title: 'finishedTimeTitle' },
width: 180
},
{
dataIndex: 'costTime',
slots: { title: 'costTimeTitle' },
width: 180
}
];
defaultCanceledColumns:any = [
{
title: '序号',
dataIndex: 'index',
width: 60,
align: 'center'
},
{
dataIndex: 'instanceName',
width: 296,
slots: { title: 'instanceNameTitle' },
scopedSlots: { customRender: 'instanceName' }
},
{
dataIndex: 'workflowName',
slots: { title: 'workflowNameTitle' },
width: 130
},
{
dataIndex: 'startTime',
slots: { title: 'startTimeTitle' },
width: 180
},
{
dataIndex: 'finishTime',
slots: { title: 'cancellationTime' },
width: 180
}
];流程实例查询
defaultAllColumns:any = [
{
dataIndex: 'index',
width: 60,
align: 'center',
slots: { title: 'indexTitle' }
},
{
dataIndex: 'instanceName',
width: 220,
slots: { title: 'instanceNameTitle' },
scopedSlots: { customRender: 'instanceName' }
},
{
dataIndex: 'workflowName',
width: 130,
slots: { title: 'workflowNameTitle' },
},
{
dataIndex: 'startTime',
width: 180,
slots: { title: 'startTimeTitle' },
},
{
dataIndex: 'originatorName',
width: 130,
slots: { title: 'originatorNameTitle' },
scopedSlots: { customRender: 'originatorName' }
},
{
dataIndex: 'departmentName',
width: 130,
slots: { title: 'departmentNameTitle' },
scopedSlots: { customRender: 'originatorName' }
},
{
dataIndex: 'state',
width: 130,
slots: { title: 'stateTitle' },
}
];
defaultProcessingColumns:any = [
{
dataIndex: 'index',
width: 60,
align: 'center',
slots: { title: 'indexTitle' },
},
{
dataIndex: 'instanceName',
width: 220,
slots: { title: 'instanceNameTitle' },
scopedSlots: { customRender: 'instanceName' }
},
{
dataIndex: 'workflowName',
width: 130,
slots: { title: 'workflowNameTitle' },
},
{
dataIndex: 'participants',
width: 130,
slots: { title: 'participantNameTitle' },
scopedSlots: { customRender: 'participantName' }
},
{
dataIndex: 'stayTime',
width: 180,
slots: { title: 'stayTimeTitle' },
},
{
dataIndex: 'startTime',
width: 180,
slots: { title: 'startTimeTitle' },
},
{
dataIndex: 'originatorName',
slots: { title: 'originatorNameTitle' },
scopedSlots: { customRender: 'originatorName' },
width: 130
}
];
defaultCompletedColumns:any = [
{
dataIndex: 'index',
width: 60,
align: 'center',
slots: { title: 'indexTitle' },
},
{
dataIndex: 'instanceName',
width: 296,
slots: { title: 'instanceNameTitle' },
scopedSlots: { customRender: 'instanceName' }
},
{
dataIndex: 'workflowName',
width: 130,
slots: { title: 'workflowNameTitle' },
},
{
dataIndex: 'startTime',
width: 180,
slots: { title: 'startTimeTitle' }
},
{
dataIndex: 'finishTime',
width: 180,
slots: { title: 'finishedTimeTitle' }
},
{
dataIndex: 'costTime',
width: 180,
slots: { title: 'costTimeTitle' }
},
{
dataIndex: 'originatorName',
slots: { title: 'originatorNameTitle' },
scopedSlots: { customRender: 'originatorName' },
width: 130
}
];
defaultCanceledColumns:any = [
{
dataIndex: 'index',
width: 60,
align: 'center',
slots: { title: 'indexTitle' }
},
{
dataIndex: 'instanceName',
width: 220,
slots: { title: 'instanceNameTitle' },
scopedSlots: { customRender: 'instanceName' }
},
{
dataIndex: 'workflowName',
width: 130,
slots: { title: 'workflowNameTitle' },
},
{
dataIndex: 'startTime',
width: 180,
slots: { title: 'startTimeTitle' },
},
{
dataIndex: 'finishTime',
width: 180,
slots: { title: 'cancellationTime' },
},
{
dataIndex: 'originatorName',
width: 180,
slots: { title: 'originatorNameTitle' },
scopedSlots: { customRender: 'originatorName' }
},
{
dataIndex: 'departmentName',
scopedSlots: { customRender: 'departmentName' },
width: 180,
slots: { title: 'departmentNameTitle' }
}
];单应用
我的待办、我的待阅、我的已办、我的已阅是可以直接在钉钉打开的,这里称为单应用,这边需要传一些其他参数
/**
* 单应用集成属性,集成时不显示title
*/
@Prop({
default: true
}) showTitle!: boolean;
/**
* 单应用集成属性,集成时表格高度
*/
@Prop() scrollHeight!: number;
/**
* 单应用集成属性,单应用appCode
*/
@Prop() appCode!: string;
/**
* 单应用集成属性,集成时不显示发起流程按钮
*/
@Prop({
default: true
}) originate!: boolean;关于自定义事件
我的待办、我的待阅、我的已办、我的已阅这四个组件点击流程名称需要打开表单详情,这里做的是路由跳转,需要在使用的时候去监听这个事件,并跳转到项目中的路由,传播出来的事件名称均为"openForm",如下:
<my-finished-work-item @openForm="openForm"/>
/**
* 查看表单详情
*/
openForm(obj:any) {
// 表单详情路由地址
const url = `/form/detail?workitemId=${obj.id}&workflowInstanceId=${obj.instanceId}&return=${location.pathname + location.search}`;
if (this.isDingTalk) {
this.$router.push({
path: url
});
} else {
window.open(url);
}
}其他组件
菜单树
菜单树时通过 component 的is属性进行切换的。
只需要在 项目中 components/apps/aside/aside.vue 引用即可。
<component :is="curMenu"/>
@Component({
name: 'Aside',
components: {
// todo
WorkflowCenterMenu: FlowCenter.components.pc.WorkflowCenterMenu,
// todo
}
})
/*** 分割线 ****/
curMenu:string = 'WorkflowCenterMenu'发起流程
PC端发起流程组件名为 StartWorkflow
引入直接使用即可, 如:
<start-workflow/>
移动端
store引用
因为待办待阅已办已阅使用了同一个store,故需要在 views/home/index.vue 文件中引用命名控件为circulate的store模块。
如:
// index.vue
const circulateModule = namespace('circulate');传入参数
使用组件时,需要传入appCode,appCode来自于顶级store
<MyReadWorkItem :appCode="appCode"/>
@State('appCode') appCode!: any;关于自定义事件
跟PC端逻辑一致,点击每一个item,需要跳转至项目中的路由。
传播出来的事件名称均为"openForm"
<MyFinishedWorkItem @openForm="openForm"/>
openForm(workitem:any) {
// 表单详情默认路由
this.$router.push({
name: 'form-detail',
query: {
workitemId: workitem.id,
workflowInstanceId: workitem.instanceId,
return: this.$route.fullPath
}
});
}其他组件
发起流程 InitialInstance
移动端发起流程组件为 InitialInstance,引入直接使用即可。
<initial-instance/>
这是单个item,需要传入一个我的所有流程list,同样监听一个自定义事件 openForm ,跳转项目中路由
如:
<instances-item v-for="(circulate,index) in myInstances" :key="index" :workitem="circulate" @openForm="openForm(circulate)" />
openForm(workitem:any) {
this.$router.push({
name: 'form-detail',
query: {
workflowInstanceId: workitem.id,
return: this.$route.fullPath
}
});
}主要用于渲染模型下列表设计在 pc 与 mobile 供用户查询的列表
mobile
列表页面主要包含两个部分组成,一个是查询条件的渲染,另外一个是数据列表项的渲染
使用方法
import * as applicationList from '@cloudpivot/list';
@Component({
name: 'FormList',
components: {
AppsList: applicationList.components.mobile.ApplicationList
}
})也可以只渲染查询条件的渲染:
// 引入
import * as applicationList from '@cloudpivot/list';
@Component({
name: 'FormList',
components: {
AppsList: applicationList.components.mobile.QueryForm
}
})
// 使用
<query-form ref="list" :fields="queryConditions"></query-form>
//
参数
// 列表设计请求的到是数据中 queryConditions 直接扔进去就可以渲染
// 查询确认
// 数据传递
mounted() {
Bus.$on('queryList', () => {
this.query();
});
}
destroyed() {
Bus.$off('queryList');
}
// 获取参数
query() {
const list = this.$refs.list as any;
const data = list.query();
}pc
pc 主要导出了两个模块,ApplicationList,ApplicationCustomIframe,ListSelector:
ApplicationList 主要用于渲染查询列表 与列表数据
ApplicationCustomIframe 主要用于渲染后台添加的自定义页面 的打开入口
ListSelector 主要用于关联表单选择时,对列表的选择
使用方式
// 引入
import * as applicationList from '@cloudpivot/list';
// 路由使用
applicationList: {
path: 'application-list/:schemaCode',
name: 'applicationList',
component: applicationList.components.pc.ApplicationList
}
// 自定义页面 iframe 打开
// 引入
import * as applicationList from '@cloudpivot/list';
@Component({
name: 'application-define',
components: {
applicationCustom: applicationList.components.pc.ApplicationCustomIframe
}
})
// 使用
<application-custom :url="url" />
// 参数
作为 iframe 打开的 url应用模块主要用以 admin 创建的应用在mobile 与 pc 前台的展示,分为 mobile 与 pc 两端 渲染不同页面
mobile
AppsIndex 将整个应用模块导出,可以在路由直接引用
SingleApp 导出移动端单应用某块,使用方式与 AppsIndex 相同
使用方式
import * as applicationList from '@cloudpivot/list'; // 将怎么模块导出
applicationList: {
path: 'application-list/:schemaCode',
name: 'applicationList',
component: applicationList.components.pc.ApplicationList
}
// 通过 . 索引到对应组件引入使用AppsIndex
作为引用列表页面的出入口,由下面三部分组成:
search-bar 引用是搜索功能,目前不对外开放
search-panel 搜索结果的展示,不对外开放
app-list 应用列表的主体内容, 不对外开放
app-list
side-bar 侧边栏
app-content 应用展示区域组成
PC
pc 应用主要导出两个部分,可以直接导入使用:
ApplicationHeader顶部导航条应用的列表
AppsMenu 左侧数据模型树
AppHomeContent 单应用首页内容
AppHomeHeader 单应用首页头部
使用方式:
import * as ApplicationComponents from '@cloudpivot/application';
@Component({
name: 'common-header',
components: {
ApplicationHeader: ApplicationComponents.components.pc.ApplicationHeader
}
})单应用引用示例:
AppHomeContent的引用
<template> <app-home-content :appCode="code"></app-home-content> </template>
import * as Application from '@cloudpivot/application';
@Component({
name: 'app-home',
components: {
AppHomeContent: Application.components.pc.AppHomeContent
}
})AppHomeHeader的引用
<template> <app-home-header> <!-- AppHomeHeader组件的插槽 --> <div slot="left"><!--单应用头部左侧自定义代码 --></div> <div slot="right"><!--单应用头部右侧自定义代码 --></div> </app-home-header> </template>
import * as Application from '@cloudpivot/application';
@Component({
name: 'app-home',
components: {
AppHomeHeader: Application.components.pc.AppHomeHeader
}
})单应用参数列表
AppHomeContent 参数
/** * 应用编码 */ @Prop() appCode!: string;


