|
|

楼主 |
发表于 2022-10-25 17:53:12
|
显示全部楼层
本帖最后由 zhanglei 于 2022-10-25 17:57 编辑
附件中的第一个问:原因是com.siqiansoft.frawework.GridDataHandler类中getSubtableData()方法中,加入下面的红色代码。出现问题的原因是,两个子列表的集合号不同,其中一个子列表加入缓存,缓存中找不到另外一个子列表的数据,就会返回null,加的一段代码的作用是,如果在缓存中找不到另外一个子列表数据,就返回旧的子列表数据,oldData中的数据来源是查询eap_vw_done视图中的content字段;
- public ArrayList<HashMap<String, String>> getSubtableData(String pid, String fieldId, ArrayList<HashMap<String, String>> oldData) {
- DataGridModel datagrid = this.getTableData(pid);
- if (datagrid != null && datagrid.getData() != null && datagrid.getData().size() != 0) {
- LinkedHashMap<String, HashMap<String, String>> data = (LinkedHashMap) datagrid.getData().get(fieldId);
- if (data != null && data.size() != 0) {
- if (oldData == null) {
- oldData = new ArrayList();
- }
- Iterator it = data.keySet().iterator();
- while (it.hasNext()) {
- String rowId = (String) it.next();
- this.modifyData(oldData, rowId, (HashMap) data.get(rowId));
- }
- return oldData;
- } else {
- <font color="#ff0000">if (oldData != null && oldData.size() > 0) {
- return oldData;
- }</font> else {
- return null;
- }
- }
- } else {
- return oldData;
- }
- }
复制代码
附件中第二个问题:原因是由于子列表中的内容不是点击新增生成的,所以代码执行到com.siqiansoft.frawework.GridDataHandler类中modifyData方法时,获取不到$rowid的值,最开始的解决方案是加入下面的绿色的代码,思路是不使用rowid来做对比,只使用id值来做对比,但这样的方法缺陷很大,而且问题也没有得到解决,最后的解决方法是将下面绿色的代码去掉,然后在流程初始化填入子列表内容的脚本中,将列表内容查询出来之后,手动给每一个查询结果添加$rowid的值,值为集合号+时间戳+数据条数;第一个帖子中的问题也是因为这个原因;
- private void modifyData(ArrayList<HashMap<String, String>> oldData, String rowId, HashMap<String, String> data) {
- String status = (String)data.get("$status");
- if (status != null && !status.equals("")) {
- data.remove("$status");
- if (status.equals("add")) {
- oldData.add(data);
- } else {
- HashMap map;
- int i;
- if (status.equals("edit")) {
- for(i = 0; i < oldData.size(); ++i) {
- map = (HashMap)oldData.get(i);
- <font color="#008000"> if (map.get("$rowid") != null) {</font>
- if (((String)map.get("$rowid")).equals(rowId)) {
- oldData.set(i, data);
- return;
- }
- <font color="#008000"> }else if (map.get("id").equals(data.get("id"))) {
- oldData.set(i, data);
- }else if (!map.get("id").equals(data.get("id"))) {
- oldData.remove(i);
- }
- }</font>
- } else if (status.equals("delete")) {
- for(i = 0; i < oldData.size(); ++i) {
- map = (HashMap)oldData.get(i);
- if (map.get("$rowid") != null) {
- if (((String) map.get("$rowid")).equals(rowId)) {
- oldData.remove(i);
- return;
- }
- }<font color="#008000">else if (map.get("id").equals(data.get("id"))) {
- oldData.remove(i);
- }</font>
- }
- }
- }
- }
- }
复制代码
附件中的第三个问题:出现问题的原因是由于数据刚刚加载,还未做任何编辑以及修改,所以数据没有加入缓存,这个时候删除子列表数据在提交流程,在后台中缓存的数据就只有表单中存在的数据,正常情况下删除的数据库也会出现在缓存中,并且$status的值为delete,这样代码运行到com.siqiansoft.frawework.GridDataHandler类中getSubtableData()方法时,就会将$status为delete的数据从oldData中删除,并且返回oldData,如果缓存中不存在删除的数据就无法删除oldData中多余的数据,就会删除失效;问题的解决思路是,在开始节点,表单刚刚加载,就将子列表中的数据加载进缓存,这里我采用的方法是,在jsp页面中加入一个js方法,如下列代码,模仿子列表内容修改完成后请求接口的方法,在页面加载完成就调用一次接口,将子列表数据放入缓存,并且$status的值一定要是delete,这样的话编辑所使用的数据的$status的值会改为edit,不需要的数据就会删除掉。
- $(function(){
- setTimeout(function(){
- if($('button[actionid=COMMIT]').text() == '开始'){
- var id = document.getElementById('$ID').value
- for (var i = 0; i < $('tr[rowid]').length ; i++ ){
- var rowid = $('tr[rowid]')[i].getAttribute('rowid')
- $.ajax({
- url: "<font color="#ff0000">./GridAction.cmd?$ACTION=cache&$id="+id+"&$gridid=l01&$rowid="+rowid</font> ,
- type: "POST",
- dataType: "json",
- data: {<font color="#ff0000">$status:'delete'</font>,
- $changed:"true",
- rndval:new Date().getTime()},
- success:function(){
- console.log("发送成功")
- }
- });
- }
- }
- },300)
- })
复制代码
|
|