Browse Source

oa单点和待办代码提交

Heyuan 9 months ago
parent
commit
6951af3a85

+ 252 - 73
src/com/kingdee/eas/custom/messageWebService/OAMessageWebServiceDao.java

@@ -1,18 +1,28 @@
 package com.kingdee.eas.custom.messageWebService;
 
 import com.alibaba.fastjson.JSONObject;
+import com.kingdee.bos.BOSException;
 import com.kingdee.bos.Context;
 import com.kingdee.bos.dao.ormapping.ObjectUuidPK;
+import com.kingdee.bos.util.BOSUuid;
+import com.kingdee.bos.workflow.metas.AssignFactory;
+import com.kingdee.bos.workflow.metas.AssignInfo;
+import com.kingdee.bos.workflow.metas.IAssign;
+import com.kingdee.bos.workflow.metas.WfAssignmentState;
 import com.kingdee.eas.base.message.*;
 import com.kingdee.eas.base.message.webservice.MessageWebServiceDao;
 import com.kingdee.eas.base.message.webservice.WSMessage;
 import com.kingdee.eas.base.message.webservice.WfrAssignMessage;
 import com.kingdee.eas.base.message.webservice.WfrProcMessage;
+import com.kingdee.eas.basedata.person.IPerson;
+import com.kingdee.eas.basedata.person.PersonFactory;
+import com.kingdee.eas.basedata.person.PersonInfo;
 import okhttp3.*;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.log4j.Logger;
 
 import java.io.FileInputStream;
+import java.io.IOException;
 import java.net.URLEncoder;
 import java.text.SimpleDateFormat;
 import java.util.Date;
@@ -26,6 +36,17 @@ import java.util.Properties;
  */
 public class OAMessageWebServiceDao implements MessageWebServiceDao {
     private static Logger logger = Logger.getLogger(OAMessageWebServiceDao.class);
+    private Properties prop = new Properties();
+    String propPath = System.getProperty("EAS_HOME") + "/server/properties/scy/receiveOAConfig.properties";
+
+    public OAMessageWebServiceDao() {
+        try {
+            prop.load(new FileInputStream(propPath));
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("OA待办消息 获取配置文件失败!" + e.getMessage());
+        }
+    }
 
     /**
      * 发送消息
@@ -35,16 +56,194 @@ public class OAMessageWebServiceDao implements MessageWebServiceDao {
      */
     @Override
     public boolean addMessage(WSMessage message) {
-        logger.error("*********OAMessageWebServiceDao 消息监听开始**********");
+        logger.error("*********OAMessageWebServiceDao addMessage 消息监听开始**********");
+        return sendMessage(message, "0", "0");
+    }
+
+
+    /**
+     * 删除消息
+     *
+     * @param s
+     * @return
+     */
+    @Override
+    public boolean removeMessage(String s) {
+        logger.error("*********OAMessageWebServiceDao removeMessage111 消息监听开始**********");
+        logger.error("*********OAMessageWebServiceDao s " + s);
+        return false;
+    }
+
+
+    /**
+     * 删除消息
+     *
+     * @param s
+     * @param context
+     * @return
+     */
+    @Override
+    public boolean removeMessage(String s, Context context) {
+        logger.error("*********OAMessageWebServiceDao removeMessage222 消息监听开始**********");
+        logger.error("*********OAMessageWebServiceDao s " + s);
+        return false;
+    }
+
+    /**
+     * 更新消息
+     *
+     * @param s
+     * @return
+     */
+    @Override
+    public boolean updateMessage(String s) {
+        logger.error("*********OAMessageWebServiceDao updateMessages444 消息监听开始**********");
+        logger.error("*********OAMessageWebServiceDao s " + s);
+        return false;
+    }
+
+    /**
+     * 更新消息
+     *
+     * @param s
+     * @param context
+     * @return
+     */
+    @Override
+    public boolean updateMessage(String s, Context context) {
+        logger.error("*********OAMessageWebServiceDao updateMessages3333 消息监听开始**********");
+        logger.error("*********OAMessageWebServiceDao s " + s);
+        return false;
+    }
+
+    /**
+     * @param s
+     * @param msgStatus
+     * @return
+     */
+    @Override
+    public boolean updateMessages(String s, MsgStatus msgStatus) {
+        logger.error("*********OAMessageWebServiceDao updateMessages111 消息监听开始**********");
+        logger.error("*********OAMessageWebServiceDao s " + s);
+        logger.error("*********OAMessageWebServiceDao msgStatus " + msgStatus.getAlias());
+        return false;
+    }
+
+    @Override
+    public boolean updateMessages(String id, MsgStatus msgStatus, Context ctx) {
+        logger.error("*********OAMessageWebServiceDao updateMessages2222 消息监听开始**********");
+        logger.error("*********OAMessageWebServiceDao id " + id);
+        logger.error("*********OAMessageWebServiceDao msgStatus " + msgStatus.getAlias());
+        BOSUuid bosId = BOSUuid.read(id);
+        String bosType = bosId.getType().toString();
+        logger.error("*********OAMessageWebServiceDao bosType " + bosType);
+        if ("9623EB51".equals(bosType)) {
+            try {
+                //任务阅读表
+                IAssignRead assignReadIns = AssignReadFactory.getLocalInstance(ctx);
+                AssignReadInfo assignReadInfo = assignReadIns.getAssignReadInfo(new ObjectUuidPK(id));
+                String assignID = assignReadInfo.getAssignID().toString();
+                IAssign iAssign = AssignFactory.getLocalInstance(ctx);
+                IPerson iPerson = PersonFactory.getLocalInstance(ctx);
+                AssignInfo assignInfo = iAssign.getValue(new ObjectUuidPK(assignID));
+                WSMessage wsMessage = new WSMessage();
+                wsMessage.setMsgID(id);
+                wsMessage.setTitle(assignInfo.getSubject());
+                wsMessage.setBillId(assignInfo.getBizObjID());
+                wsMessage.setContext(ctx);
+                String priorPerformerID = assignInfo.getPriorPerformerID();
+                PersonInfo sender = iPerson.getPersonInfo(new ObjectUuidPK(priorPerformerID));
+                wsMessage.setSenderNumber(sender.getNumber());
+                wsMessage.setSender(sender.getName());
+                String personEmpId = assignInfo.getPersonEmpID().toString();
+                PersonInfo reciever = iPerson.getPersonInfo(new ObjectUuidPK(personEmpId));
+                wsMessage.setReceivers(reciever.getName());
+                wsMessage.setRecieveNumber(reciever.getNumber());
+                wsMessage.setRecieverID(personEmpId);
+                if (MsgStatus.READED.equals(msgStatus)) {
+                    //已读
+                    return sendMessage(wsMessage, "0", "1");
+                } else {
+                    return sendMessage(wsMessage, "0", "0");
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public boolean addInitiatorMessage(WfrProcMessage wfrProcMessage) {
+        logger.error("*********OAMessageWebServiceDao addInitiatorMessage 消息监听开始**********");
+        return false;
+    }
+
+    /**
+     * 任务完成时触发
+     * 之后会触发 com.kingdee.eas.custom.messageWebService.OAMessageWebServiceDao#removeMessage(java.lang.String, com.kingdee.bos.Context)
+     * 之后会触发 com.kingdee.eas.custom.messageWebService.OAMessageWebServiceDao#addInitiatorMessage(com.kingdee.eas.base.message.webservice.WfrProcMessage)
+     *
+     * @param wfrAssignMessage
+     * @return
+     */
+    @Override
+    public boolean addCompletedMessage(WfrAssignMessage wfrAssignMessage) {
+        try {
+            logger.error("*********OAMessageWebServiceDao addCompletedMessage 消息监听开始**********");
+            String assignId = wfrAssignMessage.getAssignId();
+            logger.error("*********OAMessageWebServiceDao assignId " + assignId);
+            String assignSubject = wfrAssignMessage.getAssignSubject();
+            String billID = wfrAssignMessage.getBillID();
+            String handler = wfrAssignMessage.getHandler();
+            String handlerNumber = wfrAssignMessage.getHandlerNumber();
+            String state = wfrAssignMessage.getState();
+            logger.error("*********OAMessageWebServiceDao state " + state);
+            WfAssignmentState stateEnum = WfAssignmentState.getEnum(state);
+            Context ctx = wfrAssignMessage.getCtx();
+            IAssignRead iAssignRead = AssignReadFactory.getLocalInstance(ctx);
+            AssignReadCollection assignReadCollection = iAssignRead.getAssignReadCollection("where assignID='" + assignId + "'");
+            String msgId = null;
+            if (assignReadCollection.size() > 0) {
+                msgId = assignReadCollection.get(0).getId().toString();
+            } else {
+                throw new RuntimeException("未找到对应的任务阅读表  assignId: " + assignId);
+            }
+            if (WfAssignmentState.CANCELED.equals(stateEnum)) {
+                //任务取消,删除OA待办
+                return deleteMessage(msgId, handlerNumber);
+            } else if (WfAssignmentState.COMPLETED.equals(stateEnum) || WfAssignmentState.REJECTED.equals(stateEnum)) {
+                //任务完成或已拒绝,更新OA消息为已办
+                WSMessage wsMessage = new WSMessage();
+                wsMessage.setMsgID(msgId);
+                wsMessage.setTitle(assignSubject);
+                wsMessage.setBillId(billID);
+                wsMessage.setContext(ctx);
+                wsMessage.setSenderNumber(wfrAssignMessage.getInitiatorNumber());
+                wsMessage.setSender(wfrAssignMessage.getInitiator());
+                wsMessage.setReceivers(handler);
+                wsMessage.setRecieveNumber(handlerNumber);
+                wsMessage.setRecieverID(wfrAssignMessage.getHandlerId());
+                return sendMessage(wsMessage, "2", "1");
+            }
+        } catch (BOSException e) {
+            e.printStackTrace();
+        }
+        return false;
+    }
+
+    /**
+     * @param message
+     * @param isremark 流程处理状态
+     * @param viewtype 流程查看状态
+     * @return
+     */
+    private boolean sendMessage(WSMessage message, String isremark, String viewtype) {
         try {
-            Properties prop = new Properties();
-            String propPath = System.getProperty("EAS_HOME") + "/server/properties/scy/receiveOAConfig.properties";
-            prop.load(new FileInputStream(propPath));
-            String receiveOAPath = prop.getProperty("receiveOAPath");
             String serverName = prop.getProperty("serverName");
+            String receiveOAPath = prop.getProperty("receiveOAPath");
             if (StringUtils.isEmpty(receiveOAPath)) {
-                logger.error("发送OA待办消息,推送异步消息地址不能为空! 请检查配置文件: " + propPath);
-                return false;
+                throw new RuntimeException("发送OA待办消息,推送异步消息地址不能为空! 请检查配置文件: " + propPath);
             }
             JSONObject params = new JSONObject();
             String syscode = prop.getProperty("syscode", "SHR");
@@ -57,6 +256,8 @@ public class OAMessageWebServiceDao implements MessageWebServiceDao {
             MsgType type = message.getType();
             if (type != null) {
                 params.put("workflowname", type.getAlias());//流程类型名称
+            } else {
+                params.put("workflowname", "任务");
             }
             String billId = message.getBillId();
             logger.error("billId: " + billId);
@@ -76,8 +277,8 @@ public class OAMessageWebServiceDao implements MessageWebServiceDao {
             params.put("pcurl", url);//PC地址(相对路径/开头)
             params.put("appurl", url);//APP地址(相对路径/开头)
             //params.put("nodename", message.get);//步骤名称(节点名称)
-            params.put("isremark", "0");//流程处理状态
-            params.put("viewtype", "1");//流程查看状态
+            params.put("isremark", isremark);//流程处理状态
+            params.put("viewtype", viewtype);//流程查看状态
             params.put("creator", message.getSenderNumber());//创建人(原值)
             params.put("createdatetime", now);//创建日期时间
             params.put("receiver", message.getRecieveNumber());//接收人(原值)
@@ -96,6 +297,7 @@ public class OAMessageWebServiceDao implements MessageWebServiceDao {
             Response response = client.newCall(request).execute();
             if (response.isSuccessful()) {
                 String result = response.body().string();
+                logger.error("addMessage -> result:" + result);
                 JSONObject jsonObject = JSONObject.parseObject(result);
                 String operResult = jsonObject.getString("operResult");
                 if ("1".equals(operResult)) {
@@ -113,73 +315,50 @@ public class OAMessageWebServiceDao implements MessageWebServiceDao {
     }
 
     /**
-     * 删除消息
-     *
-     * @param s
-     * @return
-     */
-    @Override
-    public boolean removeMessage(String s) {
-        return false;
-    }
-
-    /**
-     * 删除消息
-     *
-     * @param s
-     * @param context
-     * @return
-     */
-    @Override
-    public boolean removeMessage(String s, Context context) {
-        return false;
-    }
-
-    /**
-     * 更新消息
-     *
-     * @param s
-     * @return
-     */
-    @Override
-    public boolean updateMessage(String s) {
-        return false;
-    }
-
-    /**
-     * 更新消息
+     * 删除待办
      *
-     * @param s
-     * @param context
+     * @param flowId
+     * @param userId
      * @return
      */
-    @Override
-    public boolean updateMessage(String s, Context context) {
-        return false;
-    }
-
-    /**
-     * @param s
-     * @param msgStatus
-     * @return
-     */
-    @Override
-    public boolean updateMessages(String s, MsgStatus msgStatus) {
-        return false;
-    }
-
-    @Override
-    public boolean updateMessages(String s, MsgStatus msgStatus, Context context) {
-        return false;
-    }
-
-    @Override
-    public boolean addInitiatorMessage(WfrProcMessage wfrProcMessage) {
-        return false;
-    }
-
-    @Override
-    public boolean addCompletedMessage(WfrAssignMessage wfrAssignMessage) {
+    private boolean deleteMessage(String flowId, String userId) {
+        try {
+            OkHttpClient client = new OkHttpClient();
+            JSONObject params = new JSONObject();
+            String deleteMsgPath = prop.getProperty("deleteMsgPath");
+            if (StringUtils.isEmpty(deleteMsgPath)) {
+                throw new RuntimeException("删除OA消息地址不能为空! 请检查配置文件: " + propPath);
+            }
+            String syscode = prop.getProperty("syscode", "SHR");
+            params.put("syscode", syscode);
+            params.put("flowid", flowId);
+            params.put("userid", userId);
+            String paramsStr = params.toString();
+            logger.error("OAMessageWebServiceDao  deleteMessage-> params:" + paramsStr);
+            MediaType mediaType = MediaType.parse("application/json");
+            RequestBody body = RequestBody.create(mediaType, paramsStr);
+            Request request = new Request.Builder()
+                    .url(deleteMsgPath)
+                    .post(body)
+                    .addHeader("content-type", "application/json")
+                    .build();
+            Response response = client.newCall(request).execute();
+            if (response.isSuccessful()) {
+                String result = response.body().string();
+                logger.error("deleteMessage -> result:" + result);
+                JSONObject jsonObject = JSONObject.parseObject(result);
+                String operResult = jsonObject.getString("operResult");
+                if ("1".equals(operResult)) {
+                    return true;
+                } else {
+                    logger.error(jsonObject.getString("message"));
+                }
+            } else {
+                logger.error("删除OA待办消息 超时");
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
         return false;
     }
 }

+ 57 - 0
src/com/kingdee/eas/custom/sso/ExpiringMapCache.java

@@ -0,0 +1,57 @@
+package com.kingdee.eas.custom.sso;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+public class ExpiringMapCache<K, V> {
+    private final Map<K, CacheValue<V>> cache = new ConcurrentHashMap<>();
+    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
+
+    public ExpiringMapCache() {
+        scheduler.scheduleAtFixedRate(() -> {
+            long currentTime = System.currentTimeMillis();
+            cache.entrySet().removeIf(entry -> currentTime >= entry.getValue().expiryTime);
+        }, 1, 1, TimeUnit.SECONDS); // 每秒检查过期
+    }
+
+    public void put(K key, V value, long durationInMillis) {
+        long expiryTime = System.currentTimeMillis() + durationInMillis;
+        cache.put(key, new CacheValue<>(value, expiryTime));
+    }
+
+    public V get(K key) {
+        CacheValue<V> cacheValue = cache.get(key);
+        if (cacheValue != null && System.currentTimeMillis() < cacheValue.expiryTime) {
+            return cacheValue.value;
+        }
+        cache.remove(key); // 删除已过期的条目
+        return null;
+    }
+
+    public void shutdown() {
+        scheduler.shutdown();
+    }
+
+    private static class CacheValue<V> {
+        private final V value;
+        private final long expiryTime;
+
+        public CacheValue(V value, long expiryTime) {
+            this.value = value;
+            this.expiryTime = expiryTime;
+        }
+    }
+
+    public static void main(String[] args) throws InterruptedException {
+        ExpiringMapCache<String,String> cache = new ExpiringMapCache<>();
+        cache.put("111","AAA",2000);
+        while(true){
+            System.out.println(cache.get("111"));
+            Thread.sleep(1000);
+        }
+    }
+}
+

+ 17 - 13
src/com/kingdee/eas/custom/sso/OAToSHR.java

@@ -33,7 +33,7 @@ import java.util.*;
  */
 public class OAToSHR extends HttpServlet {
     private static Logger logger = Logger.getLogger(OAToSHR.class);
-
+    private static ExpiringMapCache<String, String> redirectUrlCache = new ExpiringMapCache<>();
     private Properties prop = new Properties();
     private String propPath = System.getProperty("EAS_HOME") + "/server/properties/scy/OASSOConfig.properties";
 
@@ -118,10 +118,13 @@ public class OAToSHR extends HttpServlet {
             }
             redirectUrl = serverName + "/shr/dynamic.do?uipk=shr.perself.homepage";
         }
+        Random random = new Random();
+        String key = System.currentTimeMillis() + String.valueOf(random.nextInt(99999));
+        redirectUrlCache.put(key, redirectUrl,300000);
         logger.error("callBack redirectUrl" + redirectUrl);
-        String encrypt = encrypt(redirectUrl, SECRETKEY);
-        logger.error("callBack encrypt" + encrypt);
-        redirect_uri1 += "?redirect=" + URLEncoder.encode(encrypt, "UTF-8");
+        //String encrypt = encrypt(redirectUrl, SECRETKEY);
+        //logger.error("callBack encrypt" + encrypt);
+        redirect_uri1 += "?redirect=" + key;
         Map params = new HashMap();
         params.put("client_id", client_id);
         params.put("response_type", response_type);
@@ -192,10 +195,10 @@ public class OAToSHR extends HttpServlet {
      * 获取携带账号和密码的登录地址
      *
      * @param userNumber
-     * @param redirectUrl
+     * @param redirectUrlKey
      * @return
      */
-    private String login(String userNumber, String redirectUrl) throws Exception {
+    private String login(String userNumber, String redirectUrlKey) throws Exception {
         String password = LtpaTokenManager.generate(userNumber, LtpaTokenManager.getDefaultLtpaConfig()).toString();
         logger.error("login: password" + password);
         String serverName = prop.getProperty("serverName");
@@ -206,18 +209,19 @@ public class OAToSHR extends HttpServlet {
         url.append("/shr/index2sso.jsp?username=").append(userNumber)
                 .append("&password=").append(password).append("&redirectTo=");
         StringBuilder redirectUrlStr = new StringBuilder();
-        if (StringUtils.isEmpty(redirectUrl)) {
+        if (StringUtils.isEmpty(redirectUrlKey)) {
             redirectUrlStr.append(serverName).append("/shr/dynamic.do?uipk=shr.perself.homepage");
         } else {
-            //解密
-            String decrpt = decrypt(redirectUrl, SECRETKEY);
-            if (decrpt.contains(serverName)) {
-                redirectUrlStr.append(decrpt);
+            String redirectUrl = redirectUrlCache.get(redirectUrlKey);
+            //String decrpt = decrypt(redirectUrl, SECRETKEY);
+            if (redirectUrl.contains(serverName)) {
+                redirectUrlStr.append(redirectUrl);
             } else {
-                redirectUrlStr.append(serverName).append(decrpt);
+                redirectUrlStr.append(serverName).append(redirectUrl);
             }
         }
-        url.append(URLEncoder.encode(redirectUrlStr.toString(), "UTF-8"));
+        String encode = URLEncoder.encode(redirectUrlStr.toString(), "UTF-8");
+        url.append(URLEncoder.encode(encode, "UTF-8"));
         logger.error("login: url" + url);
         return url.toString();
     }