5 커밋 6f28a4b797 ... d588249eae

작성자 SHA1 메시지 날짜
  wzy d588249eae Merge branch 'master' of https://mc.cloudpure.cn/mjava/cont 2 주 전
  wzy dd8c1b3b88 思库 2 주 전
  wzy cebd77401b 博洋家纺钉盘文件添加发起人权限 2 주 전
  wzy 2972c8b6e6 更新看板operateData自动重试 2 주 전
  wzy ce27cbd1df 思库 1 개월 전

+ 30 - 0
mjava-boyang/src/main/java/com/malk/boyang/service/impl/BoyangServiceImpl.java

@@ -374,6 +374,10 @@ public class BoyangServiceImpl implements BoyangService {
                 downloadFile(signDownloadOuterUrl,downloadPath + signedFileName);
                 //签署后文件上传到钉盘
                 Map dentry = uploadDdFile(spaceId, parentDentryUuid, downloadPath + signedFileName, operatorUnionId);
+
+                //添加权限 OA发起人可下载
+                setPermissions(dentry, originatorUserId,"DOWNLOADER");
+
                 //审批单添加评论
                 comment(processInstanceId,originatorUserId,fileName + "已签署",Arrays.asList(dentry));
             }
@@ -405,6 +409,32 @@ public class BoyangServiceImpl implements BoyangService {
         }
     }
 
+    private void setPermissions(Map dentry, String userId,String roleId) {
+        String dentryUuid = dentry.get("uuid").toString();
+
+        //添加权限
+        Map<String,Object> param3 = new HashMap<>();
+        param3.put("unionId",operatorUnionId);
+
+        List<Map> dentryPermissionList = new ArrayList<>();
+        //OWNER: 拥有者   MANAGER: 管理者   EDITOR: 编辑者   DOWNLOADER: 查看下载者   READER: 仅可查看者
+        dentryPermissionList.add(new HashMap<String,Object>(){{
+            put("type","USER");
+            put("id",userId);//发起人userid
+        }});
+
+        Map body3 = new HashMap();
+        body3.put("roleId",roleId);
+        body3.put("members",dentryPermissionList);
+
+        DDR_New ddrNew3 = (DDR_New) UtilHttp.doPost("https://api.dingtalk.com/v2.0/storage/spaces/dentries/" + dentryUuid + "/permissions", ddClient.initTokenHeader(), param3, body3, DDR_New.class);
+        if (ddrNew3.isSuccess()){
+            log.info("权限设置成功!");
+        }else {
+            log.error("权限设置失败!" + ddrNew3.getCode() + " " + ddrNew3.getMessage());
+        }
+    }
+
     @Override
     public McR getOrganization(String name) {
         if (Strings.isBlank(name)){

+ 56 - 10
mjava-huagao/src/main/java/com/malk/huagao/service/impl/KdHuaGaoServiceImpl.java

@@ -13,6 +13,7 @@ import com.malk.huagao.service.KdHuaGaoService;
 import com.malk.server.aliwork.YDConf;
 import com.malk.server.aliwork.YDParam;
 import com.malk.server.aliwork.YDSearch;
+import com.malk.server.common.McException;
 import com.malk.server.common.McR;
 import com.malk.server.dingtalk.DDConf;
 import com.malk.server.dingtalk.DDR_New;
@@ -75,11 +76,16 @@ public class KdHuaGaoServiceImpl implements KdHuaGaoService {
             userId = "yida_pub_account";
         }
 
-        String formInstId = ydClient.operateData(YDParam.builder()
+        String formInstId = retryOperateData(YDParam.builder()
                 .formUuid("FORM-0BEA655A36724D509A2CF21C4BA38D367YF7")
                 .formDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mfmhvkey, selectField_mhsjnn2r, dateField_mhsjnn2s, employeeField_mhswy0xy", "成品库存天数看板", "更新中", System.currentTimeMillis(),Arrays.asList(userId))))
                 .build(), YDConf.FORM_OPERATION.create).toString();
 
+        /*String formInstId = ydClient.operateData(YDParam.builder()
+                .formUuid("FORM-0BEA655A36724D509A2CF21C4BA38D367YF7")
+                .formDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mfmhvkey, selectField_mhsjnn2r, dateField_mhsjnn2s, employeeField_mhswy0xy", "成品库存天数看板", "更新中", System.currentTimeMillis(),Arrays.asList(userId))))
+                .build(), YDConf.FORM_OPERATION.create).toString();*/
+
         // 获取当前日期
         LocalDate today = LocalDate.now();
 
@@ -117,12 +123,16 @@ public class KdHuaGaoServiceImpl implements KdHuaGaoService {
 
             for (List<String> formInstanceIdList : formInstanceIdListList) {
                 if (!formInstanceIdList.isEmpty()){
-                    ydClient.operateData(YDParam.builder()
+                    retryOperateData(YDParam.builder()
                             .formUuid("FORM-3B2E5C93D7E6494B9AD920B48A90159F7DZ4")
                             .formInstanceIdList(formInstanceIdList)
                             .build(), YDConf.FORM_OPERATION.delete_batch);
+                    /*ydClient.operateData(YDParam.builder()
+                            .formUuid("FORM-3B2E5C93D7E6494B9AD920B48A90159F7DZ4")
+                            .formInstanceIdList(formInstanceIdList)
+                            .build(), YDConf.FORM_OPERATION.delete_batch);*/
                 }
-                Thread.sleep(1000);
+//                Thread.sleep(1000);
             }
             log.info("删除序列号主档数据完成:{}年,{}月,{}周",year,month,weekOfMonth);
 
@@ -207,7 +217,7 @@ public class KdHuaGaoServiceImpl implements KdHuaGaoService {
 
                 formData.put("numberField_mfat6egj",1);//统计数值,默认1
 
-                ydClient.operateData(YDParam.builder()
+                retryOperateData(YDParam.builder()
                         .formUuid("FORM-3B2E5C93D7E6494B9AD920B48A90159F7DZ4")
                         .formDataJson(JSONObject.toJSONString(formData))
                         .build(), YDConf.FORM_OPERATION.create);
@@ -234,7 +244,7 @@ public class KdHuaGaoServiceImpl implements KdHuaGaoService {
             }
 
             if (!formInstanceIdList.isEmpty()){
-                ydClient.operateData(YDParam.builder()
+                retryOperateData(YDParam.builder()
                         .formUuid("FORM-4CB51E04B8344622BE880C9D573F68CANKWU")
                         .formInstanceIdList(formInstanceIdList)
                         .build(), YDConf.FORM_OPERATION.delete_batch);
@@ -252,7 +262,7 @@ public class KdHuaGaoServiceImpl implements KdHuaGaoService {
             }
 
             if (!formInstanceIdList2.isEmpty()){
-                ydClient.operateData(YDParam.builder()
+                retryOperateData(YDParam.builder()
                         .formUuid("FORM-5764CC3F6D964FD3A165BD7D4D75999FO8NQ")
                         .formInstanceIdList(formInstanceIdList2)
                         .build(), YDConf.FORM_OPERATION.delete_batch);
@@ -283,26 +293,26 @@ public class KdHuaGaoServiceImpl implements KdHuaGaoService {
                     }).collect(Collectors.toList());
 
             for (Map groupMap : grouprList) {
-                ydClient.operateData(YDParam.builder()
+                retryOperateData(YDParam.builder()
                         .formUuid("FORM-4CB51E04B8344622BE880C9D573F68CANKWU")
                         .formDataJson(JSONObject.toJSONString(groupMap))
                         .build(), YDConf.FORM_OPERATION.create);
 
-                ydClient.operateData(YDParam.builder()
+                retryOperateData(YDParam.builder()
                         .formUuid("FORM-5764CC3F6D964FD3A165BD7D4D75999FO8NQ")
                         .formDataJson(JSONObject.toJSONString(groupMap))
                         .build(), YDConf.FORM_OPERATION.create);
             }
 
             //更新看板更新记录
-            ydClient.operateData(YDParam.builder()
+            retryOperateData(YDParam.builder()
                     .formInstId(formInstId)
                     .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mhsjnn2r, dateField_mhsjnn2t", "已完成", System.currentTimeMillis())))
                     .build(), YDConf.FORM_OPERATION.update);
 
         }catch (Exception e){
             //更新看板更新记录
-            ydClient.operateData(YDParam.builder()
+            retryOperateData(YDParam.builder()
                     .formInstId(formInstId)
                     .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mhsjnn2r, dateField_mhsjnn2t, textareaField_mir0zmpo", "异常", System.currentTimeMillis(),e.getMessage())))
                     .build(), YDConf.FORM_OPERATION.update);
@@ -1212,4 +1222,40 @@ public class KdHuaGaoServiceImpl implements KdHuaGaoService {
 
         return epochMilli;
     }
+
+    //自带重试的operateData方法
+    private Object retryOperateData(YDParam param, YDConf.FORM_OPERATION formOperation) {
+        int maxAttempts = 3; // 尝试的最大次数
+        int attempt = 0;
+
+        Object result = null;
+
+        while (attempt < maxAttempts) {
+            try {
+                result = ydClient.operateData(param, formOperation);
+
+                return result;
+            } catch (McException e) {
+                if (e.getMessage().equals("The request has failed due to a temporary failure of the server.")) {
+                    attempt++;
+                    // 线程睡眠3秒
+                    try {
+                        Thread.sleep(3000);
+                        log.info("尝试第{}次,param:{},FORM_OPERATION:{},异常信息:{}", attempt, JSONObject.toJSONString(param), formOperation,e.getMessage());
+                    } catch (InterruptedException ie) {
+                        Thread.currentThread().interrupt(); // 重新设置中断状态
+                        System.err.println("Sleep interrupted: " + ie.getMessage());
+                    }
+                }
+            } catch (Exception e) {
+                log.error("操作失败,param:{},FORM_OPERATION:{},异常信息:{}", JSONObject.toJSONString(param), formOperation,e.getMessage());
+
+                throw new RuntimeException(e);
+            }
+
+        }
+
+        throw new RuntimeException("超出最大重试次数,param:"+JSONObject.toJSONString(param)+",FORM_OPERATION:{}"+formOperation);
+    }
+
 }

+ 24 - 0
mjava-siku/pom.xml

@@ -46,4 +46,28 @@
         </dependency>
     </dependencies>
 
+    <build>
+        <finalName>siku</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.1</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <executable>true</executable>
+                    <includeSystemScope>true</includeSystemScope>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
 </project>

+ 99 - 5
mjava-siku/src/main/java/com/malk/siku/controller/SikuController.java

@@ -1,23 +1,117 @@
 package com.malk.siku.controller;
 
+import com.alibaba.fastjson.JSONObject;
 import com.malk.server.common.McR;
 import com.malk.siku.service.SikuService;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.UrlResource;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
 
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.Map;
 
+@Slf4j
 @RestController
-@RequestMapping("/api")
+@RequestMapping()
 public class SikuController {
     @Autowired
     private SikuService sikuService;
 
+    @Value(value = "${mk.downloadFilePath}")
+    private String fileStoragePath;
+
+    //保存每刻往来单位
     @PostMapping("/saveTradingPartner")
     public McR saveTradingPartner(@RequestBody Map map) {
         return sikuService.saveTradingPartner(map);
     }
+
+    /**
+     * 保存云票客户
+     * @param map
+     * @return
+     */
+    /*@PostMapping("/saveYpClient")
+    public McR saveYpClient(@RequestBody Map map){
+        return sikuService.saveYpClient(map);
+    }*/
+
+    /**
+     * 开票申请单导入和更新
+     * @param map
+     * @return
+     */
+    @PostMapping("/saveYpApplication")
+    public McR saveYpApplication(@RequestBody Map map){
+        return sikuService.saveYpApplication(map);
+    }
+
+    //每刻云票回款回调
+    @PostMapping("/receive/callback")
+    public McR callback(@RequestBody Map map){
+        log.info("每刻云票回款回调:{}", JSONObject.toJSONString(map));
+
+        return McR.success();
+    }
+
+    //每刻云票开票回调
+    @PostMapping("/application/callback")
+    public McR callback2(@RequestBody Map map){
+        log.info("每刻云票开票回调:{}",JSONObject.toJSONString(map));
+
+        sikuService.invoiceWriteBack(map);
+
+        return McR.success();
+    }
+
+    @GetMapping("/files/{fileId}")
+    public ResponseEntity<Resource> getFileResource(
+            @PathVariable String fileId,
+            @RequestParam(defaultValue = "download") String option) throws IOException {
+
+        // 根据fileId获取实际文件路径,这里简化处理,实际可能需要从数据库查询
+        Path filePath = Paths.get(fileStoragePath).resolve(fileId).normalize();
+
+        // 检查文件是否存在
+        if (!Files.exists(filePath)) {
+            return ResponseEntity.notFound().build();
+        }
+
+        // 创建Resource对象
+        Resource resource =  new UrlResource(filePath.toUri());
+
+        // 根据选项设置响应头
+        HttpHeaders headers = new HttpHeaders();
+        if ("preview".equalsIgnoreCase(option)) {
+            // 预览模式 - 尝试确定内容类型
+            String contentType = Files.probeContentType(filePath);
+            // 强制修正 PDF 的 Content-Type
+            if (filePath.toString().toLowerCase().endsWith(".pdf")) {
+                contentType = "application/pdf";
+            } else if (contentType == null) {
+                contentType = "application/octet-stream";
+            }
+            headers.setContentType(MediaType.parseMediaType(contentType));
+            headers.add("Content-Disposition", "inline; filename=\"" + resource.getFilename() + "\"");
+            headers.add("X-Content-Type-Options", "nosniff"); // 防止浏览器忽略 Content-Type
+        } else {
+            // 下载模式 - 默认处理
+            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
+            headers.add("Content-Disposition", "attachment; filename=\"" + resource.getFilename() + "\"");
+        }
+
+        return ResponseEntity.ok()
+                .headers(headers)
+                .contentLength(resource.contentLength())
+                .body(resource);
+    }
 }

+ 3 - 0
mjava-siku/src/main/java/com/malk/siku/service/SikuService.java

@@ -7,4 +7,7 @@ import java.util.Map;
 public interface SikuService {
     McR saveTradingPartner(Map map);
 
+    McR saveYpApplication(Map map);
+
+    void invoiceWriteBack(Map map);
 }

+ 137 - 5
mjava-siku/src/main/java/com/malk/siku/service/impl/SikuServiceImpl.java

@@ -6,16 +6,20 @@ import com.malk.server.aliwork.YDParam;
 import com.malk.server.common.McR;
 import com.malk.service.aliwork.YDClient;
 import com.malk.siku.service.SikuService;
-import com.malk.siku.utils.MkUtil;
+import com.malk.siku.utils.MkBxUtil;
+import com.malk.siku.utils.MkYpUtil;
 import com.malk.utils.UtilHttp;
 import com.malk.utils.UtilMap;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.logging.log4j.util.Strings;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.*;
 
 @Slf4j
 @Service
@@ -66,10 +70,138 @@ public class SikuServiceImpl implements SikuService {
         Map body = new HashMap();
         body.put("partnerList", Arrays.asList(partner));
 
-        Map result = (Map) JSONObject.parse(UtilHttp.doPost("https://ng.maycur.com/api/openapi/tradingPartner/batch/save", MkUtil.initTokenHeader(), null, body));
+        Map result = (Map) JSONObject.parse(UtilHttp.doPost("https://ng.maycur.com/api/openapi/tradingPartner/batch/save", MkBxUtil.initTokenHeader(), null, body));
 
         log.info("Result:",result);
 
         return McR.success();
     }
+
+    @Override
+    public McR saveYpApplication(Map map) {
+        String formInstId = UtilMap.getString(map, "formInstId");
+
+        Map formData = ydClient.queryData(YDParam.builder()
+                .formInstanceId(formInstId)
+                .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+
+        Map application = new HashMap();
+        application.put("formSubTypeBizCode","KPSQD");//单据编码(云票系统内维护的)
+        application.put("bizCode", UtilMap.getString(formData,"serialNumberField_mknspz75"));//外部系统中的开票申请单业务编码。必须系统内唯一,用于判断开票申请单是否已导入。
+        Map clientLegalEntityOaDto = new HashMap();//客户开票信息对象
+        clientLegalEntityOaDto.put("invoiceTitle",UtilMap.getString(formData,"selectField_mkxmix7e"));//名称
+        clientLegalEntityOaDto.put("dutyParagraph",UtilMap.getString(formData,"textField_mm2wj87l"));//税号
+        clientLegalEntityOaDto.put("account",UtilMap.getString(formData,"textField_mm2wj87u"));//账号
+        clientLegalEntityOaDto.put("bankBranchName",UtilMap.getString(formData,"textField_mm2wj87t"));//银行
+        application.put("clientLegalEntityOaDto",clientLegalEntityOaDto);
+        application.put("legalEntityBizCode",UtilMap.getString(formData,"textField_mm2wj87x"));//公司主体code(后续传税号)
+        application.put("estimatedDate",System.currentTimeMillis());//预计开票时间
+        String fplx = UtilMap.getString(formData, "selectField_mkdnuvem");//发票类型
+        String estimatedInvoiceType = "";
+        switch (fplx){
+            case "应/免税普票":estimatedInvoiceType = "ELECTRONIC_VAT";break;//增值税普通发票(电子)
+            case "专票":estimatedInvoiceType = "ELECTRONIC_SPACIAL_VAT";break;//增值税电子专用发票
+            case "红冲":break;
+            case "形式发票":break;
+            case "收据":break;
+            default:break;
+        }
+        application.put("estimatedInvoiceType",estimatedInvoiceType);//发票类型
+
+        application.put("phoneNumber",UtilMap.getString(formData,"textField_mkdo0azf"));//收票人电话
+        application.put("email",UtilMap.getString(formData,"textField_mkdo0azn"));//收票邮箱
+        application.put("applicationComment",UtilMap.getString(formData,"textareaField_mkdo0aze"));//开票备注
+
+        Map item = new HashMap();
+        item.put("productBizCode","1001");//产品bizcode
+        item.put("invoiceName",UtilMap.getString(formData,"textField_mkgarw4d"));//开票名称
+        item.put("taxPercent",UtilMap.getDouble(formData,"numberField_mkgkboht"));//税率
+        item.put("quantity",1);//数量
+        item.put("forexName","CNY");//币种
+        item.put("exchangeRate",1);//外汇汇率
+        item.put("priceWithTax",UtilMap.getDouble(formData,"numberField_mkdo0azb"));//含税单价
+        item.put("taxClassShortCode",UtilMap.getString(formData,"textField_mm49zsli"));//税收分类编码
+
+        application.put("items",Arrays.asList(item));
+
+        Map result = MkYpUtil.application_oa(Arrays.asList(application));
+
+        return McR.success();
+    }
+
+    @Override
+    public void invoiceWriteBack(Map map) {
+        //获取发票信息
+        Map calloutParams = UtilMap.getMap(map, "calloutParams");
+        Map bizData = UtilMap.getMap(calloutParams, "bizData");
+
+        String bizCode = UtilMap.getString(bizData, "bizCode");//发票号码
+        String invoiceNumber = UtilMap.getString(bizData, "invoiceNumber");//发票号码
+        String pdfUrl = UtilMap.getString(bizData, "pdfUrl");//pdf文件下载地址
+        String downloadPageUrl = UtilMap.getString(bizData, "downloadPageUrl");//发票下载页面链接
+        List<Map> detailItems = (List<Map>) UtilMap.getList(bizData, "detailItems");
+        List<Map> documentCorrelates = UtilMap.getList(detailItems.get(0), "documentCorrelates");
+        String lsh = UtilMap.getString(documentCorrelates.get(0), "bizCode");//开票申请单编号
+
+        //回写宜搭
+        Map formData = new HashMap();
+        formData.put("radioField_mkxripcc","开票成功");
+        formData.put("textField_mkxripc6",invoiceNumber);
+        formData.put("textField_mm3aixk0",downloadPageUrl);
+
+        if (Strings.isNotBlank(pdfUrl)){
+            String fileName = invoiceNumber + ".pdf";
+            String downloadPath = "d:\\" + fileName;
+            downloadFile(pdfUrl,downloadPath);//下载pdf发票
+
+            String downloadUri = "http://localhost:8080/api/siku/files/"+fileName+"?option=download" + fileName;
+            String previewUri = "http://localhost:8080/api/siku/files/"+fileName+"?option=preview" + fileName;
+
+            Map attachmentField = new HashMap();
+            attachmentField.put("downloadUrl",downloadUri);
+            attachmentField.put("name",fileName);
+            attachmentField.put("previewUrl",previewUri);
+            attachmentField.put("url",downloadUri);
+            attachmentField.put("ext","pdf");
+            formData.put("attachmentField_mkxripc5",Arrays.asList(attachmentField));
+        }
+
+        ydClient.operateData(YDParam.builder()
+                .formInstanceId(bizCode)
+                .searchCondition(JSONObject.toJSONString(UtilMap.map("serialNumberField_mknspz75",lsh)))
+                .formUuid("FORM-A9A47B0365DB437F8F4C8E01B4468220K7GU")
+                .formDataJson(JSONObject.toJSONString(formData))
+                .build(), YDConf.FORM_OPERATION.upsert);
+    }
+
+    //文件下载到本地
+    private void downloadFile(String downloadUri,String downloadPath){
+        try {
+            URL url = new URL(downloadUri);
+
+            HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
+            int responseCode = httpConn.getResponseCode();
+
+            // 检查HTTP响应代码是否为200
+            if (responseCode == HttpURLConnection.HTTP_OK) {
+                InputStream inputStream = httpConn.getInputStream();
+                FileOutputStream outputStream = new FileOutputStream(downloadPath);
+
+                byte[] buffer = new byte[4096];
+                int bytesRead = -1;
+
+                while ((bytesRead = inputStream.read(buffer)) != -1) {
+                    outputStream.write(buffer, 0, bytesRead);
+                }
+
+                outputStream.close();
+                inputStream.close();
+            } else {
+                System.out.println("无法下载文件。HTTP响应代码: " + responseCode);
+            }
+            httpConn.disconnect();
+        }catch (Exception e){
+            throw new RuntimeException(e);
+        }
+    }
 }

+ 16 - 10
mjava-siku/src/main/java/com/malk/siku/utils/MkUtil.java

@@ -12,15 +12,21 @@ import org.springframework.beans.factory.annotation.Value;
 import java.util.HashMap;
 import java.util.Map;
 
+/**
+ * 每刻报销
+ */
 @Slf4j
-public class MkUtil {
+public class MkBxUtil {
 
-    @Value("${mk.appCode}")
+    @Value("${mk.bx.appCode}")
     private final static String appCode = "AP52Y01LHHTAP9";
 
-    @Value("${mk.appSecret}")
+    @Value("${mk.bx.appSecret}")
     private final static String appSecret = "N4WuERLteAUPaWebnsHy";
 
+//    private final static String host = "ng-uat.maycur.com";//测试环境
+    private final static String host = "ng.maycur.com";//生产环境
+
     private final Object $lock = new Object[0];
 
     private static final Long EXPIRES_IN = 1800000L;
@@ -29,8 +35,8 @@ public class MkUtil {
 
             Map header = new HashMap();
 
-            String tokenId = UtilToken.get("invalid-tokenId-mk");
-            String entCode = UtilToken.get("invalid-entCode-mk");
+            String tokenId = UtilToken.get("invalid-tokenId-mkbx");
+            String entCode = UtilToken.get("invalid-entCode-mkbx");
 
             if (StringUtils.isNotBlank(tokenId) && StringUtils.isNotBlank(entCode)) {
                 header.put("tokenId",tokenId);
@@ -46,18 +52,18 @@ public class MkUtil {
                 body.put("secret",getSecret(appCode,appSecret,timeMillis));
                 body.put("timestamp",timeMillis);
 
-                Map result = (Map) JSONObject.parse(UtilHttp.doPost("https://ng.maycur.com/api/openapi/auth/login", null, null, body));
+                Map result = (Map) JSONObject.parse(UtilHttp.doPost("https://" + host + "/api/openapi/auth/login", null, null, body));
 
                 Map data = UtilMap.getMap(result, "data");
 
                 tokenId = UtilMap.getString(data, "tokenId");
                 entCode = UtilMap.getString(data, "entCode");
 
-                log.info("每刻tokenId, {}", tokenId);
-                log.info("每刻entCode, {}", entCode);
+                log.info("每刻报销tokenId, {}", tokenId);
+                log.info("每刻报销entCode, {}", entCode);
 
-                UtilToken.put("invalid-tokenId-mk", tokenId, EXPIRES_IN);
-                UtilToken.put("invalid-entCode-mk", entCode, EXPIRES_IN);
+                UtilToken.put("invalid-tokenId-mkbx", tokenId, EXPIRES_IN);
+                UtilToken.put("invalid-entCode-mkbx", entCode, EXPIRES_IN);
 
                 header.put("tokenId",tokenId);
                 header.put("entCode",entCode);

+ 96 - 0
mjava-siku/src/main/java/com/malk/siku/utils/MkYpUtil.java

@@ -0,0 +1,96 @@
+package com.malk.siku.utils;
+
+import com.alibaba.fastjson.JSONObject;
+import com.malk.utils.UtilHttp;
+import com.malk.utils.UtilMap;
+import com.malk.utils.UtilToken;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 每刻云票
+ */
+@Slf4j
+public class MkYpUtil {
+
+    @Value("${mk.yp.appCode}")
+    private final static String appCode = "AP53EP1SVDS1N9";
+
+    @Value("${mk.yp.appSecret}")
+    private final static String appSecret = "qF4nm3nPnyXYcrWcr5jl";
+
+    private final static String host = "pms-uat.maycur.com";//测试环境
+//    private final static String host = "pms.maycur.com";//生产环境
+
+    private final Object $lock = new Object[0];
+
+    private static final Long EXPIRES_IN = 1800000L;
+
+    public static Map initTokenHeader(){
+
+            Map header = new HashMap();
+
+            String tokenId = UtilToken.get("invalid-tokenId-mkyp");
+            String entCode = UtilToken.get("invalid-entCode-mkyp");
+
+            if (StringUtils.isNotBlank(tokenId) && StringUtils.isNotBlank(entCode)) {
+                header.put("tokenId",tokenId);
+                header.put("entCode",entCode);
+
+                return header;
+            } else {
+                //每刻云票登录认证
+                Map body = new HashMap();
+
+                long timeMillis = System.currentTimeMillis();
+                body.put("appCode",appCode);
+                body.put("secret",getSecret(appCode,appSecret,timeMillis));
+                body.put("timestamp",timeMillis);
+
+                Map result = (Map) JSONObject.parse(UtilHttp.doPost("https://" + host + "/api/common/openapi/auth/login", null, null, body));
+
+                Map data = UtilMap.getMap(result, "data");
+
+                tokenId = UtilMap.getString(data, "tokenId");
+                entCode = UtilMap.getString(data, "entCode");
+
+                log.info("每刻云票tokenId, {}", tokenId);
+                log.info("每刻云票entCode, {}", entCode);
+
+                UtilToken.put("invalid-tokenId-mkyp", tokenId, EXPIRES_IN);
+                UtilToken.put("invalid-entCode-mkyp", entCode, EXPIRES_IN);
+
+                header.put("tokenId",tokenId);
+                header.put("entCode",entCode);
+
+                return header;
+            }
+
+    }
+
+
+    public static Map application_oa(Object body){
+        Map result = (Map) JSONObject.parse(UtilHttp.doPost("https://" + host + "/api/ar/openapi/application_oa/batch", MkYpUtil.initTokenHeader(), null, body,(Map) null));
+//        Map result = (Map) JSONObject.parse(UtilHttp.doRequest(UtilHttp.METHOD.POST, "https://" + host + "/api/ar/openapi/application_oa/batch", MkYpUtil.initTokenHeader(), null, body));
+
+        log.info("Result:{}",result);
+
+        return result;
+    }
+
+    private static String getSecret(String appCode, String appSecret, long timeMillis){
+        log.info("time:{}",timeMillis);
+
+        String s = DigestUtils.sha256Hex(appSecret + ":" + appCode + ":" + timeMillis);
+        log.info("s:{}",s);
+
+        return s;
+    }
+
+
+}

+ 10 - 3
mjava-siku/src/main/resources/application-dev.yml

@@ -1,7 +1,7 @@
 server:
   port: 9037
   servlet:
-    context-path: /siku
+    context-path: /api/siku
 
 enable:
   scheduling: false
@@ -26,6 +26,13 @@ aliwork:
   systemToken: Y2D66JB1A0B2OMK6OMB29AB8VMP43KJ7UCDKMG46
 
 mk:
-  appCode: AP52Y01LHHTAP9
-  appSecret: N4WuERLteAUPaWebnsHy
+  #每刻报销-生产环境
+  bx:
+    appCode: AP52Y01LHHTAP9
+    appSecret: N4WuERLteAUPaWebnsHy
+  #每刻云票-测试环境
+  yp:
+    appCode: AP53EP1SVDS1N9
+    appSecret: qF4nm3nPnyXYcrWcr5jl
+  downloadFilePath: d:\\
 

+ 9 - 3
mjava-siku/src/main/resources/application-prod.yml

@@ -1,7 +1,7 @@
 server:
   port: 9037
   servlet:
-    context-path: /siku
+    context-path: /api/siku
 
 enable:
   scheduling: false
@@ -26,6 +26,12 @@ aliwork:
   systemToken: Y2D66JB1A0B2OMK6OMB29AB8VMP43KJ7UCDKMG46
 
 mk:
-  appCode: AP52Y01LHHTAP9
-  appSecret: N4WuERLteAUPaWebnsHy
+  #每刻报销-生产环境
+  bx:
+    appCode: AP52Y01LHHTAP9
+    appSecret: N4WuERLteAUPaWebnsHy
+  #每刻云票-测试环境
+  yp:
+    appCode: AP53EP1SVDS1N9
+    appSecret: qF4nm3nPnyXYcrWcr5jl
 

+ 13 - 2
mjava-siku/src/test/java/com.malk.siku/SkTest.java

@@ -13,8 +13,15 @@ import org.springframework.test.context.junit4.SpringRunner;
 public class SkTest {
     @Test
     public void getSecret(){
-        String appCode="AP52Y01LHHTAP9";
-        String appSecret="N4WuERLteAUPaWebnsHy";
+        //每刻报销-生产环境
+        /*String appCode="AP52Y01LHHTAP9";
+        String appSecret="N4WuERLteAUPaWebnsHy";*/
+
+
+
+        //每刻云票-测试环境
+        String appCode="AP53EP1SVDS1N9";
+        String appSecret="qF4nm3nPnyXYcrWcr5jl";
 
         long timeMillis = System.currentTimeMillis();
         log.info("time:{}",timeMillis);
@@ -22,4 +29,8 @@ public class SkTest {
         String s = DigestUtils.sha256Hex(appSecret + ":" + appCode + ":" + timeMillis);
         log.info("s:{}",s);
     }
+
+
+
+
 }