这部分主要是实现online表单的各种形式表单,包括主从表表单,同时录入采用现有官方的模式录入数据,通过选择已有数据的方式进行流程申请与审批,免去各种录入组件等兼容性问题。
1、后端实现
主要实现online表单的信息获取以及具体表单的数据获取,以供前端使用
/** * 通过formId查询 * * @param formId * @return */ @AutoLog(value = "flow_onl_cgform_head-通过formId查询") @ApiOperation(value="flow_onl_cgform_head-通过formId查询", notes="flow_onl_cgform_head-通过formId查询") @GetMapping(value = "/queryByFormId/{formId}") public Result<?> queryByFormId(@PathVariable("formId") String formId) { Map<String, Object> flowOnlCgformHeadMap = flowOnlCgformHeadService.getOnlCgformHeadByFormId(formId); if(flowOnlCgformHeadMap==null) { return Result.error("未找到对应数据"); } return Result.OK(flowOnlCgformHeadMap); } @AutoLog(value = "getColumns-通过code查询获取online表单列表信息") @ApiOperation(value="getColumns-通过code查询获取online表单列表信息", notes="getColumns-通过code查询获取online表单列表信息") @GetMapping({"/getColumns/{code}"}) public Result<OnlComplexModel> a(@PathVariable("code") String code) { Result result = new Result(); OnlCgformHead onlCgformHead = (OnlCgformHead)this.onlCgformHeadService.getById(code); if (onlCgformHead == null) { result.error500("实体不存在"); return result; } else { LoginUser loginuser = (LoginUser)SecurityUtils.getSubject().getPrincipal(); OnlComplexModel onlComplexModel = this.onlineService.queryOnlineConfig(onlCgformHead, loginuser.getUsername()); onlComplexModel.setIsDesForm(onlCgformHead.getIsDesForm()); onlComplexModel.setDesFormCode(onlCgformHead.getDesFormCode()); result.setResult(onlComplexModel); result.setOnlTable(onlCgformHead.getTableName()); return result; } } @AutoLog(value = "getData-通过code查询获取online表单数据") @ApiOperation(value="getData-通过code查询获取online表单数据", notes="getData-通过code查询获取online表单数据") @GetMapping({"/getData/{code}"}) public Result<Map<String, Object>> a(@PathVariable("code") String code, HttpServletRequest request) { Result result = new Result(); OnlCgformHead onlCgformHead = (OnlCgformHead) this.onlCgformHeadService.getById(code); if (onlCgformHead == null) { result.error500("实体不存在"); return result; } else { Map map = null; try { Map objectmap = onlineUtils.objectHashMap(request); boolean bJoinQuery = onlineUtils.isJoinQuery(onlCgformHead); if (bJoinQuery) { map = this.onlineJoinQueryService.pageList(onlCgformHead, objectmap); } else { map = this.onlCgformFieldService.queryAutolistPage(onlCgformHead, objectmap, (List) null); } this.getEnhanceList(onlCgformHead, map); result.setResult(map); } catch (Exception except) { log.error(except.getMessage(), except); result.error500("数据库查询失败," + except.getMessage()); } result.setOnlTable(onlCgformHead.getTableName()); return result; } } @AutoLog(value = "getFormItem-通过code查询获取子表单数据") @ApiOperation(value="getFormItem-通过code查询获取子表单数据", notes="getFormItem-通过code查询获取子表单数据") @GetMapping({"/getFormItem/{code}"}) public Result<?> b(@PathVariable("code") String code, HttpServletRequest var2) { OnlCgformHead onlCgformHead = (OnlCgformHead) this.onlCgformHeadService.getById(code); if (onlCgformHead == null) { Result.error("表不存在"); } Result result = new Result(); LoginUser loginuser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); JSONObject formItemJsonObject = this.onlineService.queryOnlineFormItem(onlCgformHead, loginuser.getUsername()); result.setResult(onlineUtils.resultOnlineFormItem(formItemJsonObject)); result.setOnlTable(onlCgformHead.getTableName()); return result; }
2、前端实现
下面代码主要是实现online表单具体数据的显示与申请提交
<template> <a-card :bordered="false"> <!-- 查询区域 --> <div class="table-page-search-wrapper"> <a-form layout="inline" @keyup.enter.native="searchQuery"> <a-row :gutter="24"> </a-row> </a-form> </div> <!-- 查询区域-END --> <!-- table区域-begin --> <div> <a-table v-if= "tableVisible" ref="table" size="middle" bordered rowKey="id" class="j-table-force-nowrap" :scroll="{x:true}" :columns="columns" :dataSource="dataSource" :pagination="ipagination" :loading="loading" :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}" @change="handleTableChange" > <template slot="htmlSlot" slot-scope="text"> <div v-html="text"></div> </template> <template slot="imgSlot" slot-scope="text"> <span v-if="!text" style="font-size: 12px;font-style: italic;">无图片</span> <img v-else :src="getImgView(text)" height="25px" alt="" style="max-width:80px;font-size: 12px;font-style: italic;"/> </template> <template slot="fileSlot" slot-scope="text"> <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span> <a-button v-else :ghost="true" type="primary" icon="download" size="small" @click="downloadFile(text)"> 下载 </a-button> </template> <span slot="action" slot-scope="text, record"> <a @click="SubmitApplication(record)">提交申请</a> </span> </a-table> </div> </a-card> </template> <script> import {getOnlineFormItem,getOnlineColumns,getOnlineData} from "@/api/form"; //import { JeecgListMixin } from '@/mixins/JeecgListMixin' import '@/assets/less/TableExpand.less' import { filterObj } from '@/utils/util'; import { deleteAction, getAction,downFile,getFileAccessHttpUrl } from '@/api/manage' import Vue from 'vue' import { ACCESS_TOKEN, TENANT_ID } from "@/store/mutation-types" import {definitionStartByOnlineDataId} from "@/views/flowable/api/definition" export default { name: "OnlineTableList", //mixins:[JeecgListMixin], components: { }, props: { }, data () { return { description: 'online表单数据查询页面', taskForm: { returnTaskShow: false, // 是否展示回退表单 delegateTaskShow: false, // 是否展示委派表单 defaultTaskShow: true, // 默认处理 sendUserShow: false, // 审批用户 multiple: false, comment: "", // 意见内容 commentFileDto: { //意见里的附件 type: '', fileurl: '' }, procInsId: "", // 流程实例编号 instanceId: "", // 流程实例编号 deployId: "", // 流程定义编号 taskId: "", // 流程任务编号 procDefId: "", // 流程编号 businessKey: "", //业务主键编号 dataId: "",//业务主键编号 nodeType: "", //当前节点类型 目前只针对多实例会签做处理 vars: "", targetKey: "", category: "",//流程类别,目前主要区别online与自定义使用 onlineId: "",//online表单Id onlineDataId: "",//online数据Id }, /* 数据源 */ dataSource:[], url: { list: "", }, /* 分页参数 */ ipagination:{ current: 1, pageSize: 10, pageSizeOptions: ['10', '20', '30'], showTotal: (total, range) => { return range[0] + "-" + range[1] + " 共" + total + "条" }, showQuickJumper: true, showSizeChanger: true, total: 0 }, /* 排序参数 */ isorter:{ column: 'createTime', order: 'desc', }, /* 筛选参数 */ filters: {}, /* table加载状态 */ loading:false, /* table选中keys*/ selectedRowKeys: [], /* table选中records*/ selectionRows: [], /* 查询折叠 */ toggleSearchStatus:false, // 表头 columns: [], tableVisible: false, indexColumn: [{ title: '#', dataIndex: '', key:'rowIndex', width:60, align:"center", customRender:function (t,r,index) { return parseInt(index)+1; } }], actionColumn: [{ title: '操作', dataIndex: 'action', align:"center", fixed:"right", width:147, scopedSlots: { customRender: 'action' }, }], dictOptions:{}, superFieldList:[], } }, created() { this.taskForm.deployId = this.$route.query && this.$route.query.deployId this.taskForm.procInsId = this.$route.query && this.$route.query.procInsId this.taskForm.category = this.$route.query && this.$route.query.category //节点类型 this.taskForm.nodeType = this.$route.query && this.$route.query.nodeType //online表单id和数据id this.taskForm.onlineId = this.$route.query && this.$route.query.onlineId this.finished = this.$route.query && this.$route.query.finished console.log("this.taskForm=",this.taskForm) this.url.list = "/flowable/onlCgformHead/getData/" + this.taskForm.onlineId +"?column=id&order=desc&pageNo=1&pageSize=10&superQueryMatchType=and" getOnlineColumns(this.taskForm.onlineId).then(res => {//获取从表相关信息 console.log("getOnlineColumns res=",res) if (res.success) { this.columns = res.result.columns console.log("getOnlineColumns columns=",this.columns) this.columns.forEach(function(item, index) {//删除不需要的列 Object.keys(item).map(function (key) { null == item[key] && delete item[key] }) }) this.columns = this.indexColumn.concat(this.columns) this.columns = this.columns.concat(this.actionColumn) console.log("this.columns=",this.columns) getOnlineData(this.taskForm.onlineId).then(datares => { if (datares.success) { console.log("getOnlineData datares=",datares) this.dataSource = datares.result.records this.ipagination.total = datares.result.total console.log("getOnlineData dataSource=",this.dataSource) this.tableVisible = true } else { this.$message.error(datares.message); } }) } else { this.$message.error(res.message); } }) this.getSuperFieldList(); }, computed: { }, methods: { loadData(arg) { if(!this.url.list){ this.$message.error("请设置url.list属性!") return } //加载数据 若传入参数1则加载第一页的内容 if (arg === 1) { this.ipagination.current = 1; } var params = this.getQueryParams();//查询条件 this.loading = true; getAction(this.url.list, params).then((res) => { if (res.success) { //update-begin---author:zhangyafei Date:20201118 for:适配不分页的数据列表------------ this.dataSource = res.result.records||res.result; if(res.result.total) { this.ipagination.total = res.result.total; }else{ this.ipagination.total = 0; } //update-end---author:zhangyafei Date:20201118 for:适配不分页的数据列表------------ }else{ this.$message.warning(res.message) } }).finally(() => { this.loading = false }) }, handleTableChange(pagination, filters, sorter) { //分页、排序、筛选变化时触发 //TODO 筛选 console.log(pagination) if (Object.keys(sorter).length > 0) { this.isorter.column = sorter.field; this.isorter.order = "ascend" == sorter.order ? "asc" : "desc" } this.ipagination = pagination; this.loadData(); }, onSelectChange(selectedRowKeys, selectionRows) { this.selectedRowKeys = selectedRowKeys; this.selectionRows = selectionRows; }, getQueryParams() { //获取查询条件 let sqp = {} if(this.superQueryParams){ sqp['superQueryParams']=encodeURI(this.superQueryParams) sqp['superQueryMatchType'] = this.superQueryMatchType } var param = Object.assign(sqp, this.queryParam, this.isorter ,this.filters); param.field = this.getQueryField(); param.pageNo = this.ipagination.current; param.pageSize = this.ipagination.pageSize; return filterObj(param); }, getQueryField() { //TODO 字段权限控制 var str = "id,"; this.columns.forEach(function (value) { str += "," + value.dataIndex; }); return str; }, /* 图片预览 */ getImgView(text){ if(text && text.indexOf(",")>0){ text = text.substring(0,text.indexOf(",")) } return getFileAccessHttpUrl(text) }, /* 文件下载 */ // update--autor:lvdandan-----date:20200630------for:修改下载文件方法名uploadFile改为downloadFile------ downloadFile(text){ if(!text){ this.$message.warning("未知的文件") return; } if(text.indexOf(",")>0){ text = text.substring(0,text.indexOf(",")) } let url = getFileAccessHttpUrl(text) window.open(url); }, initDictConfig(){ }, /** 发起申请 */ SubmitApplication(row) { var params = Object.assign({ dataId: row.id }, '[]'); //variables.variables = formData; //console.log("variables=", this.variables); // 启动流程并将表单数据加入流程变量 console.log("SubmitApplication this.taskForm=",this.taskForm) console.log("SubmitApplication row=",row) definitionStartByOnlineDataId(row.id, this.taskForm.onlineId, this.taskForm.deployId, params).then(res => { console.log("definitionStartByOnlineDataId res=",res); this.$message.success(res.message); }) /** online表单业务流程申请 */ /*this.$router.push({ path: '/flowable/task/record/index', query: { deployId: this.taskForm.deploymentId, procDefId:this.taskForm.procDefId, onlineId: this.taskForm.onlineId, category: this.taskForm.category, businessKey: row.id, finished: true } })*/ }, getSuperFieldList(){ let fieldList=[]; this.superFieldList = fieldList } } } </script> <style scoped> @import '~@assets/less/common.less'; </style>
3、审批流程的显示
下面就是根据后端提供的online表单数据进行显示与处理
//流程过程中有online表单数据,获取online表单配置与数据 if (res.result.hasOwnProperty('onlineConfig')) { this.onlineViewForm.onlineFormData = res.result.onlineConfig; console.log("onlineViewForm.onlineFormData=",this.onlineViewForm.onlineFormData); console.log("this.taskForm=",this.taskForm) var sonlineId = res.result.onlineId getOnlineFormData(sonlineId,this.taskForm.onlineDataId).then(res => { console.log("getOnlineFormData res=",res); if (res.success) { this.onlineViewForm.model = res.result; console.log("onlineViewForm.model=",this.onlineViewForm.model); getOnlineFormItem(sonlineId).then(itemres => {//获取从表相关信息 if (itemres.success) { console.log("getOnlineFormItem itemres=",itemres) this.onlineFormItem.formData = itemres.result if(itemres.result.head.subTableStr != null) { var subTable = itemres.result.head.subTableStr this.onlineFormItem.subTable = subTable.split(",") console.log("this.onlineFormItem.subTable=",this.onlineFormItem.subTable) for (var i=0;i<this.onlineFormItem.subTable.length;i++) { var tablename = this.onlineFormItem.subTable[i] if(this.onlineFormItem.formData.schema.properties.hasOwnProperty(tablename)) { this.onlineFormItem.tableForm.tableName[i] = tablename this.onlineFormItem.tableForm.columns[i] = this.onlineFormItem.formData.schema.properties[tablename].columns this.onlineFormItem.dataSource[i] = this.onlineViewForm.model[tablename] } } console.log("this.onlineFormItem.tableForm=",this.onlineFormItem.tableForm) console.log("this.onlineFormItem.dataSource=",this.onlineFormItem.dataSource) } this.onlineViewForm.disabled = true; this.onlineViewForm.isNew = false; this.onlineViewForm.visible = true; } else { this.$message.error(itemres.message); } }) } }) }
4、效果图