package com.kingdee.customer.Auth.handler; import com.aliyun.odps.utils.StringUtils; import com.kingdee.bos.BOSException; import com.kingdee.bos.Context; import com.kingdee.eas.cp.eip.sso.util.CloudParamUtil; import com.kingdee.eas.util.StringUtil; import com.kingdee.eas.util.app.DbUtil; import com.kingdee.jdbc.rowset.IRowSet; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; import java.net.URLEncoder; import java.sql.SQLException; import java.util.Base64; import java.util.HashMap; import java.util.Map; import java.util.Set; /** * @author dengzhouhong * @version 1.0.0 * @ClassName UserEasAuthServlet.java * @Description TODO * @createTime 2024年01月09日 16:24 */ public class UserEasAuthServlet extends HttpServlet{ private final Logger logger = LoggerFactory.getLogger(UserEasAuthServlet.class); public UserEasAuthServlet() { super(); } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { logger.error("into TestServlet.doGet"); //标准版流程助手 String url = "http://bos.kingdee.com/workflow/main.html?"; String wfversion = request.getParameter("wfversion"); String storeEid = request.getParameter("storeEid"); //移动bos版本流程助手,客户有使用移动bos可使用这个版本 //if("mbos".equals(wfversion)){ /** * https://mbos.kdeascloud.com/mbos/page/loadPage? * path=cmpSubmit88sp1&name=submitbill.editui * &lczstype=list&cometype=havedo&billID=SPKUhmbQSQifgjFU2ESznbEdulw%3D * &assignId=22910d25-d1b4-425c-9e87-eaa287f438b6WFWKITEM * &fprocinstid=653327bb-c464-4472-aa8d-c60b35000674WFPCINST * &operateState=VIEW&lczsapprove=9444be02b9d40929508ff587f216a64e&canChangeLanguage=1 * &eid=ww434cb2a638701cdd&appid=10036 * * https://mbos.kdeascloud.com/mbos/page/loadPage?storeEid=21231 * &path=lczs2&name=approveui.navui * * &eid=ww434cb2a638701cdd&appid=10036 * &token=ZmVuZy5jaGVu * * * * &cometype=todo&assignId=22910d25-d1b4-425c-9e87-eaa287f438b6WFWKITEM * * */ /** * https://mbos.kdeascloud.com/mbos/page/loadPage? * * path=cmpSubmit88sp1&name=submitbill.editui * * &lczstype=list&cometype=havedo&billID=SPKUhmbQSQifgjFU2ESznbEdulw%3D * * &assignId=22910d25-d1b4-425c-9e87-eaa287f438b6WFWKITEM * * &fprocinstid=653327bb-c464-4472-aa8d-c60b35000674WFPCINST * * &operateState=VIEW&lczsapprove=9444be02b9d40929508ff587f216a64e&canChangeLanguage=1 * * */ //url = "https://mbos.kdeascloud.com/mbos/page/loadPage?storeEid=21231&path=lczs2&name=approveui.navui"; //TODO:加入的代码拼接跳转的参数 String assignmentId = ""; HttpSession session = request.getSession(); if (session != null) { Map assignmentMap = (Map) session.getAttribute("assignment"); if (assignmentMap != null && assignmentMap.size() > 0) { assignmentId = assignmentMap.get("assignmentId"); logger.info("onSuccessfulValidation......assignmentId:" + assignmentId); } } String billId = ""; String procinstId = ""; String actdefId = ""; String procdefId =""; try { Map paramMap = getParamMapByAssignId(assignmentId); billId = paramMap.get("billId"); procinstId = paramMap.get("procinstId"); actdefId = paramMap.get("actdefId"); procdefId = paramMap.get("procdefId"); } catch (BOSException e) { logger.error("TestServlet.doGet" + e.getMessage()); throw new ServletException(e.getMessage()); } //encode转换一下 if(!StringUtils.isEmpty(billId)){ billId = URLEncoder.encode(billId); } //url = "https://mbos.kdeascloud.com/mbos/page/loadPage?path=cmpSubmit88sp1&name=submitbill.editui&billID="+billId+"&fprocinstid="+procinstId+"&operateState=VIEW&lczsapprove=9444be02b9d40929508ff587f216a64e&canChangeLanguage=1"; url = "&billID="+billId+"&fprocinstid="+procinstId+"&operateState=VIEW&lczsapprove=9444be02b9d40929508ff587f216a64e&canChangeLanguage=0"; if (storeEid != null && !"".equals(storeEid) && !"null".equals(storeEid)) { url = url.replace("storeEid=21231", "storeEid=" + storeEid); } //} Map infoMap = null; try { infoMap = encryptUserInfo(request); } catch (Exception e) { e.printStackTrace(); } Set keySet = infoMap.keySet(); for (String key : keySet) { url += "&" + key + "=" + infoMap.get(key); } url = url.replace("?&", "?"); url += "&cometype=havedo&assignId=" + assignmentId; //替换url: url.replace("page/loadPage", "mbosw/getWorkflowUrl"); String urlR = ""; try { urlR = getUrlByWorkflow(actdefId,procdefId); } catch (BOSException e) { logger.error("TestServlet.getUrlByWorkflow" + e.getMessage()); throw new ServletException(e.getMessage()); } if(StringUtils.isEmpty(urlR)){ //静态列的显示地址 urlR = "https://mbos.kdeascloud.com/mbos/page/loadPage?storeEid=21231&path=lczs2&name=approveui.navui"; if (storeEid != null && !"".equals(storeEid) && !"null".equals(storeEid)) { urlR = urlR.replace("storeEid=21231", "storeEid=" + storeEid); } //https://mbos.kdeascloud.com/mbos/page/loadPage?storeEid=21231&path=lczs2&name=approveui.navui&eid=ww434cb2a638701cdd&appid=10036&token=ZmVuZy5jaGVu&cometype=todo&assignId=22910d25-d1b4-425c-9e87-eaa287f438b6WFWKITEM Set keySet2 = infoMap.keySet(); for (String key : keySet2) { urlR += "&" + key + "=" + infoMap.get(key); } urlR = urlR.replace("?&", "?"); urlR += "&canChangeLanguage=0&cometype=todo&assignId=" + assignmentId; logger.info("静态列的显示地址:OtherAppPortalServlet.doget.urlR:" + urlR); }else{ //动态列的显示 urlR = urlR +url; urlR = urlR.replace("page/loadPage", "mbosw/getWorkflowUrl"); logger.info("动态态列的显示地址:OtherAppPortalServlet.doget.urlR:" + urlR); } logger.info("OtherAppPortalServlet.doget.url:" + urlR); response.sendRedirect(urlR); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } /** * accessurl * 如果第三方app点击链接带token,这方法可以不写,将流程助手主页作为应用url,getLoginInfoByToken中根据第三方app的token解析到用户信息即可 * 如果第三方app点击链接不带token,将此接口作为应用的url,方法内获取第三方app用户对应的eas用户信息,方法返回值resultMap存跳转到流程助手的参数 * http://localhost:8080/otherapp/index?eid=21231&appid=10036¶m=zhangsan */ public Map encryptUserInfo(HttpServletRequest request) throws ServletException { HashMap resultMap = new HashMap(); String param = request.getParameter("param"); //下面三个参数为跳转流程助手主页参数 String eid = request.getParameter("eid"); String appid = request.getParameter("appid"); String token = ""; //........根据第三方app传来的参数,取到eas用户信息 try { token = encrypt_Base64(param); } catch (Exception e) { logger.error("encryptUserInfo encrypt_Base64 Exception" + e.getMessage()); throw new ServletException(e.getMessage()); } logger.info("encryptUserInfo.token:"+token); resultMap.put("eid", eid); resultMap.put("appid", appid == null ? "10036" : appid); resultMap.put("token", token); return resultMap; } /*** * Base64加密 * @param str 需要加密的参数 * @return * @throws Exception */ private static String encrypt_Base64(String str) throws Exception { if(StringUtils.isEmpty(str)){ return ""; } String result = Base64.getEncoder().encodeToString(str.getBytes("UTF-8")); return result; } /** * 通过assignId 查询出billId 和fprocinstId,actdefId * @param assignId * @return */ private Map getParamMapByAssignId(String assignId) throws BOSException { Map paramMap = new HashMap(); String dataCenter=ConfigAddressServletUtil.getProperty("dataCenter"); String locale=ConfigAddressServletUtil.getProperty("locale"); Context ctx = CloudParamUtil.getContext(dataCenter, locale, "administrator"); String sql = "select fbizobjid as billId,fprocinstid as procinstId,factdefid as actdefId,fprocdefid as procdefId from t_wfr_assign where fassignid = '"+assignId+"'"; logger.info("UserEasAuthServlet.getParamMapByAssignId.sql:"+sql); String billId = ""; String procinstId = ""; String actdefId = ""; String procdefId = ""; try { IRowSet result = DbUtil.executeQuery(ctx, sql); while (result.next()) { billId = result.getString("billId"); procinstId = result.getString("procinstId"); actdefId = result.getString("actdefId"); procdefId = result.getString("procdefId"); paramMap.put("billId",billId); paramMap.put("procinstId",procinstId); paramMap.put("actdefId",actdefId); paramMap.put("procdefId",procdefId); } } catch (SQLException e) { throw new BOSException(e); } return paramMap; } /** * 获取审批的替换的url * @return */ private String getUrlByWorkflow(String actdefId,String procdefId) throws BOSException { String dataCenter=ConfigAddressServletUtil.getProperty("dataCenter"); String locale=ConfigAddressServletUtil.getProperty("locale"); Context ctx = CloudParamUtil.getContext(dataCenter, locale, "administrator"); String sql = " SELECT url FROM T_WFR_MBOS_WORKFLOW where actDefId ='"+actdefId+"' and procdefid = '"+procdefId+"'"; logger.info("UserEasAuthServlet.getUrlByWorkflow.sql:"+sql); String url = ""; try { IRowSet result = DbUtil.executeQuery(ctx, sql); while (result.next()) { url = result.getString("url"); } } catch (SQLException e) { throw new BOSException(e); } return url; } }