# 统一待办异构流程-打开关闭刷新相关

# 一、PC端

## 1.1、第三方系统提交后，列表未及时刷新

> 背景：pc端打开异构系统是window.open方式，标准是监听被打开页面close关闭后，延迟1s触发列表刷新

- 如果第三方是异步提交，先关闭页面再后端提交
- 第三方提交后推送到E10统一待办本身需要时间

> 当以上时间超过1s时，会存在异构流程提交后列表没刷新。可通过下面ecode调整延长时间规避

```
//代码复制，新建ecode发布即可
//1500表示页面关闭后1.5s触发刷新，可根据实际情况调整时间
window.deferRefreshWfListTimes = 1500;
```

EM10-PC客户端

## 1.2、E10流程推送E9，E9待办列表打开E10，提交后刷新E9待办列表（仅PC端）

> 统一待办推送是异步的，延迟时间不一定准确要具体微调；且增加后会导致提交后关闭等待2s【代码放E10系统】

```
import { regHook } from '@weapp/utils';

const flowPageLoadFn = (params) => {
  //可以获取到流程sdk实例对象
  const wffpSdk = window.weappWorkflow.getFlowPageSDK();
  const { baseParam } = params;
  if (baseParam.isCreate)
    return;
  wffpSdk.registerInterceptEvent('ClosePageIntercept', (successFn, failFn, params) => {
    console.log(successFn, failFn, params)
    if (params.isSubmitClose) {
      window.setTimeout(() => {
        window.opener?._table?.reLoad();
        successFn();
      }, 2000); //2s后刷新待办，因为统一待办推送是异步的，时间根据测试情况自行调整，无法准确保障会刷新；时间会导致提交后关闭也延迟
    } else {
      successFn();
    }
  })
}

//仅对pc端生效，原理：提交关闭的时候触发E9列表reLoad事件，会影响关闭时间同样延迟2s
regHook('weappWorkflow', 'FPMainTabWillMount', flowPageLoadFn);
```


## 1.3、EM10-PC客户端，打开异构系统流程，提交后不刷新E10列表

> 原因：EM10客户端不支持opener通信，无法监听到close页面的关闭动作。需改为使用客户端封装的广播机制通信

> 方案：

- 列表（含流程列表组件、待办列表）点击打开异构系统，默认会注册广播事件
- 第三方系统流程，提交后，需主动触发广播实现列表刷新


> E9系统推E10：E9提交后触发广播，参考下面代码，修改域名即可【代码放E9系统】
```
const isE10 = window.navigator.userAgent.indexOf('weapp-pc') > -1;  
  if(isE10){  
    window.setTimeout(()=>{  
      const e10address = 'http://tst-portal.nyjtcloud.com:20600/';		//E10系统域名，要能加载下面js文件  
      const filestr = '/build/em-jssdk/static/js/lib.js';  
      window.loadjs(e10address+filestr, 'em10appjssdk', ()=>{  
        if(WfForm && window.weapp){  
          WfForm.registerCheckEvent(WfForm.OPER_CLOSE, function(callback){  
              //触发广播实现E10刷新  
              window.setTimeout(()=>{  
                window.weapp.ready(function(){  
                    weapp.invoke("postBroadcast", {  
                        name:"FP_RELOAD_LIST", //E10广播名称  
                        param:{}  
                    });  
                });  
                callback();    //继续关闭  
              }, 100)  
          });  
        }  
      });  
    }, 200);  
  }
```

> 如果是其他系统推送的，需要第三方二开处理，大概思路：

```
//第一步：判断是E10客户端，在打开页面 或者 提交关闭前，加载E10的js文件
const isE10 = window.navigator.userAgent.indexOf('weapp-pc') > -1;
if(isE10){
    const e10address = '*';		//需配置E10系统域名，要能加载下面js文件
    const filestr = '/build/em-jssdk/static/js/lib.js';
    //第三方通过loadjs等手段加载js资源，加载完成后
}


//第二步：第三方流程提交后，触发相关js方法（依赖上一步资源加载完成），触发可以延迟500ms触发（统一待办推送是异步）
if(isE10){
  window.setTimeout(()=>{
      window.weapp.ready(function(){
          weapp.invoke("postBroadcast", {
              name:"FP_RELOAD_LIST", //E10广播名称
              param:{}
          });
      });
  }, 500)
}
```

# 二、移动端

## 2.1 app打开异构系统流程走webview新窗口【最低2512基线】

> 标准打开统一待办推送的第三方流程，默认以locaiton.href方式页面跳转

- locaiton.href页面跳转，原列表条件无法保留
- 可通过下面ecode包+开发方式，实现走webview方式跳转
- 公有企业微信不支持，因为公有企微仅支持单webview

### 2.1.1、EMobile客户端/钉钉/飞书【公有企微不支持】

> 如果是钉钉/飞书，最低需2604基线

> 以下代码完整复制，新建个ecode前置加载发布

```
import { regHook, ua, weappSDK } from '@weapp/utils';

const MOpenIutWebview = (params) => {
  const arr = ['Weapp', 'DingTalk', 'Lark'];
  const isSupport = arr.includes(ua.browser);
  //其中iutUrl为打开统一待办流程跳转地址
  const { iutUrl, regBroadcastFn } = params;
  const locationFn = () => {
    window.location.href = iutUrl;
  }
  if (isSupport) {
    regBroadcastFn();   //点击前注册广播事件
    weappSDK.checkApi('openLink').then((res) => {
      weappSDK.exec("openLink", {
        url: iutUrl,
        openType: 2,
      }).then((res: any) => {

      }).catch(locationFn);
    }).catch(locationFn);
  } else {
    locationFn()
  }
}
regHook('weappWorkflow', 'MOpenIutWay', MOpenIutWebview);
```

> 第三方流程，提交后需按照2.1.2触发广播事件实现刷新

### 2.1.2、第三方流程提交，触发广播实现刷新列表

> 第三方系统流程提交后，需触发广播，再关闭自身页面

> 仅EM客户端
- EM客户端的jssdk文档参考 [链接](http://emdoc.wx.weaver.com.cn/web/#/3/774)

![](${appMdRes}/1780582830-image.png)

> 代码参考：

```

【引入js资源】：E10系统地址/build/em-jssdk/static/js/lib.js

 流程提交完成后，触发列表刷新调用：
 window.weapp.ready(function () {
  var flag = window.weapp.checkJsApi("postBroadcast");
  if (flag) {
    window.setTimeout(() => {
      weapp.invoke("postBroadcast", {
        name: "FP_RELOAD_LIST",
        success: (res) { },
        fail: (err){ console.error('触发广播失败', err) }
      });
    }, 1500); //延迟1.5s等第三方数据推到E10，推送快的可以减少时间
  } else {
    console.error('不支持postBroadcast')
  }
})

流程提交完成后，触发关闭调用：
window.weapp.ready(function () {
  var flag = window.weapp.checkJsApi("closeWindow");
  if (flag) {
    weapp.invoke("closeWindow");
  } else {
    console.error('不支持closeWindow')
  }
})

```


### 2.1.3、第三方App开发思路

> 【以下仅提供思路，需开发自身调试，需要技术支持的需提交二次开发评估或技术交流流程】

> 大概步骤:
- 判断ua，指定第三方app才走webview方式，默认以location.href兜底
- 打开前，注册广播事件（需第三方app支持广播，提供相应jssdk）
- 打开方式，用新窗口（需app提供打开webview能力）
- 第三方流程提交后，触发广播事件（需第三方提供jssdk触发第2步注册的广播）


> 方案一：
- ecode代码原样参考2.1.1，第三方提交也参考2.1.2
- ecode中将第三方jssdk接入，参考文档 [链接](https://weapp.eteams.cn/ecode/playground/doc/share/view/1167277063626973187)
需对接openLink、closeWindow，刷新列表需对接registerBroadcast、postBroadcast

> 方案二：
- 不通过ecode接入，代码内直接调用第三方app提供的jssdk

> E10内ecode复写

```
import { regHook, ua } from '@weapp/utils';

const MOpenIutWebview = (params) => {
  const locationFn = () => {
    window.location.href = iutUrl;
  }
  if (判断属于第三方app) {
    const { iutUrl, reloadFn } = params;
    //其中iutUrl为统一待办地址、reloadFn为刷新列表函数

    1、调用第三方app提供的jssdk方法，注册广播，reloadFn可取刷新列表的事件

    2、调用第三方app提供的jssdk方法，以webview新窗口方式打开iutUrl地址
  } else {
    locationFn();
  }
}
regHook('weappWorkflow', 'MOpenIutWay', MOpenIutWebview);
```

> 第三方系统开发

- 第三方流程提交需触发上面1注册的广播事件，需app提供触发广播的jssdk方式

## 2.2、移动端打开异构流程地址，切换为接口地址服务端跳转

> 标准逻辑：移动端打开，location.href方式跳统一待办模块提供的中转页，中转页内location.replace跳第三方地址

- 部分情况下，不希望跳两次，replace存在兼容问题第三方无法回跳
- 提供口子支持切换跳统一待办后端接口地址，接口内做服务端跳转

> 步骤：
- 统一待办模块需nacos配置（咨询付明君、张衡（上海））
- 下面代码复制放ecode发布

```
import { regHook } from '@weapp/utils';

//2512基线以上
regHook('weappWorkflow', 'MOpenIutWay', (hookParam)=>{
  const { iutUrl } = hookParam;
  const newIutUrl = iutUrl.replace('/sp/integration/sysinfourl', '/api/bs/intunifytodo/server_config/sysinfo/getUrlV2');
  window.location.href = newIutUrl;
});
```

# 三、E10流程推送到E9

## 3.1、EM7-app从消息打开E10流程，E10提交后需关闭

> 需要ecode中注册EM7的webview关闭事件

> 参考下面代码
- 下面代码要发布再E10的ecode中
- 代码中EM7Address需要替换为EM7地址，并在app验证 地址+/open/js/jem.js能返回内容

```

import { weappSDK } from '@weapp/utils';

const hanldeSdk = () => {
  let isEM7 = navigator.userAgent?.indexOf('E-Mobile7') > -1; // 是否EM7
  if (isEM7) {
    registerHanlder();
  }
};

const registerHanlder = () => {
  const EM7Address = '...';		//E9移动端域名地址，要能加载下面js文件  
  const filestr = '/open/js/jem.js';
  window.loadjs(EM7Address + filestr, 'em7appjssdk', () => {
    // 设置customSDK 和 sdkIsReady customSDK可以设置为空对象  weappUtils.weappSDK.customSDK = {}
    // sdkIsReady 默认为false，默认为false时，在调用 weapp.invoke 方法时会抛出异常
    weappSDK.customSDK = {};
    weappSDK.sdkIsReady = true;

    weappSDK.register('closeWindow', (params) => {
      var flag = em.checkJsApi("closeWindow");
      if (flag) {
        em.closeWindow();
      } else {
        console.error('未支持closeWindow事件');
      }
    });
  });
};

hanldeSdk();

```

# 九、相关方法

## 9.1、获取异构系统地址

> 流程列表组件中，可调用window.weappWorkflow.Util.getOfsAppUrl方法生成地址，参数从列表行数据中取。参考截图


![](${appMdRes}/1762845494-image.png)
