Browse Source

帕科五期,定时任务调用阿里商旅api接口

fyz 3 months ago
parent
commit
ac041eedc2

+ 11 - 0
mjava-pake/pom.xml

@@ -8,6 +8,7 @@
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-parent</artifactId>
         <version>2.2.0.RELEASE</version> <!-- 使用最新的稳定版或其他适用版本 -->
+        <relativePath/>
     </parent>
 
     <groupId>com.malk</groupId>
@@ -19,6 +20,16 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.5.13</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpmime</artifactId>
+            <version>4.5.13</version>
+        </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-test</artifactId>

+ 14 - 6
mjava-pake/src/main/java/com/malk/pake/controller/PkProjectController.java

@@ -28,14 +28,22 @@ public class PkProjectController {
      * 推送审批
      */
     @PostMapping("/oaUpdateProject")
-    public McR doApprove(String processInstanceId) {
+    public McR doApprove(String processInstanceId, String type) {
 
-//        log.info("推送审批, {} {}", type, processInstanceId);
+        log.info("推送审批, {} {}", type, processInstanceId);
         // OA组件name, 匹配宜搭组件ID
-        Map<String, String> compsId_main = UtilMap.map("费用报销类型, 付款公司, 费用出处, 项目编号, 项目名称, 商机编号, 商机名称", "selectField_m7wq5adn, selectField_m7wq5ado, selectField_m7wq5adp, textField_m7wq5adu, textField_m7wq5adx, textField_m7wq5ae0, textField_m7wq5ae2");
-        Map<String, String> compsId_itinerary = UtilMap.map("报销类目, 报销内容, 报销金额(元)", "selectField_m7wq5ae7, textareaField_m7wq5ae9, numberField_m7wq5aeb");
-        compsId_main.put("报销明细", "tableField_m7wq5ae5"); // 子表组件
-        pkProjectService.oaUpdateProject(processInstanceId, "FORM-E7D787CEA025411B9ED6CF46E0AB0C3DNXU3", compsId_main, compsId_itinerary, "报销明细");
+        if ("差旅费报销".equals(type)){
+            Map<String, String> compsId_main = UtilMap.map("费用报销类型, 付款公司, 费用出处, 项目编号, 项目名称, 商机编号, 商机名称", "selectField_m7wq5adn, selectField_m7wq5ado, selectField_m7wq5adp, textField_m7wq5adu, textField_m7wq5adx, textField_m7wq5ae0, textField_m7wq5ae2");
+            Map<String, String> compsId_itinerary = UtilMap.map("出发时间, 返回时间, 原驻地, 出差目的地, 交通工具, 车船费, 途中补贴, 住勤费, 合计金额(元)",
+                    "dateField_m9994caw, dateField_m9994cay, textField_m9994cb2, textField_m9994cb4, textField_m9994cb6, numberField_m9994cba, numberField_m9994cbc, numberField_m9994cbe, numberField_m9994cbg");
+            compsId_main.put("行程明细", "tableField_m9994cau"); // 子表组件
+            pkProjectService.oaUpdateProject(processInstanceId, "FORM-E7D787CEA025411B9ED6CF46E0AB0C3DNXU3", compsId_main, compsId_itinerary, "行程明细");
+        }else {
+            Map<String, String> compsId_main = UtilMap.map("费用报销类型, 付款公司, 费用出处, 项目编号, 项目名称, 商机编号, 商机名称", "selectField_m7wq5adn, selectField_m7wq5ado, selectField_m7wq5adp, textField_m7wq5adu, textField_m7wq5adx, textField_m7wq5ae0, textField_m7wq5ae2");
+            Map<String, String> compsId_itinerary = UtilMap.map("报销类目, 报销内容, 报销金额(元)", "selectField_m7wq5ae7, textareaField_m7wq5ae9, numberField_m7wq5aeb");
+            compsId_main.put("报销明细", "tableField_m7wq5ae5"); // 子表组件
+            pkProjectService.oaUpdateProject(processInstanceId, "FORM-E7D787CEA025411B9ED6CF46E0AB0C3DNXU3", compsId_main, compsId_itinerary, "报销明细");
+        }
         return McR.success();
     }
 

+ 39 - 0
mjava-pake/src/main/java/com/malk/pake/schedule/ScheduleTask.java

@@ -1,7 +1,9 @@
 package com.malk.pake.schedule;
 
+import cn.hutool.core.date.LocalDateTimeUtil;
 import cn.hutool.http.HttpUtil;
 import com.malk.pake.service.PkMaintenanceWarningService;
+import com.malk.pake.service.PkProjectService;
 import com.malk.pake.service.PkWorkingHoursService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -26,6 +28,8 @@ public class ScheduleTask {
     private PkWorkingHoursService pkWorkingHoursService;
     @Autowired
     private PkMaintenanceWarningService pkMaintenanceWarningService;
+    @Autowired
+    private PkProjectService pkProjectService;
 
     /**
      * 工时填写提醒-按月
@@ -88,4 +92,39 @@ public class ScheduleTask {
             e.printStackTrace();
         }
     }
+    /**
+     * 阿里商旅火车票
+     * 每天00:00获取阿里商旅昨日火车票数据
+     */
+    @Scheduled(cron = "0 10 0 * * ?")
+    public void getTrainInternal() {
+        log.info("阿里商旅火车票");
+        LocalDate now = LocalDate.now();
+        String formatToday = LocalDateTimeUtil.format(now, "yyyy-MM-dd");
+        LocalDate yesterday = now.plusDays(-1);
+        String formatYesterday = LocalDateTimeUtil.format(yesterday, "yyyy-MM-dd");
+        try {
+            pkProjectService.getTrainInternal(formatYesterday,formatToday);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 阿里商旅机票
+     * 每天00:30获取阿里商旅机票昨日数据
+     */
+    @Scheduled(cron = "0 30 0 * * ?")
+    public void getAirInternal() {
+        log.info("阿里商旅机票");
+        LocalDate now = LocalDate.now();
+        String formatToday = LocalDateTimeUtil.format(now, "yyyy-MM-dd");
+        LocalDate yesterday = now.plusDays(-1);
+        String formatYesterday = LocalDateTimeUtil.format(yesterday, "yyyy-MM-dd");
+        try {
+            pkProjectService.getAirInternal(formatYesterday,formatToday);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
 }

+ 5 - 0
mjava-pake/src/main/java/com/malk/pake/service/PkProjectService.java

@@ -6,5 +6,10 @@ public interface PkProjectService {
 
     void saleUpdateProject(String formInstId);
 
+    //OA通用报销审批通过后更新写入宜搭
     void oaUpdateProject(String processInstanceId, String formUuid, Map<String, String> compsId_main, Map<String, String> compsId_itinerary, String compId_sub_oa);
+    //获取日期范围内阿里商旅火车票数据
+    void getTrainInternal(String startDate, String endDate);
+    //获取日期范围内阿里商旅机票数据
+    void getAirInternal(String startDate, String endDate);
 }

+ 346 - 33
mjava-pake/src/main/java/com/malk/pake/service/impl/PkProjectServiceImpl.java

@@ -1,8 +1,11 @@
 package com.malk.pake.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.malk.pake.service.PkProjectService;
+import com.malk.pake.utils.HttpUtils;
 import com.malk.server.aliwork.YDConf;
 import com.malk.server.aliwork.YDParam;
 import com.malk.service.aliwork.YDClient;
@@ -17,6 +20,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.*;
 
 @Service
@@ -34,6 +39,8 @@ public class PkProjectServiceImpl implements PkProjectService {
 
     private String projectFormUUID = "FORM-7F8921D7324F43B3B1147C1D99A3F758NFIL";
     private String saleFormUUID = "FORM-4V966N81BW8D84BFBI41WACUKFRZ1XBFPVELLJ";
+    private String trainUUID = "FORM-78E05305A9BB4BBBABF5E34F781530D1RP78";
+    private String airUUID = "FORM-53E3974D2A074B00AA6C66DE278F7938ZNNT";
 
     /// dingtalk
     @Value("${dingtalk.appKey}")
@@ -45,6 +52,45 @@ public class PkProjectServiceImpl implements PkProjectService {
     private String APP_TYPE;
     @Value("${aliwork.systemToken}")
     private String SYSTRM_TOKEN;
+    /// 阿里商旅
+    @Value("${alibusinesstravel.appKey}")
+    private String BUS_kEY;
+    @Value("${alibusinesstravel.appSecret}")
+    private String BUS_SECRET;
+    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    private static final Map<String,String> AIR_FEE_TYPE  = new HashMap<>();
+    static {
+        AIR_FEE_TYPE.put("10101","机票预订");
+        AIR_FEE_TYPE.put("10202","机票改签手续费");
+        AIR_FEE_TYPE.put("10203","机票改签差价");
+        AIR_FEE_TYPE.put("10301","机票退款");
+        AIR_FEE_TYPE.put("10302","机票改签退款");
+        AIR_FEE_TYPE.put("10303","机票补退");
+        AIR_FEE_TYPE.put("10401","机票保险-航意险购买");
+        AIR_FEE_TYPE.put("10501","机票保险-航意险退保");
+        AIR_FEE_TYPE.put("11001","机票预订服务费");
+        AIR_FEE_TYPE.put("11002","机票改签服务费");
+        AIR_FEE_TYPE.put("10304","机票票据服务费退款");
+        AIR_FEE_TYPE.put("11003","机票票据服务费");
+        AIR_FEE_TYPE.put("11004","机票托管协议服务费");
+        AIR_FEE_TYPE.put("11005","机票改签托管协议服务费");
+    }
+    private static final Map<String,String> TRAIN_FEE_TYPE = new HashMap<>();
+    static {
+       TRAIN_FEE_TYPE.put("6001","火车票预订");
+       TRAIN_FEE_TYPE.put("6003","火车票改签差价");
+       TRAIN_FEE_TYPE.put("6004","火车票改签手续费");
+       TRAIN_FEE_TYPE.put("6005","火车票退票");
+       TRAIN_FEE_TYPE.put("6007","火车票预订服务费");
+       TRAIN_FEE_TYPE.put("6008","火车票改签服务费");
+       TRAIN_FEE_TYPE.put("6009","火车票预订退款");
+       TRAIN_FEE_TYPE.put("6010","火车票改签退款");
+       TRAIN_FEE_TYPE.put("6101","火车票抢票加速包");
+       TRAIN_FEE_TYPE.put("6011","火车票票据服务费");
+       TRAIN_FEE_TYPE.put("6012","火车票技术服务费");
+       TRAIN_FEE_TYPE.put("6013","火车票票据服务费退款");
+       TRAIN_FEE_TYPE.put("6014","火车票线下退改退款");
+    }
     @Override
     public void saleUpdateProject(String formInstId) {
 //        log.info("流程id:{}",formInstId);
@@ -75,37 +121,23 @@ public class PkProjectServiceImpl implements PkProjectService {
     @Override
     public void oaUpdateProject(String processInstanceId, String formUuid, Map<String, String> compsId_main, Map<String, String> compsId_itinerary, String compId_sub_oa) {
 
-        System.out.println(processInstanceId);
         String token = ddClient.getAccessToken(APP_EKY, APP_SECRET);
-
+//        log.info("processInstanceId:{}",processInstanceId);
         Map processData = ddClient_workflow.getProcessInstanceId(token, processInstanceId);
         List<Map> formComponentValues = (List<Map>) processData.get("formComponentValues");
-        System.out.println(formComponentValues.toString());
         String userId = String.valueOf(processData.get("originatorUserId"));
         long cDate = UtilDateTime.parse(UtilMap.getString(processData, "createTime"), "yyyy-MM-dd'T'HH:mm").getTime();
         Map formData = UtilMap.map("employeeField_ltxqs53k, departmentSelectField_lu20ayky, dateField_ltxqs53j, textField_lygnetw9", Arrays.asList(userId), Arrays.asList(processData.get("originatorDeptId")), cDate, UtilMap.getString(processData, "businessId"));
         Optional optional = formComponentValues.stream().filter(item -> "费用出处".equals(item.get("name"))).findAny();
         if (optional.isPresent() && (UtilMap.getString((Map) optional.get(), "value").equals("项目费用") || UtilMap.getString((Map) optional.get(), "value").equals("研发费用"))){
-            Double sum = 0.0;
+            Double OATravelSum = 0.0;//OA差旅费用
+            Double OATrafficSum = 0.0;//OA交通费用
+            Double OAEntertainSum = 0.0;//OA招待费用
+            Double OAOtherSum = 0.0;//OA其他费用
             optional = formComponentValues.stream().filter(item -> "项目编号".equals(item.get("name"))).findAny();
             String projectCode = UtilMap.getString((Map) optional.get(), "value");
             optional = formComponentValues.stream().filter(item -> "费用报销类型".equals(item.get("name"))).findAny();
             String type = UtilMap.getString((Map) optional.get(), "value");
-            String filed = "";
-            switch (type){
-                case "日常费用报销":
-                    filed = "numberField_m7473opo";
-                    break;
-                case "差旅费报销":
-                    filed = "numberField_m7473oph";
-                    break;
-                case "业务招待费报销":
-                    filed = "numberField_m7473opn";
-                    break;
-                case "交通费":
-                    filed = "numberField_m7473opi";
-                    break;
-            }
             for (String name : compsId_main.keySet()) {
                 String compId = compsId_main.get(name);
                 // 判定是否子表 [宜搭]
@@ -122,16 +154,57 @@ public class PkProjectServiceImpl implements PkProjectService {
                     for (Map itinerary : itineraryList) {
                         List<Map> rowValue = (List<Map>) itinerary.get("rowValue");
                         Map rowData = new HashedMap();
-                        // 循环子表组件
+                        // 循环子表组件插入宜搭表单
                         for (String subName : compsId_itinerary.keySet()) {
-                            Object value = rowValue.stream().filter(item -> subName.equals(item.get("bizAlias")) || subName.equals(item.get("label"))).findAny().get().get("value");
-                            if ("报销金额(元)".equals(subName)){
-                                sum = sum + Double.parseDouble(value.toString());
+                            if ("出发时间".equals(subName) || "返回时间".equals(subName)) {
+                                rowValue.forEach(r->{
+                                    Object label = r.get("label");
+                                    if (label instanceof  JSONArray){
+                                        Object value = r.get("value");
+                                        JSONArray jsonArray = JSONArray.parseArray(value.toString());
+                                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+                                        try {
+                                            rowData.put(compsId_itinerary.get("出发时间"), sdf.parse(jsonArray.get(0).toString()).getTime());
+                                            rowData.put(compsId_itinerary.get("返回时间"), sdf.parse(jsonArray.get(1).toString()).getTime());
+                                        } catch (ParseException e) {
+//                                            log.info("字符串时间转字符串出错");
+                                        }
+                                    }
+                                });
+                            }else {
+                                //  加班单跨天 [子表label为空]
+                                try {
+                                    Object value = rowValue.stream().filter(item -> subName.equals(item.get("bizAlias")) || subName.equals(item.get("label"))).findAny().get().get("value");
+                                    rowData.put(compsId_itinerary.get(subName), value);
+                                } catch (Exception e) {
+//                                    log.info("流程版本字段差异");
+                                }
                             }
-                            //  加班单跨天 [子表label为空]
-                            rowData.put(compsId_itinerary.get(subName), value);
                         }
                         details.add(rowData);
+                        String category = "";
+                        double amount = 0.0;
+                        if ("行程明细".equals(compId_sub_oa)){
+                            amount = Double.parseDouble(rowValue.stream().filter(item -> "合计金额(元)".equals(item.get("bizAlias")) || "合计金额(元)".equals(item.get("label"))).findAny().get().get("value").toString());
+                        }else {
+                            category = rowValue.stream().filter(item -> "报销类目".equals(item.get("bizAlias")) || "报销类目".equals(item.get("label"))).findAny().get().get("value").toString();
+                            amount =  Double.parseDouble(rowValue.stream().filter(item -> "报销金额(元)".equals(item.get("bizAlias")) || "报销金额(元)".equals(item.get("label"))).findAny().get().get("value").toString());
+                        }
+                        if ("日常费用报销".equals(type)){
+                            if ("团建费".equals(category)){
+                                OAEntertainSum = OAEntertainSum + amount;
+                            } else if ("交通费".equals(category)) {
+                                OATrafficSum = OATrafficSum + amount;
+                            }else {
+                                OAOtherSum = OAOtherSum + amount;
+                            }
+                        }else if ("差旅费报销".equals(type)){
+                            OATravelSum = OATravelSum + amount;
+                        }else if ("业务招待费报销".equals(type)){
+                            OAEntertainSum = OAEntertainSum + amount;
+                        }else if ("交通费".equals(type)){
+                            OATrafficSum = OATrafficSum + amount;
+                        }
                     }
                     formData.put(compId, details);
                 }
@@ -146,23 +219,39 @@ public class PkProjectServiceImpl implements PkProjectService {
 
             List<Map> dataList = (List<Map>) ydClient.queryData(YDParam.builder().formUuid("FORM-25910D3D9DA6455C9234BEC1C08687FD0OZK")
                     .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_llemcq7d",projectCode))).build(), YDConf.FORM_QUERY.retrieve_list).getData();
-            String finalFiled = filed;
-            Double finalSum = sum;
+            Double finalOATravelSum = OATravelSum;
+            Double finalOATrafficSum = OATrafficSum;
+            Double finalOAEntertainSum = OAEntertainSum;
+            Double finalOAOtherSum = OAOtherSum;
             dataList.forEach(e->{
                 Map data = (Map) e.get("formData");
-                double dataAmount = Double.parseDouble(data.get(finalFiled + "_value")==null||data.get(finalFiled + "_value").toString().isEmpty() ? "0.0" : data.get(finalFiled + "_value").toString());
-                double dataSumAmount = Double.parseDouble(data.get("numberField_m7473opq_value")==null||data.get("numberField_m7473opq_value").toString().isEmpty() ? "0.0" : data.get("numberField_m7473opq_value").toString());
+                //差旅费用
+                double travelAmount = Double.parseDouble(data.get("numberField_m7473oph_value")==null||data.get("numberField_m7473oph_value").toString().isEmpty() ? "0.0" : data.get("numberField_m7473oph_value").toString());
+                //交通费用
+                double trafficAmount = Double.parseDouble(data.get("numberField_m7473opi_value")==null||data.get("numberField_m7473opi_value").toString().isEmpty() ? "0.0" : data.get("numberField_m7473opi_value").toString());
+                //招待费用
+                double entertainAmount = Double.parseDouble(data.get("numberField_m7473opn_value")==null||data.get("numberField_m7473opn_value").toString().isEmpty() ? "0.0" : data.get("numberField_m7473opn_value").toString());
+                //其他费用
+                double otherAmount = Double.parseDouble(data.get("numberField_m7473opo_value")==null||data.get("numberField_m7473opo_value").toString().isEmpty() ? "0.0" : data.get("numberField_m7473opo_value").toString());
+                //累计总成本
+                double totalSumAmount = Double.parseDouble(data.get("numberField_m7473opq_value")==null||data.get("numberField_m7473opq_value").toString().isEmpty() ? "0.0" : data.get("numberField_m7473opq_value").toString());
+                //预算总成本
                 double totalBudgetedCost = Double.parseDouble(data.get("numberField_m732y3r0_value")==null||data.get("numberField_m732y3r0_value").toString().isEmpty() ? "0.0" : data.get("numberField_m732y3r0_value").toString());
+                //累计报销费
                 double totalApplyCost = Double.parseDouble(data.get("numberField_m7wyydmc_value")==null||data.get("numberField_m7wyydmc_value").toString().isEmpty() ? "0.0" : data.get("numberField_m7wyydmc_value").toString());
+                //累计预算报销费用
                 double totalBudgetedApply = Double.parseDouble(data.get("numberField_m7wyydmd_value")==null||data.get("numberField_m7wyydmd_value").toString().isEmpty() ? "0.0" : data.get("numberField_m7wyydmd_value").toString());
-                dataAmount = dataAmount + finalSum;
-                dataSumAmount = dataSumAmount + finalSum;
-                totalApplyCost = totalApplyCost + finalSum;
+                travelAmount = travelAmount + finalOATravelSum;
+                trafficAmount = trafficAmount + finalOATrafficSum;
+                entertainAmount = entertainAmount + finalOAEntertainSum;
+                otherAmount = otherAmount + finalOAOtherSum;
+                totalSumAmount = totalSumAmount + finalOATravelSum + finalOATrafficSum + finalOAEntertainSum + finalOAOtherSum;
+                totalApplyCost = totalApplyCost + finalOATravelSum + finalOATrafficSum + finalOAEntertainSum + finalOAOtherSum;
                 ydClient.operateData(YDParam.builder()
                         .appType(APP_TYPE)
                         .systemToken(SYSTRM_TOKEN)
                         .formInstanceId(e.get("formInstanceId").toString())
-                        .updateFormDataJson(JSON.toJSONString(UtilMap.map(finalFiled + ", numberField_m7473opq, numberField_m7473oqm, numberField_m7wyydmc, numberField_m7473oqi",dataAmount,dataSumAmount,dataSumAmount/totalBudgetedCost*100,totalApplyCost,totalApplyCost/totalBudgetedApply*100)))
+                        .updateFormDataJson(JSON.toJSONString(UtilMap.map("numberField_m7473oph, numberField_m7473opi, numberField_m7473opn, numberField_m7473opo, numberField_m7473opq, numberField_m7473oqm, numberField_m7wyydmc, numberField_m7473oqi",travelAmount,trafficAmount,entertainAmount,otherAmount,totalSumAmount,totalSumAmount/totalBudgetedCost*100,totalApplyCost,totalApplyCost/totalBudgetedApply*100)))
                         .build(),YDConf.FORM_OPERATION.update);
             });
             // 用于审批回传
@@ -179,4 +268,228 @@ public class PkProjectServiceImpl implements PkProjectService {
                     .build(), YDConf.FORM_OPERATION.create);
         }
     }
+
+
+    @Override
+    public void getTrainInternal(String startDate, String endDate) {
+        String token = getBusinessTravelToken();
+        if (ObjectUtil.isNotNull(token)){
+            Map<String, Object> param = UtilMap.map("app_key, so_corp_token, page_no, page_size, period_start, period_end", BUS_kEY, token, 1, 100, startDate, endDate);
+            String url = "https://btripopen.alibtrip.com/api/train/v1/bill-settlement?";
+            List<Object> results = getResult(url, param);
+            if (ObjectUtil.isNotNull(results) && results.size()>0){
+                results.forEach(r->{
+                    JSONObject result = JSONObject.parseObject(r.toString());
+                    if (ObjectUtil.isNotNull(result)){
+                        if (ObjectUtil.isNotNull(result.get("project_code")) && !result.get("project_code").toString().isEmpty()){
+                            String projectCode = result.get("project_code").toString();
+
+                            List<Map> dataList = (List<Map>) ydClient.queryData(YDParam.builder().formUuid("FORM-25910D3D9DA6455C9234BEC1C08687FD0OZK")
+                                    .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_llemcq7d",projectCode))).build(), YDConf.FORM_QUERY.retrieve_list).getData();
+                            Double amount = result.get("ticket_corp_pay_price") == null || result.get("ticket_corp_pay_price").toString().isEmpty()?0.0:Double.parseDouble(result.get("ticket_corp_pay_price").toString());
+                            dataList.forEach(e->{
+                                Map data = (Map) e.get("formData");
+                                //差旅费用
+                                double travelAmount = Double.parseDouble(data.get("numberField_m7473oph_value")==null||data.get("numberField_m7473oph_value").toString().isEmpty() ? "0.0" : data.get("numberField_m7473oph_value").toString());
+                                //交通费用
+//                            double trafficAmount = Double.parseDouble(data.get("numberField_m7473opi_value")==null||data.get("numberField_m7473opi_value").toString().isEmpty() ? "0.0" : data.get("numberField_m7473opi_value").toString());
+                                //累计总成本
+                                double totalSumAmount = Double.parseDouble(data.get("numberField_m7473opq_value")==null||data.get("numberField_m7473opq_value").toString().isEmpty() ? "0.0" : data.get("numberField_m7473opq_value").toString());
+                                //预算总成本
+                                double totalBudgetedCost = Double.parseDouble(data.get("numberField_m732y3r0_value")==null||data.get("numberField_m732y3r0_value").toString().isEmpty() ? "0.0" : data.get("numberField_m732y3r0_value").toString());
+                                //累计报销费
+                                double totalApplyCost = Double.parseDouble(data.get("numberField_m7wyydmc_value")==null||data.get("numberField_m7wyydmc_value").toString().isEmpty() ? "0.0" : data.get("numberField_m7wyydmc_value").toString());
+                                //累计预算报销费用
+                                double totalBudgetedApply = Double.parseDouble(data.get("numberField_m7wyydmd_value")==null||data.get("numberField_m7wyydmd_value").toString().isEmpty() ? "0.0" : data.get("numberField_m7wyydmd_value").toString());
+                                travelAmount = travelAmount + amount;
+                                totalSumAmount = totalSumAmount + amount;
+                                totalApplyCost = totalApplyCost + amount;
+                                ydClient.operateData(YDParam.builder()
+                                        .appType(APP_TYPE)
+                                        .systemToken(SYSTRM_TOKEN)
+                                        .formInstanceId(e.get("formInstanceId").toString())
+                                        .updateFormDataJson(JSON.toJSONString(UtilMap.map("numberField_m7473oph, numberField_m7473opq, numberField_m7473oqm, numberField_m7wyydmc, numberField_m7473oqi",travelAmount,totalSumAmount,totalSumAmount/totalBudgetedCost*100,totalApplyCost,totalApplyCost/totalBudgetedApply*100)))
+                                        .build(),YDConf.FORM_OPERATION.update);
+                            });
+                        }
+                        HashMap<String, Object> formData = new HashMap<>();
+                        try {
+                            formData.put("dateField_m9jm4pia",simpleDateFormat.parse(result.get("book_time").toString()).getTime());//预定时间
+                            formData.put("textField_m9jm4pib",result.get("booker_name"));//预定人
+                            formData.put("textField_m9jm4pic",result.get("traveler_name"));//出行人
+                            formData.put("textField_m9jm4pid",result.get("cascade_department"));//联级部门
+                            formData.put("textField_m9jm4pik",result.get("cost_center"));//成本中心名称
+                            formData.put("textField_m9jm4pil",result.get("project_name"));//项目名称
+                            formData.put("textField_m9jm4pim",result.get("project_code"));//项目编码
+                            formData.put("textField_m9jm4pj5",TRAIN_FEE_TYPE.get(result.get("fee_type").toString()));//费用类型
+                            formData.put("dateField_m9jm4pit",simpleDateFormat.parse(result.get("dept_date") + " 00:00:00").getTime());//发车日期
+                            formData.put("textField_m9jm4piu",result.get("dept_time"));//发车时间
+                            formData.put("dateField_m9jm4piv",simpleDateFormat.parse(result.get("arr_date") + " 00:00:00").getTime());//到达日期
+                            formData.put("textField_m9jm4piw",result.get("arr_time"));//到达时间
+                            formData.put("textField_m9jm4pj2",result.get("dep_city_name"));//出发城市
+                            formData.put("textField_m9jm4pj3",result.get("arr_city_name"));//到达城市
+                            formData.put("textField_m9jm4pj4",result.get("seat_type"));//坐席
+                            formData.put("numberField_m9jm4pjb",result.get("ticket_corp_pay_price"));//企业支付金额
+                            formData.put("textareaField_m9jm4pjf",result.get("business_trip_result"));//出差事由
+                            formData.put("textareaField_m9jm4pjg",result.get("change_result"));//改签原因
+                            formData.put("textareaField_m9jm4pjh",result.get("refund_reason"));//退订原因
+                            formData.put("textareaField_m9jm4pjn",result.get("exceed_reason"));//超标原因
+                            formData.put("textareaField_m9jm4pjo",result.get("remark"));//备注
+                        } catch (ParseException e) {
+                            throw new RuntimeException(e);
+                        }
+                        ydClient.operateData(YDParam.builder()
+                                .appType(APP_TYPE)
+                                .systemToken(SYSTRM_TOKEN)
+                                .formUuid(trainUUID)
+                                .formDataJson(JSON.toJSONString(formData))
+                                .build(), YDConf.FORM_OPERATION.create);
+                    }
+                });
+            }
+        }
+    }
+
+    @Override
+    public void getAirInternal(String startDate, String endDate) {
+        String token = getBusinessTravelToken();
+        if (ObjectUtil.isNotNull(token)){
+            Map<String, Object> param = UtilMap.map("app_key, so_corp_token, page_no, page_size, period_start, period_end", BUS_kEY, token, 1, 100, startDate, endDate);
+            String url = "https://btripopen.alibtrip.com/api/flight/v1/bill-settlement?";
+            List<Object> results = getResult(url, param);
+            if (ObjectUtil.isNotNull(results) && results.size()>0){
+                results.forEach(r->{
+                    JSONObject result = JSONObject.parseObject(r.toString());
+                    if (ObjectUtil.isNotNull(result)){
+                        if (ObjectUtil.isNotNull(result.get("project_code")) && !result.get("project_code").toString().isEmpty()){
+                            String projectCode = result.get("project_code").toString();
+
+                            List<Map> dataList = (List<Map>) ydClient.queryData(YDParam.builder().formUuid("FORM-25910D3D9DA6455C9234BEC1C08687FD0OZK")
+                                    .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_llemcq7d",projectCode))).build(), YDConf.FORM_QUERY.retrieve_list).getData();
+                            Double amount = result.get("corp_settle_price") == null || result.get("corp_settle_price").toString().isEmpty()?0.0:Double.parseDouble(result.get("corp_settle_price").toString());
+                            dataList.forEach(e->{
+                                Map data = (Map) e.get("formData");
+                                //差旅费用
+                                double travelAmount = Double.parseDouble(data.get("numberField_m7473oph_value")==null||data.get("numberField_m7473oph_value").toString().isEmpty() ? "0.0" : data.get("numberField_m7473oph_value").toString());
+                                //交通费用
+//                            double trafficAmount = Double.parseDouble(data.get("numberField_m7473opi_value")==null||data.get("numberField_m7473opi_value").toString().isEmpty() ? "0.0" : data.get("numberField_m7473opi_value").toString());
+                                //累计总成本
+                                double totalSumAmount = Double.parseDouble(data.get("numberField_m7473opq_value")==null||data.get("numberField_m7473opq_value").toString().isEmpty() ? "0.0" : data.get("numberField_m7473opq_value").toString());
+                                //预算总成本
+                                double totalBudgetedCost = Double.parseDouble(data.get("numberField_m732y3r0_value")==null||data.get("numberField_m732y3r0_value").toString().isEmpty() ? "0.0" : data.get("numberField_m732y3r0_value").toString());
+                                //累计报销费
+                                double totalApplyCost = Double.parseDouble(data.get("numberField_m7wyydmc_value")==null||data.get("numberField_m7wyydmc_value").toString().isEmpty() ? "0.0" : data.get("numberField_m7wyydmc_value").toString());
+                                //累计预算报销费用
+                                double totalBudgetedApply = Double.parseDouble(data.get("numberField_m7wyydmd_value")==null||data.get("numberField_m7wyydmd_value").toString().isEmpty() ? "0.0" : data.get("numberField_m7wyydmd_value").toString());
+                                travelAmount = travelAmount + amount;
+                                totalSumAmount = totalSumAmount + amount;
+                                totalApplyCost = totalApplyCost + amount;
+                            ydClient.operateData(YDParam.builder()
+                                    .appType(APP_TYPE)
+                                    .systemToken(SYSTRM_TOKEN)
+                                    .formInstanceId(e.get("formInstanceId").toString())
+                                    .updateFormDataJson(JSON.toJSONString(UtilMap.map("numberField_m7473oph, numberField_m7473opq, numberField_m7473oqm, numberField_m7wyydmc, numberField_m7473oqi",travelAmount,totalSumAmount,totalSumAmount/totalBudgetedCost*100,totalApplyCost,totalApplyCost/totalBudgetedApply*100)))
+                                    .build(),YDConf.FORM_OPERATION.update);
+
+                            });
+                        }
+                        HashMap<String, Object> formData = new HashMap<>();
+                        try {
+                            formData.put("dateField_m9jm4pia",simpleDateFormat.parse(result.get("book_time").toString()).getTime());//预定时间
+                            formData.put("textField_m9jm4pib",result.get("booker_name"));//预定人
+                            formData.put("textField_m9jm4pic",result.get("traveler_name"));//出行人
+                            formData.put("textField_m9jm4pid",result.get("cascade_department"));//联级部门
+                            formData.put("textField_m9jm4pik",result.get("cost_center"));//成本中心名称
+                            formData.put("textField_m9jm4pil",result.get("project_name"));//项目名称
+                            formData.put("textField_m9jm4pim",result.get("project_code"));//项目编码
+                            formData.put("textField_m9jrbcig",result.get("capital_direction"));//资金方向
+                            formData.put("dateField_m9jm4pit",simpleDateFormat.parse(result.get("dept_date") + " 00:00:00").getTime());//起飞日期
+                            formData.put("textField_m9jm4piu",result.get("dept_time"));//起飞时间
+                            formData.put("dateField_m9jm4piv",simpleDateFormat.parse(result.get("arr_date") + " 00:00:00").getTime());//到达日期
+                            formData.put("textField_m9jm4piw",result.get("arr_time"));//到达时间
+                            formData.put("textField_m9jm4pj2",result.get("dept_city"));//起飞城市
+                            formData.put("textField_m9jm4pj3",result.get("arr_city"));//到达城市
+                            formData.put("textField_m9jm4pj4",result.get("cabin_class"));//舱等
+                            formData.put("textField_m9jm4pj5",AIR_FEE_TYPE.get(result.get("fee_type").toString()));//费用类型
+                            formData.put("numberField_m9jm4pjb",result.get("corp_pay_order_fee"));//订单金额
+                            formData.put("numberField_m9jrbcih",result.get("settlement_fee"));//结算金额
+                            formData.put("numberField_m9jrbcii",result.get("corp_settle_price"));//企业支付金额
+                            formData.put("numberField_m9jrbcio",result.get("person_settle_price"));//个人支付金额
+                            formData.put("numberField_m9jrbciq",result.get("refund_fee"));//退票手续费
+                            formData.put("numberField_m9jrbcir",result.get("refund_upgrade_cost"));//改签退票手续费
+                            formData.put("textField_m9jrbcit",result.get("discount"));//折扣率
+                            formData.put("numberField_m9jrbciz",result.get("advance_day"));//提前预定天数
+                            formData.put("textareaField_m9jm4pjf",result.get("business_trip_result"));//出差事由
+                            formData.put("textareaField_m9jm4pjh",result.get("refund_reason"));//退订原因
+                            formData.put("textareaField_m9jm4pjg",result.get("change_result"));//改签原因
+                            formData.put("textareaField_m9jm4pjn",result.get("exceed_reason"));//超标原因
+                            formData.put("textareaField_m9jm4pjo",result.get("remark"));//备注
+                        } catch (ParseException e) {
+                            throw new RuntimeException(e);
+                        }
+                        ydClient.operateData(YDParam.builder()
+                                .appType(APP_TYPE)
+                                .systemToken(SYSTRM_TOKEN)
+                                .formUuid(airUUID)
+                                .formDataJson(JSON.toJSONString(formData))
+                                .build(), YDConf.FORM_OPERATION.create);
+                    }
+                });
+            }
+        }
+    }
+
+    //获取阿里商旅访问token
+    public static String getBusinessTravelToken(){
+        String result = HttpUtils.httpGet("https://btripopen.alibtrip.com/api/btrip-open-auth/v1/corp-token/action/take?app_key=pqm6bkfs0800&type=0&corp_id=open12pqm6bkfju87v16348dd896bc361558&app_secret=cHFtNmJrZnMwODAwXS1ceXpINzUsazUkVT1tejohZ1o");
+        JSONObject jsonObject = JSONObject.parseObject(result);
+        if (ObjectUtil.isNotNull(jsonObject) && Boolean.parseBoolean(jsonObject.get("success").toString())){
+            Object module = jsonObject.get("module");
+            jsonObject = JSONObject.parseObject(module.toString());
+            return jsonObject.get("token").toString();
+        }
+        return null;
+    }
+    //根据token和分页获取所有数据
+    public static List<Object> getResult(String url,Map<String,Object> param){
+        int pageSize = 100;
+        if (param.containsKey("page_size")){
+            pageSize = Integer.parseInt(param.get("page_size").toString());
+        }
+        Map<String, Object> getTotalMap = new HashMap<>(param);
+        getTotalMap.put("page_no",1);
+        getTotalMap.put("page_size",1);
+        JSONObject jsonObject = toRequest(url, getTotalMap);
+        if (ObjectUtil.isNotNull(jsonObject)){
+            List<Object> objects = new ArrayList<>();
+            int totalNum = Integer.parseInt(jsonObject.get("total_num").toString());
+            int totalPages = (int) Math.ceil(totalNum / pageSize);
+            for (int i = 1; i <= totalPages; i++) {
+                param.put("page_no",i);
+                JSONObject result = toRequest(url, param);
+                List<Object> dataList = (List<Object>) result.get("data_list");
+                objects.addAll(dataList);
+            }
+            return objects;
+        }
+        return null;
+    }
+    //获取module里的数据
+    public static JSONObject toRequest(String url, Map<String,Object> param){
+        final String[] redirectUrl = {url};
+        param.forEach((k,v)->{
+            redirectUrl[0] = redirectUrl[0] + k + "=" + v + "&";
+        });
+        if (redirectUrl[0].endsWith("&")){
+            redirectUrl[0] = redirectUrl[0].substring(0,redirectUrl[0].length()-1);
+        }
+        String result = HttpUtils.httpGet(redirectUrl[0]);
+        JSONObject jsonObject = JSONObject.parseObject(result);
+        if (ObjectUtil.isNotNull(jsonObject) && Boolean.parseBoolean(jsonObject.get("success").toString())){
+            Object module = jsonObject.get("module");
+            jsonObject = JSONObject.parseObject(module.toString());
+            return jsonObject;
+        }
+        return null;
+    }
 }

+ 4 - 1
mjava-pake/src/main/resources/application-dev.yml

@@ -27,4 +27,7 @@ dingtalk:
 # aliwork
 aliwork:
   appType: APP_UNSAR4O4Y7NBDUYXLIP4
-  systemToken: HP666C71JQMCDBUHBETIS992J3SW3XKUKBCKL53
+  systemToken: HP666C71JQMCDBUHBETIS992J3SW3XKUKBCKL53
+alibusinesstravel:
+  appKey: pqm6bkfs0800
+  appSecret: cHFtNmJrZnMwODAwXS1ceXpINzUsazUkVT1tejohZ1o

+ 4 - 1
mjava-pake/src/main/resources/application-prod.yml

@@ -27,4 +27,7 @@ dingtalk:
 # aliwork
 aliwork:
   appType: APP_UNSAR4O4Y7NBDUYXLIP4
-  systemToken: HP666C71JQMCDBUHBETIS992J3SW3XKUKBCKL53
+  systemToken: HP666C71JQMCDBUHBETIS992J3SW3XKUKBCKL53
+alibusinesstravel:
+  appKey: pqm6bkfs0800
+  appSecret: cHFtNmJrZnMwODAwXS1ceXpINzUsazUkVT1tejohZ1o