PkProjectServiceImpl.java 35 KB

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