PkProjectServiceImpl.java 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510
  1. package com.malk.pake.service.impl;
  2. import cn.hutool.core.util.ObjectUtil;
  3. import com.alibaba.fastjson.JSON;
  4. import com.alibaba.fastjson.JSONArray;
  5. import com.alibaba.fastjson.JSONObject;
  6. import com.malk.pake.service.PkProjectService;
  7. import com.malk.pake.utils.HttpUtils;
  8. import com.malk.server.aliwork.YDConf;
  9. import com.malk.server.aliwork.YDParam;
  10. import com.malk.service.aliwork.YDClient;
  11. import com.malk.service.dingtalk.DDClient;
  12. import com.malk.service.dingtalk.DDClient_Notice;
  13. import com.malk.service.dingtalk.DDClient_Workflow;
  14. import com.malk.utils.UtilDateTime;
  15. import com.malk.utils.UtilMap;
  16. import lombok.SneakyThrows;
  17. import lombok.extern.slf4j.Slf4j;
  18. import org.apache.commons.collections4.map.HashedMap;
  19. import org.springframework.beans.factory.annotation.Autowired;
  20. import org.springframework.beans.factory.annotation.Value;
  21. import org.springframework.stereotype.Service;
  22. import java.text.ParseException;
  23. import java.text.SimpleDateFormat;
  24. import java.util.*;
  25. @Service
  26. @Slf4j
  27. public class PkProjectServiceImpl implements PkProjectService {
  28. @Autowired
  29. private DDClient ddClient;
  30. @Autowired
  31. private DDClient_Notice ddClient_notice;
  32. @Autowired
  33. private YDClient ydClient;
  34. @Autowired
  35. private DDClient_Workflow ddClient_workflow;
  36. private String projectFormUUID = "FORM-7F8921D7324F43B3B1147C1D99A3F758NFIL";
  37. private String saleFormUUID = "FORM-4V966N81BW8D84BFBI41WACUKFRZ1XBFPVELLJ";
  38. private String trainUUID = "FORM-78E05305A9BB4BBBABF5E34F781530D1RP78";
  39. private String airUUID = "FORM-53E3974D2A074B00AA6C66DE278F7938ZNNT";
  40. /// dingtalk
  41. @Value("${dingtalk.appKey}")
  42. private String APP_EKY;
  43. @Value("${dingtalk.appSecret}")
  44. private String APP_SECRET;
  45. /// aliwork
  46. @Value("${aliwork.appType}")
  47. private String APP_TYPE;
  48. @Value("${aliwork.systemToken}")
  49. private String SYSTRM_TOKEN;
  50. /// 阿里商旅
  51. @Value("${alibusinesstravel.appKey}")
  52. private String BUS_kEY;
  53. @Value("${alibusinesstravel.appSecret}")
  54. private String BUS_SECRET;
  55. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  56. private static final Map<String,String> AIR_FEE_TYPE = new HashMap<>();
  57. static {
  58. AIR_FEE_TYPE.put("10101","机票预订");
  59. AIR_FEE_TYPE.put("10202","机票改签手续费");
  60. AIR_FEE_TYPE.put("10203","机票改签差价");
  61. AIR_FEE_TYPE.put("10301","机票退款");
  62. AIR_FEE_TYPE.put("10302","机票改签退款");
  63. AIR_FEE_TYPE.put("10303","机票补退");
  64. AIR_FEE_TYPE.put("10401","机票保险-航意险购买");
  65. AIR_FEE_TYPE.put("10501","机票保险-航意险退保");
  66. AIR_FEE_TYPE.put("11001","机票预订服务费");
  67. AIR_FEE_TYPE.put("11002","机票改签服务费");
  68. AIR_FEE_TYPE.put("10304","机票票据服务费退款");
  69. AIR_FEE_TYPE.put("11003","机票票据服务费");
  70. AIR_FEE_TYPE.put("11004","机票托管协议服务费");
  71. AIR_FEE_TYPE.put("11005","机票改签托管协议服务费");
  72. }
  73. private static final Map<String,String> TRAIN_FEE_TYPE = new HashMap<>();
  74. static {
  75. TRAIN_FEE_TYPE.put("6001","火车票预订");
  76. TRAIN_FEE_TYPE.put("6003","火车票改签差价");
  77. TRAIN_FEE_TYPE.put("6004","火车票改签手续费");
  78. TRAIN_FEE_TYPE.put("6005","火车票退票");
  79. TRAIN_FEE_TYPE.put("6007","火车票预订服务费");
  80. TRAIN_FEE_TYPE.put("6008","火车票改签服务费");
  81. TRAIN_FEE_TYPE.put("6009","火车票预订退款");
  82. TRAIN_FEE_TYPE.put("6010","火车票改签退款");
  83. TRAIN_FEE_TYPE.put("6101","火车票抢票加速包");
  84. TRAIN_FEE_TYPE.put("6011","火车票票据服务费");
  85. TRAIN_FEE_TYPE.put("6012","火车票技术服务费");
  86. TRAIN_FEE_TYPE.put("6013","火车票票据服务费退款");
  87. TRAIN_FEE_TYPE.put("6014","火车票线下退改退款");
  88. }
  89. @Override
  90. public void saleUpdateProject(String formInstId) {
  91. // log.info("流程id:{}",formInstId);
  92. Map formData = ydClient.queryData(YDParam.builder().formInstanceId(formInstId).build(),
  93. YDConf.FORM_QUERY.retrieve_id).getFormData();
  94. String contractCode = formData.get("textField_llew0vlc").toString();
  95. String contractName = formData.get("textareaField_lq0s1gcw").toString();
  96. String contractAmount = formData.get("numberField_llew0vlx_value").toString();
  97. String projectCode = formData.get("textField_ltpbh04c").toString();
  98. if (!projectCode.isEmpty() && ObjectUtil.isNotNull(projectCode)){
  99. List<Map<String, Object>> dataList = (List<Map<String, Object>>)ydClient.queryData(YDParam.builder().formUuid(projectFormUUID)
  100. .searchFieldJson(JSONObject.toJSONString(UtilMap.map("textField_llemcq7d", projectCode))).build(),
  101. YDConf.FORM_QUERY.retrieve_search_form).getData();
  102. List<Map<String,Object>> association = new ArrayList<>();
  103. Map<String, Object> map = UtilMap.map("appType, formType, formUuid, instanceId, subTitle, title", "APP_UNSAR4O4Y7NBDUYXLIP4", "process", saleFormUUID, formInstId, contractCode, contractName);
  104. association.add(map);
  105. dataList.forEach(e->{
  106. ydClient.operateData(YDParam.builder()
  107. .formInstanceId(e.get("formInstanceId").toString())
  108. .updateFormDataJson(JSON.toJSONString(UtilMap.map("associationFormField_lmlq4t3o, textField_lmlq4t3p, textField_lmlq4t3q, numberField_m731di5q",association,contractName,contractCode,contractAmount)))
  109. .useLatestVersion(true)
  110. .build(), YDConf.FORM_OPERATION.update);
  111. });
  112. }
  113. }
  114. @Override
  115. public void oaUpdateProject(String processInstanceId, String formUuid, Map<String, String> compsId_main, Map<String, String> compsId_itinerary, String compId_sub_oa) {
  116. String token = ddClient.getAccessToken(APP_EKY, APP_SECRET);
  117. // log.info("processInstanceId:{}",processInstanceId);
  118. Map processData = ddClient_workflow.getProcessInstanceId(token, processInstanceId);
  119. List<Map> formComponentValues = (List<Map>) processData.get("formComponentValues");
  120. String userId = String.valueOf(processData.get("originatorUserId"));
  121. long cDate = UtilDateTime.parse(UtilMap.getString(processData, "createTime"), "yyyy-MM-dd'T'HH:mm").getTime();
  122. 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"));
  123. Optional optional = formComponentValues.stream().filter(item -> "费用出处".equals(item.get("name"))).findAny();
  124. if (optional.isPresent() && (UtilMap.getString((Map) optional.get(), "value").equals("项目费用") || UtilMap.getString((Map) optional.get(), "value").equals("研发费用"))){
  125. Double OATravelSum = 0.0;//OA差旅费用
  126. Double OATrafficSum = 0.0;//OA交通费用
  127. Double OAEntertainSum = 0.0;//OA招待费用
  128. Double OAOtherSum = 0.0;//OA其他费用
  129. optional = formComponentValues.stream().filter(item -> "项目编号".equals(item.get("name"))).findAny();
  130. if (!optional.isPresent()){
  131. return;
  132. }
  133. String projectCode = UtilMap.getString((Map) optional.get(), "value");
  134. optional = formComponentValues.stream().filter(item -> "费用报销类型".equals(item.get("name"))).findAny();
  135. String type = UtilMap.getString((Map) optional.get(), "value");
  136. for (String name : compsId_main.keySet()) {
  137. String compId = compsId_main.get(name);
  138. // 判定是否子表 [宜搭]
  139. if (compId.startsWith("tableField_")) {
  140. List<Map> details = new ArrayList<>();
  141. // 兼容明细组件, 存在多条情况 [加班跨天才有有明细]
  142. optional = formComponentValues.stream().filter(item -> compId_sub_oa.equals(item.get("name"))).findAny();
  143. if (!optional.isPresent()) {
  144. continue;
  145. }
  146. String schedule = UtilMap.getString((Map) optional.get(), "value");
  147. List<Map> itineraryList = ((List<Map>) JSON.parse(schedule));
  148. // 循环明细数据
  149. for (Map itinerary : itineraryList) {
  150. List<Map> rowValue = (List<Map>) itinerary.get("rowValue");
  151. Map rowData = new HashedMap();
  152. // 循环子表组件插入宜搭表单
  153. for (String subName : compsId_itinerary.keySet()) {
  154. if ("出发时间".equals(subName) || "返回时间".equals(subName)) {
  155. rowValue.forEach(r->{
  156. Object label = r.get("label");
  157. if (label instanceof JSONArray){
  158. Object value = r.get("value");
  159. JSONArray jsonArray = JSONArray.parseArray(value.toString());
  160. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  161. try {
  162. rowData.put(compsId_itinerary.get("出发时间"), sdf.parse(jsonArray.get(0).toString()).getTime());
  163. rowData.put(compsId_itinerary.get("返回时间"), sdf.parse(jsonArray.get(1).toString()).getTime());
  164. } catch (ParseException e) {
  165. // log.info("字符串时间转字符串出错");
  166. }
  167. }
  168. });
  169. }else {
  170. // 加班单跨天 [子表label为空]
  171. try {
  172. Object value = rowValue.stream().filter(item -> subName.equals(item.get("bizAlias")) || subName.equals(item.get("label"))).findAny().get().get("value");
  173. rowData.put(compsId_itinerary.get(subName), value);
  174. } catch (Exception e) {
  175. // log.info("流程版本字段差异");
  176. }
  177. }
  178. }
  179. details.add(rowData);
  180. String category = "";
  181. double amount = 0.0;
  182. if ("行程明细".equals(compId_sub_oa)){
  183. amount = Double.parseDouble(rowValue.stream().filter(item -> "合计金额(元)".equals(item.get("bizAlias")) || "合计金额(元)".equals(item.get("label"))).findAny().get().get("value").toString());
  184. }else {
  185. category = rowValue.stream().filter(item -> "报销类目".equals(item.get("bizAlias")) || "报销类目".equals(item.get("label"))).findAny().get().get("value").toString();
  186. amount = Double.parseDouble(rowValue.stream().filter(item -> "报销金额(元)".equals(item.get("bizAlias")) || "报销金额(元)".equals(item.get("label"))).findAny().get().get("value").toString());
  187. }
  188. if ("日常费用报销".equals(type)){
  189. if ("团建费".equals(category)){
  190. OAEntertainSum = OAEntertainSum + amount;
  191. } else if ("交通费".equals(category)) {
  192. OATrafficSum = OATrafficSum + amount;
  193. }else {
  194. OAOtherSum = OAOtherSum + amount;
  195. }
  196. }else if ("差旅费报销".equals(type)){
  197. OATravelSum = OATravelSum + amount;
  198. }else if ("业务招待费报销".equals(type)){
  199. OAEntertainSum = OAEntertainSum + amount;
  200. }else if ("交通费".equals(type)){
  201. OATrafficSum = OATrafficSum + amount;
  202. }
  203. }
  204. formData.put(compId, details);
  205. }
  206. else {
  207. optional = formComponentValues.stream().filter(item -> name.equals(item.get("name"))).findAny();
  208. if (!optional.isPresent()){
  209. continue;
  210. }
  211. formData.put(compId,UtilMap.getString((Map) optional.get(), "value"));
  212. }
  213. }
  214. List<Map> dataList = (List<Map>) ydClient.queryData(YDParam.builder().formUuid("FORM-25910D3D9DA6455C9234BEC1C08687FD0OZK")
  215. .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_llemcq7d",projectCode))).build(), YDConf.FORM_QUERY.retrieve_list).getData();
  216. Double finalOATravelSum = OATravelSum;
  217. Double finalOATrafficSum = OATrafficSum;
  218. Double finalOAEntertainSum = OAEntertainSum;
  219. Double finalOAOtherSum = OAOtherSum;
  220. dataList.forEach(e->{
  221. Map data = (Map) e.get("formData");
  222. //差旅费用
  223. 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());
  224. //交通费用
  225. 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());
  226. //招待费用
  227. 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());
  228. //其他费用
  229. 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());
  230. //累计总成本
  231. 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());
  232. //预算总成本
  233. 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());
  234. //累计报销费
  235. 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());
  236. //累计预算报销费用
  237. 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());
  238. travelAmount = travelAmount + finalOATravelSum;
  239. trafficAmount = trafficAmount + finalOATrafficSum;
  240. entertainAmount = entertainAmount + finalOAEntertainSum;
  241. otherAmount = otherAmount + finalOAOtherSum;
  242. totalSumAmount = totalSumAmount + finalOATravelSum + finalOATrafficSum + finalOAEntertainSum + finalOAOtherSum;
  243. totalApplyCost = totalApplyCost + finalOATravelSum + finalOATrafficSum + finalOAEntertainSum + finalOAOtherSum;
  244. ydClient.operateData(YDParam.builder()
  245. .appType(APP_TYPE)
  246. .systemToken(SYSTRM_TOKEN)
  247. .formInstanceId(e.get("formInstanceId").toString())
  248. .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)))
  249. .build(),YDConf.FORM_OPERATION.update);
  250. });
  251. // 用于审批回传
  252. // List<Map> tasks = UtilMap.getList(processData, "tasks");
  253. // formData.put("textField_lygvvyd9", tasks.get(0).get("taskId"));
  254. // formData.put("textField_lygvvyda", tasks.get(0).get("userId"));
  255. formData.put("textField_lyh4y3th", processInstanceId);
  256. ydClient.operateData(YDParam.builder()
  257. .appType(APP_TYPE)
  258. .systemToken(SYSTRM_TOKEN)
  259. .formUuid(formUuid)
  260. .formDataJson(JSON.toJSONString(formData))
  261. .userId(userId)
  262. .build(), YDConf.FORM_OPERATION.create);
  263. }
  264. }
  265. @Override
  266. public void getTrainInternal(String startDate, String endDate) {
  267. String token = getBusinessTravelToken();
  268. if (ObjectUtil.isNotNull(token)){
  269. 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);
  270. String url = "https://btripopen.alibtrip.com/api/train/v1/bill-settlement?";
  271. List<Object> results = getResult(url, param);
  272. if (ObjectUtil.isNotNull(results) && results.size()>0){
  273. results.forEach(r->{
  274. JSONObject result = JSONObject.parseObject(r.toString());
  275. if (ObjectUtil.isNotNull(result)){
  276. if (ObjectUtil.isNotNull(result.get("project_code")) && !result.get("project_code").toString().isEmpty()){
  277. String projectCode = result.get("project_code").toString();
  278. List<Map> dataList = (List<Map>) ydClient.queryData(YDParam.builder().formUuid("FORM-25910D3D9DA6455C9234BEC1C08687FD0OZK")
  279. .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_llemcq7d",projectCode))).build(), YDConf.FORM_QUERY.retrieve_list).getData();
  280. 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());
  281. dataList.forEach(e->{
  282. Map data = (Map) e.get("formData");
  283. //差旅费用
  284. 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());
  285. //交通费用
  286. // 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());
  287. //累计总成本
  288. 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());
  289. //预算总成本
  290. 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());
  291. //累计报销费
  292. 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());
  293. //累计预算报销费用
  294. 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());
  295. travelAmount = travelAmount + amount;
  296. totalSumAmount = totalSumAmount + amount;
  297. totalApplyCost = totalApplyCost + amount;
  298. ydClient.operateData(YDParam.builder()
  299. .appType(APP_TYPE)
  300. .systemToken(SYSTRM_TOKEN)
  301. .formInstanceId(e.get("formInstanceId").toString())
  302. .updateFormDataJson(JSON.toJSONString(UtilMap.map("numberField_m7473oph, numberField_m7473opq, numberField_m7473oqm, numberField_m7wyydmc, numberField_m7473oqi",travelAmount,totalSumAmount,totalSumAmount/totalBudgetedCost*100,totalApplyCost,totalApplyCost/totalBudgetedApply*100)))
  303. .build(),YDConf.FORM_OPERATION.update);
  304. });
  305. }
  306. HashMap<String, Object> formData = new HashMap<>();
  307. try {
  308. formData.put("dateField_m9jm4pia",simpleDateFormat.parse(result.get("book_time").toString()).getTime());//预定时间
  309. formData.put("textField_m9jm4pib",result.get("booker_name"));//预定人
  310. formData.put("textField_m9jm4pic",result.get("traveler_name"));//出行人
  311. formData.put("textField_m9jm4pid",result.get("cascade_department"));//联级部门
  312. formData.put("textField_m9jm4pik",result.get("cost_center"));//成本中心名称
  313. formData.put("textField_m9jm4pil",result.get("project_name"));//项目名称
  314. formData.put("textField_m9jm4pim",result.get("project_code"));//项目编码
  315. formData.put("textField_m9jm4pj5",TRAIN_FEE_TYPE.get(result.get("fee_type").toString()));//费用类型
  316. formData.put("dateField_m9jm4pit",simpleDateFormat.parse(result.get("dept_date") + " 00:00:00").getTime());//发车日期
  317. formData.put("textField_m9jm4piu",result.get("dept_time"));//发车时间
  318. formData.put("dateField_m9jm4piv",simpleDateFormat.parse(result.get("arr_date") + " 00:00:00").getTime());//到达日期
  319. formData.put("textField_m9jm4piw",result.get("arr_time"));//到达时间
  320. formData.put("textField_m9jm4pj2",result.get("dep_city_name"));//出发城市
  321. formData.put("textField_m9jm4pj3",result.get("arr_city_name"));//到达城市
  322. formData.put("textField_m9jm4pj4",result.get("seat_type"));//坐席
  323. formData.put("numberField_m9jm4pjb",result.get("ticket_corp_pay_price"));//企业支付金额
  324. formData.put("textareaField_m9jm4pjf",result.get("business_trip_result"));//出差事由
  325. formData.put("textareaField_m9jm4pjg",result.get("change_result"));//改签原因
  326. formData.put("textareaField_m9jm4pjh",result.get("refund_reason"));//退订原因
  327. formData.put("textareaField_m9jm4pjn",result.get("exceed_reason"));//超标原因
  328. formData.put("textareaField_m9jm4pjo",result.get("remark"));//备注
  329. } catch (ParseException e) {
  330. throw new RuntimeException(e);
  331. }
  332. ydClient.operateData(YDParam.builder()
  333. .appType(APP_TYPE)
  334. .systemToken(SYSTRM_TOKEN)
  335. .formUuid(trainUUID)
  336. .formDataJson(JSON.toJSONString(formData))
  337. .build(), YDConf.FORM_OPERATION.create);
  338. }
  339. });
  340. }
  341. }
  342. }
  343. @Override
  344. public void getAirInternal(String startDate, String endDate) {
  345. String token = getBusinessTravelToken();
  346. if (ObjectUtil.isNotNull(token)){
  347. 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);
  348. String url = "https://btripopen.alibtrip.com/api/flight/v1/bill-settlement?";
  349. List<Object> results = getResult(url, param);
  350. if (ObjectUtil.isNotNull(results) && results.size()>0){
  351. results.forEach(r->{
  352. JSONObject result = JSONObject.parseObject(r.toString());
  353. if (ObjectUtil.isNotNull(result)){
  354. if (ObjectUtil.isNotNull(result.get("project_code")) && !result.get("project_code").toString().isEmpty()){
  355. String projectCode = result.get("project_code").toString();
  356. List<Map> dataList = (List<Map>) ydClient.queryData(YDParam.builder().formUuid("FORM-25910D3D9DA6455C9234BEC1C08687FD0OZK")
  357. .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_llemcq7d",projectCode))).build(), YDConf.FORM_QUERY.retrieve_list).getData();
  358. 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());
  359. dataList.forEach(e->{
  360. Map data = (Map) e.get("formData");
  361. //差旅费用
  362. 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());
  363. //交通费用
  364. // 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());
  365. //累计总成本
  366. 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());
  367. //预算总成本
  368. 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());
  369. //累计报销费
  370. 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());
  371. //累计预算报销费用
  372. 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());
  373. travelAmount = travelAmount + amount;
  374. totalSumAmount = totalSumAmount + amount;
  375. totalApplyCost = totalApplyCost + amount;
  376. ydClient.operateData(YDParam.builder()
  377. .appType(APP_TYPE)
  378. .systemToken(SYSTRM_TOKEN)
  379. .formInstanceId(e.get("formInstanceId").toString())
  380. .updateFormDataJson(JSON.toJSONString(UtilMap.map("numberField_m7473oph, numberField_m7473opq, numberField_m7473oqm, numberField_m7wyydmc, numberField_m7473oqi",travelAmount,totalSumAmount,totalSumAmount/totalBudgetedCost*100,totalApplyCost,totalApplyCost/totalBudgetedApply*100)))
  381. .build(),YDConf.FORM_OPERATION.update);
  382. });
  383. }
  384. HashMap<String, Object> formData = new HashMap<>();
  385. try {
  386. formData.put("dateField_m9jm4pia",simpleDateFormat.parse(result.get("book_time").toString()).getTime());//预定时间
  387. formData.put("textField_m9jm4pib",result.get("booker_name"));//预定人
  388. formData.put("textField_m9jm4pic",result.get("traveler_name"));//出行人
  389. formData.put("textField_m9jm4pid",result.get("cascade_department"));//联级部门
  390. formData.put("textField_m9jm4pik",result.get("cost_center"));//成本中心名称
  391. formData.put("textField_m9jm4pil",result.get("project_name"));//项目名称
  392. formData.put("textField_m9jm4pim",result.get("project_code"));//项目编码
  393. formData.put("textField_m9jrbcig",result.get("capital_direction"));//资金方向
  394. formData.put("dateField_m9jm4pit",simpleDateFormat.parse(result.get("dept_date") + " 00:00:00").getTime());//起飞日期
  395. formData.put("textField_m9jm4piu",result.get("dept_time"));//起飞时间
  396. formData.put("dateField_m9jm4piv",simpleDateFormat.parse(result.get("arr_date") + " 00:00:00").getTime());//到达日期
  397. formData.put("textField_m9jm4piw",result.get("arr_time"));//到达时间
  398. formData.put("textField_m9jm4pj2",result.get("dept_city"));//起飞城市
  399. formData.put("textField_m9jm4pj3",result.get("arr_city"));//到达城市
  400. formData.put("textField_m9jm4pj4",result.get("cabin_class"));//舱等
  401. formData.put("textField_m9jm4pj5",AIR_FEE_TYPE.get(result.get("fee_type").toString()));//费用类型
  402. formData.put("numberField_m9jm4pjb",result.get("corp_pay_order_fee"));//订单金额
  403. formData.put("numberField_m9jrbcih",result.get("settlement_fee"));//结算金额
  404. formData.put("numberField_m9jrbcii",result.get("corp_settle_price"));//企业支付金额
  405. formData.put("numberField_m9jrbcio",result.get("person_settle_price"));//个人支付金额
  406. formData.put("numberField_m9jrbciq",result.get("refund_fee"));//退票手续费
  407. formData.put("numberField_m9jrbcir",result.get("refund_upgrade_cost"));//改签退票手续费
  408. formData.put("textField_m9jrbcit",result.get("discount"));//折扣率
  409. formData.put("numberField_m9jrbciz",result.get("advance_day"));//提前预定天数
  410. formData.put("textareaField_m9jm4pjf",result.get("business_trip_result"));//出差事由
  411. formData.put("textareaField_m9jm4pjh",result.get("refund_reason"));//退订原因
  412. formData.put("textareaField_m9jm4pjg",result.get("change_result"));//改签原因
  413. formData.put("textareaField_m9jm4pjn",result.get("exceed_reason"));//超标原因
  414. formData.put("textareaField_m9jm4pjo",result.get("remark"));//备注
  415. } catch (ParseException e) {
  416. throw new RuntimeException(e);
  417. }
  418. ydClient.operateData(YDParam.builder()
  419. .appType(APP_TYPE)
  420. .systemToken(SYSTRM_TOKEN)
  421. .formUuid(airUUID)
  422. .formDataJson(JSON.toJSONString(formData))
  423. .build(), YDConf.FORM_OPERATION.create);
  424. }
  425. });
  426. }
  427. }
  428. }
  429. //获取阿里商旅访问token
  430. public static String getBusinessTravelToken(){
  431. 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");
  432. JSONObject jsonObject = JSONObject.parseObject(result);
  433. log.info("获取token:{}",jsonObject);
  434. if (ObjectUtil.isNotNull(jsonObject) && Boolean.parseBoolean(jsonObject.get("success").toString())){
  435. Object module = jsonObject.get("module");
  436. jsonObject = JSONObject.parseObject(module.toString());
  437. return jsonObject.get("token").toString();
  438. }
  439. return null;
  440. }
  441. //根据token和分页获取所有数据
  442. public static List<Object> getResult(String url,Map<String,Object> param){
  443. log.info("开始第一次获取总数据量:{}",param);
  444. int pageSize = 100;
  445. if (param.containsKey("page_size")){
  446. pageSize = Integer.parseInt(param.get("page_size").toString());
  447. }
  448. Map<String, Object> getTotalMap = new HashMap<>(param);
  449. getTotalMap.put("page_no",1);
  450. getTotalMap.put("page_size",1);
  451. JSONObject jsonObject = toRequest(url, getTotalMap);
  452. if (ObjectUtil.isNotNull(jsonObject)){
  453. List<Object> objects = new ArrayList<>();
  454. int totalNum = Integer.parseInt(jsonObject.get("total_num").toString());
  455. int totalPages = (int) Math.ceil(totalNum / pageSize) + 1;
  456. for (int i = 1; i <= totalPages; i++) {
  457. param.put("page_no",i);
  458. JSONObject result = toRequest(url, param);
  459. List<Object> dataList = (List<Object>) result.get("data_list");
  460. objects.addAll(dataList);
  461. }
  462. return objects;
  463. }
  464. return null;
  465. }
  466. //获取module里的数据
  467. @SneakyThrows
  468. public static JSONObject toRequest(String url, Map<String,Object> param){
  469. final String[] redirectUrl = {url};
  470. param.forEach((k,v)->{
  471. redirectUrl[0] = redirectUrl[0] + k + "=" + v + "&";
  472. });
  473. if (redirectUrl[0].endsWith("&")){
  474. redirectUrl[0] = redirectUrl[0].substring(0,redirectUrl[0].length()-1);
  475. }
  476. String result = HttpUtils.httpGet(redirectUrl[0]);
  477. JSONObject jsonObject = JSONObject.parseObject(result);
  478. boolean success = Boolean.parseBoolean(jsonObject.get("success").toString());
  479. while (!success){
  480. result = HttpUtils.httpGet(redirectUrl[0]);
  481. jsonObject = JSONObject.parseObject(result);
  482. success = Boolean.parseBoolean(jsonObject.get("success").toString());
  483. Thread.sleep(1000);
  484. }
  485. if (ObjectUtil.isNotNull(jsonObject) && success){
  486. Object module = jsonObject.get("module");
  487. jsonObject = JSONObject.parseObject(module.toString());
  488. return jsonObject;
  489. }
  490. return null;
  491. }
  492. }