Parcourir la source

企业微信通讯录导出转译

yurk il y a 2 ans
Parent
commit
a3c5ecb7d7

+ 6 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -1355,5 +1355,11 @@ public class ReportController {
     public HttpRespMsg getProcessErrorData() {
         return reportService.getProcessErrorData();
     }
+
+    //todo 获取成本数据 上传到 第三方
+    @RequestMapping("/getUploadThirdReportData")
+    public HttpRespMsg getUploadThirdReportData(String yearMonth){
+        return reportService.getUploadThirdReportData(yearMonth,request);
+    }
 }
 

+ 2 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java

@@ -73,6 +73,8 @@ public class WeiXinCorpController {
     private String suitId;
     @Value("${suitSecret}")
     private String suitSecret;
+    @Value("${providerSecret}")
+    private String providerSecret;
 
     //自己公司的企业微信通讯录secret
     private String concactSecret="irf7s8fy16wLhWGb8IxvGL2Nkm0sTB6dludpe_3VP6k";

+ 2 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportMapper.java

@@ -145,4 +145,6 @@ public interface ReportMapper extends BaseMapper<Report> {
             "AND NOT EXISTS(SELECT 1 FROM report r WHERE r.id <> report.id AND r.`creator_id` = report.`creator_id` AND r.`create_date` = report.`create_date` AND r.project_audit_state = 0)\n" +
             "AND EXISTS (SELECT 1 FROM report r WHERE r.id <> report.id AND r.`creator_id` = report.`creator_id` AND r.`create_date` = report.`create_date`)\n")
     List<Map<String, Object>> getProcessErrorData();
+
+    List<Map<String, Object>> getUploadThirdReportData(Integer companyId,@Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate);
 }

+ 2 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportService.java

@@ -92,4 +92,6 @@ public interface ReportService extends IService<Report> {
     HttpRespMsg getWeeklyWorkTime(String dateStr, HttpServletRequest request);
 
     HttpRespMsg getProcessErrorData();
+
+    HttpRespMsg getUploadThirdReportData(String yearMonth,HttpServletRequest request);
 }

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

@@ -6,6 +6,7 @@ import com.management.platform.entity.LeaveSheet;
 import com.management.platform.entity.WxCorpInfo;
 import com.management.platform.util.HttpRespMsg;
 
+import java.io.File;
 import java.time.LocalDateTime;
 import java.util.List;
 
@@ -32,4 +33,12 @@ public interface WxCorpInfoService extends IService<WxCorpInfo> {
     HttpRespMsg syncMembByCardTime(WxCorpInfo wxCorpInfo);
 
     public List<LeaveSheet> WxLeaveNumber(String startTime,String endTime,List<WxCorpInfo> wxCorpInfos) throws Exception;
+
+    public String getProviderAccessToken() throws Exception;
+
+    public String getTranslationMediaId(String fileName) throws Exception;
+
+    public String syncTranslation(String mediaId,String outPutFileName,String outputFileFormat) throws Exception;
+
+    public String getSyncTranslationResult(String jobId) throws Exception;
 }

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

@@ -4407,6 +4407,20 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         return msg;
     }
 
+    @Override
+    public HttpRespMsg getUploadThirdReportData(String yearMonth,HttpServletRequest request) {
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        String dateStr = yearMonth+"-01";
+        LocalDate startDate = LocalDate.parse(dateStr,df);
+        LocalDate endDate = LocalDate.parse(dateStr,df);
+        endDate=endDate.plusMonths(1);
+        List<Map<String,Object>> resultList=reportMapper.getUploadThirdReportData(companyId,startDate,endDate);
+        httpRespMsg.data=resultList;
+        return httpRespMsg;
+    }
+
     private void selfUpdateToNextWorkFlow(Integer companyId, User auditTargetUser, List<Integer> targetRids, List<Department> allDepts) {
         List<AuditWorkflowTimeSetting> settings = auditWorkflowTimeSettingMapper.selectList(
                 new QueryWrapper<AuditWorkflowTimeSetting>().eq("company_id", companyId)

+ 19 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java

@@ -1378,7 +1378,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         try {
             String userId = request.getHeader("Token");
             User user = userMapper.selectById(userId);
-
+            WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
             //准备导出
             HSSFWorkbook workbook = new HSSFWorkbook();
             //HSSFSheet sheet = workbook.createSheet("全部员工列表");
@@ -1497,8 +1497,22 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             workbook.write(fos);
             fos.flush();
             fos.close();
-            //返回生成的文件地址/upload文件夹下
-            httpRespMsg.data = "/upload/" + fileUrlSuffix;
+            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                String mediaId = wxCorpInfoService.getTranslationMediaId(fileUrlSuffix);
+                String jobId = wxCorpInfoService.syncTranslation(mediaId,fileUrlSuffix, "pdf");
+            /*if(jobId!=null&&!jobId.equals("")){
+                File file=new File(path + fileUrlSuffix);
+                if(file.exists()){
+                    file.delete();
+                }
+            }*/
+                Thread.sleep(1500);
+                String syncTranslationResult = wxCorpInfoService.getSyncTranslationResult(jobId);
+                //返回生成的文件地址/upload文件夹下
+                httpRespMsg.data = syncTranslationResult;
+            }else {
+                httpRespMsg.data = "/upload/" + fileUrlSuffix;
+            }
         } catch (NullPointerException e) {
             e.printStackTrace();
             //httpRespMsg.setError("验证失败或缺少数据");
@@ -1509,6 +1523,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             //httpRespMsg.setError("文件生成错误");
             httpRespMsg.setError(MessageUtils.message("file.generateError"));
             return httpRespMsg;
+        } catch (Exception e) {
+            e.printStackTrace();
         }
         return httpRespMsg;
     }

+ 125 - 6
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -1,9 +1,11 @@
 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.google.gson.JsonObject;
 import com.management.platform.controller.WeiXinCorpController;
 import com.management.platform.entity.*;
 import com.management.platform.mapper.SysConfigMapper;
@@ -13,23 +15,28 @@ import com.management.platform.mapper.WxCorpInfoMapper;
 import com.management.platform.service.WxCorpInfoService;
 import com.management.platform.util.*;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.http.client.utils.HttpClientUtils;
+import org.json.HTTP;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.io.FileSystemResource;
 import org.springframework.http.*;
 import org.springframework.stereotype.Service;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
 import org.springframework.web.client.RestTemplate;
+import org.springframework.web.util.UriComponentsBuilder;
+import sun.net.www.http.HttpClient;
 
 import javax.annotation.Resource;
-import java.io.File;
-import java.io.FileOutputStream;
+import java.io.*;
 import java.lang.reflect.Array;
+import java.net.URI;
 import java.text.SimpleDateFormat;
 import java.time.*;
 import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
+import java.util.*;
+import java.util.concurrent.Executors;
 import java.util.stream.Collectors;
 
 /**
@@ -55,6 +62,11 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
     @Value("${suitSecret}")
     private String suitSecret;
 
+    @Value("${corpId}")
+    private String corpId;
+    @Value("${providerSecret}")
+    private String providerSecret;
+
     @Value(value = "${upload.path}")
     private String path;
 
@@ -75,6 +87,113 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
     @Resource
     UserCorpwxTimeMapper userCorpwxTimeMapper;
 
+
+    //获取服务商provider_access_token
+    @Override
+    public String getProviderAccessToken() throws Exception {
+        String access_token="";
+        String url = "https://qyapi.weixin.qq.com/cgi-bin/service/get_provider_token";
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON);
+        JSONObject jsonObject=new JSONObject();
+        jsonObject.put("corpid",corpId);
+        jsonObject.put("provider_secret",providerSecret);
+        HttpEntity<String> requestEntity = new HttpEntity<String>(jsonObject.toJSONString(), headers);
+        ResponseEntity<String> responseEntity = this.restTemplate.exchange(url,
+                HttpMethod.POST, requestEntity, String.class);
+        if (responseEntity.getStatusCode() == HttpStatus.OK) {
+            String resp = responseEntity.getBody();
+            JSONObject json = JSONObject.parseObject(resp);
+            if(json.getIntValue("errcode")>0){
+                throw new Exception(json.toJSONString());
+            }
+            access_token= json.getString("provider_access_token");
+        }
+        return access_token;
+    }
+
+    //获取上传转移文件 获得的media_ia
+    @Override
+    public String getTranslationMediaId(String fileName) throws Exception {
+        String media_id="";
+        URI url = UriComponentsBuilder.fromHttpUrl("https://qyapi.weixin.qq.com/cgi-bin/service/media/upload")
+                .queryParam("provider_access_token", getProviderAccessToken())
+                .queryParam("type", "file")
+                .build().toUri();
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.MULTIPART_FORM_DATA);
+        //然后处理文件 通讯录id转译
+        FileSystemResource fileSystemResource = new FileSystemResource(path+fileName);
+        ContentDisposition build = ContentDisposition.builder("form-data").filename(fileSystemResource.getFilename()).build();
+        headers.setContentDisposition(build);
+        MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
+        params.add("media", fileSystemResource);
+        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<MultiValueMap<String, Object>>(params, headers);
+        MultiValueMap<String, Object> body = requestEntity.getBody();
+        ResponseEntity<String> responseEntity = this.restTemplate.exchange(url,
+                HttpMethod.POST, requestEntity, String.class);
+        if (responseEntity.getStatusCode() == HttpStatus.OK) {
+            String resp = responseEntity.getBody();
+            JSONObject json = JSONObject.parseObject(resp);
+            if(json.getIntValue("errcode")==0){
+                media_id= json.getString("media_id");
+            }else {
+                throw new Exception(json.toJSONString());
+            }
+        }
+        return media_id;
+    }
+
+    //异步通讯录id转译
+    @Override
+    public String syncTranslation(String mediaId,String outPutFileName,String outputFileFormat) throws Exception {
+        String url = "https://qyapi.weixin.qq.com/cgi-bin/service/contact/id_translate?provider_access_token=ACCESS_TOKEN".replaceAll("ACCESS_TOKEN",getProviderAccessToken());
+        HttpHeaders headers = new HttpHeaders();
+        List<String> list=new ArrayList<>();
+        list.add(mediaId);
+        String jobid="";
+        headers.setContentType(MediaType.APPLICATION_JSON);
+        JSONObject jsonObject=new JSONObject();
+        jsonObject.put("auth_corpid",corpId);
+        jsonObject.put("media_id_list",list);
+        jsonObject.put("output_file_name",outPutFileName);
+        jsonObject.put("output_file_format",outputFileFormat);
+        HttpEntity<String> requestEntity = new HttpEntity<String>(jsonObject.toJSONString(), headers);
+        ResponseEntity<String> responseEntity = this.restTemplate.exchange(url,
+                HttpMethod.POST, requestEntity, String.class);
+        if (responseEntity.getStatusCode() == HttpStatus.OK) {
+            String resp = responseEntity.getBody();
+            JSONObject json = JSONObject.parseObject(resp);
+            if(json.getIntValue("errcode")==0){
+                jobid= json.getString("jobid");
+            }else {
+                throw new Exception(json.toJSONString());
+            }
+        }
+        return jobid;
+    }
+
+    //获取异步任务结果
+    @Override
+    public String getSyncTranslationResult(String jobId) throws Exception {
+        String url = "https://qyapi.weixin.qq.com/cgi-bin/service/batch/getresult?provider_access_token=ACCESS_TOKEN&jobid=JOBID"
+                .replaceAll("ACCESS_TOKEN",getProviderAccessToken()).replaceAll("JOBID",jobId);
+        HttpHeaders headers = new HttpHeaders();
+        String resultUrl="";
+        HttpEntity<String> requestEntity = new HttpEntity<String>(null, headers);
+        ResponseEntity<String> responseEntity = this.restTemplate.exchange(url,
+                HttpMethod.GET, requestEntity, String.class);
+        String resp = responseEntity.getBody();
+        JSONObject json = JSONObject.parseObject(resp);
+        if(json.getIntValue("errcode")==0){
+            JSONObject result = (JSONObject) json.get("result");
+            JSONObject contact_id_translate = (JSONObject) result.get("contact_id_translate");
+            resultUrl = contact_id_translate.getString("url");
+        }else {
+            throw new Exception(json.toJSONString());
+        }
+        return resultUrl;
+    }
     @Override
     public void sendWXCorpMsg(WxCorpInfo corpInfo, String corpUserid, String msg) {
         try {

+ 18 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml

@@ -550,6 +550,24 @@
         </if>
         GROUP BY project_id, report.creator_id;
     </select>
+
+    <select id="getUploadThirdReportData" resultType="java.util.Map">
+        select IFNULL(p.project_code,'其他') as projectCode,IFNULL(tg.task_group_code,'其他')as taskGroupCode,DATE_FORMAT(r.create_date, '%Y') as ofyear,
+        DATE_FORMAT(r.create_date, '%m') as ofmonth,u.name as userName,u.job_number as jobNumber,d.department_name as departmentName,SUM(r.cost) as cost
+        from report r
+        left join project p  on p.id=r.project_id
+        left join task_group tg on tg.project_id=p.id and  r.group_id=tg.id
+        left join user u on u.id=r.creator_id
+        left join department d on d.department_id=u.department_id
+        where p.company_id=#{companyId}
+        <if test="startDate != null">
+            AND r.create_date &gt;= #{startDate}
+        </if>
+        <if test="endDate != null">
+            AND r.create_date &lt; #{endDate}
+        </if>
+        group by p.id,u.id,tg.id
+    </select>
     <select id="getReportFillStatus" resultType="java.util.Map">
         SELECT DATE_FORMAT(create_date,'%Y-%m-%d') as createDate, MAX(state) AS state FROM report
         WHERE create_date BETWEEN #{startDate} AND #{endDate} AND creator_id = #{userId} GROUP BY create_date

Fichier diff supprimé car celui-ci est trop grand
+ 29469 - 10200
fhKeeper/formulahousekeeper/management-platform/workTime.log