diff --git a/pom.xml b/pom.xml index d15f09e8..4ab655ba 100644 --- a/pom.xml +++ b/pom.xml @@ -75,6 +75,13 @@ knife4j-spring-boot-starter 3.0.3 + + + com.authine.cloudpivot + cloudpivot-opensdk + 1.0 + + diff --git a/src/main/java/com/chint/application/out/FSSCController.java b/src/main/java/com/chint/application/out/FSSCController.java index 14d2abbc..93b871ce 100644 --- a/src/main/java/com/chint/application/out/FSSCController.java +++ b/src/main/java/com/chint/application/out/FSSCController.java @@ -24,7 +24,8 @@ public class FSSCController { @PostMapping("/login") public Result loginToFSSC() { User currentUser = BaseContext.getCurrentUser(); - return Result.Success(SUCCESS, LoginResponse.success(FSSCUrl + FSSC_LOGIN_PATH_APPROVAL + currentUser.getEmployeeNo().toString())); + String companyCode = currentUser.getCompanyCode();//公司编号 + return Result.Success(SUCCESS, LoginResponse.success(FSSCUrl + FSSC_LOGIN_PATH_APPROVAL + currentUser.getEmployeeNo())); } } diff --git a/src/main/java/com/chint/domain/factoriy/order_detail/LYOrderExtensionFactoryImpl.java b/src/main/java/com/chint/domain/factoriy/order_detail/LYOrderExtensionFactoryImpl.java index a0fc346a..182a7258 100644 --- a/src/main/java/com/chint/domain/factoriy/order_detail/LYOrderExtensionFactoryImpl.java +++ b/src/main/java/com/chint/domain/factoriy/order_detail/LYOrderExtensionFactoryImpl.java @@ -37,57 +37,61 @@ public class LYOrderExtensionFactoryImpl implements OrderExtensionFactory { TrainDetailResponse.TravelData travelData = data.getTravelData(); TrainOrderDetail trainOrderDetail = new TrainOrderDetail(); //映射值 - /*trainOrderDetail.setOrderNo(data.getOrderNo()) - .setOverStandard(null) - .setParentOrderNo() - .setOriginalOrderNo(null) +/* trainOrderDetail.setOrderNo(data.getOrderNo()) + .setOverStandard(ruleViolate) + .setParentOrderNo(null) + .setOriginalOrderNo(originalOrderNo) .setOrderStatus(null) - .setAccountCompanyId() - .setAccountCompanyName() + .setAccountCompanyId(null) + .setAccountCompanyName(null) .setReceiptsNum(travelData.getTravelApplyNo()) - .setScheduleNum() + .setScheduleNum(null) .setBookingUserCode(data.getOutEmployeeId()) - .setBookingName() - .setBookingUserPhone() - .setCreateTime() - .setStartTime() - .setArriveTime() - .setFromStationName() - .setToStationName() - .setTrainNo() - .setFromCity() - .setToCity() - .setRunTime() - .setOrderAmount() - .setPreServiceFee() - .setPostServiceFee() - .setRefundAmount() - .setChangeDifference() - .setChangeCost() - .setTickets() - .setSeatType() - .setSeatName() - .setTicketPrice() - .setRefundCost() - .setRefundPrice() - .setStandardItems() - .setUserName() - .setUserCode() - .setOverStandard() - .setPhone() -// .setXXX() -// .setXXX() -// .setXXX() -// .setXXX() -// .setXXX() - .setBOOK_ORG_STRUCT_1() - .setBOOK_ORG_STRUCT_2() - .setBOOK_ORG_STRUCT_3() - .setPaymentType() -// .setXXX() -// .setXXX() -// .setXXX() - ;*/ + .setBookingName(null) + .setBookingUserPhone(null) + .setCreateTime(issueTime) + .setStartTime(departureTime) + .setArriveTime(arrivalTime) + .setFromStationName(data.getFromStation()) + .setToStationName(data.getToStation()) + .setTrainNo(data.getTrainNo()) + .setFromCity(departCityName) + .setToCity(arriveCityName) + .setRunTime(null) + .setOrderAmount(data.getTotalAmount()) + .setPreServiceFee(servicePrice) + .setPostServiceFee(afterSettlementServicePrice) + .setRefundAmount(refundPrice) + .setChangeDifference(changePriceDiff) + .setChangeCost(serviceCharge) + .setTickets( + data.getPriceVarList().stream() + .flatMap(priceVar -> priceVar.getPassengers().stream()) + .toList() + ) + .setSeatType(data.getItems().isEmpty() ? null : data.getItems().get(0).getSeatClass()) + .setSeatName(data.getItems().isEmpty() ? null : data.getItems().get(0).getSeatNo()) + .setTicketPrice(price) + .setRefundCost(null) + .setRefundPrice(refundPrice) + .setStandardItems(policyName) + .setUserName(passengerName) + .setUserCode(employeeCode) + .setOverStandard(ruleViolate) + .setPhone(null) +// .setXXX(携程预订/同程预订) +// .setXXX(PersonalPrice) +// .setXXX(CompanyPrice) +// .setXXX(null) +// .setXXX(foulReason)//超标原因 + .setBOOK_ORG_STRUCT_1(null) + .setBOOK_ORG_STRUCT_2(null) + .setBOOK_ORG_STRUCT_3(null) + .setPaymentType(payType) +// .setXXX(null)//入住人组织架构信息3 +// .setXXX(null)//项目订单号 +// .setXXX(null)//成本中心*/ + ; return trainOrderDetail; } @@ -245,6 +249,7 @@ public class LYOrderExtensionFactoryImpl implements OrderExtensionFactory { return null; } + private HotelOrderDetail convertHotel(HotelDetailResponse hotelDetailResponse) { HotelOrderDetail hotelOrderDetail = new HotelOrderDetail(); HotelDetailResponse.Data data = hotelDetailResponse.getData(); diff --git a/src/main/java/com/chint/infrastructure/constant/BPMConstant.java b/src/main/java/com/chint/infrastructure/constant/BPMConstant.java index 33d0efc8..9c237024 100644 --- a/src/main/java/com/chint/infrastructure/constant/BPMConstant.java +++ b/src/main/java/com/chint/infrastructure/constant/BPMConstant.java @@ -4,7 +4,14 @@ public class BPMConstant { //BPM public static final String H3BPM = "H3BPM"; - public static final String H3BPM_EXCEED_STANDARD_URL = "/Portal/Webservices/ExternalStartService.asmx/StartWorkflowByEntityTransJson"; + public static final String XNBPM = "XNBPM"; + public static final String H3BPM_EXCEED_STANDARD_URL = "/Portal/Webservices/ExternalStartService.asmx/StartWorkflowByEntityTransJson";//H3BPM + public static final String XNBPM_TOKEN_URL = "/api/login/crm/ajax";//新能云枢获取token和用户id + public static final String XNBPM_EXCEED_STANDARD_URL = "/api/openapi/v3/workflow/start";//新能云枢发起流程 + + public static final String CLIENT_ID = "xclient";//客户端id + public static final String CLIENT_SECRET = "0a417ecce58c31b32364ce19ca8fcd15";//密钥 + public static final String EXCEED_STANDARD_TYPE_TRAIN = "火车票超标";//方法名称 public static final String EXCEED_STANDARD_TYPE_HOTEL = "酒店超标";//方法名称 public static final String EXCEED_STANDARD_TYPE_FLIGHT = "机票超标";//方法名称 diff --git a/src/main/java/com/chint/interfaces/rest/base/PostRequest.java b/src/main/java/com/chint/interfaces/rest/base/PostRequest.java index 9eae9e97..50f5a156 100644 --- a/src/main/java/com/chint/interfaces/rest/base/PostRequest.java +++ b/src/main/java/com/chint/interfaces/rest/base/PostRequest.java @@ -5,7 +5,9 @@ import lombok.extern.slf4j.Slf4j; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.HttpClients; @@ -74,6 +76,18 @@ public class PostRequest { return gson.fromJson(responseBody, responseType); } + + public T get(String url, Class responseType) { + HttpUriRequest request = new HttpGet(url); + String responseBody; + try { + responseBody = EntityUtils.toString(client.execute(request).getEntity(), "UTF-8"); + return gson.fromJson(responseBody, responseType); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + public Gson gson() { return gson; } diff --git a/src/main/java/com/chint/interfaces/rest/bpm/BPMRequest.java b/src/main/java/com/chint/interfaces/rest/bpm/BPMRequest.java index 61877ba8..60dd4df3 100644 --- a/src/main/java/com/chint/interfaces/rest/bpm/BPMRequest.java +++ b/src/main/java/com/chint/interfaces/rest/bpm/BPMRequest.java @@ -1,19 +1,33 @@ package com.chint.interfaces.rest.bpm; +import com.alibaba.fastjson2.JSON; +import com.authine.cloudpivot.opensdk.ApiException; +import com.authine.cloudpivot.opensdk.CloudpivotOpenClient; +import com.authine.cloudpivot.opensdk.model.request.workflow.StartWorkflowRequest; +import com.authine.cloudpivot.opensdk.model.response.workflow.StartWorkflowResponse; import com.chint.domain.aggregates.user.User; import com.chint.infrastructure.util.BaseContext; import com.chint.interfaces.rest.base.PostRequest; +import com.chint.interfaces.rest.bpm.XNBPM.ClientFactory; +import com.chint.interfaces.rest.bpm.XNBPM.XNTokenDto; import com.chint.interfaces.rest.bpm.dot.*; import com.chint.interfaces.rest.bpm.dto.BPMBaseRequest; import com.chint.interfaces.rest.bpm.dto.BPMResponse; import com.chint.interfaces.rest.bpm.dto.ExceedStandardDto; import com.chint.interfaces.rest.bpm.dto.RescheduleDto; import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import java.lang.reflect.Type; +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.Map; + import static com.chint.infrastructure.constant.BPMConstant.H3BPM_EXCEED_STANDARD_URL; +import static com.chint.infrastructure.constant.BPMConstant.XNBPM_TOKEN_URL; @Service @@ -25,17 +39,31 @@ public class BPMRequest { @Value("${bpm.H3BPMUrl}") private String H3BPMUrl; + @Value("${bpm.XNBPMUrl}") + private String XNBPMUrl; + //超标申请 public BPMResponse exceedStandard(ExceedStandardDto exceedStandardDto) { - return submitWorkflow("JT_FI_CLCESQ", exceedStandardDto); + if ("H3BPM".equals("XNBPM")) { + return XNBPMSubmitWorkflow("JG_AS_CLCESQ", exceedStandardDto); + } else { + return H3BPMSubmitWorkflow("JT_FI_CLCESQ", exceedStandardDto); + } } - //改签 + //改签申请 public BPMResponse reschedule(RescheduleDto rescheduleDto) { - return submitWorkflow("JT_FI_CLGQSQ", rescheduleDto); + if ("H3BPM".equals("XNBPM")) { + return XNBPMSubmitWorkflow("JG_AS_CLGQSQ", rescheduleDto); + } else { + return H3BPMSubmitWorkflow("JT_FI_CLGQSQ", rescheduleDto); + } } - public BPMResponse submitWorkflow(String workflowCode, Object entityObject) { + /** + * H3BPM + */ + public BPMResponse H3BPMSubmitWorkflow(String workflowCode, Object entityObject) { BPMBaseRequest bpmRequest = new BPMBaseRequest(); Gson gson = new Gson(); String entityParamValues = gson.toJson(entityObject); @@ -49,4 +77,39 @@ public class BPMRequest { System.out.println("response = " + bpmBaseResponse); return bpmBaseResponse.getD(); } + + /** + * 新能云枢接口 + */ + public BPMResponse XNBPMSubmitWorkflow(String workflowCode, Object entityObject) { + //获取用户信息 + User user = BaseContext.getCurrentUser(); + String employeeNo = user.getEmployeeNo();//sf号 + XNTokenDto xnTokenDto = httpPostRequest.get(XNBPMUrl + XNBPM_TOKEN_URL + "?code=" + employeeNo, XNTokenDto.class); + if (!"0".equals(xnTokenDto.getErrcode())) { + throw new RuntimeException("用户不存在!"); + } + String userId = xnTokenDto.getUser_id(); + CloudpivotOpenClient client = ClientFactory.getInstance(); + StartWorkflowRequest request = new StartWorkflowRequest(); + Gson gson = new Gson(); + String entityParamValues = gson.toJson(entityObject); + Type type = new TypeToken>() { + }.getType(); + HashMap map = gson.fromJson(entityParamValues, type); + request.setData(map);//数据 + request.setDepartmentId("");//部门id,默认主部门 + request.setFinishStart(true);//发起流程 + request.setUserId(userId);//员工号 + request.setWorkflowCode(workflowCode);//超标流程 + try { + StartWorkflowResponse response = client.startWorkflow(request); + System.out.println("response = " + JSON.toJSONString(response)); + } catch (ApiException e) { + throw new RuntimeException(e.getMessage()); + } + BPMResponse bpmResponse = new BPMResponse(); + bpmResponse.setSuccess(true); + return bpmResponse; + } } diff --git a/src/main/java/com/chint/interfaces/rest/bpm/XNBPM/ClientFactory.java b/src/main/java/com/chint/interfaces/rest/bpm/XNBPM/ClientFactory.java new file mode 100644 index 00000000..3e5b7053 --- /dev/null +++ b/src/main/java/com/chint/interfaces/rest/bpm/XNBPM/ClientFactory.java @@ -0,0 +1,37 @@ +package com.chint.interfaces.rest.bpm.XNBPM; + +import com.authine.cloudpivot.opensdk.CloudpivotOpenClient; +import com.authine.cloudpivot.opensdk.client.impl.JdkHttpClient; +import com.authine.cloudpivot.opensdk.config.CloudpivotEnvConfig; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import static com.chint.infrastructure.constant.BPMConstant.*; + +/** + * 新能云枢 + */ +@Service +public class ClientFactory { + private static CloudpivotOpenClient client; + + private static String XNBPMUrl; + + @Value("${bpm.XNBPMUrl}") + public void setXNBPMUrl(String XNBPMUrl) { + ClientFactory.XNBPMUrl = XNBPMUrl; + } + + + public synchronized static CloudpivotOpenClient getInstance() { + if (client == null) { + synchronized (CloudpivotOpenClient.class) { + if (client == null) { + CloudpivotEnvConfig config = new CloudpivotEnvConfig(XNBPMUrl + "/api", CLIENT_ID, CLIENT_SECRET); + client = new CloudpivotOpenClient(config, new JdkHttpClient()); + } + } + } + return client; + } +} \ No newline at end of file diff --git a/src/main/java/com/chint/interfaces/rest/bpm/XNBPM/XNTokenDto.java b/src/main/java/com/chint/interfaces/rest/bpm/XNBPM/XNTokenDto.java new file mode 100644 index 00000000..417f6f85 --- /dev/null +++ b/src/main/java/com/chint/interfaces/rest/bpm/XNBPM/XNTokenDto.java @@ -0,0 +1,11 @@ +package com.chint.interfaces.rest.bpm.XNBPM; + +import lombok.Data; + +@Data +public class XNTokenDto { + private String errcode; + private String access_token; + private String refresh_token; + private String user_id; +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 58d1ae82..1fee43ff 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -62,4 +62,5 @@ paila: bpm: - H3BPMUrl: http://10.207.0.245:8012 \ No newline at end of file + H3BPMUrl: http://10.207.0.245:8012 + XNBPMUrl: http://10.145.30.119:8090 \ No newline at end of file diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml index bdad94d4..7cd44706 100644 --- a/src/main/resources/application-test.yml +++ b/src/main/resources/application-test.yml @@ -50,4 +50,5 @@ paila: token-name: token bpm: - H3BPMUrl: http://10.207.0.245:8012 \ No newline at end of file + H3BPMUrl: http://10.207.0.245:8012 + XNBPMUrl: http://10.145.30.119:8090 \ No newline at end of file diff --git a/src/test/java/com/chint/LYTest.java b/src/test/java/com/chint/LYTest.java index ea2d55c4..bf7100a3 100644 --- a/src/test/java/com/chint/LYTest.java +++ b/src/test/java/com/chint/LYTest.java @@ -1,9 +1,20 @@ package com.chint; +import cn.hutool.core.lang.hash.Hash; +import com.alibaba.fastjson2.JSON; +import com.authine.cloudpivot.opensdk.ApiException; +import com.authine.cloudpivot.opensdk.CloudpivotOpenClient; +import com.authine.cloudpivot.opensdk.model.request.bizobject.CreateBoRequest; +import com.authine.cloudpivot.opensdk.model.request.workflow.StartWorkflowRequest; +import com.authine.cloudpivot.opensdk.model.response.bizobject.CreateBoResponse; +import com.authine.cloudpivot.opensdk.model.response.workflow.StartWorkflowResponse; import com.chint.domain.aggregates.user.User; import com.chint.infrastructure.constant.LYConstant; import com.chint.infrastructure.util.BaseContext; +import com.chint.infrastructure.util.OrderNo; import com.chint.interfaces.rest.base.PostRequest; +import com.chint.interfaces.rest.bpm.XNBPM.ClientFactory; +import com.chint.interfaces.rest.bpm.XNBPM.XNTokenDto; import com.chint.interfaces.rest.bpm.dot.*; import com.chint.interfaces.rest.bpm.dto.BPMBaseRequest; import com.chint.interfaces.rest.bpm.dto.BPMResponse; @@ -18,19 +29,23 @@ import com.chint.interfaces.rest.ly.dto.commonresult.Result; import com.chint.interfaces.rest.ly.dto.estimateprice.*; import com.chint.interfaces.rest.ly.vo.estimateprice.TrainPriceVo; import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.context.SpringBootTest; +import java.lang.reflect.Type; import java.math.BigDecimal; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; +import java.util.HashMap; import java.util.Map; import static com.chint.infrastructure.constant.BPMConstant.H3BPM_EXCEED_STANDARD_URL; +import static com.chint.infrastructure.constant.BPMConstant.XNBPM_TOKEN_URL; @SpringBootTest public class LYTest { @@ -54,6 +69,8 @@ public class LYTest { @Value("${bpm.H3BPMUrl}") private String H3BPMUrl; + @Value("${bpm.XNBPMUrl}") + private String XNBPMUrl; public static final String L_Y_BASE_URL = "https://api.qa.dttrip.cn/openapi"; public static final String L_Y_ORDER_PATH = "/openapi/api/TravelApplyOrder/ApplyOrderSync"; @@ -354,4 +371,87 @@ public class LYTest { System.out.println("response = " + response); } + /** + * 云枢超标流程测试 + */ + @Test + public void testDemo() throws Exception { + XNTokenDto xnTokenDto = httpPostRequest.get(XNBPMUrl + XNBPM_TOKEN_URL + "?code=" + "191107079", XNTokenDto.class); + if (!"0".equals(xnTokenDto.getErrcode())) { + throw new RuntimeException("用户不存在!"); + } + String userId = xnTokenDto.getUser_id(); + CloudpivotOpenClient client = ClientFactory.getInstance(); + StartWorkflowRequest request = new StartWorkflowRequest(); + Gson gson = new Gson(); + ExceedStandardDto exceedStandardDto = new ExceedStandardDto(); + exceedStandardDto.setOrderType("酒店超标")//内容选项:酒店超标,火车票超标,机票超标 + .setOrderSource("携程商旅")//内容选项:携程商旅/同程商旅 + .setOrderNo("001021214")//订单号 + .setHotelStandard("标间")//酒店超标提供:住宿标准 + .setHotelName("酒店名称")//酒店超标提供:酒店名称 + .setHouseLayout("双人床")//酒店超标提供:房型 + .setSeatingStandard("")//火车票超标提供:席别标准 + .setCabinClass("")//:机票超标提供:舱等 + .setExcessAmount(BigDecimal.valueOf(1000))//超标金额 + .setReason("酒店爆满订不到");//超标原因 + + String entityParamValues = gson.toJson(exceedStandardDto); + Type type = new TypeToken>(){}.getType(); + HashMap map = gson.fromJson(entityParamValues, type); + request.setData(map);//数据 + request.setDepartmentId("");//部门id,默认主部门 + request.setFinishStart(true);//发起流程 + request.setUserId(userId);//员工号 + request.setWorkflowCode("JG_AS_CLCESQ");//超标流程 + try { + StartWorkflowResponse response = client.startWorkflow(request); + System.out.println("response = " + JSON.toJSONString(response)); + } catch (ApiException e) { + throw new RuntimeException(e.getMessage()); + } + } + + + /** + * 云枢改签流程测试 + */ + @Test + public void testDemo2() throws Exception { + XNTokenDto xnTokenDto = httpPostRequest.get(XNBPMUrl + XNBPM_TOKEN_URL + "?code=" + "191107079", XNTokenDto.class); + if (!"0".equals(xnTokenDto.getErrcode())) { + throw new RuntimeException("用户不存在!"); + } + String userId = xnTokenDto.getUser_id(); + CloudpivotOpenClient client = ClientFactory.getInstance(); + StartWorkflowRequest request = new StartWorkflowRequest(); + Gson gson = new Gson(); + RescheduleDto rescheduleDto = new RescheduleDto(); + rescheduleDto.setOrderType("机票改签")//内容选项:机票改签,机票退票,火车票改签,火车票退票 + .setOrderSource("携程商旅")//携程商旅/同程商旅 + .setOrderNo("00002")//订单号 + .setStartTime("2024-02-22 10:00:00")//机票改签或火车票改签提供: 原时间 + .setRebookStartTime("2024-02-23 10:00:00")//机票改签或火车票改签提供: 改签后时间 + .setTrainNumber("")//火车票改签提供: 原车次 + .setSeatingStandard("")//火车票改签提供: 原席别 + .setRebookTrainNumber("")//火车票改签提供: 改签后车次 + .setRebookSeatingStandard("")//火车票改签提供: 改签后席别 + .setFee(BigDecimal.valueOf(100))//费用 + .setReason("行程冲突");//原因 + String entityParamValues = gson.toJson(rescheduleDto); + Type type = new TypeToken>(){}.getType(); + HashMap map = gson.fromJson(entityParamValues, type); + request.setData(map);//数据 + request.setDepartmentId("");//部门id,默认主部门 + request.setFinishStart(true);//发起流程 + request.setUserId(userId);//员工号 + request.setWorkflowCode("JG_AS_CLGQSQ");//改签流程 + try { + StartWorkflowResponse response = client.startWorkflow(request); + System.out.println("response = " + JSON.toJSONString(response)); + } catch (ApiException e) { + throw new RuntimeException(e.getMessage()); + } + } + }