From ac16ee13a9b676007a51f2fcb294af24a3d0f4e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=AD=A3=E5=9B=BD?= <438926402@qq.com> Date: Wed, 28 Jan 2026 23:22:52 +0800 Subject: [PATCH] =?UTF-8?q?2026-01-28=E9=80=9A=E7=94=A8=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E9=9B=86=E6=88=90=EF=BC=8C=E8=A1=A8=E5=8D=95=E9=93=BE=E6=8E=A5?= =?UTF-8?q?=E8=B7=B3=E8=BD=AC=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../constants/FlowIntegrationConstants.java | 3 +- .../controller/FormRedirectController.java | 274 ++++++++++++++++++ .../src_flowIntegration/dao/SrcFlowDao.java | 54 ++++ .../event/FlowStatusCallbackEvent.java | 108 +++++++ .../node/FlowStatusCallbackNode.java | 34 ++- .../service/FlowIntegrationService.java | 3 +- .../service/OaFlowCreateService.java | 17 +- .../service/ThirdSysBizMapService.java | 10 +- .../util/AddressBookUtil.java | 15 + .../src_flowIntegration/vo/FlowCreateVo.java | 61 ---- .../spring/spring-controller.xml | 7 + .../spring/spring-event.xml | 6 + 12 files changed, 507 insertions(+), 85 deletions(-) create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/controller/FormRedirectController.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/event/FlowStatusCallbackEvent.java create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/util/AddressBookUtil.java delete mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/vo/FlowCreateVo.java create mode 100644 v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_flowIntegration/spring/spring-controller.xml create mode 100644 v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_flowIntegration/spring/spring-event.xml diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/constants/FlowIntegrationConstants.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/constants/FlowIntegrationConstants.java index ed3e77a..0b05e51 100644 --- a/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/constants/FlowIntegrationConstants.java +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/constants/FlowIntegrationConstants.java @@ -5,7 +5,8 @@ public enum FlowIntegrationConstants { plugin("src_flowIntegration", "插件ID"), OA_HOST("","oa地址"), restName("","rest用户名"), - restPwd("","rest密码") + restPwd("","rest密码"), + extAttrLabel("","人员账号自定义数据名称") ; private String defaultValue; diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/controller/FormRedirectController.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/controller/FormRedirectController.java new file mode 100644 index 0000000..0507422 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/controller/FormRedirectController.java @@ -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; + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/dao/SrcFlowDao.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/dao/SrcFlowDao.java index 11b2b4a..835f25b 100644 --- a/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/dao/SrcFlowDao.java +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/dao/SrcFlowDao.java @@ -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 p = new ArrayList(); + p.add(thirdpartyCode); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list != null && list.size() > 0) { + Map 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 p = new ArrayList(); + p.add(labelName); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list != null && list.size() > 0) { + Map 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; + } } diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/event/FlowStatusCallbackEvent.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/event/FlowStatusCallbackEvent.java new file mode 100644 index 0000000..f9e73f3 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/event/FlowStatusCallbackEvent.java @@ -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(), 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; + } + + + + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/node/FlowStatusCallbackNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/node/FlowStatusCallbackNode.java index 2fb7ebe..f0381fe 100644 --- a/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/node/FlowStatusCallbackNode.java +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/node/FlowStatusCallbackNode.java @@ -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(), 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; } diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/service/FlowIntegrationService.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/service/FlowIntegrationService.java index b5e7431..4011e9d 100644 --- a/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/service/FlowIntegrationService.java +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/service/FlowIntegrationService.java @@ -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 result = (Map) oaFlowCreateService.flowStart(tirdFlowId,flowParam,token); diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/service/OaFlowCreateService.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/service/OaFlowCreateService.java index f5cf6ea..64ddd76 100644 --- a/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/service/OaFlowCreateService.java +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/service/OaFlowCreateService.java @@ -21,24 +21,11 @@ public class OaFlowCreateService { configProvider.getBizConfigByKey(FlowIntegrationConstants.restName), configProvider.getBizConfigByKey(FlowIntegrationConstants.restPwd),false); String url = "/bpm/process/start"; -// Map params = new HashMap<>(); -// Map datas = new HashMap<>(); -// Map 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()); - } + } return oaResp.getData(); } diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/service/ThirdSysBizMapService.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/service/ThirdSysBizMapService.java index 7f503cc..1938479 100644 --- a/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/service/ThirdSysBizMapService.java +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/service/ThirdSysBizMapService.java @@ -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; + } diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/util/AddressBookUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/util/AddressBookUtil.java new file mode 100644 index 0000000..0956055 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/util/AddressBookUtil.java @@ -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 { + + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/vo/FlowCreateVo.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/vo/FlowCreateVo.java deleted file mode 100644 index a191ee2..0000000 --- a/v5/apps-customize/src/main/java/com/seeyon/apps/src_flowIntegration/vo/FlowCreateVo.java +++ /dev/null @@ -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 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 getData() { - return data; - } - - public void setData(Map data) { - this.data = data; - } -} diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_flowIntegration/spring/spring-controller.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_flowIntegration/spring/spring-controller.xml new file mode 100644 index 0000000..a75401d --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_flowIntegration/spring/spring-controller.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_flowIntegration/spring/spring-event.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_flowIntegration/spring/spring-event.xml new file mode 100644 index 0000000..b18714e --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_flowIntegration/spring/spring-event.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file