LingmingguangziServiceImpl.java 81 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810
  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.google.common.base.Strings;
  16. import com.malk.lingmingguangzi.utils.SkipHttpsUtil;
  17. import com.malk.server.aliwork.YDConf;
  18. import com.malk.server.aliwork.YDParam;
  19. import com.malk.server.common.McR;
  20. import com.malk.server.dingtalk.DDR_New;
  21. import com.malk.server.teambition.TBConf;
  22. import com.malk.service.aliwork.YDClient;
  23. import com.malk.service.aliwork.YDService;
  24. import com.malk.service.dingtalk.DDClient;
  25. import com.malk.utils.UtilHttp;
  26. import com.malk.utils.UtilMap;
  27. import com.malk.utils.UtilToken;
  28. import lombok.extern.slf4j.Slf4j;
  29. import org.apache.commons.codec.digest.DigestUtils;
  30. import org.apache.commons.lang3.StringEscapeUtils;
  31. import org.apache.commons.lang3.StringUtils;
  32. import org.apache.commons.lang3.time.DateUtils;
  33. import org.apache.http.HttpEntity;
  34. import org.apache.http.client.HttpClient;
  35. import org.apache.http.client.methods.HttpPost;
  36. import org.apache.http.entity.ContentType;
  37. import org.apache.http.entity.mime.MultipartEntityBuilder;
  38. import org.apache.http.util.EntityUtils;
  39. import org.springframework.beans.factory.annotation.Autowired;
  40. import org.springframework.beans.factory.annotation.Value;
  41. import org.springframework.stereotype.Service;
  42. import java.io.*;
  43. import java.net.HttpURLConnection;
  44. import java.net.URL;
  45. import java.nio.charset.StandardCharsets;
  46. import java.util.*;
  47. import java.util.regex.Matcher;
  48. import java.util.regex.Pattern;
  49. import java.util.stream.Collectors;
  50. @Service
  51. @Slf4j
  52. public class LingmingguangziServiceImpl implements LingmingguangziService {
  53. @Autowired
  54. private YDClient ydClient;
  55. @Autowired
  56. private YDConf ydConf;
  57. @Autowired
  58. private TBConf tbConf;
  59. @Autowired
  60. private DDClient ddClient;
  61. @Autowired
  62. private YDService ydService;
  63. @Value(value = "${teambition.TemplateId}")
  64. private String templateId;
  65. @Value(value = "${erp_sz.url}")
  66. private String erpUrlSz;
  67. @Value(value = "${erp_sz.username}")
  68. private String userNameSz;
  69. @Value(value = "${erp_sz.password}")
  70. private String passwordSz;
  71. @Value(value = "${erp_sz.filePath}")
  72. private String filePathSz;
  73. @Value(value = "${erp_xg.url}")
  74. private String erpUrlXg;
  75. @Value(value = "${erp_xg.username}")
  76. private String userNameXg;
  77. @Value(value = "${erp_xg.password}")
  78. private String passwordXg;
  79. @Value(value = "${erp_xg.filePath}")
  80. private String filePathXg;
  81. @Value(value = "${erp_zj.url}")
  82. private String erpUrlZj;
  83. @Value(value = "${erp_zj.username}")
  84. private String userNameZj;
  85. @Value(value = "${erp_zj.password}")
  86. private String passwordZj;
  87. @Value(value = "${erp_zj.filePath}")
  88. private String filePathZj;
  89. @Value(value = "${erp_hz.url}")
  90. private String erpUrlHz;
  91. @Value(value = "${erp_hz.username}")
  92. private String userNameHz;
  93. @Value(value = "${erp_hz.password}")
  94. private String passwordHz;
  95. @Value(value = "${erp_hz.filePath}")
  96. private String filePathHz;
  97. private final Object $lock = new Object[0];
  98. private static final Long EXPIRES_IN = 7200000L;
  99. private static final String TASK_URL_PREFIX = "https://www.teambition.com/task/";
  100. private static final List<String> STAGES = new ArrayList<>();
  101. static {
  102. STAGES.add("TR/TO阶段");
  103. STAGES.add("EV产品开发验证");
  104. STAGES.add("DV过程开发验证");
  105. STAGES.add("PV量产爬坡验证");
  106. STAGES.add("MP大批量生产");
  107. }
  108. @Override
  109. public McR test() {
  110. log.info("test");
  111. Map map = new HashMap();
  112. String aaa = map.get("aaa").toString();
  113. return McR.success();
  114. }
  115. @Override
  116. public McR getCustomerQuestionnaireCount(Long start, Long end) {
  117. YDParam.YDParamBuilder ydParamBuilder = YDParam.builder()
  118. .formUuid("FORM-5CC9748D283C49FC8C8A86EE0529730A4I1D");
  119. if (start != null && end != null){
  120. String startDate = DateUtil.format(new Date(start), "yyyy-MM-dd HH:mm:ss");
  121. String endDate = DateUtil.format(DateUtil.offsetDay(new Date(end),1), "yyyy-MM-dd HH:mm:ss");
  122. ydParamBuilder.createFromTimeGMT(startDate);
  123. ydParamBuilder.createToTimeGMT(endDate);
  124. }
  125. //车载--------------------------------------------
  126. DDR_New ddrNew = ydClient.queryData(ydParamBuilder.build(), YDConf.FORM_QUERY.retrieve_list);
  127. List<Map> dataList = (List<Map>) ddrNew.getData();
  128. int importantCustomerCount = 0;
  129. int orderCustomerCount = 0;
  130. int strategicCustomerCount = 0;
  131. for (Map data : dataList) {
  132. Map formData = (Map) data.get("formData");
  133. String customerLevel = String.valueOf(formData.get("selectField_lx4g7em6"));
  134. switch (customerLevel){
  135. case "重要客户": importantCustomerCount++; break;
  136. case "普通客户": orderCustomerCount++; break;
  137. case "战略客户": strategicCustomerCount++; break;
  138. }
  139. }
  140. Map<String,Integer> result = new HashMap<>();
  141. result.put("importantCustomerCount", importantCustomerCount);
  142. result.put("orderCustomerCount", orderCustomerCount);
  143. result.put("strategicCustomerCount", strategicCustomerCount);
  144. return McR.success(result);
  145. }
  146. @Override
  147. public McR getCustomerQuestionnaireCount2(Long start, Long end) {
  148. YDParam.YDParamBuilder ydParamBuilder = YDParam.builder()
  149. .formUuid("FORM-D4587ABF101246F6B17635C8CB178B6BGTAW");
  150. if (start != null && end != null){
  151. String startDate = DateUtil.format(new Date(start), "yyyy-MM-dd HH:mm:ss");
  152. String endDate = DateUtil.format(DateUtil.offsetDay(new Date(end),1), "yyyy-MM-dd HH:mm:ss");
  153. ydParamBuilder.createFromTimeGMT(startDate);
  154. ydParamBuilder.createToTimeGMT(endDate);
  155. }
  156. //商务端
  157. DDR_New ddrNew = ydClient.queryData(ydParamBuilder.build(), YDConf.FORM_QUERY.retrieve_list);
  158. List<Map> dataList = (List<Map>) ddrNew.getData();
  159. int businessCustomerCount = 0;
  160. int technologyCustomerCount = 0;
  161. int qualityCustomerCount = 0;
  162. for (Map data : dataList) {
  163. Map formData = (Map) data.get("formData");
  164. String project = formData.get("selectField_lwragwwz").toString();//项目
  165. switch (project) {
  166. case "交付":businessCustomerCount++;break;
  167. case "技术":technologyCustomerCount++;break;
  168. case "质量":qualityCustomerCount++;break;
  169. }
  170. }
  171. Map<String,Integer> result = new HashMap<>();
  172. result.put("businessCustomerCount",businessCustomerCount);
  173. result.put("technologyCustomerCount",technologyCustomerCount);
  174. result.put("qualityCustomerCount",qualityCustomerCount);
  175. return McR.success(result);
  176. }
  177. @Override
  178. public McR addCustomer(Map map) {
  179. if (Objects.isNull(map.get("formInstId"))){
  180. return McR.errorParam("formInstId不能为空");
  181. }
  182. String formInstId = map.get("formInstId").toString();
  183. DDR_New ddrNew = ydClient.queryData(YDParam.builder().formInstId(formInstId).build(), YDConf.FORM_QUERY.retrieve_id);
  184. Map formData = ddrNew.getFormData();
  185. Map<String,Object> body = new HashMap<>();
  186. //查询erp账号
  187. Map originator = ddrNew.getOriginator();
  188. String userId = originator.get("userId").toString();
  189. List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
  190. .formUuid("FORM-65789BACB6F64B2C880875260026A6EACTOB")
  191. .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_m0ypgxec", userId)))
  192. .build(), YDConf.FORM_QUERY.retrieve_list).getData();
  193. if (!data.isEmpty()){
  194. Map formData2 = (Map) data.get(0).get("formData");
  195. body.put("createBy", formData2.get("textField_m0ypgxeb").toString());
  196. }
  197. body.put("customerCode", formData.get("textField_lwpqbm7a").toString());
  198. body.put("customerName", formData.get("textField_lwpqbm7b").toString());
  199. body.put("recConditionCode", formData.get("textField_m3o22635").toString());
  200. body.put("payCurrencyCode", formData.get("textField_m0yq620t").toString());
  201. //客户简称
  202. if (Objects.nonNull(formData.get("textField_lwpqbm7c"))){
  203. body.put("customerShortName", formData.get("textField_lwpqbm7c").toString());
  204. }
  205. //客户英文名
  206. if (Objects.nonNull(formData.get("textField_lwpqbm7d"))){
  207. body.put("customerEnglishName", formData.get("textField_lwpqbm7d").toString());
  208. }
  209. //地址
  210. if (Objects.nonNull(formData.get("textField_lwpqbm7t"))){
  211. body.put("address", formData.get("textField_lwpqbm7t").toString());
  212. }
  213. //联系人
  214. if (Objects.nonNull(formData.get("textField_lwpqbm7u"))){
  215. body.put("linkMan", formData.get("textField_lwpqbm7u").toString());
  216. }
  217. //联系电话
  218. if (Objects.nonNull(formData.get("textField_lwpqbm7v"))){
  219. body.put("linkNumber", formData.get("textField_lwpqbm7v").toString());
  220. }
  221. //内/外销
  222. if (Objects.nonNull(formData.get("selectField_lwpqbm82"))){
  223. String makCustomerType = formData.get("selectField_lwpqbm82").toString();
  224. switch (makCustomerType){
  225. case "内销": body.put("makCustomerType", "001");break;
  226. case "外销":body.put("makCustomerType", "002");break;
  227. }
  228. }
  229. //备注
  230. if (Objects.nonNull(formData.get("textareaField_lwpqbm7x"))){
  231. body.put("comments", formData.get("textareaField_lwpqbm7x").toString());
  232. }
  233. //erp环境
  234. String type = formData.get("selectField_m3fgkfz9").toString();
  235. String erpUrl = getErpUrl(type);
  236. Map<String, Object> result = post(erpUrl + "pws/mak/makCustomer/add", null, getHeader(type), body);
  237. if ((boolean) result.get("success")){
  238. return McR.success();
  239. }else {
  240. return McR.errorUnknown(result.get("message").toString());
  241. }
  242. }
  243. private String getErpUrl(String type) {
  244. String erpUrl = "";
  245. if ("深圳".equals(type)){
  246. erpUrl = erpUrlSz;
  247. }else if ("香港".equals(type)){
  248. erpUrl = erpUrlXg;
  249. }else if ("浙江".equals(type)){
  250. erpUrl = erpUrlZj;
  251. }else if ("杭州".equals(type)){
  252. erpUrl = erpUrlHz;
  253. }
  254. return erpUrl;
  255. }
  256. @Override
  257. public McR updateCustomer(Map map) {
  258. if (Objects.isNull(map.get("formInstId"))){
  259. return McR.errorParam("formInstId不能为空");
  260. }
  261. String formInstId = map.get("formInstId").toString();
  262. DDR_New ddrNew = ydClient.queryData(YDParam.builder().formInstId(formInstId).build(), YDConf.FORM_QUERY.retrieve_id);
  263. Map formData = ddrNew.getFormData();
  264. Map<String,Object> body = new HashMap<>();
  265. //查询erp账号
  266. Map originator = ddrNew.getOriginator();
  267. String userId = originator.get("userId").toString();
  268. List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
  269. .formUuid("FORM-65789BACB6F64B2C880875260026A6EACTOB")
  270. .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_m0ypgxec", userId)))
  271. .build(), YDConf.FORM_QUERY.retrieve_list).getData();
  272. if (!data.isEmpty()){
  273. Map formData2 = (Map) data.get(0).get("formData");
  274. body.put("updateBy", formData2.get("textField_m0ypgxeb").toString());
  275. }
  276. body.put("customerCode", formData.get("textField_lwpqbm7a").toString());
  277. body.put("customerName", formData.get("textField_lwpqbm7b").toString());
  278. body.put("recConditionCode", formData.get("textField_m3o22635").toString());
  279. body.put("payCurrencyCode", formData.get("textField_m0yq620t").toString());
  280. //客户简称
  281. if (Objects.nonNull(formData.get("textField_lwpqbm7c"))){
  282. body.put("customerShortName", formData.get("textField_lwpqbm7c").toString());
  283. }
  284. //客户英文名
  285. if (Objects.nonNull(formData.get("textField_lwpqbm7d"))){
  286. body.put("customerEnglishName", formData.get("textField_lwpqbm7d").toString());
  287. }
  288. //地址
  289. if (Objects.nonNull(formData.get("textField_lwpqbm7t"))){
  290. body.put("address", formData.get("textField_lwpqbm7t").toString());
  291. }
  292. //联系人
  293. if (Objects.nonNull(formData.get("textField_lwpqbm7u"))){
  294. body.put("linkMan", formData.get("textField_lwpqbm7u").toString());
  295. }
  296. //联系电话
  297. if (Objects.nonNull(formData.get("textField_lwpqbm7v"))){
  298. body.put("linkNumber", formData.get("textField_lwpqbm7v").toString());
  299. }
  300. //内/外销
  301. if (Objects.nonNull(formData.get("selectField_lwpqbm82"))){
  302. String makCustomerType = formData.get("selectField_lwpqbm82").toString();
  303. switch (makCustomerType){
  304. case "001": body.put("makCustomerType", "001");break;
  305. case "002":body.put("makCustomerType", "002");break;
  306. }
  307. }
  308. //备注
  309. if (Objects.nonNull(formData.get("textareaField_lwpqbm7x"))){
  310. body.put("comments", formData.get("textareaField_lwpqbm7x").toString());
  311. }
  312. //erp环境
  313. String type = formData.get("selectField_m3fgkfz9").toString();
  314. Map<String, Object> result = put(getErpUrl(type) + "pws/mak/makCustomer/customEdit", null, getHeader(type), body);
  315. if ((boolean) result.get("success")){
  316. return McR.success();
  317. }else {
  318. return McR.errorUnknown(result.get("message").toString());
  319. }
  320. }
  321. @Override
  322. public McR getProductDeliveryStatus(String keyword,int pageNo,int pageSize,String type) {
  323. Map<String,Object> param = new HashMap<>();
  324. //物料编码
  325. param.put("pageNo",pageNo);
  326. param.put("pageSize",pageSize);
  327. param.put("partnumber",keyword);
  328. Map<String,Object> res = get(getErpUrl(type) + "pws/pdm/pdmProductForm/list", param, getHeader(type));
  329. Map result = (Map) res.get("result");
  330. List<Map> data = (List<Map>) result.get("records");
  331. if (data.isEmpty()){
  332. //物料名称
  333. param.remove("partnumber");
  334. param.put("partname",keyword);
  335. res = get(getErpUrl(type) + "pws/pdm/pdmProductForm/list", param, getHeader(type));
  336. result = (Map) res.get("result");
  337. data = (List<Map>) result.get("records");
  338. }
  339. if (data.isEmpty()){
  340. //物料型号
  341. param.remove("partname");
  342. param.put("pmodel",keyword);
  343. res = get(getErpUrl(type) + "pws/pdm/pdmProductForm/list", param, getHeader(type));
  344. result = (Map) res.get("result");
  345. data = (List<Map>) result.get("records");
  346. }
  347. if (data.isEmpty()){
  348. //物料规格
  349. param.remove("pmodel");
  350. param.put("pstandard",keyword);
  351. res = get(getErpUrl(type) + "pws/pdm/pdmProductForm/list", param, getHeader(type));
  352. result = (Map) res.get("result");
  353. data = (List<Map>) result.get("records");
  354. }
  355. if (data.isEmpty()){
  356. //客户型号
  357. param.remove("pstandard");
  358. param.put("customerModel",keyword);
  359. res = get(getErpUrl(type) + "pws/pdm/pdmProductForm/list", param, getHeader(type));
  360. result = (Map) res.get("result");
  361. data = (List<Map>) result.get("records");
  362. }
  363. //交付名称
  364. if (data.isEmpty()){
  365. param.remove("customerModel");
  366. param.put("saleCode",keyword);
  367. res = get(getErpUrl(type) + "pws/pdm/pdmProductForm/list", param, getHeader(type));
  368. result = (Map) res.get("result");
  369. data = (List<Map>) result.get("records");
  370. }
  371. //交付说明
  372. if (data.isEmpty()){
  373. param.remove("saleCode");
  374. param.put("saleName",keyword);
  375. res = get(getErpUrl(type) + "pws/pdm/pdmProductForm/list", param, getHeader(type));
  376. result = (Map) res.get("result");
  377. data = (List<Map>) result.get("records");
  378. }
  379. int totalCount = (int) result.get("total");
  380. int currentPage = (int) result.get("current");
  381. Map map = new HashMap();
  382. map.put("data",data);
  383. map.put("totalCount",totalCount);
  384. map.put("currentPage",currentPage);
  385. return McR.success(map);
  386. }
  387. @Override
  388. public McR addSaleOrder(Map map) {
  389. if (Objects.isNull(map.get("formInstId"))){
  390. McR.errorParam("formInstId不能为空");
  391. }
  392. String formInstId = map.get("formInstId").toString();
  393. DDR_New ddrNew = ydClient.queryData(YDParam.builder().formInstId(formInstId)
  394. .build(), YDConf.FORM_QUERY.retrieve_id);
  395. Map formData = ddrNew.getFormData();
  396. //erp环境
  397. String type = formData.get("selectField_m3fgkfz9_id").toString();
  398. //新增销售订单
  399. Map body = new HashMap();
  400. //查询erp账号
  401. Map originator = ddrNew.getOriginator();
  402. String userId = originator.get("userId").toString();
  403. List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
  404. .formUuid("FORM-65789BACB6F64B2C880875260026A6EACTOB")
  405. .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_m0ypgxec", userId)))
  406. .build(), YDConf.FORM_QUERY.retrieve_list).getData();
  407. if (!data.isEmpty()){
  408. Map formData2 = (Map) data.get(0).get("formData");
  409. body.put("createBy", formData2.get("textField_m0ypgxeb").toString());
  410. }
  411. body.put("customerCode",getString(formData.get("textField_ly5m36nw")));//客户编码
  412. String priority = getString(formData.get("selectField_lwpsp162"));//紧急级别
  413. switch (priority) {
  414. case "普通": body.put("priority", "D1_NORMAL "); break;
  415. case "紧急": body.put("priority", "D2_URGENT"); break;
  416. case "特紧急": body.put("priority", "D3_VERY_URGENT"); break;
  417. }
  418. String soType = getString(formData.get("selectField_lx2xj36n"));//合同类型
  419. if ("预测订单".equals(soType)){
  420. body.put("soType", "D2_FORECAST_ORDER");
  421. }else {
  422. body.put("soType", "D1_SALES_ORDER");
  423. }
  424. /*switch (soType) {
  425. case "常规订单":
  426. case "特殊订单":
  427. case "定制协议":
  428. case "采购框架":
  429. case "质量协议":
  430. case "demo/测试板/硬件":
  431. case "战略合作协议": body.put("soType", "D1_SALES_ORDER"); break;
  432. case "预测订单": body.put("soType", "D2_FORECAST_ORDER"); break;
  433. default: body.put("soType", "D1_SALES_ORDER"); break;
  434. }*/
  435. body.put("deliveryDate",getString(formData.get("textField_m0aduyx1")));//希望交期
  436. body.put("salesperson",getString(formData.get("textField_m0aduyx9")));//销售员
  437. body.put("payCurrencyCode",getString(formData.get("textField_m0aduyxa")));//币别
  438. body.put("ioDate",getString(formData.get("textField_m0aduyx2")));//单据日期
  439. body.put("comments",getString(formData.get("textareaField_lwpsp16e")));//备注
  440. //销售订单明细
  441. List<Map> list = (List<Map>) formData.get("tableField_lwpsp16f");
  442. List<Map> makSoDetailList = list.stream().map(map1 -> {
  443. Map detail = new HashMap();
  444. detail.put("productFormId",getString(map1.get("textField_m03o1x0m")));//交付状态id
  445. detail.put("saleCode",getString(map1.get("textField_lwpsp16g")));//交付名称
  446. detail.put("saleName",getString(map1.get("textField_lwpsp16h")));//交付说明
  447. detail.put("customerModel",getString(map1.get("textField_lwpsp16i")));//客户型号
  448. detail.put("partnumber",getString(map1.get("textField_lwpsp16k")));//物料编码
  449. detail.put("partname",getString(map1.get("textField_lwpsp16m")));//物料名称
  450. detail.put("pmodel",getString(map1.get("textField_lwpsp16o")));//物料型号
  451. detail.put("pstandard",getString(map1.get("textField_lwpsp16q")));//物料规格
  452. detail.put("stationCode",getString(map1.get("textField_m053iuol")));//工序编码
  453. detail.put("waferQty",getString(map1.get("numberField_lwpsp16t")));//片数
  454. detail.put("qty",getString(map1.get("numberField_lwpsp16v")));//数量
  455. detail.put("quotation",getString(map1.get("numberField_lwpsp172")));//未税单价
  456. detail.put("subTotal",getString(map1.get("numberField_lwpz9exp")));//未税总价
  457. detail.put("taxRate",getString(map1.get("numberField_m053iuom")));//税率
  458. detail.put("taxQuotation",getString(map1.get("numberField_lwpsp175")));//含税单价
  459. detail.put("taxSubtotal",getString(map1.get("numberField_lwpsp177")));//含税总价
  460. detail.put("die_model","");//
  461. return detail;
  462. }).collect(Collectors.toList());
  463. //附件 20250413 附件过大可能上传超时 暂时不推送erp
  464. /*List<Map> list2 = (List<Map>) formData.get("tableField_ly8fxusx");
  465. String[] ERP_FILEPATHS = new String[]{filePathSz,filePathXg,filePathZj,filePathHz};
  466. String[] ERP_ENVS = new String[]{"深圳","香港","浙江","杭州"};
  467. if (Objects.nonNull(list2)){
  468. List<Map> makSoFilesList = list2.stream().map(map1 -> {
  469. Map detail = new HashMap();
  470. String fileType = getString(map1.get("selectField_m0ls7yb8"));
  471. if (fileType.equals("合同")){
  472. detail.put("fileType","D1_CONTRACT");
  473. }else {
  474. detail.put("fileType","D2_TECHNICAL_DOC");
  475. }
  476. List<Map> fileList = (List<Map>) JSONArray.parse(String.valueOf(map1.get("attachmentField_ly8fxusz")));
  477. String ydDownloadUrl = fileList.get(0).get("downloadUrl").toString();
  478. String fileName = fileList.get(0).get("name").toString();
  479. fileName = DigestUtils.sha256Hex(fileName.substring(fileName.lastIndexOf(".")+1)) + fileName.substring(fileName.lastIndexOf("."));
  480. // fileName = convertChineseToUtf8Hex(fileName);
  481. for (int i = 0; i < ERP_ENVS.length; i++) {
  482. if (ERP_ENVS[i].equals(type)){
  483. //将downloadurl下载到本地
  484. try {
  485. downloadFile(ydDownloadUrl, ERP_FILEPATHS[i],fileName);
  486. System.out.println("文件下载成功!");
  487. } catch (IOException e) {
  488. e.printStackTrace();
  489. }
  490. //上传附件
  491. try {
  492. detail.put("files",postWithFile(getErpUrl(type) + "pws/sys/common/upload", ERP_FILEPATHS[i] + fileName,type));
  493. } catch (UnsupportedEncodingException e) {
  494. throw new RuntimeException(e);
  495. }
  496. break;
  497. }
  498. }
  499. if ("深圳".equals(type)){
  500. //将downloadurl下载到本地
  501. try {
  502. downloadFile(ydDownloadUrl, filePathSz,fileName);
  503. System.out.println("文件下载成功!");
  504. } catch (IOException e) {
  505. e.printStackTrace();
  506. }
  507. //上传附件
  508. try {
  509. detail.put("files",postWithFile(getErpUrl(type) + "pws/sys/common/upload", filePathSz + fileName,type));
  510. } catch (UnsupportedEncodingException e) {
  511. throw new RuntimeException(e);
  512. }
  513. }else if ("香港".equals(type)){
  514. //将downloadurl下载到本地
  515. try {
  516. downloadFile(ydDownloadUrl, filePathXg,fileName);
  517. System.out.println("文件下载成功!");
  518. } catch (IOException e) {
  519. e.printStackTrace();
  520. }
  521. //上传附件
  522. try {
  523. detail.put("files",postWithFile(getErpUrl(type) + "pws/sys/common/upload", filePathXg + fileName,type));
  524. } catch (UnsupportedEncodingException e) {
  525. throw new RuntimeException(e);
  526. }
  527. }else if ("浙江".equals(type)){
  528. //将downloadurl下载到本地
  529. try {
  530. downloadFile(ydDownloadUrl, filePathZj,fileName);
  531. System.out.println("文件下载成功!");
  532. } catch (IOException e) {
  533. e.printStackTrace();
  534. }
  535. //上传附件
  536. try {
  537. detail.put("files",postWithFile(getErpUrl(type) + "pws/sys/common/upload", filePathZj + fileName,type));
  538. } catch (UnsupportedEncodingException e) {
  539. throw new RuntimeException(e);
  540. }
  541. }
  542. return detail;
  543. }).collect(Collectors.toList());
  544. body.put("makSoFilesList",makSoFilesList);
  545. }*/
  546. body.put("makSoDetailList",makSoDetailList);
  547. Map res = post(getErpUrl(type) + "pws/mak/makSalesOrder/add", null, getHeader(type), body);
  548. if (!(boolean)res.get("success")){
  549. return McR.errorUnknown(getString(res.get("message")));
  550. }
  551. String orderCode = getString(res.get("result"));
  552. //更新宜搭订单编号
  553. ydClient.operateData(YDParam.builder()
  554. .formInstId(formInstId)
  555. .updateFormDataJson(JSON.toJSONString(UtilMap.map("textField_m0alsjj1",orderCode)))
  556. .build(),YDConf.FORM_OPERATION.update);
  557. //如果是变更订单 则更新原订单
  558. String orderType = getString(formData.get("selectField_m3ii047l"));
  559. if ("变更订单".equals(orderType)){
  560. String jsonString = formData.get("associationFormField_m3ii047m_id").toString();
  561. String orderJsonString = StringEscapeUtils.unescapeJava(jsonString.substring(1, jsonString.length() - 1));
  562. List<Map> order =(List<Map>) JSONArray.parse(orderJsonString);
  563. String updateFormInstId = order.get(0).get("instanceId").toString();
  564. order.get(0).put("instanceId",formInstId);
  565. order.get(0).put("title",orderCode);
  566. Map updateMap = new HashMap();
  567. updateMap.put("associationFormField_m3ii047n",JSON.toJSONString(order));
  568. ydClient.operateData(YDParam.builder()
  569. .formInstId(updateFormInstId)
  570. .updateFormDataJson(JSON.toJSONString(updateMap))
  571. .build(),YDConf.FORM_OPERATION.update);
  572. }
  573. return McR.success();
  574. }
  575. public void downloadFile(String fileURL, String savePath , String fileName) throws IOException {
  576. //若是宜搭附件url 则需获得附件临时免登地址
  577. Map<String,Object> param = new HashMap<>();
  578. param.put("systemToken",ydConf.getSystemToken());
  579. param.put("userId","344749020127590108");//wzy
  580. param.put("fileUrl",fileURL);
  581. param.put("timeout",3600000);
  582. Map mcBody = new HashMap();
  583. mcBody.put("params",param);
  584. mcBody.put("headers",ddClient.initTokenHeader());
  585. mcBody.put("url","https://api.dingtalk.com/v1.0/yida/apps/temporaryUrls/" + ydConf.getAppType());
  586. mcBody.put("fileName",fileName);
  587. mcBody.put("downloadPath","/home/mc/mjs/lingmingguangzi/");
  588. // mcBody.put("downloadPath","d:\\");
  589. fileURL = UtilHttp.doPost("https://mc.cloudpure.cn/api/mc/request/downloadFile",null,null,mcBody);
  590. // fileURL = UtilHttp.doPost("http://127.0.0.1:9900/api/mc/request/downloadFile",null,null,mcBody);
  591. // fileURL = ((DDR_New) UtilHttp.doGet("https://api.dingtalk.com/v1.0/yida/apps/temporaryUrls/" + ydConf.getAppType(), ddClient.initTokenHeader(), param, DDR_New.class)).getResult().toString();
  592. log.info("fileUrl:{}",fileURL);
  593. URL url = new URL(fileURL);
  594. HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
  595. int responseCode = httpConn.getResponseCode();
  596. // 检查HTTP响应代码是否为200
  597. if (responseCode == HttpURLConnection.HTTP_OK) {
  598. InputStream inputStream = httpConn.getInputStream();
  599. FileOutputStream outputStream = new FileOutputStream(savePath + fileName);
  600. byte[] buffer = new byte[4096];
  601. int bytesRead = -1;
  602. while ((bytesRead = inputStream.read(buffer)) != -1) {
  603. outputStream.write(buffer, 0, bytesRead);
  604. }
  605. outputStream.close();
  606. inputStream.close();
  607. } else {
  608. System.out.println("无法下载文件。HTTP响应代码: " + responseCode);
  609. }
  610. httpConn.disconnect();
  611. }
  612. @Override
  613. public McR updateClueStatus(Map map) {
  614. String formInstId = getString(map.get("formInstId"));
  615. if (!Strings.isNullOrEmpty(formInstId)) {
  616. Map formData = ydClient.queryData(YDParam.builder()
  617. .formInstId(formInstId)
  618. .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  619. String customerName = getString(formData.get("textField_lwpqbm7b"));
  620. String customerCode = getString(formData.get("serialNumberField_m4rv2j4i"));
  621. List<Map> clueList = (List<Map>) formData.get("tableField_m86r3mmn");
  622. if (Objects.nonNull(clueList) && !clueList.isEmpty()){
  623. for (Map clue : clueList) {
  624. String clueCode = getString(clue.get("textField_m86r3mmo"));
  625. //客户资源池关联表单
  626. List<Map> formControlList = new ArrayList<>();
  627. Map formControl = new HashMap();
  628. formControl.put("formType","receipt");
  629. formControl.put("formUuid","FORM-6F1E2DCFB3F5448EBDD4994551EBF690DVIT");
  630. formControl.put("instanceId",formInstId);
  631. formControl.put("appType","APP_MOIYIC856NRIBCMXEXVD");
  632. formControl.put("title",customerName);
  633. formControlList.add(formControl);
  634. Map updateFormData = new HashMap();
  635. updateFormData.put("associationFormField_m50t9d7y",formControlList);
  636. updateFormData.put("selectField_m2lh8c49","已转换");
  637. updateFormData.put("textField_m50vl2jt",customerCode);
  638. //更新线索
  639. ydClient.operateData(YDParam.builder()
  640. .formUuid("FORM-45C086AFF2F94D9BB056A15B34CD2BCAFQET")
  641. .searchCondition(JSONObject.toJSONString(UtilMap.map("serialNumberField_m2mwp0iy",clueCode)))
  642. .formDataJson(JSONObject.toJSONString(updateFormData))
  643. .build(), YDConf.FORM_OPERATION.upsert);
  644. }
  645. }
  646. }else {
  647. McR.errorParam("formInstId不能为空");
  648. }
  649. return McR.success();
  650. }
  651. /* @Override
  652. public McR updateSaleOrder(Map map) {
  653. if (Objects.isNull(map.get("formInstId"))){
  654. McR.errorParam("formInstId不能为空");
  655. }
  656. String formInstId = map.get("formInstId").toString();
  657. DDR_New ddrNew = ydClient.queryData(YDParam.builder().formInstId(formInstId)
  658. .build(), YDConf.FORM_QUERY.retrieve_id);
  659. Map formData = ddrNew.getFormData();
  660. //erp环境
  661. String type = formData.get("selectField_m3fgkfz9").toString();
  662. //更新销售订单
  663. Map body = new HashMap();
  664. //查询erp账号
  665. Map originator = ddrNew.getOriginator();
  666. String userId = originator.get("userId").toString();
  667. List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
  668. .formUuid("FORM-65789BACB6F64B2C880875260026A6EACTOB")
  669. .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_m0ypgxec", userId)))
  670. .build(), YDConf.FORM_QUERY.retrieve_list).getData();
  671. if (!data.isEmpty()){
  672. Map formData2 = (Map) data.get(0).get("formData");
  673. body.put("updateBy", formData2.get("textField_m0ypgxeb").toString());
  674. }
  675. body.put("soCode",getString(formData.get("textField_m0alsjj1")));
  676. body.put("customerCode",getString(formData.get("textField_ly5m36nw")));//客户编码
  677. String priority = getString(formData.get("selectField_lwpsp162"));//紧急级别
  678. switch (priority) {
  679. case "普通": body.put("priority", "D1_NORMAL "); break;
  680. case "紧急": body.put("priority", "D2_URGENT"); break;
  681. case "特紧急": body.put("priority", "D3_VERY_URGENT"); break;
  682. }
  683. String soType = getString(formData.get("selectField_lx2xj36n"));//合同类型
  684. switch (soType) {
  685. case "常规订单":
  686. case "特殊订单":
  687. case "定制协议":
  688. case "采购框架":
  689. case "质量协议":
  690. case "战略合作协议": body.put("soType", "D1_SALES_ORDER"); break;
  691. case "预测订单": body.put("soType", "D2_FORECAST_ORDER"); break;
  692. default: body.put("soType", "D1_SALES_ORDER"); break;
  693. }
  694. body.put("deliveryDate",getString(formData.get("textField_m0aduyx1")));//希望交期
  695. body.put("salesperson",getString(formData.get("textField_m0aduyx9")));//销售员
  696. body.put("payCurrencyCode",getString(formData.get("textField_m0aduyxa")));//币别
  697. body.put("ioDate",getString(formData.get("textField_m0aduyx2")));//单据日期
  698. body.put("comments",getString(formData.get("textareaField_lwpsp16e")));//备注
  699. //销售订单明细
  700. List<Map> list = (List<Map>) formData.get("tableField_lwpsp16f");
  701. List<Map> makSoDetailList = list.stream().map(map1 -> {
  702. Map detail = new HashMap();
  703. detail.put("productFormId",getString(map1.get("textField_m03o1x0m")));//交付状态id
  704. detail.put("saleCode",getString(map1.get("textField_lwpsp16g")));//交付名称
  705. detail.put("saleName",getString(map1.get("textField_lwpsp16h")));//交付说明
  706. detail.put("customerModel",getString(map1.get("textField_lwpsp16i")));//客户型号
  707. detail.put("partnumber",getString(map1.get("textField_lwpsp16k")));//物料编码
  708. detail.put("partname",getString(map1.get("textField_lwpsp16m")));//物料名称
  709. detail.put("pmodel",getString(map1.get("textField_lwpsp16o")));//物料型号
  710. detail.put("pstandard",getString(map1.get("textField_lwpsp16q")));//物料规格
  711. detail.put("stationCode",getString(map1.get("textField_m053iuol")));//工序编码
  712. detail.put("waferQty",getString(map1.get("numberField_lwpsp16t")));//片数
  713. detail.put("qty",getString(map1.get("numberField_lwpsp16v")));//数量
  714. detail.put("quotation",getString(map1.get("numberField_lwpsp172")));//未税单价
  715. detail.put("subTotal",getString(map1.get("numberField_lwpz9exp")));//未税总价
  716. detail.put("taxRate",getString(map1.get("numberField_m053iuom")));//税率
  717. detail.put("taxQuotation",getString(map1.get("numberField_lwpsp175")));//含税单价
  718. detail.put("taxSubtotal",getString(map1.get("numberField_lwpsp177")));//含税总价
  719. detail.put("die_model","");//
  720. return detail;
  721. }).collect(Collectors.toList());
  722. //附件
  723. List<Map> list2 = (List<Map>) formData.get("tableField_ly8fxusx");
  724. if (Objects.nonNull(list2)){
  725. List<Map> makSoFilesList = list2.stream().map(map1 -> {
  726. Map detail = new HashMap();
  727. String fileType = getString(map1.get("selectField_m0ls7yb8"));
  728. if (fileType.equals("合同")){
  729. detail.put("fileType","D1_CONTRACT");
  730. }else {
  731. detail.put("fileType","D2_TECHNICAL_DOC");
  732. }
  733. List<Map> fileList = (List<Map>) JSONArray.parse(String.valueOf(map1.get("attachmentField_ly8fxusz")));
  734. String ydDownloadUrl = fileList.get(0).get("downloadUrl").toString();
  735. String fileName = fileList.get(0).get("name").toString();
  736. if ("深圳".equals(type)){
  737. //将downloadurl下载到本地
  738. try {
  739. downloadFile(ydDownloadUrl, filePathSz + fileName);
  740. System.out.println("文件下载成功!");
  741. } catch (IOException e) {
  742. e.printStackTrace();
  743. }
  744. //上传附件
  745. detail.put("files",postWithFile(getErpUrl(type) + "pws/sys/common/upload", filePathSz + fileName,type));
  746. }else {
  747. //将downloadurl下载到本地
  748. try {
  749. downloadFile(ydDownloadUrl, filePathXg + fileName);
  750. System.out.println("文件下载成功!");
  751. } catch (IOException e) {
  752. e.printStackTrace();
  753. }
  754. //上传附件
  755. detail.put("files",postWithFile(getErpUrl(type) + "pws/sys/common/upload", filePathXg + fileName,type));
  756. }
  757. return detail;
  758. }).collect(Collectors.toList());
  759. body.put("makSoFilesList",makSoFilesList);
  760. }
  761. body.put("makSoDetailList",makSoDetailList);
  762. Map res = put(getErpUrl(type) + "pws/mak/makSalesOrder/change", null, getHeader(type), body);
  763. return McR.success();
  764. }*/
  765. private String getString(Object object){
  766. return (object == null) ? "" : object.toString();
  767. }
  768. private Map<String,String> getHeader(String type){
  769. Map<String, Object> map = new HashMap<>();
  770. if ("深圳".equals(type)){
  771. map = post(erpUrlSz + "pws/sys/mLogin", null, null,UtilMap.map("username, password", userNameSz, passwordSz));
  772. }else if ("香港".equals(type)){
  773. map = post(erpUrlXg + "pws/sys/mLogin", null, null,UtilMap.map("username, password", userNameXg, passwordXg));
  774. }else if ("浙江".equals(type)){
  775. map = post(erpUrlZj + "pws/sys/mLogin", null, null,UtilMap.map("username, password", userNameZj, passwordZj));
  776. }else if ("杭州".equals(type)){
  777. map = post(erpUrlHz + "pws/sys/mLogin", null, null,UtilMap.map("username, password", userNameHz, passwordHz));
  778. }
  779. if (Objects.nonNull(map.get("result"))){
  780. Map<String,Object> result = (Map<String,Object>) map.get("result");
  781. if (Objects.nonNull(result.get("token"))){
  782. Map<String, String> header = new HashMap<>();
  783. header.put("X-Access-Token", result.get("token").toString());
  784. return header;
  785. }
  786. }
  787. return null;
  788. }
  789. /**
  790. * 封装GET请求
  791. *
  792. * @param url 请求的URL
  793. * @param params 请求参数
  794. * @param headers 请求头
  795. * @return 响应内容
  796. */
  797. public static Map<String, Object> get(String url, Map<String, Object> params, Map<String, String> headers) {
  798. log.info("GET 请求url:{}, 请求参数:{}, 请求头:{}", url, params, headers);
  799. HttpRequest get = HttpUtil.createGet(url);
  800. if (params!= null){
  801. get.form(params);
  802. }
  803. if (headers!= null){
  804. get.addHeaders(headers);
  805. }
  806. HttpResponse response = get.execute();
  807. Map<String, Object> result = null;
  808. try {
  809. ObjectMapper objectMapper = new ObjectMapper();
  810. result = objectMapper.readValue(response.body(), new TypeReference<Map<String, Object>>() {});
  811. } catch (JsonProcessingException e) {
  812. throw new RuntimeException(e);
  813. }
  814. log.info("响应结果: {}", result);
  815. return result;
  816. }
  817. /**
  818. * 封装POST请求
  819. *
  820. * @param url 请求的URL
  821. * @param params 请求参数
  822. * @param headers 请求头
  823. * @param body 请求体
  824. * @return 响应内容
  825. */
  826. public static Map<String, Object> post(String url, Map<String, Object> params, Map<String, String> headers, Map<String, Object> body) {
  827. log.info("POST 请求url:{}, 请求参数:{}, 请求头:{}, 请求体:{}", url, params, headers, body);
  828. HttpRequest request = HttpUtil.createPost(url);
  829. if (params != null) {
  830. request.form(params);
  831. }
  832. if (headers != null) {
  833. request.addHeaders(headers);
  834. }
  835. if (body != null) {
  836. request.body(JSONUtil.toJsonStr(body), "application/json");
  837. }
  838. HttpResponse response = request.execute();
  839. // Map<String,Object> result = JSONUtil.toBean(response.body(), Map.class);
  840. Map<String, Object> result = null;
  841. try {
  842. ObjectMapper objectMapper = new ObjectMapper();
  843. result = objectMapper.readValue(response.body(), new TypeReference<Map<String, Object>>() {});
  844. } catch (JsonProcessingException e) {
  845. throw new RuntimeException(e);
  846. }
  847. log.info("响应结果: {}", result);
  848. return result;
  849. }
  850. public static Map<String, Object> put(String url, Map<String, Object> params, Map<String, String> headers, Map<String, Object> body) {
  851. log.info("PUT 请求url:{}, 请求参数:{}, 请求头:{}, 请求体:{}", url, params, headers, body);
  852. HttpRequest request = HttpRequest.put(url);
  853. if (params != null) {
  854. request.form(params);
  855. }
  856. if (headers != null) {
  857. request.addHeaders(headers);
  858. }
  859. if (body != null) {
  860. request.body(JSONUtil.toJsonStr(body), "application/json");
  861. }
  862. HttpResponse response = request.execute();
  863. // Map<String,Object> result = JSONUtil.toBean(response.body(), Map.class);
  864. Map<String, Object> result = null;
  865. try {
  866. ObjectMapper objectMapper = new ObjectMapper();
  867. result = objectMapper.readValue(response.body(), new TypeReference<Map<String, Object>>() {});
  868. } catch (JsonProcessingException e) {
  869. throw new RuntimeException(e);
  870. }
  871. log.info("响应结果: {}", result);
  872. return result;
  873. }
  874. public static String convertChineseToUtf8Hex(String input) {
  875. StringBuilder sb = new StringBuilder();
  876. Pattern pattern = Pattern.compile("[\\u4E00-\\u9FFF\\u3000-\\u303F\\uFF00-\\uFFEF]");
  877. Matcher matcher = pattern.matcher(input);
  878. int i = 0;
  879. while (i < input.length()) {
  880. if (matcher.region(i, i + 1).find()) {
  881. // 当前字符是中文字符
  882. char chineseChar = input.charAt(i);
  883. byte[] utf8Bytes = String.valueOf(chineseChar).getBytes(StandardCharsets.UTF_8);
  884. StringBuilder hexString = new StringBuilder();
  885. for (byte b : utf8Bytes) {
  886. hexString.append(String.format("%02x", b));
  887. }
  888. sb.append(hexString.toString());
  889. } else {
  890. // 当前字符不是中文字符
  891. sb.append(input.charAt(i));
  892. }
  893. i++;
  894. }
  895. return sb.toString();
  896. }
  897. public String postWithFile(String url, String filePath,String type) throws UnsupportedEncodingException {
  898. // 文件路径
  899. File file = new File(filePath);
  900. // 创建HttpClient实例
  901. HttpClient client = SkipHttpsUtil.wrapClient();
  902. // HttpClient client = HttpClients.createDefault();
  903. // 创建HttpPost实例
  904. HttpPost post = new HttpPost(url);
  905. // 添加请求头
  906. post.setHeader("X-Access-Token", getHeader(type).get("X-Access-Token"));
  907. // 使用MultipartEntityBuilder来构建multipart请求
  908. MultipartEntityBuilder builder = MultipartEntityBuilder.create();
  909. //如果fileUrl中包含中文,则需要对其进行编码
  910. // String encodeFileName = convertChineseToUtf8Hex(file.getName());
  911. builder.addBinaryBody("file", file, ContentType.DEFAULT_BINARY, file.getName());
  912. // 设置请求体
  913. HttpEntity multipart = builder.build();
  914. post.setEntity(multipart);
  915. try {
  916. // 发送请求并获取响应
  917. org.apache.http.HttpResponse response = client.execute(post);
  918. // 处理响应
  919. // 例如,打印响应状态码
  920. System.out.println(response.getStatusLine().getStatusCode());
  921. HttpEntity entity = response.getEntity();
  922. String fileName = "";
  923. // 判断响应实体是否为null
  924. if (entity != null) {
  925. // 使用EntityUtils读取响应体内容(这里假设是文本类型)
  926. String responseString = EntityUtils.toString(entity, "UTF-8"); // 指定字符集
  927. System.out.println("Response Body: " + responseString);
  928. Map parse = (Map) JSONObject.parse(responseString);
  929. if ((boolean)parse.get("success")){
  930. fileName = getString(parse.get("message"));
  931. }
  932. // 释放响应实体资源(虽然EntityUtils.toString()在某些HttpClient版本中会自动处理)
  933. EntityUtils.consume(entity);
  934. }
  935. return fileName;
  936. } catch (IOException e) {
  937. e.printStackTrace();
  938. }
  939. return null;
  940. }
  941. @Override
  942. public void updateCurrency() {
  943. //获取erp币别列表
  944. String[] ERP_URLS = new String[]{erpUrlSz,erpUrlXg,erpUrlZj, erpUrlHz};
  945. String[] ERP_ENVS = new String[]{"深圳","香港","浙江","杭州"};
  946. for (int i = 0; i < ERP_URLS.length; i++) {
  947. List<Map<String,String>> list = new ArrayList<>();
  948. int pageNo = 1;
  949. int pageSize = 50;
  950. Map result = new HashMap<>();
  951. do {
  952. Map param = new HashMap();
  953. param.put("pageNo",pageNo);
  954. param.put("pageSize",pageSize);
  955. Map<String, Object> res = get(ERP_URLS[i] + "pws/fin/finCurrency/list", param, getHeader(ERP_ENVS[i]));
  956. result = (Map) res.get("result");
  957. List<Map> records = (List<Map>) result.get("records");
  958. int finalI = i;
  959. list.addAll(records.stream().map(map1 -> {
  960. Map<String,String> map = new HashMap<>();
  961. map.put("textField_m054h6gw",map1.get("currencyCode").toString());
  962. map.put("textField_m054h6gx",map1.get("currencyName").toString());
  963. map.put("textField_m054h6gy",map1.get("active_dictText").toString());
  964. map.put("selectField_m3fgkfz9",ERP_ENVS[finalI]);
  965. map.put("textField_m3fiygvb",map.get("selectField_m3fgkfz9") + map.get("textField_m054h6gw"));//唯一标识
  966. return map;
  967. }).collect(Collectors.toList()));
  968. pageNo++;
  969. }while (pageNo * pageSize < (int) result.get("total"));
  970. //更新宜搭币别
  971. for (Map map : list) {
  972. ydService.upsertFormData("FORM-01CF3B9C5A364D32A011A6EA8B59B82AIUDI",UtilMap.map("textField_m3fiygvb",map.get("textField_m3fiygvb")),map,null);
  973. }
  974. }
  975. }
  976. @Override
  977. public void updateTaxRate() {
  978. //获取erp税率列表
  979. String[] ERP_URLS = new String[]{erpUrlSz,erpUrlXg,erpUrlZj, erpUrlHz};
  980. String[] ERP_ENVS = new String[]{"深圳","香港","浙江","杭州"};
  981. for (int i = 0; i < ERP_URLS.length; i++) {
  982. List<Map<String,String>> list = new ArrayList<>();
  983. int pageNo = 1;
  984. int pageSize = 50;
  985. Map result = new HashMap<>();
  986. do {
  987. Map param = new HashMap();
  988. param.put("pageNo",pageNo);
  989. param.put("pageSize",pageSize);
  990. Map<String, Object> res = get(ERP_URLS[i] + "pws/fin/finTax/list", param, getHeader(ERP_ENVS[i]));
  991. result = (Map) res.get("result");
  992. List<Map> records = (List<Map>) result.get("records");
  993. int finalI = i;
  994. list.addAll(records.stream().map(map1 -> {
  995. Map<String,String> map = new HashMap<>();
  996. map.put("textField_m0539uy1",map1.get("id").toString());
  997. map.put("numberField_m0539uy2",map1.get("taxValue").toString());
  998. map.put("textField_m0539uy4",map1.get("taxName").toString());
  999. map.put("selectField_m3fgkfz9",ERP_ENVS[finalI]);
  1000. map.put("textField_m3fiygvb",map.get("selectField_m3fgkfz9") + map.get("textField_m0539uy1"));//唯一标识
  1001. return map;
  1002. }).collect(Collectors.toList()));
  1003. pageNo++;
  1004. }while (pageNo * pageSize < (int) result.get("total"));
  1005. //更新宜搭税率
  1006. for (Map map : list) {
  1007. ydService.upsertFormData("FORM-47A9FC4550574A0488A3F2ECB30FADB0Z67F",UtilMap.map("textField_m3fiygvb",map.get("textField_m3fiygvb")),map,null);
  1008. }
  1009. }
  1010. }
  1011. @Override
  1012. public void updateProcess() {
  1013. //获取erp工序列表
  1014. String[] ERP_URLS = new String[]{erpUrlSz,erpUrlXg,erpUrlZj, erpUrlHz};
  1015. String[] ERP_ENVS = new String[]{"深圳","香港","浙江","杭州"};
  1016. for (int i = 0; i < ERP_URLS.length; i++) {
  1017. List<Map<String,String>> list = new ArrayList<>();
  1018. int pageNo = 1;
  1019. int pageSize = 50;
  1020. Map result = new HashMap<>();
  1021. do {
  1022. Map param = new HashMap();
  1023. param.put("pageNo",pageNo);
  1024. param.put("pageSize",pageSize);
  1025. Map<String, Object> res = get(ERP_URLS[i] + "pws/pdm/pdmStation/list", param, getHeader(ERP_ENVS[i]));
  1026. result = (Map) res.get("result");
  1027. List<Map> records = (List<Map>) result.get("records");
  1028. int finalI = i;
  1029. list.addAll(records.stream().map(map1 -> {
  1030. Map<String,String> map = new HashMap<>();
  1031. map.put("textField_m04yhw4p",getString(map1.get("stationCode")));//工序编码
  1032. map.put("textField_m04yhw56",getString(map1.get("stationName")));//工序名称
  1033. map.put("textField_m04yhw57",getString(map1.get("stationClass")));//工序分类
  1034. map.put("textField_m04yhw58",getString(map1.get("productionType_dictText")));//生产类型
  1035. map.put("numberField_m04yhw5b",getString(map1.get("cycleTime")));//生产周期
  1036. map.put("textField_m04yhw5a",getString(map1.get("stockFlag")));//可入库
  1037. map.put("textField_m04yhw5c",getString(map1.get("unitCode_dictText")));//计价方式
  1038. map.put("textField_m04yhw5d",getString(map1.get("stationType_dictText")));//工序类型
  1039. map.put("textField_m04yhw5e",getString(map1.get("comments")));//备注
  1040. map.put("textField_m04yhw5f",getString(map1.get("active_dictText")));//审核状态
  1041. map.put("selectField_m3fgkfz9",ERP_ENVS[finalI]);
  1042. map.put("textField_m3fiygvb",map.get("selectField_m3fgkfz9") + map.get("textField_m04yhw4p"));//唯一标识
  1043. return map;
  1044. }).collect(Collectors.toList()));
  1045. pageNo++;
  1046. }while (pageNo * pageSize < (int) result.get("total"));
  1047. //更新宜搭工序
  1048. for (Map map : list) {
  1049. ydService.upsertFormData("FORM-2F06B5F437124B3ABA8D5275D1D277E4R9O1",UtilMap.map("textField_m3fiygvb",map.get("textField_m3fiygvb")),map,null);
  1050. }
  1051. }
  1052. }
  1053. @Override
  1054. public McR updateCustomerProcess(Map map) {
  1055. if (Objects.isNull(map.get("formInstId"))){
  1056. return McR.errorParam("formInstId不能为空");
  1057. }
  1058. String formInstId = map.get("formInstId").toString();
  1059. DDR_New ddrNew = ydClient.queryData(YDParam.builder().formInstId(formInstId).build(), YDConf.FORM_QUERY.retrieve_id);
  1060. Map formData = ddrNew.getFormData();
  1061. String jsonString = formData.get("associationFormField_lzto0clw_id").toString();
  1062. String customerJsonString = StringEscapeUtils.unescapeJava(jsonString.substring(1, jsonString.length() - 1));
  1063. List<Map> customer =(List<Map>) JSONArray.parse(customerJsonString);
  1064. String updateFormInstId = customer.get(0).get("instanceId").toString();
  1065. String jsonString2 = formData.get("associationFormField_m3s7manr_id").toString();
  1066. String customerJsonString3 = StringEscapeUtils.unescapeJava(jsonString2.substring(1, jsonString2.length() - 1));
  1067. formData.put("associationFormField_m3s7manr",customerJsonString3);//代理终端客户
  1068. formData.put("employeeField_m2cz3vbt",formData.get("employeeField_m2cz3vbt_id"));//关联人员
  1069. ydClient.operateData(YDParam.builder()
  1070. .formInstanceId(updateFormInstId)
  1071. .updateFormDataJson(JSON.toJSONString(formData))
  1072. .build(),YDConf.FORM_OPERATION.update);
  1073. return McR.success();
  1074. }
  1075. @Override
  1076. public McR addWeeklyReport(Map map) {
  1077. if (Objects.isNull(map.get("formInstId"))){
  1078. return McR.errorParam("formInstId不能为空");
  1079. }
  1080. String formInstId = map.get("formInstId").toString();
  1081. //查询周报计划
  1082. DDR_New ddrNew = ydClient.queryData(YDParam.builder()
  1083. .formInstId(formInstId)
  1084. .build(), YDConf.FORM_QUERY.retrieve_id);
  1085. Map formData = ddrNew.getFormData();
  1086. //周报发起人
  1087. List<String> initiateUserIds = (List<String>) formData.get("employeeField_m27e9i5u_id");
  1088. //周报填写人员
  1089. List<String> weeklyUserIds = (List<String>) formData.get("employeeField_m27e9i5v_id");
  1090. //下次自动发起周报日期
  1091. long nextTime = (long) formData.get("dateField_m27e9i5w");
  1092. Date nextDate = new Date(nextTime);
  1093. //汇报日期区间
  1094. Date startDate = DateUtil.beginOfWeek(nextDate);
  1095. Date endDate = DateUtil.endOfWeek(nextDate);
  1096. String startDateTime = startDate.getTime() + "";
  1097. String endDateTime = endDate.getTime() + "";
  1098. //上次自动发起周报日期
  1099. Date lastTime = nextDate;
  1100. nextDate = DateUtils.addDays(nextDate, 7);
  1101. Map weeklyFormData = new HashMap();
  1102. weeklyFormData.put("departmentSelectField_lwprtzha",formData.get("departmentSelectField_m27e9i5t_id"));//部门
  1103. weeklyFormData.put("dateField_m2d0mach",formData.get("dateField_m27e9i5w"));//汇报开始日期
  1104. weeklyFormData.put("cascadeDateField_m2cyyp0j",new String[]{startDateTime,endDateTime});//汇报日期区间
  1105. weeklyFormData.put("numberField_m27dxqle",formData.get("numberField_m27dxqle"));//汇报周
  1106. weeklyFormData.put("employeeField_m28cj0dq",weeklyUserIds);//周报填写人员
  1107. List<Map> weeklyDetails = new ArrayList<>();
  1108. for (String weeklyUserId : weeklyUserIds) {
  1109. Map detail = new HashMap();
  1110. detail.put("employeeField_m0z2tckk",new String[]{weeklyUserId});//周报人员
  1111. weeklyDetails.add(detail);
  1112. }
  1113. weeklyFormData.put("tableField_m27dxqla",weeklyDetails);//周报明细
  1114. //发起销售周报
  1115. ydClient.operateData(YDParam.builder()
  1116. .formUuid("FORM-A68EA411FA5E498490FAC6E4FC30A84F2KN5")
  1117. .formDataJson(JSON.toJSONString(weeklyFormData))
  1118. .userId(initiateUserIds.get(0))
  1119. .build(),YDConf.FORM_OPERATION.create);
  1120. //更新周报计划下次发起周报时间及上次发起周报时间
  1121. Map updateFormData = new HashMap();
  1122. updateFormData.put("dateField_m27e9i61", lastTime);
  1123. updateFormData.put("dateField_m27e9i5w", nextDate);
  1124. ydClient.operateData(YDParam.builder()
  1125. .formInstId(formInstId)
  1126. .updateFormDataJson(JSON.toJSONString(updateFormData))
  1127. .build(), YDConf.FORM_OPERATION.update);
  1128. return McR.success();
  1129. }
  1130. @Override
  1131. public McR getTbStageOptions(String projectName,String projectId,String stageName) {
  1132. List<Map> options = new ArrayList<>();
  1133. if (Strings.isNullOrEmpty(projectName)){
  1134. return McR.errorParam("项目名称不能为空!");
  1135. }
  1136. if (Strings.isNullOrEmpty(projectId)){
  1137. Map mcBody = new HashMap();
  1138. mcBody.put("url","https://open.teambition.com/api/v3/project/query");
  1139. mcBody.put("headers",initHeaderToken());
  1140. mcBody.put("params",UtilMap.map("name", projectName));
  1141. Map mcResult = (Map) JSON.parse(UtilHttp.doPost("https://mc.cloudpure.cn/api/mc/request/get",null,null,mcBody));
  1142. List<Map> projectList = (List<Map>)mcResult.get("result");
  1143. /* TBR projectTbr = (TBR) UtilHttp.doGet("https://open.teambition.com/api/v3/project/query", initHeaderToken(), UtilMap.map("name", projectName), TBR.class);
  1144. List<Map> projectList = (List<Map>) projectTbr.getResult();*/
  1145. if (projectList.isEmpty()){
  1146. return McR.errorParam("未在TB中查询到此项目信息!");
  1147. }
  1148. Map projectMap = projectList.get(0);
  1149. projectId = projectMap.get("id").toString();
  1150. }
  1151. //搜索任务列表
  1152. Map mcBody = new HashMap();
  1153. mcBody.put("url","https://open.teambition.com/api/v3/project/"+projectId+"/stage/search");
  1154. mcBody.put("headers",initHeaderToken());
  1155. mcBody.put("params",null);
  1156. Map mcResult = (Map) JSON.parse(UtilHttp.doPost("https://mc.cloudpure.cn/api/mc/request/get",null,null,mcBody));
  1157. List<Map> stageList = (List<Map>)mcResult.get("result");
  1158. /*TBR stageTbr = (TBR) UtilHttp.doGet("https://open.teambition.com/api/v3/project/"+projectId+"/stage/search", initHeaderToken(), null, TBR.class);
  1159. List<Map> stageList = (List<Map>) stageTbr.getResult();*/
  1160. Map<String,String> stageMap = new HashMap<>();
  1161. for (Map stage : stageList) {
  1162. String name = stage.get("name").toString().replaceAll("\\s+","");
  1163. if (STAGES.contains(name)){
  1164. stageMap.put(stage.get("id").toString(),name);
  1165. }
  1166. }
  1167. //查询父任务详情
  1168. for (String stageId : stageMap.keySet()) {
  1169. Map mcBody2 = new HashMap();
  1170. mcBody2.put("url","https://open.teambition.com/api/v3/project/" + projectId + "/task/query");
  1171. mcBody2.put("headers",initHeaderToken());
  1172. mcBody2.put("params",UtilMap.map("q", "stageId = " + stageId + " AND taskLayer = onlyTopLevel"));
  1173. Map mcResult2 = (Map) JSON.parse(UtilHttp.doPost("https://mc.cloudpure.cn/api/mc/request/get",null,null,mcBody2));
  1174. List<Map> parentTaskList = (List<Map>)mcResult2.get("result");
  1175. /*TBR parentTaskTbr = (TBR) UtilHttp.doGet("https://open.teambition.com/api/v3/project/" + projectId + "/task/query", initHeaderToken(), UtilMap.map("q", "stageId = " + stageId + " AND taskLayer = onlyTopLevel"), TBR.class);
  1176. List<Map> parentTaskList = (List<Map>) parentTaskTbr.getResult();*/
  1177. for (Map parentTask : parentTaskList) {
  1178. String content = parentTask.get("content").toString();
  1179. if (content.contains(stageName)) {
  1180. Map<String,Object> option = new HashMap<>();
  1181. option.put("text",content);
  1182. option.put("value",parentTask.get("id").toString());
  1183. options.add(option);
  1184. }
  1185. }
  1186. }
  1187. return McR.success(options);
  1188. }
  1189. @Override
  1190. public McR claimBusinessOpportunities(Map map) {
  1191. if (Objects.isNull(map.get("formInstId"))){
  1192. return McR.errorParam("formInstId不能为空");
  1193. }
  1194. if (Objects.isNull(map.get("userId"))){
  1195. return McR.errorParam("userId不能为空");
  1196. }
  1197. String formInstId = map.get("formInstId").toString();
  1198. String userId = map.get("userId").toString();
  1199. userId = userId.substring(userId.indexOf("\"")+1,userId.lastIndexOf("\""));
  1200. //更新商机状态和销售人员
  1201. Map updateFormData = new HashMap();
  1202. updateFormData.put("selectField_m28uros3","跟进中");
  1203. updateFormData.put("employeeField_m2a830k8",userId);
  1204. ydClient.operateData(YDParam.builder()
  1205. .formInstId(formInstId)
  1206. .updateFormDataJson(JSON.toJSONString(updateFormData))
  1207. .build(),YDConf.FORM_OPERATION.update);
  1208. return McR.success();
  1209. }
  1210. @Override
  1211. public McR createTbProject(Map map) {
  1212. if (Objects.isNull(map.get("name")) || Objects.isNull(map.get("uuid"))){
  1213. return McR.errorParam("项目名称或项目唯一标识不能为空");
  1214. }
  1215. String name = map.get("name").toString();
  1216. String uuid = map.get("uuid").toString();
  1217. Map body = new HashMap();
  1218. body.put("name",name);
  1219. body.put("templateId",templateId);
  1220. Map mcBody = new HashMap();
  1221. mcBody.put("url","https://open.teambition.com/api/v3/project/create-from-template");
  1222. mcBody.put("headers",initHeaderToken());
  1223. mcBody.put("params",null);
  1224. mcBody.put("body",body);
  1225. Map mcResult = (Map) JSON.parse(UtilHttp.doPost("https://mc.cloudpure.cn/api/mc/request/post",null,null,mcBody));
  1226. Map result = (Map) mcResult.get("result");
  1227. /*TBR tbr = (TBR) UtilHttp.doPost("https://open.teambition.com/api/v3/project/create-from-template", initHeaderToken(), null,body, TBR.class);
  1228. Map result = (Map) tbr.getResult();*/
  1229. String id = result.get("id").toString();
  1230. //更新项目档案
  1231. ydClient.operateData(YDParam.builder()
  1232. .formUuid("FORM-B43148BB37324A729A852ED7B40E1A10USDA")
  1233. .searchCondition(JSON.toJSONString(UtilMap.map("textField_m03860ye",uuid)))
  1234. .formDataJson(JSON.toJSONString(UtilMap.map("textField_m2cwpzya",id)))
  1235. .build(),YDConf.FORM_OPERATION.upsert);
  1236. return McR.success(id);
  1237. }
  1238. @Override
  1239. public McR addContacts(Map map) {
  1240. if (Objects.isNull(map.get("formInstId"))){
  1241. return McR.errorParam("formInstId不能为空");
  1242. }
  1243. String formInstId = map.get("formInstId").toString();
  1244. //查询线索信息
  1245. DDR_New ddrNew = ydClient.queryData(YDParam.builder()
  1246. .formInstId(formInstId)
  1247. .build(), YDConf.FORM_QUERY.retrieve_id);
  1248. Map formData = ddrNew.getFormData();
  1249. String customerName = getString(formData.get("textField_m2ipea64"));//客户名称
  1250. String customerCode = getString(formData.get("textField_m50vl2jt"));//客户编号
  1251. String contacts = getString(formData.get("textField_m2ipea63"));//联系人
  1252. String phone = getString(formData.get("textField_m2ipea65"));//电话
  1253. List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
  1254. .formUuid("FORM-221A9483B28448089ACBA5B4748D6288KMG5")
  1255. .searchFieldJson(JSONObject.toJSONString(UtilMap.map("textField_m4u3lrdv, textField_lwpquxe4", customerCode, contacts)))
  1256. .build(), YDConf.FORM_QUERY.retrieve_list).getData();
  1257. if (!data.isEmpty()){
  1258. Map updateFormData = (Map) data.get(0).get("formData");
  1259. String updateFormInstId = data.get(0).get("formInstanceId").toString();
  1260. List<String> types = (List<String>) updateFormData.get("multiSelectField_m278ty7s");
  1261. if (types.contains("电话")){
  1262. return McR.success("联系人已存在");
  1263. }else{
  1264. types.add("电话");
  1265. updateFormData.put("multiSelectField_m278ty7s",types);
  1266. updateFormData.put("textField_lwpquxe9",phone);
  1267. ydClient.operateData(YDParam.builder()
  1268. .formInstId(updateFormInstId)
  1269. .updateFormDataJson(JSON.toJSONString(updateFormData))
  1270. .build(), YDConf.FORM_OPERATION.update);
  1271. }
  1272. }else {
  1273. if (!contacts.isEmpty()){
  1274. //新增联系人
  1275. Map contactFormData = new HashMap();
  1276. List<Map> customer = new ArrayList<>();
  1277. Map customerMap = new HashMap();
  1278. customerMap.put("appType",ydConf.getAppType());
  1279. customerMap.put("formUuid","FORM-6F1E2DCFB3F5448EBDD4994551EBF690DVIT");
  1280. customerMap.put("formType","receipt");
  1281. customerMap.put("instanceId",formInstId);
  1282. customerMap.put("title",customerName);
  1283. customerMap.put("subTitle","");
  1284. customer.add(customerMap);
  1285. contactFormData.put("associationFormField_m4qdcril",customer);
  1286. contactFormData.put("textField_lwpquxe4",contacts);
  1287. contactFormData.put("multiSelectField_m278ty7s",new String[]{"电话"});
  1288. contactFormData.put("textField_lwpquxe9",phone);
  1289. contactFormData.put("textField_m0z0e88f",customerName);
  1290. contactFormData.put("textField_m4u3lrdv",customerCode);
  1291. ydClient.operateData(YDParam.builder()
  1292. .formUuid("FORM-221A9483B28448089ACBA5B4748D6288KMG5")
  1293. .formDataJson(JSON.toJSONString(contactFormData))
  1294. .build(), YDConf.FORM_OPERATION.create);
  1295. }
  1296. }
  1297. return McR.success();
  1298. }
  1299. @Override
  1300. public McR stopProcess(Map map) {
  1301. if (Objects.isNull(map.get("formInstId"))){
  1302. return McR.errorParam("formInstId不能为空");
  1303. }
  1304. String formInstId = map.get("formInstId").toString();
  1305. //查询发起人信息
  1306. DDR_New ddrNew = ydClient.queryData(YDParam.builder()
  1307. .formInstId(formInstId)
  1308. .build(), YDConf.FORM_QUERY.retrieve_id);
  1309. Map originator = ddrNew.getOriginator();
  1310. String userId = originator.get("userId").toString();
  1311. //中止流程
  1312. Map params = new HashMap();
  1313. params.put("processInstanceId", formInstId);
  1314. params.put("userId", userId);
  1315. params.put("appType", ydConf.getAppType());
  1316. params.put("systemToken", ydConf.getSystemToken());
  1317. String result = UtilHttp.doPut("https://api.dingtalk.com/v1.0/yida/processes/instances/terminate", ddClient.initTokenHeader(),params, (Map) null);
  1318. return McR.success(result);
  1319. }
  1320. @Override
  1321. public McR getTbStageDetails(String projectName,String projectId,String parentTaskId) {
  1322. Map<String,Object> stageDetail = new HashMap<>();
  1323. //根据项目名称获取项目id
  1324. if (Strings.isNullOrEmpty(projectName) || Strings.isNullOrEmpty(parentTaskId)){
  1325. return McR.errorParam("项目名称或父任务id不能为空!");
  1326. }
  1327. if (Strings.isNullOrEmpty(projectId)){
  1328. /*TBR projectTbr = (TBR) UtilHttp.doGet("https://open.teambition.com/api/v3/project/query", initHeaderToken(), UtilMap.map("name", projectName), TBR.class);
  1329. List<Map> projectList = (List<Map>) projectTbr.getResult();*/
  1330. Map mcBody = new HashMap();
  1331. mcBody.put("url","https://open.teambition.com/api/v3/project/query");
  1332. mcBody.put("headers",initHeaderToken());
  1333. mcBody.put("params",UtilMap.map("name", projectName));
  1334. Map mcResult = (Map) JSON.parse(UtilHttp.doPost("https://mc.cloudpure.cn/api/mc/request/get",null,null,mcBody));
  1335. List<Map> projectList = (List<Map>)mcResult.get("result");
  1336. if (projectList.isEmpty()){
  1337. return McR.errorParam("未在TB中查询到此项目信息!");
  1338. }
  1339. Map projectMap = projectList.get(0);
  1340. projectId = projectMap.get("id").toString();
  1341. }
  1342. //搜索项目自定义字段
  1343. /*TBR cfTbr = (TBR) UtilHttp.doGet("https://open.teambition.com/api/v3/project/"+projectId+"/customfield/search", initHeaderToken(), null, TBR.class);
  1344. List<Map> cfList = (List<Map>) cfTbr.getResult();*/
  1345. Map mcBody = new HashMap();
  1346. mcBody.put("url","https://open.teambition.com/api/v3/project/"+projectId+"/customfield/search");
  1347. mcBody.put("headers",initHeaderToken());
  1348. mcBody.put("params",null);
  1349. Map mcResult = (Map) JSON.parse(UtilHttp.doPost("https://mc.cloudpure.cn/api/mc/request/get",null,null,mcBody));
  1350. List<Map> cfList = (List<Map>)mcResult.get("result");
  1351. Map<String,String> cfMap = new HashMap<>();
  1352. cfList.forEach(cf -> {
  1353. String name = cf.get("name").toString();
  1354. switch (name){
  1355. case "责任部门/角色":
  1356. cfMap.put(cf.get("id").toString(),"dept");
  1357. break;
  1358. case "评审领域":
  1359. cfMap.put(cf.get("id").toString(),"area");
  1360. break;
  1361. case "评审要素":
  1362. cfMap.put(cf.get("id").toString(),"part");
  1363. break;
  1364. case "交付件":
  1365. cfMap.put(cf.get("id").toString(),"file");
  1366. break;
  1367. case "交付件2":
  1368. cfMap.put(cf.get("id").toString(),"file2");
  1369. }
  1370. });
  1371. //搜索项目标签
  1372. /*TBR tagTbr = (TBR) UtilHttp.doGet("https://open.teambition.com/api/v3/project/"+projectId+"/tag/search", initHeaderToken(), null, TBR.class);
  1373. List<Map> tagResult = (List<Map>) tagTbr.getResult();*/
  1374. Map mcBody2 = new HashMap();
  1375. mcBody2.put("url","https://open.teambition.com/api/v3/project/"+projectId+"/tag/search");
  1376. mcBody2.put("headers",initHeaderToken());
  1377. mcBody2.put("params",null);
  1378. Map mcResult2 = (Map) JSON.parse(UtilHttp.doPost("https://mc.cloudpure.cn/api/mc/request/get",null,null,mcBody2));
  1379. List<Map> tagResult = (List<Map>)mcResult2.get("result");
  1380. Map<String,String> tagMap = new HashMap<>();
  1381. tagResult.forEach(tag -> tagMap.put(tag.get("id").toString(),tag.get("name").toString()));
  1382. //搜索任务列表
  1383. /*TBR stageTbr = (TBR) UtilHttp.doGet("https://open.teambition.com/api/v3/project/"+projectId+"/stage/search", initHeaderToken(), null, TBR.class);
  1384. List<Map> stageList = (List<Map>) stageTbr.getResult();*/
  1385. Map mcBody3 = new HashMap();
  1386. mcBody3.put("url","https://open.teambition.com/api/v3/project/"+projectId+"/stage/search");
  1387. mcBody3.put("headers",initHeaderToken());
  1388. mcBody3.put("params",null);
  1389. Map mcResult3 = (Map) JSON.parse(UtilHttp.doPost("https://mc.cloudpure.cn/api/mc/request/get",null,null,mcBody3));
  1390. List<Map> stageList = (List<Map>)mcResult3.get("result");
  1391. Map<String,String> stageMap = new HashMap<>();
  1392. for (Map stage : stageList) {
  1393. String name = stage.get("name").toString().replaceAll("\\s+","");
  1394. if (STAGES.contains(name)){
  1395. stageMap.put(stage.get("id").toString(),name);
  1396. }
  1397. }
  1398. //子任务工作流状态
  1399. Map<String,String> subTaskState = new HashMap<>();
  1400. //查询父任务详情
  1401. /*TBR tbr = (TBR) UtilHttp.doGet("https://open.teambition.com/api/v3/task/query", initHeaderToken(), UtilMap.map("parentTaskId", parentTaskId), TBR.class);
  1402. List<Map<String, Object>> task = (List<Map<String, Object>>) tbr.getResult();*/
  1403. Map mcBody4 = new HashMap();
  1404. mcBody4.put("url","https://open.teambition.com/api/v3/task/query");
  1405. mcBody4.put("headers",initHeaderToken());
  1406. mcBody4.put("params",UtilMap.map("parentTaskId", parentTaskId));
  1407. Map mcResult4 = (Map) JSON.parse(UtilHttp.doPost("https://mc.cloudpure.cn/api/mc/request/get",null,null,mcBody4));
  1408. List<Map<String, Object>> task = (List<Map<String, Object>>)mcResult4.get("result");
  1409. List<Map<String, Object>> list = new ArrayList<>();
  1410. boolean flag = true;
  1411. for (Map<String,Object> subTask : task) {
  1412. //获取子任务工作流状态(一个项目同级子任务的工作流id一样 查询一次)
  1413. if (flag){
  1414. String sfcId = subTask.get("sfcId").toString();//任务类型id
  1415. //查询任务类型
  1416. /*TBR sfcTbr = (TBR) UtilHttp.doGet("https://open.teambition.com/api/v3/project/"+projectId+"/scenariofieldconfig/search", initHeaderToken(), UtilMap.map("sfcIds", sfcId), TBR.class);
  1417. List<Map> sfcList = (List<Map>) sfcTbr.getResult();*/
  1418. Map mcBody5 = new HashMap();
  1419. mcBody5.put("url","https://open.teambition.com/api/v3/project/"+projectId+"/scenariofieldconfig/search");
  1420. mcBody5.put("headers",initHeaderToken());
  1421. mcBody5.put("params",UtilMap.map("sfcIds", sfcId));
  1422. Map mcResult5 = (Map) JSON.parse(UtilHttp.doPost("https://mc.cloudpure.cn/api/mc/request/get",null,null,mcBody5));
  1423. List<Map> sfcList = (List<Map>)mcResult5.get("result");
  1424. String taskFlowId = sfcList.get(0).get("taskflowId").toString();//工作流id
  1425. //获取工作流下所有状态节点信息
  1426. /*TBR tfTbr = (TBR) UtilHttp.doGet("https://open.teambition.com/api/v3/project/"+projectId+"/taskflowstatus/search", initHeaderToken(), UtilMap.map("tfIds", taskFlowId), TBR.class);
  1427. List<Map> tfList = (List<Map>) tfTbr.getResult();*/
  1428. Map mcBody6 = new HashMap();
  1429. mcBody6.put("url","https://open.teambition.com/api/v3/project/"+projectId+"/taskflowstatus/search");
  1430. mcBody6.put("headers",initHeaderToken());
  1431. mcBody6.put("params",UtilMap.map("tfIds", taskFlowId));
  1432. Map mcResult6 = (Map) JSON.parse(UtilHttp.doPost("https://mc.cloudpure.cn/api/mc/request/get",null,null,mcBody6));
  1433. List<Map> tfList = (List<Map>)mcResult6.get("result");
  1434. for (Map tf : tfList) {
  1435. String name = tf.get("name").toString();
  1436. String tfsId = tf.get("id").toString();
  1437. subTaskState.put(tfsId, name);
  1438. }
  1439. flag = false;
  1440. }
  1441. Map<String,Object> taskDetail = new HashMap<>();
  1442. String content2 = subTask.get("content").toString();
  1443. taskDetail.put("content", content2);
  1444. taskDetail.put("url", TASK_URL_PREFIX + subTask.get("id"));
  1445. String tfsId = subTask.get("tfsId").toString();//工作流状态id
  1446. taskDetail.put("state", subTaskState.get(tfsId));//任务状态
  1447. List<Map<String,Object>> customfields = (List<Map<String,Object>>) subTask.get("customfields");
  1448. taskDetail.put("dept", "");
  1449. taskDetail.put("part", "");
  1450. taskDetail.put("area", "");
  1451. taskDetail.put("file", "");
  1452. taskDetail.put("file2", "");
  1453. if (!customfields.isEmpty()){
  1454. for (Map<String, Object> customfield : customfields) {
  1455. String cfId = customfield.get("cfId").toString();
  1456. if (cfMap.containsKey(cfId)){
  1457. String cfName = cfMap.get(cfId);
  1458. List<Map<String, Object>> value = (List<Map<String, Object>>) customfield.get("value");
  1459. if (!value.isEmpty()){
  1460. String title = value.get(0).get("title").toString();
  1461. taskDetail.put(cfName, title);
  1462. }
  1463. }
  1464. }
  1465. }
  1466. taskDetail.put("carTag", "");
  1467. taskDetail.put("payTag", "");
  1468. List<String> tagIds = (List<String>) subTask.get("tagIds");
  1469. if (!tagIds.isEmpty()){
  1470. for (String tagId : tagIds) {
  1471. if (tagMap.containsKey(tagId)) {
  1472. if (tagMap.get(tagId).contains("车载")){
  1473. taskDetail.put("carTag", tagMap.get(tagId).substring(3,5));
  1474. }else if (tagMap.get(tagId).contains("消费")){
  1475. taskDetail.put("payTag", tagMap.get(tagId).substring(3,5));
  1476. }
  1477. }
  1478. }
  1479. }
  1480. list.add(taskDetail);
  1481. }
  1482. //获取父任务工作流状态
  1483. //获取父任务详情
  1484. /*TBR tbr2 = (TBR) UtilHttp.doGet("https://open.teambition.com/api/v3/task/query", initHeaderToken(), UtilMap.map("taskId", parentTaskId), TBR.class);
  1485. List<Map<String, Object>> result2 = (List<Map<String, Object>>) tbr2.getResult();*/
  1486. Map mcBody6 = new HashMap();
  1487. mcBody6.put("url","https://open.teambition.com/api/v3/task/query");
  1488. mcBody6.put("headers",initHeaderToken());
  1489. mcBody6.put("params",UtilMap.map("taskId", parentTaskId));
  1490. Map mcResult6 = (Map) JSON.parse(UtilHttp.doPost("https://mc.cloudpure.cn/api/mc/request/get",null,null,mcBody6));
  1491. List<Map<String, Object>> result2 = (List<Map<String, Object>>)mcResult6.get("result");
  1492. String sfcId = result2.get(0).get("sfcId").toString();
  1493. String tfsId = result2.get(0).get("tfsId").toString();
  1494. //获取项目任务类型
  1495. /*TBR tbr3 = (TBR) UtilHttp.doGet("https://open.teambition.com/api/v3/project/"+projectId+"/scenariofieldconfig/search", initHeaderToken(), UtilMap.map("sfcIds", sfcId), TBR.class);
  1496. List<Map<String, Object>> result3 = (List<Map<String, Object>>) tbr3.getResult();*/
  1497. Map mcBody7 = new HashMap();
  1498. mcBody7.put("url","https://open.teambition.com/api/v3/project/"+projectId+"/scenariofieldconfig/search");
  1499. mcBody7.put("headers",initHeaderToken());
  1500. mcBody7.put("params",UtilMap.map("sfcIds", sfcId));
  1501. Map mcResult7 = (Map) JSON.parse(UtilHttp.doPost("https://mc.cloudpure.cn/api/mc/request/get",null,null,mcBody7));
  1502. List<Map<String, Object>> result3 = (List<Map<String, Object>>)mcResult7.get("result");
  1503. String taskflowId = result3.get(0).get("taskflowId").toString();
  1504. //搜索项目工作流状态
  1505. /*TBR tbr4 = (TBR) UtilHttp.doGet("https://open.teambition.com/api/v3/project/" + projectId + "/taskflowstatus/search", initHeaderToken(), UtilMap.map("tfIds", taskflowId), TBR.class);
  1506. List<Map<String, Object>> result4 = (List<Map<String, Object>>) tbr4.getResult();*/
  1507. Map mcBody8 = new HashMap();
  1508. mcBody8.put("url","https://open.teambition.com/api/v3/project/" + projectId + "/taskflowstatus/search");
  1509. mcBody8.put("headers",initHeaderToken());
  1510. mcBody8.put("params",UtilMap.map("tfIds", taskflowId));
  1511. Map mcResult8 = (Map) JSON.parse(UtilHttp.doPost("https://mc.cloudpure.cn/api/mc/request/get",null,null,mcBody8));
  1512. List<Map<String, Object>> result4 = (List<Map<String, Object>>)mcResult8.get("result");
  1513. result4.forEach(tf -> {
  1514. if (tf.get("id").toString().equals(tfsId)){
  1515. stageDetail.put("state", tf.get("name").toString());
  1516. }
  1517. });
  1518. stageDetail.put("list",list);
  1519. /*if (stageName.equals(content)){
  1520. parentTaskId = parentTask.get("id").toString();
  1521. //查询子任务信息
  1522. break;
  1523. }*/
  1524. /* for (String stageId : stageMap.keySet()) {
  1525. TBR parentTaskTbr = (TBR) UtilHttp.doGet("https://open.teambition.com/api/v3/project/" + projectId + "/task/query", initHeaderToken(), UtilMap.map("q", "stageId = " + stageId + " AND taskLayer = onlyTopLevel"), TBR.class);
  1526. List<Map> parentTaskList = (List<Map>) parentTaskTbr.getResult();
  1527. for (Map parentTask : parentTaskList) {
  1528. String content = parentTask.get("content").toString();
  1529. String parentTaskId = "";
  1530. }
  1531. }*/
  1532. return McR.success(stageDetail);
  1533. }
  1534. private Map<String, String> initHeaderToken() {
  1535. Map header = new HashMap();
  1536. header.put("Authorization", this.getAccessToken());
  1537. header.put("X-Tenant-Id", this.tbConf.getTenantId());
  1538. header.put("X-Tenant-Type", "organization");
  1539. header.put("x-operator-id", this.tbConf.getOperatorId());
  1540. return header;
  1541. }
  1542. private String getAccessToken() {
  1543. synchronized(this.$lock) {
  1544. String accessToken = UtilToken.get("invalid-token-teambition");
  1545. if (StringUtils.isNotBlank(accessToken)) {
  1546. return accessToken;
  1547. } else {
  1548. Algorithm algorithm = Algorithm.HMAC256(this.tbConf.getAppSecret());
  1549. long timestamp = System.currentTimeMillis();
  1550. Date issuedAt = new Date(timestamp);
  1551. Date expiresAt = new Date(timestamp + EXPIRES_IN);
  1552. accessToken = JWT.create().withClaim("_appId", this.tbConf.getAppID()).withIssuedAt(issuedAt).withExpiresAt(expiresAt).sign(algorithm);
  1553. log.info("响应token, {}", accessToken);
  1554. UtilToken.put("invalid-token-teambition", accessToken, EXPIRES_IN);
  1555. return accessToken;
  1556. }
  1557. }
  1558. }
  1559. }