LingmingguangziServiceImpl.java 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864
  1. package com.malk.lingmingguangzi.service;
  2. import cn.hutool.core.date.DateUtil;
  3. import cn.hutool.http.HttpRequest;
  4. import cn.hutool.http.HttpResponse;
  5. import cn.hutool.http.HttpUtil;
  6. import cn.hutool.json.JSONUtil;
  7. import com.alibaba.fastjson.JSON;
  8. import com.alibaba.fastjson.JSONArray;
  9. import com.alibaba.fastjson.JSONObject;
  10. import com.auth0.jwt.JWT;
  11. import com.auth0.jwt.algorithms.Algorithm;
  12. import com.fasterxml.jackson.core.JsonProcessingException;
  13. import com.fasterxml.jackson.core.type.TypeReference;
  14. import com.fasterxml.jackson.databind.ObjectMapper;
  15. import com.malk.server.aliwork.YDConf;
  16. import com.malk.server.aliwork.YDParam;
  17. import com.malk.server.common.McR;
  18. import com.malk.server.dingtalk.DDR_New;
  19. import com.malk.server.teambition.TBConf;
  20. import com.malk.server.teambition.TBR;
  21. import com.malk.service.aliwork.YDClient;
  22. import com.malk.service.dingtalk.DDClient;
  23. import com.malk.utils.UtilHttp;
  24. import com.malk.utils.UtilMap;
  25. import com.malk.utils.UtilToken;
  26. import lombok.extern.slf4j.Slf4j;
  27. import org.apache.commons.lang3.StringUtils;
  28. import org.apache.http.HttpEntity;
  29. import org.apache.http.client.HttpClient;
  30. import org.apache.http.client.methods.HttpPost;
  31. import org.apache.http.entity.ContentType;
  32. import org.apache.http.entity.mime.MultipartEntityBuilder;
  33. import org.apache.http.impl.client.HttpClients;
  34. import org.apache.http.util.EntityUtils;
  35. import org.springframework.beans.factory.annotation.Autowired;
  36. import org.springframework.beans.factory.annotation.Value;
  37. import org.springframework.stereotype.Service;
  38. import java.io.*;
  39. import java.net.HttpURLConnection;
  40. import java.net.URL;
  41. import java.net.URLEncoder;
  42. import java.nio.file.Files;
  43. import java.util.*;
  44. import java.util.regex.Matcher;
  45. import java.util.regex.Pattern;
  46. import java.util.stream.Collectors;
  47. @Service
  48. @Slf4j
  49. public class LingmingguangziServiceImpl implements LingmingguangziService {
  50. @Autowired
  51. private YDClient ydClient;
  52. @Autowired
  53. private YDConf ydConf;
  54. @Autowired
  55. private TBConf tbConf;
  56. @Autowired
  57. private DDClient ddClient;
  58. @Value(value = "${erp.url}")
  59. private String erpUrl;
  60. @Value(value = "${erp.username}")
  61. private String userName;
  62. @Value(value = "${erp.password}")
  63. private String password;
  64. @Value(value = "${erp.filePath}")
  65. private String filePath;
  66. private final Object $lock = new Object[0];
  67. private static final Long EXPIRES_IN = 7200000L;
  68. private static final String TASK_URL_PREFIX = "https://www.teambition.com/project/65bb53546a74a42e2d608f05/tasks/view/65bb5354a0d7b85bc253f863/task/";
  69. private static final Map<String,String> STAGES = new HashMap<>();
  70. private static final Map<String,String> TAGS = new HashMap<>();
  71. static {
  72. STAGES.put("666fff1ec8e7e2eaab75bd81", "TR评审");//TR评审
  73. STAGES.put("666fff1ebe648654141a5b8b", "TO评审");//TR评审
  74. STAGES.put("666fff6fa0f1ab8063960627", "EV评审");//EV评审
  75. STAGES.put("666fff883a26df9ebce13918", "DV评审");//DV评审
  76. STAGES.put("666fffd4976f23a2d7cf13e1", "PV评审");//PV评审
  77. STAGES.put("666ffff2592db27f2d342d02", "MP评审");//MP评审
  78. TAGS.put("667002dff456184e9dc794a4", "消费(必选)");//消费(必选)
  79. TAGS.put("6670028d536f774f09d300f5", "消费(可选)");//消费(可选)
  80. TAGS.put("6670027cb986d723e63be2a5", "车载(必选)");//车载(必选)
  81. TAGS.put("667002667e0222a2169802dc", "车载(可选)");//车载(可选)
  82. }
  83. @Override
  84. public McR test() {
  85. log.info("test");
  86. return McR.success();
  87. }
  88. @Override
  89. public McR getCustomerQuestionnaireCount(Long start, Long end) {
  90. YDParam.YDParamBuilder ydParamBuilder = YDParam.builder()
  91. .formUuid("FORM-5CC9748D283C49FC8C8A86EE0529730A4I1D");
  92. if (start != null && end != null){
  93. String startDate = DateUtil.format(new Date(start), "yyyy-MM-dd HH:mm:ss");
  94. String endDate = DateUtil.format(DateUtil.offsetDay(new Date(end),1), "yyyy-MM-dd HH:mm:ss");
  95. ydParamBuilder.createFromTimeGMT(startDate);
  96. ydParamBuilder.createToTimeGMT(endDate);
  97. }
  98. //车载--------------------------------------------
  99. DDR_New ddrNew = ydClient.queryData(ydParamBuilder.build(), YDConf.FORM_QUERY.retrieve_list);
  100. List<Map> dataList = (List<Map>) ddrNew.getData();
  101. int importantCustomerCount = 0;
  102. int orderCustomerCount = 0;
  103. int strategicCustomerCount = 0;
  104. for (Map data : dataList) {
  105. Map formData = (Map) data.get("formData");
  106. String customerLevel = String.valueOf(formData.get("selectField_lx4g7em6"));
  107. switch (customerLevel){
  108. case "重要客户": importantCustomerCount++; break;
  109. case "订单客户": orderCustomerCount++; break;
  110. case "战略客户": strategicCustomerCount++; break;
  111. }
  112. }
  113. Map<String,Integer> result = new HashMap<>();
  114. result.put("importantCustomerCount", importantCustomerCount);
  115. result.put("orderCustomerCount", orderCustomerCount);
  116. result.put("strategicCustomerCount", strategicCustomerCount);
  117. return McR.success(result);
  118. }
  119. @Override
  120. public McR getCustomerQuestionnaireCount2(Long start, Long end) {
  121. YDParam.YDParamBuilder ydParamBuilder = YDParam.builder()
  122. .formUuid("FORM-D4587ABF101246F6B17635C8CB178B6BGTAW");
  123. if (start != null && end != null){
  124. String startDate = DateUtil.format(new Date(start), "yyyy-MM-dd HH:mm:ss");
  125. String endDate = DateUtil.format(DateUtil.offsetDay(new Date(end),1), "yyyy-MM-dd HH:mm:ss");
  126. ydParamBuilder.createFromTimeGMT(startDate);
  127. ydParamBuilder.createToTimeGMT(endDate);
  128. }
  129. //商务端
  130. DDR_New ddrNew = ydClient.queryData(ydParamBuilder.build(), YDConf.FORM_QUERY.retrieve_list);
  131. List<Map> dataList = (List<Map>) ddrNew.getData();
  132. int businessCustomerCount = 0;
  133. int technologyCustomerCount = 0;
  134. int qualityCustomerCount = 0;
  135. for (Map data : dataList) {
  136. Map formData = (Map) data.get("formData");
  137. String project = formData.get("selectField_lwragwwz").toString();//项目
  138. switch (project) {
  139. case "交付":businessCustomerCount++;break;
  140. case "技术":technologyCustomerCount++;break;
  141. case "质量":qualityCustomerCount++;break;
  142. }
  143. }
  144. Map<String,Integer> result = new HashMap<>();
  145. result.put("businessCustomerCount",businessCustomerCount);
  146. result.put("technologyCustomerCount",technologyCustomerCount);
  147. result.put("qualityCustomerCount",qualityCustomerCount);
  148. return McR.success(result);
  149. }
  150. @Override
  151. public McR addCustomer(Map map) {
  152. if (Objects.isNull(map.get("formInstId"))){
  153. return McR.errorParam("formInstId不能为空");
  154. }
  155. String formInstId = map.get("formInstId").toString();
  156. Map formData = ydClient.queryData(YDParam.builder().formInstId(formInstId).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  157. Map<String,Object> body = new HashMap<>();
  158. body.put("customerCode", formData.get("textField_lwpqbm7a").toString());
  159. body.put("customerName", formData.get("textField_lwpqbm7b").toString());
  160. String recCondition = formData.get("selectField_lwpqbm7r").toString();
  161. switch (recCondition){
  162. case "货到收款": body.put("recConditionCode", "SKTJ01_SYS");break;
  163. case "30天后收款":body.put("recConditionCode", "SKTJ02_SYS");break;
  164. case "月结30天":body.put("recConditionCode", "SKTJ03_SYS");break;
  165. case "多到期日(按金额)":body.put("recConditionCode", "SKTJ04_SYS");break;
  166. }
  167. String payCurrency = formData.get("selectField_lwpqbm7s").toString();
  168. switch (payCurrency){
  169. case "人民币": body.put("payCurrencyCode", "PRE001");break;
  170. case "香港元":body.put("payCurrencyCode", "PRE002");break;
  171. case "欧元":body.put("payCurrencyCode", "PRE003");break;
  172. case "日本日元":body.put("payCurrencyCode", "PRE004");break;
  173. case "新台币元":body.put("payCurrencyCode", "PRE005");break;
  174. case "英镑":body.put("payCurrencyCode", "PRE006");break;
  175. case "美元":body.put("payCurrencyCode", "PRE007");break;
  176. }
  177. //客户简称
  178. if (Objects.nonNull(formData.get("textField_lwpqbm7c"))){
  179. body.put("customerShortName", formData.get("textField_lwpqbm7c").toString());
  180. }
  181. //客户英文名
  182. if (Objects.nonNull(formData.get("textField_lwpqbm7d"))){
  183. body.put("customerEnglishName", formData.get("textField_lwpqbm7d").toString());
  184. }
  185. //地址
  186. if (Objects.nonNull(formData.get("textField_lwpqbm7t"))){
  187. body.put("address", formData.get("textField_lwpqbm7t").toString());
  188. }
  189. //联系人
  190. if (Objects.nonNull(formData.get("textField_lwpqbm7u"))){
  191. body.put("linkMan", formData.get("textField_lwpqbm7u").toString());
  192. }
  193. //联系电话
  194. if (Objects.nonNull(formData.get("textField_lwpqbm7v"))){
  195. body.put("linkNumber", formData.get("textField_lwpqbm7v").toString());
  196. }
  197. //内/外销
  198. if (Objects.nonNull(formData.get("selectField_lwpqbm82"))){
  199. String makCustomerType = formData.get("selectField_lwpqbm82").toString();
  200. switch (makCustomerType){
  201. case "001": body.put("makCustomerType", "001");break;
  202. case "002":body.put("makCustomerType", "002");break;
  203. }
  204. }
  205. //备注
  206. if (Objects.nonNull(formData.get("textareaField_lwpqbm7x"))){
  207. body.put("comments", formData.get("textareaField_lwpqbm7x").toString());
  208. }
  209. Map<String, Object> result = post(erpUrl + "pws/mak/makCustomer/add", null, getHeader(), body);
  210. if ((boolean) result.get("success")){
  211. return McR.success();
  212. }else {
  213. return McR.errorUnknown(result.get("message").toString());
  214. }
  215. }
  216. @Override
  217. public McR updateCustomer(Map map) {
  218. if (Objects.isNull(map.get("formInstId"))){
  219. return McR.errorParam("formInstId不能为空");
  220. }
  221. String formInstId = map.get("formInstId").toString();
  222. Map formData = ydClient.queryData(YDParam.builder().formInstId(formInstId).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  223. Map<String,Object> body = new HashMap<>();
  224. body.put("customerCode", formData.get("textField_lwpqbm7a").toString());
  225. body.put("customerName", formData.get("textField_lwpqbm7b").toString());
  226. String recCondition = formData.get("selectField_lwpqbm7r").toString();
  227. switch (recCondition){
  228. case "货到收款": body.put("recConditionCode", "SKTJ01_SYS");break;
  229. case "30天后收款":body.put("recConditionCode", "SKTJ02_SYS");break;
  230. case "月结30天":body.put("recConditionCode", "SKTJ03_SYS");break;
  231. case "多到期日(按金额)":body.put("recConditionCode", "SKTJ04_SYS");break;
  232. }
  233. String payCurrency = formData.get("selectField_lwpqbm7s").toString();
  234. switch (payCurrency){
  235. case "人民币": body.put("payCurrencyCode", "PRE001");break;
  236. case "香港元":body.put("payCurrencyCode", "PRE002");break;
  237. case "欧元":body.put("payCurrencyCode", "PRE003");break;
  238. case "日本日元":body.put("payCurrencyCode", "PRE004");break;
  239. case "新台币元":body.put("payCurrencyCode", "PRE005");break;
  240. case "英镑":body.put("payCurrencyCode", "PRE006");break;
  241. case "美元":body.put("payCurrencyCode", "PRE007");break;
  242. }
  243. //客户简称
  244. if (Objects.nonNull(formData.get("textField_lwpqbm7c"))){
  245. body.put("customerShortName", formData.get("textField_lwpqbm7c").toString());
  246. }
  247. //客户英文名
  248. if (Objects.nonNull(formData.get("textField_lwpqbm7d"))){
  249. body.put("customerEnglishName", formData.get("textField_lwpqbm7d").toString());
  250. }
  251. //地址
  252. if (Objects.nonNull(formData.get("textField_lwpqbm7t"))){
  253. body.put("address", formData.get("textField_lwpqbm7t").toString());
  254. }
  255. //联系人
  256. if (Objects.nonNull(formData.get("textField_lwpqbm7u"))){
  257. body.put("linkMan", formData.get("textField_lwpqbm7u").toString());
  258. }
  259. //联系电话
  260. if (Objects.nonNull(formData.get("textField_lwpqbm7v"))){
  261. body.put("linkNumber", formData.get("textField_lwpqbm7v").toString());
  262. }
  263. //内/外销
  264. if (Objects.nonNull(formData.get("selectField_lwpqbm82"))){
  265. String makCustomerType = formData.get("selectField_lwpqbm82").toString();
  266. switch (makCustomerType){
  267. case "001": body.put("makCustomerType", "001");break;
  268. case "002":body.put("makCustomerType", "002");break;
  269. }
  270. }
  271. //备注
  272. if (Objects.nonNull(formData.get("textareaField_lwpqbm7x"))){
  273. body.put("comments", formData.get("textareaField_lwpqbm7x").toString());
  274. }
  275. Map<String, Object> result = put(erpUrl + "pws/mak/makCustomer/customEdit", null, getHeader(), body);
  276. if ((boolean) result.get("success")){
  277. return McR.success();
  278. }else {
  279. return McR.errorUnknown(result.get("message").toString());
  280. }
  281. }
  282. @Override
  283. public McR getProductDeliveryStatus(String keyword,int pageNo,int pageSize) {
  284. Map<String,Object> param = new HashMap<>();
  285. param.put("pageNo",pageNo);
  286. param.put("pageSize",pageSize);
  287. param.put("saleCode",keyword);
  288. Map<String,Object> res = get(erpUrl + "pws/pdm/pdmProductForm/list", param, getHeader());
  289. Map result = (Map) res.get("result");
  290. List<Map> data = (List<Map>) result.get("records");
  291. if (data.isEmpty()){
  292. param.remove("saleCode");
  293. param.put("saleName",keyword);
  294. res = get(erpUrl + "pws/pdm/pdmProductForm/list", param, getHeader());
  295. result = (Map) res.get("result");
  296. data = (List<Map>) result.get("records");
  297. }
  298. int totalCount = (int) result.get("total");
  299. int currentPage = (int) result.get("current");
  300. Map map = new HashMap();
  301. map.put("data",data);
  302. map.put("totalCount",totalCount);
  303. map.put("currentPage",currentPage);
  304. return McR.success(map);
  305. }
  306. @Override
  307. public McR getProcess(int pageNo,int pageSize) {
  308. Map param = new HashMap();
  309. param.put("active","D2_SUCCESS");
  310. param.put("pageNo",pageNo);
  311. param.put("pageSize",pageSize);
  312. Map<String, Object> res = get(erpUrl + "pws/pdm/pdmStation/list", param, getHeader());
  313. Map result = (Map) res.get("result");
  314. List<Map> data = (List<Map>) result.get("records");
  315. int totalCount = (int) result.get("total");
  316. int currentPage = (int) result.get("current");
  317. Map map = new HashMap();
  318. map.put("data",data);
  319. map.put("totalCount",totalCount);
  320. map.put("currentPage",currentPage);
  321. return McR.success(map);
  322. }
  323. @Override
  324. public McR getTaxRate() {
  325. Map param = new HashMap();
  326. param.put("pageNo",1);
  327. param.put("pageSize",50);
  328. Map<String, Object> res = get(erpUrl + "pws/fin/finTax/list", param, getHeader());
  329. Map result = (Map) res.get("result");
  330. List<Map> records = (List<Map>) result.get("records");
  331. List<String> list = records.stream().map(map1 -> map1.get("taxName").toString()).collect(Collectors.toList());
  332. return McR.success(list);
  333. }
  334. @Override
  335. public McR addSaleOrder(Map map) {
  336. if (Objects.isNull(map.get("formInstId"))){
  337. McR.errorParam("formInstId不能为空");
  338. }
  339. String formInstId = map.get("formInstId").toString();
  340. Map formData = ydClient.queryData(YDParam.builder().formInstId(formInstId)
  341. .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  342. //新增销售订单
  343. Map body = new HashMap();
  344. body.put("customerCode",getString(formData.get("textField_ly5m36nw")));//客户编码
  345. String priority = getString(formData.get("selectField_lwpsp162"));//紧急级别
  346. switch (priority) {
  347. case "普通": body.put("priority", "D1_NORMAL "); break;
  348. case "紧急": body.put("priority", "D2_URGENT"); break;
  349. case "特紧急": body.put("priority", "D3_VERY_URGENT"); break;
  350. }
  351. String soType = getString(formData.get("selectField_lx2xj36n"));//订单类型
  352. switch (soType) {
  353. case "销售订单": body.put("soType", "D1_SALES_ORDER"); break;
  354. case "预测订单": body.put("soType", "D2_FORECAST_ORDER"); break;
  355. }
  356. body.put("deliveryDate",getString(formData.get("textField_m0aduyx1")));//希望交期
  357. body.put("salesperson",getString(formData.get("textField_m0aduyx9")));//销售员
  358. body.put("payCurrencyCode",getString(formData.get("textField_m0aduyxa")));//币别
  359. body.put("ioDate",getString(formData.get("textField_m0aduyx2")));//单据日期
  360. body.put("comments",getString(formData.get("textareaField_lwpsp16e")));//备注
  361. //销售订单明细
  362. List<Map> list = (List<Map>) formData.get("tableField_lwpsp16f");
  363. List<Map> makSoDetailList = list.stream().map(map1 -> {
  364. Map detail = new HashMap();
  365. detail.put("productFormId",getString(map1.get("textField_m03o1x0m")));//交付状态id
  366. detail.put("saleCode",getString(map1.get("textField_lwpsp16g")));//交付名称
  367. detail.put("saleName",getString(map1.get("textField_lwpsp16h")));//交付说明
  368. detail.put("customerModel",getString(map1.get("textField_lwpsp16i")));//客户型号
  369. detail.put("partnumber",getString(map1.get("textField_lwpsp16k")));//物料编码
  370. detail.put("partname",getString(map1.get("textField_lwpsp16m")));//物料名称
  371. detail.put("pmodel",getString(map1.get("textField_lwpsp16o")));//物料型号
  372. detail.put("pstandard",getString(map1.get("textField_lwpsp16q")));//物料规格
  373. detail.put("stationCode",getString(map1.get("textField_m053iuol")));//工序编码
  374. detail.put("waferQty",getString(map1.get("numberField_lwpsp16t")));//片数
  375. detail.put("qty",getString(map1.get("numberField_lwpsp16v")));//数量
  376. detail.put("quotation",getString(map1.get("numberField_lwpsp172")));//未税单价
  377. detail.put("subTotal",getString(map1.get("numberField_lwpz9exp")));//未税总价
  378. detail.put("taxRate",getString(map1.get("numberField_m053iuom")));//税率
  379. detail.put("taxQuotation",getString(map1.get("numberField_lwpsp175")));//含税单价
  380. detail.put("taxSubtotal",getString(map1.get("numberField_lwpsp177")));//含税总价
  381. detail.put("die_model","");//
  382. return detail;
  383. }).collect(Collectors.toList());
  384. //附件
  385. List<Map> list2 = (List<Map>) formData.get("tableField_ly8fxusx");
  386. List<Map> makSoFilesList = list2.stream().map(map1 -> {
  387. Map detail = new HashMap();
  388. String fileType = getString(map1.get("selectField_m0ls7yb8"));
  389. if (fileType.equals("合同")){
  390. detail.put("fileType","D1_CONTRACT");
  391. }else {
  392. detail.put("fileType","D2_TECHNICAL_DOC");
  393. }
  394. List<Map> fileList = (List<Map>) JSONArray.parse(String.valueOf(map1.get("attachmentField_ly8fxusz")));
  395. String ydDownloadUrl = fileList.get(0).get("downloadUrl").toString();
  396. String fileName = fileList.get(0).get("name").toString();
  397. //将downloadurl下载到本地
  398. try {
  399. downloadFile(ydDownloadUrl, filePath + fileName);
  400. System.out.println("文件下载成功!");
  401. } catch (IOException e) {
  402. e.printStackTrace();
  403. }
  404. //上传附件
  405. detail.put("files",postWithFile(erpUrl + "pws/sys/common/upload",filePath + fileName));
  406. return detail;
  407. }).collect(Collectors.toList());
  408. body.put("makSoDetailList",makSoDetailList);
  409. body.put("makSoFilesList",makSoFilesList);
  410. Map res = post(erpUrl + "pws/mak/makSalesOrder/add", null, getHeader(), body);
  411. String orderCode = getString(res.get("result"));
  412. //更新宜搭订单编号
  413. ydClient.operateData(YDParam.builder()
  414. .formInstId(formInstId)
  415. .updateFormDataJson(JSON.toJSONString(UtilMap.map("textField_m0alsjj1",orderCode)))
  416. .build(),YDConf.FORM_OPERATION.update);
  417. return McR.success();
  418. }
  419. public void downloadFile(String fileURL, String savePath) throws IOException {
  420. //若是宜搭附件url 则需获得附件临时免登地址
  421. Map<String,Object> param = new HashMap<>();
  422. param.put("systemToken",ydConf.getSystemToken());
  423. param.put("userId","344749020127590108");//wzy
  424. param.put("fileUrl",fileURL);
  425. fileURL = ((DDR_New) UtilHttp.doGet("https://api.dingtalk.com/v1.0/yida/apps/temporaryUrls/" + ydConf.getAppType(), ddClient.initTokenHeader(), param, DDR_New.class)).getResult().toString();
  426. URL url = new URL(fileURL);
  427. HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
  428. int responseCode = httpConn.getResponseCode();
  429. // 检查HTTP响应代码是否为200
  430. if (responseCode == HttpURLConnection.HTTP_OK) {
  431. InputStream inputStream = httpConn.getInputStream();
  432. FileOutputStream outputStream = new FileOutputStream(savePath);
  433. byte[] buffer = new byte[4096];
  434. int bytesRead = -1;
  435. while ((bytesRead = inputStream.read(buffer)) != -1) {
  436. outputStream.write(buffer, 0, bytesRead);
  437. }
  438. outputStream.close();
  439. inputStream.close();
  440. } else {
  441. System.out.println("无法下载文件。HTTP响应代码: " + responseCode);
  442. }
  443. httpConn.disconnect();
  444. }
  445. @Override
  446. public McR updateSaleOrder(Map map) {
  447. if (Objects.isNull(map.get("formInstId"))){
  448. McR.errorParam("formInstId不能为空");
  449. }
  450. String formInstId = map.get("formInstId").toString();
  451. Map formData = ydClient.queryData(YDParam.builder().formInstId(formInstId)
  452. .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  453. //更新销售订单
  454. Map body = new HashMap();
  455. body.put("soCode",getString(formData.get("textField_m0alsjj1")));
  456. body.put("customerCode",getString(formData.get("textField_ly5m36nw")));//客户编码
  457. String priority = getString(formData.get("selectField_lwpsp162"));//紧急级别
  458. switch (priority) {
  459. case "普通": body.put("priority", "D1_NORMAL "); break;
  460. case "紧急": body.put("priority", "D2_URGENT"); break;
  461. case "特紧急": body.put("priority", "D3_VERY_URGENT"); break;
  462. }
  463. String soType = getString(formData.get("selectField_lx2xj36n"));//订单类型
  464. switch (soType) {
  465. case "销售订单": body.put("soType", "D1_SALES_ORDER"); break;
  466. case "预测订单": body.put("soType", "D2_FORECAST_ORDER"); break;
  467. }
  468. body.put("deliveryDate",getString(formData.get("textField_m0aduyx1")));//希望交期
  469. body.put("salesperson",getString(formData.get("textField_m0aduyx9")));//销售员
  470. body.put("payCurrencyCode",getString(formData.get("textField_m0aduyxa")));//币别
  471. body.put("ioDate",getString(formData.get("textField_m0aduyx2")));//单据日期
  472. body.put("comments",getString(formData.get("textareaField_lwpsp16e")));//备注
  473. //销售订单明细
  474. List<Map> list = (List<Map>) formData.get("tableField_lwpsp16f");
  475. List<Map> makSoDetailList = list.stream().map(map1 -> {
  476. Map detail = new HashMap();
  477. detail.put("productFormId",getString(map1.get("textField_m03o1x0m")));//交付状态id
  478. detail.put("saleCode",getString(map1.get("textField_lwpsp16g")));//交付名称
  479. detail.put("saleName",getString(map1.get("textField_lwpsp16h")));//交付说明
  480. detail.put("customerModel",getString(map1.get("textField_lwpsp16i")));//客户型号
  481. detail.put("partnumber",getString(map1.get("textField_lwpsp16k")));//物料编码
  482. detail.put("partname",getString(map1.get("textField_lwpsp16m")));//物料名称
  483. detail.put("pmodel",getString(map1.get("textField_lwpsp16o")));//物料型号
  484. detail.put("pstandard",getString(map1.get("textField_lwpsp16q")));//物料规格
  485. detail.put("stationCode",getString(map1.get("textField_m053iuol")));//工序编码
  486. detail.put("waferQty",getString(map1.get("numberField_lwpsp16t")));//片数
  487. detail.put("qty",getString(map1.get("numberField_lwpsp16v")));//数量
  488. detail.put("quotation",getString(map1.get("numberField_lwpsp172")));//未税单价
  489. detail.put("subTotal",getString(map1.get("numberField_lwpz9exp")));//未税总价
  490. detail.put("taxRate",getString(map1.get("numberField_m053iuom")));//税率
  491. detail.put("taxQuotation",getString(map1.get("numberField_lwpsp175")));//含税单价
  492. detail.put("taxSubtotal",getString(map1.get("numberField_lwpsp177")));//含税总价
  493. detail.put("die_model","");//
  494. return detail;
  495. }).collect(Collectors.toList());
  496. //附件
  497. List<Map> list2 = (List<Map>) formData.get("tableField_ly8fxusx");
  498. List<Map> makSoFilesList = list2.stream().map(map1 -> {
  499. Map detail = new HashMap();
  500. String fileType = getString(map1.get("selectField_m0ls7yb8"));
  501. if (fileType.equals("合同")){
  502. detail.put("fileType","D1_CONTRACT");
  503. }else {
  504. detail.put("fileType","D2_TECHNICAL_DOC");
  505. }
  506. List<Map> fileList = (List<Map>) JSONArray.parse(String.valueOf(map1.get("attachmentField_ly8fxusz")));
  507. String ydDownloadUrl = fileList.get(0).get("downloadUrl").toString();
  508. String fileName = fileList.get(0).get("name").toString();
  509. //将downloadurl下载到本地
  510. try {
  511. downloadFile(ydDownloadUrl, filePath + fileName);
  512. System.out.println("文件下载成功!");
  513. } catch (IOException e) {
  514. e.printStackTrace();
  515. }
  516. //上传附件
  517. detail.put("files",postWithFile(erpUrl + "pws/sys/common/upload",filePath + fileName));
  518. return detail;
  519. }).collect(Collectors.toList());
  520. body.put("makSoDetailList",makSoDetailList);
  521. body.put("makSoFilesList",makSoFilesList);
  522. Map res = put(erpUrl + "pws/mak/makSalesOrder/change", null, getHeader(), body);
  523. return McR.success();
  524. }
  525. private String getString(Object object){
  526. return (object == null) ? "" : object.toString();
  527. }
  528. private Map<String,String> getHeader(){
  529. Map<String, Object> map = post(erpUrl + "pws/sys/mLogin", null, null,UtilMap.map("username, password",userName,password));
  530. if (Objects.nonNull(map.get("result"))){
  531. Map<String,Object> result = (Map<String,Object>) map.get("result");
  532. if (Objects.nonNull(result.get("token"))){
  533. Map<String, String> header = new HashMap<>();
  534. header.put("X-Access-Token", result.get("token").toString());
  535. return header;
  536. }
  537. }
  538. return null;
  539. }
  540. /**
  541. * 封装GET请求
  542. *
  543. * @param url 请求的URL
  544. * @param params 请求参数
  545. * @param headers 请求头
  546. * @return 响应内容
  547. */
  548. public static Map<String, Object> get(String url, Map<String, Object> params, Map<String, String> headers) {
  549. log.info("GET 请求url:{}, 请求参数:{}, 请求头:{}", url, params, headers);
  550. HttpRequest get = HttpUtil.createGet(url);
  551. if (params!= null){
  552. get.form(params);
  553. }
  554. if (headers!= null){
  555. get.addHeaders(headers);
  556. }
  557. HttpResponse response = get.execute();
  558. Map<String, Object> result = null;
  559. try {
  560. ObjectMapper objectMapper = new ObjectMapper();
  561. result = objectMapper.readValue(response.body(), new TypeReference<Map<String, Object>>() {});
  562. } catch (JsonProcessingException e) {
  563. throw new RuntimeException(e);
  564. }
  565. log.info("响应结果: {}", result);
  566. return result;
  567. }
  568. /**
  569. * 封装POST请求
  570. *
  571. * @param url 请求的URL
  572. * @param params 请求参数
  573. * @param headers 请求头
  574. * @param body 请求体
  575. * @return 响应内容
  576. */
  577. public static Map<String, Object> post(String url, Map<String, Object> params, Map<String, String> headers, Map<String, Object> body) {
  578. log.info("POST 请求url:{}, 请求参数:{}, 请求头:{}, 请求体:{}", url, params, headers, body);
  579. HttpRequest request = HttpUtil.createPost(url);
  580. if (params != null) {
  581. request.form(params);
  582. }
  583. if (headers != null) {
  584. request.addHeaders(headers);
  585. }
  586. if (body != null) {
  587. request.body(JSONUtil.toJsonStr(body), "application/json");
  588. }
  589. HttpResponse response = request.execute();
  590. // Map<String,Object> result = JSONUtil.toBean(response.body(), Map.class);
  591. Map<String, Object> result = null;
  592. try {
  593. ObjectMapper objectMapper = new ObjectMapper();
  594. result = objectMapper.readValue(response.body(), new TypeReference<Map<String, Object>>() {});
  595. } catch (JsonProcessingException e) {
  596. throw new RuntimeException(e);
  597. }
  598. log.info("响应结果: {}", result);
  599. return result;
  600. }
  601. public static Map<String, Object> put(String url, Map<String, Object> params, Map<String, String> headers, Map<String, Object> body) {
  602. log.info("PUT 请求url:{}, 请求参数:{}, 请求头:{}, 请求体:{}", url, params, headers, body);
  603. HttpRequest request = HttpRequest.put(url);
  604. if (params != null) {
  605. request.form(params);
  606. }
  607. if (headers != null) {
  608. request.addHeaders(headers);
  609. }
  610. if (body != null) {
  611. request.body(JSONUtil.toJsonStr(body), "application/json");
  612. }
  613. HttpResponse response = request.execute();
  614. // Map<String,Object> result = JSONUtil.toBean(response.body(), Map.class);
  615. Map<String, Object> result = null;
  616. try {
  617. ObjectMapper objectMapper = new ObjectMapper();
  618. result = objectMapper.readValue(response.body(), new TypeReference<Map<String, Object>>() {});
  619. } catch (JsonProcessingException e) {
  620. throw new RuntimeException(e);
  621. }
  622. log.info("响应结果: {}", result);
  623. return result;
  624. }
  625. public String postWithFile(String url, String filePath) {
  626. // 文件路径
  627. File file = new File(filePath);
  628. // 创建HttpClient实例
  629. HttpClient client = HttpClients.createDefault();
  630. // 创建HttpPost实例
  631. HttpPost post = new HttpPost(url);
  632. // 添加请求头
  633. post.setHeader("X-Access-Token", getHeader().get("X-Access-Token"));
  634. // 使用MultipartEntityBuilder来构建multipart请求
  635. MultipartEntityBuilder builder = MultipartEntityBuilder.create();
  636. builder.addBinaryBody("file", file, ContentType.DEFAULT_BINARY, file.getName());
  637. // 设置请求体
  638. HttpEntity multipart = builder.build();
  639. post.setEntity(multipart);
  640. try {
  641. // 发送请求并获取响应
  642. org.apache.http.HttpResponse response = client.execute(post);
  643. // 处理响应
  644. // 例如,打印响应状态码
  645. System.out.println(response.getStatusLine().getStatusCode());
  646. HttpEntity entity = response.getEntity();
  647. String fileName = "";
  648. // 判断响应实体是否为null
  649. if (entity != null) {
  650. // 使用EntityUtils读取响应体内容(这里假设是文本类型)
  651. String responseString = EntityUtils.toString(entity, "UTF-8"); // 指定字符集
  652. System.out.println("Response Body: " + responseString);
  653. Map parse = (Map) JSONObject.parse(responseString);
  654. fileName = getString(parse.get("message"));
  655. // 释放响应实体资源(虽然EntityUtils.toString()在某些HttpClient版本中会自动处理)
  656. EntityUtils.consume(entity);
  657. }
  658. return fileName;
  659. } catch (IOException e) {
  660. e.printStackTrace();
  661. }
  662. return null;
  663. }
  664. @Override
  665. public McR getTbStageDetails(String stageName) {
  666. Map<String, Object> result = new HashMap<>();
  667. //查询子任务信息
  668. for (String stage : STAGES.keySet()) {
  669. if (STAGES.get(stage).equals(stageName)){
  670. Map<String,Object> stageDetail = new HashMap<>();
  671. TBR tbr = (TBR) UtilHttp.doGet("https://open.teambition.com/api/v3/task/query", initHeaderToken(), UtilMap.map("parentTaskId", stage), TBR.class);
  672. List<Map<String, Object>> task = (List<Map<String, Object>>) tbr.getResult();
  673. List<Map<String, Object>> list = new ArrayList<>();
  674. for (Map<String,Object> subTask : task) {
  675. Map<String,Object> taskDetail = new HashMap<>();
  676. String content = subTask.get("content").toString();
  677. taskDetail.put("content", content);
  678. taskDetail.put("url", TASK_URL_PREFIX + subTask.get("id"));
  679. //查询子任务状态
  680. String tfsId = subTask.get("tfsId").toString();
  681. TBR tbr3 = (TBR) UtilHttp.doGet("https://open.teambition.com/api/v3/project/65bb53546a74a42e2d608f05/taskflowstatus/search", initHeaderToken(), UtilMap.map("tfsIds",tfsId), TBR.class);
  682. List<Map<String, Object>> result3 = (List<Map<String, Object>>) tbr3.getResult();
  683. String state = result3.get(0).get("name").toString();
  684. taskDetail.put("state", state);
  685. List<Map<String,Object>> customfields = (List<Map<String,Object>>) subTask.get("customfields");
  686. taskDetail.put("dept", "");
  687. taskDetail.put("part", "");
  688. taskDetail.put("area", "");
  689. taskDetail.put("file", "");
  690. taskDetail.put("file2", "");
  691. if (!customfields.isEmpty()){
  692. for (Map<String, Object> customfield : customfields) {
  693. String cfId = customfield.get("cfId").toString();
  694. List<Map<String, Object>> value = (List<Map<String, Object>>) customfield.get("value");
  695. if (!value.isEmpty()){
  696. String title = value.get(0).get("title").toString();
  697. switch (cfId){
  698. case "666feed723d86af4c9c9f3c6":taskDetail.put("dept", title);break;//责任部门/角色
  699. case "666fef0f5b836a19902b47bf":taskDetail.put("part", title);break;//评审要素
  700. case "666fef06cdcac0bbc164930e":taskDetail.put("area", title);break;//评审领域
  701. case "668def21d56d44adafe00d56":taskDetail.put("file", title);break;//交付件
  702. case "668df08b82ff76cefacfec99":taskDetail.put("file2", title);break;//交付件2
  703. }
  704. }
  705. }
  706. }
  707. taskDetail.put("carTag", "");
  708. taskDetail.put("payTag", "");
  709. List<String> tagIds = (List<String>) subTask.get("tagIds");
  710. if (!tagIds.isEmpty()){
  711. for (String tagId : tagIds) {
  712. if (TAGS.containsKey(tagId)) {
  713. if (TAGS.get(tagId).contains("车载")){
  714. taskDetail.put("carTag", TAGS.get(tagId).substring(3,5));
  715. }else if (TAGS.get(tagId).contains("消费")){
  716. taskDetail.put("payTag", TAGS.get(tagId).substring(3,5));
  717. }
  718. }
  719. }
  720. }
  721. list.add(taskDetail);
  722. }
  723. //获取任务状态
  724. TBR tbr2 = (TBR) UtilHttp.doGet("https://open.teambition.com/api/v3/task/query", initHeaderToken(), UtilMap.map("taskId", stage), TBR.class);
  725. List<Map<String, Object>> result2 = (List<Map<String, Object>>) tbr2.getResult();
  726. String tfsId = result2.get(0).get("tfsId").toString();
  727. TBR tbr3 = (TBR) UtilHttp.doGet("https://open.teambition.com/api/v3/project/65bb53546a74a42e2d608f05/taskflowstatus/search", initHeaderToken(), UtilMap.map("tfsIds", tfsId), TBR.class);
  728. List<Map<String, Object>> result3 = (List<Map<String, Object>>) tbr3.getResult();
  729. String state = result3.get(0).get("name").toString();
  730. stageDetail.put("list",list);
  731. stageDetail.put("state", state);
  732. result.put(STAGES.get(stage), stageDetail);
  733. }
  734. }
  735. return McR.success(result);
  736. }
  737. private Map<String, String> initHeaderToken() {
  738. Map header = new HashMap();
  739. header.put("Authorization", this.getAccessToken());
  740. header.put("X-Tenant-Id", this.tbConf.getTenantId());
  741. header.put("X-Tenant-Type", "organization");
  742. return header;
  743. }
  744. private String getAccessToken() {
  745. synchronized(this.$lock) {
  746. String accessToken = UtilToken.get("invalid-token-teambition");
  747. if (StringUtils.isNotBlank(accessToken)) {
  748. return accessToken;
  749. } else {
  750. Algorithm algorithm = Algorithm.HMAC256(this.tbConf.getAppSecret());
  751. long timestamp = System.currentTimeMillis();
  752. Date issuedAt = new Date(timestamp);
  753. Date expiresAt = new Date(timestamp + EXPIRES_IN);
  754. accessToken = JWT.create().withClaim("_appId", this.tbConf.getAppID()).withIssuedAt(issuedAt).withExpiresAt(expiresAt).sign(algorithm);
  755. log.info("响应token, {}", accessToken);
  756. UtilToken.put("invalid-token-teambition", accessToken, EXPIRES_IN);
  757. return accessToken;
  758. }
  759. }
  760. }
  761. }