1、前端html代码如下:

<body><div class="page-loading"></div><div class="fui-toolbar"><div class="uc-handlecontrols" id="handlecontrols" action="handlecontrolsaction.handleCtrl" style="width: 100%"></div></div><div class="fui-content"><div id="fui-form" class="fui-form"><div class="fui-accordions"><div role="accordion" opened="true"><div role="head" title="表单填写"></div><div role="body"><div class="hidden"><a class="mini-button" id="btnSaveFrom" onclick="eputil.saveWorkflowForm">保存</a><a class="mini-button" id="btnSubmit" onclick="eputil.submitWorkflow">提交</a></div><div role="form"><div role="row"><div role="control" label="案件名称" starred="true"><input id="casename" class="mini-textbox" bind="dataBean.casename" required="true" /></div><div role="control" label="应约办案区" starred="true"><input id="handleareaname" class="mini-buttonedit" bind="text:handleAreaName,value:dataBean.handleareaguid"allowInput="false" onbuttonclick="eputil.openFrameOuAreaTreeSingle" required="true" showClose="true"oncloseclick="epoint.clear('handleareaname');" /></div></div><div role="row"><div role="control" label="案件编号"><input id="casecode" class="mini-textbox" bind="dataBean.casecode" /></div><div role="control" label="案件类型" starred="true"><input id="casetype" required="true" class="mini-combobox" bind="dataBean.casetype" allowInput="false"action="getCasetypeModel" /></div></div><div role="row"><div role="control" label="简要案情"><input id="casebrief" class="mini-textarea" bind="dataBean.casebrief" maxlength="500" /></div></div></div></div></div><div role="accordion"><div role="head" title="嫌疑人信息"></div><div role="body"><div role="form"><div class="mb5"><a class="mini-button" id="addSuspect" onclick="addSuspect">添加嫌疑人</a></div><div id="datagrid" class="mini-datagrid" idField="rowguid" action="getDataGridData" sortOrder="desc" showPager="false"allowResize="false" multiSelect="true" allowCellEdit="false" allowCellSelect="true"><div property="columns"><div type="indexcolumn" width="50" headerAlign="center">序</div><div field="suspectname" width="100" headerAlign="center">嫌疑人姓名<input property="editor" class="mini-textbox " style="width: 100%;" /></div><div field="idcardnumber" name="idcardnumber" width="170" headerAlign="center">身份证号码<input property="editor" class="mini-textbox" vtype="idCard" style="width: 100%;"onvalidation="onIdCardNumberRepeatValidation" /></div><div field="sex" name="sex" width="100" headerAlign="center" type="comboboxcolumn">性别<input property="editor" class="mini-combobox" textField="text" valueField="value" style="width: 100%;"allowInput="false" /></div><div field="birthdate" width="150" headerAlign="center" dataFormat="yyyy-MM-dd"data-options="{'format':'yyyy-mm-dd'}">出生日期<input property="editor" class="mini-datepicker" style="width: 100%;" allowInput="false" /></div><div field="livingaddress" width="100%" headerAlign="center">现住址<input property="editor" class="mini-textbox" style="width: 100%;" /></div><div field="ordernumber" width="100" headerAlign="center">排序号<input property="editor" class="mini-textbox " inputStyle="text-align:center;" vtype="int" style="width: 100%;" /></div><div width="60" align="center" headerAlign="center" renderer="onEditRowRenderer">修改</div><!-- 这种删除时针对行编辑设计的 --><div width="60" align="center" headerAlign="center" renderer="eputil.onDeleteRowRenderer">删除</div></div></div></div></div></div><div role="accordion"><div role="head" title="签署意见"></div><div role="body"><div role="form"><div class="uc-workflowopinion" id="workflowopinion" action="workflowopinionaction.opinionCtrl"data-options="{'showmode' : 1}" style="width: 100%;"></div></div></div></div></div></div></div><script src="../../../rest/resource/jsboot"></script><script src="../../../frame/pages/epointworkflow/js/workflowjsboot.js"></script><script src="../../../frame/pages/epointworkflow/js/tableproperty.js"></script><script src="./trainzfbaorderinfoworkflow.js"></script><script>epoint.initPage('trainzfbaorderinfoapplyworkflowaction', '', function(data) {setControlsAccessRight(data);eputil.initEditTable('datagrid');});var datagrid = mini.get('datagrid');eputil.beforeValidate = function() {if (datagrid.data.length == 0) {epoint.alert("请添加嫌疑人信息!");return false;}}</script>
</body>

2、JAVASCRIPT代码为:

var datagrid = mini.get("datagrid");
var sexModel = [];epoint.initPage('trainzfbaorderinfoapplyworkflowaction', '', function(data) {setControlsAccessRight(data);eputil.initEditTable('datagrid');});var datagrid = mini.get('datagrid');eputil.beforeValidate = function() {if (datagrid.data.length == 0) {epoint.alert("请添加嫌疑人信息!");return false;}}/*** 性别下拉框*/
datagrid.on("load", function() {datagrid.on("update", function() {console.log("update", "执行update啦")epoint.execute("getSexModel", "@none", null, function(data) {sexModel = data;for (var i = 0, length = datagrid.data.length; i < length; i++) {datagrid.getCellEditor("sex", i).setData(data);// datagrid.getCellEditor("sex", i).setAllowInput(true);// datagrid.getCellEditor("sex", i).setValueFromSelect(true);}})})
});/*** 新增嫌疑人*/
function addSuspect() {var newRow = {};datagrid.addRow(newRow);// 需要先开启行编辑datagrid.beginEditRow(newRow);// 再将model信息塞进单元格datagrid.getCellEditor("sex", newRow).setData(sexModel);
}/*** 绘制行编辑按钮* * @param e*/
function onEditRowRenderer(e) {return epoint.renderCell(e, "action-icon icon-edit", "openEdit", "epoint_total");
}/*** 修改嫌疑人信息* * @param e*/
function openEdit(e) {epoint.openTopDialog("修改嫌疑人信息", 'gatrain/zfba/order/trainzfbaordersuspectedit', editSuspectCallBack, {'width' : eputil.dialogWidth,'height' : eputil.dialogHeight,'param' : {suspectname : e.suspectname,idcardnumber : e.idcardnumber,sex : e.sex,birthdate : e.birthdate,address : e.address}});
}function editSuspectCallBack(e) {if (e && e != "close") {// 行信息修改步骤:需先提交-->更新-->开启行编辑-->特殊行信息处理datagrid.commitEditRow(datagrid.getSelected())datagrid.updateRow(datagrid.getSelected(), e);datagrid.beginEditRow(datagrid.getSelected(), e);datagrid.getCellEditor("sex", datagrid.getSelected()).setData(sexModel);}
}/*** 身份证判重复* * @param e*            e存储了当前单元格信息*/
function onIdCardNumberRepeatValidation(e) {// 判断当前单元格是否单元格验证if (e.isValid) {// 如果单元格值为空,无需判断if (!e.value) {return;}// 循环表格行信息for (var i = 0, length = datagrid.data.length; i < length; i++) {// 如果是当前行,无需进行比较if (e.sender.ownerRowID == i + 1) {continue;}// 如果当前单元格的值 和 查找表格i行idcardnumber列的值相同,则返回验证不通过if (e.value == datagrid.getCellEditor("idcardnumber", i).getValue()) {e.errorText = '身份证不能重复!';e.isValid = false;}}}
}

3、 控件的信息展示与输入

3.1、有动态行添加或其他的关联表model

前端与后端关联(在上面html代码嫌疑人部分里面找)

action="getDataGridData"

    /*** 嫌疑人model,注意修改*/protected DataGridModel<TrainZfbaOrderSuspect> model = null;public DataGridModel<TrainZfbaOrderSuspect> getDataGridData() {if (model == null) {model = new DataGridModel<TrainZfbaOrderSuspect>(){@Overridepublic List<TrainZfbaOrderSuspect> fetchData(int first, int pageSize, String sortField, String sortOrder) {if (StringUtil.isBlank(rowGuid)) {return new ArrayList<>();}TrainSqlCondition condition = TrainSqlCondition.getSearchCondition(getRequestContext().getComponents());condition.exact("orderguid", rowGuid);this.setRowCount(zfbaOrderSuspectService.getPZfbaOrderSuspectCount(condition));return zfbaOrderSuspectService.getPZfbaOrderSuspectList(0, 0, sortField, sortOrder, condition);}};}return model;}

3.2、有代码项的model

后端代码:

    /*** 案件类型*/protected List<SelectItem> caseTypeModel = null;/*** 性别类型*/protected List<SelectItem> sexModel = null;public List<SelectItem> getSexModel() {if (sexModel == null) {sexModel = DataUtil.convertMap2ComboBox(CodeModalFactory.factory(TrainCommonConstValue.SELECTITEM_TYPE_NAME, TrainCodeNameConstValue.SEX, null, false));}return this.sexModel;}public List<SelectItem> getCasetypeModel() {if (caseTypeModel == null) {caseTypeModel = DataUtil.convertMap2ComboBox(CodeModalFactory.factory(TrainCommonConstValue.SELECTITEM_TYPE_NAME, TrainCodeNameConstValue.YY_CASE_TYPE, null, false));}return this.caseTypeModel;}

动态行(在此为性别)需要添加前端javascript代码代码赋值

var datagrid = mini.get("datagrid");
var sexModel = [];/*** 性别下拉框*/
datagrid.on("load", function() {datagrid.on("update", function() {console.log("update", "执行update啦")/*查询的到sexmodel的值,给datagrid的属性为sex的列赋值*/epoint.execute("getSexModel", "@none", null, function(data) {sexModel = data;for (var i = 0, length = datagrid.data.length; i < length; i++) {datagrid.getCellEditor("sex", i).setData(data);// datagrid.getCellEditor("sex", i).setAllowInput(true);// datagrid.getCellEditor("sex", i).setValueFromSelect(true);}})})
});

其它的在input标签上绑定获取后端model的   action="getCasetypeModel"

3.3、有点击树需要展示文本信息的

html页面输入框代码如下:

/*bind是文本信息绑定后端的handleAreaName*/
<input id="handleareaname" class="mini-buttonedit" bind="text:handleAreaName,value:dataBean.handleareaguid"allowInput="false" onbuttonclick="eputil.openFrameOuAreaTreeSingle" required="true" showClose="true"oncloseclick="epoint.clear('handleareaname');" />

后端代码如下:

protected String handleAreaName = "";/**在pageload方法里获取具体的值**/
@Overridepublic void trainPageLoad() {trainOrderPageLoad();// 获取应约办案区名称if (StringUtil.isNotBlank(dataBean.getHandleareaguid())) {TrainBasicArea pBasicArea = basicAreaService.findTrainBasicArea(dataBean.getHandleareaguid());if (pBasicArea != null) {handleAreaName = pBasicArea.getAreaname();}}}public String getHandleAreaName() {return handleAreaName;}public void setHandleAreaName(String handleAreaName) {this.handleAreaName = handleAreaName;}

4、我们一定需要做的完善的提交流程代码

4.1、pageload

@Overridepublic void trainOrderPageLoad() {if (StringUtil.isBlank(rowGuid)) {dataBean = new TrainZfbaOrderinfo();}else {dataBean = zfbaOrderinfoService.findPZfbaOrderinfo(rowGuid);if (dataBean == null) {addCallBackDataError();}}}

4.2、save时需要做的(重点)

public boolean save() {GaOperateInfo operateInfo = GaOperateInfo.build(this);GaEntityDto<TrainZfbaOrder> dto = null;dataBean.setOperateuserguid(userSession.getUserGuid());dataBean.setOperateusername(userSession.getDisplayName());dataBean.setPviguid(currentWorkItem.getProcessVersionInstanceGuid());if (StringUtil.isBlank(rowGuid)) {dataBean.setRowguid(UUID.randomUUID().toString());dto = trainZfbaOrderService.insertTrainZfbaOrder(dataBean, operateInfo);}else {dto = trainZfbaOrderService.updateTrainZfbaOrder(dataBean, operateInfo);}rowGuid = dataBean.getRowguid();wfInstanceAPI9.createOrUpdateContext(pvi, getSQLTableName(), rowGuid, 2);// 嫌疑人信息处理List<Map<String, Object>> list = getDataGridData().getFeedbackdata();if (list != null && !list.isEmpty()) {trainZfbaOrderSuspectService.deleteTrainZfbaOrderSuspect(dataBean.getRowguid(), operateInfo);}List<TrainZfbaOrderSuspect> pZfbaOrderSuspectList = new ArrayList<>();for (Map<String, Object> map : list) {TrainZfbaOrderSuspect suspectinfo = new TrainZfbaOrderSuspect();suspectinfo.setRowguid(UUID.randomUUID().toString());suspectinfo.setOrderguid(dataBean.getRowguid());suspectinfo.setSuspectname((String) map.get("suspectname"));suspectinfo.setIdcardnumber((String) map.get("idcardnumber"));suspectinfo.setSex((String) map.get("sex"));suspectinfo.setLiveaddress((String) map.get("address"));if (StringUtil.isNotBlank(map.getOrDefault("birthday", ""))) {suspectinfo.setBirthday(EpointDateUtil.convertString2Date((String) map.get("birthday"), EpointDateUtil.DATE_FORMAT));}trainZfbaOrderSuspectService.insertTrainZfbaOrderSuspect(suspectinfo, operateInfo);pZfbaOrderSuspectList.add(suspectinfo);}// 如果满足业务逻辑返回true,msg为空addCallbackParam("msg", "");return true;}

4.3、submit提交时

protected FrameOuService9 frameOuService9 = new FrameOuService9();
protected WFAPI9 wfAPI = new WFAPI9();/*** 提交流程*/public void submit() {if (save()) {FrameOu ou = frameOuService9.getOuByOuGuid(dataBean.getRowguid());wfAPI.getWFInstanceAPI().createOrUpdateContext(currentWorkItem.getProcessVersionInstanceGuid(), "WaitHandleTitle", "【预约审核通过】" + ou == null ? "" : ou.getOuname() + " + " + dataBean.getCasename(), 2);wfAPI.getWFInstanceAPI().singlematerialSubmit(getSQLTableName(), rowGuid, currentWorkItem.getProcessVersionInstanceGuid(), userSession.getUserGuid());}}

其它的都会生成,看需求改

带动态行的工作流需要我们自己做的相关推荐

  1. SpringBoot+Poi-tl根据Word模板动态生成word(含动态行表格、合并单元格)

    本编文章继SpringBoot+Poi-tl根据Word模板动态生成word(含动态行表格)文章之后 介绍Poi-tl导出word的延伸功能: 所需依赖以及word模板所属位置 见 SpringBoo ...

  2. 对tableView三种计算动态行高方法的分析

    tableView是一个神奇的东西,可以这么说,就算是一个初学者如果能把tableView玩的很6,那编一般的iOS的需求都问题不大了.tableView是日常开发中用烂了的控件,但是关于tableV ...

  3. mysql行转列sql函数_sql动态行转列的两种方法

    第一种方法: 代码如下: select *from ( select Url,case  when  Month=01 then  '1月' when  Month=02 then '2月' when ...

  4. python编写请求参数带文件_转载:如何编写一个带命令行参数的Python文件

    看到别人执行一个支持命令行参数的python文件,瞬间觉得高大上起来.牛逼起来,那么如何编写一个带命令行参数的python脚本呢?不用紧张,下面将简单易懂地让你学会如何让自己的python脚本,支持命 ...

  5. 不同曲线设置标签_带动态标签的面积曲线图

    带动态标签的面积曲线图: - y轴标签最后一个的格式跟其他不同 - 选定的图表数据在图表上的位置和标签 - x轴上第一第二个刻度比其他刻度长,用chart.xValueAxis.specialTick ...

  6. c语言学习进阶-C语言带命令行参数的文件数据批量计算

    C语言带命令行参数的文件数据批量计算 (1)假设输入文件中的数据为多行整数,把数据文件命名为"InputData.txt",也可以命名为任意的文件名,尝试设计一个c 语言程序, 主 ...

  7. c语音学习进阶-C语言带命令行参数的程序设计

    C语言带命令行参数的程序设计 (1)深入理解并学习带命令行参数的程序设计方法,使用c 语言完成带命令行参数的科学计算程序,能从给定的任意文件名的文件当中输入数据,并能向给定的任意文件名的输出文件当中输 ...

  8. mssql 动态行转列。

    mssql 动态行转列. create table #a (a int , b char(4)) insert into #a select 1,'张三' insert into #a select ...

  9. WSS3.0自带的问题跟踪工作流(Issue Tracking)的说明

    WSS3.0自带的问题跟踪工作流(Issue Tracking),是一个三态工作流,具有三个状态:Active.Resolved和Closed.具体说明可以参照以下微软的网站: http://offi ...

  10. vs2013中带命令行参数的调试方法

    @VS2013带命令行参数的调试方法 在C++函数参数传递中,我们知道,main函数是演示C++程序如何向函数传递数组的好例子.一般来说,我们定义的大多main函数都只有空的形参列表: int mai ...

最新文章

  1. c++11 多线程 1c++ concurrency in action
  2. 模板 - 莫比乌斯反演(常用技巧)
  3. 【大牛疯狂教学】java程序员大专找不到工作
  4. webstorm下debug调试react js程序
  5. linux ip端口配置文件,Linux /etc/network/interfaces配置接口方法
  6. 电话光端机安装的方法,电话光端机设备安装注意事项
  7. BOM(Browser Object Model)
  8. 【转】1:C#的三种异步的详细介绍及实现
  9. 用java实现combin函数_Java8的CompletableFuture
  10. C#.Net工作笔记005---c#中list合并去重_以及单纯合并_值类型list去重
  11. Unity Editor Toolbar 编辑器扩展
  12. ttf文件 python 打开_[译]JS解析TTF字体文件
  13. ×××全功能邮件系统(6)
  14. ue4渲染速度太慢_UE4实时渲染,不用合成。第一部完全UE4渲染动画片是这样炼成的~...
  15. 使用cpufreq给CPU临时调整主频
  16. Neo4j Desktop(Neo4j 桌面)安装插件
  17. 逍遥模拟器使用指南(四、逍遥安卓模拟器电脑版xposed框架教程)
  18. DCDC开关电源电磁兼容(二)什么是LISN(有内部电路详细解释)
  19. 数学中说的线性关系线性是什么意思?
  20. java 计算日出日落时间

热门文章

  1. Flutter更改主题颜色报错:type ‘Color‘ is not a subtype of type ‘MaterialColor‘
  2. 通过路由器端口映射实现外网IP访问内网服务器
  3. (四)keycloak 自定义用户(SPI)开发
  4. “踢群第一案”上热搜的背后
  5. 微信状态栏隐藏 HTML,微信里几个实用的隐藏小技巧!
  6. 用户分层 | 用户画像
  7. linux 限制进程网速,Linux限制网速
  8. IPV6电视播放器V1.0.3
  9. c++中计算2得n次方_【复习专题】解析二元一次方程知识点及应用
  10. Python 文字排版工具