2026-01-28通用流程集成,表单链接跳转功能

This commit is contained in:
2026-01-28 23:22:52 +08:00
parent 45db1085d1
commit ac16ee13a9
12 changed files with 507 additions and 85 deletions

View File

@@ -5,7 +5,8 @@ public enum FlowIntegrationConstants {
plugin("src_flowIntegration", "插件ID"),
OA_HOST("","oa地址"),
restName("","rest用户名"),
restPwd("","rest密码")
restPwd("","rest密码"),
extAttrLabel("","人员账号自定义数据名称")
;
private String defaultValue;

View File

@@ -0,0 +1,274 @@
package com.seeyon.apps.src_flowIntegration.controller;
import cn.hutool.log.Log;
import com.alibaba.fastjson.JSONObject;
import com.seeyon.apps.addressbook.manager.AddressBookCustomerFieldInfoManager;
import com.seeyon.apps.addressbook.po.AddressBook;
import com.seeyon.apps.common.config.ICstConfigApi;
import com.seeyon.apps.common.plugin.vo.ConfigVo;
import com.seeyon.apps.src_flowIntegration.config.FlowIntegrationConfigProvider;
import com.seeyon.apps.src_flowIntegration.constants.FlowIntegrationConstants;
import com.seeyon.apps.src_flowIntegration.dao.SrcFlowDao;
import com.seeyon.apps.src_flowIntegration.util.AesUtil;
import com.seeyon.ctp.common.AppContext;
import com.seeyon.ctp.common.controller.BaseController;
import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager;
import com.seeyon.ctp.common.exceptions.BusinessException;
import com.seeyon.ctp.common.po.ctpenumnew.CtpEnumItem;
import com.seeyon.ctp.organization.bo.V3xOrgMember;
import com.seeyon.ctp.organization.manager.OrgManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.ModelAndView;
import www.seeyon.com.utils.StringUtil;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.text.SimpleDateFormat;
public class FormRedirectController extends BaseController {
private static Log log = Log.get(FormRedirectController.class);
@Inject
private AddressBookCustomerFieldInfoManager addressBookCustomerFieldInfoManager;
@Inject
private SrcFlowDao srcFlowDao;
@Autowired
private FlowIntegrationConfigProvider configProvider;
@Inject
private EnumManager enumManagerNew;
protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi");
public ModelAndView index(HttpServletRequest request, HttpServletResponse response) throws Exception {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
ConfigVo config = cstConfigApi.getConfig(FlowIntegrationConstants.getPluginId());
// 表单连接跳转处理方法。
// long memberId = AppContext.currentUserId();
// V3xOrgMember v3xOrgMember = orgManager.getMemberById(memberId);
// 查询当前状态登录名
// String loginName = v3xOrgMember.getLoginName();
// 获取系统内置参数第三方系统主数据字段信息
String extAttrLabel = configProvider.getBizConfigByKey(FlowIntegrationConstants.extAttrLabel);
// 获取当前登录账号的人员自定义主数据信息通过主数据信息查询到BIP系统登录信息
AddressBook addressBook = addressBookCustomerFieldInfoManager.getByMemberId(AppContext.currentUserId());
if(null == addressBook) {
log.info("人员自定义数据未维护,无法单点登录!");
ModelAndView mav = exceptionRedirect("人员自定义数据未维护,无法单点登录!");
return mav;
}
JSONObject addressBookjson = appleAddressBook(addressBook);
// 通过字段名称查询人员账号主数据数据库字段
String extAttrName = srcFlowDao.getMetadataNameByLabel(extAttrLabel);
String extAttrValue = addressBookjson.getString(extAttrName);
if(StringUtil.isEmpty(extAttrValue)){
log.info(extAttrLabel+"未维护,无法单点登录!");
ModelAndView mav = exceptionRedirect(extAttrLabel+"未维护,无法单点登录!");
return mav;
}
// 获取第三方系统标识通过第三方系统标识查询第三方系统的ip端口表单跳转地址加密规则信息等
String thirdpartyCode = request.getParameter("thirdpartyCode");
// 根据第三方系统标识获取加密key和vi
String paramValue = srcFlowDao.getThirdpartyParamByThirdpartyCode(thirdpartyCode);
JSONObject paramjson = JSONObject.parseObject(paramValue);
String secretKey = paramjson.getString("secretKey");
String vi = paramjson.getString("vi");
String encrypted = AesUtil.encrypt("loginName="+extAttrValue,secretKey,vi);
String tourl = request.getParameter("tourl");
String thirdpartyParam = srcFlowDao.getThirdpartyParamByThirdpartyCode(thirdpartyCode);
if(StringUtil.isEmpty(thirdpartyParam)){
log.info("当前第三方系统标识在系统中没有找到,请检查系统设置。");
ModelAndView mav = exceptionRedirect("当前第三方系统标识在系统中没有找到,请检查系统设置。");
return mav;
}
JSONObject thirdpartyParamjson = JSONObject.parseObject(thirdpartyParam);
String redirectUrl = thirdpartyParamjson.getString("redirectUrl");
if(StringUtil.isEmpty(redirectUrl)){
log.info("当前第三方系统跳转链接为空,请检查系统设置。");
ModelAndView mav = exceptionRedirect("当前第三方系统跳转链接为空,请检查系统设置。");
return mav;
}
String ip = thirdpartyParamjson.getString("IP");
String port = thirdpartyParamjson.getString("PORT");
StringBuilder urlsb = new StringBuilder("http://").append(ip).append(':').append(port).
append('/').append(redirectUrl).append("?tourl=").append(tourl).append("&ticket=").append(encrypted);
response.sendRedirect(urlsb.toString());
return null;
}
private ModelAndView exceptionRedirect(String popupContent){
ModelAndView mav = new ModelAndView("popup");
// 2. 向前端传递弹窗参数(可自定义字段)
mav.addObject("showPopup", true); // 是否显示弹窗
mav.addObject("popupTitle", "操作提示"); // 弹窗标题
mav.addObject("popupContent", popupContent); // 弹窗内容
mav.addObject("popupType", "success"); // 弹窗类型(成功/失败)
return mav;
}
private JSONObject appleAddressBook(AddressBook addressBook) throws BusinessException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
JSONObject jsonObject = new JSONObject();
if(StringUtil.isNotEmpty(addressBook.getExtAttr1())){
jsonObject.put("extAttr1",addressBook.getExtAttr1());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr2())){
jsonObject.put("extAttr2",addressBook.getExtAttr2());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr3())){
jsonObject.put("extAttr3",addressBook.getExtAttr3());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr4())){
jsonObject.put("extAttr4",addressBook.getExtAttr4());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr5())){
jsonObject.put("extAttr5",addressBook.getExtAttr5());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr6())){
jsonObject.put("extAttr6",addressBook.getExtAttr6());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr7())){
jsonObject.put("extAttr7",addressBook.getExtAttr7());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr8())){
jsonObject.put("extAttr8",addressBook.getExtAttr8());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr9())){
jsonObject.put("extAttr9",addressBook.getExtAttr9());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr10())){
jsonObject.put("extAttr10",addressBook.getExtAttr10());
}if( addressBook.getExtAttr11()!=null){
jsonObject.put("extAttr11",addressBook.getExtAttr11());
}if( addressBook.getExtAttr12()!=null){
jsonObject.put("extAttr12",addressBook.getExtAttr12());
}if(addressBook.getExtAttr13()!=null){
jsonObject.put("extAttr13",addressBook.getExtAttr13());
}if(addressBook.getExtAttr14()!=null){
jsonObject.put("extAttr14",addressBook.getExtAttr14());
}if(addressBook.getExtAttr15()!=null){
jsonObject.put("extAttr15",addressBook.getExtAttr15());
}if(addressBook.getExtAttr16()!=null){
jsonObject.put("extAttr16",addressBook.getExtAttr16());
}if(addressBook.getExtAttr17()!=null){
jsonObject.put("extAttr17",addressBook.getExtAttr17());
}if(addressBook.getExtAttr18()!=null){
jsonObject.put("extAttr18",addressBook.getExtAttr18());
}if(addressBook.getExtAttr19()!=null){
jsonObject.put("extAttr19",addressBook.getExtAttr19());
}if(addressBook.getExtAttr20()!=null){
jsonObject.put("extAttr20",addressBook.getExtAttr20());
}if(addressBook.getExtAttr21()!=null){
jsonObject.put("extAttr21",sdf.format(addressBook.getExtAttr21()));
}if(addressBook.getExtAttr22()!=null){
jsonObject.put("extAttr22",sdf.format(addressBook.getExtAttr22()));
}if(addressBook.getExtAttr23()!=null){
jsonObject.put("extAttr23",sdf.format(addressBook.getExtAttr23()));
}if(addressBook.getExtAttr24()!=null){
jsonObject.put("extAttr24",sdf.format(addressBook.getExtAttr24()));
}if(addressBook.getExtAttr25()!=null){
jsonObject.put("extAttr25",sdf.format(addressBook.getExtAttr25()));
}if(addressBook.getExtAttr26()!=null){
jsonObject.put("extAttr26",sdf.format(addressBook.getExtAttr26()));
}if(addressBook.getExtAttr27()!=null){
jsonObject.put("extAttr27",sdf.format(addressBook.getExtAttr27()));
}if(addressBook.getExtAttr28()!=null){
jsonObject.put("extAttr28",sdf.format(addressBook.getExtAttr28()));
}if(addressBook.getExtAttr29()!=null){
jsonObject.put("extAttr29",sdf.format(addressBook.getExtAttr29()));
}if(addressBook.getExtAttr30()!=null){
jsonObject.put("extAttr30",sdf.format(addressBook.getExtAttr30()));
}if(StringUtil.isNotEmpty(addressBook.getExtAttr31())){
CtpEnumItem ctpEnumItem = enumManagerNew.getCtpEnumItem(Long.parseLong(addressBook.getExtAttr31()));
jsonObject.put("extAttr31",ctpEnumItem.getShowvalue());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr32())){
CtpEnumItem ctpEnumItem = enumManagerNew.getCtpEnumItem(Long.parseLong(addressBook.getExtAttr32()));
jsonObject.put("extAttr32",ctpEnumItem.getShowvalue());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr33())){
CtpEnumItem ctpEnumItem = enumManagerNew.getCtpEnumItem(Long.parseLong(addressBook.getExtAttr33()));
jsonObject.put("extAttr33",ctpEnumItem.getShowvalue());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr34())){
CtpEnumItem ctpEnumItem = enumManagerNew.getCtpEnumItem(Long.parseLong(addressBook.getExtAttr34()));
jsonObject.put("extAttr34",ctpEnumItem.getShowvalue());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr35())){
CtpEnumItem ctpEnumItem = enumManagerNew.getCtpEnumItem(Long.parseLong(addressBook.getExtAttr35()));
jsonObject.put("extAttr35",ctpEnumItem.getShowvalue());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr36())){
CtpEnumItem ctpEnumItem = enumManagerNew.getCtpEnumItem(Long.parseLong(addressBook.getExtAttr36()));
jsonObject.put("extAttr36",ctpEnumItem.getShowvalue());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr37())){
CtpEnumItem ctpEnumItem = enumManagerNew.getCtpEnumItem(Long.parseLong(addressBook.getExtAttr37()));
jsonObject.put("extAttr37",ctpEnumItem.getShowvalue());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr38())){
CtpEnumItem ctpEnumItem = enumManagerNew.getCtpEnumItem(Long.parseLong(addressBook.getExtAttr38()));
jsonObject.put("extAttr38",ctpEnumItem.getShowvalue());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr39())){
CtpEnumItem ctpEnumItem = enumManagerNew.getCtpEnumItem(Long.parseLong(addressBook.getExtAttr39()));
jsonObject.put("extAttr39",ctpEnumItem.getShowvalue());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr40())){
CtpEnumItem ctpEnumItem = enumManagerNew.getCtpEnumItem(Long.parseLong(addressBook.getExtAttr40()));
jsonObject.put("extAttr40",ctpEnumItem.getShowvalue());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr41())){
jsonObject.put("extAttr41",addressBook.getExtAttr41());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr42())){
jsonObject.put("extAttr42",addressBook.getExtAttr42());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr43())){
jsonObject.put("extAttr43",addressBook.getExtAttr43());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr44())){
jsonObject.put("extAttr44",addressBook.getExtAttr44());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr45())){
jsonObject.put("extAttr45",addressBook.getExtAttr45());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr46())){
jsonObject.put("extAttr46",addressBook.getExtAttr46());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr47())){
jsonObject.put("extAttr47",addressBook.getExtAttr47());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr48())){
jsonObject.put("extAttr48",addressBook.getExtAttr48());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr49())){
jsonObject.put("extAttr49",addressBook.getExtAttr49());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr50())){
jsonObject.put("extAttr50",addressBook.getExtAttr50());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr51())){
jsonObject.put("extAttr51",addressBook.getExtAttr51());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr52())){
jsonObject.put("extAttr52",addressBook.getExtAttr52());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr53())){
jsonObject.put("extAttr53",addressBook.getExtAttr53());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr54())){
jsonObject.put("extAttr54",addressBook.getExtAttr54());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr55())){
jsonObject.put("extAttr55",addressBook.getExtAttr55());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr56())){
jsonObject.put("extAttr56",addressBook.getExtAttr56());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr57())){
jsonObject.put("extAttr57",addressBook.getExtAttr57());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr58())){
jsonObject.put("extAttr58",addressBook.getExtAttr58());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr59())){
jsonObject.put("extAttr59",addressBook.getExtAttr59());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr60())){
jsonObject.put("extAttr60",addressBook.getExtAttr60());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr61())){
jsonObject.put("extAttr61",addressBook.getExtAttr61());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr62())){
jsonObject.put("extAttr62",addressBook.getExtAttr62());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr63())){
jsonObject.put("extAttr63",addressBook.getExtAttr63());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr64())){
jsonObject.put("extAttr64",addressBook.getExtAttr64());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr65())){
jsonObject.put("extAttr65",addressBook.getExtAttr65());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr66())){
jsonObject.put("extAttr66",addressBook.getExtAttr66());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr67())){
jsonObject.put("extAttr67",addressBook.getExtAttr67());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr68())){
jsonObject.put("extAttr68",addressBook.getExtAttr68());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr69())){
jsonObject.put("extAttr69",addressBook.getExtAttr69());
}if(StringUtil.isNotEmpty(addressBook.getExtAttr70())){
jsonObject.put("extAttr70",addressBook.getExtAttr70());
}
return jsonObject;
}
}

View File

@@ -15,6 +15,9 @@ public class SrcFlowDao{
private String getAuthIdByFormId = "select resource_id from cap_form_auth_info where form_id = ? and type = 'add' and deleted = 0 and default_auth = 1 ";
private String getFieldInfoByFormId = "select field_info from cap_form_definition where id = ?";
private String uniqueDataValidation = "select #{fieldName} from #{tableName} where #{fieldName} = ?";
private String getThirdpartyParamByThirdpartyCode = "select param_value from thirdparty_register where app_code = ?";
private String getMetadataNameByLabel = "select name from ctp_metadata_column where label = ? and is_enable = 1";
public String getFormIdByTemplateCode(String templateCode){
@@ -149,6 +152,57 @@ public class SrcFlowDao{
return res;
}
public String getThirdpartyParamByThirdpartyCode(String thirdpartyCode){
String res = "";
JDBCAgent agent = new JDBCAgent();
try {
StringBuilder sql = new StringBuilder(getThirdpartyParamByThirdpartyCode);
List<Object> p = new ArrayList<Object>();
p.add(thirdpartyCode);
agent.execute(sql.toString(), p);
List<Map> list = agent.resultSetToList();
if (list != null && list.size() > 0) {
Map<String,Object> map = list.get(0);
Object obj = map.get("param_value");
res = obj!=null?obj.toString():"";
}
} catch (BusinessException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (agent != null) {
agent.close();
}
}
return res;
}
public String getMetadataNameByLabel(String labelName){
String res = "";
JDBCAgent agent = new JDBCAgent();
try {
StringBuilder sql = new StringBuilder(getMetadataNameByLabel);
List<Object> p = new ArrayList<Object>();
p.add(labelName);
agent.execute(sql.toString(), p);
List<Map> list = agent.resultSetToList();
if (list != null && list.size() > 0) {
Map<String,Object> map = list.get(0);
Object obj = map.get("name");
res = obj!=null?obj.toString():"";
}
} catch (BusinessException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (agent != null) {
agent.close();
}
}
return res;
}
}

View File

@@ -0,0 +1,108 @@
package com.seeyon.apps.src_flowIntegration.event;
import com.alibaba.fastjson.JSONObject;
import com.seeyon.apps.common.config.ICstConfigApi;
import com.seeyon.apps.common.plugin.vo.ConfigVo;
import com.seeyon.apps.common.workflow.constants.WorkFlowType;
import com.seeyon.apps.common.workflow.event.ACommonWorkflowEvent;
import com.seeyon.apps.ext.workflow.vo.FormDataVo;
import com.seeyon.apps.ext.workflow.vo.WorkflowEventContext;
import com.seeyon.apps.src_flowIntegration.constants.FlowIntegrationConstants;
import com.seeyon.apps.src_flowIntegration.dao.SrcFlowDao;
import com.seeyon.apps.src_flowIntegration.util.AesUtil;
import com.seeyon.apps.src_flowIntegration.util.SignUtil;
import com.seeyon.cap4.form.bean.FormDataMasterBean;
import com.seeyon.ctp.common.AppContext;
import com.seeyon.utils.http.HttpClient;
import www.seeyon.com.utils.UUIDUtil;
import javax.inject.Inject;
import java.util.Date;
import java.util.HashMap;
public class FlowStatusCallbackEvent extends ACommonWorkflowEvent {
protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi");
@Inject
private SrcFlowDao srcFlowDao;
@Override
public String getPluginId() {
return FlowIntegrationConstants.getPluginId();
}
@Override
public String getFormParse() {
return "json";
}
@Override
public WorkFlowType[] getTypes() {
return new WorkFlowType[] { WorkFlowType.onBeforeStop };
}
@Override
public String getId() {
return "FlowStatusCallbackEvent";
}
@Override
public String getLabel() {
return "通用流程状态返回终止前监听";
}
@Override
protected WorkflowEventContext proceed(String request, FormDataVo formDataVo, WorkFlowType workFlowType, FormDataMasterBean formDataMasterBean) throws Exception {
WorkflowEventContext context = new WorkflowEventContext();
ConfigVo configVo = cstConfigApi.getConfig(getPluginId());
context.setNeedSave(true);
JSONObject req = JSONObject.parseObject(request);
String url = req.getString("flowStatusCallbackUrl");
context.setUrl(url);
JSONObject datajson = new JSONObject();
datajson.put("thirdFlowId",req.getString("thirdFlowId"));
datajson.put("flowStatus","1");
datajson.put("remark","流程结束");
context.setRequest(datajson.toString());
// 进行请求参数加密
String thirdpartyCode = req.getString("thirdpartyCode");
// 通过第三方系统编号查询第三方系统参数信息
String paramValue = srcFlowDao.getThirdpartyParamByThirdpartyCode(thirdpartyCode);
JSONObject paramjson = JSONObject.parseObject(paramValue);
String secretKey = paramjson.getString("secretKey");
String vi = paramjson.getString("vi");
String datastr = datajson.toString();
// 当前先试用简单关键字
String encrypted = AesUtil.encrypt(datastr,secretKey,vi);
long timestamp = new Date().getTime();
// 生成随机数
String nonce = UUIDUtil.getUUIDLong()+"";
String signContent = encrypted + timestamp + nonce + secretKey;
String sign = SignUtil.sha256(signContent);
JSONObject param = new JSONObject();
param.put("data",encrypted);
param.put("timestamp",timestamp+"");
param.put("nonce",nonce);
param.put("sign",sign);
// 调通接口推送数据到第三方系统
String res = HttpClient.httpPostRaw(url,param.toString(),new HashMap<String,String>(), null);
context.setResponse(res);
JSONObject jsonObject = JSONObject.parseObject(res);
String code = jsonObject.getString("code");
if("0".equals(code)){
context.setSuccess(true);
context.setErrMsg("终止成功,第三方流程已回退");
}else{
context.setSuccess(false);
context.setErrMsg("流程终止失败。");
}
return context;
}
}

View File

@@ -12,12 +12,15 @@ import com.seeyon.apps.ext.workflow.vo.FieldDataVo;
import com.seeyon.apps.ext.workflow.vo.FormDataVo;
import com.seeyon.apps.ext.workflow.vo.SuperNodeContext;
import com.seeyon.apps.src_flowIntegration.constants.FlowIntegrationConstants;
import com.seeyon.apps.src_flowIntegration.dao.SrcFlowDao;
import com.seeyon.apps.src_flowIntegration.util.AesUtil;
import com.seeyon.apps.src_flowIntegration.util.SignUtil;
import com.seeyon.cap4.form.bean.FormDataMasterBean;
import com.seeyon.ctp.common.AppContext;
import com.seeyon.utils.http.HttpClient;
import www.seeyon.com.utils.UUIDUtil;
import javax.inject.Inject;
import java.util.Date;
import java.util.HashMap;
@@ -27,6 +30,9 @@ public class FlowStatusCallbackNode extends ACommonSuperNode {
protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi");
@Inject
private SrcFlowDao srcFlowDao;
@Override
public String getNodeId() {
return "FlowStatusCallbackNode";
@@ -34,7 +40,7 @@ public class FlowStatusCallbackNode extends ACommonSuperNode {
@Override
public String getNodeName() {
return "通用流程状态返回接口";
return "通用流程状态返回超级节点";
}
@Override
@@ -60,19 +66,28 @@ public class FlowStatusCallbackNode extends ACommonSuperNode {
public SuperNodeContext proceed(String request, FormDataVo formDataVo, FormDataMasterBean formDataMasterBean) throws Exception {
ConfigVo configVo = getFlowIntegrationConfig();
SuperNodeContext context = new SuperNodeContext();
context.setNeedSave(true);
JSONObject req = JSONObject.parseObject(request);
String url = req.getString("flowStatusCallbackUrl");
context.setUrl(url);
JSONObject datajson = new JSONObject();
datajson.put("thirdFlowId",req.getString("thirdFlowId"));
datajson.put("flowStatus","1");
datajson.put("remark","流程结束");
context.setRequest(datajson.toString());
// 进行请求参数加密
String thirdpartyCode = req.getString("thirdpartyCode");
// 通过第三方系统编号查询第三方系统参数信息
String paramValue = srcFlowDao.getThirdpartyParamByThirdpartyCode(thirdpartyCode);
JSONObject paramjson = JSONObject.parseObject(paramValue);
String secretKey = paramjson.getString("secretKey");
String vi = paramjson.getString("vi");
String datastr = datajson.toString();
// 当前先试用简单关键字
String encrypted = AesUtil.encrypt(datastr,"1234567890abcdef","abcdef1234567890");
// 加密请求参数
String encrypted = AesUtil.encrypt(datastr,secretKey,vi);
long timestamp = new Date().getTime();
String nonce = "asdhsalda";
String secretKey = "123123123";
// 生成随机数
String nonce = UUIDUtil.getUUIDLong()+"";
String signContent = encrypted + timestamp + nonce + secretKey;
String sign = SignUtil.sha256(signContent);
JSONObject param = new JSONObject();
@@ -82,7 +97,14 @@ public class FlowStatusCallbackNode extends ACommonSuperNode {
param.put("sign",sign);
// 调通接口推送数据到第三方系统
String res = HttpClient.httpPostRaw(url,param.toString(),new HashMap<String,String>(), null);
context.setResponse(res);
JSONObject jsonObject = JSONObject.parseObject(res);
String code = jsonObject.getString("code");
if("0".equals(code)){
context.success("流程状态回调成功!");
}else{
context.back("回调失败,请联系管理员处理");
}
return context;
}

View File

@@ -18,6 +18,7 @@ public class FlowIntegrationService {
public JSONObject thirdFlowCreate(JSONObject jsonObject,String token) throws Exception {
JSONObject res = new JSONObject();
String tirdFlowId = jsonObject.getString("thirdFlowId");
String thirdpartyCode = jsonObject.getString("thirdpartyCode");
String flowStatusCallbackUrl = jsonObject.getString("flowStatusCallbackUrl");
String flowAuditStatusCallbackUrl = jsonObject.getString("flowAuditStatusCallbackUrl");
JSONObject data = jsonObject.getJSONObject("data");
@@ -46,7 +47,7 @@ public class FlowIntegrationService {
data.put("doTrigger",true);
// 设置第三方信息字段内容
JSONObject datajson = data.getJSONObject("data");
thirdSysBizMapService.setTableData(datajson,templateCode,tirdFlowId,flowStatusCallbackUrl,flowAuditStatusCallbackUrl);
thirdSysBizMapService.setTableData(datajson,templateCode,tirdFlowId,thirdpartyCode,flowStatusCallbackUrl,flowAuditStatusCallbackUrl);
flowParam.put("data",data);
Map<String,Object> result = (Map<String,Object>) oaFlowCreateService.flowStart(tirdFlowId,flowParam,token);

View File

@@ -21,20 +21,7 @@ public class OaFlowCreateService {
configProvider.getBizConfigByKey(FlowIntegrationConstants.restName),
configProvider.getBizConfigByKey(FlowIntegrationConstants.restPwd),false);
String url = "/bpm/process/start";
// Map<String,Object> params = new HashMap<>();
// Map<String,Object> datas = new HashMap<>();
// Map<String,Object> formDatas = new HashMap<>();
// params.put("appName",appName);
// params.put("data",datas);
// datas.put("templateCode",templateCode);
// datas.put("draft","0");
// datas.put("data",formDatas);
// for (String key : mainFormData.keySet()) {
// formDatas.put(key,mainFormData.get(key));
// }
// for (String key : subFormDatas.keySet()) {
// formDatas.put(key,subFormDatas.get(key));
// }
OaResp oaResp = client.sendPost(tirdFlowId, url, flowParam,token);
if(oaResp.getCode() != 0) {
throw new Exception(tirdFlowId + "流程发起失败:" + oaResp.getMessage());

View File

@@ -42,7 +42,7 @@ public class ThirdSysBizMapService {
* @param flowStatusCallbackUrl
* @param flowAuditStatusCallbackUrl
*/
public void setTableData(JSONObject data,String templateCode,String tirdFlowId,String flowStatusCallbackUrl,String flowAuditStatusCallbackUrl ){
public void setTableData(JSONObject data,String templateCode,String tirdFlowId,String thirdpartyCode,String flowStatusCallbackUrl,String flowAuditStatusCallbackUrl ){
// 首先根据templateCode获取表单formId;
String formId = getFormIdByTemplateCode(templateCode);
// 通过formId信息查询表单中的字段并且找到字段信息为第三方信息的字段
@@ -62,6 +62,13 @@ public class ThirdSysBizMapService {
tirdFlowIdjson.put("value",tirdFlowId);
fields.add(tirdFlowIdjson);
}
String thirdpartyCodeName = FieldUtil.isDisplayExists(frontFormmain,"第三方系统标识");
if(StringUtil.isNotEmpty(thirdpartyCodeName)){
JSONObject thirdpartyCodejson = new JSONObject();
thirdpartyCodejson.put("name",tirdFlowIdName);
thirdpartyCodejson.put("value",tirdFlowId);
fields.add(thirdpartyCodejson);
}
// 插入流程状态回调地址字段
String flowStatusCallbackUrlName = FieldUtil.isDisplayExists(frontFormmain,"流程状态回调地址");
if(StringUtil.isNotEmpty(flowStatusCallbackUrlName)){
@@ -96,6 +103,7 @@ public class ThirdSysBizMapService {
// 通过表单名称,唯一值字段,当前数据,查询当前数据是否在当前表单中是否存在
String uniqueData = srcFlowDao.uniqueDataValidation(tableName,tirdFlowIdName,tirdFlowId);
return uniqueData;
}

View File

@@ -0,0 +1,15 @@
package com.seeyon.apps.src_flowIntegration.util;
import com.alibaba.fastjson.JSONObject;
import com.seeyon.apps.addressbook.po.AddressBook;
import com.seeyon.ctp.common.exceptions.BusinessException;
import com.seeyon.ctp.common.po.ctpenumnew.CtpEnumItem;
import www.seeyon.com.utils.StringUtil;
import java.text.SimpleDateFormat;
public class AddressBookUtil {
}

View File

@@ -1,61 +0,0 @@
package com.seeyon.apps.src_flowIntegration.vo;
import java.util.Map;
public class FlowCreateVo {
private String thirdFlowId;
private String flowStatusCallbackUrl;
private String flowAuditStatusCallbackUrl;
private String flowBizCode;
private String flowCreator;
private Map<String,Object> data;
public String getThirdFlowId() {
return thirdFlowId;
}
public void setThirdFlowId(String thirdFlowId) {
this.thirdFlowId = thirdFlowId;
}
public String getFlowStatusCallbackUrl() {
return flowStatusCallbackUrl;
}
public void setFlowStatusCallbackUrl(String flowStatusCallbackUrl) {
this.flowStatusCallbackUrl = flowStatusCallbackUrl;
}
public String getFlowAuditStatusCallbackUrl() {
return flowAuditStatusCallbackUrl;
}
public void setFlowAuditStatusCallbackUrl(String flowAuditStatusCallbackUrl) {
this.flowAuditStatusCallbackUrl = flowAuditStatusCallbackUrl;
}
public String getFlowBizCode() {
return flowBizCode;
}
public void setFlowBizCode(String flowBizCode) {
this.flowBizCode = flowBizCode;
}
public String getFlowCreator() {
return flowCreator;
}
public void setFlowCreator(String flowCreator) {
this.flowCreator = flowCreator;
}
public Map<String, Object> getData() {
return data;
}
public void setData(Map<String, Object> data) {
this.data = data;
}
}

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans default-autowire="byName">
<bean name="/formRedirectController.do" class="com.seeyon.apps.src_flowIntegration.controller.FormRedirectController" />
</beans>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans default-autowire="byName">
<bean id="flowStatusCallbackEvent" class="com.seeyon.apps.src_flowIntegration.event.FlowStatusCallbackEvent"/>
</beans>