Browse Source

Merge branch 'master' of ssh://10.10.100.21/source/uas-office-integration

RaoMeng 5 years ago
parent
commit
fbb7f704e4
39 changed files with 355 additions and 107 deletions
  1. 9 1
      README.md
  2. 7 0
      build.gradle
  3. 3 3
      qywx-sdk/src/main/java/com/usoftchina/qywx/sdk/dto/GetDepartmentListResp.java
  4. 13 1
      qywx-sdk/src/main/java/com/usoftchina/qywx/sdk/util/UrlUtils.java
  5. 11 0
      qywx-sdk/src/test/java/com/usoftchina/qywx/sdk/test/MessageSdkTest.java
  6. 3 14
      uas-office-core/src/main/java/com/usoftchina/uas/office/entity/DataCenter.java
  7. 14 0
      uas-office-core/src/main/java/com/usoftchina/uas/office/entity/Master.java
  8. 4 4
      uas-office-core/src/main/java/com/usoftchina/uas/office/listener/UasEventListenerFactory.java
  9. 4 0
      uas-office-core/src/main/java/com/usoftchina/uas/office/service/AbstractService.java
  10. 10 2
      uas-office-core/src/main/java/com/usoftchina/uas/office/service/DataCenterService.java
  11. 9 7
      uas-office-core/src/main/java/com/usoftchina/uas/office/service/MasterService.java
  12. 7 1
      uas-office-core/src/main/java/com/usoftchina/uas/office/service/SchemaService.java
  13. 37 0
      uas-office-core/src/main/java/com/usoftchina/uas/office/util/Try.java
  14. 9 6
      uas-office-qywx/src/main/java/com/usoftchina/uas/office/qywx/controller/QywxAuthController.java
  15. 0 9
      uas-office-qywx/src/main/java/com/usoftchina/uas/office/qywx/entity/JProcess.java
  16. 51 10
      uas-office-qywx/src/main/java/com/usoftchina/uas/office/qywx/listener/UasProcessListener.java
  17. 1 5
      uas-office-qywx/src/main/java/com/usoftchina/uas/office/qywx/manage/controller/QywxAddrBookController.java
  18. 38 5
      uas-office-qywx/src/main/java/com/usoftchina/uas/office/qywx/manage/controller/QywxAgentController.java
  19. 2 2
      uas-office-qywx/src/main/java/com/usoftchina/uas/office/qywx/manage/controller/QywxSettingController.java
  20. 12 0
      uas-office-qywx/src/main/java/com/usoftchina/uas/office/qywx/manage/entity/QywxAgent.java
  21. 15 4
      uas-office-qywx/src/main/java/com/usoftchina/uas/office/qywx/manage/service/QywxAgentService.java
  22. 4 0
      uas-office-qywx/src/main/java/com/usoftchina/uas/office/qywx/service/UasEmployeeService.java
  23. 1 2
      uas-office-qywx/src/main/java/com/usoftchina/uas/office/qywx/service/UasJProcessService.java
  24. 1 5
      uas-office-qywx/src/main/java/com/usoftchina/uas/office/qywx/task/QywxCheckinTask.java
  25. 2 0
      uas-office-server/build.gradle
  26. 4 4
      uas-office-server/src/main/resources/application.yaml
  27. 4 0
      uas-office-server/src/main/resources/erp_schema.json
  28. 2 2
      uas-office-server/src/main/resources/logback-spring.xml
  29. 0 1
      uas-office-server/src/main/resources/schema.sql
  30. 33 4
      uas-office-server/src/main/resources/static/agent.html
  31. 13 9
      uas-office-server/src/main/resources/static/css/iconfont.css
  32. BIN
      uas-office-server/src/main/resources/static/css/iconfont.eot
  33. 4 2
      uas-office-server/src/main/resources/static/css/iconfont.svg
  34. BIN
      uas-office-server/src/main/resources/static/css/iconfont.ttf
  35. BIN
      uas-office-server/src/main/resources/static/css/iconfont.woff
  36. BIN
      uas-office-server/src/main/resources/static/css/iconfont.woff2
  37. 3 3
      uas-office-server/src/main/resources/static/dc.html
  38. 24 0
      uas-office-server/src/main/resources/static/js/agent.js
  39. 1 1
      uas-office-server/src/main/resources/static/js/dc.js

+ 9 - 1
README.md

@@ -27,6 +27,14 @@
 ```
 # build
 gradlew build -x test
-# deploy
+# 发布
 gradlew publish -x test
+# 打包+发布release版本
+gradlew build publish -x test -PprojVersion='1.0.0'
+```
+
+### jenkins构建
+
+```
+http://10.10.100.200:5001/view/Uas/job/uas-office-integration/
 ```

+ 7 - 0
build.gradle

@@ -9,6 +9,12 @@ allprojects {
 }
 
 subprojects { Project subproject ->
+    if (subproject.hasProperty('projVersion')) {
+        subproject.version = subproject.projVersion
+    } else {
+        subproject.version = '1.0.0-SNAPSHOT'
+    }
+    
     apply plugin: 'java'
     apply plugin: 'idea'
     apply plugin: 'maven'
@@ -38,6 +44,7 @@ subprojects { Project subproject ->
         maven { url "http://repo.spring.io/libs-milestone" }
         maven { url "http://maven.aliyun.com/nexus/content/groups/public/" }
         maven { url "http://maven.ubtob.com/artifactory/libs-snapshot-local" }
+        maven { url "http://maven.ubtob.com/artifactory/libs-release-local" }
     }
 
     dependencyManagement {

+ 3 - 3
qywx-sdk/src/main/java/com/usoftchina/qywx/sdk/dto/GetDepartmentListResp.java

@@ -27,7 +27,7 @@ public class GetDepartmentListResp extends BaseResp {
         /**
          * 在父部门中的次序值。order值大的排序靠前。值范围是[0, 2^32)
          */
-        private Integer order;
+        private Long order;
 
         public Integer getId() {
             return id;
@@ -61,11 +61,11 @@ public class GetDepartmentListResp extends BaseResp {
             this.parentid = parentid;
         }
 
-        public Integer getOrder() {
+        public Long getOrder() {
             return order;
         }
 
-        public void setOrder(Integer order) {
+        public void setOrder(Long order) {
             this.order = order;
         }
     }

+ 13 - 1
qywx-sdk/src/main/java/com/usoftchina/qywx/sdk/util/UrlUtils.java

@@ -25,7 +25,19 @@ public class UrlUtils {
      */
     public static String generateOAuthUrl(String corpId, String master, String agentCode, String agentBaseUrl, String authUrl, String redirectUrl) throws Exception {
         if (!urlPattern.matcher(redirectUrl).matches()) {
-            redirectUrl = agentBaseUrl + redirectUrl;
+            if (agentBaseUrl.endsWith("/")) {
+                if (redirectUrl.startsWith("/")) {
+                    redirectUrl = agentBaseUrl + redirectUrl.substring(1);
+                } else {
+                    redirectUrl = agentBaseUrl + redirectUrl;
+                }
+            } else {
+                if (redirectUrl.startsWith("/")) {
+                    redirectUrl = agentBaseUrl + redirectUrl;
+                } else {
+                    redirectUrl = agentBaseUrl + "/" + redirectUrl;
+                }
+            }
         }
         String base64Url = Base64.getEncoder().encodeToString(redirectUrl.getBytes());
         String oauthUrl = String.format("%s?agent=%s&url=%s&master=%s", authUrl, agentCode, base64Url, master);

+ 11 - 0
qywx-sdk/src/test/java/com/usoftchina/qywx/sdk/test/MessageSdkTest.java

@@ -7,6 +7,7 @@ import com.usoftchina.qywx.sdk.MessageSdk;
 import com.usoftchina.qywx.sdk.util.UrlUtils;
 import org.junit.Test;
 
+import java.net.URLEncoder;
 import java.util.*;
 
 /**
@@ -49,4 +50,14 @@ public class MessageSdkTest extends BaseTest {
         System.out.println(chatId);
         sdk.sendChat("Uas", new SendChatReq(chatId).text("Hello World"));
     }
+
+    @Test
+    public void sendProcessMessage() throws Exception {
+        String paramsStr = "{\"master\":\"N_USOFTSYS\",\"nodeId\":53840602,\"baseUrl\":\"" + URLEncoder.encode("http://erp.yitoa.com:8888/ERP/", "utf-8") + "\"}";
+        String msgUrl = UrlUtils.generateOAuthUrl("wwd42c39382ee6298e", "N_USOFTSYS", "Uas", "http://erp.yitoa.com:8888/ERP/",
+                "http://erp.yitoa.com:8888/office/api/authorize", "uas/approval/" + URLEncoder.encode(paramsStr, "utf-8"));
+        sdk.send("Uas", new SendMessageReq()
+                .textCard("应鹏的工作日报流程", "单据编号:2020020258", msgUrl, "查看详情")
+                .toUser("U0301"));
+    }
 }

+ 3 - 14
uas-office-core/src/main/java/com/usoftchina/uas/office/entity/DataCenter.java

@@ -16,15 +16,13 @@ public class DataCenter implements DataSourceBean {
     private String username;
     private String password;
     private String driverClassName;
-    /**
-     * uas外网地址
-     */
-    private String erpOuterUrl;
     /**
      * 当前对接程序,外网地址
      */
     private String outerUrl;
 
+    public static DataCenter INSTANCE;
+
     public Integer getId() {
         return id;
     }
@@ -65,14 +63,6 @@ public class DataCenter implements DataSourceBean {
         this.driverClassName = driverClassName;
     }
 
-    public String getErpOuterUrl() {
-        return erpOuterUrl;
-    }
-
-    public void setErpOuterUrl(String erpOuterUrl) {
-        this.erpOuterUrl = erpOuterUrl;
-    }
-
     @Override
     public String url() {
         return url;
@@ -115,12 +105,11 @@ public class DataCenter implements DataSourceBean {
                 Objects.equals(username, that.username) &&
                 Objects.equals(password, that.password) &&
                 Objects.equals(driverClassName, that.driverClassName) &&
-                Objects.equals(erpOuterUrl, that.erpOuterUrl) &&
                 Objects.equals(outerUrl, that.outerUrl);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(id, url, username, password, driverClassName, erpOuterUrl, outerUrl);
+        return Objects.hash(id, url, username, password, driverClassName, outerUrl);
     }
 }

+ 14 - 0
uas-office-core/src/main/java/com/usoftchina/uas/office/entity/Master.java

@@ -126,4 +126,18 @@ public class Master implements DataSourceBean {
     public String driverClassName() {
         return StringUtils.nvl(ma_driver, "oracle.jdbc.OracleDriver");
     }
+
+    @Override
+    public String toString() {
+        return "Master{" +
+                "ma_id=" + ma_id +
+                ", ma_user='" + ma_user + '\'' +
+                ", ms_pwd='" + ms_pwd + '\'' +
+                ", ma_name='" + ma_name + '\'' +
+                ", ma_function='" + ma_function + '\'' +
+                ", ma_enable=" + ma_enable +
+                ", ma_url='" + ma_url + '\'' +
+                ", ma_driver='" + ma_driver + '\'' +
+                '}';
+    }
 }

+ 4 - 4
uas-office-core/src/main/java/com/usoftchina/uas/office/listener/UasEventListenerFactory.java

@@ -5,11 +5,11 @@ import com.usoftchina.uas.office.dto.UasEvent;
 import com.usoftchina.uas.office.entity.DataCenter;
 import com.usoftchina.uas.office.entity.Master;
 import com.usoftchina.uas.office.jdbc.DataSourceHolder;
-import com.usoftchina.uas.office.service.DataCenterService;
 import com.usoftchina.uas.office.service.MasterService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
 
 import java.lang.reflect.Method;
@@ -30,8 +30,6 @@ public class UasEventListenerFactory {
      */
     private Map<String, Map<String, List<BeanMethod>>> beanMethodMap = new HashMap<>();
 
-    @Autowired
-    private DataCenterService dataCenterService;
     @Autowired
     private MasterService masterService;
 
@@ -59,9 +57,10 @@ public class UasEventListenerFactory {
      * @param event
      * @throws Exception
      */
+    @Async
     public void invokeListeners(UasEvent event) {
         try {
-            DataCenter dataCenter = dataCenterService.find();
+            DataCenter dataCenter = DataCenter.INSTANCE;
             if (null == dataCenter) {
                 return;
             }
@@ -78,6 +77,7 @@ public class UasEventListenerFactory {
                 if (null != beanMethodList) {
                     for (BeanMethod beanMethod : beanMethodList) {
                         try {
+                            logger.debug("invoke on {}.{} {}", beanMethod.bean.getClass().getSimpleName(), beanMethod.method.getName(), event);
                             beanMethod.method.invoke(beanMethod.bean, event);
                         } catch (Exception e) {
                             logger.error("invoke error on " + event, e);

+ 4 - 0
uas-office-core/src/main/java/com/usoftchina/uas/office/service/AbstractService.java

@@ -1,6 +1,8 @@
 package com.usoftchina.uas.office.service;
 
 import com.alibaba.fastjson.JSON;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.dao.DataAccessException;
 import org.springframework.dao.EmptyResultDataAccessException;
@@ -28,6 +30,8 @@ public abstract class AbstractService {
     @Autowired
     protected NamedParameterJdbcTemplate namedJdbcTemplate;
 
+    private final static Logger logger = LoggerFactory.getLogger(AbstractService.class);
+
     protected <T> T queryForObject(String statement, Class<T> targetCls, Object... arguments) {
         try {
             return jdbcTemplate.queryForObject(statement, targetCls, arguments);

+ 10 - 2
uas-office-core/src/main/java/com/usoftchina/uas/office/service/DataCenterService.java

@@ -29,13 +29,19 @@ public class DataCenterService extends AbstractService {
 
     @CacheEvict("DataCenter")
     public void save(DataCenter dataCenter) throws Exception {
-        jdbcTemplate.update("update DataCenter set url=?,username=?,password=?,driverClassName=?,erpOuterUrl=?",
-                dataCenter.getUrl(), dataCenter.getUsername(), dataCenter.getPassword(), dataCenter.getDriverClassName(), dataCenter.getErpOuterUrl());
+        if (null != dataCenter.getOuterUrl()) {
+            if (!dataCenter.getOuterUrl().endsWith("/")) {
+                dataCenter.setOuterUrl(dataCenter.getOuterUrl() + "/");
+            }
+        }
+        jdbcTemplate.update("update DataCenter set url=?,username=?,password=?,driverClassName=?,outerUrl=?",
+                dataCenter.getUrl(), dataCenter.getUsername(), dataCenter.getPassword(), dataCenter.getDriverClassName(), dataCenter.getOuterUrl());
         dynamicDataSourceRegister.unregister(dataCenter);
         if (null != dataCenter.getUsername() && null != dataCenter.getPassword() && null != dataCenter.getUrl()) {
             dynamicDataSourceRegister.register(dataCenter);
             ContextHolder.getApplicationContext().publishEvent(new DataCenterEvent(this, dataCenter));
         }
+        DataCenter.INSTANCE = dataCenter;
     }
 
     @Async
@@ -44,11 +50,13 @@ public class DataCenterService extends AbstractService {
         DataCenter dataCenter = find();
         if (null == dataCenter) {
             jdbcTemplate.update("insert into DataCenter(id,driverClassName,url,password) values (1,'oracle.jdbc.OracleDriver','jdbc:oracle:thin:@127.0.0.1:1521:orcl','select!#%*(')");
+            dataCenter = find();
         } else {
             if (null != dataCenter.getUsername() && null != dataCenter.getPassword() && null != dataCenter.getUrl()) {
                 dynamicDataSourceRegister.register(dataCenter);
                 ContextHolder.getApplicationContext().publishEvent(new DataCenterEvent(this, dataCenter));
             }
         }
+        DataCenter.INSTANCE = dataCenter;
     }
 }

+ 9 - 7
uas-office-core/src/main/java/com/usoftchina/uas/office/service/MasterService.java

@@ -33,8 +33,6 @@ public class MasterService extends AbstractService {
 
     private List<Master> mastersCache;
 
-    @Autowired
-    private DataCenterService dataCenterService;
     @Autowired
     private DynamicDataSourceRegister dataSourceRegister;
 
@@ -47,24 +45,28 @@ public class MasterService extends AbstractService {
 
     public synchronized void refreshMasters() throws SQLException {
         try {
-            DataCenter dataCenter = dataCenterService.find();
+            DataCenter dataCenter = DataCenter.INSTANCE;
             List<Master> masterList = null;
             if (null != dataCenter && null != dataCenter.getUsername() && null != dataCenter.getPassword() && null != dataCenter.getUrl()) {
                 dataSourceRegister.register(dataCenter);
                 DataSourceHolder.set(dataCenter);
-                masterList = queryForBeanList("select * from master order by ma_id", Master.class);
+                masterList = queryForBeanList("select * from master where nvl(ma_enable,0)=1 order by ma_id", Master.class);
                 if (!CollectionUtils.isEmpty(masterList)) {
                     for (Master master : masterList) {
                         if (StringUtils.isEmpty(master.getMa_url())) {
                             master.setMa_url(dataCenter.url());
                         }
                         dataSourceRegister.register(master);
-                        ContextHolder.getApplicationContext().publishEvent(new MasterEvent(this, master));
                     }
                 }
             }
             if (!Objects.equals(mastersCache, masterList)) {
-                logger.debug("masters refreshed, current masters: " + JSON.toJSONString(masterList));
+                if (null != masterList) {
+                    for (Master master : masterList) {
+                        ContextHolder.getApplicationContext().publishEvent(new MasterEvent(this, master));
+                    }
+                    logger.debug("masters refreshed, current masters: " + JSON.toJSONString(masterList));
+                }
                 this.mastersCache = masterList;
             }
         } finally {
@@ -77,7 +79,7 @@ public class MasterService extends AbstractService {
      *
      * @throws Exception
      */
-    @Scheduled(fixedDelay = 300000)
+    @Scheduled(fixedDelay = 300000, initialDelay = 30000)
     public void scheduledRefresh() throws Exception {
         refreshMasters();
     }

+ 7 - 1
uas-office-core/src/main/java/com/usoftchina/uas/office/service/SchemaService.java

@@ -1,6 +1,7 @@
 package com.usoftchina.uas.office.service;
 
 import com.alibaba.fastjson.JSON;
+import com.usoftchina.uas.office.entity.DataCenter;
 import com.usoftchina.uas.office.event.DataCenterEvent;
 import com.usoftchina.uas.office.event.MasterEvent;
 import com.usoftchina.uas.office.jdbc.DataSourceBean;
@@ -10,6 +11,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.context.event.EventListener;
 import org.springframework.core.io.ClassPathResource;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StreamUtils;
@@ -53,8 +55,12 @@ public class SchemaService extends AbstractService {
         refreshSchema(event.getDataCenter());
     }
 
+    @Async
     @EventListener(MasterEvent.class)
     public void onMasterEvent(MasterEvent event) throws Exception {
-        refreshSchema(event.getMaster());
+        if (!event.getMaster().username().equalsIgnoreCase(DataCenter.INSTANCE.username())
+                && !event.getMaster().url().equalsIgnoreCase(DataCenter.INSTANCE.url())) {
+            refreshSchema(event.getMaster());
+        }
     }
 }

+ 37 - 0
uas-office-core/src/main/java/com/usoftchina/uas/office/util/Try.java

@@ -0,0 +1,37 @@
+package com.usoftchina.uas.office.util;
+
+import java.util.concurrent.Callable;
+
+/**
+ * @author yingp
+ * @date 2020/2/18
+ */
+public class Try {
+    /**
+     * 多次尝试执行一段代码,直到拿到结果
+     *
+     * @param callable
+     * @param times
+     * @param <R>
+     * @return
+     * @throws Exception
+     */
+    public static <R> R call(Callable<R> callable, int times) {
+        for (int i = 0; i < times; i++) {
+            try {
+                R result = callable.call();
+                if (null != result) {
+                    return result;
+                }
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+            try {
+                Thread.sleep(500);
+            } catch (InterruptedException e) {
+                return null;
+            }
+        }
+        return null;
+    }
+}

+ 9 - 6
uas-office-qywx/src/main/java/com/usoftchina/uas/office/qywx/controller/QywxAuthController.java

@@ -6,6 +6,8 @@ import com.usoftchina.qywx.sdk.dto.GetUserResp;
 import com.usoftchina.uas.office.entity.DataCenter;
 import com.usoftchina.uas.office.jdbc.DataSourceHolder;
 import com.usoftchina.uas.office.qywx.entity.Employee;
+import com.usoftchina.uas.office.qywx.manage.entity.QywxAgent;
+import com.usoftchina.uas.office.qywx.manage.service.QywxAgentService;
 import com.usoftchina.uas.office.qywx.service.UasEmployeeService;
 import com.usoftchina.uas.office.service.DataCenterService;
 import com.usoftchina.uas.office.util.StringUtils;
@@ -30,15 +32,15 @@ public class QywxAuthController {
     @Autowired
     private AddrBookSdk addrBookSdk;
 
-    @Autowired
-    private DataCenterService dataCenterService;
-
     @Autowired
     private RedisTemplate redisTemplate;
 
     @Autowired
     private UasEmployeeService employeeService;
 
+    @Autowired
+    private QywxAgentService agentService;
+
     /**
      * 获取身份登录
      *
@@ -51,7 +53,7 @@ public class QywxAuthController {
     public ModelAndView authorize(@RequestParam(value = "code") String code, @RequestParam(value = "agent") String agent,
                                   @RequestParam(value = "master", required = false) String master,
                                   @RequestParam(value = "url") String url, HttpServletResponse response) throws IOException {
-        DataCenter dataCenter = dataCenterService.find();
+        DataCenter dataCenter = DataCenter.INSTANCE;
         if (null == dataCenter) {
             return new ModelAndView("/error");
         }
@@ -78,9 +80,10 @@ public class QywxAuthController {
             if (null == employee) {
                 return new ModelAndView("/error");
             }
+            QywxAgent uasAgent = agentService.findByCode("Uas");
             redisTemplate.opsForValue().set(code, employee.getEm_id(), Duration.ofMinutes(1));
-            response.sendRedirect(String.format("%s/open/authorize.action?token=%s&master=%s&url=%s",
-                    dataCenter.getErpOuterUrl(), code, master == null ? "" : master, url));
+            response.sendRedirect(String.format("%sopen/authorize.action?token=%s&master=%s&url=%s",
+                    uasAgent.getOuterUrl(), code, master == null ? "" : master, url));
             return null;
         } finally {
             DataSourceHolder.clear();

+ 0 - 9
uas-office-qywx/src/main/java/com/usoftchina/uas/office/qywx/entity/JProcess.java

@@ -16,7 +16,6 @@ public class JProcess {
     private String jp_url;
     private String jp_codevalue;
     private String jp_nodeid;
-    private String em_qywx;
 
     public Integer getJp_id() {
         return jp_id;
@@ -105,12 +104,4 @@ public class JProcess {
     public void setJp_nodeid(String jp_nodeid) {
         this.jp_nodeid = jp_nodeid;
     }
-
-    public String getEm_qywx() {
-        return em_qywx;
-    }
-
-    public void setEm_qywx(String em_qywx) {
-        this.em_qywx = em_qywx;
-    }
 }

+ 51 - 10
uas-office-qywx/src/main/java/com/usoftchina/uas/office/qywx/listener/UasProcessListener.java

@@ -3,12 +3,18 @@ package com.usoftchina.uas.office.qywx.listener;
 import com.usoftchina.qywx.sdk.MessageSdk;
 import com.usoftchina.qywx.sdk.dto.SendMessageReq;
 import com.usoftchina.qywx.sdk.util.UrlUtils;
+import com.usoftchina.uas.office.context.MasterHolder;
 import com.usoftchina.uas.office.dto.UasEvent;
 import com.usoftchina.uas.office.entity.DataCenter;
+import com.usoftchina.uas.office.jdbc.DataSourceHolder;
 import com.usoftchina.uas.office.listener.UasEventListener;
+import com.usoftchina.uas.office.qywx.entity.Employee;
 import com.usoftchina.uas.office.qywx.entity.JProcess;
+import com.usoftchina.uas.office.qywx.manage.entity.QywxAgent;
+import com.usoftchina.uas.office.qywx.manage.service.QywxAgentService;
+import com.usoftchina.uas.office.qywx.service.UasEmployeeService;
 import com.usoftchina.uas.office.qywx.service.UasJProcessService;
-import com.usoftchina.uas.office.service.DataCenterService;
+import com.usoftchina.uas.office.util.Try;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -27,14 +33,17 @@ public class UasProcessListener {
     @Autowired
     private MessageSdk messageSdk;
 
-    @Autowired
-    private DataCenterService dataCenterService;
-
     @Autowired
     private UasJProcessService jProcessService;
 
     private final Logger logger = LoggerFactory.getLogger(UasProcessListener.class);
 
+    @Autowired
+    private QywxAgentService agentService;
+
+    @Autowired
+    private UasEmployeeService employeeService;
+
     /**
      * uas保存审批任务,发送消息到企业微信
      *
@@ -56,19 +65,51 @@ public class UasProcessListener {
     }
 
     private void sendProcessMessage(UasEvent event, Integer jpId) {
-        JProcess process = jProcessService.getById(jpId);
-        DataCenter dataCenter = dataCenterService.find();
+        JProcess process = Try.call(() -> jProcessService.getById(jpId), 10);
+        if (null == process) {
+            logger.warn("can not find process {}, {}", jpId, event);
+            return;
+        }
+        Employee employee = getDealMan(process);
+        if (null == employee) {
+            return;
+        }
+        DataCenter dataCenter = DataCenter.INSTANCE;
         String title = process.getJp_launchername() + "的" + process.getJp_name();
         String description = "单据编号:" + process.getJp_codevalue();
         try {
-            String paramsStr = "{\"master\":\"" + event.getMaster() + "\",\"nodeId\":" + process.getJp_nodeid() + ",\"baseUrl\":\"" + URLEncoder.encode(dataCenter.getErpOuterUrl(), "utf-8") + "\"}";
-            String msgUrl = UrlUtils.generateOAuthUrl(messageSdk.getCorpId(), event.getMaster(), "Uas", dataCenter.getErpOuterUrl(),
-                    dataCenter.getOuterUrl() + "/api/authorize", "uas/approval/" + URLEncoder.encode(paramsStr, "utf-8"));
+            // 往uas应用发送
+            QywxAgent agent = getUasAgent();
+            String paramsStr = "{\"master\":\"" + event.getMaster() + "\",\"nodeId\":" + process.getJp_nodeid() + ",\"baseUrl\":\"" + URLEncoder.encode(agent.getOuterUrl(), "utf-8") + "\"}";
+            String msgUrl = UrlUtils.generateOAuthUrl(messageSdk.getCorpId(), event.getMaster(), "Uas", agent.getOuterUrl(),
+                    dataCenter.getOuterUrl() + "api/authorize", "uas/approval/" + URLEncoder.encode(paramsStr, "utf-8"));
             messageSdk.send("Uas", new SendMessageReq()
                     .textCard(title, description, msgUrl, "查看详情")
-                    .toUser(process.getEm_qywx()));
+                    .toUser(employee.getEm_qywx()));
         } catch (Exception e) {
             logger.error("send process message error", e);
         }
     }
+
+    public Employee getDealMan(JProcess process) {
+        try {
+            DataSourceHolder.set(DataCenter.INSTANCE);
+            Employee employee = employeeService.getByCode(process.getJp_nodedealman());
+            if (null == employee || null == employee.getEm_qywx()) {
+                return null;
+            }
+            return employee;
+        } finally {
+            DataSourceHolder.set(MasterHolder.get());
+        }
+    }
+
+    public QywxAgent getUasAgent() {
+        try {
+            DataSourceHolder.set(DataCenter.INSTANCE);
+            return agentService.findByCode("Uas");
+        } finally {
+            DataSourceHolder.set(MasterHolder.get());
+        }
+    }
 }

+ 1 - 5
uas-office-qywx/src/main/java/com/usoftchina/uas/office/qywx/manage/controller/QywxAddrBookController.java

@@ -6,7 +6,6 @@ import com.usoftchina.uas.office.entity.DataCenter;
 import com.usoftchina.uas.office.jdbc.DataSourceHolder;
 import com.usoftchina.uas.office.qywx.service.UasEmployeeService;
 import com.usoftchina.uas.office.qywx.service.UasOrgService;
-import com.usoftchina.uas.office.service.DataCenterService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -29,12 +28,9 @@ public class QywxAddrBookController {
     @Autowired
     private AddrBookSdk addrBookSdk;
 
-    @Autowired
-    private DataCenterService dataCenterService;
-
     @PostMapping(path = "/addrbook/sync")
     public Result syncAll() {
-        DataCenter dataCenter = dataCenterService.find();
+        DataCenter dataCenter = DataCenter.INSTANCE;
         if (null == dataCenter) {
             return Result.error("数据中心未设置");
         }

+ 38 - 5
uas-office-qywx/src/main/java/com/usoftchina/uas/office/qywx/manage/controller/QywxAgentController.java

@@ -1,11 +1,12 @@
 package com.usoftchina.uas.office.qywx.manage.controller;
 
+import com.usoftchina.qywx.sdk.config.QywxProperties;
+import com.usoftchina.qywx.sdk.util.UrlUtils;
 import com.usoftchina.uas.office.dto.Result;
 import com.usoftchina.uas.office.entity.DataCenter;
 import com.usoftchina.uas.office.jdbc.DataSourceHolder;
 import com.usoftchina.uas.office.qywx.manage.entity.QywxAgent;
 import com.usoftchina.uas.office.qywx.manage.service.QywxAgentService;
-import com.usoftchina.uas.office.service.DataCenterService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -21,11 +22,11 @@ public class QywxAgentController {
     private QywxAgentService qywxAgentService;
 
     @Autowired
-    private DataCenterService dataCenterService;
+    private QywxProperties qywxProperties;
 
     @GetMapping(path = "/agent")
     public Result getQywxAgentList() {
-        DataCenter dataCenter = dataCenterService.find();
+        DataCenter dataCenter = DataCenter.INSTANCE;
         if (null == dataCenter) {
             return Result.error("数据中心未设置");
         }
@@ -39,7 +40,7 @@ public class QywxAgentController {
 
     @PostMapping(path = "/agent")
     public Result saveQywxAgent(QywxAgent agent) {
-        DataCenter dataCenter = dataCenterService.find();
+        DataCenter dataCenter = DataCenter.INSTANCE;
         if (null == dataCenter) {
             return Result.error("数据中心未设置");
         }
@@ -54,7 +55,7 @@ public class QywxAgentController {
 
     @DeleteMapping(path = "/agent")
     public Result deleteQywxAgent(String code) {
-        DataCenter dataCenter = dataCenterService.find();
+        DataCenter dataCenter = DataCenter.INSTANCE;
         if (null == dataCenter) {
             return Result.error("数据中心未设置");
         }
@@ -66,4 +67,36 @@ public class QywxAgentController {
             DataSourceHolder.clear();
         }
     }
+
+    /**
+     * 获取用于从企业微信跳转到具体应用的授权url
+     *
+     * @param code
+     * @return
+     */
+    @GetMapping(path = "/agent/auth_url")
+    public Result getAgentAuthUrl(String code) throws Exception{
+        DataCenter dataCenter = DataCenter.INSTANCE;
+        if (null == dataCenter) {
+            return Result.error("数据中心未设置");
+        }
+        if (null == dataCenter.getOuterUrl()) {
+            return Result.error("外网地址未设置");
+        }
+        if (null == qywxProperties.getCorpId()) {
+            return Result.error("企业微信ID未设置");
+        }
+        try {
+            DataSourceHolder.set(dataCenter);
+            QywxAgent agent = qywxAgentService.findByCode(code);
+            if (null == agent.getOuterUrl()) {
+                return Result.error("应用外网地址未设置");
+            }
+            String authUrl = UrlUtils.generateOAuthUrl(qywxProperties.getCorpId(), dataCenter.getUsername(), code,
+                    agent.getOuterUrl(), dataCenter.getOuterUrl() + "api/authorize", "/");
+            return Result.success(authUrl);
+        } finally {
+            DataSourceHolder.clear();
+        }
+    }
 }

+ 2 - 2
uas-office-qywx/src/main/java/com/usoftchina/uas/office/qywx/manage/controller/QywxSettingController.java

@@ -24,7 +24,7 @@ public class QywxSettingController {
 
     @GetMapping(path = "/setting")
     public Result getQywxSetting() {
-        DataCenter dataCenter = dataCenterService.find();
+        DataCenter dataCenter = DataCenter.INSTANCE;
         if (null == dataCenter) {
             return Result.error("数据中心未设置");
         }
@@ -38,7 +38,7 @@ public class QywxSettingController {
 
     @PostMapping(path = "/setting/corp")
     public Result saveQywxCorp(String corpId) {
-        DataCenter dataCenter = dataCenterService.find();
+        DataCenter dataCenter = DataCenter.INSTANCE;
         if (null == dataCenter) {
             return Result.error("数据中心未设置");
         }

+ 12 - 0
uas-office-qywx/src/main/java/com/usoftchina/uas/office/qywx/manage/entity/QywxAgent.java

@@ -10,6 +10,10 @@ public class QywxAgent {
     private String description;
     private String secret;
     private Integer readonly;
+    /**
+     * 应用外网地址
+     */
+    private String outerUrl;
 
     public QywxAgent() {
         this.readonly = 0;
@@ -64,4 +68,12 @@ public class QywxAgent {
     public boolean readonly() {
         return null != readonly && 1 == readonly;
     }
+
+    public String getOuterUrl() {
+        return outerUrl;
+    }
+
+    public void setOuterUrl(String outerUrl) {
+        this.outerUrl = outerUrl;
+    }
 }

+ 15 - 4
uas-office-qywx/src/main/java/com/usoftchina/uas/office/qywx/manage/service/QywxAgentService.java

@@ -9,10 +9,13 @@ import com.usoftchina.uas.office.jdbc.DataSourceHolder;
 import com.usoftchina.uas.office.qywx.manage.entity.QywxAgent;
 import com.usoftchina.uas.office.qywx.manage.event.QywxAgentEvent;
 import com.usoftchina.uas.office.service.AbstractService;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.context.event.EventListener;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -25,6 +28,7 @@ import java.util.stream.Collectors;
 @Service
 public class QywxAgentService extends AbstractService {
 
+    @Cacheable(value = "QywxAgent", key = "#code")
     public QywxAgent findByCode(String code) {
         return queryForBean("select * from QywxAgent where code=?", QywxAgent.class, code);
     }
@@ -33,19 +37,26 @@ public class QywxAgentService extends AbstractService {
         return queryForBeanList("select * from QywxAgent order by code", QywxAgent.class);
     }
 
+    @CacheEvict(value = "QywxAgent", key = "#agent.code")
     public void save(QywxAgent agent) {
+        if (!StringUtils.isEmpty(agent.getOuterUrl())) {
+            if (!agent.getOuterUrl().endsWith("/")) {
+                agent.setOuterUrl(agent.getOuterUrl() + "/");
+            }
+        }
         int count = queryForObject("select count(1) from QywxAgent where code=?", Integer.class, agent.getCode());
         if (count == 0) {
-            jdbcTemplate.update("insert into QywxAgent(code,description,agent_id,secret,readonly) values (?,?,?,?,?)",
-                    agent.getCode(), agent.getDescription(), agent.getAgentId(), agent.getSecret(), agent.getReadonly());
+            jdbcTemplate.update("insert into QywxAgent(code,description,agent_id,secret,readonly,outer_url) values (?,?,?,?,?,?)",
+                    agent.getCode(), agent.getDescription(), agent.getAgentId(), agent.getSecret(), agent.getReadonly(), agent.getOuterUrl());
         } else {
-            jdbcTemplate.update("update QywxAgent set description=?,agent_id=?,secret=?,readonly=? where code=?",
-                    agent.getDescription(), agent.getAgentId(), agent.getSecret(), agent.getReadonly(), agent.getCode());
+            jdbcTemplate.update("update QywxAgent set description=?,agent_id=?,secret=?,readonly=?,outer_url=? where code=?",
+                    agent.getDescription(), agent.getAgentId(), agent.getSecret(), agent.getReadonly(), agent.getOuterUrl(), agent.getCode());
         }
 
         ContextHolder.getApplicationContext().publishEvent(new QywxAgentEvent(this, findAll()));
     }
 
+    @CacheEvict(value = "QywxAgent", key = "#code")
     public void delete(String code) {
         jdbcTemplate.update("delete from QywxAgent where code=?", code);
 

+ 4 - 0
uas-office-qywx/src/main/java/com/usoftchina/uas/office/qywx/service/UasEmployeeService.java

@@ -54,6 +54,10 @@ public class UasEmployeeService extends AbstractService {
         return queryForBean("select * from employee where em_email=? and em_class<>'离职'", Employee.class, email);
     }
 
+    public Employee getByCode(String code) {
+        return queryForBean("select * from employee where em_code=? and em_class<>'离职'", Employee.class, code);
+    }
+
     public void setQywx(Employee employee) {
         jdbcTemplate.update("update employee set em_qywx=? where em_id=?", employee.getEm_qywx(), employee.getEm_id());
     }

+ 1 - 2
uas-office-qywx/src/main/java/com/usoftchina/uas/office/qywx/service/UasJProcessService.java

@@ -12,7 +12,6 @@ import org.springframework.stereotype.Service;
 public class UasJProcessService extends AbstractService {
 
     public JProcess getById(Integer id) {
-        return queryForBean("select JProcess.*,em_qywx from JProcess,employee where jp_nodedealman=em_code and jp_id=? and em_qywx is not null",
-                JProcess.class, id);
+        return queryForBean("select * from JProcess where jp_id=?", JProcess.class, id);
     }
 }

+ 1 - 5
uas-office-qywx/src/main/java/com/usoftchina/uas/office/qywx/task/QywxCheckinTask.java

@@ -12,7 +12,6 @@ import com.usoftchina.uas.office.qywx.manage.service.QywxSettingService;
 import com.usoftchina.uas.office.qywx.service.UasCardLogService;
 import com.usoftchina.uas.office.qywx.service.UasEmployeeService;
 import com.usoftchina.uas.office.qywx.service.UasOutSignService;
-import com.usoftchina.uas.office.service.DataCenterService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -41,9 +40,6 @@ public class QywxCheckinTask {
     @Autowired
     private UasEmployeeService employeeService;
 
-    @Autowired
-    private DataCenterService dataCenterService;
-
     @Autowired
     private QywxSettingService settingService;
 
@@ -68,7 +64,7 @@ public class QywxCheckinTask {
         if (!oaSdk.isAgentEnabled(OaSdk.CHECKIN_AGENT_CODE)) {
             return;
         }
-        DataCenter dataCenter = dataCenterService.find();
+        DataCenter dataCenter = DataCenter.INSTANCE;
         if (null != dataCenter.getUsername() && null != dataCenter.getPassword() && null != dataCenter.getUrl()) {
             try {
                 DataSourceHolder.set(dataCenter);

+ 2 - 0
uas-office-server/build.gradle

@@ -1,3 +1,5 @@
+apply plugin: 'org.springframework.boot'
+
 dependencies {
     compile project(':uas-office-qywx')
     compile project(':uas-office-dingtalk')

+ 4 - 4
uas-office-server/src/main/resources/application.yaml

@@ -15,7 +15,7 @@ spring:
   datasource:
     primary:
       driver-class-name: org.h2.Driver
-      jdbc-url: jdbc:h2:file:${user.home}/.qywx/data/qywx;FILE_LOCK=NO;DB_CLOSE_ON_EXIT=FALSE
+      jdbc-url: jdbc:h2:file:${user.home}/.office/data/server;FILE_LOCK=NO;DB_CLOSE_ON_EXIT=FALSE
       username: admin
       password: select111***
     hikari:
@@ -25,12 +25,12 @@ spring:
       max-lifetime: 1800000
       connection-timeout: 30000
   redis:
-    host: 10.1.81.2
+    host: 127.0.0.1
     port: 6379
   jackson:
     serialization:
       write-dates-as-timestamps: true
 logging:
-  path: ${user.home}/.qywx/logs/
+  path: ${user.home}/.office/logs/
   level:
-    com.usoftchina.uas.office: debug
+    com.usoftchina.uas.office: debug

+ 4 - 0
uas-office-server/src/main/resources/erp_schema.json

@@ -34,6 +34,10 @@
       {
         "name": "readonly",
         "type": "number(1)"
+      },
+      {
+        "name": "outer_url",
+        "type": "varchar2(255)"
       }
     ]
   },

+ 2 - 2
uas-office-server/src/main/resources/logback-spring.xml

@@ -24,7 +24,7 @@
     -->
 
     <springProperty scope="context" name="log.path" source="logging.path" defaultValue="./logs"/>
-    <springProperty scope="context" name="spring.application.name" source="spring.application.name" defaultValue="uas-pl"/>
+    <springProperty scope="context" name="spring.application.name" source="spring.application.name" defaultValue="uas-office-server"/>
     <springProperty scope="context" name="spring.profiles.active" source="spring.profiles.active" defaultValue="prod"/>
     <springProperty scope="context" name="common-pattern" source="logging.common-pattern" defaultValue="%d{yyyy-MM-dd HH:mm:ss.SSS}:[%5p] [%t:%r] [%C{1}:%M:%L] --> %m%n"/>
     <springProperty scope="context" name="log.level.console" source="logging.level.console" defaultValue="INFO"/>
@@ -45,7 +45,7 @@
     </appender>
 
     <logger name="org.springframework" level="INFO"/>
-    <logger name="com.usoftchina.uas.pl" level="DEBUG"/>
+    <logger name="com.usoftchina.uas.office" level="DEBUG"/>
 
     <root level="INFO">
         <appender-ref ref="ROOT_APPENDER"/>

+ 0 - 1
uas-office-server/src/main/resources/schema.sql

@@ -4,6 +4,5 @@ create table if not exists DataCenter(
     username varchar(50),
     password varchar(50),
     driverClassName varchar(255),
-    erpOuterUrl varchar(255),
     outerUrl varchar(255)
 );

+ 33 - 4
uas-office-server/src/main/resources/static/agent.html

@@ -49,22 +49,27 @@
                     <div class="form-group">
                         <label for="codeInput">编号</label>
                         <input type="text" class="form-control" id="codeInput" name="code" required
-                               aria-describedby="codeHelp" placeholder="应用编号">
+                               aria-describedby="codeHelp">
                     </div>
                     <div class="form-group">
                         <label for="descriptionInput">描述</label>
                         <input type="text" class="form-control" id="descriptionInput" name="description" required
-                               aria-describedby="descriptionHelp" placeholder="应用描述">
+                               aria-describedby="descriptionHelp">
                     </div>
                     <div class="form-group">
                         <label for="agentIdInput">应用微信ID</label>
                         <input type="text" class="form-control" id="agentIdInput" name="agentId" required
-                               aria-describedby="agentIdHelp" placeholder="应用微信ID">
+                               aria-describedby="agentIdHelp">
                     </div>
                     <div class="form-group">
                         <label for="secretInput">微信接口私钥</label>
                         <input type="text" class="form-control" id="secretInput" name="secret"
-                               required aria-describedby="secretHelp" placeholder="微信接口私钥">
+                               required aria-describedby="secretHelp">
+                    </div>
+                    <div class="form-group">
+                        <label for="secretInput">外网地址</label>
+                        <input type="text" class="form-control" id="outerUrlInput" name="outerUrl"
+                               required aria-describedby="outerUrlHelp">
                     </div>
                     <div class="form-group">
                         <label for="readonlyInput">是否只读</label>
@@ -82,6 +87,25 @@
         </div>
     </div>
 </div>
+<div class="modal fade" id="alertModal" tabindex="-1" role="dialog" aria-labelledby="alertModalTitle" aria-hidden="true">
+    <div class="modal-dialog modal-dialog-scrollable" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title" id="alertModalTitle">提示</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <textarea readonly class="form-control alert-content" rows="7" autofocus style="width: 100%"></textarea>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>
+            </div>
+        </div>
+    </div>
+</div>
+
 <table class="table">
     <thead class="thead-light">
     <tr>
@@ -89,6 +113,7 @@
         <th scope="col">描述</th>
         <th scope="col">应用微信ID</th>
         <th scope="col">微信接口私钥</th>
+        <th scope="col">外网地址</th>
         <th scope="col">操作</th>
     </tr>
     </thead>
@@ -102,6 +127,7 @@
         <td><%=data[i].description%></td>
         <td><%=data[i].agentId || ''%></td>
         <td><%=data[i].secret || ''%></td>
+        <td><%=data[i].outerUrl || ''%></td>
         <td>
             <button type="button" class="btn btn-link btn-edit" data-index="<%=i%>" title="编辑"
                     data-toggle="modal" data-target="#formModal">
@@ -110,6 +136,9 @@
             <button type="button" class="btn btn-link btn-delete" data-index="<%=i%>" title="删除">
                 <span class="iconfont icon-delete"></span>
             </button>
+            <button type="button" class="btn btn-link btn-auth" data-index="<%=i%>" title="创建授权链接">
+                <span class="iconfont icon-link"></span>
+            </button>
         </td>
     </tr>
     <%}%>

+ 13 - 9
uas-office-server/src/main/resources/static/css/iconfont.css

@@ -1,10 +1,10 @@
 @font-face {font-family: "iconfont";
-  src: url('iconfont.eot?t=1552353178223'); /* IE9 */
-  src: url('iconfont.eot?t=1552353178223#iefix') format('embedded-opentype'), /* IE6-IE8 */
-  url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAOMAAsAAAAACEAAAAM/AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDBgqEKIM+ATYCJAMMCwgABCAFhG0HNxsFBxHVm3PIfiTGtmjyzpmhr6KJ9maCB6rzfbMzSfcbqOSkpG/2iTr+JgBMmnPARkVNluQsevQP99BympHPczluPQ9sfstymmPZsrJF8QEFtDceRVYgAXnD2JUX8RwCsMafWERpeW0rdBTGOgGIQf37dkdPmVE1tQIdgbHkqEIswYCuzdVuAYv974svJAsdNAwS46XGPmW9KHx/94OHNFlMdJJmTOM5AXYKJBALKBBdSt3tkGE6Fom1olb1pUYUAm2smMWCL1a1xpX+8TQQRoxqWwAioVHjpCQ2HwI+eIighvM/BUZAB04ANyDDlaRC+QbZ2fn6OrkOtj/1wN9g3j9/L8q018Zh/n6Ratxwr6v1PPf8VdYu0zV3RcM+834bm4LVpx3H/Kg8u3avaU+/eftEv749NonU+A33Uh1H3bX5YYYD9jv2eKq1e8Ocdo88qo0qv7Lb6vMefVeb3d1XzXPtteKAa6uxbntNkeHtZ0Jb7djl03b9YY++++dbCkyt9UJ7J18ne9dtj70vSs3UW7f5/8527c219vPtkNn2XdGch8Fv8lzmR14Ifpi0NE1tr/bFXQ8SM8n/6Wc1e0v4ktn6MX+ab5Jv43l1TJ4vDAdE3UamjCzf8vnlv9b7JnT8FvattCmqKbh+b/M8z9pQWfKq5tX4jk1f0idEpSW0iBjf4jzc2elzc7oBYLkit8hCnDUpIc3/9Tf0WZW6satD7j/dRgHw7GDkOiht5wX9rj0C/mKTAiwWJbjMsEgli22x7pF0TgTRAAq5hn9XD+DMm/5at9bVINBxi6HRDD9IdEIpihELAzakwohOAayJoeK0DS6MQCKUFRDNTACBI4ehYc9lSBy5TVGM1zDgzjcYcRQS1rQRLlfaoO5F3B0ZSmBJ/ymarnWWTXZB7Q3+XStOynzWCzzGGOVJls1d0YLH2DF+fCHiyHHX0AW8hrruqOeuhJEkiPSHNHVlb0pM10x2HBlKYAn9J6LpWueOl13u8zf4d624pqMi+AKPcXIiJyFrQbmq21Yd10Jm/PgCEUc47hriApyozXRH9OWLShhJCD2S/YEU9XJt1cn82ub5EgBrjDul0IQUilUv1BAsYKNMJgA=') format('woff2'),
-  url('iconfont.woff?t=1552353178223') format('woff'),
-  url('iconfont.ttf?t=1552353178223') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
-  url('iconfont.svg?t=1552353178223#iconfont') format('svg'); /* iOS 4.1- */
+  src: url('iconfont.eot?t=1581936370272'); /* IE9 */
+  src: url('iconfont.eot?t=1581936370272#iefix') format('embedded-opentype'), /* IE6-IE8 */
+  url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAPoAAsAAAAACAQAAAOZAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDHAqDMIMSATYCJAMQCwoABCAFhG0HWBsUB8gOJU3BwEhggAFAPPy3H+2+mfnf17C0bEIs7iHiXSyph2pNtImWSCR0aJzuIfn/e536FDkFOQwqUQhADpBkf9ksn/wDgFPjtUS8BXjMVuT/OWa6KMH8NptLRjwf7Q1w3DqgyLoGvOd3ICfoN4xdeRG7CfSW7EbsS8spgXUKY1AgrquVLKxLqZWa3NAKdcnMIp5CpU33LF4DeOL/fvyEoFhHUmXGyAMXUxWQ8EWyupvs+t/luIsAznhGsHlkbAMKcbnUfBYZhrch9Up7ie1Aq5UYq8Ftdff//4i7F3Fr/ssjJJmoGdkjWEaRzBeJTSP44kYj8WW3xE2iS/8WA+4C75F8cZwWtVT1ZZGyKcb36rY1MooSWeOpfS6M+fL2klIM9tE6Cen2VMk4M0OQz1wpYoh3s+nDk2lvKMXcOUlR94+D4Wi3i9VeSK8vhFpfu+RTIbXo7TWujdzuujN6r/suMzoNXVMpaRYGie5ToydSDEgYmeFCwTQ0luan8EVnpXec9+97cH/Dk4ebIyOJjDd1p5Z64cD+/ftPp0dMREDwx+olu5+JOyoSiA6L4Y1I/Glju7vjnps0MQLM4HyR1PUu3Pw/aT/tYnaZtnf71/na1veXr+3P6lhBR8Exy865hF8Jb3+AZP/fb/yf8t98gWlDYUptbUpEiqz6XXLTFMfUBXWl2jdubLSvSjvS1HQk7TpmYEYkrspPSAvqZOqa4pLXvqveJ4vodB8YAaY7+TmZCjAdzZ1kBcB0Nz8ik3/m37jxaaCr1jbm6zppAZ+NTz75rulogfacP8JROL+O07KgqDxDU4rMt9map9jl3wxL6PWYgH2FlTGkq1sHCW2KwyBprIWstQ5ZsNugMliGWmsn9LZKnz9YSUSK0mGLfgBh3jlIZn2AbN4bZMEuQ2WNt1CbDxJ6x8JxxcGGUFPJImIxUtBcM62WCwbe0mEqyC1CynodKyZ5PpFBokntowP9ArKxdGRA4hhjTA3KIIx5mhcFPZ0G9kM6nUAbRUGD5NhPhbExyt+fL3snP7mgB8peIoSFIQo0TjOampzAgHdLY1Tu54sgSvV0WGJNXoWegYhM1M3TAvkJaIFMFxta5V3LPSYNlIJgGI/GEwn0aGnAiOjMsIBmLO+mgchhflQ9gkZR/FExvq3Yb36p/gmXQc9Ys0SKHCUqsxfVSKfYg1ETZu/vQmuuHmPBsEeBdAgjax3bLNTjPaxBrhJEAAAAAA==') format('woff2'),
+  url('iconfont.woff?t=1581936370272') format('woff'),
+  url('iconfont.ttf?t=1581936370272') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
+  url('iconfont.svg?t=1581936370272#iconfont') format('svg'); /* iOS 4.1- */
 }
 
 .iconfont {
@@ -15,11 +15,15 @@
   -moz-osx-font-smoothing: grayscale;
 }
 
+.icon-edit:before {
+  content: "\e604";
+}
+
 .icon-delete:before {
-  content: "\e6cf";
+  content: "\e618";
 }
 
-.icon-edit:before {
-  content: "\e717";
+.icon-link:before {
+  content: "\e62c";
 }
 

BIN
uas-office-server/src/main/resources/static/css/iconfont.eot


File diff suppressed because it is too large
+ 4 - 2
uas-office-server/src/main/resources/static/css/iconfont.svg


BIN
uas-office-server/src/main/resources/static/css/iconfont.ttf


BIN
uas-office-server/src/main/resources/static/css/iconfont.woff


BIN
uas-office-server/src/main/resources/static/css/iconfont.woff2


+ 3 - 3
uas-office-server/src/main/resources/static/dc.html

@@ -29,7 +29,7 @@
 </nav>
 <div class="container">
     <div class="row justify-content-md-center">
-        <div class="col-lg-auto" style="width: 800px;padding: 20px">
+        <div class="col-lg-auto" style="width: 900px;padding: 20px">
             <form id="form">
                 <div class="form-group row">
                     <label class="col-sm-2 col-form-label" for="urlInput">数据库链接</label>
@@ -53,9 +53,9 @@
                     </div>
                 </div>
                 <div class="form-group row">
-                    <label class="col-sm-2 col-form-label" for="erpOuterUrlInput">系统外网地址</label>
+                    <label class="col-sm-2 col-form-label" for="outerUrlInput">Office外网地址</label>
                     <div class="col-sm-10">
-                        <input type="text" class="form-control" id="erpOuterUrlInput" name="erpOuterUrl"
+                        <input type="text" class="form-control" id="outerUrlInput" name="outerUrl"
                                required>
                     </div>
                 </div>

+ 24 - 0
uas-office-server/src/main/resources/static/js/agent.js

@@ -20,12 +20,18 @@ $(document).ready(function () {
                                 $('#agentIdInput').val(agent.agentId);
                                 $('#secretInput').val(agent.secret);
                                 $('#readonlyInput').val(agent.readonly);
+                                $('#outerUrlInput').val(agent.outerUrl);
                             });
                             $('.btn-delete').click(function(){
                                 var index = $(this).data('index'),
                                     agent = app.data.agents[index];
                                 app.methods.remove(agent.code);
                             });
+                            $('.btn-auth').click(function(){
+                                var index = $(this).data('index'),
+                                    agent = app.data.agents[index];
+                                app.methods.getAuthUrl(agent.code);
+                            });
                         } else {
                             alert(content.message);
                         }
@@ -61,6 +67,24 @@ $(document).ready(function () {
                         }
                     }
                 });
+            },
+            getAuthUrl: function (code) {
+                $.ajax({
+                    url: 'mgm/agent/auth_url?code=' + code,
+                    method: 'GET',
+                    success: function (content) {
+                        if (content.success) {
+                            app.methods.alert(code + '授权地址', content.data);
+                        } else {
+                            alert(content.message);
+                        }
+                    }
+                });
+            },
+            alert: function(title, content) {
+                $('#alertModal .modal-title').html(title);
+                $('#alertModal .alert-content').val(content);
+                $('#alertModal').modal();
             }
         },
         init: function () {

+ 1 - 1
uas-office-server/src/main/resources/static/js/dc.js

@@ -11,7 +11,7 @@ $(document).ready(function () {
                             $('#urlInput').val(data.url);
                             $('#usernameInput').val(data.username);
                             $('#passwordInput').val(data.password);
-                            $('#erpOuterUrlInput').val(data.erpOuterUrl);
+                            $('#outerUrlInput').val(data.outerUrl);
                         } else {
                             alert(content.message);
                         }

Some files were not shown because too many files changed in this diff