9060 9 mesiacov pred
rodič
commit
1fb53e85d7

+ 2 - 0
config/server/properties/sy/syConfig.properties

@@ -2,3 +2,5 @@ ip=https://test-openapi.17win.com
 appKey=46639607259987202405271637080
 appSecret=oTmd/QGL2xOfIKItqFGKnw\u003D\u003D
 version=1.0.0
+cronText=0 0/30 * * * ? 
+

+ 72 - 0
src/com/kingdee/eas/custom/shuiyou/task/TaskExecuteFacadeControllerBean.java

@@ -1,5 +1,14 @@
 package com.kingdee.eas.custom.shuiyou.task;
 
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.google.common.collect.Maps;
+import com.kingdee.bos.dao.ormapping.ObjectUuidPK;
+import com.kingdee.bos.metadata.entity.*;
+import com.kingdee.bos.metadata.query.util.CompareType;
+import com.kingdee.eas.custom.shuiyou.RequestStateEnum;
+import com.kingdee.eas.custom.shuiyou.uitls.*;
 import org.apache.log4j.Logger;
 import javax.ejb.*;
 import java.rmi.RemoteException;
@@ -18,9 +27,72 @@ import com.kingdee.bos.service.ServiceContext;
 import com.kingdee.bos.service.IServiceContext;
 
 import java.lang.String;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.CountDownLatch;
 
 public class TaskExecuteFacadeControllerBean extends AbstractTaskExecuteFacadeControllerBean
 {
     private static Logger logger =
         Logger.getLogger("com.kingdee.eas.custom.shuiyou.task.TaskExecuteFacadeControllerBean");
+
+    @Override
+    protected String _executeTask(Context ctx, String taskId) throws BOSException {
+        int size =0;
+        try {
+            ITask iTask = TaskFactory.getLocalInstance(ctx);
+            if (StrUtil.isBlank(taskId)) {
+                //指定id执行任务
+                TaskInfo taskInfo = iTask.getTaskInfo(new ObjectUuidPK(taskId));
+                taskInfo.setContext(ctx).execute();
+                size =1;
+            }else {
+                //执行状态为未开始的任务
+                EntityViewInfo viewInfo = new EntityViewInfo();
+                SelectorItemCollection sc = new SelectorItemCollection();
+                sc.add(new SelectorItemInfo("id"));
+                sc.add(new SelectorItemInfo("url"));
+                sc.add(new SelectorItemInfo("requestId"));
+                sc.add(new SelectorItemInfo("requestType"));
+                sc.add(new SelectorItemInfo("param"));
+                sc.add(new SelectorItemInfo("requestState"));
+                sc.add(new SelectorItemInfo("name"));
+                sc.add(new SelectorItemInfo("osfServiceName"));
+                sc.add(new SelectorItemInfo("number"));
+                viewInfo.setSelector(sc);
+                FilterInfo filterInfo = new FilterInfo();
+                filterInfo.getFilterItems().add(
+                        new FilterItemInfo("requestState",
+                                RequestStateEnum.NOTSTARTED_VALUE, CompareType.EQUALS));
+                viewInfo.setFilter(filterInfo);
+                TaskCollection taskCollection = iTask.getTaskCollection(viewInfo);
+                //更新状态为进行中
+                size = taskCollection.size();
+                for(int i=0;i<size;i++) {
+                    TaskInfo taskInfo = taskCollection.get(i);
+                    SelectorItemCollection scUp = new SelectorItemCollection();
+                    scUp.add(new SelectorItemInfo("requestState"));
+                    taskInfo.setRequestState(RequestStateEnum.Ongoing);
+                    iTask.updatePartial(taskInfo,scUp);
+                }
+                //添加任务阻塞
+                CountDownLatch latch = new CountDownLatch(size);
+                SYUCronTaskUtil cronTaskUtil = SYUCronTaskUtil.getInstance();
+                //添加到轮询调用任务中
+                for(int i=0;i<size;i++) {
+                    TaskInfo taskInfo = taskCollection.get(i);
+                    taskInfo.setContext(ctx);
+                    taskInfo.setCountDownLatch(latch);
+                    cronTaskUtil.addSchedule(taskInfo);
+                }
+                latch.await();
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+            logger.error(e);
+            size=0;
+           throw new BOSException(e);
+        }
+        return String.valueOf(size);
+    }
 }

+ 149 - 2
src/com/kingdee/eas/custom/shuiyou/task/TaskInfo.java

@@ -2,11 +2,38 @@ package com.kingdee.eas.custom.shuiyou.task;
 
 
 
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.cron.task.Task;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.google.common.collect.Maps;
+import com.kingdee.bos.BOSException;
+import com.kingdee.bos.Context;
+import com.kingdee.eas.common.EASBizException;
+import com.kingdee.eas.custom.shuiyou.RequestStateEnum;
+import com.kingdee.eas.custom.shuiyou.RequestTypeEnum;
+import com.kingdee.eas.custom.shuiyou.uitls.ISYUtilsFacade;
+
+import com.kingdee.eas.custom.shuiyou.uitls.SYUCronTaskUtil;
+import com.kingdee.eas.custom.shuiyou.uitls.SYUtilsFacadeFactory;
+import com.kingdee.eas.util.app.DbUtil;
+import com.kingdee.shr.base.syssetting.MSFServiceFacadeFactory;
+import org.apache.log4j.Logger;
+
 import java.io.Serializable;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.CountDownLatch;
 
-public class TaskInfo extends AbstractTaskInfo implements Serializable
+public class TaskInfo extends AbstractTaskInfo implements Serializable, Task
 {
-
+    private static Logger logger =Logger.getLogger(TaskInfo.class);
+    private StringBuilder msg=new StringBuilder();
+    private boolean state=true;
+    public static final String calculatingCode="100004";
+    private int i=0;
+    private Context ctx;
+    private CountDownLatch cdl;
     public TaskInfo()
     {
         super();
@@ -17,6 +44,126 @@ public class TaskInfo extends AbstractTaskInfo implements Serializable
         super(pkField);
 
     }
+    public TaskInfo setContext(Context context)
+    {
+        this.ctx=context;
+        return this;
+    }
 
+    public TaskInfo setCountDownLatch(CountDownLatch cdl)
+    {
+        this.cdl=cdl;
+        return this;
+    }
+    /**
+     * 当前任务状态
+     * true 执行中
+     * false 执行完
+     * @return
+     */
+    public boolean isState() {
+        return state;
+    }
 
+    public String getMsg() {
+        return msg.toString();
+    }
+
+    @Override
+    public void execute() {
+        this.i=this.i+1;
+        try {
+            //设置执行中
+            this.setRequestState(RequestStateEnum.Ongoing);
+            ISYUtilsFacade syu = SYUtilsFacadeFactory.getLocalInstance(this.ctx);
+            Map<String,String> map = Maps.newHashMap();
+            map.put("requestId",this.getRequestId());
+            //拼接参数
+            if(StrUtil.isBlank(this.getParam())){
+                JSONObject jsonObject = JSONUtil.parseObj(this.getParam());
+                for(Map.Entry<String,Object> st : jsonObject.entrySet()){
+                    Optional<Object> op = Optional.ofNullable(st.getValue());
+                    map.put(st.getKey(),op.orElse("").toString());
+                }
+            }
+            String getParam = JSONUtil.toJsonStr(map);
+            logger.info("任务:"+this.getId().toString()+",请求地址:"+this.getUrl()+",请求参数:"+getParam+"。");
+            //调用远程接口
+            String string = null;
+            if(RequestTypeEnum.GET_VALUE.equals(this.getRequestType().getValue())){
+                string = syu.get(this.getUrl(),getParam);
+            }else{
+                string = syu.post(this.getUrl(),getParam);
+            }
+
+            JSONObject jsonObject = JSONUtil.parseObj(string);
+            JSONObject head =  jsonObject.getJSONObject("head");
+            if(null!=head){
+                String state = (String) head.get("state");
+                String code = (String) head.get("code");
+                if("Y".equalsIgnoreCase(state)){
+                    logger.info("请求成功"+(this.i)+",结果:"+string);
+                    //请求成功停止这个任务
+                    this.stop();
+                    Map<String,Object> param = JSONUtil.parseObj(this.getParam());
+                    param.put("result",string);
+                    this.setBody(JSONUtil.toJsonStr(param));
+                    //设置成功
+                    this.setRequestState(RequestStateEnum.Successful);
+                    this.callBackOSF(this,param);
+                } else if(calculatingCode.equals(code)){
+                    logger.info("请求"+(this.i)+"计算中,结果:"+string);
+                    //继续
+                } else {
+                    logger.info("请求"+(this.i)+"失败,结果:"+string);
+                    //请求失败停止这个任务
+                    this.stop();
+                    Map<String,Object> param = JSONUtil.parseObj(this.getParam());
+                    param.put("result",string);
+                    this.setBody(JSONUtil.toJsonStr(param));
+                    //设置失败
+                    this.setRequestState(RequestStateEnum.Failed);
+                    this.callBackOSF(this,param);
+                }
+            }
+        }catch (BOSException e){
+            e.printStackTrace();
+            logger.error(e);
+            this.stop();
+        }finally {
+
+        }
+    }
+
+    public void callBackOSF(TaskInfo task,Map<String,Object> param){
+        try {
+            //回调osf服务
+            if(StrUtil.isNotBlank(this.getOsfServiceName())) {
+                Object obj = MSFServiceFacadeFactory.getLocalInstance(this.ctx).processService(this.getOsfServiceName(), param);
+            }
+            //更新任务状态
+            TaskFactory.getLocalInstance(this.ctx).save(this);
+        } catch (BOSException e){
+            //e.printStackTrace();
+            logger.error(e);
+        } catch (EASBizException e){
+            //e.printStackTrace();
+            logger.error(e);
+        }finally {
+            try {
+                DbUtil.execute(ctx, "update CT_TK_Task set CFRequestState=? where fid=?",
+                        new String[]{task.getRequestState().getValue(),task.getId().toString()});
+            }catch (Exception e){
+                logger.error(e);
+            }
+        }
+    }
+
+    public boolean stop(){
+        this.state=false;
+        if(null!=cdl) {
+            cdl.countDown();
+        }
+        return SYUCronTaskUtil.getInstance().delSchedule(this);
+    }
 }

+ 18 - 3
src/com/kingdee/eas/custom/shuiyou/uitls/SYUConfigUtil.java

@@ -1,7 +1,13 @@
 package com.kingdee.eas.custom.shuiyou.uitls;
 
+import cn.hutool.core.lang.Snowflake;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.cron.CronUtil;
 import com.google.common.collect.Maps;
-import com.kingdee.bos.BOSException;
+
+import com.kingdee.bos.util.BOSUuid;
+import com.kingdee.eas.custom.shuiyou.task.TaskInfo;
 import org.apache.log4j.Logger;
 
 import java.io.FileInputStream;
@@ -27,12 +33,12 @@ public class SYUConfigUtil {
     }
 
     private SYUConfigUtil() {
-        this.initConfig("/server/properties/sy/syConfig.properties");
+        this.initConfig(System.getProperty("EAS_HOME") + "/server/properties/sy/syConfig.properties");
     }
 
     public void initConfig(String filePath) {
         try {
-            this.propt.load(new FileInputStream(System.getProperty("EAS_HOME") + filePath));
+            this.propt.load(new FileInputStream(filePath));
         }catch (IOException e){
             e.printStackTrace();
             logger.error(e);
@@ -47,4 +53,13 @@ public class SYUConfigUtil {
         }
         return map;
     }
+
+    public static void main(String[] args) {
+        System.setProperty("EAS_HOME","D:/jingdie/yss/8.6v2jar/Project_86v2/jiuzhoutong/config");
+        System.out.println(System.getProperty("EAS_HOME"));
+        SYUConfigUtil sys = SYUConfigUtil.getInstance();
+        sys.initConfig(System.getProperty("EAS_HOME")+"/server/properties/sy/syConfig.properties");
+
+        System.out.println(sys.getConfig().get("cronText"));
+    }
 }

+ 101 - 0
src/com/kingdee/eas/custom/shuiyou/uitls/SYUCronTaskUtil.java

@@ -0,0 +1,101 @@
+package com.kingdee.eas.custom.shuiyou.uitls;
+
+import cn.hutool.core.lang.Snowflake;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.cron.CronUtil;
+import com.google.common.collect.Maps;
+import com.kingdee.bos.util.BOSUuid;
+import com.kingdee.eas.custom.shuiyou.task.TaskInfo;
+import org.apache.log4j.Logger;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+/**
+ * 定时任务
+ * description: SYUConfigUtil <br>
+ * date: 2024/8/23 15:11 <br>
+ * author: lhbj <br>
+ * version: 1.0 <br>
+ */
+public class SYUCronTaskUtil {
+
+
+    private static Logger logger =Logger.getLogger(SYUCronTaskUtil.class);
+    private Snowflake snowflake = IdUtil.getSnowflake(1, 1);
+    private static SYUCronTaskUtil instance = new SYUCronTaskUtil();
+
+    private Map<String,String> propt=null;
+    public static SYUCronTaskUtil getInstance() {
+        return instance;
+    }
+    public static String CRONTEXT = "cronText";
+
+    private SYUCronTaskUtil() {
+        CronUtil.setMatchSecond(true);
+        CronUtil.restart();
+    }
+
+    public Snowflake getSnowflake() {
+        return snowflake;
+    }
+
+    public Map<String,String> getPropt(){
+        if(null==this.propt){
+            this.propt=SYUConfigUtil.getInstance().getConfig();
+        }
+        return this.propt;
+    }
+
+    /**
+     * 添加定时任务
+     * @param task
+     * @return
+     */
+    public String addSchedule(TaskInfo task){
+        return this.addSchedule(null,task);
+    }
+
+    /**
+     * 添加定时任务
+     * @param task
+     * @return
+     */
+    public String addSchedule(String cron,TaskInfo task){
+
+        if(StrUtil.isBlank(cron)){
+            cron=this.getPropt().get(CRONTEXT);
+        }
+        if(StrUtil.isBlankIfStr(task.getId())){
+            task.setId(BOSUuid.create(task.getBOSType()));
+        }
+       return CronUtil.schedule(task.getId().toString(),cron, task);
+    }
+
+    /**
+     * 移除定时任务
+     * @param id
+     * @return
+     */
+    public boolean delSchedule(String id){
+        return CronUtil.remove(id);
+    }
+    /**
+     * 移除定时任务
+     * @param task
+     * @return
+     */
+    public boolean delSchedule(TaskInfo task){
+        return this.delSchedule(task.getId().toString());
+    }
+
+
+
+    public static void main(String[] args) {
+
+    }
+}

+ 96 - 2
src/com/kingdee/eas/custom/shuiyou/uitls/SYUtilsFacadeControllerBean.java

@@ -1,5 +1,6 @@
 package com.kingdee.eas.custom.shuiyou.uitls;
 
+import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
@@ -8,7 +9,11 @@ import com.kingdee.bos.dao.IObjectPK;
 import com.kingdee.bos.util.BOSUuid;
 import com.kingdee.eas.base.permission.UserInfo;
 import com.kingdee.eas.common.EASBizException;
+import com.kingdee.eas.custom.shuiyou.RequestStateEnum;
+import com.kingdee.eas.custom.shuiyou.RequestTypeEnum;
 import com.kingdee.eas.custom.shuiyou.interfaceiog.LogInfoFactory;
+import com.kingdee.eas.custom.shuiyou.task.TaskFactory;
+import com.kingdee.eas.custom.shuiyou.task.TaskInfo;
 import okhttp3.*;
 import org.apache.log4j.Logger;
 
@@ -46,7 +51,24 @@ public class SYUtilsFacadeControllerBean extends AbstractSYUtilsFacadeController
 {
     @Override
     protected String _backTask(Context ctx, String url, String requestId, String osfServiceName, String backParam) throws BOSException {
-        return super._backTask(ctx, url, requestId, osfServiceName, backParam);
+        super._backTask(ctx, url, requestId, osfServiceName, backParam);
+        TaskInfo taskInfo = new TaskInfo();
+        try{
+            taskInfo.setUrl(url);
+            taskInfo.setRequestId(requestId);
+            taskInfo.setParam(backParam);
+            taskInfo.setOsfServiceName(osfServiceName);
+            taskInfo.setRequestType(RequestTypeEnum.GET);
+            taskInfo.setRequestState(RequestStateEnum.NotStarted);
+            taskInfo.setName("获取反馈");
+            String number = SYUCronTaskUtil.getInstance().getSnowflake().nextIdStr();
+            taskInfo.setNumber(number);
+            IObjectPK pk = TaskFactory.getLocalInstance(ctx).save(taskInfo);
+            taskInfo.setId(BOSUuid.read(pk.toString()));
+        } catch (Exception e){
+            e.printStackTrace();
+        }
+        return taskInfo.getId().toString();
     }
 
     @Override
@@ -99,18 +121,83 @@ public class SYUtilsFacadeControllerBean extends AbstractSYUtilsFacadeController
             }
         }catch (IOException e){
             e.printStackTrace();
+            logger.error(e);
+            logInfo.setErrorInfo(e.getMessage());//接口地址
         }finally {
             logInfo.setInterfaceAddress(url);//接口地址
             logInfo.setInterfaceName(url);//接口名
             logInfo.setInParameter(param);//入参
             logInfo.setOutParameter(result);//回参
+            this._log(ctx,logInfo);
         }
         return result;
     }
 
     @Override
     protected String _get(Context ctx, String url, String param) throws BOSException {
-        return super._get(ctx, url, param);
+        super._get(ctx, url, param);
+        String result = "";
+        LogInfoInfo logInfo = new LogInfoInfo();
+        try {
+            //日志
+            logInfo.setEntrance(this.getClass().getName());//入口
+            Long timestampLong = System.currentTimeMillis();
+            UserInfo userInfo = (UserInfo)ctx.get("UserInfo");
+            logInfo.setCreator(userInfo);
+            Timestamp timestamp = new Timestamp(timestampLong);
+            logInfo.setCreateTime(timestamp);
+            logInfo.setLastUpdateTime(timestamp);
+            logInfo.setLastUpdateUser(userInfo);
+            logInfo.setBizDate(timestamp);
+
+            JSONObject paramMap = JSONUtil.parseObj(param);
+            //获取配置文件
+            Map<String,String> propt = this._getConfig(ctx);
+            if(StrUtil.isBlank(paramMap.getStr("timestamp"))){
+
+                paramMap.set("timestamp",String.valueOf(timestampLong));
+            }
+            if(StrUtil.isBlank(paramMap.getStr("xReqNonce"))){
+                String xReqNonce = UUID.randomUUID().toString().replace("-", "");//调用者生成的 UUID(32位),结合时间戳timestamp 防重放
+                paramMap.set("xReqNonce",xReqNonce);
+            }
+            param=JSONUtil.toJsonStr(paramMap);
+            String signature = this._getSignature(ctx,propt,paramMap);
+            Map<String,String> headers = new HashMap<String,String>();
+            headers.put("appKey",propt.get("appKey"));
+            headers.put("timestamp",paramMap.getStr("timestamp"));
+            headers.put("version",propt.get("version"));
+            headers.put("xReqNonce",paramMap.getStr("xReqNonce"));
+            headers.put("signature",signature);
+            OkHttpClient client = new OkHttpClient();
+            HttpUrl.Builder urlBuilder = HttpUrl.parse(url).newBuilder();
+            for(Map.Entry<String,Object> entry : paramMap.entrySet() ){
+                Optional<Object> op = Optional.ofNullable(entry.getValue());
+                urlBuilder.addQueryParameter(entry.getKey(), op.orElse("").toString());
+            }
+            url = urlBuilder.build().toString();
+            Request sYRequest = new Request.Builder()
+                    .url(url).headers(Headers.of(headers))
+                    .get()
+                    .build();
+            Response sYResponse = client.newCall(sYRequest).execute();
+            if (sYResponse.isSuccessful()) {
+                result = sYResponse.body().string();
+            }else {
+                logInfo.setErrorInfo(sYResponse.message());//错误信息
+            }
+        }catch (IOException e){
+            e.printStackTrace();
+            logger.error(e);
+            logInfo.setErrorInfo(e.getMessage());//接口地址
+        }finally {
+            logInfo.setInterfaceAddress(url);//接口地址
+            logInfo.setInterfaceName(url);//接口名
+            logInfo.setInParameter(param);//入参
+            logInfo.setOutParameter(result);//回参
+            this._log(ctx,logInfo);
+        }
+        return result;
     }
 
     private static Logger logger =
@@ -196,6 +283,7 @@ public class SYUtilsFacadeControllerBean extends AbstractSYUtilsFacadeController
     @Override
     protected void _initConfig(Context ctx, String filePath) throws BOSException {
         super._initConfig(ctx, filePath);
+
         SYUConfigUtil.getInstance().initConfig(filePath);
     }
 
@@ -212,6 +300,12 @@ public class SYUtilsFacadeControllerBean extends AbstractSYUtilsFacadeController
         return logInfo;
     }
 
+    /**
+     * 获取配置文件
+     * @param ctx
+     * @return
+     * @throws BOSException
+     */
     @Override
     protected Map _getConfig(Context ctx) throws BOSException {
         super._getConfig(ctx);