Przeglądaj źródła

企业微信对接

seyason 1 rok temu
rodzic
commit
dbe8d5eac4
25 zmienionych plików z 315 dodań i 3000 usunięć
  1. 1 1
      fhKeeper/formulahousekeeper/management-workshop/pom.xml
  2. 1 1
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/config/BeanConfig.java
  3. 4 23
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/AuthRedirectController.java
  4. 0 8
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/CommonUploadController.java
  5. 0 31
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/TaskFilesController.java
  6. 5 979
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  7. 8 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/WxCorpInfoService.java
  8. 0 39
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  9. 2 8
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java
  10. 0 32
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/task/SFTPAsyncUploader.java
  11. 240 1361
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/task/TimingTask.java
  12. 0 63
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/util/SFTPUploader.java
  13. 4 4
      fhKeeper/formulahousekeeper/management-workshop/src/main/resources/application-dev.yml
  14. 6 6
      fhKeeper/formulahousekeeper/management-workshop/src/main/resources/application-privatedev.yml
  15. 1 1
      fhKeeper/formulahousekeeper/management-workshop/src/main/resources/application-prod.yml
  16. 4 17
      fhKeeper/formulahousekeeper/management-workshop/src/main/resources/application.yml
  17. 1 3
      fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/utils/request.js
  18. 3 3
      fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/groupView/groupView.vue
  19. 3 2
      fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/index/index.vue
  20. 17 102
      fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/login/index.vue
  21. 6 13
      fhKeeper/formulahousekeeper/timesheet-workshop/src/views/Home.vue
  22. 3 63
      fhKeeper/formulahousekeeper/timesheet-workshop/src/views/Login.vue
  23. 3 2
      fhKeeper/formulahousekeeper/timesheet-workshop/src/views/product/list.vue
  24. 3 12
      fhKeeper/formulahousekeeper/timesheet-workshop/src/views/settings/settings.vue
  25. 0 226
      fhKeeper/formulahousekeeper/timesheet-workshop/src/views/system/index.vue

+ 1 - 1
fhKeeper/formulahousekeeper/management-workshop/pom.xml

@@ -11,7 +11,7 @@
 
     <groupId>com.hssx.parent</groupId>
     <artifactId>timesheet-workshop</artifactId>
-    <version>3.4.0</version>
+    <version>1.0.4</version>
 
     <dependencies>
         <dependency>

+ 1 - 1
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/config/BeanConfig.java

@@ -24,7 +24,7 @@ public class BeanConfig {
         // 设置线程活跃时间(秒)
         executor.setKeepAliveSeconds(60);
         // 设置默认线程名称
-        executor.setThreadNamePrefix("worktime-");
+        executor.setThreadNamePrefix("workshop-");
         // 设置拒绝策略
         executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
         // 等待所有任务结束后再关闭线程池

+ 4 - 23
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/AuthRedirectController.java

@@ -144,9 +144,9 @@ public class AuthRedirectController {
             }
         }
         if (isMobile) {
-            redirecUrl = "https://mobworktime.ttkuaiban.com/#/" + router;
+            redirecUrl = "https://mobworkshop.ttkuaiban.com/#/" + router;
         } else {
-            redirecUrl = "https://worktime.ttkuaiban.com/#/" + router;
+            redirecUrl = "https://workshop.ttkuaiban.com/#/" + router;
         }
         ModelAndView modelAndView = new ModelAndView(
                 new RedirectView(redirecUrl), reqParam);
@@ -272,7 +272,7 @@ public class AuthRedirectController {
         String deviceType = UserAgentUtils.getDeviceType(userAgent);
         boolean isMobile = "MOBILE".equals(deviceType);
         WxCorpInfo corpInfo = wxCorpInfoMapper.selectById(corpId);
-        String url = WeiXinCorpController.GET_CORP_INSIDE_USERINFO_URL.replace("ACCESS_TOKEN",getCorpConcactAccessToken(corpInfo)).replace("CODE", code);
+        String url = WeiXinCorpController.GET_CORP_INSIDE_USERINFO_URL.replace("ACCESS_TOKEN", wxCorpInfoService.getCorpAgentAccessToken(corpInfo)).replace("CODE", code);
         String forObject = this.restTemplate.getForObject(url, String.class);
         JSONObject obj = JSONObject.parseObject(forObject);
         String wxUserId = obj.getString("userid");
@@ -281,7 +281,7 @@ public class AuthRedirectController {
 
         System.out.println("wxUserId="+wxUserId);
         System.out.println(obj.toString());
-        List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("corpwx_userid", wxUserId).eq("company_id", corpInfo.getCompanyId()));
+        List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("corpwx_real_userid", wxUserId).eq("company_id", corpInfo.getCompanyId()));
         Integer companyId = 0;
         if (userList.size() > 0) {
             //该用户已存在
@@ -444,23 +444,4 @@ public class AuthRedirectController {
         return WeiXinCorpController.SUITE_ACCESS_TOKEN;
     }
 
-
-    //获取企业通讯录的accessToken,在私有化部署的企业内部服务器上跑
-    private String getCorpConcactAccessToken(WxCorpInfo corpInfo) throws Exception {
-        String url = WeiXinCorpController.GET_CORP_TOKEN.replace("ID", corpInfo.getCorpid()).replace("SECRET", corpInfo.getContactSecret());
-        ResponseEntity<String> responseEntity = this.restTemplate.exchange(url,
-                HttpMethod.GET, null, String.class);
-        if (responseEntity.getStatusCode() == HttpStatus.OK) {
-            String resp = responseEntity.getBody();
-            JSONObject json = JSONObject.parseObject(resp);
-            if (json.getIntValue("errcode") == 0) {
-                String access_token = json.getString("access_token");
-                corpInfo.setAccessToken(access_token);
-            } else {
-                throw new Exception(json.toJSONString());
-            }
-        }
-        return corpInfo.getAccessToken();
-    }
-
 }

+ 0 - 8
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/CommonUploadController.java

@@ -1,6 +1,5 @@
 package com.management.platform.controller;
 
-import com.management.platform.task.SFTPAsyncUploader;
 import com.management.platform.util.HttpRespMsg;
 import org.apache.log4j.LogManager;
 import org.apache.log4j.Logger;
@@ -10,7 +9,6 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
-import javax.annotation.Resource;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.InputStream;
@@ -24,8 +22,6 @@ public class CommonUploadController {
     Logger logger = LogManager.getLogger(org.apache.logging.log4j.LogManager.ROOT_LOGGER_NAME);
     @Value(value = "${upload.path}")
     private String path;
-    @Autowired
-    public SFTPAsyncUploader sftpAsyncUploader;
 
     @RequestMapping(value="uploadFile")
     public HttpRespMsg uploadFile(MultipartFile multipartFile) {
@@ -55,10 +51,6 @@ public class CommonUploadController {
             inputStream.close();
             outputStream.close();
             msg.data = serverName;
-
-            // 上传到SFTP服务器
-            sftpAsyncUploader.uploadFileAsync(file);
-
         } catch (Exception exception) {
             exception.printStackTrace();
             logger.error(exception.getMessage());

+ 0 - 31
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/TaskFilesController.java

@@ -5,7 +5,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.*;
 import com.management.platform.mapper.*;
 import com.management.platform.service.ProjectDocumentService;
-import com.management.platform.task.SFTPAsyncUploader;
 import com.management.platform.util.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -21,12 +20,8 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.File;
 import java.io.IOException;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 import java.util.UUID;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
 
 /**
  * <p>
@@ -50,9 +45,6 @@ public class TaskFilesController {
     @Value("${upload.path}")
     private String uploadPath;
 
-    @Autowired
-    private SFTPAsyncUploader sftpAsyncUploader;
-
     /**
      * 获取该项目下的所有有效的文件列表
      * @param keyword
@@ -144,8 +136,6 @@ public class TaskFilesController {
                     try {
                         saveFile.createNewFile();
                         file.transferTo(saveFile);
-                        //异步上传到备份服务器
-                        sftpAsyncUploader.uploadFileAsync(saveFile);
                         //计算文件大小
                         long fileSize = saveFile.length();
                         String fileLength = FileUtil.getReadableFileSize(fileSize);
@@ -153,28 +143,7 @@ public class TaskFilesController {
                         record.setSize(fileLength);
                         String pathPrefix = "/upload/";
                         record.setUrl(pathPrefix + fileName);
-                        //上传图片到OSS
-//                        OSSClient ossClient=AliyunOSSClientUtil.getOSSClient();
-//                        String md5key = AliyunOSSClientUtil.uploadObject2OSS(ossClient, saveFile, OSSClientConstants.BUCKET_NAME, OSSClientConstants.FOLDER);
-//                        String url = AliyunOSSClientUtil.getFullUrl(fileName);
-//                        record.setUrl(url);
                         taskFilesMapper.insert(record);
-                        String path = uploadPath;
-//                        if (OpenOfficeService.canTransferToPdf(suffix)) {
-//                            //上传完,需要生成pdf
-//                            String dFile1 = path + UUID.randomUUID().toString().replaceAll("-", "") + ".pdf";
-//                            File newFile = new File(dFile1);
-//                            if (!newFile.exists()) {
-//                                openOfficeService.office2PDF(path + fileName, dFile1);
-//                                PdfFile pdfFile = new PdfFile();
-//                                pdfFile.setPdfUrl(pathPrefix + dFile1.substring(path.length()));
-//                                pdfFile.setFileId(record.getId());
-//                                pdfFile.setType(1);
-//                                pdfFile.setSourceFileUrl(record.getUrl());
-//                                pdfFileMapper.insert(pdfFile);
-//                            }
-//                        }
-
                         //生成原文件名称与服务器文件名称对应
                         msg.data = record;
                     } catch (IOException e) {

Plik diff jest za duży
+ 5 - 979
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/WeiXinCorpController.java


+ 8 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/WxCorpInfoService.java

@@ -71,4 +71,12 @@ public interface WxCorpInfoService extends IService<WxCorpInfo> {
     List<Map<String, String>> getActiveInfoByUser(HttpServletRequest request) throws Exception;
 
     HttpRespMsg batchTransferLicense(HttpServletRequest request,String handoverId, String takeoverId) throws Exception;
+
+    /**
+     * 获取企业微信内部应用的AccessToken
+     * @param corpInfo
+     * @return
+     * @throws Exception
+     */
+    public String getCorpAgentAccessToken(WxCorpInfo corpInfo) throws Exception;
 }

+ 0 - 39
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -1,70 +1,31 @@
 package com.management.platform.service.impl;
 
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.management.platform.controller.ReportController;
 import com.management.platform.entity.*;
 import com.management.platform.entity.vo.*;
 import com.management.platform.mapper.*;
 import com.management.platform.service.*;
-import com.management.platform.task.SFTPAsyncUploader;
 import com.management.platform.util.*;
-import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
-import me.chanjar.weixin.mp.api.WxMpService;
-import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
-import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
-import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
-import org.apache.commons.io.FileUtils;
-import org.apache.poi.EncryptedDocumentException;
-import org.apache.poi.hssf.usermodel.*;
-import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
-import org.apache.poi.ss.usermodel.*;
-import org.apache.velocity.runtime.directive.contrib.For;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.web.client.RestTemplateBuilder;
-import org.springframework.http.*;
-import org.springframework.http.client.ClientHttpResponse;
-import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.StringUtils;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.client.DefaultResponseErrorHandler;
 import org.springframework.web.client.RestTemplate;
-import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
-import javax.net.ssl.TrustManager;
-import javax.net.ssl.X509TrustManager;
 import javax.servlet.http.HttpServletRequest;
-import java.io.*;
 import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.security.cert.CertificateException;
-import java.security.cert.X509Certificate;
-import java.sql.Timestamp;
-import java.text.DateFormat;
 import java.text.DecimalFormat;
-import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.*;
 import java.time.format.DateTimeFormatter;
-import java.time.format.DateTimeParseException;
 import java.time.temporal.ChronoUnit;
-import java.time.temporal.TemporalAdjusters;
 import java.util.*;
-import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Executors;
 import java.util.stream.Collectors;
 
-import static org.springframework.boot.system.SystemProperties.get;
-
 /**
  * <p>
  * 服务实现类

+ 2 - 8
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -8,7 +8,6 @@ import com.management.platform.controller.WeiXinCorpController;
 import com.management.platform.entity.*;
 import com.management.platform.mapper.*;
 import com.management.platform.service.WxCorpInfoService;
-import com.management.platform.task.SFTPAsyncUploader;
 import com.management.platform.util.*;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
@@ -28,7 +27,6 @@ import javax.servlet.http.HttpServletRequest;
 import java.io.*;
 import java.math.BigDecimal;
 import java.net.URI;
-import java.text.SimpleDateFormat;
 import java.time.*;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
@@ -101,9 +99,6 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
     @Value(value = "${upload.path}")
     private String path;
 
-    @Autowired
-    private SFTPAsyncUploader sftpAsyncUploader;
-
     @Value(value = "${configEnv.isDev}")
     private boolean isDev;
 
@@ -252,7 +247,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
 //            if (isDev) return;
             log.info("发送企业微信消息===" + corpUserid);
             System.out.println("发送企业微信消息===" + corpUserid);
-            String accessToken = getAppConcactAccessToken(corpInfo);
+            String accessToken = getCorpAgentAccessToken(corpInfo);
             String url = URL_SEND_WXCORP_MSG.replaceAll("ACCESS_TOKEN", accessToken);
             HttpHeaders headers = new HttpHeaders();
             headers.setContentType(MediaType.APPLICATION_JSON);
@@ -414,7 +409,6 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
             FileOutputStream fileOutputStream = new FileOutputStream(file);
             fileOutputStream.write(body);
             fileOutputStream.close();
-            sftpAsyncUploader.uploadFileAsync(file);
             return file;
         } catch (Exception e) {
             e.printStackTrace();
@@ -518,7 +512,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
      * @return
      * @throws Exception
      */
-    private String getAppConcactAccessToken(WxCorpInfo corpInfo) throws Exception {
+    public String getCorpAgentAccessToken(WxCorpInfo corpInfo) throws Exception {
         String url = GET_CORP_TOKEN.replace("ID", corpInfo.getCorpid()).replace("SECRET", corpInfo.getAgentSecret());
         ResponseEntity<String> responseEntity = this.restTemplate.exchange(url,
                 HttpMethod.GET, null, String.class);

+ 0 - 32
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/task/SFTPAsyncUploader.java

@@ -1,32 +0,0 @@
-package com.management.platform.task;
-
-import com.management.platform.util.SFTPUploader;
-import org.springframework.scheduling.annotation.Async;
-import org.springframework.stereotype.Component;
-import java.io.File;
-import javax.annotation.PostConstruct;
-
-@Component
-public class SFTPAsyncUploader {
-
-    private final SFTPUploader sftpUploader;
-
-    public SFTPAsyncUploader(SFTPUploader sftpUploader) {
-        this.sftpUploader = sftpUploader;
-    }
-
-    @PostConstruct
-    public void init() {
-//        new File("uploads").mkdirs(); // 创建上传目录
-    }
-
-    @Async
-    public void uploadFileAsync(File file) {
-        try {
-            sftpUploader.uploadFile(file);
-            System.out.println("File " + file.getName() + " has been uploaded.");
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-}

Plik diff jest za duży
+ 240 - 1361
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/task/TimingTask.java


+ 0 - 63
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/util/SFTPUploader.java

@@ -1,63 +0,0 @@
-package com.management.platform.util;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import com.jcraft.jsch.ChannelSftp;
-import com.jcraft.jsch.JSch;
-import com.jcraft.jsch.Session;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-
-@Component
-public class SFTPUploader {
-    @Value("${sftp.isEnabled}")
-    private boolean isEnabled;
-    @Value("${sftp.server}")
-    private String server;
-
-    @Value("${sftp.port}")
-    private int port;
-    @Value("${sftp.remoteDir}")
-    private String remoteDir;
-
-    @Value("${sftp.user}")
-    private String user;
-
-    @Value("${sftp.password}")
-    private String password;
-
-    public void uploadFile(File file) throws Exception {
-        if (!isEnabled) {
-            System.out.println("sftp is not enabled, please set sftp.isEnabled=true in application.properties");
-            return;
-        }
-        JSch jsch = new JSch();
-        Session session = null;
-        ChannelSftp sftpChannel = null;
-        FileInputStream inputStream = null;
-        try {
-            session = jsch.getSession(user, server, port);
-            session.setPassword(password);
-            session.setConfig("StrictHostKeyChecking", "no");
-            session.connect();
-
-            sftpChannel = (ChannelSftp) session.openChannel("sftp");
-            sftpChannel.connect();
-
-            String remoteFilePath = (remoteDir.endsWith("/")?remoteDir: (remoteDir + "/")) + file.getName();
-            inputStream = new FileInputStream(file);
-
-            sftpChannel.put(inputStream, remoteFilePath);
-        } finally {
-            if (inputStream != null) {
-                inputStream.close();
-            }
-            if (sftpChannel != null) {
-                sftpChannel.disconnect();
-            }
-            if (session != null) {
-                session.disconnect();
-            }
-        }
-    }
-}

+ 4 - 4
fhKeeper/formulahousekeeper/management-workshop/src/main/resources/application-dev.yml

@@ -13,7 +13,7 @@ spring:
       max-request-size: 100MB
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://127.0.0.1:3306/man_dev?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&&useSSL=false
+    url: jdbc:mysql://127.0.0.1:3306/man_workshop?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&&useSSL=false
     username: root
     password: HuoshiDB@2022
     hikari:
@@ -54,7 +54,7 @@ logging:
     #打印sql语句
     com.management.platform.mapper: error
   path: /log/
-  file: worktime.log
+  file: workshop.log
 ##########
 mybatis-plus:
   #  mapper-locations: classpath:mapper/*/*.xml
@@ -80,7 +80,7 @@ mybatis:
   mapper-locations: mappers/*Mapper.xml
 #####配置图片上传路径####
 upload:
-  path: /www/staticproject/timesheet/upload/
+  path: /www/staticproject/leworkshop/upload/
 
 
 
@@ -102,4 +102,4 @@ management:
       enabled: false
 
 configEnv:
-  isDev: true
+  isDev: false

+ 6 - 6
fhKeeper/formulahousekeeper/management-workshop/src/main/resources/application-privatedev.yml

@@ -1,5 +1,5 @@
 server:
-  port: 10010
+  port: 10090
   tomcat:
     uri-encoding: utf-8
     max-http-form-post-size: -1
@@ -13,7 +13,7 @@ spring:
       max-request-size: 100MB
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://127.0.0.1:3306/man_private?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&&useSSL=false
+    url: jdbc:mysql://127.0.0.1:3306/man_workshop?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&&useSSL=false
     username: root
     password: HuoshiDB@2022
     hikari:
@@ -54,7 +54,7 @@ logging:
     #打印sql语句
     com.management.platform.mapper: error
   path: /log/
-  file: worktime.log
+  file: workshop.log
 ##########
 mybatis-plus:
   #  mapper-locations: classpath:mapper/*/*.xml
@@ -80,7 +80,7 @@ mybatis:
   mapper-locations: mappers/*Mapper.xml
 #####配置图片上传路径####
 upload:
-  path: /www/staticproject/timesheet/upload/
+  path: /www/staticproject/leworkshop/upload/
 
 
 ##actuator健康检查配置
@@ -88,7 +88,7 @@ management:
   security:
     enabled:false:
   server:
-    port: 10011
+    port: 10091
   #  endpoints:
   #    web:
   #      exposure:
@@ -99,6 +99,6 @@ management:
       enabled: false
 
 configEnv:
-  isDev: true
+  isDev: false
   # 是否是私有化部署,企业内部应用
   isPrivateDeploy: true

+ 1 - 1
fhKeeper/formulahousekeeper/management-workshop/src/main/resources/application-prod.yml

@@ -56,7 +56,7 @@ logging:
     #打印sql语句
     com.management.platform.mapper: error
   path: /log/
-  file: worktime.log
+  file: workshop.log
 ##########
 mybatis-plus:
   #  mapper-locations: classpath:mapper/*/*.xml

+ 4 - 17
fhKeeper/formulahousekeeper/management-workshop/src/main/resources/application.yml

@@ -139,11 +139,8 @@ referer:
     - localhost
     - ttkuaiban.com
     - www.ttkuaiban.com
-    - mobworktime.ttkuaiban.com
-    - worktime.ttkuaiban.com
-    - app71020.eapps.dingtalkcloud.com
-    - mldmobworktime.ttkuaiban.com
-    - mldworktime.ttkuaiban.com
+    - mobdevworkshop.ttkuaiban.com
+    - devworkshop.ttkuaiban.com
     - 47.101.180.183
 excludeUrls: /wxcorp/*,/wxcorp/*/*,/dingding/*,/feishu-info/*,/error,/testClient,/corpWXAuth,/corpWXScanningAuth,/corpInsideWXAuth,/wx-corp-info/*,/clean/*,/innerRoles/*,/report/getReportListByToken,/report/getProcessErrorData,/project/synchronizationProject,/user/updateUserDeptHierarchy
 
@@ -162,15 +159,5 @@ configEnv:
   isPrivateDeploy: true
 
 privateDeployURL:
-  pcUrl: http://dev.huoshishanxin.com/#/
-  mobUrl: http://dev.huoshishanxin.com/#/
-
-# SFTP上传配置
-sftp:
-  isEnabled: false
-  server: 101.132.166.205
-  port: 22022
-  remoteDir: /bkup/timesheet
-  user: root
-  password: Huoshi@2022
-
+  pcUrl: http://devworkshop.ttkuaiban.com
+  mobUrl: http://mobdevworkshop.ttkuaiban.com

+ 1 - 3
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/utils/request.js

@@ -12,9 +12,7 @@ const service = axios.create({
 // request拦截器,在请求之前做一些处理
 service.interceptors.request.use(
     config => {
-        if(config.url == "/report/record") {
-            config.headers["Content-Type"] = "multipart/form-data";
-        } else if(config.url != "/report/editReport" && config.url != "/project/editProject" && config.url != "/common/uploadFile" && config.url != "/project/editProject") {
+        if(config.url != "/common/uploadFile") {
             config.data = qs.stringify(config.data);
             config.headers["Content-Type"] = "application/x-www-form-urlencoded; charset=UTF-8";
         } else {

+ 3 - 3
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/groupView/groupView.vue

@@ -5,9 +5,9 @@
       <van-list  :finished="true" >
       <van-cell v-for="item in list" :key="item.id" :id="item.id" :title="item.name" @click="onClick">
         <template>
-          <div style="width:100%;text-align: left;" >
-            <span style="width:50%;color:#323232;">{{item.workType}}</span>
-            <span style="float:right;color:#323232;">{{ item.jobNumber }}</span>
+          <div style="width:100%;text-align: left;color:#323232;" >
+            <span >{{item.workType}}</span>
+            <span style="float:right;">{{ item.jobNumber }}</span>
           </div>
         </template>
       </van-cell>

+ 3 - 2
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/index/index.vue

@@ -200,7 +200,8 @@ export default {
                     name: '班组人员',
                     moudelName: '班组人员',
                     url: '/groupView',
-                    icon: 'balance-list-o'
+                    icon: 'balance-list-o',
+                    fixed: true
                 },
                 {
                     name: '报工',
@@ -210,7 +211,7 @@ export default {
                 },
             ]
             console.log(routersList, modelNameList)
-            this.routers = routersList.filter(item => modelNameList.includes(item.moudelName))
+            this.routers = routersList.filter(item => item.fixed || modelNameList.includes(item.moudelName))
         },
         // 获取企业微信参数
         agentConfig() {

+ 17 - 102
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/login/index.vue

@@ -84,96 +84,17 @@
                                 }
                             }).catch(err=> {this.$toast.clear();});
             },
-            bindIfNessary() {
-                let href = window.location.href;
-                var requestUrl = "";
-                if (this.isCorpWX) {//优先检查企业微信环境
-                    requestUrl = "/wxcorp/bindCorpWeiXin";
-                } else if (this.isWX) {
-                    requestUrl = "/wechat/bindWeiXin";
-                } 
-                
-                if (requestUrl.length > 0) {
-                    // localStorage.openId = 'o1L3L5lOrOl3_UEJjONaoT2Rne1I';
-                    //会自动跳转到首页
-                    // let href = 'http://hq.tangusoft.com/?code=011Ptjgc2rx1eI09Irgc2Rvsgc2PtjgF&state=1#/index';
-                    
-                    if (href.includes("com/?code")) {  //url包括 com/?code 证明为从微信跳转回来的
-                        var url = href; //vue自动在末尾加了 #/ 符号,截取去掉
-                        var jingPosit = url.indexOf("com/") + 4; //获取域名结束的位置
-
-                        // var urlLeft = url.substring(0, jingPosit);//url左侧部分
-                        var urlRight = url.substring(jingPosit, url.length); //url右侧部分
-                        console.log('urlRight=' + urlRight);
-                        urlRight = urlRight.substring(0, urlRight.indexOf('#/'));
-                        // window.location = urlLeft + "#/home" + urlRight;//拼接跳转
-                        alert(url);
-                        //获取code
-                        var code = urlRight.substring('?code='.length,urlRight.indexOf('&state='));
-                        var passUserId = urlRight.substring(urlRight.indexOf('&state=')+'&state='.length);
-                        if (passUserId == '0') {
-                            //自动登录的回调
-                            this.$axios.get('/wxcorp/corpWeiXinLogin', {params:{code:code}})
-                            .then(res => {
-                                if (res == null) {
-                                    
-                                } else if(res.errcode != null) {
-                                    //报错了
-                                    console.log(res.errmsg);
-                                } else {
-                                    //获取openId
-                                    if (res.data != null && ((this.isWX && res.data.wxOpenid != undefined)
-                                                || (this.isCorpWX && res.data.corpwxUserid != undefined))) {
-                                        localStorage.userInfo = JSON.stringify(res.data);
-                                        console.log('登录成功');
-                                        this.user = res.data;
-                                        window.location.href = '/#/index';
-                                    }
-                                }
-                            }).catch(err=> {
-                                alert('err=' + err);
-                            });
-                        } else {
-                            //绑定微信账号的回调
-                            //调用后台接口,注册用户
-                        this.$axios.get(requestUrl, {params:{code:code, userId: passUserId}})
-                            .then(res => {
-                                console.log(res);
-                                if (res == null) {
-                                    this.$toast.fail('绑定失败');
-                                } else if(res.errcode != null) {
-                                    //报错了
-                                    console.log(res.errmsg);
-                                } else {
-                                    //获取openId
-                                    if (res.data != null && ((this.isWX && res.data.wxOpenid != undefined)
-                                                || (this.isCorpWX && res.data.corpwxUserid != undefined))) {
-                                        // localStorage.userInfo = JSON.stringify(res.data);
-                                        localStorage.setItem('userInfo', JSON.stringify(res.data))
-                                        console.log('绑定成功');
-                                        this.user = res.data;
-                                        window.location.href = '/#/my/center';
-                                    }
-                                }
-                            }).catch(err=> {
-                                alert('err=' + err);
-                            });
-                        
-                        }
-                        
-                    } 
-                }
-            },
+            
             tryAutoLogin() {
-                var appId = "wx749c84daac654e1e";//车间生产管家公众号
-                var url = "http://mobworktime.ttkuaiban.com/api/wechat/loginByWXCode";//车间生产管家公众号授权回调页面
-                if (this.isCorpWX) {
-                    appId = "ww4e237fd6abb635af"; //企业微信第三方的SUIT ID
-                    url = "http://worktime.ttkuaiban.com/api/corpWXAuth";//授权回调页面
-                } 
+                // var appId = "wx749c84daac654e1e";//车间生产管家公众号
+                // var url = "http://mobworktime.ttkuaiban.com/api/wechat/loginByWXCode";//车间生产管家公众号授权回调页面
+                // if (this.isCorpWX) {
+                //     appId = "wwf11426cf618e1703"; //企业微信第三方的SUIT ID
+                //     url = "http://worktime.ttkuaiban.com/api/corpWXAuth";//授权回调页面
+                // } 
 
-                // var appId = "ww4e237fd6abb635af";//企业微信第三方的SUIT ID
-                // var url = "http://worktime.ttkuaiban.com/api/corpWXAuth";//授权回调页面
+                var appId = "wwf11426cf618e1703";//私有化部署的企业CORPID
+                var url = "http://devworkshop.ttkuaiban.com/api/corpInsideWXAuth";//授权回调页面
                 var weixinUrl="https://open.weixin.qq.com/connect/oauth2/authorize?appid="+appId+"&redirect_uri="+encodeURI(url)+"&response_type=code&scope=snsapi_base&state=0#wechat_redirect";
                 window.location.href = weixinUrl;
             },
@@ -272,22 +193,16 @@
                 } else {
                     console.log('判断企业微信是否授权',this.isCorpWX || this.isWX)
                     if (this.isCorpWX || this.isWX) {
-                        //判断企业微信,是否存在授权
-                        if (href.includes("com/?code")) {
-                            this.bindIfNessary();
-                        } else {
-                            if (href.indexOf('hasTriedAutoLogin') == -1) {
-                                this.tryAutoLogin();
-                            } else if (href.indexOf("userId") > 0) {
-                                //后台经过验证后,重定向过来带上了userId
-                                var loginUserId = href.substring(href.indexOf("userId=")+"userId=".length);
-                                if (loginUserId.includes('#/')) {
-                                    loginUserId = loginUserId.substring(0, loginUserId.indexOf('#/'));
-                                }
-                                this.loginByUserId(loginUserId);
+                        if (href.indexOf('hasTriedAutoLogin') == -1) {
+                            this.tryAutoLogin();
+                        } else if (href.indexOf("userId") > 0) {
+                            //后台经过验证后,重定向过来带上了userId
+                            var loginUserId = href.substring(href.indexOf("userId=")+"userId=".length);
+                            if (loginUserId.includes('#/')) {
+                                loginUserId = loginUserId.substring(0, loginUserId.indexOf('#/'));
                             }
+                            this.loginByUserId(loginUserId);
                         }
-                        
                     } else {
                         //检查环境,如果是钉钉有$CORPID$
                         if(href.indexOf("corpid") > 0) {

+ 6 - 13
fhKeeper/formulahousekeeper/timesheet-workshop/src/views/Home.vue

@@ -5,9 +5,9 @@
         <el-col :span="24" class="header">
             <div class="contentMask" v-if="vTourFlg"></div>
             <el-col :span="10" class="logo" :class="collapsed?'logo-collapse-width':'logo-width'" :style="collapsed?'padding:0':''">
-                <img v-if="collapsed" class="headImg" src="../assets/image/head_logo.png" />
+                <img v-if="collapsed" class="headImg" :src="appLogo" />
                 <div v-else class="logo-sys">
-                    <img class="headImg" src="../assets/image/head_logo.png" />
+                    <img class="headImg" :src="appLogo" />
                     <span>{{appName}}</span>
                 </div>
             </el-col>
@@ -22,17 +22,6 @@
             </el-col>
 
             <el-col :span="12" class="userinfo" style="display: flex;align-items: center;justify-content: flex-end;">
-                <!-- 中英文切换入口 -->
-                <!-- <el-dropdown trigger="click" @command="langChange" style="margin-right:30px;">
-                    <span class="el-dropdown-link userinfo-inner">
-                        {{language}} <i class="el-icon-caret-bottom"></i>
-                    </span>
-                    <el-dropdown-menu slot="dropdown">
-                        <el-dropdown-item divided  command="zh">中文</el-dropdown-item>
-                        <el-dropdown-item divided  command="en">English</el-dropdown-item>
-                    </el-dropdown-menu> 
-                </el-dropdown> -->
-
                 <el-dropdown trigger="hover" style="margin-right:30px;">
                     <span class="el-dropdown-link userinfo-inner">
                         <i class="el-icon-user" style="font-size:18px" ></i>
@@ -306,6 +295,7 @@
         inject:['reloads'],
         data() {
             return {
+                appLogo: '../assets/image/head_logo.png',
                 appName: localStorage.appName,
                 companyForm:{
                     name: '',
@@ -433,6 +423,9 @@
             this.firstTourFalse = localStorage.getItem('firstTourFalse') || true
             console.log(this.firstTourFalse, '数据书数据')
             console.log(localStorage.getItem('firstTourFalse'))
+            if (localStorage.appLogo) {
+                this.appLogo = '/upload/'+localStorage.appLogo;
+            }
         },
         methods: {
             getSkipGuidance() {

+ 3 - 63
fhKeeper/formulahousekeeper/timesheet-workshop/src/views/Login.vue

@@ -224,7 +224,6 @@
                     } else {
                         // 飞书登陆
                         if(href.indexOf("appId") > 0) {
-                            console.log('执行到这里---飞书')
                             let arr = href.split('appId=')[1]
                             let str = arr.split('#')[0]
                             console.log(str, window)
@@ -244,17 +243,6 @@
                     }
                 }
             }
-            
-            let urls = window.location.href
-            console.log(urls, '连接')
-            if(urls.indexOf('english=1') != '-1' && localStorage.getItem('lang') != 'en') {
-                this.setlangChange()
-                location.reload()
-            } 
-            if(urls.indexOf('english=1') == '-1' && localStorage.getItem('lang') != 'zh') {
-                localStorage.setItem("lang", 'zh')
-                location.reload()
-            }
         },
         methods: {
             getSettings() {
@@ -318,58 +306,10 @@
             isDingchg() {
                 this.$store.commit('isDingFun')
             },
-             bindIfNessary() {
-                let href = window.location.href;
-                
-                if (this.isCorpWX) {
-                    // localStorage.openId = 'o1L3L5lOrOl3_UEJjONaoT2Rne1I';
-                    //会自动跳转到首页
-                    // let href = 'http://hq.tangusoft.com/?code=011Ptjgc2rx1eI09Irgc2Rvsgc2PtjgF&state=1#/index';
-                    
-                    if (href.includes("com/?code")) {  //url包括 com/?code 证明为从微信跳转回来的
-                        var url = href; //vue自动在末尾加了 #/ 符号,截取去掉
-                        var jingPosit = url.indexOf("com/") + 4; //获取域名结束的位置
-
-                        // var urlLeft = url.substring(0, jingPosit);//url左侧部分
-                        var urlRight = url.substring(jingPosit, url.length); //url右侧部分
-                        console.log('urlRight=' + urlRight);
-                        urlRight = urlRight.substring(0, urlRight.indexOf('#/'));
-                        // window.location = urlLeft + "#/home" + urlRight;//拼接跳转
-                        //获取code
-                        var code = urlRight.substring('?code='.length,urlRight.indexOf('&state='));
-                        var passUserId = urlRight.substring(urlRight.indexOf('&state=')+'&state='.length);
-                        if (passUserId == '1') {
-                            //自动登录的回调
-                            this.$axios.get('/wxcorp/corpWeiXinLogin', {params:{code:code}})
-                            .then(res => {
-                                if (res == null) {
-                                    
-                                } else if(res.errcode != null) {
-                                    //报错了
-                                    console.log(res.errmsg);
-                                } else {
-                                    //获取openId
-                                    if (res.data != null && ((this.isWX && res.data.wxOpenid != undefined)
-                                                || (this.isCorpWX && res.data.corpwxUserid != undefined))) {
-                                        localStorage.userInfo = JSON.stringify(res.data);
-                                        console.log('登录成功');
-                                        this.user = res.data;
-                                        this.permissionsList(res.data)
-                                        window.location.href = '/#/index';
-                                    }
-                                }
-                            }).catch(err=> {
-                                alert('err=' + err);
-                            });
-                        } else {
-                        }
-                        
-                    } 
-                }
-            },
+            
             tryAutoLogin() {
-                var appId = "ww4e237fd6abb635af";//企业微信第三方的SUIT ID
-                var url = "https://devworkshop.ttkuaiban.com/api/corpWXAuth";//授权回调页面
+                var appId = "wwf11426cf618e1703";//私有化部署的企业CORPID
+                var url = "http://devworkshop.ttkuaiban.com/api/corpInsideWXAuth";//授权回调页面
                 var weixinUrl="https://open.weixin.qq.com/connect/oauth2/authorize?appid="+appId+"&redirect_uri="+encodeURI(url)+"&response_type=code&scope=snsapi_base&state=1#wechat_redirect";
                 window.location.href = weixinUrl;
             },

+ 3 - 2
fhKeeper/formulahousekeeper/timesheet-workshop/src/views/product/list.vue

@@ -2,9 +2,10 @@
     <section>
         <!--工具条-->
         <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
-
             <el-form :inline="true">
-                <h1>{{ titleName }}</h1>
+                <el-form-item >
+                    <span style="font-size:16px;color:#606266">{{ titleName }}</span>
+                </el-form-item>
                 <el-form-item label="产品名称">
                     <el-input v-model="name" placeholder="请输入" clearable="true" size="small">
                     </el-input>

+ 3 - 12
fhKeeper/formulahousekeeper/timesheet-workshop/src/views/settings/settings.vue

@@ -4,26 +4,17 @@
             <el-form :inline="true">
                 <el-form-item :label="$t('navigation.basicSystemSettings')"> 
                 </el-form-item>
-                <el-form-item  style="float:right">
+                <!-- <el-form-item  style="float:right">
                     <el-button  type="primary" @click="submitInsert" :loading="addLoading">{{ $t('save') }}</el-button>
-                </el-form-item>
+                </el-form-item> -->
             </el-form>
         </el-col>
-        <div >
+        <div>
             <el-form style="padding:35px;">
                 <el-form-item label="应用名称"  > 
                     <el-input v-model="appName" :maxlength="25" style="width:400px;"></el-input>
                 </el-form-item>
                 <el-form-item label="应用LOGO" >
-                    <!-- <el-upload
-                        list-type="picture-card"
-                        :http-request="(file) => {return addImg(file, index)}"
-                        :on-preview="(file) => {return handlePictureCardPreview(file, index)}"
-                        :before-remove="(file, fileList) => {return delImg(file, fileList, index)}"
-                        :file-list="domain.imgListUrl" :limit="9"
-                        :disabled="workForm.domains[index].state>=2?false:true">
-                        <i class="el-icon-plus"></i>
-                    </el-upload> -->
                     <el-upload
                         class="avatar-uploader"
                         :show-file-list="false"

+ 0 - 226
fhKeeper/formulahousekeeper/timesheet-workshop/src/views/system/index.vue

@@ -1,226 +0,0 @@
-<template>
-  <section>
-    <!--工具条-->
-    <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
-      <el-form :inline="true">
-        <el-form-item>
-          <el-date-picker
-            v-model="date"
-            :editable="false"
-            format="yyyy-MM-dd"
-            value-format="yyyy-MM-dd"
-            @change="getList"
-            :clearable="false"
-            type="date"
-            placeholder="选择日期"
-          ></el-date-picker>
-        </el-form-item>
-        <el-form-item style="float:right;">
-          <el-link type="primary" :underline="false" @click="handleAdd">异常申请</el-link>
-        </el-form-item>
-      </el-form>
-    </el-col>
-
-    <!--列表-->
-    <el-table
-      :data="list"
-      highlight-current-row
-      v-loading="listLoading"
-      :height="tableHeight"
-      style="width: 100%;"
-    >
-      <el-table-column type="index" width="60"></el-table-column>
-      <el-table-column prop="projectName" label="姓名" width="140" sortable></el-table-column>
-      <el-table-column prop="ownerCompanyName" label="手机" width="180"></el-table-column>
-      <el-table-column prop="customCompaniesStr" label="研发"></el-table-column>
-      <el-table-column prop="manager" label="设计" sortable></el-table-column>
-      <el-table-column prop="manager" label="办公" sortable></el-table-column>
-      <el-table-column prop="manager" label="娱乐" sortable></el-table-column>
-      <el-table-column prop="manager" label="浏览" sortable></el-table-column>
-      <el-table-column prop="indate" label="总时长" width="180" sortable></el-table-column>
-    </el-table>
-
-    <!--工具条-->
-    <el-col :span="24" class="toolbar">
-      <el-pagination
-        @size-change="handleSizeChange"
-        @current-change="handleCurrentChange"
-        :page-sizes="[20 , 50 , 80 , 100]"
-        :page-size="20"
-        layout="total, sizes, prev, pager, next"
-        :total="total"
-        style="float:right;"
-      ></el-pagination>
-    </el-col>
-
-    <!--新增界面-->
-    <el-dialog
-      title="异常申请列表"
-      v-if="addFormVisible"
-      :visible.sync="addFormVisible"
-      :close-on-click-modal="false"
-      customClass="customWidth"
-    >
-      <el-table
-        :data="list"
-        highlight-current-row
-        v-loading="listLoading"
-        height="400"
-        style="width: 100%;"
-      >
-        <el-table-column type="index" width="60"></el-table-column>
-        <el-table-column prop="projectName" label="姓名" width="140" sortable></el-table-column>
-        <el-table-column prop="indate" label="工作时长" width="100" sortable></el-table-column>
-        <el-table-column prop="indate" label="异常原因" width="180" sortable></el-table-column>
-        <el-table-column prop="indate" label="时间" sortable></el-table-column>
-      </el-table>
-      <div slot="footer" class="dialog-footer">
-        <el-button @click.native="addFormVisible = false">取消</el-button>
-      </div>
-    </el-dialog>
-  </section>
-</template>
-
-<script>
-import util from "../../common/js/util";
-
-export default {
-  data() {
-    return {
-      user: JSON.parse(sessionStorage.getItem("user")),
-
-      date: new Date(),
-
-      tableHeight: 0,
-      listLoading: false,
-      total: 0,
-      page: 1,
-      size: 20,
-      list: [],
-
-      addFormVisible: false,
-      addLoading: false
-    };
-  },
-  methods: {
-    //分页
-    handleCurrentChange(val) {
-      this.page = val;
-      this.getList();
-    },
-
-    handleSizeChange(val) {
-      this.size = val;
-      this.getList();
-    },
-
-    //获取项目列表
-    getList() {
-      this.listLoading = true;
-      this.http.post(
-        this.port.project.projectList,
-        {
-          keyName: "",
-          pageNum: this.page,
-          pageSize: this.size
-        },
-        res => {
-          this.listLoading = false;
-          if (res.code == "ok") {
-            var list = res.data.list;
-            for (var i in list) {
-              var customCompaniesStr = "";
-              for (var j in list[i].customCompanies) {
-                if (j == list[i].customCompanies.length - 1) {
-                  customCompaniesStr += list[i].customCompanies[j].companyName;
-                } else {
-                  customCompaniesStr +=
-                    list[i].customCompanies[j].companyName + "、";
-                }
-              }
-              list[i].customCompaniesStr = customCompaniesStr;
-            }
-            this.list = list;
-            this.total = res.data.total;
-          } else {
-            this.$message({
-              message: res.msg,
-              type: "error"
-            });
-          }
-        },
-        error => {
-          this.listLoading = false;
-          this.$message({
-            message: error,
-            type: "error"
-          });
-        }
-      );
-    },
-
-    //显示新增界面
-    handleAdd() {
-      this.getUnusual();
-      this.addFormVisible = true;
-    },
-
-    // 获取异常列表
-    getUnusual() {
-      this.listLoading = true;
-      this.http.post(
-        this.port.project.projectList,
-        {
-          keyName: "",
-          pageNum: this.page,
-          pageSize: this.size
-        },
-        res => {
-          this.listLoading = false;
-          if (res.code == "ok") {
-            var list = res.data.list;
-            for (var i in list) {
-              var customCompaniesStr = "";
-              for (var j in list[i].customCompanies) {
-                if (j == list[i].customCompanies.length - 1) {
-                  customCompaniesStr += list[i].customCompanies[j].companyName;
-                } else {
-                  customCompaniesStr +=
-                    list[i].customCompanies[j].companyName + "、";
-                }
-              }
-              list[i].customCompaniesStr = customCompaniesStr;
-            }
-            this.list = list;
-            this.total = res.data.total;
-          } else {
-            this.$message({
-              message: res.msg,
-              type: "error"
-            });
-          }
-        },
-        error => {
-          this.listLoading = false;
-          this.$message({
-            message: error,
-            type: "error"
-          });
-        }
-      );
-    }
-  },
-  created() {
-    let height = window.innerHeight;
-    this.tableHeight = height - 195;
-    const that = this;
-    window.onresize = function temp() {
-      that.tableHeight = window.innerHeight - 195;
-    };
-  },
-  mounted() {}
-};
-</script>
-
-<style lang="scss" scoped>
-</style>