请选择 进入手机版 | 继续访问电脑版

Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 5278|回复: 2

光明OA,关于包含列表功能的流程问题

[复制链接]

2

主题

5

帖子

40

积分

新手上路

Rank: 1

积分
40
发表于 2022-10-8 16:26:12 | 显示全部楼层 |阅读模式
在流程的列表中内容添加项过多,或者驳回到开始节点对列表重新操作后,在提交流程就会发生列表内容丢失的情况。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

2

主题

5

帖子

40

积分

新手上路

Rank: 1

积分
40
 楼主| 发表于 2022-10-25 16:25:34 | 显示全部楼层
本帖最后由 zhanglei 于 2022-10-25 16:50 编辑

附件中为补充的问题,出现问题的流程为社区资金申请流程以及办公物品入库流程的子列表。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

2

主题

5

帖子

40

积分

新手上路

Rank: 1

积分
40
 楼主| 发表于 2022-10-25 17:53:12 | 显示全部楼层
本帖最后由 zhanglei 于 2022-10-25 17:57 编辑

附件中的第一个问:原因是com.siqiansoft.frawework.GridDataHandler类中getSubtableData()方法中,加入下面的红色代码。出现问题的原因是,两个子列表的集合号不同,其中一个子列表加入缓存,缓存中找不到另外一个子列表的数据,就会返回null,加的一段代码的作用是,如果在缓存中找不到另外一个子列表数据,就返回旧的子列表数据,oldData中的数据来源是查询eap_vw_done视图中的content字段;
  1.     public ArrayList<HashMap<String, String>> getSubtableData(String pid, String fieldId, ArrayList<HashMap<String, String>> oldData) {
  2. DataGridModel datagrid = this.getTableData(pid);
  3. if (datagrid != null && datagrid.getData() != null && datagrid.getData().size() != 0) {
  4. LinkedHashMap<String, HashMap<String, String>> data = (LinkedHashMap) datagrid.getData().get(fieldId);
  5. if (data != null && data.size() != 0) {
  6. if (oldData == null) {
  7. oldData = new ArrayList();
  8. }

  9. Iterator it = data.keySet().iterator();
  10. while (it.hasNext()) {
  11. String rowId = (String) it.next();
  12. this.modifyData(oldData, rowId, (HashMap) data.get(rowId));

  13. }
  14. return oldData;
  15. } else {
  16. <font color="#ff0000">if (oldData != null && oldData.size() > 0) {
  17. return oldData;
  18. }</font> else {
  19. return null;
  20. }

  21. }
  22. } else {
  23. return oldData;
  24. }
  25. }
复制代码

附件中第二个问题:原因是由于子列表中的内容不是点击新增生成的,所以代码执行到com.siqiansoft.frawework.GridDataHandler类中modifyData方法时,获取不到$rowid的值,最开始的解决方案是加入下面的绿色的代码,思路是不使用rowid来做对比,只使用id值来做对比,但这样的方法缺陷很大,而且问题也没有得到解决,最后的解决方法是将下面绿色的代码去掉,然后在流程初始化填入子列表内容的脚本中,将列表内容查询出来之后,手动给每一个查询结果添加$rowid的值,值为集合号+时间戳+数据条数;第一个帖子中的问题也是因为这个原因;
  1. private void modifyData(ArrayList<HashMap<String, String>> oldData, String rowId, HashMap<String, String> data) {
  2.         String status = (String)data.get("$status");
  3.         if (status != null && !status.equals("")) {
  4.             data.remove("$status");
  5.             if (status.equals("add")) {
  6.                 oldData.add(data);
  7.             } else {
  8.                 HashMap map;
  9.                 int i;
  10.                 if (status.equals("edit")) {
  11.                     for(i = 0; i < oldData.size(); ++i) {
  12.                         map = (HashMap)oldData.get(i);

  13. <font color="#008000">                        if (map.get("$rowid") != null) {</font>
  14.                             if (((String)map.get("$rowid")).equals(rowId)) {
  15.                                 oldData.set(i, data);
  16.                                 return;
  17.                             }
  18. <font color="#008000">                        }else if (map.get("id").equals(data.get("id"))) {
  19.                             oldData.set(i, data);

  20.                         }else if (!map.get("id").equals(data.get("id"))) {
  21.                             oldData.remove(i);
  22.                         }
  23.                     }</font>

  24.                 } else  if (status.equals("delete")) {

  25.                         for(i = 0; i < oldData.size(); ++i) {
  26.                             map = (HashMap)oldData.get(i);
  27.                             if (map.get("$rowid") != null) {
  28.                                 if (((String) map.get("$rowid")).equals(rowId)) {
  29.                                     oldData.remove(i);
  30.                                     return;
  31.                                 }
  32.                             }<font color="#008000">else if (map.get("id").equals(data.get("id"))) {
  33.                                 oldData.remove(i);
  34.                             }</font>
  35.                         }
  36.                 }
  37.             }
  38.         }
  39.     }
复制代码

附件中的第三个问题:出现问题的原因是由于数据刚刚加载,还未做任何编辑以及修改,所以数据没有加入缓存,这个时候删除子列表数据在提交流程,在后台中缓存的数据就只有表单中存在的数据,正常情况下删除的数据库也会出现在缓存中,并且$status的值为delete,这样代码运行到com.siqiansoft.frawework.GridDataHandler类中getSubtableData()方法时,就会将$status为delete的数据从oldData中删除,并且返回oldData,如果缓存中不存在删除的数据就无法删除oldData中多余的数据,就会删除失效;问题的解决思路是,在开始节点,表单刚刚加载,就将子列表中的数据加载进缓存,这里我采用的方法是,在jsp页面中加入一个js方法,如下列代码,模仿子列表内容修改完成后请求接口的方法,在页面加载完成就调用一次接口,将子列表数据放入缓存,并且$status的值一定要是delete,这样的话编辑所使用的数据的$status的值会改为edit,不需要的数据就会删除掉。
  1. $(function(){
  2.         setTimeout(function(){
  3.             if($('button[actionid=COMMIT]').text() == '开始'){
  4.                 var id = document.getElementById('$ID').value
  5.                 for (var i = 0; i < $('tr[rowid]').length ; i++ ){
  6.                     var rowid = $('tr[rowid]')[i].getAttribute('rowid')
  7.                     $.ajax({
  8.                         url: "<font color="#ff0000">./GridAction.cmd?$ACTION=cache&$id="+id+"&$gridid=l01&$rowid="+rowid</font> ,
  9.                         type: "POST",
  10.                         dataType: "json",
  11.                         data: {<font color="#ff0000">$status:'delete'</font>,
  12.                                $changed:"true",
  13.                                rndval:new Date().getTime()},
  14.                      success:function(){
  15.                             console.log("发送成功")
  16.                         }
  17.                     });
  18.                 }

  19.             }

  20.         },300)
  21.     })
复制代码



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|立达政通科技集团

GMT+8, 2026-6-8 13:23 , Processed in 0.059436 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表