package com.malk.lingmingguangzi.service; import cn.hutool.core.date.DateUtil; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.auth0.jwt.JWT; import com.auth0.jwt.algorithms.Algorithm; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.malk.server.aliwork.YDConf; import com.malk.server.aliwork.YDParam; import com.malk.server.common.McR; import com.malk.server.dingtalk.DDR_New; import com.malk.server.teambition.TBConf; import com.malk.server.teambition.TBR; import com.malk.service.aliwork.YDClient; import com.malk.service.dingtalk.DDClient; import com.malk.utils.UtilHttp; import com.malk.utils.UtilMap; import com.malk.utils.UtilToken; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpEntity; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.ContentType; import org.apache.http.entity.mime.MultipartEntityBuilder; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.nio.file.Files; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; @Service @Slf4j public class LingmingguangziServiceImpl implements LingmingguangziService { @Autowired private YDClient ydClient; @Autowired private YDConf ydConf; @Autowired private TBConf tbConf; @Autowired private DDClient ddClient; @Value(value = "${erp.url}") private String erpUrl; @Value(value = "${erp.username}") private String userName; @Value(value = "${erp.password}") private String password; @Value(value = "${erp.filePath}") private String filePath; private final Object $lock = new Object[0]; private static final Long EXPIRES_IN = 7200000L; private static final String TASK_URL_PREFIX = "https://www.teambition.com/project/65bb53546a74a42e2d608f05/tasks/view/65bb5354a0d7b85bc253f863/task/"; private static final Map STAGES = new HashMap<>(); private static final Map TAGS = new HashMap<>(); static { STAGES.put("666fff1ec8e7e2eaab75bd81", "TR评审");//TR评审 STAGES.put("666fff1ebe648654141a5b8b", "TO评审");//TR评审 STAGES.put("666fff6fa0f1ab8063960627", "EV评审");//EV评审 STAGES.put("666fff883a26df9ebce13918", "DV评审");//DV评审 STAGES.put("666fffd4976f23a2d7cf13e1", "PV评审");//PV评审 STAGES.put("666ffff2592db27f2d342d02", "MP评审");//MP评审 TAGS.put("667002dff456184e9dc794a4", "消费(必选)");//消费(必选) TAGS.put("6670028d536f774f09d300f5", "消费(可选)");//消费(可选) TAGS.put("6670027cb986d723e63be2a5", "车载(必选)");//车载(必选) TAGS.put("667002667e0222a2169802dc", "车载(可选)");//车载(可选) } @Override public McR test() { log.info("test"); return McR.success(); } @Override public McR getCustomerQuestionnaireCount(Long start, Long end) { YDParam.YDParamBuilder ydParamBuilder = YDParam.builder() .formUuid("FORM-5CC9748D283C49FC8C8A86EE0529730A4I1D"); if (start != null && end != null){ String startDate = DateUtil.format(new Date(start), "yyyy-MM-dd HH:mm:ss"); String endDate = DateUtil.format(DateUtil.offsetDay(new Date(end),1), "yyyy-MM-dd HH:mm:ss"); ydParamBuilder.createFromTimeGMT(startDate); ydParamBuilder.createToTimeGMT(endDate); } //车载-------------------------------------------- DDR_New ddrNew = ydClient.queryData(ydParamBuilder.build(), YDConf.FORM_QUERY.retrieve_list); List dataList = (List) ddrNew.getData(); int importantCustomerCount = 0; int orderCustomerCount = 0; int strategicCustomerCount = 0; for (Map data : dataList) { Map formData = (Map) data.get("formData"); String customerLevel = String.valueOf(formData.get("selectField_lx4g7em6")); switch (customerLevel){ case "重要客户": importantCustomerCount++; break; case "订单客户": orderCustomerCount++; break; case "战略客户": strategicCustomerCount++; break; } } Map result = new HashMap<>(); result.put("importantCustomerCount", importantCustomerCount); result.put("orderCustomerCount", orderCustomerCount); result.put("strategicCustomerCount", strategicCustomerCount); return McR.success(result); } @Override public McR getCustomerQuestionnaireCount2(Long start, Long end) { YDParam.YDParamBuilder ydParamBuilder = YDParam.builder() .formUuid("FORM-D4587ABF101246F6B17635C8CB178B6BGTAW"); if (start != null && end != null){ String startDate = DateUtil.format(new Date(start), "yyyy-MM-dd HH:mm:ss"); String endDate = DateUtil.format(DateUtil.offsetDay(new Date(end),1), "yyyy-MM-dd HH:mm:ss"); ydParamBuilder.createFromTimeGMT(startDate); ydParamBuilder.createToTimeGMT(endDate); } //商务端 DDR_New ddrNew = ydClient.queryData(ydParamBuilder.build(), YDConf.FORM_QUERY.retrieve_list); List dataList = (List) ddrNew.getData(); int businessCustomerCount = 0; int technologyCustomerCount = 0; int qualityCustomerCount = 0; for (Map data : dataList) { Map formData = (Map) data.get("formData"); String project = formData.get("selectField_lwragwwz").toString();//项目 switch (project) { case "交付":businessCustomerCount++;break; case "技术":technologyCustomerCount++;break; case "质量":qualityCustomerCount++;break; } } Map result = new HashMap<>(); result.put("businessCustomerCount",businessCustomerCount); result.put("technologyCustomerCount",technologyCustomerCount); result.put("qualityCustomerCount",qualityCustomerCount); return McR.success(result); } @Override public McR addCustomer(Map map) { if (Objects.isNull(map.get("formInstId"))){ return McR.errorParam("formInstId不能为空"); } String formInstId = map.get("formInstId").toString(); Map formData = ydClient.queryData(YDParam.builder().formInstId(formInstId).build(), YDConf.FORM_QUERY.retrieve_id).getFormData(); Map body = new HashMap<>(); body.put("customerCode", formData.get("textField_lwpqbm7a").toString()); body.put("customerName", formData.get("textField_lwpqbm7b").toString()); String recCondition = formData.get("selectField_lwpqbm7r").toString(); switch (recCondition){ case "货到收款": body.put("recConditionCode", "SKTJ01_SYS");break; case "30天后收款":body.put("recConditionCode", "SKTJ02_SYS");break; case "月结30天":body.put("recConditionCode", "SKTJ03_SYS");break; case "多到期日(按金额)":body.put("recConditionCode", "SKTJ04_SYS");break; } String payCurrency = formData.get("selectField_lwpqbm7s").toString(); switch (payCurrency){ case "人民币": body.put("payCurrencyCode", "PRE001");break; case "香港元":body.put("payCurrencyCode", "PRE002");break; case "欧元":body.put("payCurrencyCode", "PRE003");break; case "日本日元":body.put("payCurrencyCode", "PRE004");break; case "新台币元":body.put("payCurrencyCode", "PRE005");break; case "英镑":body.put("payCurrencyCode", "PRE006");break; case "美元":body.put("payCurrencyCode", "PRE007");break; } //客户简称 if (Objects.nonNull(formData.get("textField_lwpqbm7c"))){ body.put("customerShortName", formData.get("textField_lwpqbm7c").toString()); } //客户英文名 if (Objects.nonNull(formData.get("textField_lwpqbm7d"))){ body.put("customerEnglishName", formData.get("textField_lwpqbm7d").toString()); } //地址 if (Objects.nonNull(formData.get("textField_lwpqbm7t"))){ body.put("address", formData.get("textField_lwpqbm7t").toString()); } //联系人 if (Objects.nonNull(formData.get("textField_lwpqbm7u"))){ body.put("linkMan", formData.get("textField_lwpqbm7u").toString()); } //联系电话 if (Objects.nonNull(formData.get("textField_lwpqbm7v"))){ body.put("linkNumber", formData.get("textField_lwpqbm7v").toString()); } //内/外销 if (Objects.nonNull(formData.get("selectField_lwpqbm82"))){ String makCustomerType = formData.get("selectField_lwpqbm82").toString(); switch (makCustomerType){ case "001": body.put("makCustomerType", "001");break; case "002":body.put("makCustomerType", "002");break; } } //备注 if (Objects.nonNull(formData.get("textareaField_lwpqbm7x"))){ body.put("comments", formData.get("textareaField_lwpqbm7x").toString()); } Map result = post(erpUrl + "pws/mak/makCustomer/add", null, getHeader(), body); if ((boolean) result.get("success")){ return McR.success(); }else { return McR.errorUnknown(result.get("message").toString()); } } @Override public McR updateCustomer(Map map) { if (Objects.isNull(map.get("formInstId"))){ return McR.errorParam("formInstId不能为空"); } String formInstId = map.get("formInstId").toString(); Map formData = ydClient.queryData(YDParam.builder().formInstId(formInstId).build(), YDConf.FORM_QUERY.retrieve_id).getFormData(); Map body = new HashMap<>(); body.put("customerCode", formData.get("textField_lwpqbm7a").toString()); body.put("customerName", formData.get("textField_lwpqbm7b").toString()); String recCondition = formData.get("selectField_lwpqbm7r").toString(); switch (recCondition){ case "货到收款": body.put("recConditionCode", "SKTJ01_SYS");break; case "30天后收款":body.put("recConditionCode", "SKTJ02_SYS");break; case "月结30天":body.put("recConditionCode", "SKTJ03_SYS");break; case "多到期日(按金额)":body.put("recConditionCode", "SKTJ04_SYS");break; } String payCurrency = formData.get("selectField_lwpqbm7s").toString(); switch (payCurrency){ case "人民币": body.put("payCurrencyCode", "PRE001");break; case "香港元":body.put("payCurrencyCode", "PRE002");break; case "欧元":body.put("payCurrencyCode", "PRE003");break; case "日本日元":body.put("payCurrencyCode", "PRE004");break; case "新台币元":body.put("payCurrencyCode", "PRE005");break; case "英镑":body.put("payCurrencyCode", "PRE006");break; case "美元":body.put("payCurrencyCode", "PRE007");break; } //客户简称 if (Objects.nonNull(formData.get("textField_lwpqbm7c"))){ body.put("customerShortName", formData.get("textField_lwpqbm7c").toString()); } //客户英文名 if (Objects.nonNull(formData.get("textField_lwpqbm7d"))){ body.put("customerEnglishName", formData.get("textField_lwpqbm7d").toString()); } //地址 if (Objects.nonNull(formData.get("textField_lwpqbm7t"))){ body.put("address", formData.get("textField_lwpqbm7t").toString()); } //联系人 if (Objects.nonNull(formData.get("textField_lwpqbm7u"))){ body.put("linkMan", formData.get("textField_lwpqbm7u").toString()); } //联系电话 if (Objects.nonNull(formData.get("textField_lwpqbm7v"))){ body.put("linkNumber", formData.get("textField_lwpqbm7v").toString()); } //内/外销 if (Objects.nonNull(formData.get("selectField_lwpqbm82"))){ String makCustomerType = formData.get("selectField_lwpqbm82").toString(); switch (makCustomerType){ case "001": body.put("makCustomerType", "001");break; case "002":body.put("makCustomerType", "002");break; } } //备注 if (Objects.nonNull(formData.get("textareaField_lwpqbm7x"))){ body.put("comments", formData.get("textareaField_lwpqbm7x").toString()); } Map result = put(erpUrl + "pws/mak/makCustomer/customEdit", null, getHeader(), body); if ((boolean) result.get("success")){ return McR.success(); }else { return McR.errorUnknown(result.get("message").toString()); } } @Override public McR getProductDeliveryStatus(String keyword,int pageNo,int pageSize) { Map param = new HashMap<>(); param.put("pageNo",pageNo); param.put("pageSize",pageSize); param.put("saleCode",keyword); Map res = get(erpUrl + "pws/pdm/pdmProductForm/list", param, getHeader()); Map result = (Map) res.get("result"); List data = (List) result.get("records"); if (data.isEmpty()){ param.remove("saleCode"); param.put("saleName",keyword); res = get(erpUrl + "pws/pdm/pdmProductForm/list", param, getHeader()); result = (Map) res.get("result"); data = (List) result.get("records"); } int totalCount = (int) result.get("total"); int currentPage = (int) result.get("current"); Map map = new HashMap(); map.put("data",data); map.put("totalCount",totalCount); map.put("currentPage",currentPage); return McR.success(map); } @Override public McR getProcess(int pageNo,int pageSize) { Map param = new HashMap(); param.put("active","D2_SUCCESS"); param.put("pageNo",pageNo); param.put("pageSize",pageSize); Map res = get(erpUrl + "pws/pdm/pdmStation/list", param, getHeader()); Map result = (Map) res.get("result"); List data = (List) result.get("records"); int totalCount = (int) result.get("total"); int currentPage = (int) result.get("current"); Map map = new HashMap(); map.put("data",data); map.put("totalCount",totalCount); map.put("currentPage",currentPage); return McR.success(map); } @Override public McR getTaxRate() { Map param = new HashMap(); param.put("pageNo",1); param.put("pageSize",50); Map res = get(erpUrl + "pws/fin/finTax/list", param, getHeader()); Map result = (Map) res.get("result"); List records = (List) result.get("records"); List list = records.stream().map(map1 -> map1.get("taxName").toString()).collect(Collectors.toList()); return McR.success(list); } @Override public McR addSaleOrder(Map map) { if (Objects.isNull(map.get("formInstId"))){ McR.errorParam("formInstId不能为空"); } String formInstId = map.get("formInstId").toString(); Map formData = ydClient.queryData(YDParam.builder().formInstId(formInstId) .build(), YDConf.FORM_QUERY.retrieve_id).getFormData(); //新增销售订单 Map body = new HashMap(); body.put("customerCode",getString(formData.get("textField_ly5m36nw")));//客户编码 String priority = getString(formData.get("selectField_lwpsp162"));//紧急级别 switch (priority) { case "普通": body.put("priority", "D1_NORMAL "); break; case "紧急": body.put("priority", "D2_URGENT"); break; case "特紧急": body.put("priority", "D3_VERY_URGENT"); break; } String soType = getString(formData.get("selectField_lx2xj36n"));//订单类型 switch (soType) { case "销售订单": body.put("soType", "D1_SALES_ORDER"); break; case "预测订单": body.put("soType", "D2_FORECAST_ORDER"); break; } body.put("deliveryDate",getString(formData.get("textField_m0aduyx1")));//希望交期 body.put("salesperson",getString(formData.get("textField_m0aduyx9")));//销售员 body.put("payCurrencyCode",getString(formData.get("textField_m0aduyxa")));//币别 body.put("ioDate",getString(formData.get("textField_m0aduyx2")));//单据日期 body.put("comments",getString(formData.get("textareaField_lwpsp16e")));//备注 //销售订单明细 List list = (List) formData.get("tableField_lwpsp16f"); List makSoDetailList = list.stream().map(map1 -> { Map detail = new HashMap(); detail.put("productFormId",getString(map1.get("textField_m03o1x0m")));//交付状态id detail.put("saleCode",getString(map1.get("textField_lwpsp16g")));//交付名称 detail.put("saleName",getString(map1.get("textField_lwpsp16h")));//交付说明 detail.put("customerModel",getString(map1.get("textField_lwpsp16i")));//客户型号 detail.put("partnumber",getString(map1.get("textField_lwpsp16k")));//物料编码 detail.put("partname",getString(map1.get("textField_lwpsp16m")));//物料名称 detail.put("pmodel",getString(map1.get("textField_lwpsp16o")));//物料型号 detail.put("pstandard",getString(map1.get("textField_lwpsp16q")));//物料规格 detail.put("stationCode",getString(map1.get("textField_m053iuol")));//工序编码 detail.put("waferQty",getString(map1.get("numberField_lwpsp16t")));//片数 detail.put("qty",getString(map1.get("numberField_lwpsp16v")));//数量 detail.put("quotation",getString(map1.get("numberField_lwpsp172")));//未税单价 detail.put("subTotal",getString(map1.get("numberField_lwpz9exp")));//未税总价 detail.put("taxRate",getString(map1.get("numberField_m053iuom")));//税率 detail.put("taxQuotation",getString(map1.get("numberField_lwpsp175")));//含税单价 detail.put("taxSubtotal",getString(map1.get("numberField_lwpsp177")));//含税总价 detail.put("die_model","");// return detail; }).collect(Collectors.toList()); //附件 List list2 = (List) formData.get("tableField_ly8fxusx"); List makSoFilesList = list2.stream().map(map1 -> { Map detail = new HashMap(); String fileType = getString(map1.get("selectField_m0ls7yb8")); if (fileType.equals("合同")){ detail.put("fileType","D1_CONTRACT"); }else { detail.put("fileType","D2_TECHNICAL_DOC"); } List fileList = (List) JSONArray.parse(String.valueOf(map1.get("attachmentField_ly8fxusz"))); String ydDownloadUrl = fileList.get(0).get("downloadUrl").toString(); String fileName = fileList.get(0).get("name").toString(); //将downloadurl下载到本地 try { downloadFile(ydDownloadUrl, filePath + fileName); System.out.println("文件下载成功!"); } catch (IOException e) { e.printStackTrace(); } //上传附件 detail.put("files",postWithFile(erpUrl + "pws/sys/common/upload",filePath + fileName)); return detail; }).collect(Collectors.toList()); body.put("makSoDetailList",makSoDetailList); body.put("makSoFilesList",makSoFilesList); Map res = post(erpUrl + "pws/mak/makSalesOrder/add", null, getHeader(), body); String orderCode = getString(res.get("result")); //更新宜搭订单编号 ydClient.operateData(YDParam.builder() .formInstId(formInstId) .updateFormDataJson(JSON.toJSONString(UtilMap.map("textField_m0alsjj1",orderCode))) .build(),YDConf.FORM_OPERATION.update); return McR.success(); } public void downloadFile(String fileURL, String savePath) throws IOException { //若是宜搭附件url 则需获得附件临时免登地址 Map param = new HashMap<>(); param.put("systemToken",ydConf.getSystemToken()); param.put("userId","344749020127590108");//wzy param.put("fileUrl",fileURL); fileURL = ((DDR_New) UtilHttp.doGet("https://api.dingtalk.com/v1.0/yida/apps/temporaryUrls/" + ydConf.getAppType(), ddClient.initTokenHeader(), param, DDR_New.class)).getResult().toString(); URL url = new URL(fileURL); HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); int responseCode = httpConn.getResponseCode(); // 检查HTTP响应代码是否为200 if (responseCode == HttpURLConnection.HTTP_OK) { InputStream inputStream = httpConn.getInputStream(); FileOutputStream outputStream = new FileOutputStream(savePath); byte[] buffer = new byte[4096]; int bytesRead = -1; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } outputStream.close(); inputStream.close(); } else { System.out.println("无法下载文件。HTTP响应代码: " + responseCode); } httpConn.disconnect(); } @Override public McR updateSaleOrder(Map map) { if (Objects.isNull(map.get("formInstId"))){ McR.errorParam("formInstId不能为空"); } String formInstId = map.get("formInstId").toString(); Map formData = ydClient.queryData(YDParam.builder().formInstId(formInstId) .build(), YDConf.FORM_QUERY.retrieve_id).getFormData(); //更新销售订单 Map body = new HashMap(); body.put("soCode",getString(formData.get("textField_m0alsjj1"))); body.put("customerCode",getString(formData.get("textField_ly5m36nw")));//客户编码 String priority = getString(formData.get("selectField_lwpsp162"));//紧急级别 switch (priority) { case "普通": body.put("priority", "D1_NORMAL "); break; case "紧急": body.put("priority", "D2_URGENT"); break; case "特紧急": body.put("priority", "D3_VERY_URGENT"); break; } String soType = getString(formData.get("selectField_lx2xj36n"));//订单类型 switch (soType) { case "销售订单": body.put("soType", "D1_SALES_ORDER"); break; case "预测订单": body.put("soType", "D2_FORECAST_ORDER"); break; } body.put("deliveryDate",getString(formData.get("textField_m0aduyx1")));//希望交期 body.put("salesperson",getString(formData.get("textField_m0aduyx9")));//销售员 body.put("payCurrencyCode",getString(formData.get("textField_m0aduyxa")));//币别 body.put("ioDate",getString(formData.get("textField_m0aduyx2")));//单据日期 body.put("comments",getString(formData.get("textareaField_lwpsp16e")));//备注 //销售订单明细 List list = (List) formData.get("tableField_lwpsp16f"); List makSoDetailList = list.stream().map(map1 -> { Map detail = new HashMap(); detail.put("productFormId",getString(map1.get("textField_m03o1x0m")));//交付状态id detail.put("saleCode",getString(map1.get("textField_lwpsp16g")));//交付名称 detail.put("saleName",getString(map1.get("textField_lwpsp16h")));//交付说明 detail.put("customerModel",getString(map1.get("textField_lwpsp16i")));//客户型号 detail.put("partnumber",getString(map1.get("textField_lwpsp16k")));//物料编码 detail.put("partname",getString(map1.get("textField_lwpsp16m")));//物料名称 detail.put("pmodel",getString(map1.get("textField_lwpsp16o")));//物料型号 detail.put("pstandard",getString(map1.get("textField_lwpsp16q")));//物料规格 detail.put("stationCode",getString(map1.get("textField_m053iuol")));//工序编码 detail.put("waferQty",getString(map1.get("numberField_lwpsp16t")));//片数 detail.put("qty",getString(map1.get("numberField_lwpsp16v")));//数量 detail.put("quotation",getString(map1.get("numberField_lwpsp172")));//未税单价 detail.put("subTotal",getString(map1.get("numberField_lwpz9exp")));//未税总价 detail.put("taxRate",getString(map1.get("numberField_m053iuom")));//税率 detail.put("taxQuotation",getString(map1.get("numberField_lwpsp175")));//含税单价 detail.put("taxSubtotal",getString(map1.get("numberField_lwpsp177")));//含税总价 detail.put("die_model","");// return detail; }).collect(Collectors.toList()); //附件 List list2 = (List) formData.get("tableField_ly8fxusx"); List makSoFilesList = list2.stream().map(map1 -> { Map detail = new HashMap(); String fileType = getString(map1.get("selectField_m0ls7yb8")); if (fileType.equals("合同")){ detail.put("fileType","D1_CONTRACT"); }else { detail.put("fileType","D2_TECHNICAL_DOC"); } List fileList = (List) JSONArray.parse(String.valueOf(map1.get("attachmentField_ly8fxusz"))); String ydDownloadUrl = fileList.get(0).get("downloadUrl").toString(); String fileName = fileList.get(0).get("name").toString(); //将downloadurl下载到本地 try { downloadFile(ydDownloadUrl, filePath + fileName); System.out.println("文件下载成功!"); } catch (IOException e) { e.printStackTrace(); } //上传附件 detail.put("files",postWithFile(erpUrl + "pws/sys/common/upload",filePath + fileName)); return detail; }).collect(Collectors.toList()); body.put("makSoDetailList",makSoDetailList); body.put("makSoFilesList",makSoFilesList); Map res = put(erpUrl + "pws/mak/makSalesOrder/change", null, getHeader(), body); return McR.success(); } private String getString(Object object){ return (object == null) ? "" : object.toString(); } private Map getHeader(){ Map map = post(erpUrl + "pws/sys/mLogin", null, null,UtilMap.map("username, password",userName,password)); if (Objects.nonNull(map.get("result"))){ Map result = (Map) map.get("result"); if (Objects.nonNull(result.get("token"))){ Map header = new HashMap<>(); header.put("X-Access-Token", result.get("token").toString()); return header; } } return null; } /** * 封装GET请求 * * @param url 请求的URL * @param params 请求参数 * @param headers 请求头 * @return 响应内容 */ public static Map get(String url, Map params, Map headers) { log.info("GET 请求url:{}, 请求参数:{}, 请求头:{}", url, params, headers); HttpRequest get = HttpUtil.createGet(url); if (params!= null){ get.form(params); } if (headers!= null){ get.addHeaders(headers); } HttpResponse response = get.execute(); Map result = null; try { ObjectMapper objectMapper = new ObjectMapper(); result = objectMapper.readValue(response.body(), new TypeReference>() {}); } catch (JsonProcessingException e) { throw new RuntimeException(e); } log.info("响应结果: {}", result); return result; } /** * 封装POST请求 * * @param url 请求的URL * @param params 请求参数 * @param headers 请求头 * @param body 请求体 * @return 响应内容 */ public static Map post(String url, Map params, Map headers, Map body) { log.info("POST 请求url:{}, 请求参数:{}, 请求头:{}, 请求体:{}", url, params, headers, body); HttpRequest request = HttpUtil.createPost(url); if (params != null) { request.form(params); } if (headers != null) { request.addHeaders(headers); } if (body != null) { request.body(JSONUtil.toJsonStr(body), "application/json"); } HttpResponse response = request.execute(); // Map result = JSONUtil.toBean(response.body(), Map.class); Map result = null; try { ObjectMapper objectMapper = new ObjectMapper(); result = objectMapper.readValue(response.body(), new TypeReference>() {}); } catch (JsonProcessingException e) { throw new RuntimeException(e); } log.info("响应结果: {}", result); return result; } public static Map put(String url, Map params, Map headers, Map body) { log.info("PUT 请求url:{}, 请求参数:{}, 请求头:{}, 请求体:{}", url, params, headers, body); HttpRequest request = HttpRequest.put(url); if (params != null) { request.form(params); } if (headers != null) { request.addHeaders(headers); } if (body != null) { request.body(JSONUtil.toJsonStr(body), "application/json"); } HttpResponse response = request.execute(); // Map result = JSONUtil.toBean(response.body(), Map.class); Map result = null; try { ObjectMapper objectMapper = new ObjectMapper(); result = objectMapper.readValue(response.body(), new TypeReference>() {}); } catch (JsonProcessingException e) { throw new RuntimeException(e); } log.info("响应结果: {}", result); return result; } public String postWithFile(String url, String filePath) { // 文件路径 File file = new File(filePath); // 创建HttpClient实例 HttpClient client = HttpClients.createDefault(); // 创建HttpPost实例 HttpPost post = new HttpPost(url); // 添加请求头 post.setHeader("X-Access-Token", getHeader().get("X-Access-Token")); // 使用MultipartEntityBuilder来构建multipart请求 MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.addBinaryBody("file", file, ContentType.DEFAULT_BINARY, file.getName()); // 设置请求体 HttpEntity multipart = builder.build(); post.setEntity(multipart); try { // 发送请求并获取响应 org.apache.http.HttpResponse response = client.execute(post); // 处理响应 // 例如,打印响应状态码 System.out.println(response.getStatusLine().getStatusCode()); HttpEntity entity = response.getEntity(); String fileName = ""; // 判断响应实体是否为null if (entity != null) { // 使用EntityUtils读取响应体内容(这里假设是文本类型) String responseString = EntityUtils.toString(entity, "UTF-8"); // 指定字符集 System.out.println("Response Body: " + responseString); Map parse = (Map) JSONObject.parse(responseString); fileName = getString(parse.get("message")); // 释放响应实体资源(虽然EntityUtils.toString()在某些HttpClient版本中会自动处理) EntityUtils.consume(entity); } return fileName; } catch (IOException e) { e.printStackTrace(); } return null; } @Override public McR getTbStageDetails(String stageName) { Map result = new HashMap<>(); //查询子任务信息 for (String stage : STAGES.keySet()) { if (STAGES.get(stage).equals(stageName)){ Map stageDetail = new HashMap<>(); TBR tbr = (TBR) UtilHttp.doGet("https://open.teambition.com/api/v3/task/query", initHeaderToken(), UtilMap.map("parentTaskId", stage), TBR.class); List> task = (List>) tbr.getResult(); List> list = new ArrayList<>(); for (Map subTask : task) { Map taskDetail = new HashMap<>(); String content = subTask.get("content").toString(); taskDetail.put("content", content); taskDetail.put("url", TASK_URL_PREFIX + subTask.get("id")); //查询子任务状态 String tfsId = subTask.get("tfsId").toString(); TBR tbr3 = (TBR) UtilHttp.doGet("https://open.teambition.com/api/v3/project/65bb53546a74a42e2d608f05/taskflowstatus/search", initHeaderToken(), UtilMap.map("tfsIds",tfsId), TBR.class); List> result3 = (List>) tbr3.getResult(); String state = result3.get(0).get("name").toString(); taskDetail.put("state", state); List> customfields = (List>) subTask.get("customfields"); taskDetail.put("dept", ""); taskDetail.put("part", ""); taskDetail.put("area", ""); taskDetail.put("file", ""); taskDetail.put("file2", ""); if (!customfields.isEmpty()){ for (Map customfield : customfields) { String cfId = customfield.get("cfId").toString(); List> value = (List>) customfield.get("value"); if (!value.isEmpty()){ String title = value.get(0).get("title").toString(); switch (cfId){ case "666feed723d86af4c9c9f3c6":taskDetail.put("dept", title);break;//责任部门/角色 case "666fef0f5b836a19902b47bf":taskDetail.put("part", title);break;//评审要素 case "666fef06cdcac0bbc164930e":taskDetail.put("area", title);break;//评审领域 case "668def21d56d44adafe00d56":taskDetail.put("file", title);break;//交付件 case "668df08b82ff76cefacfec99":taskDetail.put("file2", title);break;//交付件2 } } } } taskDetail.put("carTag", ""); taskDetail.put("payTag", ""); List tagIds = (List) subTask.get("tagIds"); if (!tagIds.isEmpty()){ for (String tagId : tagIds) { if (TAGS.containsKey(tagId)) { if (TAGS.get(tagId).contains("车载")){ taskDetail.put("carTag", TAGS.get(tagId).substring(3,5)); }else if (TAGS.get(tagId).contains("消费")){ taskDetail.put("payTag", TAGS.get(tagId).substring(3,5)); } } } } list.add(taskDetail); } //获取任务状态 TBR tbr2 = (TBR) UtilHttp.doGet("https://open.teambition.com/api/v3/task/query", initHeaderToken(), UtilMap.map("taskId", stage), TBR.class); List> result2 = (List>) tbr2.getResult(); String tfsId = result2.get(0).get("tfsId").toString(); TBR tbr3 = (TBR) UtilHttp.doGet("https://open.teambition.com/api/v3/project/65bb53546a74a42e2d608f05/taskflowstatus/search", initHeaderToken(), UtilMap.map("tfsIds", tfsId), TBR.class); List> result3 = (List>) tbr3.getResult(); String state = result3.get(0).get("name").toString(); stageDetail.put("list",list); stageDetail.put("state", state); result.put(STAGES.get(stage), stageDetail); } } return McR.success(result); } private Map initHeaderToken() { Map header = new HashMap(); header.put("Authorization", this.getAccessToken()); header.put("X-Tenant-Id", this.tbConf.getTenantId()); header.put("X-Tenant-Type", "organization"); return header; } private String getAccessToken() { synchronized(this.$lock) { String accessToken = UtilToken.get("invalid-token-teambition"); if (StringUtils.isNotBlank(accessToken)) { return accessToken; } else { Algorithm algorithm = Algorithm.HMAC256(this.tbConf.getAppSecret()); long timestamp = System.currentTimeMillis(); Date issuedAt = new Date(timestamp); Date expiresAt = new Date(timestamp + EXPIRES_IN); accessToken = JWT.create().withClaim("_appId", this.tbConf.getAppID()).withIssuedAt(issuedAt).withExpiresAt(expiresAt).sign(algorithm); log.info("响应token, {}", accessToken); UtilToken.put("invalid-token-teambition", accessToken, EXPIRES_IN); return accessToken; } } } }