From 14d5ff05981dd0b642dcc23732d48e26ed6dc75e Mon Sep 17 00:00:00 2001 From: amos wong Date: Sat, 10 May 2025 20:57:52 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 42 + APP-META/docker-config/Dockerfile-dev | 46 + APP-META/docker-config/Dockerfile-pre | 46 + APP-META/docker-config/Dockerfile-prod | 46 + APP-META/docker-config/Dockerfile-test | 46 + README.md | 30 + pom.xml | 440 +++++++ tptradeprod-api/pom.xml | 31 + .../controller/SmsTestController.java | 41 + .../controller/TpContractTestController.java | 51 + .../controller/TpOrderProdController.java | 151 +++ .../controller/TpPaymentController.java | 30 + .../controller/TpRuleProdController.java | 137 +++ .../TpScheduleTaskTestController.java | 61 + .../controller/TpVoucherTestController.java | 27 + tptradeprod-app-starter/pom.xml | 175 +++ .../tptradeprod/ApplicationStarter.java | 23 + .../advise/GlobalControllerAdvise.java | 100 ++ .../config/Knife4jConfiguration.java | 88 ++ .../tptradeprod/config/RocketMQConfig.java | 43 + .../tptradeprod/config/ValidatorConfig.java | 34 + .../src/main/resources/application-dev.yml | 43 + .../src/main/resources/application-local.yml | 86 ++ .../src/main/resources/application-pre.yml | 88 ++ .../src/main/resources/application-prod.yml | 88 ++ .../src/main/resources/application-test.yml | 93 ++ .../src/main/resources/application.yml | 61 + .../src/main/resources/bootstrap.yml | 23 + .../src/main/resources/logback-spring.xml | 143 +++ .../TpPlaceOrderProductCheckNodeTest.java | 102 ++ .../component/TpOrderChangeApplyTest.java | 76 ++ .../core/component/TpOrderConfirmTest.java | 131 ++ .../component/TpOrderDispatchOrderTest.java | 39 + .../TpOrderSyncTripComponentTest.java | 65 + .../TpVoucherVerficationRecodeTest.java | 41 + .../TpOrderChangeAcceptanceFacadeTest.java | 35 + .../src/test/java/com/util/TestResult.java | 39 + .../src/test/java/com/util/TestStrUtils.java | 17 + .../src/test/java/com/util/TestUtils.java | 113 ++ .../checkRestrictTime.json | 68 ++ .../TpPlaceOrderProductCheckNode/process.json | 649 ++++++++++ tptradeprod-biz/pom.xml | 19 + .../tptradeprod-biz-service-impl/pom.xml | 85 ++ .../advice/IntegrationClientInterceptor.java | 44 + .../biz/advice/MessageLogInterceptor.java | 44 + .../biz/advice/RpcExceptionHandleAspect.java | 77 ++ .../biz/config/ThreadPoolConfig.java | 31 + .../biz/constants/TpOrderCalcFormula.java | 98 ++ .../constants/TpOrderListQueryConstants.java | 23 + .../biz/constants/TpTradeProdConstants.java | 16 + .../converter/TpSaleUnitCarpoolConvert.java | 21 + .../tptradeprod/biz/log/LogFormatHelper.java | 165 +++ .../TpChangeOrderRecordServiceChargeNode.java | 168 +++ .../TpOrderChangNeedAuditNode.java | 49 + .../flow/changeorder/TpOrderDiffNode.java | 297 +++++ .../flow/changeorder/TpPrepareOrderNode.java | 86 ++ .../TpQueryOrderChangeAuditNode.java | 46 + .../flow/changeorder/TpQueryOrderNode.java | 81 ++ .../flow/constants/LiteFlowConstant.java | 248 ++++ .../constants/TpOrderBizErrorConstant.java | 39 + .../context/TpOrderAuditConfirmContext.java | 55 + .../TpOrderChangeApplyCreateContext.java | 37 + .../context/TpOrderManualSyncTripContext.java | 26 + .../context/TpOrderRescheduleContext.java | 29 + .../TpOrderServiceChargeReduceContext.java | 58 + .../context/TpRefundTicketApplyContext.java | 29 + .../context/TpRescheduleOrderContext.java | 40 + .../flow/context/TpSendEmailContext.java | 24 + .../flow/context/TpSendSmsContext.java | 24 + .../context/TpUserCancelOrderContext.java | 43 + .../flow/context/TpUserPlaceOrderContext.java | 121 ++ .../service/flow/manager/LiteFlowManager.java | 599 ++++++++++ .../flow/node/check/TpBasicCheckNode.java | 0 .../check/TpCharterBusInquireCheckNode.java | 52 + .../TpCharterBusInternalPriceInquireNode.java | 46 + .../node/check/TpFreeTicketCheckNode.java | 44 + .../flow/node/check/TpInquireCheckNode.java | 47 + .../TpOrderAuditCheckOrderStatusNode.java | 74 ++ .../check/TpOrderBusinessTypeCheckNode.java | 65 + .../check/TpOrderCancelCheckIsAuditNode.java | 40 + .../check/TpOrderCancelCheckStatusNode.java | 70 ++ .../TpOrderCarpoolCheckPosSourceNode.java | 39 + ...TpOrderFirstConfirmedCheckPayModeNode.java | 72 ++ .../check/TpOrderIsNeedConfirmCheckNode.java | 42 + .../check/TpOrderIsNeedInquireCheckNode.java | 59 + .../check/TpOrderManualSyncTripCheckNode.java | 91 ++ .../check/TpOrderPaidBizTypeCheckNode.java | 56 + .../node/check/TpOrderPayModeCheckNode.java | 60 + .../check/TpPlaceOrderProductCheckNode.java | 719 +++++++++++ .../check/TpRescheduleInquireCheckNode.java | 124 ++ .../TpRescheduleVoucherInvalidCheckNode.java | 63 + .../TpRescheduleVoucherTimeCheckNode.java | 155 +++ .../BatchDeductToRollbackInventoryNode.java | 74 ++ .../flow/node/execute/TpBuildVoucherNode.java | 812 +++++++++++++ .../execute/TpCreateDepositOrderNode.java | 47 + .../flow/node/execute/TpCreateOrderNode.java | 51 + .../node/execute/TpDeductInventoryNode.java | 43 + .../TpFreeOrderPaidSendSyncMessageNode.java | 63 + .../node/execute/TpFreezeInventoryNode.java | 43 + .../execute/TpNeedPayOrderStatusNode.java | 45 + .../TpOrderCancelCheckRefundOrPayNode.java | 93 ++ .../execute/TpOrderCancelConfirmNode.java | 126 ++ .../TpOrderCancelDoubleConfirmNode.java | 124 ++ .../TpOrderCancelPushNeedConfirmNode.java | 252 ++++ .../TpOrderCancelSaveChargeRecordNode.java | 57 + .../TpOrderCarpoolSendSyncMessageNode.java | 62 + ...TpOrderChangeConfirmNoneReductionNode.java | 78 ++ .../TpOrderChangeConfirmReductionNode.java | 76 ++ .../TpOrderChangeReductionSyncTripNode.java | 63 + .../execute/TpOrderCreateApplyCreateNode.java | 86 ++ .../TpOrderCustomBusSendDelayMessageNode.java | 66 ++ .../TpOrderDepositNeedPayStatusNode.java | 46 + .../TpOrderManualSyncCancelTripNode.java | 43 + .../TpOrderManualSyncCreateTripNode.java | 43 + .../TpOrderManualSyncUpdateTripNode.java | 45 + .../node/execute/TpOrderNeedConfirmNode.java | 48 + .../TpOrderNeedConfirmRemindAuditorNode.java | 70 ++ .../TpOrderNoneReductionSyncTripNode.java | 62 + .../execute/TpOrderPushBalancePaidNode.java | 79 ++ .../execute/TpOrderPushDepositPaidNode.java | 47 + .../execute/TpOrderPushNeedDispatchNode.java | 46 + .../TpOrderPushNeedDispatchStatusNode.java | 45 + .../TpOrderUpdateChargeRecordNode.java | 52 + .../node/execute/TpOrderUserPrePayNode.java | 76 ++ .../node/execute/TpPaidOrderStatusNode.java | 92 ++ .../execute/TpRefundTicketSuccessNode.java | 41 + .../node/execute/TpRescheduleOrderNode.java | 59 + .../flow/node/execute/TpSendEmailNode.java | 33 + .../TpSendRefundSuccessMessageNode.java | 100 ++ .../flow/node/execute/TpSendSmsNode.java | 35 + .../flow/node/execute/TpTripSyncNode.java | 61 + .../TpAvailableRefundVoucherQueryNode.java | 77 ++ .../node/query/TpOrderDetailQueryNode.java | 58 + .../flow/node/query/TpProductQueryNode.java | 82 ++ .../query/TpRefundApplyOrderQueryNode.java | 44 + .../node/query/TpRefundQueryPayOrderNode.java | 63 + .../TpRescheduleOrderDetailQueryNode.java | 57 + .../query/TpRescheduleProductQueryNode.java | 79 ++ .../query/TpRescheduleVoucherQueryNode.java | 95 ++ .../flow/node/query/TpVoucherQueryNode.java | 94 ++ .../TpVoucherVerificationRecordQueryNode.java | 49 + .../TpOrderChangeApplyCheckHasApplyNode.java | 42 + .../TpOrderChangeApplyCheckNeedAuditNode.java | 52 + .../TpOrderChangeApplyCreateAuditNode.java | 136 +++ .../TpOrderChangeApplyCreateSwitchNode.java | 52 + .../TpOrderChangeApplyDispatchOrderNode.java | 87 ++ ...derChangeApplyEndTripPriceConfirmNode.java | 62 + .../TpOrderChangeApplyQueryDetailNode.java | 51 + .../TpOrderChangeApplySaveNode.java | 71 ++ .../TpOrderCreateApplyCheckNoneApplyNode.java | 42 + .../TpApplySmsSendPrepareNode.java | 190 +++ ...pOrderCancelApprovedTimeOutSwitchNode.java | 50 + ...ancelTimeoutChangePriceAndPayModeNode.java | 144 +++ ...TpOrderConfirmAuditApprovedSwitchNode.java | 124 ++ .../TpOrderConfirmBizTypeSwitchNode.java | 51 + ...OrderConfirmChangePriceAndPayModeNode.java | 131 ++ .../orderconfirm/TpOrderConfirmCheckNode.java | 152 +++ .../TpOrderConfirmCreateRscAuditNode.java | 108 ++ .../TpOrderConfirmDispatchFleetNode.java | 91 ++ .../TpOrderConfirmQueryApplyDetailNode.java | 65 + .../TpOrderConfirmQueryAuditDetailNode.java | 54 + .../TpOrderConfirmReceiveOrderNode.java | 86 ++ .../TpOrderConfirmUpdateApplyStatusNode.java | 92 ++ ...pOrderConfirmUpdateApplyStatusRscNode.java | 82 ++ ...TpOrderConfirmUpdateAuditApprovedNode.java | 75 ++ .../TpOrderCreateConfirmAuditTimeOutNode.java | 115 ++ .../TpRscConfirmApprovedSwitchNode.java | 108 ++ .../TpRscConfirmBizTypeSwitchNode.java | 69 ++ .../TpRscConfirmCheckNode.java | 72 ++ .../TpRscConfirmDispatchFleetNode.java | 91 ++ .../TpRscConfirmQueryApplyDetailNode.java | 55 + .../TpRscConfirmQueryAuditDetailNode.java | 57 + ...RscConfirmSaveAuditApprovedResultNode.java | 90 ++ ...cConfirmSubmitApplyApprovedResultNode.java | 99 ++ ...TpRscConfirmUpdatePriceAndPayModeNode.java | 144 +++ .../refundTicket/check/TpBasicCheckNode.java | 101 ++ .../check/TpRefundAmountCheckNode.java | 66 ++ .../TpRefundButtonShowableBasicCheckNode.java | 92 ++ ...efundButtonShowableNeedInvokeRuleNode.java | 32 + .../check/TpRefundCountRuleCheckNode.java | 155 +++ .../check/TpRefundTimeRuleCheckNode.java | 257 ++++ .../check/TpRefundVoucherStatusCheckNode.java | 54 + .../TpCalculateRefundAmountContext.java | 24 + .../TpQueryAvailableVoucherContext.java | 29 + .../TpRefundTicketButtonShowableContext.java | 27 + .../context/TpRefundTicketCheckContext.java | 17 + .../context/TpRefundTicketCommonContext.java | 111 ++ .../context/TpRefundTicketCommonRequest.java | 42 + .../execute/TpCalculateRefundAmountNode.java | 411 +++++++ .../execute/TpCreateRefundApplyOrderNode.java | 288 +++++ .../execute/TpPaymentRefundNode.java | 80 ++ .../TpRefundChangeOrderStatusNode.java | 58 + .../execute/TpVoucherInvalidNode.java | 152 +++ .../impl/TpContractAcceptanceFacadeImpl.java | 270 +++++ .../impl/TpOrderAcceptanceFacadeImpl.java | 1051 +++++++++++++++++ ...pOrderChangeApplyAcceptanceFacadeImpl.java | 79 ++ .../TpOrderConfirmAcceptanceFacadeImpl.java | 438 +++++++ .../TpOrderDispatchAcceptanceFacadeImpl.java | 469 ++++++++ .../impl/TpPaymentAcceptanceFacadeImpl.java | 133 +++ .../impl/TpVoucherAcceptanceFacadeImpl.java | 78 ++ .../CommonScheduleTaskExecuteTemplate.java | 89 ++ .../biz/task/TpScheduleTaskService.java | 112 ++ .../task/worker/AbstractBaseTaskWorker.java | 199 ++++ .../CloseOrderBeforeTwoHoursWorker.java | 178 +++ .../task/worker/OrderAuditTimeOutWorker.java | 146 +++ .../worker/TripEndAfterThreeDaysWorker.java | 127 ++ .../worker/TripStartBeforeHalfHourWorker.java | 146 +++ .../worker/TripStartBeforeTwoHoursWorker.java | 167 +++ .../tptradeprod/biz/util/TimeConvertUtil.java | 54 + .../tptradeprod/biz/util/TpVoucherUtil.java | 196 +++ .../src/main/resources/config/flow.el.xml | 546 +++++++++ tptradeprod-common/pom.xml | 21 + .../tptradeprod-common-dal/pom.xml | 62 + .../condition/task/UpdateTaskCondition.java | 24 + .../task/TpScheduleTaskMapStructConvert.java | 25 + .../common/dal/dao/TpScheduleTaskDao.java | 13 + .../dal/dataobject/TpScheduleTaskDO.java | 49 + .../task/TpScheduleTaskRepository.java | 23 + .../impl/TpScheduleTaskRepositoryImpl.java | 73 ++ .../tptradeprod-common-service/pom.xml | 19 + .../tptradeprod-common-service-facade/pom.xml | 99 ++ .../dto/TpAvailableRescheduleVoucherDTO.java | 57 + .../tptradeprod/common/dto/TpBillDTO.java | 76 ++ .../common/dto/TpCancelOrderDTO.java | 34 + .../tptradeprod/common/dto/TpChargeDTO.java | 88 ++ .../common/dto/TpFinancialAccountDTO.java | 83 ++ .../TpNonRealNameTicketRefundChoiceDTO.java | 28 + .../dto/TpOrderAuditPriceInquiryDTO.java | 32 + .../common/dto/TpOrderCancelDTO.java | 44 + .../common/dto/TpOrderElementDTO.java | 46 + .../common/dto/TpOrderPlacerDTO.java | 36 + .../common/dto/TpOrderRefundDTO.java | 34 + .../common/dto/TpOrderRequirementUserDTO.java | 43 + .../common/dto/TpOrderRouteDTO.java | 67 ++ .../common/dto/TpOrderRouteShuttleDTO.java | 51 + .../common/dto/TpOrderStationDTO.java | 126 ++ .../common/dto/TpOrderSubjectItemDTO.java | 99 ++ .../dto/TpOrderSubjectItemElementDTO.java | 50 + .../common/dto/TpOrderTargetServiceDTO.java | 40 + .../common/dto/TpOrderUnverifiedQueryDTO.java | 39 + .../common/dto/TpPassengerDTO.java | 62 + .../TpProdAuditOrderListPagedQueryDTO.java | 87 ++ .../common/dto/TpProdBizRuleDTO.java | 77 ++ .../dto/TpProdCalculateRefundAmountDTO.java | 71 ++ .../TpProdCharteredBusPricingParamDTO.java | 54 + .../dto/TpProdCharteredPriceInquiryDTO.java | 46 + .../dto/TpProdCheckSuccessCallbackDTO.java | 39 + .../dto/TpProdDispatchOrderReceivedDTO.java | 101 ++ .../dto/TpProdEndorseOrderCreateDTO.java | 16 + .../common/dto/TpProdInvalidVoucherDTO.java | 23 + .../TpProdMngVerificationRecordQueryDTO.java | 58 + ...onRealNamePassengerAvailableRefundDTO.java | 24 + .../dto/TpProdOrderAuditConfirmDTO.java | 165 +++ .../TpProdOrderCarrierOrganizationDTO.java | 43 + .../TpProdOrderChangeApplicantCreatedDTO.java | 32 + ...derChangeApplyApprovedResultSubmitDTO.java | 74 ++ ...ProdOrderChangeApplyApprovedSubmitDTO.java | 74 ++ .../dto/TpProdOrderChangeApplyCreatedDTO.java | 130 ++ .../dto/TpProdOrderChangeApplyDetailDTO.java | 62 + .../dto/TpProdOrderChangeApplyListDTO.java | 44 + ...TpProdOrderChangeApplyStatusUpdateDTO.java | 75 ++ ...ProdOrderChangeApplySubmitRscApplyDTO.java | 79 ++ .../dto/TpProdOrderChangeItemCreatedDTO.java | 66 ++ ...TpProdOrderChangeItemFactorCreatedDTO.java | 96 ++ .../dto/TpProdOrderChangeItemListDTO.java | 46 + .../common/dto/TpProdOrderConfirmViewDTO.java | 52 + .../common/dto/TpProdOrderCreateDTO.java | 308 +++++ .../common/dto/TpProdOrderDiscountDTO.java | 51 + .../dto/TpProdOrderDispatchCallBackDTO.java | 55 + .../dto/TpProdOrderDispatchCreatedDTO.java | 126 ++ .../dto/TpProdOrderDispatchDetailDTO.java | 56 + .../TpProdOrderDispatchFleetCreatedDTO.java | 86 ++ .../dto/TpProdOrderDispatchGiveBackDTO.java | 60 + .../dto/TpProdOrderDispatchListDTO.java | 51 + .../TpProdOrderDispatchStatusUpdateDTO.java | 64 + .../TpProdOrderEndTripPriceConfirmDTO.java | 76 ++ .../common/dto/TpProdOrderListQueryDTO.java | 67 ++ .../dto/TpProdOrderManualDispatchDTO.java | 69 ++ .../common/dto/TpProdOrderPaidDTO.java | 56 + .../common/dto/TpProdOrderPayDTO.java | 119 ++ .../common/dto/TpProdOrderPriceRecordDTO.java | 83 ++ .../dto/TpProdOrderPriceRecordDetailDTO.java | 77 ++ .../common/dto/TpProdOrderQueryDTO.java | 59 + .../dto/TpProdOrderReceivedCreateDTO.java | 87 ++ .../dto/TpProdOrderReceivedDetailDTO.java | 48 + .../common/dto/TpProdOrderRescheduleDTO.java | 67 ++ .../dto/TpProdOrderRescheduleInfoDTO.java | 81 ++ ...pProdOrderRescheduleInvalidVoucherDTO.java | 34 + .../dto/TpProdOrderRescheduleRecordDTO.java | 36 + .../dto/TpProdOrderRscConfirmQueryDTO.java | 49 + ...rodOrderServiceChargeReduceConfirmDTO.java | 87 ++ .../TpProdPageQueryRefundApplyOrderDTO.java | 82 ++ .../common/dto/TpProdPayOrderDTO.java | 136 +++ .../common/dto/TpProdPriceInquireDTO.java | 52 + .../common/dto/TpProdPricingParamDTO.java | 62 + .../TpProdQueryAvailableRefundVoucherDTO.java | 43 + ...rodQueryAvailableRescheduleVoucherDTO.java | 40 + .../common/dto/TpProdQueryPayResultDTO.java | 38 + .../dto/TpProdQueryRefundApplyOrderDTO.java | 58 + .../dto/TpProdQueryRefundDetailDTO.java | 30 + .../common/dto/TpProdRefundApplyDTO.java | 150 +++ .../common/dto/TpProdRefundApplyOrderDTO.java | 154 +++ .../dto/TpProdRefundAvailableCheckDTO.java | 39 + .../dto/TpProdRefundCharteredBusDTO.java | 56 + .../common/dto/TpProdRefundElementDTO.java | 46 + .../dto/TpProdReschedulePaidSuccessDTO.java | 33 + .../dto/TpProdShowRefundButtonCheckDTO.java | 39 + ...geExistVerificationRecordDateQueryDTO.java | 39 + ...eUserVerificationRecordDetailQueryDTO.java | 26 + ...pProdUserVoucherVerificationRecordDTO.java | 29 + .../dto/TpProdVerificationPassengerDTO.java | 52 + .../common/dto/TpProdVoucherCheckDTO.java | 95 ++ .../common/dto/TpProdVoucherCreateDTO.java | 100 ++ .../common/dto/TpProdVoucherDTO.java | 211 ++++ .../common/dto/TpProdVoucherQueryDTO.java | 56 + .../TpProdVoucherVerificationRecordDTO.java | 58 + ...ProdVoucherVerificationRecordQueryDTO.java | 34 + ...TpRealNamePassengerAvailableRefundDTO.java | 25 + .../dto/TpRealNameTicketRefundChoiceDTO.java | 29 + .../common/dto/TpRefundApplicantDTO.java | 37 + .../common/dto/TpRefundPassengerDTO.java | 66 ++ .../dto/TpRefundRequirementUserDTO.java | 47 + .../common/dto/TpRefundRouteDTO.java | 60 + .../common/dto/TpRefundRouteShuttleDTO.java | 56 + .../common/dto/TpRefundSubjectItemDTO.java | 79 ++ .../dto/TpRefundSubjectItemElementDTO.java | 65 + .../common/dto/TpRouteBookDTO.java | 35 + .../common/dto/TpRouteDetailQueryDTO.java | 31 + .../common/dto/TpServiceChargeDTO.java | 49 + .../common/dto/TpStudentInfoDTO.java | 41 + .../common/dto/TpTravelTripPathPointDTO.java | 58 + .../tptradeprod/common/dto/TpUserInfoDTO.java | 32 + .../common/dto/TpUserPassengerDTO.java | 78 ++ .../common/dto/TpUserPassengerQueryDTO.java | 39 + .../common/dto/TpUserRouteCollectionDTO.java | 107 ++ .../common/dto/TpUserTicketChoiceDTO.java | 40 + .../common/dto/TpVoucherNonRealNameDTO.java | 57 + .../common/dto/TpVoucherPassengerDTO.java | 71 ++ .../common/dto/TpVoucherPurchaseInfoDTO.java | 56 + .../common/enums/TpFlowProcessTypeEnum.java | 29 + .../enums/TpOrderAuditConfirmTypeEnum.java | 51 + .../common/enums/TpOrderConfirmFieldEnum.java | 42 + .../common/enums/TpOrderPayModeEnum.java | 54 + .../common/enums/TpOrderSceneEnum.java | 22 + .../TpOrderServiceChargeBizTypeEnum.java | 55 + .../enums/TpOrderServiceChargeFreeEnum.java | 55 + .../common/enums/TpOrderSourceEnum.java | 57 + .../common/enums/TpOrderStatusEnum.java | 354 ++++++ .../common/enums/TpOrderTripEnum.java | 57 + .../common/enums/TpOrderTypeEnum.java | 79 ++ .../common/enums/TpPayOrderStatusEnum.java | 65 + .../enums/TpProdOrderIdentityFlagEnum.java | 55 + .../enums/TpProdOrderTicketTypeEnum.java | 115 ++ .../enums/TpRefundApplyOrderModulesEnum.java | 45 + .../enums/TpTradeProdMessageConstants.java | 19 + .../enums/task/TpScheduleTaskStatusEnum.java | 44 + .../enums/task/TpScheduleTaskTypeEnum.java | 51 + .../tptradeprod/common/error/ErrorLevel.java | 13 + .../tptradeprod/common/error/ErrorType.java | 15 + .../common/error/TpTradeProdErrorCode.java | 580 +++++++++ .../exception/TpTradeProdException.java | 137 +++ .../model/CarPoolPosGuoLangMessageEntity.java | 46 + .../common/model/OrderDelayMessageEntity.java | 26 + .../model/PayOrderDelayMessageEntity.java | 26 + .../model/PayRefundDelayMessageEntity.java | 26 + .../common/model/PaySuccessMessageEntity.java | 39 + .../model/RefundSuccessMessageEntity.java | 35 + .../model/TicketRefundMessageEntity.java | 60 + .../common/model/TpMessageEntity.java | 47 + .../model/VoucherExpireMessageEntity.java | 47 + ...VoucherRescheduleInvalidMessageEntity.java | 28 + .../VoucherVerificationMessageEntity.java | 60 + .../facade/TpContractAcceptanceFacade.java | 80 ++ .../facade/TpOrderAcceptanceFacade.java | 154 +++ .../facade/TpOrderAuditAcceptanceFacade.java | 103 ++ .../facade/TpOrderChangeAcceptanceFacade.java | 61 + .../TpOrderDispatchAcceptanceFacade.java | 88 ++ .../facade/TpPaymentAcceptanceFacade.java | 22 + .../facade/TpVoucherAcceptanceFacade.java | 72 ++ .../tptradeprod/common/vo/DriverInfoVO.java | 41 + .../vo/TpOrderAuditInquiryResultVO.java | 32 + .../vo/TpOrderAuditPriceInquiryDetailVO.java | 57 + .../common/vo/TpOrderChargeRecordVO.java | 77 ++ .../common/vo/TpOrderDiscountVO.java | 48 + .../common/vo/TpOrderDispatchRecordVO.java | 48 + .../common/vo/TpOrderDriverInfoVO.java | 47 + .../common/vo/TpOrderElementVO.java | 51 + .../tptradeprod/common/vo/TpOrderListVO.java | 309 +++++ .../common/vo/TpOrderPassengerVO.java | 79 ++ .../common/vo/TpOrderPlacerVO.java | 77 ++ .../common/vo/TpOrderPositionFlagVO.java | 29 + .../common/vo/TpOrderPriceRecordVO.java | 73 ++ .../common/vo/TpOrderRefundVO.java | 30 + .../common/vo/TpOrderRequirementUserVO.java | 54 + .../common/vo/TpOrderRouteShuttleVO.java | 64 + .../tptradeprod/common/vo/TpOrderRouteVO.java | 77 ++ .../vo/TpOrderSubjectItemElementVO.java | 64 + .../common/vo/TpOrderSubjectItemVO.java | 100 ++ .../common/vo/TpOrderTargetServiceVO.java | 47 + .../common/vo/TpOrderTransportationVO.java | 77 ++ .../common/vo/TpOrderTravelTripVO.java | 106 ++ .../common/vo/TpOrderTripPositionVO.java | 64 + .../common/vo/TpOrderVehicleInfoVO.java | 33 + .../vo/TpProdCalculateRefundAmountVO.java | 38 + .../vo/TpProdMngVerificationRecordVO.java | 59 + .../vo/TpProdOrderAuditConfirmOrderVO.java | 66 ++ .../vo/TpProdOrderChangeApplicantVO.java | 29 + .../vo/TpProdOrderChangeApplyDetailVO.java | 101 ++ .../vo/TpProdOrderChangeApplyListVO.java | 92 ++ .../vo/TpProdOrderChangeItemFactorVO.java | 92 ++ .../vo/TpProdOrderChangeItemGroupListVO.java | 32 + .../vo/TpProdOrderChangeItemListVO.java | 46 + .../common/vo/TpProdOrderChangeItemVO.java | 70 ++ .../common/vo/TpProdOrderCreateVO.java | 58 + .../common/vo/TpProdOrderDetailVO.java | 473 ++++++++ .../vo/TpProdOrderDispatchDetailVO.java | 110 ++ .../common/vo/TpProdOrderDispatchFleetVO.java | 78 ++ .../vo/TpProdOrderDispatchJoinFleetVO.java | 64 + .../common/vo/TpProdOrderEndorseCreateVO.java | 24 + .../common/vo/TpProdOrderInvoiceVO.java | 47 + .../common/vo/TpProdOrderPaidVO.java | 28 + .../common/vo/TpProdOrderPayVO.java | 29 + .../vo/TpProdOrderPriceRecordDetailVO.java | 77 ++ .../common/vo/TpProdOrderReceivedVO.java | 77 ++ .../common/vo/TpProdOrderRscConfirmVO.java | 44 + .../vo/TpProdOrderTravelDispatchRecordVO.java | 108 ++ .../common/vo/TpProdOrderTravelTripVO.java | 108 ++ .../common/vo/TpProdOrderTripPositionVO.java | 64 + .../TpProdQueryAvailableRefundVoucherVO.java | 41 + .../common/vo/TpProdQueryPayResultVO.java | 60 + .../common/vo/TpProdQueryRefundDetailVO.java | 46 + .../common/vo/TpProdSalesUnitCarpoolVO.java | 86 ++ ...ngeExistVerificationRecordDateQueryVO.java | 23 + ...geUserVerificationRecordDetailQueryVO.java | 23 + .../common/vo/TpProdVoucherCheckVO.java | 29 + .../common/vo/TpProdVoucherPassengerVO.java | 71 ++ .../TpQueryAvailableRescheduleVoucherDTO.java | 35 + .../tptradeprod/common/vo/TpRefundDateVO.java | 20 + .../common/vo/TpServiceChargeVO.java | 50 + .../common/vo/TpUserPassengerVO.java | 61 + .../common/vo/TpUserRouteCollectionVO.java | 101 ++ .../vo/audit/TpProdAuditConfirmDTO.java | 70 ++ .../vo/audit/TpProdAuditCreatedDTO.java | 100 ++ .../vo/audit/TpProdAuditLatestDetailDTO.java | 64 + .../vo/audit/TpProdAuditListOrderVO.java | 79 ++ .../vo/audit/TpProdAuditListQueryDTO.java | 41 + .../common/vo/audit/TpProdAuditListVO.java | 105 ++ .../vo/audit/TpProdAuditQueryDetailDTO.java | 43 + .../common/vo/audit/TpProdAuditVO.java | 112 ++ .../TpProdOrderRescheduleInfoVO.java | 71 ++ .../TpProdOrderRescheduleRecordVO.java | 50 + .../pom.xml | 97 ++ .../integration/client/TpAccountClient.java | 53 + .../integration/client/TpAuditClient.java | 138 +++ .../integration/client/TpBizRuleClient.java | 63 + .../integration/client/TpBusClient.java | 38 + .../integration/client/TpConfigClient.java | 78 ++ .../integration/client/TpContractClient.java | 93 ++ .../integration/client/TpInquireClient.java | 70 ++ .../integration/client/TpInventoryClient.java | 39 + .../client/TpOrderChangeApplyClient.java | 193 +++ .../integration/client/TpOrderClient.java | 376 ++++++ .../client/TpOrderDispatchClient.java | 183 +++ .../client/TpOrderReceivedClient.java | 72 ++ .../integration/client/TpOrgClient.java | 81 ++ .../integration/client/TpPaymentClient.java | 89 ++ .../integration/client/TpProductClient.java | 82 ++ .../client/TpProductSalesUnitClient.java | 66 ++ .../client/TpRatingFormClient.java | 52 + .../integration/client/TpRouteClient.java | 51 + .../integration/client/TpShortLinkClient.java | 54 + ...lCharterTypeCarrierOrganizationClient.java | 34 + .../integration/client/TpTenantClient.java | 75 ++ .../integration/client/TpTripClient.java | 76 ++ .../client/TpUserPassengerClient.java | 79 ++ .../integration/client/TpVoucherClient.java | 161 +++ .../client/email/TpEmailClient.java | 28 + .../client/mq/constants/MessageConstants.java | 49 + .../mq/constants/MessageDelayLevel.java | 28 + .../mq/constants/MessageSysConstants.java | 44 + .../client/mq/entity/BaseMessageEntity.java | 36 + .../TicketRefundSuccessMessageEntity.java | 51 + .../client/mq/template/MessageClient.java | 111 ++ .../integration/client/sms/TpSmsClient.java | 28 + .../integration/convert/TpAuditConverter.java | 54 + .../integration/convert/TpBizRuleConvert.java | 21 + .../integration/convert/TpBusDynConvert.java | 17 + .../convert/TpCarpoolConverter.java | 16 + .../convert/TpContractConverter.java | 43 + .../convert/TpOrderChangeApplyConverter.java | 125 ++ .../integration/convert/TpOrderConverter.java | 48 + .../convert/TpOrderDispatchConverter.java | 33 + .../convert/TpOrderReceivedConverter.java | 19 + .../convert/TpPayOrderConvert.java | 17 + .../integration/convert/TpPaymentConvert.java | 22 + .../convert/TpPricingInquireConverter.java | 29 + .../convert/TpPricingParamConverter.java | 21 + .../integration/convert/TpShuttleConvert.java | 18 + .../convert/TpUserPassengerConverter.java | 29 + .../convert/TpVoucherConverter.java | 54 + .../service/integration/entity/BusDriver.java | 32 + .../service/integration/entity/Shuttle.java | 58 + .../integration/entity/StationTime.java | 22 + .../service/integration/entity/TpBusDyn.java | 69 ++ .../entity/TpConfigItemMultiValue.java | 18 + .../entity/TpConfigItemSingleValue.java | 16 + .../tptradeprod-common-util/pom.xml | 20 + .../util/constants/BizDataKeyConstants.java | 11 + tptradeprod-core/pom.xml | 19 + .../tptradeprod-core-model/pom.xml | 32 + .../core/model/task/TpScheduleTask.java | 53 + .../tptradeprod-core-service/pom.xml | 101 ++ .../TpChangePriceAndPayModeComponent.java | 389 ++++++ .../TpCharterBusInquireComponent.java | 155 +++ .../compoment/TpCreateOrderComponent.java | 69 ++ .../core/compoment/TpInquireComponent.java | 159 +++ .../compoment/TpOrderSyncTripComponent.java | 317 +++++ .../compoment/TpRescheduleOrderComponent.java | 57 + .../TpTenantNacosConfigComponent.java | 47 + .../core/constants/MessageConstants.java | 63 + .../TpOperatorInventoryStrategyFactory.java | 33 + .../TpCarPoolGuoLangNoticeMessageHandler.java | 98 ++ .../handler/TpDelayOrderMessageHandler.java | 138 +++ .../TpDelayPayOrderMessageHandler.java | 55 + .../TpDelayRefundOrderMessageHandler.java | 103 ++ .../core/handler/TpMessageHandler.java | 23 + .../core/handler/TpPayMessageHandler.java | 107 ++ .../TpRefundSuccessMessageHandler.java | 221 ++++ ...RescheduleInvalidTicketMessageHandler.java | 94 ++ .../handler/TpTicketRefundMessageHandler.java | 106 ++ .../TpVoucherExpireMessageHandler.java | 123 ++ .../TpVoucherVerificationMessageHandler.java | 121 ++ .../core/listener/BaseMqMessageListener.java | 99 ++ .../core/listener/DelayMqMessageListener.java | 88 ++ .../core/listener/NacosAbstractListener.java | 142 +++ .../listener/NacosJsonDefaultListener.java | 42 + .../core/strategy/TpInventoryStrategy.java | 29 + .../impl/TpDeductInventoryStrategyImpl.java | 73 ++ .../impl/TpFreezeInventoryStrategyImpl.java | 76 ++ 539 files changed, 44824 insertions(+) create mode 100644 .gitignore create mode 100644 APP-META/docker-config/Dockerfile-dev create mode 100644 APP-META/docker-config/Dockerfile-pre create mode 100644 APP-META/docker-config/Dockerfile-prod create mode 100644 APP-META/docker-config/Dockerfile-test create mode 100644 README.md create mode 100644 pom.xml create mode 100644 tptradeprod-api/pom.xml create mode 100644 tptradeprod-api/src/main/java/com/deepinnet/tptradeprod/controller/SmsTestController.java create mode 100644 tptradeprod-api/src/main/java/com/deepinnet/tptradeprod/controller/TpContractTestController.java create mode 100644 tptradeprod-api/src/main/java/com/deepinnet/tptradeprod/controller/TpOrderProdController.java create mode 100644 tptradeprod-api/src/main/java/com/deepinnet/tptradeprod/controller/TpPaymentController.java create mode 100644 tptradeprod-api/src/main/java/com/deepinnet/tptradeprod/controller/TpRuleProdController.java create mode 100644 tptradeprod-api/src/main/java/com/deepinnet/tptradeprod/controller/TpScheduleTaskTestController.java create mode 100644 tptradeprod-api/src/main/java/com/deepinnet/tptradeprod/controller/TpVoucherTestController.java create mode 100644 tptradeprod-app-starter/pom.xml create mode 100644 tptradeprod-app-starter/src/main/java/com/deepinnet/tptradeprod/ApplicationStarter.java create mode 100644 tptradeprod-app-starter/src/main/java/com/deepinnet/tptradeprod/advise/GlobalControllerAdvise.java create mode 100644 tptradeprod-app-starter/src/main/java/com/deepinnet/tptradeprod/config/Knife4jConfiguration.java create mode 100644 tptradeprod-app-starter/src/main/java/com/deepinnet/tptradeprod/config/RocketMQConfig.java create mode 100644 tptradeprod-app-starter/src/main/java/com/deepinnet/tptradeprod/config/ValidatorConfig.java create mode 100644 tptradeprod-app-starter/src/main/resources/application-dev.yml create mode 100644 tptradeprod-app-starter/src/main/resources/application-local.yml create mode 100644 tptradeprod-app-starter/src/main/resources/application-pre.yml create mode 100644 tptradeprod-app-starter/src/main/resources/application-prod.yml create mode 100644 tptradeprod-app-starter/src/main/resources/application-test.yml create mode 100644 tptradeprod-app-starter/src/main/resources/application.yml create mode 100644 tptradeprod-app-starter/src/main/resources/bootstrap.yml create mode 100644 tptradeprod-app-starter/src/main/resources/logback-spring.xml create mode 100644 tptradeprod-app-starter/src/test/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpPlaceOrderProductCheckNodeTest.java create mode 100644 tptradeprod-app-starter/src/test/java/com/deepinnet/tptradeprod/core/component/TpOrderChangeApplyTest.java create mode 100644 tptradeprod-app-starter/src/test/java/com/deepinnet/tptradeprod/core/component/TpOrderConfirmTest.java create mode 100644 tptradeprod-app-starter/src/test/java/com/deepinnet/tptradeprod/core/component/TpOrderDispatchOrderTest.java create mode 100644 tptradeprod-app-starter/src/test/java/com/deepinnet/tptradeprod/core/component/TpOrderSyncTripComponentTest.java create mode 100644 tptradeprod-app-starter/src/test/java/com/deepinnet/tptradeprod/core/component/TpVoucherVerficationRecodeTest.java create mode 100644 tptradeprod-app-starter/src/test/java/com/deepinnet/tptradeprod/facade/TpOrderChangeAcceptanceFacadeTest.java create mode 100644 tptradeprod-app-starter/src/test/java/com/util/TestResult.java create mode 100644 tptradeprod-app-starter/src/test/java/com/util/TestStrUtils.java create mode 100644 tptradeprod-app-starter/src/test/java/com/util/TestUtils.java create mode 100644 tptradeprod-app-starter/src/test/resources/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpPlaceOrderProductCheckNode/checkRestrictTime.json create mode 100644 tptradeprod-app-starter/src/test/resources/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpPlaceOrderProductCheckNode/process.json create mode 100644 tptradeprod-biz/pom.xml create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/pom.xml create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/advice/IntegrationClientInterceptor.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/advice/MessageLogInterceptor.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/advice/RpcExceptionHandleAspect.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/config/ThreadPoolConfig.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/constants/TpOrderCalcFormula.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/constants/TpOrderListQueryConstants.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/constants/TpTradeProdConstants.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/converter/TpSaleUnitCarpoolConvert.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/log/LogFormatHelper.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/changeorder/TpChangeOrderRecordServiceChargeNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/changeorder/TpOrderChangNeedAuditNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/changeorder/TpOrderDiffNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/changeorder/TpPrepareOrderNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/changeorder/TpQueryOrderChangeAuditNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/changeorder/TpQueryOrderNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/constants/LiteFlowConstant.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/constants/TpOrderBizErrorConstant.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpOrderAuditConfirmContext.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpOrderChangeApplyCreateContext.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpOrderManualSyncTripContext.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpOrderRescheduleContext.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpOrderServiceChargeReduceContext.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpRefundTicketApplyContext.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpRescheduleOrderContext.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpSendEmailContext.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpSendSmsContext.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpUserCancelOrderContext.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpUserPlaceOrderContext.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/manager/LiteFlowManager.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpBasicCheckNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpCharterBusInquireCheckNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpCharterBusInternalPriceInquireNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpFreeTicketCheckNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpInquireCheckNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderAuditCheckOrderStatusNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderBusinessTypeCheckNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderCancelCheckIsAuditNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderCancelCheckStatusNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderCarpoolCheckPosSourceNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderFirstConfirmedCheckPayModeNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderIsNeedConfirmCheckNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderIsNeedInquireCheckNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderManualSyncTripCheckNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderPaidBizTypeCheckNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderPayModeCheckNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpPlaceOrderProductCheckNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpRescheduleInquireCheckNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpRescheduleVoucherInvalidCheckNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpRescheduleVoucherTimeCheckNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/BatchDeductToRollbackInventoryNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpBuildVoucherNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpCreateDepositOrderNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpCreateOrderNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpDeductInventoryNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpFreeOrderPaidSendSyncMessageNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpFreezeInventoryNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpNeedPayOrderStatusNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderCancelCheckRefundOrPayNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderCancelConfirmNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderCancelDoubleConfirmNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderCancelPushNeedConfirmNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderCancelSaveChargeRecordNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderCarpoolSendSyncMessageNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderChangeConfirmNoneReductionNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderChangeConfirmReductionNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderChangeReductionSyncTripNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderCreateApplyCreateNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderCustomBusSendDelayMessageNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderDepositNeedPayStatusNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderManualSyncCancelTripNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderManualSyncCreateTripNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderManualSyncUpdateTripNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderNeedConfirmNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderNeedConfirmRemindAuditorNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderNoneReductionSyncTripNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderPushBalancePaidNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderPushDepositPaidNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderPushNeedDispatchNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderPushNeedDispatchStatusNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderUpdateChargeRecordNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderUserPrePayNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpPaidOrderStatusNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpRefundTicketSuccessNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpRescheduleOrderNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpSendEmailNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpSendRefundSuccessMessageNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpSendSmsNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpTripSyncNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpAvailableRefundVoucherQueryNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpOrderDetailQueryNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpProductQueryNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpRefundApplyOrderQueryNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpRefundQueryPayOrderNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpRescheduleOrderDetailQueryNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpRescheduleProductQueryNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpRescheduleVoucherQueryNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpVoucherQueryNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpVoucherVerificationRecordQueryNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderChangeApplyCheckHasApplyNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderChangeApplyCheckNeedAuditNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderChangeApplyCreateAuditNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderChangeApplyCreateSwitchNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderChangeApplyDispatchOrderNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderChangeApplyEndTripPriceConfirmNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderChangeApplyQueryDetailNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderChangeApplySaveNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderCreateApplyCheckNoneApplyNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpApplySmsSendPrepareNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderCancelApprovedTimeOutSwitchNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderCancelTimeoutChangePriceAndPayModeNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmAuditApprovedSwitchNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmBizTypeSwitchNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmChangePriceAndPayModeNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmCheckNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmCreateRscAuditNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmDispatchFleetNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmQueryApplyDetailNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmQueryAuditDetailNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmReceiveOrderNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmUpdateApplyStatusNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmUpdateApplyStatusRscNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmUpdateAuditApprovedNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderCreateConfirmAuditTimeOutNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmApprovedSwitchNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmBizTypeSwitchNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmCheckNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmDispatchFleetNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmQueryApplyDetailNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmQueryAuditDetailNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmSaveAuditApprovedResultNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmSubmitApplyApprovedResultNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmUpdatePriceAndPayModeNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/check/TpBasicCheckNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/check/TpRefundAmountCheckNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/check/TpRefundButtonShowableBasicCheckNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/check/TpRefundButtonShowableNeedInvokeRuleNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/check/TpRefundCountRuleCheckNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/check/TpRefundTimeRuleCheckNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/check/TpRefundVoucherStatusCheckNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/context/TpCalculateRefundAmountContext.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/context/TpQueryAvailableVoucherContext.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/context/TpRefundTicketButtonShowableContext.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/context/TpRefundTicketCheckContext.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/context/TpRefundTicketCommonContext.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/context/TpRefundTicketCommonRequest.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/execute/TpCalculateRefundAmountNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/execute/TpCreateRefundApplyOrderNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/execute/TpPaymentRefundNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/execute/TpRefundChangeOrderStatusNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/execute/TpVoucherInvalidNode.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/impl/TpContractAcceptanceFacadeImpl.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/impl/TpOrderAcceptanceFacadeImpl.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/impl/TpOrderChangeApplyAcceptanceFacadeImpl.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/impl/TpOrderConfirmAcceptanceFacadeImpl.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/impl/TpOrderDispatchAcceptanceFacadeImpl.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/impl/TpPaymentAcceptanceFacadeImpl.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/impl/TpVoucherAcceptanceFacadeImpl.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/task/CommonScheduleTaskExecuteTemplate.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/task/TpScheduleTaskService.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/task/worker/AbstractBaseTaskWorker.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/task/worker/CloseOrderBeforeTwoHoursWorker.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/task/worker/OrderAuditTimeOutWorker.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/task/worker/TripEndAfterThreeDaysWorker.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/task/worker/TripStartBeforeHalfHourWorker.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/task/worker/TripStartBeforeTwoHoursWorker.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/util/TimeConvertUtil.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/util/TpVoucherUtil.java create mode 100644 tptradeprod-biz/tptradeprod-biz-service-impl/src/main/resources/config/flow.el.xml create mode 100644 tptradeprod-common/pom.xml create mode 100644 tptradeprod-common/tptradeprod-common-dal/pom.xml create mode 100644 tptradeprod-common/tptradeprod-common-dal/src/main/java/com/deepinnet/tptradeprod/common/dal/condition/task/UpdateTaskCondition.java create mode 100644 tptradeprod-common/tptradeprod-common-dal/src/main/java/com/deepinnet/tptradeprod/common/dal/convert/task/TpScheduleTaskMapStructConvert.java create mode 100644 tptradeprod-common/tptradeprod-common-dal/src/main/java/com/deepinnet/tptradeprod/common/dal/dao/TpScheduleTaskDao.java create mode 100644 tptradeprod-common/tptradeprod-common-dal/src/main/java/com/deepinnet/tptradeprod/common/dal/dataobject/TpScheduleTaskDO.java create mode 100644 tptradeprod-common/tptradeprod-common-dal/src/main/java/com/deepinnet/tptradeprod/common/dal/repository/task/TpScheduleTaskRepository.java create mode 100644 tptradeprod-common/tptradeprod-common-dal/src/main/java/com/deepinnet/tptradeprod/common/dal/repository/task/impl/TpScheduleTaskRepositoryImpl.java create mode 100644 tptradeprod-common/tptradeprod-common-service/pom.xml create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/pom.xml create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpAvailableRescheduleVoucherDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpBillDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpCancelOrderDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpChargeDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpFinancialAccountDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpNonRealNameTicketRefundChoiceDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderAuditPriceInquiryDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderCancelDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderElementDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderPlacerDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderRefundDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderRequirementUserDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderRouteDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderRouteShuttleDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderStationDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderSubjectItemDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderSubjectItemElementDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderTargetServiceDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderUnverifiedQueryDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpPassengerDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdAuditOrderListPagedQueryDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdBizRuleDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdCalculateRefundAmountDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdCharteredBusPricingParamDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdCharteredPriceInquiryDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdCheckSuccessCallbackDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdDispatchOrderReceivedDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdEndorseOrderCreateDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdInvalidVoucherDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdMngVerificationRecordQueryDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdNonRealNamePassengerAvailableRefundDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderAuditConfirmDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderCarrierOrganizationDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeApplicantCreatedDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeApplyApprovedResultSubmitDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeApplyApprovedSubmitDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeApplyCreatedDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeApplyDetailDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeApplyListDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeApplyStatusUpdateDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeApplySubmitRscApplyDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeItemCreatedDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeItemFactorCreatedDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeItemListDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderConfirmViewDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderCreateDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderDiscountDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderDispatchCallBackDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderDispatchCreatedDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderDispatchDetailDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderDispatchFleetCreatedDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderDispatchGiveBackDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderDispatchListDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderDispatchStatusUpdateDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderEndTripPriceConfirmDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderListQueryDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderManualDispatchDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderPaidDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderPayDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderPriceRecordDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderPriceRecordDetailDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderQueryDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderReceivedCreateDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderReceivedDetailDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderRescheduleDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderRescheduleInfoDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderRescheduleInvalidVoucherDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderRescheduleRecordDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderRscConfirmQueryDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderServiceChargeReduceConfirmDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdPageQueryRefundApplyOrderDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdPayOrderDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdPriceInquireDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdPricingParamDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdQueryAvailableRefundVoucherDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdQueryAvailableRescheduleVoucherDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdQueryPayResultDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdQueryRefundApplyOrderDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdQueryRefundDetailDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdRefundApplyDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdRefundApplyOrderDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdRefundAvailableCheckDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdRefundCharteredBusDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdRefundElementDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdReschedulePaidSuccessDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdShowRefundButtonCheckDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdTimeRangeExistVerificationRecordDateQueryDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdTimeRangeUserVerificationRecordDetailQueryDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdUserVoucherVerificationRecordDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdVerificationPassengerDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdVoucherCheckDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdVoucherCreateDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdVoucherDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdVoucherQueryDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdVoucherVerificationRecordDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdVoucherVerificationRecordQueryDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRealNamePassengerAvailableRefundDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRealNameTicketRefundChoiceDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRefundApplicantDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRefundPassengerDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRefundRequirementUserDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRefundRouteDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRefundRouteShuttleDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRefundSubjectItemDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRefundSubjectItemElementDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRouteBookDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRouteDetailQueryDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpServiceChargeDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpStudentInfoDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpTravelTripPathPointDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpUserInfoDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpUserPassengerDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpUserPassengerQueryDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpUserRouteCollectionDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpUserTicketChoiceDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpVoucherNonRealNameDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpVoucherPassengerDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpVoucherPurchaseInfoDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpFlowProcessTypeEnum.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderAuditConfirmTypeEnum.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderConfirmFieldEnum.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderPayModeEnum.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderSceneEnum.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderServiceChargeBizTypeEnum.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderServiceChargeFreeEnum.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderSourceEnum.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderStatusEnum.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderTripEnum.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderTypeEnum.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpPayOrderStatusEnum.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpProdOrderIdentityFlagEnum.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpProdOrderTicketTypeEnum.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpRefundApplyOrderModulesEnum.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpTradeProdMessageConstants.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/task/TpScheduleTaskStatusEnum.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/task/TpScheduleTaskTypeEnum.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/error/ErrorLevel.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/error/ErrorType.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/error/TpTradeProdErrorCode.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/exception/TpTradeProdException.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/CarPoolPosGuoLangMessageEntity.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/OrderDelayMessageEntity.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/PayOrderDelayMessageEntity.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/PayRefundDelayMessageEntity.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/PaySuccessMessageEntity.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/RefundSuccessMessageEntity.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/TicketRefundMessageEntity.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/TpMessageEntity.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/VoucherExpireMessageEntity.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/VoucherRescheduleInvalidMessageEntity.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/VoucherVerificationMessageEntity.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/service/facade/TpContractAcceptanceFacade.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/service/facade/TpOrderAcceptanceFacade.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/service/facade/TpOrderAuditAcceptanceFacade.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/service/facade/TpOrderChangeAcceptanceFacade.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/service/facade/TpOrderDispatchAcceptanceFacade.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/service/facade/TpPaymentAcceptanceFacade.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/service/facade/TpVoucherAcceptanceFacade.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/DriverInfoVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderAuditInquiryResultVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderAuditPriceInquiryDetailVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderChargeRecordVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderDiscountVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderDispatchRecordVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderDriverInfoVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderElementVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderListVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderPassengerVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderPlacerVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderPositionFlagVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderPriceRecordVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderRefundVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderRequirementUserVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderRouteShuttleVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderRouteVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderSubjectItemElementVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderSubjectItemVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderTargetServiceVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderTransportationVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderTravelTripVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderTripPositionVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderVehicleInfoVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdCalculateRefundAmountVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdMngVerificationRecordVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderAuditConfirmOrderVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderChangeApplicantVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderChangeApplyDetailVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderChangeApplyListVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderChangeItemFactorVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderChangeItemGroupListVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderChangeItemListVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderChangeItemVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderCreateVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderDetailVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderDispatchDetailVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderDispatchFleetVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderDispatchJoinFleetVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderEndorseCreateVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderInvoiceVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderPaidVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderPayVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderPriceRecordDetailVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderReceivedVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderRscConfirmVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderTravelDispatchRecordVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderTravelTripVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderTripPositionVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdQueryAvailableRefundVoucherVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdQueryPayResultVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdQueryRefundDetailVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdSalesUnitCarpoolVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdTimeRangeExistVerificationRecordDateQueryVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdTimeRangeUserVerificationRecordDetailQueryVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdVoucherCheckVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdVoucherPassengerVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpQueryAvailableRescheduleVoucherDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpRefundDateVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpServiceChargeVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpUserPassengerVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpUserRouteCollectionVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/audit/TpProdAuditConfirmDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/audit/TpProdAuditCreatedDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/audit/TpProdAuditLatestDetailDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/audit/TpProdAuditListOrderVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/audit/TpProdAuditListQueryDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/audit/TpProdAuditListVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/audit/TpProdAuditQueryDetailDTO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/audit/TpProdAuditVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/reschedule/TpProdOrderRescheduleInfoVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/reschedule/TpProdOrderRescheduleRecordVO.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/pom.xml create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpAccountClient.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpAuditClient.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpBizRuleClient.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpBusClient.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpConfigClient.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpContractClient.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpInquireClient.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpInventoryClient.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpOrderChangeApplyClient.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpOrderClient.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpOrderDispatchClient.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpOrderReceivedClient.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpOrgClient.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpPaymentClient.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpProductClient.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpProductSalesUnitClient.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpRatingFormClient.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpRouteClient.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpShortLinkClient.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpSpecialCharterTypeCarrierOrganizationClient.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpTenantClient.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpTripClient.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpUserPassengerClient.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpVoucherClient.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/email/TpEmailClient.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/mq/constants/MessageConstants.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/mq/constants/MessageDelayLevel.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/mq/constants/MessageSysConstants.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/mq/entity/BaseMessageEntity.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/mq/entity/TicketRefundSuccessMessageEntity.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/mq/template/MessageClient.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/sms/TpSmsClient.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpAuditConverter.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpBizRuleConvert.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpBusDynConvert.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpCarpoolConverter.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpContractConverter.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpOrderChangeApplyConverter.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpOrderConverter.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpOrderDispatchConverter.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpOrderReceivedConverter.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpPayOrderConvert.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpPaymentConvert.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpPricingInquireConverter.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpPricingParamConverter.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpShuttleConvert.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpUserPassengerConverter.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpVoucherConverter.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/entity/BusDriver.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/entity/Shuttle.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/entity/StationTime.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/entity/TpBusDyn.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/entity/TpConfigItemMultiValue.java create mode 100644 tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/entity/TpConfigItemSingleValue.java create mode 100644 tptradeprod-common/tptradeprod-common-util/pom.xml create mode 100644 tptradeprod-common/tptradeprod-common-util/src/main/java/com/deepinnet/tptradeprod/common/util/constants/BizDataKeyConstants.java create mode 100644 tptradeprod-core/pom.xml create mode 100644 tptradeprod-core/tptradeprod-core-model/pom.xml create mode 100644 tptradeprod-core/tptradeprod-core-model/src/main/java/com/deepinnet/tptradeprod/core/model/task/TpScheduleTask.java create mode 100644 tptradeprod-core/tptradeprod-core-service/pom.xml create mode 100644 tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/compoment/TpChangePriceAndPayModeComponent.java create mode 100644 tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/compoment/TpCharterBusInquireComponent.java create mode 100644 tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/compoment/TpCreateOrderComponent.java create mode 100644 tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/compoment/TpInquireComponent.java create mode 100644 tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/compoment/TpOrderSyncTripComponent.java create mode 100644 tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/compoment/TpRescheduleOrderComponent.java create mode 100644 tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/compoment/TpTenantNacosConfigComponent.java create mode 100644 tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/constants/MessageConstants.java create mode 100644 tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/factory/TpOperatorInventoryStrategyFactory.java create mode 100644 tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpCarPoolGuoLangNoticeMessageHandler.java create mode 100644 tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpDelayOrderMessageHandler.java create mode 100644 tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpDelayPayOrderMessageHandler.java create mode 100644 tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpDelayRefundOrderMessageHandler.java create mode 100644 tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpMessageHandler.java create mode 100644 tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpPayMessageHandler.java create mode 100644 tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpRefundSuccessMessageHandler.java create mode 100644 tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpRescheduleInvalidTicketMessageHandler.java create mode 100644 tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpTicketRefundMessageHandler.java create mode 100644 tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpVoucherExpireMessageHandler.java create mode 100644 tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpVoucherVerificationMessageHandler.java create mode 100644 tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/listener/BaseMqMessageListener.java create mode 100644 tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/listener/DelayMqMessageListener.java create mode 100644 tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/listener/NacosAbstractListener.java create mode 100644 tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/listener/NacosJsonDefaultListener.java create mode 100644 tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/strategy/TpInventoryStrategy.java create mode 100644 tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/strategy/impl/TpDeductInventoryStrategyImpl.java create mode 100644 tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/strategy/impl/TpFreezeInventoryStrategyImpl.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..08d9f10 --- /dev/null +++ b/.gitignore @@ -0,0 +1,42 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store + +#日志文件 +logs \ No newline at end of file diff --git a/APP-META/docker-config/Dockerfile-dev b/APP-META/docker-config/Dockerfile-dev new file mode 100644 index 0000000..67445d5 --- /dev/null +++ b/APP-META/docker-config/Dockerfile-dev @@ -0,0 +1,46 @@ +FROM deepinnet-k8s-images-registry.cn-hangzhou.cr.aliyuncs.com/deepinnet/rdc-base:no-java +#FROM deepinnet-k8s-image-registry.cn-hangzhou.cr.aliyuncs.com/deepinnet/openjdk:8-jdk-alpine +#FROM openjdk:8-jdk-alpine +ARG jdk_versions="1.8" +RUN for version in ${jdk_versions}; \ + do \ + cd /tmp && \ + wget -q https://rdc-public-software.oss-cn-hangzhou.aliyuncs.com/jdk/jdk${version}.tar.gz && \ + mkdir -p /jdk/jdk${version} && \ + tar xf jdk${version}.tar.gz -C /jdk/jdk${version} --strip-components 1 && \ + ln -s /jdk/jdk${version} /jdk/jdk${version}/jvm && \ + rm -f jdk${version}.tar.gz; \ + done + +RUN export JAVA_HOME=/jdk/jdk1.8 && \ + export PATH=$JAVA_HOME/bin:$PATH && \ + export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar + +## +ENV BUILD_APP_NAME tptradeprod +ENV SPRING_PROFILE dev + +ARG APP_JAR=tptradeprod.jar + +RUN mkdir -p /home/$BUILD_APP_NAME/target + +RUN echo "#!/bin/bash" >> /home/$BUILD_APP_NAME/start.sh + +RUN echo "cd /home/$BUILD_APP_NAME/target/" >> /home/$BUILD_APP_NAME/start.sh + +RUN echo "tar -xvf /home/$BUILD_APP_NAME/target/$BUILD_APP_NAME.tgz" >> /home/$BUILD_APP_NAME/start.sh + +RUN echo "chmod 777 /home/$BUILD_APP_NAME/target/$BUILD_APP_NAME.jar" >> /home/$BUILD_APP_NAME/start.sh + +RUN echo "exec /jdk/jdk1.8/bin/java -Djava.security.egd=file:/dev/./urandom -Dspring.profiles.active=${SPRING_PROFILE} -jar /home/$BUILD_APP_NAME/target/$BUILD_APP_NAME.jar" >> /home/$BUILD_APP_NAME/start.sh + +RUN chmod +x /home/$BUILD_APP_NAME/*.sh + +### +ADD $APP_JAR /home/$BUILD_APP_NAME/target/$BUILD_APP_NAME.tgz + +WORKDIR /home/$BUILD_APP_NAME + +ENTRYPOINT ["/bin/sh", "/home/tptradeprod/start.sh"] + +EXPOSE 8080 \ No newline at end of file diff --git a/APP-META/docker-config/Dockerfile-pre b/APP-META/docker-config/Dockerfile-pre new file mode 100644 index 0000000..18290c2 --- /dev/null +++ b/APP-META/docker-config/Dockerfile-pre @@ -0,0 +1,46 @@ +FROM shendu-prod-registry.cn-hangzhou.cr.aliyuncs.com/deepinnet/rdc-base:no-java +#FROM deepinnet-k8s-image-registry.cn-hangzhou.cr.aliyuncs.com/deepinnet/openjdk:8-jdk-alpine +#FROM openjdk:8-jdk-alpine +ARG jdk_versions="11" +RUN for version in ${jdk_versions}; \ + do \ + cd /tmp && \ + wget -q https://rdc-public-software.oss-cn-hangzhou.aliyuncs.com/jdk/jdk${version}.tar.gz && \ + mkdir -p /jdk/jdk${version} && \ + tar xf jdk${version}.tar.gz -C /jdk/jdk${version} --strip-components 1 && \ + ln -s /jdk/jdk${version} /jdk/jdk${version}/jvm && \ + rm -f jdk${version}.tar.gz; \ + done + +RUN export JAVA_HOME=/jdk/jdk${jdk_versions} && \ + export PATH=$JAVA_HOME/bin:$PATH && \ + export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar + +## +ENV BUILD_APP_NAME tptradeprod +ENV SPRING_PROFILE pre + +ARG APP_JAR=tptradeprod.jar + +RUN mkdir -p /home/$BUILD_APP_NAME/target + +RUN echo "#!/bin/bash" >> /home/$BUILD_APP_NAME/start.sh + +RUN echo "cd /home/$BUILD_APP_NAME/target/" >> /home/$BUILD_APP_NAME/start.sh + +RUN echo "tar -xvf /home/$BUILD_APP_NAME/target/$BUILD_APP_NAME.tgz" >> /home/$BUILD_APP_NAME/start.sh + +RUN echo "chmod 777 /home/$BUILD_APP_NAME/target/$BUILD_APP_NAME.jar" >> /home/$BUILD_APP_NAME/start.sh + +RUN echo "exec /jdk/jdk${jdk_versions}/bin/java -Djava.security.egd=file:/dev/./urandom -Dspring.profiles.active=${SPRING_PROFILE} -jar /home/$BUILD_APP_NAME/target/$BUILD_APP_NAME.jar" >> /home/$BUILD_APP_NAME/start.sh + +RUN chmod +x /home/$BUILD_APP_NAME/*.sh + +### +ADD $APP_JAR /home/$BUILD_APP_NAME/target/$BUILD_APP_NAME.tgz + +WORKDIR /home/$BUILD_APP_NAME + +ENTRYPOINT ["/bin/sh", "/home/tptradeprod/start.sh"] + +EXPOSE 8080 \ No newline at end of file diff --git a/APP-META/docker-config/Dockerfile-prod b/APP-META/docker-config/Dockerfile-prod new file mode 100644 index 0000000..7f4db74 --- /dev/null +++ b/APP-META/docker-config/Dockerfile-prod @@ -0,0 +1,46 @@ +FROM shendu-prod-registry.cn-hangzhou.cr.aliyuncs.com/deepinnet/rdc-base:no-java +#FROM deepinnet-k8s-image-registry.cn-hangzhou.cr.aliyuncs.com/deepinnet/openjdk:8-jdk-alpine +#FROM openjdk:8-jdk-alpine +ARG jdk_versions="11" +RUN for version in ${jdk_versions}; \ + do \ + cd /tmp && \ + wget -q https://rdc-public-software.oss-cn-hangzhou.aliyuncs.com/jdk/jdk${version}.tar.gz && \ + mkdir -p /jdk/jdk${version} && \ + tar xf jdk${version}.tar.gz -C /jdk/jdk${version} --strip-components 1 && \ + ln -s /jdk/jdk${version} /jdk/jdk${version}/jvm && \ + rm -f jdk${version}.tar.gz; \ + done + +RUN export JAVA_HOME=/jdk/jdk${jdk_versions} && \ + export PATH=$JAVA_HOME/bin:$PATH && \ + export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar + +## +ENV BUILD_APP_NAME tptradeprod +ENV SPRING_PROFILE prod + +ARG APP_JAR=tptradeprod.jar + +RUN mkdir -p /home/$BUILD_APP_NAME/target + +RUN echo "#!/bin/bash" >> /home/$BUILD_APP_NAME/start.sh + +RUN echo "cd /home/$BUILD_APP_NAME/target/" >> /home/$BUILD_APP_NAME/start.sh + +RUN echo "tar -xvf /home/$BUILD_APP_NAME/target/$BUILD_APP_NAME.tgz" >> /home/$BUILD_APP_NAME/start.sh + +RUN echo "chmod 777 /home/$BUILD_APP_NAME/target/$BUILD_APP_NAME.jar" >> /home/$BUILD_APP_NAME/start.sh + +RUN echo "exec /jdk/jdk${jdk_versions}/bin/java -Djava.security.egd=file:/dev/./urandom -Dspring.profiles.active=${SPRING_PROFILE} -jar /home/$BUILD_APP_NAME/target/$BUILD_APP_NAME.jar" >> /home/$BUILD_APP_NAME/start.sh + +RUN chmod +x /home/$BUILD_APP_NAME/*.sh + +### +ADD $APP_JAR /home/$BUILD_APP_NAME/target/$BUILD_APP_NAME.tgz + +WORKDIR /home/$BUILD_APP_NAME + +ENTRYPOINT ["/bin/sh", "/home/tptradeprod/start.sh"] + +EXPOSE 8080 \ No newline at end of file diff --git a/APP-META/docker-config/Dockerfile-test b/APP-META/docker-config/Dockerfile-test new file mode 100644 index 0000000..0db4d67 --- /dev/null +++ b/APP-META/docker-config/Dockerfile-test @@ -0,0 +1,46 @@ +FROM deepinnet-k8s-images-registry.cn-hangzhou.cr.aliyuncs.com/deepinnet/rdc-base:no-java +#FROM deepinnet-k8s-image-registry.cn-hangzhou.cr.aliyuncs.com/deepinnet/openjdk:8-jdk-alpine +#FROM openjdk:8-jdk-alpine +ARG jdk_versions="11" +RUN for version in ${jdk_versions}; \ + do \ + cd /tmp && \ + wget -q https://rdc-public-software.oss-cn-hangzhou.aliyuncs.com/jdk/jdk${version}.tar.gz && \ + mkdir -p /jdk/jdk${version} && \ + tar xf jdk${version}.tar.gz -C /jdk/jdk${version} --strip-components 1 && \ + ln -s /jdk/jdk${version} /jdk/jdk${version}/jvm && \ + rm -f jdk${version}.tar.gz; \ + done + +RUN export JAVA_HOME=/jdk/jdk${jdk_versions} && \ + export PATH=$JAVA_HOME/bin:$PATH && \ + export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar + +## +ENV BUILD_APP_NAME tptradeprod +ENV SPRING_PROFILE test + +ARG APP_JAR=tptradeprod.jar + +RUN mkdir -p /home/$BUILD_APP_NAME/target + +RUN echo "#!/bin/bash" >> /home/$BUILD_APP_NAME/start.sh + +RUN echo "cd /home/$BUILD_APP_NAME/target/" >> /home/$BUILD_APP_NAME/start.sh + +RUN echo "tar -xvf /home/$BUILD_APP_NAME/target/$BUILD_APP_NAME.tgz" >> /home/$BUILD_APP_NAME/start.sh + +RUN echo "chmod 777 /home/$BUILD_APP_NAME/target/$BUILD_APP_NAME.jar" >> /home/$BUILD_APP_NAME/start.sh + +RUN echo "exec /jdk/jdk${jdk_versions}/bin/java -Djava.security.egd=file:/dev/./urandom -Dspring.profiles.active=${SPRING_PROFILE} -jar /home/$BUILD_APP_NAME/target/$BUILD_APP_NAME.jar" >> /home/$BUILD_APP_NAME/start.sh + +RUN chmod +x /home/$BUILD_APP_NAME/*.sh + +### +ADD $APP_JAR /home/$BUILD_APP_NAME/target/$BUILD_APP_NAME.tgz + +WORKDIR /home/$BUILD_APP_NAME + +ENTRYPOINT ["/bin/sh", "/home/tptradeprod/start.sh"] + +EXPOSE 8080 \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..6b3cd92 --- /dev/null +++ b/README.md @@ -0,0 +1,30 @@ +## 命名规则: +groupId:统一使用com.deepinnet +
+artifactId:deepinnet-应用名 + +包命名规范:com.deepinnet.应用名.模块名 +
+举例:com.deepinnet.tptradeprod.biz + +## 项目分层说明: +- tptradeprod-app-starter(SpringBoot应用启动类) +- tptradeprod-biz(业务层) + - tptradeprod-biz-service-impl(业务层的实现,具体业务流程编排) + +- tptradeprod-common(通用层) + - tptradeprod-common-dal(仓储层) + - tptradeprod-common-service + - tptradeprod-common-service-facade(需要向外界暴露的领域服务) + - tptradeprod-common-service-integration(集成的第三方接口) + - tptradeprod-common-util(工具) + +- tptradeprod-core(领域层) + - tptradeprod-core-service(本系统内使用的service接口) + - tptradeprod-core-model(领域模型) + +## 各模块依赖关系: +- biz:负责业务流程编排,依赖于common-service-facade、common-service-integration、 + common-service-util、core-service +- core-service:本系统内的服务, 不需要向外暴露,依赖core-model、 + common-dal、common-util diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..efd9d2d --- /dev/null +++ b/pom.xml @@ -0,0 +1,440 @@ + + + 4.0.0 + + com.deepinnet + tptradeprod + 1.0-SNAPSHOT + pom + + tptradeprod-api + tptradeprod-app-starter + tptradeprod-biz + tptradeprod-common + tptradeprod-core + + + + 11 + 11 + UTF-8 + + + 2.6.11 + 2021.0.4 + 2021.0.4.0 + 2.6.0 + + + 8.0.28 + 1.2.17 + 3.5.2 + 2.3.0 + 3.6.3 + 3.1.4 + 1.7.9 + 1.0.1 + 2.11.2 + + + 1.18.24 + 2.13.4 + 3.12.0 + 4.4 + 5.8.21 + 5.8.21 + 3.0.3 + 1.70 + 3.0.5 + 1.5.0.Final + 32.1.1-jre + + 2.6.0 + 0.9.16 + 2.4 + 3.15.1 + + 3.18.0 + + + + 1.0.0.20231218.1-SNAPSHOT + 1.0.0.20240227 + + 1.0.0.20241014.1-SNAPSHOT + 1.0.0.20240730-RELEASE + 20240628.0.0-RELEASE + 1.0.0.2024011602-SNAPSHOT + 202407.0.0-RELEASE + + + 1.0-SNAPSHOT + 1.0.0.20240730.1-RELEASE + + + + + + + com.deepinnet + deepinnet-common-boot-starter + ${deepinnet-common-boot-starter-version} + + + + com.deepinnet + tp-common-lang + ${tp-common-lang-version} + + + + org.springframework.boot + spring-boot-dependencies + ${spring.boot.version} + import + pom + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring.cloud.version} + import + pom + + + + com.alibaba.cloud + spring-cloud-alibaba-dependencies + ${spring.cloud.alibaba.version} + pom + import + + + + + org.apache.dubbo + dubbo-bom + ${dubbo.version} + pom + import + + + + com.deepinnet + tptradeprod-common-service-integration + ${tptradeprod.version} + + + + com.deepinnet + tpcommoncore-common-service-facade + ${tpcommoncore-common-service-facade-version} + + + + com.deepinnet + tptradeprod-common-util + ${tptradeprod.version} + + + + com.deepinnet + tptradeprod-biz-service-impl + ${tptradeprod.version} + + + + com.deepinnet + tptradeprod-api + ${tptradeprod.version} + + + + com.deepinnet + tptradeprod-core-service + ${tptradeprod.version} + + + + com.deepinnet + tptradeprod-common-dal + ${tptradeprod.version} + + + + com.deepinnet + tptradeprod-core-model + ${tptradeprod.version} + + + + com.deepinnet + tptradeprod-common-service-facade + ${tptradeprod-common-service-facade-version} + + + + + com.deepinnet + tpconfigcore-common-service-facade + ${tpconfigcore-common-service-facade-version} + + + + com.deepinnet + tptradecore-common-service-facade + ${tptradecore-common-service-facade-version} + + + + com.deepinnet + tpproductcore-common-service-facade + ${tpproductcore-common-service-facade-version} + + + + com.deepinnet + tpbaseopcore-common-service-facade + ${tpbaseopcore-common-service-facade-version} + + + + com.yomahub + liteflow-spring-boot-starter + ${liteflow.version} + + + + org.mapstruct + mapstruct + ${mapstruct.version} + + + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + + + + com.google.guava + guava + ${guava.version} + + + + com.sun.mail + javax.mail + 1.6.2 + + + + com.github.ulisesbocchio + jasypt-spring-boot-starter + ${jasypt.version} + + + + mysql + mysql-connector-java + ${mysql.version} + + + + com.alibaba + druid-spring-boot-starter + ${druid.version} + + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus.version} + + + + cn.hutool + hutool-all + ${hutool.version} + + + + + org.apache.dubbo + dubbo + ${dubbo.version} + + + + org.apache.dubbo + dubbo-registry-nacos + ${dubbo.version} + + + + org.perf4j + perf4j + ${perf4j.version} + + + + commons-io + commons-io + ${commons-io.version} + + + + org.bouncycastle + bcprov-jdk15on + ${bcprov-jdk15on.version} + + + + + com.aliyun.oss + aliyun-sdk-oss + ${aliyun-oss.version} + + + + org.apache.rocketmq + rocketmq-spring-boot-starter + ${rocketmq.version} + + + + + com.github.xiaoymin + knife4j-spring-boot-starter + ${knife.version} + + + + + com.aliyun.schedulerx + schedulerx2-spring-boot-starter + ${schedulerx2.version} + + + + org.apache.logging.log4j + log4j-api + + + org.apache.logging.log4j + log4j-core + + + log4j + log4j + + + + + + com.aliyun.schedulerx + schedulerx2-plugin-kubernetes + ${schedulerx-plugin-kubernetes} + + + + + org.redisson + redisson-spring-boot-starter + ${redssion-spring-boot-starter.version} + + + + com.ibuscloud + pubtrans-rating-common-facade + 1.0.0-SNAPSHOT + + + + + + + + com.deepinnet + deepinnet-common-boot-starter + + + + org.projectlombok + lombok + ${lombok.version} + provided + + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + + com.fasterxml.jackson.core + jackson-annotations + ${jackson.version} + + + + com.fasterxml.jackson.core + jackson-core + ${jackson.version} + + + cn.hutool + hutool-all + ${hutool.version} + + + + org.apache.commons + commons-lang3 + ${common-lang3.version} + + + + com.google.guava + guava + + + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 11 + 11 + + + org.projectlombok + lombok + 1.18.24 + + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + + + + + + + + diff --git a/tptradeprod-api/pom.xml b/tptradeprod-api/pom.xml new file mode 100644 index 0000000..54673f6 --- /dev/null +++ b/tptradeprod-api/pom.xml @@ -0,0 +1,31 @@ + + + 4.0.0 + + com.deepinnet + tptradeprod + 1.0-SNAPSHOT + + + tptradeprod-api + + + 1.0-SNAPSHOT + + + + + org.springframework.boot + spring-boot-starter-web + + + + com.deepinnet + tptradeprod-biz-service-impl + ${biz-service-impl.version} + + + + diff --git a/tptradeprod-api/src/main/java/com/deepinnet/tptradeprod/controller/SmsTestController.java b/tptradeprod-api/src/main/java/com/deepinnet/tptradeprod/controller/SmsTestController.java new file mode 100644 index 0000000..9ac288a --- /dev/null +++ b/tptradeprod-api/src/main/java/com/deepinnet/tptradeprod/controller/SmsTestController.java @@ -0,0 +1,41 @@ +package com.deepinnet.tptradeprod.controller; + + +//import com.deepinnet.tpcommoncore.common.service.template.email.TpEmailDispatchTimeoutStaffTemplate; +import com.deepinnet.tpcommoncore.common.service.template.sms.user.TpSmsVerifyCodeTemplate; +import com.deepinnet.tptradeprod.common.service.integration.client.email.TpEmailClient; +import com.deepinnet.tptradeprod.common.service.integration.client.sms.TpSmsClient; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +/** + * @author amos wong + * @create 2023/11/9 14:40 + * @Description + */ +@RestController +@RequestMapping("/message") +public class SmsTestController { + + @Resource + private TpSmsClient smsClient; + + @Resource + private TpEmailClient emailClient; + + @PostMapping("/send/sms") + public void sendSms() { + TpSmsVerifyCodeTemplate verifyCodeTemplate = new TpSmsVerifyCodeTemplate(); + verifyCodeTemplate.setCode("110119"); + smsClient.sendSms("15668049807", verifyCodeTemplate); + } + + @PostMapping("/send/email") + public void sendEmail() { +// TpEmailDispatchTimeoutStaffTemplate dispatchTimeoutTemplate = new TpEmailDispatchTimeoutStaffTemplate(); +// dispatchTimeoutTemplate.setOrderNo(System.currentTimeMillis() + ""); +// dispatchTimeoutTemplate.setOrderTime(System.currentTimeMillis() + ""); +// emailClient.sendEmail("wangbiao@deepinnet.com", dispatchTimeoutTemplate); + } +} diff --git a/tptradeprod-api/src/main/java/com/deepinnet/tptradeprod/controller/TpContractTestController.java b/tptradeprod-api/src/main/java/com/deepinnet/tptradeprod/controller/TpContractTestController.java new file mode 100644 index 0000000..7639f16 --- /dev/null +++ b/tptradeprod-api/src/main/java/com/deepinnet/tptradeprod/controller/TpContractTestController.java @@ -0,0 +1,51 @@ +package com.deepinnet.tptradeprod.controller; + +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.service.facade.TpContractAcceptanceFacade; +import com.deepinnet.tptradeprod.common.vo.*; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +/** + * @author amos wong + * @create 2024/1/15 17:41 + * @Description + */ +@RestController +@RequestMapping(value = "/contract") +@RequiredArgsConstructor +public class TpContractTestController { + + @Resource + private TpContractAcceptanceFacade contractAcceptanceFacade; + + @ApiOperation("是否能够退票的校验") + @PostMapping("/available/refund/check") + public TpResult checkAvailableRefund(@RequestBody TpProdRefundAvailableCheckDTO checkDTO) { + return contractAcceptanceFacade.checkRefundAvailable(checkDTO); + } + + @PostMapping("/calculate/amount") + public TpResult calculateAmount(@RequestBody TpProdCalculateRefundAmountDTO refundAmountDTO) { + return contractAcceptanceFacade.calculateRefundAmount(refundAmountDTO); + } + + @PostMapping("/refund") + public TpResult refund(@RequestBody TpProdRefundApplyDTO refundApplyDTO) { + return contractAcceptanceFacade.refundTicket(refundApplyDTO); + } + + @PostMapping("/available/vouchers") + public TpResult getAvailableVouchers(@RequestBody TpProdQueryAvailableRefundVoucherDTO availableVoucherDTO) { + return contractAcceptanceFacade.queryAvailableRefundVoucherList(availableVoucherDTO); + } + + @PostMapping("/refund/button") + public TpResult checkRefundTicketButtonShowable(@RequestBody TpProdShowRefundButtonCheckDTO showRefundButtonCheckDTO) { + return contractAcceptanceFacade.checkRefundTicketButtonShowable(showRefundButtonCheckDTO); + } +} diff --git a/tptradeprod-api/src/main/java/com/deepinnet/tptradeprod/controller/TpOrderProdController.java b/tptradeprod-api/src/main/java/com/deepinnet/tptradeprod/controller/TpOrderProdController.java new file mode 100644 index 0000000..71d6dec --- /dev/null +++ b/tptradeprod-api/src/main/java/com/deepinnet/tptradeprod/controller/TpOrderProdController.java @@ -0,0 +1,151 @@ +package com.deepinnet.tptradeprod.controller; + +import com.deepinnet.tenant.util.CommonTenantIdUtil; +import com.deepinnet.tp.common.lang.model.TpUserDetail; +import com.deepinnet.tp.common.lang.page.CommonPage; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.UserDetailUtils; +import com.deepinnet.tptradecore.common.dto.order.TpOrderChangePriceDTO; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.model.TpMessageEntity; +import com.deepinnet.tptradeprod.common.service.facade.TpOrderAcceptanceFacade; +import com.deepinnet.tptradeprod.common.vo.*; +import com.deepinnet.tptradeprod.core.compoment.TpChangePriceAndPayModeComponent; +import com.deepinnet.tptradeprod.core.handler.TpPayMessageHandler; +import io.swagger.annotations.*; +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Optional; + +@Api(tags = "订单接口") +@RestController +@RequestMapping("/order") +@RequiredArgsConstructor +public class TpOrderProdController { + + @DubboReference + private TpOrderAcceptanceFacade orderAcceptanceFacade; + + @Resource + private TpPayMessageHandler payMessageHandler; + + private final TpChangePriceAndPayModeComponent tpChangePriceAndPayModeComponent; + + @ApiOperation("[订单] => [创建订单]") + @PostMapping("/create") + public TpResult createOrder(@RequestBody TpProdOrderCreateDTO dto) { + return orderAcceptanceFacade.createOrder(dto); + } + + @ApiOperation("[订单] => [支付订单]") + @PostMapping("/prepay") + public TpResult payOrder(@RequestBody TpProdOrderPayDTO dto) { + return orderAcceptanceFacade.payOrder(dto); + } + + @ApiOperation("[订单] => [订单详情]") + @PostMapping("/detail") + public TpResult orderDetail(@RequestBody TpProdOrderQueryDTO dto) { + return orderAcceptanceFacade.getOrderDetail(dto); + } + + @ApiOperation("[订单] => [订单列表]") + @PostMapping("/list") + public TpResult> orderList(@RequestBody TpProdOrderListQueryDTO dto) { + return orderAcceptanceFacade.getOrderList(dto); + } + + @ApiOperation("[乘客] => [新增乘客]") + @PostMapping("/passenger/save") + public TpResult savePassenger(@RequestBody TpUserPassengerDTO dto) { + return orderAcceptanceFacade.savePassenger(dto); + } + + @ApiOperation("[乘客] => [编辑乘客]") + @PostMapping("/passenger/edit") + public TpResult editPassenger(@RequestBody TpUserPassengerDTO dto) { + return orderAcceptanceFacade.editPassenger(dto); + } + + @ApiOperation("[乘客] => [删除乘客]") + @PostMapping("/passenger/del") + public TpResult delPassenger(@RequestBody TpUserPassengerQueryDTO dto) { + return orderAcceptanceFacade.delPassenger(dto); + } + + @ApiOperation("[乘客] => [乘客列表]") + @PostMapping("/passenger/list") + public TpResult> passengerList(@RequestBody TpUserPassengerQueryDTO dto) { + return orderAcceptanceFacade.passengerList(dto); + } + + @ApiOperation("支付订单") + @PostMapping("/paid") + public TpResult paid(@RequestBody TpProdOrderPaidDTO dto) { + return orderAcceptanceFacade.paid(dto); + } + + @PostMapping("/paid/message") + public void paidMessage(@RequestBody TpMessageEntity messageEntity) { + payMessageHandler.handle(messageEntity); + } + + @PostMapping("/test/syncTrip") + public void syncTrip(@RequestBody TpProdOrderQueryDTO dto) { + orderAcceptanceFacade.manualSyncTrip(dto); + } + + @GetMapping("/changePriceTest") + public void changePriceTest() { + TpOrderChangePriceDTO tpOrderChangePriceDTO = new TpOrderChangePriceDTO(); + tpOrderChangePriceDTO.setOriginalOrderNo("0000000000001"); + tpOrderChangePriceDTO.setTenantId("test"); + tpOrderChangePriceDTO.setPricingAmount("1888.00"); + tpOrderChangePriceDTO.setChangeAmount("888.00"); + tpOrderChangePriceDTO.setOperatorUser("001"); + tpOrderChangePriceDTO.setOperatorName("juju"); + tpChangePriceAndPayModeComponent.execute(tpOrderChangePriceDTO); + } + + @ApiOperation("改签订单") + @PostMapping("/endorse") + public TpResult endorse(@RequestBody TpProdOrderCreateDTO dto) { + String tenantId = CommonTenantIdUtil.getTenantId(); + dto.setTenantId(tenantId); + + // 获取当前用户信息 + dto.setUserNo("21875"); + + TpOrderPlacerVO tpOrderPlacerDTO = Optional.ofNullable(dto.getOrderPlacer()).orElse(new TpOrderPlacerVO()); + tpOrderPlacerDTO.setPlacerNo("21875"); + tpOrderPlacerDTO.setPlacerName("13142096520"); + tpOrderPlacerDTO.setPlacerContact("13142096520"); + + dto.setOrderPlacer(tpOrderPlacerDTO); + return orderAcceptanceFacade.endorseOrder(dto); + } + + @ApiOperation("改签订单") + @PostMapping("/reschedule") + public TpResult reschedule(@RequestBody TpProdOrderRescheduleDTO dto) { + TpProdOrderCreateDTO createOrderDto = dto.getCreateOrderDto(); + + dto.setTenantId("1000293"); + dto.getCreateOrderDto().setTenantId("1000293"); + + // 获取当前用户信息 + createOrderDto.setUserNo("21875"); + createOrderDto.setUsername("13142096520"); + + TpOrderPlacerVO tpOrderPlacerDTO = Optional.ofNullable(createOrderDto.getOrderPlacer()).orElse(new TpOrderPlacerVO()); + tpOrderPlacerDTO.setPlacerNo("21875"); + tpOrderPlacerDTO.setPlacerName("13142096520"); + tpOrderPlacerDTO.setPlacerContact("13142096520"); + + return orderAcceptanceFacade.rescheduleOrder(dto); + } +} diff --git a/tptradeprod-api/src/main/java/com/deepinnet/tptradeprod/controller/TpPaymentController.java b/tptradeprod-api/src/main/java/com/deepinnet/tptradeprod/controller/TpPaymentController.java new file mode 100644 index 0000000..157a607 --- /dev/null +++ b/tptradeprod-api/src/main/java/com/deepinnet/tptradeprod/controller/TpPaymentController.java @@ -0,0 +1,30 @@ +package com.deepinnet.tptradeprod.controller; + +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.service.facade.*; +import com.deepinnet.tptradeprod.common.vo.*; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.web.bind.annotation.*; + +/** + * @author amos wong + * @create 2023/9/13 17:23 + * @Description + */ +@RestController +@RequestMapping("/payment") +@RequiredArgsConstructor +public class TpPaymentController { + + @DubboReference + private TpPaymentAcceptanceFacade paymentAcceptanceFacade; + + @ApiOperation("查询支付结果") + @PostMapping("/pay/result") + public TpResult queryPayResult(@RequestBody TpProdQueryPayResultDTO dto) { + return paymentAcceptanceFacade.queryPayResult(dto); + } +} diff --git a/tptradeprod-api/src/main/java/com/deepinnet/tptradeprod/controller/TpRuleProdController.java b/tptradeprod-api/src/main/java/com/deepinnet/tptradeprod/controller/TpRuleProdController.java new file mode 100644 index 0000000..f040e6f --- /dev/null +++ b/tptradeprod-api/src/main/java/com/deepinnet/tptradeprod/controller/TpRuleProdController.java @@ -0,0 +1,137 @@ +package com.deepinnet.tptradeprod.controller; + +import cn.hutool.core.date.*; +import cn.hutool.core.util.*; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpbaseopcore.common.dto.route.*; +import com.deepinnet.tpproductcore.common.dto.rule.*; +import com.deepinnet.tpproductcore.common.enums.TpRuleExpressionGroupEnum; +import com.deepinnet.tptradeprod.common.enums.TpProdOrderTicketTypeEnum; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.*; +import com.google.common.collect.Lists; +import io.swagger.annotations.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + *

+ * 规则测试接口 + *

+ * + * @author chenjiaju + * @since 2023/9/20 + */ + +@Api(tags = "规则线路接口") +@RestController +@RequestMapping("/rule") +@RequiredArgsConstructor +public class TpRuleProdController { + + @Resource + private TpBizRuleClient bizRuleClient; + + @Resource + private TpRouteClient routeClient; + + @ApiOperation("[规则接口] => [限购规则]") + @PostMapping("/buyLimitRule") + public TpResult buyLimitRule() { + // 当前订单票数 + int currentOrderTickets = 0; + + int currentDayUserTickets = 100; + TpBuyCountLimitParamDTO tpBuyCountLimitParamDTO = new TpBuyCountLimitParamDTO(); + tpBuyCountLimitParamDTO.setDayBuyCount(currentDayUserTickets); + tpBuyCountLimitParamDTO.setOrderBuyCount(currentOrderTickets); + + List ruleList = Lists.newArrayList(); + ruleList.add("if(\"day\".equals(\"order\"))" + + "{ return orderBuyCount <= 5}" + + " if(\"day\".equals(\"day\"))" + + "{ return dayBuyCount + orderBuyCount <= 5;} " + + "return false;"); + + TpRuleExecuteDTO tpRuleExecuteDTO = new TpRuleExecuteDTO<>(); + // 设置表达式入参 + tpRuleExecuteDTO.setParameter(tpBuyCountLimitParamDTO); + // 设置购买的规则表达式 + tpRuleExecuteDTO.setRuleList(ruleList); + tpRuleExecuteDTO.setRuleExpressionGroup(TpRuleExpressionGroupEnum.BUY_COUNT); + + TpRuleExecuteResultVO resultVO = bizRuleClient.executeRule(tpRuleExecuteDTO); + if (!resultVO.getResult()) { + LogUtil.error("当前用户:{}, 购买票数量超过限制", "USER_001"); + throw new TpTradeProdException(TpTradeProdErrorCode.USER_BUY_LIMIT_ERROR); + } + + return TpResult.success(Boolean.TRUE); + } + + @ApiOperation("[规则接口] => [放票规则]") + @GetMapping("/ticketRule") + public TpResult ticketRule(@RequestParam(defaultValue = "day") @NotBlank String ticketType) { + TpProdOrderTicketTypeEnum ticketTypeEnum = TpProdOrderTicketTypeEnum.getEnum(ticketType); + if (ObjectUtil.isNull(ticketTypeEnum)) { + LogUtil.error("票类型错误, {}", ticketType); + throw new TpTradeProdException(TpTradeProdErrorCode.TICKET_TYPE_ERROR); + } + + // 设置最早放票时间 + TpTicketBuyParamDTO tpTicketBuyParamDTO = new TpTicketBuyParamDTO(); + // 2023-09-22 00:00:00 + tpTicketBuyParamDTO.setStartTime(DateUtil.offset(DateUtil.date(), DateField.DAY_OF_WEEK, 2).toString()); + + + TpRuleExecuteDTO tpRuleExecuteDTO = new TpRuleExecuteDTO<>(); + List ruleList = Lists.newArrayList(); + // 日票 + if (StrUtil.equals(TpProdOrderTicketTypeEnum.DAY.getTicketType(), ticketType)) { + ruleList.add("return new Date().getTime() >= startTime - (3 * 86400000);"); + } + + // 周票 + if (StrUtil.equals(TpProdOrderTicketTypeEnum.WEEK.getTicketType(), ticketType)) { + ruleList.add("import com.deepinnet.tp.common.lang.util.TpMoney;\n import java.time.LocalDate;\n import java.lang.String; \n return LocalDate.now().getDayOfWeek().getValue() >= 3"); + ruleList.add("return new Date().getTime() >= startTime - (3 * 86400000);"); + } + + // 月票 + if (StrUtil.equals(TpProdOrderTicketTypeEnum.MONTH.getTicketType(), ticketType)) { + ruleList.add("import com.deepinnet.tp.common.lang.util.TpMoney;\n import java.time.LocalDate;\n import java.lang.String; \n return LocalDate.now().getDayOfMonth() >= 3"); + ruleList.add("return new Date().getTime() >= startTime - (3 * 86400000);"); + } + + tpRuleExecuteDTO.setRuleList(ruleList); + tpRuleExecuteDTO.setParameter(tpTicketBuyParamDTO); + TpRuleExecuteResultVO resultVO = bizRuleClient.executeRule(tpRuleExecuteDTO); + if (!resultVO.getResult()) { + LogUtil.error("当前时间暂不能购买"); + throw new TpTradeProdException(TpTradeProdErrorCode.USER_BUY_TIME_ERROR); + } + + return TpResult.success(Boolean.TRUE); + } + + @ApiOperation("[线路接口] => [线路详情]") + @PostMapping("/routeDetail") + public TpResult routeDetail() { + RouteDetail2CDTO routeDetail = routeClient.getRouteDetail2C("DZGJ1695179273514", "test"); + return TpResult.success(routeDetail); + } + + @ApiOperation("[线路接口] => [班次详情]") + @PostMapping("/shuttleDetail") + public TpResult shuttleDetail() { + ShuttleRouteStationTimeDTO shuttleRouteStationTimeDTO = routeClient.queryRouteStationInShuttle("DZGJ1695179273514", null, null, "test"); + return TpResult.success(shuttleRouteStationTimeDTO); + } + +} diff --git a/tptradeprod-api/src/main/java/com/deepinnet/tptradeprod/controller/TpScheduleTaskTestController.java b/tptradeprod-api/src/main/java/com/deepinnet/tptradeprod/controller/TpScheduleTaskTestController.java new file mode 100644 index 0000000..a34f26c --- /dev/null +++ b/tptradeprod-api/src/main/java/com/deepinnet/tptradeprod/controller/TpScheduleTaskTestController.java @@ -0,0 +1,61 @@ +package com.deepinnet.tptradeprod.controller; + +import com.deepinnet.tptradeprod.biz.task.TpScheduleTaskService; +import com.deepinnet.tptradeprod.biz.task.worker.AbstractBaseTaskWorker; +import com.deepinnet.tptradeprod.common.enums.task.TpScheduleTaskTypeEnum; +import com.deepinnet.tptradeprod.core.model.task.TpScheduleTask; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @author amos wong + * @create 2023/12/22 15:20 + * @Description + */ +@RestController +@RequestMapping("/task") +@RequiredArgsConstructor +public class TpScheduleTaskTestController implements InitializingBean { + + @Resource + private Map taskWorkerMap; + + @Resource + private TpScheduleTaskService scheduleTaskService; + + private final Map scheduleTypeWorkerMap = new ConcurrentHashMap<>(); + + @Override + public void afterPropertiesSet() throws Exception { + taskWorkerMap + .values() + .parallelStream() + .forEach(taskWorker -> scheduleTypeWorkerMap.put(taskWorker.getTaskType(), taskWorker)); + } + + @PostMapping("/manualExecute") + public String manualExecuteTask(Long taskId) { + TpScheduleTask scheduleTask = scheduleTaskService.getTaskById(taskId); + if (scheduleTask == null) { + return "fail"; + } + + AbstractBaseTaskWorker taskWorker = scheduleTypeWorkerMap.get(TpScheduleTaskTypeEnum.getByType(scheduleTask.getTaskType())); + if (taskWorker == null) { + return "fail"; + } + + try { + taskWorker.doCommit(scheduleTask); + return "success"; + } catch (Exception e) { + e.printStackTrace(); + return "fail"; + } + } +} diff --git a/tptradeprod-api/src/main/java/com/deepinnet/tptradeprod/controller/TpVoucherTestController.java b/tptradeprod-api/src/main/java/com/deepinnet/tptradeprod/controller/TpVoucherTestController.java new file mode 100644 index 0000000..49742f7 --- /dev/null +++ b/tptradeprod-api/src/main/java/com/deepinnet/tptradeprod/controller/TpVoucherTestController.java @@ -0,0 +1,27 @@ +package com.deepinnet.tptradeprod.controller; + +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.service.facade.TpVoucherAcceptanceFacade; +import com.deepinnet.tptradeprod.common.vo.TpQueryAvailableRescheduleVoucherDTO; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +/** + * @author amos wong + * @create 2024/7/5 11:34 + * @Description + */ +@RestController +@RequestMapping("/voucher") +public class TpVoucherTestController { + + @Resource + private TpVoucherAcceptanceFacade voucherAcceptanceFacade; + + @PostMapping("/available/reschedule") + public TpResult getAvailableRescheduleVoucherList(@RequestBody TpProdQueryAvailableRescheduleVoucherDTO queryDTO) { + return voucherAcceptanceFacade.queryAvailableRescheduleVoucherList(queryDTO); + } +} diff --git a/tptradeprod-app-starter/pom.xml b/tptradeprod-app-starter/pom.xml new file mode 100644 index 0000000..41c9711 --- /dev/null +++ b/tptradeprod-app-starter/pom.xml @@ -0,0 +1,175 @@ + + + 4.0.0 + + com.deepinnet + tptradeprod + 1.0-SNAPSHOT + + + tptradeprod-app-starter + + + + org.springframework.boot + spring-boot-starter-web + + + + mysql + mysql-connector-java + + + + com.alibaba + druid-spring-boot-starter + + + + com.deepinnet + tptradeprod-biz-service-impl + + + + com.deepinnet + tptradeprod-api + + + + org.springframework.boot + spring-boot-starter-test + test + + + + com.github.jsonzou + jmockdata + 4.3.0 + compile + + + + org.springframework.cloud + spring-cloud-starter-bootstrap + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + org.apache.dubbo + dubbo + + + + org.apache.dubbo + dubbo-registry-nacos + + + + com.github.ulisesbocchio + jasypt-spring-boot-starter + + + + + com.github.xiaoymin + knife4j-spring-boot-starter + + + + + tptradeprod + + + org.springframework.boot + spring-boot-maven-plugin + 2.7.6 + + + com.deepinnet.tptradeprod.ApplicationStarter + + + org.projectlombok + lombok + + + + + + + + repackage + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0-M5 + + ${argLine} -Djacoco.agent.destfile=target/jacoco.exec + true + + + + org.jacoco + jacoco-maven-plugin + 0.8.7 + + + report + + report + + + + jacoco-initialize + + prepare-agent + + + + verify + + report-aggregate + + + + + + + + + src/main/java + + **/*.xml + + true + + + src/main/resources + + **/*.xml + **/*.yml + + true + + + + + diff --git a/tptradeprod-app-starter/src/main/java/com/deepinnet/tptradeprod/ApplicationStarter.java b/tptradeprod-app-starter/src/main/java/com/deepinnet/tptradeprod/ApplicationStarter.java new file mode 100644 index 0000000..686f434 --- /dev/null +++ b/tptradeprod-app-starter/src/main/java/com/deepinnet/tptradeprod/ApplicationStarter.java @@ -0,0 +1,23 @@ +package com.deepinnet.tptradeprod; + +import cn.hutool.extra.spring.EnableSpringUtil; +import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.EnableAspectJAutoProxy; +import org.springframework.scheduling.annotation.EnableScheduling; + +@SpringBootApplication +@MapperScan({"com.deepinnet.tptradeprod.common.dal.dao"}) +@EnableDubbo(scanBasePackages = "com.deepinnet") +@EnableScheduling +@EnableAspectJAutoProxy(proxyTargetClass = true) +@EnableSpringUtil +public class ApplicationStarter { + + public static void main(String[] args) { + SpringApplication.run(ApplicationStarter.class, args); + } + +} diff --git a/tptradeprod-app-starter/src/main/java/com/deepinnet/tptradeprod/advise/GlobalControllerAdvise.java b/tptradeprod-app-starter/src/main/java/com/deepinnet/tptradeprod/advise/GlobalControllerAdvise.java new file mode 100644 index 0000000..210414d --- /dev/null +++ b/tptradeprod-app-starter/src/main/java/com/deepinnet/tptradeprod/advise/GlobalControllerAdvise.java @@ -0,0 +1,100 @@ +package com.deepinnet.tptradeprod.advise; + +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.rpc.RpcException; +import org.springframework.context.support.DefaultMessageSourceResolvable; +import org.springframework.validation.BindException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.*; + +import javax.validation.*; +import java.util.stream.Collectors; + +/** + * Description: 全局异常统一处理 + *

+ * Date: 2022/11/2 + * Author: lijunheng + */ +@Slf4j +@RestControllerAdvice +public class GlobalControllerAdvise { + + /** + * RPC异常处理 + */ + @ExceptionHandler(RpcException.class) + public TpResult RpcExceptionHandler(RpcException e) { + log.error("RPC服务异常", e); + return TpResult.fail(TpTradeProdErrorCode.INTERNAL_SERVER_ERROR.getCode(), TpTradeProdErrorCode.INTERNAL_SERVER_ERROR.getDesc()); + } + + /** + * 处理请求参数格式错误 @RequestBody上validate失败后抛出的异常是MethodArgumentNotValidException异常 + */ + @ExceptionHandler(MethodArgumentNotValidException.class) + public TpResult methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) { + String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining(";")); + return TpResult.fail(TpTradeProdErrorCode.ILLEGAL_PARAMS.getCode(), message); + } + + /** + * 处理Get请求中 使用@Valid 验证路径中请求实体校验失败后抛出的异常 + */ + @ExceptionHandler(BindException.class) + public TpResult bindExceptionHandler(BindException e) { + log.error("系统业务异常", e); + String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining(";")); + return TpResult.fail(TpTradeProdErrorCode.ILLEGAL_PARAMS.getCode(), message); + } + + /** + * 处理请求参数格式错误 @RequestParam上validate失败后抛出的异常是ConstraintViolationException + */ + @ExceptionHandler(ConstraintViolationException.class) + public TpResult constraintViolationExceptionHandler(ConstraintViolationException e) { + log.error("系统业务异常", e); + String message = e.getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.joining(";")); + return TpResult.fail(TpTradeProdErrorCode.ILLEGAL_PARAMS.getCode(), message); + } + + /** + * 系统具体异常提示 + * + * @param e + * @return + */ + @ExceptionHandler(TpTradeProdException.class) + public TpResult tradeProdExceptionHandler(TpTradeProdException e) { + log.error("系统业务异常", e); + return TpResult.fail(e.getErrorCode().getCode(), e.getMessage()); + } + + /** + * 系统具体异常提示 + * + * @param e + * @return + */ + @ExceptionHandler(TpException.class) + public TpResult tpExceptionHandler(TpException e) { + log.error("系统业务异常", e); + return TpResult.fail(e.getErrorCode(), e.getMessage()); + } + + /** + * 内部兜底异常处理 + * + * @param e + * @return + */ + @ExceptionHandler(Exception.class) + public TpResult exceptionHandler(Exception e) { + log.error("系统异常", e); + return TpResult.fail(TpTradeProdErrorCode.INTERNAL_SERVER_ERROR.getCode(), TpTradeProdErrorCode.INTERNAL_SERVER_ERROR.getDesc()); + } +} diff --git a/tptradeprod-app-starter/src/main/java/com/deepinnet/tptradeprod/config/Knife4jConfiguration.java b/tptradeprod-app-starter/src/main/java/com/deepinnet/tptradeprod/config/Knife4jConfiguration.java new file mode 100644 index 0000000..3edd026 --- /dev/null +++ b/tptradeprod-app-starter/src/main/java/com/deepinnet/tptradeprod/config/Knife4jConfiguration.java @@ -0,0 +1,88 @@ +package com.deepinnet.tptradeprod.config; + +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.util.ReflectionUtils; +import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.Contact; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +import java.lang.reflect.Field; +import java.util.List; +import java.util.stream.Collectors; + +/** +* Knife Configuration +* +* @author chenjiaju +* @version 2023/08/18 +*/ + +@Configuration +@EnableSwagger2 +public class Knife4jConfiguration { + + @Bean(value = "docketBean") + public Docket docketBean() { + //指定使用Swagger2规范 + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(new ApiInfoBuilder() + .title("tptradeprod-接口文档") + //描述字段支持Markdown语法 + .description("# tptradeprod-Rest API") + .termsOfServiceUrl("http://localhost:8080/") + .contact(new Contact("chenjiaju", "http://localhost:8080","ccc-ju@outlook.com")) + .version("1.0") + .build()) + //分组名称 + .groupName("tptradeprod") + .select() + //这里指定Controller扫描包路径 + .apis(RequestHandlerSelectors.basePackage("com.deepinnet")) + .paths(PathSelectors.any()) + .build(); + } + + @Bean + public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() { + return new BeanPostProcessor() { + + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + if (bean instanceof WebMvcRequestHandlerProvider) { + customizeSpringfoxHandlerMappings(getHandlerMappings(bean)); + } + return bean; + } + + private void customizeSpringfoxHandlerMappings(List mappings) { + List copy = mappings.stream() + .filter(mapping -> mapping.getPatternParser() == null) + .collect(Collectors.toList()); + mappings.clear(); + mappings.addAll(copy); + } + + @SuppressWarnings("unchecked") + private List getHandlerMappings(Object bean) { + try { + Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings"); + field.setAccessible(true); + return (List) field.get(bean); + } catch (IllegalArgumentException | IllegalAccessException e) { + throw new IllegalStateException(e); + } + } + }; + } + + +} diff --git a/tptradeprod-app-starter/src/main/java/com/deepinnet/tptradeprod/config/RocketMQConfig.java b/tptradeprod-app-starter/src/main/java/com/deepinnet/tptradeprod/config/RocketMQConfig.java new file mode 100644 index 0000000..3f0ce78 --- /dev/null +++ b/tptradeprod-app-starter/src/main/java/com/deepinnet/tptradeprod/config/RocketMQConfig.java @@ -0,0 +1,43 @@ +package com.deepinnet.tptradeprod.config; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import org.apache.rocketmq.spring.support.RocketMQMessageConverter; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.messaging.converter.CompositeMessageConverter; +import org.springframework.messaging.converter.MappingJackson2MessageConverter; +import org.springframework.messaging.converter.MessageConverter; + +import java.util.List; + +/** + * RocketMQ序列化器处理 + * + * @author tianxincoord@163.com + * @since 2022/5/13 + */ +@Configuration +public class RocketMQConfig { + + /** + * 解决RocketMQ Jackson不支持Java时间类型配置 + */ + @Bean + @Primary + public RocketMQMessageConverter createRocketMQMessageConverter() { + RocketMQMessageConverter converter = new RocketMQMessageConverter(); + CompositeMessageConverter compositeMessageConverter = (CompositeMessageConverter) converter.getMessageConverter(); + List messageConverterList = compositeMessageConverter.getConverters(); + for (MessageConverter messageConverter : messageConverterList) { + if (messageConverter instanceof MappingJackson2MessageConverter) { + MappingJackson2MessageConverter jackson2MessageConverter = (MappingJackson2MessageConverter) messageConverter; + ObjectMapper objectMapper = jackson2MessageConverter.getObjectMapper(); + // 增加Java8时间模块支持,实体类可以传递LocalDate/LocalDateTime + objectMapper.registerModules(new JavaTimeModule()); + } + } + return converter; + } +} diff --git a/tptradeprod-app-starter/src/main/java/com/deepinnet/tptradeprod/config/ValidatorConfig.java b/tptradeprod-app-starter/src/main/java/com/deepinnet/tptradeprod/config/ValidatorConfig.java new file mode 100644 index 0000000..0259b32 --- /dev/null +++ b/tptradeprod-app-starter/src/main/java/com/deepinnet/tptradeprod/config/ValidatorConfig.java @@ -0,0 +1,34 @@ +package com.deepinnet.tptradeprod.config; + +import org.hibernate.validator.HibernateValidator; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.validation.beanvalidation.MethodValidationPostProcessor; + +import javax.validation.Validation; +import javax.validation.Validator; + +@Configuration +public class ValidatorConfig { + + @Bean + public MethodValidationPostProcessor methodValidationPostProcessor() { + MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor(); + postProcessor.setBeforeExistingAdvisors(false); + postProcessor.setProxyTargetClass(true); + postProcessor.setValidator(validator()); + return postProcessor; + } + + /** + * 开启快速失败模式,一旦失败立即抛出异常 + */ + @Bean + public Validator validator() { + return Validation.byProvider(HibernateValidator.class) + .configure() + .failFast(true) + .buildValidatorFactory() + .getValidator(); + } +} \ No newline at end of file diff --git a/tptradeprod-app-starter/src/main/resources/application-dev.yml b/tptradeprod-app-starter/src/main/resources/application-dev.yml new file mode 100644 index 0000000..74b5210 --- /dev/null +++ b/tptradeprod-app-starter/src/main/resources/application-dev.yml @@ -0,0 +1,43 @@ +spring: + redis: + host: 192.168.3.200 + port: 6379 + password: ENC(ao+A54rgdnsZ/wIydpBlnxYqM34u5B4O) + +# dubbo +dubbo: + application: + name: ${spring.application.name} + registry: + address: nacos://192.168.3.200:8848 + parameters: + namespace: ${spring.cloud.nacos.discovery.namespace} + protocol: + port: 20880 + provider: + timeout: 3000 + retries: 0 + check: false + consumer: + timeout: 3000 + retries: 0 + check: false + +# 打印日志的配置 +logging: + level: + com: + alibaba: + cloud: + nacos: + client: debug + +message: + consumerGroup: GID_${spring.application.name}-consumer-group-${spring.profiles.active} + delayConsumerGroup: GID_${spring.application.name}-delay-consumer-group-${spring.profiles.active} + + +pos: + guolang: + url: http://posdemo3.hzgolong.com:41001/api/pos/notice + secretKey: 141dd8dd814b20baf326daa1f563b5ec \ No newline at end of file diff --git a/tptradeprod-app-starter/src/main/resources/application-local.yml b/tptradeprod-app-starter/src/main/resources/application-local.yml new file mode 100644 index 0000000..7982f26 --- /dev/null +++ b/tptradeprod-app-starter/src/main/resources/application-local.yml @@ -0,0 +1,86 @@ +spring: + redis: + host: 192.168.3.200 + port: 6379 + password: ENC(ao+A54rgdnsZ/wIydpBlnxYqM34u5B4O) + autoconfigure: + exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration + datasource: + type: com.alibaba.druid.pool.DruidDataSource + druid: + url: jdbc:mysql://rm-bp193v7i846v01k442o.mysql.rds.aliyuncs.com:3306/tp_order-env-dev?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai + # 内网地址 + #url: jdbc:mysql://rm-bp193v7i846v01k44.mysql.rds.aliyuncs.com:3306/ins?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai + username: tp_deepinnet_dev + password: B%dkLnXRt@nWjeUA + connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500 + filters: stat,wall + initialSize: 5 + keepAlive: true + maxActive: 20 + maxPoolPreparedStatementPerConnectionSize: 20 + maxWait: 60000 + minEvictableIdleTimeMillis: 300000 + minIdle: 5 + poolPreparedStatements: true + testOnBorrow: true + testOnReturn: true + testWhileIdle: true + timeBetweenEvictionRunsMillis: 60000 + useGlobalDataSourceStat: true + validationQuery: SELECT 1 + stat-view-servlet: + enabled: true + url-pattern: /druid/* + +# dubbo +dubbo: + application: + name: ${spring.application.name} + registry: + address: nacos://192.168.3.200:8848 + parameters: + namespace: ${spring.cloud.nacos.discovery.namespace} + protocol: + port: 20880 + provider: + timeout: 30000 + retries: 0 + check: false + consumer: + timeout: 30000 + retries: 0 + check: false + +#MQ +rocketmq: + name-server: 192.168.3.200:9876 + # name-server: rmq-cn-zvp2yd8rt03-vpc.cn-hangzhou.rmq.aliyuncs.com:8080 + producer: + group: ${spring.application.name}-provider-group + access-key: ENC(1tdvMPxo2WaCW3exv64HG7LQHgg/T/zdUsubpXmYHjU=) + secret-key: ENC(SIbQF8Bjxfgf6ehjLtwj5azXCl2tEV79XcRL2IbEQHU=) + enable-msg-trace: true + +arthas: + agent-id: ${spring.application.name} + tunnel-server: ws://192.168.3.200:10077/ws + +# 打印日志的配置 +logging: + level: + com: + alibaba: + cloud: + nacos: + client: debug + +message: + consumerGroup: GID_${spring.application.name}-consumer-group-${spring.profiles.active} + delayConsumerGroup: GID_${spring.application.name}-delay-consumer-group-${spring.profiles.active} + + +pos: + guolang: + url: http://posdemo3.hzgolong.com:41001/api/pos/notice + secretKey: 141dd8dd814b20baf326daa1f563b5ec \ No newline at end of file diff --git a/tptradeprod-app-starter/src/main/resources/application-pre.yml b/tptradeprod-app-starter/src/main/resources/application-pre.yml new file mode 100644 index 0000000..5990c57 --- /dev/null +++ b/tptradeprod-app-starter/src/main/resources/application-pre.yml @@ -0,0 +1,88 @@ +spring: + redis: + host: r-bp1ev5drg1lfxkny1p.redis.rds.aliyuncs.com + port: 6379 + username: ENC(SCb67WmqS3xLcOWcrGfpRpEszS+bfTEuwycZPawDOPo=) + password: ENC(Va6APbdZCz2kBtKJQIVb97XY4KM6t6qXRnIO5IGY/+U=) + database: 0 + autoconfigure: + exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration + datasource: + type: com.alibaba.druid.pool.DruidDataSource + druid: + url: jdbc:mysql://rm-bp13l2n5s8gvc0g7a.mysql.rds.aliyuncs.com:3306/tp_order-env-prod?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai + username: ENC(SSQ+shVgs44I1MYoh21T5197DmHjJBBiDcyfXcePf1M=) + password: ENC(rkHZZpYsDbG+npIGG/P4RAGMf9ySzKDmtiwcTDGoliA=) + connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500 + filters: stat,wall + initialSize: 5 + keepAlive: true + maxActive: 20 + maxPoolPreparedStatementPerConnectionSize: 20 + maxWait: 60000 + minEvictableIdleTimeMillis: 300000 + minIdle: 5 + poolPreparedStatements: true + testOnBorrow: true + testOnReturn: true + testWhileIdle: true + timeBetweenEvictionRunsMillis: 60000 + useGlobalDataSourceStat: true + validationQuery: SELECT 1 + stat-view-servlet: + enabled: true + url-pattern: /druid/* + +# dubbo +dubbo: + application: + name: ${spring.application.name} + registry: + address: nacos://192.168.3.200:8848 + parameters: + namespace: ${spring.cloud.nacos.discovery.namespace} + protocol: + port: 20880 + provider: + timeout: 5000 + retries: 0 + check: false + consumer: + timeout: 5000 + retries: 0 + check: false + +# 打印日志的配置 +logging: + level: + com: + alibaba: + cloud: + nacos: + client: debug + +#MQ +rocketmq: + name-server: ep-bp1ie6850ec21aa6c1cd.epsrv-bp1g2k84c7kid2igyiun.cn-hangzhou.privatelink.aliyuncs.com:8080 + producer: + group: GID_${spring.application.name}-provider-group-${spring.profiles.active} + access-key: ENC(kIlPWF9cvjyrFjCGo+XO6y43TzYf99t0W3M/eOdi8wI=) + secret-key: ENC(ZWjaBSFtTZh7asRax8+mC1eGf+uSAuLVvUimRr1QB/4=) + enable-msg-trace: true + consumer: + group: GID_${spring.application.name}-consumer-group-${spring.profiles.active} + access-key: ENC(kIlPWF9cvjyrFjCGo+XO6y43TzYf99t0W3M/eOdi8wI=) + secret-key: ENC(ZWjaBSFtTZh7asRax8+mC1eGf+uSAuLVvUimRr1QB/4=) + +mybatis-plus: + mapper-locations: classpath*:mybatis/mapper/*/*Mapper.xml + +message: + consumerGroup: GID_${spring.application.name}-consumer-group-${spring.profiles.active} + delayConsumerGroup: GID_${spring.application.name}-delay-consumer-group-${spring.profiles.active} + + +pos: + guolang: + url: http://10.0.30.157:41001/api/pos/notice + secretKey: 246dd25f10552ba553912d018f4df26f \ No newline at end of file diff --git a/tptradeprod-app-starter/src/main/resources/application-prod.yml b/tptradeprod-app-starter/src/main/resources/application-prod.yml new file mode 100644 index 0000000..e9486a8 --- /dev/null +++ b/tptradeprod-app-starter/src/main/resources/application-prod.yml @@ -0,0 +1,88 @@ +spring: + redis: + host: r-bp1ev5drg1lfxkny1p.redis.rds.aliyuncs.com + port: 6379 + username: ENC(SCb67WmqS3xLcOWcrGfpRpEszS+bfTEuwycZPawDOPo=) + password: ENC(Va6APbdZCz2kBtKJQIVb97XY4KM6t6qXRnIO5IGY/+U=) + database: 1 + autoconfigure: + exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration + datasource: + type: com.alibaba.druid.pool.DruidDataSource + druid: + url: jdbc:mysql://rm-bp13l2n5s8gvc0g7a.mysql.rds.aliyuncs.com:3306/tp_order-env-prod?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai + username: ENC(SSQ+shVgs44I1MYoh21T5197DmHjJBBiDcyfXcePf1M=) + password: ENC(rkHZZpYsDbG+npIGG/P4RAGMf9ySzKDmtiwcTDGoliA=) + connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500 + filters: stat,wall + initialSize: 5 + keepAlive: true + maxActive: 20 + maxPoolPreparedStatementPerConnectionSize: 20 + maxWait: 60000 + minEvictableIdleTimeMillis: 300000 + minIdle: 5 + poolPreparedStatements: true + testOnBorrow: true + testOnReturn: true + testWhileIdle: true + timeBetweenEvictionRunsMillis: 60000 + useGlobalDataSourceStat: true + validationQuery: SELECT 1 + stat-view-servlet: + enabled: true + url-pattern: /druid/* + +# dubbo +dubbo: + application: + name: ${spring.application.name} + registry: + address: nacos://192.168.3.200:8848 + parameters: + namespace: ${spring.cloud.nacos.discovery.namespace} + protocol: + port: 20880 + provider: + timeout: 5000 + retries: 0 + check: false + consumer: + timeout: 5000 + retries: 0 + check: false + +# 打印日志的配置 +logging: + level: + com: + alibaba: + cloud: + nacos: + client: debug + +#MQ +rocketmq: + name-server: ep-bp1ie6850ec21aa6c1cd.epsrv-bp1g2k84c7kid2igyiun.cn-hangzhou.privatelink.aliyuncs.com:8080 + producer: + group: GID_${spring.application.name}-provider-group-${spring.profiles.active} + access-key: ENC(kIlPWF9cvjyrFjCGo+XO6y43TzYf99t0W3M/eOdi8wI=) + secret-key: ENC(ZWjaBSFtTZh7asRax8+mC1eGf+uSAuLVvUimRr1QB/4=) + enable-msg-trace: true + consumer: + group: GID_${spring.application.name}-consumer-group-${spring.profiles.active} + access-key: ENC(kIlPWF9cvjyrFjCGo+XO6y43TzYf99t0W3M/eOdi8wI=) + secret-key: ENC(ZWjaBSFtTZh7asRax8+mC1eGf+uSAuLVvUimRr1QB/4=) + +mybatis-plus: + mapper-locations: classpath*:mybatis/mapper/*/*Mapper.xml + +message: + consumerGroup: GID_${spring.application.name}-consumer-group-${spring.profiles.active} + delayConsumerGroup: GID_${spring.application.name}-delay-consumer-group-${spring.profiles.active} + + +pos: + guolang: + url: http://10.0.30.157:41001/api/pos/notice + secretKey: 246dd25f10552ba553912d018f4df26f \ No newline at end of file diff --git a/tptradeprod-app-starter/src/main/resources/application-test.yml b/tptradeprod-app-starter/src/main/resources/application-test.yml new file mode 100644 index 0000000..c575963 --- /dev/null +++ b/tptradeprod-app-starter/src/main/resources/application-test.yml @@ -0,0 +1,93 @@ +spring: + redis: + host: r-bp1jtsv1a3ougumlzw.redis.rds.aliyuncs.com + port: 6379 + username: ENC(9d6KFkbMHm78VQO26J2gNbV9UGuiDZJL) + password: ENC(08E69p0zaGkABm5yj/nV4B3UWGoQeBhWvc7F5JbTp3g=) + database: 1 + autoconfigure: + exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration + datasource: + type: com.alibaba.druid.pool.DruidDataSource + druid: + # 公网地址 记得替换地址和密码!!! + url: jdbc:mysql://rm-bp193v7i846v01k442o.mysql.rds.aliyuncs.com:3306/tp_order-env-test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai + # 内网地址 + #url: jdbc:mysql://rm-bp193v7i846v01k44.mysql.rds.aliyuncs.com:3306/ins?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai + username: tp_deepinnet_test + password: 20230424MnfFfdWZsyH2KvuF + connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500 + filters: stat,wall + initialSize: 5 + keepAlive: true + maxActive: 20 + maxPoolPreparedStatementPerConnectionSize: 20 + maxWait: 60000 + minEvictableIdleTimeMillis: 300000 + minIdle: 5 + poolPreparedStatements: true + testOnBorrow: true + testOnReturn: true + testWhileIdle: true + timeBetweenEvictionRunsMillis: 60000 + useGlobalDataSourceStat: true + validationQuery: SELECT 1 + stat-view-servlet: + enabled: true + url-pattern: /druid/* + +# dubbo +dubbo: + application: + name: ${spring.application.name} + registry: + address: nacos://192.168.3.200:8848 + parameters: + namespace: ${spring.cloud.nacos.discovery.namespace} + protocol: + port: 20880 + provider: + timeout: 10000 + retries: 0 + check: false + consumer: + timeout: 10000 + retries: 0 + check: false + +# 打印日志的配置 +logging: + level: + com: + alibaba: + cloud: + nacos: + client: debug + +#MQ +rocketmq: + name-server: rmq-cn-lbj3h31640b-vpc.cn-hangzhou.rmq.aliyuncs.com:8080 + producer: + group: ${spring.application.name}-provider-group + access-key: ENC(1g0pNKHGlvtuY4YKgOlGr/MH2BbcDNu0+qPTvjR/EIo=) + secret-key: ENC(MeO1kHiQbBCu4qPRFcCWlgGzbKNl6rOg7YyXxCDNH0M=) + enable-msg-trace: true + consumer: + group: ${spring.application.name}-consumer-group + +mybatis-plus: + mapper-locations: classpath*:mybatis/mapper/*/*Mapper.xml + configuration: + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + sql: + print: true + +message: + consumerGroup: GID_${spring.application.name}-consumer-group-${spring.profiles.active} + delayConsumerGroup: GID_${spring.application.name}-delay-consumer-group-${spring.profiles.active} + + +pos: + guolang: + url: http://posdemo3.hzgolong.com:41001/api/pos/notice + secretKey: 141dd8dd814b20baf326daa1f563b5ec \ No newline at end of file diff --git a/tptradeprod-app-starter/src/main/resources/application.yml b/tptradeprod-app-starter/src/main/resources/application.yml new file mode 100644 index 0000000..00a9061 --- /dev/null +++ b/tptradeprod-app-starter/src/main/resources/application.yml @@ -0,0 +1,61 @@ +# oss配置 +oss: + accessSecret: ENC(ys+mbFnF71afPL22YUWw0P0B/RSRMh8vgOswK7KhFIq5tq3/SAZQQg==) + accessKey: ENC(NaC4iCnLX+bUXi5ifbwjJQXenTTsKE5xpt7QXQs0nMPxzCfgxzQfVQ==) + # 文件过期时间 3600 * 1000 默认1个小时 (毫秒) + expireMilliSecond: 3600000 + +spring: + # 防止 Knife4j 2.0及以上版本访问报错 + mvc: + pathmatch: + matching-strategy: ant_path_matcher + +jasypt: + encryptor: + # 自定义加密盐值(密钥) + password: shendu188 + # 加密算法设置 + algorithm: PBEWithMD5AndDES + iv-generator-classname: org.jasypt.iv.NoIvGenerator + +message: + trans-pay-topic: TP_TRADECORE_EVENT_TOPIC-${spring.profiles.active} + delay-topic: TP_TRADECORE_DELAY_EVENT_TOPIC-${spring.profiles.active} + +liteflow: + #规则文件路径 + rule-source: config/flow.el.xml + #-----------------以下非必须----------------- + #liteflow是否开启,默认为true + enable: true + #liteflow的banner打印是否开启,默认为true + print-banner: false + #异步线程最长的等待时间(只用于when),默认值为15000 + when-max-wait-time: 15000 + #异步线程最长的等待时间(只用于when),默认值为MILLISECONDS,毫秒 + when-max-wait-time-unit: MILLISECONDS + #when节点全局异步线程池最大线程数,默认为16 + when-max-workers: 128 + #when节点全局异步线程池等待队列数,默认为512 + when-queue-limit: 512 + #是否在启动的时候就解析规则,默认为true + parse-on-start: true + #全局重试次数,默认为0 + retry-count: 0 + #是否支持不同类型的加载方式混用,默认为false + support-multiple-type: false + #是否打印执行中过程中的日志,默认为true + print-execution-log: false + #是否开启本地文件监听,默认为false + enable-monitor-file: false + #简易监控配置选项 + monitor: + #监控是否开启,默认不开启 + enable-log: false + #监控队列存储大小,默认值为200 + queue-limit: 200 + #监控一开始延迟多少执行,默认值为300000毫秒,也就是5分钟 + delay: 300000 + #监控日志打印每过多少时间执行一次,默认值为300000毫秒,也就是5分钟 + period: 300000 \ No newline at end of file diff --git a/tptradeprod-app-starter/src/main/resources/bootstrap.yml b/tptradeprod-app-starter/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..ed66f9c --- /dev/null +++ b/tptradeprod-app-starter/src/main/resources/bootstrap.yml @@ -0,0 +1,23 @@ +server: + port: 8080 + +spring: + application: + name: tptradeprod + # nacos + cloud: + nacos: + # 注册中心的配置 + discovery: + server-addr: http://192.168.3.200:8848 + namespace: tp_dev + group: DEFAULT_GROUP + register-enabled: false + config: + import-check: + enabled: false + server-addr: http://192.168.3.200:8848 + refresh-enabled: true + namespace: ${spring.cloud.nacos.discovery.namespace} + name: ${spring.application.name} + file-extension: properties diff --git a/tptradeprod-app-starter/src/main/resources/logback-spring.xml b/tptradeprod-app-starter/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..5675601 --- /dev/null +++ b/tptradeprod-app-starter/src/main/resources/logback-spring.xml @@ -0,0 +1,143 @@ + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + + + + + + ${LOG_FILE_PATH}/common-default.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread][%X{traceId}][Tenant-Id:%X{Tenant-Id}][BizType:%X{bizType}] %-5level %logger{36}:%L - %msg%n + + + + + ${LOG_FILE_PATH}/common-default.log.%d{yyyy-MM-dd} + + + + + + ${LOG_FILE_PATH}/common-dal.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread][%X{traceId}][Tenant-Id:%X{Tenant-Id}][BizType:%X{bizType}] %-5level %logger{36}:%L - %msg%n + + + + + ${LOG_FILE_PATH}/common-dal.log.%d{yyyy-MM-dd} + + + + + + + ${LOG_FILE_PATH}/biz-digest.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread][%X{traceId}][Tenant-Id:%X{Tenant-Id}][BizType:%X{bizType}] %-5level %logger{36}:%L - %msg%n + + + + + ${LOG_FILE_PATH}/biz-digest.log.%d{yyyy-MM-dd} + + + + + + ${LOG_FILE_PATH}/message.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread][%X{traceId}][Tenant-Id:%X{Tenant-Id}][BizType:%X{bizType}] %-5level %logger{36}:%L - %msg%n + + + + + ${LOG_FILE_PATH}/message.log.%d{yyyy-MM-dd} + + + + + + ${LOG_FILE_PATH}/task.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread][%X{traceId}][Tenant-Id:%X{Tenant-Id}][BizType:%X{bizType}] %-5level %logger{36}:%L - %msg%n + + + + + ${LOG_FILE_PATH}/task.log.%d{yyyy-MM-dd} + + + + + + ${LOG_FILE_PATH}/integration.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread][%X{traceId}][Tenant-Id:%X{Tenant-Id}][BizType:%X{bizType}] %-5level %logger{36}:%L - %msg%n + + + + + ${LOG_FILE_PATH}/integration.log.%d{yyyy-MM-dd} + + + + + + ${LOG_FILE_PATH}/common-error.log + + + ERROR + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread][%X{traceId}][Tenant-Id:%X{Tenant-Id}][BizType:%X{bizType}] %-5level %logger{36}:%L - %msg%n + + + + ${LOG_FILE_PATH}/common-error.log.%d{yyyy-MM-dd} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tptradeprod-app-starter/src/test/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpPlaceOrderProductCheckNodeTest.java b/tptradeprod-app-starter/src/test/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpPlaceOrderProductCheckNodeTest.java new file mode 100644 index 0000000..ca889f9 --- /dev/null +++ b/tptradeprod-app-starter/src/test/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpPlaceOrderProductCheckNodeTest.java @@ -0,0 +1,102 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.check; + +import com.deepinnet.tpproductcore.common.dto.rule.TpRuleExecuteDTO; +import com.deepinnet.tptradeprod.common.service.integration.client.TpBizRuleClient; +import com.deepinnet.tpproductcore.common.vo.TpSalesUnitVO; +import com.deepinnet.tptradeprod.common.service.integration.client.TpProductSalesUnitClient; +import com.deepinnet.tpproductcore.common.dto.rule.TpRuleExecuteBatchResultVO; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.util.TestUtils; +import org.junit.jupiter.params.provider.ValueSource; +import com.deepinnet.tpproductcore.common.qto.TpSalesUnitQueryDTO; +import com.deepinnet.tpproductcore.common.qto.product.TpProductQueryDTO; +import lombok.SneakyThrows; +import com.deepinnet.tpproductcore.common.dto.rule.TpRuleExecuteResultVO; +import com.deepinnet.tpproductcore.common.dto.product.TpProdDetailDTO; +import com.yomahub.liteflow.core.NodeComponent; +import java.math.BigDecimal; +import com.deepinnet.tptradecore.common.dto.order.TpOrderCountQueryDTO; +import com.deepinnet.tpproductcore.common.dto.rule.TpRuleExecuteDTO; +import com.deepinnet.tptradeprod.common.dto.TpOrderStationDTO; +import com.deepinnet.tptradeprod.common.service.integration.client.TpProductClient; +import com.deepinnet.tptradecore.common.dto.order.TpUserTicketsQueryDTO; +import lombok.extern.slf4j.Slf4j; +import lombok.extern.java.Log; +import com.util.TestResult; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.TypeReference; +import com.alibaba.fastjson.JSONObject; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Assertions; +import cn.hutool.core.bean.BeanUtil; +import org.mockito.junit.jupiter.MockitoSettings; +import org.mockito.quality.Strictness; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.*; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +@MockitoSettings(strictness = Strictness.LENIENT) +@Log +public class TpPlaceOrderProductCheckNodeTest { + @InjectMocks + private TpPlaceOrderProductCheckNode tpPlaceOrderProductCheckNode=new TpPlaceOrderProductCheckNode(null,null, null, null); + @Mock + private TpProductClient tpProductClient; + + @Mock + private TpProductSalesUnitClient tpProductSalesUnitClient; + + @Mock + private TpOrderClient tpOrderClient; + + @Mock + private TpBizRuleClient bizRuleClient; + + @BeforeEach + public void setUp() throws Exception { + MockitoAnnotations.openMocks(this); + } + + @ParameterizedTest + @ValueSource(strings = {"/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpPlaceOrderProductCheckNode/process.json"}) + public void processTest(String str) { + JSONObject arg= TestUtils.getTestArg(str); + Integer integerArg = arg.getInteger("Integer"); + TpRuleExecuteResultVO tpRuleExecuteResultVO = JSONObject.parseObject(arg.getString("TpRuleExecuteResultVO"),TpRuleExecuteResultVO.class); + TpRuleExecuteBatchResultVO tpRuleExecuteBatchResultVO = JSONObject.parseObject(arg.getString("TpRuleExecuteBatchResultVO"),TpRuleExecuteBatchResultVO.class); + Long longArg = arg.getLong("Long"); + NodeComponent bindCmp = JSONObject.parseObject(arg.getString("NodeComponent"),NodeComponent.class); + List tpSalesUnitVOList = JSONObject.parseArray(arg.getString("List"),TpSalesUnitVO.class); + TpProdDetailDTO tpProdDetailDTO = JSONObject.parseObject(arg.getString("TpProdDetailDTO"),TpProdDetailDTO.class); + when(tpProductClient.getProduct(any(TpProductQueryDTO.class))).thenReturn(tpProdDetailDTO); + when(tpProductSalesUnitClient.listTpSalesUnit(any(TpSalesUnitQueryDTO.class))).thenReturn(tpSalesUnitVOList); + when(tpOrderClient.getUserBuyTickets(any(TpUserTicketsQueryDTO.class))).thenReturn(integerArg); + when(tpOrderClient.orderCount(any(TpOrderCountQueryDTO.class))).thenReturn(longArg); + when(bizRuleClient.executeRule(any(TpRuleExecuteDTO.class))).thenReturn(tpRuleExecuteResultVO); + when(bizRuleClient.batchExecuteBizRule(any(List.class))).thenReturn(tpRuleExecuteBatchResultVO); + tpPlaceOrderProductCheckNode.process(bindCmp); + } + + @ParameterizedTest + @ValueSource(strings = {"/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpPlaceOrderProductCheckNode/checkRestrictTime.json"}) + public void checkRestrictTimeTest(String str) { + JSONObject arg= TestUtils.getTestArg(str); + List charterBusStations = JSONObject.parseArray(arg.getString("List"),TpOrderStationDTO.class); + String pricingType = arg.getString("String"); + Boolean restrictTime = arg.getBoolean("Boolean"); + tpPlaceOrderProductCheckNode.checkRestrictTime(restrictTime,pricingType,charterBusStations); + } + +} \ No newline at end of file diff --git a/tptradeprod-app-starter/src/test/java/com/deepinnet/tptradeprod/core/component/TpOrderChangeApplyTest.java b/tptradeprod-app-starter/src/test/java/com/deepinnet/tptradeprod/core/component/TpOrderChangeApplyTest.java new file mode 100644 index 0000000..450b1fe --- /dev/null +++ b/tptradeprod-app-starter/src/test/java/com/deepinnet/tptradeprod/core/component/TpOrderChangeApplyTest.java @@ -0,0 +1,76 @@ +package com.deepinnet.tptradeprod.core.component; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tptradecore.common.enums.order.TpOrderChangeApplyStatusEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderChangeTypeEnum; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.service.facade.TpOrderChangeAcceptanceFacade; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderChangeApplyListVO; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.TestPropertySource; + +import javax.annotation.Resource; +import java.util.Arrays; +import java.util.List; + +/** + *

+ * 同步行程测试 + *

+ * + * @author chenjiaju + * @since 2023/12/6 + */ + +@SpringBootTest +@TestPropertySource(properties = {"spring.profiles.active=local"}) +public class TpOrderChangeApplyTest { + + @Resource + private TpOrderChangeAcceptanceFacade tpOrderChangeAcceptanceFacade; + + + @Test + public void testCreateOrderChangeApply() { + + TpProdOrderChangeApplyCreatedDTO createdDTO = TpProdOrderChangeApplyCreatedDTO.builder() + .orderNo("11111111") + .originalOrderNo("123456787") + .applyTime(DateUtil.current()) + .applyType(TpOrderChangeTypeEnum.ORDER_CREATE.getType()) + .applyStatus(TpOrderChangeApplyStatusEnum.WAITING_APPROVED.getType()) + .tenantId("1000293").build(); + TpResult createApplyFlag = tpOrderChangeAcceptanceFacade.createOrderChangeApply(createdDTO); + System.err.println(JSONUtil.toJsonStr(createApplyFlag)); + Assert.notNull(createApplyFlag, "创建申请单失败"); + } + + @Test + public void testGetLatestOrderChangeApplyDetail() { + + TpProdOrderChangeApplyListDTO createdDTO = TpProdOrderChangeApplyListDTO.builder() + .orderNo("20240220006000037023") + + .tenantId("1000293").build(); + TpResult latestOrderChangeApplyDetail = tpOrderChangeAcceptanceFacade.getLatestOrderChangeApplyDetail(createdDTO); + System.err.println(JSONUtil.toJsonStr(latestOrderChangeApplyDetail)); + } + + @Test + public void testListOrderChangeApplyHistory() { + + TpProdOrderChangeApplyListDTO createdDTO = TpProdOrderChangeApplyListDTO.builder() + .originalOrderNo("20240227006000038170") + + .tenantId("1000293").build(); + TpResult> latestOrderChangeApplyDetail = tpOrderChangeAcceptanceFacade.listOrderChangeApplyHistory(createdDTO); + System.err.println(JSONUtil.toJsonStr(latestOrderChangeApplyDetail)); + } + + + +} diff --git a/tptradeprod-app-starter/src/test/java/com/deepinnet/tptradeprod/core/component/TpOrderConfirmTest.java b/tptradeprod-app-starter/src/test/java/com/deepinnet/tptradeprod/core/component/TpOrderConfirmTest.java new file mode 100644 index 0000000..94deb80 --- /dev/null +++ b/tptradeprod-app-starter/src/test/java/com/deepinnet/tptradeprod/core/component/TpOrderConfirmTest.java @@ -0,0 +1,131 @@ +package com.deepinnet.tptradeprod.core.component; + +import cn.hutool.core.lang.Assert; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.page.CommonPage; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tptradecore.common.enums.audit.TpAuditBizObjectTypeEnum; +import com.deepinnet.tptradecore.common.enums.audit.TpAuditStatusEnum; +import com.deepinnet.tptradecore.common.enums.audit.TpAuditTypeEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderReductionServiceChargeTypeEnum; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.enums.TpOrderAuditConfirmTypeEnum; +import com.deepinnet.tptradeprod.common.service.facade.TpOrderAuditAcceptanceFacade; +import com.deepinnet.tptradeprod.common.service.integration.client.TpAuditClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderAuditConfirmOrderVO; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderRscConfirmVO; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditLatestDetailDTO; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditListVO; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditVO; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.TestPropertySource; + +import javax.annotation.Resource; + +import java.util.Arrays; + +import static com.deepinnet.tptradecore.common.enums.order.TpOrderChangeApplyStatusEnum.APPROVED_SUCCESS; +import static com.deepinnet.tptradecore.common.enums.order.TpOrderChangeApplyStatusEnum.APPROVED_TIMEOUT; + +/** + *

+ * 同步行程测试 + *

+ * + * @author chenjiaju + * @since 2023/12/6 + */ + +@SpringBootTest +@TestPropertySource(properties = {"spring.profiles.active=local"}) +public class TpOrderConfirmTest { + + @Resource + private TpOrderAuditAcceptanceFacade tpOrderAuditAcceptanceFacade; + + @Resource + private TpAuditClient tpAuditClient; + + + @Test + public void testGetOrderAuditLatestDetail() { + + TpProdAuditLatestDetailDTO queryDetailDTO = TpProdAuditLatestDetailDTO.builder().build(); + queryDetailDTO.setTenantId("1000293"); + queryDetailDTO.setBizObjectNo("20231226012000014323"); + queryDetailDTO.setBizObjType(TpAuditBizObjectTypeEnum.ORDER_CHANGE_APPLY.getType()); + queryDetailDTO.setAuditStatuses(Arrays.asList(TpAuditStatusEnum.WAITING_APPROVED.getType())); + TpProdAuditVO auditVO = tpAuditClient.getLatestAuditDetail(queryDetailDTO); + System.err.println(JSONUtil.toJsonStr(auditVO)); + Assert.notNull(auditVO, "查询最近一条有效的审核单失败"); + } + @Test + public void testGetOrderAuditConfirmOrderDetail() { + TpProdOrderConfirmViewDTO dto = TpProdOrderConfirmViewDTO.builder() + .tenantId("1000293") + .orderAuditConfirmType(TpOrderAuditConfirmTypeEnum.ORDER_CHANGE.getCode()) + .orderNo("20231226012000014323") + .build(); + TpResult tpResult = tpOrderAuditAcceptanceFacade.getOrderAuditConfirmOrderDetail(dto); + System.err.println(JSONUtil.toJsonStr(tpResult)); + } + + @Test + public void testConfirmOrder() { + TpProdOrderAuditConfirmDTO dto =new TpProdOrderAuditConfirmDTO() ; + dto.setOrderNo("20240220006000037023"); + dto.setOriginalOrderNo("20240220006000037023"); + dto.setTenantId("1000293"); + dto.setOrderAuditConfirmType(TpOrderAuditConfirmTypeEnum.ORDER_CHANGE.getCode()); + dto.setAuditStatus(APPROVED_SUCCESS.getType()); + dto.setReductionServiceChargeType(TpOrderReductionServiceChargeTypeEnum.SINGLE_REDUCTION.getBizType()); + dto.setAuditResult("选择免手续费审核测试通过-华侨"); + dto.setOperatorNo("sysadmin"); + dto.setOperatorName("sysadmin"); + TpResult tpResult = tpOrderAuditAcceptanceFacade.confirmOrder(dto); + System.err.println(JSONUtil.toJsonStr(tpResult)); + } + + @Test + public void testReduceServiceChargeConfirm() { + TpProdOrderServiceChargeReduceConfirmDTO dto =new TpProdOrderServiceChargeReduceConfirmDTO() ; + dto.setOrderNo("20240221006000038000"); + dto.setOriginalOrderNo("20240220006000037023"); + dto.setTenantId("1000293"); + dto.setAuditNo("20240221014000037005"); + dto.setAuditStatus(APPROVED_SUCCESS.getType()); + dto.setAuditResult("审核测试huaqiao"); + dto.setOperatorNo("1004603"); + dto.setOperatorName("shenduTest"); + TpResult tpResult = tpOrderAuditAcceptanceFacade.reduceServiceChargeConfirm(dto); + System.err.println(JSONUtil.toJsonStr(tpResult)); + } + + @Test + public void testPageAuditList() { + TpProdAuditOrderListPagedQueryDTO dto = TpProdAuditOrderListPagedQueryDTO.builder() + .tenantId("1000293") + .originalOrderNo("20240221006000038023") + .orderNo("20240220006000037023") + .auditTypes(Arrays.asList(TpAuditTypeEnum.CHARTER_BUS_ORDER_CANCEL_RSC_APPROVAL.getBizType(),TpAuditTypeEnum.CHARTER_BUS_ORDER_CHANGE_RSC_APPROVAL.getBizType())) +// .orgCodes(Arrays.asList("1111")) + .build(); + dto.setPageSize(30); + TpResult> tpResult = tpOrderAuditAcceptanceFacade.pageAuditList(dto); + System.err.println(JSONUtil.toJsonStr(tpResult)); + } + + @Test + public void testGetOrderRefundInfoForRscConfirm() { + TpProdOrderRscConfirmQueryDTO dto = TpProdOrderRscConfirmQueryDTO.builder() + .tenantId("1000293") + .originalOrderNo("20240221006000038023") + .build(); + TpResult tpResult = tpOrderAuditAcceptanceFacade.getOrderRefundInfoForRscConfirm(dto); + System.err.println(JSONUtil.toJsonStr(tpResult)); + } + + + +} diff --git a/tptradeprod-app-starter/src/test/java/com/deepinnet/tptradeprod/core/component/TpOrderDispatchOrderTest.java b/tptradeprod-app-starter/src/test/java/com/deepinnet/tptradeprod/core/component/TpOrderDispatchOrderTest.java new file mode 100644 index 0000000..950cefd --- /dev/null +++ b/tptradeprod-app-starter/src/test/java/com/deepinnet/tptradeprod/core/component/TpOrderDispatchOrderTest.java @@ -0,0 +1,39 @@ +package com.deepinnet.tptradeprod.core.component; + +import com.deepinnet.tptradeprod.common.dto.TpProdOrderManualDispatchDTO; +import com.deepinnet.tptradeprod.common.service.facade.TpOrderDispatchAcceptanceFacade; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.TestPropertySource; + +import javax.annotation.Resource; + +/** + *

+ * 同步行程测试 + *

+ * + * @author chenjiaju + * @since 2023/12/6 + */ + +@SpringBootTest +@TestPropertySource(properties = {"spring.profiles.active=local"}) +public class TpOrderDispatchOrderTest { + + @Resource + private TpOrderDispatchAcceptanceFacade tpOrderDispatchAcceptanceFacade; + + + @Test + public void testManualDispatchOrder() { + TpProdOrderManualDispatchDTO dto = TpProdOrderManualDispatchDTO.builder() + .tenantId("1000293") + .orderNo("20231213006000011514") + .targetOrgNo("1000301") + .build(); + tpOrderDispatchAcceptanceFacade.dispatchOrder(dto); + } + + +} diff --git a/tptradeprod-app-starter/src/test/java/com/deepinnet/tptradeprod/core/component/TpOrderSyncTripComponentTest.java b/tptradeprod-app-starter/src/test/java/com/deepinnet/tptradeprod/core/component/TpOrderSyncTripComponentTest.java new file mode 100644 index 0000000..b0e19c7 --- /dev/null +++ b/tptradeprod-app-starter/src/test/java/com/deepinnet/tptradeprod/core/component/TpOrderSyncTripComponentTest.java @@ -0,0 +1,65 @@ +package com.deepinnet.tptradeprod.core.component; + +import cn.hutool.core.collection.ListUtil; +import com.deepinnet.tptradecore.common.enums.order.TpOrderModulesEnum; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderQueryDTO; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.deepinnet.tptradeprod.core.compoment.TpOrderSyncTripComponent; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.TestPropertySource; + +import javax.annotation.Resource; + +/** + *

+ * 同步行程测试 + *

+ * + * @author chenjiaju + * @since 2023/12/6 + */ + +@SpringBootTest +@TestPropertySource(properties = {"spring.profiles.active=local"}) +public class TpOrderSyncTripComponentTest { + + @Resource + private TpOrderSyncTripComponent tpOrderSyncTripComponent; + + @Resource + private TpOrderClient tpOrderClient; + + @Test + public void testExecuteSync() { + TpProdOrderDetailVO orderDetail = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .originalOrderNo("20231208006000011223") + .tenantId("test") + .needModules(ListUtil.toList(TpOrderModulesEnum.ORDER_TRAVEL_TRIP.getModule(), TpOrderModulesEnum.ORDER_SUBJECT_ITEM.getModule())).build()); + tpOrderSyncTripComponent.createSync(orderDetail, "test"); + } + + @Test + public void updateExecuteSync() { + TpProdOrderDetailVO nowOrder = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .orderNo("20231208006000011224") + .tenantId("test") + .needModules(ListUtil.toList(TpOrderModulesEnum.ORDER_TRAVEL_TRIP.getModule(), TpOrderModulesEnum.ORDER_SUBJECT_ITEM.getModule())).build()); + TpProdOrderDetailVO oldOrder = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .orderNo("20231208006000011223") + .tenantId("test") + .needModules(ListUtil.toList(TpOrderModulesEnum.ORDER_TRAVEL_TRIP.getModule(), TpOrderModulesEnum.ORDER_SUBJECT_ITEM.getModule())).build()); + tpOrderSyncTripComponent.updateSync(nowOrder, oldOrder, "test"); + } + + @Test + public void cancelExecuteSync() { + TpProdOrderDetailVO orderDetail = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .originalOrderNo("20231204006000011048") + .tenantId("test") + .needModules(ListUtil.toList(TpOrderModulesEnum.ORDER_TRAVEL_TRIP.getModule(), TpOrderModulesEnum.ORDER_SUBJECT_ITEM.getModule())).build()); + tpOrderSyncTripComponent.cancelSync(orderDetail, "test"); + } + +} diff --git a/tptradeprod-app-starter/src/test/java/com/deepinnet/tptradeprod/core/component/TpVoucherVerficationRecodeTest.java b/tptradeprod-app-starter/src/test/java/com/deepinnet/tptradeprod/core/component/TpVoucherVerficationRecodeTest.java new file mode 100644 index 0000000..63dc500 --- /dev/null +++ b/tptradeprod-app-starter/src/test/java/com/deepinnet/tptradeprod/core/component/TpVoucherVerficationRecodeTest.java @@ -0,0 +1,41 @@ +package com.deepinnet.tptradeprod.core.component; + +import cn.hutool.core.lang.Assert; +import com.deepinnet.tp.common.lang.page.CommonPage; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.service.facade.TpVoucherAcceptanceFacade; +import com.deepinnet.tptradeprod.common.vo.TpProdMngVerificationRecordVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.TestPropertySource; + +import java.util.List; +/** + *

+ * 同步行程测试 + *

+ * + * @author chenjiaju + * @since 2023/12/6 + */ + +@SpringBootTest +@TestPropertySource(properties = {"spring.profiles.active=local"}) +public class TpVoucherVerficationRecodeTest { + + @DubboReference + private TpVoucherAcceptanceFacade tpVoucherAcceptanceFacade; + + @Test + public void queryMngVerificationRecords(){ + TpProdMngVerificationRecordQueryDTO queryDTO = new TpProdMngVerificationRecordQueryDTO(); + queryDTO.setTenantId("1000293"); + queryDTO.setProductCategoryNo("04-33010003"); + TpResult> result = tpVoucherAcceptanceFacade.queryMngVerificationRecords(queryDTO); + System.out.println(result.getData().toString()); + Assert.isTrue(result.isSuccess()); + } + +} diff --git a/tptradeprod-app-starter/src/test/java/com/deepinnet/tptradeprod/facade/TpOrderChangeAcceptanceFacadeTest.java b/tptradeprod-app-starter/src/test/java/com/deepinnet/tptradeprod/facade/TpOrderChangeAcceptanceFacadeTest.java new file mode 100644 index 0000000..0af0e02 --- /dev/null +++ b/tptradeprod-app-starter/src/test/java/com/deepinnet/tptradeprod/facade/TpOrderChangeAcceptanceFacadeTest.java @@ -0,0 +1,35 @@ +package com.deepinnet.tptradeprod.facade; + +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.JsonUtil; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderChangeApplyListDTO; +import com.deepinnet.tptradeprod.common.service.facade.TpOrderChangeAcceptanceFacade; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderChangeApplyListVO; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.TestPropertySource; + +import javax.annotation.Resource; + +/** + * Description: + * Date: 2024/6/14 + * Author: lijunheng + */ +@SpringBootTest +@TestPropertySource(properties = {"spring.profiles.active=local"}) +public class TpOrderChangeAcceptanceFacadeTest { + + @Resource + private TpOrderChangeAcceptanceFacade orderChangeAcceptanceFacade; + + @Test + public void testGetOrderEndTripChangeChargeRecord() { + TpProdOrderChangeApplyListDTO dto = new TpProdOrderChangeApplyListDTO(); + dto.setOrderNo("20240607006000049093"); + dto.setOriginalOrderNo("20240607006000049091"); + dto.setTenantId("1000293"); + TpResult orderEndTripChangeChargeRecord = orderChangeAcceptanceFacade.getOrderEndTripChangeChargeRecord(dto); + System.out.println(JsonUtil.toJsonStr(orderEndTripChangeChargeRecord)); + } +} diff --git a/tptradeprod-app-starter/src/test/java/com/util/TestResult.java b/tptradeprod-app-starter/src/test/java/com/util/TestResult.java new file mode 100644 index 0000000..24417d2 --- /dev/null +++ b/tptradeprod-app-starter/src/test/java/com/util/TestResult.java @@ -0,0 +1,39 @@ +package com.util; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 单测结果 + */ +public class TestResult { + /** + * 单测执行是否成功 + */ + private boolean success = true; + + /** + * 校验失败的字段和值,列表第一个元素为单测结果,第二个元素为期望结果(定义在json文件的ExpectedResult字段中) + */ + private Map> uncommonFields = new HashMap<>(); + + public Map> getUncommonFields() { + return uncommonFields; + } + + public boolean isSuccess() { + return success; + } + + public TestResult() { + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public void setUncommonFields(Map> uncommonFields) { + this.uncommonFields = uncommonFields; + } +} \ No newline at end of file diff --git a/tptradeprod-app-starter/src/test/java/com/util/TestStrUtils.java b/tptradeprod-app-starter/src/test/java/com/util/TestStrUtils.java new file mode 100644 index 0000000..7cc3630 --- /dev/null +++ b/tptradeprod-app-starter/src/test/java/com/util/TestStrUtils.java @@ -0,0 +1,17 @@ +package com.util; + +import cn.hutool.core.util.StrUtil; + +import java.util.ArrayList; +import java.util.List; + +public class TestStrUtils { + public static void main(String[] args) { + String msgTemplate = "该订单属于专属承运公司订单,仅能派给以下公司:{}"; + List specialTargetOrgNoList = new ArrayList<>(); + specialTargetOrgNoList.add("123"); + specialTargetOrgNoList.add("986"); + System.err.println(StrUtil.format(msgTemplate,StrUtil.join(",",specialTargetOrgNoList))); + } + +} diff --git a/tptradeprod-app-starter/src/test/java/com/util/TestUtils.java b/tptradeprod-app-starter/src/test/java/com/util/TestUtils.java new file mode 100644 index 0000000..3257053 --- /dev/null +++ b/tptradeprod-app-starter/src/test/java/com/util/TestUtils.java @@ -0,0 +1,113 @@ +package com.util; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.*; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.JSONReader; +import lombok.SneakyThrows; +import java.math.BigDecimal; + + +public class TestUtils { + /** + * 读取json文件 + * @param path + * @return + */ + public static JSONObject getTestArg(String path) { + String s = new JSONReader( + new BufferedReader(new InputStreamReader(TestUtils.class.getResourceAsStream(path)))) + .readString(); + return JSONObject.parseObject(s); + } + + /** + * 判断source与target的所有公共字段的值是否相同 + * + * @param source 待检测对象1 + * @param target 待检测对象2 + * @param ignoreProperties 不需要检测的字段 + * @return 判断结果,如果为true则证明所有字段的值都相同 + */ + public static TestResult isCommonFieldsEqual(Object source, Object target, String...ignoreProperties) { + TestResult result = new TestResult(); + if (null == source && null == target) { + result.setSuccess(true); + return result; + } + if (null == source || null == target) { + result.setSuccess(false); + return result; + } + if (source instanceof List && target instanceof List) { + // 快速失败 + if (((List) source).size() != ((List) target).size()) { + result.setSuccess(false); + return result; + } + // 遍历比对 + for(int i = 0;i<((List) source).size();i++) { + Object o1 = ((List) source).get(i); + Object o2 = ((List) target).get(i); + build(o1, o2, result, ignoreProperties); + + } + } else { + build(source, target, result, ignoreProperties); + } + + return result; + } + + + private static void build(Object source, Object target, TestResult result, String[] ignoreProperties) { + Map sourceFieldsMap = BeanUtil.beanToMap(source); + Map targetFieldsMap = BeanUtil.beanToMap(target); + + Set sourceFields = sourceFieldsMap.keySet(); + sourceFields.removeAll(Arrays.asList(ignoreProperties)); + + for (String field : sourceFields) { + if(ObjectUtil.notEqual(sourceFieldsMap.get(field), targetFieldsMap.get(field))){ + result.setSuccess(false); + List fields = new ArrayList<>(2); + fields.add(sourceFieldsMap.get(field)); + fields.add(targetFieldsMap.get(field)); + result.getUncommonFields().put(field, fields); + } + } + } + +public static JSONObject flatten(JSONObject json) { + JSONObject result = new JSONObject(); + flatten("", json, result); + return result; + } + + @SneakyThrows + private static void flatten(String prefix, JSONObject json, JSONObject result) { + Iterator keys = json.keySet().iterator(); + while (keys.hasNext()) { + String key = keys.next(); + Object value = json.get(key); + if (value instanceof JSONObject) { + flatten(prefix + key + ".", (JSONObject) value, result); + } else if (value instanceof Integer) { + result.put(prefix + key, ((Integer) value).longValue()); // 将整数转换为Long类型 + } else if (value instanceof Short) { + result.put(prefix + key, ((Short) value).longValue()); // 将整数转换为Long类型 + } else if (value instanceof Float) { + result.put(prefix + key, BigDecimal.valueOf((Float) value)); // 将整数转换为Long类型 + } else if (value instanceof Double) { + result.put(prefix + key, BigDecimal.valueOf((Double) value)); // 将整数转换为Long类型 + } else if (value instanceof BigDecimal) { + result.put(prefix + key, value); // 将整数转换为Long类型 + } else { + result.put(prefix + key, value); + } + } + }} \ No newline at end of file diff --git a/tptradeprod-app-starter/src/test/resources/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpPlaceOrderProductCheckNode/checkRestrictTime.json b/tptradeprod-app-starter/src/test/resources/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpPlaceOrderProductCheckNode/checkRestrictTime.json new file mode 100644 index 0000000..d82af88 --- /dev/null +++ b/tptradeprod-app-starter/src/test/resources/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpPlaceOrderProductCheckNode/checkRestrictTime.json @@ -0,0 +1,68 @@ +{ + "List":[ + { + "tripNo":"test", + "pickUpLocationCode":"test", + "pickUpLocation":"test", + "stationCount":1, + "pickUpLng":"test", + "pickUpLat":"test", + "pickUpTime":"1702958314098", + "dropOffLocationCode":"test", + "dropOffLocation":"test", + "dropOffLng":"test", + "dropOffLat":"test", + "dropOffTime":"1703001514000", + "miles":"test", + "duration":86300000, + "tripType":"test", + "pathPoints":[ + { + "locationName":"test", + "lng":"test", + "lat":"test", + "index":1, + "bizData":{ + "test":{} + } + } + ], + "bizData":{ + "test":{} + } + }, + { + "tripNo":"test", + "pickUpLocationCode":"test", + "pickUpLocation":"test", + "stationCount":1, + "pickUpLng":"test", + "pickUpLat":"test", + "pickUpTime":"1702958314098", + "dropOffLocationCode":"test", + "dropOffLocation":"test", + "dropOffLng":"test", + "dropOffLat":"test", + "dropOffTime":"1703001514000", + "miles":"test", + "duration":11, + "tripType":"test", + "pathPoints":[ + { + "locationName":"test", + "lng":"test", + "lat":"test", + "index":1, + "bizData":{ + "test":{} + } + } + ], + "bizData":{ + "test":{} + } + } + ], + "String":"within_city_single_trip_chartered_bus", + "Boolean":false +} \ No newline at end of file diff --git a/tptradeprod-app-starter/src/test/resources/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpPlaceOrderProductCheckNode/process.json b/tptradeprod-app-starter/src/test/resources/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpPlaceOrderProductCheckNode/process.json new file mode 100644 index 0000000..57437fe --- /dev/null +++ b/tptradeprod-app-starter/src/test/resources/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpPlaceOrderProductCheckNode/process.json @@ -0,0 +1,649 @@ +{ + "Integer":1, + "List":[ + { + "id":1, + "code":"test", + "productCode":"test", + "status":"test", + "availableQuantity":1, + "tenantId":"test", + "salesUnitElementList":[ + { + "id":1, + "code":"test", + "salesUnitCode":"test", + "value":"test", + "description":"test", + "unitCode":"test", + "unitName":"test", + "tenantId":"test" + } + ], + "busSpecification":{ + "id":1, + "code":"test", + "name":"test", + "length":1.0, + "carrierOrg":[ + [ + { + "orgCode":"test", + "name":"test" + } + ] + ], + "approvedPassengerCapacity":1, + "seatsNum":1, + "desc":"test", + "pictureUrl":"test", + "maxMileage":1.0, + "remarks":"test", + "gmtCreated":1702958047521, + "gmtModified":1702958047521, + "tenantId":"test", + "isDeleted":1, + "bizData":"test" + }, + "basePrice":{ + "miles":1, + "duration":1, + "price":1 + } + } + ], + "TpRuleExecuteResultVO":{ + "success":true, + "msg":"test", + "result":{} + }, + "TpRuleExecuteBatchResultVO":{ + "success":true, + "msg":"test", + "resultList":[ + { + "success":true, + "msg":"test", + "result":{} + } + ] + }, + "Long":1, + "NodeComponent":{ + "LOG":{ + "log":{}, + "liteflowConfig":{ + "enable":true, + "ruleSource":"test", + "ruleSourceExtData":"test", + "ruleSourceExtDataMap":{ + "test":"test" + }, + "slotSize":1, + "threadExecutorClass":"test", + "whenMaxWaitSeconds":1, + "whenMaxWaitTime":1, + "whenMaxWaitTimeUnit":"NANOSECONDS", + "whenThreadPoolIsolate":true, + "enableLog":true, + "queueLimit":1, + "delay":1, + "period":1, + "whenMaxWorkers":1, + "whenQueueLimit":1, + "parseOnStart":true, + "supportMultipleType":true, + "retryCount":1, + "nodeExecutorClass":"test", + "requestIdGeneratorClass":"test", + "printBanner":true, + "mainExecutorWorks":1, + "mainExecutorClass":"test", + "printExecutionLog":true, + "enableMonitorFile":true, + "parallelLoopExecutorClass":"test", + "parallelMaxWorkers":1, + "parallelQueueLimit":1, + "fallbackCmpEnable":true + } + }, + "monitorBus":{ + "liteflowConfig":{ + "enable":true, + "ruleSource":"test", + "ruleSourceExtData":"test", + "ruleSourceExtDataMap":{ + "test":"test" + }, + "slotSize":1, + "threadExecutorClass":"test", + "whenMaxWaitSeconds":1, + "whenMaxWaitTime":1, + "whenMaxWaitTimeUnit":"NANOSECONDS", + "whenThreadPoolIsolate":true, + "enableLog":true, + "queueLimit":1, + "delay":1, + "period":1, + "whenMaxWorkers":1, + "whenQueueLimit":1, + "parseOnStart":true, + "supportMultipleType":true, + "retryCount":1, + "nodeExecutorClass":"test", + "requestIdGeneratorClass":"test", + "printBanner":true, + "mainExecutorWorks":1, + "mainExecutorClass":"test", + "printExecutionLog":true, + "enableMonitorFile":true, + "parallelLoopExecutorClass":"test", + "parallelMaxWorkers":1, + "parallelQueueLimit":1, + "fallbackCmpEnable":true + }, + "LOG":{ + "log":{}, + "liteflowConfig":{ + "enable":true, + "ruleSource":"test", + "ruleSourceExtData":"test", + "ruleSourceExtDataMap":{ + "test":"test" + }, + "slotSize":1, + "threadExecutorClass":"test", + "whenMaxWaitSeconds":1, + "whenMaxWaitTime":1, + "whenMaxWaitTimeUnit":"NANOSECONDS", + "whenThreadPoolIsolate":true, + "enableLog":true, + "queueLimit":1, + "delay":1, + "period":1, + "whenMaxWorkers":1, + "whenQueueLimit":1, + "parseOnStart":true, + "supportMultipleType":true, + "retryCount":1, + "nodeExecutorClass":"test", + "requestIdGeneratorClass":"test", + "printBanner":true, + "mainExecutorWorks":1, + "mainExecutorClass":"test", + "printExecutionLog":true, + "enableMonitorFile":true, + "parallelLoopExecutorClass":"test", + "parallelMaxWorkers":1, + "parallelQueueLimit":1, + "fallbackCmpEnable":true + } + }, + "statisticsMap":{ + "table":[ + { + "hash":1, + "key":{}, + "val":{}, + "next":{ + } + } + ], + "nextTable":[ + { + "hash":1, + "key":{}, + "val":{}, + "next":{ + } + } + ], + "baseCount":1, + "sizeCtl":1, + "transferIndex":1, + "cellsBusy":1, + "counterCells":[ + { + "value":1 + } + ], + "keySet":[ + {} + ], + "values":[ + {} + ], + "entrySet":[ + {} + ] + }, + "printLogScheduler":{} + }, + "nodeId":"test", + "name":"test", + "type":"COMMON", + "self":{ + }, + "retryCount":1, + "isRollback":true, + "retryForExceptions":[ + null + ], + "refNodeTL":{ + "disableIgnoreNullValueSemantics":true, + "threadLocalHashCode":1 + }, + "slotIndexTL":{ + "disableIgnoreNullValueSemantics":true, + "threadLocalHashCode":1 + }, + "isEndTL":{ + "disableIgnoreNullValueSemantics":true, + "threadLocalHashCode":1 + } + }, + "TpProdDetailDTO":{ + "bizType":"CHARTER_BUS", + "extendAttributes":{ + "supportRefund":true, + "orderExpiredTime":1, + "orderPayType":"FULL_PAY", + "prepayRate":1, + "needConfirmOrder":true, + "supportModifyPrice":true, + "maxUpRate":1, + "supportCoupon":true, + "supportModifyOrderPayType":true, + "needRefundServiceFee":true, + "supportChangeTrip":true, + "supportChangeTripTimes":1, + "restrictTimeSingleDaySingleAndRoundTrip":true, + "orderIsForceReminderText":true, + "orderForceReminderText":"test", + "tripChangeNeedConfirmBySalesman":true, + "orderCanCancelAfterPayment":true, + "orderCancellationNeedSalesmanConfirm":true, + "salesmanApplyFullRefundAfterOrderCanceled":true + }, + "productExtraAttributes":{ + "routeCode":"test", + "ticketType":[ + "test" + ], + "ticketQuantity":1, + "ticketPriceType":[ + "test" + ], + "checkTicketType":[ + "test" + ], + "minTicketPrice":"test", + "departureType":"test", + "pricingType":"test", + "ecoData":"test" + }, + "routeDetailDTO":{ + "routeBase":{ + "routeCode":"test", + "orgCode":"test", + "orgAllPaths":[ + { + "orgCode":"test", + "name":"test" + } + ], + "frontCategoryCode":[ + "test" + ], + "routeName":"test", + "goBackType":"test", + "departureType":"test", + "status":"test", + "carMachineRouteNumber":"test", + "carPosRouteNumber":"test", + "specialText":"test", + "draft":true, + "syncStatus":"test", + "syncRouteStatus":"test", + "syncAction":"test", + "gmtCreated":1702958047512, + "gmtModified":1702958047512, + "tenantId":"test", + "isDeleted":1, + "bizData":"test" + }, + "goRouteStationDetails":[ + { + "routeCode":"test", + "goBackType":"test", + "station":{ + "stationCode":"test", + "name":"test", + "road":"test", + "orientation":"test", + "district":"test", + "wgsLongitude":"test", + "wgsLatitude":"test", + "gcjLongitude":"test", + "gcjLatitude":"test", + "desc":"test", + "resourceFrom":"test", + "gmtCreated":1702958047514, + "gmtModified":1702958047514, + "tenantId":"test", + "isDeleted":1, + "bizData":"test" + }, + "resourceFrom":"test", + "order":1, + "trace":"test", + "stationMark":"test", + "distance":1.0, + "costTime":1, + "gmtCreated":1702958047514, + "gmtModified":1702958047514, + "tenantId":"test", + "isDeleted":1, + "bizData":"test" + } + ], + "backRouteStationDetails":[ + { + "routeCode":"test", + "goBackType":"test", + "station":{ + "stationCode":"test", + "name":"test", + "road":"test", + "orientation":"test", + "district":"test", + "wgsLongitude":"test", + "wgsLatitude":"test", + "gcjLongitude":"test", + "gcjLatitude":"test", + "desc":"test", + "resourceFrom":"test", + "gmtCreated":1702958047514, + "gmtModified":1702958047514, + "tenantId":"test", + "isDeleted":1, + "bizData":"test" + }, + "resourceFrom":"test", + "order":1, + "trace":"test", + "stationMark":"test", + "distance":1.0, + "costTime":1, + "gmtCreated":1702958047514, + "gmtModified":1702958047514, + "tenantId":"test", + "isDeleted":1, + "bizData":"test" + } + ], + "goRollTimes":[ + { + "routeCode":"test", + "firstTime":"test", + "lastTime":"test", + "intervalTime":1, + "goBackType":"test", + "order":1 + } + ], + "backRollTimes":[ + { + "routeCode":"test", + "firstTime":"test", + "lastTime":"test", + "intervalTime":1, + "goBackType":"test", + "order":1 + } + ], + "serviceTime":{ + "routeCode":"test", + "dateType":"test", + "specificDateList":"test" + }, + "routeServiceObjs":[ + { + "routeCode":"test", + "serviceObjType":"test", + "serviceObjCode":"test", + "gmtCreated":1702958047515, + "gmtModified":1702958047515, + "tenantId":"test", + "isDeleted":1, + "bizData":"test" + } + ], + "tenantId":"test" + }, + "backCategories":[ + { + "parentCode":"test", + "parentName":"test", + "code":"test", + "name":"test", + "type":"test", + "level":1, + "sort":1, + "status":"test", + "rootCode":"test", + "imageUrl":"test", + "leaf":1, + "childrenCategories":[ + null + ] + } + ], + "frontCategories":[ + { + "parentCode":"test", + "parentName":"test", + "code":"test", + "name":"test", + "type":"test", + "level":1, + "sort":1, + "status":"test", + "rootCode":"test", + "imageUrl":"test", + "leaf":1, + "childrenCategories":[ + null + ] + } + ], + "priceUnits":[ + { + "id":1, + "name":"test", + "type":"test", + "priceUnitFixed":{ + "id":1, + "price":1, + "unitCode":"test", + "unitName":"test", + "tenantId":"test", + "bizData":"test" + }, + "priceUnitRuleList":[ + { + "id":1, + "name":"test", + "ruleCode":"test", + "priceUnitRuleFactorValues":[ + { + "id":1, + "factorCode":"test", + "priceUnitRuleCode":"test", + "unitCode":"test", + "unitName":"test", + "factorValue":"test", + "factorValueType":"test", + "tenantId":"test", + "bizData":"test" + } + ], + "expression":"test", + "sort":1, + "ruleGroupCode":"test", + "tenantId":"test", + "bizData":"test" + } + ], + "code":"test", + "salesUnitCode":"test", + "tenantId":"test" + } + ], + "salesUnits":[ + { + "code":"test", + "productCode":"test", + "status":"test", + "expression":"test", + "tenantId":"test", + "salesUnitElementList":[ + { + "id":1, + "code":"test", + "salesUnitCode":"test", + "value":"test", + "description":"test", + "unit":{ + "code":"test", + "name":"test", + "tenantId":"test" + }, + "tenantId":"test", + "bizData":"test" + } + ], + "priceUnits":[ + { + "id":1, + "name":"test", + "type":"test", + "priceUnitFixed":{ + "id":1, + "price":1, + "unitCode":"test", + "unitName":"test", + "tenantId":"test", + "bizData":"test" + }, + "priceUnitRuleList":[ + { + "id":1, + "name":"test", + "ruleCode":"test", + "priceUnitRuleFactorValues":[ + { + "id":1, + "factorCode":"test", + "priceUnitRuleCode":"test", + "unitCode":"test", + "unitName":"test", + "factorValue":"test", + "factorValueType":"test", + "tenantId":"test", + "bizData":"test" + } + ], + "expression":"test", + "sort":1, + "ruleGroupCode":"test", + "tenantId":"test", + "bizData":"test" + } + ], + "code":"test", + "salesUnitCode":"test", + "tenantId":"test" + } + ] + } + ], + "rules":[ + { + "id":1, + "code":"test", + "name":"test", + "bizType":"test", + "expression":"test", + "targetObjType":"test", + "targetObjId":"test", + "ruleGroup":"test", + "tenantId":"test", + "ruleEnum":"NO_LIMIT", + "factorValues":[ + { + "id":1, + "factorCode":"test", + "ruleId":1, + "ruleCode":"test", + "unit":{ + "code":"test", + "name":"test", + "tenantId":"test" + }, + "factorValue":"test", + "factorValueType":"test", + "tenantId":"test", + "bizData":"test" + } + ], + "effectTimeStart":1, + "effectTimeEnd":1 + } + ], + "serviceObjects":[ + { + "serviceObjectCode":"test", + "serviceObjectName":"test", + "serviceObjectType":"test", + "payType":"test", + "resourceItems":[ + { + "code":"test", + "name":"test", + "type":"test", + "value":"test", + "tenantId":"test" + } + ], + "logoImageUrl":"test", + "contactName":"test", + "contactPhone":"test", + "address":{ + "provinceCode":"test", + "provinceName":"test", + "cityCode":"test", + "cityName":"test", + "districtCode":"test", + "districtName":"test", + "streetCode":"test", + "streetName":"test", + "address":"test", + "fullAddress":"test", + "tenantId":"test" + }, + "tenantId":"test" + } + ], + "productCode":"test", + "routeCode":"test", + "productName":"test", + "formalFlag":"test", + "status":"test", + "backCategoryCode":"test", + "bizData":{ + "test":{} + }, + "tenantId":"test" + } +} \ No newline at end of file diff --git a/tptradeprod-biz/pom.xml b/tptradeprod-biz/pom.xml new file mode 100644 index 0000000..a40beaf --- /dev/null +++ b/tptradeprod-biz/pom.xml @@ -0,0 +1,19 @@ + + + 4.0.0 + + + com.deepinnet + tptradeprod + 1.0-SNAPSHOT + + + tptradeprod-biz + pom + + tptradeprod-biz-service-impl + + + diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/pom.xml b/tptradeprod-biz/tptradeprod-biz-service-impl/pom.xml new file mode 100644 index 0000000..a57d86e --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/pom.xml @@ -0,0 +1,85 @@ + + + 4.0.0 + + + com.deepinnet + tptradeprod-biz + 1.0-SNAPSHOT + + + tptradeprod-biz-service-impl + + + + + com.deepinnet + tptradeprod-common-service-integration + + + + com.deepinnet + tptradeprod-common-util + + + + com.deepinnet + tptradeprod-core-service + + + + com.deepinnet + tptradecore-common-service-facade + + + + org.springframework + spring-tx + + + org.mockito + mockito-core + test + + + com.github.jsonzou + jmockdata + 4.3.0 + test + + + junit + junit + test + + + org.aspectj + aspectjweaver + + + + org.apache.dubbo + dubbo + + + + com.yomahub + liteflow-spring-boot-starter + + + + com.alibaba.fastjson2 + fastjson2 + 2.0.25 + + + + com.github.dadiyang + equator + 1.0.4 + + + + diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/advice/IntegrationClientInterceptor.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/advice/IntegrationClientInterceptor.java new file mode 100644 index 0000000..005259f --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/advice/IntegrationClientInterceptor.java @@ -0,0 +1,44 @@ +package com.deepinnet.tptradeprod.biz.advice; + +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradeprod.biz.log.LogFormatHelper; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +@Aspect +@Component +public class IntegrationClientInterceptor { + + private static final Logger INTEGRATION_LOG = LoggerFactory.getLogger("INTEGRATION-LOG"); + + @Pointcut("execution(* com.deepinnet.*.common.service.integration..*.*(..))") + public void pointCut() { + } + + @Around("pointCut()") + public Object integrationClientHandle(ProceedingJoinPoint pj) throws Throwable { + boolean res = true; + Long startTime = System.currentTimeMillis(); + String className = pj.getTarget().getClass().getSimpleName(); + String methodName = pj.getSignature().getName(); + Object proceed; + Throwable ex = null; + try { + proceed = pj.proceed(); + return proceed; + } catch (Throwable e) { + res = false; + ex = e; + throw e; + } finally { + LogUtil.info(INTEGRATION_LOG, "{}", + LogFormatHelper.logFormat(startTime, className, methodName, res, ex)); + } + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/advice/MessageLogInterceptor.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/advice/MessageLogInterceptor.java new file mode 100644 index 0000000..a470458 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/advice/MessageLogInterceptor.java @@ -0,0 +1,44 @@ +package com.deepinnet.tptradeprod.biz.advice; + +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradeprod.biz.log.LogFormatHelper; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +/** + * @author chenjiaju + * @version 2023/1/6 + */ + +@Aspect +@Component +public class MessageLogInterceptor { + + private static final Logger MESSAGE_LOG = LoggerFactory.getLogger("MESSAGE-LOG"); + + @Pointcut("execution(* com.deepinnet.tptradeprod.core.handler.TpMessageHandler.handle(..))") + public void pointCut() { + } + + @Around("pointCut()") + public Object messageLogHandle(ProceedingJoinPoint pj) throws Throwable { + Long startTime = System.currentTimeMillis(); + boolean isSuccess = true; + try { + return pj.proceed(); + } catch (Exception e) { + isSuccess = false; + throw e; + } finally { + Long endTime = System.currentTimeMillis(); + String log = LogFormatHelper.generateMessageConsumeLog(pj, isSuccess, endTime - startTime); + LogUtil.info(MESSAGE_LOG, "{}", log); + } + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/advice/RpcExceptionHandleAspect.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/advice/RpcExceptionHandleAspect.java new file mode 100644 index 0000000..4df4d45 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/advice/RpcExceptionHandleAspect.java @@ -0,0 +1,77 @@ +package com.deepinnet.tptradeprod.biz.advice; + +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradeprod.biz.log.LogFormatHelper; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.*; +import org.slf4j.*; +import org.springframework.stereotype.Component; + +/** + * @author amos wong + * @create 2022-11-14 15:00 + *

+ * 异常处理切面 + */ +@Component +@Aspect +public class RpcExceptionHandleAspect { + + private static final String TPTRADEPROD_CORE_SIMPLE_NAME = "TpTradeProdException"; + + private static final Logger REQUEST_LOG = LoggerFactory.getLogger("REQUEST-LOG"); + + private static final Logger BIZ_DIGEST_LOG = LoggerFactory.getLogger("BIZ-DIGEST-LOG"); + + @Pointcut(value = "@within(org.apache.dubbo.config.annotation.DubboService)") + private void myPointcut() { + } + + @Around(value = "myPointcut()") + private Object around(ProceedingJoinPoint joinPoint) { + Long startTime = System.currentTimeMillis(); + String className = joinPoint.getTarget().getClass().getSimpleName(); + String methodName = joinPoint.getSignature().getName(); + boolean isSuccess = true; + Throwable ex = null; + + try { + LogUtil.info(REQUEST_LOG, "{},{},{}", className, methodName, joinPoint.getArgs()); + Object proceedResult = joinPoint.proceed(); + if (proceedResult instanceof TpResult) { + TpResult result = (TpResult) proceedResult; + if (!result.isSuccess()) { + isSuccess = false; + } + } + + return proceedResult; + } catch (Throwable e) { + ex = e; + LogUtil.error("RPC服务调用异常", e); + // 业务异常 + if (e instanceof TpTradeProdException) { + TpTradeProdException exception = (TpTradeProdException) e; + // ATTENTION:如果是幂等异常,需要返回成功,但是要带上异常信息 + TpTradeProdErrorCode errorCode = exception.getErrorCode(); + if (TpTradeProdErrorCode.IDEMPOTENT_REQUEST_ERROR == errorCode) { + return new TpResult<>(true, TpTradeProdErrorCode.IDEMPOTENT_REQUEST_ERROR.getCode(), TpTradeProdErrorCode.IDEMPOTENT_REQUEST_ERROR.getDesc(), TPTRADEPROD_CORE_SIMPLE_NAME); + } + return TpResult.fail(errorCode.getCode(), exception.getMessage(), TPTRADEPROD_CORE_SIMPLE_NAME); + } else if (e instanceof IllegalArgumentException) { + return TpResult.fail(TpTradeProdErrorCode.ILLEGAL_PARAMS.getCode(), TpTradeProdErrorCode.ILLEGAL_PARAMS.getDesc(), TPTRADEPROD_CORE_SIMPLE_NAME); + } else if (e instanceof TpException) { + return TpResult.fail(((TpException) e).getErrorCode(), e.getMessage(), TPTRADEPROD_CORE_SIMPLE_NAME); + } else { + // 未知异常 + return TpResult.fail(TpTradeProdErrorCode.INTERNAL_SERVER_ERROR.getCode(), TpTradeProdErrorCode.INTERNAL_SERVER_ERROR.getDesc(), TPTRADEPROD_CORE_SIMPLE_NAME); + } + } finally { + LogUtil.info(BIZ_DIGEST_LOG, "{}", LogFormatHelper.logFormat(startTime, className, methodName, isSuccess, ex)); + } + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/config/ThreadPoolConfig.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/config/ThreadPoolConfig.java new file mode 100644 index 0000000..0cda390 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/config/ThreadPoolConfig.java @@ -0,0 +1,31 @@ +package com.deepinnet.tptradeprod.biz.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + *

+ * 线程池配置 + *

+ * + * @author chenjiaju + * @since 2024/2/2 + */ +@Configuration +public class ThreadPoolConfig { + + @Bean + public ThreadPoolTaskExecutor queryPositionFlagThreadPool() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(Runtime.getRuntime().availableProcessors() * 2); + executor.setMaxPoolSize(Runtime.getRuntime().availableProcessors() * 3 + 1); + executor.setKeepAliveSeconds(10); + executor.setQueueCapacity(128); + executor.setThreadNamePrefix("query-position-flag-task-"); + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy()); + return executor; + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/constants/TpOrderCalcFormula.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/constants/TpOrderCalcFormula.java new file mode 100644 index 0000000..fa59c55 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/constants/TpOrderCalcFormula.java @@ -0,0 +1,98 @@ +package com.deepinnet.tptradeprod.biz.constants; + +/** + *

+ * 计算公式枚举 + *

+ * + * @author chenjiaju + * @since 2024/2/2 + */ +public class TpOrderCalcFormula { + + /** + * 行程结束 应退金额(手续费) + */ + public final static String ORDER_END_NEED_REFUND_AMOUNT_WITH_SERVICE_CHARGE = "应退金额=已付金额-订单金额-手续费"; + + /** + * 行程结束 应退金额(无手续费) + */ + public final static String ORDER_END_NEED_REFUND_AMOUNT_WITHOUT_SERVICE_CHARGE = "应退金额=已付金额-订单金额"; + + /** + * 取消 退款中 有手续费 + */ + public final static String ORDER_CANCEL_REFUNDING_WITH_SERVICE_CHARGE = "应退金额=已付金额-手续费"; + + /** + * 取消 退款中 无手续费 + */ + public final static String ORDER_CANCEL_REFUNDING_WITHOUT_SERVICE_CHARGE = "应退金额=已付金额"; + + /** + * 行程结束 已退款 实付金额(手续费) + */ + public final static String ORDER_END_REFUNDED_AMOUNT_WITH_SERVICE_CHARGE = "应退金额=已付金额-订单金额-手续费"; + + /** + * 行程结束 已退款 实付金额(无手续费) + */ + public final static String ORDER_END_REFUNDED_AMOUNT_WITHOUT_SERVICE_CHARGE = "已退金额=已付金额-订单金额"; + + /** + * 取消 应退(手续费) + */ + public final static String ORDER_CANCEL_NEED_REFUND_AMOUNT_WITH_SERVICE_CHARGE = "应退金额=已付金额-手续费"; + + /** + * 取消 应退(无手续费) + */ + public final static String ORDER_CANCEL_NEED_REFUND_AMOUNT_WITHOUT_SERVICE_CHARGE = "应退金额=已付金额"; + + /** + * 取消 已退金额(手续费) + */ + public final static String ORDER_CANCEL_REFUNDED_AMOUNT_WITH_SERVICE_CHARGE = "已退金额=已付金额-手续费"; + + /** + * 取消 已退金额(无手续费) + */ + public final static String ORDER_CANCEL_REFUNDED_AMOUNT_WITHOUT_SERVICE_CHARGE = "已退金额=已付金额"; + + /** + * 取消 应付 + */ + public final static String ORDER_CANCEL_NEED_PAY_AMOUNT_WITH_SERVICE_CHARGE = "应付金额=手续费-已付金额"; + + /** + * 取消 实付金额 + */ + public final static String ORDER_CANCEL_PAID_AMOUNT_WITH_SERVICE_CHARGE = "实付金额=手续费-已支付订金金额"; + + /** + * 应付尾款(手续费) + */ + public final static String ORDER_NEED_PAY_BALANCE_AMOUNT_WITH_SERVICE_CHARGE = "应付尾款=订单金额-已付金额+手续费"; + + /** + * 应付尾款(无手续费) + */ + public final static String ORDER_NEED_PAY_BALANCE_AMOUNT_WITHOUT_SERVICE_CHARGE = "应付尾款=订单金额-已付金额"; + + /** + * 实付金额(手续费) + */ + public final static String ORDER_ACTUAL_PAID_AMOUNT_WITH_SERVICE_CHARGE = "实付金额=订单金额+手续费"; + + /** + * 实付金额(无手续费) + */ + public final static String ORDER_ACTUAL_PAID_AMOUNT_WITHOUT_SERVICE_CHARGE = "实付金额=订单金额"; + + /** + * 订单结束 不退不补 实付金额 + */ + public final static String ORDER_ACTUAL_PAID_AMOUNT_WITHOUT_BALANCE_WITHOUT_SERVICE_CHARGE = "实付金额=已支付订金金额"; + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/constants/TpOrderListQueryConstants.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/constants/TpOrderListQueryConstants.java new file mode 100644 index 0000000..3dde82d --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/constants/TpOrderListQueryConstants.java @@ -0,0 +1,23 @@ +package com.deepinnet.tptradeprod.biz.constants; + +import lombok.Data; + +/** + *

+ * 列表查询常量类 + *

+ * + * @author chenjiaju + * @since 2024/3/13 + */ + +@Data +public class TpOrderListQueryConstants { + + public final static Integer NEED_PAY_STATUS = 1; + + public final static Integer NEED_VERIFY_STATUS = 2; + + public final static Integer REFUND_STATUS = 3; + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/constants/TpTradeProdConstants.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/constants/TpTradeProdConstants.java new file mode 100644 index 0000000..56f1b6f --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/constants/TpTradeProdConstants.java @@ -0,0 +1,16 @@ +package com.deepinnet.tptradeprod.biz.constants; + +/** + * @author amos wong + * @create 2023/10/17 10:39 + * @Description + */ +public class TpTradeProdConstants { + + public static final Integer DEFAULT_TIME_OUT_INTERVAL = 15 * 60 * 1000; + + + public static final String ORDER_AUDIT_CONFIRM = "order_audit_confirm"; + + public static final String MIDDLE_HORIZONTAL = "-"; +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/converter/TpSaleUnitCarpoolConvert.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/converter/TpSaleUnitCarpoolConvert.java new file mode 100644 index 0000000..99be847 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/converter/TpSaleUnitCarpoolConvert.java @@ -0,0 +1,21 @@ +package com.deepinnet.tptradeprod.biz.converter; + +import com.deepinnet.tpproductcore.common.vo.TpSalesUnitCarPoolVO; +import com.deepinnet.tptradeprod.common.vo.TpProdSalesUnitCarpoolVO; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; + +/** + *

+ * 售卖单元开线信息转换器 + *

+ * + * @author chenjiaju + * @since 2024/5/24 + */ + +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface TpSaleUnitCarpoolConvert { + + TpProdSalesUnitCarpoolVO productSaleUnit2productSaleUnitCarpool(TpSalesUnitCarPoolVO carPoolVO); +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/log/LogFormatHelper.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/log/LogFormatHelper.java new file mode 100644 index 0000000..cb34e68 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/log/LogFormatHelper.java @@ -0,0 +1,165 @@ +package com.deepinnet.tptradeprod.biz.log; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tptradecore.common.exception.TpTradeCoreException; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import org.aspectj.lang.ProceedingJoinPoint; + +import java.text.MessageFormat; + +public class LogFormatHelper { + + /** + * 日志格式 + * [类名,方法名,执行结果,耗时,异常类名,异常码,异常信息] + */ + private static final String LOG_PATTERN = "[%s,%s,%s,%sms,%s,%s,%s]"; + + /** + * 消息消费日志 + */ + private static final String MESSAGE_CONSUME_LOG_PATTERN = "[{0},{1},{2},{3},{4},{5},{6},{7}ms]"; + + /** + * 占位符 + */ + private static final String PLACE_HOLDER = "null"; + + /** + * topic + */ + private static final String TOPIC = "topic"; + + /** + * tenantId + */ + private static final String TENANT_ID = "tenantId"; + + /** + * TAG + */ + private static final String TAG = "tag"; + + /** + * consumerGroup + */ + private static final String CONSUMER_GROUP = "consumerGroup"; + + /** + * messageKey + */ + private static final String MESSAGE_KEY = "messageKey"; + + /** + * message + */ + private static final String MESSAGE = "message"; + + public static String logFormat(Long startTime, String className, String methodName, Boolean isSuccess, Throwable ex) { + Long endTime = System.currentTimeMillis(); + + if (ex instanceof TpTradeProdException) { + TpTradeProdException e = (TpTradeProdException) ex; + return String.format( + LOG_PATTERN, + className, + methodName, + isSuccess, + (endTime - startTime), + ex.getClass().getSimpleName(), + e.getErrorCode(), + e.getMessage()); + } else if (ex instanceof TpTradeCoreException) { + TpTradeCoreException e = (TpTradeCoreException) ex; + return String.format( + LOG_PATTERN, + className, + methodName, + isSuccess, + (endTime - startTime), + ex.getClass().getSimpleName(), + e.getErrorCode(), + e.getMessage()); + } else if (ex instanceof TpException) { + TpException e = (TpException) ex; + return String.format( + LOG_PATTERN, + className, + methodName, + isSuccess, + (endTime - startTime), + ex.getClass().getSimpleName(), + e.getErrorCode(), + e.getMessage()); + } else if (ex != null) { + return String.format( + LOG_PATTERN, + className, + methodName, + isSuccess, + (endTime - startTime), + ex.getClass().getSimpleName(), + PLACE_HOLDER, + ex.getMessage()); + } else { + return String.format( + LOG_PATTERN, + className, + methodName, + isSuccess, + (endTime - startTime), + PLACE_HOLDER, + PLACE_HOLDER, + PLACE_HOLDER); + } + } + + public static String generateMessageConsumeLog(ProceedingJoinPoint pj, Boolean isSuccess, Long costTime) { + // 请求参数转换为JSONObject + JSONObject argsJson = getJSONObject(pj.getArgs()); + // tenantId + String tenantId = getField(argsJson, TENANT_ID); + // topic + String topic = getField(argsJson, TOPIC); + // tag + String tag = getField(argsJson, TAG); + // consumerGroup + String consumerGroup = getField(argsJson, CONSUMER_GROUP); + // message + String message = getField(argsJson, MESSAGE); + // messageKey + String messageKey = getField(argsJson, MESSAGE_KEY); + + return MessageFormat.format(MESSAGE_CONSUME_LOG_PATTERN, tenantId, topic, tag, consumerGroup, message, isSuccess, messageKey, costTime.toString()); + } + + private static JSONObject getJSONObject(Object[] args) { + JSONObject result = new JSONObject(); + // 请求参数为空 + if (ObjectUtil.isNull(args) || args.length == 0) { + return result; + } + // 请求参数为对象 + JSONArray jsonArray = JSONArray.parseArray(JSONObject.toJSONString(args)); + Object o = jsonArray.get(0); + if (o instanceof JSONObject) { + result = (JSONObject) o; + } + + return result; + } + + private static String getField(JSONObject jsonObject, String field) { + String result = PLACE_HOLDER; + if (jsonObject.containsKey(field)) { + result = String.valueOf(jsonObject.get(field)); + } + + return result; + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/changeorder/TpChangeOrderRecordServiceChargeNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/changeorder/TpChangeOrderRecordServiceChargeNode.java new file mode 100644 index 0000000..052132f --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/changeorder/TpChangeOrderRecordServiceChargeNode.java @@ -0,0 +1,168 @@ +package com.deepinnet.tptradeprod.biz.service.flow.changeorder; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson2.JSONObject; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpproductcore.common.dto.product.TpProdDetailDTO; +import com.deepinnet.tpproductcore.common.dto.rule.TpBizRuleDTO; +import com.deepinnet.tpproductcore.common.dto.rule.TpChangeOrderChargeParamDTO; +import com.deepinnet.tpproductcore.common.dto.rule.TpRuleExecuteDTO; +import com.deepinnet.tpproductcore.common.dto.rule.TpRuleExecuteResultVO; +import com.deepinnet.tpproductcore.common.dto.rule.result.TpCharterChangeOrderChargeResult; +import com.deepinnet.tpproductcore.common.enums.TpRuleExpressionGroupEnum; +import com.deepinnet.tptradecore.common.dto.order.TpOrderChargeRecordDTO; +import com.deepinnet.tptradecore.common.enums.order.TpAuditOrChangePriceBizTypeEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderTripTypeEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.dto.TpOrderStationDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderCreateDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderStatusEnum; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.TpBizRuleClient; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.google.common.collect.Lists; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static com.deepinnet.tptradeprod.common.enums.TpOrderStatusEnum.*; + +/** + *

+ * 修改订单记录手续费节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "changeOrderRecordServiceChargeNode", name = "修改订单记录手续费节点") +@LiteflowCmpDefine +@RequiredArgsConstructor +public class TpChangeOrderRecordServiceChargeNode { + + private final List CAN_RECORD_SERVICE_CHARGE_STATUS = Lists.newArrayList(ORDER_NEED_CONFIRM, ORDER_CONFIRMED, ORDER_NEED_DISPATCH, ORDER_DISPATCHED, ORDER_DEPOSIT_PAID); + + private final TpBizRuleClient tpBizRuleClient; + + private final TpOrderClient tpOrderClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 修改订单记录手续费节点"); + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + + // 产品信息 + TpProdDetailDTO productDTO = userPlaceOrderContext.getProductDTO(); + + //原订单信息 + TpProdOrderDetailVO oldOrder = userPlaceOrderContext.getOrderDetailVO(); + + //更改订单信息 + TpProdOrderCreateDTO newOder = userPlaceOrderContext.getCreateDTO(); + + // 使用老订单状态判断 + TpOrderStatusEnum orderStatusEnum = getTpOrderStatusEnumByStatus(oldOrder.getStatus(), oldOrder.getType()); + + if (!CAN_RECORD_SERVICE_CHARGE_STATUS.contains(orderStatusEnum)) { + LogUtil.info("当前变更订单无需记录手续费..."); + return; + } + + // 新订单的应付金额 + BigDecimal newPayableAmount = new BigDecimal(newOder.getPayableAmount()); + + // 老订单的应付金额 + BigDecimal oldPayableAmount = new BigDecimal(oldOrder.getPayableAmount()); + + // 新订单的应付金额大于老订单的应付金额, 无需记录手续费 + if (newPayableAmount.compareTo(oldPayableAmount) >= 0) { + LogUtil.info("新订单应付金额: {}, 老订单应付金额:{}, 无需支付手续费", newOder.getPayableAmount(), oldOrder.getPayableAmount()); + return; + } + + // 需要记录手续费的情况,计算手续费 + BigDecimal currentChangeServiceCharge = null; + BigDecimal chargeRate = null; + + // 待确认订单无需记录手续费 + // 执行规则入参 + if (oldOrder.getStatus().compareTo(ORDER_NEED_CONFIRM.getStatus()) > 0) { + TpRuleExecuteDTO changeRuleDTO = getChangeRuleDTO(userPlaceOrderContext.getTenantId(), productDTO, oldPayableAmount.subtract(newPayableAmount), newOder.getCharterBusStations(), DateUtil.current()); + + TpRuleExecuteResultVO executeRuleResult = tpBizRuleClient.executeRule(changeRuleDTO); + + if (!executeRuleResult.getSuccess()) { + LogUtil.error("当前变更订单手续费执行失败, 入参:{}", JSONObject.toJSONString(changeRuleDTO)); + throw new TpTradeProdException(TpTradeProdErrorCode.RULE_EXECUTE_ERROR); + } + + if (executeRuleResult.getResult() == null || ObjectUtil.isNull(executeRuleResult.getResult().getChargeAmount())) { + LogUtil.warn("变更订单手续费为空"); + return; + } + + currentChangeServiceCharge = executeRuleResult.getResult().getChargeAmount().getMoney().getAmount().setScale(2, RoundingMode.DOWN); + chargeRate = executeRuleResult.getResult().getChargeRate(); + } + + tpOrderClient.updateChargeRecord(buildUpdateChargeRecordParams(newOder, currentChangeServiceCharge, chargeRate)); + } + + private TpOrderChargeRecordDTO buildUpdateChargeRecordParams(TpProdOrderCreateDTO newOrder, BigDecimal serviceCharge, BigDecimal chargeRate) { + TpOrderChargeRecordDTO tpOrderChargeRecordDTO = new TpOrderChargeRecordDTO(); + tpOrderChargeRecordDTO.setOrderNo(newOrder.getOrderNo()); + tpOrderChargeRecordDTO.setOriginalOrderNo(newOrder.getOriginalOrderNo()); + tpOrderChargeRecordDTO.setBizType(TpAuditOrChangePriceBizTypeEnum.CHANGE_ORDER.getBizType()); + tpOrderChargeRecordDTO.setServiceCharge(ObjectUtil.isNull(serviceCharge) ? null : serviceCharge.toString()); + tpOrderChargeRecordDTO.setServiceChargeRate(ObjectUtil.isNull(chargeRate) ? null : chargeRate.toString()); + tpOrderChargeRecordDTO.setTenantId(newOrder.getTenantId()); + return tpOrderChargeRecordDTO; + } + + private static TpRuleExecuteDTO getChangeRuleDTO(String tenantId, TpProdDetailDTO productDetail, BigDecimal subtractMoney, List charterBusStations, Long orderTime) { + // 找到发车时间最早的时间 + Long pickUpTime; + if (charterBusStations.size() == 1) { + pickUpTime = Convert.toLong(charterBusStations.get(0).getPickUpTime()); + } else { + List goTrip = charterBusStations.stream().filter(station -> StrUtil.equals(station.getTripType(), TpOrderTripTypeEnum.GO.getCode())).collect(Collectors.toList()); + pickUpTime = Convert.toLong(goTrip.get(0).getPickUpTime()); + } + // 将产品信息对应的规则信息转换成Map + Map> rulesMap = productDetail.getRules().stream().collect(Collectors.groupingBy(TpBizRuleDTO::getRuleGroup)); + + // 找到对应的变更手续费的规则 + List changeRules = rulesMap.get(TpRuleExpressionGroupEnum.CHANGE_ORDER_CHARGE.getCode()); + List rules = Lists.newArrayList(); + changeRules.forEach(rule -> rules.add(rule.getExpression())); + + // 构建执行入参 + TpChangeOrderChargeParamDTO param = new TpChangeOrderChargeParamDTO(); + param.setOrderPriceChange(subtractMoney); + // 发车时间 + param.setDepartureTime(pickUpTime); + param.setOccurTime(orderTime); + + TpRuleExecuteDTO ruleExecuteDTO = new TpRuleExecuteDTO<>(); + ruleExecuteDTO.setRuleList(rules); + ruleExecuteDTO.setParameter(param); + ruleExecuteDTO.setRuleExpressionGroup(TpRuleExpressionGroupEnum.CHANGE_ORDER_CHARGE); + ruleExecuteDTO.setTenantId(tenantId); + return ruleExecuteDTO; + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/changeorder/TpOrderChangNeedAuditNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/changeorder/TpOrderChangNeedAuditNode.java new file mode 100644 index 0000000..6165142 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/changeorder/TpOrderChangNeedAuditNode.java @@ -0,0 +1,49 @@ +package com.deepinnet.tptradeprod.biz.service.flow.changeorder; + +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.order.TpOrderPushStatusDTO; +import com.deepinnet.tptradecore.common.enums.order.TpOrderPushStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.enums.TpOrderStatusEnum; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import com.yomahub.liteflow.enums.NodeTypeEnum; + +import javax.annotation.Resource; + +/** + *

+ * + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "orderChangeNeedAudit", name = "订单变更是否需要审核") +@LiteflowCmpDefine(value = NodeTypeEnum.IF) +public class TpOrderChangNeedAuditNode { + @Resource + private TpOrderClient orderClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS_IF) + public boolean process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 判断是否需要业务员确认审核"); + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + TpProdOrderDetailVO orderDetailVO = userPlaceOrderContext.getOrderDetailVO(); + if (TpOrderStatusEnum.ORDER_NEED_CONFIRM.equals(TpOrderStatusEnum.getTpOrderStatusEnumByStatus(orderDetailVO.getStatus(), orderDetailVO.getType()))) { + //订单状态需要流转到待确认 + orderClient.pushOrderStatus(TpOrderPushStatusDTO.builder() + .orderNo(userPlaceOrderContext.getCreateDTO().getOrderNo()) + .tenantId(userPlaceOrderContext.getTenantId()) + .tpOrderPushStatusEnum(TpOrderPushStatusEnum.ORDER_NEED_CONFIRM).build()); + return false; + } + return userPlaceOrderContext.getChangeOrderNeedAudit(); + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/changeorder/TpOrderDiffNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/changeorder/TpOrderDiffNode.java new file mode 100644 index 0000000..a09aa54 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/changeorder/TpOrderDiffNode.java @@ -0,0 +1,297 @@ +package com.deepinnet.tptradeprod.biz.service.flow.changeorder; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson2.JSONObject; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.order.TpOrderPushStatusDTO; +import com.deepinnet.tptradecore.common.enums.order.*; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.enums.TpOrderSceneEnum; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.facade.TpOrderChangeAcceptanceFacade; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.vo.*; +import com.github.dadiyang.equator.Equator; +import com.github.dadiyang.equator.FieldInfo; +import com.github.dadiyang.equator.GetterBaseEquator; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static com.deepinnet.tptradecore.common.enums.order.TpOrderChangeItemFactorEnum.*; +import static com.deepinnet.tptradecore.common.enums.order.TpOrderChangeItemTypeEnum.*; +import static com.deepinnet.tptradecore.common.enums.order.TpOrderTripTypeEnum.BACK; +import static com.deepinnet.tptradecore.common.enums.order.TpOrderTripTypeEnum.GO; + +/** + *

+ * 创建订单节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "orderDiffNode", name = "订单差异对比 & 提交审核 & 订单状态推进") +@LiteflowCmpDefine +@RequiredArgsConstructor +public class TpOrderDiffNode { + + @Resource + private TpOrderClient tpOrderClient; + + private static final Map DIFF_MAP = Maps.newHashMapWithExpectedSize(16); + + private static final List TRIP_TYPE_ENUMS = Lists.newArrayList(GO, BACK); + + static { + DIFF_MAP.put("start_time", START_TIME);//出发时间 + DIFF_MAP.put("return_time", RETURN_TIME);//返回时间 + DIFF_MAP.put("pickUpLocation", GO_ON_POINT);//上车点 + DIFF_MAP.put("dropOffLocation", DROP_OFF_POINT);//下车点 +// DIFF_MAP.put("", WAY_POINT);//途径点 +// DIFF_MAP.put("", TRIP_TYPE);//包车类型 + DIFF_MAP.put("days", RENTAL_DAYS);//用车天数 + DIFF_MAP.put("passengerCount", PASSENGER_COUNT);//乘车人数 + //DIFF_MAP.put("name", CAR_INFO);//车辆信息 + //DIFF_MAP.put("count", CAR_NUM);//车辆数量 + DIFF_MAP.put("includeDriverExpenses", DRIVER_FEE);//司机费用 + DIFF_MAP.put("miles", MILES);//里程 + DIFF_MAP.put("duration", DURATION);//耗时 + } + + /** + * 途径点对比器 + */ + private static final Equator WAY_EQUATOR = new GetterBaseEquator(Lists.newArrayList("locationName"), null, true); + + @Resource + private TpOrderChangeAcceptanceFacade orderChangeAcceptanceFacade; + + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单变更对比 & 提交审核"); + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + //原订单信息 + TpProdOrderDetailVO oldOrder = userPlaceOrderContext.getOrderDetailVO(); + + //更改订单信息 + TpProdOrderCreateDTO newOder = userPlaceOrderContext.getCreateDTO(); + + String tenantId = userPlaceOrderContext.getTenantId(); + String originalOrderNo = userPlaceOrderContext.getCreateDTO().getOriginalOrderNo(); + String orderNo = userPlaceOrderContext.getCreateDTO().getOrderNo(); + + + TpProdOrderChangeApplyCreatedDTO tpOrderChangeApplyDTO = TpProdOrderChangeApplyCreatedDTO.builder().build(); + //fixme 暂时没有是否自动审核的配置项 + Boolean autoAudit = Boolean.FALSE; + tpOrderChangeApplyDTO.setAutoAudit(autoAudit); + tpOrderChangeApplyDTO.setOrderNo(orderNo); + tpOrderChangeApplyDTO.setOriginalOrderNo(originalOrderNo); + if (autoAudit) { + tpOrderChangeApplyDTO.setApplyStatus(TpOrderChangeApplyStatusEnum.APPROVED_SUCCESS.getType()); + } else { + tpOrderChangeApplyDTO.setApplyStatus(TpOrderChangeApplyStatusEnum.WAITING_APPROVED.getType()); + } + tpOrderChangeApplyDTO.setApplyTime(System.currentTimeMillis()); + tpOrderChangeApplyDTO.setApplyType(TpOrderChangeTypeEnum.ORDER_CHANGE.getType()); + + //申请人信息 + TpOrderPlacerVO orderPlacer = newOder.getOrderPlacer(); + TpProdOrderChangeApplicantCreatedDTO tpOrderChangeApplicantDTO = new TpProdOrderChangeApplicantCreatedDTO(); + + if (newOder.getIsBackend()) { + tpOrderChangeApplicantDTO.setApplicantNo(userPlaceOrderContext.getBackendUserNo()); + tpOrderChangeApplyDTO.setOrderScene(TpOrderSceneEnum.SALESMAN_OPERATE.getCode()); + } else { + tpOrderChangeApplicantDTO.setApplicantNo(orderPlacer.getPlacerNo()); + tpOrderChangeApplicantDTO.setApplicantName(newOder.getOrderRequirementUser().getRequirementContactName()); + tpOrderChangeApplicantDTO.setApplicantPhone(newOder.getOrderRequirementUser().getRequirementContact()); + tpOrderChangeApplyDTO.setOrderScene(TpOrderSceneEnum.USER_OPERATE.getCode()); + } + + tpOrderChangeApplyDTO.setOrderChangeApplicant(tpOrderChangeApplicantDTO); + tpOrderChangeApplyDTO.setTenantId(tenantId); + List orderChangeItemDTOS = Lists.newCopyOnWriteArrayList(); + + //判断行程类型是否变更 + if (!oldOrder.getProductCategoryNo().equals(newOder.getProductCategoryNo())) { + TpProdOrderChangeItemCreatedDTO tpOrderChangeItemDTO = new TpProdOrderChangeItemCreatedDTO(); + tpOrderChangeItemDTO.setOrderNo(originalOrderNo); + tpOrderChangeItemDTO.setItemType(TRIP_ROUND_CHANGED.getType()); + + TpProdOrderChangeItemFactorCreatedDTO tpOrderChangeItemFactorDTO = new TpProdOrderChangeItemFactorCreatedDTO(); + tpOrderChangeItemFactorDTO.setFactorCode(TRIP_TYPE.getType()); + tpOrderChangeItemFactorDTO.setFactorName(TRIP_TYPE.getDesc()); + tpOrderChangeItemFactorDTO.setOrderNo(originalOrderNo); + tpOrderChangeItemFactorDTO.setBeforeValue(oldOrder.getProductCategoryNo()); + tpOrderChangeItemFactorDTO.setAfterValue(newOder.getProductCategoryNo()); + tpOrderChangeItemFactorDTO.setTenantId(tenantId); + tpOrderChangeItemDTO.setItemFactors(Lists.newArrayList(tpOrderChangeItemFactorDTO)); + tpOrderChangeItemDTO.setTenantId(tenantId); + orderChangeItemDTOS.add(tpOrderChangeItemDTO); + } + + //找出差异项 标的项 根据行程类型 + List newOderSubjectItemList = newOder.getOrderSubjectItem(); + List oldOrderSubjectItemList = oldOrder.getOrderSubjectItem(); + + //行程单 + List newTrip = newOder.getCharterBusStations(); + List oldTrip = oldOrder.getTpOrderTravelTrips(); + + for (TpOrderTripTypeEnum tripTypeEnum : TRIP_TYPE_ENUMS) { + + Collection newItemList = CollectionUtil.filterNew(newOderSubjectItemList, tpOrderSubjectItemDTO -> tripTypeEnum.getCode().equals(tpOrderSubjectItemDTO.getTripType())); + Collection oldItemList = CollectionUtil.filterNew(oldOrderSubjectItemList, tpOrderSubjectItemVO -> tripTypeEnum.getCode().equals(tpOrderSubjectItemVO.getTripType())); + + List tpOrderChangeItemFactorDTOS = Lists.newArrayList(); + if (!(CollectionUtil.isEmpty(newItemList) && CollectionUtil.isEmpty(oldItemList))) { + String newCarInfo = newItemList.stream().map(newItem -> newItem.getName() + "||" + newItem.getCount()).collect(Collectors.joining(";")); + String oldCarInfo = oldItemList.stream().map(oldItem -> oldItem.getName() + "||" + oldItem.getCount()).collect(Collectors.joining(";")); + + + if (!StrUtil.equals(newCarInfo, oldCarInfo)) { + TpProdOrderChangeItemFactorCreatedDTO tpOrderChangeItemFactorDTO = new TpProdOrderChangeItemFactorCreatedDTO(); + tpOrderChangeItemFactorDTO.setFactorCode(CAR_INFO.getType()); + tpOrderChangeItemFactorDTO.setFactorName(CAR_INFO.getDesc()); + //tpOrderChangeItemFactorDTO.setFactorType(); + tpOrderChangeItemFactorDTO.setOrderNo(originalOrderNo); + tpOrderChangeItemFactorDTO.setBeforeValue(oldCarInfo); + tpOrderChangeItemFactorDTO.setAfterValue(newCarInfo); + tpOrderChangeItemFactorDTO.setTenantId(tenantId); + tpOrderChangeItemFactorDTOS.add(tpOrderChangeItemFactorDTO); + } + } + + +// TpOrderSubjectItemDTO newItem = CollectionUtil.findOne(newOderSubjectItem, tpOrderSubjectItemDTO -> tripTypeEnum.getCode().equals(tpOrderSubjectItemDTO.getTripType())); +// TpOrderSubjectItemVO oldItem = CollectionUtil.findOne(oldOrderSubjectItem, tpOrderSubjectItemVO -> tripTypeEnum.getCode().equals(tpOrderSubjectItemVO.getTripType())); +// +// if (newItem == null && oldItem == null) { +// break; +// } + + //TpOrderStationDTO newTripItem = CollectionUtil.findOne(newTrip, tpOrderStationDTO -> tripTypeEnum.getCode().equals(tpOrderStationDTO.getTripType())); + //TpOrderTravelTripVO oldTripItem = CollectionUtil.findOne(oldTrip, tpOrderTravelTripVO -> tripTypeEnum.getCode().equals(tpOrderTravelTripVO.getTripType())); + +// TpOrderStationDTO newTripItem = newItemList.get(0) == null ? new TpOrderStationDTO() : CollectionUtil.findOne(newTrip, tpOrderStationDTO -> tripTypeEnum.getCode().equals(tpOrderStationDTO.getTripType())); +// TpOrderTravelTripVO oldTripItem = oldItemList.get(0) == null ? new TpOrderTravelTripVO() : CollectionUtil.findOne(oldTrip, tpOrderTravelTripVO -> tripTypeEnum.getCode().equals(tpOrderTravelTripVO.getTripType())); + TpOrderStationDTO newTripItem = CollectionUtil.findOne(newTrip, tpOrderStationDTO -> tripTypeEnum.getCode().equals(tpOrderStationDTO.getTripType())); + TpOrderTravelTripVO oldTripItem = CollectionUtil.findOne(oldTrip, tpOrderTravelTripVO -> tripTypeEnum.getCode().equals(tpOrderTravelTripVO.getTripType())); + newTripItem = newTripItem == null ? new TpOrderStationDTO() : newTripItem; + oldTripItem = oldTripItem == null ? new TpOrderTravelTripVO() : oldTripItem; + + Equator equator = new GetterBaseEquator(); + // 获取不同的属性 + TpOrderSubjectItemDTO newOrderSubjectItem = CollectionUtil.isEmpty(newItemList) ? new TpOrderSubjectItemDTO() : CollectionUtil.findOne(newItemList, tpOrderSubjectItemDTO -> tpOrderSubjectItemDTO.getTripType().equals(tripTypeEnum.getCode())); + TpOrderSubjectItemVO oldOrderSubjectItem = CollectionUtil.isEmpty(oldItemList) ? new TpOrderSubjectItemVO() : CollectionUtil.findOne(oldItemList, tpOrderSubjectItemVO -> tpOrderSubjectItemVO.getTripType().equals(tripTypeEnum.getCode())); + List subjectItemDiff = equator.getDiffFields(newOrderSubjectItem, oldOrderSubjectItem); + List busStationsDiff = equator.getDiffFields(newTripItem, oldTripItem); + TpProdOrderChangeItemCreatedDTO tpOrderChangeItemDTO = new TpProdOrderChangeItemCreatedDTO(); + tpOrderChangeItemDTO.setOrderNo(originalOrderNo); + tpOrderChangeItemDTO.setTenantId(tenantId); + tpOrderChangeItemDTO.setItemType(tripTypeEnum == GO ? GO_TRIP_CHANGED.getType() : BACK_TRIP_CHANGED.getType()); + //行程对比 + for (FieldInfo fieldInfo : subjectItemDiff) { + TpOrderChangeItemFactorEnum factorEnum = DIFF_MAP.get(fieldInfo.getFieldName()); + if (factorEnum != null) { + TpProdOrderChangeItemFactorCreatedDTO tpOrderChangeItemFactorDTO = new TpProdOrderChangeItemFactorCreatedDTO(); + tpOrderChangeItemFactorDTO.setFactorCode(factorEnum.getType()); + tpOrderChangeItemFactorDTO.setFactorName(factorEnum.getDesc()); + //tpOrderChangeItemFactorDTO.setFactorType(); + tpOrderChangeItemFactorDTO.setOrderNo(originalOrderNo); + tpOrderChangeItemFactorDTO.setBeforeValue(fieldInfo.getSecondVal() == null ? null : fieldInfo.getSecondVal().toString()); + tpOrderChangeItemFactorDTO.setAfterValue(fieldInfo.getFirstVal() == null ? null : fieldInfo.getFirstVal().toString()); + tpOrderChangeItemFactorDTO.setTenantId(tenantId); + tpOrderChangeItemFactorDTOS.add(tpOrderChangeItemFactorDTO); + } + } + for (FieldInfo fieldInfo : busStationsDiff) { + TpOrderChangeItemFactorEnum factorEnum = DIFF_MAP.get(fieldInfo.getFieldName()); + if (factorEnum != null) { + TpProdOrderChangeItemFactorCreatedDTO tpOrderChangeItemFactorDTO = new TpProdOrderChangeItemFactorCreatedDTO(); + tpOrderChangeItemFactorDTO.setFactorCode(factorEnum.getType()); + tpOrderChangeItemFactorDTO.setFactorName(factorEnum.getDesc()); + //tpOrderChangeItemFactorDTO.setFactorType(); + tpOrderChangeItemFactorDTO.setOrderNo(originalOrderNo); + tpOrderChangeItemFactorDTO.setBeforeValue(fieldInfo.getSecondVal() == null ? null : fieldInfo.getSecondVal().toString()); + tpOrderChangeItemFactorDTO.setAfterValue(fieldInfo.getFirstVal() == null ? null : fieldInfo.getFirstVal().toString()); + tpOrderChangeItemFactorDTO.setTenantId(tenantId); + tpOrderChangeItemFactorDTOS.add(tpOrderChangeItemFactorDTO); + } + } + //途径点对比 + String newWayTrip = CollectionUtil.isEmpty(newTripItem.getPathPoints()) ? "" : newTripItem.getPathPoints().stream().sorted(Comparator.comparing(TpTravelTripPathPointDTO::getIndex)).skip(1).limit(newTripItem.getPathPoints().size() - 2).map(TpTravelTripPathPointDTO::getLocationName).collect(Collectors.joining(";")); + String oldWayTrip = CollectionUtil.isEmpty(oldTripItem.getTripPositions()) ? "" : oldTripItem.getTripPositions().stream().sorted(Comparator.comparing(TpOrderTripPositionVO::getIndex)).skip(1).limit(oldTripItem.getTripPositions().size() - 2).map(TpOrderTripPositionVO::getLocationName).collect(Collectors.joining(";")); + + if (!StrUtil.equals(newWayTrip, oldWayTrip)) { + TpProdOrderChangeItemFactorCreatedDTO tpOrderChangeItemFactorDTO = new TpProdOrderChangeItemFactorCreatedDTO(); + tpOrderChangeItemFactorDTO.setFactorCode(WAY_POINT.getType()); + tpOrderChangeItemFactorDTO.setFactorName(WAY_POINT.getDesc()); + //tpOrderChangeItemFactorDTO.setFactorType(""); + tpOrderChangeItemFactorDTO.setOrderNo(originalOrderNo); + tpOrderChangeItemFactorDTO.setBeforeValue(oldWayTrip); + tpOrderChangeItemFactorDTO.setAfterValue(newWayTrip); + tpOrderChangeItemFactorDTO.setTenantId(tenantId); + tpOrderChangeItemFactorDTOS.add(tpOrderChangeItemFactorDTO); + } + + +// Map newWayTrip = CollStreamUtil.toIdentityMap(pathPoints, TpTravelTripPathPointDTO::getIndex); +// Map oldWayTrip = CollStreamUtil.toIdentityMap(tripPositions, TpOrderTripPositionVO::getIndex); +// int size = Math.max(newWayTrip.size(), oldWayTrip.size()); +// for (int i = 0; i < size; i++) { +// List diffFields = WAY_EQUATOR.getDiffFields(newWayTrip.get(i), oldWayTrip.get(i)); +// if (CollectionUtil.isNotEmpty(diffFields)) { +// TpProdOrderChangeItemFactorCreatedDTO tpOrderChangeItemFactorDTO = new TpProdOrderChangeItemFactorCreatedDTO(); +// tpOrderChangeItemFactorDTO.setFactorCode(WAY_POINT.getType()); +// tpOrderChangeItemFactorDTO.setFactorName(WAY_POINT.getDesc()); +// //tpOrderChangeItemFactorDTO.setFactorType(""); +// tpOrderChangeItemFactorDTO.setOrderNo(originalOrderNo); +// FieldInfo fieldInfo = diffFields.get(0); +// tpOrderChangeItemFactorDTO.setBeforeValue(fieldInfo.getSecondVal() == null ? null : fieldInfo.getSecondVal().toString()); +// tpOrderChangeItemFactorDTO.setAfterValue(fieldInfo.getFirstVal() == null ? null : fieldInfo.getFirstVal().toString()); +// tpOrderChangeItemFactorDTO.setSortIndex(newWayTrip.get(i).getIndex()); +// tpOrderChangeItemFactorDTO.setTenantId(tenantId); +// tpOrderChangeItemFactorDTOS.add(tpOrderChangeItemFactorDTO); +// } +// } + tpOrderChangeItemDTO.setItemFactors(tpOrderChangeItemFactorDTOS); + orderChangeItemDTOS.add(tpOrderChangeItemDTO); + } + tpOrderChangeApplyDTO.setOrderChangeItems(orderChangeItemDTOS); + + TpResult orderChangeApply = orderChangeAcceptanceFacade.createOrderChangeApply(tpOrderChangeApplyDTO); + + if (!orderChangeApply.getData()) { + LogUtil.error("订单申请单创建流程失败, 订单编号:{}, 创建入参:{}", userPlaceOrderContext.getOrderNo(), JSONObject.toJSONString(tpOrderChangeApplicantDTO)); + throw new TpTradeProdException(TpTradeProdErrorCode.CREATE_ORDER_ERROR); + } + + //订单状态需要流转到变更-审核中 + tpOrderClient.pushOrderStatus(TpOrderPushStatusDTO.builder() + .orderNo(userPlaceOrderContext.getCreateDTO().getOrderNo()) + .tenantId(userPlaceOrderContext.getTenantId()) + .tpOrderPushStatusEnum(TpOrderPushStatusEnum.ORDER_CHANGE_AUDITING).build()); + + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/changeorder/TpPrepareOrderNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/changeorder/TpPrepareOrderNode.java new file mode 100644 index 0000000..1a5054f --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/changeorder/TpPrepareOrderNode.java @@ -0,0 +1,86 @@ +package com.deepinnet.tptradeprod.biz.service.flow.changeorder; + +import cn.hutool.core.util.NumberUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpproductcore.common.dto.product.TpProdDetailDTO; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderCreateDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderPayModeEnum; +import com.deepinnet.tptradeprod.common.enums.TpOrderStatusEnum; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderCreateVO; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.google.common.collect.Lists; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Objects; + +/** + *

+ * 创建订单节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "prepareOrderNode", name = "订单准备") +@LiteflowCmpDefine +@RequiredArgsConstructor +public class TpPrepareOrderNode { + + private final static List PAY_AMOUNT_STATUS = Lists.newArrayList(); + + static { + PAY_AMOUNT_STATUS.add(TpOrderStatusEnum.ORDER_NEED_DISPATCH); + PAY_AMOUNT_STATUS.add(TpOrderStatusEnum.ORDER_DEPOSIT_PAID); + PAY_AMOUNT_STATUS.add(TpOrderStatusEnum.ORDER_DISPATCHED); + } + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单准备"); + + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + TpProdOrderCreateDTO createDTO = userPlaceOrderContext.getCreateDTO(); + TpProdOrderDetailVO parentOrderDetail = userPlaceOrderContext.getOrderDetailVO(); + String orderNo = createDTO.getOrderNo(); + createDTO.setParentOrderNo(orderNo); + createDTO.setOrderNo(null); + TpProdOrderDetailVO orderDetailVO = userPlaceOrderContext.getOrderDetailVO(); + createDTO.setPayMode(orderDetailVO.getPayMode()); + createDTO.setOrderTime(orderDetailVO.getOrderTime()); + if (PAY_AMOUNT_STATUS.contains(TpOrderStatusEnum.getTpOrderStatusEnumByStatus(orderDetailVO.getStatus(), orderDetailVO.getType()))) { + createDTO.setPayAmount(orderDetailVO.getPayAmount()); + } else { + String payMode = createDTO.getPayMode(); + if (Objects.equals(TpOrderPayModeEnum.PAY_BEFORE_ALL.getPayMode(), payMode)) { + createDTO.setPayAmount(createDTO.getPayableAmount()); + } + if (Objects.equals(TpOrderPayModeEnum.PAY_BEFORE.getPayMode(), payMode)) { + TpProdDetailDTO productDTO = userPlaceOrderContext.getProductDTO(); + BigDecimal prepayRate = productDTO.getExtendAttributes().getPrepayRate(); + createDTO.setPayAmount(NumberUtil.mul(new BigDecimal(createDTO.getPayableAmount()), prepayRate).toString()); + } + if (Objects.equals(TpOrderPayModeEnum.PAY_AFTER.getPayMode(), payMode)) { + createDTO.setPayAmount("0"); + } + } + //拿到老的行程单id放到新的里面去 +// List tpOrderTravelTrips = orderDetailVO.getTpOrderTravelTrips(); +// Map oldTripMap = CollStreamUtil.toIdentityMap(tpOrderTravelTrips, TpOrderTravelTripVO::getTripType); +// List charterBusStations = createDTO.getCharterBusStations(); +// charterBusStations.forEach(charterBusStation -> charterBusStation.setTripNo(oldTripMap.get(charterBusStation.getTripType()).getTripNo())); + + // 塞入并行询价的内部价金额 + createDTO.getTpOrderPriceRecords().forEach(priceRecord -> priceRecord.setInternalInquireAmount(userPlaceOrderContext.getInternalPrice())); + // 塞入原始下单人 + createDTO.setOrderPlacer(parentOrderDetail.getOrderPlacer()); + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/changeorder/TpQueryOrderChangeAuditNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/changeorder/TpQueryOrderChangeAuditNode.java new file mode 100644 index 0000000..ef9617d --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/changeorder/TpQueryOrderChangeAuditNode.java @@ -0,0 +1,46 @@ +package com.deepinnet.tptradeprod.biz.service.flow.changeorder; + +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderChangeApplyListDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderCreateDTO; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderChangeApplyClient; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; + +/** + *

+ * 创建订单节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "queryOrderChangeAuditNode", name = "查询审批信息") +@LiteflowCmpDefine +@RequiredArgsConstructor +public class TpQueryOrderChangeAuditNode { + + + private final TpOrderChangeApplyClient orderChangeClient; + + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 查询订单变更审批记录"); + + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + TpProdOrderCreateDTO order = userPlaceOrderContext.getCreateDTO(); + + TpProdOrderChangeApplyListDTO query = new TpProdOrderChangeApplyListDTO(); + query.setOriginalOrderNo(order.getOriginalOrderNo()); + query.setTenantId(order.getTenantId()); + userPlaceOrderContext.setOrderChangeApplyList(orderChangeClient.listOrderChangeApplyHistory(query)); + + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/changeorder/TpQueryOrderNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/changeorder/TpQueryOrderNode.java new file mode 100644 index 0000000..ba34a38 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/changeorder/TpQueryOrderNode.java @@ -0,0 +1,81 @@ +package com.deepinnet.tptradeprod.biz.service.flow.changeorder; + +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderCreateDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderQueryDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderStatusEnum; +import com.deepinnet.tptradeprod.common.enums.TpOrderTypeEnum; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.google.common.collect.Lists; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; + +import java.util.List; +import java.util.Objects; + +import static com.deepinnet.tptradecore.common.enums.order.TpOrderModulesEnum.*; +import static com.deepinnet.tptradeprod.common.enums.TpOrderStatusEnum.*; + +/** + *

+ * 创建订单节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "queryOrderNode", name = "查询原订单信息") +@LiteflowCmpDefine +@RequiredArgsConstructor +public class TpQueryOrderNode { + + private final TpOrderClient orderClient; + + private final List CAN_CHANGE_STATUS = Lists.newArrayList(ORDER_NEED_CONFIRM, ORDER_CONFIRMED, ORDER_REJECTED, ORDER_DEPOSIT_NEED_PAY, ORDER_NEED_DISPATCH, ORDER_DISPATCHED, ORDER_DEPOSIT_PAID); + + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 查询订单信息"); + + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + TpProdOrderCreateDTO order = userPlaceOrderContext.getCreateDTO(); + //查询订单信息 + TpProdOrderQueryDTO query = new TpProdOrderQueryDTO(); + query.setOriginalOrderNo(order.getOriginalOrderNo()); + query.setTenantId(userPlaceOrderContext.getTenantId()); + query.setUserNo(order.getUserNo()); + query.setNeedModules(Lists.newArrayList(ORDER_SUBJECT_ITEM.getModule(), ORDER_TRAVEL_TRIP.getModule(), ORDER_PLACER.getModule())); + TpProdOrderDetailVO orderDetail = orderClient.getOrderDetail(query); + if (orderDetail == null) { + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_NOT_FOUND); + } + if (!Objects.equals(orderDetail.getType(), TpOrderTypeEnum.PACKING_ORDER.getType())) {//包车订单才允许修改 + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_CHANGE_ERROR_NOT_ALLOW_TYPE); + } + TpOrderStatusEnum orderStatusEnum = getTpOrderStatusEnumByStatus(orderDetail.getStatus(), orderDetail.getType()); + //订单状态 + if (!CAN_CHANGE_STATUS.contains(orderStatusEnum)) { + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_CHANGE_ERROR_NOT_ALLOW_STATUS); + } + + Long expireTime = orderDetail.getExpireTime(); + if (expireTime <= System.currentTimeMillis()) { + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_CHANGE_ERROR_NOT_ALLOW_TIME); + } + + userPlaceOrderContext.setOrderDetailVO(orderDetail); + + // 塞入当前操作后台人员 + userPlaceOrderContext.setBackendUserNo(order.getOrderPlacer().getBackendPlacerNo()); + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/constants/LiteFlowConstant.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/constants/LiteFlowConstant.java new file mode 100644 index 0000000..6671ea3 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/constants/LiteFlowConstant.java @@ -0,0 +1,248 @@ +package com.deepinnet.tptradeprod.biz.service.flow.constants; + +/** + * @author amos + * @since 2023-10-16 星期五 + **/ +public class LiteFlowConstant { + + public static final String REFUND_TICKET_FLOW = "refundTicketFlow"; + public static final String CALCULATE_REFUND_TICKET_AMOUNT_FLOW = "calculateRefundTicketAmountFlow"; + + public static final String REFUND_AVAILABLE_CHECK_FLOW = "refundAvailableCheckFlow"; + + public static final String REFUND_BUTTON_SHOWABLE_FLOW = "refundButtonShowableFlow"; + + public static final String QUERY_AVAILABLE_REFUND_VOUCHERS = "queryAvailableRefundVouchers"; + + public static final String QUERY_AVAILABLE_RESCHEDULE_VOUCHERS = "queryAvailableRescheduleVouchers"; + + public static final String USER_PLACE_ORDER_FLOW = "userPlaceOrderFlow"; + public static final String USER_CHANGE_ORDER_FLOW = "userChangeOrderFlow"; + + public static final String USER_PLACE_ORDER_CUSTOM_BUS_FLOW = "userPlaceOrderCustomBusFlow"; + + public static final String USER_PLACE_ORDER_CHARTER_BUS_FLOW = "userPlaceOrderCharterBusFlow"; + + public static final String USER_PLACE_ORDER_CARPOOL_BUS_FLOW = "userPlaceOrderCarpoolBusFlow"; + + public static final String USER_PAID_ORDER_FLOW = "userPaidOrderFlow"; + + public static final String USER_RESCHEDULE_FLOW = "userRescheduleFlow"; + + public static final String USER_CHARTER_BUS_PAID_ORDER_FLOW = "userCharterBusPaidOrderFlow"; + + public static final String USER_CARPOOL_BUS_PAID_ORDER_FLOW = "userCarpoolBusPaidOrderFlow"; + + public static final String USER_CHARTER_BUS_CANCEL_ORDER_FLOW = "userCharterBusCancelOrderFlow"; + + /** + * 先付后享 + */ + public static final String USER_PAY_BEFORE_USE_FLOW = "userPayBeforeUseFlow"; + + /** + * 先享后付 + */ + public static final String USER_PAY_AFTER_USE_FLOW = "userPayAfterUseFlow"; + + /** + * 待确认取消订单 + */ + public static final String USER_CANCEL_ORDER_NEED_CONFIRM_FLOW = "userCancelOrderNeedConfirmFlow"; + + /** + * 订金已支付取消订单 + */ + public static final String USER_CANCEL_ORDER_PAID_FLOW = "userCancelOrderPaidFlow"; + + + /** + * 订单确认审核流程 + */ + public static final String ORDER_AUDIT_CONFIRM_FLOW = "orderAuditConfirmFlow"; + + + /** + * 新订单确认审核流程 + */ + public static final String ORDER_CREATE_AUDIT_CONFIRM_FLOW = "orderCreateAuditConfirmFlow"; + + /** + * 订单取消确认审核流程 + */ + public static final String ORDER_CANCEL_AUDIT_CONFIRM_FLOW = "orderCancelAuditConfirmFlow"; + + + /** + * 订单变更确认审核流程 + */ + public static final String ORDER_CHANGE_AUDIT_CONFIRM_FLOW = "orderChangeAuditConfirmFlow"; + + + /** + * 订单取消减免服务费审核确认拒绝流程 + */ + public static final String ORDER_CANCEL_SERVICE_CHARGE_REDUCE_APPROVED_REJECT_FLOW = "orderCancelServiceChargeReduceApprovedRejectFlow"; + + /** + * 订单取消减免服务费审核确认超时流程 + */ + public static final String ORDER_CANCEL_SERVICE_CHARGE_REDUCE_APPROVED_TIMEOUT_FLOW = "orderCancelServiceChargeReduceApprovedTimeOutFlow"; + + /** + * 订单取消减免服务费审核确认通过流程 + */ + public static final String ORDER_CANCEL_SERVICE_CHARGE_REDUCE_APPROVED_SUCCESS_FLOW = "orderCancelServiceChargeReduceApprovedSuccessFlow"; + + /** + * 订单变更减免服务费审核确认拒绝流程 + */ + public static final String ORDER_CHANGE_SERVICE_CHARGE_REDUCE_APPROVED_REJECT_FLOW = "orderChangeServiceChargeReduceApprovedRejectFlow"; + + /** + * 订单变更减免服务费审核确认超时流程 + */ + public static final String ORDER_CHANGE_SERVICE_CHARGE_REDUCE_APPROVED_TIMEOUT_FLOW = "orderChangeServiceChargeReduceApprovedTimeOutFlow"; + + /** + * 订单变更减免服务费审核确认通过流程 + */ + public static final String ORDER_CHANGE_SERVICE_CHARGE_REDUCE_APPROVED_SUCCESS_FLOW = "orderChangeServiceChargeReduceApprovedSuccessFlow"; + + + public static final String ORDER_APPLY_CREATE_FLOW = "orderApplyCreateFlow"; + + public static final String ORDER_CHANGE_APPLY_CREATE_FLOW = "orderChangeApplyCreateFlow"; + + + public static final String ORDER_CREATE_APPLY_CREATE_FLOW = "orderCreateApplyCreateFlow"; + + public static final String ORDER_CANCEL_APPLY_CREATE_FLOW = "orderCancelApplyCreateFlow"; + + public static final String ORDER_END_CHARGE_CONFIRM_FLOW = "orderEndChargeConfirmFlow"; + + + public static final String ORDER_SERVICE_CHARGE_REDUCE_FLOW = "orderServiceChargeReduceConfirmFlow"; + + + /** + * 订金支付流程 + */ + public static final String USER_DEPOSIT_PAID_FLOW = "userCharterBusDepositPaidFlow"; + + /** + * 尾款支付流程 + */ + public static final String USER_BALANCE_PAID_FLOW = "userCharterBusBalancePaidFlow"; + + /** + * 首次审核 确认通过 流程 + */ + public static final String ORDER_AUDIT_FIRST_CONFIRM_FLOW = "orderAuditFirstConfirmFlow"; + + /** + * 变更审核确认流程 + */ + public static final String ORDER_AUDIT_CHANGE_CONFIRM_FLOW = "orderAuditChangeConfirmNoneReductionFlow"; + + /** + * 变更审核确认流程 + */ + public static final String ORDER_AUDIT_CANCEL_CONFIRM_FLOW = "orderAuditCancelConfirmFlow"; + + + /** + * 创建审核确认通过流程 + */ + public static String ORDER_CREATE_CONFIRM_APPROVED_SUCCESS_FLOW = "orderCreateConfirmApprovedSuccessFlow"; + + /** + * 取消审核确认无全额退款流程 + */ + public static String ORDER_CANCEL_CONFIRM_APPROVED_NON_FULL_REDUCTION_FLOW = "orderCancelConfirmApprovedNonFullReductionFlow"; + + /** + * 取消审核确认有全额退款流程 + */ + public static String ORDER_CANCEL_CONFIRM_APPROVED_FULL_REDUCTION_FLOW = "orderCancelConfirmApprovedFullReductionFlow"; + + /** + * 变更审核确认审批通过流程-减免单次变更手续费 + */ + public static String ORDER_CHANGE_CONFIRM_APPROVED_SUCCESS_SINGLE_REDUCTION_FLOW = "orderChangeConfirmApprovedSuccessSingleReductionFlow"; + + /** + * 变更审核确认审批通过流程-不减免手续费 + */ + public static String ORDER_CHANGE_CONFIRM_APPROVED_SUCCESS_NONE_REDUCTION_FLOW = "orderChangeConfirmApprovedSuccessNoneReductionFlow"; + + + /** + * 取消审核确认审批拒绝流程 + */ + public static String ORDER_CANCEL_CONFIRM_APPROVED_REJECT_FLOW = "orderCancelConfirmApprovedRejectFlow"; + + + /** + * 变更审核确认审批拒绝流程 + */ + public static String ORDER_CHANGE_CONFIRM_APPROVED_REJECT_FLOW = "orderChangeConfirmApprovedRejectFlow"; + + + /** + * 创建审核确认审批拒绝流程 + */ + public static String ORDER_CREATE_CONFIRM_APPROVED_REJECT_FLOW = "orderCreateConfirmApprovedRejectFlow"; + + + /** + * 创建审核确认审批拒绝流程 + */ + public static String ORDER_CREATE_CONFIRM_APPROVED_TIMEOUT_FLOW = "orderCreateConfirmApprovedTimeOutFlow"; + + + /** + * 变更审核确认审批拒绝流程 + */ + public static String ORDER_CHANGE_CONFIRM_APPROVED_TIMEOUT_FLOW = "orderChangeConfirmApprovedTimeOutFlow"; + + + /** + * 取消审核确认审批拒绝流程 + */ + public static String ORDER_CANCEL_CONFIRM_APPROVED_TIMEOUT_FLOW = "orderCancelApprovedTimeOutFlow"; + + + /** + * 订单取消服务费减免审核确认流程 + */ + public static String ORDER_CANCEL_SERVICE_CHARGE_REDUCE_CONFIRM_FLOW = "orderCancelServiceChargeReduceConfirmFlow"; + + /** + * 订单变更服务费减免审核确认流程 + */ + public static String ORDER_CHANGE_SERVICE_CHARGE_REDUCE_CONFIRM_FLOW = "orderChangeServiceChargeReduceConfirmFlow"; + public static String ORDER_CANCEL_APPROVED_TIMEOUT_NON_RSC_FLOW = "orderCancelApprovedTimeOutNonRscFlow"; + public static String ORDER_CANCEL_APPROVED_TIMEOUT_FULL_RSC_FLOW = "orderCancelApprovedTimeOutFullRscFlow"; + + /** + * 手动同步行程流程 + */ + public static String ORDER_MANUAL_SYNC_TRIP_FLOW = "orderManualSyncTripFlow"; + + /** + * 取消同步节点 + */ + public static String ORDER_CANCEL_SYNC_TRIP_NODE = "orderManualSyncTripCancelNode"; + + /** + * 更新同步节点 + */ + public static String ORDER_UPDATE_SYNC_TRIP_NODE = "orderManualSyncTripUpdateNode"; + + /** + * 创建同步节点 + */ + public static String ORDER_CREATE_SYNC_TRIP_NODE = "orderManualSyncTripCreateNode"; +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/constants/TpOrderBizErrorConstant.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/constants/TpOrderBizErrorConstant.java new file mode 100644 index 0000000..a3a1022 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/constants/TpOrderBizErrorConstant.java @@ -0,0 +1,39 @@ +package com.deepinnet.tptradeprod.biz.service.flow.constants; + +/** + * @author chenjiaju + * @since 2024-01-3 09:56:07 + **/ +public class TpOrderBizErrorConstant { + + public static final String CREATE_ORDER_ERROR = "CREATE_ORDER_ERROR"; + + public static final String REFUND_ERROR = "REFUND_ERROR"; + + public static final String REFUND_CHECK_ERROR = "REFUND_CHECK_ERROR"; + + public static final String REFUND_BUTTON_SHOWABLE_ERROR = "REFUND_BUTTON_SHOWABLE_ERROR"; + + public static final String QUERY_AVAILABLE_REFUND_VOUCHER = "QUERY_AVAILABLE_REFUND_VOUCHER"; + + public static final String QUERY_AVAILABLE_RESCHEDULE_VOUCHER = "QUERY_AVAILABLE_RESCHEDULE_VOUCHER"; + + public static final String CALCULATE_REFUND_AMOUNT_ERROR = "CALCULATE_REFUND_AMOUNT_ERROR"; + + public static final String CONFIRM_ORDER_ERROR = "CONFIRM_ORDER_ERROR"; + + public static final String REDUCE_SERVICE_CHARGE_ERROR = "REDUCE_SERVICE_CHARGE_ERROR"; + + public static final String CREATE_ORDER_CHANGE_APPLY_ERROR = "CREATE_ORDER_CHANGE_APPLY_ERROR"; + + public static final String PAID_ERROR = "PAID_ERROR"; + + public static final String CHARTER_BUS_CANCEL_ORDER_ERROR = "CHARTER_BUS_CANCEL_ORDER_ERROR"; + + public static final String CHANGE_ORDER_ERROR = "CHANGE_ORDER_ERROR"; + + public static final String MANUAL_SYNC_TRIP_ERROR = "MANUAL_SYNC_TRIP_ERROR"; + + public static final String RESCHEDULE_ORDER_ERROR = "RESCHEDULE_ORDER_ERROR"; + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpOrderAuditConfirmContext.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpOrderAuditConfirmContext.java new file mode 100644 index 0000000..623cb7b --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpOrderAuditConfirmContext.java @@ -0,0 +1,55 @@ +package com.deepinnet.tptradeprod.biz.service.flow.context; + +import com.deepinnet.tptradeprod.common.dto.TpProdOrderAuditConfirmDTO; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderChangeApplyDetailVO; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditVO; +import lombok.Data; + +/** + *

+ * 订单审核确认上下文信息 + *

+ * + * @author xiehuaqiao + * @since 2023/11/21 + */ +@Data +public class TpOrderAuditConfirmContext { + + /** + * 订单确认审核请求对象 + */ + private TpProdOrderAuditConfirmDTO confirmDTO; + + /** + * 审核单详情信息 + */ + private TpProdAuditVO tpProdAuditVO; + + /** + * 全额退手续费审批单 + */ + private TpProdAuditVO rscAuditVO; + + + /** + * 订单变更审核单详情信息 + */ + private TpProdOrderChangeApplyDetailVO orderChangeApplyVO; + + /** + * 订单详情信息 + */ + private TpProdOrderDetailVO orderDetailVO; + + /** + * 当前订单 + */ + private TpProdOrderDetailVO nowOrder; + + /** + * 父订单 + */ + private TpProdOrderDetailVO parentOrder; +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpOrderChangeApplyCreateContext.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpOrderChangeApplyCreateContext.java new file mode 100644 index 0000000..aea89c9 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpOrderChangeApplyCreateContext.java @@ -0,0 +1,37 @@ +package com.deepinnet.tptradeprod.biz.service.flow.context; + +import com.deepinnet.tpconfigcore.common.vo.TpConfigItemVO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderChangeApplyCreatedDTO; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderChangeApplyDetailVO; +import lombok.Data; + +import java.util.List; + +/** + *

+ * 订单变更申请单创建上下文信息 + *

+ * + * @author xiehuaqiao + * @since 2023/11/21 + */ +@Data +public class TpOrderChangeApplyCreateContext { + + /** + * 订单变更申请单创建入参 + */ + private TpProdOrderChangeApplyCreatedDTO orderChangeApplyCreatedDTO; + + /** + * 已经创建且有效的订单变更申请单,如果有不允许在创建 + */ + private TpProdOrderChangeApplyDetailVO originOrderChangeApplyVO; + /** + * 已经创建的订单变更审核单 + */ + private TpProdOrderChangeApplyDetailVO newOrderChangeApplyVO; + + + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpOrderManualSyncTripContext.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpOrderManualSyncTripContext.java new file mode 100644 index 0000000..69a4a66 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpOrderManualSyncTripContext.java @@ -0,0 +1,26 @@ +package com.deepinnet.tptradeprod.biz.service.flow.context; + +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import lombok.Data; + +/** + *

+ * + *

+ * + * @author chenjiaju + * @since 2024/1/10 + */ + +@Data +public class TpOrderManualSyncTripContext { + + private String originalOrderNo; + + private String tenantId; + + private TpProdOrderDetailVO currentOrderDetail; + + private TpProdOrderDetailVO parentOrderDetail; + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpOrderRescheduleContext.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpOrderRescheduleContext.java new file mode 100644 index 0000000..ecca217 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpOrderRescheduleContext.java @@ -0,0 +1,29 @@ +package com.deepinnet.tptradeprod.biz.service.flow.context; + +import com.deepinnet.tptradeprod.common.dto.*; +import lombok.Data; + +/** + * @author amos wong + * @create 2024/7/5 15:34 + * @Description + */ +@Data +public class TpOrderRescheduleContext { + + private String orderNo; + + private String productCode; + + private String tenantId; + + /** + * 改签需要失效的凭证列表 + */ + private TpProdOrderRescheduleInvalidVoucherDTO needInvalidVoucherDTO; + + /** + * 改签支付成功参数 + */ + private TpProdReschedulePaidSuccessDTO reschedulePaidSuccessDTO; +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpOrderServiceChargeReduceContext.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpOrderServiceChargeReduceContext.java new file mode 100644 index 0000000..10851ca --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpOrderServiceChargeReduceContext.java @@ -0,0 +1,58 @@ +package com.deepinnet.tptradeprod.biz.service.flow.context; + +import com.deepinnet.tptradeprod.common.dto.TpProdOrderAuditConfirmDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderServiceChargeReduceConfirmDTO; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderChangeApplyDetailVO; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditVO; +import lombok.Data; + +/** + *

+ * 订单全额减免服务费审批上下文 + *

+ * + * @author xiehuaqiao + * @since 2023/11/21 + */ +@Data +public class TpOrderServiceChargeReduceContext { + + /** + * 全额减免服务费审批入参对象 + */ + private TpProdOrderServiceChargeReduceConfirmDTO reduceDTO; + + /** + * 审核单详情信息 + */ + private TpProdAuditVO tpProdAuditVO; + + + /** + * 首次审核确认时业务员的选择数据 + */ + private TpProdOrderAuditConfirmDTO confirmDTO; + + + /** + * 订单变更审核单详情信息 + */ + private TpProdOrderChangeApplyDetailVO orderChangeApplyVO; + + /** + * 订单详情信息 + */ + private TpProdOrderDetailVO orderDetailVO; + + /** + * 当前订单 + */ + private TpProdOrderDetailVO nowOrder; + + /** + * 父订单 + */ + private TpProdOrderDetailVO parentOrder; + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpRefundTicketApplyContext.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpRefundTicketApplyContext.java new file mode 100644 index 0000000..8067695 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpRefundTicketApplyContext.java @@ -0,0 +1,29 @@ +package com.deepinnet.tptradeprod.biz.service.flow.context; + +import com.deepinnet.tptradeprod.common.dto.TpProdRefundApplyDTO; +import lombok.Data; + +/** + * @author amos wong + * @create 2023/10/16 14:38 + * @Description + */ +@Data +public class TpRefundTicketApplyContext { + + /** + * 申请退票的入参 + */ + private TpProdRefundApplyDTO refundApplyDTO; + + /** + * 退票申请单号 + */ + private String refundApplyOrderNo; + + /** + * 退款结果 + */ + private Boolean refundResult; + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpRescheduleOrderContext.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpRescheduleOrderContext.java new file mode 100644 index 0000000..f35b6eb --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpRescheduleOrderContext.java @@ -0,0 +1,40 @@ +package com.deepinnet.tptradeprod.biz.service.flow.context; + +import com.deepinnet.tpproductcore.common.dto.product.TpProdDetailDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdVoucherDTO; +import com.deepinnet.tptradeprod.common.vo.*; +import lombok.Data; + +import java.util.List; + +/** + * @author amos wong + * @create 2024/7/17 17:21 + * @Description + */ +@Data +public class TpRescheduleOrderContext { + + private String orderNo; + + private String tenantId; + + private String productCode; + + private Long applyTime; + + private List voucherNos; + + private TpProdOrderDetailVO orderDetailVO; + + private List voucherList; + + private TpProdDetailDTO prodDetailDTO; + + private List ruleExpressionList; + + private TpQueryAvailableRescheduleVoucherDTO rescheduleVoucherDTO; + + private String processType; + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpSendEmailContext.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpSendEmailContext.java new file mode 100644 index 0000000..516ed40 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpSendEmailContext.java @@ -0,0 +1,24 @@ +package com.deepinnet.tptradeprod.biz.service.flow.context; + +import com.deepinnet.tpcommoncore.common.service.template.email.TpEmailBaseTemplate; +import lombok.Data; + +/** + * @author amos wong + * @create 2023/11/13 14:47 + * @Description + */ + +@Data +public class TpSendEmailContext { + + /** + * 收件箱 + */ + private String receiveEmail; + + /** + * 邮件模板 + */ + private TpEmailBaseTemplate emailTemplate; +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpSendSmsContext.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpSendSmsContext.java new file mode 100644 index 0000000..37c020c --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpSendSmsContext.java @@ -0,0 +1,24 @@ +package com.deepinnet.tptradeprod.biz.service.flow.context; + +import com.deepinnet.tpcommoncore.common.service.template.sms.user.TpSmsBaseTemplate; +import lombok.Data; + +/** + * @author amos wong + * @create 2023/11/13 14:47 + * @Description + */ + +@Data +public class TpSendSmsContext { + + /** + * 待发送的手机号 + */ + private String mobile; + + /** + * 短信模板 + */ + private TpSmsBaseTemplate smsTemplate; +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpUserCancelOrderContext.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpUserCancelOrderContext.java new file mode 100644 index 0000000..f452d35 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpUserCancelOrderContext.java @@ -0,0 +1,43 @@ +package com.deepinnet.tptradeprod.biz.service.flow.context; + +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import lombok.Data; + +/** + *

+ * 用户取消订单下文信息 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ +@Data +public class TpUserCancelOrderContext { + + /** + * 订单编号 + */ + private String orderNo; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 是否为B端用户操作 + * true-B端用户操作 | false-C端用户操作 + */ + private Boolean backendUserOperation = Boolean.FALSE; + + /** + * 后台操作人员编号 + */ + private String backendUserNo; + + /** + * 订单详情 + */ + private TpProdOrderDetailVO orderDetail; + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpUserPlaceOrderContext.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpUserPlaceOrderContext.java new file mode 100644 index 0000000..2f18f51 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/context/TpUserPlaceOrderContext.java @@ -0,0 +1,121 @@ +package com.deepinnet.tptradeprod.biz.service.flow.context; + +import com.deepinnet.tpproductcore.common.dto.product.TpProdDetailDTO; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.vo.*; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +/** + *

+ * 用户下单上下文信息 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ +@Data +public class TpUserPlaceOrderContext { + + /** + * 订单编号 + */ + private String orderNo; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 用户 + */ + private String userNo; + + /** + * 支付时间 + */ + private Long payTime; + + /** + * 业务类型 + */ + private String bizType; + + /** + * 需支付金额 + */ + private String payAmount; + + /** + * 收银台地址 + */ + private String payCashierUrl; + + /** + * 是否自动审核(无需审核时自动审核) + */ + private Boolean autoAudit; + + /** + * 是否是变更订单 + */ + private boolean isChangeOrder; + + /** + * 订单变更是否需要审核 + */ + private Boolean changeOrderNeedAudit; + + /** + * 订金支付比例 + */ + private BigDecimal percentage; + + /** + * 创建订单dto + */ + private TpProdOrderCreateDTO createDTO; + + /** + * 产品详情dto + */ + private TpProdDetailDTO productDTO; + + /** + * 订单详情 + */ + private TpProdOrderDetailVO orderDetailVO; + + /** + * 内部价 + */ + private String internalPrice; + + /** + * 后台人员编号 + */ + private String backendUserNo; + + /** + * 订单改签上下文 + */ + private TpOrderRescheduleContext orderRescheduleContext; + + /** + * 订单变更审核记录 + */ + private List orderChangeApplyList; + + /** + * 改签参数 + */ + private TpProdOrderRescheduleDTO orderRescheduleDTO; + + /** + * 处理流程类型 + */ + private String processType; +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/manager/LiteFlowManager.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/manager/LiteFlowManager.java new file mode 100644 index 0000000..9d897f8 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/manager/LiteFlowManager.java @@ -0,0 +1,599 @@ +package com.deepinnet.tptradeprod.biz.service.flow.manager; + +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson2.JSONObject; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpbaseopcore.common.dto.account.AccountDTO; +import com.deepinnet.tpproductcore.common.dto.product.TpProdDetailDTO; +import com.deepinnet.tptradecore.common.dto.order.TpOrderChargeRecordDTO; +import com.deepinnet.tptradecore.common.dto.order.TpOrderPushStatusDTO; +import com.deepinnet.tptradecore.common.enums.order.*; +import com.deepinnet.tptradeprod.biz.service.flow.constants.LiteFlowConstant; +import com.deepinnet.tptradeprod.biz.service.flow.context.*; +import com.deepinnet.tptradeprod.biz.service.flow.refundTicket.context.*; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.enums.*; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.TpAccountClient; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.vo.*; +import com.google.common.collect.Lists; +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.flow.LiteflowResponse; +import org.apache.commons.collections4.CollectionUtils; +import org.jetbrains.annotations.NotNull; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +import java.util.List; + +import static com.deepinnet.tptradeprod.biz.service.flow.constants.TpOrderBizErrorConstant.*; + +/** + * @author amos wong + * @create 2023/10/16 14:22 + * @Description + */ +@Service +public class LiteFlowManager { + + @Resource + private FlowExecutor flowExecutor; + + @Resource + private RedissonClient redissonClient; + + @Resource + private TpOrderClient tpOrderClient; + + @Resource + private TpAccountClient tpAccountClient; + + public String refundTicket(TpProdRefundApplyDTO refundApplyDTO) { + TpRefundTicketCommonContext commonContext = new TpRefundTicketCommonContext(); + TpRefundTicketApplyContext context = new TpRefundTicketApplyContext(); + TpRefundTicketCommonRequest commonRequest = new TpRefundTicketCommonRequest(); + commonRequest.setOrderNo(refundApplyDTO.getOrderNo()); + commonRequest.setTenantId(refundApplyDTO.getTenantId()); + commonRequest.setUserNo(refundApplyDTO.getUserNo()); + commonRequest.setApplyTime(refundApplyDTO.getApplyTime()); + commonRequest.setProductCategoryNo(refundApplyDTO.getProductCategoryNo()); + commonRequest.setProductNo(refundApplyDTO.getProductCode()); + commonRequest.setTripType(refundApplyDTO.getTripType()); + + context.setRefundApplyDTO(refundApplyDTO); + commonContext.setProcessType(TpFlowProcessTypeEnum.REFUND_TICKET); + commonContext.setRefundTicketApplyContext(context); + commonContext.setCommonRequest(commonRequest); + + LiteflowResponse response = flowExecutor.execute2Resp(LiteFlowConstant.REFUND_TICKET_FLOW, null, commonContext); + checkResponseResult(response, REFUND_ERROR); + return context.getRefundApplyOrderNo(); + } + + public TpProdCalculateRefundAmountVO calculateRefundTicketAmount(TpProdCalculateRefundAmountDTO calculateRefundAmountDTO) { + TpRefundTicketCommonContext commonContext = new TpRefundTicketCommonContext(); + TpCalculateRefundAmountContext context = new TpCalculateRefundAmountContext(); + context.setCalculateRefundAmountDTO(calculateRefundAmountDTO); + + TpRefundTicketCommonRequest commonRequest = new TpRefundTicketCommonRequest(); + commonRequest.setOrderNo(calculateRefundAmountDTO.getOrderNo()); + commonRequest.setTenantId(calculateRefundAmountDTO.getTenantId()); + commonRequest.setUserNo(calculateRefundAmountDTO.getUserNo()); + commonRequest.setProductNo(calculateRefundAmountDTO.getProductNo()); + commonRequest.setTripType(calculateRefundAmountDTO.getTripType()); + + commonContext.setCalculateRefundAmountContext(context); + commonContext.setProcessType(TpFlowProcessTypeEnum.CALCULATE_REFUND_AMOUNT); + commonContext.setCommonRequest(commonRequest); + + LiteflowResponse response = flowExecutor.execute2Resp(LiteFlowConstant.CALCULATE_REFUND_TICKET_AMOUNT_FLOW, null, commonContext); + checkResponseResult(response, CALCULATE_REFUND_AMOUNT_ERROR); + return context.getCalculateRefundAmountVO(); + } + + public Boolean refundAvailableCheck(TpProdRefundAvailableCheckDTO refundAvailableCheckDTO) { + TpRefundTicketCommonContext commonContext = new TpRefundTicketCommonContext(); + + TpRefundTicketCheckContext checkContext = new TpRefundTicketCheckContext(); + checkContext.setRefundAvailableCheckDTO(refundAvailableCheckDTO); + + TpRefundTicketCommonRequest commonRequest = new TpRefundTicketCommonRequest(); + commonRequest.setProductNo(refundAvailableCheckDTO.getProductCode()); + commonRequest.setUserNo(refundAvailableCheckDTO.getUserNo()); + commonRequest.setTenantId(refundAvailableCheckDTO.getTenantId()); + commonRequest.setOrderNo(refundAvailableCheckDTO.getOrderNo()); + commonRequest.setApplyTime(System.currentTimeMillis()); + + commonContext.setProcessType(TpFlowProcessTypeEnum.REFUND_TICKET_CHECK); + commonContext.setRefundTicketCheckContext(checkContext); + commonContext.setCommonRequest(commonRequest); + LiteflowResponse response = flowExecutor.execute2Resp(LiteFlowConstant.REFUND_AVAILABLE_CHECK_FLOW, null, commonContext); + checkResponseResult(response, REFUND_CHECK_ERROR); + return response.isSuccess(); + } + + public TpQueryAvailableRescheduleVoucherDTO queryAvailableRescheduleVoucherList(TpProdQueryAvailableRescheduleVoucherDTO queryAvailableRescheduleVoucherDTO) { + TpRescheduleOrderContext rescheduleOrderContext = new TpRescheduleOrderContext(); + rescheduleOrderContext.setOrderNo(queryAvailableRescheduleVoucherDTO.getOrderNo()); + rescheduleOrderContext.setTenantId(queryAvailableRescheduleVoucherDTO.getTenantId()); + rescheduleOrderContext.setProductCode(queryAvailableRescheduleVoucherDTO.getProductCode()); + rescheduleOrderContext.setTenantId(queryAvailableRescheduleVoucherDTO.getTenantId()); + rescheduleOrderContext.setApplyTime(queryAvailableRescheduleVoucherDTO.getApplyTime()); + rescheduleOrderContext.setOrderDetailVO(queryAvailableRescheduleVoucherDTO.getOrderDetailVO()); + rescheduleOrderContext.setProcessType(queryAvailableRescheduleVoucherDTO.getProcessType()); + rescheduleOrderContext.setVoucherNos(queryAvailableRescheduleVoucherDTO.getVoucherNos()); + LiteflowResponse response = flowExecutor.execute2Resp(LiteFlowConstant.QUERY_AVAILABLE_RESCHEDULE_VOUCHERS, null, rescheduleOrderContext); + checkResponseResult(response, QUERY_AVAILABLE_RESCHEDULE_VOUCHER); + return rescheduleOrderContext.getRescheduleVoucherDTO(); + } + + public Boolean checkRefundTicketButtonShowable(TpProdShowRefundButtonCheckDTO showRefundButtonCheckDTO) { + TpRefundTicketCommonContext commonContext = new TpRefundTicketCommonContext(); + + TpRefundTicketButtonShowableContext showableContext = new TpRefundTicketButtonShowableContext(); + showableContext.setShowRefundButtonCheckDTO(showRefundButtonCheckDTO); + + TpRefundTicketCommonRequest commonRequest = new TpRefundTicketCommonRequest(); + commonRequest.setProductNo(showRefundButtonCheckDTO.getProductCode()); + commonRequest.setUserNo(showRefundButtonCheckDTO.getUserNo()); + commonRequest.setTenantId(showRefundButtonCheckDTO.getTenantId()); + commonRequest.setOrderNo(showRefundButtonCheckDTO.getOrderNo()); + commonRequest.setApplyTime(System.currentTimeMillis()); + + commonContext.setProcessType(TpFlowProcessTypeEnum.REFUND_BUTTON_SHOWABLE); + commonContext.setTicketButtonShowableContext(showableContext); + commonContext.setCommonRequest(commonRequest); + LiteflowResponse response = flowExecutor.execute2Resp(LiteFlowConstant.REFUND_BUTTON_SHOWABLE_FLOW, null, commonContext); + checkResponseResult(response, REFUND_BUTTON_SHOWABLE_ERROR); + return commonContext.getTicketButtonShowableContext().getShowable(); + } + + public List queryAvailableRefundVouchers(TpProdQueryAvailableRefundVoucherDTO queryDTO) { + TpRefundTicketCommonContext commonContext = new TpRefundTicketCommonContext(); + TpQueryAvailableVoucherContext queryAvailableVoucherContext = new TpQueryAvailableVoucherContext(); + queryAvailableVoucherContext.setQueryDTO(queryDTO); + + TpRefundTicketCommonRequest commonRequest = new TpRefundTicketCommonRequest(); + commonRequest.setProductNo(queryDTO.getProductNo()); + commonRequest.setApplyTime(System.currentTimeMillis()); + commonRequest.setTenantId(queryDTO.getTenantId()); + commonRequest.setOrderNo(queryDTO.getOrderNo()); + commonContext.setCommonRequest(commonRequest); + + commonContext.setProcessType(TpFlowProcessTypeEnum.QUERY_AVAILABLE_REFUND_VOUCHER); + commonContext.setQueryAvailableVoucherContext(queryAvailableVoucherContext); + commonContext.setCommonRequest(commonRequest); + LiteflowResponse response = flowExecutor.execute2Resp(LiteFlowConstant.QUERY_AVAILABLE_REFUND_VOUCHERS, null, commonContext); + + List availableRefundVoucherList = queryAvailableVoucherContext.getAvailableRefundVoucherList(); + List needRemoveVoucherList = Lists.newArrayList(); + List ruleCheckResultList = queryAvailableVoucherContext.getRuleCheckResultList(); + + if (CollectionUtils.isEmpty(availableRefundVoucherList)) { + return null; + } + + // 不需要经过规则域的退票时间校验 + if (CollectionUtils.isEmpty(ruleCheckResultList)) { + return availableRefundVoucherList; + } + + for (int i = 0; i < ruleCheckResultList.size(); i++) { + Boolean checkResult = ruleCheckResultList.get(i); + if (!checkResult) { + TpProdVoucherDTO voucherDTO = availableRefundVoucherList.get(i); + needRemoveVoucherList.add(voucherDTO); + } + } + + if (CollectionUtils.isNotEmpty(needRemoveVoucherList)) { + availableRefundVoucherList.removeAll(needRemoveVoucherList); + } + + return availableRefundVoucherList; + } + + + /** + * 创建订单流程执行入口 + *

+ * 流程一: 下单 -> 产品信息校验 -> 是否需要询价 -> 是 —> 创建订单 -> 冻结库存 -> 结束 + *

+ *

+ * 流程二: 下单 -> 产品信息校验 -> 是否需要询价 -> 否 -> 创建订单 -> 冻结库存 -> 推进订单支付状态 -> 生成凭证 -> 扣减库存 -> 结束 + *

+ * + * @param createDTO 创建订单参数 + * @return 创建订单后返回订单编号 + */ + public TpProdOrderCreateVO createOrder(TpProdOrderCreateDTO createDTO) { + TpUserPlaceOrderContext tpUserPlaceOrderContext = new TpUserPlaceOrderContext(); + tpUserPlaceOrderContext.setCreateDTO(createDTO); + LiteflowResponse response = flowExecutor.execute2Resp(LiteFlowConstant.USER_PLACE_ORDER_FLOW, null, tpUserPlaceOrderContext); + + // 校验执行结果 + checkResponseResult(response, CREATE_ORDER_ERROR); + + TpProdOrderCreateVO tpProdOrderCreateVO = new TpProdOrderCreateVO(); + tpProdOrderCreateVO.setOrderNo(createDTO.getOrderNo()); + tpProdOrderCreateVO.setOriginalOrderNo(createDTO.getOriginalOrderNo()); + tpProdOrderCreateVO.setFee(createDTO.getPayAmount()); + tpProdOrderCreateVO.setPayableAmount(createDTO.getPayableAmount()); + tpProdOrderCreateVO.setCreateTime(createDTO.getOrderTime()); + tpProdOrderCreateVO.setPayCashierUrl(tpUserPlaceOrderContext.getPayCashierUrl()); + return tpProdOrderCreateVO; + } + + /** + * 订单确认审核执行入口 + * + * @param confirmDTO 创建订单参数 + * @return 创建订单后返回订单编号 + */ + public Boolean confirmOrder(TpProdOrderAuditConfirmDTO confirmDTO) { + String lockBizNo = confirmDTO.getOriginalOrderNo() + ":" + confirmDTO.getTenantId() + ":co"; + RLock lock = redissonClient.getLock(lockBizNo); + boolean tryLock = lock.tryLock(); + // 判断是否获取到当锁 + if (!tryLock) { + LogUtil.error("重复提交:{}", JSONObject.toJSONString(confirmDTO)); + throw new TpTradeProdException(TpTradeProdErrorCode.IDEMPOTENT_REQUEST_ERROR); + } + + try { + LogUtil.info("获取到订单审核锁,锁定业务单号:{}", lockBizNo); + if (StrUtil.isEmpty(confirmDTO.getReductionServiceChargeType())) { + confirmDTO.setReductionServiceChargeType(TpOrderReductionServiceChargeTypeEnum.NON_REDUCTION.getBizType()); + } + TpOrderAuditConfirmContext tpOrderAuditConfirmContext = new TpOrderAuditConfirmContext(); + tpOrderAuditConfirmContext.setConfirmDTO(confirmDTO); + + LiteflowResponse response = flowExecutor.execute2Resp(LiteFlowConstant.ORDER_AUDIT_CONFIRM_FLOW, null, tpOrderAuditConfirmContext, new TpSendSmsContext()); + // 校验执行结果 + checkResponseResult(response, CONFIRM_ORDER_ERROR); + return Boolean.TRUE; + } catch (Exception e) { + LogUtil.error("订单确认审核失败:", e); + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_AUDIT_CONFIRM_ERROR); + } finally { + // 释放锁 + if (lock.isLocked() && lock.isHeldByCurrentThread()) { + lock.unlock(); + } + } + + } + + /** + * 减免手续费处理流程 + * + * @param reduceDTO 创建订单参数 + * @return 处理结果 + */ + public Boolean reduceFullServiceCharge(TpProdOrderServiceChargeReduceConfirmDTO reduceDTO) { + String lockBizNo = reduceDTO.getOriginalOrderNo() + ":" + reduceDTO.getTenantId() + ":rsc"; + RLock lock = redissonClient.getLock(lockBizNo); + boolean tryLock = lock.tryLock(); + // 判断是否获取到当锁 + if (!tryLock) { + LogUtil.error("重复提交:{}", JSONObject.toJSONString(reduceDTO)); + throw new TpTradeProdException(TpTradeProdErrorCode.IDEMPOTENT_REQUEST_ERROR); + } + + try { + LogUtil.info("获取到锁,锁定对象:{}", lockBizNo); + TpOrderServiceChargeReduceContext serviceChargeReduceContext = new TpOrderServiceChargeReduceContext(); + serviceChargeReduceContext.setReduceDTO(reduceDTO); + LiteflowResponse response = flowExecutor.execute2Resp(LiteFlowConstant.ORDER_SERVICE_CHARGE_REDUCE_FLOW, null, serviceChargeReduceContext); + // 校验执行结果 + checkResponseResult(response, REDUCE_SERVICE_CHARGE_ERROR); + + return Boolean.TRUE; + } catch (Exception e) { + LogUtil.error("全额减免服务费审核处理失败:", e); + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_FULL_RSC_AUDIT_CONFIRM_ERROR); + } finally { + // 释放锁 + if (lock.isLocked() && lock.isHeldByCurrentThread()) { + lock.unlock(); + } + } + + } + + public Boolean createOrderChangeApply(TpProdOrderChangeApplyCreatedDTO orderChangeApplyCreatedDTO) { + + String lockBizNo = orderChangeApplyCreatedDTO.getOriginalOrderNo() + ":" + orderChangeApplyCreatedDTO.getApplyType(); + RLock lock = redissonClient.getLock(lockBizNo); + boolean tryLock = lock.tryLock(); + // 判断是否获取到当锁 + if (!tryLock) { + LogUtil.error("重复提交:{}", JSONObject.toJSONString(orderChangeApplyCreatedDTO)); + throw new TpTradeProdException(TpTradeProdErrorCode.IDEMPOTENT_REQUEST_ERROR); + } + + try { + LogUtil.info("创单组件获取到锁,锁定对象:{}", lockBizNo); + if (StrUtil.isEmpty(orderChangeApplyCreatedDTO.getApplyStatus())) { + orderChangeApplyCreatedDTO.setApplyStatus(TpOrderChangeApplyStatusEnum.WAITING_APPROVED.getType()); + } + if (orderChangeApplyCreatedDTO.getApplyTime() == null) { + orderChangeApplyCreatedDTO.setApplyTime(DateUtil.current()); + } + if (orderChangeApplyCreatedDTO.getOrderChangeApplicant() == null) { + TpProdOrderChangeApplicantCreatedDTO orderChangeApplicant = new TpProdOrderChangeApplicantCreatedDTO(); + orderChangeApplicant.setApplicantNo("sysadmin"); + orderChangeApplicant.setApplicantName("sysadmin"); + orderChangeApplyCreatedDTO.setOrderChangeApplicant(orderChangeApplicant); + } + //如果是B端用户,填充名称、手机号 + if (StrUtil.equals(orderChangeApplyCreatedDTO.getOrderScene(), TpOrderSceneEnum.SALESMAN_OPERATE.getCode())) { + TpProdOrderChangeApplicantCreatedDTO orderChangeApplicantCreatedDTO = orderChangeApplyCreatedDTO.getOrderChangeApplicant(); + AccountDTO accountDTO = tpAccountClient.getByAccountId(Long.parseLong(orderChangeApplicantCreatedDTO.getApplicantNo())); + if (accountDTO != null) { + orderChangeApplicantCreatedDTO.setApplicantName(accountDTO.getName()); + orderChangeApplicantCreatedDTO.setApplicantPhone(accountDTO.getPhone()); + } + } + TpOrderChangeApplyCreateContext orderChangeApplyCreateContext = new TpOrderChangeApplyCreateContext(); + orderChangeApplyCreateContext.setOrderChangeApplyCreatedDTO(orderChangeApplyCreatedDTO); + LiteflowResponse response = flowExecutor.execute2Resp(LiteFlowConstant.ORDER_APPLY_CREATE_FLOW, null, orderChangeApplyCreateContext); + // 校验执行结果 + checkResponseResult(response, CREATE_ORDER_CHANGE_APPLY_ERROR); + return Boolean.TRUE; + } catch (Exception e) { + LogUtil.error("创建订单变更申请单失败:", e); + return Boolean.FALSE; + } finally { + // 释放锁 + if (lock.isLocked() && lock.isHeldByCurrentThread()) { + lock.unlock(); + } + } + } + + /** + * 用户支付成功执行流程入口 + * 流程:推进订单支付状态 -> 生成凭证 -> 扣减库存 -> 结束 + * + * @param tpProdOrderPaidDTO 支付成功入参 + */ + public void paid(TpProdOrderPaidDTO tpProdOrderPaidDTO, TpProdOrderDetailVO orderDetail, TpProdDetailDTO productDetailDTO) { + TpUserPlaceOrderContext tpUserPlaceOrderContext = buildPaidFlowContext(tpProdOrderPaidDTO, orderDetail, productDetailDTO); + TpOrderTypeEnum orderBizTypeEnum = TpOrderTypeEnum.getBizTypeByCode(orderDetail.getType()); + if (ObjectUtil.isNull(orderBizTypeEnum)) { + LogUtil.error("未知的业务类型"); + throw new TpTradeProdException(TpTradeProdErrorCode.PRODUCT_BUSINESS_TYPE_ERROR); + } + + LiteflowResponse response; + + switch (orderBizTypeEnum) { + case CUSTOMIZED_ORDER: + response = flowExecutor.execute2Resp(LiteFlowConstant.USER_PAID_ORDER_FLOW, null, tpUserPlaceOrderContext); + break; + case PACKING_ORDER: + response = flowExecutor.execute2Resp(LiteFlowConstant.USER_CHARTER_BUS_PAID_ORDER_FLOW, null, tpUserPlaceOrderContext); + break; + case CARPOOL_ORDER: + response = flowExecutor.execute2Resp(LiteFlowConstant.USER_CARPOOL_BUS_PAID_ORDER_FLOW, null, tpUserPlaceOrderContext); + break; + default: + LogUtil.error("当前订单:{}, 类型错误, 未分配流程引擎", orderDetail.getOrderNo()); + throw new TpTradeProdException(TpTradeProdErrorCode.PRODUCT_BUSINESS_TYPE_ERROR); + } + + // 校验执行结果 + checkResponseResult(response, PAID_ERROR); + } + + @NotNull + private static TpUserPlaceOrderContext buildPaidFlowContext(TpProdOrderPaidDTO tpProdOrderPaidDTO, TpProdOrderDetailVO orderDetail, TpProdDetailDTO productDetailDTO) { + TpUserPlaceOrderContext tpUserPlaceOrderContext = new TpUserPlaceOrderContext(); + tpUserPlaceOrderContext.setOrderNo(orderDetail.getOrderNo()); + tpUserPlaceOrderContext.setTenantId(tpProdOrderPaidDTO.getTenantId()); + tpUserPlaceOrderContext.setPayTime(tpProdOrderPaidDTO.getPayTime()); + tpUserPlaceOrderContext.setBizType(tpProdOrderPaidDTO.getBizType()); + tpUserPlaceOrderContext.setOrderDetailVO(orderDetail); + tpUserPlaceOrderContext.setProductDTO(productDetailDTO); + return tpUserPlaceOrderContext; + } + + /** + * 预约包车取消订单 + * + * @param dto 取消订单入参 + */ + public Boolean charterBusCancelOrder(TpOrderCancelDTO dto) { + // 查询订单详情 查询包车订单 + TpProdOrderDetailVO orderDetail = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .originalOrderNo(dto.getOriginalOrderNo()) + .tenantId(dto.getTenantId()) + .needModules(ListUtil.toList(TpOrderModulesEnum.ORDER_TRAVEL_TRIP.getModule(), TpOrderModulesEnum.ORDER_PLACER.getModule(), TpOrderModulesEnum.ORDER_REQUIREMENT_USER.getModule())).build()); + + if (orderDetail.getStatus().compareTo(TpOrderStatusEnum.ORDER_CHANGE_AUDITED.getStatus()) <= 0 + && orderDetail.getStatus().compareTo(TpOrderStatusEnum.ORDER_TRIP_START.getStatus()) >= 0) { + LogUtil.error("当前订单:{}, 无法取消, 订单状态:{}", orderDetail.getOrderNo(), orderDetail.getStatus()); + throw new TpTradeProdException(TpTradeProdErrorCode.INVALID_ORDER_STATUS); + } + + Long expireTime = orderDetail.getExpireTime(); + if (expireTime <= System.currentTimeMillis()) { + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_CANCEL_ERROR_NOT_ALLOW_TIME); + } + + // 当前订单如为待确认,取消订单无需判断是否需审核,直接更改为取消 + if (ObjectUtil.equals(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_NEED_CONFIRM.getStatus()) + || ObjectUtil.equals(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_DEPOSIT_NEED_PAY.getStatus())) { + + // 新增取消的价格记录 + tpOrderClient.saveChargeRecord(buildSaveChargeRecordDTO(orderDetail, dto.getTenantId())); + + // 取消订单 + tpOrderClient.pushOrderStatus(TpOrderPushStatusDTO.builder() + .orderNo(orderDetail.getOrderNo()) + .tenantId(dto.getTenantId()) + .tpOrderPushStatusEnum(TpOrderPushStatusEnum.ORDER_CANCELED).build()); + + return Boolean.TRUE; + } + + TpUserCancelOrderContext tpUserCancelOrderContext = new TpUserCancelOrderContext(); + tpUserCancelOrderContext.setOrderNo(orderDetail.getOrderNo()); + tpUserCancelOrderContext.setOrderDetail(orderDetail); + tpUserCancelOrderContext.setBackendUserOperation(dto.getBackendUserOperation()); + tpUserCancelOrderContext.setBackendUserNo(dto.getBackendUserNo()); + tpUserCancelOrderContext.setTenantId(dto.getTenantId()); + + LiteflowResponse response = flowExecutor.execute2Resp(LiteFlowConstant.USER_CHARTER_BUS_CANCEL_ORDER_FLOW, null, tpUserCancelOrderContext); + + // 校验执行结果 + checkResponseResult(response, CHARTER_BUS_CANCEL_ORDER_ERROR); + + return Boolean.TRUE; + } + + private static TpOrderChargeRecordDTO buildSaveChargeRecordDTO(TpProdOrderDetailVO orderDetail, String tenantId) { + TpOrderChargeRecordDTO tpOrderChargeRecordDTO = new TpOrderChargeRecordDTO(); + tpOrderChargeRecordDTO.setOrderNo(orderDetail.getOrderNo()); + tpOrderChargeRecordDTO.setOriginalOrderNo(orderDetail.getOriginalOrderNo()); + tpOrderChargeRecordDTO.setBizType(TpAuditOrChangePriceBizTypeEnum.CANCEL_ORDER.getBizType()); + tpOrderChargeRecordDTO.setTenantId(tenantId); + return tpOrderChargeRecordDTO; + } + + public TpProdOrderEndorseCreateVO changeOrder(TpProdOrderCreateDTO createDTO) { + TpUserPlaceOrderContext tpUserPlaceOrderContext = new TpUserPlaceOrderContext(); + tpUserPlaceOrderContext.setCreateDTO(createDTO); + tpUserPlaceOrderContext.setOrderNo(createDTO.getOrderNo()); + tpUserPlaceOrderContext.setTenantId(createDTO.getTenantId()); + tpUserPlaceOrderContext.setUserNo(createDTO.getUserNo()); + tpUserPlaceOrderContext.setPayAmount(createDTO.getPayAmount()); + tpUserPlaceOrderContext.setChangeOrder(true); + LiteflowResponse response = flowExecutor.execute2Resp(LiteFlowConstant.USER_CHANGE_ORDER_FLOW, null, tpUserPlaceOrderContext); + // 校验执行结果 + checkResponseResult(response, CHANGE_ORDER_ERROR); + TpProdOrderEndorseCreateVO tpProdOrderEndorseCreateVO = new TpProdOrderEndorseCreateVO(); + tpProdOrderEndorseCreateVO.setOrderNo(tpUserPlaceOrderContext.getOrderNo()); + tpProdOrderEndorseCreateVO.setOriginalOrderNo(createDTO.getOriginalOrderNo()); + tpProdOrderEndorseCreateVO.setFee(createDTO.getPayAmount()); + tpProdOrderEndorseCreateVO.setCreateTime(createDTO.getOrderTime()); + tpProdOrderEndorseCreateVO.setPayCashierUrl(tpUserPlaceOrderContext.getPayCashierUrl()); + return tpProdOrderEndorseCreateVO; + } + + private TpOrderChargeRecordDTO buildRemoveChargeRecord(String orderNo, String tenantId, String bizType) { + TpOrderChargeRecordDTO tpOrderChargeRecordDTO = new TpOrderChargeRecordDTO(); + tpOrderChargeRecordDTO.setOrderNo(orderNo); + tpOrderChargeRecordDTO.setBizType(bizType); + tpOrderChargeRecordDTO.setTenantId(tenantId); + return tpOrderChargeRecordDTO; + } + + private void checkResponseResult(LiteflowResponse response, String bizError) { + if (!response.isSuccess()) { + Exception cause = response.getCause(); + LogUtil.error("异常堆栈信息:{}", cause); + if (cause instanceof TpTradeProdException) { + throw (TpTradeProdException) cause; + } else { + exceptionBizCheck(bizError); + } + } + } + + private static void exceptionBizCheck(String bizError) { + switch (bizError) { + case CREATE_ORDER_ERROR: + throw new TpTradeProdException(TpTradeProdErrorCode.BUY_ERROR); + case REFUND_ERROR: + throw new TpTradeProdException(TpTradeProdErrorCode.REFUND_ERROR); + case CALCULATE_REFUND_AMOUNT_ERROR: + throw new TpTradeProdException(TpTradeProdErrorCode.CALCULATE_REFUND_AMOUNT_ERROR); + case REFUND_CHECK_ERROR: + throw new TpTradeProdException(TpTradeProdErrorCode.REFUND_CHECK_ERROR); + case REFUND_BUTTON_SHOWABLE_ERROR: + throw new TpTradeProdException(TpTradeProdErrorCode.REFUND_BUTTON_SHOWABLE_ERROR); + case CONFIRM_ORDER_ERROR: + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_AUDIT_CONFIRM_ERROR); + case REDUCE_SERVICE_CHARGE_ERROR: + throw new TpTradeProdException(TpTradeProdErrorCode.REDUCE_SERVICE_CHARGE_ERROR); + case CREATE_ORDER_CHANGE_APPLY_ERROR: + throw new TpTradeProdException(TpTradeProdErrorCode.CREATE_ORDER_CHANGE_APPLY_ERROR); + case PAID_ERROR: + throw new TpTradeProdException(TpTradeProdErrorCode.PAY_MESSAGE_CONSUME_ERROR); + case CHARTER_BUS_CANCEL_ORDER_ERROR: + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_CANCEL_ERROR); + case CHANGE_ORDER_ERROR: + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_CHANGE_ERROR); + case MANUAL_SYNC_TRIP_ERROR: + throw new TpTradeProdException(TpTradeProdErrorCode.TRIP_SYNC_ERROR); + case RESCHEDULE_ORDER_ERROR: + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_RESCHEDULE_ERROR); + default: + throw new TpTradeProdException(TpTradeProdErrorCode.INTERNAL_SERVER_ERROR); + } + } + + /** + * 手动同步行程 + * + * @param dto 查询参数 + * @return 是否同步成功 + */ + public Boolean manualSyncTrip(TpProdOrderQueryDTO dto) { + TpOrderManualSyncTripContext syncTripContext = new TpOrderManualSyncTripContext(); + syncTripContext.setOriginalOrderNo(dto.getOriginalOrderNo()); + syncTripContext.setTenantId(dto.getTenantId()); + + // 查询订单详情 查询包车订单 + TpProdOrderDetailVO orderDetail = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .originalOrderNo(dto.getOriginalOrderNo()) + .tenantId(dto.getTenantId()) + .needModules(ListUtil.toList(TpOrderModulesEnum.ORDER_TRAVEL_TRIP.getModule(), TpOrderModulesEnum.ORDER_SUBJECT_ITEM.getModule())).build()); + syncTripContext.setCurrentOrderDetail(orderDetail); + + LiteflowResponse response = flowExecutor.execute2Resp(LiteFlowConstant.ORDER_MANUAL_SYNC_TRIP_FLOW, null, syncTripContext); + + // 校验执行结果 + checkResponseResult(response, MANUAL_SYNC_TRIP_ERROR); + + return Boolean.TRUE; + } + + /** + * 定制公交改签订单 + * @param dto 改签参数 + * @return 改签后结果返回 + */ + public TpProdOrderCreateVO rescheduleOrder(TpProdOrderRescheduleDTO dto) { + TpProdOrderCreateDTO createDTO = dto.getCreateOrderDto(); + TpUserPlaceOrderContext userPlaceOrderContext = new TpUserPlaceOrderContext(); + userPlaceOrderContext.setCreateDTO(createDTO); + userPlaceOrderContext.setOrderDetailVO(dto.getOrderDetail()); + userPlaceOrderContext.setOrderRescheduleDTO(dto); + userPlaceOrderContext.setTenantId(dto.getTenantId()); + userPlaceOrderContext.setProcessType(TpFlowProcessTypeEnum.CONFIRM_RESCHEDULE_ORDER.getCode()); + + LiteflowResponse response = flowExecutor.execute2Resp(LiteFlowConstant.USER_RESCHEDULE_FLOW, null, userPlaceOrderContext); + + // 校验执行结果 + checkResponseResult(response, RESCHEDULE_ORDER_ERROR); + + TpProdOrderCreateVO tpProdOrderCreateVO = new TpProdOrderCreateVO(); + tpProdOrderCreateVO.setOrderNo(createDTO.getOrderNo()); + tpProdOrderCreateVO.setOriginalOrderNo(createDTO.getOriginalOrderNo()); + tpProdOrderCreateVO.setFee(createDTO.getPayAmount()); + tpProdOrderCreateVO.setPayableAmount(createDTO.getPayableAmount()); + tpProdOrderCreateVO.setCreateTime(createDTO.getOrderTime()); + return tpProdOrderCreateVO; + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpBasicCheckNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpBasicCheckNode.java new file mode 100644 index 0000000..e69de29 diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpCharterBusInquireCheckNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpCharterBusInquireCheckNode.java new file mode 100644 index 0000000..f24629d --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpCharterBusInquireCheckNode.java @@ -0,0 +1,52 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.check; + +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderCreateDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderPriceRecordDTO; +import com.deepinnet.tptradeprod.core.compoment.TpCharterBusInquireComponent; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; + +import java.util.List; + +/** + *

+ * 预约包车询价节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "charterBusInquireCheckNode", name = "预约包车询价节点") +@LiteflowCmpDefine +@RequiredArgsConstructor +public class TpCharterBusInquireCheckNode { + + private final TpCharterBusInquireComponent tpCharterBusInquireComponent; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 预约包车询价"); + + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + TpProdOrderCreateDTO createDTO = userPlaceOrderContext.getCreateDTO(); + + List tpProdOrderPriceRecordDTOS = checkPrice(createDTO); + + // 询价 & 价格校验 + createDTO.setTpOrderPriceRecords(tpProdOrderPriceRecordDTOS); + + // 设置支付比例 + userPlaceOrderContext.setPercentage(tpProdOrderPriceRecordDTOS.get(0).getPayPercentage()); + } + + private List checkPrice(TpProdOrderCreateDTO createDTO) { + return tpCharterBusInquireComponent.execute(createDTO); + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpCharterBusInternalPriceInquireNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpCharterBusInternalPriceInquireNode.java new file mode 100644 index 0000000..f4b4d29 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpCharterBusInternalPriceInquireNode.java @@ -0,0 +1,46 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.check; + +import com.alibaba.fastjson2.JSONObject; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderCreateDTO; +import com.deepinnet.tptradeprod.core.compoment.TpCharterBusInquireComponent; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; + +import java.util.List; + +/** + *

+ * 预约包车内部询价节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "charterBusInternalPriceInquireNode", name = "预约包车内部询价节点") +@LiteflowCmpDefine +@RequiredArgsConstructor +public class TpCharterBusInternalPriceInquireNode { + + private final TpCharterBusInquireComponent tpCharterBusInquireComponent; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 预约包车内部询价节点"); + + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + TpProdOrderCreateDTO createDTO = userPlaceOrderContext.getCreateDTO(); + + userPlaceOrderContext.setInternalPrice(getInternalPrice(createDTO)); + } + + private String getInternalPrice(TpProdOrderCreateDTO createDTO) { + return tpCharterBusInquireComponent.inquireInternalPrice(JSONObject.toJSONString(createDTO.getInquireParams())); + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpFreeTicketCheckNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpFreeTicketCheckNode.java new file mode 100644 index 0000000..5b076ab --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpFreeTicketCheckNode.java @@ -0,0 +1,44 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.check; + +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderCreateDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderPriceRecordDTO; +import com.deepinnet.tptradeprod.core.compoment.TpInquireComponent; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import com.yomahub.liteflow.enums.NodeTypeEnum; +import lombok.RequiredArgsConstructor; + +import java.math.BigDecimal; +import java.util.List; + +/** + *

+ * 公开线路免费票判断节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "freeTicketCheckNode", name = "公开线路免费票判断节点") +@LiteflowCmpDefine(value = NodeTypeEnum.IF) +@RequiredArgsConstructor +public class TpFreeTicketCheckNode { + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS_IF) + public boolean process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 公开线路免费票判断节点"); + + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + TpProdOrderCreateDTO createDTO = userPlaceOrderContext.getCreateDTO(); + + // 询价后判断价格是否为0 + // 如果为0说明该票折扣后为0元,无需拉收银台 + return new BigDecimal(createDTO.getPayAmount()).compareTo(BigDecimal.ZERO) == 0 ? Boolean.TRUE : Boolean.FALSE; + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpInquireCheckNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpInquireCheckNode.java new file mode 100644 index 0000000..7b40f21 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpInquireCheckNode.java @@ -0,0 +1,47 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.check; + +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderCreateDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderPriceRecordDTO; +import com.deepinnet.tptradeprod.core.compoment.TpInquireComponent; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; + +import java.util.List; + +/** + *

+ * 询价节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "inquireCheckNode", name = "询价节点") +@LiteflowCmpDefine +@RequiredArgsConstructor +public class TpInquireCheckNode { + + private final TpInquireComponent tpInquireComponent; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 询价"); + + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + TpProdOrderCreateDTO createDTO = userPlaceOrderContext.getCreateDTO(); + + // 询价 & 价格校验 + createDTO.setTpOrderPriceRecords(checkPrice(createDTO)); + } + + private List checkPrice(TpProdOrderCreateDTO createDTO) { + return tpInquireComponent.execute(createDTO); + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderAuditCheckOrderStatusNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderAuditCheckOrderStatusNode.java new file mode 100644 index 0000000..f4d7665 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderAuditCheckOrderStatusNode.java @@ -0,0 +1,74 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.check; + +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.order.TpOrderModulesEnum; +import com.deepinnet.tptradeprod.biz.service.flow.constants.LiteFlowConstant; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderAuditConfirmContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderAuditConfirmDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderQueryDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderStatusEnum; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import com.yomahub.liteflow.enums.NodeTypeEnum; +import lombok.RequiredArgsConstructor; + +/** + *

+ * 审核改价后判断当前订单状态 + * 1.首次审核成功 + * 2.变更订单 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "orderAuditCheckOrderStatusNode", name = "审核改价后判断当前订单状态") +@LiteflowCmpDefine(value = NodeTypeEnum.SWITCH) +@RequiredArgsConstructor +public class TpOrderAuditCheckOrderStatusNode { + + private final TpOrderClient tpOrderClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS_SWITCH) + public String process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 审核改价后判断当前订单状态"); + TpOrderAuditConfirmContext auditConfirmContext = bindCmp.getContextBean(TpOrderAuditConfirmContext.class); + TpProdOrderAuditConfirmDTO confirmDTO = auditConfirmContext.getConfirmDTO(); + + // 查询订单详情,并查询标的项及行程单 + TpProdOrderDetailVO orderDetail = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .originalOrderNo(confirmDTO.getOriginalOrderNo()) + .tenantId(confirmDTO.getTenantId()) + .needModules(ListUtil.toList(TpOrderModulesEnum.ORDER_TRAVEL_TRIP.getModule(), TpOrderModulesEnum.ORDER_SUBJECT_ITEM.getModule())).build()); + + auditConfirmContext.setOrderDetailVO(orderDetail); + + // 首次确认后流程 + if (ObjectUtil.equals(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_CONFIRMED.getStatus())) { + return LiteFlowConstant.ORDER_AUDIT_FIRST_CONFIRM_FLOW; + } + + // 变更后流程 + if (StrUtil.isNotEmpty(orderDetail.getParentOrderNo()) && ObjectUtil.equals(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_CHANGE_AUDITED.getStatus())) { + return LiteFlowConstant.ORDER_AUDIT_CHANGE_CONFIRM_FLOW; + } + + // 订单取消后流程 + if (ObjectUtil.equals(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_CANCEL_AUDITED.getStatus())) { + return LiteFlowConstant.ORDER_AUDIT_CANCEL_CONFIRM_FLOW; + } + + return null; + } + + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderBusinessTypeCheckNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderBusinessTypeCheckNode.java new file mode 100644 index 0000000..2981698 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderBusinessTypeCheckNode.java @@ -0,0 +1,65 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.check; + +import cn.hutool.core.util.ObjectUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradeprod.biz.service.flow.constants.LiteFlowConstant; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderCreateDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderTypeEnum; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import com.yomahub.liteflow.enums.NodeTypeEnum; +import lombok.RequiredArgsConstructor; + +import static com.deepinnet.tptradeprod.common.enums.TpOrderTypeEnum.CUSTOMIZED_ORDER; + +/** + *

+ * 业务类型校验节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "orderBusinessTypeCheckNode", name = "判断业务类型") +@LiteflowCmpDefine(value = NodeTypeEnum.SWITCH) +@RequiredArgsConstructor +public class TpOrderBusinessTypeCheckNode { + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS_SWITCH) + public String process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 判断产品业务类型"); + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + TpProdOrderCreateDTO createDTO = userPlaceOrderContext.getCreateDTO(); + + TpOrderTypeEnum bizType = TpOrderTypeEnum.getBizTypeByCode(createDTO.getType()); + + if (ObjectUtil.isNull(bizType)) { + LogUtil.error("未知的业务类型"); + throw new TpTradeProdException(TpTradeProdErrorCode.PRODUCT_BUSINESS_TYPE_ERROR); + } + + switch (bizType){ + case CUSTOMIZED_ORDER: + // 定制公交 + return LiteFlowConstant.USER_PLACE_ORDER_CUSTOM_BUS_FLOW; + case PACKING_ORDER: + // 预约包车 + return LiteFlowConstant.USER_PLACE_ORDER_CHARTER_BUS_FLOW; + case CARPOOL_ORDER: + // 拼车 + return LiteFlowConstant.USER_PLACE_ORDER_CARPOOL_BUS_FLOW; + default: + LogUtil.error("当前业务类型不在定义范围内"); + throw new TpTradeProdException(TpTradeProdErrorCode.PRODUCT_BUSINESS_TYPE_ERROR); + } + } + + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderCancelCheckIsAuditNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderCancelCheckIsAuditNode.java new file mode 100644 index 0000000..3d627ba --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderCancelCheckIsAuditNode.java @@ -0,0 +1,40 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.check; + +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserCancelOrderContext; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import com.yomahub.liteflow.enums.NodeTypeEnum; +import lombok.RequiredArgsConstructor; + +/** + *

+ * 取消订单判断是否需审核 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "cancelCheckIsAuditNode", name = "取消订单判断是否需审核") +@LiteflowCmpDefine(value = NodeTypeEnum.IF) +@RequiredArgsConstructor +public class TpOrderCancelCheckIsAuditNode { + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS_IF) + public boolean process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 取消订单判断是否需审核"); + TpUserCancelOrderContext userCancelOrderContext = bindCmp.getContextBean(TpUserCancelOrderContext.class); + TpProdOrderDetailVO orderDetail = userCancelOrderContext.getOrderDetail(); + + // TODO 查询产品详情判断是否需审核,默认需审核 + return Boolean.TRUE; + } + + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderCancelCheckStatusNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderCancelCheckStatusNode.java new file mode 100644 index 0000000..6ac8174 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderCancelCheckStatusNode.java @@ -0,0 +1,70 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.check; + +import cn.hutool.core.util.ObjectUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.order.TpOrderModulesEnum; +import com.deepinnet.tptradeprod.biz.service.flow.constants.LiteFlowConstant; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserCancelOrderContext; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderCreateDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderQueryDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderPayModeEnum; +import com.deepinnet.tptradeprod.common.enums.TpOrderStatusEnum; +import com.deepinnet.tptradeprod.common.enums.TpOrderTypeEnum; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.google.common.collect.Lists; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import com.yomahub.liteflow.enums.NodeTypeEnum; +import lombok.RequiredArgsConstructor; + +/** + *

+ * 取消订单校验状态节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "cancelOrderCheckStatusNode", name = "取消订单校验状态节点") +@LiteflowCmpDefine(value = NodeTypeEnum.SWITCH) +@RequiredArgsConstructor +public class TpOrderCancelCheckStatusNode { + + private final TpOrderClient tpOrderClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS_SWITCH) + public String process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 取消订单校验状态节点"); + TpUserCancelOrderContext tpUserCancelOrderContext = bindCmp.getContextBean(TpUserCancelOrderContext.class); + + // 判断当前订单是 直接取消 / 退款 / 还是支付 + TpProdOrderDetailVO orderDetail = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .orderNo(tpUserCancelOrderContext.getOrderNo()) + .tenantId(tpUserCancelOrderContext.getTenantId()).build()); + + // 待确认取消订单 + if (ObjectUtil.equal(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_NEED_CONFIRM.getStatus())) { + return LiteFlowConstant.USER_CANCEL_ORDER_NEED_CONFIRM_FLOW; + } + + // 已支付取消订单 + if (ObjectUtil.equal(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_DEPOSIT_PAID.getStatus()) + || ObjectUtil.equal(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_NEED_DISPATCH.getStatus()) + || ObjectUtil.equal(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_DISPATCHED.getStatus())) { + return LiteFlowConstant.USER_CANCEL_ORDER_PAID_FLOW; + } + + LogUtil.error("当前订单:{}, 状态:{}, 无法取消", tpUserCancelOrderContext.getOrderNo(), orderDetail.getStatus()); + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_CANCEL_ERROR); + } + + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderCarpoolCheckPosSourceNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderCarpoolCheckPosSourceNode.java new file mode 100644 index 0000000..b480b82 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderCarpoolCheckPosSourceNode.java @@ -0,0 +1,39 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.check; + +import cn.hutool.core.util.StrUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderCreateDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderSourceEnum; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import com.yomahub.liteflow.enums.NodeTypeEnum; +import lombok.RequiredArgsConstructor; + +/** + *

+ * 判断订单来源是否为POS机预约 + *

+ * + * @author chenjiaju + * @since 2024/5/20 + */ + +@LiteflowComponent(value = "carpoolCheckPosSourceNode", name = "判断订单来源是否为POS机预约") +@LiteflowCmpDefine(value = NodeTypeEnum.IF) +@RequiredArgsConstructor +public class TpOrderCarpoolCheckPosSourceNode { + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS_IF) + public boolean process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 判断订单来源是否为POS机预约"); + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + TpProdOrderCreateDTO createDTO = userPlaceOrderContext.getCreateDTO(); + + return StrUtil.equals(createDTO.getSource(), TpOrderSourceEnum.POS.getType()); + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderFirstConfirmedCheckPayModeNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderFirstConfirmedCheckPayModeNode.java new file mode 100644 index 0000000..fc8f0f9 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderFirstConfirmedCheckPayModeNode.java @@ -0,0 +1,72 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.check; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.order.TpOrderPushStatusDTO; +import com.deepinnet.tptradecore.common.enums.order.TpOrderPayModeEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderPushStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderAuditConfirmContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderAuditConfirmDTO; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.deepinnet.tptradeprod.core.compoment.TpOrderSyncTripComponent; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; + +import javax.annotation.Resource; + +/** + *

+ * 订单首次确认审核通过判断支付模式 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "firstConfirmedCheckPayModeNode", name = "订单首次确认审核通过判断支付模式") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +public class TpOrderFirstConfirmedCheckPayModeNode { + + @Resource + private TpOrderClient tpOrderClient; + + @Resource + private TpOrderSyncTripComponent tpOrderSyncTripComponent; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单首次确认审核通过判断支付模式"); + + TpOrderAuditConfirmContext auditConfirmContext = bindCmp.getContextBean(TpOrderAuditConfirmContext.class); + TpProdOrderAuditConfirmDTO confirmDTO = auditConfirmContext.getConfirmDTO(); + TpProdOrderDetailVO orderDetailVO = auditConfirmContext.getOrderDetailVO(); + + TpOrderPushStatusEnum needPushStatusEnum = null; + // 先享后付,推进到待派车 + if (StrUtil.equals(orderDetailVO.getPayMode(), TpOrderPayModeEnum.PAY_AFTER.getPayMode())) { + needPushStatusEnum = TpOrderPushStatusEnum.ORDER_NEED_DISPATCH; + } else { + needPushStatusEnum = TpOrderPushStatusEnum.ORDER_DEPOSIT_NEED_PAY; + } + + // 推进订单状态 + tpOrderClient.pushOrderStatus(TpOrderPushStatusDTO.builder() + .orderNo(orderDetailVO.getOrderNo()) + .tenantId(confirmDTO.getTenantId()) + .tpOrderPushStatusEnum(needPushStatusEnum).build()); + + // 同步主数据 + if (ObjectUtil.equals(needPushStatusEnum.getStatus(), TpOrderPushStatusEnum.ORDER_NEED_DISPATCH.getStatus())) { + // 行程单同步主数据组件 + tpOrderSyncTripComponent.createSync(orderDetailVO, confirmDTO.getTenantId()); + } + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderIsNeedConfirmCheckNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderIsNeedConfirmCheckNode.java new file mode 100644 index 0000000..834f59d --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderIsNeedConfirmCheckNode.java @@ -0,0 +1,42 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.check; + +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpproductcore.common.dto.product.TpProdDetailDTO; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import com.yomahub.liteflow.enums.NodeTypeEnum; +import lombok.RequiredArgsConstructor; + +/** + *

+ * + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "orderIsNeedConfirmCheckNode", name = "判断是否需要业务员确认审核") +@LiteflowCmpDefine(value = NodeTypeEnum.IF) +@RequiredArgsConstructor +public class TpOrderIsNeedConfirmCheckNode { + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS_IF) + public boolean process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 判断是否需要业务员确认审核"); + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + TpProdDetailDTO productDTO = userPlaceOrderContext.getProductDTO(); + + // TODO bizCode + + // 默认需要业务员审核,默认非自动审核 + userPlaceOrderContext.setAutoAudit(Boolean.FALSE); + return Boolean.TRUE; + } + + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderIsNeedInquireCheckNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderIsNeedInquireCheckNode.java new file mode 100644 index 0000000..b788e9c --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderIsNeedInquireCheckNode.java @@ -0,0 +1,59 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.check; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpproductcore.common.dto.product.TpProdDetailDTO; +import com.deepinnet.tpproductcore.common.dto.serviceobject.TpServiceObjectDTO; +import com.deepinnet.tpproductcore.common.enums.PayTypeEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderCreateDTO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import com.yomahub.liteflow.enums.NodeTypeEnum; +import lombok.RequiredArgsConstructor; + +import java.util.List; +import java.util.stream.Collectors; + +/** + *

+ * 免费票校验节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "orderIsNeedInquireCheckNode", name = "判断是否为免费票") +@LiteflowCmpDefine(value = NodeTypeEnum.IF) +@RequiredArgsConstructor +public class TpOrderIsNeedInquireCheckNode { + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS_IF) + public boolean process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 判断是否为免费票(免费票无需询价)"); + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + TpProdOrderCreateDTO createDTO = userPlaceOrderContext.getCreateDTO(); + TpProdDetailDTO productDTO = userPlaceOrderContext.getProductDTO(); + + // 校验当前品的服务对象的支付方式 + if (StrUtil.isNotEmpty(createDTO.getOrderPlacer().getServiceObjectCode()) && CollUtil.isNotEmpty(productDTO.getServiceObjects())) { + // 查询用户对应的企业线路是否为免费票,免费票不询价 + List filterResult = productDTO.getServiceObjects().stream().filter(serviceObject -> StrUtil.equals(createDTO.getOrderPlacer().getServiceObjectCode(), serviceObject.getServiceObjectCode()) + && StrUtil.equalsIgnoreCase(PayTypeEnum.FREE.getCode(), serviceObject.getPayType())).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(filterResult)) { + LogUtil.warn("当前线路:{}, 服务对象:{}, 免费票, 不予询价", createDTO.getRoutes().get(0).getRouteNo(), createDTO.getOrderPlacer().getServiceObjectCode()); + return Boolean.FALSE; + } + } + + // 需要询价 + return Boolean.TRUE; + } + + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderManualSyncTripCheckNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderManualSyncTripCheckNode.java new file mode 100644 index 0000000..b38c708 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderManualSyncTripCheckNode.java @@ -0,0 +1,91 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.check; + +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.order.TpOrderModulesEnum; +import com.deepinnet.tptradeprod.biz.service.flow.constants.LiteFlowConstant; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderManualSyncTripContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderQueryDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderStatusEnum; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import com.yomahub.liteflow.enums.NodeTypeEnum; +import lombok.RequiredArgsConstructor; + +/** + *

+ * 订单手动同步行程校验节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "orderManualSyncTripCheckNode", name = "订单手动同步行程校验节点") +@LiteflowCmpDefine(value = NodeTypeEnum.SWITCH) +@RequiredArgsConstructor +public class TpOrderManualSyncTripCheckNode { + + private final TpOrderClient tpOrderClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS_SWITCH) + public String process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单手动同步行程校验节点"); + TpOrderManualSyncTripContext syncTripContext = bindCmp.getContextBean(TpOrderManualSyncTripContext.class); + + TpProdOrderDetailVO nowOrder = syncTripContext.getCurrentOrderDetail(); + + // 判断父订单是否存在 + TpProdOrderDetailVO parentOrder = null; + if (StrUtil.isNotEmpty(nowOrder.getParentOrderNo())) { + parentOrder = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .orderNo(nowOrder.getParentOrderNo()) + .tenantId(syncTripContext.getTenantId()) + .needModules(ListUtil.toList(TpOrderModulesEnum.ORDER_TRAVEL_TRIP.getModule(), TpOrderModulesEnum.ORDER_SUBJECT_ITEM.getModule())).build()); + + syncTripContext.setParentOrderDetail(parentOrder); + } + + // 判断是否为取消订单 + if (ObjectUtil.equals(nowOrder.getStatus(), TpOrderStatusEnum.ORDER_CANCELED.getStatus()) + || ObjectUtil.equals(nowOrder.getStatus(), TpOrderStatusEnum.ORDER_CANCEL_NEED_PAY.getStatus()) + || ObjectUtil.equals(nowOrder.getStatus(), TpOrderStatusEnum.ORDER_CANCEL_REFUNDING.getStatus()) + || ObjectUtil.equals(nowOrder.getStatus(), TpOrderStatusEnum.ORDER_CANCEL_REFUNDED.getStatus())) { + + LogUtil.info("当前订单:{}, 源订单:{}, 同步行程[取消]", nowOrder.getOrderNo(), nowOrder.getOriginalOrderNo()); + // 取消同步主数据 + return LiteFlowConstant.ORDER_CANCEL_SYNC_TRIP_NODE; + } + + // 判断父订单状态 只有待派车状态下进入更新订单 + if (ObjectUtil.isNotNull(parentOrder) + && (ObjectUtil.equals(parentOrder.getStatus(), TpOrderStatusEnum.ORDER_NEED_DISPATCH.getStatus()) + || ObjectUtil.equals(parentOrder.getStatus(), TpOrderStatusEnum.ORDER_DISPATCHED.getStatus()))) { + + LogUtil.info("当前订单:{}, 源订单:{}, 同步行程[更新]", nowOrder.getOrderNo(), nowOrder.getOriginalOrderNo()); + // 更新同步主数据 + return LiteFlowConstant.ORDER_UPDATE_SYNC_TRIP_NODE; + } + + if (ObjectUtil.equals(nowOrder.getStatus(), TpOrderStatusEnum.ORDER_NEED_DISPATCH.getStatus())) { + + LogUtil.info("当前订单:{}, 源订单:{}, 同步行程[创建]", nowOrder.getOrderNo(), nowOrder.getOriginalOrderNo()); + // 创建行程同步主数据 + return LiteFlowConstant.ORDER_CREATE_SYNC_TRIP_NODE; + } + + LogUtil.error("当前订单:{}, 无需同步主数据", nowOrder.getOrderNo()); + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_TRIP_NOT_NEED_SYNC_ERROR); + } + + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderPaidBizTypeCheckNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderPaidBizTypeCheckNode.java new file mode 100644 index 0000000..d3025d9 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderPaidBizTypeCheckNode.java @@ -0,0 +1,56 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.check; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.TpBizTypeEnum; +import com.deepinnet.tptradeprod.biz.service.flow.constants.LiteFlowConstant; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderCreateDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderTypeEnum; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import com.yomahub.liteflow.enums.NodeTypeEnum; +import lombok.RequiredArgsConstructor; + +/** + *

+ * 支付判断业务类型校验节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "orderPaidBizTypeCheckNode", name = "预约包车支付类型判断(订金支付 / 尾款支付)") +@LiteflowCmpDefine(value = NodeTypeEnum.SWITCH) +@RequiredArgsConstructor +public class TpOrderPaidBizTypeCheckNode { + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS_SWITCH) + public String process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 预约包车支付类型判断(订金支付 / 尾款支付)"); + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + + // 校验当前品的业务类型 + if (StrUtil.equals(userPlaceOrderContext.getBizType(), TpBizTypeEnum.DEPOSIT_PAY.getCode())) { + // 订金支付 + return LiteFlowConstant.USER_DEPOSIT_PAID_FLOW; + } + + if (StrUtil.equals(userPlaceOrderContext.getBizType(), TpBizTypeEnum.BALANCE_PAY.getCode())) { + // 尾款支付 + return LiteFlowConstant.USER_BALANCE_PAID_FLOW; + } + + LogUtil.error("当前业务类型不在定义范围内"); + throw new TpTradeProdException(TpTradeProdErrorCode.PRODUCT_BUSINESS_TYPE_ERROR); + } + + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderPayModeCheckNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderPayModeCheckNode.java new file mode 100644 index 0000000..1183589 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpOrderPayModeCheckNode.java @@ -0,0 +1,60 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.check; + +import cn.hutool.core.util.StrUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpproductcore.common.dto.product.TpProdDetailDTO; +import com.deepinnet.tpproductcore.common.enums.TpOrderPayTypeEnum; +import com.deepinnet.tptradeprod.biz.service.flow.constants.LiteFlowConstant; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderCreateDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderPayModeEnum; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import com.yomahub.liteflow.enums.NodeTypeEnum; +import lombok.RequiredArgsConstructor; + +/** + *

+ * 付款模式校验节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "orderPayModeCheckNode", name = "付款模式校验节点") +@LiteflowCmpDefine(value = NodeTypeEnum.SWITCH) +@RequiredArgsConstructor +public class TpOrderPayModeCheckNode { + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS_SWITCH) + public String process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 付款模式校验节点"); + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + TpProdOrderCreateDTO createDTO = userPlaceOrderContext.getCreateDTO(); + // 塞入并行询价的内部价金额 + createDTO.getTpOrderPriceRecords().forEach(priceRecord -> { + priceRecord.setInternalInquireAmount(userPlaceOrderContext.getInternalPrice()); + }); + + TpProdDetailDTO productDTO = userPlaceOrderContext.getProductDTO(); + TpOrderPayTypeEnum orderPayType = productDTO.getExtendAttributes().getOrderPayType(); + + // 目前写死先付后享 + if (StrUtil.equals(orderPayType.getCode(), TpOrderPayTypeEnum.FULL_PAY.getCode()) || StrUtil.equals(orderPayType.getCode(), TpOrderPayTypeEnum.PAY_DEPOSIT.getCode())) { + // 先付后享 + createDTO.setPayMode(StrUtil.equals(orderPayType.getCode(), TpOrderPayTypeEnum.FULL_PAY.getCode()) ? TpOrderPayModeEnum.PAY_BEFORE_ALL.getPayMode() : TpOrderPayModeEnum.PAY_BEFORE.getPayMode()); + return LiteFlowConstant.USER_PAY_BEFORE_USE_FLOW; + } else { + // 先享后付 + createDTO.setPayMode(TpOrderPayModeEnum.PAY_AFTER.getPayMode()); + return LiteFlowConstant.USER_PAY_AFTER_USE_FLOW; + } + + } + + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpPlaceOrderProductCheckNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpPlaceOrderProductCheckNode.java new file mode 100644 index 0000000..de9a7bd --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpPlaceOrderProductCheckNode.java @@ -0,0 +1,719 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.check; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson2.JSONObject; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpbaseopcore.common.dto.org.OrgNameCodeDTO; +import com.deepinnet.tpproductcore.common.dto.category.TpCategoryDTO; +import com.deepinnet.tpproductcore.common.dto.product.TpProdDetailDTO; +import com.deepinnet.tpproductcore.common.dto.product.TpProductExtendAttributesDTO; +import com.deepinnet.tpproductcore.common.dto.product.TpProductExtraAttributesDTO; +import com.deepinnet.tpproductcore.common.dto.rule.*; +import com.deepinnet.tpproductcore.common.dto.rule.result.TpReservationTimeResult; +import com.deepinnet.tpproductcore.common.enums.*; +import com.deepinnet.tpproductcore.common.qto.TpSalesUnitCarPoolListQueryDTO; +import com.deepinnet.tpproductcore.common.qto.TpSalesUnitQueryDTO; +import com.deepinnet.tpproductcore.common.qto.product.TpProductQueryDTO; +import com.deepinnet.tpproductcore.common.vo.TpSalesUnitCarPoolVO; +import com.deepinnet.tpproductcore.common.vo.TpSalesUnitElementVO; +import com.deepinnet.tpproductcore.common.vo.TpSalesUnitVO; +import com.deepinnet.tptradecore.common.dto.order.TpOrderSwipeQueryDTO; +import com.deepinnet.tptradecore.common.dto.order.TpUserTicketsQueryDTO; +import com.deepinnet.tptradecore.common.enums.order.TpOrderChangeApplyStatusEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderTripTypeEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.enums.TpOrderSourceEnum; +import com.deepinnet.tptradeprod.common.enums.TpOrderTypeEnum; +import com.deepinnet.tptradeprod.common.enums.TpProdOrderTicketTypeEnum; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.*; +import com.google.common.collect.Lists; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; +import org.jetbrains.annotations.NotNull; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + *

+ * 产品校验节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ +@LiteflowComponent(value = "placeOrderProductCheckNode", name = "产品校验") +@LiteflowCmpDefine +@RequiredArgsConstructor +public class TpPlaceOrderProductCheckNode { + + private static final int ONE_DAY_MILLISECOND = 86400000; + private final TpProductClient tpProductClient; + + private final TpProductSalesUnitClient tpProductSalesUnitClient; + + private final TpOrderClient tpOrderClient; + + private final TpBizRuleClient bizRuleClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 产品校验"); + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + TpProdOrderCreateDTO createDTO = userPlaceOrderContext.getCreateDTO(); + TpProdDetailDTO productDetailDTO = checkProduct(createDTO, userPlaceOrderContext); + userPlaceOrderContext.setProductDTO(productDetailDTO); + + if (userPlaceOrderContext.getOrderRescheduleDTO() != null) { + checkRescheduleTicketCount(userPlaceOrderContext); + } + } + + private void checkRescheduleTicketCount(TpUserPlaceOrderContext userPlaceOrderContext) { + TpProdOrderCreateDTO createDTO = userPlaceOrderContext.getCreateDTO(); + TpProdOrderRescheduleDTO orderRescheduleDTO = userPlaceOrderContext.getOrderRescheduleDTO(); + // 判断选择改签的票数量与改签后的数量是否一致 + int totalCount = createDTO.getOrderSubjectItem().stream().mapToInt(TpOrderSubjectItemDTO::getCount).sum(); + int invalidCount = orderRescheduleDTO.getInvalidVoucherDTOs().stream().mapToInt(TpProdInvalidVoucherDTO::getInvalidPassengerCount).sum(); + if (invalidCount != totalCount) { + LogUtil.error("选择改签的票数量与改签后的数量不一致,请检查改签参数:{}", userPlaceOrderContext.getOrderRescheduleDTO()); + throw new TpTradeProdException(TpTradeProdErrorCode.RESCHEDULE_TICKET_COUNT_ERROR); + } + } + + private TpProdDetailDTO checkProduct(TpProdOrderCreateDTO dto, TpUserPlaceOrderContext userPlaceOrderContext) { + TpProdDetailDTO product = queryProduct(dto.getProductNo(), dto.getTenantId()); + LogUtil.info("查询到的产品详情:{}", JSONObject.toJSONString(product)); + TpProductExtendAttributesDTO extendAttributes = product.getExtendAttributes(); + TpProductExtraAttributesDTO productExtraAttributes = product.getProductExtraAttributes(); + + // 公共校验 + publicParamsSetAndCheck(dto, product); + + // 规则为空校验 + if (CollUtil.isEmpty(product.getRules())) { + LogUtil.warn("rules empty, productNo:{}", dto.getProductNo()); + return product; + } + + Map> rulesMap = product.getRules().stream().collect(Collectors.groupingBy(TpBizRuleDTO::getRuleGroup)); + + // 定制公交 + if (StrUtil.equals(product.getBizType(), TpProductBizTypeEnum.CUSTOM_BUS.getCode())) { + LogUtil.info("定制公交判断逻辑"); + checkCustomBusProduct(dto, product, rulesMap); + } + + // 预约包车 + if (StrUtil.equals(product.getBizType(), TpProductBizTypeEnum.CHARTER_BUS.getCode())) { + boolean changeOrder = userPlaceOrderContext.isChangeOrder(); + // 最早 / 最晚预约时间规则校验 + if (!changeOrder) { + checkCharterBusProduct(dto, rulesMap, product); + } + + // 是否可跨天校验,仅单天单程和单天往返包车需要校验 + checkRestrictTime(extendAttributes.getRestrictTimeSingleDaySingleAndRoundTrip(), productExtraAttributes.getPricingType(), dto.getCharterBusStations()); + + // 订单过期时间 + setOrderCloseExpireTime(dto, rulesMap); + // 订单变更数据读取 + if (changeOrder){ + //上车时间校验 + List charterBusStations = dto.getCharterBusStations(); + long now = System.currentTimeMillis(); + charterBusStations.forEach(charterBusStation -> { + Long pickUpTime = Convert.toLong(charterBusStation.getPickUpTime()); + Assert.isTrue(pickUpTime > now, () -> new TpTradeProdException(TpTradeProdErrorCode.CURRENT_TIME_ERROR)); + }); + Boolean supportChangeTrip = extendAttributes.getSupportChangeTrip(); + if (supportChangeTrip != null) { + if (!supportChangeTrip){ + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_CHANGE_NOT_ALLOW); + } + } + Integer changeTripTimesRule = extendAttributes.getSupportChangeTripTimes(); + if (changeTripTimesRule != null){ + if (changeTripTimesRule == 0) { + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_CHANGE_OVER_TIMES); + } else { + long alreadyChangeCount = userPlaceOrderContext.getOrderChangeApplyList() + .stream() + .filter(e -> Objects.equals(e.getApplyStatus(), TpOrderChangeApplyStatusEnum.APPROVED_SUCCESS.getType())) + .count(); +// TpOrderCountQueryDTO query = new TpOrderCountQueryDTO(); +// query.setOriginalOrderNo(dto.getOriginalOrderNo()); +// query.setTenantId(dto.getTenantId()); +// Long orderCount = tpOrderClient.orderCount(query); + if (changeTripTimesRule < alreadyChangeCount) { + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_CHANGE_OVER_TIMES); + } + } } + userPlaceOrderContext.setChangeOrderNeedAudit(extendAttributes.getTripChangeNeedConfirmBySalesman() == null || extendAttributes.getTripChangeNeedConfirmBySalesman()); + } + } + + return product; + } + + /** + * 包车是否可跨天校验 + * @param restrictTime + * @param pricingType + * @param charterBusStations + */ + protected static void checkRestrictTime(Boolean restrictTime, String pricingType, List charterBusStations) { + if (hasRestrictAndIsInCitySingleOrRoundTrip(restrictTime, pricingType)) { + if (restrictTime) { + validateSameDay(charterBusStations); + } else { + validateTotalDuration(charterBusStations); + } + } + } + + private static void validateSameDay(List charterBusStations) { + Set timeSet = charterBusStations.stream() + .flatMap(p -> Stream.of( + DateUtil.beginOfDay(new Date(Convert.toLong(p.getPickUpTime()))).getTime(), + DateUtil.beginOfDay(new Date(Convert.toLong(p.getDropOffTime()))).getTime() + )) + .collect(Collectors.toSet()); + + + if (timeSet.size() > 1) { + handleValidationFailure(charterBusStations, "不可跨天,限制当晚 24点前结束"); + } + } + + private static void validateTotalDuration(List charterBusStations) { + Long totalDuration = charterBusStations.stream() + .map(TpOrderStationDTO::getDuration) + .reduce(Long::sum) + .orElse(0L); + + if (totalDuration > ONE_DAY_MILLISECOND) { + handleValidationFailure(charterBusStations, "可跨天,限制行驶时长 24小时"); + } + } + + private static void handleValidationFailure(List charterBusStations, String message) { + LogUtil.error("[包车订单是否可跨天]规则执行失败, 当前入参:{}, 原因:{}", JSONObject.toJSONString(charterBusStations), message); + throw new TpTradeProdException(TpTradeProdErrorCode.RULE_EXECUTE_ERROR, "校验失败,原因:" + message); + } + + + /** + * 有跨天校验,且包车类型为市内单程或市内往返 + * @param restrictTimeSingleDaySingleAndRoundTrip + * @param pricingType + * @return + */ + private static boolean hasRestrictAndIsInCitySingleOrRoundTrip(Boolean restrictTimeSingleDaySingleAndRoundTrip, String pricingType) { + return restrictTimeSingleDaySingleAndRoundTrip != null && (Objects.equals(pricingType, TpCharteredBusPricingTypeEnum.IN_CITY_ONE_WAY_SAME_DAY.getBackType()) || Objects.equals(pricingType, TpCharteredBusPricingTypeEnum.IN_CITY_ROUND_TRIP_SAME_DAY.getBackType())); + } + + private void setOrderCloseExpireTime(TpProdOrderCreateDTO dto, Map> rulesMap) { + List charterBusStations = dto.getCharterBusStations(); + Long pickUpTime; + if (charterBusStations.size() == 1) { + pickUpTime = Convert.toLong(charterBusStations.get(0).getPickUpTime()); + } else { + List goTrip = charterBusStations.stream().filter(station -> StrUtil.equals(station.getTripType(), TpOrderTripTypeEnum.GO.getCode())).collect(Collectors.toList()); + pickUpTime = Convert.toLong(goTrip.get(0).getPickUpTime()); + } + + TpRuleExecuteDTO orderCloseRuleExecuteDTO = new TpRuleExecuteDTO<>(); + + List orderCloseRules = rulesMap.get(TpRuleExpressionGroupEnum.ORDER_CANCEL_TIME.getCode()); + if (CollUtil.isEmpty(orderCloseRules)) { + LogUtil.warn("当前产品:{}, 未配置订单过期时间规则", dto.getProductNo()); + dto.setExpireTime(pickUpTime); + return; + } + + List rules = Lists.newArrayList(); + orderCloseRules.forEach(rule -> rules.add(rule.getExpression())); + + orderCloseRuleExecuteDTO.setRuleList(rules); + orderCloseRuleExecuteDTO.setRuleExpressionGroup(TpRuleExpressionGroupEnum.ORDER_CANCEL_TIME); + orderCloseRuleExecuteDTO.setTenantId(dto.getTenantId()); + + TpRuleExecuteResultVO ruleExecuteResult = bizRuleClient.executeRule(orderCloseRuleExecuteDTO); + + if (!ruleExecuteResult.getSuccess()) { + LogUtil.error("[订单过期时间]规则执行失败, 当前入参:{}", JSONObject.toJSONString(ruleExecuteResult)); + throw new TpTradeProdException(TpTradeProdErrorCode.RULE_EXECUTE_ERROR); + } + + // 订单塞入过期时间 + dto.setExpireTime(pickUpTime - ruleExecuteResult.getResult()); + } + + private void checkCharterBusProduct(TpProdOrderCreateDTO dto, Map> rulesMap, TpProdDetailDTO product) { + List buyRules = rulesMap.get(TpRuleExpressionGroupEnum.RESERVATION_TIME.getCode()); + if (CollUtil.isEmpty(buyRules)) { + LogUtil.warn("当前产品:{}, 未配置[包车订单预约时间]规则", dto.getProductNo()); + return; + } + + List rules = Lists.newArrayList(); + buyRules.forEach(rule -> rules.add(rule.getExpression())); + + TpRuleExecuteDTO reservationTimeParam = getTpReservationTimeParamTpRuleExecuteDTO(dto, product, rules); + + TpRuleExecuteResultVO reservationTimeResult = bizRuleClient.executeRule(reservationTimeParam); + + if (!reservationTimeResult.getSuccess()) { + LogUtil.error("[包车订单预约时间]规则执行失败, 当前入参:{}", JSONObject.toJSONString(reservationTimeParam)); + throw new TpTradeProdException(TpTradeProdErrorCode.RULE_EXECUTE_ERROR); + } + + List charterBusStations = dto.getCharterBusStations(); + + // 如果是单程 + Long pickUpTime; + if (charterBusStations.size() == 1) { + pickUpTime = Convert.toLong(charterBusStations.get(0).getPickUpTime()); + } else { + List goTrip = charterBusStations.stream().filter(station -> StrUtil.equals(station.getTripType(), TpOrderTripTypeEnum.GO.getCode())).collect(Collectors.toList()); + pickUpTime = Convert.toLong(goTrip.get(0).getPickUpTime()); + } + + TpReservationTimeResult timeResult = reservationTimeResult.getResult(); + long currentTimeStamp = DateUtil.current(); + long reservationTime = pickUpTime - currentTimeStamp; + + if (reservationTime < timeResult.getEarliestTime() || reservationTime > timeResult.getLatestTime()) { + LogUtil.error("当前时间:{}, 早于最早预约时间:{}, 最晚预约时间, 暂不可预约", pickUpTime, timeResult.getEarliestTime(), timeResult.getEarliestTime()); + throw new TpTradeProdException(TpTradeProdErrorCode.CURRENT_TIME_BOOK_ERROR); + } + } + + @NotNull + private static TpRuleExecuteDTO getTpReservationTimeParamTpRuleExecuteDTO(TpProdOrderCreateDTO dto, TpProdDetailDTO product, List rules) { + TpReservationTimeParam tpReservationLatestTimeParam = new TpReservationTimeParam(); + // 预约包车 定价类型 + tpReservationLatestTimeParam.setPricingType(TpCharteredBusPricingTypeEnum.getEnumByBackType(product.getProductExtraAttributes().getPricingType())); + + // 规则入参 + TpRuleExecuteDTO reservationTimeParam = new TpRuleExecuteDTO<>(); + reservationTimeParam.setParameter(tpReservationLatestTimeParam); + reservationTimeParam.setRuleList(rules); + reservationTimeParam.setTenantId(dto.getTenantId()); + reservationTimeParam.setRuleExpressionGroup(TpRuleExpressionGroupEnum.RESERVATION_TIME); + return reservationTimeParam; + } + + private void publicParamsSetAndCheck(TpProdOrderCreateDTO dto, TpProdDetailDTO product) { + // 校验是否非正式版本 + checkFormalFlagAndRoute(product); + + // 售卖单元校验 / 组装售卖单元 [经讨论,不校验] + // checkSalesUnit(dto); + + // 主子订单根据业务判断 目前一期暂时只有主订单 + dto.setMain(1); + + dto.setOutRequestNo(dto.getOutRequestNo() + dto.getUserNo() + dto.getProductNo()); + + dto.setProductName(product.getProductName()); + } + + private void checkCustomBusProduct(TpProdOrderCreateDTO dto, TpProdDetailDTO product, Map> rulesMap) { + // 校验当前流水号是否重复 + checkSwipeCardNoExist(dto); + + // 干掉售卖单元校验 + // checkSalesUnit(dto); + + // 塞入一级类目 + buildCategory(dto, product); + + if (ObjectUtil.isNull(product.getRouteDetailDTO())) { + LogUtil.error("线路信息不存在, 线路编码:{}", product.getRouteCode()); + throw new TpTradeProdException(TpTradeProdErrorCode.ROUTE_NOT_EXIST_ERROR); + } + + // 校验线路是否正确 + if (!StrUtil.equals(dto.getRoutes().get(0).getRouteNo(), product.getRouteCode())) { + LogUtil.error("线路信息比对不一致, 传入线路:{}, 查询线路:{}", dto.getRoutes().get(0).getRouteNo(), product.getRouteCode()); + throw new TpTradeProdException(TpTradeProdErrorCode.ROUTE_COMPARE_ERROR); + } + + //判断班次发车时,班次不存在直接报错 + checkDepartureType(dto, product); + + // 校验限购 + checkBuyLimitRules(dto, rulesMap); + + // 放票规则 产品端修改放票规则批量校验 + // cjj fixme 规则暂未到位 + checkTicketTypeRule(dto, rulesMap, product); + + // 产品配置项配置的订单过期时间 + Long orderExpiredTime = product.getExtendAttributes().getOrderExpiredTime(); + + // 订单过期时间 + dto.setExpireTime(DateUtil.offsetMillisecond(DateUtil.date(), Convert.toInt(orderExpiredTime)).getTime()); + + // 线路所属车队 + List orgAllPath = product.getRouteDetailDTO().getRouteBase().getOrgAllPaths(); + dto.getRoutes().forEach(route -> route.setBelongFleet(CollUtil.isEmpty(orgAllPath) ? null : orgAllPath.stream().map(OrgNameCodeDTO::getName).collect(Collectors.joining("-")))); + + // 查询拼车线路当前时候可以预约 + checkCarpoolPreSaleEndTime(dto); + } + + private void checkCarpoolPreSaleEndTime(TpProdOrderCreateDTO dto) { + if (ObjectUtil.equals(dto.getType(), TpOrderTypeEnum.CARPOOL_ORDER.getType())) { + List itemNos = dto.getOrderSubjectItem().stream().map(TpOrderSubjectItemDTO::getItemNo).collect(Collectors.toList()); + + TpSalesUnitCarPoolListQueryDTO queryDTO = new TpSalesUnitCarPoolListQueryDTO(); + queryDTO.setSalesUnitCodeList(itemNos); + queryDTO.setTenantId(dto.getTenantId()); + + TpSalesUnitCarPoolVO tpSalesUnitCarPoolVO = tpProductSalesUnitClient.listCarpools(queryDTO).get(0); + + // 如果当前时间大于预售结束时间,则不允许预约 + if (DateUtil.current() > tpSalesUnitCarPoolVO.getPreSaleEndTime()) { + LogUtil.error("当前时间:{}, 超过预约结束时间:{}, 不能预约", DateUtil.current(), tpSalesUnitCarPoolVO.getPreSaleEndTime()); + throw new TpTradeProdException(TpTradeProdErrorCode.CURRENT_TIME_BOOK_ERROR); + } + } + } + + private void checkSwipeCardNoExist(TpProdOrderCreateDTO dto) { + if (ObjectUtil.notEqual(TpOrderTypeEnum.CARPOOL_ORDER.getType(), dto.getType()) && StrUtil.isEmpty(dto.getSwipeCardNo()) + || ObjectUtil.notEqual(TpOrderSourceEnum.POS.getType(), dto.getSource())) { + return; + } + + TpOrderSwipeQueryDTO tpOrderSwipeQueryDTO = new TpOrderSwipeQueryDTO(); + tpOrderSwipeQueryDTO.setSwipeCardNo(dto.getSwipeCardNo()); + tpOrderSwipeQueryDTO.setTenantId(dto.getTenantId()); + + boolean isExist = tpOrderClient.querySwipeCardNoExist(tpOrderSwipeQueryDTO); + + if (isExist) { + LogUtil.error("当前刷卡流水流水号已使用, swipeCardNo:{}", dto.getSwipeCardNo()); + throw new TpTradeProdException(TpTradeProdErrorCode.CARPOOL_SWIPE_CARD_NO_EXIST_ERROR); + } + } + + private static void checkDepartureType(TpProdOrderCreateDTO dto, TpProdDetailDTO product) { + if (StrUtil.equals(DepartureTypeEnum.SHUTTLE.getCode(), product.getRouteDetailDTO().getRouteBase().getDepartureType()) && ObjectUtil.isNull(dto.getRoutes().get(0).getTpOrderRouteShuttle())) { + LogUtil.error("产品:{}, 线路:{}, 发车方式为:{}, 传入班次不存在", product.getProductCode(), product.getRouteCode(), product.getRouteDetailDTO().getRouteBase().getDepartureType()); + throw new TpTradeProdException(TpTradeProdErrorCode.ILLEGAL_PARAMS); + } + } + + private void buildCategory(TpProdOrderCreateDTO dto, TpProdDetailDTO product) { + // 查询类目 + List categories = product.getFrontCategories(); + List oneLevelCategory = categories.stream().filter(category -> ObjectUtil.equal(category.getLevel(), 1)).collect(Collectors.toList()); + // 有一级类目情况下直接设置一级类目 + if (CollUtil.isNotEmpty(oneLevelCategory)) { + dto.setProductCategoryNo(oneLevelCategory.get(0).getCode()); + dto.setProductCategory(oneLevelCategory.get(0).getName()); + } else { + List secondLevelCategory = categories.stream().filter(category -> ObjectUtil.equal(category.getLevel(), 2)).collect(Collectors.toList()); + if (CollUtil.isEmpty(secondLevelCategory)) { + LogUtil.error("当前产品:{}, 无一级类目、二级类目节点", product.getProductCode()); + throw new TpTradeProdException(TpTradeProdErrorCode.PRODUCT_CATEGORY_ERROR); + } + + dto.setProductCategoryNo(secondLevelCategory.get(0).getParentCode()); + dto.setProductCategory(secondLevelCategory.get(0).getParentName()); + } + } + + private void checkTicketTypeRule(TpProdOrderCreateDTO dto, Map> rulesMap, TpProdDetailDTO product) { + TpProdOrderTicketTypeEnum ticketTypeEnum = TpProdOrderTicketTypeEnum.getEnum(dto.getTicketType()); + if (ObjectUtil.isNull(ticketTypeEnum)) { + LogUtil.error("票类型错误, {}", dto.getTicketType()); + throw new TpTradeProdException(TpTradeProdErrorCode.TICKET_TYPE_ERROR); + } + + // 校验当前班次是否小于当前时间,小于等于当前时间无法购买 + checkBuyShuttle(dto); + + List ruleExpressions = product.getRuleExpressions(TpRuleExpressionGroupEnum.getByCode(ticketTypeEnum.getTicketRuleCode())); + if (CollectionUtil.isEmpty(ruleExpressions)) { + LogUtil.warn("{}, 放票时间未做限制", ticketTypeEnum.getTicketTypeDesc()); + return; + } + + if (ObjectUtil.equals(TpOrderTypeEnum.CUSTOMIZED_ORDER.getType(), dto.getType())) { + List> batchExecuteRuleDTOs = Lists.newArrayList(); + + buildTicketBatchRuleDTO(dto, rulesMap, ticketTypeEnum, batchExecuteRuleDTOs); + // 使用批量执行规则方法 + // TpRuleExecuteResultVO resultVO = bizRuleClient.executeRule(tpRuleExecuteDTO); + TpRuleExecuteBatchResultVO resultVO = bizRuleClient.batchExecuteBizRule(batchExecuteRuleDTOs); + resultVO.getResultList().forEach(ruleResult -> { + if (!ruleResult.getResult()) { + LogUtil.error("当前时间暂不能购买"); + throw new TpTradeProdException(TpTradeProdErrorCode.USER_BUY_TIME_ERROR); + } + }); + } + } + + private static void checkBuyShuttle(TpProdOrderCreateDTO dto) { + Map> subjectItemByTripTypeMap = dto.getOrderSubjectItem().stream().collect(Collectors.groupingBy(TpOrderSubjectItemDTO::getTripType)); + subjectItemByTripTypeMap.forEach((k, v) -> { + // 构建售卖单元组成要素 + List itemElementDTOList = Lists.newArrayList(); + v.forEach(orderSubjectItemDTO -> itemElementDTOList.addAll(orderSubjectItemDTO.getSubjectItemElements())); + // 校验当前购买班次是否可购买(本地校验) + Map> itemCodeMapList = itemElementDTOList.stream() + .collect(Collectors.groupingBy(TpOrderSubjectItemElementDTO::getElementCode)); + dto.getRoutes().forEach(route -> itemCodeMapList.get(TpFactorCodeEnum.DATE.getCode()).forEach(date -> { + if (CollUtil.isNotEmpty(route.getTpOrderRouteShuttle())) { + route.getTpOrderRouteShuttle().forEach(shuttle -> { + if (StrUtil.equals(shuttle.getTripType(), k)) { + long buyTime = DateUtil.parse(date.getElementValue() + shuttle.getShuttleTime().replace(StrUtil.COLON, "") + "00").getTime(); + // 当前时间 >= 购买日期的班次时间 + if (DateUtil.current() >= buyTime) { + LogUtil.error("当前时间暂不能购买, 购买班次时间:{}, 当前时间:{}", buyTime, DateUtil.current()); + throw new TpTradeProdException(TpTradeProdErrorCode.USER_BUY_TIME_ERROR); + } + } + }); + } + })); + }); + + } + + private static void buildTicketBatchRuleDTO(TpProdOrderCreateDTO dto, Map> rulesMap, TpProdOrderTicketTypeEnum ticketTypeEnum, List> batchExecuteRuleDTOs) { + // key 为班次编号,value 为班次信息 + Map shuttleDTOMap = dto.getRoutes().stream() + .filter(Objects::nonNull) // 确保TpOrderRouteDTO对象非null + .filter(routeDTO -> CollUtil.isNotEmpty(routeDTO.getTpOrderRouteShuttle())) // 确保getTpOrderRouteShuttle()返回的列表非null + .flatMap(routeDTO -> routeDTO.getTpOrderRouteShuttle().stream()) // 将列表转换为流 + .collect(Collectors.toMap( + TpOrderRouteShuttleDTO::getShuttleNo, // 键映射函数 + Function.identity(), // 值映射函数 + (existing, replacement) -> existing, // 合并函数,如果有重复的键,则保留已存在的值 + HashMap::new // 创建一个新的HashMap + )); + // 遍历售卖单元 + dto.getOrderSubjectItem().forEach(subjectItem -> { + List ticketTypeElement = subjectItem.getSubjectItemElements().stream().filter(e -> StrUtil.equals(e.getElementCode(), TpFactorCodeEnum.TICKET_TYPE.getCode())).collect(Collectors.toList()); + if (CollUtil.isEmpty(ticketTypeElement)) { + LogUtil.error("当前线路未配置票类型"); + throw new TpTradeProdException(TpTradeProdErrorCode.TICKET_TYPE_NOT_EXIST); + } + + // 班次编号 + String shuttleCode = subjectItem.getSubjectItemElements().stream() + .filter(Objects::nonNull) // 确保元素集合不为空 + .filter(item -> Objects.equals(item.getElementCode(), TpFactorCodeEnum.SHUTTLE_CODE.getCode())) // 确保elementCode为包次 code + .findFirst() + .map(TpOrderSubjectItemElementDTO::getElementValue) // 映射到elementValue,即班次编号 + .orElse(null); // 如果没有找到或流为空,则返回null + + // 购票规则枚举 + TpRuleExpressionGroupEnum expressionGroupEnum = getTpRuleExpressionGroupEnum(ticketTypeElement.get(0)); + + // 构建购票规则请求参数 + subjectItem.getSubjectItemElements().forEach(element -> { + if (StrUtil.equals(element.getElementCode(), TpFactorCodeEnum.DATE.getCode())) { + // 构建规则入参 + TpTicketBuyParamDTO tpTicketBuyParamDTO = buildTicketBuyParamDTO(element, shuttleDTOMap, shuttleCode); + + // 获取放票时间 + TpRuleExecuteDTO tpRuleExecuteDTO = new TpRuleExecuteDTO<>(); + List dayRules = rulesMap.get(ticketTypeEnum.getTicketRuleCode()); + List ruleList = Lists.newArrayList(); + dayRules.forEach(dayRule -> ruleList.add(dayRule.getExpression())); + + tpRuleExecuteDTO.setRuleList(ruleList); + tpRuleExecuteDTO.setParameter(tpTicketBuyParamDTO); + tpRuleExecuteDTO.setRuleExpressionGroup(expressionGroupEnum); + batchExecuteRuleDTOs.add(tpRuleExecuteDTO); + } + }); + }); + } + + @NotNull + private static TpTicketBuyParamDTO buildTicketBuyParamDTO(TpOrderSubjectItemElementDTO element, Map shuttleDTOMap, String shuttleCode) { + TpTicketBuyParamDTO tpTicketBuyParamDTO = new TpTicketBuyParamDTO(); + // 放票日期 + String salesUnitElementDate = element.getElementValue(); + TpOrderRouteShuttleDTO tpOrderRouteShuttleDTO = shuttleDTOMap.get(shuttleCode); + if (tpOrderRouteShuttleDTO != null) { + tpTicketBuyParamDTO.setStartTime(salesUnitElementDate, tpOrderRouteShuttleDTO.getShuttleTime()); + } else { + tpTicketBuyParamDTO.setStartTime(salesUnitElementDate); + } + return tpTicketBuyParamDTO; + } + + private static TpRuleExpressionGroupEnum getTpRuleExpressionGroupEnum(TpOrderSubjectItemElementDTO tpOrderSubjectItemElementDTO) { + if (StrUtil.equals(tpOrderSubjectItemElementDTO.getElementValue(), TicketTypeEnum.SINGLE_RIDE.getType())) { + return TpRuleExpressionGroupEnum.TIMES_TICKET_RELEASE; + } + + if (StrUtil.equals(tpOrderSubjectItemElementDTO.getElementValue(), TicketTypeEnum.WEEKLY.getType())) { + return TpRuleExpressionGroupEnum.WEEK_TICKET_RELEASE; + } + + if (StrUtil.equals(tpOrderSubjectItemElementDTO.getElementValue(), TicketTypeEnum.MONTHLY.getType())) { + return TpRuleExpressionGroupEnum.MONTH_TICKET_RELEASE; + } + + if (StrUtil.equals(tpOrderSubjectItemElementDTO.getElementValue(), TicketTypeEnum.SEMESTER.getType())) { + return TpRuleExpressionGroupEnum.SEMESTER_TICKET_RELEASE; + } + + if (StrUtil.equals(tpOrderSubjectItemElementDTO.getElementValue(), TicketTypeEnum.DAY_RANGE.getType())) { + return TpRuleExpressionGroupEnum.DAY_RANGE_TICKET_RELEASE; + } + + return null; + } + + private void checkBuyLimitRules(TpProdOrderCreateDTO dto, Map> rulesMap) { + if (CollUtil.isEmpty(rulesMap.get(TpRuleExpressionGroupEnum.BUY_COUNT.getCode()))) { + LogUtil.warn("未配置购买限制规则"); + return; + } + // 当前订单票数 + int currentOrderTickets = dto.getOrderSubjectItem().stream().mapToInt(TpOrderSubjectItemDTO::getCount).sum(); + + List buyRules = rulesMap.get(TpRuleExpressionGroupEnum.BUY_COUNT.getCode()); + int currentDayUserTickets = queryUserBuyTickets(dto); + // int currentDayUserTickets = 0; + TpBuyCountLimitParamDTO tpBuyCountLimitParamDTO = new TpBuyCountLimitParamDTO(); + tpBuyCountLimitParamDTO.setDayBuyCount(currentDayUserTickets); + tpBuyCountLimitParamDTO.setOrderBuyCount(currentOrderTickets); + + List ruleList = Lists.newArrayList(); + buyRules.forEach(rule -> ruleList.add(rule.getExpression())); + + TpRuleExecuteDTO tpRuleExecuteDTO = new TpRuleExecuteDTO<>(); + // 设置表达式入参 + tpRuleExecuteDTO.setParameter(tpBuyCountLimitParamDTO); + // 设置购买的规则表达式 + tpRuleExecuteDTO.setRuleList(ruleList); + tpRuleExecuteDTO.setRuleExpressionGroup(TpRuleExpressionGroupEnum.BUY_COUNT); + + TpRuleExecuteResultVO resultVO = bizRuleClient.executeRule(tpRuleExecuteDTO); + if (!resultVO.getResult()) { + LogUtil.error("当前用户:{}, 购买票数量超过限制", dto.getUserNo()); + throw new TpTradeProdException(TpTradeProdErrorCode.USER_BUY_LIMIT_ERROR); + } + + } + + private int queryUserBuyTickets(TpProdOrderCreateDTO dto) { + TpUserTicketsQueryDTO ticketsQueryDTO = new TpUserTicketsQueryDTO(); + ticketsQueryDTO.setUserNo(dto.getUserNo()); + ticketsQueryDTO.setTenantId(dto.getTenantId()); + ticketsQueryDTO.setCategoryNo(dto.getProductCategoryNo()); + ticketsQueryDTO.setOrderStartTime(DateUtil.beginOfDay(DateUtil.date()).getTime()); + ticketsQueryDTO.setOrderEndTime(DateUtil.endOfDay(DateUtil.date()).getTime()); + return tpOrderClient.getUserBuyTickets(ticketsQueryDTO); + } + + private static void checkFormalFlagAndRoute(TpProdDetailDTO product) { + if (!StrUtil.equals(product.getFormalFlag(), FormalFlagEnum.FORMAL.getCode())) { + LogUtil.error("当前产品为非正式版标识: {}", product.getFormalFlag()); + throw new TpTradeProdException(TpTradeProdErrorCode.PRODUCT_FORMAL_FLAG_ERROR); + } + } + + private void checkSalesUnit(TpProdOrderCreateDTO dto) { + // 查询售卖单元 + List tpSalesUnitVOS = querySalesUnit(dto.getProductNo(), CollUtil.isEmpty(dto.getRoutes()) ? null : dto.getRoutes().get(0).getRouteNo(), dto.getTenantId()); + LogUtil.info("查询的售卖单元为:{}", JSONObject.toJSONString(tpSalesUnitVOS)); + // 售卖单元转为Map + Map saleUnitMap = tpSalesUnitVOS.stream().collect(Collectors.toMap(TpSalesUnitVO::getCode, Function.identity())); + List salesUnit = tpSalesUnitVOS.stream().map(TpSalesUnitVO::getCode).collect(Collectors.toList()); + + // 判断售卖单元并塞入售卖单元的组成要素 + dto.getOrderSubjectItem().forEach(subjectItem -> { + if (!salesUnit.contains(subjectItem.getItemNo())) { + LogUtil.error("售卖单元:{}, 不存在", subjectItem.getItemNo()); + throw new TpTradeProdException(TpTradeProdErrorCode.SALE_UNIT_NOT_EXIST_ERROR); + } + List salesUnitElementList = saleUnitMap.get(subjectItem.getItemNo()).getSalesUnitElementList(); + if (CollUtil.isEmpty(salesUnitElementList)) { + LogUtil.error("售卖单元:{}, 下没有对应的组成要素", subjectItem.getItemNo()); + throw new TpTradeProdException(TpTradeProdErrorCode.SALES_UNIT_ELEMENTS_NOT_EXIST_ERROR); + } + + checkSalesUnitElements(subjectItem, salesUnitElementList); + + }); + } + + private void checkSalesUnitElements(TpOrderSubjectItemDTO subjectItem, List salesUnitElementList) { + Map elementMap = salesUnitElementList.stream().collect(Collectors.toMap(TpSalesUnitElementVO::getCode, Function.identity(), (k1, k2) -> k2)); + subjectItem.getSubjectItemElements().forEach(itemElement -> { + TpSalesUnitElementVO tpSalesUnitElementVO = elementMap.get(itemElement.getElementCode()); + if (ObjectUtil.isNull(tpSalesUnitElementVO)) { + LogUtil.error("组成要素:{}, 不存在", itemElement.getElementCode()); + throw new TpTradeProdException(TpTradeProdErrorCode.SALES_UNIT_ELEMENTS_NOT_EXIST_ERROR); + } + + itemElement.setItemNo(subjectItem.getItemNo()); + itemElement.setElementCode(tpSalesUnitElementVO.getCode()); + itemElement.setElementName(tpSalesUnitElementVO.getDescription()); + itemElement.setElementValue(tpSalesUnitElementVO.getValue()); + itemElement.setElementUnit(tpSalesUnitElementVO.getUnitCode()); + }); + } + + private List querySalesUnit(String productNo, String routeNo, String tenantId) { + TpSalesUnitQueryDTO tpSalesUnitQueryDTO = new TpSalesUnitQueryDTO(); + tpSalesUnitQueryDTO.setTenantId(tenantId); + tpSalesUnitQueryDTO.setProductCode(productNo); + tpSalesUnitQueryDTO.setRouteCode(routeNo); + return tpProductSalesUnitClient.listTpSalesUnit(tpSalesUnitQueryDTO); + } + + private TpProdDetailDTO queryProduct(String productNo, String tenantId) { + TpProductQueryDTO tpProductQueryDTO = new TpProductQueryDTO(); + tpProductQueryDTO.setProductCode(productNo); + tpProductQueryDTO.setFormalFlag(FormalFlagEnum.FORMAL.getCode()); + tpProductQueryDTO.setTenantId(tenantId); + tpProductQueryDTO.setNeedProperties(Lists.newArrayList( + NeedPropertiesEnum.SERVICE_OBJECT.getCode(), + //NeedPropertiesEnum.SUBJECT_ITEM.getCode(), + NeedPropertiesEnum.SALES_UNIT.getCode(), + NeedPropertiesEnum.BIZ_RULE.getCode(), + NeedPropertiesEnum.ROUTE.getCode(), + NeedPropertiesEnum.FRONT_CATEGORY.getCode(), + NeedPropertiesEnum.BACK_CATEGORY.getCode(), + //NeedPropertiesEnum.PRICE_UNIT.getCode() + //NeedPropertiesEnum.INVENTORY.getCode() + NeedPropertiesEnum.EXTEND_ATTRIBUTE.getCode() + )); + return tpProductClient.getProduct(tpProductQueryDTO); + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpRescheduleInquireCheckNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpRescheduleInquireCheckNode.java new file mode 100644 index 0000000..601d449 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpRescheduleInquireCheckNode.java @@ -0,0 +1,124 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.check; + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderCreateDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderPriceRecordDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderRescheduleDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderRescheduleInfoDTO; +import com.deepinnet.tptradeprod.common.service.integration.convert.TpOrderConverter; +import com.deepinnet.tptradeprod.common.vo.TpOrderPriceRecordVO; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderPriceRecordDetailVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; +import org.apache.commons.compress.utils.Lists; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + *

+ * 改签询价节点 + *

+ * + * @author chenjiaju + * @since 2023/7/20 + */ + +@LiteflowComponent(value = "rescheduleInquireCheckNode", name = "改签询价节点") +@LiteflowCmpDefine +@RequiredArgsConstructor +public class TpRescheduleInquireCheckNode { + + private final TpOrderConverter orderConverter; + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 改签询价节点"); + + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + // 创建订单参数 + TpProdOrderCreateDTO createDTO = userPlaceOrderContext.getCreateDTO(); + // 改签原始订单详情 + TpProdOrderDetailVO orderDetailVO = userPlaceOrderContext.getOrderDetailVO(); + // 改签信息 + TpProdOrderRescheduleDTO orderRescheduleDTO = userPlaceOrderContext.getOrderRescheduleDTO(); + + // 询价 & 价格校验 + createDTO.setTpOrderPriceRecords(checkPrice(orderDetailVO, orderRescheduleDTO, createDTO)); + } + + /** + * 在这里构建询价信息 产品侧未收拢,订单侧临时收拢售卖单元替换 + * @param oldOrderDetailVO 改签原始订单详情 + * @param orderRescheduleDTO 改签信息 + * @return 询价结果 + */ + private List checkPrice(TpProdOrderDetailVO oldOrderDetailVO, TpProdOrderRescheduleDTO orderRescheduleDTO, TpProdOrderCreateDTO createDTO) { + // 根据报价记录构建询价信息 + List orderPriceRecordList = oldOrderDetailVO.getOrderPriceRecord(); + Assert.notEmpty(orderPriceRecordList, "原订单历史询价信息为空"); + + List rescheduleInfos = Lists.newArrayList(); + + orderRescheduleDTO.getRescheduleRecords().forEach(record -> rescheduleInfos.addAll(record.getOrderRescheduleInfos())); + + // 构建旧售卖单元与新售卖单元Map + Map oldSaleUnitMappingNewSaleUnit = rescheduleInfos.stream() + .collect(Collectors.toMap(TpProdOrderRescheduleInfoDTO::getSubjectItemNo, TpProdOrderRescheduleInfoDTO::getRescheduleSubjectItemNo, (k1, k2) -> k2)); + + // 替换售卖单元编号 + // 订单记录改签的价格信息替换 + BigDecimal discountAmount = BigDecimal.ZERO; + BigDecimal originalAmount = BigDecimal.ZERO; + for (TpOrderPriceRecordVO priceRecord : orderPriceRecordList) { + for (TpProdOrderPriceRecordDetailVO priceDetail : priceRecord.getOrderPriceRecordDetails()) { + String newSaleUnitNo = oldSaleUnitMappingNewSaleUnit.get(priceDetail.getItemNo()); + List rescheduleInfosByReSubjectItemNo = rescheduleInfos.stream().filter(info -> info.getRescheduleSubjectItemNo().equals(newSaleUnitNo)).collect(Collectors.toList()); + + BigDecimal singleDiscountAmount = new BigDecimal(priceDetail.getSingleDiscountAmount()); + BigDecimal singleOriginalAmount = new BigDecimal(priceDetail.getSingleOriginalAmount()); + + // 实名制 + if (StrUtil.isNotBlank(newSaleUnitNo)){ + priceDetail.setItemNo(newSaleUnitNo); + + // 拉了一坨粑粑 + if (oldOrderDetailVO.getIdentityVerificat() == 1) { + for (TpProdOrderRescheduleInfoDTO rescheduleInfo : rescheduleInfosByReSubjectItemNo) { + if (StrUtil.equals(priceDetail.getPassengerType(), rescheduleInfo.getPassengerType())) { + discountAmount = discountAmount.add(singleDiscountAmount.multiply(new BigDecimal(rescheduleInfo.getPassengerCount()))); + originalAmount = originalAmount.add(singleOriginalAmount.multiply(new BigDecimal(rescheduleInfo.getPassengerCount()))); + } + } + } + + // 非实名 + if (oldOrderDetailVO.getIdentityVerificat() == 0) { + priceDetail.setItemNo(newSaleUnitNo); + Map rescheduleInfoDTOMap = rescheduleInfosByReSubjectItemNo.stream().collect(Collectors.toMap(TpProdOrderRescheduleInfoDTO::getRescheduleSubjectItemNo, Function.identity())); + + discountAmount = discountAmount.add(singleDiscountAmount.multiply(new BigDecimal(rescheduleInfoDTOMap.get(newSaleUnitNo).getPassengerCount()))); + originalAmount = originalAmount.add(singleOriginalAmount.multiply(new BigDecimal(rescheduleInfoDTOMap.get(newSaleUnitNo).getPassengerCount()))); + } + } + } + } + + createDTO.setOriginalAmount(originalAmount.setScale(2, RoundingMode.DOWN).toString()); + createDTO.setPayAmount(discountAmount.setScale(2, RoundingMode.DOWN).toString()); + LogUtil.info("替换后询价信息:{}", JSONUtil.toJsonStr(orderPriceRecordList)); + return orderConverter.convert2OrderPriceDTO(orderPriceRecordList); + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpRescheduleVoucherInvalidCheckNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpRescheduleVoucherInvalidCheckNode.java new file mode 100644 index 0000000..69c87ab --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpRescheduleVoucherInvalidCheckNode.java @@ -0,0 +1,63 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.check; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradeprod.biz.service.flow.context.*; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.enums.TpFlowProcessTypeEnum; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.facade.TpVoucherAcceptanceFacade; +import com.deepinnet.tptradeprod.common.vo.TpQueryAvailableRescheduleVoucherDTO; +import com.yomahub.liteflow.annotation.*; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import org.apache.commons.collections4.CollectionUtils; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + + +@LiteflowComponent(value = "invalidVoucherCheckNode", name = "改签失效凭证校验节点") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +public class TpRescheduleVoucherInvalidCheckNode { + + @Resource + private TpVoucherAcceptanceFacade voucherAcceptanceFacade; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点:改签失效凭证校验节点"); + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + + List invalidVoucherDTOs = userPlaceOrderContext.getOrderRescheduleDTO().getInvalidVoucherDTOs(); + List voucherNos = invalidVoucherDTOs + .stream() + .distinct() + .map(TpProdInvalidVoucherDTO::getVoucherNo) + .collect(Collectors.toList()); + + TpProdQueryAvailableRescheduleVoucherDTO queryDTO = new TpProdQueryAvailableRescheduleVoucherDTO(); + queryDTO.setProductCode(userPlaceOrderContext.getOrderDetailVO().getProductNo()); + queryDTO.setApplyTime(System.currentTimeMillis()); + queryDTO.setTenantId(userPlaceOrderContext.getTenantId()); + queryDTO.setOrderDetailVO(userPlaceOrderContext.getOrderDetailVO()); + queryDTO.setProcessType(TpFlowProcessTypeEnum.CONFIRM_RESCHEDULE_ORDER.getCode()); + queryDTO.setVoucherNos(voucherNos); + + TpResult result = voucherAcceptanceFacade.queryAvailableRescheduleVoucherList(queryDTO); + if (!result.isSuccess()) { + LogUtil.error("改签失效凭证节点校验失败,当前选中的凭证不支持改签,上下文为:{}", JSONUtil.toJsonStr(userPlaceOrderContext)); + throw new TpTradeProdException(TpTradeProdErrorCode.RESCHEDULE_INVALID_VOUCHER_PROCESS_ERROR, TpTradeProdErrorCode.RESCHEDULE_INVALID_VOUCHER_PROCESS_ERROR.getDesc()); + } + + List voucherList = result.getData().getVoucherList(); + if (CollectionUtils.isEmpty(voucherList) || voucherList.size() != voucherNos.size()) { + LogUtil.error("待改签的凭证对应的发车时间不支持改签,上下文为:{}", JSONUtil.toJsonStr(userPlaceOrderContext)); + throw new TpTradeProdException(TpTradeProdErrorCode.RESCHEDULE_INVALID_VOUCHER_PROCESS_ERROR, TpTradeProdErrorCode.RESCHEDULE_INVALID_VOUCHER_PROCESS_ERROR.getDesc()); + } + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpRescheduleVoucherTimeCheckNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpRescheduleVoucherTimeCheckNode.java new file mode 100644 index 0000000..9a7ee9e --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/check/TpRescheduleVoucherTimeCheckNode.java @@ -0,0 +1,155 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.check; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpbaseopcore.common.dto.route.RouteRollTimeDetailDTO; +import com.deepinnet.tpproductcore.common.dto.rule.*; +import com.deepinnet.tpproductcore.common.enums.TpRuleExpressionGroupEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpRescheduleOrderContext; +import com.deepinnet.tptradeprod.biz.util.*; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.*; +import com.deepinnet.tptradeprod.common.vo.*; +import com.google.common.collect.Lists; +import com.yomahub.liteflow.annotation.*; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.util.Assert; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + + +@LiteflowComponent(value = "rescheduleVoucherTimeCheckNode", name = "改签订单凭证时间校验节点") +@LiteflowCmpDefine +public class TpRescheduleVoucherTimeCheckNode { + + @Resource + private TpBizRuleClient bizRuleClient; + + @Resource + private TpRouteClient routeClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 改签订单凭证时间校验节点"); + TpRescheduleOrderContext rescheduleOrderContext = bindCmp.getContextBean(TpRescheduleOrderContext.class); + TpProdOrderDetailVO orderDetailVO = rescheduleOrderContext.getOrderDetailVO(); + List voucherList = rescheduleOrderContext.getVoucherList(); + Long applyTime = rescheduleOrderContext.getApplyTime(); + List expressionList = rescheduleOrderContext.getRuleExpressionList(); + String tenantId = rescheduleOrderContext.getTenantId(); + + List firstShuttleDepartureTimeList = calculateFirstShuttleDepartureTime(voucherList, orderDetailVO, tenantId); + + // 20240718 与开阳确认,批量接口返回的list是严格按照入参的顺序返回的 + List resultList = rescheduleTicketTimeRuleCheck(firstShuttleDepartureTimeList, expressionList, applyTime, tenantId); + List invalidRescheduleVouchers = Lists.newArrayList(); + for (int i = 0; i < resultList.size(); i++) { + TpProdVoucherDTO voucherDTO = voucherList.get(i); + if (!resultList.get(i)) { + invalidRescheduleVouchers.add(voucherDTO); + } + } + voucherList.removeAll(invalidRescheduleVouchers); + + if (CollectionUtils.isEmpty(voucherList)) { + LogUtil.error("当前订单不存在支持改签的凭证,只有未核销的次票支持改签,订单号:{}", rescheduleOrderContext.getOrderNo()); + throw new TpTradeProdException(TpTradeProdErrorCode.NOT_FOUND_AVAILABLE_RESCHEDULE_VOUCHER); + } + + TpQueryAvailableRescheduleVoucherDTO rescheduleVoucherDTO = buildAvailableRescheduleVoucherVO(voucherList, orderDetailVO, voucherList.get(0).getType()); + rescheduleOrderContext.setRescheduleVoucherDTO(rescheduleVoucherDTO); + } + + + private TpQueryAvailableRescheduleVoucherDTO buildAvailableRescheduleVoucherVO(List availableVoucherList, TpProdOrderDetailVO orderDetailVO, String voucherType) { + List availableRescheduleVouchers = Lists.newArrayList(); + availableVoucherList.forEach(v -> { + Integer availableRescheduleCount = TpVoucherUtil.calculateRefundPassengerCount(v); + TpAvailableRescheduleVoucherDTO availableRescheduleVoucher = new TpAvailableRescheduleVoucherDTO(); + availableRescheduleVoucher.setSalesUnitCode(v.getSalesUnitCode()); + availableRescheduleVoucher.setPassenger(v.getPassenger()); + availableRescheduleVoucher.setVoucherNo(v.getVoucherNo()); + availableRescheduleVoucher.setTripType(v.getTripType()); + availableRescheduleVoucher.setOrderNo(v.getOrderNo()); + availableRescheduleVoucher.setType(v.getType()); + availableRescheduleVoucher.setAvailableReschedulePassengerCount(availableRescheduleCount); + availableRescheduleVouchers.add(availableRescheduleVoucher); + }); + + List tripTypes = availableVoucherList.stream() + .map(TpProdVoucherDTO::getTripType) + .distinct() + .collect(Collectors.toList()); + TpQueryAvailableRescheduleVoucherDTO queryVO = new TpQueryAvailableRescheduleVoucherDTO(); + queryVO.setVoucherList(availableRescheduleVouchers); + queryVO.setVoucherType(voucherType); + queryVO.setTripTypes(tripTypes); + queryVO.setTpOrderRoute(orderDetailVO.getTpOrderRoutes().get(0)); + return queryVO; + } + + /** + * 改签时间规则校验 + */ + private List rescheduleTicketTimeRuleCheck(List departureTimeList, List expressionList, Long applyTime, String tenantId) { + List> executeDTOs = Lists.newArrayList(); + for (Long departureTime : departureTimeList) { + TpRuleExecuteDTO executeDTO = new TpRuleExecuteDTO<>(); + TpRescheduleParamDTO rescheduleParamDTO = new TpRescheduleParamDTO(); + rescheduleParamDTO.setRescheduleTime(System.currentTimeMillis()); + rescheduleParamDTO.setDepartureTime(departureTime); + executeDTO.setParameter(rescheduleParamDTO); + executeDTO.setRuleList(expressionList); + executeDTO.setRuleExpressionGroup(TpRuleExpressionGroupEnum.RESCHEDULE_RESTRICTION); + executeDTO.setTenantId(tenantId); + executeDTOs.add(executeDTO); + } + + TpRuleExecuteBatchResultVO executeResultVO = bizRuleClient.batchExecuteBizRule(executeDTOs); + List> resultList = executeResultVO.getResultList(); + if (CollectionUtils.isEmpty(resultList)) { + LogUtil.error("改签时间规则校验失败,结果返回为空,入参:{}", JSONUtil.toJsonStr(executeDTOs)); + throw new TpTradeProdException(TpTradeProdErrorCode.NOT_SUPPORT_RESCHEDULE_TIME); + } + + List res = resultList.stream().map(TpRuleExecuteResultVO::getResult).collect(Collectors.toList()); + LogUtil.info("判断凭证发车时间能否改签,调用规则域结果为:{},入参为:{}", JSONUtil.toJsonStr(executeResultVO), JSONUtil.toJsonStr(executeDTOs)); + return res; + } + + + private List calculateFirstShuttleDepartureTime(List voucherList, TpProdOrderDetailVO orderDetail, String tenantId) { + List orderRoutes = orderDetail.getTpOrderRoutes(); + Assert.notEmpty(orderRoutes, "线路信息不能为空"); + TpOrderRouteVO routeVO = orderRoutes.get(0); + List departureTimeList = Lists.newArrayList(); + + // 有班次,普通班车 + if (routeVO.getTpOrderRouteShuttle() != null) { + List orderRouteShuttleList = routeVO.getTpOrderRouteShuttle(); + Map> orderRouteShuttleMap = orderRouteShuttleList.stream() + .collect(Collectors.groupingBy(TpOrderRouteShuttleVO::getShuttleNo)); + + voucherList.forEach(voucherDTO -> { + TpOrderRouteShuttleVO routeShuttle = orderRouteShuttleMap.get(voucherDTO.getShuttleId()).get(0); + Long departureTime = TimeConvertUtil.convertDateAndTime2Timestamp(voucherDTO.getEffectiveStartTime(), routeShuttle.getShuttleTime()); + departureTimeList.add(departureTime); + }); + } else { + // 滚动发车 + RouteRollTimeDetailDTO routeRollTimeDetail = routeClient.getRouteRollTime(routeVO.getRouteNo(), tenantId); + Assert.notNull(routeRollTimeDetail, "线路详情不能为空"); + + String roundTrip = routeVO.getRoundTrip(); + return TpVoucherUtil.calculateRollTimeRouteVoucherDepartureTime(roundTrip, voucherList, routeRollTimeDetail); + } + + return departureTimeList; + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/BatchDeductToRollbackInventoryNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/BatchDeductToRollbackInventoryNode.java new file mode 100644 index 0000000..437f074 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/BatchDeductToRollbackInventoryNode.java @@ -0,0 +1,74 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import cn.hutool.core.lang.Assert; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpproductcore.common.dto.inventory.TpInventoryOperationDTO; +import com.deepinnet.tpproductcore.common.enums.*; +import com.deepinnet.tptradeprod.biz.service.flow.refundTicket.context.TpRefundTicketCommonContext; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.service.integration.client.TpInventoryClient; +import com.google.common.collect.Lists; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import org.apache.commons.collections4.CollectionUtils; + +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +/** + * @author amos wong + * @create 2023/10/16 15:38 + * @Description + */ +/*@LiteflowComponent(value = "deductToRollbackInventoryNode", name = "回滚已扣减库存节点") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3)*/ +@Deprecated +public class BatchDeductToRollbackInventoryNode { + + //@Resource + private TpInventoryClient inventoryClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + TpRefundTicketCommonContext commonContext = bindCmp.getContextBean(TpRefundTicketCommonContext.class); + LogUtil.info("执行批量扣减库存节点,入参为:{}", JSONUtil.toJsonStr(commonContext)); + + List refundApplyOrderList = commonContext.getRefundApplyOrderDTOs(); + TpProdRefundApplyDTO refundApplyDTO = commonContext.getRefundTicketApplyContext().getRefundApplyDTO(); + + Assert.notEmpty(refundApplyOrderList, "退票申请单不存在"); + Assert.isTrue(refundApplyOrderList.size() == 1, "同一个退票申请单号查询到多笔退票申请单"); + TpProdRefundApplyOrderDTO refundApplyOrderDTO = refundApplyOrderList.get(0); + List refundSubjectItemDTOs = refundApplyOrderDTO.getSubjectItemList(); + + List operationDTOs = Lists.newArrayList(); + Map refundItemMap; + + // 实名认证 + if (CollectionUtils.isNotEmpty(refundApplyDTO.getRealNameTicketRefundChoiceDTOs())) { + refundItemMap = refundSubjectItemDTOs.stream().collect(Collectors.groupingBy(TpRefundSubjectItemDTO::getSubjectItemId, Collectors.collectingAndThen(Collectors.toList(), List::size))); + } else { + refundItemMap = refundSubjectItemDTOs.stream().collect(Collectors.groupingBy(TpRefundSubjectItemDTO::getSubjectItemId, Collectors.summingInt(TpRefundSubjectItemDTO::getQuantity))); + } + + AtomicInteger sequence = new AtomicInteger(0); + refundItemMap.forEach((itemNo, count) -> { + TpInventoryOperationDTO operationDTO = new TpInventoryOperationDTO(); + operationDTO.setCarrierCode(itemNo); + operationDTO.setBizType(TpInventoryBizTypeEnum.ORDER.getType()); + operationDTO.setBizNo(refundApplyOrderDTO.getRefundApplyOrderNo()); + operationDTO.setOperationInventoryCount(count); + operationDTO.setOperationType(TpInventoryOperationTypeEnum.DEDUCT_TO_ROLLBACK.getType()); + operationDTO.setTransactionNo(refundApplyOrderDTO.getRefundApplyOrderNo() + sequence); + operationDTO.setTenantId(refundApplyDTO.getTenantId()); + operationDTOs.add(operationDTO); + sequence.incrementAndGet(); + }); + + inventoryClient.batchOperateInventory(operationDTOs); + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpBuildVoucherNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpBuildVoucherNode.java new file mode 100644 index 0000000..b407581 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpBuildVoucherNode.java @@ -0,0 +1,812 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.*; +import cn.hutool.core.lang.Pair; +import cn.hutool.core.util.*; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.constants.GlobalConstants; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpbaseopcore.common.constants.RouteConstants; +import com.deepinnet.tpbaseopcore.common.dto.route.RouteRollTimeDetailDTO; +import com.deepinnet.tpbaseopcore.common.dto.time.RollTimeDTO; +import com.deepinnet.tpproductcore.common.dto.product.*; +import com.deepinnet.tpproductcore.common.dto.rule.*; +import com.deepinnet.tpproductcore.common.dto.rule.result.TpTicketShowStartTimeResult; +import com.deepinnet.tpproductcore.common.enums.*; +import com.deepinnet.tpproductcore.common.utils.TicketDateRangeParser; +import com.deepinnet.tptradecore.common.enums.order.TpOrderModulesEnum; +import com.deepinnet.tptradecore.common.enums.voucher.*; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.enums.*; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.*; +import com.deepinnet.tptradeprod.common.service.integration.convert.TpBizRuleConvert; +import com.deepinnet.tptradeprod.common.util.constants.BizDataKeyConstants; +import com.deepinnet.tptradeprod.common.vo.*; +import com.google.common.collect.*; +import com.yomahub.liteflow.annotation.*; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.jetbrains.annotations.*; +import org.springframework.util.Assert; + +import java.time.*; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + *

+ * 构建凭证节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "buildVoucherNode", name = "生成凭证节点") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +@RequiredArgsConstructor +public class TpBuildVoucherNode { + + private final TpOrderClient tpOrderClient; + + private final TpVoucherClient tpVoucherClient; + + private final TpBizRuleClient bizRuleClient; + + private final TpRouteClient routeClient; + + private final TpBizRuleConvert bizRuleConvert; + + private static final DateTimeFormatter TIME_FORMAT = DateTimeFormatter.ofPattern(GlobalConstants.TIME_FORMAT); + + private static final String EVERY_DAY_LAST_TIME = "23:59"; + private static final String EVERY_DAY_EARLIEST_TIME = "00:00"; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 生成凭证"); + + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + TpProdDetailDTO productDetailDTO = userPlaceOrderContext.getProductDTO(); + TpProdOrderDetailVO orderDetail; + String processType = userPlaceOrderContext.getProcessType(); + // 确认改签接口需要重新查询最新的订单详情 + if (StringUtils.equals(processType, TpFlowProcessTypeEnum.CONFIRM_RESCHEDULE_ORDER.getCode())) { + TpProdOrderQueryDTO orderQueryDTO = new TpProdOrderQueryDTO(); + orderQueryDTO.setOrderNo(userPlaceOrderContext.getOrderNo()); + orderQueryDTO.setTenantId(userPlaceOrderContext.getTenantId()); + orderQueryDTO.setNeedModules(Lists.newArrayList(TpOrderModulesEnum.ORDER_ROUTE_INFO.getModule(), TpOrderModulesEnum.ORDER_SUBJECT_ITEM.getModule(), TpOrderModulesEnum.ORDER_TRAVEL_TRIP.getModule())); + orderDetail = tpOrderClient.getOrderDetail(orderQueryDTO); + } else { + // 订单查询 + orderDetail = userPlaceOrderContext.getOrderDetailVO(); + } + + // 塞入订单详情 + userPlaceOrderContext.setOrderDetailVO(orderDetail); + + List rules = productDetailDTO.getRules(); + Assert.notEmpty(rules, "产品的规则列表不能为空"); + + // 每个乘客每天限制乘车次数 + List allNeedSaveRules = Lists.newArrayList(); + Map> bizRuleMap = rules.stream().collect(Collectors.groupingBy(TpBizRuleDTO::getRuleGroup)); + + List ticketCheckRules = bizRuleMap.get(TpRuleExpressionGroupEnum.TICKET_CHECK.getCode()); + Assert.notEmpty(ticketCheckRules, "凭证检票规则不能为空"); + allNeedSaveRules.addAll(ticketCheckRules); + + // 处理普通单程车票 + Map perTicketTotalAvailableCountMap; + if (!StringUtils.equals(orderDetail.getTripType(), TpTripTypeEnum.ROUND.getCode())) { + Integer perTicketTotalAvailableCount = getSingleTripPerTicketTotalAvailableCount(orderDetail, bizRuleMap, allNeedSaveRules, userPlaceOrderContext); + perTicketTotalAvailableCountMap = Maps.newHashMap(); + perTicketTotalAvailableCountMap.put(orderDetail.getTripType(), perTicketTotalAvailableCount); + } else { + perTicketTotalAvailableCountMap = getRoundTripPerTicketTotalAvailableCount(orderDetail, bizRuleMap, allNeedSaveRules, userPlaceOrderContext); + } + + // 构建凭证 + TpProdVoucherCreateDTO tpProdVoucherCreateDTO = buildVoucherCreateDTO(userPlaceOrderContext.getTenantId(), orderDetail, perTicketTotalAvailableCountMap, productDetailDTO, allNeedSaveRules); + + // 生成凭证 + tpVoucherClient.generateVoucher(tpProdVoucherCreateDTO); + } + + + private Map getRoundTripPerTicketTotalAvailableCount(TpProdOrderDetailVO orderDetail, Map> bizRuleMap, List allNeedSaveRules, TpUserPlaceOrderContext userPlaceOrderContext) { + if (!StringUtils.equals(orderDetail.getTicketType(), TpProdOrderTicketTypeEnum.DAY.getTicketType())) { + LogUtil.error("当前车票类型不允许购买往返程,订单编号:{},车票类型:{}", orderDetail.getOrderNo(), orderDetail.getTicketType()); + throw new TpTradeProdException(TpTradeProdErrorCode.ROUND_TRIP_NOT_SUPPORT_TICKET_TYPE, TpTradeProdErrorCode.ROUND_TRIP_NOT_SUPPORT_TICKET_TYPE.getDesc()); + } + + List everyDayCountRules = bizRuleMap.get(TpRuleExpressionGroupEnum.SINGLE_TICKET_TRIPS_LIMIT.getCode()); + Assert.notEmpty(everyDayCountRules, "次票的每天每个乘客乘车次数限制规则不能为空"); + allNeedSaveRules.addAll(everyDayCountRules); + List everyDayCountExpressionList = everyDayCountRules.stream().map(TpBizRuleDTO::getExpression).collect(Collectors.toList()); + + Optional goOptional = orderDetail.getOrderSubjectItem().stream() + .filter(i -> StringUtils.equals(i.getTripType(), TpTripTypeEnum.GO.getCode())) + .findFirst(); + Optional backOptional = orderDetail.getOrderSubjectItem().stream() + .filter(i -> StringUtils.equals(i.getTripType(), TpTripTypeEnum.BACK.getCode())) + .findFirst(); + if (goOptional.isEmpty() || backOptional.isEmpty()) { + LogUtil.error("往返程车票去程标的项或者返程标的项不存在, 标的项信息为:{}", JSONUtil.toJsonStr(orderDetail.getOrderSubjectItem())); + throw new TpTradeProdException(TpTradeProdErrorCode.RESCHEDULE_NOT_FOUND_TRIP_TYPE_SUBJECT_ITEM); + } + Integer goPassengerCount = goOptional.get().getCount(); + Integer backPassengerCount = backOptional.get().getCount(); + + // 获取每张票的总的可用次数,次票调用每日每天限乘次数规则即可 + return getRoundTripDayTicketPerTicketTotalAvailableCount(everyDayCountExpressionList, goPassengerCount, backPassengerCount, userPlaceOrderContext.getTenantId()); + } + + private Integer getSingleTripPerTicketTotalAvailableCount(TpProdOrderDetailVO orderDetail, Map> bizRuleMap, List allNeedSaveRules, TpUserPlaceOrderContext userPlaceOrderContext) { + // 乘车人数 + Integer passengerCount = Objects.equals(orderDetail.getIdentityVerificat(), TpProdOrderIdentityFlagEnum.NOT_REAL_NAME_ORDER.getIdentityFlag()) ? orderDetail.getOrderSubjectItem().get(0).getCount() : 1; + Integer perTicketTotalAvailableCount; + if (StringUtils.equals(orderDetail.getTicketType(), TpProdOrderTicketTypeEnum.DAY.getTicketType())) { + List everyDayCountRules = bizRuleMap.get(TpRuleExpressionGroupEnum.SINGLE_TICKET_TRIPS_LIMIT.getCode()); + Assert.notEmpty(everyDayCountRules, "次票的每天每个乘客乘车次数限制规则不能为空"); + allNeedSaveRules.addAll(everyDayCountRules); + List everyDayCountExpressionList = everyDayCountRules.stream().map(TpBizRuleDTO::getExpression).collect(Collectors.toList()); + + // 获取每张票的总的可用次数,日票调用每日每天限乘次数规则即可 + perTicketTotalAvailableCount = getDayTicketPerTicketTotalAvailableCount(everyDayCountExpressionList, passengerCount, userPlaceOrderContext.getTenantId()); + // 非日票需要调用获取票可用总次数的接口 + } else if (StringUtils.equals(orderDetail.getTicketType(), TpProdOrderTicketTypeEnum.WEEK.getTicketType())) { + // 周票总可用次数 + perTicketTotalAvailableCount = getPerTicketTotalAvailableCount(bizRuleMap, allNeedSaveRules, passengerCount, TpRuleExpressionGroupEnum.WEEK_TICKET_USE_LIMIT, TpRuleExpressionGroupEnum.WEEK_TICKET_TRIPS_LIMIT, userPlaceOrderContext.getTenantId()); + } else if (StringUtils.equals(orderDetail.getTicketType(), TpProdOrderTicketTypeEnum.MONTH.getTicketType())) { + // 月票总可用次数 + perTicketTotalAvailableCount = getPerTicketTotalAvailableCount(bizRuleMap, allNeedSaveRules, passengerCount, TpRuleExpressionGroupEnum.MONTH_TICKET_USE_LIMIT, TpRuleExpressionGroupEnum.MONTH_TICKET_TRIPS_LIMIT, userPlaceOrderContext.getTenantId()); + } else if (StringUtils.equals(orderDetail.getTicketType(), TpProdOrderTicketTypeEnum.TERM.getTicketType())) { + perTicketTotalAvailableCount = getPerTicketTotalAvailableCount(bizRuleMap, allNeedSaveRules, passengerCount, TpRuleExpressionGroupEnum.SEMESTER_TICKET_USE_LIMIT, TpRuleExpressionGroupEnum.SEMESTER_TICKET_TRIPS_LIMIT, userPlaceOrderContext.getTenantId()); + } else if (StringUtils.equals(orderDetail.getTicketType(), TpProdOrderTicketTypeEnum.DAY_RANGE.getTicketType())) { + perTicketTotalAvailableCount = getPerTicketTotalAvailableCount(bizRuleMap, allNeedSaveRules, passengerCount, TpRuleExpressionGroupEnum.DAY_RANGE_TICKET_USE_LIMIT, TpRuleExpressionGroupEnum.DAY_RANGE_TICKET_TRIPS_LIMIT, userPlaceOrderContext.getTenantId()); + } else { + LogUtil.error("支付成功生成凭证时错误,原因为:当前用户购买了不支持的票种类型,订单编号为:{}", orderDetail.getOrderNo()); + throw new TpTradeProdException(TpTradeProdErrorCode.INVALID_TICKET_TYPE); + } + return perTicketTotalAvailableCount; + } + + private Integer getPerTicketTotalAvailableCount(Map> bizRuleMap, List allNeedSaveRules, Integer passengerCount, + TpRuleExpressionGroupEnum everyDayCountRuleGroup, TpRuleExpressionGroupEnum totalCountRuleGroup, String tenantId) { + // 先保存每天总可用次数的规则 + List everyDayAvailableCountRules = bizRuleMap.get(everyDayCountRuleGroup.getCode()); + Assert.notEmpty(everyDayAvailableCountRules, "每天可用次数规则不能为空"); + allNeedSaveRules.addAll(everyDayAvailableCountRules); + + // 获取总可用次数的规则 + List totalCountBizRules = bizRuleMap.get(totalCountRuleGroup.getCode()); + Assert.notEmpty(totalCountBizRules, "总可用次数规则不能为空"); + allNeedSaveRules.addAll(totalCountBizRules); + + List totalCountExpressionList = totalCountBizRules.stream().map(TpBizRuleDTO::getExpression).collect(Collectors.toList()); + + return getNonDailyTicketPerTicketTotalAvailableCount(totalCountExpressionList, passengerCount, totalCountRuleGroup, tenantId); + } + + private TpProdOrderDetailVO queryOrderDetail(String orderNo, String tenantId) { + List modules = Lists.newArrayList(); + modules.add(TpOrderModulesEnum.ORDER_SUBJECT_ITEM.getModule()); + modules.add(TpOrderModulesEnum.ORDER_ROUTE_INFO.getModule()); + modules.add(TpOrderModulesEnum.ORDER_TRAVEL_TRIP.getModule()); + return tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .orderNo(orderNo) + .tenantId(tenantId) + .needModules(modules).build()); + } + + /** + * 获取日票的总可用次数 + * + * @param expressionList 规则表达式,取每天每个乘客可乘坐次数规则 + * @param passengerCount 乘客人数 + * @return + */ + private Integer getDayTicketPerTicketTotalAvailableCount(List expressionList, Integer passengerCount, String tenantId) { + TpRuleExecuteDTO ruleExecuteDTO = new TpRuleExecuteDTO<>(); + TpRollShuttleTripsParamDTO checkParamDTO = new TpRollShuttleTripsParamDTO(); + ruleExecuteDTO.setRuleList(expressionList); + ruleExecuteDTO.setParameter(checkParamDTO); + ruleExecuteDTO.setTenantId(tenantId); + checkParamDTO.setPassengerCount(passengerCount); + ruleExecuteDTO.setRuleExpressionGroup(TpRuleExpressionGroupEnum.SINGLE_TICKET_TRIPS_LIMIT); + + TpRuleExecuteResultVO executeResult = bizRuleClient.executeRule(ruleExecuteDTO); + return executeResult.getResult(); + } + + private Map getRoundTripDayTicketPerTicketTotalAvailableCount(List expressionList, Integer goPassengerCount, Integer backPassengerCount, String tenantId) { + List> executeDTOs = Lists.newArrayList(); + TpRuleExecuteDTO goRuleExecuteDTO = new TpRuleExecuteDTO<>(); + TpRollShuttleTripsParamDTO checkParamDTO = new TpRollShuttleTripsParamDTO(); + goRuleExecuteDTO.setRuleList(expressionList); + goRuleExecuteDTO.setParameter(checkParamDTO); + goRuleExecuteDTO.setTenantId(tenantId); + checkParamDTO.setPassengerCount(goPassengerCount); + goRuleExecuteDTO.setRuleExpressionGroup(TpRuleExpressionGroupEnum.SINGLE_TICKET_TRIPS_LIMIT); + executeDTOs.add(goRuleExecuteDTO); + + TpRuleExecuteDTO backRuleExecuteDTO = new TpRuleExecuteDTO<>(); + TpRollShuttleTripsParamDTO backCheckParamDTO = new TpRollShuttleTripsParamDTO(); + backRuleExecuteDTO.setRuleList(expressionList); + backRuleExecuteDTO.setParameter(backCheckParamDTO); + backRuleExecuteDTO.setTenantId(tenantId); + backCheckParamDTO.setPassengerCount(backPassengerCount); + backRuleExecuteDTO.setRuleExpressionGroup(TpRuleExpressionGroupEnum.SINGLE_TICKET_TRIPS_LIMIT); + executeDTOs.add(backRuleExecuteDTO); + + TpRuleExecuteBatchResultVO executeBatchResultVO = bizRuleClient.batchExecuteBizRule(executeDTOs); + List> resultList = executeBatchResultVO.getResultList(); + if (CollectionUtils.isEmpty(resultList)) { + LogUtil.error("总检票次数规则校验失败,结果返回为空,入参:{}", JSONUtil.toJsonStr(executeDTOs)); + throw new TpTradeProdException(TpTradeProdErrorCode.INVALID_REFUND_TIME); + } + + Map resMap = new HashMap<>(); + resMap.put(TpTripTypeEnum.GO.getCode(), resultList.get(0).getResult()); + resMap.put(TpTripTypeEnum.BACK.getCode(), resultList.get(1).getResult()); + return resMap; + } + + /** + * 获取非日票的总可用次数 + * + * @param expressionList 规则表达式,取周票、月票、学期票总可用次数规则 + * @param passengerCount 乘客人数 + * @return + */ + private Integer getNonDailyTicketPerTicketTotalAvailableCount(List expressionList, Integer passengerCount, TpRuleExpressionGroupEnum ruleGroup, String tenantId) { + TpRuleExecuteDTO ruleExecuteDTO = new TpRuleExecuteDTO<>(); + TpTicketTripsParamDTO ticketTripsParamDTO = new TpTicketTripsParamDTO(); + ruleExecuteDTO.setRuleList(expressionList); + ruleExecuteDTO.setParameter(ticketTripsParamDTO); + ruleExecuteDTO.setTenantId(tenantId); + ticketTripsParamDTO.setPassengerCount(passengerCount); + ruleExecuteDTO.setRuleExpressionGroup(ruleGroup); + + TpRuleExecuteResultVO executeResult = bizRuleClient.executeRule(ruleExecuteDTO); + return executeResult.getResult(); + } + + private Long ticketCheckTimeRule(List expressionList, String earliestCheckTime, String tenantId) { + Long earliestAvailableCheckTime = convertCheckTime2Timestamp(earliestCheckTime); + TpRuleExecuteDTO ruleExecuteDTO = new TpRuleExecuteDTO<>(); + TpTicketCheckParamDTO checkParamDTO = new TpTicketCheckParamDTO(); + checkParamDTO.setDepartureTime(earliestAvailableCheckTime); + ruleExecuteDTO.setRuleList(expressionList); + ruleExecuteDTO.setParameter(checkParamDTO); + ruleExecuteDTO.setTenantId(tenantId); + ruleExecuteDTO.setRuleExpressionGroup(TpRuleExpressionGroupEnum.TICKET_CHECK); + + LogUtil.info("请求规则域执行规则的接口,规则为:验票时间段校验规则,入参为:{}", JSONUtil.toJsonStr(ruleExecuteDTO)); + TpRuleExecuteResultVO executeResult = bizRuleClient.executeRule(ruleExecuteDTO); + return executeResult.getResult().getShowTime(); + } + + private List batchExecuteTicketCheckTimeRule(List expressionList, List earliestCheckTimeList, String tenantId) { + List> ruleExecuteDTOs = Lists.newArrayList(); + earliestCheckTimeList.forEach(earliestCheckTime -> { + TpRuleExecuteDTO ruleExecuteDTO = new TpRuleExecuteDTO<>(); + TpTicketCheckParamDTO checkParamDTO = new TpTicketCheckParamDTO(); + checkParamDTO.setDepartureTime(earliestCheckTime); + ruleExecuteDTO.setRuleList(expressionList); + ruleExecuteDTO.setParameter(checkParamDTO); + ruleExecuteDTO.setTenantId(tenantId); + ruleExecuteDTO.setRuleExpressionGroup(TpRuleExpressionGroupEnum.TICKET_CHECK); + ruleExecuteDTOs.add(ruleExecuteDTO); + }); + + LogUtil.info("请求规则域执行规则的接口,规则为:验票时间段校验规则,入参为:{}", JSONUtil.toJsonStr(ruleExecuteDTOs)); + TpRuleExecuteBatchResultVO batchExecuteResult = bizRuleClient.batchExecuteBizRule(ruleExecuteDTOs); + + List executeRes = Lists.newArrayList(); + batchExecuteResult.getResultList().forEach(res -> { + Boolean success = res.getSuccess(); + if (!success) { + LogUtil.error("批量执行检票规则失败,结果为:{}", JSONUtil.toJsonStr(batchExecuteResult)); + throw new TpTradeProdException(TpTradeProdErrorCode.BATCH_EXECUTE_RULE_ERROR); + } + + executeRes.add(res.getResult()); + }); + + return executeRes; + } + + private static Long convertCheckTime2Timestamp(String checkTime) { + // 最早检票时间08:00 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(GlobalConstants.TIME_FORMAT); + LocalTime curTime = LocalTime.parse(checkTime, formatter); + + // 非日票,发车时间取当天的时间 + LocalDateTime localDateTime = LocalDateTime.of(LocalDate.now(), curTime); + return localDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); + } + + private static Map batchConvertCheckTime2Timestamp(List checkTimeList) { + Map checkTimeMap = Maps.newHashMap(); + for (String checkTime : checkTimeList) { + Long checkTimestamp = convertCheckTime2Timestamp(checkTime); + checkTimeMap.put(checkTime, checkTimestamp); + } + return checkTimeMap; + } + + private TpProdVoucherCreateDTO buildVoucherCreateDTO(String tenantId, TpProdOrderDetailVO orderDetail, Map perTicketTotalAvailableCountMap, + TpProdDetailDTO productDetailDTO, List allNeedSaveRules) { + TpProdVoucherCreateDTO tpProdVoucherCreateDTO = new TpProdVoucherCreateDTO(); + tpProdVoucherCreateDTO.setUserNo(orderDetail.getUserNo()); + tpProdVoucherCreateDTO.setOrderNo(orderDetail.getOrderNo()); + tpProdVoucherCreateDTO.setRouteId(CollUtil.isNotEmpty(orderDetail.getTpOrderRoutes()) ? orderDetail.getTpOrderRoutes().get(0).getRouteNo() : null); + tpProdVoucherCreateDTO.setRouteName(CollUtil.isNotEmpty(orderDetail.getTpOrderRoutes()) ? orderDetail.getTpOrderRoutes().get(0).getRouteName() : null); + + List ticketChoiceDTOs = Lists.newArrayList(); + TpOrderRouteVO orderRoute = orderDetail.getTpOrderRoutes().get(0); + List orderRouteShuttleList = orderRoute.getTpOrderRouteShuttle(); + List tripTypeList = orderDetail.getTpOrderTravelTrips() + .stream() + .map(TpOrderTravelTripVO::getTripType) + .distinct() + .collect(Collectors.toList()); + + if (CollectionUtils.isNotEmpty(orderRouteShuttleList)) { + orderRouteShuttleList.forEach(shuttle -> { + TpUserTicketChoiceDTO choiceDTO = new TpUserTicketChoiceDTO(); + choiceDTO.setShuttleId(getShuttleNo(shuttle)); + choiceDTO.setShuttleName(getShuttleName(shuttle)); + choiceDTO.setTripType(shuttle.getTripType()); + ticketChoiceDTOs.add(choiceDTO); + }); + } else { + tripTypeList.forEach(tripType -> { + TpUserTicketChoiceDTO choiceDTO = new TpUserTicketChoiceDTO(); + choiceDTO.setTripType(tripType); + ticketChoiceDTOs.add(choiceDTO); + }); + } + + tpProdVoucherCreateDTO.setTicketChoiceDTOs(ticketChoiceDTOs); + + tpProdVoucherCreateDTO.setVoucherType(orderDetail.getTicketType()); + tpProdVoucherCreateDTO.setRequiredRealName(BooleanUtil.toBoolean(String.valueOf(orderDetail.getIdentityVerificat()))); + tpProdVoucherCreateDTO.setValidationTypes(productDetailDTO.getProductExtraAttributes().getCheckTicketType()); + tpProdVoucherCreateDTO.setTenantId(tenantId); + tpProdVoucherCreateDTO.setProductCategoryNo(orderDetail.getProductCategoryNo()); + tpProdVoucherCreateDTO.setProductCategoryName(orderDetail.getProductCategory()); + + // 设置凭证的有效日期以及乘客信息 + buildVoucherEffectiveDateAndPassenger(tenantId, orderDetail, tpProdVoucherCreateDTO, ticketChoiceDTOs, perTicketTotalAvailableCountMap); + + // 调用产品规则获取凭证的最早检票时间和最晚检票时间 + setValidCheckTime(tpProdVoucherCreateDTO, orderDetail, ticketChoiceDTOs, productDetailDTO, allNeedSaveRules, tenantId); + + // 设置凭证的有效时间(有效日期+具体最早和最晚检票时间),这里需要上面的有效日期+最早和最晚检票时间 + setVoucherEffectiveTime(tpProdVoucherCreateDTO); + + // 调用产品规则查询凭证核销和展示的规则 + setBizRules(tpProdVoucherCreateDTO, allNeedSaveRules); + + // 如果需要一次性全部核销,则打上标签 + TpProductExtendAttributesDTO extendAttributes = productDetailDTO.getExtendAttributes(); + NonRealNameTicketVerificationRules nonRealNameTicketVerificationRule = extendAttributes.getNonRealNameTicketVerificationRule(); + LogUtil.info("读取到的产品拓展属性为:{}", JSONUtil.toJsonStr(productDetailDTO.getExtendAttributes())); + boolean needOneTimeVerificationConfig = nonRealNameTicketVerificationRule == NonRealNameTicketVerificationRules.WHOLE_ORDER; + boolean needOneTimeVerification = needOneTimeVerificationConfig && !tpProdVoucherCreateDTO.getRequiredRealName() && StringUtils.equals(orderDetail.getTicketType(), TpVoucherTypeEnum.DAY.getCode()); + if (needOneTimeVerification) { + Map bizData = new HashMap<>(); + bizData.put(BizDataKeyConstants.ONE_TIME_VERIFICATION_TICKET, true); + tpProdVoucherCreateDTO.setBizData(bizData); + } + + // 判断拼车业务是线下POS机预约/线上预约 + if (Objects.equals(orderDetail.getType(), TpOrderTypeEnum.CARPOOL_ORDER.getType()) && StringUtils.equals(orderDetail.getSource(), TpOrderSourceEnum.POS.getType())) { + tpProdVoucherCreateDTO.setChannel(TpVoucherChannelEnum.OFFLINE_VILLAGE.getCode()); + } else { + tpProdVoucherCreateDTO.setChannel(TpVoucherChannelEnum.ONLINE.getCode()); + } + + return tpProdVoucherCreateDTO; + } + + private void setBizRules(TpProdVoucherCreateDTO voucherCreateDTO, List allNeedSaveRules) { + voucherCreateDTO.setBizRuleDTOs(bizRuleConvert.convert2ProdBizRuleList(allNeedSaveRules)); + } + + private void setVoucherEffectiveTime(TpProdVoucherCreateDTO createDTO) { + if (createDTO.getRequiredRealName()) { + createDTO.getTicketChoiceDTOs().forEach(choiceDTO -> { + List voucherPurchaseInfoList = choiceDTO.getVoucherPurchaseInfoList(); + voucherPurchaseInfoList.forEach(purchaseInfo -> { + String earliestCheckTime = purchaseInfo.getEarliestCheckTime(); + String latestCheckTime = purchaseInfo.getLatestCheckTime(); + Long effectiveStartDate = purchaseInfo.getEffectiveStartTime(); + Long effectiveEndDate = purchaseInfo.getEffectiveEndTime(); + + Long effectiveStartTime = calculateEffectiveTime(earliestCheckTime, effectiveStartDate); + Long effectiveEndTime = calculateEffectiveTime(latestCheckTime, effectiveEndDate); + + purchaseInfo.setEffectiveStartTime(effectiveStartTime); + purchaseInfo.setEffectiveEndTime(effectiveEndTime); + }); + }); + } else { + createDTO.getTicketChoiceDTOs().forEach(choice -> { + List nonRealNameDTOs = choice.getNonRealNameDTOs(); + nonRealNameDTOs.forEach(nonRealNameDTO -> { + String earliestCheckTime = nonRealNameDTO.getEarliestCheckTime(); + String latestCheckTime = nonRealNameDTO.getLatestCheckTime(); + Long effectiveStartDate = nonRealNameDTO.getEffectiveStartTime(); + Long effectiveEndDate = nonRealNameDTO.getEffectiveEndTime(); + + Long effectiveStartTime = calculateEffectiveTime(earliestCheckTime, effectiveStartDate); + Long effectiveEndTime = calculateEffectiveTime(latestCheckTime, effectiveEndDate); + + nonRealNameDTO.setEffectiveStartTime(effectiveStartTime); + nonRealNameDTO.setEffectiveEndTime(effectiveEndTime); + }); + }); + } + } + + private Long calculateEffectiveTime(String checkTime, Long effectiveDate) { + LocalTime earliestCheckTimeLocalTime = LocalTime.parse(checkTime, TIME_FORMAT); + LocalDateTime effectiveDateTime = LocalDateTimeUtil.of(effectiveDate); + return LocalDateTimeUtil.toEpochMilli(LocalDateTime.of(effectiveDateTime.toLocalDate(), earliestCheckTimeLocalTime)); + } + + @Nullable + private static String getShuttleNo(TpOrderRouteShuttleVO routeShuttle) { + if (routeShuttle == null) { + return null; + } + return routeShuttle.getShuttleNo(); + } + + @Nullable + private static String getShuttleName(TpOrderRouteShuttleVO routeShuttle) { + if (routeShuttle == null) { + return null; + } + return routeShuttle.getShuttleName(); + } + + private void buildVoucherEffectiveDateAndPassenger(String tenantId, TpProdOrderDetailVO orderDetail, TpProdVoucherCreateDTO tpProdVoucherCreateDTO, List ticketChoiceDTOs, + Map perTicketTotalAvailableCountMap) { + if (ObjectUtil.equal(orderDetail.getIdentityVerificat(), TpProdOrderIdentityFlagEnum.REAL_NAME_ORDER.getIdentityFlag())) { + setVoucherRealName(tenantId, orderDetail, tpProdVoucherCreateDTO, ticketChoiceDTOs, perTicketTotalAvailableCountMap); + } else { + setVoucherNotRealName(orderDetail, tpProdVoucherCreateDTO, ticketChoiceDTOs, perTicketTotalAvailableCountMap); + } + } + + private void setValidCheckTime(TpProdVoucherCreateDTO createDTO, TpProdOrderDetailVO orderDetail, List ticketChoiceDTOs, TpProdDetailDTO productDetailDTO, List allNeedSaveRules, String tenantId) { + // 一期最晚检票时间是班车到点预估时间+60分钟 60分钟是写死的没有配置成规则 + List orderTravelTrips = orderDetail.getTpOrderTravelTrips(); + Assert.notEmpty(orderTravelTrips, "订单关联的行程单不能为空"); + List orderRoutes = orderDetail.getTpOrderRoutes(); + Assert.notEmpty(orderRoutes, "线路信息不能为空"); + TpOrderRouteVO routeVO = orderRoutes.get(0); + TpProductExtendAttributesDTO extendAttributes = productDetailDTO.getExtendAttributes(); + Integer ticketVerificationEndTime = extendAttributes.getTicketVerificationEndTime(); + if (ticketVerificationEndTime == null) { + // 如果该配置不存在,默认延迟60分钟 + ticketVerificationEndTime = 60; + } + + // 有班次,普通班车 + if (CollectionUtils.isNotEmpty(routeVO.getTpOrderRouteShuttle())) { + // 最早检票时间:取下单时的班次时间。滚动发车取首班时间 + // 班次发车时间 + Map> travelTripMap = orderTravelTrips.stream().collect(Collectors.groupingBy(TpOrderTravelTripVO::getTripType)); + Map choiceTripTypeMap = ticketChoiceDTOs.stream().collect(Collectors.toMap(TpUserTicketChoiceDTO::getTripType, Function.identity())); + + List routeShuttleTimeList = routeVO.getTpOrderRouteShuttle().stream() + .map(TpOrderRouteShuttleVO::getShuttleTime) + .distinct() + .collect(Collectors.toList()); + Map routeShuttleTimeMap = batchConvertCheckTime2Timestamp(routeShuttleTimeList); + List routeShuttleTimestampList = new ArrayList<>(routeShuttleTimeMap.values()); + Map earliestCheckTimeMap = batchCalculateEarliestCheckTime(routeShuttleTimestampList, allNeedSaveRules, tenantId); + + for (TpOrderRouteShuttleVO routeShuttle : routeVO.getTpOrderRouteShuttle()) { + List travelTripList = travelTripMap.get(routeShuttle.getTripType()); + TpUserTicketChoiceDTO choiceDTO = choiceTripTypeMap.get(routeShuttle.getTripType()); + + if (createDTO.getRequiredRealName()) { + List voucherPurchaseInfoList = choiceDTO.getVoucherPurchaseInfoList(); + // 相同行程类型的最早和最晚检票时间是一样的 + for (TpVoucherPurchaseInfoDTO purchaseInfoDTO : voucherPurchaseInfoList) { + Long routeShuttleTimestamp = routeShuttleTimeMap.get(routeShuttle.getShuttleTime()); + String earliestCheckTime = earliestCheckTimeMap.get(routeShuttleTimestamp); + // 行程单会根据乘客进行拆分,除了乘客信息外其他信息都一样 + String latestCheckTime = calculateLatestCheckTime(travelTripList.get(0).getEndTime(), ticketVerificationEndTime); + purchaseInfoDTO.setEarliestCheckTime(earliestCheckTime); + purchaseInfoDTO.setLatestCheckTime(latestCheckTime); + } + } else { + List nonRealNameDTOs = choiceDTO.getNonRealNameDTOs(); + // 相同行程类型的最早和最晚检票时间是一样的 + for (TpVoucherNonRealNameDTO nonRealNameDTO : nonRealNameDTOs) { + Long routeShuttleTimestamp = routeShuttleTimeMap.get(routeShuttle.getShuttleTime()); + String earliestCheckTime = earliestCheckTimeMap.get(routeShuttleTimestamp); + // 行程单会根据乘客进行拆分,除了乘客信息外其他信息都一样 + String latestCheckTime = calculateLatestCheckTime(travelTripList.get(0).getEndTime(), ticketVerificationEndTime); + nonRealNameDTO.setEarliestCheckTime(earliestCheckTime); + nonRealNameDTO.setLatestCheckTime(latestCheckTime); + } + } + } + } else { + // 滚动发车 + RouteRollTimeDetailDTO routeRollTimeDetail = routeClient.getRouteRollTime(routeVO.getRouteNo(), createDTO.getTenantId()); + Assert.notNull(routeRollTimeDetail, "滚动发车对应的发车时间不能为空"); + + String roundTrip = routeVO.getRoundTrip(); + if (StringUtils.equals(roundTrip, RouteConstants.GO)) { + List goRollTimes = routeRollTimeDetail.getGoRollTimes(); + Assert.notEmpty(goRollTimes, "去程时间不能为空"); + List sortedRollTimes = goRollTimes.stream().sorted(Comparator.comparing(RollTimeDTO::getOrder)).collect(Collectors.toList()); + String earliestCheckTime = calculateEarliestCheckTime(sortedRollTimes.get(0).getFirstTime(), allNeedSaveRules, tenantId); + String latestCheckTime = calculateLatestCheckTime(sortedRollTimes.get(sortedRollTimes.size() - 1).getLastTime(), ticketVerificationEndTime); + assembleCheckTime(createDTO, ticketChoiceDTOs, earliestCheckTime, latestCheckTime); + } else if (StringUtils.equals(roundTrip, RouteConstants.BACK)) { + List backRollTimes = routeRollTimeDetail.getBackRollTimes(); + Assert.notEmpty(backRollTimes, "返程时间不能为空"); + List sortedRollTimes = backRollTimes.stream().sorted(Comparator.comparing(RollTimeDTO::getOrder)).collect(Collectors.toList()); + String earliestCheckTime = calculateEarliestCheckTime(sortedRollTimes.get(0).getFirstTime(), allNeedSaveRules, tenantId); + String latestCheckTime = calculateLatestCheckTime(sortedRollTimes.get(sortedRollTimes.size() - 1).getLastTime(), ticketVerificationEndTime); + assembleCheckTime(createDTO, ticketChoiceDTOs, earliestCheckTime, latestCheckTime); + } else { + // 往返程 + for (TpUserTicketChoiceDTO choice : ticketChoiceDTOs) { + if (StringUtils.equals(choice.getTripType(), RouteConstants.GO)) { + List goRollTimes = routeRollTimeDetail.getGoRollTimes(); + Assert.notEmpty(goRollTimes, "去程时间不能为空"); + List sortedRollTimes = goRollTimes.stream().sorted(Comparator.comparing(RollTimeDTO::getOrder)).collect(Collectors.toList()); + assembleRoundTripCheckTime(createDTO, allNeedSaveRules, tenantId, choice, sortedRollTimes, ticketVerificationEndTime); + } else { + List backRollTimes = routeRollTimeDetail.getBackRollTimes(); + Assert.notEmpty(backRollTimes, "返程时间不能为空"); + List sortedRollTimes = backRollTimes.stream().sorted(Comparator.comparing(RollTimeDTO::getOrder)).collect(Collectors.toList()); + assembleRoundTripCheckTime(createDTO, allNeedSaveRules, tenantId, choice, sortedRollTimes, ticketVerificationEndTime); + } + } + } + } + } + + private void assembleCheckTime(TpProdVoucherCreateDTO createDTO, List ticketChoiceDTOs, String earliestCheckTime, String latestCheckTime) { + if (createDTO.getRequiredRealName()) { + ticketChoiceDTOs.forEach(choice -> { + List voucherPurchaseInfoList = choice.getVoucherPurchaseInfoList(); + voucherPurchaseInfoList.forEach(purchaseInfoDTO -> { + purchaseInfoDTO.setEarliestCheckTime(earliestCheckTime); + purchaseInfoDTO.setLatestCheckTime(latestCheckTime); + }); + }); + } else { + ticketChoiceDTOs.forEach(choice -> { + List nonRealNameDTOs = choice.getNonRealNameDTOs(); + nonRealNameDTOs.forEach(nonRealNameDTO -> { + nonRealNameDTO.setEarliestCheckTime(earliestCheckTime); + nonRealNameDTO.setLatestCheckTime(latestCheckTime); + }); + }); + } + } + + private void assembleRoundTripCheckTime(TpProdVoucherCreateDTO createDTO, List allNeedSaveRules, String tenantId, + TpUserTicketChoiceDTO choice, List sortedRollTimes, Integer ticketVerificationEndTime) { + // 往返程同一种行程类型的最早和最晚检票时间一定是一样的 + String roundEarliestCheckTime = calculateEarliestCheckTime(sortedRollTimes.get(0).getFirstTime(), allNeedSaveRules, tenantId); + String roundLatestCheckTime = calculateLatestCheckTime(sortedRollTimes.get(sortedRollTimes.size() - 1).getLastTime(), ticketVerificationEndTime); + List voucherPurchaseInfoList = choice.getVoucherPurchaseInfoList(); + if (createDTO.getRequiredRealName()) { + voucherPurchaseInfoList.forEach(purchaseInfoDTO -> { + purchaseInfoDTO.setEarliestCheckTime(roundEarliestCheckTime); + purchaseInfoDTO.setLatestCheckTime(roundLatestCheckTime); + }); + } else { + List nonRealNameDTOs = choice.getNonRealNameDTOs(); + nonRealNameDTOs.forEach(nonRealNameDTO -> { + nonRealNameDTO.setEarliestCheckTime(roundEarliestCheckTime); + nonRealNameDTO.setLatestCheckTime(roundLatestCheckTime); + }); + } + } + + private String calculateEarliestCheckTime(String busDepartureTime, List allNeedSaveRules, String tenantId) { + Map> bizRuleMap = allNeedSaveRules.stream().collect(Collectors.groupingBy(TpBizRuleDTO::getRuleGroup)); + + List ticketCheckRules = bizRuleMap.get(TpRuleExpressionGroupEnum.TICKET_CHECK.getCode()); + Assert.notEmpty(ticketCheckRules, "凭证检票规则不能为空"); + + // 调用产品域的规则来计算最早检票时间,最早检票时间为班次发车时间-后台配置的分钟 + List expressionList = ticketCheckRules.stream().map(TpBizRuleDTO::getExpression).collect(Collectors.toList()); + Long earliestCheckTimestamp = ticketCheckTimeRule(expressionList, busDepartureTime, tenantId); + + // 兜底措施-最早检票时间不能小于当天的00:00 + Long currentDayEarliestTime = convertCheckTime2Timestamp(EVERY_DAY_EARLIEST_TIME); + if (earliestCheckTimestamp <= currentDayEarliestTime) { + return EVERY_DAY_EARLIEST_TIME; + } + + return DateTime.of(earliestCheckTimestamp).toLocalDateTime().format(TIME_FORMAT); + } + + private Map batchCalculateEarliestCheckTime(List busDepartureTimes, List allNeedSaveRules, String tenantId) { + Map> bizRuleMap = allNeedSaveRules.stream().collect(Collectors.groupingBy(TpBizRuleDTO::getRuleGroup)); + + List ticketCheckRules = bizRuleMap.get(TpRuleExpressionGroupEnum.TICKET_CHECK.getCode()); + Assert.notEmpty(ticketCheckRules, "凭证检票规则不能为空"); + + // 调用产品域的规则来计算最早检票时间,最早检票时间为班次发车时间-后台配置的分钟 + List expressionList = ticketCheckRules.stream().map(TpBizRuleDTO::getExpression).collect(Collectors.toList()); + List earliestCheckTimestampList = batchExecuteTicketCheckTimeRule(expressionList, busDepartureTimes, tenantId); + + Map earliestCheckTimeMap = new HashMap<>(); + for (TpTicketShowStartTimeResult showStartTimeResult : earliestCheckTimestampList) { + // 兜底措施-最早检票时间不能小于当天的00:00 + Long currentDayEarliestTime = convertCheckTime2Timestamp(EVERY_DAY_EARLIEST_TIME); + if (showStartTimeResult.getShowTime() <= currentDayEarliestTime) { + earliestCheckTimeMap.put(showStartTimeResult.getDepartureTime(), EVERY_DAY_EARLIEST_TIME); + } else { + String earliestCheckTime = DateTime.of(showStartTimeResult.getShowTime()).toLocalDateTime().format(TIME_FORMAT); + earliestCheckTimeMap.put(showStartTimeResult.getDepartureTime(), earliestCheckTime); + } + } + + return earliestCheckTimeMap; + } + + /** + * 最晚检票时间的计算规则:目的地到达时间+后台配置的延迟时间 + * + * @param endTime + * @return + */ + private String calculateLatestCheckTime(String endTime, int delayMinutes) { + LocalTime originalEndTime = LocalTime.parse(endTime, TIME_FORMAT); + LocalTime latestEndTime = LocalTime.parse(endTime, TIME_FORMAT).plusMinutes(delayMinutes); + if (originalEndTime.isAfter(latestEndTime)) { + return EVERY_DAY_LAST_TIME; + } + + return latestEndTime.format(TIME_FORMAT); + } + + private void setVoucherRealName(String tenantId, TpProdOrderDetailVO orderDetail, TpProdVoucherCreateDTO tpProdVoucherCreateDTO, List ticketChoiceDTOs, + Map roundTripPerTicketTotalAvailableCountMap) { + + Map> subjectItemMap = orderDetail.getOrderSubjectItem() + .stream() + .collect(Collectors.groupingBy(TpOrderSubjectItemVO::getTripType)); + + ticketChoiceDTOs.forEach(choice -> { + List voucherPurchaseInfoList = Lists.newArrayList(); + + // 当前行程类型对应的标的项,如去程对应的标的项 + List curTripTypeSubjectItems = subjectItemMap.get(choice.getTripType()); + Integer perTicketTotalAvailableCount = roundTripPerTicketTotalAvailableCountMap.get(choice.getTripType()); + curTripTypeSubjectItems.forEach(subjectItem -> { + TpVoucherPurchaseInfoDTO tpVoucherPurchaseInfoDTO = new TpVoucherPurchaseInfoDTO(); + + // 计算凭证的生失效时间 + Pair rangeEffectiveTime = calculateTicketEffectiveTime(subjectItem, tpProdVoucherCreateDTO.getVoucherType()); + tpVoucherPurchaseInfoDTO.setEffectiveStartTime(rangeEffectiveTime.getKey()); + tpVoucherPurchaseInfoDTO.setEffectiveEndTime(rangeEffectiveTime.getValue()); + + // 构建凭证所需乘客信息 + TpVoucherPassengerDTO tpVoucherPassengerDTO = buildVoucherPassenger(tenantId, subjectItem); + tpVoucherPurchaseInfoDTO.setSalesUnitCode(subjectItem.getItemNo()); + tpVoucherPurchaseInfoDTO.setPassengerInfo(tpVoucherPassengerDTO); + tpVoucherPurchaseInfoDTO.setTotalAvailableCount(perTicketTotalAvailableCount); + + // 乘客信息塞入列表 + voucherPurchaseInfoList.add(tpVoucherPurchaseInfoDTO); + }); + + choice.setVoucherPurchaseInfoList(voucherPurchaseInfoList); + }); + } + + @NotNull + private static TpVoucherPassengerDTO buildVoucherPassenger(String tenantId, TpOrderSubjectItemVO subjectItem) { + TpVoucherPassengerDTO tpVoucherPassengerDTO = new TpVoucherPassengerDTO(); + TpOrderPassengerVO passenger = subjectItem.getPassenger(); + tpVoucherPassengerDTO.setPassengerNo(passenger.getPassengerNo()); + tpVoucherPassengerDTO.setPassengerType(passenger.getPassengerType()); + tpVoucherPassengerDTO.setName(passenger.getPassengerName()); + tpVoucherPassengerDTO.setCertType(passenger.getIdentificationType()); + tpVoucherPassengerDTO.setCertNo(passenger.getIdentificationNumber()); + tpVoucherPassengerDTO.setContactInfo(passenger.getPassengerContact()); + tpVoucherPassengerDTO.setTenantId(tenantId); + tpVoucherPassengerDTO.setBizData(passenger.getBizData()); + return tpVoucherPassengerDTO; + } + + private Pair calculateTicketEffectiveTime(TpOrderSubjectItemVO subjectItem, String voucherType) { + // 凭证类型转化为产品域的票据类型 + String ticketType = convertVoucherType2TicketType(voucherType); + Assert.hasText(ticketType, "票类型不能为空"); + + // 取出标的项组成要素中的时间表达 + List orderItemElements = subjectItem.getOrderItemElements(); + List dateElements = orderItemElements + .stream() + .filter(element -> StringUtils.equals(element.getElementCode(), TpFactorCodeEnum.DATE.getCode())) + .collect(Collectors.toList()); + Assert.isTrue(CollectionUtils.isNotEmpty(dateElements) && dateElements.size() == 1, "日期要素为空或者不唯一"); + TpOrderSubjectItemElementVO curDateElement = dateElements.get(0); + + // 计算票的生失效时间范围 + TicketDateRangeParser.DateRange ticketEffectiveDateRange = TicketDateRangeParser.parseTicketDates(ticketType, curDateElement.getElementValue()); + LocalDate startDate = ticketEffectiveDateRange.getStartDate(); + LocalDate endDate = ticketEffectiveDateRange.getEndDate(); + + return new Pair<>(LocalDateTimeUtil.toEpochMilli(startDate), LocalDateTimeUtil.toEpochMilli(endDate)); + } + + private void setVoucherNotRealName(TpProdOrderDetailVO orderDetail, TpProdVoucherCreateDTO tpProdVoucherCreateDTO, List ticketChoiceDTOs, + Map perTicketTotalAvailableCountMap) { + + Map> subjectItemMap = orderDetail.getOrderSubjectItem() + .stream() + .collect(Collectors.groupingBy(TpOrderSubjectItemVO::getTripType)); + + ticketChoiceDTOs.forEach(choice -> { + List voucherNonRealNameDTOs = Lists.newArrayList(); + + // 当前行程类型对应的标的项,如去程对应的标的项 + List curTripTypeSubjectItems = subjectItemMap.get(choice.getTripType()); + Integer perTicketTotalAvailableCount = perTicketTotalAvailableCountMap.get(choice.getTripType()); + curTripTypeSubjectItems.forEach(subjectItem -> { + TpVoucherNonRealNameDTO tpVoucherNonRealNameDTO = new TpVoucherNonRealNameDTO(); + + // 取出标的项组成要素中的时间表达 + Pair voucherEffectiveTimeRange = calculateTicketEffectiveTime(subjectItem, tpProdVoucherCreateDTO.getVoucherType()); + tpVoucherNonRealNameDTO.setEffectiveStartTime(voucherEffectiveTimeRange.getKey()); + tpVoucherNonRealNameDTO.setEffectiveEndTime(voucherEffectiveTimeRange.getValue()); + + // 取出标的项中的票数量 + tpVoucherNonRealNameDTO.setPassengerCount(subjectItem.getCount()); + tpVoucherNonRealNameDTO.setTicketCount(perTicketTotalAvailableCount); + tpVoucherNonRealNameDTO.setSalesUnitCode(subjectItem.getItemNo()); + voucherNonRealNameDTOs.add(tpVoucherNonRealNameDTO); + + choice.setNonRealNameDTOs(voucherNonRealNameDTOs); + }); + }); + } + + public String convertVoucherType2TicketType(String voucherType) { + if (StringUtils.equals(voucherType, TpProdOrderTicketTypeEnum.DAY.getTicketType())) { + return TicketTypeEnum.SINGLE_RIDE.getType(); + } else if (StringUtils.equals(voucherType, TpProdOrderTicketTypeEnum.WEEK.getTicketType())) { + return TicketTypeEnum.WEEKLY.getType(); + } else if (StringUtils.equals(voucherType, TpProdOrderTicketTypeEnum.MONTH.getTicketType())) { + return TicketTypeEnum.MONTHLY.getType(); + } else if (StringUtils.equals(voucherType, TpProdOrderTicketTypeEnum.TERM.getTicketType())) { + return TicketTypeEnum.SEMESTER.getType(); + } else if (StringUtils.equals(voucherType, TpProdOrderTicketTypeEnum.DAY_RANGE.getTicketType())) { + return TicketTypeEnum.DAY_RANGE.getType(); + } else { + return null; + } + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpCreateDepositOrderNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpCreateDepositOrderNode.java new file mode 100644 index 0000000..53c8e67 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpCreateDepositOrderNode.java @@ -0,0 +1,47 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.order.TpDepositOrderDTO; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; + +/** + *

+ * 创建订金订单节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "createDepositOrderNode", name = "创建订金订单节点") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +@RequiredArgsConstructor +public class TpCreateDepositOrderNode { + + private final TpOrderClient tpOrderClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 创建订金订单节点"); + + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + + // 创建订金订单节点 + tpOrderClient.createDepositOrder(TpDepositOrderDTO.builder() + .orderNo(userPlaceOrderContext.getOrderNo()) + .payAmount(userPlaceOrderContext.getPayAmount()) + .payPercentage(userPlaceOrderContext.getPercentage()) + .tenantId(userPlaceOrderContext.getTenantId()).build()); + + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpCreateOrderNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpCreateOrderNode.java new file mode 100644 index 0000000..65c610e --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpCreateOrderNode.java @@ -0,0 +1,51 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderCreateDTO; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderCreateVO; +import com.deepinnet.tptradeprod.core.compoment.TpCreateOrderComponent; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; + +/** + *

+ * 创建订单节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "createOrderNode", name = "创建订单节点") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +@RequiredArgsConstructor +public class TpCreateOrderNode { + + private final TpCreateOrderComponent tpCreateOrderComponent; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 创建订单"); + + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + TpProdOrderCreateDTO createDTO = userPlaceOrderContext.getCreateDTO(); + // 创建订单组件 + TpProdOrderCreateVO createOrderVO = tpCreateOrderComponent.execute(createDTO); + createDTO.setOrderNo(createOrderVO.getOrderNo()); + createDTO.setOriginalOrderNo(createOrderVO.getOriginalOrderNo()); + + userPlaceOrderContext.setOrderNo(createOrderVO.getOrderNo()); + // 需支付金额 + userPlaceOrderContext.setPayAmount(createDTO.getPayAmount()); + userPlaceOrderContext.setTenantId(createDTO.getTenantId()); + } + + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpDeductInventoryNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpDeductInventoryNode.java new file mode 100644 index 0000000..e5b1980 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpDeductInventoryNode.java @@ -0,0 +1,43 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpproductcore.common.enums.TpInventoryOperationTypeEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.deepinnet.tptradeprod.core.factory.TpOperatorInventoryStrategyFactory; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; + +import javax.annotation.Resource; + +/** + *

+ * 冻结库存节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "deductInventoryNode", name = "扣减库存节点") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +public class TpDeductInventoryNode { + + @Resource + private TpOperatorInventoryStrategyFactory tpOperatorInventoryStrategyFactory; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 扣减库存"); + + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + TpProdOrderDetailVO orderDetailVO = userPlaceOrderContext.getOrderDetailVO(); + tpOperatorInventoryStrategyFactory.operationStrategyMap.get(TpInventoryOperationTypeEnum.FREEZE_TO_DEDUCT).operatorInventory(orderDetailVO, userPlaceOrderContext.getTenantId()); + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpFreeOrderPaidSendSyncMessageNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpFreeOrderPaidSendSyncMessageNode.java new file mode 100644 index 0000000..6e2b313 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpFreeOrderPaidSendSyncMessageNode.java @@ -0,0 +1,63 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.TpBizTypeEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.model.PaySuccessMessageEntity; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.service.integration.client.mq.constants.MessageConstants; +import com.deepinnet.tptradeprod.common.service.integration.client.mq.constants.MessageSysConstants; +import com.deepinnet.tptradeprod.common.service.integration.client.mq.entity.BaseMessageEntity; +import com.deepinnet.tptradeprod.common.service.integration.client.mq.template.MessageClient; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; + +import java.time.LocalDateTime; + +/** + *

+ * 免费票发送同步消息 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "freeOrderPaidSendSyncMessageNode", name = "免费票发送同步消息节点") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +@RequiredArgsConstructor +public class TpFreeOrderPaidSendSyncMessageNode { + + private final MessageClient messageClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 免费票发送同步消息节点"); + + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + + BaseMessageEntity messageEntity = new BaseMessageEntity(); + messageEntity.setKey(userPlaceOrderContext.getOrderNo()); + messageEntity.setSource(MessageSysConstants.SOURCE_TRANS); + messageEntity.setSendTime(LocalDateTime.now()); + + PaySuccessMessageEntity payOrderSuccessEntity = new PaySuccessMessageEntity(); + payOrderSuccessEntity.setBizType(TpBizTypeEnum.CUSTOM_BUS_PAY.getCode()); + payOrderSuccessEntity.setOrderNo(userPlaceOrderContext.getOrderNo()); + payOrderSuccessEntity.setPayTime(DateUtil.current()); + payOrderSuccessEntity.setTenantId(userPlaceOrderContext.getTenantId()); + String body = JSONUtil.toJsonStr(payOrderSuccessEntity); + messageEntity.setBody(body); + + messageClient.send(messageClient.getMessageTopic(), MessageConstants.EVENT_CODE_TRANS_PAY_SUCCESS, messageEntity); + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpFreezeInventoryNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpFreezeInventoryNode.java new file mode 100644 index 0000000..7bc29fa --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpFreezeInventoryNode.java @@ -0,0 +1,43 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpproductcore.common.enums.TpInventoryOperationTypeEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderCreateDTO; +import com.deepinnet.tptradeprod.core.factory.TpOperatorInventoryStrategyFactory; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; + +import javax.annotation.Resource; + +/** + *

+ * 冻结库存节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "freezeInventoryNode", name = "冻结库存节点") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +public class TpFreezeInventoryNode { + + @Resource + private TpOperatorInventoryStrategyFactory tpOperatorInventoryStrategyFactory; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 冻结库存"); + + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + TpProdOrderCreateDTO createDTO = userPlaceOrderContext.getCreateDTO(); + tpOperatorInventoryStrategyFactory.operationStrategyMap.get(TpInventoryOperationTypeEnum.FREEZE).operatorInventory(createDTO, createDTO.getTenantId()); + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpNeedPayOrderStatusNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpNeedPayOrderStatusNode.java new file mode 100644 index 0000000..621d22e --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpNeedPayOrderStatusNode.java @@ -0,0 +1,45 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.order.TpOrderPushStatusDTO; +import com.deepinnet.tptradecore.common.enums.order.TpOrderPushStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; + +import javax.annotation.Resource; + +/** + *

+ * 订单状态推进为待支付节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "needPayOrderStatusNode", name = "订单状态推进为待支付节点") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +public class TpNeedPayOrderStatusNode { + + @Resource + private TpOrderClient tpOrderClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单状态推进为待支付节点"); + + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + tpOrderClient.pushOrderStatus(TpOrderPushStatusDTO.builder() + .orderNo(userPlaceOrderContext.getOrderNo()) + .tenantId(userPlaceOrderContext.getTenantId()) + .tpOrderPushStatusEnum(TpOrderPushStatusEnum.NEED_PAY_PUSH_STATUS).build()); + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderCancelCheckRefundOrPayNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderCancelCheckRefundOrPayNode.java new file mode 100644 index 0000000..fd1981f --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderCancelCheckRefundOrPayNode.java @@ -0,0 +1,93 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import cn.hutool.core.util.StrUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.order.TpOrderChangePriceDTO; +import com.deepinnet.tptradecore.common.dto.order.TpOrderChargeRecordDTO; +import com.deepinnet.tptradecore.common.dto.order.TpOrderPushStatusDTO; +import com.deepinnet.tptradecore.common.enums.order.TpAuditOrChangePriceBizTypeEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderChargeRecordTypeEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderPushStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserCancelOrderContext; +import com.deepinnet.tptradeprod.common.enums.TpOrderStatusEnum; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; +import org.jetbrains.annotations.NotNull; + +import java.math.BigDecimal; + +/** + *

+ * 取消订单判断是需支付还是退款 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "cancelCheckRefundOrPayNode", name = "取消订单判断是需支付还是退款节点(当前节点包含了业务推进)") +@LiteflowCmpDefine +@RequiredArgsConstructor +public class TpOrderCancelCheckRefundOrPayNode { + + private final TpOrderClient tpOrderClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 取消订单判断是需支付还是退款节点(当前节点包含了业务推进)"); + TpUserCancelOrderContext userCancelOrderContext = bindCmp.getContextBean(TpUserCancelOrderContext.class); + TpProdOrderDetailVO orderDetail = userCancelOrderContext.getOrderDetail(); + + // 订单手续费计算 TODO + if (orderDetail.getStatus().compareTo(TpOrderStatusEnum.ORDER_DEPOSIT_PAID.getStatus()) >= 0 + && orderDetail.getStatus().compareTo(TpOrderStatusEnum.ORDER_DISPATCHED.getStatus()) <=0 ) { + // 应付金额 + BigDecimal payableAmount = new BigDecimal(orderDetail.getPayableAmount()); + // 手续费暂时写死 + BigDecimal serviceCharge = new BigDecimal(orderDetail.getServiceCharge()).add(new BigDecimal("8.25")); + // 已付金额 + BigDecimal payAmount = StrUtil.isEmpty(orderDetail.getPayAmount()) ? BigDecimal.ZERO : new BigDecimal(orderDetail.getPayAmount()); + + TpOrderChangePriceDTO tpOrderChangePriceDTO = new TpOrderChangePriceDTO(); + tpOrderChangePriceDTO.setOriginalOrderNo(orderDetail.getOriginalOrderNo()); + tpOrderChangePriceDTO.setTenantId(userCancelOrderContext.getTenantId()); + tpOrderChangePriceDTO.setBizType(TpAuditOrChangePriceBizTypeEnum.CANCEL_ORDER.getBizType()); + + TpOrderPushStatusEnum statusEnum; + if (payAmount.compareTo(serviceCharge) > 0) { + statusEnum = TpOrderPushStatusEnum.ORDER_CANCEL_REFUNDING; + // 应退价格 TODO + BigDecimal needRefundAmount = payAmount.subtract(payableAmount); + // 塞入最新手续费 + tpOrderChangePriceDTO.setServiceCharge(needRefundAmount.toString()); + } else if (payAmount.compareTo(serviceCharge) < 0) { + statusEnum = TpOrderPushStatusEnum.ORDER_CANCEL_NEED_PAY; + // 应付价格 TODO + BigDecimal needPayAmount = serviceCharge.subtract(payAmount); + // 塞入最新手续费 + tpOrderChangePriceDTO.setServiceCharge(needPayAmount.toString()); + } else { + // 无需退款,无需支付 + statusEnum = TpOrderPushStatusEnum.ORDER_CANCELED; + tpOrderChangePriceDTO.setServiceCharge(BigDecimal.ZERO.toString()); + } + + // 手续费变更 + tpOrderClient.changePriceAndPayMode(tpOrderChangePriceDTO); + + // 推进订单状态 + tpOrderClient.pushOrderStatus(TpOrderPushStatusDTO.builder() + .orderNo(orderDetail.getOrderNo()) + .tenantId(userCancelOrderContext.getTenantId()) + .tpOrderPushStatusEnum(statusEnum).build()); + } + + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderCancelConfirmNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderCancelConfirmNode.java new file mode 100644 index 0000000..9335231 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderCancelConfirmNode.java @@ -0,0 +1,126 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.util.*; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.*; +import com.deepinnet.tptradecore.common.dto.order.TpOrderPushStatusDTO; +import com.deepinnet.tptradecore.common.dto.trans.TpPayRefundDTO; +import com.deepinnet.tptradecore.common.enums.TpBizTypeEnum; +import com.deepinnet.tptradecore.common.enums.order.*; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderAuditConfirmContext; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.*; +import com.deepinnet.tptradeprod.common.vo.*; +import com.deepinnet.tptradeprod.core.compoment.TpOrderSyncTripComponent; +import com.yomahub.liteflow.annotation.*; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; + +import javax.annotation.Resource; +import java.math.BigDecimal; + +/** + *

+ * 订单取消确认通过节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "orderCancelConfirmNode", name = "订单取消确认通过节点,推进订单状态") +@LiteflowCmpDefine +public class TpOrderCancelConfirmNode { + + @Resource + private TpOrderClient tpOrderClient; + + @Resource + private TpOrderSyncTripComponent tpOrderSyncTripComponent; + + @Resource + private TpPaymentClient tpPaymentClient; + + @Resource + private TpOrderDispatchClient orderDispatchClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单取消确认审核通过"); + + TpOrderAuditConfirmContext auditConfirmContext = bindCmp.getContextBean(TpOrderAuditConfirmContext.class); + TpProdOrderAuditConfirmDTO confirmDTO = auditConfirmContext.getConfirmDTO(); + + TpProdOrderDetailVO orderDetail = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .originalOrderNo(confirmDTO.getOriginalOrderNo()) + .tenantId(confirmDTO.getTenantId()) + .needModules(ListUtil.toList(TpOrderModulesEnum.ORDER_TRAVEL_TRIP.getModule())).build()); + + TpOrderPushStatusEnum statusEnum; + + // 已支付金额 + BigDecimal payAmount = StrUtil.isEmpty(orderDetail.getPayAmount()) ? BigDecimal.ZERO : new BigDecimal(orderDetail.getPayAmount()); + + // 手续费 + BigDecimal currentServiceCharge = StrUtil.isEmpty(orderDetail.getServiceCharge()) ? BigDecimal.ZERO : new BigDecimal(orderDetail.getServiceCharge()); + + if (currentServiceCharge.compareTo(payAmount) > 0) { + statusEnum = TpOrderPushStatusEnum.ORDER_CANCEL_NEED_PAY; + } else if (currentServiceCharge.compareTo(payAmount) < 0) { + statusEnum = TpOrderPushStatusEnum.ORDER_CANCEL_REFUNDING; + } else { + // 不退款 / 不支付 + statusEnum = TpOrderPushStatusEnum.ORDER_CANCELED; + } + + // 推进订单状态 + tpOrderClient.pushOrderStatus(TpOrderPushStatusDTO.builder() + .tenantId(confirmDTO.getTenantId()) + .orderNo(orderDetail.getOrderNo()) + .tpOrderPushStatusEnum(statusEnum).build()); + + // 调用退款 + if (ObjectUtil.equals(statusEnum.getStatus(), TpOrderPushStatusEnum.ORDER_CANCEL_REFUNDING.getStatus())) { + LogUtil.info("取消调用退款......"); + String orgCode = getOrgCodeFromDispatchDetail(orderDetail.getOriginalOrderNo(), confirmDTO.getTenantId()); + refund(orderDetail, confirmDTO, currentServiceCharge, orgCode); + } + + LogUtil.info("取消行程,同步主数据......."); + tpOrderSyncTripComponent.cancelSync(orderDetail, confirmDTO.getTenantId()); + + } + + private void refund(TpProdOrderDetailVO orderDetail, TpProdOrderAuditConfirmDTO confirmDTO, BigDecimal currentServiceCharge, String orgCode) { + TpPayRefundDTO tpPayRefundDTO = TpPayRefundDTO.builder() + .refundBizNo(orderDetail.getOriginalOrderNo() + TpBizTypeEnum.CANCEL_ORDER_REFUND.getCode()) + .refundBizType(TpBizTypeEnum.CANCEL_ORDER_REFUND.getCode()) + .payBizNo(orderDetail.getOriginalOrderNo() + TpBizTypeEnum.DEPOSIT_PAY.getCode()) + .refundAmount(new TpMoney(new BigDecimal(orderDetail.getPayAmount()).subtract(currentServiceCharge).toString(), TpMoney.ValueUnitEnum.YUAN)) + .chargeAmount(new TpMoney(StrUtil.isEmpty(orderDetail.getServiceCharge()) ? BigDecimal.ZERO.toString() : orderDetail.getServiceCharge(), TpMoney.ValueUnitEnum.YUAN)) + .orgCode(orgCode) + .tenantId(confirmDTO.getTenantId()) + .build(); + boolean refundRes = tpPaymentClient.refund(tpPayRefundDTO); + + if (!refundRes) { + LogUtil.error("申请退票接口执行失败,原因:退款失败,入参为:{}", JSONUtil.toJsonStr(tpPayRefundDTO)); + throw new TpTradeProdException(TpTradeProdErrorCode.REFUND_ERROR); + } + } + + private String getOrgCodeFromDispatchDetail(String originalOrderNo, String tenantId) { + TpProdOrderDispatchDetailDTO orderDispatchDetailDTO = new TpProdOrderDispatchDetailDTO(); + orderDispatchDetailDTO.setOrderNo(originalOrderNo); + orderDispatchDetailDTO.setTenantId(tenantId); + TpProdOrderDispatchDetailVO orderDispatchDetail = orderDispatchClient.getOrderDispatchDetail(orderDispatchDetailDTO); + if (orderDispatchDetail == null) { + LogUtil.error("退款接口,查询订单的最新派单成功的派单记录,结果为空,入参为:{}", JSONUtil.toJsonStr(orderDispatchDetailDTO)); + throw new TpTradeProdException(TpTradeProdErrorCode.NOT_FOUND_SUCCESS_DISPATCH_RECORD); + } + return orderDispatchDetail.getTargetOrgNo(); + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderCancelDoubleConfirmNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderCancelDoubleConfirmNode.java new file mode 100644 index 0000000..777a22b --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderCancelDoubleConfirmNode.java @@ -0,0 +1,124 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tp.common.lang.util.TpMoney; +import com.deepinnet.tptradecore.common.dto.order.TpOrderPushStatusDTO; +import com.deepinnet.tptradecore.common.dto.trans.TpPayRefundDTO; +import com.deepinnet.tptradecore.common.enums.TpBizTypeEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderModulesEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderPushStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderServiceChargeReduceContext; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.*; +import com.deepinnet.tptradeprod.common.vo.*; +import com.deepinnet.tptradeprod.core.compoment.TpOrderSyncTripComponent; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; + +import javax.annotation.Resource; +import java.math.BigDecimal; + +/** + *

+ * 订单取消二次确认通过节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "orderCancelDoubleConfirmNode", name = "订单取消二次确认通过节点,推进订单状态") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +public class TpOrderCancelDoubleConfirmNode { + + @Resource + private TpOrderClient tpOrderClient; + + @Resource + private TpOrderSyncTripComponent tpOrderSyncTripComponent; + + @Resource + private TpPaymentClient tpPaymentClient; + + @Resource + private TpOrderDispatchClient orderDispatchClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单取消二次确认通过节点,推进订单状态"); + + TpOrderServiceChargeReduceContext reduceContext = bindCmp.getContextBean(TpOrderServiceChargeReduceContext.class); + TpProdOrderAuditConfirmDTO confirmDTO = reduceContext.getConfirmDTO(); + + TpProdOrderChangeApplyDetailVO orderChangeApplyVO = reduceContext.getOrderChangeApplyVO(); + + TpProdOrderDetailVO orderDetail = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .originalOrderNo(orderChangeApplyVO.getOriginalOrderNo()) + .tenantId(orderChangeApplyVO.getTenantId()) + .needModules(ListUtil.toList(TpOrderModulesEnum.ORDER_TRAVEL_TRIP.getModule())).build()); + + TpOrderPushStatusEnum statusEnum; + + // 已支付金额 + BigDecimal payAmount = StrUtil.isEmpty(orderDetail.getPayAmount()) ? BigDecimal.ZERO : new BigDecimal(orderDetail.getPayAmount()); + + // 手续费 + BigDecimal currentServiceCharge = StrUtil.isEmpty(orderDetail.getServiceCharge()) ? BigDecimal.ZERO : new BigDecimal(orderDetail.getServiceCharge()); + + if (currentServiceCharge.compareTo(payAmount) > 0) { + statusEnum = TpOrderPushStatusEnum.ORDER_CANCEL_NEED_PAY; + } else if (currentServiceCharge.compareTo(payAmount) < 0) { + statusEnum = TpOrderPushStatusEnum.ORDER_CANCEL_REFUNDING; + } else { + // 不退款 / 不支付 + statusEnum = TpOrderPushStatusEnum.ORDER_CANCELED; + } + + // 推进订单状态 + tpOrderClient.pushOrderStatus(TpOrderPushStatusDTO.builder() + .tenantId(orderChangeApplyVO.getTenantId()) + .orderNo(orderDetail.getOrderNo()) + .tpOrderPushStatusEnum(statusEnum).build()); + + // 调用退款 + if (ObjectUtil.equals(statusEnum, TpOrderPushStatusEnum.ORDER_CANCEL_REFUNDING)) { + String orgCode = orderDispatchClient.getOrgCodeFromDispatchDetail(orderDetail.getOriginalOrderNo(), confirmDTO.getTenantId()); + refund(orderDetail, confirmDTO, currentServiceCharge, orgCode); + } + + if (ObjectUtil.equals(statusEnum, TpOrderPushStatusEnum.ORDER_CANCEL_REFUNDING) || ObjectUtil.equals(statusEnum, TpOrderPushStatusEnum.ORDER_CANCELED)) { + LogUtil.info("取消行程,同步主数据......."); + tpOrderSyncTripComponent.cancelSync(orderDetail, confirmDTO.getTenantId()); + } + + } + + private void refund(TpProdOrderDetailVO orderDetail, TpProdOrderAuditConfirmDTO confirmDTO, BigDecimal currentServiceCharge, String orgCode) { + TpPayRefundDTO tpPayRefundDTO = TpPayRefundDTO.builder() + .refundBizNo(orderDetail.getOriginalOrderNo() + TpBizTypeEnum.CANCEL_ORDER_REFUND.getCode()) + .refundBizType(TpBizTypeEnum.CANCEL_ORDER_REFUND.getCode()) + .payBizNo(orderDetail.getOriginalOrderNo() + TpBizTypeEnum.DEPOSIT_PAY.getCode()) + .refundAmount(new TpMoney(new BigDecimal(orderDetail.getPayAmount()).subtract(currentServiceCharge).toString(), TpMoney.ValueUnitEnum.YUAN)) + .chargeAmount(new TpMoney(orderDetail.getServiceCharge(), TpMoney.ValueUnitEnum.YUAN)) + .orgCode(orgCode) + .tenantId(confirmDTO.getTenantId()) + .build(); + boolean refundRes = tpPaymentClient.refund(tpPayRefundDTO); + + if (!refundRes) { + LogUtil.error("申请退票接口执行失败,原因:退款失败,入参为:{}", JSONUtil.toJsonStr(tpPayRefundDTO)); + throw new TpTradeProdException(TpTradeProdErrorCode.REFUND_ERROR); + } + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderCancelPushNeedConfirmNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderCancelPushNeedConfirmNode.java new file mode 100644 index 0000000..fff9d2b --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderCancelPushNeedConfirmNode.java @@ -0,0 +1,252 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson2.JSONObject; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpbaseopcore.common.dto.org.OrgDetailDTO; +import com.deepinnet.tpcommoncore.common.service.template.email.TpEmailUserCancelTemplate; +import com.deepinnet.tpcommoncore.common.service.template.sms.staff.TpSmsUserCancelTemplate; +import com.deepinnet.tpproductcore.common.dto.product.TpProdDetailDTO; +import com.deepinnet.tpproductcore.common.dto.rule.TpBizRuleDTO; +import com.deepinnet.tpproductcore.common.dto.rule.TpCharterRefundParamDTO; +import com.deepinnet.tpproductcore.common.dto.rule.TpRuleExecuteDTO; +import com.deepinnet.tpproductcore.common.dto.rule.TpRuleExecuteResultVO; +import com.deepinnet.tpproductcore.common.dto.rule.result.TpCharterRefundChargeResult; +import com.deepinnet.tpproductcore.common.enums.FormalFlagEnum; +import com.deepinnet.tpproductcore.common.enums.NeedPropertiesEnum; +import com.deepinnet.tpproductcore.common.enums.TpRuleExpressionGroupEnum; +import com.deepinnet.tpproductcore.common.qto.product.TpProductQueryDTO; +import com.deepinnet.tptradecore.common.dto.order.TpOrderChargeRecordDTO; +import com.deepinnet.tptradecore.common.dto.order.TpOrderPushStatusDTO; +import com.deepinnet.tptradecore.common.enums.order.*; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserCancelOrderContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderChangeApplicantCreatedDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderChangeApplyCreatedDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderDispatchDetailDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderSceneEnum; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.facade.TpOrderChangeAcceptanceFacade; +import com.deepinnet.tptradeprod.common.service.integration.client.*; +import com.deepinnet.tptradeprod.common.service.integration.client.email.TpEmailClient; +import com.deepinnet.tptradeprod.common.service.integration.client.sms.TpSmsClient; +import com.deepinnet.tptradeprod.common.vo.*; +import com.google.common.collect.Lists; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + *

+ * 取消订单状态推进为取消待确认 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "cancelOrderNeedConfirmNode", name = "取消订单状态推进为取消待确认节点") +@LiteflowCmpDefine +public class TpOrderCancelPushNeedConfirmNode { + + @Resource + private TpOrderClient tpOrderClient; + + @Resource + private TpProductClient tpProductClient; + + @Resource + private TpBizRuleClient tpBizRuleClient; + + @Resource + private TpOrderChangeAcceptanceFacade tpOrderChangeAcceptanceFacade; + + @Resource + private TpOrderDispatchClient tpOrderDispatchClient; + + @Resource + private TpOrgClient tpOrgClient; + + @Resource + private TpSmsClient tpSmsClient; + + @Resource + private TpEmailClient tpEmailClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 取消订单状态推进为取消待确认节点"); + + TpUserCancelOrderContext cancelOrderContext = bindCmp.getContextBean(TpUserCancelOrderContext.class); + TpProdOrderDetailVO orderDetail = cancelOrderContext.getOrderDetail(); + + TpProdOrderChangeApplicantCreatedDTO applicantDTO = fillApplicantUser(orderDetail, cancelOrderContext); + + TpProdOrderChangeApplyCreatedDTO createdDTO = TpProdOrderChangeApplyCreatedDTO.builder() + .originalOrderNo(orderDetail.getOriginalOrderNo()) + .orderNo(orderDetail.getOrderNo()) + .applyTime(DateUtil.current()) + .applyType(TpOrderChangeTypeEnum.ORDER_CANCEL.getType()) + .applyStatus(TpOrderChangeApplyStatusEnum.WAITING_APPROVED.getType()) + .orderChangeApplicant(applicantDTO) + .orderScene(cancelOrderContext.getBackendUserOperation() ? TpOrderSceneEnum.SALESMAN_OPERATE.getCode() : TpOrderSceneEnum.USER_OPERATE.getCode()) + .tenantId(cancelOrderContext.getTenantId()).build(); + TpResult orderChangeApply = tpOrderChangeAcceptanceFacade.createOrderChangeApply(createdDTO); + + if (!orderChangeApply.getData()) { + LogUtil.error("取消订单失败, 订单编号:{}, 原始订单编号:{}, 创建入参:{}", orderDetail.getOrderNo(), orderDetail.getOriginalOrderNo(), JSONObject.toJSONString(createdDTO)); + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_CANCEL_ERROR); + } + + TpProdDetailDTO productDetail = queryProduct(orderDetail.getProductNo(), cancelOrderContext.getTenantId()); + + // 拿到取消手续费 + getCancelServiceCharge(cancelOrderContext.getTenantId(), productDetail, orderDetail); + + // 推进当前订单状态为取消待确认 + tpOrderClient.pushOrderStatus(TpOrderPushStatusDTO.builder() + .orderNo(cancelOrderContext.getOrderNo()) + .tenantId(cancelOrderContext.getTenantId()) + .tpOrderPushStatusEnum(TpOrderPushStatusEnum.ORDER_CANCEL_AUDITING).build()); + + // 查询派单记录 + TpProdOrderDispatchDetailDTO dto = new TpProdOrderDispatchDetailDTO(); + dto.setOrderNo(orderDetail.getOriginalOrderNo()); + dto.setTenantId(cancelOrderContext.getTenantId()); + TpProdOrderDispatchDetailVO orderDispatchDetail = tpOrderDispatchClient.getOrderDispatchDetail(dto); + + // 查询组织对应的审核人员 + OrgDetailDTO orgDetail = tpOrgClient.getOrgDetail(orderDispatchDetail.getTargetOrgNo(), cancelOrderContext.getTenantId()); + + // 给审核人员发送短信和邮件 + TpSmsUserCancelTemplate smsTemplate = new TpSmsUserCancelTemplate(); + smsTemplate.setOrderNo(orderDetail.getOriginalOrderNo()); + + if (StrUtil.isNotEmpty(orgDetail.getCheckPersonPhone())) { + tpSmsClient.sendSms(orgDetail.getCheckPersonPhone(), smsTemplate); + } + + TpEmailUserCancelTemplate emailTemplate = new TpEmailUserCancelTemplate(); + emailTemplate.setOrderNo(orderDetail.getOriginalOrderNo()); + + if (StrUtil.isNotEmpty(orgDetail.getCheckPersonEmail())) { + tpEmailClient.sendEmail(orgDetail.getCheckPersonEmail(), emailTemplate); + } + } + + @NotNull + private static TpProdOrderChangeApplicantCreatedDTO fillApplicantUser(TpProdOrderDetailVO orderDetail, TpUserCancelOrderContext cancelOrderContext) { + TpOrderPlacerVO orderPlacer = orderDetail.getOrderPlacer(); + TpOrderRequirementUserVO orderRequirementUser = orderDetail.getOrderRequirementUser(); + + TpProdOrderChangeApplicantCreatedDTO applicantDTO = new TpProdOrderChangeApplicantCreatedDTO(); + + // B端操作-填充B端申请人编号 + if (cancelOrderContext.getBackendUserOperation()) { + applicantDTO.setApplicantNo(cancelOrderContext.getBackendUserNo()); + } else { + // C端操作-填充C端申请人信息 + applicantDTO.setApplicantNo(orderPlacer.getPlacerNo()); + applicantDTO.setApplicantName(orderRequirementUser.getRequirementContactName()); + applicantDTO.setApplicantPhone(orderRequirementUser.getRequirementContact()); + } + return applicantDTO; + } + + private void getCancelServiceCharge(String tenantId, TpProdDetailDTO productDetail, TpProdOrderDetailVO orderDetail) { + TpRuleExecuteDTO cancelRuleDTO = getCancelRuleDTO(tenantId, productDetail, new BigDecimal(orderDetail.getPayableAmount()), orderDetail.getTpOrderTravelTrips()); + + TpRuleExecuteResultVO executeRuleResult = tpBizRuleClient.executeRule(cancelRuleDTO); + + if (!executeRuleResult.getSuccess()) { + LogUtil.error("当前变更取消手续费执行失败, 入参:{}", JSONObject.toJSONString(cancelRuleDTO)); + throw new TpTradeProdException(TpTradeProdErrorCode.RULE_EXECUTE_ERROR); + } + + // 订单现在已产生的手续费 + BigDecimal currentOrderServiceCharge = ObjectUtil.isNull(executeRuleResult.getResult()) ? BigDecimal.ZERO : executeRuleResult.getResult().getChargeAmount().getMoney().getAmount(); + BigDecimal serviceChargeRate = ObjectUtil.isNull(executeRuleResult.getResult()) ? BigDecimal.ZERO : executeRuleResult.getResult().getChargeRate(); + + tpOrderClient.saveChargeRecord(buildSaveChargeRecordDTO(orderDetail, currentOrderServiceCharge, serviceChargeRate, tenantId)); + } + + private TpProdDetailDTO queryProduct(String productNo, String tenantId) { + TpProductQueryDTO tpProductQueryDTO = new TpProductQueryDTO(); + tpProductQueryDTO.setProductCode(productNo); + tpProductQueryDTO.setFormalFlag(FormalFlagEnum.FORMAL.getCode()); + tpProductQueryDTO.setTenantId(tenantId); + tpProductQueryDTO.setNeedProperties(Lists.newArrayList( + NeedPropertiesEnum.SERVICE_OBJECT.getCode(), + //NeedPropertiesEnum.SUBJECT_ITEM.getCode(), + //NeedPropertiesEnum.SALES_UNIT.getCode(), + NeedPropertiesEnum.BIZ_RULE.getCode(), + NeedPropertiesEnum.ROUTE.getCode() + //NeedPropertiesEnum.CATEGORY.getCode(), + //NeedPropertiesEnum.PRICE_UNIT.getCode() + //NeedPropertiesEnum.INVENTORY.getCode() + )); + return tpProductClient.getProduct(tpProductQueryDTO); + } + + private static TpRuleExecuteDTO getCancelRuleDTO(String tenantId, TpProdDetailDTO productDetail, BigDecimal amount, List travelTripVOs) { + Long pickUpTime; + if (travelTripVOs.size() == 1) { + pickUpTime = Convert.toLong(travelTripVOs.get(0).getStartTime()); + } else { + List goTrip = travelTripVOs.stream().filter(station -> StrUtil.equals(station.getTripType(), TpOrderTripTypeEnum.GO.getCode())).collect(Collectors.toList()); + pickUpTime = Convert.toLong(goTrip.get(0).getStartTime()); + } + + // 将产品信息对应的规则信息转换成Map + Map> rulesMap = productDetail.getRules().stream().collect(Collectors.groupingBy(TpBizRuleDTO::getRuleGroup)); + + // 找到对应的手续费的规则 + List changeRules = rulesMap.get(TpRuleExpressionGroupEnum.CHARTER_REFUND_CHARGE.getCode()); + if (CollUtil.isEmpty(changeRules)) { + LogUtil.error("当前产品:{}, 无取消手续费规则", productDetail.getProductCode()); + throw new TpTradeProdException(TpTradeProdErrorCode.QUERY_BIZ_RULE_ERROR); + } + List rules = Lists.newArrayList(); + changeRules.forEach(rule -> rules.add(rule.getExpression())); + + // 构建执行入参 + TpCharterRefundParamDTO param = new TpCharterRefundParamDTO(); + param.setOrderPrice(amount); + param.setDepartureTime(pickUpTime); + param.setOccurTime(DateUtil.current()); + + TpRuleExecuteDTO ruleExecuteDTO = new TpRuleExecuteDTO<>(); + ruleExecuteDTO.setRuleList(rules); + ruleExecuteDTO.setParameter(param); + ruleExecuteDTO.setRuleExpressionGroup(TpRuleExpressionGroupEnum.CHARTER_REFUND_CHARGE); + ruleExecuteDTO.setTenantId(tenantId); + + return ruleExecuteDTO; + } + + private static TpOrderChargeRecordDTO buildSaveChargeRecordDTO(TpProdOrderDetailVO orderDetail, BigDecimal serviceCharge, BigDecimal serviceChargeRate, String tenantId) { + TpOrderChargeRecordDTO tpOrderChargeRecordDTO = new TpOrderChargeRecordDTO(); + tpOrderChargeRecordDTO.setOrderNo(orderDetail.getOrderNo()); + tpOrderChargeRecordDTO.setOriginalOrderNo(orderDetail.getOriginalOrderNo()); + tpOrderChargeRecordDTO.setServiceCharge(serviceCharge.toString()); + tpOrderChargeRecordDTO.setServiceChargeRate(serviceChargeRate.toString()); + tpOrderChargeRecordDTO.setBizType(TpAuditOrChangePriceBizTypeEnum.CANCEL_ORDER.getBizType()); + tpOrderChargeRecordDTO.setTenantId(tenantId); + return tpOrderChargeRecordDTO; + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderCancelSaveChargeRecordNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderCancelSaveChargeRecordNode.java new file mode 100644 index 0000000..15b6287 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderCancelSaveChargeRecordNode.java @@ -0,0 +1,57 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.order.TpOrderChargeRecordDTO; +import com.deepinnet.tptradecore.common.dto.order.TpOrderPushStatusDTO; +import com.deepinnet.tptradecore.common.enums.order.TpAuditOrChangePriceBizTypeEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderPushStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserCancelOrderContext; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; + +import javax.annotation.Resource; + +/** + *

+ * 取消订单状态推进为取消待确认 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "cancelSaveChargeRecordNode", name = "取消订单保存费用记录节点") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +public class TpOrderCancelSaveChargeRecordNode { + + @Resource + private TpOrderClient tpOrderClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 取消订单保存费用记录节点"); + + TpUserCancelOrderContext cancelOrderContext = bindCmp.getContextBean(TpUserCancelOrderContext.class); + + // 新增取消的价格记录 + tpOrderClient.saveChargeRecord(buildSaveChargeRecordDTO(cancelOrderContext)); + } + + private static TpOrderChargeRecordDTO buildSaveChargeRecordDTO(TpUserCancelOrderContext cancelOrderContext) { + TpProdOrderDetailVO orderDetail = cancelOrderContext.getOrderDetail(); + TpOrderChargeRecordDTO tpOrderChargeRecordDTO = new TpOrderChargeRecordDTO(); + tpOrderChargeRecordDTO.setOrderNo(orderDetail.getOrderNo()); + tpOrderChargeRecordDTO.setOriginalOrderNo(orderDetail.getOriginalOrderNo()); + tpOrderChargeRecordDTO.setBizType(TpAuditOrChangePriceBizTypeEnum.CANCEL_ORDER.getBizType()); + tpOrderChargeRecordDTO.setTenantId(cancelOrderContext.getTenantId()); + return tpOrderChargeRecordDTO; + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderCarpoolSendSyncMessageNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderCarpoolSendSyncMessageNode.java new file mode 100644 index 0000000..59e9de6 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderCarpoolSendSyncMessageNode.java @@ -0,0 +1,62 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.TpBizTypeEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.model.PaySuccessMessageEntity; +import com.deepinnet.tptradeprod.common.service.integration.client.mq.constants.MessageConstants; +import com.deepinnet.tptradeprod.common.service.integration.client.mq.constants.MessageSysConstants; +import com.deepinnet.tptradeprod.common.service.integration.client.mq.entity.BaseMessageEntity; +import com.deepinnet.tptradeprod.common.service.integration.client.mq.template.MessageClient; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; + +import java.time.LocalDateTime; + +/** + *

+ * 拼车发送同步消息 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "carpoolSendSyncMessageNode", name = "拼车发送同步消息节点") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +@RequiredArgsConstructor +public class TpOrderCarpoolSendSyncMessageNode { + + private final MessageClient messageClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 拼车发送同步消息节点"); + + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + + BaseMessageEntity messageEntity = new BaseMessageEntity(); + messageEntity.setKey(userPlaceOrderContext.getOrderNo()); + messageEntity.setSource(MessageSysConstants.SOURCE_TRANS); + messageEntity.setSendTime(LocalDateTime.now()); + + PaySuccessMessageEntity payOrderSuccessEntity = new PaySuccessMessageEntity(); + payOrderSuccessEntity.setBizType(TpBizTypeEnum.CUSTOM_BUS_PAY.getCode()); + payOrderSuccessEntity.setOrderNo(userPlaceOrderContext.getOrderNo()); + payOrderSuccessEntity.setPayTime(DateUtil.current()); + payOrderSuccessEntity.setTenantId(userPlaceOrderContext.getTenantId()); + String body = JSONUtil.toJsonStr(payOrderSuccessEntity); + messageEntity.setBody(body); + + messageClient.send(messageClient.getMessageTopic(), MessageConstants.EVENT_CODE_TRANS_PAY_SUCCESS, messageEntity); + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderChangeConfirmNoneReductionNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderChangeConfirmNoneReductionNode.java new file mode 100644 index 0000000..862b60f --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderChangeConfirmNoneReductionNode.java @@ -0,0 +1,78 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.order.TpOrderPushStatusDTO; +import com.deepinnet.tptradecore.common.enums.order.TpOrderModulesEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderPushStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderAuditConfirmContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderAuditConfirmDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderQueryDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderPayModeEnum; +import com.deepinnet.tptradeprod.common.enums.TpOrderStatusEnum; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; + +import javax.annotation.Resource; + +/** + *

+ * 订单变更确认通过节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "orderChangeConfirmNoneReductionNode", name = "订单变更[不减免手续费]确认通过节点,推进订单状态") +@LiteflowCmpDefine +public class TpOrderChangeConfirmNoneReductionNode { + + @Resource + private TpOrderClient tpOrderClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单变更[不减免手续费]确认通过节点,推进订单状态"); + + TpOrderAuditConfirmContext auditConfirmContext = bindCmp.getContextBean(TpOrderAuditConfirmContext.class); + TpProdOrderAuditConfirmDTO confirmDTO = auditConfirmContext.getConfirmDTO(); + + TpProdOrderDetailVO nowOrder = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .originalOrderNo(confirmDTO.getOriginalOrderNo()) + .tenantId(confirmDTO.getTenantId()) + .needModules(ListUtil.toList(TpOrderModulesEnum.ORDER_TRAVEL_TRIP.getModule(), TpOrderModulesEnum.ORDER_SUBJECT_ITEM.getModule())).build()); + + auditConfirmContext.setNowOrder(nowOrder); + + // 查询父订单数据 + TpProdOrderDetailVO parentOrder = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .orderNo(nowOrder.getParentOrderNo()) + .tenantId(confirmDTO.getTenantId()) + .needModules(ListUtil.toList(TpOrderModulesEnum.ORDER_TRAVEL_TRIP.getModule(), TpOrderModulesEnum.ORDER_SUBJECT_ITEM.getModule())).build()); + + auditConfirmContext.setParentOrder(parentOrder); + + TpOrderPushStatusEnum statusEnum = TpOrderPushStatusEnum.ORDER_NEED_DISPATCH; + if (ObjectUtil.equals(parentOrder.getStatus(), TpOrderStatusEnum.ORDER_DEPOSIT_NEED_PAY.getStatus()) + || (ObjectUtil.equals(parentOrder.getStatus(), TpOrderStatusEnum.ORDER_NEED_CONFIRM.getStatus()) && StrUtil.equals(nowOrder.getPayMode(), TpOrderPayModeEnum.PAY_BEFORE.getPayMode()))) { + statusEnum = TpOrderPushStatusEnum.ORDER_DEPOSIT_NEED_PAY; + } + + LogUtil.info("订单:{}, 当前状态:{}, 父订单状态:{}, 推进状态:{}", nowOrder.getOrderNo(), nowOrder.getStatus(), parentOrder.getStatus(), statusEnum); + + // 推进订单状态 + tpOrderClient.pushOrderStatus(TpOrderPushStatusDTO.builder() + .tenantId(confirmDTO.getTenantId()) + .orderNo(nowOrder.getOrderNo()) + .tpOrderPushStatusEnum(statusEnum).build()); + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderChangeConfirmReductionNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderChangeConfirmReductionNode.java new file mode 100644 index 0000000..82740a1 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderChangeConfirmReductionNode.java @@ -0,0 +1,76 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.order.TpOrderPushStatusDTO; +import com.deepinnet.tptradecore.common.enums.order.TpOrderModulesEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderPushStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderServiceChargeReduceContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderAuditConfirmDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderQueryDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderPayModeEnum; +import com.deepinnet.tptradeprod.common.enums.TpOrderStatusEnum; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; + +import javax.annotation.Resource; + +/** + *

+ * 订单变更二次确认通过节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "orderChangeConfirmReductionNode", name = "订单变更[减免手续费]确认通过节点,推进订单状态") +@LiteflowCmpDefine +public class TpOrderChangeConfirmReductionNode { + + @Resource + private TpOrderClient tpOrderClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单变更[减免手续费]通过节点,推进订单状态"); + + TpOrderServiceChargeReduceContext reduceContext = bindCmp.getContextBean(TpOrderServiceChargeReduceContext.class); + TpProdOrderAuditConfirmDTO confirmDTO = reduceContext.getConfirmDTO(); + + TpProdOrderDetailVO nowOrder = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .originalOrderNo(confirmDTO.getOriginalOrderNo()) + .tenantId(confirmDTO.getTenantId()) + .needModules(ListUtil.toList(TpOrderModulesEnum.ORDER_TRAVEL_TRIP.getModule(), TpOrderModulesEnum.ORDER_SUBJECT_ITEM.getModule())).build()); + + reduceContext.setNowOrder(nowOrder); + + // 查询父订单数据 + TpProdOrderDetailVO parentOrder = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .orderNo(nowOrder.getParentOrderNo()) + .tenantId(confirmDTO.getTenantId()) + .needModules(ListUtil.toList(TpOrderModulesEnum.ORDER_TRAVEL_TRIP.getModule(), TpOrderModulesEnum.ORDER_SUBJECT_ITEM.getModule())).build()); + + reduceContext.setParentOrder(parentOrder); + + TpOrderPushStatusEnum statusEnum = TpOrderPushStatusEnum.ORDER_NEED_DISPATCH; + if (ObjectUtil.equals(parentOrder.getStatus(), TpOrderStatusEnum.ORDER_DEPOSIT_NEED_PAY.getStatus()) + || (ObjectUtil.equals(parentOrder.getStatus(), TpOrderStatusEnum.ORDER_NEED_CONFIRM.getStatus()) && StrUtil.equals(nowOrder.getPayMode(), TpOrderPayModeEnum.PAY_BEFORE.getPayMode()))) { + statusEnum = TpOrderPushStatusEnum.ORDER_DEPOSIT_NEED_PAY; + } + + // 推进订单状态 + tpOrderClient.pushOrderStatus(TpOrderPushStatusDTO.builder() + .tenantId(confirmDTO.getTenantId()) + .orderNo(nowOrder.getOrderNo()) + .tpOrderPushStatusEnum(statusEnum).build()); + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderChangeReductionSyncTripNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderChangeReductionSyncTripNode.java new file mode 100644 index 0000000..8a84257 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderChangeReductionSyncTripNode.java @@ -0,0 +1,63 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.order.TpOrderPushStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderAuditConfirmContext; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderServiceChargeReduceContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderAuditConfirmDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderPayModeEnum; +import com.deepinnet.tptradeprod.common.enums.TpOrderStatusEnum; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.deepinnet.tptradeprod.core.compoment.TpOrderSyncTripComponent; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; + +import javax.annotation.Resource; + +/** + *

+ * + *

+ * + * @author chenjiaju + * @since 2024/2/21 + */ + +@LiteflowComponent(value = "orderChangeReductionSyncTripNode", name = "行程变更[减免手续费]同步主数据节点") +@LiteflowCmpDefine +public class TpOrderChangeReductionSyncTripNode { + + @Resource + private TpOrderSyncTripComponent orderSyncTripComponent; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 行程变更[减免手续费]同步主数据节点"); + + TpOrderServiceChargeReduceContext reduceContext = bindCmp.getContextBean(TpOrderServiceChargeReduceContext.class); + TpProdOrderDetailVO nowOrder = reduceContext.getNowOrder(); + TpProdOrderDetailVO parentOrder = reduceContext.getParentOrder(); + TpProdOrderAuditConfirmDTO confirmDTO = reduceContext.getConfirmDTO(); + + TpOrderPushStatusEnum statusEnum = TpOrderPushStatusEnum.ORDER_NEED_DISPATCH; + if (ObjectUtil.equals(parentOrder.getStatus(), TpOrderStatusEnum.ORDER_DEPOSIT_NEED_PAY.getStatus()) + || (ObjectUtil.equals(parentOrder.getStatus(), TpOrderStatusEnum.ORDER_NEED_CONFIRM.getStatus()) && StrUtil.equals(nowOrder.getPayMode(), TpOrderPayModeEnum.PAY_BEFORE.getPayMode()))) { + statusEnum = TpOrderPushStatusEnum.ORDER_DEPOSIT_NEED_PAY; + } + + if (ObjectUtil.equals(statusEnum.getStatus(), TpOrderPushStatusEnum.ORDER_NEED_DISPATCH.getStatus())) { + // 同步当前行程到主数据 + try{ + orderSyncTripComponent.updateSync(nowOrder, parentOrder, confirmDTO.getTenantId()); + } catch (Exception e) { + LogUtil.error("行程变更[减免手续费]同步主数据节点异常, 异常信息:{}", e); + } + } + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderCreateApplyCreateNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderCreateApplyCreateNode.java new file mode 100644 index 0000000..f323234 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderCreateApplyCreateNode.java @@ -0,0 +1,86 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson2.JSONObject; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.order.TpOrderChangeApplyStatusEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderChangeTypeEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderChangeApplicantCreatedDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderChangeApplyCreatedDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderCreateDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderSceneEnum; +import com.deepinnet.tptradeprod.common.enums.TpOrderSourceEnum; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.facade.TpOrderChangeAcceptanceFacade; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.StringUtils; + +/** + *

+ * 订单创建申请单创建节点 + *

+ * + * @author chenjiaju + * @since 2023/11/13 + */ + +@LiteflowComponent(value = "orderCreateApplyCreateNode", name = "订单创建申请单创建节点") +@LiteflowCmpDefine +@RequiredArgsConstructor +public class TpOrderCreateApplyCreateNode { + + private final TpOrderChangeAcceptanceFacade tpOrderChangeAcceptanceFacade; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单创建申请单创建节点"); + + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + TpProdOrderCreateDTO createDTO = userPlaceOrderContext.getCreateDTO(); + // 订单创建申请单 + TpProdOrderChangeApplyCreatedDTO orderChangeApplyCreatedDTO = TpProdOrderChangeApplyCreatedDTO.builder().build(); + orderChangeApplyCreatedDTO.setOrderNo(createDTO.getOrderNo()); + orderChangeApplyCreatedDTO.setOriginalOrderNo(createDTO.getOriginalOrderNo()); + orderChangeApplyCreatedDTO.setOriginOrgNo(createDTO.getOrgCode()); + orderChangeApplyCreatedDTO.setApplyType(TpOrderChangeTypeEnum.ORDER_CREATE.getType()); + orderChangeApplyCreatedDTO.setApplyTime(DateUtil.current()); + orderChangeApplyCreatedDTO.setAutoAudit(userPlaceOrderContext.getAutoAudit()); + //如果用户配置下单时需要业务员审核确认,则申请单为创建状态,否则直接审批通过,审核单也直接为审核通过状态 + String applyStatus = userPlaceOrderContext.getAutoAudit() ? TpOrderChangeApplyStatusEnum.APPROVED_SUCCESS.getType() : TpOrderChangeApplyStatusEnum.WAITING_APPROVED.getType(); + orderChangeApplyCreatedDTO.setApplyStatus(applyStatus); + orderChangeApplyCreatedDTO.setTenantId(userPlaceOrderContext.getTenantId()); + + TpProdOrderChangeApplicantCreatedDTO orderChangeApplicant = new TpProdOrderChangeApplicantCreatedDTO(); + + if (StrUtil.equals(createDTO.getSource(), TpOrderSourceEnum.BACKEND.getType())) { + orderChangeApplicant.setApplicantNo(createDTO.getOrderPlacer().getBackendPlacerNo()); + orderChangeApplyCreatedDTO.setOrderScene(TpOrderSceneEnum.SALESMAN_OPERATE.getCode()); + }else { + orderChangeApplicant.setApplicantNo(createDTO.getOrderPlacer().getPlacerNo()); + orderChangeApplicant.setApplicantName(createDTO.getOrderRequirementUser().getRequirementContactName()); + orderChangeApplicant.setApplicantPhone(createDTO.getOrderRequirementUser().getRequirementContact()); + orderChangeApplyCreatedDTO.setOrderScene(TpOrderSceneEnum.USER_OPERATE.getCode()); + } + + orderChangeApplyCreatedDTO.setOrderChangeApplicant(orderChangeApplicant); + + TpResult orderChangeApply = tpOrderChangeAcceptanceFacade.createOrderChangeApply(orderChangeApplyCreatedDTO); + + if (!orderChangeApply.getData()) { + LogUtil.error("订单申请单创建流程失败, 订单编号:{}, 原始订单编号:{}, 创建入参:{}", createDTO.getOrderNo(), createDTO.getOriginalOrderNo(), JSONObject.toJSONString(orderChangeApplyCreatedDTO)); + throw new TpTradeProdException(TpTradeProdErrorCode.CREATE_ORDER_ERROR); + } + + } + + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderCustomBusSendDelayMessageNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderCustomBusSendDelayMessageNode.java new file mode 100644 index 0000000..72d3a78 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderCustomBusSendDelayMessageNode.java @@ -0,0 +1,66 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import com.alibaba.fastjson2.JSONObject; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderCreateDTO; +import com.deepinnet.tptradeprod.common.model.OrderDelayMessageEntity; +import com.deepinnet.tptradeprod.common.service.integration.client.mq.constants.MessageConstants; +import com.deepinnet.tptradeprod.common.service.integration.client.mq.constants.MessageSysConstants; +import com.deepinnet.tptradeprod.common.service.integration.client.mq.entity.BaseMessageEntity; +import com.deepinnet.tptradeprod.common.service.integration.client.mq.template.MessageClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderCreateVO; +import com.deepinnet.tptradeprod.core.compoment.TpCreateOrderComponent; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; + +import java.time.LocalDateTime; + +/** + *

+ * 定制公交发送延时消息节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "customBusSendDelayMessageNode", name = "定制公交发送延时消息节点") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +@RequiredArgsConstructor +public class TpOrderCustomBusSendDelayMessageNode { + + private final MessageClient messageClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 定制公交发送延时消息节点"); + + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + TpProdOrderCreateDTO createDTO = userPlaceOrderContext.getCreateDTO(); + + // 发送消息 + messageClient.send(messageClient.getDelayMessageTopic(), MessageConstants.EVENT_ORDER_DELAY_TAG_SUCCESS, buildDelayMessageEntity(userPlaceOrderContext.getOrderNo(), userPlaceOrderContext.getTenantId()), createDTO.getExpireTime()); + LogUtil.info("订单延时消息发送成功, 订单号:{}, tenantId:{}, 延时时间:{}", userPlaceOrderContext.getOrderNo(), userPlaceOrderContext.getTenantId(), createDTO.getExpireTime()); + } + + private BaseMessageEntity buildDelayMessageEntity(String orderNo, String tenantId) { + OrderDelayMessageEntity orderDelayMessageEntity = new OrderDelayMessageEntity(); + orderDelayMessageEntity.setOrderNo(orderNo); + orderDelayMessageEntity.setTenantId(tenantId); + + BaseMessageEntity baseMessageEntity = new BaseMessageEntity(); + baseMessageEntity.setSource(MessageSysConstants.SOURCE_ORDER); + baseMessageEntity.setKey(orderNo); + baseMessageEntity.setSendTime(LocalDateTime.now()); + baseMessageEntity.setBody(JSONObject.toJSONString(orderDelayMessageEntity)); + return baseMessageEntity; + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderDepositNeedPayStatusNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderDepositNeedPayStatusNode.java new file mode 100644 index 0000000..b5a682f --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderDepositNeedPayStatusNode.java @@ -0,0 +1,46 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.order.TpOrderPushStatusDTO; +import com.deepinnet.tptradecore.common.enums.order.TpOrderPushStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; + +import javax.annotation.Resource; + +/** + *

+ * 订单状态推进为订金待支付节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "depositNeedPayNode", name = "订单状态推进为订金待支付节点") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +public class TpOrderDepositNeedPayStatusNode { + + @Resource + private TpOrderClient tpOrderClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单状态推进为订金待支付节点"); + + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + + tpOrderClient.pushOrderStatus(TpOrderPushStatusDTO.builder() + .orderNo(userPlaceOrderContext.getOrderNo()) + .tenantId(userPlaceOrderContext.getTenantId()) + .tpOrderPushStatusEnum(TpOrderPushStatusEnum.ORDER_DEPOSIT_NEED_PAY).build()); + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderManualSyncCancelTripNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderManualSyncCancelTripNode.java new file mode 100644 index 0000000..71a6cb9 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderManualSyncCancelTripNode.java @@ -0,0 +1,43 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderManualSyncTripContext; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.deepinnet.tptradeprod.core.compoment.TpOrderSyncTripComponent; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; + +import javax.annotation.Resource; + +/** + *

+ * 取消订单手动同步行程节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "orderManualSyncTripCancelNode", name = "取消订单手动同步行程节点") +@LiteflowCmpDefine +public class TpOrderManualSyncCancelTripNode { + + @Resource + private TpOrderSyncTripComponent orderSyncTripComponent; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 取消订单手动同步行程节点"); + + TpOrderManualSyncTripContext syncTripContext = bindCmp.getContextBean(TpOrderManualSyncTripContext.class); + + TpProdOrderDetailVO currentOrderDetail = syncTripContext.getCurrentOrderDetail(); + + // 同步当前行程到主数据 + orderSyncTripComponent.cancelSync(currentOrderDetail, syncTripContext.getTenantId()); + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderManualSyncCreateTripNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderManualSyncCreateTripNode.java new file mode 100644 index 0000000..f178fb7 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderManualSyncCreateTripNode.java @@ -0,0 +1,43 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderManualSyncTripContext; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.deepinnet.tptradeprod.core.compoment.TpOrderSyncTripComponent; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; + +import javax.annotation.Resource; + +/** + *

+ * 创建订单手动同步行程节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "orderManualSyncTripCreateNode", name = "创建订单手动同步行程节点") +@LiteflowCmpDefine +public class TpOrderManualSyncCreateTripNode { + + @Resource + private TpOrderSyncTripComponent orderSyncTripComponent; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 创建订单手动同步行程节点"); + + TpOrderManualSyncTripContext syncTripContext = bindCmp.getContextBean(TpOrderManualSyncTripContext.class); + + TpProdOrderDetailVO currentOrderDetail = syncTripContext.getCurrentOrderDetail(); + + // 同步当前行程到主数据 + orderSyncTripComponent.createSync(currentOrderDetail, syncTripContext.getTenantId()); + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderManualSyncUpdateTripNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderManualSyncUpdateTripNode.java new file mode 100644 index 0000000..e32fd4c --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderManualSyncUpdateTripNode.java @@ -0,0 +1,45 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderManualSyncTripContext; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.deepinnet.tptradeprod.core.compoment.TpOrderSyncTripComponent; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; + +import javax.annotation.Resource; + +/** + *

+ * 订单手动同步行程节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "orderManualSyncTripUpdateNode", name = "更新订单手动同步行程节点") +@LiteflowCmpDefine +public class TpOrderManualSyncUpdateTripNode { + + @Resource + private TpOrderSyncTripComponent orderSyncTripComponent; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 更新订单手动同步行程节点"); + + TpOrderManualSyncTripContext syncTripContext = bindCmp.getContextBean(TpOrderManualSyncTripContext.class); + + TpProdOrderDetailVO nowOrder = syncTripContext.getCurrentOrderDetail(); + + TpProdOrderDetailVO parentOrder = syncTripContext.getParentOrderDetail(); + + // 同步当前行程到主数据 + orderSyncTripComponent.updateSync(nowOrder, parentOrder, syncTripContext.getTenantId()); + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderNeedConfirmNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderNeedConfirmNode.java new file mode 100644 index 0000000..bcb8e90 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderNeedConfirmNode.java @@ -0,0 +1,48 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.order.TpOrderPushStatusDTO; +import com.deepinnet.tptradecore.common.enums.order.TpOrderPushStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderCreateDTO; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; + +/** + *

+ * 订单确认节点 + *

+ * + * @author chenjiaju + * @since 2023/11/13 + */ + +@LiteflowComponent(value = "orderNeedConfirmNode", name = "订单状态推进待确认节点") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +@RequiredArgsConstructor +public class TpOrderNeedConfirmNode { + + private final TpOrderClient tpOrderClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单状态推进确认节点"); + + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + TpProdOrderCreateDTO createDTO = userPlaceOrderContext.getCreateDTO(); + + // 订单状态推进至订单待确认 + tpOrderClient.pushOrderStatus(TpOrderPushStatusDTO.builder() + .orderNo(createDTO.getOrderNo()) + .tpOrderPushStatusEnum(TpOrderPushStatusEnum.ORDER_NEED_CONFIRM) + .tenantId(userPlaceOrderContext.getTenantId()).build()); + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderNeedConfirmRemindAuditorNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderNeedConfirmRemindAuditorNode.java new file mode 100644 index 0000000..2fee3d9 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderNeedConfirmRemindAuditorNode.java @@ -0,0 +1,70 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpcommoncore.common.service.template.email.TpEmailStaffDistributeOrderTemplate; +import com.deepinnet.tpcommoncore.common.service.template.sms.staff.TpSmsStaffDistributeOrderTemplate; +import com.deepinnet.tpconfigcore.common.vo.TpTenantContractListDTO; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderCreateDTO; +import com.deepinnet.tptradeprod.common.service.integration.client.TpTenantClient; +import com.deepinnet.tptradeprod.common.service.integration.client.email.TpEmailClient; +import com.deepinnet.tptradeprod.common.service.integration.client.sms.TpSmsClient; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; + +/** + *

+ * 订单下单待确认通知管理员 + *

+ * + * @author chenjiaju + * @since 2023/11/13 + */ + +@LiteflowComponent(value = "remindAuditorNode", name = "订单下单待确认通知管理员") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +@RequiredArgsConstructor +public class TpOrderNeedConfirmRemindAuditorNode { + + private final TpTenantClient tpTenantClient; + + private final TpSmsClient tpSmsClient; + + private final TpEmailClient tpEmailClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单下单待确认通知管理员"); + + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + TpProdOrderCreateDTO createDTO = userPlaceOrderContext.getCreateDTO(); + + TpTenantContractListDTO orgDetail = tpTenantClient.getAuditorsByOrgCode(createDTO.getOrgCode(), createDTO.getTenantId()); + + // 短信发送模板 + TpSmsStaffDistributeOrderTemplate smsStaffDistributeOrderTemplate = new TpSmsStaffDistributeOrderTemplate(); + smsStaffDistributeOrderTemplate.setOrderNo(createDTO.getOriginalOrderNo()); + + if (ObjectUtil.isNotNull(orgDetail) && CollUtil.isNotEmpty(orgDetail.getAuditorPhone())) { + tpSmsClient.batchSendSms(orgDetail.getAuditorPhone(), smsStaffDistributeOrderTemplate); + } + + // 邮件发送模板 + TpEmailStaffDistributeOrderTemplate emailStaffDistributeOrderTemplate = new TpEmailStaffDistributeOrderTemplate(); + emailStaffDistributeOrderTemplate.setOrderNo(createDTO.getOriginalOrderNo()); + + if (ObjectUtil.isNotNull(orgDetail) && CollUtil.isNotEmpty(orgDetail.getAuditorEmail())) { + tpEmailClient.batchSendEmail(orgDetail.getAuditorEmail(), emailStaffDistributeOrderTemplate); + } + + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderNoneReductionSyncTripNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderNoneReductionSyncTripNode.java new file mode 100644 index 0000000..25c66c0 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderNoneReductionSyncTripNode.java @@ -0,0 +1,62 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.order.TpOrderPushStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderAuditConfirmContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderAuditConfirmDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderPayModeEnum; +import com.deepinnet.tptradeprod.common.enums.TpOrderStatusEnum; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.deepinnet.tptradeprod.core.compoment.TpOrderSyncTripComponent; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; + +import javax.annotation.Resource; + +/** + *

+ * + *

+ * + * @author chenjiaju + * @since 2024/2/21 + */ + +@LiteflowComponent(value = "orderNoneReductionChangeSyncTripNode", name = "行程变更[不减免手续费]同步主数据节点") +@LiteflowCmpDefine +public class TpOrderNoneReductionSyncTripNode { + + @Resource + private TpOrderSyncTripComponent orderSyncTripComponent; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 行程变更[不减免手续费]同步主数据节点"); + + TpOrderAuditConfirmContext auditConfirmContext = bindCmp.getContextBean(TpOrderAuditConfirmContext.class); + TpProdOrderDetailVO nowOrder = auditConfirmContext.getNowOrder(); + TpProdOrderDetailVO parentOrder = auditConfirmContext.getParentOrder(); + TpProdOrderAuditConfirmDTO confirmDTO = auditConfirmContext.getConfirmDTO(); + + TpOrderPushStatusEnum statusEnum = TpOrderPushStatusEnum.ORDER_NEED_DISPATCH; + if (ObjectUtil.equals(parentOrder.getStatus(), TpOrderStatusEnum.ORDER_DEPOSIT_NEED_PAY.getStatus()) + || (ObjectUtil.equals(parentOrder.getStatus(), TpOrderStatusEnum.ORDER_NEED_CONFIRM.getStatus()) && StrUtil.equals(nowOrder.getPayMode(), TpOrderPayModeEnum.PAY_BEFORE.getPayMode()))) { + statusEnum = TpOrderPushStatusEnum.ORDER_DEPOSIT_NEED_PAY; + } + + if (ObjectUtil.equals(statusEnum.getStatus(), TpOrderPushStatusEnum.ORDER_NEED_DISPATCH.getStatus())) { + // 同步当前行程到主数据 + try{ + orderSyncTripComponent.updateSync(nowOrder, parentOrder, confirmDTO.getTenantId()); + } catch (Exception e) { + LogUtil.error("行程变更[不减免手续费]同步主数据节点异常, 异常信息:{}", e); + } + } + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderPushBalancePaidNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderPushBalancePaidNode.java new file mode 100644 index 0000000..0a8fdc9 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderPushBalancePaidNode.java @@ -0,0 +1,79 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import cn.hutool.core.util.ObjectUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.order.TpOrderPushStatusDTO; +import com.deepinnet.tptradecore.common.enums.order.TpOrderPushStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.enums.TpOrderStatusEnum; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.deepinnet.tptradeprod.core.compoment.TpOrderSyncTripComponent; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; + +import javax.annotation.Resource; + +/** + *

+ * 订单状态推进为尾款已支付节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "pushBalancePaidNode", name = "订单状态推进为尾款已支付节点") +@LiteflowCmpDefine +public class TpOrderPushBalancePaidNode { + + @Resource + private TpOrderClient tpOrderClient; + + @Resource + private TpOrderSyncTripComponent tpOrderSyncTripComponent; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单状态推进为尾款已支付节点"); + + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + + // 拿到订单,判断当前状态 + TpProdOrderDetailVO orderDetailVO = userPlaceOrderContext.getOrderDetailVO(); + + TpOrderPushStatusEnum pushStatusEnum = null; + // 取消待支付 + if (ObjectUtil.equals(orderDetailVO.getStatus(), TpOrderStatusEnum.ORDER_CANCEL_NEED_PAY.getStatus())) { + pushStatusEnum = TpOrderPushStatusEnum.ORDER_CANCEL_PAID; + } + + // 行程结束待支付 + if (ObjectUtil.equals(orderDetailVO.getStatus(), TpOrderStatusEnum.ORDER_TRIP_END_NEED_PAY.getStatus())) { + pushStatusEnum = TpOrderPushStatusEnum.ORDER_TRIP_END_PAID; + } + + if (ObjectUtil.isNull(pushStatusEnum)) { + LogUtil.warn("当前订单:{}, 原始订单:{}, 未找到对应的推进状态", orderDetailVO.getOrderNo(), orderDetailVO.getOriginalOrderNo()); + return; + } + + // 推进订单状态 + tpOrderClient.pushOrderStatus(TpOrderPushStatusDTO.builder() + .orderNo(userPlaceOrderContext.getOrderNo()) + .payTime(userPlaceOrderContext.getPayTime()) + .tenantId(userPlaceOrderContext.getTenantId()) + .tpOrderPushStatusEnum(pushStatusEnum).build()); + + // 判断是否需要取消行程同步主数据 + if (ObjectUtil.equals(TpOrderPushStatusEnum.ORDER_CANCEL_PAID.getStatus(), pushStatusEnum.getStatus())) { + // 同步主数据取消行程 + tpOrderSyncTripComponent.cancelSync(orderDetailVO, userPlaceOrderContext.getTenantId()); + } + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderPushDepositPaidNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderPushDepositPaidNode.java new file mode 100644 index 0000000..e09c947 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderPushDepositPaidNode.java @@ -0,0 +1,47 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.order.TpOrderPushStatusDTO; +import com.deepinnet.tptradecore.common.enums.order.TpOrderPushStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; + +import javax.annotation.Resource; + +/** + *

+ * 订单状态推进为订金已支付节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "pushDepositPaidNode", name = "订单状态推进为订金已支付节点") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +public class TpOrderPushDepositPaidNode { + + @Resource + private TpOrderClient tpOrderClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单状态推进为订金已支付节点"); + + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + + tpOrderClient.pushOrderStatus(TpOrderPushStatusDTO.builder() + .orderNo(userPlaceOrderContext.getOrderNo()) + .payTime(userPlaceOrderContext.getPayTime()) + .tenantId(userPlaceOrderContext.getTenantId()) + .tpOrderPushStatusEnum(TpOrderPushStatusEnum.ORDER_DEPOSIT_PAID).build()); + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderPushNeedDispatchNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderPushNeedDispatchNode.java new file mode 100644 index 0000000..bcb9210 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderPushNeedDispatchNode.java @@ -0,0 +1,46 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.order.TpOrderPushStatusDTO; +import com.deepinnet.tptradecore.common.enums.order.TpOrderPushStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; + +import javax.annotation.Resource; + +/** + *

+ * 订单状态推进为待派车节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "pushNeedDispatchNode", name = "订单状态推进为待派车节点") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +public class TpOrderPushNeedDispatchNode { + + @Resource + private TpOrderClient tpOrderClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单状态推进为待派车节点"); + + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + + tpOrderClient.pushOrderStatus(TpOrderPushStatusDTO.builder() + .orderNo(userPlaceOrderContext.getOrderNo()) + .tenantId(userPlaceOrderContext.getTenantId()) + .tpOrderPushStatusEnum(TpOrderPushStatusEnum.ORDER_NEED_DISPATCH).build()); + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderPushNeedDispatchStatusNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderPushNeedDispatchStatusNode.java new file mode 100644 index 0000000..b9c97f2 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderPushNeedDispatchStatusNode.java @@ -0,0 +1,45 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.order.TpOrderPushStatusDTO; +import com.deepinnet.tptradecore.common.enums.order.TpOrderPushStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; + +import javax.annotation.Resource; + +/** + *

+ * 订单状态推进为待派车节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "needDispatchStatusNode", name = "订单状态推进为待派车节点") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +public class TpOrderPushNeedDispatchStatusNode { + + @Resource + private TpOrderClient tpOrderClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单状态推进为待派车节点"); + + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + tpOrderClient.pushOrderStatus(TpOrderPushStatusDTO.builder() + .orderNo(userPlaceOrderContext.getOrderNo()) + .tenantId(userPlaceOrderContext.getTenantId()) + .tpOrderPushStatusEnum(TpOrderPushStatusEnum.ORDER_NEED_DISPATCH).build()); + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderUpdateChargeRecordNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderUpdateChargeRecordNode.java new file mode 100644 index 0000000..84525c7 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderUpdateChargeRecordNode.java @@ -0,0 +1,52 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import cn.hutool.core.util.StrUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.order.TpOrderChargeRecordDTO; +import com.deepinnet.tptradecore.common.enums.order.TpAuditOrChangePriceBizTypeEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; + +import javax.annotation.Resource; + +/** + *

+ * 支付成功后更新订单费用记录 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "updateChargeRecordNode", name = "更新订单费用记录") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +public class TpOrderUpdateChargeRecordNode { + + @Resource + private TpOrderClient tpOrderClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 支付成功, 更新订单费用记录"); + + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + TpProdOrderDetailVO orderDetailVO = userPlaceOrderContext.getOrderDetailVO(); + + TpOrderChargeRecordDTO tpOrderChargeRecordDTO = new TpOrderChargeRecordDTO(); + tpOrderChargeRecordDTO.setOrderNo(userPlaceOrderContext.getOrderNo()); + tpOrderChargeRecordDTO.setTenantId(userPlaceOrderContext.getTenantId()); + tpOrderChargeRecordDTO.setPayAmount(orderDetailVO.getPayAmount()); + // 更新记录为[下单]业务类型的费用记录 + tpOrderChargeRecordDTO.setBizType(StrUtil.isEmpty(orderDetailVO.getParentOrderNo()) ? TpAuditOrChangePriceBizTypeEnum.CONFIRM_ORDER.getBizType() : TpAuditOrChangePriceBizTypeEnum.CHANGE_ORDER.getBizType()); + tpOrderClient.updateChargeRecord(tpOrderChargeRecordDTO); + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderUserPrePayNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderUserPrePayNode.java new file mode 100644 index 0000000..b4e20c6 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpOrderUserPrePayNode.java @@ -0,0 +1,76 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpproductcore.common.dto.product.TpProdDetailDTO; +import com.deepinnet.tptradeprod.biz.constants.TpTradeProdConstants; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderCreateDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderPayDTO; +import com.deepinnet.tptradeprod.common.dto.TpUserInfoDTO; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.vo.TpOrderPlacerVO; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderPayVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; +import org.jetbrains.annotations.NotNull; + +/** + *

+ * 订单预支付节点 + *

+ * + * @author chenjiaju + * @since 2023/11/13 + */ + +@LiteflowComponent(value = "orderPrePayNode", name = "订单预支付节点") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +@RequiredArgsConstructor +public class TpOrderUserPrePayNode { + + private final TpOrderClient tpOrderClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单预支付节点"); + + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + TpProdDetailDTO productDTO = userPlaceOrderContext.getProductDTO(); + TpProdOrderCreateDTO createDTO = userPlaceOrderContext.getCreateDTO(); + + // 预支付 + TpProdOrderPayDTO tpProdOrderPayDTO = buildOrderPayDTO(createDTO, userPlaceOrderContext.getOrderNo(), userPlaceOrderContext.getProductDTO().getProductName()); + tpProdOrderPayDTO.setPayTimeout(System.currentTimeMillis() + TpTradeProdConstants.DEFAULT_TIME_OUT_INTERVAL); + tpProdOrderPayDTO.setOrgCode(productDTO.getRouteDetailDTO().getRouteBase().getOrgCode()); + TpOrderPlacerVO orderPlacer = createDTO.getOrderPlacer(); + TpUserInfoDTO tpUserInfoDTO = new TpUserInfoDTO(); + tpUserInfoDTO.setUserNo(orderPlacer.getPlacerNo()); + tpUserInfoDTO.setUserName(orderPlacer.getPlacerName()); + tpProdOrderPayDTO.setUserInfoDTO(tpUserInfoDTO); + + TpProdOrderPayVO tpProdOrderPayVO = tpOrderClient.payOrder(tpProdOrderPayDTO); + + userPlaceOrderContext.setPayCashierUrl(tpProdOrderPayVO.getCashierUrl()); + + } + + @NotNull + private TpProdOrderPayDTO buildOrderPayDTO(TpProdOrderCreateDTO dto, String orderNo, String productName) { + TpProdOrderPayDTO tpProdOrderPayDTO = new TpProdOrderPayDTO(); + tpProdOrderPayDTO.setUserNo(dto.getUserNo()); + tpProdOrderPayDTO.setOrderNo(orderNo); + tpProdOrderPayDTO.setPayAmount(dto.getPayAmount()); + tpProdOrderPayDTO.setSource(dto.getSource()); + tpProdOrderPayDTO.setUserIp(dto.getUserIp()); + tpProdOrderPayDTO.setTenantId(dto.getTenantId()); + tpProdOrderPayDTO.setPayTitle(productName); + return tpProdOrderPayDTO; + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpPaidOrderStatusNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpPaidOrderStatusNode.java new file mode 100644 index 0000000..d278df7 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpPaidOrderStatusNode.java @@ -0,0 +1,92 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpproductcore.common.enums.TpCarPoolStatusEnum; +import com.deepinnet.tpproductcore.common.qto.TpSalesUnitCarPoolListQueryDTO; +import com.deepinnet.tpproductcore.common.vo.TpSalesUnitCarPoolVO; +import com.deepinnet.tptradecore.common.dto.order.TpOrderPushStatusDTO; +import com.deepinnet.tptradecore.common.enums.order.TpOrderPushStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderPaidDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderTypeEnum; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.service.integration.client.TpProductSalesUnitClient; +import com.deepinnet.tptradeprod.common.vo.TpOrderSubjectItemVO; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; + +import java.util.List; +import java.util.stream.Collectors; + +/** + *

+ * 推进订单支付节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "paidOrderStatusNode", name = "推进订单支付节点(拼车推进为拼车中或拼车成功)") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +@RequiredArgsConstructor +public class TpPaidOrderStatusNode { + + private final TpOrderClient tpOrderClient; + + private final TpProductSalesUnitClient productSalesUnitClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单推进为已支付(拼车推进为拼车中或拼车成功)"); + + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + + TpProdOrderDetailVO orderDetailVO = userPlaceOrderContext.getOrderDetailVO(); + List saleUnits = orderDetailVO.getOrderSubjectItem().stream().map(TpOrderSubjectItemVO::getItemNo).collect(Collectors.toList()); + + if (ObjectUtil.equals(orderDetailVO.getType(), TpOrderTypeEnum.CARPOOL_ORDER.getType())) { + carpoolPaid(saleUnits, userPlaceOrderContext); + } else { + orderPaid(userPlaceOrderContext); + } + + } + + private void carpoolPaid(List saleUnits, TpUserPlaceOrderContext userPlaceOrderContext) { + // 预约只能每次预约一个班次的拼车 + TpSalesUnitCarPoolListQueryDTO queryDTO = new TpSalesUnitCarPoolListQueryDTO(); + queryDTO.setSalesUnitCodeList(saleUnits); + queryDTO.setTenantId(userPlaceOrderContext.getTenantId()); + TpSalesUnitCarPoolVO saleUnitCarpool = productSalesUnitClient.listCarpools(queryDTO).get(0); + + String carPoolStatus = saleUnitCarpool.getCarPoolStatus(); + if (StrUtil.equals(TpCarPoolStatusEnum.SUCCESS.getCode(), carPoolStatus)) { + tpOrderClient.pushOrderStatus(TpOrderPushStatusDTO.builder() + .orderNo(userPlaceOrderContext.getOrderNo()) + .tenantId(userPlaceOrderContext.getTenantId()) + .tpOrderPushStatusEnum(TpOrderPushStatusEnum.ORDER_CARPOOL_SUCCESS).build()); + } else { + orderPaid(userPlaceOrderContext); + } + } + + private void orderPaid(TpUserPlaceOrderContext userPlaceOrderContext) { + TpProdOrderPaidDTO tpProdOrderPaidDTO = new TpProdOrderPaidDTO(); + tpProdOrderPaidDTO.setOrderNo(userPlaceOrderContext.getOrderNo()); + tpProdOrderPaidDTO.setTenantId(userPlaceOrderContext.getTenantId()); + tpProdOrderPaidDTO.setPayTime(DateUtil.current()); + tpOrderClient.paid(tpProdOrderPaidDTO); + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpRefundTicketSuccessNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpRefundTicketSuccessNode.java new file mode 100644 index 0000000..1c3583c --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpRefundTicketSuccessNode.java @@ -0,0 +1,41 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpRefundTicketApplyContext; +import com.deepinnet.tptradeprod.common.dto.TpProdRefundApplyDTO; +import com.deepinnet.tptradeprod.common.service.integration.client.TpContractClient; +import com.yomahub.liteflow.annotation.*; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; + +import javax.annotation.Resource; + +/** + * @author amos wong + * @create 2023/10/16 16:10 + * @Description + */ +@LiteflowComponent(value = "refundTicketSuccessNode", name = "退票成功node") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +public class TpRefundTicketSuccessNode { + + @Resource + private TpContractClient contractClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + TpRefundTicketApplyContext refundTicketContext = bindCmp.getContextBean(TpRefundTicketApplyContext.class); + LogUtil.info("执行退票成功node,入参为:{}", JSONUtil.toJsonStr(refundTicketContext)); + + Boolean refundResult = refundTicketContext.getRefundResult(); + TpProdRefundApplyDTO refundApplyDTO = refundTicketContext.getRefundApplyDTO(); + String refundApplyOrderNo = refundTicketContext.getRefundApplyOrderNo(); + + if (refundResult) { + LogUtil.info("退款成功,更新退票申请单状态为退票成功,退票申请单号:{}", refundApplyOrderNo); + contractClient.refundTicketSuccess(refundApplyOrderNo, refundApplyDTO.getTenantId()); + } + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpRescheduleOrderNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpRescheduleOrderNode.java new file mode 100644 index 0000000..5e94ddf --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpRescheduleOrderNode.java @@ -0,0 +1,59 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderCreateDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderRescheduleDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderTypeEnum; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderCreateVO; +import com.deepinnet.tptradeprod.core.compoment.TpRescheduleOrderComponent; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; + +/** + *

+ * 创建订单节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "rescheduleOrderNode", name = "改签订单节点") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +@RequiredArgsConstructor +public class TpRescheduleOrderNode { + + private final TpRescheduleOrderComponent tpRescheduleOrderComponent; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 定制公交改签订单创单 & 改签记录"); + + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + TpProdOrderCreateDTO createDTO = userPlaceOrderContext.getCreateDTO(); + + createDTO.setPayTime(userPlaceOrderContext.getOrderDetailVO().getPayTime()); + createDTO.setType(TpOrderTypeEnum.CUSTOMIZED_RESCHEDULE_ORDER.getType()); + createDTO.setPayType(userPlaceOrderContext.getOrderDetailVO().getPayType()); + TpProdOrderRescheduleDTO orderRescheduleDTO = userPlaceOrderContext.getOrderRescheduleDTO(); + + // 创建订单组件 + TpProdOrderCreateVO createOrderVO = tpRescheduleOrderComponent.execute(orderRescheduleDTO); + createDTO.setOrderNo(createOrderVO.getOrderNo()); + createDTO.setOriginalOrderNo(createOrderVO.getOriginalOrderNo()); + + userPlaceOrderContext.setOrderNo(createOrderVO.getOrderNo()); + // 需支付金额 + userPlaceOrderContext.setPayAmount(createDTO.getPayAmount()); + userPlaceOrderContext.setTenantId(createDTO.getTenantId()); + } + + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpSendEmailNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpSendEmailNode.java new file mode 100644 index 0000000..823f1bf --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpSendEmailNode.java @@ -0,0 +1,33 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpSendEmailContext; +import com.deepinnet.tptradeprod.common.service.integration.client.email.TpEmailClient; +import com.yomahub.liteflow.annotation.*; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; + +import javax.annotation.Resource; +import java.util.concurrent.CompletableFuture; + +/** + * @author amos wong + * @create 2023/11/13 14:45 + * @Description + */ +@LiteflowComponent(value = "sendEmailNode", name = "发送邮件的节点") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +public class TpSendEmailNode { + + @Resource + private TpEmailClient emailClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + TpSendEmailContext emailContext = bindCmp.getContextBean(TpSendEmailContext.class); + LogUtil.info("执行发送邮件Node,入参为:{}", JSONUtil.toJsonStr(emailContext)); + CompletableFuture.runAsync(() -> emailClient.sendEmail(emailContext.getReceiveEmail(), emailContext.getEmailTemplate())); + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpSendRefundSuccessMessageNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpSendRefundSuccessMessageNode.java new file mode 100644 index 0000000..26398bc --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpSendRefundSuccessMessageNode.java @@ -0,0 +1,100 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.voucher.TpVoucherStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpRefundTicketApplyContext; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.TpVoucherClient; +import com.deepinnet.tptradeprod.common.service.integration.client.mq.constants.*; +import com.deepinnet.tptradeprod.common.service.integration.client.mq.entity.*; +import com.deepinnet.tptradeprod.common.service.integration.client.mq.template.MessageClient; +import com.yomahub.liteflow.annotation.*; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.List; + +/** + * @author amos wong + * @create 2023/10/16 16:10 + * @Description + */ +@LiteflowComponent(value = "sendRefundSuccessMessageNode", name = "发送退票成功消息Node") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +public class TpSendRefundSuccessMessageNode { + + @Resource + private MessageClient messageClient; + + @Resource + private TpVoucherClient voucherClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + TpRefundTicketApplyContext refundTicketContext = bindCmp.getContextBean(TpRefundTicketApplyContext.class); + LogUtil.info("执行发送退票成功消息Node,入参为:{}", JSONUtil.toJsonStr(refundTicketContext)); + + sendRefundMessage(refundTicketContext.getRefundApplyDTO(), refundTicketContext.getRefundApplyDTO().getTenantId()); + } + + /** + * 发送退票成功的消息,需要判断是否已经全部退票完成了 + * + * @param refundApplyDTO + */ + private void sendRefundMessage(TpProdRefundApplyDTO refundApplyDTO, String refundApplyOrderNo) { + boolean existRefund = true; + + // 判断是否存在有效的凭证 + List curVoucherList = getVoucherList(refundApplyDTO); + + boolean existValid = curVoucherList.stream() + .anyMatch(voucherDTO -> StringUtils.equals(voucherDTO.getActualStatus(), TpVoucherStatusEnum.CREATED.getCode()) + || StringUtils.equals(voucherDTO.getActualStatus(), TpVoucherStatusEnum.PARTIAL_VERIFIED.getCode())); + + boolean existVerification = curVoucherList.stream() + .anyMatch(voucherDTO -> StringUtils.equals(voucherDTO.getActualStatus(), TpVoucherStatusEnum.FULLY_VERIFIED.getCode()) || + StringUtils.equals(voucherDTO.getActualStatus(), TpVoucherStatusEnum.PARTIAL_VERIFIED.getCode())); + + boolean existExpired = curVoucherList.stream() + .anyMatch(voucherDTO -> StringUtils.equals(voucherDTO.getActualStatus(), TpVoucherStatusEnum.EXPIRED.getCode())); + + BaseMessageEntity baseMessageEntity = new BaseMessageEntity(); + baseMessageEntity.setSource(MessageSysConstants.SOURCE_CONTRACT); + baseMessageEntity.setKey(refundApplyOrderNo); + baseMessageEntity.setSendTime(LocalDateTime.now()); + + TicketRefundSuccessMessageEntity refundSuccessMessage = new TicketRefundSuccessMessageEntity(); + refundSuccessMessage.setOrderNo(refundApplyDTO.getOrderNo()); + refundSuccessMessage.setRefundApplyOrderNo(refundApplyOrderNo); + refundSuccessMessage.setRefundTime(refundApplyDTO.getApplyTime()); + refundSuccessMessage.setTenantId(refundApplyDTO.getTenantId()); + refundSuccessMessage.setExistRefund(existRefund); + refundSuccessMessage.setExistValid(existValid); + refundSuccessMessage.setExistVerification(existVerification); + refundSuccessMessage.setExistExpire(existExpired); + baseMessageEntity.setBody(JSONUtil.toJsonStr(refundSuccessMessage)); + + messageClient.send(messageClient.getMessageTopic(), MessageConstants.EVENT_CODE_REFUND_TICKET_SUCCESS, baseMessageEntity); + LogUtil.info("发送退票成功的消息,消息内容为:{}", JSONUtil.toJsonStr(baseMessageEntity)); + } + + private List getVoucherList(TpProdRefundApplyDTO refundApplyDTO) { + TpProdVoucherQueryDTO queryDTO = new TpProdVoucherQueryDTO(); + List voucherList = voucherClient.getVoucherList(queryDTO.setOrderNo(refundApplyDTO.getOrderNo()).setTenantId(refundApplyDTO.getTenantId())); + if (CollectionUtils.isEmpty(voucherList)) { + LogUtil.error("凭证不存在,无法进行退票处理,入参为:{}", JSONUtil.toJsonStr(refundApplyDTO)); + throw new TpTradeProdException(TpTradeProdErrorCode.NOT_FOUND_VOUCHER); + } + + return voucherList; + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpSendSmsNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpSendSmsNode.java new file mode 100644 index 0000000..8054598 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpSendSmsNode.java @@ -0,0 +1,35 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpSendSmsContext; +import com.deepinnet.tptradeprod.common.service.integration.client.sms.TpSmsClient; +import com.yomahub.liteflow.annotation.*; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; + +import javax.annotation.Resource; + +/** + * @author amos wong + * @create 2023/11/13 14:45 + * @Description + */ +@LiteflowComponent(value = "sendSmsNode", name = "发送短信的节点") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +public class TpSendSmsNode { + + @Resource + private TpSmsClient smsClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + TpSendSmsContext smsContext = bindCmp.getContextBean(TpSendSmsContext.class); + LogUtil.info("执行发送短信消息Node,入参为:{}", JSONUtil.toJsonStr(smsContext)); + if (smsContext != null && (StrUtil.isNotBlank(smsContext.getMobile()) && smsContext.getSmsTemplate() != null)) { + smsClient.sendSms(smsContext.getMobile(), smsContext.getSmsTemplate()); + } + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpTripSyncNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpTripSyncNode.java new file mode 100644 index 0000000..f46496d --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/execute/TpTripSyncNode.java @@ -0,0 +1,61 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.execute; + +import cn.hutool.core.collection.ListUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.order.TpOrderModulesEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpUserPlaceOrderContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderQueryDTO; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderDispatchClient; +import com.deepinnet.tptradeprod.common.service.integration.client.TpTripClient; +import com.deepinnet.tptradeprod.common.vo.*; +import com.deepinnet.tptradeprod.core.compoment.TpOrderSyncTripComponent; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; + +import javax.annotation.Resource; + +/** + *

+ * 行程同步节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "tripSyncNode", name = "行程同步节点") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +public class TpTripSyncNode { + + @Resource + private TpOrderSyncTripComponent tpOrderSyncTripComponent; + + @Resource + private TpOrderClient tpOrderClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 行程同步节点"); + + TpUserPlaceOrderContext userPlaceOrderContext = bindCmp.getContextBean(TpUserPlaceOrderContext.class); + + TpProdOrderDetailVO orderDetailVO = userPlaceOrderContext.getOrderDetailVO(); + + // 再次查询订单详情 可能该步骤会存在同步异常的情况,如果一个同步异常,一个同步成功,再次重试时候就要查询最新的行程单状态 + TpProdOrderDetailVO orderDetail = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .originalOrderNo(orderDetailVO.getOriginalOrderNo()) + .tenantId(userPlaceOrderContext.getTenantId()) + .needModules(ListUtil.toList(TpOrderModulesEnum.ORDER_TRAVEL_TRIP.getModule(), TpOrderModulesEnum.ORDER_SUBJECT_ITEM.getModule())).build()); + + // 执行同步组件 + tpOrderSyncTripComponent.createSync(orderDetail, userPlaceOrderContext.getTenantId()); + + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpAvailableRefundVoucherQueryNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpAvailableRefundVoucherQueryNode.java new file mode 100644 index 0000000..99df02d --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpAvailableRefundVoucherQueryNode.java @@ -0,0 +1,77 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.query; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpproductcore.common.dto.product.*; +import com.deepinnet.tptradecore.common.enums.order.TpOrderIdentityStatusEnum; +import com.deepinnet.tptradecore.common.enums.voucher.TpVoucherStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.refundTicket.context.*; +import com.deepinnet.tptradeprod.biz.util.TpVoucherUtil; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.TpContractClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.google.common.collect.Lists; +import com.yomahub.liteflow.annotation.*; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.util.Assert; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @author amos wong + * @create 2024/3/13 16:51 + * @Description + */ +@LiteflowComponent(value = "availableRefundVoucherQueryNode", name = "可退凭证查询节点") +@LiteflowCmpDefine +public class TpAvailableRefundVoucherQueryNode { + + @Resource + private TpContractClient contractClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + TpRefundTicketCommonContext commonContext = bindCmp.getContextBean(TpRefundTicketCommonContext.class); + TpQueryAvailableVoucherContext queryAvailableVoucherContext = commonContext.getQueryAvailableVoucherContext(); + TpProdDetailDTO productDetailDTO = commonContext.getProductDetailDTO(); + TpProdOrderDetailVO orderDetailVO = commonContext.getOrderDetailVO(); + TpProductExtendAttributesDTO extendAttributes = productDetailDTO.getExtendAttributes(); + Boolean refundNoTimeLimit = extendAttributes.getRefundNoTimeLimit(); + List availableRefundVoucherStatusList = extendAttributes.getAllowRefundVerificationStatusEnumList(); + TpProdQueryAvailableRefundVoucherDTO availableVoucherDTO = queryAvailableVoucherContext.getQueryDTO(); + + if (refundNoTimeLimit) { + Assert.notEmpty(availableRefundVoucherStatusList, "不限制退票时间时,允许的凭证状态不能为空"); + // 非实名制,部分核销也能够退票 + if (Objects.equals(orderDetailVO.getIdentityVerificat(), TpOrderIdentityStatusEnum.NOT_REAL_NAME.getStatus())) { + if (availableRefundVoucherStatusList.contains(TpVoucherStatusEnum.CREATED.getCode())) { + availableRefundVoucherStatusList.add(TpVoucherStatusEnum.PARTIAL_VERIFIED.getCode()); + } + } + availableVoucherDTO.setAvailableStatusList(availableRefundVoucherStatusList); + } else { + availableVoucherDTO.setAvailableStatusList(Lists.newArrayList(TpVoucherStatusEnum.CREATED.getCode())); + } + + // 查询可退的凭证列表 + List voucherDTOs = contractClient.queryAvailableRefundVoucherList(availableVoucherDTO); + if (CollectionUtils.isEmpty(voucherDTOs)) { + LogUtil.error("查询可退凭证接口,不存在可退凭证,入参为:{}", JSONUtil.toJsonStr(availableVoucherDTO)); + throw new TpTradeProdException(TpTradeProdErrorCode.NOT_FOUND_REFUND_AVAILABLE_VOUCHER, TpTradeProdErrorCode.NOT_FOUND_REFUND_AVAILABLE_VOUCHER.getDesc()); + } + + List finalAvailableRefundVouchers = voucherDTOs.stream() + .filter(v -> TpVoucherUtil.isRefundPassengerCountValid(v, 1)) + .collect(Collectors.toList()); + + LogUtil.info("查询到的可退凭证列表为:{}", CollectionUtils.isEmpty(finalAvailableRefundVouchers) ? null : JSONUtil.toJsonStr(finalAvailableRefundVouchers.stream().map(TpProdVoucherDTO::getVoucherNo))); + queryAvailableVoucherContext.setAvailableRefundVoucherList(finalAvailableRefundVouchers); + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpOrderDetailQueryNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpOrderDetailQueryNode.java new file mode 100644 index 0000000..fd27ae5 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpOrderDetailQueryNode.java @@ -0,0 +1,58 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.query; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.order.TpOrderModulesEnum; +import com.deepinnet.tptradeprod.biz.service.flow.refundTicket.context.*; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderQueryDTO; +import com.deepinnet.tptradeprod.common.enums.TpFlowProcessTypeEnum; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.google.common.collect.Lists; +import com.yomahub.liteflow.annotation.*; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author amos wong + * @create 2023/10/16 14:27 + * @Description + */ + +@LiteflowComponent(value = "orderDetailQueryNode", name = "订单详情查询节点") +@LiteflowCmpDefine +public class TpOrderDetailQueryNode { + + @Resource + private TpOrderClient orderClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + TpRefundTicketCommonContext commonContext = bindCmp.getContextBean(TpRefundTicketCommonContext.class); + TpRefundTicketCommonRequest commonRequest = commonContext.getCommonRequest(); + String orderNo = commonRequest.getOrderNo(); + String tenantId = commonRequest.getTenantId(); + LogUtil.info("执行查询订单详情节点...入参为:{}", JSONUtil.toJsonStr(commonContext)); + + List needModules; + if (commonContext.getProcessType() == TpFlowProcessTypeEnum.QUERY_AVAILABLE_REFUND_VOUCHER) { + needModules = Lists.newArrayList(TpOrderModulesEnum.ORDER_ROUTE_INFO.getModule()); + } else { + needModules = Lists.newArrayList(TpOrderModulesEnum.ORDER_PLACER.getModule(), TpOrderModulesEnum.ORDER_PRICE_RECORD.getModule(), + TpOrderModulesEnum.ORDER_SUBJECT_ITEM.getModule(), TpOrderModulesEnum.ORDER_ROUTE_INFO.getModule()); + } + + TpProdOrderDetailVO orderDetailVO = orderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .orderNo(orderNo) + .tenantId(tenantId) + .needModules(needModules) + .build()); + + commonContext.setOrderDetailVO(orderDetailVO); + // 设置产品类目编号 + commonRequest.setProductCategoryNo(orderDetailVO.getProductCategoryNo()); + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpProductQueryNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpProductQueryNode.java new file mode 100644 index 0000000..91d1e03 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpProductQueryNode.java @@ -0,0 +1,82 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.query; + +import cn.hutool.core.lang.Assert; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpproductcore.common.dto.product.TpProdDetailDTO; +import com.deepinnet.tpproductcore.common.dto.rule.TpBizRuleDTO; +import com.deepinnet.tpproductcore.common.enums.*; +import com.deepinnet.tpproductcore.common.qto.product.TpProductQueryDTO; +import com.deepinnet.tptradeprod.biz.service.flow.refundTicket.context.*; +import com.deepinnet.tptradeprod.common.service.integration.client.TpProductClient; +import com.yomahub.liteflow.annotation.*; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import org.apache.commons.lang3.StringUtils; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author amos wong + * @create 2023/10/16 14:26 + * @Description + */ +@LiteflowComponent(value = "productDetailQueryNode", name = "产品查询节点") +@LiteflowCmpDefine +public class TpProductQueryNode { + + @Resource + private TpProductClient productClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + TpRefundTicketCommonContext commonContext = bindCmp.getContextBean(TpRefundTicketCommonContext.class); + LogUtil.info("执行查询产品详情节点...入参为:{}", JSONUtil.toJsonStr(commonContext)); + + TpProductQueryDTO queryDTO = new TpProductQueryDTO(); + TpRefundTicketCommonRequest commonRequest = commonContext.getCommonRequest(); + queryDTO.setProductCode(commonRequest.getProductNo()); + queryDTO.setFormalFlag(FormalFlagEnum.FORMAL.getCode()); + queryDTO.setTenantId(commonRequest.getTenantId()); + queryDTO.setNeedProperties(NeedPropertiesEnum.buildNeedProperties(NeedPropertiesEnum.BIZ_RULE, NeedPropertiesEnum.ROUTE, NeedPropertiesEnum.EXTEND_ATTRIBUTE)); + TpProdDetailDTO productDetail = productClient.getProduct(queryDTO); + + // 产品详情 + commonContext.setProductDetailDTO(productDetail); + + // 规则 + List bizRules = productDetail.getRules(); + List ticketRefundCountRules = bizRules.stream() + .filter(rule -> StringUtils.equals(rule.getRuleGroup(), TpRuleExpressionGroupEnum.REFUND_COUNTS.getCode())) + .map(TpBizRuleDTO::getExpression) + .collect(Collectors.toList()); + + List ticketRefundTimeRules = bizRules.stream() + .filter(rule -> StringUtils.equals(rule.getRuleGroup(), TpRuleExpressionGroupEnum.REFUND_TICKET_TIME.getCode())) + .map(TpBizRuleDTO::getExpression) + .collect(Collectors.toList()); + + List refundChargeRules = bizRules.stream() + .filter(rule -> StringUtils.equals(rule.getRuleGroup(), TpRuleExpressionGroupEnum.REFUND_CHARGE.getCode())) + .map(TpBizRuleDTO::getExpression) + .collect(Collectors.toList()); + + List afterDepartureRules = bizRules.stream() + .filter(rule -> StringUtils.equals(rule.getRuleGroup(), TpRuleExpressionGroupEnum.AFTER_DEPARTURE_CHARGE.getCode())) + .map(TpBizRuleDTO::getExpression) + .collect(Collectors.toList()); + + Boolean supportRefund = productDetail.getExtendAttributes().getSupportRefund(); + if (supportRefund) { + Assert.notEmpty(ticketRefundCountRules, "退票次数规则不存在"); + Assert.notEmpty(ticketRefundTimeRules, "退票时间规则不存在"); + } + + commonContext.setTicketRefundCountRules(ticketRefundCountRules); + commonContext.setTicketRefundTimeRules(ticketRefundTimeRules); + commonContext.setBeforeDepartureRefundChargeRules(refundChargeRules); + commonContext.setAfterDepartureRefundChargeRules(afterDepartureRules); + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpRefundApplyOrderQueryNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpRefundApplyOrderQueryNode.java new file mode 100644 index 0000000..c864f7b --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpRefundApplyOrderQueryNode.java @@ -0,0 +1,44 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.query; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradeprod.biz.service.flow.refundTicket.context.*; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.enums.TpRefundApplyOrderModulesEnum; +import com.deepinnet.tptradeprod.common.service.integration.client.TpContractClient; +import com.google.common.collect.Lists; +import com.yomahub.liteflow.annotation.*; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author amos wong + * @create 2023/10/16 14:55 + * @Description + */ +@LiteflowComponent(value = "refundApplyOrderQueryNode", name = "退票申请单查询节点") +@LiteflowCmpDefine +public class TpRefundApplyOrderQueryNode { + + @Resource + private TpContractClient contractClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + TpRefundTicketCommonContext commonContext = bindCmp.getContextBean(TpRefundTicketCommonContext.class); + TpRefundTicketCommonRequest commonRequest = commonContext.getCommonRequest(); + LogUtil.info("执行查询退票申请单节点...入参为:{}", JSONUtil.toJsonStr(commonContext)); + String userNo = commonRequest.getUserNo(); + String tenantId = commonRequest.getTenantId(); + + List refundApplyOrderList = contractClient.getRefundApplyOrderList(TpProdQueryRefundApplyOrderDTO.builder() + .userNo(userNo) + .tenantId(tenantId) + .needProperties(Lists.newArrayList(TpRefundApplyOrderModulesEnum.REFUND_SUBJECT_ITEM.getModule())) + .build()); + commonContext.setRefundApplyOrderDTOs(refundApplyOrderList); + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpRefundQueryPayOrderNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpRefundQueryPayOrderNode.java new file mode 100644 index 0000000..7d0333e --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpRefundQueryPayOrderNode.java @@ -0,0 +1,63 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.query; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.trans.*; +import com.deepinnet.tptradecore.common.enums.TpBizTypeEnum; +import com.deepinnet.tptradecore.common.enums.trans.TpPayOrderStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.refundTicket.context.TpRefundTicketCommonContext; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.TpPaymentClient; +import com.deepinnet.tptradeprod.common.service.integration.convert.TpPayOrderConvert; +import com.google.common.collect.Lists; +import com.yomahub.liteflow.annotation.*; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import org.apache.commons.collections4.CollectionUtils; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author amos wong + * @create 2024/2/1 15:11 + * @Description + */ +@LiteflowComponent(value = "queryPayOrderNode", name = "查询支付单节点") +@LiteflowCmpDefine +public class TpRefundQueryPayOrderNode { + + @Resource + private TpPaymentClient paymentClient; + + @Resource + private TpPayOrderConvert payOrderConvert; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + TpRefundTicketCommonContext commonContext = bindCmp.getContextBean(TpRefundTicketCommonContext.class); + LogUtil.info("开始执行查询支付单节点...入参为:{}", JSONUtil.toJsonStr(commonContext)); + String orderNo = commonContext.getCommonRequest().getOrderNo(); + String tenantId = commonContext.getCommonRequest().getTenantId(); + String bizNo = orderNo + TpBizTypeEnum.CUSTOM_BUS_PAY.getCode(); + + List paidOrderList = paymentClient.getPayOrderList(TpPayOrderQueryDTO.builder() + .bizNo(bizNo) + .tenantId(tenantId) + .targetStatusList(Lists.newArrayList(TpPayOrderStatusEnum.PAID.getCode())) + .build()); + + if (CollectionUtils.isEmpty(paidOrderList)) { + LogUtil.error("计算退票金额接口,不存在已支付的支付单,bizNo:{}", bizNo); + throw new TpTradeProdException(TpTradeProdErrorCode.NOT_FOUND_PAID_PAY_ORDER); + } + + if (paidOrderList.size() > 1) { + LogUtil.error("存在重复支付的支付单,数据错误,无法进行退票,bizNo:{}", bizNo); + throw new TpTradeProdException(TpTradeProdErrorCode.FOUND_DUPLICATE_PAID_PAY_ORDER); + } + + commonContext.setPaidOrderDTO(payOrderConvert.convert2ProdPayOrderDTO(paidOrderList.get(0))); + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpRescheduleOrderDetailQueryNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpRescheduleOrderDetailQueryNode.java new file mode 100644 index 0000000..d0a5226 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpRescheduleOrderDetailQueryNode.java @@ -0,0 +1,57 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.query; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.order.TpOrderModulesEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpRescheduleOrderContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderQueryDTO; +import com.deepinnet.tptradeprod.common.enums.TpFlowProcessTypeEnum; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.yomahub.liteflow.annotation.*; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import org.apache.commons.lang3.StringUtils; + +import javax.annotation.Resource; +import java.util.*; + +/** + * @author amos wong + * @create 2023/10/16 14:27 + * @Description + */ + +@LiteflowComponent(value = "rescheduleOrderDetailQueryNode", name = "改签订单详情查询节点") +@LiteflowCmpDefine +public class TpRescheduleOrderDetailQueryNode { + + @Resource + private TpOrderClient orderClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + TpRescheduleOrderContext rescheduleOrderContext = bindCmp.getContextBean(TpRescheduleOrderContext.class); + String orderNo = rescheduleOrderContext.getOrderNo(); + String tenantId = rescheduleOrderContext.getTenantId(); + LogUtil.info("执行改签查询订单详情节点...入参为:{}", JSONUtil.toJsonStr(rescheduleOrderContext)); + + String processType = rescheduleOrderContext.getProcessType(); + if (!StringUtils.equals(processType, TpFlowProcessTypeEnum.CONFIRM_RESCHEDULE_ORDER.getCode())) { + List needProperties = Collections.singletonList(TpOrderModulesEnum.ORDER_ROUTE_INFO.getModule()); + TpProdOrderDetailVO orderDetailVO = orderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .orderNo(orderNo) + .tenantId(tenantId) + .needModules(needProperties) + .build()); + + if (orderDetailVO == null) { + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_NOT_FOUND); + } + + rescheduleOrderContext.setOrderDetailVO(orderDetailVO); + } + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpRescheduleProductQueryNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpRescheduleProductQueryNode.java new file mode 100644 index 0000000..d68b360 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpRescheduleProductQueryNode.java @@ -0,0 +1,79 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.query; + +import cn.hutool.core.lang.Assert; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpbaseopcore.common.dto.route.RouteDetailDTO; +import com.deepinnet.tpbaseopcore.common.enums.TpRouteStatusEnum; +import com.deepinnet.tpproductcore.common.dto.product.TpProdDetailDTO; +import com.deepinnet.tpproductcore.common.dto.rule.TpBizRuleDTO; +import com.deepinnet.tpproductcore.common.enums.*; +import com.deepinnet.tpproductcore.common.qto.product.TpProductQueryDTO; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpRescheduleOrderContext; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.TpProductClient; +import com.yomahub.liteflow.annotation.*; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import org.apache.commons.lang3.StringUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author amos wong + * @create 2023/10/16 14:26 + * @Description + */ +@LiteflowComponent(value = "rescheduleProductDetailQueryNode", name = "改签产品查询节点") +@LiteflowCmpDefine +public class TpRescheduleProductQueryNode { + + @Resource + private TpProductClient productClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + TpRescheduleOrderContext rescheduleOrderContext = bindCmp.getContextBean(TpRescheduleOrderContext.class); + LogUtil.info("改签查询产品详情节点...入参为:{}", JSONUtil.toJsonStr(rescheduleOrderContext)); + + TpProductQueryDTO queryDTO = new TpProductQueryDTO(); + queryDTO.setProductCode(rescheduleOrderContext.getProductCode()); + queryDTO.setFormalFlag(FormalFlagEnum.FORMAL.getCode()); + queryDTO.setTenantId(rescheduleOrderContext.getTenantId()); + queryDTO.setNeedProperties(NeedPropertiesEnum.buildNeedProperties(NeedPropertiesEnum.BIZ_RULE, NeedPropertiesEnum.EXTEND_ATTRIBUTE, NeedPropertiesEnum.ROUTE)); + TpProdDetailDTO productDetail = productClient.getProduct(queryDTO); + + if (StringUtils.equals(productDetail.getStatus(), ProductStatusEnum.OUT_OF_SERVICE.getCode())) { + LogUtil.error("当前线路已经停运,无法改签,入参为:{}", JSONUtil.toJsonStr(rescheduleOrderContext)); + throw new TpTradeProdException(TpTradeProdErrorCode.ROUTE_OUT_OF_SERVICE, TpTradeProdErrorCode.ROUTE_OUT_OF_SERVICE.getDesc()); + } + + RouteDetailDTO routeDetailDTO = productDetail.getRouteDetailDTO(); + if (!StringUtils.equals(routeDetailDTO.getRouteBase().getStatus(), TpRouteStatusEnum.IN_SERVICE.getCode())) { + LogUtil.info("线路不是营运中无法进行改签,线路信息为:{}", JSONUtil.toJsonStr(routeDetailDTO)); + throw new TpTradeProdException(TpTradeProdErrorCode.ROUTE_OUT_OF_SERVICE, TpTradeProdErrorCode.ROUTE_OUT_OF_SERVICE.getDesc()); + } + + // 产品详情 + rescheduleOrderContext.setProdDetailDTO(productDetail); + + Boolean supportPassengerReschedule = productDetail.getExtendAttributes().getSupportPassengerReschedule(); + LogUtil.info("查询到的产品拓展属性为:{}", JSONUtil.toJsonStr(supportPassengerReschedule)); + if (supportPassengerReschedule == null || !supportPassengerReschedule) { + LogUtil.error("当前租户不允许改签,读取到的配置项为:{}", supportPassengerReschedule); + throw new TpTradeProdException(TpTradeProdErrorCode.TENANT_NOT_SUPPORT_RESCHEDULE, TpTradeProdErrorCode.TENANT_NOT_SUPPORT_RESCHEDULE.getDesc()); + } + + // 规则 + List rules = productDetail.getRules(); + List rescheduleRuleExpressionList = rules.stream() + .filter(rule -> StringUtils.equals(rule.getRuleGroup(), TpRuleExpressionGroupEnum.RESCHEDULE_RESTRICTION.getCode())) + .map(TpBizRuleDTO::getExpression) + .collect(Collectors.toList()); + Assert.notEmpty(rescheduleRuleExpressionList, "改签规则不存在"); + rescheduleOrderContext.setRuleExpressionList(rescheduleRuleExpressionList); + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpRescheduleVoucherQueryNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpRescheduleVoucherQueryNode.java new file mode 100644 index 0000000..6e9f2be --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpRescheduleVoucherQueryNode.java @@ -0,0 +1,95 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.query; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.trans.TpVoucherNeedPropertiesEnum; +import com.deepinnet.tptradecore.common.enums.voucher.*; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpRescheduleOrderContext; +import com.deepinnet.tptradeprod.biz.util.TpVoucherUtil; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.enums.TpFlowProcessTypeEnum; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.TpVoucherClient; +import com.yomahub.liteflow.annotation.*; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author amos wong + * @create 2023/10/16 14:27 + * @Description + */ + +@LiteflowComponent(value = "rescheduleVoucherQueryNode", name = "改签凭证查询节点") +@LiteflowCmpDefine +public class TpRescheduleVoucherQueryNode { + + @Resource + private TpVoucherClient voucherClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + TpRescheduleOrderContext rescheduleOrderContext = bindCmp.getContextBean(TpRescheduleOrderContext.class); + String orderNo = rescheduleOrderContext.getOrderNo(); + String tenantId = rescheduleOrderContext.getTenantId(); + LogUtil.info("执行改签查询凭证节点...入参为:{}", JSONUtil.toJsonStr(rescheduleOrderContext)); + + List voucherNeedProperties = Collections.singletonList(TpVoucherNeedPropertiesEnum.PASSENGER.getCode()); + TpProdVoucherQueryDTO voucherQueryDTO = new TpProdVoucherQueryDTO(); + + if (StringUtils.equals(rescheduleOrderContext.getProcessType(), TpFlowProcessTypeEnum.CONFIRM_RESCHEDULE_ORDER.getCode())) { + // 校验当前的凭证是否能够改签 + if (CollectionUtils.isEmpty(rescheduleOrderContext.getVoucherNos())) { + LogUtil.error("凭证编号列表不能为空,订单改签失败,入参为:{}", JSONUtil.toJsonStr(rescheduleOrderContext)); + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_RESCHEDULE_ERROR); + } + voucherQueryDTO.setVoucherNos(rescheduleOrderContext.getVoucherNos()); + } else { + // 查询当前订单可改签凭证 + voucherQueryDTO.setOrderNo(orderNo); + } + + voucherQueryDTO.setNeedProperties(voucherNeedProperties); + voucherQueryDTO.setTenantId(tenantId); + List voucherList = voucherClient.getVoucherList(voucherQueryDTO); + if (CollectionUtils.isEmpty(voucherList)) { + throw new TpTradeProdException(TpTradeProdErrorCode.NOT_FOUND_VOUCHER); + } + + // 处理凭证找到能改签的凭证 + String type = voucherList.get(0).getType(); + Boolean requiredRealName = voucherList.get(0).getRequiredRealName(); + if (!StringUtils.equals(type, TpVoucherTypeEnum.DAY.getCode())) { + LogUtil.error("当前的票类型不支持改签,只有次票才支持改签,订单号:{}", orderNo); + throw new TpTradeProdException(TpTradeProdErrorCode.NOT_SUPPORT_RESCHEDULE_VOUCHER_TYPE); + } + + // 先过滤掉过期的和已核销的 + // ATTENTION:20240717 需求要求非实名制的次票部分核销允许改签 + List availableVoucherList; + if (requiredRealName) { + availableVoucherList = voucherList.stream() + .filter(v -> StringUtils.equals(v.getStatus(), TpVoucherStatusEnum.CREATED.getCode()) && v.getRedemptionCount() == 0) + .collect(Collectors.toList()); + } else { + availableVoucherList = voucherList.stream() + .filter(v -> StringUtils.equals(v.getStatus(), TpVoucherStatusEnum.CREATED.getCode()) || + (StringUtils.equals(v.getStatus(), TpVoucherStatusEnum.PARTIAL_VERIFIED.getCode()) && TpVoucherUtil.calculateRefundPassengerCount(v) >= 1)) + .collect(Collectors.toList()); + } + + if (CollectionUtils.isEmpty(availableVoucherList)) { + LogUtil.error("当前订单不存在支持改签的凭证,只有未核销的次票支持改签,订单号:{}", orderNo); + throw new TpTradeProdException(TpTradeProdErrorCode.NOT_FOUND_AVAILABLE_RESCHEDULE_VOUCHER); + } + + rescheduleOrderContext.setVoucherList(availableVoucherList); + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpVoucherQueryNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpVoucherQueryNode.java new file mode 100644 index 0000000..71e0888 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpVoucherQueryNode.java @@ -0,0 +1,94 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.query; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpproductcore.common.dto.product.*; +import com.deepinnet.tptradecore.common.enums.order.TpOrderIdentityStatusEnum; +import com.deepinnet.tptradecore.common.enums.trans.TpVoucherNeedPropertiesEnum; +import com.deepinnet.tptradecore.common.enums.voucher.TpVoucherStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.refundTicket.context.*; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.TpVoucherClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.google.common.collect.Lists; +import com.yomahub.liteflow.annotation.*; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import org.springframework.util.Assert; + +import javax.annotation.Resource; +import java.util.*; + +/** + * @author amos wong + * @create 2023/10/16 14:26 + * @Description + */ +@LiteflowComponent(value = "voucherQueryNode", name = "凭证查询节点") +@LiteflowCmpDefine +public class TpVoucherQueryNode { + + @Resource + private TpVoucherClient voucherClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + TpRefundTicketCommonContext commonContext = bindCmp.getContextBean(TpRefundTicketCommonContext.class); + TpRefundTicketCommonRequest commonRequest = commonContext.getCommonRequest(); + TpProdDetailDTO productDetailDTO = commonContext.getProductDetailDTO(); + TpProdOrderDetailVO orderDetailVO = commonContext.getOrderDetailVO(); + + LogUtil.info("执行查询凭证节点...入参为:{}", JSONUtil.toJsonStr(commonContext)); + + TpProductExtendAttributesDTO extendAttributes = productDetailDTO.getExtendAttributes(); + if (extendAttributes == null) { + LogUtil.error("产品拓展属性不存在,无法进行退票,入参:{}", JSONUtil.toJsonStr(commonContext)); + throw new TpTradeProdException(TpTradeProdErrorCode.PRODUCT_EXTEND_ATTRIBUTE_NOT_EXIST_ERROR); + } + + Boolean supportRefund = extendAttributes.getSupportRefund(); + if (ObjectUtil.isNull(supportRefund) || !supportRefund) { + LogUtil.error("产品不支持退票,无法进行退票,得到的结果为:{}", supportRefund); + return; + } + + TpProdVoucherQueryDTO queryDTO = new TpProdVoucherQueryDTO(); + Boolean refundNoTimeLimit = extendAttributes.getRefundNoTimeLimit(); + if (ObjectUtil.isNull(refundNoTimeLimit)) { + LogUtil.error("产品退票时间限制不存在,无法进行退票,得到的结果为:{}", refundNoTimeLimit); + throw new TpTradeProdException(TpTradeProdErrorCode.REFUND_CHECK_ERROR); + } + + // 不限制退票时间 + if (refundNoTimeLimit) { + // 允许退票的状态 + List availableRefundVoucherStatusList = extendAttributes.getAllowRefundVerificationStatusEnumList(); + Assert.notEmpty(availableRefundVoucherStatusList, "不限制退票时间时,允许的凭证状态不能为空"); + + // 非实名制凭证,如果配置的是已创建状态的凭证也可以退票,那么部分核销的也能退 + if (Objects.equals(orderDetailVO.getIdentityVerificat(), TpOrderIdentityStatusEnum.NOT_REAL_NAME.getStatus())) { + if (availableRefundVoucherStatusList.contains(TpVoucherStatusEnum.CREATED.getCode())) { + availableRefundVoucherStatusList.add(TpVoucherStatusEnum.PARTIAL_VERIFIED.getCode()); + } + } + + queryDTO.setTargetStatusList(availableRefundVoucherStatusList); + } else { + // 只能发车前才允许退票 + queryDTO.setTargetStatusList(Lists.newArrayList(TpVoucherStatusEnum.CREATED.getCode())); + } + + List needProperties = TpVoucherNeedPropertiesEnum.buildNeedPropertiesList(TpVoucherNeedPropertiesEnum.PASSENGER); + List voucherList = voucherClient.getVoucherList(queryDTO + .setOrderNo(commonRequest.getOrderNo()) + .setTenantId(commonRequest.getTenantId()) + .setTripType(commonRequest.getTripType()) + .setNeedProperties(needProperties) + .setTripType(commonRequest.getTripType())); + + commonContext.setVoucherList(voucherList); + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpVoucherVerificationRecordQueryNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpVoucherVerificationRecordQueryNode.java new file mode 100644 index 0000000..e815c73 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/node/query/TpVoucherVerificationRecordQueryNode.java @@ -0,0 +1,49 @@ +package com.deepinnet.tptradeprod.biz.service.flow.node.query; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradeprod.biz.service.flow.refundTicket.context.TpRefundTicketCommonContext; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.service.integration.client.TpVoucherClient; +import com.yomahub.liteflow.annotation.*; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import org.apache.commons.collections4.CollectionUtils; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author amos wong + * @create 2023/10/16 15:01 + * @Description + */ +@LiteflowComponent(value = "voucherVerificationRecordQueryNode", name = "凭证乘车记录查询节点") +@LiteflowCmpDefine +public class TpVoucherVerificationRecordQueryNode { + + @Resource + private TpVoucherClient voucherClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + TpRefundTicketCommonContext commonContext = bindCmp.getContextBean(TpRefundTicketCommonContext.class); + LogUtil.info("执行查询凭证乘车记录节点...入参为:{}", JSONUtil.toJsonStr(commonContext)); + + String tenantId = commonContext.getCommonRequest().getTenantId(); + List voucherList = commonContext.getVoucherList(); + if (CollectionUtils.isNotEmpty(voucherList)) { + List voucherNos = voucherList.stream() + .map(TpProdVoucherDTO::getVoucherNo) + .distinct() + .collect(Collectors.toList()); + + TpProdVoucherVerificationRecordQueryDTO queryDTO = new TpProdVoucherVerificationRecordQueryDTO(); + queryDTO.setVoucherNos(voucherNos); + queryDTO.setTenantId(tenantId); + List verificationRecordList = voucherClient.getVerificationRecordList(queryDTO); + commonContext.setVerificationRecordList(verificationRecordList); + } + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderChangeApplyCheckHasApplyNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderChangeApplyCheckHasApplyNode.java new file mode 100644 index 0000000..1e724c8 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderChangeApplyCheckHasApplyNode.java @@ -0,0 +1,42 @@ +package com.deepinnet.tptradeprod.biz.service.flow.orderchangeapply; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderChangeApplyCreateContext; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderChangeApplyDetailVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import com.yomahub.liteflow.enums.NodeTypeEnum; +import lombok.RequiredArgsConstructor; + +/** + *

+ * 订单变更申请单创建-订单是否有正在进行的申请节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "orderChangeHasApplyCheckNode", name = "订单变更申请单创建-订单是否有正在进行的申请节点") +@LiteflowCmpDefine(value = NodeTypeEnum.IF) +@RequiredArgsConstructor +public class TpOrderChangeApplyCheckHasApplyNode { + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS_IF) + public boolean process(NodeComponent bindCmp) { + TpOrderChangeApplyCreateContext orderChangeApplyCreateContext = bindCmp.getContextBean(TpOrderChangeApplyCreateContext.class); + LogUtil.info("订单变更申请单创建-订单是否有正在进行的申请节点,入参为:{}", JSONUtil.toJsonStr(orderChangeApplyCreateContext)); + //1。入参为空,则直接返回 + TpProdOrderChangeApplyDetailVO originOrderChangeApplyVO = orderChangeApplyCreateContext.getOriginOrderChangeApplyVO(); + if(originOrderChangeApplyVO != null){ + return Boolean.TRUE; + } + return Boolean.FALSE; + } + + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderChangeApplyCheckNeedAuditNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderChangeApplyCheckNeedAuditNode.java new file mode 100644 index 0000000..5d36aa5 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderChangeApplyCheckNeedAuditNode.java @@ -0,0 +1,52 @@ +package com.deepinnet.tptradeprod.biz.service.flow.orderchangeapply; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.order.TpOrderChangeTypeEnum; +import com.deepinnet.tptradeprod.biz.service.flow.constants.LiteFlowConstant; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderChangeApplyCreateContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderChangeApplyCreatedDTO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import com.yomahub.liteflow.enums.NodeTypeEnum; +import lombok.RequiredArgsConstructor; + +/** + *

+ * 订单变更申请单创建-是否需要人工审批节点 + *

+ * + * @author xiehuaqiao + * @since 2023/11/20 + */ + +@LiteflowComponent(value = "orderChangedApplyNeedAuditSwitchNode", name = "订单变更申请单创建-是否需要人工审批节点") +@LiteflowRetry(retry = 3) +@LiteflowCmpDefine(value = NodeTypeEnum.SWITCH) +@RequiredArgsConstructor +public class TpOrderChangeApplyCheckNeedAuditNode { + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS_SWITCH) + public String process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单审核确认节点-是否需要人工审批节点"); + + TpOrderChangeApplyCreateContext orderChangeApplyCreateContext = bindCmp.getContextBean(TpOrderChangeApplyCreateContext.class); + LogUtil.info("订单变更申请单创建-订单是否有正在进行的申请节点,入参为:{}", JSONUtil.toJsonStr(orderChangeApplyCreateContext)); + TpProdOrderChangeApplyCreatedDTO changeApplyCreatedDTO = orderChangeApplyCreateContext.getOrderChangeApplyCreatedDTO(); + TpOrderChangeTypeEnum applyTypeEnum = TpOrderChangeTypeEnum.getOrderChangeTypeByType(changeApplyCreatedDTO.getApplyType()); + String flowName = null; + switch (applyTypeEnum){ + case ORDER_CHANGE: flowName = LiteFlowConstant.ORDER_CHANGE_APPLY_CREATE_FLOW ; break; + case ORDER_CREATE: flowName = LiteFlowConstant.ORDER_CREATE_APPLY_CREATE_FLOW ; break; + case ORDER_CANCEL: flowName = LiteFlowConstant.ORDER_CANCEL_APPLY_CREATE_FLOW ; break; + + } + return flowName; + } + + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderChangeApplyCreateAuditNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderChangeApplyCreateAuditNode.java new file mode 100644 index 0000000..3b49ca1 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderChangeApplyCreateAuditNode.java @@ -0,0 +1,136 @@ +package com.deepinnet.tptradeprod.biz.service.flow.orderchangeapply; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.audit.TpAuditBizObjectTypeEnum; +import com.deepinnet.tptradecore.common.enums.audit.TpAuditStatusEnum; +import com.deepinnet.tptradecore.common.enums.audit.TpAuditTypeEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderChangeTypeEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderChangeApplyCreateContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderChangeApplyApprovedResultSubmitDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderChangeApplyCreatedDTO; +import com.deepinnet.tptradeprod.common.service.integration.client.TpAuditClient; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderChangeApplyClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderChangeApplyDetailVO; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditCreatedDTO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Resource; + +/** + *

+ * 订单变更申请单创建-审核单创建节点 + *

+ * + * @author xiehuaqiao + * @since 2023/11/20 + */ + +@LiteflowComponent(value = "orderChangeApplyCreateAuditNode", name = "订单变更申请单创建-审核单创建节点") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +@RequiredArgsConstructor +public class TpOrderChangeApplyCreateAuditNode { + + @Resource + private final TpAuditClient tpAuditClient; + + @Resource + private final TpOrderChangeApplyClient tpOrderChangeApplyClient; + + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单变更申请单创建-审核单创建节点"); + + TpOrderChangeApplyCreateContext orderChangeApplyCreateContext = bindCmp.getContextBean(TpOrderChangeApplyCreateContext.class); + LogUtil.info(" 订单变更申请单创建-审核单创建节点,入参为:{}", JSONUtil.toJsonStr(orderChangeApplyCreateContext)); + //1。入参为空,则直接返回 + TpProdOrderChangeApplyDetailVO orderChangeApplyVO = orderChangeApplyCreateContext.getNewOrderChangeApplyVO(); + if(orderChangeApplyVO == null){ + LogUtil.error(" 订单变更申请单创建-审核单创建节点失败:申请单不存在"); + return; + } + //2.创建审核单 + TpProdOrderChangeApplyCreatedDTO orderChangeApplyCreatedDTO = orderChangeApplyCreateContext.getOrderChangeApplyCreatedDTO(); + if(orderChangeApplyCreatedDTO == null){ + LogUtil.error(" 订单变更申请单创建-审核单创建节点失败:申请单入参为空"); + return; + } + Boolean autoAudit = orderChangeApplyCreatedDTO.getAutoAudit(); + TpResult result = tpAuditClient.createAudit(buildAuditDTO(autoAudit,orderChangeApplyVO)); + if (!result.isSuccess()) { + LogUtil.error("调用订单变更审核单创建接口失败,入参:{},原因:{}", JSONUtil.toJsonStr(orderChangeApplyVO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + //如果是自动审核的,就将申请单的审核结果改为审核成功 + if(autoAudit != null && autoAudit){ + TpProdOrderChangeApplyApprovedResultSubmitDTO approvedResultSubmitDTO = TpProdOrderChangeApplyApprovedResultSubmitDTO.builder() + .applyNo(orderChangeApplyVO.getApplyNo()) + .originalOrderNo(orderChangeApplyVO.getOriginalOrderNo()) + .originalApplyStatus(orderChangeApplyVO.getApplyStatus()) + .targetApplyStatus(TpAuditStatusEnum.APPROVED_SUCCESS.getType()) + .approvedRemark("申请自动审核通过!") + .approvedTime(DateUtil.current()) + .tenantId(orderChangeApplyVO.getTenantId()) + .build(); + tpOrderChangeApplyClient.submitApprovedResult(approvedResultSubmitDTO); + } + } + + @NotNull + private TpProdAuditCreatedDTO buildAuditDTO(Boolean autoAudit, TpProdOrderChangeApplyDetailVO orderChangeApplyVO) { + TpProdAuditCreatedDTO prodAuditCreatedDTO = TpProdAuditCreatedDTO.builder().build(); + prodAuditCreatedDTO.setBizObjType(TpAuditBizObjectTypeEnum.ORDER_CHANGE_APPLY.getType()); + prodAuditCreatedDTO.setBizObjectNo(orderChangeApplyVO.getApplyNo()); + prodAuditCreatedDTO.setSubmitAuditTime(DateUtil.current()); + if(orderChangeApplyVO.getOrderChangeApplicant() !=null) { + prodAuditCreatedDTO.setSubmitterNo(orderChangeApplyVO.getOrderChangeApplicant().getApplicantNo()); + prodAuditCreatedDTO.setSubmitterName(orderChangeApplyVO.getOrderChangeApplicant().getApplicantName()); + } + prodAuditCreatedDTO.setType(getAuditType(orderChangeApplyVO.getApplyType())); + prodAuditCreatedDTO.setTenantId(orderChangeApplyVO.getTenantId()); + prodAuditCreatedDTO.setApplyReason("用户下单或者变更自动创建"); + if(autoAudit != null && autoAudit){ + prodAuditCreatedDTO.setStatus(TpAuditStatusEnum.APPROVED_SUCCESS.getType()); + prodAuditCreatedDTO.setAuditTime(DateUtil.current()); + }else { + prodAuditCreatedDTO.setStatus(TpAuditStatusEnum.WAITING_APPROVED.getType()); + } + return prodAuditCreatedDTO; + } + + private Integer getAuditType(String applyType) { + + TpOrderChangeTypeEnum applyTypeEnum = TpOrderChangeTypeEnum.getOrderChangeTypeByType(applyType); + if(applyTypeEnum == null){ + return null; + } + TpAuditTypeEnum auditTypeEnum = null; + switch (applyTypeEnum) { + case ORDER_CREATE: auditTypeEnum = TpAuditTypeEnum.CHARTER_BUS_ORDER_CREATE_APPROVAL; break; + case ORDER_CHANGE: auditTypeEnum = TpAuditTypeEnum.CHARTER_BUS_ORDER_CHANGE_APPROVAL; break; + case ORDER_CANCEL: auditTypeEnum = TpAuditTypeEnum.CHARTER_BUS_ORDER_CANCEL_APPROVAL; break; + case ORDER_END_CHARGE_CONFIRM: auditTypeEnum = TpAuditTypeEnum.CHARTER_BUS_ORDER_END_CHARGE_CONFIRM_APPROVAL; break; + } + if(auditTypeEnum == null){ + return null; + } + + return auditTypeEnum.getBizType(); + + } + + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderChangeApplyCreateSwitchNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderChangeApplyCreateSwitchNode.java new file mode 100644 index 0000000..3dcbef0 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderChangeApplyCreateSwitchNode.java @@ -0,0 +1,52 @@ +package com.deepinnet.tptradeprod.biz.service.flow.orderchangeapply; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.order.TpOrderChangeTypeEnum; +import com.deepinnet.tptradeprod.biz.service.flow.constants.LiteFlowConstant; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderChangeApplyCreateContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderChangeApplyCreatedDTO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import com.yomahub.liteflow.enums.NodeTypeEnum; +import lombok.RequiredArgsConstructor; + +/** + *

+ * 订单变更申请单创建-创建流程切换 + *

+ * + * @author xiehuaqiao + * @since 2023/11/20 + */ + +@LiteflowComponent(value = "orderChangedApplyCreateSwitchNode", name = "订单变更申请单创建-创建流程切换") +@LiteflowRetry(retry = 3) +@LiteflowCmpDefine(value = NodeTypeEnum.SWITCH) +@RequiredArgsConstructor +public class TpOrderChangeApplyCreateSwitchNode { + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS_SWITCH) + public String process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单变更申请单创建-创建流程切换"); + + TpOrderChangeApplyCreateContext orderChangeApplyCreateContext = bindCmp.getContextBean(TpOrderChangeApplyCreateContext.class); + LogUtil.info("订单变更申请单创建-创建流程切换,入参为:{}", JSONUtil.toJsonStr(orderChangeApplyCreateContext)); + TpProdOrderChangeApplyCreatedDTO changeApplyCreatedDTO = orderChangeApplyCreateContext.getOrderChangeApplyCreatedDTO(); + TpOrderChangeTypeEnum applyTypeEnum = TpOrderChangeTypeEnum.getOrderChangeTypeByType(changeApplyCreatedDTO.getApplyType()); + String flowName = null; + switch (applyTypeEnum){ + case ORDER_CHANGE: flowName = LiteFlowConstant.ORDER_CHANGE_APPLY_CREATE_FLOW ; break; + case ORDER_CREATE: flowName = LiteFlowConstant.ORDER_CREATE_APPLY_CREATE_FLOW ; break; + case ORDER_CANCEL: flowName = LiteFlowConstant.ORDER_CANCEL_APPLY_CREATE_FLOW ; break; + case ORDER_END_CHARGE_CONFIRM: flowName = LiteFlowConstant.ORDER_END_CHARGE_CONFIRM_FLOW ; break; + } + return flowName; + } + + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderChangeApplyDispatchOrderNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderChangeApplyDispatchOrderNode.java new file mode 100644 index 0000000..61e21c4 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderChangeApplyDispatchOrderNode.java @@ -0,0 +1,87 @@ +package com.deepinnet.tptradeprod.biz.service.flow.orderchangeapply; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.order.TpOrderChangeTypeEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderDispatchSceneTypeEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderDispatchStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderChangeApplyCreateContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderChangeApplyCreatedDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderDispatchCreatedDTO; +import com.deepinnet.tptradeprod.common.service.facade.TpOrderDispatchAcceptanceFacade; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderChangeApplyDetailVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; + +import javax.annotation.Resource; + +/** + *

+ * 订单变更申请单创建-申请单创建 + *

+ * + * @author xiehuaqiao + * @since 2023/11/20 + */ + +@LiteflowComponent(value = "orderChangeApplyDispatchOrderNode", name = "订单变更申请单创建-申请单创建节点") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +@RequiredArgsConstructor +public class TpOrderChangeApplyDispatchOrderNode { + + @Resource + private final TpOrderDispatchAcceptanceFacade orderDispatchAcceptanceFacade; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单变更申请单创建"); + + TpOrderChangeApplyCreateContext orderChangeApplyCreateContext = bindCmp.getContextBean(TpOrderChangeApplyCreateContext.class); + LogUtil.info("订单变更申请单创建节点,入参为:{}", JSONUtil.toJsonStr(orderChangeApplyCreateContext)); + //1.当申请单为空时,代表没有创建成功,不需要派单 + TpProdOrderChangeApplyDetailVO newOrderChangeApplyVO = orderChangeApplyCreateContext.getNewOrderChangeApplyVO(); + if(newOrderChangeApplyVO == null){ + return; + } + //2.若申请单不是订单创建类型,则不需要派单 + if(!TpOrderChangeTypeEnum.ORDER_CREATE.getType().equals(newOrderChangeApplyVO. getApplyType())){ + return; + } + TpProdOrderChangeApplyCreatedDTO orderChangeApplyCreatedDTO = orderChangeApplyCreateContext.getOrderChangeApplyCreatedDTO(); + if(orderChangeApplyCreatedDTO == null){ + return; + } + //3.创建派单记录 + TpProdOrderDispatchCreatedDTO dto = new TpProdOrderDispatchCreatedDTO(); + dto.setOrderNo(newOrderChangeApplyVO.getOrderNo()); + dto.setOriginalOrderNo(newOrderChangeApplyVO.getOriginalOrderNo()); + dto.setDispatchScene(TpOrderDispatchSceneTypeEnum.USER_CREATE_ORDER_SCENE.getSceneName()); + dto.setDispatchTime(DateUtil.current()); + dto.setDispatchStatus(TpOrderDispatchStatusEnum.ORDER_DISPATCH_UNASSIGNED_STATUS.getStatus()); + dto.setOriginOrgNo(orderChangeApplyCreatedDTO.getOriginOrgNo()); + dto.setOriginOrgName(orderChangeApplyCreatedDTO.getOriginOrgName()); + dto.setOriginOrgType(orderChangeApplyCreatedDTO.getOriginOrgType()); + if(orderChangeApplyCreatedDTO.getOrderChangeApplicant() != null) { + dto.setOperatorNo(orderChangeApplyCreatedDTO.getOrderChangeApplicant().getApplicantNo()); + dto.setOperatorName(orderChangeApplyCreatedDTO.getOrderChangeApplicant().getApplicantName()); + } + dto.setTenantId(newOrderChangeApplyVO.getTenantId()); + TpResult result = orderDispatchAcceptanceFacade.dispatchOrder(dto); + if (!result.isSuccess()) { + LogUtil.error("调用订单派单创建接口失败,入参:{},原因:{}", JSONUtil.toJsonStr(orderChangeApplyCreatedDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + } + + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderChangeApplyEndTripPriceConfirmNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderChangeApplyEndTripPriceConfirmNode.java new file mode 100644 index 0000000..f9f6a05 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderChangeApplyEndTripPriceConfirmNode.java @@ -0,0 +1,62 @@ +package com.deepinnet.tptradeprod.biz.service.flow.orderchangeapply; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.order.TpOrderEndPriceConfirmDTO; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderChangeApplyCreateContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderChangeApplicantCreatedDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderChangeApplyCreatedDTO; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; + +import javax.annotation.Resource; + +/** + *

+ * 订单变更申请单创建-申请单创建 + *

+ * + * @author xiehuaqiao + * @since 2023/11/20 + */ + +@LiteflowComponent(value = "orderChangeApplyEndTripPriceConfirmNode", name = "订单变更申请单创建-订单结束业务员确认费用节点") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +@RequiredArgsConstructor +public class TpOrderChangeApplyEndTripPriceConfirmNode { + + @Resource + private TpOrderClient tpOrderClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单结束业务员确认费用"); + + TpOrderChangeApplyCreateContext orderChangeApplyCreateContext = bindCmp.getContextBean(TpOrderChangeApplyCreateContext.class); + LogUtil.info("订单变更申请单创建节点,入参为:{}", JSONUtil.toJsonStr(orderChangeApplyCreateContext)); + + TpProdOrderChangeApplyCreatedDTO orderChangeApplyCreatedDTO = orderChangeApplyCreateContext.getOrderChangeApplyCreatedDTO(); + if(orderChangeApplyCreatedDTO == null){ + return; + } + + //发起订单改价请求 + TpOrderEndPriceConfirmDTO endPriceConfirmDTO = new TpOrderEndPriceConfirmDTO(); + endPriceConfirmDTO.setTenantId(orderChangeApplyCreatedDTO.getTenantId()); + endPriceConfirmDTO.setOrderNo(orderChangeApplyCreatedDTO.getOriginalOrderNo()); + endPriceConfirmDTO.setConfirmPrice(orderChangeApplyCreatedDTO.getConfirmPrice()); + TpProdOrderChangeApplicantCreatedDTO orderChangeApplicant = orderChangeApplyCreatedDTO.getOrderChangeApplicant(); + endPriceConfirmDTO.setOperatorNo(orderChangeApplicant.getApplicantNo()); + endPriceConfirmDTO.setOperatorName(orderChangeApplicant.getApplicantName()); + tpOrderClient.endTripPriceConfirm(endPriceConfirmDTO); + } + + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderChangeApplyQueryDetailNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderChangeApplyQueryDetailNode.java new file mode 100644 index 0000000..e0daec9 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderChangeApplyQueryDetailNode.java @@ -0,0 +1,51 @@ +package com.deepinnet.tptradeprod.biz.service.flow.orderchangeapply; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.order.TpOrderChangeApplyStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderChangeApplyCreateContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderChangeApplyCreatedDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderChangeApplyDetailDTO; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderChangeApplyClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderChangeApplyDetailVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; + +import javax.annotation.Resource; +import java.util.Arrays; + +/** + * @author 订单变更申请单创建-申请单查询节点 + * @create 2023/11/27 14:27 + * @Description + */ + +@LiteflowComponent(value = "orderChangeApplyQueryDetailNode", name = "订单变更申请单创建-申请单查询节点") +@LiteflowCmpDefine +public class TpOrderChangeApplyQueryDetailNode { + + @Resource + private TpOrderChangeApplyClient orderChangeClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + TpOrderChangeApplyCreateContext orderChangeApplyCreateContext = bindCmp.getContextBean(TpOrderChangeApplyCreateContext.class); + LogUtil.info("订单变更申请单创建节点,入参为:{}", JSONUtil.toJsonStr(orderChangeApplyCreateContext)); + //1。入参为空,则直接返回 + TpProdOrderChangeApplyCreatedDTO orderChangeApplyCreatedDTO = orderChangeApplyCreateContext.getOrderChangeApplyCreatedDTO(); + if (orderChangeApplyCreatedDTO == null) { + return; + } + TpProdOrderChangeApplyDetailDTO prodOrderChangeApplyDetailDTO = TpProdOrderChangeApplyDetailDTO.builder().build(); + prodOrderChangeApplyDetailDTO.setOriginalOrderNo(orderChangeApplyCreatedDTO.getOriginalOrderNo()); + prodOrderChangeApplyDetailDTO.setApplyType(orderChangeApplyCreatedDTO.getApplyType()); + prodOrderChangeApplyDetailDTO.setApplyStatus(Arrays.asList(TpOrderChangeApplyStatusEnum.WAITING_APPROVED.getType(), + TpOrderChangeApplyStatusEnum.APPLY_CREATE.getType(), TpOrderChangeApplyStatusEnum.FULL_RSC_WAITING_APPROVED.getType())); + prodOrderChangeApplyDetailDTO.setTenantId(orderChangeApplyCreatedDTO.getTenantId()); + TpProdOrderChangeApplyDetailVO applyDetailResult = orderChangeClient.getOrderChangedApplyDetail(prodOrderChangeApplyDetailDTO); + orderChangeApplyCreateContext.setOriginOrderChangeApplyVO(applyDetailResult); + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderChangeApplySaveNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderChangeApplySaveNode.java new file mode 100644 index 0000000..39a2f10 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderChangeApplySaveNode.java @@ -0,0 +1,71 @@ +package com.deepinnet.tptradeprod.biz.service.flow.orderchangeapply; + +import cn.hutool.core.lang.Assert; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.order.TpOrderChangeApplyStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderChangeApplyCreateContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderChangeApplyCreatedDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderChangeApplyDetailDTO; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderChangeApplyClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderChangeApplyDetailVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; + +import javax.annotation.Resource; +import java.util.Arrays; + +/** + *

+ * 订单变更申请单创建-申请单保存节点 + *

+ * + * @author xiehuaqiao + * @since 2023/11/20 + */ + +@LiteflowComponent(value = "orderChangeApplySaveNode", name = "订单变更申请单创建-申请单保存节点") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +@RequiredArgsConstructor +public class TpOrderChangeApplySaveNode { + + @Resource + private final TpOrderChangeApplyClient tpOrderChangeApplyClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单变更申请单创建-申请单保存节点"); + + TpOrderChangeApplyCreateContext orderChangeApplyCreateContext = bindCmp.getContextBean(TpOrderChangeApplyCreateContext.class); + LogUtil.info("订单变更申请单创建-申请单保存节点,入参为:{}", JSONUtil.toJsonStr(orderChangeApplyCreateContext)); + //1。入参为空,则直接返回 + TpProdOrderChangeApplyCreatedDTO orderChangeApplyCreatedDTO = orderChangeApplyCreateContext.getOrderChangeApplyCreatedDTO(); + if(orderChangeApplyCreatedDTO == null){ + return; + } + Boolean result = tpOrderChangeApplyClient.createOrderChangeApply(orderChangeApplyCreatedDTO); + if (!result) { + LogUtil.error("调用订单变更申请单保存接口失败,入参:{}", JSONUtil.toJsonStr(orderChangeApplyCreatedDTO)); + throw new TpException(TpTradeProdErrorCode.CREATE_ORDER_CHANGE_APPLY_ERROR.getCode(),TpTradeProdErrorCode.CREATE_ORDER_CHANGE_APPLY_ERROR.getDesc()); + } + TpProdOrderChangeApplyDetailVO applyDetailResult = tpOrderChangeApplyClient.getOrderChangedApplyDetail( + TpProdOrderChangeApplyDetailDTO.builder() + .originalOrderNo(orderChangeApplyCreatedDTO.getOriginalOrderNo()) + .applyType(orderChangeApplyCreatedDTO.getApplyType()) + .applyStatus(Arrays.asList(TpOrderChangeApplyStatusEnum.WAITING_APPROVED.getType())) + .tenantId(orderChangeApplyCreatedDTO.getTenantId()).build()); + Assert.notNull(applyDetailResult, "查询订单变更申请单失败"); + orderChangeApplyCreateContext.setNewOrderChangeApplyVO(applyDetailResult); + + } + + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderCreateApplyCheckNoneApplyNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderCreateApplyCheckNoneApplyNode.java new file mode 100644 index 0000000..7f89232 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderchangeapply/TpOrderCreateApplyCheckNoneApplyNode.java @@ -0,0 +1,42 @@ +package com.deepinnet.tptradeprod.biz.service.flow.orderchangeapply; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderChangeApplyCreateContext; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderChangeApplyDetailVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import com.yomahub.liteflow.enums.NodeTypeEnum; +import lombok.RequiredArgsConstructor; + +/** + *

+ * 订单变更申请单创建-订单是否有正在进行的申请节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "orderCreateCheckNoneApplyNode", name = "订单变更申请单创建-订单是否有正在进行的申请节点") +@LiteflowCmpDefine(value = NodeTypeEnum.IF) +@RequiredArgsConstructor +public class TpOrderCreateApplyCheckNoneApplyNode { + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS_IF) + public boolean process(NodeComponent bindCmp) { + TpOrderChangeApplyCreateContext orderChangeApplyCreateContext = bindCmp.getContextBean(TpOrderChangeApplyCreateContext.class); + LogUtil.info("订单变更申请单创建-订单是否有正在进行的申请节点,入参为:{}", JSONUtil.toJsonStr(orderChangeApplyCreateContext)); + //1。入参为空,则直接返回 + TpProdOrderChangeApplyDetailVO originOrderChangeApplyVO = orderChangeApplyCreateContext.getOriginOrderChangeApplyVO(); + if(originOrderChangeApplyVO != null){ + return Boolean.FALSE; + } + return Boolean.TRUE; + } + + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpApplySmsSendPrepareNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpApplySmsSendPrepareNode.java new file mode 100644 index 0000000..edc5875 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpApplySmsSendPrepareNode.java @@ -0,0 +1,190 @@ +package com.deepinnet.tptradeprod.biz.service.flow.orderconfirm; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpcommoncore.common.service.template.sms.user.*; +import com.deepinnet.tpconfigcore.common.vo.TpTenantContractListDTO; +import com.deepinnet.tptradecore.common.enums.audit.TpAuditStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderAuditConfirmContext; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpSendSmsContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderAuditConfirmDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderDispatchDetailDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderQueryDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderAuditConfirmTypeEnum; +import com.deepinnet.tptradeprod.common.enums.TpOrderPayModeEnum; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderDispatchClient; +import com.deepinnet.tptradeprod.common.service.integration.client.TpTenantClient; +import com.deepinnet.tptradeprod.common.vo.TpOrderRequirementUserVO; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDispatchDetailVO; +import com.deepinnet.tptradeprod.core.compoment.TpTenantNacosConfigComponent; +import com.google.common.collect.Lists; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import org.springframework.context.annotation.Lazy; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.Date; +import java.util.Objects; + +import static cn.hutool.core.date.DatePattern.NORM_DATETIME_PATTERN; +import static com.deepinnet.tptradecore.common.enums.order.TpOrderModulesEnum.ORDER_REQUIREMENT_USER; + +/** + *

+ * 订单审核确认-全额退款审批单创建更新申请单状态 + *

+ * + * @author xiehuaqiao + * @since 2023/11/20 + */ + +@LiteflowComponent(value = "applySmsSendPrepareNode", name = "审核-给用户发送短信准备") +@LiteflowCmpDefine +public class TpApplySmsSendPrepareNode { + + @Resource + private TpOrderClient orderClient; + + @Resource + private TpOrderDispatchClient tpOrderDispatchClient; + + @Resource + private TpTenantClient tenantClient; + + @Resource + @Lazy + private TpTenantNacosConfigComponent tenantNacosConfigComponent; + + private final static String URL_SUFFIX = "charterCar/orderPay?originalOrderNo={}"; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 审核-给用户发送短信准备"); + + TpOrderAuditConfirmContext orderAuditConfirmContext = bindCmp.getContextBean(TpOrderAuditConfirmContext.class); + TpSendSmsContext smsContext = bindCmp.getContextBean(TpSendSmsContext.class); + + TpProdOrderAuditConfirmDTO confirmDTO = orderAuditConfirmContext.getConfirmDTO(); + + String originalOrderNo = confirmDTO.getOriginalOrderNo(); + String tenantId = confirmDTO.getTenantId(); + + // 查询公司信息 + TpProdOrderDispatchDetailDTO orderDispatchDetailDTO = new TpProdOrderDispatchDetailDTO(); + orderDispatchDetailDTO.setOriginalOrderNo(originalOrderNo); + orderDispatchDetailDTO.setTenantId(tenantId); + + TpProdOrderDispatchDetailVO orderDispatchDetail = tpOrderDispatchClient.getOrderDispatchDetail(orderDispatchDetailDTO); + + String targetOrgNo = orderDispatchDetail.getTargetOrgNo(); + + TpTenantContractListDTO orgAuditorDetail = tenantClient.getAuditorsByOrgCode(targetOrgNo, tenantId); + String orgPhone = ""; + if (orgAuditorDetail != null) { + orgPhone = CollUtil.isEmpty(orgAuditorDetail.getAuditorPhone()) ? "" : orgAuditorDetail.getAuditorPhone().get(0); + } + + TpProdOrderQueryDTO query = new TpProdOrderQueryDTO(); + query.setOriginalOrderNo(originalOrderNo); + query.setTenantId(tenantId); + query.setNeedModules(Lists.newArrayList(ORDER_REQUIREMENT_USER.getModule())); + TpProdOrderDetailVO orderDetail = orderClient.getOrderDetail(query); + + TpOrderRequirementUserVO orderRequirementUser = orderDetail.getOrderRequirementUser(); + smsContext.setMobile(orderRequirementUser.getRequirementContact()); + String contactName = orderRequirementUser.getRequirementContactName(); + + + TpOrderAuditConfirmTypeEnum confirmTypeEnum = TpOrderAuditConfirmTypeEnum.getTpOrderAuditConfirmType(confirmDTO.getOrderAuditConfirmType()); + TpAuditStatusEnum auditStatusEnum = TpAuditStatusEnum.getAuditStatusByType(confirmDTO.getAuditStatus()); + + switch (confirmTypeEnum) { + case ORDER_CREATE: + switch (auditStatusEnum) { + case APPROVED_REJECT: + TpSmsRejectedTemplate tpSmsRejectedTemplate = new TpSmsRejectedTemplate(); + tpSmsRejectedTemplate.setUserName(contactName); + tpSmsRejectedTemplate.setRejectReason(confirmDTO.getAuditResult()); + tpSmsRejectedTemplate.setContactPhone(orgPhone); + smsContext.setSmsTemplate(tpSmsRejectedTemplate); + break; + case APPROVED_SUCCESS: + if (Objects.equals(TpOrderPayModeEnum.PAY_AFTER.getPayMode(), orderDetail.getPayMode())) { + TpSmsRemindBoardOnTimeTemplate boardOnTimeTemplate = new TpSmsRemindBoardOnTimeTemplate(); + boardOnTimeTemplate.setUserName(contactName); + boardOnTimeTemplate.setContactPhone(orgPhone); + smsContext.setSmsTemplate(boardOnTimeTemplate); + } else { + String url = tenantNacosConfigComponent.getTenantDomainMap().get(tenantId); + if (StrUtil.isBlank(url)) { + smsContext.setMobile(null); + } else { + String payUrl = url + URL_SUFFIX; + TpSmsApprovedTemplate tpSmsApprovedTemplate = new TpSmsApprovedTemplate(); + tpSmsApprovedTemplate.setUserName(contactName); + tpSmsApprovedTemplate.setPayTimeout(DateUtil.format(new Date(orderDetail.getExpireTime()), NORM_DATETIME_PATTERN)); + tpSmsApprovedTemplate.setPayAmount(orderDetail.getPayAmount()); + //tpSmsApprovedTemplate.setUrl(payShortLink); + tpSmsApprovedTemplate.setUrl(StrUtil.format(payUrl, originalOrderNo)); + tpSmsApprovedTemplate.setContactPhone(orgPhone); + smsContext.setSmsTemplate(tpSmsApprovedTemplate); + } + } + break; + } + break; + case ORDER_CHANGE: + switch (auditStatusEnum) { + case APPROVED_REJECT: + TpSmsChangeRejectedTemplate tpSmsChangeRejectedTemplate = new TpSmsChangeRejectedTemplate(); + tpSmsChangeRejectedTemplate.setUserName(contactName); + tpSmsChangeRejectedTemplate.setRejectReason(confirmDTO.getAuditResult()); + tpSmsChangeRejectedTemplate.setContactPhone(orgPhone); + smsContext.setSmsTemplate(tpSmsChangeRejectedTemplate); + break; + case APPROVED_SUCCESS: + TpSmsChangeApprovedBeforeDepartureTemplate tpSmsChangeApprovedBeforeDepartureTemplate = new TpSmsChangeApprovedBeforeDepartureTemplate(); + tpSmsChangeApprovedBeforeDepartureTemplate.setUserName(contactName); + tpSmsChangeApprovedBeforeDepartureTemplate.setContactPhone(orgPhone); + smsContext.setSmsTemplate(tpSmsChangeApprovedBeforeDepartureTemplate); + break; + } + break; + case ORDER_CANCEL: + switch (auditStatusEnum) { + case APPROVED_REJECT: + TpSmsCancelRejectedTemplate tpSmsCancelRejectedTemplate = new TpSmsCancelRejectedTemplate(); + tpSmsCancelRejectedTemplate.setUserName(contactName); + tpSmsCancelRejectedTemplate.setRejectReason(confirmDTO.getAuditResult()); + tpSmsCancelRejectedTemplate.setContactPhone(orgPhone); + smsContext.setSmsTemplate(tpSmsCancelRejectedTemplate); + break; + case APPROVED_SUCCESS: + BigDecimal serviceCharge = new BigDecimal(orderDetail.getServiceCharge()); + BigDecimal paidAmount = new BigDecimal(orderDetail.getPayAmount()); + TpSmsCancelApprovedTemplate tpSmsCancelApprovedTemplate = new TpSmsCancelApprovedTemplate(); + tpSmsCancelApprovedTemplate.setUserName(contactName); + BigDecimal refundAmount = paidAmount.subtract(serviceCharge); + if (refundAmount.compareTo(BigDecimal.ZERO) < 0) { + smsContext.setMobile(null); + } else { + tpSmsCancelApprovedTemplate.setRefundAmount(refundAmount.toString()); + tpSmsCancelApprovedTemplate.setContactPhone(orgPhone); + smsContext.setSmsTemplate(tpSmsCancelApprovedTemplate); + } + break; + } + break; + } + } + + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderCancelApprovedTimeOutSwitchNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderCancelApprovedTimeOutSwitchNode.java new file mode 100644 index 0000000..733d3c3 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderCancelApprovedTimeOutSwitchNode.java @@ -0,0 +1,50 @@ +package com.deepinnet.tptradeprod.biz.service.flow.orderconfirm; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.order.TpOrderChangeApplyStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.constants.LiteFlowConstant; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderAuditConfirmContext; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderChangeApplyDetailVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import com.yomahub.liteflow.enums.NodeTypeEnum; +import lombok.RequiredArgsConstructor; + +/** + *

+ * 订单审核确认节点-审核超时确认流程切换 + * + * @author xiehuaqiao + * @since 2023/11/20 + */ + +@LiteflowComponent(value = "orderCancelApprovedTimeOutSwitchNode", name = "订单审核确认节点-审核超时确认流程切换") +@LiteflowRetry(retry = 3) +@LiteflowCmpDefine(value = NodeTypeEnum.SWITCH) +@RequiredArgsConstructor +public class TpOrderCancelApprovedTimeOutSwitchNode { + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS_SWITCH) + public String process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单审核确认节点-审核超时确认流程切换"); + + TpOrderAuditConfirmContext orderAuditConfirmContext = bindCmp.getContextBean(TpOrderAuditConfirmContext.class); + LogUtil.info("订单审核确认节点-审核超时确认流程切换,入参为:{}", JSONUtil.toJsonStr(orderAuditConfirmContext)); + TpProdOrderChangeApplyDetailVO orderChangeApplyVO = orderAuditConfirmContext.getOrderChangeApplyVO(); + String flowName = LiteFlowConstant.ORDER_CANCEL_APPROVED_TIMEOUT_NON_RSC_FLOW; + //如果是全额退手续费审批类型,则走全额退手续费超时处理流程 + if(StrUtil.equals(orderChangeApplyVO.getApplyStatus(), TpOrderChangeApplyStatusEnum.FULL_RSC_WAITING_APPROVED.getType())){ + flowName = LiteFlowConstant.ORDER_CANCEL_APPROVED_TIMEOUT_FULL_RSC_FLOW; + } + return flowName; + } + + + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderCancelTimeoutChangePriceAndPayModeNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderCancelTimeoutChangePriceAndPayModeNode.java new file mode 100644 index 0000000..2a32321 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderCancelTimeoutChangePriceAndPayModeNode.java @@ -0,0 +1,144 @@ +package com.deepinnet.tptradeprod.biz.service.flow.orderconfirm; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.order.TpOrderChangePriceDTO; +import com.deepinnet.tptradecore.common.enums.audit.TpAuditStatusEnum; +import com.deepinnet.tptradecore.common.enums.order.TpAuditOrChangePriceBizTypeEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderChangeApplyStatusEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderReductionServiceChargeTypeEnum; +import com.deepinnet.tptradecore.common.enums.order.TpServiceChargeOperationTypeEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderAuditConfirmContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderAuditConfirmDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderAuditConfirmTypeEnum; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderChangeApplyDetailVO; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditVO; +import com.deepinnet.tptradeprod.core.compoment.TpChangePriceAndPayModeComponent; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; + +/** + *

+ * 服务费减免超时确认-订单支付方式和业务员改价节点 + *

+ * + * @author xiehuaqiao + * @since 2023/11/20 + */ + +@LiteflowComponent(value = "orderCancelTimeoutChangePriceAndPayModeNode", name = "服务费减免超时确认-订单支付方式和业务员改价节点") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +@RequiredArgsConstructor +public class TpOrderCancelTimeoutChangePriceAndPayModeNode { + + private final TpChangePriceAndPayModeComponent changePriceAndPayModeComponent; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 服务费减免超时确认-订单支付方式和业务员修改节点"); + + TpOrderAuditConfirmContext reduceContext = bindCmp.getContextBean(TpOrderAuditConfirmContext.class); + LogUtil.info("服务费减免超时确认-订单支付方式和业务员修改节点,入参为:{}", JSONUtil.toJsonStr(reduceContext)); + + TpProdAuditVO tpProdAuditVO = reduceContext.getTpProdAuditVO(); + //审核单为非最终状态,则不需要更新状态 + if (StrUtil.equals(TpAuditStatusEnum.WAITING_APPROVED.getType(), tpProdAuditVO.getStatus())) { + return; + } + TpProdOrderChangeApplyDetailVO orderChangeApplyVO = reduceContext.getOrderChangeApplyVO(); + if (orderChangeApplyVO == null) { + return; + } + //用户提交内容信息 + TpOrderChangePriceDTO dto = new TpOrderChangePriceDTO(); + TpProdOrderAuditConfirmDTO confirmDTO = reduceContext.getConfirmDTO(); + if (confirmDTO != null) { + dto.setPayMode(confirmDTO.getChangedPayMode()); + dto.setChangeAmount(confirmDTO.getChangedFinalPrice()); + dto.setOperatorUser(confirmDTO.getOperatorNo()); + dto.setOperatorName(confirmDTO.getOperatorName()); + dto.setBizType(buildBizType(confirmDTO.getOrderAuditConfirmType())); + dto.setServiceCharge(buildReduceServiceChargeType(confirmDTO.getOrderAuditConfirmType(), confirmDTO.getReductionServiceChargeType())); + } + dto.setOriginalOrderNo(orderChangeApplyVO.getOriginalOrderNo()); + dto.setAuditStatus(buildAuditStatus(orderChangeApplyVO.getApplyStatus())); + dto.setTenantId(confirmDTO.getTenantId()); + changePriceAndPayModeComponent.execute(dto); + + } + + private String buildReduceServiceChargeType(Integer orderAuditConfirmType, String reductionServiceChargeType) { + + TpOrderAuditConfirmTypeEnum confirmTypeEnum = TpOrderAuditConfirmTypeEnum.getTpOrderAuditConfirmType(orderAuditConfirmType); + if(StrUtil.isEmpty(reductionServiceChargeType)){ + return null; + } + String reduceServiceChargeType = null; + switch (confirmTypeEnum) { + case ORDER_CANCEL: + reduceServiceChargeType = transferReduceServiceChargeType(reductionServiceChargeType); + break; + case ORDER_CHANGE: + reduceServiceChargeType = transferReduceServiceChargeType(reductionServiceChargeType); + break; + } + return reduceServiceChargeType; + } + + private String transferReduceServiceChargeType(String reductionServiceChargeType) { + if(TpOrderReductionServiceChargeTypeEnum.FULL_REDUCTION.getBizType().equalsIgnoreCase(reductionServiceChargeType)){ + return TpServiceChargeOperationTypeEnum.FREE_SERVICE_CHARGE.getBizType(); + } + if(TpOrderReductionServiceChargeTypeEnum.SINGLE_REDUCTION.getBizType().equalsIgnoreCase(reductionServiceChargeType)){ + return TpServiceChargeOperationTypeEnum.SINGLE_FREE_SERVICE_CHARGE.getBizType(); + } + return TpServiceChargeOperationTypeEnum.RULE_CAL_SERVICE_CHARGE.getBizType(); + } + + + private String buildBizType(Integer orderAuditConfirmType) { + + TpOrderAuditConfirmTypeEnum confirmTypeEnum = TpOrderAuditConfirmTypeEnum.getTpOrderAuditConfirmType(orderAuditConfirmType); + + String priceBizType = null; + switch (confirmTypeEnum) { + case ORDER_CREATE: + priceBizType = TpAuditOrChangePriceBizTypeEnum.CONFIRM_ORDER.getBizType(); + break; + case ORDER_CHANGE: + priceBizType = TpAuditOrChangePriceBizTypeEnum.CHANGE_ORDER.getBizType(); + break; + case ORDER_CANCEL: + priceBizType = TpAuditOrChangePriceBizTypeEnum.CANCEL_ORDER.getBizType(); + break; + } + return priceBizType; + + } + + private Boolean buildAuditStatus(String status) { + TpOrderChangeApplyStatusEnum orderStatusEnum = TpOrderChangeApplyStatusEnum.getApplyStatusByType(status); + Boolean auditStatusFlag = Boolean.FALSE; + switch (orderStatusEnum) { + case APPROVED_REJECT: + auditStatusFlag = Boolean.TRUE; + break; + case APPROVED_TIMEOUT: + auditStatusFlag = Boolean.TRUE; + break; + case APPROVED_SUCCESS: + auditStatusFlag = Boolean.TRUE; + break; + } + return auditStatusFlag; + } + + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmAuditApprovedSwitchNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmAuditApprovedSwitchNode.java new file mode 100644 index 0000000..15c2a6b --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmAuditApprovedSwitchNode.java @@ -0,0 +1,124 @@ +package com.deepinnet.tptradeprod.biz.service.flow.orderconfirm; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.audit.TpAuditStatusEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderReductionServiceChargeTypeEnum; +import com.deepinnet.tptradeprod.biz.service.flow.constants.LiteFlowConstant; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderAuditConfirmContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderAuditConfirmDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderAuditConfirmTypeEnum; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import com.yomahub.liteflow.enums.NodeTypeEnum; +import lombok.RequiredArgsConstructor; + +/** + *

+ * 订单审核确认节点-审核确认流程切换 + * 1.审核失败处理流程:审核单更新审批结果->订单变更申请单更新审核结果->发送通知 + * 2.1 审核通过,未选择全额免手续费:审核单更新审批结果->保存派车队信息->保存改价记录->创建接单记录->保存支付模式信息->订单变更申请单更新审核结果->发送通知 ->更新订单状态和支付模式 + * 2.2 审核通过,选择全额免手续费:审核单更新审批结果->创建二次审批单->更新订单变更状态为全额退款审批中 + * 3.1 全额退款审批失败:审核单更新审批结果->发送审批结果通知->保存派车队信息->保存改价记录->创建接单记录->保存支付模式信息->订单变更申请单更新审核结果->发送通知 -> 更新订单状态和支付模式 + * 3.2 全额退款审批通过:审核单更新审批结果->发送审批结果通知->保存派车队信息->保存改价记录->创建接单记录->保存支付模式信息->订单变更申请单更新审核结果->发送通知 -> 更新订单状态和支付模式 + *

+ * + * @author xiehuaqiao + * @since 2023/11/20 + */ + +@LiteflowComponent(value = "orderConfirmAuditApprovedSwitchNode", name = "订单审核确认节点-审核确认流程切换") +@LiteflowRetry(retry = 3) +@LiteflowCmpDefine(value = NodeTypeEnum.SWITCH) +@RequiredArgsConstructor +public class TpOrderConfirmAuditApprovedSwitchNode { + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS_SWITCH) + public String process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单审核确认节点-审核确认流程切换"); + + TpOrderAuditConfirmContext orderAuditConfirmContext = bindCmp.getContextBean(TpOrderAuditConfirmContext.class); + LogUtil.info("订单审核确认节点-审核确认流程切换,入参为:{}", JSONUtil.toJsonStr(orderAuditConfirmContext)); + TpProdOrderAuditConfirmDTO confirmDTO = orderAuditConfirmContext.getConfirmDTO(); + TpAuditStatusEnum auditStatusEnum = TpAuditStatusEnum.getAuditStatusByType(confirmDTO.getAuditStatus()); + String flowName = null; + switch (auditStatusEnum) { + case APPROVED_REJECT: + flowName = buildRejectFlowName(confirmDTO.getOrderAuditConfirmType()); + break; + case APPROVED_SUCCESS: + flowName = buildSuccessFlowName(confirmDTO.getOrderAuditConfirmType(), confirmDTO.getReductionServiceChargeType()); + break; + case APPROVED_TIMEOUT: + flowName = buildTimeoutFlowName(confirmDTO.getOrderAuditConfirmType()); + break; + + } + return flowName; + } + + private String buildSuccessFlowName(Integer auditConfirmType, String reductionServiceChargeType) { + TpOrderAuditConfirmTypeEnum confirmTypeEnum = TpOrderAuditConfirmTypeEnum.getTpOrderAuditConfirmType(auditConfirmType); + + String flowName = null; + switch (confirmTypeEnum) { + case ORDER_CREATE: + flowName = LiteFlowConstant.ORDER_CREATE_CONFIRM_APPROVED_SUCCESS_FLOW; + break; + case ORDER_CHANGE: + flowName = TpOrderReductionServiceChargeTypeEnum.SINGLE_REDUCTION.getBizType().equals(reductionServiceChargeType) ? + LiteFlowConstant.ORDER_CHANGE_CONFIRM_APPROVED_SUCCESS_SINGLE_REDUCTION_FLOW : LiteFlowConstant.ORDER_CHANGE_CONFIRM_APPROVED_SUCCESS_NONE_REDUCTION_FLOW; + break; + case ORDER_CANCEL: + flowName = TpOrderReductionServiceChargeTypeEnum.FULL_REDUCTION.getBizType().equals(reductionServiceChargeType) ? + LiteFlowConstant.ORDER_CANCEL_CONFIRM_APPROVED_FULL_REDUCTION_FLOW : LiteFlowConstant.ORDER_CANCEL_CONFIRM_APPROVED_NON_FULL_REDUCTION_FLOW; + break; + + } + return flowName; + } + + private String buildRejectFlowName(Integer auditConfirmType) { + TpOrderAuditConfirmTypeEnum confirmTypeEnum = TpOrderAuditConfirmTypeEnum.getTpOrderAuditConfirmType(auditConfirmType); + + String flowName = null; + switch (confirmTypeEnum) { + case ORDER_CREATE: + flowName = LiteFlowConstant.ORDER_CREATE_CONFIRM_APPROVED_REJECT_FLOW; + break; + case ORDER_CHANGE: + flowName = LiteFlowConstant.ORDER_CHANGE_CONFIRM_APPROVED_REJECT_FLOW; + break; + case ORDER_CANCEL: + flowName = LiteFlowConstant.ORDER_CANCEL_CONFIRM_APPROVED_REJECT_FLOW; + break; + + } + return flowName; + } + + private String buildTimeoutFlowName(Integer auditConfirmType) { + TpOrderAuditConfirmTypeEnum confirmTypeEnum = TpOrderAuditConfirmTypeEnum.getTpOrderAuditConfirmType(auditConfirmType); + + String flowName = null; + switch (confirmTypeEnum) { + case ORDER_CREATE: + flowName = LiteFlowConstant.ORDER_CREATE_CONFIRM_APPROVED_TIMEOUT_FLOW; + break; + case ORDER_CHANGE: + flowName = LiteFlowConstant.ORDER_CHANGE_CONFIRM_APPROVED_TIMEOUT_FLOW; + break; + case ORDER_CANCEL: + flowName = LiteFlowConstant.ORDER_CANCEL_CONFIRM_APPROVED_TIMEOUT_FLOW; + break; + + } + return flowName; + } + + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmBizTypeSwitchNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmBizTypeSwitchNode.java new file mode 100644 index 0000000..0e80baa --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmBizTypeSwitchNode.java @@ -0,0 +1,51 @@ +package com.deepinnet.tptradeprod.biz.service.flow.orderconfirm; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradeprod.biz.service.flow.constants.LiteFlowConstant; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderAuditConfirmContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderAuditConfirmDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderAuditConfirmTypeEnum; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import com.yomahub.liteflow.enums.NodeTypeEnum; +import lombok.RequiredArgsConstructor; + +/** + *

+ * 订单审核确认节点-订单确认审核流程切换节点 + * 1、新单审核确认节点 + * 2、订单变更审核确认节点 + * 3、订单取消审核确认节点 + *

+ * + * @author xiehuaqiao + * @since 2023/11/20 + */ + +@LiteflowComponent(value = "orderConfirmBizTypeSwitchNode", name = "订单审核确认节点-订单确认审核流程切换节点") +@LiteflowCmpDefine(value = NodeTypeEnum.SWITCH) +@RequiredArgsConstructor +public class TpOrderConfirmBizTypeSwitchNode { + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS_SWITCH) + public String process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单审核确认节点-订单确认审核流程切换节点"); + + TpOrderAuditConfirmContext orderAuditConfirmContext = bindCmp.getContextBean(TpOrderAuditConfirmContext.class); + LogUtil.info("订单审核确认节点-订单确认审核流程切换节点,入参为:{}", JSONUtil.toJsonStr(orderAuditConfirmContext)); + TpProdOrderAuditConfirmDTO confirmDTO = orderAuditConfirmContext.getConfirmDTO(); + TpOrderAuditConfirmTypeEnum confirmTypeEnum = TpOrderAuditConfirmTypeEnum.getTpOrderAuditConfirmType(confirmDTO.getOrderAuditConfirmType()); + String flowName = null; + switch (confirmTypeEnum){ + case ORDER_CREATE: flowName = LiteFlowConstant.ORDER_CREATE_AUDIT_CONFIRM_FLOW ; break; + case ORDER_CHANGE: flowName = LiteFlowConstant.ORDER_CHANGE_AUDIT_CONFIRM_FLOW; break; + case ORDER_CANCEL: flowName = LiteFlowConstant.ORDER_CANCEL_AUDIT_CONFIRM_FLOW ; break; + } + return flowName; + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmChangePriceAndPayModeNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmChangePriceAndPayModeNode.java new file mode 100644 index 0000000..588bffa --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmChangePriceAndPayModeNode.java @@ -0,0 +1,131 @@ +package com.deepinnet.tptradeprod.biz.service.flow.orderconfirm; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.order.TpOrderChangePriceDTO; +import com.deepinnet.tptradecore.common.enums.audit.TpAuditStatusEnum; +import com.deepinnet.tptradecore.common.enums.order.TpAuditOrChangePriceBizTypeEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderReductionServiceChargeTypeEnum; +import com.deepinnet.tptradecore.common.enums.order.TpServiceChargeOperationTypeEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderAuditConfirmContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderAuditConfirmDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderAuditConfirmTypeEnum; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderChangeApplyDetailVO; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditVO; +import com.deepinnet.tptradeprod.core.compoment.TpChangePriceAndPayModeComponent; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; + +/** + *

+ * 订单确认审核-订单支付方式和业务员改价节点 + *

+ * + * @author xiehuaqiao + * @since 2023/11/20 + */ + +@LiteflowComponent(value = "orderConfirmChangePriceAndPayModeNode", name = "订单确认审核-订单支付方式和业务员改价节点") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +@RequiredArgsConstructor +public class TpOrderConfirmChangePriceAndPayModeNode { + + private final TpChangePriceAndPayModeComponent changePriceAndPayModeComponent; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单确认审核-订单支付方式和业务员改价节点"); + + TpOrderAuditConfirmContext orderAuditConfirmContext = bindCmp.getContextBean(TpOrderAuditConfirmContext.class); + LogUtil.info("订单确认审核-订单支付方式和业务员修改节点,入参为:{}", JSONUtil.toJsonStr(orderAuditConfirmContext)); + + TpProdAuditVO tpProdAuditVO = orderAuditConfirmContext.getTpProdAuditVO(); + //审核单为非最终状态,则不需要更新状态 + if (StrUtil.equals(TpAuditStatusEnum.WAITING_APPROVED.getType(),tpProdAuditVO.getStatus())){ + return; + } + TpProdOrderChangeApplyDetailVO orderChangeApplyVO = orderAuditConfirmContext.getOrderChangeApplyVO(); + if(orderChangeApplyVO == null){ + return; + } + try { + TpProdOrderAuditConfirmDTO confirmDTO = orderAuditConfirmContext.getConfirmDTO(); + TpOrderChangePriceDTO dto = new TpOrderChangePriceDTO(); + dto.setPayMode(confirmDTO.getChangedPayMode()); + dto.setOriginalOrderNo(confirmDTO.getOriginalOrderNo()); + dto.setChangeAmount(confirmDTO.getChangedFinalPrice()); + dto.setOperatorUser(confirmDTO.getOperatorNo()); + dto.setOperatorName(confirmDTO.getOperatorName()); + dto.setAuditStatus(buildAuditStatus(tpProdAuditVO.getStatus())); + dto.setBizType(buildBizType(confirmDTO.getOrderAuditConfirmType())); + dto.setServiceChargeOperationType(buildReduceServiceChargeType(confirmDTO.getOrderAuditConfirmType(), confirmDTO.getReductionServiceChargeType())); + dto.setTenantId(confirmDTO.getTenantId()); + changePriceAndPayModeComponent.execute(dto); + }catch (Exception exception){ + LogUtil.error("订单确认审核-订单支付方式和业务员改价节点执行异常",exception); + } + + } + + private String buildReduceServiceChargeType(Integer orderAuditConfirmType, String reductionServiceChargeType) { + + TpOrderAuditConfirmTypeEnum confirmTypeEnum = TpOrderAuditConfirmTypeEnum.getTpOrderAuditConfirmType(orderAuditConfirmType); + if(StrUtil.isEmpty(reductionServiceChargeType)){ + return null; + } + String reduceServiceChargeType = null; + switch (confirmTypeEnum) { + case ORDER_CANCEL: + reduceServiceChargeType = transferReduceServiceChargeType(reductionServiceChargeType); + break; + case ORDER_CHANGE: + reduceServiceChargeType = transferReduceServiceChargeType(reductionServiceChargeType); + break; + } + return reduceServiceChargeType; + } + + private String transferReduceServiceChargeType(String reductionServiceChargeType) { + if(TpOrderReductionServiceChargeTypeEnum.FULL_REDUCTION.getBizType().equalsIgnoreCase(reductionServiceChargeType)){ + return TpServiceChargeOperationTypeEnum.FREE_SERVICE_CHARGE.getBizType(); + } + if(TpOrderReductionServiceChargeTypeEnum.SINGLE_REDUCTION.getBizType().equalsIgnoreCase(reductionServiceChargeType)){ + return TpServiceChargeOperationTypeEnum.SINGLE_FREE_SERVICE_CHARGE.getBizType(); + } + return TpServiceChargeOperationTypeEnum.RULE_CAL_SERVICE_CHARGE.getBizType(); + } + + private String buildBizType(Integer orderAuditConfirmType) { + + TpOrderAuditConfirmTypeEnum confirmTypeEnum = TpOrderAuditConfirmTypeEnum.getTpOrderAuditConfirmType(orderAuditConfirmType); + + String priceBizType = null; + switch (confirmTypeEnum){ + case ORDER_CREATE: priceBizType = TpAuditOrChangePriceBizTypeEnum.CONFIRM_ORDER.getBizType(); break; + case ORDER_CHANGE: priceBizType = TpAuditOrChangePriceBizTypeEnum.CHANGE_ORDER.getBizType(); break; + case ORDER_CANCEL: priceBizType = TpAuditOrChangePriceBizTypeEnum.CANCEL_ORDER.getBizType(); break; + } + return priceBizType; + + } + + private Boolean buildAuditStatus(String status) { + TpAuditStatusEnum orderStatusEnum = TpAuditStatusEnum.getAuditStatusByType(status); + Boolean auditStatusFlag = Boolean.FALSE; + switch (orderStatusEnum){ + case APPROVED_REJECT: auditStatusFlag = Boolean.FALSE; break; + case APPROVED_TIMEOUT: auditStatusFlag = Boolean.FALSE; break; + case APPROVED_SUCCESS: auditStatusFlag = Boolean.TRUE; break; + } + return auditStatusFlag; + } + + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmCheckNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmCheckNode.java new file mode 100644 index 0000000..3608eb0 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmCheckNode.java @@ -0,0 +1,152 @@ +package com.deepinnet.tptradeprod.biz.service.flow.orderconfirm; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.audit.TpAuditBizObjectTypeEnum; +import com.deepinnet.tptradecore.common.enums.audit.TpAuditStatusEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderChangeApplyStatusEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderModulesEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderAuditConfirmContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderAuditConfirmDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderQueryDTO; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.vo.TpOrderPriceRecordVO; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderChangeApplyDetailVO; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import com.yomahub.liteflow.enums.NodeTypeEnum; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.List; + +/** + * 订单确认审核-审核条件校验节点 + * @author xiehuaqiao + * @create 2023/11/21 14:27 + * @Description + */ + +@LiteflowComponent(value = "orderAuditConfirmCheckNode", name = "订单确认审核-审核条件校验节点") +@LiteflowCmpDefine(value = NodeTypeEnum.IF) +public class TpOrderConfirmCheckNode { + + + @Resource + private TpOrderClient tpOrderClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS_IF) + public boolean process(NodeComponent bindCmp) { + TpOrderAuditConfirmContext orderAuditConfirmContext = bindCmp.getContextBean(TpOrderAuditConfirmContext.class); + LogUtil.info("订单确认审核-审核条件校验节点,入参为:{}", JSONUtil.toJsonStr(orderAuditConfirmContext)); + TpProdAuditVO auditVO = orderAuditConfirmContext.getTpProdAuditVO(); + //1.审核单非待审核状态,不能再进行审核 + if (!StrUtil.equals(TpAuditStatusEnum.WAITING_APPROVED.getType(),auditVO.getStatus())){ + LogUtil.error("订单审核确认-审核条件校验失败,原因:审核单已经达到最终状态,审核单号:{}", auditVO.getAuditNo()); + return Boolean.FALSE; + } + //2.校验申请单状态,若申请单已经为最终状态,则不能进行审核 + TpAuditBizObjectTypeEnum bizObjectTypeEnum = TpAuditBizObjectTypeEnum.getBizObjectByType(auditVO.getBizObjType()); + Boolean checkApplyFlag = Boolean.TRUE; + TpProdOrderChangeApplyDetailVO applyVO = orderAuditConfirmContext.getOrderChangeApplyVO(); + // 校验订单申请单是否存在 + if (applyVO == null ) { + LogUtil.error("订单审核确认-审核条件校验失败,原因:该订单申请单不存在,申请单号:{}", auditVO.getBizObjectNo()); + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_AUDIT_APPLY_NONE_EXIST_ERROR); + } + switch (bizObjectTypeEnum){ + case ORDER_CHANGE_APPLY: checkApplyFlag = checkOrderChangedApply(auditVO,orderAuditConfirmContext.getOrderChangeApplyVO()); break; + } + if(!checkApplyFlag){ + LogUtil.error("订单审核确认-审核条件校验失败,原因:申请单已经达到最终状态,申请单号:{}", auditVO.getBizObjectNo()); + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_AUDIT_APPLY_NONE_VALID_ERROR); + } + //3.校验业务员改价是否合法:超出最低内部价 + TpProdOrderAuditConfirmDTO confirmDTO = orderAuditConfirmContext.getConfirmDTO(); + //若业务员修改了价格,则做价格判断,否则不做校验 + if(confirmDTO != null && StrUtil.isNotEmpty(confirmDTO.getChangedFinalPrice()) + && !StrUtil.equals(confirmDTO.getChangedFinalPrice(),confirmDTO.getExternalBasicPrice())){ + TpProdOrderDetailVO prodOrderDetailVO = getOrderDetail(applyVO); + //查询订单所属商品的最低价格 + String internalMinPrice = inquiryCharterInternalPrice(prodOrderDetailVO); + if(StrUtil.isNotEmpty(internalMinPrice) && !checkInternalMinPrice(internalMinPrice,confirmDTO.getChangedFinalPrice())){ + LogUtil.error("订单审核确认-审核条件校验失败,原因:业务员改价超出内部最低价格:内部最低价为{},业务员改价为{}", internalMinPrice,confirmDTO.getChangedFinalPrice()); + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_PRICE_CHANGE_ABOVE_MIN_PRICE_ERROR); + } + } + + return Boolean.TRUE; + + } + + private boolean checkInternalMinPrice(String internalMinPrice, String changedFinalPrice) { + BigDecimal sourceMinPrice = new BigDecimal(internalMinPrice); + BigDecimal targetFinalPrice = new BigDecimal(changedFinalPrice); + if (targetFinalPrice.doubleValue() < sourceMinPrice.doubleValue()){ + return false; + } + return true; + + } + + public String inquiryCharterInternalPrice(TpProdOrderDetailVO prodOrderDetailVO) { + + try { + List orderPriceRecordList = prodOrderDetailVO.getOrderPriceRecord(); + if (CollUtil.isEmpty(orderPriceRecordList)) { + return null; + } + TpOrderPriceRecordVO tpOrderPriceRecordVO = orderPriceRecordList.stream().findFirst().orElse(null); + if (tpOrderPriceRecordVO == null) { + return null; + } +// return charterBusInquireComponent.inquireInternalPrice(tpOrderPriceRecordVO.getPricingParams()); + return tpOrderPriceRecordVO.getInternalInquireAmount(); + }catch (Throwable throwable){ + LogUtil.error(throwable.getMessage(),throwable); + return null; + } + } + + private TpProdOrderDetailVO getOrderDetail(TpProdOrderChangeApplyDetailVO applyVO) { + TpProdOrderQueryDTO orderQueryDTO = new TpProdOrderQueryDTO(); + orderQueryDTO.setOriginalOrderNo(applyVO.getOriginalOrderNo()); + orderQueryDTO.setTenantId(applyVO.getTenantId()); + orderQueryDTO.setNeedModules(Arrays.asList(TpOrderModulesEnum.ORDER_PRICE_RECORD.getModule())); + TpProdOrderDetailVO prodOrderDetailVO = tpOrderClient.getOrderDetail(orderQueryDTO); + if (prodOrderDetailVO == null) { + LogUtil.error("订单审核失败:订单不存在,入参为:{}", JSONUtil.toJsonStr(orderQueryDTO)); + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_AUDIT_ERROR); + } + return prodOrderDetailVO; + } + + private Boolean checkOrderChangedApply(TpProdAuditVO auditVO, TpProdOrderChangeApplyDetailVO orderChangeApplyVO) { + + // 校验订单申请单是否存在 + if (orderChangeApplyVO == null ) { + LogUtil.error("订单审核确认失败,原因:该订单申请单不存在,申请单号:{}", auditVO.getBizObjectNo()); + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_AUDIT_ERROR); + } + // 校验订单申请单状态是否是待审核状态 + TpOrderChangeApplyStatusEnum applyStatusEnum = TpOrderChangeApplyStatusEnum.getApplyStatusByType(orderChangeApplyVO.getApplyStatus()); + if (TpOrderChangeApplyStatusEnum.WAITING_APPROVED == applyStatusEnum + || TpOrderChangeApplyStatusEnum.RSC_WAITING_APPROVED == applyStatusEnum + || TpOrderChangeApplyStatusEnum.SINGLE_RSC_WAITING_APPROVED == applyStatusEnum + || TpOrderChangeApplyStatusEnum.FULL_RSC_WAITING_APPROVED == applyStatusEnum ) { + return Boolean.TRUE; + } + LogUtil.error("订单审核确认失败,原因:该订单申请单已审核通过,申请单号:{}", auditVO.getBizObjectNo()); + return Boolean.FALSE; + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmCreateRscAuditNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmCreateRscAuditNode.java new file mode 100644 index 0000000..53ee5f5 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmCreateRscAuditNode.java @@ -0,0 +1,108 @@ +package com.deepinnet.tptradeprod.biz.service.flow.orderconfirm; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.audit.TpAuditStatusEnum; +import com.deepinnet.tptradecore.common.enums.audit.TpAuditTypeEnum; +import com.deepinnet.tptradeprod.biz.constants.TpTradeProdConstants; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderAuditConfirmContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderAuditConfirmDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderAuditConfirmTypeEnum; +import com.deepinnet.tptradeprod.common.service.integration.client.TpAuditClient; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditCreatedDTO; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditLatestDetailDTO; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +/** + *

+ * 订单审核确认-减免服务费审核单创建节点 + *

+ * + * @author xiehuaqiao + * @since 2023/11/20 + */ + +@LiteflowComponent(value = "orderConfirmCreateRscAuditNode", name = "订单审核确认-减免服务费审核单创建节点") +@LiteflowRetry(retry = 3) +@LiteflowCmpDefine +@RequiredArgsConstructor +public class TpOrderConfirmCreateRscAuditNode { + + private final TpAuditClient tpAuditClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单审核确认-减免服务费审核单创建节点"); + + TpOrderAuditConfirmContext orderAuditConfirmContext = bindCmp.getContextBean(TpOrderAuditConfirmContext.class); + LogUtil.info("订单审核确认-全额减免服务费审核单创建节点,入参为:{}", JSONUtil.toJsonStr(orderAuditConfirmContext)); + //更新审核结果 + TpProdOrderAuditConfirmDTO confirmDTO = orderAuditConfirmContext.getConfirmDTO(); + TpProdAuditVO tpAuditVO = orderAuditConfirmContext.getTpProdAuditVO(); + TpProdAuditCreatedDTO reduceServiceChargeAudit = buildAuditCreatedDTO(confirmDTO, tpAuditVO); + TpResult result = tpAuditClient.createAudit(reduceServiceChargeAudit); + if (!result.isSuccess()) { + LogUtil.error("订单审核确认-全额减免服务费审核单创建失败,入参:{},原因:{}", JSONUtil.toJsonStr(reduceServiceChargeAudit), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + //如果创建了全额退款审批单,对应的申请单状态需要更新为全额退款审批中 + setRscAudit(orderAuditConfirmContext, reduceServiceChargeAudit); + } + + @NotNull + private TpProdAuditCreatedDTO buildAuditCreatedDTO(TpProdOrderAuditConfirmDTO confirmDTO, TpProdAuditVO tpAuditVO) { + TpProdAuditCreatedDTO reduceServiceChargeAudit = TpProdAuditCreatedDTO.builder().build(); + reduceServiceChargeAudit.setBizObjType(tpAuditVO.getBizObjType()); + reduceServiceChargeAudit.setBizObjectNo(tpAuditVO.getBizObjectNo()); + reduceServiceChargeAudit.setSubmitAuditTime(DateUtil.current()); + reduceServiceChargeAudit.setSubmitterNo(confirmDTO.getOperatorNo()); + reduceServiceChargeAudit.setSubmitterName(confirmDTO.getOperatorName()); + reduceServiceChargeAudit.setApplyReason(confirmDTO.getAuditResult()); + reduceServiceChargeAudit.setType(buildAuditType(confirmDTO.getOrderAuditConfirmType())); + reduceServiceChargeAudit.setStatus(TpAuditStatusEnum.WAITING_APPROVED.getType()); + //保存订单确认选择的数据 TODO 可以新建一张记录表 + Map bizData = tpAuditVO.getBizData() == null ? new HashMap<>(): tpAuditVO.getBizData(); + bizData.put(TpTradeProdConstants.ORDER_AUDIT_CONFIRM, confirmDTO); + reduceServiceChargeAudit.setBizData(bizData); + reduceServiceChargeAudit.setTenantId(confirmDTO.getTenantId()); + return reduceServiceChargeAudit; + } + + private Integer buildAuditType(Integer orderAuditConfirmType) { + TpOrderAuditConfirmTypeEnum confirmTypeEnum = TpOrderAuditConfirmTypeEnum.getTpOrderAuditConfirmType(orderAuditConfirmType); + Integer auditType = null; + switch (confirmTypeEnum){ + + case ORDER_CHANGE: auditType = TpAuditTypeEnum.CHARTER_BUS_ORDER_CHANGE_RSC_APPROVAL.getBizType(); break; + case ORDER_CANCEL: auditType = TpAuditTypeEnum.CHARTER_BUS_ORDER_CANCEL_RSC_APPROVAL.getBizType(); break; + } + + return auditType ; + } + + private void setRscAudit(TpOrderAuditConfirmContext orderAuditConfirmContext, TpProdAuditCreatedDTO reduceServiceChargeAudit) { + TpProdAuditLatestDetailDTO auditLatestDetailDTO = TpProdAuditLatestDetailDTO.builder().build(); + auditLatestDetailDTO.setTenantId(reduceServiceChargeAudit.getTenantId()); + auditLatestDetailDTO.setBizObjectNo(reduceServiceChargeAudit.getBizObjectNo()); + auditLatestDetailDTO.setBizObjType(reduceServiceChargeAudit.getBizObjType()); + auditLatestDetailDTO.setType(reduceServiceChargeAudit.getType()); + auditLatestDetailDTO.setAuditStatuses(Arrays.asList(TpAuditStatusEnum.WAITING_APPROVED.getType())); + orderAuditConfirmContext.setRscAuditVO(tpAuditClient.getLatestAuditDetail(auditLatestDetailDTO)); + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmDispatchFleetNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmDispatchFleetNode.java new file mode 100644 index 0000000..97f4753 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmDispatchFleetNode.java @@ -0,0 +1,91 @@ +package com.deepinnet.tptradeprod.biz.service.flow.orderconfirm; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.audit.TpAuditStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderAuditConfirmContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderAuditConfirmDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderDispatchDetailDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderDispatchFleetCreatedDTO; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderDispatchClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDispatchDetailVO; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; + +/** + *

+ * 订单审核确认-指派车队节点 + *

+ * + * @author xiehuaqiao + * @since 2023/11/20 + */ + +@LiteflowComponent(value = "orderConfirmDispatchFleetNode", name = "订单审核确认-指派车队节点") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +@RequiredArgsConstructor +public class TpOrderConfirmDispatchFleetNode { + + private final TpOrderDispatchClient tpOrderDispatchClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单审核确认-指派车队节点"); + + TpOrderAuditConfirmContext orderAuditConfirmContext = bindCmp.getContextBean(TpOrderAuditConfirmContext.class); + LogUtil.info("订单审核确认-指派车队节点,入参为:{}", JSONUtil.toJsonStr(orderAuditConfirmContext)); + TpProdAuditVO tpProdAuditVO = orderAuditConfirmContext.getTpProdAuditVO(); + //审核单为非最终状态,则不需要更新状态 + if (StrUtil.equals(TpAuditStatusEnum.WAITING_APPROVED.getType(),tpProdAuditVO.getStatus())){ + return; + } + //指定派车车队 + TpProdOrderAuditConfirmDTO confirmDTO = orderAuditConfirmContext.getConfirmDTO(); + if(StrUtil.isEmpty(confirmDTO.getTargetFleetCode())){ + LogUtil.info("无车队信息,不需要派车"); + return; + } + TpProdOrderDispatchFleetCreatedDTO dto = TpProdOrderDispatchFleetCreatedDTO.builder() + .dispatchNo(getDispatchNoByOrderNo(confirmDTO.getTenantId(),confirmDTO.getOriginalOrderNo())) + .orderNo(confirmDTO.getOriginalOrderNo()) //兼容之前的老数据 + .originalOrderNo(confirmDTO.getOriginalOrderNo()) + .targetFleetNo(confirmDTO.getTargetFleetCode()) + .targetFleetName(confirmDTO.getTargetFleetName()) + .goJoinFleets(confirmDTO.getGoJoinFleets()) + .backJoinFleets(confirmDTO.getBackJoinFleets()) + .tenantId(confirmDTO.getTenantId()) + .operatorNo(confirmDTO.getOperatorNo()) + .operatorName(confirmDTO.getOperatorName()) + .build(); + Boolean result = tpOrderDispatchClient.dispatchFleet(dto); + + if (!result) { + LogUtil.error("调用订单车队分配创建接口失败,入参:{}", JSONUtil.toJsonStr(dto)); + throw new TpTradeProdException(TpTradeProdErrorCode.INTERNAL_SERVER_ERROR); + } + } + + private String getDispatchNoByOrderNo(String tenantId,String originalOrderNo) { + TpProdOrderDispatchDetailDTO tpOrderDispatchDetailDTO = new TpProdOrderDispatchDetailDTO(); + tpOrderDispatchDetailDTO.setOriginalOrderNo(originalOrderNo); + tpOrderDispatchDetailDTO.setTenantId(tenantId); + + TpProdOrderDispatchDetailVO tpProdOrderDispatchDetailVO = tpOrderDispatchClient.getOrderDispatchDetail(tpOrderDispatchDetailDTO); + if(tpProdOrderDispatchDetailVO !=null){ + return tpProdOrderDispatchDetailVO.getDispatchNo(); + } + return null; + } + + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmQueryApplyDetailNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmQueryApplyDetailNode.java new file mode 100644 index 0000000..aafb87d --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmQueryApplyDetailNode.java @@ -0,0 +1,65 @@ +package com.deepinnet.tptradeprod.biz.service.flow.orderconfirm; + +import cn.hutool.core.lang.Assert; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.order.TpOrderChangeApplyStatusEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderChangeTypeEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderAuditConfirmContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderAuditConfirmDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderChangeApplyDetailDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderAuditConfirmTypeEnum; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderChangeApplyClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderChangeApplyDetailVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; + +import javax.annotation.Resource; +import java.util.Arrays; + +/** + * 订单审核确认-订单变更申请单查询节点 + * @author xiehuaqiao + * @create 2023/11/20 14:27 + * @Description + */ + +@LiteflowComponent(value = "orderConfirmQueryApplyDetailNode", name = "订单审核确认-订单变更申请单查询节点") +@LiteflowCmpDefine +public class TpOrderConfirmQueryApplyDetailNode { + + @Resource + private TpOrderChangeApplyClient tpOrderChangeApplyClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + TpOrderAuditConfirmContext orderAuditConfirmContext = bindCmp.getContextBean(TpOrderAuditConfirmContext.class); + LogUtil.info("订单审核确认-订单变更申请单查询节点,入参为:{}", JSONUtil.toJsonStr(orderAuditConfirmContext)); + TpProdOrderAuditConfirmDTO confirmDTO = orderAuditConfirmContext.getConfirmDTO(); + TpProdOrderChangeApplyDetailDTO queryDTO = TpProdOrderChangeApplyDetailDTO.builder().build(); + queryDTO.setOriginalOrderNo(confirmDTO.getOriginalOrderNo()); + queryDTO.setApplyType(buildApplyType(confirmDTO.getOrderAuditConfirmType())); + queryDTO.setApplyStatus(Arrays.asList(TpOrderChangeApplyStatusEnum.WAITING_APPROVED.getType(), + TpOrderChangeApplyStatusEnum.APPLY_CREATE.getType(),TpOrderChangeApplyStatusEnum.RSC_WAITING_APPROVED.getType(), + TpOrderChangeApplyStatusEnum.SINGLE_RSC_WAITING_APPROVED.getType(),TpOrderChangeApplyStatusEnum.FULL_RSC_WAITING_APPROVED.getType())); + queryDTO.setTenantId(confirmDTO.getTenantId()); + TpProdOrderChangeApplyDetailVO tpProdOrderChangeApplyDetailVO = tpOrderChangeApplyClient.getOrderChangedApplyDetail(queryDTO); + Assert.notNull(tpProdOrderChangeApplyDetailVO, "该订单没有待审核的订单变更申请单,无需确认"); + orderAuditConfirmContext.setOrderChangeApplyVO(tpProdOrderChangeApplyDetailVO); + } + + private String buildApplyType(Integer orderAuditConfirmType) { + + TpOrderAuditConfirmTypeEnum confirmTypeEnum = TpOrderAuditConfirmTypeEnum.getTpOrderAuditConfirmType(orderAuditConfirmType); + String applyType = null; + switch (confirmTypeEnum){ + case ORDER_CREATE: applyType = TpOrderChangeTypeEnum.ORDER_CREATE.getType(); break; + case ORDER_CHANGE: applyType = TpOrderChangeTypeEnum.ORDER_CHANGE.getType(); break; + case ORDER_CANCEL: applyType = TpOrderChangeTypeEnum.ORDER_CANCEL.getType();break; + } + return applyType; + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmQueryAuditDetailNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmQueryAuditDetailNode.java new file mode 100644 index 0000000..306fd6e --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmQueryAuditDetailNode.java @@ -0,0 +1,54 @@ +package com.deepinnet.tptradeprod.biz.service.flow.orderconfirm; + +import cn.hutool.core.lang.Assert; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.audit.TpAuditBizObjectTypeEnum; +import com.deepinnet.tptradecore.common.enums.audit.TpAuditStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderAuditConfirmContext; +import com.deepinnet.tptradeprod.common.service.integration.client.TpAuditClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderChangeApplyDetailVO; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditLatestDetailDTO; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; + +import javax.annotation.Resource; +import java.util.Arrays; + +/** + * 订单确认审核-审核单详情查询节点 + * @author xiehuaqiao + * @create 2023/11/20 14:27 + * @Description + */ + +@LiteflowComponent(value = "orderConfirmQueryAuditDetailNode", name = "订单确认审核-审核单详情查询节点") +@LiteflowCmpDefine +public class TpOrderConfirmQueryAuditDetailNode { + + @Resource + private TpAuditClient tpAuditClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + TpOrderAuditConfirmContext orderAuditConfirmContext = bindCmp.getContextBean(TpOrderAuditConfirmContext.class); + LogUtil.info("订单确认审核-审核单详情查询节点,入参为:{}", JSONUtil.toJsonStr(orderAuditConfirmContext)); + TpProdOrderChangeApplyDetailVO applyVO = orderAuditConfirmContext.getOrderChangeApplyVO(); + if(applyVO == null){ + LogUtil.error("订单确认审核-查询失败,订单申请单不存在"); + return; + } + TpProdAuditLatestDetailDTO queryDetailDTO = TpProdAuditLatestDetailDTO.builder().build(); + queryDetailDTO.setTenantId(applyVO.getTenantId()); + queryDetailDTO.setBizObjectNo(applyVO.getApplyNo()); + queryDetailDTO.setBizObjType(TpAuditBizObjectTypeEnum.ORDER_CHANGE_APPLY.getType()); + queryDetailDTO.setAuditStatuses(Arrays.asList(TpAuditStatusEnum.WAITING_APPROVED.getType())); + TpProdAuditVO auditVO = tpAuditClient.getLatestAuditDetail(queryDetailDTO); + Assert.notNull(auditVO, "查询最近一条有效的审核单失败"); + orderAuditConfirmContext.setTpProdAuditVO(auditVO); + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmReceiveOrderNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmReceiveOrderNode.java new file mode 100644 index 0000000..edd0363 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmReceiveOrderNode.java @@ -0,0 +1,86 @@ +package com.deepinnet.tptradeprod.biz.service.flow.orderconfirm; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.audit.TpAuditStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderAuditConfirmContext; +import com.deepinnet.tptradeprod.common.dto.TpProdDispatchOrderReceivedDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderAuditConfirmDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderDispatchDetailDTO; +import com.deepinnet.tptradeprod.common.service.facade.TpOrderDispatchAcceptanceFacade; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDispatchDetailVO; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; + +/** + *

+ * 订单审核确认-业务接单节点 + *

+ * + * @author xiehuaqiao + * @since 2023/11/20 + */ + +@LiteflowComponent(value = "orderConfirmReceiveOrderNode", name = "订单审核确认-业务接单节点") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +@RequiredArgsConstructor +public class TpOrderConfirmReceiveOrderNode { + + + private final TpOrderDispatchAcceptanceFacade dispatchAcceptanceFacade; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单确认审核"); + + TpOrderAuditConfirmContext orderAuditConfirmContext = bindCmp.getContextBean(TpOrderAuditConfirmContext.class); + LogUtil.info("审核单对应业务对象校验节点,入参为:{}", JSONUtil.toJsonStr(orderAuditConfirmContext)); + TpProdAuditVO tpProdAuditVO = orderAuditConfirmContext.getTpProdAuditVO(); + //审核单未审批通过,则不需要创建接单记录 + if (!StrUtil.equals(TpAuditStatusEnum.APPROVED_SUCCESS.getType(),tpProdAuditVO.getStatus())){ + return; + } + //查询是否有派单记录,若派单记录不存在,则不能创建接单记录 + TpProdOrderDispatchDetailDTO orderDispatchDetailDTO = new TpProdOrderDispatchDetailDTO(); + orderDispatchDetailDTO.setTenantId(orderAuditConfirmContext.getConfirmDTO().getTenantId()); + orderDispatchDetailDTO.setOriginalOrderNo(orderAuditConfirmContext.getConfirmDTO().getOriginalOrderNo()); + TpResult orderDispatchDetailResult = dispatchAcceptanceFacade.getOrderDispatchDetail(orderDispatchDetailDTO); + //若派单记录不存在,则不能创建接单记录 + if (orderDispatchDetailResult == null || orderDispatchDetailResult.getData() == null){ + return; + } + TpProdOrderDispatchDetailVO prodOrderDispatchVO = orderDispatchDetailResult.getData(); + //订单接单创建 + TpProdOrderAuditConfirmDTO confirmDTO = orderAuditConfirmContext.getConfirmDTO(); + TpProdDispatchOrderReceivedDTO dto = TpProdDispatchOrderReceivedDTO.builder() + .orderNo(confirmDTO.getOrderNo()) + .originalOrderNo(confirmDTO.getOriginalOrderNo()) + .dispatchNo(prodOrderDispatchVO.getDispatchNo()) + .receiverNo(confirmDTO.getOperatorNo()) + .receiverName(confirmDTO.getOperatorName()) + .receivedTime(System.currentTimeMillis()) + .orgNo(prodOrderDispatchVO.getTargetOrgNo()) + .orgName(prodOrderDispatchVO.getTargetOrgName()) + .tenantId(confirmDTO.getTenantId()) + .bizData(confirmDTO.getBizData()) + .build(); + TpResult result = dispatchAcceptanceFacade.receiveOrder(dto); + + if (!result.isSuccess()) { + LogUtil.error("调用订单接单创建接口失败,入参:{},原因:{}", JSONUtil.toJsonStr(dto), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + } + + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmUpdateApplyStatusNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmUpdateApplyStatusNode.java new file mode 100644 index 0000000..ef81534 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmUpdateApplyStatusNode.java @@ -0,0 +1,92 @@ +package com.deepinnet.tptradeprod.biz.service.flow.orderconfirm; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.audit.TpAuditStatusEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderChangeApplyStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderAuditConfirmContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderChangeApplyApprovedResultSubmitDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderChangeApplyStatusUpdateDTO; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderChangeApplyClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderChangeApplyDetailVO; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; + +import javax.annotation.Resource; + +/** + *

+ * 订单审核确认-订单申请单状态更新-无需减免手续费 + *

+ * + * @author xiehuaqiao + * @since 2023/11/20 + */ + +@LiteflowComponent(value = "orderConfirmUpdateApplyStatusNode", name = "订单审核确认-订单申请单状态更新") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +@RequiredArgsConstructor +public class TpOrderConfirmUpdateApplyStatusNode { + + @Resource + private final TpOrderChangeApplyClient tpOrderChangeApplyClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单审核确认-订单申请单状态更新"); + + TpOrderAuditConfirmContext orderAuditConfirmContext = bindCmp.getContextBean(TpOrderAuditConfirmContext.class); + LogUtil.info("订单审核确认-订单申请单状态更新,入参为:{}", JSONUtil.toJsonStr(orderAuditConfirmContext)); + //更新订单变更申请单状态 + TpProdOrderChangeApplyDetailVO orderChangeApplyVO = orderAuditConfirmContext.getOrderChangeApplyVO(); + if(orderChangeApplyVO == null){ + LogUtil.error("订单审核确认-订单申请单状态更新失败,原因:{}","订单变更对象为空"); + return; + } + TpProdAuditVO tpProdAuditVO = orderAuditConfirmContext.getTpProdAuditVO(); + //审核单为非最终状态,则不需要更新状态 + if (StrUtil.equals(TpAuditStatusEnum.WAITING_APPROVED.getType(),tpProdAuditVO.getStatus())){ + LogUtil.error("订单审核确认-订单申请单状态更新失败,原因:{},申请单号:{}","审核单状态不一致",tpProdAuditVO.getAuditNo()); + return; + } + TpProdOrderChangeApplyApprovedResultSubmitDTO approvedResultSubmitDTO = TpProdOrderChangeApplyApprovedResultSubmitDTO.builder() + .applyNo(orderChangeApplyVO.getApplyNo()) + .originalOrderNo(orderChangeApplyVO.getOriginalOrderNo()) + .originalApplyStatus(orderChangeApplyVO.getApplyStatus()) + .targetApplyStatus(buildTargetApplyStatus(tpProdAuditVO.getStatus())) + .approvedRemark(tpProdAuditVO.getRemark()) + .approvedTime(tpProdAuditVO.getAuditTime()) + .tenantId(orderChangeApplyVO.getTenantId()) + .build(); + Boolean result = tpOrderChangeApplyClient.submitApprovedResult(approvedResultSubmitDTO); + if (!result) { + LogUtil.error("调用推进订单变更申请单状态变化接口失败,入参:{}", JSONUtil.toJsonStr(approvedResultSubmitDTO)); + throw new TpException(TpTradeProdErrorCode.ORDER_CHANGE_APPLY_PUSH_STATUS_ERROR.getCode(), TpTradeProdErrorCode.ORDER_CHANGE_APPLY_PUSH_STATUS_ERROR.getDesc()); + } + orderChangeApplyVO.setApplyStatus(approvedResultSubmitDTO.getTargetApplyStatus()); + } + + private String buildTargetApplyStatus(String approvedStatus) { + TpAuditStatusEnum auditStatusEnum = TpAuditStatusEnum.getAuditStatusByType(approvedStatus); + String applyStatus = null; + switch (auditStatusEnum){ + case APPROVED_REJECT: applyStatus = TpOrderChangeApplyStatusEnum.APPROVED_REJECT.getType(); break; + case APPROVED_SUCCESS: applyStatus = TpOrderChangeApplyStatusEnum.APPROVED_SUCCESS.getType(); break; + case APPROVED_TIMEOUT: applyStatus = TpOrderChangeApplyStatusEnum.APPROVED_TIMEOUT.getType(); break; + + } + return applyStatus; + } + + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmUpdateApplyStatusRscNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmUpdateApplyStatusRscNode.java new file mode 100644 index 0000000..24a54dc --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmUpdateApplyStatusRscNode.java @@ -0,0 +1,82 @@ +package com.deepinnet.tptradeprod.biz.service.flow.orderconfirm; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.order.TpOrderChangeApplyStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderAuditConfirmContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderAuditConfirmDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderChangeApplySubmitRscApplyDTO; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderChangeApplyClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderChangeApplyDetailVO; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; + +import javax.annotation.Resource; + +/** + *

+ * 订单审核确认-减免手续费更新申请单状态 + *

+ * + * @author xiehuaqiao + * @since 2023/11/20 + */ + +@LiteflowComponent(value = "orderConfirmUpdateApplyStatusRscNode", name = "订单审核确认-减免手续费更新申请单状态") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +@RequiredArgsConstructor +public class TpOrderConfirmUpdateApplyStatusRscNode { + + @Resource + private final TpOrderChangeApplyClient tpOrderChangeApplyClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单审核确认-减免手续费更新申请单状态"); + + TpOrderAuditConfirmContext orderAuditConfirmContext = bindCmp.getContextBean(TpOrderAuditConfirmContext.class); + LogUtil.info("订单审核确认-减免手续费更新申请单状态,入参为:{}", JSONUtil.toJsonStr(orderAuditConfirmContext)); + //更新订单变更申请单状态 + TpProdOrderChangeApplyDetailVO orderChangeApplyVO = orderAuditConfirmContext.getOrderChangeApplyVO(); + if(orderChangeApplyVO == null){ + LogUtil.error("订单审核确认-减免手续费更新申请单状态,原因:{}","订单变更申请单对象为空"); + return; + } + + TpProdOrderAuditConfirmDTO confirmDTO = orderAuditConfirmContext.getConfirmDTO(); + + TpProdAuditVO tpProdAuditVO = orderAuditConfirmContext.getRscAuditVO(); + //全额退款审批单不存在,不能更新申请单状态 + if (tpProdAuditVO == null){ + LogUtil.error("订单审核确认-减免手续费更新申请单状态,原因:{},申请单号:{}","全额退款审批单不存在",orderChangeApplyVO.getApplyNo()); + return; + } + TpProdOrderChangeApplySubmitRscApplyDTO applyRscApplyDTO = TpProdOrderChangeApplySubmitRscApplyDTO.builder() + .applyNo(orderChangeApplyVO.getApplyNo()) + .originalOrderNo(orderChangeApplyVO.getOriginalOrderNo()) + .originalApplyStatus(orderChangeApplyVO.getApplyStatus()) + .targetApplyStatus(TpOrderChangeApplyStatusEnum.RSC_WAITING_APPROVED.getType()) + .rscApplyTime(DateUtil.current()) + .rscApplyType(confirmDTO.getReductionServiceChargeType()) + .rscApplyReason(confirmDTO.getReduceReason()) + .tenantId(orderChangeApplyVO.getTenantId()) + .build(); + Boolean result = tpOrderChangeApplyClient.submitReduceServiceChargeApply(applyRscApplyDTO); + if (!result) { + LogUtil.error("调用推进订单变更申请单状态变化接口失败,入参:{}", JSONUtil.toJsonStr(applyRscApplyDTO)); + throw new TpException(TpTradeProdErrorCode.ORDER_CHANGE_APPLY_PUSH_STATUS_ERROR.getCode(), TpTradeProdErrorCode.ORDER_CHANGE_APPLY_PUSH_STATUS_ERROR.getDesc()); + } + orderChangeApplyVO.setApplyStatus(applyRscApplyDTO.getTargetApplyStatus()); + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmUpdateAuditApprovedNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmUpdateAuditApprovedNode.java new file mode 100644 index 0000000..7aa0ea2 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderConfirmUpdateAuditApprovedNode.java @@ -0,0 +1,75 @@ +package com.deepinnet.tptradeprod.biz.service.flow.orderconfirm; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradeprod.biz.constants.TpTradeProdConstants; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderAuditConfirmContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderAuditConfirmDTO; +import com.deepinnet.tptradeprod.common.service.integration.client.TpAuditClient; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditConfirmDTO; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; + +import java.util.HashMap; +import java.util.Map; + +/** + *

+ * "订单审核确认-审核单结果保存节点 + *

+ * + * @author xiehuaqiao + * @since 2023/11/20 + */ + +@LiteflowComponent(value = "orderConfirmUpdateAuditApprovedNode", name = "订单审核确认-审核单结果保存节点") +@LiteflowRetry(retry = 3) +@LiteflowCmpDefine +@RequiredArgsConstructor +public class TpOrderConfirmUpdateAuditApprovedNode { + + private final TpAuditClient tpAuditClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单审核确认-审核单结果保存节点"); + + TpOrderAuditConfirmContext orderAuditConfirmContext = bindCmp.getContextBean(TpOrderAuditConfirmContext.class); + LogUtil.info("订单审核确认-审核单结果保存节点执行开始,入参为:{}", JSONUtil.toJsonStr(orderAuditConfirmContext)); + //更新审核结果 + TpProdOrderAuditConfirmDTO confirmDTO = orderAuditConfirmContext.getConfirmDTO(); + TpProdAuditVO tpAuditVO = orderAuditConfirmContext.getTpProdAuditVO(); + TpProdAuditConfirmDTO confirmAuditDTO = TpProdAuditConfirmDTO.builder() + .auditNo(tpAuditVO.getAuditNo()) + .status(confirmDTO.getAuditStatus()) + .remark(confirmDTO.getAuditResult()) + .auditTime(System.currentTimeMillis()) + .auditorNo(confirmDTO.getOperatorNo()) + .auditorName(confirmDTO.getOperatorName()) + .tenantId(confirmDTO.getTenantId()).build(); + + TpResult result = tpAuditClient.confirmAudit(confirmAuditDTO); + if (!result.isSuccess()) { + LogUtil.error("订单审核确认-审核单结果保存接口执行失败,入参:{},原因:{}", JSONUtil.toJsonStr(confirmAuditDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + tpAuditVO.setStatus(confirmAuditDTO.getStatus()); + tpAuditVO.setRemark(confirmAuditDTO.getRemark()); + tpAuditVO.setAuditTime(confirmAuditDTO.getAuditTime()); + tpAuditVO.setAuditorNo(confirmAuditDTO.getAuditorNo()); + tpAuditVO.setAuditorName(confirmAuditDTO.getAuditorName()); + //保存订单确认选择的数据 TODO 可以新建一张记录表 + Map bizData = tpAuditVO.getBizData() == null ? new HashMap<>(): tpAuditVO.getBizData(); + bizData.put(TpTradeProdConstants.ORDER_AUDIT_CONFIRM,JSONUtil.toJsonStr(confirmDTO)); + tpAuditVO.setBizData(bizData); + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderCreateConfirmAuditTimeOutNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderCreateConfirmAuditTimeOutNode.java new file mode 100644 index 0000000..814c768 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/TpOrderCreateConfirmAuditTimeOutNode.java @@ -0,0 +1,115 @@ +package com.deepinnet.tptradeprod.biz.service.flow.orderconfirm; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.order.TpOrderPushStatusDTO; +import com.deepinnet.tptradecore.common.enums.audit.TpAuditStatusEnum; +import com.deepinnet.tptradecore.common.enums.order.TpAuditOrChangePriceBizTypeEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderPushStatusEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderReductionServiceChargeTypeEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderAuditConfirmContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderAuditConfirmDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderQueryDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderAuditConfirmTypeEnum; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderChangeApplyDetailVO; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; + +/** + *

+ * 创建订单审核超时节点 + *

+ * + * @author xiehuaqiao + * @since 2023/11/20 + */ + +@LiteflowComponent(value = "createConfirmAuditTimeOutNode", name = "订单审核确认-超时未确认推进订单状态") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +@RequiredArgsConstructor +public class TpOrderCreateConfirmAuditTimeOutNode { + + private final TpOrderClient tpOrderClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单审核确认-超时未确认推进订单状态"); + + TpOrderAuditConfirmContext orderAuditConfirmContext = bindCmp.getContextBean(TpOrderAuditConfirmContext.class); + LogUtil.info("订单确认审核-订单支付方式和业务员修改节点,入参为:{}", JSONUtil.toJsonStr(orderAuditConfirmContext)); + + TpProdAuditVO tpProdAuditVO = orderAuditConfirmContext.getTpProdAuditVO(); + //审核单为非最终状态,则不需要更新状态 + if (StrUtil.equals(TpAuditStatusEnum.WAITING_APPROVED.getType(),tpProdAuditVO.getStatus())){ + return; + } + TpProdOrderChangeApplyDetailVO orderChangeApplyVO = orderAuditConfirmContext.getOrderChangeApplyVO(); + if(orderChangeApplyVO == null){ + return; + } + + TpProdOrderAuditConfirmDTO confirmDTO = orderAuditConfirmContext.getConfirmDTO(); + + TpProdOrderDetailVO orderDetail = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .originalOrderNo(confirmDTO.getOriginalOrderNo()) + .tenantId(confirmDTO.getTenantId()).build()); + + tpOrderClient.pushOrderStatus(TpOrderPushStatusDTO.builder() + .orderNo(orderDetail.getOrderNo()) + .tenantId(confirmDTO.getTenantId()) + .tpOrderPushStatusEnum(TpOrderPushStatusEnum.ORDER_TIMEOUT_CONFIRM).build()); + + } + + private Boolean buildReduceServiceChargeType(Integer orderAuditConfirmType, String reductionServiceChargeType) { + + TpOrderAuditConfirmTypeEnum confirmTypeEnum = TpOrderAuditConfirmTypeEnum.getTpOrderAuditConfirmType(orderAuditConfirmType); + if(StrUtil.isEmpty(reductionServiceChargeType)){ + return Boolean.FALSE; + } + Boolean reduceServiceChargeFlag = Boolean.FALSE; + switch (confirmTypeEnum) { + case ORDER_CANCEL: + reduceServiceChargeFlag = TpOrderReductionServiceChargeTypeEnum.FULL_REDUCTION.getBizType().equalsIgnoreCase(reductionServiceChargeType); + break; + } + return reduceServiceChargeFlag; + } + + private String buildBizType(Integer orderAuditConfirmType) { + + TpOrderAuditConfirmTypeEnum confirmTypeEnum = TpOrderAuditConfirmTypeEnum.getTpOrderAuditConfirmType(orderAuditConfirmType); + + String priceBizType = null; + switch (confirmTypeEnum){ + case ORDER_CREATE: priceBizType = TpAuditOrChangePriceBizTypeEnum.CONFIRM_ORDER.getBizType(); break; + case ORDER_CHANGE: priceBizType = TpAuditOrChangePriceBizTypeEnum.CHANGE_ORDER.getBizType(); break; + case ORDER_CANCEL: priceBizType = TpAuditOrChangePriceBizTypeEnum.CANCEL_ORDER.getBizType(); break; + } + return priceBizType; + + } + + private Boolean buildAuditStatus(String status) { + TpAuditStatusEnum orderStatusEnum = TpAuditStatusEnum.getAuditStatusByType(status); + Boolean auditStatusFlag = Boolean.FALSE; + switch (orderStatusEnum){ + case APPROVED_REJECT: auditStatusFlag = Boolean.FALSE; break; + case APPROVED_TIMEOUT: auditStatusFlag = Boolean.FALSE; break; + case APPROVED_SUCCESS: auditStatusFlag = Boolean.TRUE; break; + } + return auditStatusFlag; + } + + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmApprovedSwitchNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmApprovedSwitchNode.java new file mode 100644 index 0000000..abcc3b1 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmApprovedSwitchNode.java @@ -0,0 +1,108 @@ +package com.deepinnet.tptradeprod.biz.service.flow.orderconfirm.servicechargereduce; + +import cn.hutool.core.lang.Assert; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.audit.TpAuditStatusEnum; +import com.deepinnet.tptradecore.common.enums.audit.TpAuditTypeEnum; +import com.deepinnet.tptradeprod.biz.service.flow.constants.LiteFlowConstant; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderServiceChargeReduceContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderServiceChargeReduceConfirmDTO; +import com.deepinnet.tptradeprod.common.service.integration.client.TpAuditClient; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditQueryDetailDTO; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import com.yomahub.liteflow.enums.NodeTypeEnum; +import lombok.RequiredArgsConstructor; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Resource; + +/** + *

+ * 订单服务费减免审核确认节点-审核确认流程切换 + * 1 全额退款审批失败:审核单更新审批结果->发送审批结果通知->保存派车队信息->保存改价记录->创建接单记录->保存支付模式信息->订单变更申请单更新审核结果->发送通知 -> 更新订单状态和支付模式 + * 2 全额退款审批通过:审核单更新审批结果->发送审批结果通知->保存派车队信息->保存改价记录->创建接单记录->保存支付模式信息->订单变更申请单更新审核结果->发送通知 -> 更新订单状态和支付模式 + *

+ * + * @author xiehuaqiao + * @since 2023/11/20 + */ + +@LiteflowComponent(value = "rscConfirmApprovedSwitchNode", name = "订单服务费减免审核确认流程-审核确认流程切换") +@LiteflowRetry(retry = 3) +@LiteflowCmpDefine(value = NodeTypeEnum.SWITCH) +@RequiredArgsConstructor +public class TpRscConfirmApprovedSwitchNode { + + @Resource + private TpAuditClient tpAuditClient; + @LiteflowMethod(LiteFlowMethodEnum.PROCESS_SWITCH) + public String process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单服务费减免审核确认流程-审核确认流程切换"); + + TpOrderServiceChargeReduceContext serviceChargeReduceContext = bindCmp.getContextBean(TpOrderServiceChargeReduceContext.class); + LogUtil.info("订单服务费减免审核确认流程-审核确认流程切换,入参为:{}", JSONUtil.toJsonStr(serviceChargeReduceContext)); + TpProdOrderServiceChargeReduceConfirmDTO confirmDTO = serviceChargeReduceContext.getReduceDTO(); + if(serviceChargeReduceContext.getTpProdAuditVO() == null) { + serviceChargeReduceContext.setTpProdAuditVO(getTpProdAuditVO(confirmDTO)); + } + TpAuditStatusEnum auditStatusEnum = TpAuditStatusEnum.getAuditStatusByType(confirmDTO.getAuditStatus()); + TpAuditTypeEnum auditTypeEnum = TpAuditTypeEnum.getByType(serviceChargeReduceContext.getTpProdAuditVO().getType()); + return getFlowNameByAuditTypeAndAuditStatus(auditTypeEnum, auditStatusEnum); + } + + @NotNull + private TpProdAuditVO getTpProdAuditVO(TpProdOrderServiceChargeReduceConfirmDTO confirmDTO) { + TpProdAuditQueryDetailDTO queryDetailDTO = TpProdAuditQueryDetailDTO.builder().build(); + queryDetailDTO.setTenantId(confirmDTO.getTenantId()); + queryDetailDTO.setAuditNo(confirmDTO.getAuditNo()); + TpProdAuditVO auditVO = tpAuditClient.getAuditDetail(queryDetailDTO); + Assert.notNull(auditVO, "该审核单不存在"); + Assert.isTrue(TpAuditStatusEnum.WAITING_APPROVED.getType().equals(auditVO.getStatus()), "该审核单已审核完成,无需审核,请刷新页面查询最新内容"); + return auditVO; + } + + private String getFlowNameByAuditTypeAndAuditStatus(TpAuditTypeEnum auditTypeEnum, TpAuditStatusEnum auditStatusEnum) { + + + String flowName = null; + //订单取消减免手续费流程 + if (auditTypeEnum == TpAuditTypeEnum.CHARTER_BUS_ORDER_CANCEL_RSC_APPROVAL) { + switch (auditStatusEnum) { + case APPROVED_REJECT: + flowName = LiteFlowConstant.ORDER_CANCEL_SERVICE_CHARGE_REDUCE_APPROVED_REJECT_FLOW; + break; + case APPROVED_SUCCESS: + flowName = LiteFlowConstant.ORDER_CANCEL_SERVICE_CHARGE_REDUCE_APPROVED_TIMEOUT_FLOW; + break; + case APPROVED_TIMEOUT: + flowName = LiteFlowConstant.ORDER_CANCEL_SERVICE_CHARGE_REDUCE_APPROVED_SUCCESS_FLOW; + break; + } + return flowName; + } + //订单变更减免手续费流程 + if (auditTypeEnum == TpAuditTypeEnum.CHARTER_BUS_ORDER_CHANGE_RSC_APPROVAL) { + switch (auditStatusEnum) { + case APPROVED_REJECT: + flowName = LiteFlowConstant.ORDER_CHANGE_SERVICE_CHARGE_REDUCE_APPROVED_REJECT_FLOW; + break; + case APPROVED_SUCCESS: + flowName = LiteFlowConstant.ORDER_CHANGE_SERVICE_CHARGE_REDUCE_APPROVED_TIMEOUT_FLOW; + break; + case APPROVED_TIMEOUT: + flowName = LiteFlowConstant.ORDER_CHANGE_SERVICE_CHARGE_REDUCE_APPROVED_SUCCESS_FLOW; + break; + } + return flowName; + } + return flowName; + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmBizTypeSwitchNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmBizTypeSwitchNode.java new file mode 100644 index 0000000..f23bcf6 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmBizTypeSwitchNode.java @@ -0,0 +1,69 @@ +package com.deepinnet.tptradeprod.biz.service.flow.orderconfirm.servicechargereduce; + +import cn.hutool.core.lang.Assert; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.audit.TpAuditStatusEnum; +import com.deepinnet.tptradecore.common.enums.audit.TpAuditTypeEnum; +import com.deepinnet.tptradeprod.biz.service.flow.constants.LiteFlowConstant; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderServiceChargeReduceContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderServiceChargeReduceConfirmDTO; +import com.deepinnet.tptradeprod.common.service.integration.client.TpAuditClient; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditQueryDetailDTO; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import com.yomahub.liteflow.enums.NodeTypeEnum; +import lombok.RequiredArgsConstructor; + +import javax.annotation.Resource; + +/** + *

+ * 订单服务费减免审核确认流程-审核确认业务流程切换节点 + * 1 订单变更减免服务审核确认流程 + * 2 订单取消减免服务审核确认流程 + *

+ * + * @author xiehuaqiao + * @since 2023/11/20 + */ + +@LiteflowComponent(value = "rscConfirmBizTypeSwitchNode", name = "订单服务费减免审核确认流程-审核确认业务流程切换节点") +@LiteflowRetry(retry = 3) +@LiteflowCmpDefine(value = NodeTypeEnum.SWITCH) +@RequiredArgsConstructor +public class TpRscConfirmBizTypeSwitchNode { + + @Resource + private TpAuditClient tpAuditClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS_SWITCH) + public String process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 订单服务费减免审核确认流程-审核确认流程切换"); + + TpOrderServiceChargeReduceContext serviceChargeReduceContext = bindCmp.getContextBean(TpOrderServiceChargeReduceContext.class); + LogUtil.info("订单服务费减免审核确认流程-审核确认流程切换,入参为:{}", JSONUtil.toJsonStr(serviceChargeReduceContext)); + TpProdOrderServiceChargeReduceConfirmDTO confirmDTO = serviceChargeReduceContext.getReduceDTO(); + + TpProdAuditQueryDetailDTO queryDetailDTO = TpProdAuditQueryDetailDTO.builder().build(); + queryDetailDTO.setTenantId(confirmDTO.getTenantId()); + queryDetailDTO.setAuditNo(confirmDTO.getAuditNo()); + TpProdAuditVO auditVO = tpAuditClient.getAuditDetail(queryDetailDTO); + Assert.notNull(auditVO, "该审核单不存在"); + Assert.isTrue(TpAuditStatusEnum.WAITING_APPROVED.getType().equals(auditVO.getStatus()), "该审核单已审核完成,无需审核,请刷新页面查询最新内容"); + serviceChargeReduceContext.setTpProdAuditVO(auditVO); + TpAuditTypeEnum auditTypeEnum = TpAuditTypeEnum.getByType(auditVO.getType()); + String flowName = null; + switch (auditTypeEnum){ + case CHARTER_BUS_ORDER_CANCEL_RSC_APPROVAL: flowName = LiteFlowConstant.ORDER_CANCEL_SERVICE_CHARGE_REDUCE_CONFIRM_FLOW; break; + case CHARTER_BUS_ORDER_CHANGE_RSC_APPROVAL: flowName = LiteFlowConstant.ORDER_CHANGE_SERVICE_CHARGE_REDUCE_CONFIRM_FLOW; break; + } + return flowName; + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmCheckNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmCheckNode.java new file mode 100644 index 0000000..7044a0c --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmCheckNode.java @@ -0,0 +1,72 @@ +package com.deepinnet.tptradeprod.biz.service.flow.orderconfirm.servicechargereduce; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.audit.TpAuditBizObjectTypeEnum; +import com.deepinnet.tptradecore.common.enums.audit.TpAuditStatusEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderChangeApplyStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderServiceChargeReduceContext; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderChangeApplyDetailVO; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import com.yomahub.liteflow.enums.NodeTypeEnum; + +/** + * 服务费减免审核确认-审核条件校验节点 + * @author xiehuaqiao + * @create 2023/11/21 14:27 + * @Description + */ + +@LiteflowComponent(value = "rscConfirmCheckNode", name = "服务费减免审核确认-审核条件校验节点") +@LiteflowCmpDefine(value = NodeTypeEnum.IF) +public class TpRscConfirmCheckNode { + + + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS_IF) + public boolean process(NodeComponent bindCmp) { + TpOrderServiceChargeReduceContext reduceContext = bindCmp.getContextBean(TpOrderServiceChargeReduceContext.class); + LogUtil.info("服务费减免审核确认-审核条件校验节点,入参为:{}", JSONUtil.toJsonStr(reduceContext)); + TpProdAuditVO auditVO = reduceContext.getTpProdAuditVO(); + //1.审核单非待审核状态,不能再进行审核 + if (!StrUtil.equals(TpAuditStatusEnum.WAITING_APPROVED.getType(),auditVO.getStatus())){ + return Boolean.FALSE; + } + //2. + TpAuditBizObjectTypeEnum bizObjectTypeEnum = TpAuditBizObjectTypeEnum.getBizObjectByType(auditVO.getBizObjType()); + Boolean processFlag = Boolean.FALSE; + switch (bizObjectTypeEnum){ + case ORDER_CHANGE_APPLY: processFlag = checkOrderChangedApply(auditVO,reduceContext.getOrderChangeApplyVO()); break; + } + return processFlag; + + } + + private Boolean checkOrderChangedApply(TpProdAuditVO auditVO, TpProdOrderChangeApplyDetailVO orderChangeApplyVO) { + + // 校验订单申请单是否存在 + if (orderChangeApplyVO == null ) { + LogUtil.error("服务费减免审核确认失败,原因:该订单申请单不存在,申请单号:{}", auditVO.getBizObjectNo()); + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_AUDIT_ERROR); + } + // 校验订单申请单状态是否是待审核状态 + TpOrderChangeApplyStatusEnum applyStatusEnum = TpOrderChangeApplyStatusEnum.getApplyStatusByType(orderChangeApplyVO.getApplyStatus()); + + if (TpOrderChangeApplyStatusEnum.WAITING_APPROVED == applyStatusEnum + || TpOrderChangeApplyStatusEnum.RSC_WAITING_APPROVED == applyStatusEnum + || TpOrderChangeApplyStatusEnum.SINGLE_RSC_WAITING_APPROVED == applyStatusEnum + || TpOrderChangeApplyStatusEnum.FULL_RSC_WAITING_APPROVED == applyStatusEnum ) { + return Boolean.TRUE; + } + LogUtil.error("服务费减免审核确认失败,原因:该订单申请单已审核通过,申请单号:{}", auditVO.getBizObjectNo()); + return Boolean.FALSE; + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmDispatchFleetNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmDispatchFleetNode.java new file mode 100644 index 0000000..5a6795e --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmDispatchFleetNode.java @@ -0,0 +1,91 @@ +package com.deepinnet.tptradeprod.biz.service.flow.orderconfirm.servicechargereduce; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.audit.TpAuditStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderServiceChargeReduceContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderAuditConfirmDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderDispatchDetailDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderDispatchFleetCreatedDTO; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderDispatchClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDispatchDetailVO; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; + +/** + *

+ * 服务费减免审核确认-指派车队节点 + *

+ * + * @author xiehuaqiao + * @since 2023/11/20 + */ + +@LiteflowComponent(value = "rscConfirmDispatchFleetNode", name = "服务费减免审核确认-指派车队节点") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +@RequiredArgsConstructor +public class TpRscConfirmDispatchFleetNode { + + private final TpOrderDispatchClient tpOrderDispatchClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 服务费减免审核确认-指派车队节点"); + + TpOrderServiceChargeReduceContext reduceContext = bindCmp.getContextBean(TpOrderServiceChargeReduceContext.class); + LogUtil.info("服务费减免审核确认-指派车队节点,入参为:{}", JSONUtil.toJsonStr(reduceContext)); + TpProdAuditVO tpProdAuditVO = reduceContext.getTpProdAuditVO(); + //审核单为非最终状态,则不需要更新状态 + if (StrUtil.equals(TpAuditStatusEnum.WAITING_APPROVED.getType(),tpProdAuditVO.getStatus())){ + return; + } + //指定派车车队 + TpProdOrderAuditConfirmDTO confirmDTO = reduceContext.getConfirmDTO(); + if(confirmDTO == null || StrUtil.isEmpty(confirmDTO.getTargetFleetCode())){ + LogUtil.info("服务费减免审核确认-指派车队节点:无车队信息,不需要派车"); + return; + } + TpProdOrderDispatchFleetCreatedDTO dto = TpProdOrderDispatchFleetCreatedDTO.builder() + .dispatchNo(getDispatchNoByOrderNo(confirmDTO.getTenantId(),confirmDTO.getOriginalOrderNo())) + .orderNo(confirmDTO.getOrderNo()) + .originalOrderNo(confirmDTO.getOriginalOrderNo()) + .targetFleetNo(confirmDTO.getTargetFleetCode()) + .targetFleetName(confirmDTO.getTargetFleetName()) + .goJoinFleets(confirmDTO.getGoJoinFleets()) + .backJoinFleets(confirmDTO.getBackJoinFleets()) + .tenantId(confirmDTO.getTenantId()) + .operatorNo(confirmDTO.getOperatorNo()) + .operatorName(confirmDTO.getOperatorName()) + .build(); + Boolean result = tpOrderDispatchClient.dispatchFleet(dto); + + if (!result) { + LogUtil.error("调用订单车队分配创建接口失败,入参:{}", JSONUtil.toJsonStr(dto)); + throw new TpTradeProdException(TpTradeProdErrorCode.INTERNAL_SERVER_ERROR); + } + } + + private String getDispatchNoByOrderNo(String tenantId,String orderNo) { + TpProdOrderDispatchDetailDTO tpOrderDispatchDetailDTO = new TpProdOrderDispatchDetailDTO(); + tpOrderDispatchDetailDTO.setOrderNo(orderNo); + tpOrderDispatchDetailDTO.setTenantId(tenantId); + + TpProdOrderDispatchDetailVO tpProdOrderDispatchDetailVO = tpOrderDispatchClient.getOrderDispatchDetail(tpOrderDispatchDetailDTO); + if(tpProdOrderDispatchDetailVO !=null){ + return tpProdOrderDispatchDetailVO.getDispatchNo(); + } + return null; + } + + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmQueryApplyDetailNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmQueryApplyDetailNode.java new file mode 100644 index 0000000..a0573a1 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmQueryApplyDetailNode.java @@ -0,0 +1,55 @@ +package com.deepinnet.tptradeprod.biz.service.flow.orderconfirm.servicechargereduce; + +import cn.hutool.core.lang.Assert; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.order.TpOrderChangeApplyStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderServiceChargeReduceContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderChangeApplyDetailDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderServiceChargeReduceConfirmDTO; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderChangeApplyClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderChangeApplyDetailVO; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; + +import javax.annotation.Resource; +import java.util.Arrays; + +/** + * "服务费减免审核确认-订单变更申请单查询节点 + * @author xiehuaqiao + * @create 2023/11/20 14:27 + * @Description + */ + +@LiteflowComponent(value = "rscConfirmQueryApplyDetailNode", name = "服务费减免审核确认-订单变更申请单查询节点") +@LiteflowCmpDefine +public class TpRscConfirmQueryApplyDetailNode { + + @Resource + private TpOrderChangeApplyClient tpOrderChangeApplyClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 服务费减免审核确认-订单变更申请单查询节点"); + + TpOrderServiceChargeReduceContext reduceContext = bindCmp.getContextBean(TpOrderServiceChargeReduceContext.class); + LogUtil.info("服务费减免审核确认-订单变更申请单查询节点,入参为:{}", JSONUtil.toJsonStr(reduceContext)); + TpProdOrderServiceChargeReduceConfirmDTO reduceDTO = reduceContext.getReduceDTO(); + TpProdAuditVO tpProdAuditVO = reduceContext.getTpProdAuditVO(); + Assert.notNull(tpProdAuditVO, "审核单不存在"); + TpProdOrderChangeApplyDetailDTO queryDTO = TpProdOrderChangeApplyDetailDTO.builder().build(); + queryDTO.setApplyNo(tpProdAuditVO.getBizObjectNo()); + queryDTO.setApplyStatus(Arrays.asList(TpOrderChangeApplyStatusEnum.WAITING_APPROVED.getType(), + TpOrderChangeApplyStatusEnum.RSC_WAITING_APPROVED.getType(),TpOrderChangeApplyStatusEnum.SINGLE_RSC_WAITING_APPROVED.getType(), + TpOrderChangeApplyStatusEnum.APPLY_CREATE.getType(), TpOrderChangeApplyStatusEnum.FULL_RSC_WAITING_APPROVED.getType())); + queryDTO.setTenantId(reduceDTO.getTenantId()); + TpProdOrderChangeApplyDetailVO orderChangedApplyDetail = tpOrderChangeApplyClient.getOrderChangedApplyDetail(queryDTO); + Assert.notNull(orderChangedApplyDetail, "变更申请单不存在"); + reduceContext.setOrderChangeApplyVO(orderChangedApplyDetail); + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmQueryAuditDetailNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmQueryAuditDetailNode.java new file mode 100644 index 0000000..e20cdb9 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmQueryAuditDetailNode.java @@ -0,0 +1,57 @@ +package com.deepinnet.tptradeprod.biz.service.flow.orderconfirm.servicechargereduce; + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.map.MapUtil; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.audit.TpAuditStatusEnum; +import com.deepinnet.tptradeprod.biz.constants.TpTradeProdConstants; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderServiceChargeReduceContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderAuditConfirmDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderServiceChargeReduceConfirmDTO; +import com.deepinnet.tptradeprod.common.service.integration.client.TpAuditClient; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditQueryDetailDTO; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; + +import javax.annotation.Resource; +import java.util.Arrays; + +/** + * 服务费减免审核确认-审核单详情查询节点 + * @author xiehuaqiao + * @create 2023/11/20 14:27 + * @Description + */ + +@LiteflowComponent(value = "rscConfirmQueryAuditDetailNode", name = "服务费减免审核确认-审核单详情查询节点") +@LiteflowCmpDefine +public class TpRscConfirmQueryAuditDetailNode { + @Resource + private TpAuditClient tpAuditClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 服务费减免审核确认-审核单详情查询节点"); + TpOrderServiceChargeReduceContext reduceContext = bindCmp.getContextBean(TpOrderServiceChargeReduceContext.class); + LogUtil.info("服务费减免审核确认-审核单详情查询节点,入参为:{}", JSONUtil.toJsonStr(reduceContext)); + TpProdOrderServiceChargeReduceConfirmDTO reduceDTO = reduceContext.getReduceDTO(); + TpProdAuditQueryDetailDTO queryDetailDTO = TpProdAuditQueryDetailDTO.builder().build(); + queryDetailDTO.setTenantId(reduceDTO.getTenantId()); + queryDetailDTO.setAuditNo(reduceDTO.getAuditNo()); + queryDetailDTO.setAuditStatuses(Arrays.asList(TpAuditStatusEnum.WAITING_APPROVED.getType())); + TpProdAuditVO result = tpAuditClient.getAuditDetail(queryDetailDTO); + Assert.notNull(result, "审核单不存在或者已经审核完成"); + reduceContext.setTpProdAuditVO(result); + //格式化业务员的选择条件 + if (MapUtil.isNotEmpty(result.getBizData()) + &&result.getBizData().get(TpTradeProdConstants.ORDER_AUDIT_CONFIRM) != null) { + String orderAuditConfirmParams = result.getBizData().get(TpTradeProdConstants.ORDER_AUDIT_CONFIRM).toString(); + reduceContext.setConfirmDTO(JSONUtil.toBean(orderAuditConfirmParams, TpProdOrderAuditConfirmDTO.class)); + } + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmSaveAuditApprovedResultNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmSaveAuditApprovedResultNode.java new file mode 100644 index 0000000..fefef85 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmSaveAuditApprovedResultNode.java @@ -0,0 +1,90 @@ +package com.deepinnet.tptradeprod.biz.service.flow.orderconfirm.servicechargereduce; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.audit.TpAuditStatusEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderReductionServiceChargeTypeEnum; +import com.deepinnet.tptradeprod.biz.constants.TpTradeProdConstants; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderServiceChargeReduceContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderAuditConfirmDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderServiceChargeReduceConfirmDTO; +import com.deepinnet.tptradeprod.common.service.integration.client.TpAuditClient; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditConfirmDTO; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; + +import java.util.HashMap; +import java.util.Map; + +/** + *

+ * 服务费减免审核确认-审核结果保存节点 + *

+ * + * @author xiehuaqiao + * @since 2023/11/20 + */ + +@LiteflowComponent(value = "rscConfirmSaveAuditApprovedResultNode", name = "服务费减免审核确认-审核结果保存节点") +@LiteflowRetry(retry = 3) +@LiteflowCmpDefine +@RequiredArgsConstructor +public class TpRscConfirmSaveAuditApprovedResultNode { + + private final TpAuditClient tpAuditClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 服务费减免审核确认-审核结果保存节点"); + + TpOrderServiceChargeReduceContext reduceContext = bindCmp.getContextBean(TpOrderServiceChargeReduceContext.class); + LogUtil.info("服务费减免审核确认-审核结果保存节点,入参为:{}", JSONUtil.toJsonStr(reduceContext)); + TpProdOrderServiceChargeReduceConfirmDTO reduceDTO = reduceContext.getReduceDTO(); + //更新审核结果 + TpProdAuditVO tpAuditVO = reduceContext.getTpProdAuditVO(); + TpProdAuditConfirmDTO confirmAuditDTO = TpProdAuditConfirmDTO.builder() + .auditNo(tpAuditVO.getAuditNo()) + .status(reduceDTO.getAuditStatus()) + .remark(reduceDTO.getAuditResult()) + .auditTime(System.currentTimeMillis()) + .auditorNo(reduceDTO.getOperatorNo()) + .auditorName(reduceDTO.getOperatorName()) + .tenantId(reduceDTO.getTenantId()).build(); + TpResult result = tpAuditClient.confirmAudit(confirmAuditDTO); + if (!result.isSuccess()) { + LogUtil.error("服务费减免审核确认-审核结果保存节点确认接口失败,入参:{},原因:{}", JSONUtil.toJsonStr(confirmAuditDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + tpAuditVO.setStatus(confirmAuditDTO.getStatus()); + tpAuditVO.setRemark(confirmAuditDTO.getRemark()); + tpAuditVO.setAuditTime(confirmAuditDTO.getAuditTime()); + tpAuditVO.setAuditorNo(confirmAuditDTO.getAuditorNo()); + tpAuditVO.setAuditorName(confirmAuditDTO.getAuditorName()); + //如果审核拒绝或者超时拒绝,则需要将全额免手续费改成不免手续费 + TpProdOrderAuditConfirmDTO confirmDTO = reduceContext.getConfirmDTO(); + if (confirmDTO != null && isApprovedReject(confirmAuditDTO.getStatus())) { + confirmDTO.setReductionServiceChargeType(TpOrderReductionServiceChargeTypeEnum.NON_REDUCTION.getBizType()); + } + Map bizData = tpAuditVO.getBizData() == null ? new HashMap<>() : tpAuditVO.getBizData(); + bizData.put(TpTradeProdConstants.ORDER_AUDIT_CONFIRM, reduceDTO); + tpAuditVO.setBizData(bizData); + + } + + private boolean isApprovedReject(String status) { + TpAuditStatusEnum tpAuditStatusEnum = TpAuditStatusEnum.getAuditStatusByType(status); + if(tpAuditStatusEnum == TpAuditStatusEnum.APPROVED_SUCCESS){ + return false; + } + return true; + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmSubmitApplyApprovedResultNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmSubmitApplyApprovedResultNode.java new file mode 100644 index 0000000..2c8ac28 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmSubmitApplyApprovedResultNode.java @@ -0,0 +1,99 @@ +package com.deepinnet.tptradeprod.biz.service.flow.orderconfirm.servicechargereduce; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.audit.TpAuditStatusEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderChangeApplyStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderServiceChargeReduceContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderChangeApplyApprovedResultSubmitDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderServiceChargeReduceConfirmDTO; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderChangeApplyClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderChangeApplyDetailVO; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; + +import javax.annotation.Resource; + +/** + *

+ * 服务费减免审核确认-提交审核结果 + *

+ * + * @author xiehuaqiao + * @since 2023/11/20 + */ + +@LiteflowComponent(value = "rscConfirmSubmitApplyApprovedResultNode", name = "服务费减免审核确认-订单申请单状态更新") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +@RequiredArgsConstructor +public class TpRscConfirmSubmitApplyApprovedResultNode { + + @Resource + private final TpOrderChangeApplyClient tpOrderChangeApplyClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 服务费减免审核确认-订单申请单状态更新"); + + TpOrderServiceChargeReduceContext serviceChargeReduceContext = bindCmp.getContextBean(TpOrderServiceChargeReduceContext.class); + LogUtil.info("服务费减免审核确认-订单申请单状态更新,入参为:{}", JSONUtil.toJsonStr(serviceChargeReduceContext)); + TpProdOrderServiceChargeReduceConfirmDTO confirmDTO = serviceChargeReduceContext.getReduceDTO(); + //更新订单变更申请单状态 + TpProdOrderChangeApplyDetailVO orderChangeApplyVO = serviceChargeReduceContext.getOrderChangeApplyVO(); + if (orderChangeApplyVO == null) { + return; + } + TpProdAuditVO tpProdAuditVO = serviceChargeReduceContext.getTpProdAuditVO(); + //审核单为非最终状态,则不需要更新状态 + if (StrUtil.equals(TpAuditStatusEnum.WAITING_APPROVED.getType(), tpProdAuditVO.getStatus())) { + LogUtil.info("服务费减免审核确认-订单申请单状态更新失败,原因:{}", "对应的审核单为待审核状态"); + return; + } + TpProdOrderChangeApplyApprovedResultSubmitDTO approvedSubmitDTO = TpProdOrderChangeApplyApprovedResultSubmitDTO.builder() + .applyNo(orderChangeApplyVO.getApplyNo()) + .originalOrderNo(orderChangeApplyVO.getOriginalOrderNo()) + .originalApplyStatus(orderChangeApplyVO.getApplyStatus()) + .targetApplyStatus(buildTargetApplyStatus(tpProdAuditVO.getStatus())) + .approvedTime(DateUtil.current()) + .approvedRemark(tpProdAuditVO.getRemark()) + .tenantId(orderChangeApplyVO.getTenantId()) + .build(); + Boolean result = tpOrderChangeApplyClient.submitApprovedResult(approvedSubmitDTO); + if (!result) { + LogUtil.error("调用推进订单变更申请单状态变化接口失败,入参:{}", JSONUtil.toJsonStr(approvedSubmitDTO)); + throw new TpException(TpTradeProdErrorCode.ORDER_CHANGE_APPLY_PUSH_STATUS_ERROR.getCode(), TpTradeProdErrorCode.ORDER_CHANGE_APPLY_PUSH_STATUS_ERROR.getDesc()); + } + orderChangeApplyVO.setApplyStatus(approvedSubmitDTO.getTargetApplyStatus()); + } + + private String buildTargetApplyStatus(String approvedStatus) { + TpAuditStatusEnum auditStatusEnum = TpAuditStatusEnum.getAuditStatusByType(approvedStatus); + String applyStatus = null; + switch (auditStatusEnum) { + case APPROVED_REJECT: + applyStatus = TpOrderChangeApplyStatusEnum.APPROVED_SUCCESS.getType(); + break; + case APPROVED_SUCCESS: + applyStatus = TpOrderChangeApplyStatusEnum.APPROVED_SUCCESS.getType(); + break; + case APPROVED_TIMEOUT: + applyStatus = TpOrderChangeApplyStatusEnum.APPROVED_SUCCESS.getType(); + break; + + } + return applyStatus; + } + + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmUpdatePriceAndPayModeNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmUpdatePriceAndPayModeNode.java new file mode 100644 index 0000000..904bd2b --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/orderconfirm/servicechargereduce/TpRscConfirmUpdatePriceAndPayModeNode.java @@ -0,0 +1,144 @@ +package com.deepinnet.tptradeprod.biz.service.flow.orderconfirm.servicechargereduce; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.order.TpOrderChangePriceDTO; +import com.deepinnet.tptradecore.common.enums.audit.TpAuditStatusEnum; +import com.deepinnet.tptradecore.common.enums.order.TpAuditOrChangePriceBizTypeEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderChangeApplyStatusEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderReductionServiceChargeTypeEnum; +import com.deepinnet.tptradecore.common.enums.order.TpServiceChargeOperationTypeEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpOrderServiceChargeReduceContext; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderAuditConfirmDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderAuditConfirmTypeEnum; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderChangeApplyDetailVO; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditVO; +import com.deepinnet.tptradeprod.core.compoment.TpChangePriceAndPayModeComponent; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; + +/** + *

+ * 订单审核确认-订单支付方式和业务员改价节点 + *

+ * + * @author xiehuaqiao + * @since 2023/11/20 + */ + +@LiteflowComponent(value = "rscConfirmUpdatePriceAndPayModeNode", name = "服务费减免审核确认-订单支付方式和业务员改价节点") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +@RequiredArgsConstructor +public class TpRscConfirmUpdatePriceAndPayModeNode { + + private final TpChangePriceAndPayModeComponent changePriceAndPayModeComponent; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("---------------------------当前节点: 服务费减免审核确认-订单支付方式和业务员修改节点"); + + TpOrderServiceChargeReduceContext reduceContext = bindCmp.getContextBean(TpOrderServiceChargeReduceContext.class); + LogUtil.info("服务费减免审核确认-订单支付方式和业务员修改节点,入参为:{}", JSONUtil.toJsonStr(reduceContext)); + + TpProdAuditVO tpProdAuditVO = reduceContext.getTpProdAuditVO(); + //审核单为非最终状态,则不需要更新状态 + if (StrUtil.equals(TpAuditStatusEnum.WAITING_APPROVED.getType(), tpProdAuditVO.getStatus())) { + return; + } + TpProdOrderChangeApplyDetailVO orderChangeApplyVO = reduceContext.getOrderChangeApplyVO(); + if (orderChangeApplyVO == null) { + return; + } + //用户提交内容信息 + TpOrderChangePriceDTO dto = new TpOrderChangePriceDTO(); + TpProdOrderAuditConfirmDTO confirmDTO = reduceContext.getConfirmDTO(); + if (confirmDTO != null) { + dto.setPayMode(confirmDTO.getChangedPayMode()); + dto.setChangeAmount(confirmDTO.getChangedFinalPrice()); + dto.setOperatorUser(confirmDTO.getOperatorNo()); + dto.setOperatorName(confirmDTO.getOperatorName()); + dto.setBizType(buildBizType(confirmDTO.getOrderAuditConfirmType())); + dto.setServiceChargeOperationType(buildReduceServiceChargeType(confirmDTO.getOrderAuditConfirmType(), confirmDTO.getReductionServiceChargeType())); + } + dto.setOriginalOrderNo(orderChangeApplyVO.getOriginalOrderNo()); + dto.setAuditStatus(buildAuditStatus(orderChangeApplyVO.getApplyStatus())); + dto.setTenantId(confirmDTO.getTenantId()); + changePriceAndPayModeComponent.execute(dto); + + } + + private String buildReduceServiceChargeType(Integer orderAuditConfirmType, String reductionServiceChargeType) { + + TpOrderAuditConfirmTypeEnum confirmTypeEnum = TpOrderAuditConfirmTypeEnum.getTpOrderAuditConfirmType(orderAuditConfirmType); + if(StrUtil.isEmpty(reductionServiceChargeType)){ + return null; + } + String reduceServiceChargeType = null; + switch (confirmTypeEnum) { + case ORDER_CANCEL: + reduceServiceChargeType = transferReduceServiceChargeType(reductionServiceChargeType); + break; + case ORDER_CHANGE: + reduceServiceChargeType = transferReduceServiceChargeType(reductionServiceChargeType); + break; + } + return reduceServiceChargeType; + } + + private String transferReduceServiceChargeType(String reductionServiceChargeType) { + if(TpOrderReductionServiceChargeTypeEnum.FULL_REDUCTION.getBizType().equalsIgnoreCase(reductionServiceChargeType)){ + return TpServiceChargeOperationTypeEnum.FREE_SERVICE_CHARGE.getBizType(); + } + if(TpOrderReductionServiceChargeTypeEnum.SINGLE_REDUCTION.getBizType().equalsIgnoreCase(reductionServiceChargeType)){ + return TpServiceChargeOperationTypeEnum.SINGLE_FREE_SERVICE_CHARGE.getBizType(); + } + return TpServiceChargeOperationTypeEnum.RULE_CAL_SERVICE_CHARGE.getBizType(); + } + + + private String buildBizType(Integer orderAuditConfirmType) { + + TpOrderAuditConfirmTypeEnum confirmTypeEnum = TpOrderAuditConfirmTypeEnum.getTpOrderAuditConfirmType(orderAuditConfirmType); + + String priceBizType = null; + switch (confirmTypeEnum) { + case ORDER_CREATE: + priceBizType = TpAuditOrChangePriceBizTypeEnum.CONFIRM_ORDER.getBizType(); + break; + case ORDER_CHANGE: + priceBizType = TpAuditOrChangePriceBizTypeEnum.CHANGE_ORDER.getBizType(); + break; + case ORDER_CANCEL: + priceBizType = TpAuditOrChangePriceBizTypeEnum.CANCEL_ORDER.getBizType(); + break; + } + return priceBizType; + + } + + private Boolean buildAuditStatus(String status) { + TpOrderChangeApplyStatusEnum orderStatusEnum = TpOrderChangeApplyStatusEnum.getApplyStatusByType(status); + Boolean auditStatusFlag = Boolean.FALSE; + switch (orderStatusEnum) { + case APPROVED_REJECT: + auditStatusFlag = Boolean.TRUE; + break; + case APPROVED_TIMEOUT: + auditStatusFlag = Boolean.TRUE; + break; + case APPROVED_SUCCESS: + auditStatusFlag = Boolean.TRUE; + break; + } + return auditStatusFlag; + } + + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/check/TpBasicCheckNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/check/TpBasicCheckNode.java new file mode 100644 index 0000000..e33fea2 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/check/TpBasicCheckNode.java @@ -0,0 +1,101 @@ +package com.deepinnet.tptradeprod.biz.service.flow.refundTicket.check; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.constants.GlobalConstants; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpproductcore.common.dto.product.*; +import com.deepinnet.tptradeprod.biz.service.flow.refundTicket.context.TpRefundTicketCommonContext; +import com.deepinnet.tptradeprod.biz.util.TpVoucherUtil; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.enums.TpFlowProcessTypeEnum; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.yomahub.liteflow.annotation.*; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author amos wong + * @create 2023/10/16 16:46 + * @Description + */ +@LiteflowComponent(value = "basicCheckNode", name = "基础信息校验") +@LiteflowCmpDefine +public class TpBasicCheckNode { + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + TpRefundTicketCommonContext commonContext = bindCmp.getContextBean(TpRefundTicketCommonContext.class); + LogUtil.info("执行基础信息校验节点...入参为:{}", JSONUtil.toJsonStr(commonContext)); + + String userNo = commonContext.getCommonRequest().getUserNo(); + TpProdOrderDetailVO orderDetailVO = commonContext.getOrderDetailVO(); + + List voucherDTOList = commonContext.getVoucherList(); + if (CollectionUtils.isEmpty(voucherDTOList)) { + LogUtil.error("凭证不存在,无法进行退票处理,入参为:{}", JSONUtil.toJsonStr(commonContext)); + throw new TpTradeProdException(TpTradeProdErrorCode.NOT_FOUND_REFUND_AVAILABLE_VOUCHER); + } + + TpProdDetailDTO productDetailDTO = commonContext.getProductDetailDTO(); + TpProductExtendAttributesDTO extendAttributes = productDetailDTO.getExtendAttributes(); + Boolean refundNoTimeLimit = extendAttributes.getRefundNoTimeLimit(); + + if (commonContext.getProcessType() == TpFlowProcessTypeEnum.REFUND_TICKET) { + TpProdRefundApplyDTO refundApplyDTO = commonContext.getRefundTicketApplyContext().getRefundApplyDTO(); + List nonRealNameTicketChoiceDTOs = refundApplyDTO.getNonRealNameTicketChoiceDTOs(); + if (orderDetailVO.getIdentityVerificat() == 0) { + checkNonRealNameRefundPassengerCount(nonRealNameTicketChoiceDTOs, voucherDTOList); + } + } else if (commonContext.getProcessType() == TpFlowProcessTypeEnum.CALCULATE_REFUND_AMOUNT) { + TpProdCalculateRefundAmountDTO calculateRefundAmountDTO = commonContext.getCalculateRefundAmountContext().getCalculateRefundAmountDTO(); + Boolean realNameRefund = calculateRefundAmountDTO.getRealNameRefund(); + if (!realNameRefund) { + checkNonRealNameRefundPassengerCount(calculateRefundAmountDTO.getNonRealNameTicketChoiceDTOs(), voucherDTOList); + } + } + + // 校验订单是否存在 && 将要退款的订单是否属于当前的用户 + if (orderDetailVO.getOrderPlacer() == null || !StringUtils.equals(orderDetailVO.getOrderPlacer().getPlacerNo(), userNo)) { + LogUtil.error("退票失败,原因:该订单不属于该登录用户,订单号:{},用户编号:{}", orderDetailVO.getOrderNo(), userNo); + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_NOT_BELONG_TO_CUR_USER); + } + } + + private void checkNonRealNameRefundPassengerCount(List nonRealNameTicketChoiceDTOs, List voucherDTOList) { + nonRealNameTicketChoiceDTOs.forEach(choice -> { + Integer refundPassengerCount = choice.getRefundPassengerCount(); + String voucherTravelDate = choice.getVoucherTravelDate(); + String[] split = voucherTravelDate.split(GlobalConstants.HORIZONTAL_LINE); + Long effectiveStartTime = Long.valueOf(split[0]); + Long effectiveEndTime = Long.valueOf(split[1]); + + List curChoiceVouchers = voucherDTOList.stream() + .filter(v -> ObjectUtil.equal(v.getEffectiveStartTime(), effectiveStartTime) && ObjectUtil.equal(v.getEffectiveEndTime(), effectiveEndTime)) + .collect(Collectors.toList()); + if (CollectionUtils.isEmpty(curChoiceVouchers)) { + LogUtil.error("基础校验失败,原因:当前乘车日期对应的凭证不存在,退票乘车日期:{},退票乘车人数:{},凭证列表:{}", voucherTravelDate, refundPassengerCount, JSONUtil.toJsonStr(voucherDTOList)); + throw new TpTradeProdException(TpTradeProdErrorCode.NOT_FOUND_REFUND_AVAILABLE_VOUCHER); + } + + if (curChoiceVouchers.size() > 1) { + LogUtil.error("基础校验失败,原因:数据异常,非实名制一个乘车日期对应多张凭证,退票乘车日期:{},当前乘车日期对应的凭证列表:{}", voucherTravelDate, JSONUtil.toJsonStr(curChoiceVouchers)); + throw new TpTradeProdException(TpTradeProdErrorCode.DATA_INVALID, TpTradeProdErrorCode.DATA_INVALID.getDesc()); + } + + TpProdVoucherDTO voucherDTO = curChoiceVouchers.get(0); + boolean isValid = TpVoucherUtil.isRefundPassengerCountValid(voucherDTO, refundPassengerCount); + if (!isValid) { + LogUtil.error("基础校验失败,原因:乘车日期对应的可退乘车人数超限,乘车日期:{},退票乘车人数:{}", voucherTravelDate, refundPassengerCount); + throw new TpTradeProdException(TpTradeProdErrorCode.REFUND_PASSENGER_COUNT_INVALID); + } + }); + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/check/TpRefundAmountCheckNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/check/TpRefundAmountCheckNode.java new file mode 100644 index 0000000..db12faf --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/check/TpRefundAmountCheckNode.java @@ -0,0 +1,66 @@ +package com.deepinnet.tptradeprod.biz.service.flow.refundTicket.check; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.*; +import com.deepinnet.tptradeprod.biz.service.flow.refundTicket.context.TpRefundTicketCommonContext; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.facade.TpContractAcceptanceFacade; +import com.deepinnet.tptradeprod.common.vo.TpProdCalculateRefundAmountVO; +import com.yomahub.liteflow.annotation.*; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; + +import javax.annotation.Resource; + +/** + * @author amos wong + * @create 2023/10/16 14:50 + * @Description + */ +@LiteflowComponent(value = "refundAmountCheckNode", name = "退票规则校验节点") +@LiteflowCmpDefine +public class TpRefundAmountCheckNode { + + @Resource + private TpContractAcceptanceFacade contractAcceptanceFacade; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + TpRefundTicketCommonContext commonContext = bindCmp.getContextBean(TpRefundTicketCommonContext.class); + LogUtil.info("执行计算退票手续费节点,入参为:{}", JSONUtil.toJsonStr(commonContext)); + + TpProdRefundApplyDTO refundApplyDTO = commonContext.getRefundTicketApplyContext().getRefundApplyDTO(); + + TpProdCalculateRefundAmountDTO calculateRefundAmountDTO = TpProdCalculateRefundAmountDTO + .builder() + .orderNo(refundApplyDTO.getOrderNo()) + .productNo(refundApplyDTO.getProductCode()) + .userNo(refundApplyDTO.getUserNo()) + .realNameRefund(refundApplyDTO.getRealNameRefund()) + .nonRealNameTicketChoiceDTOs(refundApplyDTO.getNonRealNameTicketChoiceDTOs()) + .realNameTicketRefundChoiceDTOs(refundApplyDTO.getRealNameTicketRefundChoiceDTOs()) + .tripType(refundApplyDTO.getTripType()) + .tenantId(refundApplyDTO.getTenantId()) + .build(); + TpResult result = contractAcceptanceFacade.calculateRefundAmount(calculateRefundAmountDTO); + if (!result.isSuccess()) { + LogUtil.error("计算退票手续费金额失败,入参为:{}", JSONUtil.toJsonStr(calculateRefundAmountDTO)); + throw new TpTradeProdException(TpTradeProdErrorCode.CALCULATE_REFUND_AMOUNT_ERROR, TpTradeProdErrorCode.CALCULATE_REFUND_AMOUNT_ERROR.getDesc()); + } + + TpProdCalculateRefundAmountVO refundAmountVO = result.getData(); + + TpMoney refundAmount = new TpMoney(refundAmountVO.getRefundAmount(), TpMoney.ValueUnitEnum.YUAN); + TpMoney chargeAmount = new TpMoney(refundAmountVO.getChargeAmount(), TpMoney.ValueUnitEnum.YUAN); + boolean isValidRefundAmount = refundAmount.compare(new TpMoney(refundApplyDTO.getRefundAmount(), TpMoney.ValueUnitEnum.YUAN)) == TpMoney.CompareResult.EQUAL; + boolean isValidChargeAmount = chargeAmount.compare(new TpMoney(refundApplyDTO.getChargeAmount(), TpMoney.ValueUnitEnum.YUAN)) == TpMoney.CompareResult.EQUAL; + if (!isValidRefundAmount || !isValidChargeAmount) { + LogUtil.error("退票金额不正确,入参为:{},计算出的应退金额为:{},计算出的手续费为:{},计算出的实退金额为:{}", + JSONUtil.toJsonStr(refundApplyDTO), refundAmount.toString(), chargeAmount.toString(), refundAmountVO.getPayAmount()); + throw new TpTradeProdException(TpTradeProdErrorCode.NOT_CORRECT_REFUND_AMOUNT); + } + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/check/TpRefundButtonShowableBasicCheckNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/check/TpRefundButtonShowableBasicCheckNode.java new file mode 100644 index 0000000..71e1649 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/check/TpRefundButtonShowableBasicCheckNode.java @@ -0,0 +1,92 @@ +package com.deepinnet.tptradeprod.biz.service.flow.refundTicket.check; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.*; +import com.deepinnet.tpproductcore.common.dto.product.*; +import com.deepinnet.tptradeprod.biz.service.flow.refundTicket.context.*; +import com.deepinnet.tptradeprod.biz.util.TpVoucherUtil; +import com.deepinnet.tptradeprod.common.dto.TpProdVoucherDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderStatusEnum; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.google.common.collect.Lists; +import com.yomahub.liteflow.annotation.*; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import org.apache.commons.collections4.CollectionUtils; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author amos wong + * @create 2023/10/16 16:46 + * @Description + */ +@LiteflowComponent(value = "refundButtonShowableBasicCheckNode", name = "退票按钮是否展示基础校验节点") +@LiteflowCmpDefine +public class TpRefundButtonShowableBasicCheckNode { + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + TpRefundTicketCommonContext commonContext = bindCmp.getContextBean(TpRefundTicketCommonContext.class); + LogUtil.info("执行基础信息校验节点...入参为:{}", JSONUtil.toJsonStr(commonContext)); + + TpProdOrderDetailVO orderDetailVO = commonContext.getOrderDetailVO(); + TpRefundTicketButtonShowableContext ticketButtonShowableContext = commonContext.getTicketButtonShowableContext(); + List voucherDTOList = commonContext.getVoucherList(); + TpProdDetailDTO productDetailDTO = commonContext.getProductDetailDTO(); + TpProductExtendAttributesDTO extendAttributes = productDetailDTO.getExtendAttributes(); + List availableRefundVoucherStatusList = extendAttributes.getAllowRefundVerificationStatusEnumList(); + Boolean refundNoTimeLimit = extendAttributes.getRefundNoTimeLimit(); + + // 没有可以退的凭证直接返回false + if (CollectionUtils.isEmpty(voucherDTOList)) { + ticketButtonShowableContext.setShowable(false); + return; + } + + // 0元订单不允许退票 + TpMoney payAmount = new TpMoney(orderDetailVO.getPayAmount(), TpMoney.ValueUnitEnum.YUAN); + if (payAmount.compare(new TpMoney("0", TpMoney.ValueUnitEnum.YUAN)) == TpMoney.CompareResult.EQUAL) { + ticketButtonShowableContext.setShowable(false); + return; + } + + // 是否开启线上退票能力 + Boolean supportRefund = extendAttributes.getSupportRefund(); + if (!supportRefund) { + ticketButtonShowableContext.setShowable(false); + return; + } + + // 退票时间没有限制 + if (refundNoTimeLimit) { + // 对退票时间没有要求,只限制可退凭证的状态,只要有剩余可退的凭证就可以退票 + TpProdVoucherDTO voucherDTO = voucherDTOList.get(0); + boolean existRefundableVoucher; + if (voucherDTO.getRequiredRealName()) { + existRefundableVoucher = voucherDTOList.stream().anyMatch(v -> availableRefundVoucherStatusList.contains(v.getStatus())); + } else { + // 非实名制退票,需要判断当前是否有可退的乘车人数 + existRefundableVoucher = voucherDTOList.stream().anyMatch(v -> TpVoucherUtil.isRefundPassengerCountValid(v, 1)); + } + ticketButtonShowableContext.setShowable(existRefundableVoucher); + } else { + // 退票时间限制为发车前xx时间可退 + // 待乘车状态才可退票 + List waitRideStatus = Lists.newArrayList(TpOrderStatusEnum.ALREADY_PAY.getStatus(), TpOrderStatusEnum.PARTLY_VERIFICATION.getStatus(), + TpOrderStatusEnum.PARTLY_REFUND.getStatus()); + if (!waitRideStatus.contains(orderDetailVO.getStatus())) { + ticketButtonShowableContext.setShowable(false); + return; + } + + ticketButtonShowableContext.setShowable(true); + List sortedVoucherList = voucherDTOList.stream() + .sorted(Comparator.comparing(TpProdVoucherDTO::getEffectiveStartTime)) + .collect(Collectors.toList()); + // 按照最后一个购买日发车时间计算,最后一天满足条件 & 【订单状态为待乘车】展示入口 + ticketButtonShowableContext.setLastDayVoucher(sortedVoucherList.get(sortedVoucherList.size() - 1)); + } + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/check/TpRefundButtonShowableNeedInvokeRuleNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/check/TpRefundButtonShowableNeedInvokeRuleNode.java new file mode 100644 index 0000000..391ff41 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/check/TpRefundButtonShowableNeedInvokeRuleNode.java @@ -0,0 +1,32 @@ +package com.deepinnet.tptradeprod.biz.service.flow.refundTicket.check; + +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradeprod.biz.service.flow.refundTicket.context.*; +import com.deepinnet.tptradeprod.common.dto.TpProdVoucherDTO; +import com.yomahub.liteflow.annotation.*; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.*; + +/** + *

+ * + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "refundButtonShowableNeedInvokeRuleNode", name = "是否需要调用规则域判断发车时间是否可退票节点") +@LiteflowCmpDefine(value = NodeTypeEnum.IF) +public class TpRefundButtonShowableNeedInvokeRuleNode { + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS_IF) + public boolean process(NodeComponent bindCmp) { + LogUtil.info("------当前节点: 判断是否需要调用规则来判断当前发车时间是否可退票"); + TpRefundTicketCommonContext commonContext = bindCmp.getContextBean(TpRefundTicketCommonContext.class); + TpRefundTicketButtonShowableContext ticketButtonShowableContext = commonContext.getTicketButtonShowableContext(); + Boolean showable = ticketButtonShowableContext.getShowable(); + TpProdVoucherDTO lastDayVoucher = ticketButtonShowableContext.getLastDayVoucher(); + return showable && lastDayVoucher != null; + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/check/TpRefundCountRuleCheckNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/check/TpRefundCountRuleCheckNode.java new file mode 100644 index 0000000..7df8ee6 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/check/TpRefundCountRuleCheckNode.java @@ -0,0 +1,155 @@ +package com.deepinnet.tptradeprod.biz.service.flow.refundTicket.check; + +import cn.hutool.core.date.*; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpproductcore.common.dto.rule.*; +import com.deepinnet.tpproductcore.common.enums.TpRuleExpressionGroupEnum; +import com.deepinnet.tptradecore.common.enums.contract.TpRefundApplyOrderStatusEnum; +import com.deepinnet.tptradecore.common.enums.voucher.*; +import com.deepinnet.tptradeprod.biz.service.flow.refundTicket.context.TpRefundTicketCommonContext; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.*; +import com.yomahub.liteflow.annotation.*; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.Assert; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author amos wong + * @create 2023/10/16 14:50 + * @Description + */ +@LiteflowComponent(value = "refundCountRuleCheckNode", name = "退票规则校验节点") +@LiteflowCmpDefine +public class TpRefundCountRuleCheckNode { + + @Resource + private TpBizRuleClient bizRuleClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + // 从上下文中获取本节点执行的必要参数 + TpRefundTicketCommonContext commonContext = bindCmp.getContextBean(TpRefundTicketCommonContext.class); + LogUtil.info("执行校验退票次数规则节点,入参为:{}", JSONUtil.toJsonStr(commonContext)); + + List ticketRefundCountRules = commonContext.getTicketRefundCountRules(); + List voucherList = commonContext.getVoucherList(); + List curUserRefundApplyOrderDTOs = commonContext.getRefundApplyOrderDTOs(); + List verificationRecordList = commonContext.getVerificationRecordList(); + + if (CollectionUtils.isEmpty(voucherList)) { + LogUtil.error("不存在可退凭证,无法进行退票处理,入参为:{}", JSONUtil.toJsonStr(commonContext)); + throw new TpTradeProdException(TpTradeProdErrorCode.NOT_FOUND_REFUND_AVAILABLE_VOUCHER); + } + + // 获取凭证退票次数规则 + Assert.notEmpty(ticketRefundCountRules, "退票次数规则不存在"); + + // 查询当前的订单关联的退票申请单 + String tenantId = commonContext.getCommonRequest().getTenantId(); + String orderNo = commonContext.getCommonRequest().getOrderNo(); + String productCategoryNo = commonContext.getCommonRequest().getProductCategoryNo(); + + // 退票次数校验(该用户的退款次数是否大于后台设置的最高数量) + ticketRefundCountCheck(ticketRefundCountRules, curUserRefundApplyOrderDTOs, orderNo, productCategoryNo, tenantId); + } + + private void ticketRefundCountCheck(List expressionList, List curUserRefundApplyOrders, String orderNo, String productCategoryNo, String tenantId) { + if (CollectionUtils.isEmpty(curUserRefundApplyOrders)) { + return; + } + + List curCategoryRefundSuccessApplyOrders = curUserRefundApplyOrders.stream() + .filter(refundApplyOrder -> StringUtils.equals(TpRefundApplyOrderStatusEnum.REFUNDED_SUCCESS.getCode(), refundApplyOrder.getStatus()) + && StringUtils.equals(productCategoryNo, refundApplyOrder.getProductCategoryNo())) + .collect(Collectors.toList()); + if (CollectionUtils.isEmpty(curCategoryRefundSuccessApplyOrders)) { + return; + } + + List curOrderSuccessRefundApplyOrders = curCategoryRefundSuccessApplyOrders.stream() + .filter(refundApplyOrder -> StringUtils.equals(orderNo, refundApplyOrder.getOrderNo())) + .collect(Collectors.toList()); + + // 当前订单的退票次数 + int curOrderRefundTimes = CollectionUtils.isEmpty(curOrderSuccessRefundApplyOrders) ? 0 : curOrderSuccessRefundApplyOrders.size(); + // 当前类目总退票成功次数 + long refundSuccessCount = curCategoryRefundSuccessApplyOrders.size(); + + // 调用产品域规则校验退票次数 + if (refundSuccessCount > 0) { + Long dayStartMills = LocalDateTimeUtil.toEpochMilli(LocalDateTimeUtil.beginOfDay(LocalDateTime.now())); + long dayEndMills = LocalDateTimeUtil.toEpochMilli(LocalDateTimeUtil.endOfDay(LocalDateTime.now())); + Long weekStartMills = LocalDateTimeUtil.toEpochMilli(LocalDateTimeUtil.of(DateUtil.beginOfWeek(new Date()))); + long weekEndMills = LocalDateTimeUtil.toEpochMilli(LocalDateTimeUtil.of(DateUtil.endOfWeek(new Date()))); + Long monthStartMills = LocalDateTimeUtil.toEpochMilli(LocalDateTimeUtil.of(DateUtil.beginOfMonth(new Date()))); + long monthEndMills = LocalDateTimeUtil.toEpochMilli(LocalDateTimeUtil.of(DateUtil.endOfMonth(new Date()))); + + int dayRefundCount = (int) curCategoryRefundSuccessApplyOrders + .stream() + .filter(refundApplyOrder -> StringUtils.equals(TpRefundApplyOrderStatusEnum.REFUNDED_SUCCESS.getCode(), refundApplyOrder.getStatus()) + && refundApplyOrder.getApplyTime() >= dayStartMills && refundApplyOrder.getApplyTime() <= dayEndMills) + .count(); + + int weekRefundCount = (int) curCategoryRefundSuccessApplyOrders + .stream() + .filter(refundApplyOrder -> StringUtils.equals(TpRefundApplyOrderStatusEnum.REFUNDED_SUCCESS.getCode(), refundApplyOrder.getStatus()) + && refundApplyOrder.getApplyTime() >= weekStartMills && refundApplyOrder.getApplyTime() <= weekEndMills) + .count(); + + int monthRefundCount = (int) curCategoryRefundSuccessApplyOrders + .stream() + .filter(refundApplyOrder -> StringUtils.equals(TpRefundApplyOrderStatusEnum.REFUNDED_SUCCESS.getCode(), refundApplyOrder.getStatus()) + && refundApplyOrder.getApplyTime() >= monthStartMills && refundApplyOrder.getApplyTime() <= monthEndMills) + .count(); + + refundTickCountRuleCheck(curOrderRefundTimes, dayRefundCount, weekRefundCount, monthRefundCount, expressionList, tenantId); + } + } + + /** + * 退票次数规则校验 + */ + private void refundTickCountRuleCheck(Integer curOrderRefundTimes, Integer userDayRefundTimes, Integer userWeekRefundTimes, Integer userMonthRefundTimes, List expressionList, String tenantId) { + TpRuleExecuteDTO executeDTO = new TpRuleExecuteDTO<>(); + TpTicketRefundParamDTO refundParamDTO = new TpTicketRefundParamDTO(); + refundParamDTO.setUserDayRefundTimes(userDayRefundTimes); + refundParamDTO.setUserWeekRefundTimes(userWeekRefundTimes); + refundParamDTO.setUserMonthRefundTimes(userMonthRefundTimes); + refundParamDTO.setUserOrderRefundTimes(curOrderRefundTimes); + executeDTO.setParameter(refundParamDTO); + executeDTO.setRuleList(expressionList); + executeDTO.setRuleExpressionGroup(TpRuleExpressionGroupEnum.REFUND_COUNTS); + executeDTO.setTenantId(tenantId); + TpRuleExecuteResultVO executeResultVO = bizRuleClient.executeRule(executeDTO); + if (!executeResultVO.getResult()) { + LogUtil.error("退票次数规则校验失败,退票次数超过限制,入参:{}", JSONUtil.toJsonStr(executeDTO)); + throw new TpTradeProdException(TpTradeProdErrorCode.OVER_MAX_REFUND_COUNT); + } + } + + private void fullRefundCheck(List voucherList, List verificationRecordList) { + if (CollectionUtils.isEmpty(verificationRecordList)) { + return; + } + + List successRecords = verificationRecordList + .stream() + .filter(record -> StringUtils.equals(record.getResult(), TpVoucherVerifiedResultEnum.SUCCESS.getCode())) + .collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(successRecords)) { + LogUtil.error("该订单已有乘车记录,无法进行退票,入参:{}", JSONUtil.toJsonStr(voucherList)); + throw new TpTradeProdException(TpTradeProdErrorCode.REFUND_TICKET_HAS_VERIFICATION_RECORD); + } + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/check/TpRefundTimeRuleCheckNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/check/TpRefundTimeRuleCheckNode.java new file mode 100644 index 0000000..6fd2a4d --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/check/TpRefundTimeRuleCheckNode.java @@ -0,0 +1,257 @@ +package com.deepinnet.tptradeprod.biz.service.flow.refundTicket.check; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpbaseopcore.common.dto.route.RouteRollTimeDetailDTO; +import com.deepinnet.tpproductcore.common.dto.product.*; +import com.deepinnet.tpproductcore.common.dto.rule.*; +import com.deepinnet.tpproductcore.common.enums.TpRuleExpressionGroupEnum; +import com.deepinnet.tptradeprod.biz.service.flow.refundTicket.context.*; +import com.deepinnet.tptradeprod.biz.util.*; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.enums.TpFlowProcessTypeEnum; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.*; +import com.deepinnet.tptradeprod.common.vo.*; +import com.google.common.collect.Lists; +import com.yomahub.liteflow.annotation.*; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.Assert; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author amos wong + * @create 2023/10/16 14:50 + * @Description + */ +@LiteflowComponent(value = "refundTimeRuleCheckNode", name = "退票规则校验节点") +@LiteflowCmpDefine +public class TpRefundTimeRuleCheckNode { + + @Resource + private TpBizRuleClient bizRuleClient; + + @Resource + private TpRouteClient routeClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + // 从上下文中获取本节点执行的必要参数 + TpRefundTicketCommonContext commonContext = bindCmp.getContextBean(TpRefundTicketCommonContext.class); + LogUtil.info("执行校验退票时间节点,入参为:{}", JSONUtil.toJsonStr(commonContext)); + + TpProdOrderDetailVO orderDetailVO = commonContext.getOrderDetailVO(); + List ticketRefundTimeRules = commonContext.getTicketRefundTimeRules(); + List voucherList = commonContext.getVoucherList(); + TpProdDetailDTO productDetailDTO = commonContext.getProductDetailDTO(); + TpRefundTicketCommonRequest commonRequest = commonContext.getCommonRequest(); + TpProductExtendAttributesDTO extendAttributes = productDetailDTO.getExtendAttributes(); + Boolean refundNoTimeLimit = extendAttributes.getRefundNoTimeLimit(); + + Assert.notEmpty(ticketRefundTimeRules, "退票时间规则不存在"); + + // 是否展示退票按钮 + if (commonContext.getProcessType() == TpFlowProcessTypeEnum.REFUND_BUTTON_SHOWABLE) { + TpRefundTicketButtonShowableContext ticketButtonShowableContext = commonContext.getTicketButtonShowableContext(); + if (refundNoTimeLimit) { + ticketButtonShowableContext.setShowable(true); + return; + } + + TpProdVoucherDTO lastDayVoucher = ticketButtonShowableContext.getLastDayVoucher(); + List departureTimeList = calculateFirstShuttleDepartureTime(Lists.newArrayList(lastDayVoucher), orderDetailVO, commonRequest.getTenantId()); + List resultList = getRefundTicketTimeRuleResult(departureTimeList, commonRequest.getApplyTime(), ticketRefundTimeRules, commonRequest.getTenantId()); + ticketButtonShowableContext.setShowable(resultList.get(0)); + return; + } + + // 查询可退凭证 + if (commonContext.getProcessType() == TpFlowProcessTypeEnum.QUERY_AVAILABLE_REFUND_VOUCHER) { + TpQueryAvailableVoucherContext queryAvailableVoucherContext = commonContext.getQueryAvailableVoucherContext(); + List availableRefundVoucherList = queryAvailableVoucherContext.getAvailableRefundVoucherList(); + if (CollectionUtils.isEmpty(availableRefundVoucherList)) { + return; + } + + // 发车前才能退票,需要校验退票时间 + if (!refundNoTimeLimit) { + List departureTimeList = calculateFirstShuttleDepartureTime(availableRefundVoucherList, orderDetailVO, commonRequest.getTenantId()); + List resultList = getRefundTicketTimeRuleResult(departureTimeList, commonRequest.getApplyTime(), ticketRefundTimeRules, commonRequest.getTenantId()); + queryAvailableVoucherContext.setRuleCheckResultList(resultList); + } + + return; + } + + // 校验是否能够退票 + if (commonContext.getProcessType() == TpFlowProcessTypeEnum.REFUND_TICKET_CHECK) { + // 限制退票时间为发车前才去校验 + if (!refundNoTimeLimit) { + // 退票申请时间校验(该订单支持的退款时间是否与后台设置的一致) + // 对于首站发车时间的定义:普通班次为用户下单时的班次时间,滚动发车为首班的时间,非日票的首站发车时间是第一天的首站发车时间 + List departureTimeList = calculateFirstShuttleDepartureTime(voucherList, orderDetailVO, commonRequest.getTenantId()); + List checkResult = getRefundTicketTimeRuleResult(departureTimeList, commonRequest.getApplyTime(), ticketRefundTimeRules, commonRequest.getTenantId()); + boolean existAvailableVoucher = checkResult.stream().anyMatch(r -> r); + if (!existAvailableVoucher) { + LogUtil.error("退票时间规则校验失败,不在退票允许的时间范围内,入参:{}", JSONUtil.toJsonStr(departureTimeList)); + throw new TpTradeProdException(TpTradeProdErrorCode.INVALID_REFUND_TIME); + } + } + return; + } + + // 限制退票时间为发车前才去校验 + if (!refundNoTimeLimit) { + // 获取实际需要退的凭证 + List actuallyRefundVoucherList = getActuallyRefundVoucherList(commonContext, voucherList); + + // 退票申请时间校验(该订单支持的退款时间是否与后台设置的一致) + // 对于首站发车时间的定义:普通班次为用户下单时的班次时间,滚动发车为首班的时间,非日票的首站发车时间是第一天的首站发车时间 + List departureTimeList = calculateFirstShuttleDepartureTime(actuallyRefundVoucherList, orderDetailVO, commonRequest.getTenantId()); + refundTicketTimeRuleCheck(departureTimeList, commonRequest.getApplyTime(), ticketRefundTimeRules, commonRequest.getTenantId()); + } + } + + private List getActuallyRefundVoucherList(TpRefundTicketCommonContext commonContext, List voucherList) { + List nonRealNameTicketChoiceDTOs; + List realNameTicketRefundChoiceDTOs; + Boolean realNameRefund; + + // 筛选出来实际需要退的凭证 + // 计算退票金额流程 + if (commonContext.getProcessType() == TpFlowProcessTypeEnum.CALCULATE_REFUND_AMOUNT) { + TpCalculateRefundAmountContext calculateRefundAmountContext = commonContext.getCalculateRefundAmountContext(); + TpProdCalculateRefundAmountDTO calculateRefundAmountDTO = calculateRefundAmountContext.getCalculateRefundAmountDTO(); + realNameRefund = calculateRefundAmountDTO.getRealNameRefund(); + nonRealNameTicketChoiceDTOs = calculateRefundAmountDTO.getNonRealNameTicketChoiceDTOs(); + realNameTicketRefundChoiceDTOs = calculateRefundAmountDTO.getRealNameTicketRefundChoiceDTOs(); + } else { + // 申请退票流程 + TpProdRefundApplyDTO refundApplyDTO = commonContext.getRefundTicketApplyContext().getRefundApplyDTO(); + nonRealNameTicketChoiceDTOs = refundApplyDTO.getNonRealNameTicketChoiceDTOs(); + realNameTicketRefundChoiceDTOs = refundApplyDTO.getRealNameTicketRefundChoiceDTOs(); + realNameRefund = refundApplyDTO.getRealNameRefund(); + } + + List actuallyRefundVoucherList = Lists.newArrayList(); + if (!realNameRefund) { + // 通过乘车日期 & 乘车人数来获取需要退的凭证 这里组装这个map是为了计算非实名制的退票金额 + // k: 退票人数,v: 凭证 + Map> nonRealNameRefundPassengerVoucherMap = TpVoucherUtil.getNonRealNameRefundVouchers(nonRealNameTicketChoiceDTOs, voucherList); + Assert.notEmpty(nonRealNameRefundPassengerVoucherMap, "非实名制退票人数和凭证映射关系不存在"); + for (List value : nonRealNameRefundPassengerVoucherMap.values()) { + actuallyRefundVoucherList.addAll(value); + } + } else { + for (TpRealNameTicketRefundChoiceDTO realNameTicketRefundChoiceDTO : realNameTicketRefundChoiceDTOs) { + TpRefundPassengerDTO refundPassengerDTO = realNameTicketRefundChoiceDTO.getRefundPassengerDTO(); + + // 过滤出当前乘客的所有凭证 + List curPassengerAvailableVouchers = voucherList + .stream() + .filter(v -> StringUtils.equals(refundPassengerDTO.getPassengerNo(), v.getPassenger().getPassengerNo())) + .collect(Collectors.toList()); + if (CollectionUtils.isEmpty(curPassengerAvailableVouchers)) { + LogUtil.error("当前乘客不存在可退的凭证,乘客编号:{}, 当前订单所有可退凭证列表:{}", refundPassengerDTO.getPassengerNo(), JSONUtil.toJsonStr(voucherList)); + throw new TpTradeProdException(TpTradeProdErrorCode.NOT_FOUND_REFUND_AVAILABLE_VOUCHER); + } + + // 过滤出来当前乘客选择的日期对应的凭证 + List curPassengerActuallyRefundVoucherList = TpVoucherUtil.getRealNameNeedRefundVouchers(realNameTicketRefundChoiceDTO.getVoucherTravelDateList(), curPassengerAvailableVouchers); + actuallyRefundVoucherList.addAll(curPassengerActuallyRefundVoucherList); + } + } + + return actuallyRefundVoucherList; + } + + private List calculateFirstShuttleDepartureTime(List voucherList, TpProdOrderDetailVO orderDetail, String tenantId) { + List orderRoutes = orderDetail.getTpOrderRoutes(); + Assert.notEmpty(orderRoutes, "线路信息不能为空"); + TpOrderRouteVO routeVO = orderRoutes.get(0); + List departureTimeList = Lists.newArrayList(); + + // 有班次,普通班车 + if (routeVO.getTpOrderRouteShuttle() != null) { + List orderRouteShuttleList = routeVO.getTpOrderRouteShuttle(); + Map> orderRouteShuttleMap = orderRouteShuttleList.stream() + .collect(Collectors.groupingBy(TpOrderRouteShuttleVO::getShuttleNo)); + + voucherList.forEach(voucherDTO -> { + TpOrderRouteShuttleVO routeShuttle = orderRouteShuttleMap.get(voucherDTO.getShuttleId()).get(0); + Long departureTime = TimeConvertUtil.convertDateAndTime2Timestamp(voucherDTO.getEffectiveStartTime(), routeShuttle.getShuttleTime()); + departureTimeList.add(departureTime); + }); + return departureTimeList; + } else { + // 滚动发车 + RouteRollTimeDetailDTO routeRollTimeDetail = routeClient.getRouteRollTime(routeVO.getRouteNo(), tenantId); + Assert.notNull(routeRollTimeDetail, "线路详情不能为空"); + + String roundTrip = routeVO.getRoundTrip(); + return TpVoucherUtil.calculateRollTimeRouteVoucherDepartureTime(roundTrip, voucherList, routeRollTimeDetail); + } + } + + /** + * 退票时间规则校验 + */ + private void refundTicketTimeRuleCheck(List departureTimeList, Long refundApplyTime, List expressionList, String tenantId) { + List> executeDTOs = Lists.newArrayList(); + for (Long departureTime : departureTimeList) { + TpRuleExecuteDTO executeDTO = new TpRuleExecuteDTO<>(); + TpTicketRefundParamDTO refundParamDTO = new TpTicketRefundParamDTO(); + refundParamDTO.setFirstShuttleDepartureTime(departureTime); + refundParamDTO.setRefundApplyTime(refundApplyTime); + executeDTO.setParameter(refundParamDTO); + executeDTO.setRuleList(expressionList); + executeDTO.setRuleExpressionGroup(TpRuleExpressionGroupEnum.REFUND_TICKET_TIME); + executeDTO.setTenantId(tenantId); + executeDTOs.add(executeDTO); + } + + TpRuleExecuteBatchResultVO executeResultVO = bizRuleClient.batchExecuteBizRule(executeDTOs); + List> resultList = executeResultVO.getResultList(); + if (CollectionUtils.isEmpty(resultList)) { + LogUtil.error("退票时间规则校验失败,结果返回为空,入参:{}", JSONUtil.toJsonStr(executeDTOs)); + throw new TpTradeProdException(TpTradeProdErrorCode.INVALID_REFUND_TIME); + } + + boolean existInvalidRefundTime = resultList.stream().anyMatch(result -> !result.getResult()); + if (existInvalidRefundTime) { + LogUtil.error("退票时间规则校验失败,不在退票允许的时间范围内,入参:{}", JSONUtil.toJsonStr(executeDTOs)); + throw new TpTradeProdException(TpTradeProdErrorCode.INVALID_REFUND_TIME); + } + } + + private List getRefundTicketTimeRuleResult(List departureTimeList, Long refundApplyTime, List expressionList, String tenantId) { + List> executeDTOs = Lists.newArrayList(); + for (Long departureTime : departureTimeList) { + TpRuleExecuteDTO executeDTO = new TpRuleExecuteDTO<>(); + TpTicketRefundParamDTO refundParamDTO = new TpTicketRefundParamDTO(); + refundParamDTO.setFirstShuttleDepartureTime(departureTime); + refundParamDTO.setRefundApplyTime(refundApplyTime); + executeDTO.setParameter(refundParamDTO); + executeDTO.setRuleList(expressionList); + executeDTO.setRuleExpressionGroup(TpRuleExpressionGroupEnum.REFUND_TICKET_TIME); + executeDTO.setTenantId(tenantId); + executeDTOs.add(executeDTO); + } + + TpRuleExecuteBatchResultVO executeResultVO = bizRuleClient.batchExecuteBizRule(executeDTOs); + List> resultList = executeResultVO.getResultList(); + if (CollectionUtils.isEmpty(resultList)) { + LogUtil.error("退票时间规则校验失败,结果返回为空,入参:{}", JSONUtil.toJsonStr(executeDTOs)); + throw new TpTradeProdException(TpTradeProdErrorCode.INVALID_REFUND_TIME); + } + + return resultList.stream().map(TpRuleExecuteResultVO::getResult).collect(Collectors.toList()); + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/check/TpRefundVoucherStatusCheckNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/check/TpRefundVoucherStatusCheckNode.java new file mode 100644 index 0000000..dcac1ff --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/check/TpRefundVoucherStatusCheckNode.java @@ -0,0 +1,54 @@ +package com.deepinnet.tptradeprod.biz.service.flow.refundTicket.check; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpproductcore.common.dto.product.*; +import com.deepinnet.tptradecore.common.enums.voucher.TpVoucherStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.refundTicket.context.TpRefundTicketCommonContext; +import com.deepinnet.tptradeprod.common.dto.TpProdVoucherDTO; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.yomahub.liteflow.annotation.*; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.Assert; + +import java.util.List; + +/** + * @author amos wong + * @create 2023/10/16 14:50 + * @Description + */ +@LiteflowComponent(value = "refundVoucherStatusCheckNode", name = "退票凭证状态校验节点") +@LiteflowCmpDefine +public class TpRefundVoucherStatusCheckNode { + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + LogUtil.info("退票凭证状态校验校验开始..."); + TpRefundTicketCommonContext commonContext = bindCmp.getContextBean(TpRefundTicketCommonContext.class); + TpProdDetailDTO productDetailDTO = commonContext.getProductDetailDTO(); + TpProductExtendAttributesDTO extendAttributes = productDetailDTO.getExtendAttributes(); + List availableRefundVoucherStatusList = extendAttributes.getAllowRefundVerificationStatusEnumList(); + List voucherList = commonContext.getVoucherList(); + Boolean refundNoTimeLimit = extendAttributes.getRefundNoTimeLimit(); + + boolean existAvailableRefundVoucher; + // 退票时间规则配置为不限制,需要限制凭证的状态 + if (refundNoTimeLimit) { + Assert.notEmpty(availableRefundVoucherStatusList, "不限制退票时间时,允许的凭证状态不能为空"); + LogUtil.info("获取到的可退票的凭证状态为:{}", JSONUtil.toJsonStr(availableRefundVoucherStatusList)); + existAvailableRefundVoucher = voucherList.stream().anyMatch(v -> availableRefundVoucherStatusList.contains(v.getStatus())); + } else { + // 退票时间规则配置为发车前多久 + existAvailableRefundVoucher = voucherList.stream().anyMatch(v -> StringUtils.equals(TpVoucherStatusEnum.CREATED.getCode(), v.getStatus())); + } + + if (!existAvailableRefundVoucher) { + LogUtil.error("退票校验失败,原因:当前的凭证的状态都不支持退票,凭证列表为:{},支持退票的凭证状态为:{}", JSONUtil.toJsonStr(voucherList), JSONUtil.toJsonStr(availableRefundVoucherStatusList)); + throw new TpTradeProdException(TpTradeProdErrorCode.NOT_FOUND_REFUND_AVAILABLE_VOUCHER); + } + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/context/TpCalculateRefundAmountContext.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/context/TpCalculateRefundAmountContext.java new file mode 100644 index 0000000..3d0f770 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/context/TpCalculateRefundAmountContext.java @@ -0,0 +1,24 @@ +package com.deepinnet.tptradeprod.biz.service.flow.refundTicket.context; + +import com.deepinnet.tptradeprod.common.dto.TpProdCalculateRefundAmountDTO; +import com.deepinnet.tptradeprod.common.vo.TpProdCalculateRefundAmountVO; +import lombok.Data; + +/** + * @author amos wong + * @create 2024/2/1 11:41 + * @Description + */ +@Data +public class TpCalculateRefundAmountContext { + + /** + * 计算退票金额入参 + */ + private TpProdCalculateRefundAmountDTO calculateRefundAmountDTO; + + /** + * 退票金额结果 + */ + private TpProdCalculateRefundAmountVO calculateRefundAmountVO; +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/context/TpQueryAvailableVoucherContext.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/context/TpQueryAvailableVoucherContext.java new file mode 100644 index 0000000..bf10637 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/context/TpQueryAvailableVoucherContext.java @@ -0,0 +1,29 @@ +package com.deepinnet.tptradeprod.biz.service.flow.refundTicket.context; + +import com.deepinnet.tptradeprod.common.dto.*; +import lombok.Data; + +import java.util.List; + +/** + * @author amos wong + * @create 2024/2/2 14:03 + * @Description + */ +@Data +public class TpQueryAvailableVoucherContext { + /** + * 查询可退凭证的请求参数 + */ + private TpProdQueryAvailableRefundVoucherDTO queryDTO; + + /** + * 可退凭证列表 + */ + private List availableRefundVoucherList; + + /** + * 规则域针对每个凭证的校验结果,按照传入的凭证的顺序返回 + */ + private List ruleCheckResultList; +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/context/TpRefundTicketButtonShowableContext.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/context/TpRefundTicketButtonShowableContext.java new file mode 100644 index 0000000..48a40ff --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/context/TpRefundTicketButtonShowableContext.java @@ -0,0 +1,27 @@ +package com.deepinnet.tptradeprod.biz.service.flow.refundTicket.context; + +import com.deepinnet.tptradeprod.common.dto.*; +import lombok.Data; + +/** + * @author amos wong + * @create 2024/2/2 14:03 + * @Description + */ +@Data +public class TpRefundTicketButtonShowableContext { + /** + * 是否展示退票按钮DTO + */ + private TpProdShowRefundButtonCheckDTO showRefundButtonCheckDTO; + + /** + * 最后一天的凭证 + */ + private TpProdVoucherDTO lastDayVoucher; + + /** + * 是否可以展示退票按钮 + */ + private Boolean showable; +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/context/TpRefundTicketCheckContext.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/context/TpRefundTicketCheckContext.java new file mode 100644 index 0000000..1d07338 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/context/TpRefundTicketCheckContext.java @@ -0,0 +1,17 @@ +package com.deepinnet.tptradeprod.biz.service.flow.refundTicket.context; + +import com.deepinnet.tptradeprod.common.dto.TpProdRefundAvailableCheckDTO; +import lombok.Data; + +/** + * @author amos wong + * @create 2024/2/2 14:03 + * @Description + */ +@Data +public class TpRefundTicketCheckContext { + /** + * 是否能够退票校验入参 + */ + private TpProdRefundAvailableCheckDTO refundAvailableCheckDTO; +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/context/TpRefundTicketCommonContext.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/context/TpRefundTicketCommonContext.java new file mode 100644 index 0000000..774c0f2 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/context/TpRefundTicketCommonContext.java @@ -0,0 +1,111 @@ +package com.deepinnet.tptradeprod.biz.service.flow.refundTicket.context; + +import com.deepinnet.tpproductcore.common.dto.product.TpProdDetailDTO; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpRefundTicketApplyContext; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.enums.TpFlowProcessTypeEnum; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import lombok.Data; + +import java.util.*; + +/** + * @author amos wong + * @create 2024/2/1 17:55 + * @Description + */ +@Data +public class TpRefundTicketCommonContext { + + /** + * 退票申请上下文 + */ + private TpRefundTicketApplyContext refundTicketApplyContext; + + /** + * 计算退票金额上下文 + */ + private TpCalculateRefundAmountContext calculateRefundAmountContext; + + /** + * 是否能够退票校验上下文 + */ + private TpRefundTicketCheckContext refundTicketCheckContext; + + /** + * 是否展示退票按钮的上下文 + */ + private TpRefundTicketButtonShowableContext ticketButtonShowableContext; + + /** + * 查询可退凭证上下文 + */ + private TpQueryAvailableVoucherContext queryAvailableVoucherContext; + + /** + * 当前正在执行的流程类型 + */ + private TpFlowProcessTypeEnum processType; + + /** + * 退票通用请求参数 + */ + private TpRefundTicketCommonRequest commonRequest; + + /** + * 凭证列表 + */ + private List voucherList; + + /** + * 订单详情 + */ + private TpProdOrderDetailVO orderDetailVO; + + /** + * 产品详情 + */ + private TpProdDetailDTO productDetailDTO; + + /** + * 退票申请单 + */ + private List refundApplyOrderDTOs; + + /** + * 凭证乘车记录 + */ + private List verificationRecordList; + + /** + * 非实名制退票乘客数量与凭证的映射map + * key为退票乘客数量,value为凭证 + */ + Map> nonRealNameRefundVoucherMap; + + /** + * 退票次数校验规则 + */ + private List ticketRefundCountRules; + + /** + * 退票时间规则 + */ + private List ticketRefundTimeRules; + + /** + * 退票手续费规则 + */ + private List beforeDepartureRefundChargeRules; + + /** + * 发车后退票手续费规则 + */ + private List afterDepartureRefundChargeRules; + + /** + * 支付单 + */ + private TpProdPayOrderDTO paidOrderDTO; + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/context/TpRefundTicketCommonRequest.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/context/TpRefundTicketCommonRequest.java new file mode 100644 index 0000000..50bfcf3 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/context/TpRefundTicketCommonRequest.java @@ -0,0 +1,42 @@ +package com.deepinnet.tptradeprod.biz.service.flow.refundTicket.context; + +import lombok.Data; + +@Data +public class TpRefundTicketCommonRequest { + + /** + * 产品编号 + */ + private String productNo; + + /** + * 用户编号 + */ + private String userNo; + + /** + * 产品类目编号 + */ + private String productCategoryNo; + + /** + * 申请时间 + */ + private Long applyTime; + + /** + * 行程类型 + */ + private String tripType; + + /** + * 租户id + */ + private String tenantId; + + /** + * 订单编号 + */ + private String orderNo; +} \ No newline at end of file diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/execute/TpCalculateRefundAmountNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/execute/TpCalculateRefundAmountNode.java new file mode 100644 index 0000000..e7da23f --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/execute/TpCalculateRefundAmountNode.java @@ -0,0 +1,411 @@ +package com.deepinnet.tptradeprod.biz.service.flow.refundTicket.execute; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.constants.GlobalConstants; +import com.deepinnet.tp.common.lang.util.*; +import com.deepinnet.tpbaseopcore.common.constants.RouteConstants; +import com.deepinnet.tpbaseopcore.common.dto.route.*; +import com.deepinnet.tpbaseopcore.common.dto.time.RollTimeDTO; +import com.deepinnet.tpproductcore.common.dto.product.TpProdDetailDTO; +import com.deepinnet.tpproductcore.common.dto.rule.*; +import com.deepinnet.tpproductcore.common.enums.*; +import com.deepinnet.tptradeprod.biz.service.flow.refundTicket.context.*; +import com.deepinnet.tptradeprod.biz.util.*; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.*; +import com.deepinnet.tptradeprod.common.vo.*; +import com.google.common.collect.*; +import com.yomahub.liteflow.annotation.*; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.Assert; + +import javax.annotation.Resource; +import java.math.*; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +@LiteflowComponent(value = "calculateRefundAmountNode", name = "计算退票金额节点") +@LiteflowCmpDefine +public class TpCalculateRefundAmountNode { + + @Resource + private TpRouteClient routeClient; + + @Resource + private TpBizRuleClient bizRuleClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + TpRefundTicketCommonContext commonContext = bindCmp.getContextBean(TpRefundTicketCommonContext.class); + TpCalculateRefundAmountContext calculateRefundAmountContext = commonContext.getCalculateRefundAmountContext(); + TpProdCalculateRefundAmountDTO calculateRefundAmountDTO = calculateRefundAmountContext.getCalculateRefundAmountDTO(); + Boolean realNameRefund = calculateRefundAmountDTO.getRealNameRefund(); + String tenantId = calculateRefundAmountDTO.getTenantId(); + BigDecimal needRefundAmount; + BigDecimal totalPaidAmount; + BigDecimal chargeAmount; + + // 获取所有可退的凭证 + List availableRefundVoucherList = commonContext.getVoucherList(); + List actuallyRefundVoucherList = Lists.newArrayList(); + Map> nonRealNameRefundPassengerVoucherMap = Maps.newHashMap(); + + if (!realNameRefund) { + List nonRealNameTicketChoiceDTOs = calculateRefundAmountDTO.getNonRealNameTicketChoiceDTOs(); + // 通过乘车日期 & 乘车人数来获取需要退的凭证 这里组装这个map是为了计算非实名制的退票金额 + // k: 退票人数,v: 凭证 + nonRealNameRefundPassengerVoucherMap = getNonRealNameRefundVouchers(nonRealNameTicketChoiceDTOs, availableRefundVoucherList); + Assert.notEmpty(nonRealNameRefundPassengerVoucherMap, "非实名制退票人数和凭证映射关系不存在"); + for (List value : nonRealNameRefundPassengerVoucherMap.values()) { + actuallyRefundVoucherList.addAll(value); + } + } else { + List realNameTicketRefundChoiceDTOs = calculateRefundAmountDTO.getRealNameTicketRefundChoiceDTOs(); + for (TpRealNameTicketRefundChoiceDTO realNameTicketRefundChoiceDTO : realNameTicketRefundChoiceDTOs) { + TpRefundPassengerDTO refundPassengerDTO = realNameTicketRefundChoiceDTO.getRefundPassengerDTO(); + + // 过滤出当前乘客的所有凭证 + List curPassengerAvailableVouchers = availableRefundVoucherList + .stream() + .filter(v -> StringUtils.equals(refundPassengerDTO.getPassengerNo(), v.getPassenger().getPassengerNo())) + .collect(Collectors.toList()); + if (CollectionUtils.isEmpty(curPassengerAvailableVouchers)) { + LogUtil.error("当前乘客不存在可退的凭证,乘客编号:{}, 当前订单所有可退凭证列表:{}", refundPassengerDTO.getPassengerNo(), JSONUtil.toJsonStr(availableRefundVoucherList)); + throw new TpTradeProdException(TpTradeProdErrorCode.NOT_FOUND_REFUND_AVAILABLE_VOUCHER); + } + + // 过滤出来当前乘客选择的日期对应的凭证 + List curPassengerActuallyRefundVoucherList = getRealNameNeedRefundVouchers(realNameTicketRefundChoiceDTO.getVoucherTravelDateList(), curPassengerAvailableVouchers); + actuallyRefundVoucherList.addAll(curPassengerActuallyRefundVoucherList); + } + } + + TpProdDetailDTO productDetailDTO = commonContext.getProductDetailDTO(); + Boolean needChargeAmount = productDetailDTO.getExtendAttributes().getNeedRefundServiceFee(); + TpProdOrderDetailVO orderDetailVO = commonContext.getOrderDetailVO(); + List orderPriceRecords = orderDetailVO.getOrderPriceRecord(); + Assert.notEmpty(orderPriceRecords, "订单的报价记录不能为空"); + TpOrderPriceRecordVO orderPriceRecordVO = orderPriceRecords.get(0); + + // 滚动发车线路详情 + RouteRollTimeDetailDTO routeRollTimeDetail = getRouteRollTimeDetail(orderDetailVO, tenantId); + + // 判断是否需要收取手续费 + // 退票不需要收手续费,全额退票,需要查找订单明细 + if (!needChargeAmount) { + needRefundAmount = calculateFullRefundAmount(orderPriceRecordVO, realNameRefund, actuallyRefundVoucherList, nonRealNameRefundPassengerVoucherMap); + totalPaidAmount = needRefundAmount; + chargeAmount = BigDecimal.ZERO; + } else { + // 首站发车时间 -> 对应的凭证的支付金额 + // value为list的原因是实名制 张三、李四买1.1号的票,结果1.1号会对应两张凭证的支付金额 + Map> voucherDepartureTimePaidAmountMap = Maps.newHashMap(); + List beforeDepartureRefundChargeRules = commonContext.getBeforeDepartureRefundChargeRules(); + List afterDepartureRefundChargeRules = commonContext.getAfterDepartureRefundChargeRules(); + Assert.isTrue(CollectionUtils.isNotEmpty(beforeDepartureRefundChargeRules) || CollectionUtils.isNotEmpty(afterDepartureRefundChargeRules), "退票手续费规则不能为空"); + + if (realNameRefund) { + for (TpProdVoucherDTO needRefundVoucher : actuallyRefundVoucherList) { + String voucherSinglePaidAmount = getVoucherSinglePrice(orderPriceRecordVO.getOrderPriceRecordDetails(), needRefundVoucher); + long firstShuttleDepartureTime = calculateFirstShuttleDepartureTime(orderDetailVO, needRefundVoucher.getTripType(), routeRollTimeDetail, needRefundVoucher.getEffectiveStartTime()); + List curTimeVoucherPaidAmountList = voucherDepartureTimePaidAmountMap.get(firstShuttleDepartureTime); + if (CollectionUtils.isEmpty(curTimeVoucherPaidAmountList)) { + curTimeVoucherPaidAmountList = Lists.newArrayList(); + curTimeVoucherPaidAmountList.add(voucherSinglePaidAmount); + voucherDepartureTimePaidAmountMap.put(firstShuttleDepartureTime, curTimeVoucherPaidAmountList); + } else { + curTimeVoucherPaidAmountList.add(voucherSinglePaidAmount); + } + } + } else { + // 非实名制,购买乘车人数为5,选择的退票乘车人数为2,则退票需要 2 * 凭证单价去计算手续费 + nonRealNameRefundPassengerVoucherMap.forEach((refundPassengerCount, voucherList) -> { + voucherList.forEach(voucher -> { + String voucherSinglePaidAmount = getVoucherSinglePrice(orderPriceRecordVO.getOrderPriceRecordDetails(), voucher); + long firstShuttleDepartureTime = calculateFirstShuttleDepartureTime(orderDetailVO, voucher.getTripType(), routeRollTimeDetail, voucher.getEffectiveStartTime()); + List curTimeVoucherPaidAmountList = voucherDepartureTimePaidAmountMap.get(firstShuttleDepartureTime); + + // 计算当前退票乘车人数对应的总的支付金额 + BigDecimal curRefundPassengerTotalPaidAmount = new BigDecimal(voucherSinglePaidAmount).multiply(new BigDecimal(refundPassengerCount)); + + if (CollectionUtils.isEmpty(curTimeVoucherPaidAmountList)) { + curTimeVoucherPaidAmountList = Lists.newArrayList(); + curTimeVoucherPaidAmountList.add(curRefundPassengerTotalPaidAmount.toPlainString()); + voucherDepartureTimePaidAmountMap.put(firstShuttleDepartureTime, curTimeVoucherPaidAmountList); + } else { + curTimeVoucherPaidAmountList.add(curRefundPassengerTotalPaidAmount.toPlainString()); + } + }); + }); + } + + // 批量执行规则获取退票手续费 + long totalChargeCent = refundTickChargeAmount(voucherDepartureTimePaidAmountMap, beforeDepartureRefundChargeRules, afterDepartureRefundChargeRules, tenantId); + chargeAmount = new BigDecimal(totalChargeCent).divide(new BigDecimal(100), 2, RoundingMode.DOWN); + totalPaidAmount = calculateFullRefundAmount(orderPriceRecordVO, realNameRefund, actuallyRefundVoucherList, nonRealNameRefundPassengerVoucherMap); + needRefundAmount = totalPaidAmount.subtract(chargeAmount); + } + + TpProdCalculateRefundAmountVO calculateRefundAmountVO = TpProdCalculateRefundAmountVO.builder() + .refundAmount(needRefundAmount.setScale(2, RoundingMode.DOWN).toPlainString()) + .chargeAmount(chargeAmount.setScale(2, RoundingMode.DOWN).toPlainString()) + .payAmount(totalPaidAmount.setScale(2, RoundingMode.DOWN).toPlainString()) + .build(); + calculateRefundAmountContext.setCalculateRefundAmountVO(calculateRefundAmountVO); + + // 向下透传计算好的非实名制凭证和退票人数的关系 + if (MapUtil.isNotEmpty(nonRealNameRefundPassengerVoucherMap)) { + commonContext.setNonRealNameRefundVoucherMap(nonRealNameRefundPassengerVoucherMap); + } + } + + private RouteRollTimeDetailDTO getRouteRollTimeDetail(TpProdOrderDetailVO orderDetailVO, String tenantId) { + // 滚动发车 + List orderRoutes = orderDetailVO.getTpOrderRoutes(); + Assert.notEmpty(orderRoutes, "线路信息不能为空"); + TpOrderRouteVO routeVO = orderRoutes.get(0); + RouteRollTimeDetailDTO routeRollTimeDetailDTO = routeClient.getRouteRollTime(routeVO.getRouteNo(), tenantId); + Assert.notNull(routeRollTimeDetailDTO, "滚动发车时间表不能为空"); + return routeRollTimeDetailDTO; + } + + private BigDecimal calculateFullRefundAmount(TpOrderPriceRecordVO orderPriceRecordVO, Boolean realNameRefund, List actuallyRefundVoucherList, + Map> nonRealNameRefundPassengerVoucherMap) { + BigDecimal totalRefundAmount; + // 售卖单元价格明细,根据售卖单元&乘客类型两个key group + List orderPriceRecordDetails = orderPriceRecordVO.getOrderPriceRecordDetails(); + // 实名制退全款金额计算 + if (realNameRefund) { + totalRefundAmount = calculateFullRefundAmountWithRealNameVouchers(actuallyRefundVoucherList, orderPriceRecordDetails); + } else { + totalRefundAmount = calculateFullRefundAmountWithNonRealNameVouchers(nonRealNameRefundPassengerVoucherMap, orderPriceRecordDetails); + } + + return totalRefundAmount; + } + + private BigDecimal calculateFullRefundAmountWithNonRealNameVouchers(Map> nonRealNameRefundPassengerVoucherMap, List orderPriceRecordDetails) { + BigDecimal totalRefundAmount = new BigDecimal(0); + for (Map.Entry> entry : nonRealNameRefundPassengerVoucherMap.entrySet()) { + Integer refundPassengerCount = entry.getKey(); + List voucherList = entry.getValue(); + for (TpProdVoucherDTO v : voucherList) { + String voucherSinglePrice = getVoucherSinglePrice(orderPriceRecordDetails, v); + totalRefundAmount = totalRefundAmount.add(new BigDecimal(voucherSinglePrice).multiply(new BigDecimal(refundPassengerCount))); + } + } + + return totalRefundAmount; + } + + private BigDecimal calculateFullRefundAmountWithRealNameVouchers(List actuallyRefundVoucherList, List orderPriceRecordDetails) { + BigDecimal totalRefundAmount = new BigDecimal(0); + for (TpProdVoucherDTO v : actuallyRefundVoucherList) { + String singleNeedRefundAmount = getVoucherSinglePrice(orderPriceRecordDetails, v); + totalRefundAmount = totalRefundAmount.add(new BigDecimal(singleNeedRefundAmount)); + } + + return totalRefundAmount; + } + + private String getVoucherSinglePrice(List orderPriceRecordDetails, TpProdVoucherDTO v) { + String passengerType = ObjectUtil.isNull(v.getPassenger()) ? null : v.getPassenger().getPassengerType(); + String salesUnitCode = v.getSalesUnitCode(); + List curVoucherPriceDetails = orderPriceRecordDetails.stream() + .filter(detail -> StringUtils.equals(detail.getPassengerType(), passengerType) && StringUtils.equals(detail.getItemNo(), salesUnitCode)) + .collect(Collectors.toList()); + + if (CollectionUtils.isEmpty(curVoucherPriceDetails)) { + LogUtil.error("无法计算退票金额,因为当前凭证对应的售卖单元的价格明细不存在,凭证编号为:{},售卖单元编号为:{}", v.getVoucherNo(), salesUnitCode); + throw new TpTradeProdException(TpTradeProdErrorCode.NOT_FOUND_CURRENT_SALE_UNIT_PRICE_DETAIL, TpTradeProdErrorCode.NOT_FOUND_CURRENT_SALE_UNIT_PRICE_DETAIL.getDesc()); + } + Assert.notEmpty(curVoucherPriceDetails, "当前乘客类型对应的价格明细不存在"); + + TpProdOrderPriceRecordDetailVO orderPriceRecordDetailVO = curVoucherPriceDetails.get(0); + return orderPriceRecordDetailVO.getSingleDiscountAmount(); + } + + private Map> getNonRealNameRefundVouchers(List nonRealNameTicketChoiceDTOs, List availableRefundVoucherList) { + Map> refundPassengerCountVoucherMap = Maps.newHashMap(); + List actuallyRefundVoucherList = Lists.newArrayList(); + + for (TpNonRealNameTicketRefundChoiceDTO nonRealNameTicketChoiceDTO : nonRealNameTicketChoiceDTOs) { + String voucherTravelDate = nonRealNameTicketChoiceDTO.getVoucherTravelDate(); + String[] split = voucherTravelDate.split(GlobalConstants.HORIZONTAL_LINE); + Long effectiveStartTime = Long.valueOf(split[0]); + Long effectiveEndTime = Long.valueOf(split[1]); + + Integer refundPassengerCount = nonRealNameTicketChoiceDTO.getRefundPassengerCount(); + List curDateActuallyRefundVoucherList = availableRefundVoucherList + .stream() + .filter(v -> { + boolean isValid = TpVoucherUtil.isRefundPassengerCountValid(v, refundPassengerCount); + return Objects.equals(v.getEffectiveStartTime(), effectiveStartTime) && Objects.equals(v.getEffectiveEndTime(), effectiveEndTime) && isValid; + }).collect(Collectors.toList()); + + if (CollectionUtils.isEmpty(curDateActuallyRefundVoucherList)) { + LogUtil.error("用户选定的退票日期对应的凭证不存在,退票日期为:{},凭证列表为:{}", voucherTravelDate, JSONUtil.toJsonStr(availableRefundVoucherList)); + throw new TpTradeProdException(TpTradeProdErrorCode.NOT_FOUND_REFUND_AVAILABLE_VOUCHER); + } + + actuallyRefundVoucherList.addAll(curDateActuallyRefundVoucherList); + } + + // 非实名制的凭证 同一个生失效时间只会有一张凭证 + Map effectiveTimeVoucherMap = actuallyRefundVoucherList.stream() + .collect(Collectors.toMap(v -> v.getEffectiveStartTime() + GlobalConstants.HORIZONTAL_LINE + v.getEffectiveEndTime(), Function.identity())); + Map nonRealNameTicketRefundChoiceDTOMap = nonRealNameTicketChoiceDTOs + .stream() + .collect(Collectors.toMap(TpNonRealNameTicketRefundChoiceDTO::getVoucherTravelDate, Function.identity())); + + effectiveTimeVoucherMap.forEach((effectiveTime, v) -> { + TpNonRealNameTicketRefundChoiceDTO choiceDTO = nonRealNameTicketRefundChoiceDTOMap.get(effectiveTime); + if (ObjectUtil.isNull(choiceDTO)) { + LogUtil.error("当前数据异常,当前生效时间对应的凭证不存在,有效期为:{}", effectiveTime); + throw new TpTradeProdException(TpTradeProdErrorCode.DATA_INVALID, TpTradeProdErrorCode.DATA_INVALID.getDesc()); + } + Integer refundPassengerCount = choiceDTO.getRefundPassengerCount(); + + List voucherList = refundPassengerCountVoucherMap.get(refundPassengerCount); + if (CollectionUtils.isEmpty(voucherList)) { + refundPassengerCountVoucherMap.put(refundPassengerCount, Lists.newArrayList(v)); + } else { + voucherList.add(v); + refundPassengerCountVoucherMap.put(refundPassengerCount, voucherList); + } + }); + + return refundPassengerCountVoucherMap; + } + + private List getRealNameNeedRefundVouchers(List voucherTravelDateList, List curPassengerAvailableVouchers) { + List actuallyRefundVoucherList = Lists.newArrayList(); + + voucherTravelDateList.forEach(travelDate -> { + String[] split = travelDate.split(GlobalConstants.HORIZONTAL_LINE); + Long refundEffectiveStartTime = Long.valueOf(split[0]); + Long refundEffectiveEndTime = Long.valueOf(split[1]); + List curTravelDateNeedRefundVouchers = curPassengerAvailableVouchers.stream() + .filter(v -> Objects.equals(v.getEffectiveStartTime(), refundEffectiveStartTime) && Objects.equals(v.getEffectiveEndTime(), refundEffectiveEndTime)) + .collect(Collectors.toList()); + + if (CollectionUtils.isEmpty(curTravelDateNeedRefundVouchers)) { + LogUtil.error("当前乘客当前的乘车日期没有可退的凭证,当前日期为:{},当前乘客的凭证列表为:{}", travelDate, JSONUtil.toJsonStr(curPassengerAvailableVouchers)); + throw new TpTradeProdException(TpTradeProdErrorCode.NOT_FOUND_REFUND_AVAILABLE_VOUCHER); + } + + actuallyRefundVoucherList.addAll(curTravelDateNeedRefundVouchers); + }); + + return actuallyRefundVoucherList; + } + + private long calculateFirstShuttleDepartureTime(TpProdOrderDetailVO orderDetail, String tripType, RouteRollTimeDetailDTO routeRollTimeDetail, Long voucherEffectiveStartTime) { + List orderRoutes = orderDetail.getTpOrderRoutes(); + Assert.notEmpty(orderRoutes, "线路信息不能为空"); + TpOrderRouteVO routeVO = orderRoutes.get(0); + + // 有班次,普通班车 + if (routeVO.getTpOrderRouteShuttle() != null) { + List orderRouteShuttleList = routeVO.getTpOrderRouteShuttle(); + TpOrderRouteShuttleVO routeShuttle = orderRouteShuttleList.stream() + .filter(s -> StringUtils.equals(tripType, s.getTripType())) + .findAny() + .get(); + String shuttleTime = routeShuttle.getShuttleTime(); + return TimeConvertUtil.convertDateAndTime2Timestamp(voucherEffectiveStartTime, shuttleTime); + } else { + // 滚动发车 + String firstTime; + String roundTrip = routeVO.getRoundTrip(); + if (StringUtils.equals(roundTrip, RouteConstants.GO)) { + List goRollTimes = routeRollTimeDetail.getGoRollTimes(); + Assert.notEmpty(goRollTimes, "去程时间不能为空"); + List sortedRollTimes = goRollTimes.stream().sorted(Comparator.comparing(RollTimeDTO::getOrder)).collect(Collectors.toList()); + firstTime = sortedRollTimes.get(0).getFirstTime(); + } else if (StringUtils.equals(roundTrip, RouteConstants.BACK)) { + List backRollTimes = routeRollTimeDetail.getBackRollTimes(); + Assert.notEmpty(backRollTimes, "返程时间不能为空"); + List sortedRollTimes = backRollTimes.stream().sorted(Comparator.comparing(RollTimeDTO::getOrder)).collect(Collectors.toList()); + firstTime = sortedRollTimes.get(0).getFirstTime(); + } else { + // 下面是往返程订单,需要根据tripType去区分 + // 计算往返程订单里面的去程 + if (StringUtils.equals(tripType, TpTripTypeEnum.GO.getCode())) { + List goRollTimes = routeRollTimeDetail.getGoRollTimes(); + Assert.notEmpty(goRollTimes, "去程时间不能为空"); + List sortedRollTimes = goRollTimes.stream().sorted(Comparator.comparing(RollTimeDTO::getOrder)).collect(Collectors.toList()); + firstTime = sortedRollTimes.get(0).getFirstTime(); + } else { + // 计算往返程订单里面的返程 + List backRollTimes = routeRollTimeDetail.getBackRollTimes(); + Assert.notEmpty(backRollTimes, "返程时间不能为空"); + List sortedRollTimes = backRollTimes.stream().sorted(Comparator.comparing(RollTimeDTO::getOrder)).collect(Collectors.toList()); + firstTime = sortedRollTimes.get(0).getFirstTime(); + } + } + + return TimeConvertUtil.convertDateAndTime2Timestamp(voucherEffectiveStartTime, firstTime); + } + } + + /** + * 退票手续费计算 + */ + private long refundTickChargeAmount(Map> voucherDepartureTimePaidAmountMap, List beforeDepartureRefundChargeRules, List afterDepartureRefundChargeRules, String tenantId) { + List> executeDTOs = Lists.newArrayList(); + voucherDepartureTimePaidAmountMap.forEach((time, paidAmountList) -> { + for (String paidAmount : paidAmountList) { + TpRuleExecuteDTO executeDTO = new TpRuleExecuteDTO<>(); + TpTicketRefundParamDTO refundParamDTO = new TpTicketRefundParamDTO(); + refundParamDTO.setFirstShuttleDepartureTime(time); + refundParamDTO.setOrderPrice(new BigDecimal(paidAmount)); + executeDTO.setParameter(refundParamDTO); + + // 发车前手续费规则 + if (System.currentTimeMillis() <= time) { + executeDTO.setRuleExpressionGroup(TpRuleExpressionGroupEnum.REFUND_CHARGE); + executeDTO.setRuleList(beforeDepartureRefundChargeRules); + } else { + // 发车后手续费规则 + executeDTO.setRuleExpressionGroup(TpRuleExpressionGroupEnum.AFTER_DEPARTURE_CHARGE); + executeDTO.setRuleList(afterDepartureRefundChargeRules); + } + executeDTO.setTenantId(tenantId); + executeDTOs.add(executeDTO); + } + }); + + LogUtil.info("调用产品域的接口计算退票手续费的入参为:{}", JSONUtil.toJsonStr(executeDTOs)); + TpRuleExecuteBatchResultVO batchResultVO = bizRuleClient.batchExecuteBizRule(executeDTOs); + List> resultList = batchResultVO.getResultList(); + LogUtil.info("规则域计算手续费返回的结果为:{}", JSONUtil.toJsonStr(resultList)); + + // 接口返回success,手续费金额为null,未匹配到手续费区间,手续费按0元计算 + if (CollectionUtils.isEmpty(resultList)) { + LogUtil.info("调用产品域的接口计算退票手续费的结果为空,手续费按0元计算"); + return 0; + } + + long totalChargeMoney = 0; + for (TpRuleExecuteResultVO result : resultList) { + TpMoney chargeMoney = result.getResult(); + if (Objects.equals(chargeMoney.compare(new TpMoney("0", TpMoney.ValueUnitEnum.YUAN)), TpMoney.CompareResult.LESS_THAN)) { + LogUtil.error("执行退票手续费计算规则失败,,失败原因:获取到的手续费金额非法,返回结果为:{}", result.getMsg()); + throw new TpTradeProdException(TpTradeProdErrorCode.REFUND_CHARGE_AMOUNT_INVALID); + } + totalChargeMoney += chargeMoney.getCent(); + } + + LogUtil.info("调用产品域的接口计算退票手续费的金额为:{}", totalChargeMoney); + return totalChargeMoney; + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/execute/TpCreateRefundApplyOrderNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/execute/TpCreateRefundApplyOrderNode.java new file mode 100644 index 0000000..e57357d --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/execute/TpCreateRefundApplyOrderNode.java @@ -0,0 +1,288 @@ +package com.deepinnet.tptradeprod.biz.service.flow.refundTicket.execute; + +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.constants.GlobalConstants; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpproductcore.common.dto.product.TpProdDetailDTO; +import com.deepinnet.tpproductcore.common.enums.*; +import com.deepinnet.tpproductcore.common.utils.TicketDateRangeParser; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpRefundTicketApplyContext; +import com.deepinnet.tptradeprod.biz.service.flow.refundTicket.context.TpRefundTicketCommonContext; +import com.deepinnet.tptradeprod.biz.util.*; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.enums.TpProdOrderTicketTypeEnum; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.TpContractClient; +import com.deepinnet.tptradeprod.common.vo.*; +import com.google.common.collect.*; +import com.yomahub.liteflow.annotation.*; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; + +import javax.annotation.Resource; +import java.time.LocalDate; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * @author amos wong + * @create 2023/10/16 15:34 + * @Description + */ +@LiteflowComponent(value = "createRefundApplyOrderNode", name = "创建退票申请单节点") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +public class TpCreateRefundApplyOrderNode { + + @Resource + private TpContractClient contractClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + TpRefundTicketCommonContext commonContext = bindCmp.getContextBean(TpRefundTicketCommonContext.class); + LogUtil.info("执行创建退票申请单节点,入参为:{}", JSONUtil.toJsonStr(commonContext)); + + TpRefundTicketApplyContext refundTicketApplyContext = commonContext.getRefundTicketApplyContext(); + TpProdRefundApplyDTO refundApplyDTO = refundTicketApplyContext.getRefundApplyDTO(); + TpProdDetailDTO productDetailDTO = commonContext.getProductDetailDTO(); + List voucherList = commonContext.getVoucherList(); + TpProdOrderDetailVO orderDetailVO = commonContext.getOrderDetailVO(); + + String orgCode = productDetailDTO.getRouteDetailDTO().getRouteBase().getOrgCode(); + refundApplyDTO.setOrgCode(orgCode); + + refundApplyDTO.setApplyTime(System.currentTimeMillis()); + List refundSubjectItemDTOs = buildRefundItems(refundApplyDTO, orderDetailVO, voucherList, commonContext); + refundApplyDTO.setRefundSubjectItems(refundSubjectItemDTOs); + + String refundApplyOrderNo = contractClient.refundTicket(refundApplyDTO); + refundTicketApplyContext.setRefundApplyOrderNo(refundApplyOrderNo); + } + + private List buildRefundItems(TpProdRefundApplyDTO refundApplyDTO, TpProdOrderDetailVO orderDetailVO, + List voucherList, TpRefundTicketCommonContext commonContext) { + String tripType = refundApplyDTO.getTripType(); + List orderSubjectItems = orderDetailVO.getOrderSubjectItem() + .stream() + .filter(item -> StringUtils.equals(tripType, item.getTripType())) + .collect(Collectors.toList()); + List refundSubjectItems = Lists.newArrayList(); + List realNameTicketRefundChoiceDTOs = refundApplyDTO.getRealNameTicketRefundChoiceDTOs(); + List nonRealNameTicketChoiceDTOs = refundApplyDTO.getNonRealNameTicketChoiceDTOs(); + String type = voucherList.get(0).getType(); + + // 实名制 + if (CollectionUtils.isNotEmpty(realNameTicketRefundChoiceDTOs)) { + List needRefundSubjectItems = Lists.newArrayList(); + for (TpRealNameTicketRefundChoiceDTO realNameTicketRefundChoiceDTO : realNameTicketRefundChoiceDTOs) { + String passengerNo = realNameTicketRefundChoiceDTO.getRefundPassengerDTO().getPassengerNo(); + List voucherTravelDateList = realNameTicketRefundChoiceDTO.getVoucherTravelDateList(); + List curNeedRefundSubjectItems = findNeedRefundSubjectItems(orderSubjectItems, voucherTravelDateList, type, passengerNo); + Assert.notEmpty(curNeedRefundSubjectItems, "当前退票乘客对应的订单标的项不能为空"); + needRefundSubjectItems.addAll(curNeedRefundSubjectItems); + } + + needRefundSubjectItems.forEach(orderSubjectItem -> { + TpRefundSubjectItemDTO refundSubjectItem = new TpRefundSubjectItemDTO(); + refundSubjectItem.setSubjectItemId(orderSubjectItem.getItemNo()); + refundSubjectItem.setSubjectItemType(orderSubjectItem.getType()); + refundSubjectItem.setQuantity(orderSubjectItem.getCount()); + refundSubjectItem.setTripType(orderSubjectItem.getTripType()); + + // 退票乘客信息 + TpRefundPassengerDTO refundPassenger = buildPassenger(orderSubjectItem.getPassenger(), refundSubjectItem.getSubjectItemNo(), refundApplyDTO.getTenantId()); + refundSubjectItem.setPassenger(refundPassenger); + + // 退票标的项组成要素 + List refundElements = buildRefundSubjectItems(orderSubjectItem.getOrderItemElements(), refundApplyDTO.getTenantId()); + refundSubjectItem.setSubjectItemElements(refundElements); + + refundSubjectItem.setTenantId(refundApplyDTO.getTenantId()); + refundSubjectItems.add(refundSubjectItem); + }); + } else { + Map> refundPassengerCountVoucherMap = getNonRealNameRefundVouchers(nonRealNameTicketChoiceDTOs, voucherList); + Map saleUnitNoSubjectItemMap = orderSubjectItems.stream() + .collect(Collectors.toMap(TpOrderSubjectItemVO::getItemNo, Function.identity())); + + refundPassengerCountVoucherMap.forEach((refundPassengerCount, voucherDTOs) -> { + for (TpProdVoucherDTO v : voucherDTOs) { + TpOrderSubjectItemVO subjectItemVO = saleUnitNoSubjectItemMap.get(v.getSalesUnitCode()); + Assert.notNull(subjectItemVO, "标的项不能为空"); + + TpRefundSubjectItemDTO refundSubjectItem = new TpRefundSubjectItemDTO(); + refundSubjectItem.setSubjectItemId(subjectItemVO.getItemNo()); + refundSubjectItem.setSubjectItemType(subjectItemVO.getType()); + refundSubjectItem.setQuantity(refundPassengerCount); + refundSubjectItem.setTripType(subjectItemVO.getTripType()); + + // 退票标的项组成要素 + List refundElements = buildRefundSubjectItems(subjectItemVO.getOrderItemElements(), refundApplyDTO.getTenantId()); + refundSubjectItem.setSubjectItemElements(refundElements); + + refundSubjectItem.setTenantId(refundApplyDTO.getTenantId()); + refundSubjectItems.add(refundSubjectItem); + } + }); + + // 向下透传非实名制退票人数和凭证的map + commonContext.setNonRealNameRefundVoucherMap(refundPassengerCountVoucherMap); + } + + return refundSubjectItems; + } + + private List findNeedRefundSubjectItems(List subjectItems, List voucherTravelDateList, String voucherType, String passengerNo) { + List orderSubjectItemList = subjectItems + .stream() + .filter(orderSubjectItem -> StringUtils.equals(passengerNo, orderSubjectItem.getPassengerNo())) + .collect(Collectors.toList()); + Assert.notEmpty(orderSubjectItemList, "退票乘客对应的订单标的项不能为空"); + + // 凭证类型转化为产品域的票据类型 + String ticketType = convertVoucherType2TicketType(voucherType); + Assert.notBlank(ticketType, "票类型不能为空"); + + List needRefundSubjectItems = Lists.newArrayList(); + for (TpOrderSubjectItemVO subjectItem : orderSubjectItemList) { + List dateElements = subjectItem.getOrderItemElements() + .stream() + .filter(element -> StringUtils.equals(element.getElementCode(), TpFactorCodeEnum.DATE.getCode())) + .collect(Collectors.toList()); + + Assert.isTrue(CollectionUtils.isNotEmpty(dateElements) && dateElements.size() == 1, "日期要素为空或者不唯一"); + TpOrderSubjectItemElementVO curDateElement = dateElements.get(0); + // 计算票的生失效时间范围 + TicketDateRangeParser.DateRange ticketEffectiveDateRange = TicketDateRangeParser.parseTicketDates(ticketType, curDateElement.getElementValue()); + LocalDate startDate = ticketEffectiveDateRange.getStartDate(); + LocalDate endDate = ticketEffectiveDateRange.getEndDate(); + Long startDateTimestamp = LocalDateTimeUtil.toEpochMilli(startDate); + Long endDateTimestamp = LocalDateTimeUtil.toEpochMilli(endDate); + + // 分割用户选择的退票日期 + boolean isNeedRefund = false; + for (String travelDate : voucherTravelDateList) { + String[] splitTravelTime = travelDate.split(GlobalConstants.HORIZONTAL_LINE); + Long startTime = Long.valueOf(splitTravelTime[0]); + Long endTime = Long.valueOf(splitTravelTime[1]); + Long refundStartTime = TimeConvertUtil.convertTimestamp2StartTimestamp(startTime); + Long refundEndTime = TimeConvertUtil.convertTimestamp2StartTimestamp(endTime); + if (startDateTimestamp.equals(refundStartTime) && endDateTimestamp.equals(refundEndTime)) { + isNeedRefund = true; + break; + } + } + if (isNeedRefund) { + needRefundSubjectItems.add(subjectItem); + } + } + + return needRefundSubjectItems; + } + + private String convertVoucherType2TicketType(String voucherType) { + if (StringUtils.equals(voucherType, TpProdOrderTicketTypeEnum.DAY.getTicketType())) { + return TicketTypeEnum.SINGLE_RIDE.getType(); + } else if (StringUtils.equals(voucherType, TpProdOrderTicketTypeEnum.WEEK.getTicketType())) { + return TicketTypeEnum.WEEKLY.getType(); + } else if (StringUtils.equals(voucherType, TpProdOrderTicketTypeEnum.MONTH.getTicketType())) { + return TicketTypeEnum.MONTHLY.getType(); + } else if (StringUtils.equals(voucherType, TpProdOrderTicketTypeEnum.TERM.getTicketType())) { + return TicketTypeEnum.SEMESTER.getType(); + } else if (StringUtils.equals(voucherType, TpProdOrderTicketTypeEnum.DAY_RANGE.getTicketType())) { + return TicketTypeEnum.DAY_RANGE.getType(); + } else { + return null; + } + } + + private TpRefundPassengerDTO buildPassenger(TpOrderPassengerVO orderPassenger, String refundSubjectItemNo, String tenantId) { + TpRefundPassengerDTO refundPassenger = new TpRefundPassengerDTO(); + refundPassenger.setRefundSubjectItemNo(refundSubjectItemNo); + refundPassenger.setPassengerNo(orderPassenger.getPassengerNo()); + refundPassenger.setName(orderPassenger.getPassengerName()); + refundPassenger.setContactInfo(orderPassenger.getPassengerContact()); + refundPassenger.setCertNo(orderPassenger.getIdentificationNumber()); + refundPassenger.setCertType(orderPassenger.getIdentificationType()); + refundPassenger.setPassengerType(orderPassenger.getPassengerType()); + refundPassenger.setTenantId(tenantId); + return refundPassenger; + } + + private List buildRefundSubjectItems(List orderItemElements, String tenantId) { + List refundElements = Lists.newArrayList(); + orderItemElements.forEach(orderElement -> { + TpRefundSubjectItemElementDTO refundElement = new TpRefundSubjectItemElementDTO(); + refundElement.setSubjectItemNo(orderElement.getItemNo()); + refundElement.setName(orderElement.getElementName()); + refundElement.setCode(orderElement.getElementCode()); + refundElement.setValue(orderElement.getElementValue()); + refundElement.setUnitCode(orderElement.getElementUnit()); + refundElement.setTenantId(tenantId); + refundElements.add(refundElement); + }); + + return refundElements; + } + + private Map> getNonRealNameRefundVouchers(List nonRealNameTicketChoiceDTOs, List availableRefundVoucherList) { + Map> refundPassengerCountVoucherMap = Maps.newHashMap(); + List actuallyRefundVoucherList = Lists.newArrayList(); + + for (TpNonRealNameTicketRefundChoiceDTO nonRealNameTicketChoiceDTO : nonRealNameTicketChoiceDTOs) { + String voucherTravelDate = nonRealNameTicketChoiceDTO.getVoucherTravelDate(); + String[] split = voucherTravelDate.split(GlobalConstants.HORIZONTAL_LINE); + Long effectiveStartTime = Long.valueOf(split[0]); + Long effectiveEndTime = Long.valueOf(split[1]); + + Integer refundPassengerCount = nonRealNameTicketChoiceDTO.getRefundPassengerCount(); + List curDateActuallyRefundVoucherList = availableRefundVoucherList + .stream() + .filter(v -> { + boolean isValid = TpVoucherUtil.isRefundPassengerCountValid(v, refundPassengerCount); + return Objects.equals(v.getEffectiveStartTime(), effectiveStartTime) && Objects.equals(v.getEffectiveEndTime(), effectiveEndTime) && isValid; + }).collect(Collectors.toList()); + + if (CollectionUtils.isEmpty(curDateActuallyRefundVoucherList)) { + LogUtil.error("用户选定的退票日期对应的凭证不存在,退票日期为:{},凭证列表为:{}", voucherTravelDate, JSONUtil.toJsonStr(availableRefundVoucherList)); + throw new TpTradeProdException(TpTradeProdErrorCode.NOT_FOUND_REFUND_AVAILABLE_VOUCHER); + } + + actuallyRefundVoucherList.addAll(curDateActuallyRefundVoucherList); + } + + // 非实名制的凭证 同一个生失效时间只会有一张凭证 + Map effectiveTimeVoucherMap = actuallyRefundVoucherList.stream() + .collect(Collectors.toMap(v -> v.getEffectiveStartTime() + GlobalConstants.HORIZONTAL_LINE + v.getEffectiveEndTime(), Function.identity())); + Map nonRealNameTicketRefundChoiceDTOMap = nonRealNameTicketChoiceDTOs + .stream() + .collect(Collectors.toMap(TpNonRealNameTicketRefundChoiceDTO::getVoucherTravelDate, Function.identity())); + + effectiveTimeVoucherMap.forEach((effectiveTime, v) -> { + TpNonRealNameTicketRefundChoiceDTO choiceDTO = nonRealNameTicketRefundChoiceDTOMap.get(effectiveTime); + if (ObjectUtil.isNull(choiceDTO)) { + LogUtil.error("当前数据异常,当前生效时间对应的凭证不存在,有效期为:{}", effectiveTime); + throw new TpTradeProdException(TpTradeProdErrorCode.DATA_INVALID, TpTradeProdErrorCode.DATA_INVALID.getDesc()); + } + Integer refundPassengerCount = choiceDTO.getRefundPassengerCount(); + + List voucherList = refundPassengerCountVoucherMap.get(refundPassengerCount); + if (CollectionUtils.isEmpty(voucherList)) { + refundPassengerCountVoucherMap.put(refundPassengerCount, Lists.newArrayList(v)); + } else { + voucherList.add(v); + refundPassengerCountVoucherMap.put(refundPassengerCount, voucherList); + } + }); + + return refundPassengerCountVoucherMap; + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/execute/TpPaymentRefundNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/execute/TpPaymentRefundNode.java new file mode 100644 index 0000000..dae5290 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/execute/TpPaymentRefundNode.java @@ -0,0 +1,80 @@ +package com.deepinnet.tptradeprod.biz.service.flow.refundTicket.execute; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.*; +import com.deepinnet.tptradecore.common.dto.trans.TpPayRefundDTO; +import com.deepinnet.tptradecore.common.enums.TpBizTypeEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpRefundTicketApplyContext; +import com.deepinnet.tptradeprod.biz.service.flow.refundTicket.context.TpRefundTicketCommonContext; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.enums.TpOrderTypeEnum; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.*; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.yomahub.liteflow.annotation.*; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; + +import javax.annotation.Resource; +import java.util.Objects; + +/** + * @author amos wong + * @create 2023/10/16 15:34 + * @Description + */ +@LiteflowComponent(value = "paymentRefundNode", name = "资金域退款节点") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +public class TpPaymentRefundNode { + + @Resource + private TpPaymentClient paymentClient; + + @Resource + private TpOrderClient orderClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + TpRefundTicketCommonContext commonContext = bindCmp.getContextBean(TpRefundTicketCommonContext.class); + LogUtil.info("退票流程执行退款接口,入参为:{}", JSONUtil.toJsonStr(commonContext)); + + TpRefundTicketApplyContext refundTicketApplyContext = commonContext.getRefundTicketApplyContext(); + TpProdRefundApplyDTO refundApplyDTO = refundTicketApplyContext.getRefundApplyDTO(); + + // 改签单需要特殊处理,需要传递原始订单的总金额才能退款 + TpProdOrderDetailVO orderDetailVO = commonContext.getOrderDetailVO(); + boolean isRescheduleOrder = false; + String originalPaidAmount = orderDetailVO.getPayAmount(); + if (Objects.equals(orderDetailVO.getType(), TpOrderTypeEnum.CUSTOMIZED_RESCHEDULE_ORDER.getType())) { + String originalOrderNo = orderDetailVO.getOriginalOrderNo(); + TpProdOrderDetailVO originalOrderDetailVO = orderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .orderNo(originalOrderNo) + .tenantId(refundApplyDTO.getTenantId()) + .build()); + + isRescheduleOrder = true; + originalPaidAmount = originalOrderDetailVO.getPayAmount(); + } + + boolean refundRes = paymentClient.refund(TpPayRefundDTO.builder() + .refundBizNo(refundTicketApplyContext.getRefundApplyOrderNo()) + .refundBizType(TpBizTypeEnum.CUSTOM_BUS_REFUND.getCode()) + .isRescheduleOrder(isRescheduleOrder) + .originalPayAmount(new TpMoney(originalPaidAmount, TpMoney.ValueUnitEnum.YUAN)) + .payBizNo(refundApplyDTO.getOrderNo() + TpBizTypeEnum.CUSTOM_BUS_PAY.getCode()) + .orgCode(refundApplyDTO.getOrgCode()) + .refundAmount(new TpMoney(refundApplyDTO.getRefundAmount(), TpMoney.ValueUnitEnum.YUAN)) + .chargeAmount(new TpMoney(refundApplyDTO.getChargeAmount(), TpMoney.ValueUnitEnum.YUAN)) + .tenantId(refundApplyDTO.getTenantId()) + .build()); + + if (!refundRes) { + LogUtil.error("申请退票接口执行失败,原因:退款失败,入参为:{}", JSONUtil.toJsonStr(refundApplyDTO)); + throw new TpTradeProdException(TpTradeProdErrorCode.REFUND_ERROR); + } + + refundTicketApplyContext.setRefundResult(Boolean.TRUE); + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/execute/TpRefundChangeOrderStatusNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/execute/TpRefundChangeOrderStatusNode.java new file mode 100644 index 0000000..096aa84 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/execute/TpRefundChangeOrderStatusNode.java @@ -0,0 +1,58 @@ +package com.deepinnet.tptradeprod.biz.service.flow.refundTicket.execute; + +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.order.TpOrderPushStatusDTO; +import com.deepinnet.tptradecore.common.enums.order.TpOrderPushStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.refundTicket.context.TpRefundTicketCommonContext; +import com.deepinnet.tptradeprod.common.dto.TpProdRefundApplyDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderStatusEnum; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import lombok.RequiredArgsConstructor; + +import javax.annotation.Resource; + +/** + *

+ * 构建凭证节点 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@LiteflowComponent(value = "refundChangeOrderStatusNode", name = "退票修改订单状态为退款中节点") +@LiteflowCmpDefine +@RequiredArgsConstructor +@LiteflowRetry(retry = 3) +public class TpRefundChangeOrderStatusNode { + + @Resource + private TpOrderClient orderClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + TpRefundTicketCommonContext commonContext = bindCmp.getContextBean(TpRefundTicketCommonContext.class); + TpProdRefundApplyDTO refundApplyDTO = commonContext.getRefundTicketApplyContext().getRefundApplyDTO(); + TpProdOrderDetailVO orderDetail = commonContext.getOrderDetailVO(); + + // 如果订单已经到达了终态,不进行推进不改成退款中 + if (orderDetail.getStatus().compareTo(TpOrderStatusEnum.ALREADY_CHANGE.getStatus()) >= 0 + || orderDetail.getStatus().compareTo(TpOrderStatusEnum.ALREADY_PAY.getStatus()) < 0) { + LogUtil.error("退款成功推进订单, 当前订单:{}, 状态暂不可推进, 状态细分:{}, 状态编码:{}", orderDetail.getOrderNo(), + TpOrderStatusEnum.getTpOrderStatusEnumByStatus(orderDetail.getStatus(), orderDetail.getType()), orderDetail.getStatus()); + return; + } + + orderClient.pushOrderStatus(TpOrderPushStatusDTO.builder() + .orderNo(refundApplyDTO.getOrderNo()) + .tpOrderPushStatusEnum(TpOrderPushStatusEnum.ORDER_REFUNDING_PUSH_STATUS) + .tenantId(refundApplyDTO.getTenantId()).build()); + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/execute/TpVoucherInvalidNode.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/execute/TpVoucherInvalidNode.java new file mode 100644 index 0000000..b62a057 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/flow/refundTicket/execute/TpVoucherInvalidNode.java @@ -0,0 +1,152 @@ +package com.deepinnet.tptradeprod.biz.service.flow.refundTicket.execute; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.constants.GlobalConstants; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.voucher.TpVoucherUpdateDTO; +import com.deepinnet.tptradecore.common.enums.voucher.TpVoucherStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.context.TpRefundTicketApplyContext; +import com.deepinnet.tptradeprod.biz.service.flow.refundTicket.context.TpRefundTicketCommonContext; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.TpVoucherClient; +import com.google.common.collect.Lists; +import com.yomahub.liteflow.annotation.*; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author amos wong + * @create 2023/10/16 15:34 + * @Description + */ +@LiteflowComponent(value = "voucherInvalidNode", name = "凭证失效节点") +@LiteflowCmpDefine +@LiteflowRetry(retry = 3) +public class TpVoucherInvalidNode { + + @Resource + private TpVoucherClient voucherClient; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + TpRefundTicketCommonContext commonContext = bindCmp.getContextBean(TpRefundTicketCommonContext.class); + LogUtil.info("执行批量失效凭证节点,入参为:{}", JSONUtil.toJsonStr(commonContext)); + + TpRefundTicketApplyContext refundTicketApplyContext = commonContext.getRefundTicketApplyContext(); + TpProdRefundApplyDTO refundApplyDTO = commonContext.getRefundTicketApplyContext().getRefundApplyDTO(); + List voucherList = commonContext.getVoucherList(); + String refundApplyOrderNo = refundTicketApplyContext.getRefundApplyOrderNo(); + List realNameTicketRefundChoiceDTOs = refundApplyDTO.getRealNameTicketRefundChoiceDTOs(); + Map> nonRealNameRefundVoucherMap = commonContext.getNonRealNameRefundVoucherMap(); + List voucherInvalidDTOs; + + // 非实名制 + if (CollectionUtils.isNotEmpty(refundApplyDTO.getNonRealNameTicketChoiceDTOs())) { + voucherInvalidDTOs = nonRealNameBuildVoucherInvalidDTOs(nonRealNameRefundVoucherMap, refundApplyDTO, refundApplyOrderNo); + } else { + voucherInvalidDTOs = realNameBuildVoucherInvalidDTOs(realNameTicketRefundChoiceDTOs, voucherList, refundApplyOrderNo, refundApplyDTO); + } + + if (CollectionUtils.isEmpty(voucherInvalidDTOs)) { + LogUtil.error("不存在可退的凭证,无法进行退票处理,入参为:{}", JSONUtil.toJsonStr(refundApplyDTO)); + throw new TpTradeProdException(TpTradeProdErrorCode.NOT_FOUND_REFUND_AVAILABLE_VOUCHER); + } + + voucherClient.invalidVoucher(voucherInvalidDTOs); + } + + private List realNameBuildVoucherInvalidDTOs(List realNameTicketRefundChoiceDTOs, List voucherList, + String refundApplyOrderNo, TpProdRefundApplyDTO refundApplyDTO) { + List voucherInvalidDTOs = Lists.newArrayList(); + List actuallyRefundVoucherList = Lists.newArrayList(); + + for (TpRealNameTicketRefundChoiceDTO realNameTicketRefundChoiceDTO : realNameTicketRefundChoiceDTOs) { + TpRefundPassengerDTO refundPassengerDTO = realNameTicketRefundChoiceDTO.getRefundPassengerDTO(); + // 过滤出当前乘客的所有凭证 + List curPassengerAvailableVouchers = voucherList + .stream() + .filter(v -> StringUtils.equals(refundPassengerDTO.getPassengerNo(), v.getPassenger().getPassengerNo())) + .collect(Collectors.toList()); + if (CollectionUtils.isEmpty(curPassengerAvailableVouchers)) { + LogUtil.error("当前乘客不存在可退的凭证,乘客编号:{}, 当前订单所有可退凭证列表:{}", refundPassengerDTO.getPassengerNo(), JSONUtil.toJsonStr(voucherList)); + throw new TpTradeProdException(TpTradeProdErrorCode.NOT_FOUND_REFUND_AVAILABLE_VOUCHER); + } + + // 过滤出来当前乘客选择的日期对应的凭证 + List curPassengerActuallyRefundVoucherList = getRealNameNeedRefundVouchers(realNameTicketRefundChoiceDTO.getVoucherTravelDateList(), curPassengerAvailableVouchers); + actuallyRefundVoucherList.addAll(curPassengerActuallyRefundVoucherList); + + actuallyRefundVoucherList.forEach(v -> { + TpVoucherUpdateDTO updateDTO = new TpVoucherUpdateDTO(); + updateDTO.setVoucherNo(v.getVoucherNo()); + updateDTO.setOriginalStatus(v.getStatus()); + updateDTO.setTargetStatus(TpVoucherStatusEnum.REFUNDED.getCode()); + updateDTO.setRefundApplyOrderNo(refundApplyOrderNo); + updateDTO.setTenantId(refundApplyDTO.getTenantId()); + updateDTO.setRefundCount(v.getTotalCount()); + voucherInvalidDTOs.add(updateDTO); + }); + } + + return voucherInvalidDTOs; + } + + private List nonRealNameBuildVoucherInvalidDTOs(Map> nonRealNameRefundVouchersMap, TpProdRefundApplyDTO refundApplyDTO, String refundApplyOrderNo) { + List voucherInvalidDTOs = Lists.newArrayList(); + if (MapUtil.isEmpty(nonRealNameRefundVouchersMap)) { + LogUtil.error("非实名可退的凭证不存在,无法进行退票处理,入参为:{}", JSONUtil.toJsonStr(refundApplyDTO)); + throw new TpTradeProdException(TpTradeProdErrorCode.NOT_FOUND_NEED_REFUND_NON_REAL_NAME_VOUCHER, TpTradeProdErrorCode.NOT_FOUND_NEED_REFUND_NON_REAL_NAME_VOUCHER.getDesc()); + } + + nonRealNameRefundVouchersMap.forEach((refundPassengerCount, voucherDTOs) -> { + for (TpProdVoucherDTO v : voucherDTOs) { + int curNeedRefundCount = refundPassengerCount * (v.getTotalCount() / v.getPassengerCount()); + int totalAvailableCount = v.getTotalCount() - v.getRefundCount() - curNeedRefundCount - v.getRedemptionCount(); + TpVoucherUpdateDTO updateDTO = new TpVoucherUpdateDTO(); + updateDTO.setVoucherNo(v.getVoucherNo()); + updateDTO.setOriginalStatus(v.getStatus()); + if (totalAvailableCount == 0) { + updateDTO.setTargetStatus(TpVoucherStatusEnum.REFUNDED.getCode()); + } + + updateDTO.setRefundApplyOrderNo(refundApplyOrderNo); + updateDTO.setTenantId(refundApplyDTO.getTenantId()); + updateDTO.setRefundCount(curNeedRefundCount + v.getRefundCount()); + voucherInvalidDTOs.add(updateDTO); + } + }); + + return voucherInvalidDTOs; + } + + private List getRealNameNeedRefundVouchers(List voucherTravelDateList, List curPassengerAvailableVouchers) { + List actuallyRefundVoucherList = Lists.newArrayList(); + + voucherTravelDateList.forEach(travelDate -> { + String[] split = travelDate.split(GlobalConstants.HORIZONTAL_LINE); + Long refundEffectiveStartTime = Long.valueOf(split[0]); + Long refundEffectiveEndTime = Long.valueOf(split[1]); + List curTravelDateNeedRefundVouchers = curPassengerAvailableVouchers.stream() + .filter(v -> Objects.equals(v.getEffectiveStartTime(), refundEffectiveStartTime) && Objects.equals(v.getEffectiveEndTime(), refundEffectiveEndTime)) + .collect(Collectors.toList()); + + if (CollectionUtils.isEmpty(curTravelDateNeedRefundVouchers)) { + LogUtil.error("当前乘客当前的乘车日期没有可退的凭证,当前日期为:{},当前乘客的凭证列表为:{}", travelDate, JSONUtil.toJsonStr(curPassengerAvailableVouchers)); + throw new TpTradeProdException(TpTradeProdErrorCode.NOT_FOUND_REFUND_AVAILABLE_VOUCHER); + } + + actuallyRefundVoucherList.addAll(curTravelDateNeedRefundVouchers); + }); + + return actuallyRefundVoucherList; + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/impl/TpContractAcceptanceFacadeImpl.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/impl/TpContractAcceptanceFacadeImpl.java new file mode 100644 index 0000000..adf851e --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/impl/TpContractAcceptanceFacadeImpl.java @@ -0,0 +1,270 @@ +package com.deepinnet.tptradeprod.biz.service.impl; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.constants.GlobalConstants; +import com.deepinnet.tp.common.lang.page.CommonPage; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.contract.TpRefundTypeEnum; +import com.deepinnet.tptradeprod.biz.constants.TpTradeProdConstants; +import com.deepinnet.tptradeprod.biz.service.flow.manager.LiteFlowManager; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.facade.TpContractAcceptanceFacade; +import com.deepinnet.tptradeprod.common.service.integration.client.*; +import com.deepinnet.tptradeprod.common.vo.*; +import com.google.common.collect.*; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.util.Assert; + +import javax.annotation.Resource; +import javax.validation.constraints.NotNull; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * @author amos wong + * @create 2023/9/8 16:21 + * @Description + */ +@DubboService +public class TpContractAcceptanceFacadeImpl implements TpContractAcceptanceFacade { + + @Resource + private TpContractClient contractClient; + + @Resource + private TpProductClient productClient; + + @Resource + private LiteFlowManager liteFlowManager; + + @Override + public TpResult refundTicket(@NotNull(message = "请求参数不能为空") TpProdRefundApplyDTO refundApplyDTO) { + String refundApplyOrderNo = liteFlowManager.refundTicket(refundApplyDTO); + return TpResult.success(refundApplyOrderNo); + } + + @Override + public TpResult checkRefundTicketButtonShowable(TpProdShowRefundButtonCheckDTO showRefundButtonCheckDTO) { + try { + if (showRefundButtonCheckDTO == null || StringUtils.isBlank(showRefundButtonCheckDTO.getOrderNo()) || StringUtils.isBlank(showRefundButtonCheckDTO.getTenantId())) { + throw new TpTradeProdException(TpTradeProdErrorCode.ILLEGAL_PARAMS); + } + + Boolean showable = liteFlowManager.checkRefundTicketButtonShowable(showRefundButtonCheckDTO); + return TpResult.success(showable); + } catch (Exception e) { + LogUtil.error("校验退票按钮是否展示接口错误,请求参数:{}", JSONUtil.toJsonStr(showRefundButtonCheckDTO), e); + return TpResult.success(false); + } + } + + @Override + public TpResult calculateRefundAmount(@NotNull(message = "参数不能为空") TpProdCalculateRefundAmountDTO refundAmountDTO) { + paramCheck(refundAmountDTO); + return TpResult.success(liteFlowManager.calculateRefundTicketAmount(refundAmountDTO)); + } + + private void paramCheck(TpProdCalculateRefundAmountDTO refundAmountDTO) { + Assert.notNull(refundAmountDTO, "参数不能为空"); + Assert.hasText(refundAmountDTO.getOrderNo(), "订单编号不能为空"); + Assert.hasText(refundAmountDTO.getProductNo(), "产品编号不能为空"); + Assert.hasText(refundAmountDTO.getUserNo(), "用户编号不能为空"); + Assert.notNull(refundAmountDTO.getRealNameRefund(), "是否是实名制退票不能为空"); + Assert.hasText(refundAmountDTO.getTenantId(), "租户编号不能为空"); + List nonRealNameTicketChoiceDTOs = refundAmountDTO.getNonRealNameTicketChoiceDTOs(); + List realNameTicketRefundChoiceDTOs = refundAmountDTO.getRealNameTicketRefundChoiceDTOs(); + if (CollectionUtils.isEmpty(nonRealNameTicketChoiceDTOs) && CollectionUtils.isEmpty(realNameTicketRefundChoiceDTOs)) { + throw new TpTradeProdException(TpTradeProdErrorCode.ILLEGAL_PARAMS); + } + + if (CollectionUtils.isNotEmpty(nonRealNameTicketChoiceDTOs)) { + nonRealNameTicketChoiceDTOs.forEach(choice -> { + if (choice.getRefundPassengerCount() == null || choice.getRefundPassengerCount() <= 0 || StringUtils.isBlank(choice.getVoucherTravelDate())) { + throw new TpTradeProdException(TpTradeProdErrorCode.ILLEGAL_PARAMS); + } + }); + } + + if (CollectionUtils.isNotEmpty(realNameTicketRefundChoiceDTOs)) { + realNameTicketRefundChoiceDTOs.forEach(choice -> { + if (choice.getRefundPassengerDTO() == null || CollectionUtils.isEmpty(choice.getVoucherTravelDateList())) { + throw new TpTradeProdException(TpTradeProdErrorCode.ILLEGAL_PARAMS); + } + }); + } + } + + @Override + public TpResult queryAvailableRefundVoucherList(TpProdQueryAvailableRefundVoucherDTO availableVoucherDTO) { + // 根据退票规则筛选出真正可退的凭证 + List voucherDTOS = liteFlowManager.queryAvailableRefundVouchers(availableVoucherDTO); + if (CollectionUtils.isEmpty(voucherDTOS)) { + return TpResult.success(null); + } + + // 构建返回结果 + TpProdQueryAvailableRefundVoucherVO queryAvailableRefundVoucherVO = buildQueryAvailableRefundVoucherVO(voucherDTOS); + return TpResult.success(queryAvailableRefundVoucherVO); + } + + @Override + public TpResult> pageQueryApplyRefundOrders(TpProdPageQueryRefundApplyOrderDTO queryDTO) { + return TpResult.success(contractClient.pageQueryApplyRefundOrders(queryDTO)); + } + + @Override + public TpResult> getRefundApplyOrderList(TpProdQueryRefundApplyOrderDTO queryDTO) { + return TpResult.success(contractClient.getRefundApplyOrderList(queryDTO)); + } + + @Override + public TpResult getRefundDetail(TpProdQueryRefundDetailDTO queryDTO) { + TpProdQueryRefundDetailVO refundDetailVO = contractClient.getRefundDetail(queryDTO); + return TpResult.success(refundDetailVO); + } + + @Override + public TpResult checkRefundAvailable(TpProdRefundAvailableCheckDTO refundAvailableCheckDTO) { + if (refundAvailableCheckDTO == null || StringUtils.isBlank(refundAvailableCheckDTO.getOrderNo()) || StringUtils.isBlank(refundAvailableCheckDTO.getTenantId())) { + throw new TpTradeProdException(TpTradeProdErrorCode.ILLEGAL_PARAMS); + } + + Boolean checkResult = liteFlowManager.refundAvailableCheck(refundAvailableCheckDTO); + return TpResult.success(checkResult); + } + + private TpProdQueryAvailableRefundVoucherVO buildQueryAvailableRefundVoucherVO(List voucherDTOs) { + TpProdQueryAvailableRefundVoucherVO queryVO = new TpProdQueryAvailableRefundVoucherVO(); + List realNamePassengerAvailableRefundDTOs = Lists.newArrayList(); + List nonRealNamePassengerAvailableRefundDTOs = Lists.newArrayList(); + + TpProdVoucherDTO voucherDTO = voucherDTOs.get(0); + // 组装实名认证关联的乘客信息,需要去重 + if (voucherDTO.getRequiredRealName()) { + assembleRealNamePassengerAvailableRefundDTOs(voucherDTOs, realNamePassengerAvailableRefundDTOs); + } else { + // 处理剩余可退乘客数量 + Map travelDateRefundPassengerCountMap = assembleNonRealNamePassengerAvailableRefundDTOs(voucherDTOs); + travelDateRefundPassengerCountMap.forEach((key, availableRefundPassengerCount) -> { + if (StringUtils.contains(key, TpTradeProdConstants.MIDDLE_HORIZONTAL)) { + String[] splitKey = key.split(TpTradeProdConstants.MIDDLE_HORIZONTAL); + String travelDate = splitKey[0]; + String tripType = splitKey[1]; + TpProdNonRealNamePassengerAvailableRefundDTO nonRealNamePassengerAvailableRefundDTO = new TpProdNonRealNamePassengerAvailableRefundDTO(); + nonRealNamePassengerAvailableRefundDTO.setPassengerCount(availableRefundPassengerCount); + nonRealNamePassengerAvailableRefundDTO.setVoucherTravelDate(travelDate); + nonRealNamePassengerAvailableRefundDTO.setTripType(tripType); + nonRealNamePassengerAvailableRefundDTOs.add(nonRealNamePassengerAvailableRefundDTO); + } else { + TpProdNonRealNamePassengerAvailableRefundDTO nonRealNamePassengerAvailableRefundDTO = new TpProdNonRealNamePassengerAvailableRefundDTO(); + nonRealNamePassengerAvailableRefundDTO.setPassengerCount(availableRefundPassengerCount); + nonRealNamePassengerAvailableRefundDTO.setVoucherTravelDate(key); + nonRealNamePassengerAvailableRefundDTO.setTripType(null); + nonRealNamePassengerAvailableRefundDTOs.add(nonRealNamePassengerAvailableRefundDTO); + } + }); + } + + // 对日期进行排序,方便前端处理 + if (CollectionUtils.isNotEmpty(nonRealNamePassengerAvailableRefundDTOs)) { + List sortedAvailableRefundDTOs = nonRealNamePassengerAvailableRefundDTOs.stream() + .sorted(Comparator.comparing(refundDTO -> refundDTO.getVoucherTravelDate().split(GlobalConstants.HORIZONTAL_LINE)[0])) + .collect(Collectors.toList()); + queryVO.setNonRealNamePassengerAvailableRefundDTOs(sortedAvailableRefundDTOs); + } + + if (CollectionUtils.isNotEmpty(realNamePassengerAvailableRefundDTOs)) { + for (TpRealNamePassengerAvailableRefundDTO realNamePassengerAvailableRefundDTO : realNamePassengerAvailableRefundDTOs) { + List sortedTravelDates = realNamePassengerAvailableRefundDTO.getVoucherTravelDateList().stream() + .sorted(Comparator.comparing(date -> date.split(GlobalConstants.HORIZONTAL_LINE)[0])) + .collect(Collectors.toList()); + realNamePassengerAvailableRefundDTO.setVoucherTravelDateList(sortedTravelDates); + } + queryVO.setRealNamePassengerAvailableRefundDTOs(realNamePassengerAvailableRefundDTOs); + } + + queryVO.setVoucherDTOs(voucherDTOs); + queryVO.setVoucherType(voucherDTO.getType()); + queryVO.setRefundTypes(Lists.newArrayList(TpRefundTypeEnum.ORIGINAL_REFUND.getCode())); + return queryVO; + } + + private void assembleRealNamePassengerAvailableRefundDTOs(List voucherDTOs, List realNamePassengerAvailableRefundDTOs) { + List tripTypes = voucherDTOs.stream().map(TpProdVoucherDTO::getTripType).distinct().collect(Collectors.toList()); + tripTypes.forEach(tripType -> assembleRealNameTripTypePassengerAvailableRefundDTOs(voucherDTOs, realNamePassengerAvailableRefundDTOs, tripType)); + } + + private void assembleRealNameTripTypePassengerAvailableRefundDTOs(List allVoucherDTOs, List realNamePassengerAvailableRefundDTOs, String tripType) { + List voucherDTOs = allVoucherDTOs.stream() + .filter(v -> StringUtils.equals(v.getTripType(), tripType)) + .collect(Collectors.toList()); + + // 获取乘客列表 + Map passengerDTOMap = voucherDTOs.stream() + .map(TpProdVoucherDTO::getPassenger) + .collect(Collectors.toMap(TpVoucherPassengerDTO::getPassengerNo, Function.identity(), (existingValue, newValue) -> { + // 如果key冲突,优先取新的value + return newValue; + })); + + Map> voucherPassengerMap = voucherDTOs.stream().collect(Collectors.groupingBy(v -> v.getPassenger().getPassengerNo())); + voucherPassengerMap.forEach((passengerNo, voucherList) -> { + TpRealNamePassengerAvailableRefundDTO realNamePassengerAvailableRefundDTO = new TpRealNamePassengerAvailableRefundDTO(); + List voucherTravelDates = Lists.newArrayList(); + + // 设置乘客信息 + realNamePassengerAvailableRefundDTO.setPassengerDTO(passengerDTOMap.get(passengerNo)); + + // 设置凭证乘车日期 + voucherList.forEach(v -> { + Long effectiveStartTime = v.getEffectiveStartTime(); + Long effectiveEndTime = v.getEffectiveEndTime(); + voucherTravelDates.add(effectiveStartTime + GlobalConstants.HORIZONTAL_LINE + effectiveEndTime); + }); + + realNamePassengerAvailableRefundDTO.setVoucherTravelDateList(voucherTravelDates); + realNamePassengerAvailableRefundDTO.setTripType(tripType); + realNamePassengerAvailableRefundDTOs.add(realNamePassengerAvailableRefundDTO); + }); + } + + private Map assembleNonRealNamePassengerAvailableRefundDTOs(List voucherDTOs) { + Map voucherMap = voucherDTOs.stream().collect(Collectors.toMap(TpProdVoucherDTO::getVoucherNo, Function.identity())); + + // key:凭证的有效日期+行程类型 value:凭证剩余可退的乘车人数 + Map travelDateRefundPassengerCountMap = Maps.newHashMap(); + voucherMap.forEach((voucherNo, v) -> { + Long effectiveStartTime = v.getEffectiveStartTime(); + Long effectiveEndTime = v.getEffectiveEndTime(); + String effectiveTime = effectiveStartTime + GlobalConstants.HORIZONTAL_LINE + effectiveEndTime; + String key; + if (StringUtils.isBlank(v.getTripType())) { + key = effectiveTime; + } else { + key = effectiveTime + TpTradeProdConstants.MIDDLE_HORIZONTAL + v.getTripType(); + } + + int perPassengerTotalCount = v.getTotalCount() / v.getPassengerCount(); + int totalRefundPassengerCount = v.getRefundCount() / perPassengerTotalCount; + // 计算核销的乘车人数 + int divisor = v.getRedemptionCount() % perPassengerTotalCount; + int redemptionPassengerCount = divisor == 0 ? v.getRedemptionCount() / perPassengerTotalCount : v.getRedemptionCount() / perPassengerTotalCount + 1; + // 计算最后可退的乘车人数 + int availableRefundPassengerCount = v.getPassengerCount() - totalRefundPassengerCount - redemptionPassengerCount; + if (availableRefundPassengerCount <= 0) { + LogUtil.error("当前非实名制的凭证已无可退人数,当前凭证编号:{}", voucherNo); + return; + } + + travelDateRefundPassengerCountMap.put(key, availableRefundPassengerCount); + }); + + return travelDateRefundPassengerCountMap; + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/impl/TpOrderAcceptanceFacadeImpl.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/impl/TpOrderAcceptanceFacadeImpl.java new file mode 100644 index 0000000..7e88a3f --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/impl/TpOrderAcceptanceFacadeImpl.java @@ -0,0 +1,1051 @@ +package com.deepinnet.tptradeprod.biz.service.impl; + +import cn.hutool.core.collection.*; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.*; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson2.JSONObject; +import com.deepinnet.tenant.util.CommonTenantIdUtil; +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.page.CommonPage; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpproductcore.common.dto.product.TpProdDetailDTO; +import com.deepinnet.tpproductcore.common.dto.rule.*; +import com.deepinnet.tpproductcore.common.dto.rule.result.*; +import com.deepinnet.tpproductcore.common.enums.*; +import com.deepinnet.tpproductcore.common.qto.TpSalesUnitCarPoolListQueryDTO; +import com.deepinnet.tpproductcore.common.qto.product.TpProductQueryDTO; +import com.deepinnet.tpproductcore.common.vo.TpSalesUnitCarPoolVO; +import com.deepinnet.tptradecore.common.dto.order.*; +import com.deepinnet.tptradecore.common.enums.TpBizTypeEnum; +import com.deepinnet.tptradecore.common.enums.order.*; +import com.deepinnet.tptradecore.common.enums.trans.TpPayOrderStatusEnum; +import com.deepinnet.tptradeprod.biz.constants.*; +import com.deepinnet.tptradeprod.biz.converter.TpSaleUnitCarpoolConvert; +import com.deepinnet.tptradeprod.biz.service.flow.manager.LiteFlowManager; +import com.deepinnet.tptradeprod.common.dto.TpUserPassengerDTO; +import com.deepinnet.tptradeprod.common.dto.TpUserPassengerQueryDTO; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.enums.*; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.facade.*; +import com.deepinnet.tptradeprod.common.service.integration.client.*; +import com.deepinnet.tptradeprod.common.service.integration.convert.TpCarpoolConverter; +import com.deepinnet.tptradeprod.common.vo.*; +import com.google.common.collect.Lists; +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.dubbo.config.annotation.DubboService; +import org.jetbrains.annotations.NotNull; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.util.Assert; + +import javax.annotation.Resource; +import java.math.*; +import java.time.LocalDate; +import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.function.*; +import java.util.stream.Collectors; + +/** + *

+ * 订单受理服务实现类 + *

+ * + * @author chenjiaju + * @since 2023/9/2 + */ + +@DubboService +public class TpOrderAcceptanceFacadeImpl implements TpOrderAcceptanceFacade { + + @Resource + private TpOrderClient tpOrderClient; + + @Resource + private TpOrderDispatchClient orderDispatchClient; + + @Resource + private TpProductClient tpProductClient; + + @Resource + private TpUserPassengerClient tpUserPassengerClient; + + @Resource + private LiteFlowManager liteFlowManager; + + @Resource + private TpBizRuleClient tpBizRuleClient; + + @Resource + private TpBusClient tpBusClient; + + @Resource + private TpRatingFormClient ratingFormClient; + + @Resource + private ThreadPoolTaskExecutor queryPositionFlagThreadPool; + + @Resource + private TpVoucherAcceptanceFacade voucherAcceptanceFacade; + + @Resource + private TpCarpoolConverter carpoolConverter; + + private static final String ZERO = "0"; + + private static final String DECIMAL_ZERO = "0.00"; + @Resource + private TpProductSalesUnitClient tpProductSalesUnitClient; + + @Resource + private TpSaleUnitCarpoolConvert saleUnitCarpoolConvert; + + @Resource + private TpVoucherClient tpVoucherClient; + + @Override + public TpResult getOrderDetail(TpProdOrderQueryDTO dto) { + // 参数校验 + Assert.isTrue(StrUtil.isNotEmpty(dto.getOrderNo()) || StrUtil.isNotEmpty(dto.getOriginalOrderNo()), "orderNo or originalOrderNo is null"); + Assert.hasText(dto.getTenantId(), "tenantId is null"); + + List needModules = buildModules(); + dto.setNeedModules(needModules); + + // 查询订单 + TpProdOrderDetailVO orderDetail = tpOrderClient.getOrderDetail(dto); + + setUpShowFormRatingButton(Collections.singletonMap(orderDetail.getOriginalOrderNo(), orderDetail::setOrderEvaluated)); + + return TpResult.success(orderDetail); + } + + private void orderAmountCalculate(TpOrderListVO orderDetail) { + // 订金支付金额 + BigDecimal depositPayAmount = new BigDecimal(orderDetail.getPayAmount()); + + // 订单应付金额 + BigDecimal orderNeedPayAmount = new BigDecimal(orderDetail.getPayableAmount()); + + // 已付金额 + BigDecimal paidAmount = new BigDecimal(DECIMAL_ZERO); + + List paidOrders = orderDetail.getPayOrders().stream().filter(payOrder -> ObjectUtil.equals(payOrder.getStatus(), TpPayOrderStatusEnum.PAID.getCode())).collect(Collectors.toList()); + + if (CollUtil.isNotEmpty(paidOrders)) { + for (TpProdPayOrderDTO paidOrder : paidOrders) { + paidAmount = paidAmount.add(new BigDecimal(paidOrder.getPayAmount())).setScale(2, RoundingMode.DOWN); + } + } + + orderDetail.setPaidAmount(paidAmount.toString()); + + // 订单手续费金额 + BigDecimal orderServiceChargeAmount = BigDecimal.ZERO; + List orderChargeRecords = orderDetail.getOrderChargeRecords(); + + if (CollUtil.isNotEmpty(orderChargeRecords)) { + List chargeRecords = orderDetail.getOrderChargeRecords().stream().filter(record -> ObjectUtil.equals(TpOrderServiceChargeFreeEnum.NOT_FREE.getCode(), record.getFreeServiceCharge())).collect(Collectors.toList()); + + if (CollUtil.isNotEmpty(chargeRecords)) { + for (TpOrderChargeRecordVO chargeRecord : chargeRecords) { + orderServiceChargeAmount = orderServiceChargeAmount.add(ObjectUtil.isNull(chargeRecord.getServiceCharge()) ? BigDecimal.ZERO : new BigDecimal(chargeRecord.getServiceCharge())); + } + } + } + + // 应付金额 + 手续费 + BigDecimal orderTotalNeedPayAmount = orderNeedPayAmount.add(orderServiceChargeAmount); + + TpOrderStatusEnum statusEnum = TpOrderStatusEnum.getTpOrderStatusEnumByStatus(orderDetail.getStatus(), orderDetail.getType()); + + switch (statusEnum) { + case ORDER_NEED_CONFIRM: + orderDetail.setCurrentNeedPayAmount(orderDetail.getPayableAmount()); + break; + case ORDER_CONFIRMED: + case ORDER_DEPOSIT_NEED_PAY: + orderDetail.setCurrentNeedPayAmount(orderDetail.getPayAmount()); + break; + case ORDER_CANCEL_AUDITING: + case ORDER_CANCEL_AUDITED: + orderDetail.setActualPayAmount(orderDetail.getPayAmount()); + if (depositPayAmount.compareTo(orderServiceChargeAmount) > 0) { + // 取消审核中 | 审核通过 应退金额 + orderDetail.setCurrentNeedRefundAmount(depositPayAmount.subtract(orderServiceChargeAmount).toString()); + } else if (depositPayAmount.compareTo(orderServiceChargeAmount) < 0) { + // 取消审核中 | 审核通过 应付金额 + orderDetail.setCurrentNeedPayAmount(orderServiceChargeAmount.subtract(depositPayAmount).toString()); + } else { + // 取消审核中 | 审核通过 + // 应退 0.00 应付 0.00 + // 取消订单 不退不补,不展示计算公式 + orderDetail.setCurrentNeedRefundAmount(DECIMAL_ZERO); + orderDetail.setCurrentNeedPayAmount(DECIMAL_ZERO); + } + break; + case ORDER_CANCEL_REFUNDING: + orderDetail.setActualPayAmount(orderDetail.getPayAmount()); + // 应退金额 + orderDetail.setCurrentNeedRefundAmount(depositPayAmount.subtract(orderServiceChargeAmount).toString()); + break; + case ORDER_CANCEL_REFUNDED: + orderDetail.setActualPayAmount(orderDetail.getPayAmount()); + // 已退金额 + orderDetail.setRefundedAmount(depositPayAmount.subtract(orderServiceChargeAmount).toString()); + break; + case ORDER_CANCEL_NEED_PAY: + orderDetail.setActualPayAmount(orderDetail.getPayAmount()); + // 取消 应付金额 + orderDetail.setCurrentNeedPayAmount(orderServiceChargeAmount.subtract(depositPayAmount).toString()); + break; + case ORDER_CANCEL_PAID: + // 取消 实付金额 + orderDetail.setActualPayAmount(paidAmount.toString()); + // 已退金额 + orderDetail.setRefundedAmount(DECIMAL_ZERO); + break; + case ORDER_CANCELED: + orderDetail.setActualPayAmount(CollUtil.isEmpty(orderDetail.getPayOrders()) ? DECIMAL_ZERO : orderDetail.getPayAmount()); + // 应退 0.00 应付 0.00 + // 取消订单 不退不补,不展示计算公式 + break; + case ORDER_TRIP_END: + orderDetail.setActualPayAmount(orderDetail.getPayAmount()); + break; + case ORDER_TRIP_END_NEED_PAY: + orderDetail.setActualPayAmount(orderDetail.getPayAmount()); + // 应付尾款 + orderDetail.setCurrentNeedPayAmount(orderTotalNeedPayAmount.subtract(depositPayAmount).toString()); + break; + case ORDER_TRIP_END_PAID: + // 行程结束已支付 实付金额 + orderDetail.setActualPayAmount(paidAmount.toString()); + break; + case ORDER_TRIP_END_REFUNDING: + orderDetail.setActualPayAmount(orderDetail.getPayAmount()); + // 应退金额 + orderDetail.setCurrentNeedRefundAmount(depositPayAmount.subtract(orderTotalNeedPayAmount).toString()); + break; + case ORDER_TRIP_END_REFUNDED: + List refunded = orderDetail.getPayOrders().stream().filter(payOrder -> ObjectUtil.equals(payOrder.getStatus(), TpPayOrderStatusEnum.REFUND.getCode())).collect(Collectors.toList()); + BigDecimal refundAmount = new BigDecimal(refunded.get(0).getPayAmount()).setScale(2, RoundingMode.DOWN); + orderDetail.setActualPayAmount(new BigDecimal(orderDetail.getPayAmount()).setScale(2, RoundingMode.DOWN).subtract(refundAmount).toString()); + // 已退金额 + orderDetail.setRefundedAmount(depositPayAmount.subtract(orderTotalNeedPayAmount).toString()); + break; + case ORDER_DEPOSIT_PAID: + case ORDER_CHANGE_AUDITING: + case ORDER_CHANGE_AUDITED: + case ORDER_NEED_DISPATCH: + case ORDER_DISPATCHED: + case ORDER_TRIP_START: + // 判断是应退还是应付 + if (depositPayAmount.compareTo(orderTotalNeedPayAmount) > 0) { + orderDetail.setActualPayAmount(orderDetail.getPayAmount()); + // 应退 + orderDetail.setCurrentNeedRefundAmount(depositPayAmount.subtract(orderTotalNeedPayAmount).toString()); + } else if (depositPayAmount.compareTo(orderTotalNeedPayAmount) < 0) { + orderDetail.setActualPayAmount(orderDetail.getPayAmount()); + // 应付 + orderDetail.setCurrentNeedPayAmount(orderTotalNeedPayAmount.subtract(depositPayAmount).toString()); + } else { + orderDetail.setActualPayAmount(orderDetail.getPayAmount()); + } + } + } + + private boolean todayAfterLatestShuttle(List shuttleDateList, LocalDate today) { + return today.isAfter(shuttleDateList.get(shuttleDateList.size() - 1)); + } + + @Override + public TpResult> getOrderList(TpProdOrderListQueryDTO dto) { + // 参数校验 + Assert.hasText(dto.getTenantId(), "tenantId is null"); + Assert.hasText(dto.getPlacerNo(), "placerNo is null"); + + // 查询数据 + CommonPage orderList = tpOrderClient.getOrderList(dto); + + orderList.getList().forEach(orderDetail -> { + if (ObjectUtil.equals(orderDetail.getType(), TpOrderTypeEnum.PACKING_ORDER.getType())) { + orderAmountCalculate(orderDetail); + } + }); + + setUpShowFormRatingButton(orderList.getList().stream().collect(Collectors.toMap(TpOrderListVO::getOriginalOrderNo, t -> t::setOrderEvaluated, (k1, k2) -> k1))); + + // 拼车单塞入开线信息 + if (ObjectUtil.equals(dto.getOrderType(), TpOrderTypeEnum.CARPOOL_ORDER.getType())) { + setSaleUnitCarpoolInfo(orderList.getList(), dto.getTenantId()); + } + + return TpResult.success(orderList); + } + + @Override + public TpResult savePassenger(TpUserPassengerDTO dto) { + // 参数校验 + checkSavePassengerParams(dto); + + return TpResult.success(tpUserPassengerClient.saveUserPassenger(dto)); + } + + @Override + public TpResult editPassenger(TpUserPassengerDTO dto) { + // 参数校验 + checkEditPassengerParams(dto); + + return TpResult.success(tpUserPassengerClient.modifyUserPassenger(dto)); + } + + @Override + public TpResult delPassenger(TpUserPassengerQueryDTO dto) { + // 参数校验 + checkQueryPassengerParams(dto); + + return TpResult.success(tpUserPassengerClient.delUserPassenger(dto)); + } + + @Override + public TpResult> passengerList(TpUserPassengerQueryDTO dto) { + // 参数校验 + checkQueryListPassengerParams(dto); + + return TpResult.success(tpUserPassengerClient.queryPassengerList(dto)); + } + + @Override + public TpResult orderServiceChargeCal(TpServiceChargeDTO dto) { + Assert.hasText(dto.getOrderNo(), "orderNo is null"); + Assert.hasText(dto.getTenantId(), "tenantId is null"); + Assert.hasText(dto.getBizType(), "bizType is null"); + + // 查询当前订单详情 + TpProdOrderDetailVO orderDetail = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .originalOrderNo(dto.getOrderNo()) + .tenantId(dto.getTenantId()) + .needModules(ListUtil.toList(TpOrderModulesEnum.ORDER_TRAVEL_TRIP.getModule(), TpOrderModulesEnum.CHARGE_RECORD.getModule())).build()); + + TpProdDetailDTO productDetail = queryProduct(orderDetail.getProductNo(), dto.getTenantId()); + + if (StrUtil.equals(dto.getBizType(), TpOrderServiceChargeBizTypeEnum.CANCEL.getType())) { + return getCancelServiceCharge(dto, productDetail, orderDetail); + } + + if (StrUtil.equals(dto.getBizType(), TpOrderServiceChargeBizTypeEnum.CHANGE.getType())) { + return getChangeServiceCharge(dto, orderDetail, productDetail); + } + + return TpResult.success(null); + } + + @NotNull + private TpResult getChangeServiceCharge(TpServiceChargeDTO dto, TpProdOrderDetailVO orderDetail, TpProdDetailDTO productDetail) { + BigDecimal previousPayableAmount; + if (StrUtil.isEmpty(orderDetail.getParentOrderNo())) { + previousPayableAmount = new BigDecimal(orderDetail.getPayableAmount()); + } else { + // 上一笔应付金额 + previousPayableAmount = new BigDecimal(orderDetail.getPayableAmount()); + } + + // 当前订单应付金额 + BigDecimal currentPayableAmount = new BigDecimal(dto.getPricingAmount()); + + // 当前变更手续费试算 + BigDecimal currentChangeServiceCharge = BigDecimal.ZERO; + + // 手续费费率 + BigDecimal serviceChargeRate = BigDecimal.ZERO; + + // 总手续费计算 + BigDecimal totalServiceCharge = BigDecimal.ZERO; + // 当前变更后的价格小于上一笔订单的应付金额,需要计算手续费 + if (currentPayableAmount.compareTo(previousPayableAmount) < 0) { + BigDecimal subtractMoney = previousPayableAmount.subtract(currentPayableAmount); + + TpRuleExecuteDTO ruleExecuteDTO = getChangeRuleDTO(dto.getTenantId(), productDetail, subtractMoney, orderDetail.getTpOrderTravelTrips()); + + TpRuleExecuteResultVO executeRuleResult = tpBizRuleClient.executeRule(ruleExecuteDTO); + + if (!executeRuleResult.getSuccess()) { + LogUtil.error("当前变更订单手续费执行失败, 入参:{}", JSONObject.toJSONString(ruleExecuteDTO)); + throw new TpTradeProdException(TpTradeProdErrorCode.RULE_EXECUTE_ERROR); + } + + for (TpOrderChargeRecordVO orderChargeRecord : orderDetail.getOrderChargeRecords()) { + if (ObjectUtil.equals(orderChargeRecord.getFreeServiceCharge(), TpOrderServiceChargeFreeEnum.FREE.getCode())) { + continue; + } + BigDecimal serviceCharge = StrUtil.isEmpty(orderChargeRecord.getServiceCharge()) ? BigDecimal.ZERO : new BigDecimal(orderChargeRecord.getServiceCharge()); + totalServiceCharge = totalServiceCharge.add(serviceCharge); + } + + currentChangeServiceCharge = ObjectUtil.isNull(executeRuleResult.getResult()) ? BigDecimal.ZERO : executeRuleResult.getResult().getChargeAmount().getMoney().getAmount(); + + serviceChargeRate = ObjectUtil.isNull(executeRuleResult.getResult()) ? BigDecimal.ZERO : executeRuleResult.getResult().getChargeRate(); + } + + return TpResult.success(TpServiceChargeVO.builder() + .orderNo(orderDetail.getOriginalOrderNo()) + .serviceCharge(totalServiceCharge.add(currentChangeServiceCharge).toString()) + .currentOperateCharge(currentChangeServiceCharge.toString()) + .serviceChargeRate(serviceChargeRate.toString()).build()); + } + + @NotNull + private TpResult getCancelServiceCharge(TpServiceChargeDTO dto, TpProdDetailDTO productDetail, TpProdOrderDetailVO orderDetail) { + TpRuleExecuteDTO cancelRuleDTO = getCancelRuleDTO(dto.getTenantId(), productDetail, new BigDecimal(orderDetail.getPayableAmount()), orderDetail.getTpOrderTravelTrips()); + + TpRuleExecuteResultVO executeRuleResult = tpBizRuleClient.executeRule(cancelRuleDTO); + + if (!executeRuleResult.getSuccess()) { + LogUtil.error("当前变更取消手续费执行失败, 入参:{}", JSONObject.toJSONString(cancelRuleDTO)); + throw new TpTradeProdException(TpTradeProdErrorCode.RULE_EXECUTE_ERROR); + } + + BigDecimal totalServiceCharge = BigDecimal.ZERO; + for (TpOrderChargeRecordVO orderChargeRecord : orderDetail.getOrderChargeRecords()) { + if (ObjectUtil.equals(orderChargeRecord.getFreeServiceCharge(), TpOrderServiceChargeFreeEnum.FREE.getCode())) { + continue; + } + BigDecimal serviceCharge = StrUtil.isEmpty(orderChargeRecord.getServiceCharge()) ? BigDecimal.ZERO : new BigDecimal(orderChargeRecord.getServiceCharge()); + totalServiceCharge = totalServiceCharge.add(serviceCharge); + } + + return TpResult.success(TpServiceChargeVO.builder() + .orderNo(orderDetail.getOriginalOrderNo()) + .serviceCharge(totalServiceCharge.add(ObjectUtil.isNull(executeRuleResult.getResult()) ? BigDecimal.ZERO : executeRuleResult.getResult().getChargeAmount().getMoney().getAmount()).toString()) + .currentOperateCharge(ObjectUtil.isNull(executeRuleResult.getResult()) ? BigDecimal.ZERO.toString() : executeRuleResult.getResult().getChargeAmount().getMoney().getAmount().toString()) + .serviceChargeRate(ObjectUtil.isNull(executeRuleResult.getResult()) ? BigDecimal.ZERO.toString() : executeRuleResult.getResult().getChargeRate().toString()).build()); + } + + private static TpRuleExecuteDTO getChangeRuleDTO(String tenantId, TpProdDetailDTO productDetail, BigDecimal subtractMoney, List tpOrderTravelTrips) { + Long pickUpTime; + if (tpOrderTravelTrips.size() == 1) { + pickUpTime = Convert.toLong(tpOrderTravelTrips.get(0).getStartTime()); + } else { + List goTrip = tpOrderTravelTrips.stream().filter(station -> StrUtil.equals(station.getTripType(), TpOrderTripTypeEnum.GO.getCode())).collect(Collectors.toList()); + pickUpTime = Convert.toLong(goTrip.get(0).getStartTime()); + } + + // 将产品信息对应的规则信息转换成Map + Map> rulesMap = productDetail.getRules().stream().collect(Collectors.groupingBy(TpBizRuleDTO::getRuleGroup)); + + // 找到对应的变更手续费的规则 + List buyRules = rulesMap.get(TpRuleExpressionGroupEnum.CHANGE_ORDER_CHARGE.getCode()); + List rules = Lists.newArrayList(); + buyRules.forEach(rule -> rules.add(rule.getExpression())); + + // 构建执行入参 + TpChangeOrderChargeParamDTO param = new TpChangeOrderChargeParamDTO(); + param.setOrderPriceChange(subtractMoney); + // 发车时间 + param.setDepartureTime(pickUpTime); + param.setOccurTime(DateUtil.current()); + + TpRuleExecuteDTO ruleExecuteDTO = new TpRuleExecuteDTO<>(); + ruleExecuteDTO.setRuleList(rules); + ruleExecuteDTO.setParameter(param); + ruleExecuteDTO.setRuleExpressionGroup(TpRuleExpressionGroupEnum.CHANGE_ORDER_CHARGE); + ruleExecuteDTO.setTenantId(tenantId); + return ruleExecuteDTO; + } + + private static TpRuleExecuteDTO getCancelRuleDTO(String tenantId, TpProdDetailDTO productDetail, BigDecimal amount, List travelTripVOs) { + Long pickUpTime; + if (travelTripVOs.size() == 1) { + pickUpTime = Convert.toLong(travelTripVOs.get(0).getStartTime()); + } else { + List goTrip = travelTripVOs.stream().filter(station -> StrUtil.equals(station.getTripType(), TpOrderTripTypeEnum.GO.getCode())).collect(Collectors.toList()); + pickUpTime = Convert.toLong(goTrip.get(0).getStartTime()); + } + + // 将产品信息对应的规则信息转换成Map + Map> rulesMap = productDetail.getRules().stream().collect(Collectors.groupingBy(TpBizRuleDTO::getRuleGroup)); + + // 找到对应的变更手续费的规则 + List buyRules = rulesMap.get(TpRuleExpressionGroupEnum.CHARTER_REFUND_CHARGE.getCode()); + List rules = Lists.newArrayList(); + buyRules.forEach(rule -> rules.add(rule.getExpression())); + + // 构建执行入参 + TpCharterRefundParamDTO param = new TpCharterRefundParamDTO(); + param.setOrderPrice(amount); + param.setDepartureTime(pickUpTime); + param.setOccurTime(DateUtil.current()); + + TpRuleExecuteDTO ruleExecuteDTO = new TpRuleExecuteDTO<>(); + ruleExecuteDTO.setRuleList(rules); + ruleExecuteDTO.setParameter(param); + ruleExecuteDTO.setRuleExpressionGroup(TpRuleExpressionGroupEnum.CHARTER_REFUND_CHARGE); + ruleExecuteDTO.setTenantId(tenantId); + + return ruleExecuteDTO; + } + + @Override + public TpResult cancelOrder(TpOrderCancelDTO dto) { + Assert.isTrue(StrUtil.isNotEmpty(dto.getOrderNo()) || StrUtil.isNotEmpty(dto.getOriginalOrderNo()), "orderNo or originalOrderNo is null"); + Assert.hasText(dto.getTenantId(), "tenantId is null"); + + return TpResult.success(liteFlowManager.charterBusCancelOrder(dto)); + } + + @Override + public TpResult manualSyncTrip(TpProdOrderQueryDTO dto) { + Assert.notNull(dto, "query params is null"); + Assert.hasText(dto.getTenantId(), "tenantId is null"); + Assert.hasText(dto.getOriginalOrderNo(), "originalOrderNo is null"); + + return TpResult.success(liteFlowManager.manualSyncTrip(dto)); + } + + @Override + public TpResult customBusPositionFlag(TpProdOrderListQueryDTO dto) { + TpProdOrderListQueryDTO needPayQueryCondition = TpProdOrderListQueryDTO.builder().build(); + needPayQueryCondition.setPlacerNo(dto.getPlacerNo()); + needPayQueryCondition.setTpOrderStatusEnum(TpOrderListQueryConstants.NEED_PAY_STATUS); + needPayQueryCondition.setTenantId(dto.getTenantId()); + + TpProdOrderListQueryDTO needVerifyQueryCondition = TpProdOrderListQueryDTO.builder().build(); + needVerifyQueryCondition.setPlacerNo(dto.getPlacerNo()); + needVerifyQueryCondition.setTpOrderStatusEnum(TpOrderListQueryConstants.NEED_VERIFY_STATUS); + needVerifyQueryCondition.setTenantId(dto.getTenantId()); + + CompletableFuture needPayFuture = CompletableFuture.supplyAsync(() -> tpOrderClient.queryCustomOrderCount(needPayQueryCondition), queryPositionFlagThreadPool); + CompletableFuture needVerifyFuture = CompletableFuture.supplyAsync(() -> tpOrderClient.queryCustomOrderCount(needVerifyQueryCondition), queryPositionFlagThreadPool); + + // 等待两个并行查询完成 + CompletableFuture allFutures = CompletableFuture.allOf(needPayFuture, needVerifyFuture).exceptionally(e -> { + LogUtil.error("查询失败,入参为:{},异常堆栈信息:{}", JSONObject.toJSONString(dto), e); + throw new TpTradeProdException(TpTradeProdErrorCode.QUERY_ORDER_ERROR); + }); + + // 执行结果处理 + allFutures.join(); + + Long needPayCount = needPayFuture.join(); + Long needVerifyCount = needVerifyFuture.join(); + return TpResult.success(TpOrderPositionFlagVO.builder() + .needPay(needPayCount == 0 ? Boolean.FALSE : Boolean.TRUE) + .needVerify(needVerifyCount == 0 ? Boolean.FALSE : Boolean.TRUE).build()); + } + + @Override + public TpResult checkSuccessCallback(TpProdCheckSuccessCallbackDTO checkSuccessCallbackDTO) { + TpCheckSuccessCallbackDTO successCallbackDTO = carpoolConverter.convert2CheckSuccessCallbackDTO(checkSuccessCallbackDTO); + return TpResult.success(tpOrderClient.checkSuccessCallback(successCallbackDTO)); + } + + @Override + public TpResult> padCarpoolOrderList(TpProdOrderListQueryDTO dto) { + // 参数校验 + Assert.hasText(dto.getTenantId(), "tenantId is null"); + Assert.hasText(dto.getPosCardNo(), "posCardNo is null"); + + // 查询数据 + CommonPage orderList = tpOrderClient.getPadCarpoolOrderList(dto); + + orderList.getList().forEach(orderDetail -> { + if (ObjectUtil.equals(orderDetail.getType(), TpOrderTypeEnum.PACKING_ORDER.getType())) { + orderAmountCalculate(orderDetail); + } + }); + + // 塞入开线信息 + setSaleUnitCarpoolInfo(orderList.getList(), dto.getTenantId()); + + setUpShowFormRatingButton(orderList.getList().stream().collect(Collectors.toMap(TpOrderListVO::getOriginalOrderNo, t -> t::setOrderEvaluated, (k1, k2) -> k1))); + + return TpResult.success(orderList); + } + + @Override + public TpResult cancelCarpoolOrder(TpProdOrderQueryDTO dto) { + // 参数校验 + Assert.notNull(dto, "查询参数不能为空"); + Assert.hasText(dto.getOrderNo(), "订单编号不能为空"); + Assert.hasText(dto.getUserNo(), "用户编号不能为空"); + Assert.hasText(dto.getTenantId(), "租户ID不能为空"); + + List needModules = Lists.newArrayList(); + needModules.add(TpOrderModulesEnum.ORDER_SUBJECT_ITEM.getModule()); + dto.setNeedModules(needModules); + + TpProdOrderDetailVO orderDetail = tpOrderClient.getOrderDetail(dto); + + if (ObjectUtil.notEqual(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_CARPOOLING.getStatus())) { + LogUtil.error("当前拼车单状态为:{}, 无法取消拼车", TpOrderStatusEnum.getTpOrderStatusEnumByStatus(orderDetail.getStatus(), orderDetail.getType())); + throw new TpTradeProdException(TpTradeProdErrorCode.CARPOOL_NOT_ALLOW_CANCEL_ERROR); + } + + if (orderDetail.getCarpoolEndTime() < DateUtil.current()) { + LogUtil.error("当前时间拼车单无法取消"); + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_CANCEL_ERROR_NOT_ALLOW_TIME); + } + + // List subjectItemNos = orderDetail.getOrderSubjectItem().stream().map(TpOrderSubjectItemVO::getItemNo).collect(Collectors.toList()); + + TpCancelCarpoolDTO tpCancelCarpoolDTO = new TpCancelCarpoolDTO(); + tpCancelCarpoolDTO.setOperateType(TpCarpoolOrderOperateEnum.CANCEL.getOperateType()); + tpCancelCarpoolDTO.setOrderNo(orderDetail.getOrderNo()); + tpCancelCarpoolDTO.setTenantId(dto.getTenantId()); + + tpOrderClient.cancelCarpoolOrder(tpCancelCarpoolDTO); + + return TpResult.success(Boolean.TRUE); + } + + @Override + public TpResult isReschedule(TpProdOrderQueryDTO dto) { + Assert.hasText(dto.getUserNo(), "userNo is null"); + + // 判断是否拥有改签入口 + Boolean isReschedule = checkIsReschedule(dto, null, null); + + return TpResult.success(isReschedule); + } + + @Override + public TpResult rescheduleOrder(TpProdOrderRescheduleDTO dto) { + Assert.notNull(dto, "reschedule params is null"); + Assert.isTrue(CollUtil.isNotEmpty(dto.getRescheduleRecords()), "reschedule records is null"); + Assert.isTrue(CollUtil.isNotEmpty(dto.getInvalidVoucherDTOs()), "invalid vouchers is null"); + checkCreateOrderParams(dto.getCreateOrderDto()); + Assert.hasText(dto.getTenantId(), "tenantId is null"); + + TpProdOrderQueryDTO queryDto = TpProdOrderQueryDTO.builder() + .orderNo(dto.getOriginalOrderNo()) + .userNo(dto.getCreateOrderDto().getUserNo()) + .needModules(Lists.newArrayList(TpOrderModulesEnum.ORDER_TRAVEL_TRIP.getModule(), TpOrderModulesEnum.ORDER_SUBJECT_ITEM.getModule(), TpOrderModulesEnum.ORDER_ROUTE_INFO.getModule())) + .tenantId(dto.getTenantId()).build(); + + // 查询订单详情 + TpResult orderDetail = getOrderDetail(queryDto); + + if (ObjectUtil.isNull(orderDetail.getData().getPayAmount()) || new BigDecimal(orderDetail.getData().getPayAmount()).compareTo(BigDecimal.ZERO) == 0) { + LogUtil.info("零元单暂不支持改签"); + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_NOT_ALLOW_RESCHEDULE_ERROR); + } + + dto.setOrderDetail(orderDetail.getData()); + + // 非定制公交 或者 非待乘车状态 不可改签 + if (ObjectUtil.notEqual(TpOrderTypeEnum.CUSTOMIZED_ORDER.getType(), orderDetail.getData().getType()) || !TpOrderStatusEnum.CUSTOM_BUS_VALID_TICKET.contains(orderDetail.getData().getStatus())) { + LogUtil.info("当前订单:{},暂不支持改签", JSONUtil.toJsonStr(orderDetail.getData())); + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_NOT_ALLOW_RESCHEDULE_ERROR); + } + + return TpResult.success(liteFlowManager.rescheduleOrder(dto)); + } + + private Boolean checkIsReschedule(TpProdOrderQueryDTO dto, TpProdOrderRescheduleDTO rescheduleDto, String processType) { + // 查询订单详情 + TpResult orderDetail = getOrderDetail(dto); + // 默认值 + Boolean isReschedule = Boolean.FALSE; + try { + + if (orderDetail.getData().getOrderTime() < 1722340800000L) { + LogUtil.info("当前时间订单无法改签"); + return Boolean.FALSE; + } + + if (ObjectUtil.isNull(orderDetail.getData().getPayAmount()) || new BigDecimal(orderDetail.getData().getPayAmount()).compareTo(BigDecimal.ZERO) == 0) { + LogUtil.info("零元单暂不支持改签"); + return Boolean.FALSE; + } + + if (ObjectUtil.isNotNull(rescheduleDto)) { + rescheduleDto.setOrderDetail(orderDetail.getData()); + } + + // 非定制公交 或者 非待乘车状态 不可改签 + if (ObjectUtil.notEqual(TpOrderTypeEnum.CUSTOMIZED_ORDER.getType(), orderDetail.getData().getType()) || !TpOrderStatusEnum.CUSTOM_BUS_VALID_TICKET.contains(orderDetail.getData().getStatus())) { + return Boolean.FALSE; + } + + TpProdQueryAvailableRescheduleVoucherDTO voucherQueryDto = new TpProdQueryAvailableRescheduleVoucherDTO(); + voucherQueryDto.setOrderNo(dto.getOrderNo()); + voucherQueryDto.setProductCode(orderDetail.getData().getProductNo()); + voucherQueryDto.setTenantId(dto.getTenantId()); + voucherQueryDto.setApplyTime(System.currentTimeMillis()); + voucherQueryDto.setOrderDetailVO(orderDetail.getData()); + voucherQueryDto.setProcessType(processType); + if (StringUtils.equals(TpFlowProcessTypeEnum.CONFIRM_RESCHEDULE_ORDER.getCode(), processType)) { + List voucherNos = rescheduleDto.getInvalidVoucherDTOs() + .stream() + .map(TpProdInvalidVoucherDTO::getVoucherNo) + .collect(Collectors.toList()); + voucherQueryDto.setVoucherNos(voucherNos); + } + + TpQueryAvailableRescheduleVoucherDTO voucherVO = this.queryAvailableRescheduleVoucherList(voucherQueryDto); + + if (ObjectUtil.isNotNull(voucherVO)) { + isReschedule = Boolean.TRUE; + } + } catch (Exception e) { + isReschedule = Boolean.FALSE; + LogUtil.warn("当前无法改签:{}", e); + } + return isReschedule; + } + + private TpQueryAvailableRescheduleVoucherDTO queryAvailableRescheduleVoucherList(TpProdQueryAvailableRescheduleVoucherDTO queryDTO) { + TpResult result = voucherAcceptanceFacade.queryAvailableRescheduleVoucherList(queryDTO); + if (!result.isSuccess()) { + LogUtil.error("查询可改签凭证列表错误, 入参: {}, 失败原因: {}", JSONObject.toJSONString(queryDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return result.getData(); + } + + private void setSaleUnitCarpoolInfo(List list, String tenantId) { + if (CollUtil.isEmpty(list)) { + return; + } + + // 将所有的售卖单元编码过滤出来 + List subjectItemNos = list.stream() + .flatMap(order -> order.getOrderSubjectItem().stream()) + .map(TpOrderSubjectItemVO::getItemNo) + .distinct() + .collect(Collectors.toList()); + + TpSalesUnitCarPoolListQueryDTO carpoolListQueryDto = new TpSalesUnitCarPoolListQueryDTO(); + carpoolListQueryDto.setSalesUnitCodeList(subjectItemNos); + carpoolListQueryDto.setTenantId(tenantId); + + // 查询所有的售卖单元编码对应的开线信息 + Map saleUnitCarpoolMap = tpProductSalesUnitClient.listCarpools(carpoolListQueryDto) + .stream() + .collect(Collectors.toMap(TpSalesUnitCarPoolVO::getSalesUnitCode, Function.identity(), (k1, k2) -> k2)); + + Map> groupedOrders = list.stream() + .flatMap(order -> order.getOrderSubjectItem().stream() + .map(subjectItem -> new AbstractMap.SimpleEntry<>(subjectItem.getItemNo(), order))) + .collect(Collectors.groupingBy(Map.Entry::getKey, + Collectors.mapping(Map.Entry::getValue, Collectors.toList()))); + + groupedOrders.forEach((subjectItemNo, orderList) -> { + TpSalesUnitCarPoolVO tpSalesUnitCarPoolVO = saleUnitCarpoolMap.get(subjectItemNo); + orderList.forEach(order -> order.setCarpoolInfo(saleUnitCarpoolConvert.productSaleUnit2productSaleUnitCarpool(tpSalesUnitCarPoolVO))); + }); + } + + private void checkQueryListPassengerParams(TpUserPassengerQueryDTO dto) { + Assert.hasText(dto.getUserNo(), "userNo is null"); + Assert.hasText(dto.getTenantId(), "tenantId is null"); + } + + private static void checkQueryPassengerParams(TpUserPassengerQueryDTO dto) { + Assert.hasText(dto.getUserNo(), "userNo is null"); + Assert.hasText(dto.getPassengerNo(), "passengerNo is null"); + Assert.hasText(dto.getTenantId(), "tenantId is null"); + } + + private static void checkEditPassengerParams(TpUserPassengerDTO dto) { + Assert.hasText(dto.getPassengerNo(), "passengerNo is null"); + checkSavePassengerParams(dto); + } + + private static void checkSavePassengerParams(TpUserPassengerDTO dto) { + Assert.hasText(dto.getUserNo(), "userNo is null"); + Assert.hasText(dto.getTenantId(), "tenantId is null"); + Assert.hasText(dto.getPassengerName(), "passengerName is null"); + Assert.hasText(dto.getIdentityNumber(), "identityNumber is null"); + } + + private List buildModules() { + List needModules = Lists.newArrayList(); + needModules.add(TpOrderModulesEnum.ORDER_PRICE_RECORD.getModule()); + needModules.add(TpOrderModulesEnum.ORDER_PLACER.getModule()); + needModules.add(TpOrderModulesEnum.ORDER_REQUIREMENT_USER.getModule()); + needModules.add(TpOrderModulesEnum.ORDER_SUBJECT_ITEM.getModule()); + needModules.add(TpOrderModulesEnum.ORDER_TRAVEL_TRIP.getModule()); + needModules.add(TpOrderModulesEnum.ORDER_SERVICE_TARGET.getModule()); + needModules.add(TpOrderModulesEnum.ORDER_ROUTE_INFO.getModule()); + needModules.add(TpOrderModulesEnum.CHARGE_RECORD.getModule()); + needModules.add(TpOrderModulesEnum.ORDER_INVOICE.getModule()); + needModules.add(TpOrderModulesEnum.RESCHEDULE_RECORD.getModule()); + return needModules; + } + + @Override + public TpResult createOrder(TpProdOrderCreateDTO dto) { + // 参数校验 + checkCreateOrderParams(dto); + + return TpResult.success(liteFlowManager.createOrder(dto)); + } + + private TpProdDetailDTO queryProduct(String productNo, String tenantId) { + TpProductQueryDTO tpProductQueryDTO = new TpProductQueryDTO(); + tpProductQueryDTO.setProductCode(productNo); + tpProductQueryDTO.setFormalFlag(FormalFlagEnum.FORMAL.getCode()); + tpProductQueryDTO.setTenantId(tenantId); + tpProductQueryDTO.setNeedProperties(Lists.newArrayList( + NeedPropertiesEnum.SERVICE_OBJECT.getCode(), + //NeedPropertiesEnum.SUBJECT_ITEM.getCode(), + //NeedPropertiesEnum.SALES_UNIT.getCode(), + NeedPropertiesEnum.BIZ_RULE.getCode(), + NeedPropertiesEnum.ROUTE.getCode(), + NeedPropertiesEnum.EXTEND_ATTRIBUTE.getCode() + //NeedPropertiesEnum.CATEGORY.getCode(), + //NeedPropertiesEnum.PRICE_UNIT.getCode() + //NeedPropertiesEnum.INVENTORY.getCode() + )); + return tpProductClient.getProduct(tpProductQueryDTO); + } + + private void checkCreateOrderParams(TpProdOrderCreateDTO dto) { + Assert.hasText(dto.getTenantId(), "tenantId is null"); + Assert.hasText(dto.getOutRequestNo(), "outRequestNo is null"); + Assert.hasText(dto.getProductNo(), "productNo is null"); + Assert.hasText(dto.getUserNo(), "userNo is null"); + Assert.hasText(dto.getPayAmount(), "payAmount is null"); + Assert.notNull(dto.getIdentityVerificat(), "identityVerificat is null"); + if (ObjectUtil.equals(dto.getType(), TpOrderTypeEnum.CUSTOMIZED_ORDER.getType())) { + Assert.hasText(dto.getTicketType(), "ticketType is null"); + Assert.isTrue(CollUtil.isNotEmpty(dto.getRoutes()), "route is empty"); + } + Assert.isTrue(CollUtil.isNotEmpty(dto.getOrderSubjectItem()), "orderSubjectItem is empty"); + } + + @Override + public TpResult endorseOrder(TpProdOrderCreateDTO dto) { + // 参数校验 + checkEndorseParams(dto); + return TpResult.success(liteFlowManager.changeOrder(dto)); + } + + @NotNull + private static TpProdOrderEndorseCreateVO buildEndorseVO(TpProdOrderEndorseCreateVO orderCreateVO) { + TpProdOrderEndorseCreateVO result = new TpProdOrderEndorseCreateVO(); + result.setOriginalOrderNo(orderCreateVO.getOriginalOrderNo()); + result.setOrderNo(orderCreateVO.getOrderNo()); + result.setCreateTime(orderCreateVO.getCreateTime()); + result.setFee(orderCreateVO.getFee()); + return result; + } + + private void checkEndorseParams(TpProdOrderCreateDTO dto) { + Assert.hasText(dto.getOrderNo(), "orderNo is null"); + Assert.hasText(dto.getOriginalOrderNo(), "originalNo is null"); + checkCreateOrderParams(dto); + } + + @Override + public TpResult payOrder(TpProdOrderPayDTO dto) { + // 参数校验 + checkPayParams(dto); + + // 查询订单 + TpProdOrderDetailVO order = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .originalOrderNo(dto.getOrderNo()) + .tenantId(dto.getTenantId()) + .userNo(dto.getUserNo()) + .needModules(ListUtil.toList(TpOrderModulesEnum.CHARGE_RECORD.getModule(), TpOrderModulesEnum.ORDER_ROUTE_INFO.getModule())).build()); + + if (ObjectUtil.equal(order.getType(), TpOrderTypeEnum.CUSTOMIZED_ORDER.getType()) + && !ObjectUtil.equal(order.getStatus(), TpOrderStatusEnum.PENDING_PAY.getStatus())) { + LogUtil.error("订单状态非法,当前订单状态不支持拉起收银台进行支付,状态为:{},订单编号为:{}", order.getStatus(), order.getOrderNo()); + throw new TpTradeProdException(TpTradeProdErrorCode.INVALID_ORDER_STATUS); + } + + if (ObjectUtil.equal(order.getType(), TpOrderTypeEnum.PACKING_ORDER.getType()) + && !TpOrderStatusEnum.CHARTER_AVAILABLE_PAY_STATUS.contains(order.getStatus())) { + LogUtil.error("订单状态非法,当前订单状态不支持拉起收银台进行支付,状态为:{},订单编号为:{}", order.getStatus(), order.getOrderNo()); + throw new TpTradeProdException(TpTradeProdErrorCode.INVALID_ORDER_STATUS); + } + + String orgCode = ""; + if (ObjectUtil.equal(order.getType(), TpOrderTypeEnum.CUSTOMIZED_ORDER.getType())) { + // 查询产品信息 + TpProdDetailDTO productDetailDTO = queryProduct(order.getProductNo(), dto.getTenantId()); + if (productDetailDTO == null || productDetailDTO.getRouteDetailDTO() == null || productDetailDTO.getRouteDetailDTO().getRouteBase() == null) { + LogUtil.error("查询支付结果失败,原因:产品信息不存在,入参为:{}", JSONUtil.toJsonStr(dto)); + throw new TpTradeProdException(TpTradeProdErrorCode.PRODUCT_NOT_EXIST_ERROR); + } + + orgCode = productDetailDTO.getRouteDetailDTO().getRouteBase().getOrgCode(); + } else { + // 和侨总确定这里不需要传状态,只会捞到一个派单记录 + TpProdOrderDispatchDetailDTO orderDispatchDetailDTO = new TpProdOrderDispatchDetailDTO(); + orderDispatchDetailDTO.setOriginalOrderNo(order.getOriginalOrderNo()); + orderDispatchDetailDTO.setTenantId(dto.getTenantId()); + TpProdOrderDispatchDetailVO orderDispatchDetail = orderDispatchClient.getOrderDispatchDetail(orderDispatchDetailDTO); + if (orderDispatchDetail == null) { + LogUtil.error("支付接口,查询订单的最新派单成功的派单记录,结果为空,入参为:{}", JSONUtil.toJsonStr(orderDispatchDetailDTO)); + throw new TpTradeProdException(TpTradeProdErrorCode.NOT_FOUND_SUCCESS_DISPATCH_RECORD); + } + orgCode = orderDispatchDetail.getTargetOrgNo(); + } + + // 订金支付时创建支付订单 + if (StrUtil.equals(dto.getBizType(), TpBizTypeEnum.DEPOSIT_PAY.getCode())) { + tpOrderClient.createDepositOrder(TpDepositOrderDTO.builder() + .orderNo(order.getOriginalOrderNo()) + .tenantId(dto.getTenantId()) + .payPercentage(dto.getPercentage()) + .payAmount(dto.getPayAmount()).build()); + } + + // 订金支付时创建支付订单 + if (StrUtil.equals(dto.getBizType(), TpBizTypeEnum.BALANCE_PAY.getCode())) { + tpOrderClient.createBalanceOrder(TpBalanceOrderDTO.builder() + .orderNo(order.getOriginalOrderNo()) + .tenantId(dto.getTenantId()) + .payAmount(dto.getPayAmount()).build()); + } + + // 预支付 + TpProdOrderPayDTO tpProdOrderPayDTO = buildOrderPayDTO(dto, order); + tpProdOrderPayDTO.setPayTimeout(System.currentTimeMillis() + TpTradeProdConstants.DEFAULT_TIME_OUT_INTERVAL); + tpProdOrderPayDTO.setOrgCode(orgCode); + TpUserInfoDTO userInfoDTO = dto.getUserInfoDTO(); + tpProdOrderPayDTO.setUserInfoDTO(userInfoDTO); + + TpProdOrderPayVO tpProdOrderPayVO = tpOrderClient.payOrder(tpProdOrderPayDTO); + + return TpResult.success(tpProdOrderPayVO); + } + + @NotNull + private TpProdOrderPayDTO buildOrderPayDTO(TpProdOrderPayDTO dto, TpProdOrderDetailVO order) { + TpProdOrderPayDTO tpProdOrderPayDTO = new TpProdOrderPayDTO(); + tpProdOrderPayDTO.setUserNo(dto.getUserNo()); + tpProdOrderPayDTO.setOrderNo(order.getOriginalOrderNo()); + if (ObjectUtil.equals(TpOrderTypeEnum.CUSTOMIZED_ORDER.getType(), order.getType())) { + tpProdOrderPayDTO.setPayAmount(order.getPayAmount()); + } else { + tpProdOrderPayDTO.setPayAmount(getPackagingPayAmount(dto, order)); + } + tpProdOrderPayDTO.setDiscountMoney(getDiscountMoney(order)); + tpProdOrderPayDTO.setPayType(dto.getPayType()); + tpProdOrderPayDTO.setAppId(dto.getAppId()); + tpProdOrderPayDTO.setSource(dto.getSource()); + tpProdOrderPayDTO.setUserIp(dto.getUserIp()); + tpProdOrderPayDTO.setTenantId(dto.getTenantId()); + tpProdOrderPayDTO.setBuyerId(dto.getBuyerId()); + tpProdOrderPayDTO.setReturnUrl(dto.getReturnUrl()); + if (ObjectUtil.equals(order.getType(), TpOrderTypeEnum.CUSTOMIZED_ORDER.getType())) { + tpProdOrderPayDTO.setPayTitle(order.getTpOrderRoutes().get(0).getRouteName()); + } else { + tpProdOrderPayDTO.setPayTitle(dto.getPayTitle()); + } + tpProdOrderPayDTO.setBizType(dto.getBizType()); + return tpProdOrderPayDTO; + } + + private String getPackagingPayAmount(TpProdOrderPayDTO dto, TpProdOrderDetailVO orderDetail) { + BigDecimal needPayAmount = BigDecimal.ZERO; + // 预约包车金额计算 + if (StrUtil.equals(TpBizTypeEnum.DEPOSIT_PAY.getCode(), dto.getBizType())) { + needPayAmount = new BigDecimal(orderDetail.getPayAmount()); + } else { + // 尾款支付情况 + // 如果订单状态为取消待支付,塞入需要支付的尾款金额 + if (ObjectUtil.equals(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_CANCEL_NEED_PAY.getStatus())) { + BigDecimal serviceCharge = new BigDecimal(orderDetail.getServiceCharge()); + BigDecimal paidAmount = new BigDecimal(orderDetail.getPayAmount()); + needPayAmount = serviceCharge.subtract(paidAmount); + } + + // 如果订单状态为行程结束待支付,塞入需要支付的尾款金额 + if (ObjectUtil.equals(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_TRIP_END_NEED_PAY.getStatus())) { + BigDecimal serviceCharge = StrUtil.isEmpty(orderDetail.getServiceCharge()) ? BigDecimal.ZERO : new BigDecimal(orderDetail.getServiceCharge()); + BigDecimal paidAmount = StrUtil.isEmpty(orderDetail.getPayAmount()) ? BigDecimal.ZERO : new BigDecimal(orderDetail.getPayAmount()); + BigDecimal payableAmount = new BigDecimal(orderDetail.getPayableAmount()); + needPayAmount = payableAmount.add(serviceCharge).subtract(paidAmount); + } + } + + if (needPayAmount.compareTo(BigDecimal.ZERO) == 0) { + LogUtil.error("当前待支付金额为0, 请核对支付金额后重试"); + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_NEED_PAY_AMOUNT_ERROR); + } + return needPayAmount.toString(); + } + + private String getDiscountMoney(TpProdOrderDetailVO orderDetailVO) { + if (ObjectUtil.equals(orderDetailVO.getType(), TpOrderTypeEnum.CUSTOMIZED_ORDER.getType())) { + BigDecimal originalAmount = new BigDecimal(orderDetailVO.getOriginalAmount()); + BigDecimal payAmount = new BigDecimal(orderDetailVO.getPayAmount()); + return originalAmount.subtract(payAmount).toString(); + } + + return ZERO; + } + + private void checkPayParams(TpProdOrderPayDTO dto) { + Assert.hasText(dto.getUserNo(), "userNo is null"); + Assert.hasText(dto.getOrderNo(), "orderNo is null"); + Assert.hasText(dto.getTenantId(), "tenantId is null"); + Assert.hasText(dto.getBizType(), "bizType is null"); + Assert.notNull(dto.getUserInfoDTO(), "userInfo is null"); + Assert.hasText(dto.getUserInfoDTO().getUserName(), "userName is null"); + Assert.hasText(dto.getUserInfoDTO().getUserNo(), "userNo is null"); + Assert.hasText(dto.getBizType(), "bizType is null"); + } + + @Override + public TpResult paid(TpProdOrderPaidDTO dto) { + // 参数校验 + checkPaidParams(dto); + + TpProdOrderDetailVO orderDetail = dto.getOrderDetailVO(); + + // 订单是否过期 + if ((ObjectUtil.equals(orderDetail.getType(), TpOrderTypeEnum.CUSTOMIZED_ORDER.getType()) && ObjectUtil.equal(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_TIMEOUT)) + || (ObjectUtil.equals(orderDetail.getType(), TpOrderTypeEnum.CARPOOL_ORDER.getType()) && ObjectUtil.equal(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_CARPOOL_TIMEOUT))) { + LogUtil.error("当前订单:{}, 已超时, 不可支付", orderDetail.getOrderNo()); + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_EXPIRED); + } + + // 当前订单已经支付,幂等处理 + if ((ObjectUtil.equals(orderDetail.getType(), TpOrderTypeEnum.CUSTOMIZED_ORDER.getType()) && orderDetail.getStatus().compareTo(TpOrderStatusEnum.ALREADY_PAY.getStatus()) >= 0) + || (ObjectUtil.equals(orderDetail.getType(), TpOrderTypeEnum.CARPOOL_ORDER.getType()) && orderDetail.getStatus().compareTo(TpOrderStatusEnum.ORDER_CARPOOLING.getStatus()) >= 0)) { + LogUtil.info("当前订单:{}, 已支付", orderDetail.getOrderNo()); + throw new TpTradeProdException(TpTradeProdErrorCode.IDEMPOTENT_REQUEST_ERROR); + } + + // 获取产品的乘车次数限制规则 + TpProdDetailDTO productDetailDTO = queryProduct(orderDetail.getProductNo(), dto.getTenantId()); + + liteFlowManager.paid(dto, orderDetail, productDetailDTO); + + return TpResult.success(TpProdOrderPaidVO.builder().orderNo(orderDetail.getOrderNo()).build()); + } + + private static void checkPaidParams(TpProdOrderPaidDTO dto) { + Assert.hasText(dto.getOrderNo(), "orderNo is null!"); + Assert.hasText(dto.getTenantId(), "tenantId is null!"); + } + + + private void setUpShowFormRatingButton(Map> orders) { + if (MapUtils.isEmpty(orders)) { + return; + } + + Map ratedOrders = ratingFormClient.queryOrdersRated(new ArrayList<>(orders.keySet()), CommonTenantIdUtil.getTenantId()); + if (MapUtils.isEmpty(ratedOrders)) { + return; + } + + for (Map.Entry> entry : orders.entrySet()) { + entry.getValue().accept(ratedOrders.get(entry.getKey())); + } + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/impl/TpOrderChangeApplyAcceptanceFacadeImpl.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/impl/TpOrderChangeApplyAcceptanceFacadeImpl.java new file mode 100644 index 0000000..775271e --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/impl/TpOrderChangeApplyAcceptanceFacadeImpl.java @@ -0,0 +1,79 @@ +package com.deepinnet.tptradeprod.biz.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tptradeprod.biz.service.flow.manager.LiteFlowManager; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderChangeApplyCreatedDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderChangeApplyDetailDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderChangeApplyListDTO; +import com.deepinnet.tptradeprod.common.service.facade.TpOrderChangeAcceptanceFacade; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderChangeApplyClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderChangeApplyListVO; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderChangeApplyDetailVO; +import org.apache.dubbo.config.annotation.DubboService; + +import javax.annotation.Resource; +import javax.validation.constraints.NotNull; +import java.util.List; + +@DubboService +public class TpOrderChangeApplyAcceptanceFacadeImpl implements TpOrderChangeAcceptanceFacade { + + @Resource + private TpOrderChangeApplyClient tpOrderChangeApplyClient; + + @Resource + private LiteFlowManager liteFlowManager; + + @Override + public TpResult getOrderChangeDetail(TpProdOrderChangeApplyDetailDTO dto) { + //TODO 兼容逻辑,带前端修改好后,删除此逻辑 + if(StrUtil.isEmpty(dto.getOriginalOrderNo())){ + dto.setOriginalOrderNo(dto.getOrderNo()); + } + return TpResult.success(tpOrderChangeApplyClient.getOrderChangedApplyDetail(dto)); + } + + @Override + public TpResult> listOrderChangeApplyHistory(TpProdOrderChangeApplyListDTO dto) { + //TODO 兼容逻辑,带前端修改好后,删除此逻辑 + if(StrUtil.isEmpty(dto.getOriginalOrderNo())){ + dto.setOriginalOrderNo(dto.getOrderNo()); + } + return TpResult.success(tpOrderChangeApplyClient.listOrderChangeApplyHistory(dto)); + } + + @Override + public TpResult getOrderEndTripChangeChargeRecord(TpProdOrderChangeApplyListDTO dto) { + //TODO 兼容逻辑,带前端修改好后,删除此逻辑 + if(StrUtil.isEmpty(dto.getOriginalOrderNo())){ + dto.setOriginalOrderNo(dto.getOrderNo()); + } + return TpResult.success(tpOrderChangeApplyClient.getOrderEndTripChangeChargeRecord(dto)); + } + + @Override + public TpResult getLatestOrderChangeApplyDetail(TpProdOrderChangeApplyListDTO dto) { + //TODO 兼容逻辑,带前端修改好后,删除此逻辑 + if(StrUtil.isEmpty(dto.getOriginalOrderNo())){ + dto.setOriginalOrderNo(dto.getOrderNo()); + } + return TpResult.success(tpOrderChangeApplyClient.getLatestOrderChangeApplyDetail(dto)); + } + + /** + * 创建订单变更申请单:申请订单变更 + * + * @param orderChangeApplyCreatedDTO + * @return + */ + @Override + public TpResult createOrderChangeApply(@NotNull(message = "入参不能为空") TpProdOrderChangeApplyCreatedDTO orderChangeApplyCreatedDTO){ + //TODO 兼容逻辑,带前端修改好后,删除此逻辑 + if(StrUtil.isEmpty(orderChangeApplyCreatedDTO.getOriginalOrderNo())){ + orderChangeApplyCreatedDTO.setOriginalOrderNo(orderChangeApplyCreatedDTO.getOrderNo()); + } + return TpResult.success(liteFlowManager.createOrderChangeApply(orderChangeApplyCreatedDTO)); + + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/impl/TpOrderConfirmAcceptanceFacadeImpl.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/impl/TpOrderConfirmAcceptanceFacadeImpl.java new file mode 100644 index 0000000..b174155 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/impl/TpOrderConfirmAcceptanceFacadeImpl.java @@ -0,0 +1,438 @@ +package com.deepinnet.tptradeprod.biz.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson2.JSONObject; +import com.deepinnet.tp.common.lang.page.CommonPage; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.audit.TpAuditTypeEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderChangeItemFactorEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderChangeItemTypeEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderChangeTypeEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderModulesEnum; +import com.deepinnet.tptradeprod.biz.service.flow.manager.LiteFlowManager; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.enums.TpOrderAuditConfirmTypeEnum; +import com.deepinnet.tptradeprod.common.enums.TpOrderSceneEnum; +import com.deepinnet.tptradeprod.common.enums.TpOrderServiceChargeFreeEnum; +import com.deepinnet.tptradeprod.common.enums.TpOrderSourceEnum; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.facade.TpOrderAcceptanceFacade; +import com.deepinnet.tptradeprod.common.service.facade.TpOrderAuditAcceptanceFacade; +import com.deepinnet.tptradeprod.common.service.facade.TpOrderChangeAcceptanceFacade; +import com.deepinnet.tptradeprod.common.service.integration.client.TpAuditClient; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderDispatchClient; +import com.deepinnet.tptradeprod.common.vo.*; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditLatestDetailDTO; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditListVO; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditQueryDetailDTO; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditVO; +import com.google.common.collect.Lists; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.dubbo.config.annotation.DubboService; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; + +import javax.annotation.Resource; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicReference; + + +/** + * @author xiehuaqiao + */ +@DubboService +public class TpOrderConfirmAcceptanceFacadeImpl implements TpOrderAuditAcceptanceFacade { + + @Resource + private TpAuditClient tpAuditClient; + + @Resource + private TpOrderClient tpOrderClient; + + @Resource + private TpOrderDispatchClient orderDispatchClient; + + @DubboReference + private TpOrderAcceptanceFacade tpOrderAcceptanceFacade; + + @Resource + private TpOrderChangeAcceptanceFacade orderChangeAcceptanceFacade; + + @Resource + private RedissonClient redissonClient; + @Resource + private LiteFlowManager liteFlowManager; + + @Override + public TpResult confirmOrder(TpProdOrderAuditConfirmDTO dto) { + //中山需求:同一个订单需要支持分配给不同车队,需要选择一个主车队对应主数据的一条线路,每个车型可以由其合营的车队负责 + + //TODO 兼容逻辑,带前端修改好后,删除此逻辑 + if(StrUtil.isEmpty(dto.getOriginalOrderNo())){ + dto.setOriginalOrderNo(dto.getOrderNo()); + } + String lockOrderNo = dto.getOriginalOrderNo() + ":" + dto.getTenantId(); + RLock lock = redissonClient.getLock(lockOrderNo); + boolean tryLock = lock.tryLock(); + // 判断是否获取到当锁 + if (!tryLock) { + LogUtil.error("订单确认审核处理-获取订单信息写入锁失败:{}", JSONObject.toJSONString(dto)); + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_HAS_CHANGED_ERROR); + } + try { + return TpResult.success(liteFlowManager.confirmOrder(dto)); + } catch (Exception e) { + LogUtil.error("订单确认审核处理失败:", e); + } finally { + // 释放锁 + if (lock.isLocked() && lock.isHeldByCurrentThread()) { + lock.unlock(); + } + } + return TpResult.fail(TpTradeProdErrorCode.ORDER_AUDIT_CONFIRM_ERROR.getCode(), TpTradeProdErrorCode.ORDER_AUDIT_CONFIRM_ERROR.getDesc()); + + } + + @Override + public TpResult reduceFullServiceCharge(TpProdOrderServiceChargeReduceConfirmDTO reduceDTO) { + return reduceServiceChargeConfirm(reduceDTO); + } + + @Override + public TpResult reduceServiceChargeConfirm(TpProdOrderServiceChargeReduceConfirmDTO reduceDTO) { + //TODO 兼容逻辑,带前端修改好后,删除此逻辑 + if(StrUtil.isEmpty(reduceDTO.getOriginalOrderNo())){ + reduceDTO.setOriginalOrderNo(reduceDTO.getOrderNo()); + } + String lockOrderNo = reduceDTO.getOriginalOrderNo() + ":" + reduceDTO.getTenantId(); + RLock lock = redissonClient.getLock(lockOrderNo); + boolean tryLock = lock.tryLock(); + // 判断是否获取到当锁 + if (!tryLock) { + LogUtil.error("订单减免服务费确认审核处理-获取订单信息写入锁失败:{}", JSONObject.toJSONString(reduceDTO)); + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_HAS_CHANGED_ERROR); + } + try { + return TpResult.success(liteFlowManager.reduceFullServiceCharge(reduceDTO)); + } catch (Exception e) { + LogUtil.error("订单减免服务费确认审核处理失败:", e); + } finally { + // 释放锁 + if (lock.isLocked() && lock.isHeldByCurrentThread()) { + lock.unlock(); + } + } + return TpResult.fail(TpTradeProdErrorCode.ORDER_FULL_RSC_AUDIT_CONFIRM_ERROR.getCode(), TpTradeProdErrorCode.ORDER_FULL_RSC_AUDIT_CONFIRM_ERROR.getDesc()); + + } + + + @Override + public TpResult getAuditDetail(TpProdAuditQueryDetailDTO tpAuditQueryDetailDTO) { + + return TpResult.success(tpAuditClient.getAuditDetail(tpAuditQueryDetailDTO)); + } + + @Override + public TpResult getLatestAuditDetail(TpProdAuditLatestDetailDTO auditLatestDetailDTO) { + return TpResult.success(tpAuditClient.getLatestAuditDetail(auditLatestDetailDTO)); + } + + @Override + public TpResult getOrderAuditConfirmOrderDetail(@NotNull(message = "入参不能为空") TpProdOrderConfirmViewDTO confirmViewDTO) { + + //TODO 兼容逻辑,带前端修改好后,删除此逻辑 + if(StrUtil.isEmpty(confirmViewDTO.getOriginalOrderNo())){ + confirmViewDTO.setOriginalOrderNo(confirmViewDTO.getOrderNo()); + } + TpOrderAuditConfirmTypeEnum confirmTypeEnum = TpOrderAuditConfirmTypeEnum.getTpOrderAuditConfirmType(confirmViewDTO.getOrderAuditConfirmType()); + TpProdOrderAuditConfirmOrderVO confirmOrderVO = null; + switch (confirmTypeEnum) { + case ORDER_CREATE: + confirmOrderVO = getOrderCreateOrderDetail(confirmViewDTO); + break; + case ORDER_CHANGE: + confirmOrderVO = getOrderChangeOrderDetail(confirmViewDTO); + break; + case ORDER_CANCEL: + confirmOrderVO = getOrderCancelOrderDetail(confirmViewDTO); + break; + } + return TpResult.success(confirmOrderVO); + } + + @Override + public TpResult> pageAuditList(TpProdAuditOrderListPagedQueryDTO dto) { + //TODO 兼容逻辑,带前端修改好后,删除此逻辑 + if(StrUtil.isEmpty(dto.getOriginalOrderNo())){ + dto.setOriginalOrderNo(dto.getOrderNo()); + } + //1.分页查询审核单列表 + CommonPage pageAuditList = tpAuditClient.pageAuditList(dto); + if (pageAuditList == null) { + LogUtil.error("查询失败,入参为:{}", JSONUtil.toJsonStr(dto)); + } + return TpResult.success(pageAuditList); + } + + + //订单取消确认信息查询 + private TpProdOrderAuditConfirmOrderVO getOrderCancelOrderDetail(TpProdOrderConfirmViewDTO confirmViewDTO) { + + //1.查询订单详情 + TpProdOrderQueryDTO orderQueryDTO = new TpProdOrderQueryDTO(); + orderQueryDTO.setOriginalOrderNo(confirmViewDTO.getOriginalOrderNo()); + orderQueryDTO.setTenantId(confirmViewDTO.getTenantId()); + orderQueryDTO.setNeedModules(Arrays.asList(TpOrderModulesEnum.ORDER_PRICE_RECORD.getModule(),TpOrderModulesEnum.CHARGE_RECORD.getModule())); + TpProdOrderDetailVO prodOrderDetailVO = tpOrderClient.getOrderDetail(orderQueryDTO); + if (prodOrderDetailVO == null) { + LogUtil.error("订单不存在,入参为:{}", JSONUtil.toJsonStr(orderQueryDTO)); + return null; + } + //2.查询订单取消的手续费信息 + String serviceChargeFee = getServiceChargeFee(prodOrderDetailVO.getOrderChargeRecords()); + TpProdOrderAuditConfirmOrderVO confirmOrderVO = new TpProdOrderAuditConfirmOrderVO(); + confirmOrderVO.setOriginalOrderNo(confirmViewDTO.getOriginalOrderNo()); + confirmOrderVO.setServiceChargeFee(serviceChargeFee); + confirmOrderVO.setRejectReasons(new ArrayList<>()); + //3.查询订单派单的组织数据 + confirmOrderVO.setOrgCode(getOrderDispatchOrgCode(confirmViewDTO.getTenantId(),confirmViewDTO.getOriginalOrderNo())); + return confirmOrderVO; + + } + + //订单变更确认信息查询 + private TpProdOrderAuditConfirmOrderVO getOrderChangeOrderDetail(TpProdOrderConfirmViewDTO confirmViewDTO) { + //1.查询订单详情 + TpProdOrderQueryDTO orderQueryDTO = new TpProdOrderQueryDTO(); + orderQueryDTO.setOriginalOrderNo(confirmViewDTO.getOriginalOrderNo()); + orderQueryDTO.setTenantId(confirmViewDTO.getTenantId()); + orderQueryDTO.setNeedModules(Arrays.asList(TpOrderModulesEnum.ORDER_PRICE_RECORD.getModule(),TpOrderModulesEnum.CHARGE_RECORD.getModule())); + TpProdOrderDetailVO prodOrderDetailVO = tpOrderClient.getOrderDetail(orderQueryDTO); + if (prodOrderDetailVO == null) { + LogUtil.error("订单不存在,入参为:{}", JSONUtil.toJsonStr(orderQueryDTO)); + return null; + } + //2.查询订单所属商品的最低价格 + String internalPrice = inquiryCharterInternalPrice(prodOrderDetailVO); + TpProdOrderAuditConfirmOrderVO confirmOrderVO = new TpProdOrderAuditConfirmOrderVO(); + confirmOrderVO.setOrderNo(confirmViewDTO.getOrderNo()); + confirmOrderVO.setOriginalOrderNo(confirmViewDTO.getOriginalOrderNo()); + confirmOrderVO.setInternalPrice(internalPrice); + confirmOrderVO.setCurrentPrice(prodOrderDetailVO.getOriginalAmount()); + //单次手续费计算 + String serviceChargeFee = getSingleServiceChargeFee(prodOrderDetailVO.getOrderChargeRecords()); + confirmOrderVO.setServiceChargeFee(serviceChargeFee); + confirmOrderVO.setRejectReasons(new ArrayList<>()); + //3.查询订单派单的组织数据 + confirmOrderVO.setOrgCode(getOrderDispatchOrgCode(confirmViewDTO.getTenantId(),confirmViewDTO.getOrderNo())); + + return confirmOrderVO; + } + //订单新建确认信息查询 + private TpProdOrderAuditConfirmOrderVO getOrderCreateOrderDetail(TpProdOrderConfirmViewDTO confirmViewDTO) { + //1.查询订单详情 + TpProdOrderQueryDTO orderQueryDTO = new TpProdOrderQueryDTO(); + orderQueryDTO.setOriginalOrderNo(confirmViewDTO.getOriginalOrderNo()); + orderQueryDTO.setTenantId(confirmViewDTO.getTenantId()); + orderQueryDTO.setNeedModules(Arrays.asList(TpOrderModulesEnum.ORDER_PRICE_RECORD.getModule())); + TpProdOrderDetailVO prodOrderDetailVO = tpOrderClient.getOrderDetail(orderQueryDTO); + if (prodOrderDetailVO == null) { + LogUtil.error("订单不存在,入参为:{}", JSONUtil.toJsonStr(orderQueryDTO)); + return null; + } + //2.查询订单所属商品的最低价格 + String internalPrice = inquiryCharterInternalPrice(prodOrderDetailVO); + //3.查询订单创建的支付模式信息 + TpProdOrderAuditConfirmOrderVO confirmOrderVO = new TpProdOrderAuditConfirmOrderVO(); + confirmOrderVO.setOrderNo(confirmViewDTO.getOrderNo()); + confirmOrderVO.setOriginalOrderNo(confirmViewDTO.getOriginalOrderNo()); + confirmOrderVO.setCurrentPrice(prodOrderDetailVO.getOriginalAmount()); + confirmOrderVO.setInternalPrice(internalPrice); + confirmOrderVO.setPayMode(prodOrderDetailVO.getPayMode()); + confirmOrderVO.setRejectReasons(new ArrayList<>()); + //4.查询订单派单的组织数据 + confirmOrderVO.setOrgCode(getOrderDispatchOrgCode(confirmViewDTO.getTenantId(),prodOrderDetailVO.getOriginalOrderNo())); + return confirmOrderVO; + } + + private String getOrderDispatchOrgCode(String tenantId, String originalOrderNo) { + TpProdOrderDispatchDetailDTO orderDispatchDetailDTO = new TpProdOrderDispatchDetailDTO(); + orderDispatchDetailDTO.setOriginalOrderNo(originalOrderNo); + orderDispatchDetailDTO.setTenantId(tenantId); + TpProdOrderDispatchDetailVO dispatchVO = orderDispatchClient.getOrderDispatchDetail(orderDispatchDetailDTO); + if(dispatchVO == null){ + return null; + } + return dispatchVO.getTargetOrgNo(); + } + + public String inquiryCharterInternalPrice(TpProdOrderDetailVO prodOrderDetailVO) { + + try { + List orderPriceRecordList = prodOrderDetailVO.getOrderPriceRecord(); + if (CollUtil.isEmpty(orderPriceRecordList)) { + return null; + } + TpOrderPriceRecordVO tpOrderPriceRecordVO = orderPriceRecordList.stream().findFirst().orElse(null); + if (tpOrderPriceRecordVO == null) { + return null; + } +// return charterBusInquireComponent.inquireInternalPrice(tpOrderPriceRecordVO.getPricingParams()); + return tpOrderPriceRecordVO.getInternalInquireAmount(); + }catch (Throwable throwable){ + LogUtil.error(throwable.getMessage(),throwable); + return null; + } + } + + @Override + public TpResult getOrderRefundInfoForFscConfirm(TpProdOrderRscConfirmQueryDTO confirmQueryDTO) { + return getOrderRefundInfoForRscConfirm(confirmQueryDTO); + } + + @Override + public TpResult endTripPriceConfirm(TpProdOrderEndTripPriceConfirmDTO orderEndTripPriceConfirmDTO) { + String orderNo = orderEndTripPriceConfirmDTO.getOrderNo(); + String originalOrderNo = orderEndTripPriceConfirmDTO.getOriginalOrderNo(); + String tenantId = orderEndTripPriceConfirmDTO.getTenantId(); + TpProdOrderChangeApplyCreatedDTO orderChangeApplyCreatedDTO = new TpProdOrderChangeApplyCreatedDTO(); + orderChangeApplyCreatedDTO.setTenantId(tenantId); + orderChangeApplyCreatedDTO.setOrderNo(orderNo); + orderChangeApplyCreatedDTO.setOriginalOrderNo(originalOrderNo); + orderChangeApplyCreatedDTO.setAutoAudit(Boolean.TRUE); + orderChangeApplyCreatedDTO.setApplyTime(DateUtil.current()); + orderChangeApplyCreatedDTO.setApplyType(TpOrderChangeTypeEnum.ORDER_END_CHARGE_CONFIRM.getType()); + orderChangeApplyCreatedDTO.setApplyReason(orderEndTripPriceConfirmDTO.getApplyDesc()); + orderChangeApplyCreatedDTO.setConfirmPrice(orderEndTripPriceConfirmDTO.getConfirmPrice()); + + //修改订单金额的业务员 + TpProdOrderChangeApplicantCreatedDTO applicantCreatedDTO = new TpProdOrderChangeApplicantCreatedDTO(); + applicantCreatedDTO.setApplicantNo(orderEndTripPriceConfirmDTO.getOperatorNo()); + applicantCreatedDTO.setApplicantName(orderEndTripPriceConfirmDTO.getOperatorName()); + applicantCreatedDTO.setApplicantPhone(orderEndTripPriceConfirmDTO.getOperatorPhone()); + orderChangeApplyCreatedDTO.setOrderChangeApplicant(applicantCreatedDTO); + + //获取订单来源 + TpProdOrderDetailVO orderDetail = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .originalOrderNo(originalOrderNo) + .tenantId(tenantId) + .build()); + if (StrUtil.equals(orderDetail.getSource(), TpOrderSourceEnum.BACKEND.getType())) { + orderChangeApplyCreatedDTO.setOrderScene(TpOrderSceneEnum.SALESMAN_OPERATE.getCode()); + }else { + orderChangeApplyCreatedDTO.setOrderScene(TpOrderSceneEnum.USER_OPERATE.getCode()); + } + + //订单变更项(订单金额) + List orderChangeItems = new ArrayList<>(); + + TpProdOrderChangeItemCreatedDTO tpOrderChangeItemDTO = new TpProdOrderChangeItemCreatedDTO(); + tpOrderChangeItemDTO.setOrderNo(orderNo); + tpOrderChangeItemDTO.setOriginalOrderNo(originalOrderNo); + tpOrderChangeItemDTO.setItemType(TpOrderChangeItemTypeEnum.ORDER_PRICE_CHANGED.getType()); + + TpProdOrderChangeItemFactorCreatedDTO tpOrderChangeItemFactorDTO = new TpProdOrderChangeItemFactorCreatedDTO(); + tpOrderChangeItemFactorDTO.setFactorCode(TpOrderChangeItemFactorEnum.ORDER_PRICE.getType()); + tpOrderChangeItemFactorDTO.setFactorName(TpOrderChangeItemFactorEnum.ORDER_PRICE.getDesc()); + tpOrderChangeItemFactorDTO.setOrderNo(orderNo); + tpOrderChangeItemFactorDTO.setOriginalOrderNo(originalOrderNo); + tpOrderChangeItemFactorDTO.setBeforeValue(orderEndTripPriceConfirmDTO.getBeforePrice().toPlainString()); + tpOrderChangeItemFactorDTO.setAfterValue(orderEndTripPriceConfirmDTO.getAfterPrice().toPlainString()); + tpOrderChangeItemFactorDTO.setTenantId(tenantId); + tpOrderChangeItemDTO.setItemFactors(Lists.newArrayList(tpOrderChangeItemFactorDTO)); + tpOrderChangeItemDTO.setTenantId(tenantId); + orderChangeItems.add(tpOrderChangeItemDTO); + + orderChangeApplyCreatedDTO.setOrderChangeItems(orderChangeItems); + + //创建一个自动审核的申请单,然后发起改价请求 + return orderChangeAcceptanceFacade.createOrderChangeApply(orderChangeApplyCreatedDTO); + } + + @Override + public TpResult getOrderRefundInfoForRscConfirm(@NotNull(message = "入参不能为空") TpProdOrderRscConfirmQueryDTO confirmQueryDTO) { + //TODO 兼容逻辑,带前端修改好后,删除此逻辑 + if(StrUtil.isEmpty(confirmQueryDTO.getOriginalOrderNo())){ + confirmQueryDTO.setOriginalOrderNo(confirmQueryDTO.getOrderNo()); + } + //1.查询订单详情 + TpProdOrderQueryDTO orderQueryDTO = new TpProdOrderQueryDTO(); + orderQueryDTO.setOriginalOrderNo(confirmQueryDTO.getOriginalOrderNo()); + orderQueryDTO.setTenantId(confirmQueryDTO.getTenantId()); + orderQueryDTO.setNeedModules(Arrays.asList(TpOrderModulesEnum.ORDER_PRICE_RECORD.getModule(),TpOrderModulesEnum.CHARGE_RECORD.getModule())); + TpProdOrderDetailVO prodOrderDetailVO = tpOrderClient.getOrderDetail(orderQueryDTO); + if (prodOrderDetailVO == null) { + LogUtil.error("订单不存在,入参为:{}", JSONUtil.toJsonStr(orderQueryDTO)); + return TpResult.fail(TpTradeProdErrorCode.INTERNAL_SERVER_ERROR.getCode(),"订单不存在,请确认订单编号是否正确"); + } + //2.查询订单创建的支付模式信息 + TpProdOrderRscConfirmVO confirmOrderVO = new TpProdOrderRscConfirmVO(); + confirmOrderVO.setOrderNo(prodOrderDetailVO.getOrderNo()); + confirmOrderVO.setOriginalOrderNo(prodOrderDetailVO.getOriginalOrderNo()); + confirmOrderVO.setCurrentAmount(prodOrderDetailVO.getOriginalAmount()); + confirmOrderVO.setRefundAmount(prodOrderDetailVO.getPayAmount()); + if(TpAuditTypeEnum.CHARTER_BUS_ORDER_CANCEL_RSC_APPROVAL.getBizType().intValue() == confirmQueryDTO.getRscBizChangeType()){ + confirmOrderVO.setServiceChargeFee( getServiceChargeFee(prodOrderDetailVO.getOrderChargeRecords())); + }else if(TpAuditTypeEnum.CHARTER_BUS_ORDER_CHANGE_RSC_APPROVAL.getBizType().intValue() == confirmQueryDTO.getRscBizChangeType()){ + confirmOrderVO.setServiceChargeFee( getSingleServiceChargeFee(prodOrderDetailVO.getOrderChargeRecords())); + } + return TpResult.success(confirmOrderVO); + } + + private String getSingleServiceChargeFee( List tpOrderChargeRecordVOList) { + + if(CollUtil.isEmpty(tpOrderChargeRecordVOList)){ + LogUtil.error("退款手续费计算错误,原因为:{}","订单返回的退款手续费记录为空" ); + return null; + } + TpOrderChargeRecordVO latestChargeRecord = tpOrderChargeRecordVOList.get(tpOrderChargeRecordVOList.size() -1); + if(latestChargeRecord == null || StrUtil.isEmpty(latestChargeRecord.getServiceCharge())){ + LogUtil.error("退款手续费计算错误,原因为:{}","订单返回的退款手续费记录为空" ); + return null; + } + AtomicReference serviceChargeFee = new AtomicReference<>(new BigDecimal(BigInteger.ZERO,2)); + serviceChargeFee.set(serviceChargeFee.get().add(new BigDecimal(latestChargeRecord.getServiceCharge()))); + if(serviceChargeFee == null || serviceChargeFee.get() == null){ + LogUtil.error("退款手续费计算错误,原因为:{}","没有符合条件的退款手续费记录" ); + return null; + } + return serviceChargeFee.get().toString(); + } + private String getServiceChargeFee( List tpOrderChargeRecordVOList) { + + if(CollUtil.isEmpty(tpOrderChargeRecordVOList)){ + LogUtil.error("退款手续费计算错误,原因为:{}","订单返回的退款手续费记录为空" ); + return null; + } + AtomicReference serviceChargeFee = new AtomicReference<>(new BigDecimal(BigInteger.ZERO,2)); + tpOrderChargeRecordVOList.stream().forEach(orderChargeRecordVO ->{ + if(orderChargeRecordVO == null || StrUtil.isEmpty(orderChargeRecordVO.getServiceCharge())){ + return ; + } + if( TpOrderServiceChargeFreeEnum.FREE.getCode().intValue() == orderChargeRecordVO.getFreeServiceCharge()){ + return ; + } + serviceChargeFee.set(serviceChargeFee.get().add(new BigDecimal(orderChargeRecordVO.getServiceCharge()))); + }); + + if(serviceChargeFee == null || serviceChargeFee.get() == null){ + LogUtil.error("退款手续费计算错误,原因为:{}","没有符合条件的退款手续费记录" ); + return null; + } + return serviceChargeFee.get().toString(); + } + + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/impl/TpOrderDispatchAcceptanceFacadeImpl.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/impl/TpOrderDispatchAcceptanceFacadeImpl.java new file mode 100644 index 0000000..a4258be --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/impl/TpOrderDispatchAcceptanceFacadeImpl.java @@ -0,0 +1,469 @@ +package com.deepinnet.tptradeprod.biz.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson2.JSONObject; +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpbaseopcore.common.dto.org.OrgDetailDTO; +import com.deepinnet.tpbaseopcore.common.dto.org.OrgListDTO; +import com.deepinnet.tpconfigcore.common.dto.SpecialCharterTypeCarrierOrganizationListQueryDTO; +import com.deepinnet.tpconfigcore.common.vo.SpecialCharterTypeCarrierOrganizationDTO; +import com.deepinnet.tptradecore.common.enums.order.*; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.enums.TpOrderStatusEnum; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.facade.TpOrderDispatchAcceptanceFacade; +import com.deepinnet.tptradeprod.common.service.integration.client.*; +import com.deepinnet.tptradeprod.common.vo.TpOrderListVO; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderChangeApplyDetailVO; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDispatchDetailVO; +import org.apache.dubbo.config.annotation.DubboService; +import org.jetbrains.annotations.NotNull; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +@DubboService +public class TpOrderDispatchAcceptanceFacadeImpl implements TpOrderDispatchAcceptanceFacade { + + public static final String TOP_ORG_LEVEL = "0"; + @Resource + private TpSpecialCharterTypeCarrierOrganizationClient tpSpecialCharterTypeCarrierOrganizationClient; + @Resource + private TpOrderDispatchClient tpOrderDispatchClient; + + @Resource + private TpOrderReceivedClient orderReceivedClient; + + @Resource + private TpOrgClient tpOrgClient; + + @Resource + private TpOrderClient tpOrderClient; + @Resource + private RedissonClient redissonClient; + private final String DISPATCH_LOCK_SUFFIX = ":dispatch_order"; + + @Override + public TpResult dispatchOrder(TpProdOrderManualDispatchDTO dto) { + + //1.校验是否指定了派单目标组织,若不指定,则不能派单 + if (StrUtil.isEmpty(dto.getTargetOrgNo())) { + return TpResult.fail(TpTradeProdErrorCode.ORDER_NONE_DISPATCH_ORG_ERROR.getCode(), TpTradeProdErrorCode.ORDER_NONE_DISPATCH_ORG_ERROR.getDesc()); + } + //TODO 兼容逻辑,带前端修改好后,删除此逻辑 + if(StrUtil.isEmpty(dto.getOriginalOrderNo())){ + dto.setOriginalOrderNo(dto.getOrderNo()); + } + //2.校验该包车类型是否有指定承运组织,如果有且业务员指派的组织和特殊组织不相同,则不允许指派 + String charterBusType = getCharterBusType(dto.getOriginalOrderNo(), dto.getTenantId()); + List specialTargetOrgNoList = getTargetOrgListNoByCharterBusType(dto.getTenantId(), charterBusType); + //3.该包车产品,若有特殊承运组织配置,业务指定的承运组织不是专属承运组织,则不允许派单 + if (CollUtil.isNotEmpty(specialTargetOrgNoList) && !CollUtil.contains(specialTargetOrgNoList, dto.getTargetOrgNo())) { + //2.1 提示信息增加公司名称列表 + String specialOrgErrorMsg = "该订单属于专属承运公司订单,请查询专属公司配置"; + List orgNames = getOrgNamesByOrgIds(specialTargetOrgNoList, dto.getTenantId()); + if (CollUtil.isNotEmpty(orgNames)) { + specialOrgErrorMsg = StrUtil.format(TpTradeProdErrorCode.ORDER_HAS_SPECAIL_ORG_ERROR.getDesc(), StrUtil.join(",", orgNames)); + } + + return TpResult.fail(TpTradeProdErrorCode.ORDER_HAS_SPECAIL_ORG_ERROR.getCode(), specialOrgErrorMsg); + } + + String lockBizNo = dto.getOriginalOrderNo() + DISPATCH_LOCK_SUFFIX; + RLock lock = redissonClient.getLock(lockBizNo); + boolean tryLock = lock.tryLock(); + // 判断是否获取到锁 + if (!tryLock) { + LogUtil.error("业务员手动派单-重复提交:{}", JSONObject.toJSONString(dto)); + throw new TpTradeProdException(TpTradeProdErrorCode.IDEMPOTENT_REQUEST_ERROR); + } + + try { + LogUtil.info("业务员手动派单-获取到锁,锁定对象:{}", lockBizNo); + //4.判断订单是否已经派过单 + TpProdOrderDispatchDetailVO oldOrderDispatchVo = getTpProdOrderDispatchVO(dto.getOriginalOrderNo(),dto.getTenantId()); + //已分配完成的状态,不允许再分配 + List dispatchStatuses = Arrays.asList(TpOrderDispatchStatusEnum.ORDER_DISPATCH_ASSIGNED_ORG_STATUS.getStatus(), + TpOrderDispatchStatusEnum.ORDER_DISPATCH_RECEIVED_STATUS.getStatus(), TpOrderDispatchStatusEnum.ORDER_DISPATCH_ASSIGNED_FLEET_STATUS.getStatus(), + TpOrderDispatchStatusEnum.ORDER_DISPATCH_REASSIGNED_STATUS.getStatus()); + if (oldOrderDispatchVo != null && CollUtil.contains(dispatchStatuses, oldOrderDispatchVo.getDispatchStatus())) { + return TpResult.fail(TpTradeProdErrorCode.ORDER_ALREADY_DISPATCH_ORG_ERROR.getCode(), TpTradeProdErrorCode.ORDER_ALREADY_DISPATCH_ORG_ERROR.getDesc()); + } + //5.进行业务员派单 + TpProdOrderDispatchCreatedDTO dispatchCreatedDTO = new TpProdOrderDispatchCreatedDTO(); + dispatchCreatedDTO.setOriginalOrderNo(dto.getOriginalOrderNo()); + dispatchCreatedDTO.setOrderNo(dto.getOrderNo()); + dispatchCreatedDTO.setDispatchScene(TpOrderDispatchSceneTypeEnum.OPERATOR_MANUAL_DISPATCH_SCENE.getSceneName()); + dispatchCreatedDTO.setDispatchTime(DateUtil.current()); + dispatchCreatedDTO.setDispatchStatus(TpOrderDispatchStatusEnum.ORDER_DISPATCH_ASSIGNED_ORG_STATUS.getStatus()); + dispatchCreatedDTO.setOperatorNo(dto.getOperatorNo()); + dispatchCreatedDTO.setOperatorName(dto.getOperatorName()); + dispatchCreatedDTO.setTargetOrgNo(dto.getTargetOrgNo()); + dispatchCreatedDTO.setTargetOrgName(getOrgName(dto.getTenantId(), dto.getTargetOrgNo())); + dispatchCreatedDTO.setTenantId(dto.getTenantId()); + dispatchCreatedDTO.setCharteredBusType(charterBusType); + return TpResult.success(tpOrderDispatchClient.dispatchOrder(dispatchCreatedDTO)); + + } catch (Exception e) { + LogUtil.error("业务员手动派单失败:" + JSONObject.toJSONString(dto), e); + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_DISTRIBUTE_ERROR); + } finally { + // 释放锁 + if (lock.isLocked() && lock.isHeldByCurrentThread()) { + lock.unlock(); + } + } + } + + private TpProdOrderDispatchDetailVO getTpProdOrderDispatchVO(String originalOrderNo,String tenantId) { + TpProdOrderDispatchDetailDTO orderDispatchDetailDTO = new TpProdOrderDispatchDetailDTO(); + orderDispatchDetailDTO.setTenantId(tenantId); + orderDispatchDetailDTO.setOriginalOrderNo(originalOrderNo); + return tpOrderDispatchClient.getOrderDispatchDetail(orderDispatchDetailDTO); + } + + private List getOrgNamesByOrgIds(List specialTargetOrgNoList, String tenantId) { + List orgListDTOS = Collections.EMPTY_LIST; + try { + orgListDTOS = tpOrgClient.listOrg(specialTargetOrgNoList, tenantId); + } catch (Exception e) { + LogUtil.error("批量获取组织信息接口调用失败:" + StrUtil.join(",", specialTargetOrgNoList), e); + } + if (CollUtil.isEmpty(orgListDTOS)) { + return Collections.EMPTY_LIST; + } + return orgListDTOS.stream().filter(Objects::nonNull).map(OrgListDTO::getName).collect(Collectors.toList()); + } + + private String getCharterBusType(String orderNo, String tenantId) { + + List orderListVOS = tpOrderClient.batchQueryListByOriginalOrderNo(Collections.singletonList(orderNo), tenantId); + if (CollectionUtil.isEmpty(orderListVOS)) { + return null; + } + return orderListVOS.get(0).getProductCategoryNo(); + } + + private String getOrgName(String tenantId, String orgNo) { + if (StrUtil.isEmpty(orgNo)) { + return null; + } + OrgDetailDTO orgDetailDTO = getOrgDetail(tenantId, orgNo); + if (orgDetailDTO == null || orgDetailDTO.getOrgBase() == null) { + return null; + } + return orgDetailDTO.getOrgBase().getName(); + } + + private OrgDetailDTO getOrgDetail(String tenantId, String orgNo) { + if (StrUtil.isEmpty(orgNo)) { + return null; + } + try { + return tpOrgClient.getOrgDetail(orgNo, tenantId); + }catch (Exception e){ + LogUtil.error("获取组织信息接口调用失败:"+orgNo,e ); + } + return null; + } + + + @Override + public TpResult dispatchOrder(TpProdOrderDispatchCreatedDTO dto) { + //TODO 兼容逻辑,带前端修改好后,删除此逻辑 + if(StrUtil.isEmpty(dto.getOriginalOrderNo())){ + dto.setOriginalOrderNo(dto.getOrderNo()); + } + String lockBizNo = dto.getOriginalOrderNo() + DISPATCH_LOCK_SUFFIX; + RLock lock = redissonClient.getLock(lockBizNo); + boolean tryLock = lock.tryLock(); + // 判断是否获取到锁 + if (!tryLock) { + LogUtil.error("订单派单-重复提交:{}", JSONObject.toJSONString(dto)); + throw new TpTradeProdException(TpTradeProdErrorCode.IDEMPOTENT_REQUEST_ERROR); + } + + try { + LogUtil.info("订单派单-获取到锁,锁定对象:{}", lockBizNo); + //1.若是业务员手动派单类型,则直接采用手动指定的组织 + if (TpOrderDispatchSceneTypeEnum.OPERATOR_MANUAL_DISPATCH_SCENE.getSceneName().equals(dto.getDispatchScene())) { + dto.setDispatchStatus(TpOrderDispatchStatusEnum.ORDER_DISPATCH_ASSIGNED_ORG_STATUS.getStatus()); + return TpResult.success(tpOrderDispatchClient.dispatchOrder(dto)); + } + //2.1下单来源组织为空,不派单,需要业务员手动指派 + if (StrUtil.isEmpty(dto.getOriginOrgNo())) { + dto.setDispatchStatus(TpOrderDispatchStatusEnum.ORDER_DISPATCH_UNASSIGNED_STATUS.getStatus()); + return TpResult.success(tpOrderDispatchClient.dispatchOrder(dto)); + } + //2.2 下单来源组织不存在,不派单,需要业务员手动指派 + OrgDetailDTO orgDetailDTO = getOrgDetail(dto.getTenantId(), dto.getOriginOrgNo()); + if (orgDetailDTO == null || orgDetailDTO.getOrgBase() == null) { + dto.setDispatchStatus(TpOrderDispatchStatusEnum.ORDER_DISPATCH_UNASSIGNED_STATUS.getStatus()); + return TpResult.success(tpOrderDispatchClient.dispatchOrder(dto)); + } + //2.3 填充下单来源组织名称和类型 + dto.setOriginOrgName(orgDetailDTO.getOrgBase().getName()); + dto.setOriginOrgType(StrUtil.toString(orgDetailDTO.getOrgBase().getLevel())); + //3.若下单来源组织为总公司,则不需要派单,需要业务手动指派 + if (StrUtil.equals(dto.getOriginOrgType(), TOP_ORG_LEVEL)) { + dto.setDispatchStatus(TpOrderDispatchStatusEnum.ORDER_DISPATCH_UNASSIGNED_STATUS.getStatus()); + return TpResult.success(tpOrderDispatchClient.dispatchOrder(dto)); + } + //4.非总公司,有特殊包车承运组织的配置的,特殊包车指定组织派车,无论用户指派给哪些公司,都得这些接单 + String charterBusType = dto.getCharteredBusType(); + if (StrUtil.isEmpty(charterBusType)) { + charterBusType = getCharterBusType(dto.getOrderNo(), dto.getTenantId()); + } + //4.1 非总公司,该包车产品,若有特殊承运组织配置,且下单来源组织在专属配置中,则直接派单给该组织 + List specialTargetOrgNoList = getTargetOrgListNoByCharterBusType(dto.getTenantId(), charterBusType); + if (CollUtil.isNotEmpty(specialTargetOrgNoList)) { + return dispatchBySpecialRule(dto, specialTargetOrgNoList); + } + //4.2 非总公司,无特殊包车承运组织的配置的,有下单来源组织的,则直接指派给下单来源组织 + dto.setTargetOrgNo(dto.getOriginOrgNo()); + dto.setTargetOrgName(dto.getOriginOrgName()); + dto.setTargetOrgType(dto.getOriginOrgType()); + dto.setDispatchStatus(TpOrderDispatchStatusEnum.ORDER_DISPATCH_ASSIGNED_ORG_STATUS.getStatus()); + return TpResult.success(tpOrderDispatchClient.dispatchOrder(dto)); + + } catch (Exception e) { + LogUtil.error("订单派单失败:"+JSONObject.toJSONString(dto), e); + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_DISTRIBUTE_ERROR); + } finally { + // 释放锁 + if (lock.isLocked() && lock.isHeldByCurrentThread()) { + lock.unlock(); + } + } + + } + + @NotNull + private TpResult dispatchBySpecialRule(TpProdOrderDispatchCreatedDTO dto, List specialTargetOrgNoList) { + + //下单来源组织在特殊配置中,则直接派单 + if (CollUtil.contains(specialTargetOrgNoList, dto.getOriginOrgNo())) { + dto.setTargetOrgNo(dto.getOriginOrgNo()); + dto.setTargetOrgName(dto.getOriginOrgName()); + dto.setTargetOrgType(dto.getOriginOrgType()); + dto.setDispatchStatus(TpOrderDispatchStatusEnum.ORDER_DISPATCH_ASSIGNED_ORG_STATUS.getStatus()); + return TpResult.success(tpOrderDispatchClient.dispatchOrder(dto)); + } + //下单来源组织不在特殊配置,不指定目标组织,等待总公司分配订单 + dto.setDispatchStatus(TpOrderDispatchStatusEnum.ORDER_DISPATCH_UNASSIGNED_STATUS.getStatus()); + return TpResult.success(tpOrderDispatchClient.dispatchOrder(dto)); + } + + private List getTargetOrgListNoByCharterBusType(String tenantId, String charterBusType) { + + SpecialCharterTypeCarrierOrganizationListQueryDTO query = new SpecialCharterTypeCarrierOrganizationListQueryDTO(); + query.setTenantId(tenantId); + List specialCarterOrgList = tpSpecialCharterTypeCarrierOrganizationClient.listByTenantId(query); + if(CollUtil.isEmpty(specialCarterOrgList)){ + return Collections.EMPTY_LIST; + } + + List targetOrgNoList = new ArrayList<>(); + specialCarterOrgList.forEach(specialCarterOrg -> { + //包车类型不匹配,先过滤掉 + if(!StrUtil.equals(specialCarterOrg.getCharterType(),charterBusType)){ + return; + } + //承运组织为空,则不处理 + if(CollUtil.isEmpty(specialCarterOrg.getCarrierOrg())){ + return; + } + //承运组织有空对象,先过滤空对象 + List filterCarrierOrgList + = specialCarterOrg.getCarrierOrg().stream().filter(Objects::nonNull).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(filterCarrierOrgList)) { + targetOrgNoList.addAll(filterCarrierOrgList); + } + }); + + return targetOrgNoList; + } + + @Override + public TpResult getOrderDispatchDetail(TpProdOrderDispatchDetailDTO dto) { + return TpResult.success(tpOrderDispatchClient.getOrderDispatchDetail(dto)); + } + + @Override + public TpResult receiveOrder(TpProdDispatchOrderReceivedDTO dto) { + //TODO 兼容逻辑,带前端修改好后,删除此逻辑 + if(StrUtil.isEmpty(dto.getOriginalOrderNo())){ + dto.setOriginalOrderNo(dto.getOrderNo()); + } + //1.创建接单记录 + TpProdOrderReceivedCreateDTO receivedCreateDTO = TpProdOrderReceivedCreateDTO.builder() + .bizObjNo(dto.getOriginalOrderNo()) + .bizObjType(TpOrderReceivedBizObjTypeEnum.ORDER.getType()) + .receiverNo(dto.getReceiverNo()) + .receiverName(dto.getReceiverName()) + .receivedTime(System.currentTimeMillis()) + .receivedStatus(TpOrderReceivedStatusEnum.ORDER_RECEIVED_STATUS.getStatus()) //默认不需要审核 + .orgNo(dto.getOrgNo()) + .orgName(dto.getOrgName()) + .tenantId(dto.getTenantId()) + .bizData(dto.getBizData()) + .build(); + Boolean createReceived = orderReceivedClient.receiveOrder(receivedCreateDTO); + if (!createReceived) { + LogUtil.error("调用订单接单创建接口失败,入参:{},原因:{}", JSONUtil.toJsonStr(receivedCreateDTO)); + throw new TpException(TpTradeProdErrorCode.TP_TRADE_PROD_CODE); + } + //2.推进派单单据状态变化 + TpProdOrderDispatchStatusUpdateDTO statusUpdateDTO = TpProdOrderDispatchStatusUpdateDTO.builder().build(); + statusUpdateDTO.setDispatchNo(dto.getDispatchNo()); + statusUpdateDTO.setOrderNo(dto.getOrderNo()); + statusUpdateDTO.setOriginalOrderNo(dto.getOriginalOrderNo()); + statusUpdateDTO.setOriginalStatus(dto.getOriginalDispatchStatus()); + statusUpdateDTO.setTargetStatus(TpOrderDispatchStatusEnum.ORDER_DISPATCH_RECEIVED_STATUS.getType()); + statusUpdateDTO.setTenantId(dto.getTenantId()); + Boolean pushStatusFlag = tpOrderDispatchClient.pushDispatchStatus(statusUpdateDTO); + + return TpResult.success(pushStatusFlag); + } + + @Override + public TpResult dispatchFleet(TpProdOrderDispatchFleetCreatedDTO dto) { + //TODO 兼容逻辑,带前端修改好后,删除此逻辑 + if(StrUtil.isEmpty(dto.getOriginalOrderNo())){ + dto.setOriginalOrderNo(dto.getOrderNo()); + } + return TpResult.success(tpOrderDispatchClient.dispatchFleet(dto)); + } + + @Override + public TpResult callBackOrder(TpProdOrderDispatchCallBackDTO dto) { + + String lockBizNo = dto.getOriginalOrderNo() + DISPATCH_LOCK_SUFFIX; + RLock lock = redissonClient.getLock(lockBizNo); + boolean tryLock = lock.tryLock(); + // 判断是否获取到锁 + if (!tryLock) { + LogUtil.error("业务员召回派单-重复提交:{}", JSONObject.toJSONString(dto)); + throw new TpTradeProdException(TpTradeProdErrorCode.IDEMPOTENT_REQUEST_ERROR); + } + + try { + LogUtil.info("业务员召回派单-获取到锁,锁定对象:{}", lockBizNo); + + TpProdOrderDispatchDetailVO oldOrderDispatchVo = getTpProdOrderDispatchVO(dto.getOriginalOrderNo(),dto.getTenantId()); + //判断订单是否派过单,如果未派单,则不允许召回;如果已经接单,则不允许召回 + if (oldOrderDispatchVo != null && TpOrderDispatchStatusEnum.ORDER_DISPATCH_UNASSIGNED_STATUS.getStatus().intValue() == oldOrderDispatchVo.getDispatchStatus()) { + return TpResult.fail(TpTradeProdErrorCode.ORDER_NONE_DISPATCH_ORG_ERROR.getCode(), "该订单没有指定承运公司,无需召回"); + } + //判断订单已经退回,则不允许召回 + if (oldOrderDispatchVo != null && TpOrderDispatchStatusEnum.ORDER_DISPATCH_GIVEBACK_STATUS.getStatus().intValue() == oldOrderDispatchVo.getDispatchStatus()) { + return TpResult.fail(TpTradeProdErrorCode.ORDER_ALREADY_GIVEBACK_ERROR.getCode(), "该订单已被分公司退回,无需召回"); + } + //如果已经接单,则不允许召回 + List dispatchStatuses = Arrays.asList(TpOrderDispatchStatusEnum.ORDER_DISPATCH_RECEIVED_STATUS.getStatus(), TpOrderDispatchStatusEnum.ORDER_DISPATCH_ASSIGNED_FLEET_STATUS.getStatus()); + if (oldOrderDispatchVo != null && CollUtil.contains(dispatchStatuses,oldOrderDispatchVo.getDispatchStatus())) { + return TpResult.fail(TpTradeProdErrorCode.ORDER_ALREADY_RECEIVED_ORG_ERROR.getCode(), "该订单已被承运公司承接,无需召回"); + } + + //如果订单非待确认状态,则不允许召回 + TpProdOrderDetailVO orderDetailVO = getOrderDetail(dto.getTenantId(),dto.getOriginalOrderNo()); + if (orderDetailVO != null && TpOrderStatusEnum.ORDER_NEED_CONFIRM.getStatus().intValue() != orderDetailVO.getStatus()) { + return TpResult.fail(TpTradeProdErrorCode.ORDER_ALREADY_CONFIRM_ERROR.getCode(), "该订单已完成审核确认,无需召回。请刷新页面查看"); + } + //更新召回时间 + dto.setCallBackTime(DateUtil.current()); + return TpResult.success(tpOrderDispatchClient.callBackOrder(dto)); + + } catch (Exception e) { + LogUtil.error("业务员召回派单失败:" + JSONObject.toJSONString(dto), e); + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_DISTRIBUTE_ERROR); + } finally { + // 释放锁 + if (lock.isLocked() && lock.isHeldByCurrentThread()) { + lock.unlock(); + } + } + } + + + private TpProdOrderDetailVO getOrderDetail(String tenantId, String originalOrderNo) { + TpProdOrderQueryDTO orderQueryDTO = new TpProdOrderQueryDTO(); + orderQueryDTO.setOriginalOrderNo(originalOrderNo); + orderQueryDTO.setTenantId(tenantId); +// orderQueryDTO.setNeedModules(Arrays.asList(TpOrderModulesEnum.ORDER_PRICE_RECORD.getModule())); + TpProdOrderDetailVO prodOrderDetailVO = tpOrderClient.getOrderDetail(orderQueryDTO); + if (prodOrderDetailVO == null) { + LogUtil.error("订单审核失败:订单不存在,入参为:{}", JSONUtil.toJsonStr(orderQueryDTO)); + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_AUDIT_ERROR); + } + return prodOrderDetailVO; + } + + @Override + public TpResult giveBackOrder(TpProdOrderDispatchGiveBackDTO dto) { + String lockBizNo = dto.getOriginalOrderNo() + DISPATCH_LOCK_SUFFIX; + RLock lock = redissonClient.getLock(lockBizNo); + boolean tryLock = lock.tryLock(); + // 判断是否获取到锁 + if (!tryLock) { + LogUtil.error("业务员退回派单-重复提交:{}", JSONObject.toJSONString(dto)); + throw new TpTradeProdException(TpTradeProdErrorCode.IDEMPOTENT_REQUEST_ERROR); + } + + try { + LogUtil.info("业务员退回派单-获取到锁,锁定对象:{}", lockBizNo); + //判断订单是否已经派过单,未派单的不允许退回 + TpProdOrderDispatchDetailVO oldOrderDispatchVo = getTpProdOrderDispatchVO(dto.getOriginalOrderNo(),dto.getTenantId()); + //判断订单是否派过单,如果未派单,则不允许召回;如果已经接单,则不允许退回 + if (oldOrderDispatchVo != null && TpOrderDispatchStatusEnum.ORDER_DISPATCH_UNASSIGNED_STATUS.getStatus().intValue() == oldOrderDispatchVo.getDispatchStatus()) { + return TpResult.fail(TpTradeProdErrorCode.ORDER_NONE_DISPATCH_ORG_ERROR.getCode(), "该订单没有指定承运公司,无需退回"); + } + //判断订单已经召回,则不允许退回 + if (oldOrderDispatchVo != null && TpOrderDispatchStatusEnum.ORDER_DISPATCH_CALLBACK_STATUS.getStatus().intValue() == oldOrderDispatchVo.getDispatchStatus()) { + return TpResult.fail(TpTradeProdErrorCode.ORDER_ALREADY_CALLBACK_ERROR.getCode(), "该订单已被总公司召回,无需退回"); + } + //如果已经接单,则不允许退回 + List dispatchStatuses = Arrays.asList(TpOrderDispatchStatusEnum.ORDER_DISPATCH_RECEIVED_STATUS.getStatus(), TpOrderDispatchStatusEnum.ORDER_DISPATCH_ASSIGNED_FLEET_STATUS.getStatus()); + if (oldOrderDispatchVo != null && CollUtil.contains(dispatchStatuses,oldOrderDispatchVo.getDispatchStatus())) { + return TpResult.fail(TpTradeProdErrorCode.ORDER_ALREADY_RECEIVED_ORG_ERROR.getCode(), "该订单已被承运公司承接,无需退回"); + } + //如果订单非待确认状态,则不允许退回 + TpProdOrderDetailVO orderDetailVO = getOrderDetail(dto.getTenantId(),dto.getOriginalOrderNo()); + if (orderDetailVO != null && TpOrderStatusEnum.ORDER_NEED_CONFIRM.getStatus().intValue() != orderDetailVO.getStatus()) { + return TpResult.fail(TpTradeProdErrorCode.ORDER_ALREADY_CONFIRM_ERROR.getCode(), "该订单已完成审核确认,无需退回。请刷新页面查看"); + } + //更新退回时间 + dto.setGiveBackTime(DateUtil.current()); + return TpResult.success(tpOrderDispatchClient.giveBackOrder(dto)); + + } catch (Exception e) { + LogUtil.error("业务员退回派单失败:" + JSONObject.toJSONString(dto), e); + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_DISTRIBUTE_ERROR); + } finally { + // 释放锁 + if (lock.isLocked() && lock.isHeldByCurrentThread()) { + lock.unlock(); + } + } + } + + @Override + public TpResult> listOrderDispatchDetail(TpProdOrderDispatchListDTO dto) { + //TODO 兼容逻辑,带前端修改好后,删除此逻辑 + if(CollUtil.isEmpty(dto.getOriginalOrderNoList())){ + dto.setOriginalOrderNoList(dto.getOriginalOrderNoList()); + } + return TpResult.success(tpOrderDispatchClient.listOrderDispatchDetail(dto)); + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/impl/TpPaymentAcceptanceFacadeImpl.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/impl/TpPaymentAcceptanceFacadeImpl.java new file mode 100644 index 0000000..89568db --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/impl/TpPaymentAcceptanceFacadeImpl.java @@ -0,0 +1,133 @@ +package com.deepinnet.tptradeprod.biz.service.impl; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpproductcore.common.dto.product.TpProdDetailDTO; +import com.deepinnet.tpproductcore.common.enums.*; +import com.deepinnet.tpproductcore.common.qto.product.TpProductQueryDTO; +import com.deepinnet.tptradecore.common.dto.trans.TpQueryPayResultDTO; +import com.deepinnet.tptradecore.common.enums.TpBizTypeEnum; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.enums.*; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.facade.TpPaymentAcceptanceFacade; +import com.deepinnet.tptradeprod.common.service.integration.client.*; +import com.deepinnet.tptradeprod.common.vo.*; +import com.google.common.collect.Lists; +import org.apache.dubbo.config.annotation.DubboService; + +import javax.annotation.Resource; +import java.util.*; + +/** + * @author amos wong + * @create 2023/9/8 17:44 + * @Description + */ +@DubboService +public class TpPaymentAcceptanceFacadeImpl implements TpPaymentAcceptanceFacade { + + @Resource + private TpPaymentClient paymentClient; + + @Resource + private TpProductClient productClient; + + @Resource + private TpOrderClient orderClient; + + @Resource + private TpOrderDispatchClient orderDispatchClient; + + @Override + public TpResult queryPayResult(TpProdQueryPayResultDTO dto) { + TpProdOrderDetailVO orderDetailVO = orderClient.getOrderDetail(TpProdOrderQueryDTO.builder().originalOrderNo(dto.getOrderNo()).tenantId(dto.getTenantId()).build()); + if (orderDetailVO == null) { + LogUtil.error("查询支付结果失败,原因:订单不存在,入参为:{}", JSONUtil.toJsonStr(dto)); + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_NOT_FOUND); + } + + // 定制公交如果是已付款状态,直接返回成功 + boolean isCharteredBus = Objects.equals(orderDetailVO.getType(), TpOrderTypeEnum.PACKING_ORDER.getType()); + if (!isCharteredBus && Objects.equals(orderDetailVO.getStatus(), TpOrderStatusEnum.ALREADY_PAY.getStatus())) { + TpProdQueryPayResultVO payResultVO = new TpProdQueryPayResultVO(); + payResultVO.setPaySuccess(true); + return TpResult.success(payResultVO); + } + + // 定制包车如果订单是已付款状态直接返回 + if (isCharteredBus) { + List charterBusPaidStatus = Lists.newArrayList(TpOrderStatusEnum.ORDER_DEPOSIT_PAID.getStatus(), TpOrderStatusEnum.ORDER_TRIP_END_PAID.getStatus(), TpOrderStatusEnum.ORDER_CANCEL_PAID.getStatus()); + if (charterBusPaidStatus.contains(orderDetailVO.getStatus())) { + TpProdQueryPayResultVO payResultVO = new TpProdQueryPayResultVO(); + payResultVO.setPaySuccess(true); + return TpResult.success(payResultVO); + } + } + + TpQueryPayResultDTO queryPayResultDTO = buildQueryPayResultDTO(dto, orderDetailVO); + if (Objects.equals(orderDetailVO.getType(), TpOrderTypeEnum.CUSTOMIZED_ORDER.getType())) { + TpProdDetailDTO productDetail = getProduct(orderDetailVO.getProductNo(), dto.getTenantId()); + if (productDetail == null || productDetail.getRouteDetailDTO() == null || productDetail.getRouteDetailDTO().getRouteBase() == null) { + LogUtil.error("查询支付结果失败,原因:产品信息不存在,入参为:{}", JSONUtil.toJsonStr(dto)); + throw new TpTradeProdException(TpTradeProdErrorCode.PRODUCT_NOT_EXIST_ERROR); + } + + queryPayResultDTO.setOrgCode(productDetail.getRouteDetailDTO().getRouteBase().getOrgCode()); + } else { + String orgCode = orderDispatchClient.getOrgCodeFromDispatchDetail(dto.getOrderNo(), dto.getTenantId()); + queryPayResultDTO.setOrgCode(orgCode); + } + + return TpResult.success(paymentClient.queryPayResult(queryPayResultDTO)); + } + + private TpQueryPayResultDTO buildQueryPayResultDTO(TpProdQueryPayResultDTO dto, TpProdOrderDetailVO orderDetailVO) { + TpQueryPayResultDTO queryPayResultDTO = new TpQueryPayResultDTO(); + queryPayResultDTO.setOrgCode(dto.getOrgCode()); + queryPayResultDTO.setTenantId(dto.getTenantId()); + + Integer orderStatus = orderDetailVO.getStatus(); + Integer type = orderDetailVO.getType(); + boolean isCharteredBus = Objects.equals(type, TpOrderTypeEnum.PACKING_ORDER.getType()); + + String bizNo; + String bizType; + + // 订金待支付状态对应的业务类型是:定金订单支付 + if (isCharteredBus && (Objects.equals(TpOrderStatusEnum.ORDER_NEED_DISPATCH.getStatus(), orderStatus) + || Objects.equals(TpOrderStatusEnum.ORDER_DISPATCHED.getStatus(), orderStatus) + || Objects.equals(TpOrderStatusEnum.ORDER_DEPOSIT_NEED_PAY.getStatus(), orderStatus) + || Objects.equals(TpOrderStatusEnum.ORDER_DEPOSIT_PAID.getStatus(), orderStatus))) { + bizNo = dto.getOrderNo() + TpBizTypeEnum.DEPOSIT_PAY.getCode(); + bizType = TpBizTypeEnum.DEPOSIT_PAY.getCode(); + } else if (isCharteredBus && (Objects.equals(TpOrderStatusEnum.ORDER_TRIP_END_PAID.getStatus(), orderStatus) + || (Objects.equals(TpOrderStatusEnum.ORDER_TRIP_END_NEED_PAY.getStatus(), orderStatus)) + || (Objects.equals(TpOrderStatusEnum.ORDER_CANCEL_PAID.getStatus(), orderStatus)) + || (Objects.equals(TpOrderStatusEnum.ORDER_CANCEL_NEED_PAY.getStatus(), orderStatus)))) { + bizNo = dto.getOrderNo() + TpBizTypeEnum.BALANCE_PAY.getCode(); + bizType = TpBizTypeEnum.BALANCE_PAY.getCode(); + } else if (!isCharteredBus && Objects.equals(orderStatus, TpOrderStatusEnum.PENDING_PAY.getStatus())) { + bizNo = dto.getOrderNo() + TpBizTypeEnum.CUSTOM_BUS_PAY.getCode(); + bizType = TpBizTypeEnum.CUSTOM_BUS_PAY.getCode(); + } else { + LogUtil.error("业务类型非法,当前的订单状态不支持查询订单的支付结果,入参为:{}", JSONUtil.toJsonStr(dto)); + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_STATUS_NOT_SUPPORT_QUERY_PAY_RESULT); + } + + queryPayResultDTO.setBizNo(bizNo); + queryPayResultDTO.setBizType(bizType); + return queryPayResultDTO; + } + + private TpProdDetailDTO getProduct(String productNo, String tenantId) { + TpProductQueryDTO queryDTO = new TpProductQueryDTO(); + queryDTO.setProductCode(productNo); + queryDTO.setFormalFlag(FormalFlagEnum.FORMAL.getCode()); + queryDTO.setTenantId(tenantId); + queryDTO.setNeedProperties(NeedPropertiesEnum.buildNeedProperties(NeedPropertiesEnum.ROUTE, NeedPropertiesEnum.FRONT_CATEGORY)); + return productClient.getProduct(queryDTO); + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/impl/TpVoucherAcceptanceFacadeImpl.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/impl/TpVoucherAcceptanceFacadeImpl.java new file mode 100644 index 0000000..3e5e89d --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/service/impl/TpVoucherAcceptanceFacadeImpl.java @@ -0,0 +1,78 @@ +package com.deepinnet.tptradeprod.biz.service.impl; + +import com.deepinnet.tp.common.lang.page.CommonPage; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tptradeprod.biz.service.flow.manager.LiteFlowManager; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.facade.TpVoucherAcceptanceFacade; +import com.deepinnet.tptradeprod.common.service.integration.client.TpVoucherClient; +import com.deepinnet.tptradeprod.common.vo.*; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.dubbo.config.annotation.DubboService; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author amos wong + * @create 2023/9/12 17:11 + * @Description + */ +@DubboService +public class TpVoucherAcceptanceFacadeImpl implements TpVoucherAcceptanceFacade { + + @Resource + private TpVoucherClient voucherClient; + + @Resource + private LiteFlowManager liteFlowManager; + + @Override + public TpResult check(TpProdVoucherCheckDTO checkDTO) { + TpProdVoucherCheckVO voucherCheckVO = voucherClient.check(checkDTO); + return TpResult.success(voucherCheckVO); + } + + @Override + public TpResult> getVoucherList(TpProdVoucherQueryDTO queryDTO) { + return TpResult.success(voucherClient.getVoucherList(queryDTO)); + } + + @Override + public TpResult queryAvailableRescheduleVoucherList(TpProdQueryAvailableRescheduleVoucherDTO queryDTO) { + if (queryDTO == null || StringUtils.isBlank(queryDTO.getTenantId()) || StringUtils.isBlank(queryDTO.getProductCode())) { + throw new TpTradeProdException(TpTradeProdErrorCode.ILLEGAL_PARAMS); + } + + if (StringUtils.isBlank(queryDTO.getOrderNo()) && CollectionUtils.isEmpty(queryDTO.getVoucherNos())) { + throw new TpTradeProdException(TpTradeProdErrorCode.ILLEGAL_PARAMS); + } + + TpQueryAvailableRescheduleVoucherDTO rescheduleVoucherDTO = liteFlowManager.queryAvailableRescheduleVoucherList(queryDTO); + return TpResult.success(rescheduleVoucherDTO); + } + + @Override + public TpResult> getVoucherVerificationRecordList(TpProdVoucherVerificationRecordQueryDTO queryDTO) { + return TpResult.success(voucherClient.getVerificationRecordList(queryDTO)); + } + + @Override + public TpResult getTimeRangeExistVerificationRecordDate(TpProdTimeRangeExistVerificationRecordDateQueryDTO queryDTO) { + return TpResult.success(voucherClient.getTimeRangeExistVerificationRecordDate(queryDTO)); + } + + @Override + public TpResult getTimeRangeUserVerificationRecordDetail(TpProdTimeRangeUserVerificationRecordDetailQueryDTO queryDTO) { + return TpResult.success(voucherClient.getTimeRangeUserVerificationRecordDetail(queryDTO)); + } + + @Override + public TpResult> queryMngVerificationRecords(TpProdMngVerificationRecordQueryDTO queryDTO) { + return TpResult.success(voucherClient.queryMngVerificationRecords(queryDTO)); + } + +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/task/CommonScheduleTaskExecuteTemplate.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/task/CommonScheduleTaskExecuteTemplate.java new file mode 100644 index 0000000..9fce503 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/task/CommonScheduleTaskExecuteTemplate.java @@ -0,0 +1,89 @@ +package com.deepinnet.tptradeprod.biz.task; + + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradeprod.biz.task.worker.AbstractBaseTaskWorker; +import com.deepinnet.tptradeprod.common.enums.task.TpScheduleTaskStatusEnum; +import com.deepinnet.tptradeprod.common.enums.task.TpScheduleTaskTypeEnum; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.core.model.task.TpScheduleTask; +import com.google.common.collect.Lists; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + + +/** + * @author amos wong + * @create 2022-11-30 21:18 + *

+ * 定时任务执行通用模板类 + */ + +@Component +public class CommonScheduleTaskExecuteTemplate implements InitializingBean { + private final ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 5, 60, TimeUnit.SECONDS, + new ArrayBlockingQueue<>(15)); + + @Resource + private TpScheduleTaskService scheduleTaskService; + + @Resource + private Map taskWorkerMap; + + private static final Integer LIMIT_COUNT = 30; + + private final Map scheduleTypeWorkerMap = new ConcurrentHashMap<>(); + + @Override + public void afterPropertiesSet() { + taskWorkerMap + .values() + .parallelStream() + .forEach(taskWorker -> scheduleTypeWorkerMap.put(taskWorker.getTaskType(), taskWorker)); + } + + @Scheduled(fixedDelay = 60000) + public void process() { + // 捞取任务 + List allNeedExecuteTasks = getNeedExecuteTasks(); + if (CollectionUtils.isEmpty(allNeedExecuteTasks)) { + return; + } + + // 将任务提交给线程池处理 + for (TpScheduleTask needExecuteTask : allNeedExecuteTasks) { + TpScheduleTaskTypeEnum taskTypeEnum = TpScheduleTaskTypeEnum.getByType(needExecuteTask.getTaskType()); + if (taskTypeEnum == null) { + LogUtil.error("定时任务模板类处理异常,原因:任务类型不存在,任务id:{}", needExecuteTask.getId()); + throw new TpTradeProdException(TpTradeProdErrorCode.ILLEGAL_SCHEDULE_TASK_TYPE); + } + + AbstractBaseTaskWorker taskWorker = scheduleTypeWorkerMap.get(taskTypeEnum); + if (taskWorker == null) { + LogUtil.error("无法找到当前任务类型对应的worker,请及时排查问题,当前的任务为:{}", JSONUtil.toJsonStr(needExecuteTask)); + continue; + } + executor.submit(() -> taskWorker.doCommit(needExecuteTask)); + } + } + + private List getNeedExecuteTasks() { + return scheduleTaskService.listTasks( + TpScheduleTaskTypeEnum.TRADEPROD_SUPPORT_TASK_TYPE_LIST, + Lists.newArrayList(TpScheduleTaskStatusEnum.WAIT_EXECUTE.getStatus(), TpScheduleTaskStatusEnum.FAIL.getStatus()), + System.currentTimeMillis(), + LIMIT_COUNT); + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/task/TpScheduleTaskService.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/task/TpScheduleTaskService.java new file mode 100644 index 0000000..31c4c4a --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/task/TpScheduleTaskService.java @@ -0,0 +1,112 @@ +package com.deepinnet.tptradeprod.biz.task; + + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.task.TpScheduleTaskStatusEnum; +import com.deepinnet.tptradeprod.common.dal.condition.task.UpdateTaskCondition; +import com.deepinnet.tptradeprod.common.dal.repository.task.TpScheduleTaskRepository; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.core.model.task.TpScheduleTask; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author amos wong + * @create 2022-10-25 13:46 + */ +@Service("scheduleTaskService") +public class TpScheduleTaskService { + @Resource + private TpScheduleTaskRepository scheduleTaskRepository; + + public List listTasks(List types, List statusList, Long triggerTime, Integer limitCount) { + return scheduleTaskRepository.getAllByTypeAndStatusAndTriggerTime(types, statusList, triggerTime, limitCount); + } + + public TpScheduleTask getTaskById(Long taskId) { + return scheduleTaskRepository.getTaskById(taskId); + } + + public void batchInsertScheduleTasks(List scheduleTasks) { + try { + scheduleTaskRepository.batchSave(scheduleTasks); + } catch (Exception e) { + LogUtil.error("插入定时任务失败,任务信息:{},异常堆栈信息:{}", JSONUtil.toJsonStr(scheduleTasks), e); + throw new TpTradeProdException(TpTradeProdErrorCode.INSERT_TASK_ERROR, TpTradeProdErrorCode.INSERT_TASK_ERROR.getDesc()); + } + } + + public void updateTaskExecuting(Long taskId, String bizNo, String originalStatus, Long executeTime, String tenantId) { + this.updateScheduleTask( + taskId, + bizNo, + originalStatus, + TpScheduleTaskStatusEnum.EXECUTING.getStatus(), + null, + null, + executeTime, + tenantId); + } + + public void updateTaskSuccess(Long taskId, String bizNo, String tenantId) { + this.updateScheduleTask( + taskId, + bizNo, + TpScheduleTaskStatusEnum.EXECUTING.getStatus(), + TpScheduleTaskStatusEnum.SUCCESS.getStatus(), + null, + null, + null, + tenantId); + } + + public void updateTaskFail(Long taskId, String bizNo, Integer retryCount, Long nextTriggerTime, String tenantId) { + this.updateScheduleTask( + taskId, + bizNo, + TpScheduleTaskStatusEnum.EXECUTING.getStatus(), + TpScheduleTaskStatusEnum.FAIL.getStatus(), + retryCount, + nextTriggerTime, + null, + tenantId); + } + + public void updateTaskTerminated(Long taskId, String bizNo, String tenantId) { + this.updateScheduleTask( + taskId, + bizNo, + TpScheduleTaskStatusEnum.EXECUTING.getStatus(), + TpScheduleTaskStatusEnum.TERMINATED.getStatus(), + null, + null, + null, + tenantId); + } + + private void updateScheduleTask(Long taskId, String bizNo, String originalStatus, String targetStatus, + Integer retryCount, Long nextTriggerTime, Long executeTime, String tenantId) { + try { + UpdateTaskCondition updateTaskCondition = new UpdateTaskCondition(); + updateTaskCondition.setId(taskId); + updateTaskCondition.setOriginalStatus(originalStatus); + updateTaskCondition.setTargetStatus(targetStatus); + updateTaskCondition.setRetryCount(retryCount); + updateTaskCondition.setTenantId(tenantId); + updateTaskCondition.setTriggerTime(nextTriggerTime); + updateTaskCondition.setExecuteTime(executeTime); + boolean isSuccess = scheduleTaskRepository.updateTaskByCondition(updateTaskCondition); + if (!isSuccess) { + LogUtil.error("更新任务状态失败,任务号:{},业务号:{}", taskId, bizNo); + throw new TpTradeProdException(TpTradeProdErrorCode.UPDATE_TASK_STATUS_ERROR); + } + } catch (Exception e) { + LogUtil.error("更新任务状态失败,任务号:{},业务号:{},异常堆栈信息:{}", taskId, bizNo, e); + throw new TpTradeProdException(TpTradeProdErrorCode.UPDATE_TASK_STATUS_ERROR); + } + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/task/worker/AbstractBaseTaskWorker.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/task/worker/AbstractBaseTaskWorker.java new file mode 100644 index 0000000..795b470 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/task/worker/AbstractBaseTaskWorker.java @@ -0,0 +1,199 @@ +package com.deepinnet.tptradeprod.biz.task.worker; + + +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.error.TpTradeCoreErrorCode; +import com.deepinnet.tptradeprod.biz.task.TpScheduleTaskService; +import com.deepinnet.tptradeprod.common.enums.task.TpScheduleTaskTypeEnum; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.core.model.task.TpScheduleTask; +import org.apache.commons.collections4.CollectionUtils; +import org.redisson.api.*; +import org.slf4j.*; +import org.springframework.stereotype.Component; +import org.springframework.transaction.support.TransactionTemplate; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author amos wong + * @create 2022-12-01 08:28 + */ + +@Component +public abstract class AbstractBaseTaskWorker { + @Resource + private TpScheduleTaskService scheduleTaskService; + + @Resource + private TransactionTemplate transactionTemplate; + + private static final Logger SCHEDULE_TASK_LOG = LoggerFactory.getLogger("SCHEDULE-TASK-LOG"); + + private static final String EXECUTE_LOG_PATTERN = "EXECUTE,{},{},{},{}ms,{}"; + + private static final Integer MAX_RETRY_COUNT = 10; + + private static final Integer TWO_MINUTES = 2 * 60 * 1000; + + @Resource + private RedissonClient redissonClient; + + public abstract TpScheduleTaskTypeEnum getTaskType(); + + public void doCommit(TpScheduleTask scheduleTask) { + // 获取必要的业务参数 + long startTime = System.currentTimeMillis(); + Long taskId = scheduleTask.getId(); + String bizNo = scheduleTask.getBizNo(); + String tenantId = scheduleTask.getTenantId(); + RLock lock = null; + //是否开启分布式业务锁,默认不开启,若开启,则需要子实现定义 + boolean openDistributedBizLock = openDistributedBizLock(); + if (openDistributedBizLock) { + String lockBizKey = getBizLockKey(bizNo, tenantId); + lock = redissonClient.getLock(lockBizKey); + boolean tryLock = lock.tryLock(); + // 判断是否获取到当锁 + if (!tryLock) { + LogUtil.error("获取业务写入锁失败:{}", bizNo); + throw new TpTradeProdException(TpTradeProdErrorCode.BIZ_LOCK_GET_ERROR); + } + } + + try { + // 更新任务状态到执行中 + scheduleTaskService.updateTaskExecuting(taskId, bizNo, scheduleTask.getStatus(), System.currentTimeMillis(), tenantId); + + // 校验业务状态 + checkBizStatus(taskId, bizNo, scheduleTask.getTenantId()); + + // 更新业务状态 + updateBizStatus(bizNo, scheduleTask.getTenantId()); + + // 修改任务状态为成功&做其他的业务动作如发消息等 + transactionTemplate.executeWithoutResult(action -> { + scheduleTaskService.updateTaskSuccess(taskId, bizNo, tenantId); + + doOtherBiz(scheduleTask); + }); + } catch (TpTradeProdException e) { + // 异常场景:幂等处理 + if (e.getErrorCode() == TpTradeProdErrorCode.IDEMPOTENT_REQUEST_ERROR) { + LogUtil.error("执行任务幂等处理,任务id:{},业务单号:{}", taskId, bizNo); + // 将任务状态设置为成功 + scheduleTaskService.updateTaskSuccess(taskId, bizNo, tenantId); + return; + } + + // 处理其他异常场景 + processException(e, scheduleTask); + + long endTime = System.currentTimeMillis(); + LogUtil.info(SCHEDULE_TASK_LOG, EXECUTE_LOG_PATTERN, scheduleTask.getId(), scheduleTask.getBizNo(), false, endTime - startTime, e.getErrorCode()); + return; + } catch (Exception e) { + makeTaskFailAndUpdateRetryCount(taskId, bizNo, scheduleTask.getRetryCount(), tenantId, scheduleTask.getTriggerTime(), e); + LogUtil.error("任务执行失败,原因为:未知异常,任务id为:{}, 支付单号为:{},异常堆栈为:{}", taskId, bizNo, e); + LogUtil.info(SCHEDULE_TASK_LOG, EXECUTE_LOG_PATTERN, scheduleTask.getId(), scheduleTask.getBizNo(), false, TpTradeCoreErrorCode.UNKNOWN_EXCEPTION.getCode()); + return; + } finally { + //释放分布式业务锁,若开启了,则需要释放锁 + if (openDistributedBizLock) { + // 释放锁: + if (lock.isLocked() && lock.isHeldByCurrentThread()) { + lock.unlock(); + } + } + } + + long endTime = System.currentTimeMillis(); + LogUtil.info(SCHEDULE_TASK_LOG, EXECUTE_LOG_PATTERN, scheduleTask.getId(), scheduleTask.getBizNo(), true, endTime - startTime, "-"); + LogUtil.info("任务执行成功,任务id为:{}, 支付单号为:{}", taskId, bizNo); + } + + /** + * 是否启用分布式业务锁 + * + * @return + */ + protected boolean openDistributedBizLock() { + return Boolean.FALSE; + } + + /** + * 分布式业务锁组成元素 + * + * @return + */ + protected String getBizLockKey(String bizNo, String tenantId) { + return bizNo + ":" + tenantId; + } + + protected abstract void doOtherBiz(TpScheduleTask scheduleTask); + + /** + * 需要终止的异常错误码 + * + * @return + */ + protected abstract List needTerminatedErrorCode(); + + /** + * 处理异常场景 + */ + protected void processException(TpTradeProdException exception, TpScheduleTask scheduleTask) { + List needTerminatedErrorCodeList = needTerminatedErrorCode(); + if (CollectionUtils.isEmpty(needTerminatedErrorCodeList)) { + makeTaskFailAndUpdateRetryCount(scheduleTask.getId(), scheduleTask.getBizNo(), scheduleTask.getRetryCount(), scheduleTask.getTenantId(), scheduleTask.getTriggerTime(), exception); + } else { + if (needTerminatedErrorCodeList.contains(exception.getErrorCode())) { + makeTaskTerminated(scheduleTask.getId(), scheduleTask.getBizNo(), scheduleTask.getTenantId()); + } else { + makeTaskFailAndUpdateRetryCount(scheduleTask.getId(), scheduleTask.getBizNo(), scheduleTask.getRetryCount(), scheduleTask.getTenantId(), scheduleTask.getTriggerTime(), exception); + } + } + } + + /** + * 校验业务状态 + * + * @param taskId + * @param bizNo + * @param tenantId + */ + protected abstract void checkBizStatus(Long taskId, String bizNo, String tenantId); + + /** + * 更新业务状态 + * + * @param bizNo + * @param tenantId + */ + protected abstract void updateBizStatus(String bizNo, String tenantId); + + protected void makeTaskFailAndUpdateRetryCount(Long taskId, String bizNo, Integer retryCount, String tenantId, Long triggerTime, Exception e) { + if (e instanceof TpTradeProdException) { + TpTradeProdException tradeProdException = (TpTradeProdException) e; + LogUtil.error("执行任务失败,原因为{},任务id:{},业务单号:{},异常堆栈:{}", tradeProdException.getErrorCode().getDesc(), taskId, bizNo, e); + } else { + LogUtil.error("执行任务失败,任务id:{},业务单号:{},异常堆栈:{}", taskId, bizNo, e); + } + + int curRetryCount = retryCount == null ? 0 : retryCount; + + if (curRetryCount >= MAX_RETRY_COUNT) { + LogUtil.error("执行任务失败,任务已经达到最大重试次数,任务id:{},业务单号:{},异常堆栈:{}", e); + scheduleTaskService.updateTaskTerminated(taskId, bizNo, tenantId); + } else { + // 执行失败的任务,下次触发时间为上一次触发时间后的2分钟 + scheduleTaskService.updateTaskFail(taskId, bizNo, curRetryCount + 1, triggerTime + TWO_MINUTES, tenantId); + } + } + + protected void makeTaskTerminated(Long taskId, String bizNo, String tenantId) { + scheduleTaskService.updateTaskTerminated(taskId, bizNo, tenantId); + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/task/worker/CloseOrderBeforeTwoHoursWorker.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/task/worker/CloseOrderBeforeTwoHoursWorker.java new file mode 100644 index 0000000..04279e8 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/task/worker/CloseOrderBeforeTwoHoursWorker.java @@ -0,0 +1,178 @@ +package com.deepinnet.tptradeprod.biz.task.worker; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpcommoncore.common.service.template.email.TpEmailNotAuditUtilCloseTemplate; +import com.deepinnet.tpcommoncore.common.service.template.email.TpEmailNotDistributeUtilCloseTemplate; +import com.deepinnet.tpcommoncore.common.service.template.sms.staff.TpSmsNotAuditUtilCloseTemplate; +import com.deepinnet.tpcommoncore.common.service.template.sms.staff.TpSmsNotDistributeUtilCloseTemplate; +import com.deepinnet.tpcommoncore.common.service.template.sms.user.TpSmsNeedPayBeforeCloseTemplate; +import com.deepinnet.tpconfigcore.common.vo.TpTenantContractListDTO; +import com.deepinnet.tptradecore.common.enums.order.TpOrderModulesEnum; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderDispatchDetailDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderQueryDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderStatusEnum; +import com.deepinnet.tptradeprod.common.enums.task.TpScheduleTaskTypeEnum; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderDispatchClient; +import com.deepinnet.tptradeprod.common.service.integration.client.TpTenantClient; +import com.deepinnet.tptradeprod.common.service.integration.client.email.TpEmailClient; +import com.deepinnet.tptradeprod.common.service.integration.client.sms.TpSmsClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDispatchDetailVO; +import com.deepinnet.tptradeprod.core.model.task.TpScheduleTask; +import com.google.common.collect.Lists; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; + + +/** + * 关单前两个小时任务 + * + * @author abel + * @since 2023/12/9 15:15 + */ +@Component +public class CloseOrderBeforeTwoHoursWorker extends AbstractBaseTaskWorker { + + @Resource + private TpOrderClient tpOrderClient; + + @Resource + private TpOrderDispatchClient tpOrderDispatchClient; + + @Resource + private TpSmsClient tpSmsClient; + + @Resource + private TpEmailClient tpEmailClient; + + @Resource + private TpTenantClient tpTenantClient; + + private static final List NEED_HANDLE_STATUS = Lists.newArrayList(); + + static { + NEED_HANDLE_STATUS.add(TpOrderStatusEnum.ORDER_DEPOSIT_NEED_PAY); + NEED_HANDLE_STATUS.add(TpOrderStatusEnum.ORDER_NEED_CONFIRM); + } + + + @Override + public TpScheduleTaskTypeEnum getTaskType() { + return TpScheduleTaskTypeEnum.CLOSE_ORDER_BEFORE_TWO_HOURS; + } + + @Override + protected List needTerminatedErrorCode() { + return Lists.newArrayList(TpTradeProdErrorCode.ORDER_NOT_FOUND, TpTradeProdErrorCode.ORDER_STATUS_NOT_NEED_PROCESS_ERROR); + } + + @Override + protected void doOtherBiz(TpScheduleTask scheduleTask) { + + } + + @Override + protected void checkBizStatus(Long taskId, String bizNo, String tenantId) { + // 判断的订单状态 + TpProdOrderDetailVO orderDetail = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .originalOrderNo(bizNo) + .tenantId(tenantId).build()); + + if (!NEED_HANDLE_STATUS.contains(TpOrderStatusEnum.getTpOrderStatusEnumByStatus(orderDetail.getStatus(), orderDetail.getType()))) { + LogUtil.error("当前订单:{}, 状态为:{}, 状态为无需审核,无需处理,当前任务结束", bizNo, TpOrderStatusEnum.getTpOrderStatusEnumByStatus(orderDetail.getStatus(), orderDetail.getType())); + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_STATUS_NOT_NEED_PROCESS_ERROR); + } + + } + + @Override + protected void updateBizStatus(String bizNo, String tenantId) { + // 判断的订单状态 + TpProdOrderDetailVO orderDetail = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .originalOrderNo(bizNo) + .needModules(ListUtil.toList(TpOrderModulesEnum.ORDER_REQUIREMENT_USER.getModule())) + .tenantId(tenantId).build()); + + // 判断状态发送邮件和短信 + TpProdOrderDispatchDetailDTO orderDispatchDetailDTO = new TpProdOrderDispatchDetailDTO(); + orderDispatchDetailDTO.setOrderNo(bizNo); + orderDispatchDetailDTO.setTenantId(tenantId); + + TpProdOrderDispatchDetailVO orderDispatchDetail = tpOrderDispatchClient.getOrderDispatchDetail(orderDispatchDetailDTO); + + // 下新单未确认 + orderNeedConfirmSendSmsAndEmail(bizNo, tenantId, orderDetail, orderDispatchDetail); + + // 审核通过,用户待支付订金,提醒用户 + orderNeedPaySendSms(tenantId, orderDetail, orderDispatchDetail); + } + + private void orderNeedPaySendSms(String tenantId, TpProdOrderDetailVO orderDetail, TpProdOrderDispatchDetailVO orderDispatchDetail ) { + if (ObjectUtil.equals(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_DEPOSIT_NEED_PAY.getStatus())) { + TpTenantContractListDTO orgDetail = tpTenantClient.getAuditorsByOrgCode(orderDispatchDetail.getTargetOrgNo(), tenantId); + + TpSmsNeedPayBeforeCloseTemplate smsTemplate = new TpSmsNeedPayBeforeCloseTemplate(); + smsTemplate.setUserName(orderDetail.getOrderRequirementUser().getRequirementContactName()); + smsTemplate.setContactPhone(ObjectUtil.isNull(orgDetail) ? "" : (CollUtil.isNotEmpty(orgDetail.getAuditorPhone()) ? orgDetail.getAuditorPhone().get(0) : "")); + + tpSmsClient.sendSms(orderDetail.getOrderRequirementUser().getRequirementContact(), smsTemplate); + } + } + + private void orderNeedConfirmSendSmsAndEmail(String bizNo, String tenantId, TpProdOrderDetailVO orderDetail, TpProdOrderDispatchDetailVO orderDispatchDetail) { + // 如果还未确认并未分配订单,发送邮件与短信 + if (ObjectUtil.equals(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_NEED_CONFIRM.getStatus()) && StrUtil.isEmpty(orderDispatchDetail.getTargetOrgNo())) { + TpTenantContractListDTO orgAuditorDetail = tpTenantClient.getAuditorsByOrgCode(orderDispatchDetail.getTargetOrgNo(), tenantId); + TpSmsNotDistributeUtilCloseTemplate smsTemplate = new TpSmsNotDistributeUtilCloseTemplate(); + smsTemplate.setOrderNo(bizNo); + // 发送短信 + if (ObjectUtil.isNotNull(orgAuditorDetail) && CollUtil.isNotEmpty(orgAuditorDetail.getAuditorPhone())) { + tpSmsClient.batchSendSms(orgAuditorDetail.getAuditorPhone(), smsTemplate); + } + + TpEmailNotDistributeUtilCloseTemplate emailTemplate = new TpEmailNotDistributeUtilCloseTemplate(); + emailTemplate.setOrderNo(bizNo); + // 发送邮件 + if (ObjectUtil.isNotNull(orgAuditorDetail) && CollUtil.isNotEmpty(orgAuditorDetail.getAuditorEmail())) { + tpEmailClient.batchSendEmail(orgAuditorDetail.getAuditorEmail(), emailTemplate); + } + } + + // 如果还未确认并已分配订单,发送邮件与短信 + if (ObjectUtil.equals(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_NEED_CONFIRM.getStatus()) && StrUtil.isNotEmpty(orderDispatchDetail.getTargetOrgNo())) { + TpTenantContractListDTO orgAuditorDetail = tpTenantClient.getAuditorsByOrgCode(orderDispatchDetail.getTargetOrgNo(), tenantId); + TpSmsNotAuditUtilCloseTemplate smsTemplate = new TpSmsNotAuditUtilCloseTemplate(); + smsTemplate.setOrderNo(bizNo); + + // 发送短信 + if (ObjectUtil.isNotNull(orgAuditorDetail) && CollUtil.isNotEmpty(orgAuditorDetail.getAuditorPhone())) { + tpSmsClient.batchSendSms(orgAuditorDetail.getAuditorPhone(), smsTemplate); + } + TpEmailNotAuditUtilCloseTemplate emailTemplate = new TpEmailNotAuditUtilCloseTemplate(); + emailTemplate.setOrderNo(bizNo); + // 发送邮件 + if (ObjectUtil.isNotNull(orgAuditorDetail) && CollUtil.isNotEmpty(orgAuditorDetail.getAuditorEmail())) { + tpEmailClient.batchSendEmail(orgAuditorDetail.getAuditorEmail(), emailTemplate); + } + } + } + + + /** + * 是否启用分布式业务锁 + * @return + */ + @Override + protected boolean openDistributedBizLock(){ + return Boolean.FALSE; + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/task/worker/OrderAuditTimeOutWorker.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/task/worker/OrderAuditTimeOutWorker.java new file mode 100644 index 0000000..cf61602 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/task/worker/OrderAuditTimeOutWorker.java @@ -0,0 +1,146 @@ +package com.deepinnet.tptradeprod.biz.task.worker; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.order.TpOrderChangeApplyStatusEnum; +import com.deepinnet.tptradeprod.biz.service.flow.manager.LiteFlowManager; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.enums.*; +import com.deepinnet.tptradeprod.common.enums.task.TpScheduleTaskTypeEnum; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.*; +import com.deepinnet.tptradeprod.common.vo.*; +import com.deepinnet.tptradeprod.core.model.task.TpScheduleTask; +import com.google.common.collect.Lists; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.*; + +import static com.deepinnet.tptradecore.common.enums.audit.TpAuditStatusEnum.APPROVED_TIMEOUT; + +/** + * 超时未审核处理 + * + * @author abel + * @since 2023/12/9 15:15 + */ +@Component +public class OrderAuditTimeOutWorker extends AbstractBaseTaskWorker { + @Resource + private LiteFlowManager liteFlowManager; + + @Resource + private TpOrderClient tpOrderClient; + + @Resource + private TpOrderChangeApplyClient tpOrderChangeApplyClient; + + private static final List NEED_HANDLE_STATUS = Lists.newArrayList(); + + static { + NEED_HANDLE_STATUS.add(TpOrderStatusEnum.ORDER_NEED_CONFIRM); + NEED_HANDLE_STATUS.add(TpOrderStatusEnum.ORDER_CHANGE_AUDITING); + NEED_HANDLE_STATUS.add(TpOrderStatusEnum.ORDER_CANCEL_AUDITING); + NEED_HANDLE_STATUS.add(TpOrderStatusEnum.ORDER_DEPOSIT_NEED_PAY); + } + + + @Override + public TpScheduleTaskTypeEnum getTaskType() { + return TpScheduleTaskTypeEnum.AUDIT_TIME_OUT; + } + + @Override + protected void doOtherBiz(TpScheduleTask scheduleTask) { + + } + + @Override + protected List needTerminatedErrorCode() { + return Lists.newArrayList(TpTradeProdErrorCode.ORDER_NOT_FOUND, TpTradeProdErrorCode.ORDER_STATUS_NOT_NEED_PROCESS_ERROR, TpTradeProdErrorCode.CHANGE_ORDER_APPLY_NOT_EXIST_ERROR, + TpTradeProdErrorCode.CHANGE_ORDER_APPLY_APPROVED_FINISH_ERROR, TpTradeProdErrorCode.ORDER_CHANGE_ENUM_ERROR); + } + + @Override + protected void checkBizStatus(Long taskId, String bizNo, String tenantId) { + // 判断的订单状态 + TpProdOrderDetailVO orderDetail = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .originalOrderNo(bizNo) + .tenantId(tenantId).build()); + + if (!NEED_HANDLE_STATUS.contains(TpOrderStatusEnum.getTpOrderStatusEnumByStatus(orderDetail.getStatus(), orderDetail.getType()))) { + LogUtil.error("当前订单:{}, 状态为:{}, 已到审核时间,无需处理,当前任务结束", bizNo, TpOrderStatusEnum.getTpOrderStatusEnumByStatus(orderDetail.getStatus(), orderDetail.getType())); + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_STATUS_NOT_NEED_PROCESS_ERROR); + + } + + TpProdOrderChangeApplyDetailVO orderChangedApplyDetail = tpOrderChangeApplyClient.getOrderChangedApplyDetail(TpProdOrderChangeApplyDetailDTO.builder() + .originalOrderNo(bizNo) + .tenantId(tenantId).build()); + + if (ObjectUtil.isNull(orderChangedApplyDetail)) { + LogUtil.error("订单变更申请单不存在, 任务终止"); + throw new TpTradeProdException(TpTradeProdErrorCode.CHANGE_ORDER_APPLY_NOT_EXIST_ERROR); + } + + List waitingApprovedStatus = Arrays.asList(TpOrderChangeApplyStatusEnum.FULL_RSC_WAITING_APPROVED.getType(), + TpOrderChangeApplyStatusEnum.WAITING_APPROVED.getType(),TpOrderChangeApplyStatusEnum.APPLY_CREATE.getType()); + if (!CollUtil.contains(waitingApprovedStatus,orderChangedApplyDetail.getApplyStatus())) { + LogUtil.error("订单变更申请单已经审核完成, 不需要触发超时任务,任务终止"); + throw new TpTradeProdException(TpTradeProdErrorCode.CHANGE_ORDER_APPLY_APPROVED_FINISH_ERROR); + } + + } + + @Override + protected void updateBizStatus(String bizNo, String tenantId) { + TpProdOrderDetailVO orderDetail = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .originalOrderNo(bizNo) + .tenantId(tenantId).build()); + + TpOrderAuditConfirmTypeEnum confirmTypeEnum = getOrderAuditStatus(orderDetail); + + if (ObjectUtil.isNull(confirmTypeEnum)) { + LogUtil.error("订单确认枚举为空,请检查订单状态"); + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_CHANGE_ENUM_ERROR); + } + + + TpProdOrderAuditConfirmDTO confirmDTO = new TpProdOrderAuditConfirmDTO(); + confirmDTO.setOriginalOrderNo(bizNo); + TpOrderAuditConfirmTypeEnum auditConfirmType = TpOrderAuditConfirmTypeEnum.getTpOrderAuditConfirmType(confirmTypeEnum.getType()); + confirmDTO.setOrderAuditConfirmType(auditConfirmType.getCode()); + confirmDTO.setAuditStatus(APPROVED_TIMEOUT.getType()); + confirmDTO.setAuditResult("超时未审核"); + confirmDTO.setTenantId(tenantId); + + liteFlowManager.confirmOrder(confirmDTO); + } + + private TpOrderAuditConfirmTypeEnum getOrderAuditStatus(TpProdOrderDetailVO orderDetail) { + TpOrderStatusEnum tpOrderStatusEnumByStatus = TpOrderStatusEnum.getTpOrderStatusEnumByStatus(orderDetail.getStatus(), orderDetail.getType()); + switch (tpOrderStatusEnumByStatus) { + case ORDER_NEED_CONFIRM: + return TpOrderAuditConfirmTypeEnum.ORDER_CREATE; + case ORDER_CHANGE_AUDITING: + return TpOrderAuditConfirmTypeEnum.ORDER_CHANGE; + case ORDER_CANCEL_AUDITING: + return TpOrderAuditConfirmTypeEnum.ORDER_CANCEL; + } + + return null; + } + + + /** + * 是否启用分布式业务锁 + * @return + */ + @Override + protected boolean openDistributedBizLock(){ + return Boolean.TRUE; + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/task/worker/TripEndAfterThreeDaysWorker.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/task/worker/TripEndAfterThreeDaysWorker.java new file mode 100644 index 0000000..00c317c --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/task/worker/TripEndAfterThreeDaysWorker.java @@ -0,0 +1,127 @@ +package com.deepinnet.tptradeprod.biz.task.worker; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpcommoncore.common.service.template.sms.user.TpSmsTripEndUrgeUserPayTemplate; +import com.deepinnet.tpconfigcore.common.vo.TpTenantContractListDTO; +import com.deepinnet.tptradecore.common.enums.order.TpOrderModulesEnum; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderDispatchDetailDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderQueryDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderStatusEnum; +import com.deepinnet.tptradeprod.common.enums.task.TpScheduleTaskTypeEnum; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderDispatchClient; +import com.deepinnet.tptradeprod.common.service.integration.client.TpTenantClient; +import com.deepinnet.tptradeprod.common.service.integration.client.sms.TpSmsClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDispatchDetailVO; +import com.deepinnet.tptradeprod.core.model.task.TpScheduleTask; +import com.google.common.collect.Lists; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.List; + + +/** + * 行程结束后三天任务 + * + * @author abel + * @since 2023/12/9 15:15 + */ +@Component +public class TripEndAfterThreeDaysWorker extends AbstractBaseTaskWorker { + + @Resource + private TpOrderClient tpOrderClient; + + @Resource + private TpOrderDispatchClient tpOrderDispatchClient; + + @Resource + private TpSmsClient tpSmsClient; + + @Resource + private TpTenantClient tpTenantClient; + + private static final List NEED_HANDLE_STATUS = Lists.newArrayList(); + + static { + NEED_HANDLE_STATUS.add(TpOrderStatusEnum.ORDER_TRIP_END_NEED_PAY); + } + + @Override + public TpScheduleTaskTypeEnum getTaskType() { + return TpScheduleTaskTypeEnum.TRIP_END_AFTER_THREE_DAYS; + } + + @Override + protected void doOtherBiz(TpScheduleTask scheduleTask) { + + } + + @Override + protected List needTerminatedErrorCode() { + return Lists.newArrayList(TpTradeProdErrorCode.ORDER_NOT_FOUND, TpTradeProdErrorCode.ORDER_STATUS_NOT_NEED_PROCESS_ERROR); + } + + @Override + protected void checkBizStatus(Long taskId, String bizNo, String tenantId) { + // 判断的订单状态 + TpProdOrderDetailVO orderDetail = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .originalOrderNo(bizNo) + .tenantId(tenantId).build()); + + if (!NEED_HANDLE_STATUS.contains(TpOrderStatusEnum.getTpOrderStatusEnumByStatus(orderDetail.getStatus(), orderDetail.getType()))) { + LogUtil.error("[行程结束后三天任务]-当前订单:{}, 状态为:{}, 无需处理,当前任务结束", bizNo, TpOrderStatusEnum.getTpOrderStatusEnumByStatus(orderDetail.getStatus(), orderDetail.getType())); + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_STATUS_NOT_NEED_PROCESS_ERROR); + } + + } + + @Override + protected void updateBizStatus(String bizNo, String tenantId) { + // 判断的订单状态 + TpProdOrderDetailVO orderDetail = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .originalOrderNo(bizNo) + .needModules(ListUtil.toList(TpOrderModulesEnum.ORDER_REQUIREMENT_USER.getModule())) + .tenantId(tenantId).build()); + + // 判断状态发送短信 + TpProdOrderDispatchDetailDTO orderDispatchDetailDTO = new TpProdOrderDispatchDetailDTO(); + orderDispatchDetailDTO.setOrderNo(bizNo); + orderDispatchDetailDTO.setTenantId(tenantId); + + TpProdOrderDispatchDetailVO orderDispatchDetail = tpOrderDispatchClient.getOrderDispatchDetail(orderDispatchDetailDTO); + + TpTenantContractListDTO orgAuditorDetail = tpTenantClient.getAuditorsByOrgCode(orderDispatchDetail.getTargetOrgNo(), tenantId); + + BigDecimal serviceCharge = StrUtil.isEmpty(orderDetail.getServiceCharge()) ? BigDecimal.ZERO : new BigDecimal(orderDetail.getServiceCharge()); + BigDecimal paidAmount = StrUtil.isEmpty(orderDetail.getPayAmount()) ? BigDecimal.ZERO : new BigDecimal(orderDetail.getPayAmount()); + BigDecimal payableAmount = new BigDecimal(orderDetail.getPayableAmount()); + + TpSmsTripEndUrgeUserPayTemplate smsTemplate = new TpSmsTripEndUrgeUserPayTemplate(); + smsTemplate.setUserName(orderDetail.getOrderRequirementUser().getRequirementContactName()); + // 计算待支付金额 + smsTemplate.setPayAmount(payableAmount.add(serviceCharge).subtract(paidAmount).toString()); + smsTemplate.setContactPhone(ObjectUtil.isNull(orgAuditorDetail) ? "" : (CollUtil.isNotEmpty(orgAuditorDetail.getAuditorPhone()) ? orgAuditorDetail.getAuditorPhone().get(0) : "")); + + tpSmsClient.sendSms(orderDetail.getOrderRequirementUser().getRequirementContact(), smsTemplate); + } + + + /** + * 是否启用分布式业务锁 + * @return + */ + @Override + protected boolean openDistributedBizLock(){ + return Boolean.FALSE; + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/task/worker/TripStartBeforeHalfHourWorker.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/task/worker/TripStartBeforeHalfHourWorker.java new file mode 100644 index 0000000..5c8708c --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/task/worker/TripStartBeforeHalfHourWorker.java @@ -0,0 +1,146 @@ +package com.deepinnet.tptradeprod.biz.task.worker; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.util.ObjectUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpcommoncore.common.service.template.email.TpEmailNotDispatchBeforeDepartTemplate; +import com.deepinnet.tpcommoncore.common.service.template.sms.staff.TpSmsNotDispatchBeforeDepartTemplate; +import com.deepinnet.tpcommoncore.common.service.template.sms.user.TpSmsUnscheduledBeforeDepartureTemplate; +import com.deepinnet.tpconfigcore.common.vo.TpTenantContractListDTO; +import com.deepinnet.tptradecore.common.enums.order.TpOrderModulesEnum; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderDispatchDetailDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderQueryDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderStatusEnum; +import com.deepinnet.tptradeprod.common.enums.task.TpScheduleTaskTypeEnum; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderDispatchClient; +import com.deepinnet.tptradeprod.common.service.integration.client.TpTenantClient; +import com.deepinnet.tptradeprod.common.service.integration.client.email.TpEmailClient; +import com.deepinnet.tptradeprod.common.service.integration.client.sms.TpSmsClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDispatchDetailVO; +import com.deepinnet.tptradeprod.core.model.task.TpScheduleTask; +import com.google.common.collect.Lists; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; + + +/** + * 行程开始前半小时任务 + * + * @author abel + * @since 2023/12/9 15:15 + */ +@Component +public class TripStartBeforeHalfHourWorker extends AbstractBaseTaskWorker { + + @Resource + private TpOrderClient tpOrderClient; + + @Resource + private TpOrderDispatchClient tpOrderDispatchClient; + + @Resource + private TpTenantClient tpTenantClient; + + @Resource + private TpSmsClient tpSmsClient; + + @Resource + private TpEmailClient tpEmailClient; + + private static final List NEED_HANDLE_STATUS = Lists.newArrayList(); + + static { + NEED_HANDLE_STATUS.add(TpOrderStatusEnum.ORDER_NEED_DISPATCH); + } + + + @Override + public TpScheduleTaskTypeEnum getTaskType() { + return TpScheduleTaskTypeEnum.TRIP_START_BEFORE_HALF_HOURS; + } + + @Override + protected void doOtherBiz(TpScheduleTask scheduleTask) { + + } + + @Override + protected List needTerminatedErrorCode() { + return Lists.newArrayList(TpTradeProdErrorCode.ORDER_NOT_FOUND, TpTradeProdErrorCode.ORDER_STATUS_NOT_NEED_PROCESS_ERROR); + } + + @Override + protected void checkBizStatus(Long taskId, String bizNo, String tenantId) { + // 判断的订单状态 + TpProdOrderDetailVO orderDetail = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .originalOrderNo(bizNo) + .tenantId(tenantId).build()); + + if (!NEED_HANDLE_STATUS.contains(TpOrderStatusEnum.getTpOrderStatusEnumByStatus(orderDetail.getStatus(), orderDetail.getType()))) { + LogUtil.error("[行程开始前30分钟任务]-当前订单:{}, 状态为:{}, 无需处理,当前任务结束", bizNo, TpOrderStatusEnum.getTpOrderStatusEnumByStatus(orderDetail.getStatus(), orderDetail.getType())); + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_STATUS_NOT_NEED_PROCESS_ERROR); + } + + } + + @Override + protected void updateBizStatus(String bizNo, String tenantId) { + // 判断的订单状态 + TpProdOrderDetailVO orderDetail = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .originalOrderNo(bizNo) + .needModules(ListUtil.toList(TpOrderModulesEnum.ORDER_REQUIREMENT_USER.getModule())) + .tenantId(tenantId).build()); + + // 判断状态发送邮件和短信 + TpProdOrderDispatchDetailDTO orderDispatchDetailDTO = new TpProdOrderDispatchDetailDTO(); + orderDispatchDetailDTO.setOrderNo(bizNo); + orderDispatchDetailDTO.setTenantId(tenantId); + + TpProdOrderDispatchDetailVO orderDispatchDetail = tpOrderDispatchClient.getOrderDispatchDetail(orderDispatchDetailDTO); + + // 发车前半个小时,还是待派车状态 + if (ObjectUtil.equals(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_NEED_DISPATCH.getStatus())) { + + // 给用户发的联系业务员的短信 + TpTenantContractListDTO orgAuditorDetail = tpTenantClient.getAuditorsByOrgCode(orderDispatchDetail.getTargetOrgNo(), tenantId); + + TpSmsUnscheduledBeforeDepartureTemplate smsTemplate = new TpSmsUnscheduledBeforeDepartureTemplate(); + smsTemplate.setUserName(orderDetail.getOrderRequirementUser().getRequirementContactName()); + smsTemplate.setContactPhone(ObjectUtil.isNull(orgAuditorDetail) ? "" : (CollUtil.isNotEmpty(orgAuditorDetail.getAuditorPhone()) ? orgAuditorDetail.getAuditorPhone().get(0) : "")); + + tpSmsClient.sendSms(orderDetail.getOrderRequirementUser().getRequirementContact(), smsTemplate); + + // 给业务员发的短信与邮件 + TpSmsNotDispatchBeforeDepartTemplate auditorSmsTemplate = new TpSmsNotDispatchBeforeDepartTemplate(); + auditorSmsTemplate.setOrderNo(bizNo); + + if (ObjectUtil.isNotNull(orgAuditorDetail) && CollUtil.isNotEmpty(orgAuditorDetail.getAuditorPhone())) { + tpSmsClient.batchSendSms(orgAuditorDetail.getAuditorPhone(), auditorSmsTemplate); + } + + TpEmailNotDispatchBeforeDepartTemplate auditorEmailTemplate = new TpEmailNotDispatchBeforeDepartTemplate(); + auditorEmailTemplate.setOrderNo(bizNo); + + if (ObjectUtil.isNotNull(orgAuditorDetail) && CollUtil.isNotEmpty(orgAuditorDetail.getAuditorEmail())) { + tpEmailClient.batchSendEmail(orgAuditorDetail.getAuditorEmail(), auditorEmailTemplate); + } + } + } + + + /** + * 是否启用分布式业务锁 + * @return + */ + @Override + protected boolean openDistributedBizLock(){ + return Boolean.FALSE; + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/task/worker/TripStartBeforeTwoHoursWorker.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/task/worker/TripStartBeforeTwoHoursWorker.java new file mode 100644 index 0000000..83b79d4 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/task/worker/TripStartBeforeTwoHoursWorker.java @@ -0,0 +1,167 @@ +package com.deepinnet.tptradeprod.biz.task.worker; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.util.*; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpcommoncore.common.service.template.email.*; +import com.deepinnet.tpcommoncore.common.service.template.sms.staff.*; +import com.deepinnet.tpconfigcore.common.vo.TpTenantContractListDTO; +import com.deepinnet.tptradecore.common.enums.order.TpOrderModulesEnum; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.enums.TpOrderStatusEnum; +import com.deepinnet.tptradeprod.common.enums.task.TpScheduleTaskTypeEnum; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.*; +import com.deepinnet.tptradeprod.common.service.integration.client.email.TpEmailClient; +import com.deepinnet.tptradeprod.common.service.integration.client.sms.TpSmsClient; +import com.deepinnet.tptradeprod.common.vo.*; +import com.deepinnet.tptradeprod.core.model.task.TpScheduleTask; +import com.google.common.collect.*; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.*; + + +/** + * 行程开始前两个小时任务 + * + * @author abel + * @since 2023/12/9 15:15 + */ +@Component +public class TripStartBeforeTwoHoursWorker extends AbstractBaseTaskWorker { + + @Resource + private TpOrderClient tpOrderClient; + + @Resource + private TpOrderDispatchClient tpOrderDispatchClient; + + @Resource + private TpTenantClient tpTenantClient; + + @Resource + private TpSmsClient tpSmsClient; + + @Resource + private TpEmailClient tpEmailClient; + + private static final List NEED_HANDLE_STATUS = Lists.newArrayList(); + + static { + NEED_HANDLE_STATUS.add(TpOrderStatusEnum.ORDER_CANCEL_AUDITING); + NEED_HANDLE_STATUS.add(TpOrderStatusEnum.ORDER_CHANGE_AUDITING); + } + + @Override + public TpScheduleTaskTypeEnum getTaskType() { + return TpScheduleTaskTypeEnum.TRIP_START_BEFORE_TWO_HOURS; + } + + @Override + protected void doOtherBiz(TpScheduleTask scheduleTask) { + + } + + @Override + protected List needTerminatedErrorCode() { + return Lists.newArrayList(TpTradeProdErrorCode.ORDER_NOT_FOUND, TpTradeProdErrorCode.ORDER_STATUS_NOT_NEED_PROCESS_ERROR); + } + + @Override + protected void checkBizStatus(Long taskId, String bizNo, String tenantId) { + // 判断的订单状态 + TpProdOrderDetailVO orderDetail = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .originalOrderNo(bizNo) + .tenantId(tenantId).build()); + + if (!NEED_HANDLE_STATUS.contains(TpOrderStatusEnum.getTpOrderStatusEnumByStatus(orderDetail.getStatus(), orderDetail.getType()))) { + LogUtil.error("[行程开始前两个小时任务]-当前订单:{}, 状态为:{}, 无需处理,当前任务结束", bizNo, TpOrderStatusEnum.getTpOrderStatusEnumByStatus(orderDetail.getStatus(), orderDetail.getType())); + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_STATUS_NOT_NEED_PROCESS_ERROR); + } + + } + + @Override + protected void updateBizStatus(String bizNo, String tenantId) { + // 判断的订单状态 + TpProdOrderDetailVO orderDetail = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .originalOrderNo(bizNo) + .needModules(ListUtil.toList(TpOrderModulesEnum.ORDER_REQUIREMENT_USER.getModule())) + .tenantId(tenantId).build()); + + // 判断状态发送邮件和短信 + TpProdOrderDispatchDetailDTO orderDispatchDetailDTO = new TpProdOrderDispatchDetailDTO(); + orderDispatchDetailDTO.setOrderNo(bizNo); + orderDispatchDetailDTO.setTenantId(tenantId); + + TpProdOrderDispatchDetailVO orderDispatchDetail = tpOrderDispatchClient.getOrderDispatchDetail(orderDispatchDetailDTO); + + // 取消订单未确认 + orderCancelNeedConfirmSendSmsAndEmail(bizNo, tenantId, orderDetail, orderDispatchDetail); + + // 变更订单待确认 + orderChangeNeedConfirmSendSmsAndEmail(bizNo, tenantId, orderDetail, orderDispatchDetail); + } + + private void orderChangeNeedConfirmSendSmsAndEmail(String bizNo, String tenantId, TpProdOrderDetailVO orderDetail, TpProdOrderDispatchDetailVO orderDispatchDetail) { + if (ObjectUtil.equals(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_CHANGE_AUDITING.getStatus())) { + TpTenantContractListDTO orgAuditorDetail = tpTenantClient.getAuditorsByOrgCode(orderDispatchDetail.getTargetOrgNo(), tenantId); + + // 短信模板组装 + TpSmsUserChangeNotAuditBeforeDepartTemplate smsTemplate = new TpSmsUserChangeNotAuditBeforeDepartTemplate(); + smsTemplate.setOrderNo(bizNo); + + // 发送短信 + if (ObjectUtil.isNotNull(orgAuditorDetail) && CollUtil.isNotEmpty(orgAuditorDetail.getAuditorPhone())) { + tpSmsClient.batchSendSms(orgAuditorDetail.getAuditorPhone(), smsTemplate); + } + + // 邮件模版组装 + TpEmailUserChangeNotAuditBeforeDepartTemplate emailTemplate = new TpEmailUserChangeNotAuditBeforeDepartTemplate(); + emailTemplate.setOrderNo(bizNo); + + // 发送邮件 + if (ObjectUtil.isNotNull(orgAuditorDetail) && CollUtil.isNotEmpty(orgAuditorDetail.getAuditorEmail())) { + tpEmailClient.batchSendEmail(orgAuditorDetail.getAuditorEmail(), emailTemplate); + } + } + } + + private void orderCancelNeedConfirmSendSmsAndEmail(String bizNo, String tenantId, TpProdOrderDetailVO orderDetail, TpProdOrderDispatchDetailVO orderDispatchDetail) { + if (ObjectUtil.equals(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_CANCEL_AUDITING.getStatus())) { + TpTenantContractListDTO orgAuditorDetail = tpTenantClient.getAuditorsByOrgCode(orderDispatchDetail.getTargetOrgNo(), tenantId); + + // 短信模板组装 + TpSmsCancelNotAuditBeforeDepartTemplate smsTemplate = new TpSmsCancelNotAuditBeforeDepartTemplate(); + smsTemplate.setOrderNo(bizNo); + + // 发送短信 + if (ObjectUtil.isNotNull(orgAuditorDetail) && CollUtil.isNotEmpty(orgAuditorDetail.getAuditorPhone())) { + tpSmsClient.batchSendSms(orgAuditorDetail.getAuditorPhone(), smsTemplate); + } + + // 邮件模版组装 + TpEmailCancelNotAuditBeforeDepartTemplate emailTemplate = new TpEmailCancelNotAuditBeforeDepartTemplate(); + emailTemplate.setOrderNo(bizNo); + + // 发送邮件 + if (ObjectUtil.isNotNull(orgAuditorDetail) && CollUtil.isNotEmpty(orgAuditorDetail.getAuditorEmail())) { + tpEmailClient.batchSendEmail(orgAuditorDetail.getAuditorEmail(), emailTemplate); + } + } + } + + + /** + * 是否启用分布式业务锁 + * @return + */ + @Override + protected boolean openDistributedBizLock(){ + return Boolean.FALSE; + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/util/TimeConvertUtil.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/util/TimeConvertUtil.java new file mode 100644 index 0000000..8e1caf8 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/util/TimeConvertUtil.java @@ -0,0 +1,54 @@ +package com.deepinnet.tptradeprod.biz.util; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.date.LocalDateTimeUtil; +import com.deepinnet.tp.common.lang.constants.GlobalConstants; + +import java.time.*; +import java.time.format.DateTimeFormatter; + +public class TimeConvertUtil { + + private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern(GlobalConstants.TIME_FORMAT); + + /** + * 将HH:mm格式的时间,转化为当天对应时间的时间戳 + * + * @param time HH:mm格式的字符串,如08:40 + * @return + */ + public static Long convertTime2Timestamp(String time) { + LocalTime curTime = LocalTime.parse(time, FORMATTER); + LocalDateTime localDateTime = LocalDateTime.of(LocalDate.now(), curTime); + return localDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); + } + + /** + * 接收一个时间戳,截取当前时间戳对于的日期 + * 然后拼接传入的HH:mm格式的时间,最终返回两者拼接而成的时间戳 + * + * @param time HH:mm格式的字符串,如08:40 + * @param timestamp 需要拼接日期的时间戳 + * @return + */ + public static Long convertDateAndTime2Timestamp(Long timestamp, String time) { + LocalTime localTime = LocalTime.parse(time, FORMATTER); + LocalDate localDate = DateUtil.date(timestamp).toLocalDateTime().toLocalDate(); + LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime); + return LocalDateTimeUtil.toEpochMilli(localDateTime); + } + + /** + * 给定一个时间戳,返回当前时间戳对应日期凌晨的时间戳 + * + * @param timestamp + * @return + */ + public static Long convertTimestamp2StartTimestamp(Long timestamp) { + LocalDateTime dateTime = Instant.ofEpochMilli(timestamp) + .atZone(ZoneId.systemDefault()) + .toLocalDateTime(); + LocalDateTime startTime = dateTime.toLocalDate().atStartOfDay(); + return startTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/util/TpVoucherUtil.java b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/util/TpVoucherUtil.java new file mode 100644 index 0000000..e5ac155 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/java/com/deepinnet/tptradeprod/biz/util/TpVoucherUtil.java @@ -0,0 +1,196 @@ +package com.deepinnet.tptradeprod.biz.util; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.constants.GlobalConstants; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpbaseopcore.common.constants.RouteConstants; +import com.deepinnet.tpbaseopcore.common.dto.route.RouteRollTimeDetailDTO; +import com.deepinnet.tpbaseopcore.common.dto.time.RollTimeDTO; +import com.deepinnet.tpproductcore.common.enums.TpTripTypeEnum; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.google.common.collect.*; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.Assert; + +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * @author amos wong + * @create 2024/2/28 17:09 + * @Description + */ +public class TpVoucherUtil { + + /** + * 判断剩余乘车人数是否能够满足退票填写的退票人数 + * + * @return + */ + public static boolean isRefundPassengerCountValid(TpProdVoucherDTO voucherDTO, int refundPassengerCount) { + int passengerCount = voucherDTO.getPassengerCount(); + int totalCount = voucherDTO.getTotalCount(); + int refundCount = voucherDTO.getRefundCount(); + int redemptionCount = voucherDTO.getRedemptionCount(); + int eachPassengerTotalCount = totalCount / passengerCount; + // 计算最大剩余可退的乘车人数 + int divisor = voucherDTO.getRedemptionCount() % eachPassengerTotalCount; + int redemptionPassengerCount = divisor == 0 ? redemptionCount / eachPassengerTotalCount : redemptionCount / eachPassengerTotalCount + 1; + int availableRefundPassengerCount = passengerCount - refundCount / eachPassengerTotalCount - redemptionPassengerCount; + return availableRefundPassengerCount >= refundPassengerCount; + } + + /** + * 计算剩余可退票的乘车人数 + * + * @return + */ + public static Integer calculateRefundPassengerCount(TpProdVoucherDTO voucherDTO) { + int passengerCount = voucherDTO.getPassengerCount(); + int totalCount = voucherDTO.getTotalCount(); + int refundCount = voucherDTO.getRefundCount(); + int redemptionCount = voucherDTO.getRedemptionCount(); + int eachPassengerTotalCount = totalCount / passengerCount; + // 计算最大剩余可退的乘车人数 + int divisor = voucherDTO.getRedemptionCount() % eachPassengerTotalCount; + int redemptionPassengerCount = divisor == 0 ? redemptionCount / eachPassengerTotalCount : redemptionCount / eachPassengerTotalCount + 1; + return passengerCount - refundCount / eachPassengerTotalCount - redemptionPassengerCount; + } + + public static Map> getNonRealNameRefundVouchers(List nonRealNameTicketChoiceDTOs, + List availableRefundVoucherList) { + Map> refundPassengerCountVoucherMap = Maps.newHashMap(); + List actuallyRefundVoucherList = Lists.newArrayList(); + + for (TpNonRealNameTicketRefundChoiceDTO nonRealNameTicketChoiceDTO : nonRealNameTicketChoiceDTOs) { + String voucherTravelDate = nonRealNameTicketChoiceDTO.getVoucherTravelDate(); + String[] split = voucherTravelDate.split(GlobalConstants.HORIZONTAL_LINE); + Long effectiveStartTime = Long.valueOf(split[0]); + Long effectiveEndTime = Long.valueOf(split[1]); + + Integer refundPassengerCount = nonRealNameTicketChoiceDTO.getRefundPassengerCount(); + List curDateActuallyRefundVoucherList = availableRefundVoucherList + .stream() + .filter(v -> { + boolean isValid = TpVoucherUtil.isRefundPassengerCountValid(v, refundPassengerCount); + return Objects.equals(v.getEffectiveStartTime(), effectiveStartTime) && Objects.equals(v.getEffectiveEndTime(), effectiveEndTime) && isValid; + }).collect(Collectors.toList()); + + if (CollectionUtils.isEmpty(curDateActuallyRefundVoucherList)) { + LogUtil.error("用户选定的退票日期对应的凭证不存在,退票日期为:{},凭证列表为:{}", voucherTravelDate, JSONUtil.toJsonStr(availableRefundVoucherList)); + throw new TpTradeProdException(TpTradeProdErrorCode.NOT_FOUND_REFUND_AVAILABLE_VOUCHER); + } + + actuallyRefundVoucherList.addAll(curDateActuallyRefundVoucherList); + } + + // 非实名制的凭证 同一个生失效时间只会有一张凭证 + Map effectiveTimeVoucherMap = actuallyRefundVoucherList.stream() + .collect(Collectors.toMap(v -> v.getEffectiveStartTime() + GlobalConstants.HORIZONTAL_LINE + v.getEffectiveEndTime(), Function.identity())); + Map nonRealNameTicketRefundChoiceDTOMap = nonRealNameTicketChoiceDTOs + .stream() + .collect(Collectors.toMap(TpNonRealNameTicketRefundChoiceDTO::getVoucherTravelDate, Function.identity())); + + effectiveTimeVoucherMap.forEach((effectiveTime, v) -> { + TpNonRealNameTicketRefundChoiceDTO choiceDTO = nonRealNameTicketRefundChoiceDTOMap.get(effectiveTime); + if (ObjectUtil.isNull(choiceDTO)) { + LogUtil.error("当前数据异常,当前生效时间对应的凭证不存在,有效期为:{}", effectiveTime); + throw new TpTradeProdException(TpTradeProdErrorCode.DATA_INVALID, TpTradeProdErrorCode.DATA_INVALID.getDesc()); + } + Integer refundPassengerCount = choiceDTO.getRefundPassengerCount(); + + List voucherList = refundPassengerCountVoucherMap.get(refundPassengerCount); + if (CollectionUtils.isEmpty(voucherList)) { + refundPassengerCountVoucherMap.put(refundPassengerCount, Lists.newArrayList(v)); + } else { + voucherList.add(v); + refundPassengerCountVoucherMap.put(refundPassengerCount, voucherList); + } + }); + + return refundPassengerCountVoucherMap; + } + + public static List getRealNameNeedRefundVouchers(List voucherTravelDateList, List curPassengerAvailableVouchers) { + List actuallyRefundVoucherList = Lists.newArrayList(); + + voucherTravelDateList.forEach(travelDate -> { + String[] split = travelDate.split(GlobalConstants.HORIZONTAL_LINE); + Long refundEffectiveStartTime = Long.valueOf(split[0]); + Long refundEffectiveEndTime = Long.valueOf(split[1]); + List curTravelDateNeedRefundVouchers = curPassengerAvailableVouchers.stream() + .filter(v -> Objects.equals(v.getEffectiveStartTime(), refundEffectiveStartTime) && Objects.equals(v.getEffectiveEndTime(), refundEffectiveEndTime)) + .collect(Collectors.toList()); + + if (CollectionUtils.isEmpty(curTravelDateNeedRefundVouchers)) { + LogUtil.error("当前乘客当前的乘车日期没有可退的凭证,当前日期为:{},当前乘客的凭证列表为:{}", travelDate, JSONUtil.toJsonStr(curPassengerAvailableVouchers)); + throw new TpTradeProdException(TpTradeProdErrorCode.NOT_FOUND_REFUND_AVAILABLE_VOUCHER); + } + + actuallyRefundVoucherList.addAll(curTravelDateNeedRefundVouchers); + }); + + return actuallyRefundVoucherList; + } + + /** + * 计算滚动发车凭证的首站发车时间 + * + * @param roundTrip + * @param voucherList + * @param routeRollTimeDetail + * @return + */ + public static List calculateRollTimeRouteVoucherDepartureTime(String roundTrip, List voucherList, RouteRollTimeDetailDTO routeRollTimeDetail) { + List departureTimeList = Lists.newArrayList(); + if (StringUtils.equals(roundTrip, RouteConstants.GO)) { + List goRollTimes = routeRollTimeDetail.getGoRollTimes(); + Assert.notEmpty(goRollTimes, "去程时间不能为空"); + List sortedRollTimes = goRollTimes.stream().sorted(Comparator.comparing(RollTimeDTO::getOrder)).collect(Collectors.toList()); + String firstTime = sortedRollTimes.get(0).getFirstTime(); + voucherList.forEach(voucherDTO -> { + Long effectiveStartTime = voucherDTO.getEffectiveStartTime(); + Long departureTime = TimeConvertUtil.convertDateAndTime2Timestamp(effectiveStartTime, firstTime); + departureTimeList.add(departureTime); + }); + } else if (StringUtils.equals(roundTrip, RouteConstants.BACK)) { + List backRollTimes = routeRollTimeDetail.getBackRollTimes(); + Assert.notEmpty(backRollTimes, "返程时间不能为空"); + List sortedRollTimes = backRollTimes.stream().sorted(Comparator.comparing(RollTimeDTO::getOrder)).collect(Collectors.toList()); + String firstTime = sortedRollTimes.get(0).getFirstTime(); + voucherList.forEach(voucherDTO -> { + Long effectiveStartTime = voucherDTO.getEffectiveStartTime(); + Long departureTime = TimeConvertUtil.convertDateAndTime2Timestamp(effectiveStartTime, firstTime); + departureTimeList.add(departureTime); + }); + } else { + // 往返程滚动发车订单 需要根据tripType来区分去程还是返程 + voucherList.forEach(voucherDTO -> { + Long departureTime; + Long effectiveStartTime = voucherDTO.getEffectiveStartTime(); + if (StringUtils.equals(voucherDTO.getTripType(), TpTripTypeEnum.GO.getCode())) { + List goRollTimes = routeRollTimeDetail.getGoRollTimes(); + Assert.notEmpty(goRollTimes, "去程时间不能为空"); + List sortedRollTimes = goRollTimes.stream().sorted(Comparator.comparing(RollTimeDTO::getOrder)).collect(Collectors.toList()); + String firstTime = sortedRollTimes.get(0).getFirstTime(); + departureTime = TimeConvertUtil.convertDateAndTime2Timestamp(effectiveStartTime, firstTime); + } else { + List backRollTimes = routeRollTimeDetail.getBackRollTimes(); + Assert.notEmpty(backRollTimes, "返程时间不能为空"); + List sortedRollTimes = backRollTimes.stream().sorted(Comparator.comparing(RollTimeDTO::getOrder)).collect(Collectors.toList()); + String firstTime = sortedRollTimes.get(0).getFirstTime(); + departureTime = TimeConvertUtil.convertDateAndTime2Timestamp(effectiveStartTime, firstTime); + } + + departureTimeList.add(departureTime); + }); + } + + return departureTimeList; + } +} diff --git a/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/resources/config/flow.el.xml b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/resources/config/flow.el.xml new file mode 100644 index 0000000..f1eba64 --- /dev/null +++ b/tptradeprod-biz/tptradeprod-biz-service-impl/src/main/resources/config/flow.el.xml @@ -0,0 +1,546 @@ + + + + + + THEN( + WHEN(rescheduleOrderDetailQueryNode, rescheduleVoucherQueryNode, rescheduleProductDetailQueryNode), + rescheduleVoucherTimeCheckNode + ); + + + + + THEN( + WHEN(placeOrderProductCheckNode, rescheduleInquireCheckNode), invalidVoucherCheckNode, freezeInventoryNode, + rescheduleOrderNode, buildVoucherNode, paidOrderStatusNode, WHEN(deductInventoryNode).ignoreError(true) + ); + + + + THEN( + THEN( + WHEN(orderDetailQueryNode, productDetailQueryNode, refundApplyOrderQueryNode), + voucherQueryNode, + voucherVerificationRecordQueryNode + ), + WHEN(basicCheckNode, refundAmountCheckNode, refundCountRuleCheckNode, refundTimeRuleCheckNode), + THEN(refundChangeOrderStatusNode, createRefundApplyOrderNode, voucherInvalidNode, paymentRefundNode) + ); + + + + THEN( + THEN( + WHEN(orderDetailQueryNode, productDetailQueryNode, queryPayOrderNode), voucherQueryNode + ), + THEN( + WHEN(basicCheckNode, refundCountRuleCheckNode, refundTimeRuleCheckNode, refundVoucherStatusCheckNode), + calculateRefundAmountNode + ) + ); + + + + THEN( + THEN( + WHEN(orderDetailQueryNode, productDetailQueryNode), + voucherQueryNode + ), + THEN(refundButtonShowableBasicCheckNode, IF(refundButtonShowableNeedInvokeRuleNode, refundTimeRuleCheckNode)) + ); + + + + THEN( + THEN( + WHEN(orderDetailQueryNode, productDetailQueryNode, refundApplyOrderQueryNode), + voucherQueryNode, + voucherVerificationRecordQueryNode + ), + WHEN(basicCheckNode, refundCountRuleCheckNode, refundTimeRuleCheckNode) + ); + + + + THEN( + WHEN(orderDetailQueryNode, productDetailQueryNode), + availableRefundVoucherQueryNode, refundTimeRuleCheckNode + ); + + + + + THEN(placeOrderProductCheckNode, + SWITCH(orderBusinessTypeCheckNode).TO( + // 定制公交流程 + userPlaceOrderCustomBusFlow, + // 预约包车流程 + userPlaceOrderCharterBusFlow, + // 拼车流程 + userPlaceOrderCarpoolBusFlow + ) + ); + + + + + THEN( + WHEN(queryOrderNode, queryOrderChangeAuditNode), + WHEN(placeOrderProductCheckNode, charterBusInquireCheckNode, charterBusInternalPriceInquireNode), + prepareOrderNode,createOrderNode,changeOrderRecordServiceChargeNode, + IF(orderChangeNeedAudit, orderDiffNode) + ); + + + + // 定制公交流程 + // IF(orderIsNeedInquireCheckNode, + // THEN(inquireCheckNode, IF(freeTicketCheckNode, freeTicketFlow, needPayTicketFlow)), + // freeTicketFlow + // ); + THEN(inquireCheckNode, IF(freeTicketCheckNode, freeTicketFlow, needPayTicketFlow)); + + + + + THEN(createOrderNode, freezeInventoryNode, freeOrderPaidSendSyncMessageNode); + + + + + THEN(createOrderNode, freezeInventoryNode, carpoolSendSyncMessageNode); + + + + + THEN(createOrderNode, freezeInventoryNode, needPayOrderStatusNode, customBusSendDelayMessageNode); + + + + + THEN( + WHEN(charterBusInquireCheckNode, charterBusInternalPriceInquireNode), + SWITCH(orderPayModeCheckNode).TO( + // 先享后付模式 + userPayAfterUseFlow, + // 先付后享模式 + userPayBeforeUseFlow + ) + ); + + + + + THEN( + createOrderNode, + IF(orderIsNeedConfirmCheckNode, + // 需要审核,推进到待审核 + THEN(orderCreateApplyCreateNode, orderNeedConfirmNode, WHEN(remindAuditorNode).ignoreError(true)), + // 无需审核,推进到待派车状态 + THEN(orderCreateApplyCreateNode, WHEN(needDispatchStatusNode, tripSyncNode)) + ) + ); + + + + + IF(orderIsNeedConfirmCheckNode, + // 需要审核,推进到待审核节点 + THEN(createOrderNode, orderCreateApplyCreateNode, orderNeedConfirmNode, remindAuditorNode), + // 无需审核 创建订单 -> 推进到审核通过节点 -> 创建订金订单 -> 推进到订金待支付 -> 拉取收银台 + THEN(createOrderNode, orderCreateApplyCreateNode, createDepositOrderNode, depositNeedPayNode, orderPrePayNode) + ); + + + + + IF(carpoolCheckPosSourceNode, carpoolOrderWithoutPayFlow, THEN(inquireCheckNode, IF(freeTicketCheckNode, carpoolOrderWithoutPayFlow, needPayTicketFlow))); + + + + + THEN(buildVoucherNode, paidOrderStatusNode, deductInventoryNode); + + + + + THEN(buildVoucherNode, paidOrderStatusNode, deductInventoryNode); + + + + + // 判断当前支付类型,是订金支付还是尾款支付 + SWITCH(orderPaidBizTypeCheckNode).TO( + userCharterBusDepositPaidFlow, + userCharterBusBalancePaidFlow + ); + + + + + // 订单状态推进为订金已支付 + // 更新订单费用记录 + // 同步调度系统 + // 推进到待派车节点 + THEN(pushDepositPaidNode, updateChargeRecordNode, pushNeedDispatchNode, tripSyncNode); + + + + + // 订单状态推进结束 取消订单已支付 / 尾款已支付 + THEN(pushBalancePaidNode); + + + + + // 校验是否需审核 + // 保存取消的价格记录 + // 需要审核状态推进至取消订单待审核状态 + // 无需审核 计算该订单手续费,并推进是支付还是退款 + IF(cancelCheckIsAuditNode, cancelOrderNeedConfirmNode, cancelCheckRefundOrPayNode); + + + + + SWITCH(orderConfirmBizTypeSwitchNode).TO( + // 订单创建审核确认流程 + orderCreateAuditConfirmFlow, + // 订单取消审核确认流程 + orderCancelAuditConfirmFlow, + // 订单变更审核确认流程 + orderChangeAuditConfirmFlow + ); + + + + + SWITCH(orderConfirmAuditApprovedSwitchNode).TO( + // 订单创建审核拒绝流程 + orderCreateConfirmApprovedRejectFlow, + // 订单创建审核超时流程 + orderCreateConfirmApprovedTimeOutFlow, + // 订单创建审核通过 + orderCreateConfirmApprovedSuccessFlow + ); + + + + + THEN(orderConfirmQueryApplyDetailNode,orderConfirmQueryAuditDetailNode, + IF(orderAuditConfirmCheckNode, + THEN(orderConfirmUpdateAuditApprovedNode,orderConfirmUpdateApplyStatusNode,orderConfirmChangePriceAndPayModeNode) + ),WHEN(THEN(applySmsSendPrepareNode,sendSmsNode)).ignoreError(true) + ); + + + + + THEN(orderConfirmQueryApplyDetailNode,orderConfirmQueryAuditDetailNode, + IF(orderAuditConfirmCheckNode, + THEN(orderConfirmUpdateAuditApprovedNode,orderConfirmUpdateApplyStatusNode,createConfirmAuditTimeOutNode) + ) + ); + + + + + THEN(orderConfirmQueryApplyDetailNode,orderConfirmQueryAuditDetailNode, + IF(orderAuditConfirmCheckNode, + THEN(orderConfirmUpdateAuditApprovedNode,orderConfirmDispatchFleetNode,orderConfirmUpdateApplyStatusNode,orderConfirmChangePriceAndPayModeNode,orderConfirmReceiveOrderNode, + SWITCH(orderAuditCheckOrderStatusNode).TO(orderAuditFirstConfirmFlow, orderAuditCancelConfirmFlow)) + ),WHEN(THEN(applySmsSendPrepareNode,sendSmsNode)).ignoreError(true) + ); + + + + + SWITCH(orderConfirmAuditApprovedSwitchNode).TO( + // 订单取消审核拒绝流程 + orderCancelConfirmApprovedRejectFlow, + // 订单取消超时流程 + orderCancelApprovedTimeOutFlow, + // 订单取消审核通过-选择全额减免手续费流程 + orderCancelConfirmApprovedNonFullReductionFlow, + // 订单取消审核通过-未选择全额减免手续费流程 + orderCancelConfirmApprovedFullReductionFlow + ); + + + + + + THEN(orderConfirmQueryApplyDetailNode,orderConfirmQueryAuditDetailNode, + IF(orderAuditConfirmCheckNode, + THEN(orderConfirmUpdateAuditApprovedNode,orderConfirmUpdateApplyStatusNode,orderConfirmChangePriceAndPayModeNode) + ),WHEN(THEN(applySmsSendPrepareNode,sendSmsNode)).ignoreError(true) + ); + + + + + THEN(orderConfirmQueryApplyDetailNode,orderConfirmQueryAuditDetailNode, + SWITCH(orderCancelApprovedTimeOutSwitchNode).TO( + // 订单取消超时-无需减免手续费流程 + orderCancelApprovedTimeOutNonRscFlow, + // 订单取消超时-选择全额减免手续费流程 + orderCancelApprovedTimeOutFullRscFlow + ) + ); + + + + + IF(orderAuditConfirmCheckNode, + THEN(orderConfirmUpdateAuditApprovedNode,orderConfirmUpdateApplyStatusNode,orderConfirmChangePriceAndPayModeNode) + ); + + + + THEN( IF(orderAuditConfirmCheckNode, + THEN(orderConfirmUpdateAuditApprovedNode,orderConfirmUpdateApplyStatusNode,orderCancelTimeoutChangePriceAndPayModeNode, + SWITCH(orderAuditCheckOrderStatusNode).TO(orderAuditFirstConfirmFlow, orderAuditCancelConfirmFlow)) + ),WHEN(THEN(applySmsSendPrepareNode,sendSmsNode)).ignoreError(true) + ); + + + + + + THEN(orderConfirmQueryApplyDetailNode,orderConfirmQueryAuditDetailNode, + IF(orderAuditConfirmCheckNode, + THEN(orderConfirmUpdateAuditApprovedNode,orderConfirmUpdateApplyStatusNode,orderConfirmChangePriceAndPayModeNode, + SWITCH(orderAuditCheckOrderStatusNode).TO(orderAuditFirstConfirmFlow, orderAuditCancelConfirmFlow)) + ),WHEN(THEN(applySmsSendPrepareNode,sendSmsNode)).ignoreError(true) + ); + + + + + THEN(orderConfirmQueryApplyDetailNode,orderConfirmQueryAuditDetailNode, + IF(orderAuditConfirmCheckNode, + THEN(orderConfirmUpdateAuditApprovedNode,orderConfirmCreateRscAuditNode,orderConfirmUpdateApplyStatusRscNode) + ) + ); + + + + + + SWITCH(orderConfirmAuditApprovedSwitchNode).TO( + // 订单变更审核拒绝流程 + orderChangeConfirmApprovedRejectFlow, + // 订单变更审核超时流程 + orderChangeConfirmApprovedTimeOutFlow, + // 订单变更审核通过-未选择减免手续费流程 + orderChangeConfirmApprovedSuccessNoneReductionFlow, + // 订单变更审核通过-选择全额减免手续费流程 + orderChangeConfirmApprovedSuccessSingleReductionFlow + ); + + + + + THEN(orderConfirmQueryApplyDetailNode,orderConfirmQueryAuditDetailNode, + IF(orderAuditConfirmCheckNode, + THEN(orderConfirmUpdateAuditApprovedNode,orderConfirmUpdateApplyStatusNode,orderConfirmChangePriceAndPayModeNode) + ),WHEN(THEN(applySmsSendPrepareNode,sendSmsNode)).ignoreError(true) + ); + + + + + THEN(orderConfirmQueryApplyDetailNode,orderConfirmQueryAuditDetailNode, + IF(orderAuditConfirmCheckNode, + THEN(orderConfirmUpdateAuditApprovedNode,orderConfirmUpdateApplyStatusNode,orderConfirmChangePriceAndPayModeNode) + ) + ); + + + + + THEN(orderConfirmQueryApplyDetailNode,orderConfirmQueryAuditDetailNode, + IF(orderAuditConfirmCheckNode, + THEN(orderConfirmUpdateAuditApprovedNode,orderConfirmDispatchFleetNode,orderConfirmUpdateApplyStatusNode,orderConfirmChangePriceAndPayModeNode, + SWITCH(orderAuditCheckOrderStatusNode).TO(orderAuditFirstConfirmFlow, orderAuditCancelConfirmFlow, orderAuditChangeConfirmNoneReductionFlow)) + ),WHEN(THEN(applySmsSendPrepareNode,sendSmsNode)).ignoreError(true) + ); + + + + + THEN(orderConfirmQueryApplyDetailNode,orderConfirmQueryAuditDetailNode, + IF(orderAuditConfirmCheckNode, + THEN(orderConfirmUpdateAuditApprovedNode,orderConfirmDispatchFleetNode,orderConfirmCreateRscAuditNode,orderConfirmUpdateApplyStatusRscNode) + ),WHEN(THEN(applySmsSendPrepareNode,sendSmsNode)).ignoreError(true) + ); + + + + + SWITCH(rscConfirmBizTypeSwitchNode).TO( + // 订单取消减免服务费审核确认流程 + orderCancelServiceChargeReduceConfirmFlow, + // 订单变更减免服务费审核确认流程 + orderChangeServiceChargeReduceConfirmFlow + ); + + + + + SWITCH(rscConfirmApprovedSwitchNode).TO( + // 订单减免服务费审核确认拒绝流程 + orderCancelServiceChargeReduceApprovedRejectFlow, + // 订单减免服务费审核确认超时流程 + orderCancelServiceChargeReduceApprovedTimeOutFlow, + // 订单减免服务费审核确认通过流程 + orderCancelServiceChargeReduceApprovedSuccessFlow + ); + + + + + THEN(rscConfirmQueryAuditDetailNode,rscConfirmQueryApplyDetailNode, + IF(rscConfirmCheckNode, + THEN(rscConfirmSaveAuditApprovedResultNode,rscConfirmSubmitApplyApprovedResultNode,rscConfirmUpdatePriceAndPayModeNode,orderCancelDoubleConfirmNode) + ) + ); + + + + + THEN(rscConfirmQueryAuditDetailNode,rscConfirmQueryApplyDetailNode, + IF(rscConfirmCheckNode, + THEN(rscConfirmSaveAuditApprovedResultNode,rscConfirmSubmitApplyApprovedResultNode,rscConfirmUpdatePriceAndPayModeNode,orderCancelDoubleConfirmNode) + ) + ); + + + + + THEN(rscConfirmQueryAuditDetailNode,rscConfirmQueryApplyDetailNode, + IF(rscConfirmCheckNode, + THEN(rscConfirmSaveAuditApprovedResultNode,rscConfirmSubmitApplyApprovedResultNode,rscConfirmUpdatePriceAndPayModeNode,orderCancelDoubleConfirmNode) + ) + ); + + + + + + SWITCH(rscConfirmApprovedSwitchNode).TO( + // 订单变更减免服务费审核确认拒绝流程 + orderChangeServiceChargeReduceApprovedRejectFlow, + // 订单变更减免服务费审核确认超时流程 + orderChangeServiceChargeReduceApprovedTimeOutFlow, + // 订单变更减免服务费审核确认通过流程 + orderChangeServiceChargeReduceApprovedSuccessFlow + ); + + + + + THEN(rscConfirmQueryAuditDetailNode,rscConfirmQueryApplyDetailNode, + IF(rscConfirmCheckNode, + THEN(rscConfirmSaveAuditApprovedResultNode,rscConfirmSubmitApplyApprovedResultNode,rscConfirmUpdatePriceAndPayModeNode, orderAuditChangeConfirmReductionFlow) + ) + ); + + + + + THEN(rscConfirmQueryAuditDetailNode,rscConfirmQueryApplyDetailNode, + IF(rscConfirmCheckNode, + THEN(rscConfirmSaveAuditApprovedResultNode,rscConfirmSubmitApplyApprovedResultNode,rscConfirmUpdatePriceAndPayModeNode, orderAuditChangeConfirmReductionFlow) + ) + ); + + + + + THEN(rscConfirmQueryAuditDetailNode,rscConfirmQueryApplyDetailNode, + IF(rscConfirmCheckNode, + THEN(rscConfirmSaveAuditApprovedResultNode,rscConfirmSubmitApplyApprovedResultNode,rscConfirmUpdatePriceAndPayModeNode, orderAuditChangeConfirmReductionFlow) + ) + ); + + + + + + + SWITCH(orderChangedApplyCreateSwitchNode).TO( + // 订单变更申请单创建流程 + orderChangeApplyCreateFlow, + // 订单创建申请单创建流程 + orderCreateApplyCreateFlow, + // 订单取消申请单创建流程 + orderCancelApplyCreateFlow, + //订单结束确认费用申请单创建流程 + orderEndChargeConfirmFlow + ); + + + + + THEN(orderChangeApplyQueryDetailNode, + IF(orderCreateCheckNoneApplyNode, + THEN(orderChangeApplySaveNode,orderChangeApplyCreateAuditNode) + ) + ); + + + + + + THEN(orderChangeApplyQueryDetailNode, + IF(orderCreateCheckNoneApplyNode, + THEN(orderChangeApplySaveNode,orderChangeApplyCreateAuditNode,orderChangeApplyDispatchOrderNode) + ) + ); + + + + + THEN(orderChangeApplyQueryDetailNode, + IF(orderCreateCheckNoneApplyNode, + THEN(orderChangeApplySaveNode,orderChangeApplyCreateAuditNode) + ) + ); + + + + + THEN(orderChangeApplyQueryDetailNode, + IF(orderCreateCheckNoneApplyNode, + THEN(orderChangeApplySaveNode,orderChangeApplyCreateAuditNode,orderChangeApplyEndTripPriceConfirmNode) + ) + ); + + + + + THEN(firstConfirmedCheckPayModeNode); + + + + + THEN(orderChangeConfirmNoneReductionNode, WHEN(orderNoneReductionChangeSyncTripNode).ignoreError(true)); + + + + + THEN(orderChangeConfirmReductionNode, WHEN(orderChangeReductionSyncTripNode).ignoreError(true)); + + + + + THEN(orderCancelConfirmNode); + + + + + SWITCH(orderManualSyncTripCheckNode).TO(orderManualSyncTripCreateNode, orderManualSyncTripUpdateNode, orderManualSyncTripCancelNode); + + + \ No newline at end of file diff --git a/tptradeprod-common/pom.xml b/tptradeprod-common/pom.xml new file mode 100644 index 0000000..5c9a57d --- /dev/null +++ b/tptradeprod-common/pom.xml @@ -0,0 +1,21 @@ + + + 4.0.0 + + + com.deepinnet + tptradeprod + 1.0-SNAPSHOT + + + tptradeprod-common + pom + + tptradeprod-common-dal + tptradeprod-common-service + tptradeprod-common-util + + + diff --git a/tptradeprod-common/tptradeprod-common-dal/pom.xml b/tptradeprod-common/tptradeprod-common-dal/pom.xml new file mode 100644 index 0000000..fbc86e3 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-dal/pom.xml @@ -0,0 +1,62 @@ + + + 4.0.0 + + + com.deepinnet + tptradeprod-common + 1.0-SNAPSHOT + + + tptradeprod-common-dal + + + + org.mapstruct + mapstruct + + + + org.mapstruct + mapstruct-processor + + + + com.baomidou + mybatis-plus-boot-starter + + + + com.baomidou + mybatis-plus-generator + ${mybatis-plus.version} + + + + org.freemarker + freemarker + + + + com.deepinnet + tptradeprod-core-model + + + + com.deepinnet + tptradecore-common-service-facade + + + + com.deepinnet + tptradeprod-common-util + + + + org.bouncycastle + bcprov-jdk15on + + + diff --git a/tptradeprod-common/tptradeprod-common-dal/src/main/java/com/deepinnet/tptradeprod/common/dal/condition/task/UpdateTaskCondition.java b/tptradeprod-common/tptradeprod-common-dal/src/main/java/com/deepinnet/tptradeprod/common/dal/condition/task/UpdateTaskCondition.java new file mode 100644 index 0000000..5295a99 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-dal/src/main/java/com/deepinnet/tptradeprod/common/dal/condition/task/UpdateTaskCondition.java @@ -0,0 +1,24 @@ +package com.deepinnet.tptradeprod.common.dal.condition.task; + +import lombok.Data; + +/** + * @author amos wong + * @create 2022-11-24 19:02 + */ +@Data +public class UpdateTaskCondition { + private Long id; + + private String originalStatus; + + private String targetStatus; + + private Long triggerTime; + + private Integer retryCount; + + private Long executeTime; + + private String tenantId; +} diff --git a/tptradeprod-common/tptradeprod-common-dal/src/main/java/com/deepinnet/tptradeprod/common/dal/convert/task/TpScheduleTaskMapStructConvert.java b/tptradeprod-common/tptradeprod-common-dal/src/main/java/com/deepinnet/tptradeprod/common/dal/convert/task/TpScheduleTaskMapStructConvert.java new file mode 100644 index 0000000..bd59817 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-dal/src/main/java/com/deepinnet/tptradeprod/common/dal/convert/task/TpScheduleTaskMapStructConvert.java @@ -0,0 +1,25 @@ +package com.deepinnet.tptradeprod.common.dal.convert.task; + + +import com.deepinnet.tptradeprod.common.dal.dataobject.TpScheduleTaskDO; +import com.deepinnet.tptradeprod.core.model.task.TpScheduleTask; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; + +import java.util.List; + +/** + * @author amos wong + * @create 2023/7/26 11:03 + * @Description + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface TpScheduleTaskMapStructConvert { + TpScheduleTaskDO convert2DO(TpScheduleTask scheduleTask); + + List convert2DOList(List bizRuleList); + + TpScheduleTask convert2Domain(TpScheduleTaskDO scheduleTaskDO); + + List convert2DomainList(List scheduleTaskDOs); +} diff --git a/tptradeprod-common/tptradeprod-common-dal/src/main/java/com/deepinnet/tptradeprod/common/dal/dao/TpScheduleTaskDao.java b/tptradeprod-common/tptradeprod-common-dal/src/main/java/com/deepinnet/tptradeprod/common/dal/dao/TpScheduleTaskDao.java new file mode 100644 index 0000000..fe52540 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-dal/src/main/java/com/deepinnet/tptradeprod/common/dal/dao/TpScheduleTaskDao.java @@ -0,0 +1,13 @@ +package com.deepinnet.tptradeprod.common.dal.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.deepinnet.tptradeprod.common.dal.dataobject.TpScheduleTaskDO; + +/** + * @author amos wong + * @create 2023/8/16 13:53 + * @Description + */ +public interface TpScheduleTaskDao extends BaseMapper { + +} diff --git a/tptradeprod-common/tptradeprod-common-dal/src/main/java/com/deepinnet/tptradeprod/common/dal/dataobject/TpScheduleTaskDO.java b/tptradeprod-common/tptradeprod-common-dal/src/main/java/com/deepinnet/tptradeprod/common/dal/dataobject/TpScheduleTaskDO.java new file mode 100644 index 0000000..e93c7f6 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-dal/src/main/java/com/deepinnet/tptradeprod/common/dal/dataobject/TpScheduleTaskDO.java @@ -0,0 +1,49 @@ +package com.deepinnet.tptradeprod.common.dal.dataobject; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +@TableName("tp_schedule_task") +public class TpScheduleTaskDO { + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @TableField(value = "gmt_create") + private LocalDateTime gmtCreate; + + @TableField(value = "gmt_modified") + private LocalDateTime gmtModified; + + @TableField(value = "biz_no") + private String bizNo; + + @TableField(value = "task_type") + private String taskType; + + @TableField(value = "status") + private String status; + + @TableField(value = "source") + private String source; + + @TableField(value = "env") + private String env; + + @TableField(value = "trigger_time") + private Long triggerTime; + + @TableField(value = "execute_time") + private Long executeTime; + + @TableField(value = "retry_count") + private Integer retryCount; + + @TableField(value = "tenant_id") + private String tenantId; +} \ No newline at end of file diff --git a/tptradeprod-common/tptradeprod-common-dal/src/main/java/com/deepinnet/tptradeprod/common/dal/repository/task/TpScheduleTaskRepository.java b/tptradeprod-common/tptradeprod-common-dal/src/main/java/com/deepinnet/tptradeprod/common/dal/repository/task/TpScheduleTaskRepository.java new file mode 100644 index 0000000..d578cf9 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-dal/src/main/java/com/deepinnet/tptradeprod/common/dal/repository/task/TpScheduleTaskRepository.java @@ -0,0 +1,23 @@ +package com.deepinnet.tptradeprod.common.dal.repository.task; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.deepinnet.tptradeprod.common.dal.condition.task.UpdateTaskCondition; +import com.deepinnet.tptradeprod.common.dal.dataobject.TpScheduleTaskDO; +import com.deepinnet.tptradeprod.core.model.task.TpScheduleTask; + +import java.util.List; + +/** + * @author amos wong + * @create 2023/9/5 09:54 + * @Description + */ +public interface TpScheduleTaskRepository extends IService { + boolean batchSave(List scheduleTasks); + + TpScheduleTask getTaskById(Long taskId); + + List getAllByTypeAndStatusAndTriggerTime(List types, List statusList, Long triggerTime, Integer limitCount); + + boolean updateTaskByCondition(UpdateTaskCondition updateTaskCondition); +} diff --git a/tptradeprod-common/tptradeprod-common-dal/src/main/java/com/deepinnet/tptradeprod/common/dal/repository/task/impl/TpScheduleTaskRepositoryImpl.java b/tptradeprod-common/tptradeprod-common-dal/src/main/java/com/deepinnet/tptradeprod/common/dal/repository/task/impl/TpScheduleTaskRepositoryImpl.java new file mode 100644 index 0000000..b86f7f0 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-dal/src/main/java/com/deepinnet/tptradeprod/common/dal/repository/task/impl/TpScheduleTaskRepositoryImpl.java @@ -0,0 +1,73 @@ +package com.deepinnet.tptradeprod.common.dal.repository.task.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.deepinnet.tptradeprod.common.dal.condition.task.UpdateTaskCondition; +import com.deepinnet.tptradeprod.common.dal.convert.task.TpScheduleTaskMapStructConvert; +import com.deepinnet.tptradeprod.common.dal.dao.TpScheduleTaskDao; +import com.deepinnet.tptradeprod.common.dal.dataobject.TpScheduleTaskDO; +import com.deepinnet.tptradeprod.common.dal.repository.task.TpScheduleTaskRepository; +import com.deepinnet.tptradeprod.core.model.task.TpScheduleTask; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Repository; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author amos wong + * @create 2023/9/5 09:54 + * @Description + */ +@Repository +public class TpScheduleTaskRepositoryImpl extends ServiceImpl implements TpScheduleTaskRepository { + + @Resource + private TpScheduleTaskMapStructConvert taskConvert; + + private static final String LIMIT_SQL = " LIMIT "; + + @Override + public boolean batchSave(List scheduleTasks) { + if (CollectionUtils.isEmpty(scheduleTasks)) { + return false; + } + + return super.saveBatch(taskConvert.convert2DOList(scheduleTasks)); + } + + @Override + public TpScheduleTask getTaskById(Long taskId) { + TpScheduleTaskDO taskDO = super.getById(taskId); + return taskDO == null ? null : taskConvert.convert2Domain(taskDO); + } + + @Override + public List getAllByTypeAndStatusAndTriggerTime(List types, List statusList, Long triggerTime, Integer limitCount) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(TpScheduleTaskDO.class) + .in(TpScheduleTaskDO::getTaskType, types) + .lt(TpScheduleTaskDO::getTriggerTime, triggerTime) + .in(TpScheduleTaskDO::getStatus, statusList) + .orderByAsc(TpScheduleTaskDO::getTriggerTime) + .last(LIMIT_SQL + limitCount); + List taskDOs = super.list(wrapper); + return CollectionUtils.isEmpty(taskDOs) ? null : taskConvert.convert2DomainList(taskDOs); + } + + @Override + public boolean updateTaskByCondition(UpdateTaskCondition updateTaskCondition) { + LambdaUpdateWrapper updateWrapper = Wrappers.lambdaUpdate(TpScheduleTaskDO.class) + .set(updateTaskCondition.getExecuteTime() != null, TpScheduleTaskDO::getExecuteTime, updateTaskCondition.getExecuteTime()) + .set(StringUtils.isNotEmpty(updateTaskCondition.getTargetStatus()), TpScheduleTaskDO::getStatus, updateTaskCondition.getTargetStatus()) + .set(updateTaskCondition.getRetryCount() != null, TpScheduleTaskDO::getRetryCount, updateTaskCondition.getRetryCount()) + .set(updateTaskCondition.getTriggerTime() != null, TpScheduleTaskDO::getTriggerTime, updateTaskCondition.getTriggerTime()) + .eq(TpScheduleTaskDO::getId, updateTaskCondition.getId()) + .eq(TpScheduleTaskDO::getStatus, updateTaskCondition.getOriginalStatus()) + .eq(TpScheduleTaskDO::getTenantId, updateTaskCondition.getTenantId()); + + return super.update(updateWrapper); + } +} diff --git a/tptradeprod-common/tptradeprod-common-service/pom.xml b/tptradeprod-common/tptradeprod-common-service/pom.xml new file mode 100644 index 0000000..f7b138a --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/pom.xml @@ -0,0 +1,19 @@ + + + 4.0.0 + + com.deepinnet + tptradeprod-common + 1.0-SNAPSHOT + + + tptradeprod-common-service + pom + + tptradeprod-common-service-facade + tptradeprod-common-service-integration + + + diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/pom.xml b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/pom.xml new file mode 100644 index 0000000..b753684 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/pom.xml @@ -0,0 +1,99 @@ + + + 4.0.0 + + com.deepinnet + tptradeprod-common-service-facade + 1.0.0.20240730.1-RELEASE + + + 3.5.2 + 11 + 11 + UTF-8 + 3.5.2 + + + + + + org.projectlombok + lombok + 1.18.24 + compile + + + + cn.hutool + hutool-all + 5.8.9 + compile + + + + io.swagger + swagger-annotations + 1.5.19 + compile + + + + org.springframework.boot + spring-boot-starter-validation + 2.6.11 + + + + com.deepinnet + tp-common-lang + 1.0.0.20231110.2-SNAPSHOT + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 11 + 11 + UTF-8 + + + + + maven-source-plugin + 3.0.1 + + true + + + + compile + + jar + + + + + + + + + + + rdc-releases + aliyun mvn release Repository + https://packages.aliyun.com/maven/repository/2283499-release-fXoFPE/ + + + rdc-snapshots + aliyun mvn snapshot Repository + https://packages.aliyun.com/maven/repository/2283499-snapshot-U7MepR/ + + + diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpAvailableRescheduleVoucherDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpAvailableRescheduleVoucherDTO.java new file mode 100644 index 0000000..c6f49b9 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpAvailableRescheduleVoucherDTO.java @@ -0,0 +1,57 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author amos wong + * @create 2024/7/5 13:52 + * @Description + */ +@Data +public class TpAvailableRescheduleVoucherDTO implements Serializable { + + /** + * 凭证编号 + */ + @ApiModelProperty(value = "凭证编号") + private String voucherNo; + + /** + * 售卖单元编号 + */ + @ApiModelProperty(value = "售卖单元编号") + private String salesUnitCode; + + /** + * 订单号 + */ + @ApiModelProperty(value = "订单号") + private String orderNo; + + /** + * 去返程 + */ + @ApiModelProperty(value = "去返程") + private String tripType; + + /** + * 凭证类型 + */ + @ApiModelProperty(value = "凭证类型:day-日票,week-周票,term-学期票,month-月票,year-年票") + private String type; + + /** + * 乘客信息 + */ + @ApiModelProperty(value = "乘客信息") + private TpVoucherPassengerDTO passenger; + + /** + * 可改签的人数 + */ + @ApiModelProperty(value = "可改签的人数") + private Integer availableReschedulePassengerCount; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpBillDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpBillDTO.java new file mode 100644 index 0000000..6ddd04a --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpBillDTO.java @@ -0,0 +1,76 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.*; + +import java.io.Serializable; +import java.util.Map; + +/** + * @author amos wong + * @create 2023/7/26 10:12 + * @Description 账单 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class TpBillDTO implements Serializable { + + private static final long serialVersionUID = 1000423962142912248L; + + /** + * 账单编号 + */ + @ApiModelProperty(value = "账单编号") + private String billNo; + + /** + * 账单金额 + */ + @ApiModelProperty(value = "账单金额") + private String amount; + + /** + * 订单号 + */ + @ApiModelProperty(value = "订单号") + private String orderNo; + + /** + * 支付单号 + */ + @ApiModelProperty(value = "支付单号") + private String payOrderNo; + + /** + * 账单状态 + */ + @ApiModelProperty(value = "账单状态") + private String status; + + /** + * 业务类型 + */ + @ApiModelProperty(value = "业务类型") + private String bizType; + + /** + * 账单类型 + */ + @ApiModelProperty(value = "账单类型") + private String billType; + + /** + * 备注 + */ + @ApiModelProperty(value = "备注") + private String remark; + + private String tenantId; + + /** + * 业务拓展字段 + */ + private Map bizData; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpCancelOrderDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpCancelOrderDTO.java new file mode 100644 index 0000000..e569ed0 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpCancelOrderDTO.java @@ -0,0 +1,34 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + *

+ * 取消订单 + *

+ * + * @author chenjiaju + * @since 2023/11/1 + */ +@Data +@ApiModel(value = "取消订单") +public class TpCancelOrderDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 用户编号 + */ + @ApiModelProperty(value = "用户编号") + private String userNo; + + /** + * 订单编号 + */ + @ApiModelProperty(value = "订单编号") + private String orderNo; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpChargeDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpChargeDTO.java new file mode 100644 index 0000000..e2c943b --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpChargeDTO.java @@ -0,0 +1,88 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.*; + +import java.io.Serializable; +import java.util.Map; + +/** + * @author amos wong + * @create 2023/7/26 10:14 + * @Description 计费单 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class TpChargeDTO implements Serializable { + + private static final long serialVersionUID = 6712342411054684634L; + + /** + * 计费单号 + */ + @ApiModelProperty(value = "计费单号") + private String chargeNo; + + /** + * 支付单号 + */ + @ApiModelProperty(value = "支付单号") + private String payOrderNo; + + /** + * 业务类型 + */ + @ApiModelProperty(value = "业务类型") + private String bizType; + + /** + * 计费标题 + */ + @ApiModelProperty(value = "计费标题") + private String title; + + /** + * 计费类型 + */ + @ApiModelProperty(value = "计费类型") + private String chargeType; + + /** + * 收退费金额 + */ + @ApiModelProperty(value = "收退费金额") + private String amount; + + /** + * 计费比例 + */ + @ApiModelProperty(value = "计费比例") + private String ratio; + + /** + * 收费主体id + */ + @ApiModelProperty(value = "收费主体id") + private String chargingEntityId; + + /** + * 收费主体类型 + */ + @ApiModelProperty(value = "收费主体类型") + private String chargingEntityType; + + /** + * 状态 + */ + @ApiModelProperty(value = "状态") + private String status; + + private String tenantId; + + /** + * 业务拓展字段 + */ + private Map bizData; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpFinancialAccountDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpFinancialAccountDTO.java new file mode 100644 index 0000000..9b2fd11 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpFinancialAccountDTO.java @@ -0,0 +1,83 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.*; + +import java.io.Serializable; +import java.util.Map; + +/** + * @author amos wong + * @create 2023/7/26 10:15 + * @Description 资金账号 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class TpFinancialAccountDTO implements Serializable { + + private static final long serialVersionUID = 1; + + /** + * 关联的业务单号 + */ + @ApiModelProperty(value = "关联的业务单号") + private String bizNo; + + /** + * 业务类型 + */ + @ApiModelProperty(value = "业务类型") + private String bizType; + + /** + * 账号类型:收款方或者付款方 + */ + @ApiModelProperty(value = "账号类型:收款方或者付款方") + private String accountType; + + /** + * 账号 + */ + @ApiModelProperty(value = "账号") + private String account; + + /** + * 账号名称 + */ + @ApiModelProperty(value = "账号名称") + private String accountName; + + /** + * 支付宝、微信、银行 + */ + @ApiModelProperty(value = "渠道:支付宝、微信、银行等") + private String channel; + + /** + * 卡机构id + */ + @ApiModelProperty(value = "卡机构id") + private String cardIssuerId; + + /** + * 开户行名称 + */ + @ApiModelProperty(value = "开户行名称") + private String bankName; + + /** + * 银行账号 + */ + @ApiModelProperty(value = "银行账号") + private String bankAccount; + + @ApiModelProperty(value = "租户id") + private String tenantId; + + /** + * 业务拓展字段 + */ + private Map bizData; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpNonRealNameTicketRefundChoiceDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpNonRealNameTicketRefundChoiceDTO.java new file mode 100644 index 0000000..31ad9ee --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpNonRealNameTicketRefundChoiceDTO.java @@ -0,0 +1,28 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 实名制退票选择的内容 + */ +@Data +public class TpNonRealNameTicketRefundChoiceDTO implements Serializable { + + /** + * 非实名制选择的退票乘客人数 + */ + @ApiModelProperty(value = "非实名制选择的退票乘客人数") + private Integer refundPassengerCount; + + @ApiModelProperty(value = "行程类型") + private String tripType; + + /** + * 选择的退票的乘车日期 + */ + @ApiModelProperty(value = "退订的凭证的乘车日期,开始时间戳_结束时间戳,如:1632297600000_1632384000000") + private String voucherTravelDate; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderAuditPriceInquiryDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderAuditPriceInquiryDTO.java new file mode 100644 index 0000000..6e5a84f --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderAuditPriceInquiryDTO.java @@ -0,0 +1,32 @@ +package com.deepinnet.tptradeprod.common.dto; + +import com.deepinnet.tptradeprod.common.enums.TpOrderAuditConfirmTypeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +public class TpOrderAuditPriceInquiryDTO implements Serializable { + + + /** + * 订单编码 + */ + @ApiModelProperty(value = "订单编码") + private String orderNo; + + + /** + * 订单确认审核类型 + * @see TpOrderAuditConfirmTypeEnum + */ + @ApiModelProperty(value = "订单确认审核类型") + private Integer orderAuditConfirmType; + + /** + * 租户id + */ + private String tenantId; + +} \ No newline at end of file diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderCancelDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderCancelDTO.java new file mode 100644 index 0000000..b0bd67d --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderCancelDTO.java @@ -0,0 +1,44 @@ +package com.deepinnet.tptradeprod.common.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + *

+ * 取消订单入参(预约包车取消订单使用原始订单编号) + *

+ * + * @author chenjiaju + * @since 2023/11/17 + */ + +@Data +public class TpOrderCancelDTO implements Serializable { + + /** + * 订单编号 + */ + private String orderNo; + + /** + * 是否为B端用户操作 + * true-B端用户操作 | false-C端用户操作 + */ + private Boolean backendUserOperation = Boolean.FALSE; + + /** + * 后台操作用户 + */ + private String backendUserNo; + + /** + * 原始订单编号 + */ + private String originalOrderNo; + + /** + * 租户ID + */ + private String tenantId; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderElementDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderElementDTO.java new file mode 100644 index 0000000..d4b31c4 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderElementDTO.java @@ -0,0 +1,46 @@ +package com.deepinnet.tptradeprod.common.dto; + + +import lombok.Data; + +import java.io.Serializable; + +/** + *

+ * 下单要素 + *

+ * + * @author taobinxian + * @since 2023/8/8 + */ +@Data +public class TpOrderElementDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 要素类型(下单 / 退款 / 改签) + */ + private Integer elementType; + + /** + * 要素code + */ + private String elementCode; + + /** + * 要素名称 + */ + private String elementName; + + /** + * 要素Key + */ + private String elementKey; + + /** + * 要素值 + */ + private String elementValue; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderPlacerDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderPlacerDTO.java new file mode 100644 index 0000000..8ee606b --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderPlacerDTO.java @@ -0,0 +1,36 @@ +package com.deepinnet.tptradeprod.common.dto; + + +import lombok.Data; + +import java.io.Serializable; + +/** + *

+ * 下单人 + *

+ * + * @author taobinxian + * @since 2023/8/8 + */ +@Data +public class TpOrderPlacerDTO implements Serializable { + + private static final long serialVersionUID = -8148089739381314981L; + + /** + * 下单人用户Id + */ + private String userId; + + /** + * 下单人姓名 + */ + private String placerName; + + /** + * 联系方式 + */ + private String placerContact; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderRefundDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderRefundDTO.java new file mode 100644 index 0000000..789b2ee --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderRefundDTO.java @@ -0,0 +1,34 @@ +package com.deepinnet.tptradeprod.common.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 退票请求对象 + * + * @author taobinxian + * @version 2023-08-07 + */ +@Data +public class TpOrderRefundDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 要退的订单号 + */ + private String orderNo; + + /** + * 退票原因 + */ + private String refundReason; + + /** + * 退票标的项 + */ + private List tpOrderSubjectItemList; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderRequirementUserDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderRequirementUserDTO.java new file mode 100644 index 0000000..369e754 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderRequirementUserDTO.java @@ -0,0 +1,43 @@ +package com.deepinnet.tptradeprod.common.dto; + + +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + *

+ * 用车方 + *

+ * + * @author taobinxian + * @since 2023/8/8 + */ + +@Data +public class TpOrderRequirementUserDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 用车人名称 + */ + private String requirementName; + + /** + * 用车需求方联系人名称 + */ + private String requirementContactName; + + /** + * 联系方式 + */ + private String requirementContact; + + /** + * 扩展字段 + */ + private Map bizData; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderRouteDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderRouteDTO.java new file mode 100644 index 0000000..af9bb0b --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderRouteDTO.java @@ -0,0 +1,67 @@ +package com.deepinnet.tptradeprod.common.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + *

+ * 线路 + *

+ * + * @author chenjiaju + * @since 2023-07-25 15:46:31 + */ +@Data +public class TpOrderRouteDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 线路编号 + */ + private String routeNo; + + /** + * 线路名称 + */ + private String routeName; + + /** + * 去程 / 返程 + */ + private String roundTrip; + + /** + * 营运日期 + */ + private String workTime; + + /** + * 时刻表 + */ + private String timeSchedule; + + /** + * 所属车队 + */ + private String belongFleet; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 扩展字段 + */ + private Map bizData; + + /** + * 班次 + */ + private List tpOrderRouteShuttle; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderRouteShuttleDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderRouteShuttleDTO.java new file mode 100644 index 0000000..e1e94e2 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderRouteShuttleDTO.java @@ -0,0 +1,51 @@ +package com.deepinnet.tptradeprod.common.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + *

+ * 班次 + *

+ * + * @author chenjiaju + * @since 2023-07-25 15:46:31 + */ +@Data +public class TpOrderRouteShuttleDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 线路编号 + */ + private String routeNo; + + /** + * 班次编号 + */ + private String shuttleNo; + + /** + * 班次名称 + */ + private String shuttleName; + + /** + * 班次发车时间 + */ + private String shuttleTime; + + /** + * 行程类型 + */ + private String tripType; + + /** + * 扩展字段 + */ + private Map bizData; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderStationDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderStationDTO.java new file mode 100644 index 0000000..3211329 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderStationDTO.java @@ -0,0 +1,126 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + *

+ * 站点信息(上车点,下车点) + *

+ * + * @author chenjiaju + * @since 2023/8/31 + */ + +@Data +public class TpOrderStationDTO implements Serializable { + + private static final long serialVersionUID = -1L; + + /** + * 行程单编号 + */ + @ApiModelProperty(value = "行程单编号") + private String tripNo; + + /** + * 上车点code + */ + @ApiModelProperty(value = "上车点code") + private String pickUpLocationCode; + + /** + * 上车点名称 + */ + @ApiModelProperty(value = "上车点名称") + private String pickUpLocation; + + /** + * 站点数量 + */ + @ApiModelProperty(value = "站点数量") + private Integer stationCount; + + /** + * 上车点经度 + */ + @ApiModelProperty(value = "上车点经度") + private String pickUpLng; + + /** + * 上车点纬度 + */ + @ApiModelProperty(value = "上车点纬度") + private String pickUpLat; + + /** + * 上车点时间 + */ + @ApiModelProperty(value = "上车点时间") + private String pickUpTime; + + /** + * 下车点code + */ + @ApiModelProperty(value = "下车点code") + private String dropOffLocationCode; + + /** + * 下车点名称 + */ + @ApiModelProperty(value = "下车点名称") + private String dropOffLocation; + + /** + * 下车点纬度 + */ + @ApiModelProperty(value = "下车点经度") + private String dropOffLng; + + /** + * 下车点经度 + */ + @ApiModelProperty(value = "下车点纬度") + private String dropOffLat; + + /** + * 上车点时间 + */ + @ApiModelProperty(value = "下车点时间") + private String dropOffTime; + + /** + * 里程 + */ + @ApiModelProperty(value = "里程") + private String miles; + + /** + * 天数,毫秒 + */ + @ApiModelProperty(value = "耗时") + private Long duration; + + /** + * 行程类型 + */ + @ApiModelProperty(value = "行程类型") + private String tripType; + + /** + * 停靠点 + */ + @ApiModelProperty(value = "停靠点") + private List pathPoints; + + /** + * 扩展字段 + */ + @ApiModelProperty(value = "扩展字段") + private Map bizData; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderSubjectItemDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderSubjectItemDTO.java new file mode 100644 index 0000000..5a42c01 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderSubjectItemDTO.java @@ -0,0 +1,99 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.*; + +/** + *

+ * 标的项 + *

+ * + * @author taobinxian + * @version 2023-08-07 + */ +@Data +public class TpOrderSubjectItemDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 标的编码 + */ + @ApiModelProperty(value = "标的项编码") + private String itemNo; + + /** + * 乘客编码 + */ + @ApiModelProperty(value = "乘客编码") + private String passengerNo; + + /** + * 乘客人数 + */ + @ApiModelProperty(value = "乘客人数") + private Integer passengerCount; + + /** + * 用车天数 + */ + @ApiModelProperty(value = "用车天数") + private Integer days; + + /** + * 是否包含司机食宿 + */ + @ApiModelProperty(value = "是否包含司机食宿") + private String includeDriverExpenses; + + /** + * 食宿费天数 + */ + @ApiModelProperty(value = "食宿费天数(询价用)") + private Integer lodgingDayNum; + + /** + * 行程类型 + */ + @ApiModelProperty(value = "行程类型") + private String tripType; + + /** + * 标的名称 + */ + @ApiModelProperty(value = "标的名称") + private String name; + + /** + * 标的类型 + */ + @ApiModelProperty(value = "标的类型") + private String type; + + /** + * 购买标的项数量 + */ + @ApiModelProperty(value = "标的项数量") + private Integer count; + + /** + * 扩展字段 + */ + private Map bizData; + + /** + * 乘客信息 + */ + @ApiModelProperty(value = "乘客信息") + private TpPassengerDTO passengerInfo; + + /** + * 标的项要素 + */ + @ApiModelProperty(value = "标的项要素") + private List subjectItemElements; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderSubjectItemElementDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderSubjectItemElementDTO.java new file mode 100644 index 0000000..4e48baf --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderSubjectItemElementDTO.java @@ -0,0 +1,50 @@ +package com.deepinnet.tptradeprod.common.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + *

+ * 标的项要素 + *

+ * + * @author taobinxian + * @version 2023-08-07 + */ +@Data +public class TpOrderSubjectItemElementDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 标的项编码 + */ + private String itemNo; + + /** + * 组成要素编码 + */ + private String elementCode; + + /** + * 要素名称 + */ + private String elementName; + + /** + * 要素值 + */ + private String elementValue; + + /** + * 要素单位 + */ + private String elementUnit; + + /** + * 扩展字段 + */ + private Map bizData; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderTargetServiceDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderTargetServiceDTO.java new file mode 100644 index 0000000..f815509 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderTargetServiceDTO.java @@ -0,0 +1,40 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + *

+ * 服务对象DTO + *

+ * + * @author chenjiaju + * @since 2023/8/1 + */ + +@Data +public class TpOrderTargetServiceDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 服务方名称 + */ + @ApiModelProperty(value = "服务方名称") + private String targetName; + + /** + * 服务方唯一编码 + */ + @ApiModelProperty(value = "服务方唯一编码") + private String targetNumber; + + /** + * bizData + */ + private Map bizData; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderUnverifiedQueryDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderUnverifiedQueryDTO.java new file mode 100644 index 0000000..b4702fc --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpOrderUnverifiedQueryDTO.java @@ -0,0 +1,39 @@ +package com.deepinnet.tptradeprod.common.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + *

+ * 未核验订单查询DTO + *

+ * + * @author chenjiaju + * @since 2023/8/18 + */ + +@Data +public class TpOrderUnverifiedQueryDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 线路编号 + */ + @NotNull + private String routeNo; + + /** + * 班次编号 + */ + private String shuttleNo; + + /** + * tenantId + */ + @NotNull + private String tenantId; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpPassengerDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpPassengerDTO.java new file mode 100644 index 0000000..92c2729 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpPassengerDTO.java @@ -0,0 +1,62 @@ +package com.deepinnet.tptradeprod.common.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + *

+ * 乘客信息 + *

+ * + * @author taobinxian + * @version 2023-08-07 + */ + +@Data +public class TpPassengerDTO implements Serializable { + + private static final long serialVersionUID = -7157914478824441426L; + + /** + * 乘客编号 + */ + private String passengerNo; + + /** + * 乘客姓名 + */ + private String passengerName; + + /** + * 乘客类型 + */ + private String passengerType; + + /** + * 联系方式 + */ + private String passengerContact; + + /** + * 乘客证件类型 + */ + private String identificationType; + + /** + * 乘客证件编号 + */ + private String identificationNumber; + + /** + * 乘客当前对应的售卖单元行程类型 + */ + private String tripType; + + /** + * 扩展字段 + */ + private Map bizData; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdAuditOrderListPagedQueryDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdAuditOrderListPagedQueryDTO.java new file mode 100644 index 0000000..caca913 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdAuditOrderListPagedQueryDTO.java @@ -0,0 +1,87 @@ +package com.deepinnet.tptradeprod.common.dto; + +import com.deepinnet.tp.common.lang.dto.BasePageQueryDTO; +import io.swagger.annotations.ApiModelProperty; +import lombok.*; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 订单全额退款审批单查询列表 + *

+ * + * @author xiehuaqiao + * @since 2023/12/16 + */ +@Data +@Builder +@EqualsAndHashCode(callSuper = true) +@AllArgsConstructor +@NoArgsConstructor +public class TpProdAuditOrderListPagedQueryDTO extends BasePageQueryDTO implements Serializable { + + private static final long serialVersionUID = -1L; + + + /** + * 子订单号 + */ + @Deprecated + @ApiModelProperty(value = "子订单号") + private String orderNo; + + + /** + * 原始订单编号 + */ + @ApiModelProperty(value = "原始订单编号") + private String originalOrderNo; + + /** + * 包车类型 + */ + @ApiModelProperty(value = "包车类型") + private String charterBusType; + + /** + * 所属审核单类型 + * 4, "定制包车订单创建审核" + * 5, "定制包车订单变更审核" + * 6, "定制包车订单取消审核 + * 7, "定制包车订单取消全额退款审核" + */ + @ApiModelProperty(value = "所属审核单类型") + private List auditTypes; + + /** + * 所属审核单状态 + * "waiting_approved", "待审核" + * "approved_success", "审核通过" + * "approved_reject", "审核未通过" + * "approved_timeout", "审批超时" + */ + @ApiModelProperty(value = "所属审核单状态") + private List auditStatus; + + /** + * 所属组织代码 + */ + @ApiModelProperty(value = "所属组织代码") + @Deprecated + private String orgCode; + + /** + * 所属组织代码列表 + */ + @ApiModelProperty(value = "所属组织代码") + private List orgCodes; + /** + * 租户ID + */ + @NotNull(message = "租户ID不能为空") + private String tenantId; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdBizRuleDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdBizRuleDTO.java new file mode 100644 index 0000000..1310c0d --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdBizRuleDTO.java @@ -0,0 +1,77 @@ +package com.deepinnet.tptradeprod.common.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + * @author amos wong + * @create 2023/9/13 11:08 + * @Description + */ +@Data +public class TpProdBizRuleDTO implements Serializable { + + private static final long serialVersionUID = 1; + + /** + * 关联的业务单号 + */ + private String bizNo; + + /** + * 业务规则代码 + */ + private String code; + + /** + * 业务规则名称 + */ + private String name; + + /** + * 业务类型 + */ + private String bizType; + + /** + * 规则类型 + */ + private String ruleType; + + /** + * 规则表达式 + */ + private String expression; + + /** + * 目标对象类型 + */ + private String targetObjType; + + /** + * 目标对象ID + */ + private String targetObjId; + + /** + * 规则分组 + */ + private String ruleGroup; + + /** + * 规则枚举 + */ + private String ruleEnum; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 拓展字段 + */ + private Map bizData; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdCalculateRefundAmountDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdCalculateRefundAmountDTO.java new file mode 100644 index 0000000..153289c --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdCalculateRefundAmountDTO.java @@ -0,0 +1,71 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.List; + +/** + * @author amos wong + * @create 2023/8/22 14:30 + * @Description + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class TpProdCalculateRefundAmountDTO implements Serializable { + + private static final long serialVersionUID = -2306662557857859648L; + + /** + * 订单编号 + */ + @NotBlank(message = "订单编号不能为空") + @ApiModelProperty(value = "订单编号") + private String orderNo; + + @NotBlank(message = "产品编号不能为空") + @ApiModelProperty(value = "产品编号") + private String productNo; + + /** + * 用户编号 + */ + @NotBlank(message = "用户编号不能为空") + @ApiModelProperty(value = "用户编号") + private String userNo; + + /** + * 是否是实名制退票 + */ + @NotBlank(message = "是否是实名制退票") + @ApiModelProperty(value = "是否是实名制退票") + private Boolean realNameRefund; + + @ApiModelProperty(value = "行程类型") + private String tripType; + + /** + * 实名制退票选择的内容 + */ + @ApiModelProperty(value = "实名制退票选择的内容") + private List realNameTicketRefundChoiceDTOs; + + /** + * 非实名制退票选择的内容 + */ + @ApiModelProperty(value = "非实名制退票选择的内容") + private List nonRealNameTicketChoiceDTOs; + + /** + * 租户id + */ + @NotBlank(message = "租户id不能为空") + private String tenantId; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdCharteredBusPricingParamDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdCharteredBusPricingParamDTO.java new file mode 100644 index 0000000..8b7bf18 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdCharteredBusPricingParamDTO.java @@ -0,0 +1,54 @@ +package com.deepinnet.tptradeprod.common.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + *

+ * 询价参数 + *

+ * + * @author chenjiaju + * @since 2023/11/21 + */ + +@Data +public class TpProdCharteredBusPricingParamDTO implements Serializable { + + /** + * 里程 + */ + private BigDecimal miles; + + /** + * 时长 + */ + private Long duration; + + /** + * 食宿费天数 + */ + private Integer lodgingDayNum; + + private Integer useCarDayNum; + + /** + * 车辆过夜天数 + */ + private Integer carOvernightDayNum; + + private Boolean provideLodging; + + + /** + * 行程开始时间 + */ + private Long travelTimeRangeLeft; + + /** + * 行程结束时间 + */ + private Long travelTimeRangeRight; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdCharteredPriceInquiryDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdCharteredPriceInquiryDTO.java new file mode 100644 index 0000000..d489a79 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdCharteredPriceInquiryDTO.java @@ -0,0 +1,46 @@ +package com.deepinnet.tptradeprod.common.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + *

+ * 包车询价参数 + *

+ * + * @author chenjiaju + * @since 2023/11/21 + */ + +@Data +public class TpProdCharteredPriceInquiryDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 定价规则入参列表 + */ + private TpProdCharteredBusPricingParamDTO pricingParam; + + /** + * 售卖单元编号 + */ + private String salesUnitCode; + + /** + * 行程类型(go,back,round) + */ + private String tripType; + + /** + * 购买数量 + */ + private Integer count; + + /** + * 扩展字段 + */ + private Map bizData; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdCheckSuccessCallbackDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdCheckSuccessCallbackDTO.java new file mode 100644 index 0000000..a89d4d4 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdCheckSuccessCallbackDTO.java @@ -0,0 +1,39 @@ +package com.deepinnet.tptradeprod.common.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author amos wong + * @create 2024/5/21 14:29 + * @Description + */ +@Data +public class TpProdCheckSuccessCallbackDTO implements Serializable { + + /** + * 卡号 + */ + private String cardNo; + + /** + * 金额 + */ + private String amount; + + /** + * 外部交易号 + */ + private String outTradeNo; + + /** + * 核销时间 + */ + private Long checkInTime; + + /** + * 核销类型 + */ + private Integer checkInType; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdDispatchOrderReceivedDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdDispatchOrderReceivedDTO.java new file mode 100644 index 0000000..57dc615 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdDispatchOrderReceivedDTO.java @@ -0,0 +1,101 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.Map; + + +/** + * 订单接单请求对象 + * + * @author xiehuaqiao + * @version 2023-11-20 + */ +@Data +@Builder +public class TpProdDispatchOrderReceivedDTO implements Serializable { + + + /** + * 派单单号 + */ + @ApiModelProperty(value = "派单单号") + @NotBlank(message = "派单单号不能为空") + private String dispatchNo; + + /** + * 子订单单号 + */ + @ApiModelProperty(value = "子订单单号") + @Deprecated + private String orderNo; + + /** + * 原始订单编号 + */ + @ApiModelProperty(value = "原始订单编号") + private String originalOrderNo; + /** + * 接单组织编号 + */ + @ApiModelProperty(value = "接单组织编号") + private String orgNo; + + /** + * 接单组织名称 + */ + @ApiModelProperty(value = "接单组织名称") + private String orgName; + + /** + * 接单人编号 + */ + @ApiModelProperty(value = "接单人编号") + @NotBlank(message = "接单人编号不能为空") + private String receiverNo; + + /** + * 接单人名称 + */ + @ApiModelProperty(value = "接单人名称") + @NotBlank(message = "接单人名称不能为空") + private String receiverName; + + /** + * 接单时间 + */ + @ApiModelProperty(value = "接单时间") + @NotBlank(message = "接单时间不能为空") + private Long receivedTime = System.currentTimeMillis(); + + /** + * 原始派单单据状态 + */ + @ApiModelProperty(value = "原始派单单据状态") + @NotBlank(message = "原始派单单据状态不能为空") + private String originalDispatchStatus; + + /** + * 目标派单单据状态 + */ + @ApiModelProperty(value = "目标派单单据状态") + @NotBlank(message = "目标派单单据状态不能为空") + private String targetDispatchStatus; + + /** + * 业务扩展字段 + */ + @ApiModelProperty(value = "业务扩展字段") + private Map bizData; + /** + * 租户id + */ + @NotBlank(message = "租户id不能为空") + private String tenantId; + + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdEndorseOrderCreateDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdEndorseOrderCreateDTO.java new file mode 100644 index 0000000..a11e425 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdEndorseOrderCreateDTO.java @@ -0,0 +1,16 @@ +package com.deepinnet.tptradeprod.common.dto; + +import lombok.Data; + +/** + * @author taobinxian + * @version 2023-08-07 + */ +@Data +public class TpProdEndorseOrderCreateDTO extends TpProdOrderCreateDTO { + /** + * 改签的订单号 + */ + private String orderNo; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdInvalidVoucherDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdInvalidVoucherDTO.java new file mode 100644 index 0000000..3928d81 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdInvalidVoucherDTO.java @@ -0,0 +1,23 @@ +package com.deepinnet.tptradeprod.common.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author amos wong + * @create 2024/7/8 17:51 + * @Description + */ +@Data +public class TpProdInvalidVoucherDTO implements Serializable { + /** + * 需要失效的凭证编号 + */ + private String voucherNo; + + /** + * 需要失效的乘车人数 + */ + private Integer invalidPassengerCount; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdMngVerificationRecordQueryDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdMngVerificationRecordQueryDTO.java new file mode 100644 index 0000000..ed27078 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdMngVerificationRecordQueryDTO.java @@ -0,0 +1,58 @@ +package com.deepinnet.tptradeprod.common.dto; + +import com.deepinnet.tp.common.lang.dto.BasePageQueryDTO; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @author amos wong + * @create 2024/3/12 11:40 + * @Description + */ +@Data +public class TpProdMngVerificationRecordQueryDTO extends BasePageQueryDTO implements Serializable { + @ApiModelProperty(value = "乘车时间-开始时间") + private Long startTime; + + @ApiModelProperty(value = "乘车时间-结束时间") + private Long endTime; + + @ApiModelProperty(value = "订单编号") + private String orderNo; + + @ApiModelProperty(value = "线路名称") + private String routeName; + + @ApiModelProperty(value = "用户手机号") + private String phone; + + @ApiModelProperty(value = "服务对象编号") + private String targetNumber; + + @ApiModelProperty(value = "用户编号") + private List userNos; + + @ApiModelProperty(value = "班次时间") + private String shuttleTime; + + @ApiModelProperty(value = "产品类目编号") + private String productCategoryNo; + + @ApiModelProperty(value = "线路code") + private String routeCode; + + @ApiModelProperty(value = "乘客姓名") + private String passengerName; + + @ApiModelProperty(value = "凭证类型") + private List voucherType; + + @ApiModelProperty(value = "往返类型") + private String tripType; + + @ApiModelProperty(value = "租户id") + private String tenantId; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdNonRealNamePassengerAvailableRefundDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdNonRealNamePassengerAvailableRefundDTO.java new file mode 100644 index 0000000..02c55b2 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdNonRealNamePassengerAvailableRefundDTO.java @@ -0,0 +1,24 @@ +package com.deepinnet.tptradeprod.common.dto; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class TpProdNonRealNamePassengerAvailableRefundDTO implements Serializable { + + /** + * 凭证的乘车日期,开始时间戳_结束时间戳,如:1632297600000_1632384000000 + */ + private String voucherTravelDate; + + /** + * 当前乘车日期对应的最大乘车人数 + */ + private Integer passengerCount; + + /** + * 行程类型 + */ + private String tripType; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderAuditConfirmDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderAuditConfirmDTO.java new file mode 100644 index 0000000..b717155 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderAuditConfirmDTO.java @@ -0,0 +1,165 @@ +package com.deepinnet.tptradeprod.common.dto; + +import com.deepinnet.tptradeprod.common.enums.TpOrderAuditConfirmTypeEnum; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDispatchJoinFleetVO; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + + +/** + * 订单确认请求对象 + * + * @author xiehuaqiao + * @version 2023-11-20 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class TpProdOrderAuditConfirmDTO implements Serializable { + + private static final long serialVersionUID = 8546090229490509067L; + + /** + * 子订单单号 + */ + @ApiModelProperty(value = "子订单单号") + @Deprecated + private String orderNo; + + /** + * 原始订单编号 + */ + @ApiModelProperty(value = "原始订单编号") + private String originalOrderNo; + /** + * 订单确认审核类型 + * + * @see TpOrderAuditConfirmTypeEnum + */ + @ApiModelProperty(value = "订单确认审核类型") + private Integer orderAuditConfirmType; + +// /** +// * 订单审核单编码 +// */ +// @ApiModelProperty(value = "订单审核单编码") +// private String auditNo; +// +// /** +// * 变更申请单编码 +// */ +// @ApiModelProperty(value = "变更申请单编码") +// private String applyNo; + + /** + * 订单确认审核状态 + */ + @ApiModelProperty(value = "订单确认审核状态") + private String auditStatus; + + /** + * 订单确认审核建议 + */ + @ApiModelProperty(value = "订单确认审核建议") + private String auditResult; + + /** + * 当前订单支付模式 + */ + @ApiModelProperty(value = "当前订单支付方式") + private String currentPayMode; + + + /** + * 修改后支付模式 + */ + @ApiModelProperty(value = "修改后支付模式") + private String changedPayMode; + + /** + * 用户下单时的基础价格 + */ + @ApiModelProperty(value = "用户下单时的基础价格") + private String externalBasicPrice; + + /** + * 下单产品对应的内部基础价格 + */ + @ApiModelProperty(value = "产品对应的内部基础价格") + private String internalBasicPrice; + + /** + * 业务员修改后实际价格 + */ + @ApiModelProperty(value = "业务员修改后实际价格") + private String changedFinalPrice; + + + /** + * 减免手续费类型 + */ + @ApiModelProperty(value = "减免手续费类型") + private String reductionServiceChargeType; + + /** + * 减免手续费申请原因 + */ + @ApiModelProperty(value = "减免手续费申请原因") + private String reduceReason; + +// /** +// * 承运组织编码 +// */ +// @ApiModelProperty(value = "承运组织编码") +// private String orgNo; +// +// /** +// * 承运组织名称 +// */ +// @ApiModelProperty(value = "承运组织名称") +// private String orgName; + + @ApiModelProperty("主承运车队编码") + private String targetFleetCode; + + @ApiModelProperty("主承运车队名称") + private String targetFleetName; + + @ApiModelProperty("去程-车型与合营车队的绑定关系,一辆车一个车队") + private List goJoinFleets; + + @ApiModelProperty("返程-车型与合营车队的绑定关系,一辆车一个车队") + private List backJoinFleets; + + /** + * 订单确认审核操作员编号 + */ + @ApiModelProperty(value = "订单确认审核操作员编号") + private String operatorNo; + + /** + * 订单确认审核操作员名称 + */ + @ApiModelProperty(value = "订单确认审核操作员名称") + private String operatorName; + + /** + * 扩展字段 + */ + @ApiModelProperty(value = "扩展字段") + private Map bizData; + + /** + * 租户ID + */ + @ApiModelProperty(value = "租户ID") + private String tenantId; + + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderCarrierOrganizationDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderCarrierOrganizationDTO.java new file mode 100644 index 0000000..d12d6be --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderCarrierOrganizationDTO.java @@ -0,0 +1,43 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + + +/** + * 订单分配请求对象 + * + * @author xiehuaqiao + * @version 2023-08-07 + */ +@Data +public class TpProdOrderCarrierOrganizationDTO implements Serializable { + + /** + * 承运组织编码 + */ + @ApiModelProperty(value = "承运组织编码") + private String orgNo; + + /** + * 承运组织名称 + */ + @ApiModelProperty(value = "承运组织名称") + private String orgName; + + /** + * 承运组织类型 + */ + @ApiModelProperty(value = "承运组织类型") + private String orgType; + + /** + * 租户ID + */ + @ApiModelProperty(value = "租户ID") + private String tenantId; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeApplicantCreatedDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeApplicantCreatedDTO.java new file mode 100644 index 0000000..999434d --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeApplicantCreatedDTO.java @@ -0,0 +1,32 @@ +package com.deepinnet.tptradeprod.common.dto; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * @author amos wong + * @create 2023/10/30 15:00 + * @Description + */ +@Data +public class TpProdOrderChangeApplicantCreatedDTO implements Serializable { + private static final long serialVersionUID = 1810768307525635810L; + + /** + * 申请人编号 + */ + @NotBlank(message = "申请人编号不能为空") + private String applicantNo; + + /** + * 申请人名称 + */ + private String applicantName; + + /** + * 申请人手机号 + */ + private String applicantPhone; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeApplyApprovedResultSubmitDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeApplyApprovedResultSubmitDTO.java new file mode 100644 index 0000000..72396b2 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeApplyApprovedResultSubmitDTO.java @@ -0,0 +1,74 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * @author xiehuaqiao + * @create 2023/11/21 14:57 + * @Description + */ +@Data +@Builder +public class TpProdOrderChangeApplyApprovedResultSubmitDTO implements Serializable { + + + /** + * 申请单编号 + */ + @ApiModelProperty(value = "申请单编号") + @NotNull(message = "申请单编号不能为空") + private String applyNo; + + + /** + * 申请单目标变更状态 + */ + @ApiModelProperty(value = "申请单目标变更状态") + @NotNull(message = "申请单目标变更状态不能为空") + private String targetApplyStatus; + + /** + * 申请单原始状态 + */ + @ApiModelProperty(value = "申请单原始状态") + @NotNull(message = "申请单原始状态不能为空") + private String originalApplyStatus; + + /** + * 申请单审批结果描述 + */ + @ApiModelProperty(value = "申请单审批结果描述") + private String approvedRemark; + + /** + * 审核时间 + */ + @ApiModelProperty(value = "审核时间") + @NotNull(message = "审核时间不能为空") + private Long approvedTime; + + /** + * 订单编号 + */ + @ApiModelProperty(value = "订单编号") + private String orderNo; + + /** + * 原订单编号 + */ + @ApiModelProperty(value = "原订单编号") + private String originalOrderNo; + + /** + * 租户id + */ + @NotBlank(message = "租户id不能为空") + private String tenantId; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeApplyApprovedSubmitDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeApplyApprovedSubmitDTO.java new file mode 100644 index 0000000..5fe019a --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeApplyApprovedSubmitDTO.java @@ -0,0 +1,74 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * @author xiehuaqiao + * @create 2023/11/21 14:57 + * @Description + */ +@Data +@Builder +public class TpProdOrderChangeApplyApprovedSubmitDTO implements Serializable { + + + /** + * 申请单编号 + */ + @ApiModelProperty(value = "申请单编号") + @NotNull(message = "申请单编号不能为空") + private String applyNo; + + + /** + * 申请单目标变更状态 + */ + @ApiModelProperty(value = "申请单目标变更状态") + @NotNull(message = "申请单目标变更状态不能为空") + private String targetApplyStatus; + + /** + * 申请单原始状态 + */ + @ApiModelProperty(value = "申请单原始状态") + @NotNull(message = "申请单原始状态不能为空") + private String originalApplyStatus; + + /** + * 申请单审批结果描述 + */ + @ApiModelProperty(value = "申请单审批结果描述") + private String approvedRemark; + + /** + * 审核时间 + */ + @ApiModelProperty(value = "审核时间") + @NotNull(message = "审核时间不能为空") + private Long approvedTime; + + /** + * 订单编号 + */ + @ApiModelProperty(value = "订单编号") + private String orderNo; + + /** + * 原订单编号 + */ + @ApiModelProperty(value = "原订单编号") + private String originalOrderNo; + + /** + * 租户id + */ + @NotBlank(message = "租户id不能为空") + private String tenantId; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeApplyCreatedDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeApplyCreatedDTO.java new file mode 100644 index 0000000..548ae05 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeApplyCreatedDTO.java @@ -0,0 +1,130 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.lang.Nullable; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +/** + * @author xiehuaqiao + * @create 2023/11/27 13:53 + * @Description + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class TpProdOrderChangeApplyCreatedDTO implements Serializable { + private static final long serialVersionUID = 6824617899547194529L; + + + /** + * 子订单单号 + */ + @ApiModelProperty(value = "子订单单号") + @Deprecated + private String orderNo; + + /** + * 原始订单编号 + */ + @ApiModelProperty(value = "原始订单编号") + private String originalOrderNo; + + /** + * 申请单状态 + * TpOrderChangeApplyStatusEnum + * @see + */ + @ApiModelProperty(value = "申请状态") + private String applyStatus; + + /** + * 申请时间 + */ + @ApiModelProperty(value = "申请时间") + private Long applyTime; + + /** + * 申请变更的业务类型 + */ + @NotBlank(message = "申请变更的业务类型不能为空") + @ApiModelProperty(value = "申请变更的业务类型") + private String applyType; + + /** + * 申请原因 + */ + @ApiModelProperty(value = "申请原因") + private String applyReason; + + /** + * 订单变更项 + */ + @ApiModelProperty(value = "订单变更项") + private List orderChangeItems; + + /** + * 申请人信息 + */ + @ApiModelProperty(value = "申请人信息") + private TpProdOrderChangeApplicantCreatedDTO orderChangeApplicant; + + /** + * 下单来源承运组织编码 + */ + @ApiModelProperty(value = "下单来源承运组织编码") + private String originOrgNo; + + /** + * 是否需要自动审批 + */ + @ApiModelProperty(value = "是否需要自动审批") + private Boolean autoAudit = Boolean.FALSE; + + /** + * 下单来源承运组织名称 + */ + @ApiModelProperty(value = "下单来源承运组织名称") + private String originOrgName; + + /** + * 下单来源承运组织类型 + */ + @ApiModelProperty(value = "下单来源承运组织类型") + private String originOrgType; + + /** + * 下单场景 + * @see com.deepinnet.tptradeprod.common.enums.TpOrderSceneEnum + */ + @ApiModelProperty(value = "下单场景") + private String orderScene; + + /** + * 行程结束确认的总价 + */ + @ApiModelProperty("行程结束确认的总价") + private BigDecimal confirmPrice; + + /** + * 业务扩展字段 + */ + @ApiModelProperty(value = "业务扩展字段") + private Map bizData; + /** + * 租户id + */ + @NotBlank(message = "租户id不能为空") + private String tenantId; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeApplyDetailDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeApplyDetailDTO.java new file mode 100644 index 0000000..22cba4b --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeApplyDetailDTO.java @@ -0,0 +1,62 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.*; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + +/** + * @author amos wong + * @create 2023/10/30 14:57 + * @Description + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class TpProdOrderChangeApplyDetailDTO implements Serializable { + + private static final long serialVersionUID = 4262844007335163602L; + + /** + * 申请单编号 + */ + @ApiModelProperty(value = "申请单编号") + private String applyNo; + + /** + * 子订单单号 + */ + @ApiModelProperty(value = "子订单单号") + @Deprecated + private String orderNo; + + /** + * 原始订单编号 + */ + @ApiModelProperty(value = "原始订单编号") + private String originalOrderNo; + + + /** + * 订单变更申请单类型 + */ + @ApiModelProperty(value = "订单变更申请单类型") + private String applyType; + + /** + * 订单变更申请单状态 + */ + @ApiModelProperty(value = "订单变更申请单状态") + private List applyStatus; + + /** + * 租户id + */ + @NotBlank(message = "租户id不能为空") + private String tenantId; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeApplyListDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeApplyListDTO.java new file mode 100644 index 0000000..4850de2 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeApplyListDTO.java @@ -0,0 +1,44 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * @author amos wong + * @create 2023/10/30 14:57 + * @Description + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class TpProdOrderChangeApplyListDTO implements Serializable { + + private static final long serialVersionUID = 4262844007335163602L; + + /** + * 子订单单号 + */ + @ApiModelProperty(value = "子订单单号") + @Deprecated + private String orderNo; + + /** + * 原始订单编号 + */ + @ApiModelProperty(value = "原始订单编号") + private String originalOrderNo; + + /** + * 租户id + */ + @NotBlank(message = "租户id不能为空") + private String tenantId; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeApplyStatusUpdateDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeApplyStatusUpdateDTO.java new file mode 100644 index 0000000..af016f8 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeApplyStatusUpdateDTO.java @@ -0,0 +1,75 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * @author xiehuaqiao + * @create 2023/11/21 14:57 + * @Description + */ +@Data +@Builder +public class TpProdOrderChangeApplyStatusUpdateDTO implements Serializable { + + + /** + * 申请单编号 + */ + @ApiModelProperty(value = "申请单编号") + @NotNull(message = "申请单编号不能为空") + private String applyNo; + + + /** + * 申请单目标变更状态 + */ + @ApiModelProperty(value = "申请单目标变更状态") + @NotNull(message = "申请单目标变更状态不能为空") + private String targetApplyStatus; + + /** + * 申请单原始状态 + */ + @ApiModelProperty(value = "申请单原始状态") + @NotNull(message = "申请单原始状态不能为空") + private String originalApplyStatus; + + + /** + * 申请单审批结果描述 + */ + @ApiModelProperty(value = "申请单审批结果描述") + private String approvedRemark; + + /** + * 子订单单号 + */ + @ApiModelProperty(value = "子订单单号") + @Deprecated + private String orderNo; + + /** + * 原始订单编号 + */ + @ApiModelProperty(value = "原始订单编号") + private String originalOrderNo; + /** + * 审核时间 + */ + @ApiModelProperty(value = "审核时间") + @NotNull(message = "审核时间不能为空") + private Long approvedTime; + + /** + * 租户id + */ + @NotBlank(message = "租户id不能为空") + private String tenantId; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeApplySubmitRscApplyDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeApplySubmitRscApplyDTO.java new file mode 100644 index 0000000..4e5a738 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeApplySubmitRscApplyDTO.java @@ -0,0 +1,79 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * @author xiehuaqiao + * @create 2023/11/21 14:57 + * @Description + */ +@Data +@Builder +public class TpProdOrderChangeApplySubmitRscApplyDTO implements Serializable { + + + /** + * 申请单编号 + */ + @ApiModelProperty(value = "申请单编号") + @NotNull(message = "申请单编号不能为空") + private String applyNo; + + + /** + * 申请单目标变更状态 + */ + @ApiModelProperty(value = "申请单目标变更状态") + @NotNull(message = "申请单目标变更状态不能为空") + private String targetApplyStatus; + + /** + * 申请单原始状态 + */ + @ApiModelProperty(value = "申请单原始状态") + @NotNull(message = "申请单原始状态不能为空") + private String originalApplyStatus; + + /** + * 服务费减免申请原因 + */ + @ApiModelProperty(value = "服务费减免申请原因") + private String rscApplyReason; + + /** + * 服务费减免申请时间 + */ + @ApiModelProperty(value = "服务费减免申请时间") + private Long rscApplyTime; + + /** + * 服务费减免类型 + */ + @ApiModelProperty(value = "服务费减免类型") + private String rscApplyType; + + /** + * 订单编号 + */ + @ApiModelProperty(value = "订单编号") + private String orderNo; + + /** + * 原订单编号 + */ + @ApiModelProperty(value = "原订单编号") + private String originalOrderNo; + + /** + * 租户id + */ + @NotBlank(message = "租户id不能为空") + private String tenantId; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeItemCreatedDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeItemCreatedDTO.java new file mode 100644 index 0000000..33baf06 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeItemCreatedDTO.java @@ -0,0 +1,66 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + * @author amos wong + * @create 2023/10/30 14:03 + * @Description + */ +@Data +public class TpProdOrderChangeItemCreatedDTO implements Serializable { + private static final long serialVersionUID = 2806370286802680227L; + + + /** + * 子订单单号 + */ + @ApiModelProperty(value = "子订单单号") + @Deprecated + private String orderNo; + + /** + * 原始订单编号 + */ + @ApiModelProperty(value = "原始订单编号") + private String originalOrderNo; + /** + * 变更项编号 + * + */ + private String itemNo; + + /** + * 变更项类型 + * + * @see com.deepinnet.tptradecore.common.enums.order.TpOrderChangeItemTypeEnum + */ + @NotBlank(message = "变更项类型不能为空") + @ApiModelProperty(value = "变更项类型") + private String itemType; + + /** + * 变更项因子 + * + */ + @ApiModelProperty(value = "变更项因子列表") + private List itemFactors; + + + /** + * 业务扩展字段 + */ + @ApiModelProperty(value = "业务扩展字段") + private Map bizData; + /** + * 租户id + */ + @NotBlank(message = "租户id不能为空") + private String tenantId; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeItemFactorCreatedDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeItemFactorCreatedDTO.java new file mode 100644 index 0000000..f7f9f78 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeItemFactorCreatedDTO.java @@ -0,0 +1,96 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.Map; + +/** + * @author amos wong + * @create 2023/10/30 14:03 + * @Description + */ +@Data +public class TpProdOrderChangeItemFactorCreatedDTO implements Serializable { + private static final long serialVersionUID = 2806370286802680227L; + + + /** + * 变更因子编码 + */ + @NotBlank(message = "变更因子编码不能为空") + @ApiModelProperty(value = "变更因子编码") + private String factorCode; + + /** + * 变更因子名称 + */ + @NotBlank(message = "变更因子名称不能为空") + @ApiModelProperty(value = "变更因子名称") + private String factorName; + + /** + * 变更因子类型 + */ + @ApiModelProperty(value = "变更因子类型") + private String factorType; + + + /** + * 变更前的值 + */ + @NotBlank(message = "变更前的值不能为空") + @ApiModelProperty(value = "变更前的值") + private String beforeValue; + + /** + * 变更后的值 + */ + @NotBlank(message = "变更后的值不能为空") + @ApiModelProperty(value = "变更后的值") + private String afterValue; + + /** + * 因子排序 + */ + @ApiModelProperty(value = "因子展示排序值") + private Integer sortIndex; + + /** + * 子订单单号 + */ + @ApiModelProperty(value = "子订单单号") + @Deprecated + private String orderNo; + + /** + * 原始订单编号 + */ + @ApiModelProperty(value = "原始订单编号") + private String originalOrderNo; + + /** + * 变更申请单号 + */ + @ApiModelProperty(value = "申请单号") + private String applyNo; + + /** + * 变更项编号 + */ + @ApiModelProperty(value = "变更项编号") + private String changeItemNo; + + /** + * 业务扩展字段 + */ + @ApiModelProperty(value = "业务扩展字段") + private Map bizData; + /** + * 租户id + */ + @NotBlank(message = "租户id不能为空") + private String tenantId; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeItemListDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeItemListDTO.java new file mode 100644 index 0000000..7811ca8 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderChangeItemListDTO.java @@ -0,0 +1,46 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * @author amos wong + * @create 2023/10/30 14:57 + * @Description + */ +@Data +public class TpProdOrderChangeItemListDTO implements Serializable { + + private static final long serialVersionUID = 4262844007335163602L; + + /** + * 申请单编号 + */ + @ApiModelProperty(value = "申请单编号") + @NotNull(message = "申请单编号不能为空") + private String applyNo; + + /** + * 子订单单号 + */ + @ApiModelProperty(value = "子订单单号") + @Deprecated + private String orderNo; + + /** + * 原始订单编号 + */ + @ApiModelProperty(value = "原始订单编号") + private String originalOrderNo; + + /** + * 租户id + */ + @NotBlank(message = "租户id不能为空") + private String tenantId; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderConfirmViewDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderConfirmViewDTO.java new file mode 100644 index 0000000..3d7b7e9 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderConfirmViewDTO.java @@ -0,0 +1,52 @@ +package com.deepinnet.tptradeprod.common.dto; + +import com.deepinnet.tptradeprod.common.enums.TpOrderAuditConfirmTypeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.*; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * @author xiehuaqiao + * @create 2023/10/30 15:12 + * @Description 订单审核确认页面展示DTO + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class TpProdOrderConfirmViewDTO implements Serializable { + + + /** + * 子订单单号 + */ + @ApiModelProperty(value = "子订单单号") + @Deprecated + private String orderNo; + + /** + * 原始订单编号 + */ + @ApiModelProperty(value = "原始订单编号") + private String originalOrderNo; + /** + * 订单确认审核申请类型 + * @see TpOrderAuditConfirmTypeEnum + */ + @ApiModelProperty(value = "订单确认审核申请类型") + @NotBlank(message = "订单确认审核申请类型不能为空") + private Integer orderAuditConfirmType; + + /** + * 审核业务员编号 + */ + @ApiModelProperty(value = "审核业务员编号") + private String auditorNo; + + + @NotBlank(message = "租户id不能为空") + private String tenantId; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderCreateDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderCreateDTO.java new file mode 100644 index 0000000..9c63fb2 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderCreateDTO.java @@ -0,0 +1,308 @@ +package com.deepinnet.tptradeprod.common.dto; + +import com.deepinnet.tptradeprod.common.vo.TpOrderPlacerVO; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.*; + + +/** + * 下单请求对象 + * + * @author taobinxian + * @version 2023-08-07 + */ +@Data +public class TpProdOrderCreateDTO implements Serializable { + + private static final long serialVersionUID = 5642626645287163121L; + /** + * 用户IP + */ + @ApiModelProperty(value = "用户IP") + private String userIp; + + /** + * POS机编号 + */ + @ApiModelProperty(value = "POS机编号") + private String posNo; + + /** + * 拼车刷卡流水号 + */ + @ApiModelProperty(value = "刷卡流水号") + private String swipeCardNo; + + /** + * 拼车公交卡卡号 + */ + @ApiModelProperty(value = "公交卡号") + private String busCardNo; + + /** + * 当前公司编码 + */ + @ApiModelProperty(value = "orgCode") + private String orgCode; + + /** + * 产品编码 + */ + @ApiModelProperty(value = "产品编码") + private String productNo; + + /** + * 产品名称 + */ + @ApiModelProperty(value = "产品名称") + private String productName; + + /** + * 产品类目编码 + */ + @ApiModelProperty(value = "产品类目编码") + private String productCategoryNo; + + /** + * 产品类目中文 + */ + @ApiModelProperty(value = "产品类目中文") + private String productCategory; + + /** + * 外部业务单号 + */ + @ApiModelProperty(value = "外部业务单号", required = true) + private String outRequestNo; + + /** + * 用户编码 + */ + @ApiModelProperty(value = "用户编号") + private String userNo; + + /** + * 用户名称 + */ + @ApiModelProperty(value = "用户名称") + private String username; + + /** + * 用户手机号 + */ + @ApiModelProperty(value = "用户手机号") + private String userPhone; + + /** + * 订单编码 + */ + @ApiModelProperty(value = "订单编号") + private String orderNo; + + /** + * 父订单编号 + */ + @ApiModelProperty(value = "父订单号") + private String parentOrderNo; + + /** + * 原订单号 + */ + @ApiModelProperty(value = "原订单号") + private String originalOrderNo; + + /** + * 订单状态(前端无需传此字段) + */ + @ApiModelProperty(value = "订单状态(前端无需使用)") + private Integer status; + + /** + * 是否主订单(0-否;1-是) + */ + @ApiModelProperty(value = "是否主订单(0-否;1-是)") + private Integer main; + + /** + * 订单类型(定制公交 / 预约包车 / 改签订单) + */ + @ApiModelProperty(value = "订单类型(1-定制公交;2-预约包车;3-改签订单)") + private Integer type; + + /** + * 行程类型 + */ + @ApiModelProperty(value = "行程类型(go; back; round)") + private String tripType; + + /** + * 付款模式 + */ + @ApiModelProperty(value = "付款模式(pay_later-先享后付;pay_now_deposit-先付后享付订金; pay_now-先付后享付全款)") + private String payMode; + + /** + * 实付金额 + */ + @ApiModelProperty(value = "实付金额") + private String payAmount; + + /** + * 应付金额 + */ + @ApiModelProperty(value = "应付金额") + private String payableAmount; + + /** + * 订单优惠前原金额 + */ + @ApiModelProperty(value = "优惠前金额") + private String originalAmount; + + /** + * 优惠金额 + */ + @ApiModelProperty(value = "优惠金额") + private String discountAmount; + + /** + * 服务费 + */ + @ApiModelProperty(value = "服务费") + private String serviceCharge; + + /** + * 订单来源(APP / 微信小程序 / 支付宝小程序 / H5) + */ + @ApiModelProperty(value = "订单来源(1-app;2-微信小程序;3-支付宝小程序;4-H5页面)") + private String source; + + /** + * 是否实名认证(0-否;1-是) + */ + @ApiModelProperty(value = "是否实名认证(0-否;1-是)") + private Integer identityVerificat; + + /** + * 车票类型(day-日票;week-周票;month-月票;term-学期票;year-年票) + */ + @ApiModelProperty(value = "车票类型(day-日票;week-周票;month-月票;term-学期票;year-年票)") + private String ticketType; + + /** + * 最早开售时间 + */ + @ApiModelProperty(value = "最早开售时间,当前字段用放票规则,检查当前时间是否能够购买某个类型的车票") + private Long earliestSaleTime; + + /** + * 下单时间 + */ + @ApiModelProperty(value = "下单时间") + private Long orderTime; + + /** + * 支付时间 + */ + @ApiModelProperty(value = "支付时间") + private Long payTime; + + /** + * 支付方式 + */ + @ApiModelProperty(value = "支付方式") + private String payType; + + /** + * 订单关闭时间 + */ + @ApiModelProperty(value = "订单关闭时间") + private Long closeTime; + + /** + * 订单过期时间 + */ + @ApiModelProperty(value = "订单过期时间") + private Long expireTime; + + /** + * 订单是否需审核 + */ + @ApiModelProperty(value = "订单是否需审核(0-否;1-是)") + private Integer needApprove; + + /** + * 站点信息 + */ + @ApiModelProperty(value = "站点信息(上车点 / 下车点)") + private TpOrderStationDTO stationDTO; + + /** + * 站点信息 区分去返程 + */ + @ApiModelProperty(value = "站点信息 区分去返程") + private List charterBusStations; + + /** + * 扩展字段 + */ + @ApiModelProperty(value = "扩展字段") + private Map bizData; + + /** + * 租户ID + */ + @ApiModelProperty(value = "租户ID") + private String tenantId; + + /** + * 报价记录 + */ + @ApiModelProperty(value = "报价记录") + private List tpOrderPriceRecords; + + /** + * 下单人 + */ + @ApiModelProperty(value = "下单人") + private TpOrderPlacerVO orderPlacer; + + /** + * 用车需求方 + */ + @ApiModelProperty(value = "用车需求方") + private TpOrderRequirementUserDTO orderRequirementUser; + + /** + * 标的项 + */ + @ApiModelProperty(value = "标的项") + private List orderSubjectItem; + + /** + * 线路 + */ + @ApiModelProperty(value = "线路") + private List routes; + + /** + * 服务对象 + */ + @ApiModelProperty(value = "服务对象") + private TpOrderTargetServiceDTO targetServiceDTO; + + /** + * 包车询价参数 + */ + @ApiModelProperty(value = "包车询价参数") + private List inquireParams; + + /** + * 是否后台修改 + */ + private Boolean isBackend = false; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderDiscountDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderDiscountDTO.java new file mode 100644 index 0000000..c79d4aa --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderDiscountDTO.java @@ -0,0 +1,51 @@ +package com.deepinnet.tptradeprod.common.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + *

+ * 优惠信息 + *

+ * + * @author chenjiaju + * @since 2023/9/9 + */ + +@Data +public class TpProdOrderDiscountDTO implements Serializable { + + private static final long serialVersionUID = -1L; + + /** + * 计价记录编号 + */ + private String pricingNo; + + /** + * 订单编码 + */ + private String orderNo; + + /** + * 优惠类型 + */ + private Integer type; + + /** + * 优惠金额 + */ + private String discountAmount; + + /** + * 扩展字段 + */ + private Map bizData; + + /** + * 租户ID + */ + private String tenantId; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderDispatchCallBackDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderDispatchCallBackDTO.java new file mode 100644 index 0000000..7aee497 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderDispatchCallBackDTO.java @@ -0,0 +1,55 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * @author amos wong + * @create 2023/10/30 17:36 + * @Description 分配订单 + */ +@Data +public class TpProdOrderDispatchCallBackDTO implements Serializable { + private static final long serialVersionUID = -6835649297585208663L; + + + @ApiModelProperty(value = "订单派单编号") + private String dispatchNo; + + /** + * 原订单编号 + */ + @ApiModelProperty(value = "原订单编号") + @NotBlank(message = "原订单编号不能为空") + private String originalOrderNo; + + + @ApiModelProperty(value = "操作员编号") + @NotBlank(message = "操作员编号不能为空") + private String operatorNo; + + + @ApiModelProperty(value = "操作员名称") + private String operatorName; + + + @ApiModelProperty(value = "召回时间") + private Long callBackTime; + + /** + * 召回原因 + */ + @ApiModelProperty(value = "召回原因") + private String callBackReason; + + /** + * 租户id + */ + @NotBlank(message = "租户id不能为空") + private String tenantId; + + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderDispatchCreatedDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderDispatchCreatedDTO.java new file mode 100644 index 0000000..fd6be6a --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderDispatchCreatedDTO.java @@ -0,0 +1,126 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.*; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.Map; + + +/** + * 订单分配请求对象 + * + * @author xiehuaqiao + * @version 2023-08-07 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class TpProdOrderDispatchCreatedDTO implements Serializable { + + /** + * 子订单单号 + */ + @ApiModelProperty(value = "子订单单号") + @Deprecated + private String orderNo; + + + /** + * 原订单编号 + */ + @ApiModelProperty(value = "原订单编号") + private String originalOrderNo; + + /** + * 包车产品类型 + */ + @ApiModelProperty(value = "包车产品类型") + private String charteredBusType; + + /** + * 派单来源场景 + */ + @ApiModelProperty(value = "派单来源场景") + @NotBlank(message = "派单来源场景不能为空") + private String dispatchScene; + + /** + * 分配时间 + */ + @ApiModelProperty(value = "分配时间") + @NotBlank(message = "分配时间不能为空") + private Long dispatchTime; + + /** + * 指定分配状态 + */ + @ApiModelProperty(value = "分配状态:已创建/已接单/已转分配") + @NotBlank(message = "分配状态不能为空") + private Integer dispatchStatus; + + + /** + * 下单来源承运组织编码 + */ + @ApiModelProperty(value = "下单来源承运组织编码") + private String originOrgNo; + + /** + * 下单来源承运组织名称 + */ + @ApiModelProperty(value = "下单来源承运组织名称") + private String originOrgName; + + /** + * 下单来源承运组织类型 + */ + @ApiModelProperty(value = "下单来源承运组织类型") + private String originOrgType; + + /** + * 最终分派组织代码 + */ + @ApiModelProperty(value = "最终分派组织代码") + private String targetOrgNo; + + + /** + * 最终分派组织名称 + */ + @ApiModelProperty(value = "最终分派组织名称") + private String targetOrgName; + + /** + * 最终分派组织类型:总公司/分公司 + */ + @ApiModelProperty(value = "分派组织类型:总公司/分公司") + private String targetOrgType; + + + /** + * 订单分配操作员编号 + */ + @ApiModelProperty(value = "订单分配操作员编号") + private String operatorNo; + + /** + * 订单分配操作员名称 + */ + @ApiModelProperty(value = "订单分配操作员名称") + private String operatorName; + + /** + * 扩展字段 + */ + @ApiModelProperty(value = "扩展字段") + private Map bizData; + + /** + * 租户ID + */ + @ApiModelProperty(value = "租户ID") + private String tenantId; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderDispatchDetailDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderDispatchDetailDTO.java new file mode 100644 index 0000000..9617cc6 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderDispatchDetailDTO.java @@ -0,0 +1,56 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.List; + +/** + * @author amos wong + * @create 2023/10/30 14:57 + * @Description + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class TpProdOrderDispatchDetailDTO implements Serializable { + + private static final long serialVersionUID = 4262844007335163602L; + + /** + * 派单编号 + */ + @ApiModelProperty(value = "派单编号") + private String dispatchNo; + /** + * 子订单单号 + */ + @ApiModelProperty(value = "子订单单号") + @Deprecated + private String orderNo; + + /** + * 原始订单编号 + */ + @ApiModelProperty(value = "原始订单编号") + private String originalOrderNo; + + + /** + * 派单状态 + */ + @ApiModelProperty(value = "派单状态") + private List statuses; + + /** + * 租户id + */ + @NotBlank(message = "租户id不能为空") + private String tenantId; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderDispatchFleetCreatedDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderDispatchFleetCreatedDTO.java new file mode 100644 index 0000000..e6d694b --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderDispatchFleetCreatedDTO.java @@ -0,0 +1,86 @@ +package com.deepinnet.tptradeprod.common.dto; + +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDispatchJoinFleetVO; +import io.swagger.annotations.ApiModelProperty; +import lombok.*; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + + +/** + * 订单派车请求对象 + * + * @author xiehuaqiao + * @version 2023-08-07 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class TpProdOrderDispatchFleetCreatedDTO implements Serializable { + + /** + * 子订单单号 + */ + @ApiModelProperty(value = "子订单单号") + @Deprecated + private String orderNo; + + + /** + * 原订单编号 + */ + @ApiModelProperty(value = "原订单编号") + private String originalOrderNo; + + /** + * 派单记录编码 + */ + @ApiModelProperty(value = "派单记录编码") + private String dispatchNo; + + /** + * 承运车队编码 + */ + @ApiModelProperty(value = "承运车队编码") + private String targetFleetNo; + + /** + * 承运车队名称 + */ + @ApiModelProperty(value = "承运车队名称") + private String targetFleetName; + + @ApiModelProperty(value = "去程-车型与合营车队的绑定关系,一辆车一个车队") + private List goJoinFleets; + + @ApiModelProperty(value = "返程-车型与合营车队的绑定关系,一辆车一个车队") + private List backJoinFleets; + + /** + * 订单分配操作员编号 + */ + @ApiModelProperty(value = "订单分配操作员编号") + private String operatorNo; + + /** + * 订单分配操作员名称 + */ + @ApiModelProperty(value = "订单分配操作员名称") + private String operatorName; + + /** + * 扩展字段 + */ + @ApiModelProperty(value = "扩展字段") + private Map bizData; + + /** + * 租户ID + */ + @ApiModelProperty(value = "租户ID") + private String tenantId; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderDispatchGiveBackDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderDispatchGiveBackDTO.java new file mode 100644 index 0000000..6ababb8 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderDispatchGiveBackDTO.java @@ -0,0 +1,60 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * @author amos wong + * @create 2023/10/30 17:36 + * @Description 分配订单 + */ +@Data +public class TpProdOrderDispatchGiveBackDTO implements Serializable { + private static final long serialVersionUID = -6835649297585208663L; + + + @ApiModelProperty(value = "订单派单编号") + private String dispatchNo; + + @ApiModelProperty(value = "订单编号") + @Deprecated + private String orderNo; + /** + * 原订单编号 + */ + @ApiModelProperty(value = "原订单编号") + @NotBlank(message = "订单编号不能为空") + private String originalOrderNo; + + + @ApiModelProperty(value = "操作员编号") + @NotBlank(message = "操作员编号不能为空") + private String operatorNo; + + + @ApiModelProperty(value = "操作员名称") + private String operatorName; + + + @ApiModelProperty(value = "退回时间") + @NotBlank(message = "退回时间不能为空") + private Long giveBackTime; + + /** + * 退回原因 + */ + @ApiModelProperty(value = "退回原因") + @NotBlank(message = "退回原因不能为空") + private String giveBackReason; + + /** + * 租户id + */ + @NotBlank(message = "租户id不能为空") + private String tenantId; + + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderDispatchListDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderDispatchListDTO.java new file mode 100644 index 0000000..b98da3c --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderDispatchListDTO.java @@ -0,0 +1,51 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + +/** + * @author amos wong + * @create 2023/10/30 14:57 + * @Description + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class TpProdOrderDispatchListDTO implements Serializable { + + private static final long serialVersionUID = 4262844007335163602L; + + /** + * 子订单编号列表 + */ + @ApiModelProperty(value = "子订单编号列表") + @Deprecated + private List orderNoList; + + /** + * 源订单编号列表 + */ + @ApiModelProperty(value = "源订单编号列表") + private List originalOrderNoList; + + /** + * 派单状态 + */ + @ApiModelProperty(value = "派单状态") + private List statuses; + + /** + * 租户id + */ + @NotBlank(message = "租户id不能为空") + private String tenantId; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderDispatchStatusUpdateDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderDispatchStatusUpdateDTO.java new file mode 100644 index 0000000..fff1d51 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderDispatchStatusUpdateDTO.java @@ -0,0 +1,64 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.*; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * @author xiehuaqiao + * @create 2023/11/21 14:57 + * @Description + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class TpProdOrderDispatchStatusUpdateDTO implements Serializable { + + + /** + * 派单编号 + */ + @ApiModelProperty(value = "派单编号") + @NotNull(message = "派单编号不能为空") + private String dispatchNo; + + + /** + * 目标变更状态 + */ + @ApiModelProperty(value = "目标变更状态") + @NotNull(message = "目标变更状态不能为空") + private String targetStatus; + + /** + * 原始状态 + */ + @ApiModelProperty(value = "原始状态") + @NotNull(message = "原始状态不能为空") + private String originalStatus; + + + /** + * 子订单单号 + */ + @ApiModelProperty(value = "子订单单号") + @Deprecated + private String orderNo; + + /** + * 原始订单编号 + */ + @ApiModelProperty(value = "原始订单编号") + private String originalOrderNo; + + /** + * 租户id + */ + @NotBlank(message = "租户id不能为空") + private String tenantId; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderEndTripPriceConfirmDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderEndTripPriceConfirmDTO.java new file mode 100644 index 0000000..289a859 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderEndTripPriceConfirmDTO.java @@ -0,0 +1,76 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * Description: 订单行程结束价格确认参数 + * Date: 2024/6/5 + * Author: lijunheng + */ +@Data +@ApiModel +public class TpProdOrderEndTripPriceConfirmDTO implements Serializable { + + + @ApiModelProperty("订单号") + private String orderNo; + + + @ApiModelProperty("原始订单号") + @NotBlank(message = "原始订单号不能为空") + private String originalOrderNo; + + /** + * 行程结束确认的总价 + */ + @ApiModelProperty("行程结束确认的总价") + @NotNull(message = "行程结束确认的总价不能为空") + private BigDecimal confirmPrice; + + /** + * 申请描述 + */ + @ApiModelProperty("申请描述") + private String applyDesc; + + /** + * 修改前订单金额 + */ + @ApiModelProperty(value = "修改前订单金额") + @NotNull(message = "修改前订单金额不能为空") + private BigDecimal beforePrice; + + /** + * 修改后订单金额 + */ + @ApiModelProperty(value = "修改后订单金额") + @NotNull(message = "修改后订单金额不能为空") + private BigDecimal afterPrice; + + /** + * 改价操作员编号 + */ + @ApiModelProperty("改价操作员编号") + private String operatorNo; + + /** + * 改价操作员名称 + */ + @ApiModelProperty("改价操作员名称") + private String operatorName; + + @ApiModelProperty("改价操作员手机号") + private String operatorPhone; + + + @ApiModelProperty("租户id") + private String tenantId; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderListQueryDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderListQueryDTO.java new file mode 100644 index 0000000..30d30cb --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderListQueryDTO.java @@ -0,0 +1,67 @@ +package com.deepinnet.tptradeprod.common.dto; + +import com.deepinnet.tp.common.lang.dto.BasePageQueryDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderTypeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + *

+ * C端用户查询参数 + *

+ * + * @author chenjiaju + * @since 2023/9/13 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TpProdOrderListQueryDTO extends BasePageQueryDTO implements Serializable { + + private static final long serialVersionUID = -1L; + + /** + * 下单用户编号 + */ + @ApiModelProperty(value = "下单用户编号") + private String placerNo; + + /** + * pos机刷卡卡号 + */ + @ApiModelProperty(value = "pos机刷卡卡号") + private String posCardNo; + + /** + * 发车时间 + */ + @ApiModelProperty(value = "发车时间") + private String departureTime; + + /** + * 订单状态 (0-订单初始化;5-订单待支付;10-订单超时;15-订单已支付;20-部分核销;25-退款中;30-部分退款;35-已经改签;40-全部退款;45-退款失败;50-已完成(存在部分退款);55-已完成(不存在退款)) + */ + @ApiModelProperty(value = "订单状态(1-待支付;2-待核销;3-退款成功)") + private Integer tpOrderStatusEnum; + + /** + * 订单类型 + * @see TpOrderTypeEnum + */ + @ApiModelProperty(value = "订单类型(1-定制公交;2-预约包车;3-拼车)") + private Integer orderType; + + /** + * 租户ID + */ + @NotNull(message = "租户ID不能为空") + private String tenantId; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderManualDispatchDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderManualDispatchDTO.java new file mode 100644 index 0000000..b8fe70e --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderManualDispatchDTO.java @@ -0,0 +1,69 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.*; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Map; + + +/** + * 订单分配请求对象-业务员手动分配对象 + * + * @author xiehuaqiao + * @version 2023-08-07 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class TpProdOrderManualDispatchDTO implements Serializable { + + /** + * 子订单单号 + */ + @ApiModelProperty(value = "子订单单号") + @Deprecated + private String orderNo; + + /** + * 原始订单编号 + */ + @ApiModelProperty(value = "原始订单编号") + private String originalOrderNo; + + /** + * 最终分派组织代码 + */ + @ApiModelProperty(value = "最终分派组织代码") + @NotNull(message = "最终分派组织代码不能为空") + private String targetOrgNo; + + /** + * 订单分配操作员编号 + */ + @ApiModelProperty(value = "订单分配操作员编号") + @NotNull(message = "订单分配操作员编号不能为空") + private String operatorNo; + + /** + * 订单分配操作员名称 + */ + @ApiModelProperty(value = "订单分配操作员名称") + private String operatorName; + + /** + * 扩展字段 + */ + @ApiModelProperty(value = "扩展字段") + private Map bizData; + + /** + * 租户ID + */ + @ApiModelProperty(value = "租户ID") + private String tenantId; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderPaidDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderPaidDTO.java new file mode 100644 index 0000000..987a920 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderPaidDTO.java @@ -0,0 +1,56 @@ +package com.deepinnet.tptradeprod.common.dto; + +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import io.swagger.annotations.ApiModelProperty; +import lombok.*; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + *

+ * 已支付订单DTO + *

+ * + * @author chenjiaju + * @since 2023/8/31 + */ + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class TpProdOrderPaidDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 订单编号 + */ + @ApiModelProperty(value = "订单编号") + private String orderNo; + + /** + * 支付时间 + */ + @ApiModelProperty(value = "支付时间") + private Long payTime; + + /** + * 业务类型 + * @see TpBizTypeEnum + */ + @ApiModelProperty(value = "业务类型") + private String bizType; + + /** + * 租户ID + */ + @ApiModelProperty(value = "租户ID") + private String tenantId; + + /** + * 订单详情 + */ + private TpProdOrderDetailVO orderDetailVO; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderPayDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderPayDTO.java new file mode 100644 index 0000000..a958585 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderPayDTO.java @@ -0,0 +1,119 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.*; + +import javax.validation.constraints.*; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Map; + +/** + * @author taobinxian + * @version 2023-08-07 + */ +@Data +public class TpProdOrderPayDTO implements Serializable { + + /** + * 用户编号 + */ + @ApiModelProperty(value = "用户编号") + private String userNo; + + /** + * 待支付的订单号 + */ + @ApiModelProperty(value = "订单号") + private String orderNo; + + @ApiModelProperty(value = "业务类型,CBP-定制公交付款,CBR-定制公交退款,DP-定金订单支付,DR-定金订单退款,BP-尾款订单支付,TER-行程结束退款") + private String bizType; + + /** + * 支付金额 + */ + @ApiModelProperty(value = "支付金额") + private String payAmount; + + /** + * 支付比例 + */ + @ApiModelProperty(value = "支付比例") + private BigDecimal percentage; + + /** + * 优惠金额 + */ + @ApiModelProperty(value = "优惠金额") + private String discountMoney; + + /** + * 支付成功后的跳转url + */ + @ApiModelProperty(value = "支付成功后的跳转url") + private String returnUrl; + + /** + * 支付方式 + */ + @ApiModelProperty(value = "支付方式") + private String payType; + + /** + * 支付宝小程序appId,当支付宝小程序支付时必传 + */ + private String appId; + + /** + * 来源-->对应创建支付单重的payScene + */ + @ApiModelProperty(value = "支付来源") + private String source; + + /** + * 支付标题 + */ + @ApiModelProperty(value = "支付标题") + @NotBlank(message = "支付标题不能为空") + private String payTitle; + + /** + * 用户IP地址 + */ + @ApiModelProperty(value = "用户IP地址") + private String userIp; + + /** + * 微信小程序、支付宝小程序支付时需要传入,代表openid + */ + @ApiModelProperty(value = "微信小程序、支付宝小程序支付时需要传入,代表openid") + private String buyerId; + + /** + * 组织编号 + */ + @ApiModelProperty(value = "组织编号") + private String orgCode; + + /** + * 支付超时时间 + */ + @NotNull(message = "支付超时时间不能为空") + @ApiModelProperty(value = "支付超时时间") + private Long payTimeout; + + private TpUserInfoDTO userInfoDTO; + + /** + * 扩展字段 + */ + private Map bizData; + + /** + * 租户id(必传) + */ + @ApiModelProperty(value = "租户ID") + private String tenantId; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderPriceRecordDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderPriceRecordDTO.java new file mode 100644 index 0000000..dca1a37 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderPriceRecordDTO.java @@ -0,0 +1,83 @@ +package com.deepinnet.tptradeprod.common.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +/** + *

+ * 报价记录 + *

+ * + * @author chenjiaju + * @since 2023/9/9 + */ + +@Data +public class TpProdOrderPriceRecordDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 计价记录编号 + */ + private String pricingNo; + + /** + * 订单编码 + */ + private String orderNo; + + /** + * 计价原始金额 + */ + private String pricingOriginalAmount; + + /** + * 计价优惠金额 + */ + private String pricingDiscountAmount; + + /** + * 计价类型 + */ + private Integer pricingType; + + /** + * 内部询价价格 + */ + private String internalInquireAmount; + + /** + * 支付比例 + */ + private BigDecimal payPercentage; + + /** + * 计价参数 + */ + private String pricingParams; + + /** + * 优惠信息 + */ + private List orderDiscount; + + /** + * 询价记录详情 + */ + private List orderPriceRecordDetails; + + /** + * 扩展字段 + */ + private Map bizData; + + /** + * 租户ID + */ + private String tenantId; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderPriceRecordDetailDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderPriceRecordDetailDTO.java new file mode 100644 index 0000000..87c99ba --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderPriceRecordDetailDTO.java @@ -0,0 +1,77 @@ +package com.deepinnet.tptradeprod.common.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + *

+ * 价格明细 + *

+ * + * @author chenjiaju + * @since 2023/9/9 + */ + +@Data +public class TpProdOrderPriceRecordDetailDTO implements Serializable { + + private static final long serialVersionUID = -1L; + + /** + * 计价记录编号 + */ + private String pricingNo; + + /** + * 订单编码 + */ + private String orderNo; + + /** + * 询价记录详情 + */ + private String itemNo; + + /** + * 乘客类型 + */ + private String passengerType; + + /** + * 乘客数量 + */ + private Integer passengerCount; + + /** + * 单原始金额 + */ + private String singleOriginalAmount; + + /** + * 单优惠金额 + */ + private String singleDiscountAmount; + + /** + * 总原始金额 + */ + private String totalOriginalAmount; + + /** + * 总优惠金额 + */ + private String totalDiscountAmount; + + /** + * 扩展字段 + */ + private Map bizData; + + /** + * 租户ID + */ + private String tenantId; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderQueryDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderQueryDTO.java new file mode 100644 index 0000000..e317f34 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderQueryDTO.java @@ -0,0 +1,59 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 订单查询DTO + *

+ * + * @author chenjiaju + * @since 2023/8/24 + */ + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class TpProdOrderQueryDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 订单编号 + */ + @ApiModelProperty(value = "订单编号") + private String orderNo; + + /** + * 原始订单编号 + */ + @ApiModelProperty(value = "原始订单编号") + private String originalOrderNo; + + /** + * 租户ID + */ + @ApiModelProperty(value = "租户ID") + private String tenantId; + + /** + * 用户编号 + */ + @ApiModelProperty(value = "用户编号") + private String userNo; + + /** + * 需要的模块 + * @see com.deepinnet.tptradecore.core.model.enums.order.TpOrderModulesEnum + */ + @ApiModelProperty(value = "需要的模块") + private List needModules; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderReceivedCreateDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderReceivedCreateDTO.java new file mode 100644 index 0000000..d256550 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderReceivedCreateDTO.java @@ -0,0 +1,87 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.Map; + + +/** + * 订单接单请求对象 + * + * @author xiehuaqiao + * @version 2023-11-20 + */ +@Data +@Builder +public class TpProdOrderReceivedCreateDTO implements Serializable { + + + + /** + * 业务单据编号 + */ + @ApiModelProperty(value = "业务单据编号") + private String bizObjNo; + + /** + * 业务单据类型 + */ + @ApiModelProperty(value = "业务单据类型") + private String bizObjType; + /** + * 接单组织编号 + */ + @ApiModelProperty(value = "接单组织编号") + private String orgNo; + + /** + * 接单组织名称 + */ + @ApiModelProperty(value = "接单组织名称") + private String orgName; + + /** + * 接单人编号 + */ + @ApiModelProperty(value = "接单人编号") + @NotBlank(message = "接单人编号不能为空") + private String receiverNo; + + /** + * 接单人名称 + */ + @ApiModelProperty(value = "接单人名称") + @NotBlank(message = "接单人名称不能为空") + private String receiverName; + + /** + * 接单时间 + */ + @ApiModelProperty(value = "接单时间") + @NotBlank(message = "接单时间不能为空") + private Long receivedTime = System.currentTimeMillis(); + + /** + * 接单状态 + */ + @ApiModelProperty(value = "接单状态") + @NotBlank(message = "接单状态不能为空") + private Integer receivedStatus; + + /** + * 业务扩展字段 + */ + @ApiModelProperty(value = "业务扩展字段") + private Map bizData; + /** + * 租户id + */ + @NotBlank(message = "租户id不能为空") + private String tenantId; + + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderReceivedDetailDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderReceivedDetailDTO.java new file mode 100644 index 0000000..4a0fb91 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderReceivedDetailDTO.java @@ -0,0 +1,48 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * @author amos wong + * @create 2023/10/30 14:57 + * @Description + */ +@Data +public class TpProdOrderReceivedDetailDTO implements Serializable { + + private static final long serialVersionUID = 4262844007335163602L; + + /** + * 接单编号 + */ + @ApiModelProperty(value = "接单编号") + @NotNull(message = "接单编号不能为空") + private String receiveNo; + + /** + * 业务单据编号 + * + */ + @ApiModelProperty(value = "业务单据编号") + @NotNull(message = "业务单据编号不能为空") + private String bizObjNo; + + /** + * 业务单据类型 + */ + @ApiModelProperty(value = "业务单据类型") + @NotNull(message = "业务单据类型不能为空") + private String bizObjType; + + /** + * 租户id + */ + @NotBlank(message = "租户id不能为空") + private String tenantId; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderRescheduleDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderRescheduleDTO.java new file mode 100644 index 0000000..cbeaea7 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderRescheduleDTO.java @@ -0,0 +1,67 @@ +package com.deepinnet.tptradeprod.common.dto; + +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * + *

+ * + * @author chenjiaju + * @since 2024/7/18 + */ + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel("改签对象") +public class TpProdOrderRescheduleDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 改签订单编号 + */ + private String originalOrderNo; + + /** + * 改签list + */ + @ApiModelProperty("改签信息") + private List rescheduleRecords; + + /** + * 改签后下单参数 + */ + @ApiModelProperty("改签后重下单参数") + private TpProdOrderCreateDTO createOrderDto; + + /** + * 失效凭证列表 + */ + @ApiModelProperty("失效凭证列表") + private List invalidVoucherDTOs; + + /** + * 订单详情 + */ + @ApiModelProperty(value = "订单详情") + private TpProdOrderDetailVO orderDetail; + + /** + * 租户ID + */ + @ApiModelProperty(value = "租户ID") + private String tenantId; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderRescheduleInfoDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderRescheduleInfoDTO.java new file mode 100644 index 0000000..09bcddc --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderRescheduleInfoDTO.java @@ -0,0 +1,81 @@ +package com.deepinnet.tptradeprod.common.dto; + +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; + +/** + *

+ * + *

+ * + * @author abel + * @since 2024-07-15 + */ +@Getter +@Setter +public class TpProdOrderRescheduleInfoDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 改签前售卖单元编号 + */ + private String subjectItemNo; + + /** + * 改签后售卖单元编号 + */ + private String rescheduleSubjectItemNo; + + /** + * 改签前班次编号 + */ + private String shuttleNo; + + /** + * 改签后班次编号 + */ + private String rescheduleShuttleNo; + + /** + * 班次日期 + */ + private String shuttleDate; + + /** + * 班次时间 + */ + private String shuttleTime; + + /** + * 改签后班次日期 + */ + private String rescheduleShuttleDate; + + /** + * 改签后班次时间 + */ + private String rescheduleShuttleTime; + + /** + * 乘客编号 + */ + private String passengerNo; + + /** + * 乘客姓名 + */ + private String passengerName; + + /** + * 乘客数量 + */ + private Integer passengerCount; + + /** + * 乘客类型 + */ + private String passengerType; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderRescheduleInvalidVoucherDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderRescheduleInvalidVoucherDTO.java new file mode 100644 index 0000000..6c637c2 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderRescheduleInvalidVoucherDTO.java @@ -0,0 +1,34 @@ +package com.deepinnet.tptradeprod.common.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @author amos wong + * @create 2024/7/5 15:35 + * @Description 改签需要失效的凭证上下文 + */ +@Data +public class TpProdOrderRescheduleInvalidVoucherDTO implements Serializable { + /** + * 改签原始订单编号 + */ + private String originalOrderNo; + + /** + * 改签订单编号 + */ + private String orderNo; + + /** + * 失效凭证列表 + */ + private List invalidVoucherDTOs; + + /** + * 租户id + */ + private String tenantId; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderRescheduleRecordDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderRescheduleRecordDTO.java new file mode 100644 index 0000000..2a3c273 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderRescheduleRecordDTO.java @@ -0,0 +1,36 @@ +package com.deepinnet.tptradeprod.common.dto; + +import com.deepinnet.tptradeprod.common.vo.reschedule.TpProdOrderRescheduleInfoVO; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * + *

+ * + * @author abel + * @since 2024-07-15 + */ +@Data +public class TpProdOrderRescheduleRecordDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 改签前订单编号 + */ + private String originalOrderNo; + + /** + * 改签信息 + */ + private List orderRescheduleInfos; + + /** + * 行程类型 + */ + private String tripType; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderRscConfirmQueryDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderRscConfirmQueryDTO.java new file mode 100644 index 0000000..63f745d --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderRscConfirmQueryDTO.java @@ -0,0 +1,49 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * @author xiehuaqiao + * @create 2023/10/30 15:12 + * @Description 订单审核确认页面展示DTO + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class TpProdOrderRscConfirmQueryDTO implements Serializable { + /** + * 子订单单号 + */ + @ApiModelProperty(value = "子订单单号") + @Deprecated + private String orderNo; + + /** + * 原始订单编号 + */ + @ApiModelProperty(value = "原始订单编号") + private String originalOrderNo; + + + /** + * 减免服务费业务变更类型 + * 7:定制包车订单减免服务费审核" + * 8:定制包车订单变更减免服务费审核" + **/ + @ApiModelProperty(value = "减免服务费业务变更类型") + private Integer rscBizChangeType; + + + + @NotBlank(message = "租户id不能为空") + private String tenantId; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderServiceChargeReduceConfirmDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderServiceChargeReduceConfirmDTO.java new file mode 100644 index 0000000..520c8c3 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdOrderServiceChargeReduceConfirmDTO.java @@ -0,0 +1,87 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Map; + + +/** + * 订单服务费减免审核确认请求对象 + * + * @author xiehuaqiao + * @version 2023-11-20 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class TpProdOrderServiceChargeReduceConfirmDTO implements Serializable { + + /** + * 子订单单号 + */ + @ApiModelProperty(value = "子订单单号") + @Deprecated + private String orderNo; + + /** + * 原始订单编号 + */ + @ApiModelProperty(value = "原始订单编号") + private String originalOrderNo; + + /** + * 审核单编码 + */ + @ApiModelProperty(value = "审核单编码") + private String auditNo; + + /** + * 审核单类型 + */ + @ApiModelProperty(value = "审核单类型") + private Integer auditType; + + /** + * 审核状态 + */ + @ApiModelProperty(value = "审核状态") + private String auditStatus; + + /** + * 订单确认审核建议 + */ + @ApiModelProperty(value = "审核建议") + private String auditResult; + + /** + * 订单确认审核操作员编号 + */ + @ApiModelProperty(value = "订单确认审核操作员编号") + private String operatorNo; + + /** + * 订单确认审核操作员名称 + */ + @ApiModelProperty(value = "订单确认审核操作员名称") + private String operatorName; + + /** + * 扩展字段 + */ + @ApiModelProperty(value = "扩展字段") + private Map bizData; + + /** + * 租户ID + */ + @ApiModelProperty(value = "租户ID") + private String tenantId; + + + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdPageQueryRefundApplyOrderDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdPageQueryRefundApplyOrderDTO.java new file mode 100644 index 0000000..5c41540 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdPageQueryRefundApplyOrderDTO.java @@ -0,0 +1,82 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.*; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class TpProdPageQueryRefundApplyOrderDTO implements Serializable { + + private static final long serialVersionUID = -1825259558889954822L; + + /** + * 类目名称 + */ + @ApiModelProperty(value = "类目名称") + private String productCategoryName; + + /** + * 类目编号 + */ + @ApiModelProperty(value = "类目编号") + private String productCategoryNo; + + /** + * 订单号 + */ + @ApiModelProperty(value = "订单号") + private String orderNo; + + /** + * 线路名称 + */ + @ApiModelProperty(value = "线路名称") + private String routeName; + + /** + * 线路code + */ + @ApiModelProperty(value = "线路code") + private String routeCode; + + /** + * 查询哪些状态的退票申请单据 + */ + @ApiModelProperty(value = "目标状态") + private List targetStatusList; + + /** + * 退款申请单号 + */ + @ApiModelProperty(value = "退款申请单号") + private String refundApplyOrderNo; + + /** + * 用户手机号 + */ + @ApiModelProperty(value = "用户手机号") + private String phone; + + /** + * 用户编号 + */ + private String userNo; + + /** + * 租户id + */ + @NotBlank(message = "租户id不能为空") + private String tenantId; + + @ApiModelProperty(value = "页码", required = true) + private Integer pageNum = 1; + + @ApiModelProperty(value = "页大小", required = true) + private Integer pageSize = 10; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdPayOrderDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdPayOrderDTO.java new file mode 100644 index 0000000..88e3ec0 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdPayOrderDTO.java @@ -0,0 +1,136 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + * @author amos wong + * @create 2023/8/14 17:16 + * @Description + */ +@Data +public class TpProdPayOrderDTO implements Serializable { + + private static final long serialVersionUID = -739379435242703266L; + + /** + * 支付单号 + */ + @ApiModelProperty(value = "支付单号") + private String payOrderNo; + + /** + * 业务单号 + */ + @ApiModelProperty(value = "业务单号") + private String bizNo; + + /** + * 业务类型 + */ + @ApiModelProperty(value = "业务类型") + private String bizType; + + /** + * 优惠金额 + */ + @ApiModelProperty(value = "优惠金额") + private String discountAmount; + + /** + * 计费金额 + */ + @ApiModelProperty(value = "计费金额") + private String chargeAmount; + + /** + * 实付金额 + */ + @ApiModelProperty(value = "正向支付单代表实付金额,逆向退款单代表实退金额") + private String payAmount; + + /** + * 支付方式 + */ + @ApiModelProperty(value = "支付方式") + private String payType; + + /** + * 支付场景 + */ + @ApiModelProperty(value = "支付场景") + private String payScene; + + /** + * 支付标题 + */ + @ApiModelProperty(value = "支付标题") + private String payTitle; + + /** + * 支付单状态 + */ + @ApiModelProperty(value = "支付单状态,正向支付单的状态:paying-支付中,paid-已支付, 逆向退款单的状态:refunding-退款中,refund-已退款。closed-已关闭") + private String status; + + /** + * 支付时间 + */ + @ApiModelProperty(value = "正向支付单代表:支付时间;逆向退款单:代表退款成功时间") + private Long payTime; + + /** + * 支付过期时间 + */ + @ApiModelProperty(value = "支付过期时间") + private Long payTimeout; + + /** + * 三方支付流水号 + */ + @ApiModelProperty(value = "正向支付单:三方支付流水号。逆向退款单无此字段") + private String outPayFlowId; + + /** + * 是否需要计收费 + */ + @ApiModelProperty(value = "是否需要计收费") + private Boolean chargeRequired; + + /** + * 账单 + */ + @ApiModelProperty(value = "账单") + private TpBillDTO tpBill; + + /** + * 计费单 + */ + @ApiModelProperty(value = "计费单") + private TpChargeDTO tpChargeDTO; + + /** + * 收入账号 + */ + @ApiModelProperty(value = "收入账号") + private TpFinancialAccountDTO payeeAccount; + + /** + * 支出账号 + */ + @ApiModelProperty(value = "支出账号") + private TpFinancialAccountDTO payerAccount; + + /** + * 租户id + */ + private String tenantId; + + /** + * 拓展字段 + */ + private Map bizData; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdPriceInquireDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdPriceInquireDTO.java new file mode 100644 index 0000000..0f20331 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdPriceInquireDTO.java @@ -0,0 +1,52 @@ +package com.deepinnet.tptradeprod.common.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + *

+ * 询价类型 + *

+ * + * @author chenjiaju + * @since 2023/9/8 + */ + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TpProdPriceInquireDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /*** + * 定价单元编码 (这个参数不传) + */ + private String priceUnitCode; + + /** + * 乘客类型 + */ + private String passengerType; + + /*** + * 销售单元编码 + */ + private String salesUnitCode; + + /** + * 定价规则入参列表 + */ + private TpProdPricingParamDTO pricingParam; + + /** + * 租户id + */ + private String tenantId; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdPricingParamDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdPricingParamDTO.java new file mode 100644 index 0000000..51ba5de --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdPricingParamDTO.java @@ -0,0 +1,62 @@ +package com.deepinnet.tptradeprod.common.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + *

+ * 询价参数 + *

+ * + * @author chenjiaju + * @since 2023/9/8 + */ + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class TpProdPricingParamDTO implements Serializable { + + /** + * 当前时间戳 + */ + private Long nowTime; + + /** + * 里程 + */ + private BigDecimal miles; + + /** + * 站点数量 + */ + private Integer stationCount; + + /** + * 乘客类型 + */ + private String passengerType; + + /** + * 车票类型 + */ + private String ticketType; + + /** + * 乘客数量 + */ + private Integer passengerCount; + + /** + * 行程类型 + */ + private String goBackType; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdQueryAvailableRefundVoucherDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdQueryAvailableRefundVoucherDTO.java new file mode 100644 index 0000000..d334d5e --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdQueryAvailableRefundVoucherDTO.java @@ -0,0 +1,43 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.*; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class TpProdQueryAvailableRefundVoucherDTO implements Serializable { + + private static final long serialVersionUID = 635061896960139213L; + + /** + * 订单编号 + */ + @NotBlank(message = "订单编号不能为空") + @ApiModelProperty(value = "订单编号") + private String orderNo; + + @NotBlank(message = "产品编号不能为空") + @ApiModelProperty(value = "产品编号") + private String productNo; + + @ApiModelProperty(value = "行程类型") + private String tripType; + + /** + * 可申请退票的凭证状态 + */ + private List availableStatusList; + + /** + * 租户id + */ + @NotBlank(message = "租户id不能为空") + @ApiModelProperty(value = "租户id") + private String tenantId; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdQueryAvailableRescheduleVoucherDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdQueryAvailableRescheduleVoucherDTO.java new file mode 100644 index 0000000..82cd953 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdQueryAvailableRescheduleVoucherDTO.java @@ -0,0 +1,40 @@ +package com.deepinnet.tptradeprod.common.dto; + +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.List; + +@Data +@Accessors(chain = true) +public class TpProdQueryAvailableRescheduleVoucherDTO implements Serializable { + + private static final long serialVersionUID = -7986365548401766749L; + + /** + * 订单编号 + */ + @ApiModelProperty(value = "订单编号") + private String orderNo; + + @ApiModelProperty(value = "产品编码") + private String productCode; + + @ApiModelProperty(value = "申请时间") + private Long applyTime; + + private List voucherNos; + + private TpProdOrderDetailVO orderDetailVO; + + private String processType; + + /** + * 租户id + */ + @ApiModelProperty(value = "租户id") + private String tenantId; +} \ No newline at end of file diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdQueryPayResultDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdQueryPayResultDTO.java new file mode 100644 index 0000000..1606655 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdQueryPayResultDTO.java @@ -0,0 +1,38 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * @author amos wong + * @create 2022-11-08 11:37 + *

+ * 向第三方支付平台查询支付结果的请求 + */ +@Data +public class TpProdQueryPayResultDTO implements Serializable { + + private static final long serialVersionUID = 8033537303328773700L; + + /** + * 系统内部业务单号,根据业务场景区分,目前这里是订单号 + */ + @NotBlank(message = "订单号不能为空") + @ApiModelProperty(value = "订单号") + private String orderNo; + + /** + * 组织编码 + */ + private String orgCode; + + /** + * 租户id + */ + @NotBlank(message = "租户id不能为空") + @ApiModelProperty(value = "租户id") + private String tenantId; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdQueryRefundApplyOrderDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdQueryRefundApplyOrderDTO.java new file mode 100644 index 0000000..632e44f --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdQueryRefundApplyOrderDTO.java @@ -0,0 +1,58 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.*; +import org.apache.commons.compress.utils.Lists; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.List; + +/** + * @author amos wong + * @create 2023/8/25 11:03 + * @Description + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class TpProdQueryRefundApplyOrderDTO implements Serializable { + + private static final long serialVersionUID = 4479367133110443650L; + + /** + * 订单号 + */ + @ApiModelProperty(value = "订单号") + private String orderNo; + + /** + * 退票申请单号 + */ + @ApiModelProperty(value = "退票申请单号") + private String refundApplyOrderNo; + + /** + * 用户编号 + */ + @ApiModelProperty(value = "用户编号") + private String userNo; + + /** + * 目标状态列表 + */ + private List targetStatusList; + + /** + * 需要的属性列表 + * TpRefundApplyOrderModulesEnum + */ + private List needProperties = Lists.newArrayList(); + + /** + * 租户ID + */ + @NotBlank(message = "租户id不能为空") + private String tenantId; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdQueryRefundDetailDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdQueryRefundDetailDTO.java new file mode 100644 index 0000000..6f5fc7b --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdQueryRefundDetailDTO.java @@ -0,0 +1,30 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.*; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class TpProdQueryRefundDetailDTO implements Serializable { + + private static final long serialVersionUID = -5991090850249313378L; + + /** + * 退票申请单号 + */ + @NotBlank(message = "退票申请单号不能为空") + @ApiModelProperty(value = "退票申请单号") + private String refundApplyOrderNo; + + /** + * 租户id + */ + @ApiModelProperty(value = "租户id") + @NotBlank(message = "租户id不能为空") + private String tenantId; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdRefundApplyDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdRefundApplyDTO.java new file mode 100644 index 0000000..0eaefa8 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdRefundApplyDTO.java @@ -0,0 +1,150 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.*; +import lombok.Data; + +import javax.validation.constraints.*; +import java.io.Serializable; +import java.util.*; + +@Data +@ApiModel("申请退票入参") +public class TpProdRefundApplyDTO implements Serializable { + + private static final long serialVersionUID = -3171143451351749948L; + + /** + * 订单号 + */ + @ApiModelProperty(value = "订单号") + @NotBlank(message = "订单号不能为空") + private String orderNo; + + /** + * 申请退票用户编号 + */ + @NotBlank(message = "申请退票用户编号") + @ApiModelProperty(value = "订单号") + private String userNo; + + /** + * 退票原因 + */ + @ApiModelProperty(value = "退票原因") + private String reason; + + /** + * 是否是实名制退票 + */ + @NotBlank(message = "是否是实名制退票") + @ApiModelProperty(value = "是否是实名制退票") + private Boolean realNameRefund; + + /** + * 产品编码 + */ + @ApiModelProperty(value = "产品编码") + private String productCode; + + /** + * 产品名称 + */ + @ApiModelProperty(value = "产品名称") + private String productName; + + @ApiModelProperty(value = "行程类型") + private String tripType; + + /** + * 产品类目编号 + */ + @ApiModelProperty(value = "产品类目编号") + private String productCategoryNo; + + /** + * 产品类目名称 + */ + @ApiModelProperty(value = "产品类目名称") + private String productCategoryName; + + /** + * 路程和班次信息 + */ + @ApiModelProperty(value = "路程和班次信息") + private List refundRouteDTOS; + + /** + * 用车需求方 + */ + @ApiModelProperty(value = "用车需求方") + private TpRefundRequirementUserDTO refundRequirementUser; + + private List refundSubjectItems; + + /** + * 申请时间 + */ + @ApiModelProperty(value = "申请时间") + private Long applyTime; + + /** + * 申请退款金额 + */ + @ApiModelProperty(value = "申请退款金额") + @NotBlank(message = "申请退款金额不能为空") + private String applyAmount; + + /** + * 退款计费金额 + */ + @ApiModelProperty(value = "退款计费金额") + @NotBlank(message = "退款计费金额不能为空") + private String chargeAmount; + + /** + * 实退金额 + */ + @ApiModelProperty(value = "实退金额") + @NotBlank(message = "实退金额不能为空") + private String refundAmount; + + /** + * 实名制退票选择的内容 + */ + @ApiModelProperty(value = "实名制退票选择的内容") + private List realNameTicketRefundChoiceDTOs; + + /** + * 非实名制退票选择的内容 + */ + @ApiModelProperty(value = "非实名制退票选择的内容") + private List nonRealNameTicketChoiceDTOs; + + private String orgCode; + + /** + * 租户id + */ + @ApiModelProperty(value = "租户id") + @NotBlank(message = "租户id不能为空") + private String tenantId; + + /** + * 退款方式 + */ + @ApiModelProperty(value = "退款方式") + @NotBlank(message = "退款方式不能为空") + private String refundType; + + /** + * 退票申请人信息 + */ + @ApiModelProperty(value = "退票申请人") + @NotBlank(message = "退票申请人不能为空") + private TpRefundApplicantDTO refundApplicantDTO; + + /** + * 拓展字段 + */ + private Map bizData; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdRefundApplyOrderDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdRefundApplyOrderDTO.java new file mode 100644 index 0000000..9e3a4de --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdRefundApplyOrderDTO.java @@ -0,0 +1,154 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.*; + +/** + * @author amos wong + * @create 2023/7/26 10:01 + * @Description 退票申请单领域模型 + */ + +@Data +@Accessors(chain = true) +public class TpProdRefundApplyOrderDTO implements Serializable { + + private static final long serialVersionUID = 1; + + /** + * 退票申请单号 + */ + @ApiModelProperty(value = "退票申请单号") + private String refundApplyOrderNo; + + @ApiModelProperty(value = "产品编码") + private String productCode; + + @ApiModelProperty(value = "产品名称") + private String productName; + + /** + * 产品类目编号 + */ + @ApiModelProperty(value = "产品类目编号") + private String productCategoryNo; + + /** + * 产品类目名称 + */ + @ApiModelProperty(value = "产品类目名称") + private String productCategoryName; + + /** + * 申请退票用户编号 + */ + @ApiModelProperty(value = "申请退票用户编号") + private String userNo; + + /** + * 原订单号 + */ + @ApiModelProperty(value = "原订单号") + private String orderNo; + + /** + * 业务类型 + */ + @ApiModelProperty(value = "业务类型") + private String bizType; + + /** + * 退票原因 + */ + @ApiModelProperty(value = "退票原因") + private String reason; + + /** + * 申请时间 + */ + @ApiModelProperty(value = "申请时间") + private Long applyTime; + + /** + * 状态 + */ + @ApiModelProperty(value = "退票状态,枚举:pending_approval-待审核,approved-审核通过,rejected-审核驳回,refunding-退票中,refunded_success-退票成功") + private String status; + + /** + * 申请退款金额 + */ + @ApiModelProperty(value = "申请退款金额") + private String applyAmount; + + /** + * 退款计费金额 + */ + @ApiModelProperty(value = "手续费金额,单位元") + private String chargeAmount; + + /** + * 实退金额 + */ + @ApiModelProperty(value = "实退金额,单位元") + private String refundAmount; + + /** + * 退款方式:原路退回或线下退款 + * + * @see com.deepinnet.tptradecore.common.util.enums.TpRefundTypeEnum + */ + @ApiModelProperty(value = "退款方式") + private String refundType; + + /** + * 线路 / 班次 + */ + @ApiModelProperty(value = "线路和班次信息") + private List refundRoutes; + + /** + * 退款支付单列表 + */ + @ApiModelProperty(value = "退款支付单列表") + private List refundPayOrderDTOs; + + /** + * 正向支付单 + */ + @ApiModelProperty(value = "正向支付单") + private TpProdPayOrderDTO paidOrder; + + /** + * 退票标的项 + */ + @ApiModelProperty(value = "退票标的项") + private List subjectItemList; + + /** + * 退票乘客信息-实名制 + */ + @ApiModelProperty(value = "退票乘客信息-实名制") + private List passengerDTOs; + + /** + * 退票申请人 + */ + @ApiModelProperty(value = "退票申请人") + private TpRefundApplicantDTO refundApplicantDTO; + + /** + * 行程类型 + */ + @ApiModelProperty(value = "行程类型") + private String tripType; + + /** + * 业务拓展字段 + */ + private Map bizData; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdRefundAvailableCheckDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdRefundAvailableCheckDTO.java new file mode 100644 index 0000000..8f1cb12 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdRefundAvailableCheckDTO.java @@ -0,0 +1,39 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.*; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author amos wong + * @create 2023/12/27 15:06 + * @Description + */ +@Data +public class TpProdRefundAvailableCheckDTO implements Serializable { + + /** + * 订单号 + */ + @ApiModelProperty(value = "订单编号") + private String orderNo; + + /** + * 产品编码 + */ + @ApiModelProperty(value = "产品编码") + private String productCode; + + /** + * 用户编号 + */ + @ApiModelProperty(value = "用户编号") + private String userNo; + + /** + * 租户id + */ + @ApiModelProperty(value = "租户id") + private String tenantId; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdRefundCharteredBusDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdRefundCharteredBusDTO.java new file mode 100644 index 0000000..0d8ead1 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdRefundCharteredBusDTO.java @@ -0,0 +1,56 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * @author amos wong + * @create 2023/11/6 17:06 + * @Description + */ +@Data +public class TpProdRefundCharteredBusDTO implements Serializable { + + /** + * 订单号 + */ + @ApiModelProperty(value = "订单号") + @NotBlank(message = "订单号不能为空") + private String orderNo; + + /** + * 业务单号 + */ + @ApiModelProperty(value = "业务单号") + @NotBlank(message = "业务单号不能为空") + private String bizNo; + + @ApiModelProperty(value = "业务类型") + @NotBlank(message = "业务类型不能为空") + private String refundBizType; + + /** + * 租户id + */ + @ApiModelProperty(value = "租户id") + @NotBlank(message = "租户id不能为空") + private String tenantId; + + /** + * 退款方式 + */ + @ApiModelProperty(value = "退款方式") + @NotBlank(message = "退款方式不能为空") + private String refundType; + + /** + * 退票申请人信息 + */ + @ApiModelProperty(value = "退票申请人") + @NotBlank(message = "退票申请人不能为空") + private TpRefundApplicantDTO refundApplicantDTO; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdRefundElementDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdRefundElementDTO.java new file mode 100644 index 0000000..17299a7 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdRefundElementDTO.java @@ -0,0 +1,46 @@ +package com.deepinnet.tptradeprod.common.dto; + + +import lombok.Data; + +import java.io.Serializable; + +/** + *

+ * 退票要素信息 + *

+ * + * @author amos + * @since 2023-08-11 15:46:31 + */ +@Data +public class TpProdRefundElementDTO implements Serializable { + + private static final long serialVersionUID = 9125928179948355125L; + + /** + * 要素类型(退票) + */ + private String elementType; + + /** + * 要素code + */ + private String elementCode; + + /** + * 要素名称 + */ + private String elementName; + + /** + * 要素Key + */ + private String elementKey; + + /** + * 要素值 + */ + private String elementValue; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdReschedulePaidSuccessDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdReschedulePaidSuccessDTO.java new file mode 100644 index 0000000..4024601 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdReschedulePaidSuccessDTO.java @@ -0,0 +1,33 @@ +package com.deepinnet.tptradeprod.common.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author amos wong + * @create 2024/7/8 17:48 + * @Description + */ +@Data +public class TpProdReschedulePaidSuccessDTO implements Serializable { + /** + * 改签原始订单编号 + */ + private String originalOrderNo; + + /** + * 当前改签订单的编号 + */ + private String orderNo; + + /** + * 付款金额 + */ + private String payAmount; + + /** + * 租户id + */ + private String tenantId; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdShowRefundButtonCheckDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdShowRefundButtonCheckDTO.java new file mode 100644 index 0000000..f9d7ca6 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdShowRefundButtonCheckDTO.java @@ -0,0 +1,39 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author amos wong + * @create 2023/12/27 15:06 + * @Description + */ +@Data +public class TpProdShowRefundButtonCheckDTO implements Serializable { + + /** + * 订单号 + */ + @ApiModelProperty(value = "订单编号") + private String orderNo; + + /** + * 产品编码 + */ + @ApiModelProperty(value = "产品编码") + private String productCode; + + /** + * 用户编号 + */ + @ApiModelProperty(value = "用户编号") + private String userNo; + + /** + * 租户id + */ + @ApiModelProperty(value = "租户id") + private String tenantId; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdTimeRangeExistVerificationRecordDateQueryDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdTimeRangeExistVerificationRecordDateQueryDTO.java new file mode 100644 index 0000000..1e88fb3 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdTimeRangeExistVerificationRecordDateQueryDTO.java @@ -0,0 +1,39 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author amos wong + * @create 2024/1/11 11:33 + * @Description + */ +@Data +public class TpProdTimeRangeExistVerificationRecordDateQueryDTO implements Serializable { + + /** + * 用户编号 + */ + @ApiModelProperty(value = "用户编号") + private String userNo; + + /** + * 查询凭证核销记录的开始时间 + */ + @ApiModelProperty(value = "开始时间,月初第一天的00:00:00") + private Long startTime; + + /** + * 查询凭证核销记录的结束时间 + */ + @ApiModelProperty(value = "结束时间,月末最后一天的23:59:59") + private Long endTime; + + /** + * 租户id + */ + @ApiModelProperty(value = "租户id") + private String tenantId; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdTimeRangeUserVerificationRecordDetailQueryDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdTimeRangeUserVerificationRecordDetailQueryDTO.java new file mode 100644 index 0000000..7b7e14e --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdTimeRangeUserVerificationRecordDetailQueryDTO.java @@ -0,0 +1,26 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author amos wong + * @create 2024/1/11 14:09 + * @Description + */ +@Data +public class TpProdTimeRangeUserVerificationRecordDetailQueryDTO implements Serializable { + @ApiModelProperty(value = "用户编号") + private String userNo; + + @ApiModelProperty(value = "租户id") + private String tenantId; + + @ApiModelProperty(value = "当天的开始时间,00:00:00") + private Long startTime; + + @ApiModelProperty(value = "当天的结束时间,23:59:59") + private Long endTime; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdUserVoucherVerificationRecordDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdUserVoucherVerificationRecordDTO.java new file mode 100644 index 0000000..e789788 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdUserVoucherVerificationRecordDTO.java @@ -0,0 +1,29 @@ +package com.deepinnet.tptradeprod.common.dto; + +import com.deepinnet.tptradeprod.common.vo.TpOrderTravelTripVO; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @author amos wong + * @create 2024/1/11 14:24 + * @Description + */ +@Data +public class TpProdUserVoucherVerificationRecordDTO implements Serializable { + + @ApiModelProperty(value = "订单编号") + private String orderNo; + + @ApiModelProperty(value = "实名制乘车核销信息") + private List realNameVerificationRecordList; + + @ApiModelProperty(value = "非实名制乘车记录") + private List nonRealNameVerificationRecordList; + + @ApiModelProperty(value = "行程信息") + private TpOrderTravelTripVO travelTripVO; +} \ No newline at end of file diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdVerificationPassengerDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdVerificationPassengerDTO.java new file mode 100644 index 0000000..4408fae --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdVerificationPassengerDTO.java @@ -0,0 +1,52 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +public class TpProdVerificationPassengerDTO implements Serializable { + + /** + * 核销时间 + */ + @ApiModelProperty(value = "核销时间") + private Long verificationTime; + + /** + * 乘客编号 + */ + @ApiModelProperty(value = "乘客编号") + private String passengerNo; + + /** + * 姓名 + */ + @ApiModelProperty(value = "姓名") + private String name; + + /** + * 联系方式 + */ + @ApiModelProperty(value = "联系方式") + private String contactInfo; + + /** + * 证件号 + */ + @ApiModelProperty(value = "证件号") + private String certNo; + + /** + * 证件类型 + */ + @ApiModelProperty(value = "证件类型") + private String certType; + + /** + * 乘客类型 + */ + @ApiModelProperty(value = "乘客类型") + private String passengerType; +} \ No newline at end of file diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdVoucherCheckDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdVoucherCheckDTO.java new file mode 100644 index 0000000..d25ed82 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdVoucherCheckDTO.java @@ -0,0 +1,95 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.*; +import java.io.Serializable; +import java.util.Map; + +/** + * @author amos wong + * @create 2023/7/7 15:20 + * @Description 凭证核销接口 + */ +@Data +public class TpProdVoucherCheckDTO implements Serializable { + + private static final long serialVersionUID = 173696721635551542L; + + /** + * 需要核销的凭证编号 + */ + @NotBlank(message = "凭证编号不能为空") + @ApiModelProperty(value = "需要核销的凭证编号") + private String voucherNo; + + /** + * 用户编号 + */ + @NotBlank(message = "用户编号不能为空") + @ApiModelProperty(value = "用户编号") + private String userNo; + + /** + * 订单编号 + */ + @NotBlank(message = "订单编号不能为空") + @ApiModelProperty(value = "订单编号") + private String orderNo; + + /** + * 学生信息 + */ + @ApiModelProperty(value = "学生信息") + private TpStudentInfoDTO studentInfoDTO; + + /** + * 线路编号 + */ + @ApiModelProperty(value = "线路编号") + private String routeId; + + /** + * 线路名称 + */ + @ApiModelProperty(value = "线路名称") + private String routeName; + + /** + * 班次id + */ + @ApiModelProperty(value = "班次id") + private String shuttleId; + + /** + * 班次名称 + */ + @ApiModelProperty(value = "班次名称") + private String shuttleName; + + /** + * 检票方式 + */ + @ApiModelProperty(value = "检票方式:qr_code_check-二维码检票,manual_check-人工检票,third_party-第三方检票") + private String validationType; + + /** + * 核销时间 + */ + @NotNull(message = "核销时间不能为空") + @ApiModelProperty(value = "核销时间") + private Long verificationTime; + + /** + * 租户id + */ + @NotBlank(message = "租户id不能为空") + @ApiModelProperty(value = "租户id") + private String tenantId; + + /** + * 拓展字段 + */ + private Map bizData; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdVoucherCreateDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdVoucherCreateDTO.java new file mode 100644 index 0000000..b64e16a --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdVoucherCreateDTO.java @@ -0,0 +1,100 @@ +package com.deepinnet.tptradeprod.common.dto; + +import lombok.Data; + +import javax.validation.constraints.*; +import java.io.Serializable; +import java.util.*; + +/** + * @author amos wong + * @create 2023/7/7 11:36 + * @Description + */ +@Data +public class TpProdVoucherCreateDTO implements Serializable { + + private static final long serialVersionUID = 7891034483468047936L; + + /** + * 用户编号 + */ + @NotBlank(message = "用户编号不能为空") + private String userNo; + + /** + * 订单号 + */ + @NotBlank(message = "订单编号不能为空") + private String orderNo; + + /** + * 线路id + */ + @NotBlank(message = "线路id不能为空") + private String routeId; + + /** + * 线路名称 + */ + @NotBlank(message = "线路名称不能为空") + private String routeName; + + /** + * 产品类目编号 + */ + private String productCategoryNo; + + /** + * 产品类目名称 + */ + private String productCategoryName; + + /** + * 用户选择的车票列表 + */ + private List ticketChoiceDTOs; + + /** + * 凭证类型 + * + * @see com.deepinnet.tptradecore.common.util.enums.TpVoucherTypeEnum + */ + @NotBlank(message = "凭证类型不能为空") + private String voucherType; + + /** + * 检票方式 + * + * @see com.deepinnet.tptradecore.common.util.enums.TpVoucherValidationTypeEnum + */ + private List validationTypes; + + /** + * 凭证规则列表 + */ + private List bizRuleDTOs; + + /** + * 是否需要实名 + */ + @NotNull(message = "是否需要实名不能为空") + private Boolean requiredRealName; + + /** + * com.deepinnet.tptradecore.common.enums.voucher.TpVoucherChannelEnum + * 凭证生成渠道 + */ + private String channel; + + /** + * 租户id + */ + @NotBlank(message = "租户id不能为空") + private String tenantId; + + /** + * 拓展字段 + */ + private Map bizData; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdVoucherDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdVoucherDTO.java new file mode 100644 index 0000000..ce338a2 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdVoucherDTO.java @@ -0,0 +1,211 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.*; + +/** + * @author amos wong + * @create 2023/7/26 10:26 + * @Description 出行凭证 + */ +@Data +public class TpProdVoucherDTO implements Serializable { + + private static final long serialVersionUID = -2188093318989987674L; + + /** + * 凭证编号 + */ + @ApiModelProperty(value = "凭证编号") + private String voucherNo; + + /** + * 用户编号 + */ + @ApiModelProperty(value = "用户编号") + private String userNo; + + /** + * 订单号 + */ + @ApiModelProperty(value = "订单号") + private String orderNo; + + /** + * 凭证编码 + */ + @ApiModelProperty(value = "凭证编码") + private String voucherCode; + + /** + * 订单详情页展示的二维码,里面会包含二维码过期时间 + */ + @ApiModelProperty(value = "订单详情页展示的二维码") + private String qrCode; + + private String salesUnitCode; + + /** + * 凭证二维码过期时间 + */ + @ApiModelProperty(value = "凭证二维码过期时间") + private Long qrCodeExpireTime; + + /** + * 凭证类型 + */ + @ApiModelProperty(value = "凭证类型:day-日票,week-周票,term-学期票,month-月票,year-年票") + private String type; + + /** + * 有效期开始时间 + */ + @ApiModelProperty(value = "有效期开始时间") + private Long effectiveStartTime; + + /** + * 有效期结束时间 + */ + @ApiModelProperty(value = "有效期结束时间") + private Long effectiveEndTime; + + /** + * 最早检票时间 + */ + @ApiModelProperty(value = "最早检票时间") + private String earliestCheckTime; + + /** + * 最晚检票时间 + */ + @ApiModelProperty(value = "最晚检票时间") + private String latestCheckTime; + + /** + * 线路id + */ + @ApiModelProperty(value = "线路id") + private String routeId; + + /** + * 线路名称 + */ + @ApiModelProperty(value = "线路名称") + private String routeName; + + /** + * 班次id + */ + @ApiModelProperty(value = "班次id") + private String shuttleId; + + /** + * 班次名称 + */ + @ApiModelProperty(value = "班次名称") + private String shuttleName; + + /** + * 验票方式 + */ + @ApiModelProperty(value = "验票方式,qr_code_check-二维码检票,manual_check-人工检票,third_party-第三方检票") + private List validationTypes; + + /** + * 总可用次数 + */ + @ApiModelProperty(value = "总可用次数") + private Integer totalCount; + + /** + * 已核销次数 + */ + @ApiModelProperty(value = "已核销次数") + private Integer redemptionCount; + + /** + * 已退次数 + */ + @ApiModelProperty(value = "已退次数") + private Integer refundCount; + + /** + * 乘客数量 + */ + @ApiModelProperty(value = "乘客数量") + private Integer passengerCount; + + /** + * 是否需要实名,0表示非实名,1表示实名 + */ + @ApiModelProperty(value = "是否需要实名") + private Boolean requiredRealName; + + /** + * 凭证当天的状态 + */ + @ApiModelProperty(value = "凭证状态:created-已创建,invalid-已失效,expire-已过期,refunding-退票中,refunded-已退票,partial_verified-部分核销,fully_verified-全部核销") + private String dayStatus; + + /** + * 凭证实际的状态 + */ + @ApiModelProperty(value = "凭证状态:created-已创建,invalid-已失效,expire-已过期,refunding-退票中,refunded-已退票,partial_verified-部分核销,fully_verified-全部核销") + private String actualStatus; + + /** + * 凭证状态 + */ + @ApiModelProperty(value = "凭证状态:created-已创建,invalid-已失效,expire-已过期,refunding-退票中,refunded-已退票,partial_verified-部分核销,fully_verified-全部核销") + private String status; + + /** + * 乘客信息 + */ + @ApiModelProperty(value = "乘客信息") + private TpVoucherPassengerDTO passenger; + + /** + * 当前凭证是否可展示 + */ + @ApiModelProperty(value = "当前凭证是否可展示") + private Boolean showable; + + /** + * 凭证不可展示的原因 + */ + @ApiModelProperty(value = "凭证不可展示的原因") + private String invisibleReason; + + /** + * 每日可用次数 + */ + @ApiModelProperty(value = "每天可用次数") + private Integer everyDayAvailableCount; + + /** + * 是否一次性核销 + */ + @ApiModelProperty(value = "是否一次性核销") + private Boolean isOneTimeVerification; + + /** + * 租户id + */ + @ApiModelProperty(value = "租户id") + private String tenantId; + + /** + * 行程类型 + */ + @ApiModelProperty(value = "行程类型") + private String tripType; + + /** + * 业务拓展字段 + */ + private Map bizData; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdVoucherQueryDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdVoucherQueryDTO.java new file mode 100644 index 0000000..29361d1 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdVoucherQueryDTO.java @@ -0,0 +1,56 @@ +package com.deepinnet.tptradeprod.common.dto; + +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.List; + +@Data +@Accessors(chain = true) +public class TpProdVoucherQueryDTO implements Serializable { + + private static final long serialVersionUID = -7986365548401766749L; + + /** + * 用户编号 + */ + private String userNo; + + /** + * 凭证编号 + */ + private String voucherNo; + + /** + * 凭证列表 + */ + private List voucherNos; + + /** + * 订单编号 + */ + private String orderNo; + + /** + * 行程类型 + */ + private String tripType; + + /** + * 目标凭证状态列表 + */ + private List targetStatusList; + + /** + * 需要查询的属性 + */ + private List needProperties; + + /** + * 租户id + */ + @NotBlank(message = "租户id不能为空") + private String tenantId; +} \ No newline at end of file diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdVoucherVerificationRecordDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdVoucherVerificationRecordDTO.java new file mode 100644 index 0000000..12d0301 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdVoucherVerificationRecordDTO.java @@ -0,0 +1,58 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + * @author amos wong + * @create 2023/7/26 10:33 + * @Description 检票记录 + */ +@Data +public class TpProdVoucherVerificationRecordDTO implements Serializable { + + private static final long serialVersionUID = -4509678463785746163L; + /** + * 凭证编号 + */ + @ApiModelProperty(value = "凭证编号") + private String voucherNo; + + /** + * 用户编号 + */ + @ApiModelProperty(value = "用户编号") + private String userNo; + + /** + * 验票时间 + */ + @ApiModelProperty(value = "验票时间") + private Long verificationTime; + + /** + * 检票结果 + */ + @ApiModelProperty(value = "检票结果") + private String result; + + /** + * 核销乘客数量 + */ + @ApiModelProperty(value = "核销乘客数量") + private Integer verificationPassengerCount; + + /** + * 失败原因 + */ + @ApiModelProperty(value = "失败原因") + private String reason; + + /** + * 业务拓展字段 + */ + private Map bizData; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdVoucherVerificationRecordQueryDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdVoucherVerificationRecordQueryDTO.java new file mode 100644 index 0000000..9682d17 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpProdVoucherVerificationRecordQueryDTO.java @@ -0,0 +1,34 @@ +package com.deepinnet.tptradeprod.common.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @author amos wong + * @create 2024/1/19 17:52 + * @Description + */ +@Data +public class TpProdVoucherVerificationRecordQueryDTO implements Serializable { + /** + * 订单编号 + */ + private String orderNo; + + /** + * 凭证编号列表 + */ + private List voucherNos; + + /** + * 用户编号 + */ + private String userNo; + + /** + * 租户id + */ + private String tenantId; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRealNamePassengerAvailableRefundDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRealNamePassengerAvailableRefundDTO.java new file mode 100644 index 0000000..100f599 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRealNamePassengerAvailableRefundDTO.java @@ -0,0 +1,25 @@ +package com.deepinnet.tptradeprod.common.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +public class TpRealNamePassengerAvailableRefundDTO implements Serializable { + + /** + * 乘客信息 + */ + private TpVoucherPassengerDTO passengerDTO; + + /** + * 凭证的乘车日期,开始时间戳_结束时间戳,如:1632297600000_1632384000000 + */ + private List voucherTravelDateList; + + /** + * 行程类型 + */ + private String tripType; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRealNameTicketRefundChoiceDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRealNameTicketRefundChoiceDTO.java new file mode 100644 index 0000000..28a5dab --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRealNameTicketRefundChoiceDTO.java @@ -0,0 +1,29 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 实名制退票选择的内容 + */ +@Data +public class TpRealNameTicketRefundChoiceDTO implements Serializable { + + /** + * 实名制选择的退票乘客信息 + */ + @ApiModelProperty(value = "实名制选择的退票乘客信息") + private TpRefundPassengerDTO refundPassengerDTO; + + @ApiModelProperty(value = "行程类型") + private String tripType; + + /** + * 选择退票的乘车日期 + */ + @ApiModelProperty(value = "退订的凭证的乘车日期,开始时间戳_结束时间戳,如:1632297600000_1632384000000") + private List voucherTravelDateList; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRefundApplicantDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRefundApplicantDTO.java new file mode 100644 index 0000000..2e63da0 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRefundApplicantDTO.java @@ -0,0 +1,37 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * @author amos wong + * @create 2023/10/18 11:42 + * @Description + */ +@Data +public class TpRefundApplicantDTO implements Serializable { + + private static final long serialVersionUID = 1743782482018159106L; + + /** + * 申请人用户编号 + */ + @ApiModelProperty(value = "申请人用户编号") + @NotBlank(message = "用户编号不能为空") + private String userNo; + + /** + * 申请人用户名称 + */ + @ApiModelProperty(value = "申请人用户名称") + private String userName; + + /** + * 申请人用户手机号 + */ + @ApiModelProperty(value = "申请人用户手机号") + private String phone; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRefundPassengerDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRefundPassengerDTO.java new file mode 100644 index 0000000..42b7fbc --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRefundPassengerDTO.java @@ -0,0 +1,66 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + * @author amos wong + * @create 2023/8/9 15:52 + * @Description + */ +@Data +public class TpRefundPassengerDTO implements Serializable { + + private static final long serialVersionUID = -696527533121154078L; + + /** + * 乘客编号 + */ + @ApiModelProperty(value = "乘客编号") + private String passengerNo; + + /** + * 姓名 + */ + @ApiModelProperty(value = "姓名") + private String name; + + /** + * 联系方式 + */ + @ApiModelProperty(value = "联系方式") + private String contactInfo; + + /** + * 证件号 + */ + @ApiModelProperty(value = "证件号") + private String certNo; + + /** + * 证件类型 + */ + @ApiModelProperty(value = "证件类型") + private String certType; + + /** + * 乘客类型 + */ + @ApiModelProperty(value = "乘客类型") + private String passengerType; + + /** + * 退票标的项id + */ + private String refundSubjectItemNo; + + private String tenantId; + + /** + * 拓展字段 + */ + private Map bizData; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRefundRequirementUserDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRefundRequirementUserDTO.java new file mode 100644 index 0000000..ce15098 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRefundRequirementUserDTO.java @@ -0,0 +1,47 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + * @author amos wong + * @create 2023/8/9 15:53 + * @Description + */ +@Data +public class TpRefundRequirementUserDTO implements Serializable { + + private static final long serialVersionUID = -4744549089886942238L; + + /** + * 交通需求方编号 + */ + @ApiModelProperty(value = "交通需求方编号") + private String requirementNo; + + /** + * 交通需求方名称 + */ + @ApiModelProperty(value = "交通需求方名称") + private String requirementName; + + /** + * 联系方式 + */ + @ApiModelProperty(value = "联系方式") + private String contactInfo; + + /** + * 联系人姓名 + */ + @ApiModelProperty(value = "联系人姓名") + private String contactName; + + /** + * 拓展字段 + */ + private Map bizData; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRefundRouteDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRefundRouteDTO.java new file mode 100644 index 0000000..e7ef58b --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRefundRouteDTO.java @@ -0,0 +1,60 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.Map; + +/** + *

+ * 线路 + *

+ * + * @author chenjiaju + * @since 2023-07-25 15:46:31 + */ +@Data +public class TpRefundRouteDTO implements Serializable { + + private static final long serialVersionUID = 8674247615259892951L; + + /** + * 线路编号 + */ + @NotBlank(message = "线路编号不能为空") + @ApiModelProperty(value = "线路编号") + private String routeNo; + + /** + * 线路名称 + */ + @NotBlank(message = "线路名称不能为空") + @ApiModelProperty(value = "线路名称") + private String routeName; + + /** + * 班次 + */ + @ApiModelProperty(value = "班次") + private TpRefundRouteShuttleDTO routesShuttle; + + /** + * 去程/返程 + */ + @ApiModelProperty(value = "去程/返程") + @NotBlank(message = "去程/返程不能为空") + private String roundTrip; + + /** + * 租户id + */ + @NotBlank(message = "租户id不能为空") + private String tenantId; + + /** + * 扩展字段 + */ + private Map bizData; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRefundRouteShuttleDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRefundRouteShuttleDTO.java new file mode 100644 index 0000000..b3227c9 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRefundRouteShuttleDTO.java @@ -0,0 +1,56 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + *

+ * 班次 + *

+ * + * @author chenjiaju + * @since 2023-07-25 15:46:31 + */ +@Data +public class TpRefundRouteShuttleDTO implements Serializable { + + private static final long serialVersionUID = -6031835357255625600L; + + /** + * 线路编号 + */ + @ApiModelProperty(value = "线路编号") + private String routeNo; + + /** + * 班次编号 + */ + @ApiModelProperty(value = "班次编号") + private String shuttleNo; + + /** + * 班次名称 + */ + @ApiModelProperty(value = "班次名称") + private String shuttleName; + + /** + * 班次发车时间 + */ + @ApiModelProperty(value = "班次发车时间") + private String shuttleTime; + + /** + * 租户id + */ + private String tenantId; + + /** + * 扩展字段 + */ + private Map bizData; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRefundSubjectItemDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRefundSubjectItemDTO.java new file mode 100644 index 0000000..04325d6 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRefundSubjectItemDTO.java @@ -0,0 +1,79 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.Valid; +import javax.validation.constraints.*; +import java.io.Serializable; +import java.util.*; + +/** + * @author amos wong + * @create 2023/8/9 15:52 + * @Description + */ +@Data +public class TpRefundSubjectItemDTO implements Serializable { + private static final long serialVersionUID = -5266154469037643160L; + + /** + * 退票标的项id-售卖单元编号 + */ + @ApiModelProperty(value = "退票标的项id") + @NotBlank(message = "退票标的项id-售卖单元id不能为空") + private String subjectItemId; + + /** + * 标的项编号 + */ + @NotBlank(message = "标的项编号不能为空") + private String subjectItemNo; + + /** + * 标的项类型 + */ + @ApiModelProperty(value = "标的项类型") + @NotBlank(message = "标的项类型不能为空") + private String subjectItemType; + + /** + * 数量 + */ + @ApiModelProperty(value = "数量") + @NotNull(message = "数量不能为空") + private Integer quantity; + + private String tripType; + + /** + * 退票标的项关联的乘客信息 + */ + @ApiModelProperty(value = "退票标的项关联的乘客信息") + private TpRefundPassengerDTO passenger; + + /** + * 退票标的项关联的交通需求方(用车方) + */ + @ApiModelProperty(value = "退票标的项关联的交通需求方(用车方)") + private TpRefundRequirementUserDTO requirementUser; + + /** + * 退票标的项组成要素 + */ + @Valid + @NotNull(message = "退票标的项组成要素不能为空") + @ApiModelProperty(value = "退票标的项组成要素") + private List subjectItemElements; + + /** + * 租户id + */ + @NotBlank(message = "租户id不能为空") + private String tenantId; + + /** + * 拓展字段 + */ + private Map bizData; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRefundSubjectItemElementDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRefundSubjectItemElementDTO.java new file mode 100644 index 0000000..1300b20 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRefundSubjectItemElementDTO.java @@ -0,0 +1,65 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.Map; + +/** + * @author amos wong + * @create 2023/7/26 10:02 + * @Description 退票标的项组成要素 + */ +@Data +public class TpRefundSubjectItemElementDTO implements Serializable { + + private static final long serialVersionUID = 1; + + /** + * 要素名称 + */ + @NotBlank(message = "要素名称不能为空") + @ApiModelProperty(value = "要素名称") + private String name; + + /** + * 要素编码 + */ + @NotBlank(message = "要素编码不能为空") + @ApiModelProperty(value = "要素编码") + private String code; + + /** + * 要素值 + */ + @NotBlank(message = "要素值不能为空") + @ApiModelProperty(value = "要素值") + private String value; + + /** + * 单位编码 + */ + @NotBlank(message = "要素单位编码不能为空") + @ApiModelProperty(value = "单位编码") + private String unitCode; + + /** + * 标的项编号 + */ + @NotBlank(message = "标的项编号不能为空") + private String subjectItemNo; + + /** + * 租户id + */ + @NotBlank(message = "租户id不能为空") + @ApiModelProperty(value = "租户id") + private String tenantId; + + /** + * 拓展字段 + */ + private Map bizData; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRouteBookDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRouteBookDTO.java new file mode 100644 index 0000000..c25ff53 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRouteBookDTO.java @@ -0,0 +1,35 @@ +package com.deepinnet.tptradeprod.common.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author taobinxian + * @version 2023-08-07 + */ +@Data +public class TpRouteBookDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 起始站点code + */ + private String departureStationCode; + + /** + * 目的站点Code + */ + private String destinationStationCode; + + /** + * 起始站点名称 + */ + private String departureStationName; + + /** + * 目的站点名称 + */ + private String destinationStationName; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRouteDetailQueryDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRouteDetailQueryDTO.java new file mode 100644 index 0000000..154a1f6 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpRouteDetailQueryDTO.java @@ -0,0 +1,31 @@ +package com.deepinnet.tptradeprod.common.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + *

+ * 线路入参 + *

+ * + * @author chenjiaju + * @since 2023/9/14 + */ + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TpRouteDetailQueryDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + private String routeNo; + + private String tenantId; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpServiceChargeDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpServiceChargeDTO.java new file mode 100644 index 0000000..5f5c0a1 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpServiceChargeDTO.java @@ -0,0 +1,49 @@ +package com.deepinnet.tptradeprod.common.dto; + +import com.deepinnet.tptradeprod.common.enums.TpOrderServiceChargeBizTypeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + *

+ * 手续费试算 + *

+ * + * @author chenjiaju + * @since 2023/11/20 + */ + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TpServiceChargeDTO implements Serializable { + + /** + * 包车手续费订单编号(这里使用原始订单编号) + */ + @ApiModelProperty(value = "订单号") + private String orderNo; + + /** + * 询价价格 + */ + @ApiModelProperty(value = "订单新询价价格") + private String pricingAmount; + + /** + * 业务类型(cancel / change) + * @see TpOrderServiceChargeBizTypeEnum + */ + @ApiModelProperty(value = "业务类型(cancel - 取消 / change - 变更订单)") + private String bizType; + + @ApiModelProperty(value = "租户ID") + private String tenantId; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpStudentInfoDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpStudentInfoDTO.java new file mode 100644 index 0000000..ac9f4de --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpStudentInfoDTO.java @@ -0,0 +1,41 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author amos wong + * @create 2023/7/13 16:24 + * @Description 学生信息DTO + */ +@Data +public class TpStudentInfoDTO implements Serializable { + + private static final long serialVersionUID = 53832586064300425L; + + /** + * 姓名 + */ + @ApiModelProperty(value = "姓名") + private String name; + + /** + * 学号 + */ + @ApiModelProperty(value = "学号") + private String studentId; + + /** + * 学校编号 + */ + @ApiModelProperty(value = "学校编号") + private String schoolCode; + + /** + * 学校名称 + */ + @ApiModelProperty(value = "学校名称") + private String schoolName; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpTravelTripPathPointDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpTravelTripPathPointDTO.java new file mode 100644 index 0000000..3a0a064 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpTravelTripPathPointDTO.java @@ -0,0 +1,58 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Map; + +/** + *

+ * 包车停靠点 + *

+ * + * @author chenjiaju + * @since 2023/10/30 + */ + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TpTravelTripPathPointDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 停靠点名称 + */ + @ApiModelProperty(value = "停靠点名称") + private String locationName; + + /** + * 停靠点经度:lng + */ + @ApiModelProperty(value = "停靠点经度") + private String lng; + + /** + * 停靠点纬度:lat + */ + @ApiModelProperty(value = "停靠点纬度") + private String lat; + + /** + * 停靠点序号 + */ + @ApiModelProperty(value = "停靠点序号") + private Integer index; + + /** + * 扩展字段 + */ + @ApiModelProperty(value = "扩展字段") + private Map bizData; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpUserInfoDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpUserInfoDTO.java new file mode 100644 index 0000000..52104f1 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpUserInfoDTO.java @@ -0,0 +1,32 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * @author amos wong + * @create 2023/8/28 14:24 + * @Description + */ +@Data +public class TpUserInfoDTO implements Serializable { + + private static final long serialVersionUID = -8392396052647528266L; + + /** + * 用户编号 + */ + @ApiModelProperty(value = "用户编号") + @NotBlank(message = "用户编号不能为空") + private String userNo; + + /** + * 用户名称 + */ + @ApiModelProperty(value = "用户名称") + @NotBlank(message = "用户名称不能为空") + private String userName; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpUserPassengerDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpUserPassengerDTO.java new file mode 100644 index 0000000..5ad531d --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpUserPassengerDTO.java @@ -0,0 +1,78 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Map; + +/** + *

+ * 乘客信息 + *

+ * + * @author taobinxian + * @version 2023-08-07 + */ + +@Data +public class TpUserPassengerDTO implements Serializable { + + private static final long serialVersionUID = -7157914478824441426L; + + /** + * 用户编号 + */ + @ApiModelProperty("用户编号") + private String userNo; + + /** + * 乘客编号 + */ + @ApiModelProperty("乘客编号") + private String passengerNo; + + /** + * 乘客类型 + * @see TpUserPassengerTypeEnum + */ + @NotNull + @ApiModelProperty(value = "乘客类型(成人-ADULT;儿童-CHILD;残疾人-DEFORMED_MAN;老年人-OLD_PEOPLE;军人-MILITARY)", required = true) + private String passengerType; + + /** + * 乘客姓名 + */ + @NotNull + @ApiModelProperty(value = "乘客名称", required = true) + private String passengerName; + + /** + * 乘客证件类型 + * @see TpUserPassengerIdentityTypeEnum + */ + @NotNull + @ApiModelProperty(value = "乘客证件类型(001-身份证)", required = true) + private String identityType; + + /** + * 乘客证件编号 + */ + @NotNull + @ApiModelProperty(value = "证件号码", required = true) + private String identityNumber; + + /** + * 扩展字段 + */ + @ApiModelProperty(value = "扩展字段") + private Map bizData; + + /** + * 租户ID + */ + @ApiModelProperty(value = "租户ID") + private String tenantId; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpUserPassengerQueryDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpUserPassengerQueryDTO.java new file mode 100644 index 0000000..d2b2e2a --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpUserPassengerQueryDTO.java @@ -0,0 +1,39 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + *

+ * 乘客查询 + *

+ * + * @author chenjiaju + * @since 2023/8/21 + */ +@Data +public class TpUserPassengerQueryDTO implements Serializable { + + private static final long serialVersionUID = -7157914478824441426L; + + /** + * 用户编号 + */ + @ApiModelProperty(value = "用户编号") + private String userNo; + + /** + * 乘客编号 + */ + @ApiModelProperty(value = "乘客编号") + private String passengerNo; + + /** + * 租户ID + */ + @ApiModelProperty(value = "租户ID") + private String tenantId; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpUserRouteCollectionDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpUserRouteCollectionDTO.java new file mode 100644 index 0000000..41bb4fd --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpUserRouteCollectionDTO.java @@ -0,0 +1,107 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + *

+ * 用户线路收集 + *

+ * + * @author chenjiaju + * @since 2023/8/16 + */ + +@Data +public class TpUserRouteCollectionDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 用户编号 + */ + @ApiModelProperty(value = "用户编号") + private String userNo; + + /** + * 上车点名称 + */ + @ApiModelProperty(value = "上车点名称") + private String upLocation; + + /** + * 上车点经度 + */ + @ApiModelProperty(value = "上车点经度") + private String upLocationLng; + + /** + * 上车点维度 + */ + @ApiModelProperty(value = "上车点纬度") + private String upLocationLat; + + /** + * 下车点名称 + */ + @ApiModelProperty(value = "下车点名称") + private String downLocation; + + /** + * 下车点经度 + */ + @ApiModelProperty(value = "下车点经度") + private String downLocationLng; + + /** + * 下车点维度 + */ + @ApiModelProperty(value = "下车点纬度") + private String downLocationLat; + + /** + * 期望上车时间 + */ + @ApiModelProperty(value = "期望上车时间") + private String expectUpTime; + + /** + * 期望下车时间 + */ + @ApiModelProperty(value = "期望下车时间") + private String expectDownTime; + + /** + * 出行目的 + */ + @ApiModelProperty(value = "出行目的") + private String travelPurpose; + + /** + * 备注 + */ + @ApiModelProperty(value = "备注") + private String remark; + + /** + * 手机号 + */ + @ApiModelProperty(value = "手机号") + private String phoneNumber; + + /** + * biz_data + */ + @ApiModelProperty(value = "扩展字段") + private Map bizData; + + /** + * 租户ID + */ + @ApiModelProperty(value = "租户ID") + private String tenantId; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpUserTicketChoiceDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpUserTicketChoiceDTO.java new file mode 100644 index 0000000..5536eac --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpUserTicketChoiceDTO.java @@ -0,0 +1,40 @@ +package com.deepinnet.tptradeprod.common.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @author amos wong + * @create 2024/7/9 16:43 + * @Description + */ +@Data +public class TpUserTicketChoiceDTO implements Serializable { + /** + * 班次id,滚动发车没有班次 + */ + private String shuttleId; + + /** + * 班次名称,滚动发车没有班次 + */ + private String shuttleName; + + /** + * 非实名购票的场景 + */ + private List nonRealNameDTOs; + + /** + * 实名制场景:每个乘客购买的凭证信息 + */ + private List voucherPurchaseInfoList; + + /** + * 行程类型 + */ + private String tripType; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpVoucherNonRealNameDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpVoucherNonRealNameDTO.java new file mode 100644 index 0000000..91b9424 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpVoucherNonRealNameDTO.java @@ -0,0 +1,57 @@ +package com.deepinnet.tptradeprod.common.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author amos wong + * @create 2023/8/21 15:26 + * @Description 非实名制购票DTO + */ +@Data +public class TpVoucherNonRealNameDTO implements Serializable { + + private static final long serialVersionUID = 6982530523960978012L; + + /** + * 凭证关联的售卖单元code + */ + private String salesUnitCode; + + /** + * 凭证有效期开始时间 + */ + private Long effectiveStartTime; + + /** + * 凭证有效期结束时间 + */ + private Long effectiveEndTime; + + /** + * 最早检票时间 8:30 + */ + private String earliestCheckTime; + + /** + * 最早展示时间 + */ + private String earliestShowTime; + + /** + * 最晚检票时间 10:00 + */ + private String latestCheckTime; + + /** + * 非实名场景:当前日期购买的总可用次数 = 乘车人数 * 每张票的可用次数 + */ + private Integer ticketCount; + + /** + * 乘车人数,非实名场景传入用户填写的人数 + * 实名制场景传入1 + */ + private Integer passengerCount; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpVoucherPassengerDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpVoucherPassengerDTO.java new file mode 100644 index 0000000..ef4eb3f --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpVoucherPassengerDTO.java @@ -0,0 +1,71 @@ +package com.deepinnet.tptradeprod.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + * @author amos wong + * @create 2023/7/26 10:28 + * @Description 出行凭证关联乘客 + */ +@Data +public class TpVoucherPassengerDTO implements Serializable { + + private static final long serialVersionUID = -752707293264231779L; + + /** + * 凭证编号 + */ + @ApiModelProperty(value = "凭证编号") + private String voucherNo; + + /** + * 乘客编号 + */ + @ApiModelProperty(value = "乘客编号") + private String passengerNo; + + /** + * 姓名 + */ + @ApiModelProperty(value = "姓名") + private String name; + + /** + * 联系方式 + */ + @ApiModelProperty(value = "联系方式") + private String contactInfo; + + /** + * 证件号 + */ + @ApiModelProperty(value = "证件号") + private String certNo; + + /** + * 证件类型 + */ + @ApiModelProperty(value = "证件类型") + private String certType; + + /** + * 乘客类型 + */ + @ApiModelProperty(value = "乘客类型") + private String passengerType; + + /** + * 租户id + */ + @ApiModelProperty(value = "租户id") + private String tenantId; + + /** + * 业务数据 + */ + private Map bizData; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpVoucherPurchaseInfoDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpVoucherPurchaseInfoDTO.java new file mode 100644 index 0000000..37f09c6 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/dto/TpVoucherPurchaseInfoDTO.java @@ -0,0 +1,56 @@ +package com.deepinnet.tptradeprod.common.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author amos wong + * @create 2023/7/7 14:37 + * @Description 实名制购买凭证的信息 + */ +@Data +public class TpVoucherPurchaseInfoDTO implements Serializable { + + private static final long serialVersionUID = 5885868238761944013L; + + /** + * 凭证关联的售卖单元code + */ + private String salesUnitCode; + + /** + * 凭证有效期开始时间 + */ + private Long effectiveStartTime; + + /** + * 凭证有效期结束时间 + */ + private Long effectiveEndTime; + + /** + * 最早检票时间 8:30 + */ + private String earliestCheckTime; + + /** + * 最早展示时间 + */ + private String earliestShowTime; + + /** + * 当前凭证总可用次数 + */ + private Integer totalAvailableCount; + + /** + * 最晚检票时间 10:00 + */ + private String latestCheckTime; + + /** + * 乘客信息 + */ + private TpVoucherPassengerDTO passengerInfo; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpFlowProcessTypeEnum.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpFlowProcessTypeEnum.java new file mode 100644 index 0000000..1c52c17 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpFlowProcessTypeEnum.java @@ -0,0 +1,29 @@ +package com.deepinnet.tptradeprod.common.enums; + +import lombok.*; + +/** + * @author amos wong + * @create 2024/2/1 17:57 + * @Description + */ +@AllArgsConstructor +@Getter +public enum TpFlowProcessTypeEnum { + + CALCULATE_REFUND_AMOUNT("calculate_refund_amount", "计算退票金额"), + + REFUND_TICKET("refund_ticket", "申请退票"), + + REFUND_TICKET_CHECK("refund_ticket_check", "申请退票校验"), + + REFUND_BUTTON_SHOWABLE("refund_button_showable", "退票按钮是否展示"), + + QUERY_AVAILABLE_REFUND_VOUCHER("query_available_refund_voucher", "查询可退凭证"), + + CONFIRM_RESCHEDULE_ORDER("confirm_reschedule_order", "确定改签订单"); + + private final String code; + + private final String desc; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderAuditConfirmTypeEnum.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderAuditConfirmTypeEnum.java new file mode 100644 index 0000000..c49e88e --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderAuditConfirmTypeEnum.java @@ -0,0 +1,51 @@ +package com.deepinnet.tptradeprod.common.enums; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 订单确认审核类型 + * + * @author xiehuaqiao + */ +@AllArgsConstructor +@Getter +public enum TpOrderAuditConfirmTypeEnum { + + + ORDER_CREATE(5, "order_create", "用户下单确认审核"), + ORDER_CANCEL(15, "order_cancel", "用户取消订单确认审核"), + ORDER_CHANGE(20, "order_change", "用户订单变更确认审核"), + + ; + private final Integer code; + + private final String type; + + private final String desc; + + public static TpOrderAuditConfirmTypeEnum getTpOrderAuditConfirmType(Integer code) { + if (code == null) { + return null; + } + for (TpOrderAuditConfirmTypeEnum confirmTypeEnum : TpOrderAuditConfirmTypeEnum.values()) { + if (ObjectUtil.equal(code, confirmTypeEnum.getCode())) { + return confirmTypeEnum; + } + } + return null; + } + + public static TpOrderAuditConfirmTypeEnum getTpOrderAuditConfirmType(String type) { + if (type == null) { + return null; + } + for (TpOrderAuditConfirmTypeEnum confirmTypeEnum : TpOrderAuditConfirmTypeEnum.values()) { + if (ObjectUtil.equal(type, confirmTypeEnum.getType())) { + return confirmTypeEnum; + } + } + return null; + } +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderConfirmFieldEnum.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderConfirmFieldEnum.java new file mode 100644 index 0000000..194260b --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderConfirmFieldEnum.java @@ -0,0 +1,42 @@ +package com.deepinnet.tptradeprod.common.enums; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author xiehuaqiao + */ + +@AllArgsConstructor +@Getter +public enum TpOrderConfirmFieldEnum { + + ORDER_FLEET_CHOICE("order_feet_choice", "选择车队"), + ORDER_ORIGINAL_PAY_MODE("order_origin_pay_mode", "订单当前支付方式"), + + ORDER_TARGET_PAY_MODE("order_target_pay_mode", "订单修改后支付方式"), + + ORDER_ORIGINAL_PRICE("order_origin_price", "订单当前标准价格"), + + ORDER_TARGET_PRICE("order_target_price", "订单目标修改价格"), + + REDUCTION_SERVICE_CHARGE_TYPE("reduction_service_type", "手续费减免类型"), + ; + private String type; + + private String desc; + + + public static TpOrderConfirmFieldEnum getTpOrderAuditConfirmType(String type){ + if(type == null){ + return null; + } + for (TpOrderConfirmFieldEnum confirmTypeEnum : TpOrderConfirmFieldEnum.values()) { + if (ObjectUtil.equal(type, confirmTypeEnum.getType())) { + return confirmTypeEnum; + } + } + return null; + } +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderPayModeEnum.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderPayModeEnum.java new file mode 100644 index 0000000..d83bc24 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderPayModeEnum.java @@ -0,0 +1,54 @@ +package com.deepinnet.tptradeprod.common.enums; + +/** + *

+ * 订单支付模式枚举 + *

+ * + * @author chenjiaju + * @since 2023/11/13 + */ +public enum TpOrderPayModeEnum { + + /** + * 先享后付 + */ + PAY_AFTER("pay_after", "先享后付"), + + /** + * 先付后享 + */ + PAY_BEFORE("pay_before", "先付后享"), + + /** + * 先付后享-付全款 + */ + PAY_BEFORE_ALL("pay_before_all", "先付后享-付全款"), + + ; + + private String payMode; + + private String payModeDesc; + + TpOrderPayModeEnum(String payMode, String payModeDesc) { + this.payMode = payMode; + this.payModeDesc = payModeDesc; + } + + public String getPayMode() { + return payMode; + } + + public void setPayMode(String payMode) { + this.payMode = payMode; + } + + public String getPayModeDesc() { + return payModeDesc; + } + + public void setPayModeDesc(String payModeDesc) { + this.payModeDesc = payModeDesc; + } +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderSceneEnum.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderSceneEnum.java new file mode 100644 index 0000000..f9c1f70 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderSceneEnum.java @@ -0,0 +1,22 @@ +package com.deepinnet.tptradeprod.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author amos wong + * @create 2024/2/1 17:57 + * @Description + */ +@AllArgsConstructor +@Getter +public enum TpOrderSceneEnum { + + SALESMAN_OPERATE("salesman_operate", "业务员操作"), + + USER_OPERATE("user_operate", "用户操作"), + ; + private final String code; + + private final String desc; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderServiceChargeBizTypeEnum.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderServiceChargeBizTypeEnum.java new file mode 100644 index 0000000..da08696 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderServiceChargeBizTypeEnum.java @@ -0,0 +1,55 @@ +package com.deepinnet.tptradeprod.common.enums; + +import cn.hutool.core.util.StrUtil; + +/** + *

+ * 手续费试算业务类型枚举 + *

+ * + * @author chenjiaju + * @since 2023/10/30 + */ +public enum TpOrderServiceChargeBizTypeEnum { + + CANCEL("cancel", "取消"), + + CHANGE("change", "变更订单"), + + ; + + private String type; + + private String desc; + + TpOrderServiceChargeBizTypeEnum(String type, String desc) { + this.type = type; + this.desc = desc; + } + + public static TpOrderServiceChargeBizTypeEnum getTripEnumByTripCode(String type) { + for (TpOrderServiceChargeBizTypeEnum bizTypeEnum : TpOrderServiceChargeBizTypeEnum.values()) { + if (StrUtil.equals(bizTypeEnum.getType(), type)) { + return bizTypeEnum; + } + } + + return null; + } + + public String getType() { + return type; + } + + public void setType(String tripType) { + this.type = tripType; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderServiceChargeFreeEnum.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderServiceChargeFreeEnum.java new file mode 100644 index 0000000..9662836 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderServiceChargeFreeEnum.java @@ -0,0 +1,55 @@ +package com.deepinnet.tptradeprod.common.enums; + +import cn.hutool.core.util.ObjectUtil; + +/** + *

+ * 订单服务费是否免费 + *

+ * + * @author chenjiaju + * @since 2023/10/30 + */ +public enum TpOrderServiceChargeFreeEnum { + + FREE(1, "免费"), + + NOT_FREE(0, "按规则收取手续费"), + + ; + + private Integer code; + + private String desc; + + TpOrderServiceChargeFreeEnum(Integer code, String desc) { + this.code = code; + this.desc = desc; + } + + public static TpOrderServiceChargeFreeEnum getTripEnumByTripCode(Integer code) { + for (TpOrderServiceChargeFreeEnum bizTypeEnum : TpOrderServiceChargeFreeEnum.values()) { + if (ObjectUtil.equals(bizTypeEnum.getCode(), code)) { + return bizTypeEnum; + } + } + + return null; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderSourceEnum.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderSourceEnum.java new file mode 100644 index 0000000..70bd02d --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderSourceEnum.java @@ -0,0 +1,57 @@ +package com.deepinnet.tptradeprod.common.enums; + +import lombok.Getter; + +/** + *

+ * 订单下单来源枚举 + *

+ * + * @author chenjiaju + * @since 2024/3/12 + */ +@Getter +public enum TpOrderSourceEnum { + + /** + * APP + */ + APP("app", "app客户端"), + + /** + * H5 + */ + H5("h5", "H5"), + + /** + * POS机预约 + */ + POS("pos", "POS机预约"), + + /** + * 微信小程序 + */ + WX_APPLET("wx_applet", "微信小程序"), + + /** + * 支付宝小程序 + */ + ALIPAY_APPLET("alipay_applet", "支付宝小程序"), + + /** + * 后台录单 + */ + BACKEND("backend", "后台录单"), + + ; + + private String type; + + private String desc; + + TpOrderSourceEnum(String type, String desc) { + this.type = type; + this.desc = desc; + } + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderStatusEnum.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderStatusEnum.java new file mode 100644 index 0000000..cf9e656 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderStatusEnum.java @@ -0,0 +1,354 @@ +package com.deepinnet.tptradeprod.common.enums; + +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.util.ObjectUtil; + +import java.util.List; + +/** + *

+ * 订单状态枚举 + *

+ * + * @author chenjiaju + * @since 2023/7/26 + */ +public enum TpOrderStatusEnum { + + /** + * 订单初始化 + */ + INIT(0, "订单初始化", 1), + + /** + * 订单待支付 + */ + PENDING_PAY(5, "订单待支付", 1), + + /** + * 订单超时未支付 + */ + ORDER_TIMEOUT(10, "订单超时", 1), + + /** + * 已支付 + */ + ALREADY_PAY(15, "已支付", 1), + + /** + * 部分核销 + */ + PARTLY_VERIFICATION(20, "部分核销", 1), + + /** + * 退款中 + */ + ORDER_REFUNDING(25, "退款中", 1), + + /** + * 部分退款 + */ + PARTLY_REFUND(30, "部分退款", 1), + + /** + * 已改签(终态) + */ + ALREADY_CHANGE(35, "已经改签", 1), + + /** + * 全部退款(终态) + */ + ALL_REFUND(40, "全部退款", 1), + + /** + * 退款失败 + */ + REFUND_ERROR(45, "退款失败", 1), + + /** + * 已完成 / 全部核销 (终态,存在退款请求) + */ + FINISH_HAS_REFUND(50, "已完成(存在退款)", 1), + + /** + * 已完成(未发生退款) + */ + FINISH_NOT_REFUND(55, "已完成(未发生退款)", 1), + + /** + * 订单部分过期 + */ + PARTLY_EXPIRE_HAS_REFUND(60, "包含退款", 1), + + /** + * 订单部分过期 + */ + PARTLY_EXPIRE_HAS_NOT_REFUND(65, "不包含退款", 1), + + /** + * 订单全部过期 + */ + ALL_EXPIRE(70, "订单全部过期", 1), + + /** + * 已改签, 包含退款 + */ + RESCHEDULE_HAS_REFUND(75, "已改签(包含退款)", 1), + + /** + * 已改签, 不包含退款 + */ + RESCHEDULE_NOT_REFUND(80, "已改签(不包含退款)", 1), + + // ============================= 包车 ============================= + + /** + * 订单初始化 + */ + ORDER_PACKAGE_INIT(0, "订单初始化", 2), + + /** + * 订单待确认 + */ + ORDER_NEED_CONFIRM(5, "订单待确认 -- 下单审核中", 2), + + /** + * 订单超时未确认 + */ + ORDER_TIMEOUT_CONFIRM(10, "订单超时未确认", 2), + + /** + * 订单已确认 + */ + ORDER_CONFIRMED(15, "订单已确认", 2), + + /** + * 订单已驳回 + */ + ORDER_REJECTED(20, "订单已驳回", 2), + + /** + * 订金待支付 + */ + ORDER_DEPOSIT_NEED_PAY(25, "订金待支付", 2), + + /** + * 订金超时未支付 + */ + ORDER_DEPOSIT_TIMEOUT(30, "订金超时未支付", 2), + + /** + * 订金已支付 + */ + ORDER_DEPOSIT_PAID(35, "订金已支付", 2), + + /** + * 订单待派车 + */ + ORDER_NEED_DISPATCH(40, "订单待派车", 2), + + /** + * 订单已派车 + */ + ORDER_DISPATCHED(45, "订单已派车", 2), + + /** + * 行程已发车 + */ + ORDER_TRIP_START(50, "行程已发车", 2), + + /** + * 行程结束待确认订单金额 + */ + ORDER_TRIP_END_CONFIRMING_ORDER_AMOUNT(52, "行程结束待确认订单金额", 2), + + /** + * 行程结束,待支付尾款 + */ + ORDER_TRIP_END_NEED_PAY(55, "行程结束待支付尾款", 2), + + /** + * 行程结束,已支付尾款 + */ + ORDER_TRIP_END_PAID(60, "行程结束已支付尾款", 2), + + /** + * 行程结束,退款中 + */ + ORDER_TRIP_END_REFUNDING(65, "行程结束退款中", 2), + + /** + * 行程结束,已退款 + */ + ORDER_TRIP_END_REFUNDED(70, "行程结束已退款", 2), + + /** + * 行程结束 (无退款 / 无尾款) + */ + ORDER_TRIP_END(75, "行程结束", 2), + + /** + * 取消订单审核中 + */ + ORDER_CANCEL_AUDITING(80, "取消订单审核中", 2), + + /** + * 取消订单审核通过 + */ + ORDER_CANCEL_AUDITED(85, "取消订单审核通过", 2), + + /** + * 订单取消待支付 + */ + ORDER_CANCEL_NEED_PAY(90, "订单取消待支付", 2), + + /** + * 订单取消已支付 + */ + ORDER_CANCEL_PAID(95, "订单取消已支付", 2), + + /** + * 订单取消退款中 + */ + ORDER_CANCEL_REFUNDING(100, "订单取消退款中", 2), + + /** + * 订单取消退款成功 + */ + ORDER_CANCEL_REFUNDED(105, "订单取消退款成功", 2), + + /** + * 订单已取消 + */ + ORDER_CANCELED(110, "订单已取消", 2), + + /** + * 变更订单-审核中 + */ + ORDER_CHANGE_AUDITING(115, "订单变更审核中", 2), + + /** + * 订单变更审核通过 + */ + ORDER_CHANGE_AUDITED(120, "订单变更审核通过", 2), + + // ============================= 拼车 ============================= + + ORDER_CARPOOL_INIT(0, "订单初始化", 3), + + /** + * 订单待支付 + */ + ORDER_CARPOOL_PENDING_PAY(5, "订单待支付", 3), + + /** + * 订单超时未支付 + */ + ORDER_CARPOOL_TIMEOUT(10, "订单超时", 3), + + /** + * 拼车中 + */ + ORDER_CARPOOLING(15, "拼车中", 3), + + /** + * 拼车成功-待乘车 + */ + ORDER_CARPOOLED(20, "拼车成功(待乘车)", 3), + + /** + * 已完成 + */ + ORDER_CARPOOLED_FINISH(25, "已完成", 3), + + /** + * 取消拼车成功无需退款 + */ + ORDER_CARPOOL_CANCELED_UN_REFUND(30, "取消拼车成功(无需退款)", 3), + + /** + * 取消拼车退款中 + */ + ORDER_CARPOOL_CANCEL_REFUNDING(35, "取消拼车退款中", 3), + + /** + * 取消拼车退款成功 + */ + ORDER_CARPOOL_CANCELED_REFUNDED(40, "取消拼车退款成功", 3), + + /** + * 拼车失败无需退款 + */ + ORDER_CARPOOL_FAIL_UN_REFUND(45, "拼车失败(无需退款)", 3), + + /** + * 拼车失败退款中 + */ + ORDER_CARPOOL_FAIL_REFUNDING(50, "拼车失败退款中", 3), + + /** + * 拼车失败退款成功 + */ + ORDER_FAIL_CARPOOL_REFUNDED(55, "拼车失败退款成功", 3), + + ; + + /** + * 订单状态 + */ + private Integer status; + + /** + * 订单状态名称 + */ + private String statusName; + + /** + * 订单状态类型 + */ + private Integer statusType; + + TpOrderStatusEnum(Integer status, String statusName, Integer statusType) { + this.status = status; + this.statusName = statusName; + this.statusType = statusType; + } + + public static TpOrderStatusEnum getTpOrderStatusEnumByStatus(Integer status, Integer type) { + for (TpOrderStatusEnum statusEnum : TpOrderStatusEnum.values()) { + if (ObjectUtil.equals(statusEnum.getStatus(), status) && ObjectUtil.equal(statusEnum.getStatusType(), type)) { + return statusEnum; + } + } + + return null; + } + + public static List CHARTER_AVAILABLE_PAY_STATUS = ListUtil.toList(ORDER_DEPOSIT_NEED_PAY.getStatus(), ORDER_TRIP_END_NEED_PAY.getStatus(), ORDER_CANCEL_NEED_PAY.getStatus()); + + public static List CUSTOM_BUS_VALID_TICKET = ListUtil.toList(ALREADY_PAY.getStatus(), PARTLY_VERIFICATION.getStatus(), PARTLY_REFUND.getStatus()); + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getStatusName() { + return statusName; + } + + public void setStatusName(String statusName) { + this.statusName = statusName; + } + + public Integer getStatusType() { + return statusType; + } + + public void setStatusType(Integer statusType) { + this.statusType = statusType; + } +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderTripEnum.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderTripEnum.java new file mode 100644 index 0000000..824608a --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderTripEnum.java @@ -0,0 +1,57 @@ +package com.deepinnet.tptradeprod.common.enums; + +import cn.hutool.core.util.StrUtil; + +/** + *

+ * 订单行程类型枚举 + *

+ * + * @author chenjiaju + * @since 2023/10/30 + */ +public enum TpOrderTripEnum { + + SINGLE_TRIP("single_trip", "单天单程包车"), + + SINGLE_TRIP_GO_BACK("single_trip_go_back", "单天往返包车"), + + MULTIPART_TRIP("multipart_trip", "多天包车"), + + ; + + private String tripCode; + + private String tripDesc; + + TpOrderTripEnum (String tripCode, String tripDesc) { + this.tripCode = tripCode; + this.tripDesc = tripDesc; + } + + public static TpOrderTripEnum getTripEnumByTripCode(String tripCode) { + for (TpOrderTripEnum tripEnum : TpOrderTripEnum.values()) { + if (StrUtil.equals(tripEnum.getTripCode(), tripCode)) { + return tripEnum; + } + } + + return null; + } + + public String getTripCode() { + return tripCode; + } + + public void setTripCode(String tripType) { + this.tripCode = tripType; + } + + public String getTripDesc() { + return tripDesc; + } + + public void setTripDesc(String tripDesc) { + this.tripDesc = tripDesc; + } +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderTypeEnum.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderTypeEnum.java new file mode 100644 index 0000000..85663f0 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpOrderTypeEnum.java @@ -0,0 +1,79 @@ +package com.deepinnet.tptradeprod.common.enums; + +import cn.hutool.core.util.ObjectUtil; +import lombok.Getter; + +/** + *

+ * 订单类型枚举 + *

+ * + * @author chenjiaju + * @since 2023/7/26 + */ +@Getter +public enum TpOrderTypeEnum { + + /** + * 定制公交 + */ + CUSTOMIZED_ORDER(1, "定制公交"), + + /** + * 包车订单 + */ + PACKING_ORDER(2, "包车订单"), + + /** + * 拼车 + */ + CARPOOL_ORDER(3, "拼车"), + + /** + * 定制公交改签单 + */ + CUSTOMIZED_RESCHEDULE_ORDER(4, "定制公交改签单"), + + ; + + /** + * 订单类型 + */ + private Integer type; + + /** + * 类型描述 + */ + private String typeDesc; + + TpOrderTypeEnum(Integer type, String typeDesc) { + this.type = type; + this.typeDesc = typeDesc; + } + + public static TpOrderTypeEnum getBizTypeByCode(Integer type) { + for (TpOrderTypeEnum typeEnum : TpOrderTypeEnum.values()) { + if (ObjectUtil.equals(typeEnum.getType(), type)) { + return typeEnum; + } + } + + return null; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getTypeDesc() { + return typeDesc; + } + + public void setTypeDesc(String typeDesc) { + this.typeDesc = typeDesc; + } +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpPayOrderStatusEnum.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpPayOrderStatusEnum.java new file mode 100644 index 0000000..af6bbf9 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpPayOrderStatusEnum.java @@ -0,0 +1,65 @@ +package com.deepinnet.tptradeprod.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.apache.commons.lang3.StringUtils; + +/** + * @author amos wong + * @create 2023/7/27 10:08 + * @Description + */ +@AllArgsConstructor +@Getter +public enum TpPayOrderStatusEnum { + + /** + * 下单 + */ + INIT("init", "初始化"), + + /** + * 支付中 + */ + PAYING("paying", "支付中"), + + /** + * 已支付 + */ + PAID("paid", "已支付"), + + /** + * 已退款 + */ + REFUND("refund", "已退款"), + + /** + * 退款中 + */ + REFUNDING("refunding", "退款中"), + + /** + * 已关闭 + */ + CLOSED("closed", "已关闭"); + + /** + * 编码 + */ + private String code; + + /** + * 名字 + */ + private String desc; + + public static TpPayOrderStatusEnum getByCode(String code) { + for (TpPayOrderStatusEnum orderStatusEnum : TpPayOrderStatusEnum.values()) { + if (StringUtils.equals(orderStatusEnum.getCode(), code)) { + return orderStatusEnum; + } + } + + return null; + } +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpProdOrderIdentityFlagEnum.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpProdOrderIdentityFlagEnum.java new file mode 100644 index 0000000..1daab3b --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpProdOrderIdentityFlagEnum.java @@ -0,0 +1,55 @@ +package com.deepinnet.tptradeprod.common.enums; + +/** + *

+ * 主子订单枚举 + *

+ * + * @author chenjiaju + * @since 2023/7/26 + */ +public enum TpProdOrderIdentityFlagEnum { + + /** + * 实名认证 + */ + REAL_NAME_ORDER(1, "实名认证"), + + /** + * 非实名认证 + */ + NOT_REAL_NAME_ORDER(0, "非实名认证"), + + ; + + /** + * 实名认证标识 + */ + private Integer identityFlag; + + /** + * 实名认证标识中文描述 + */ + private String identityDesc; + + TpProdOrderIdentityFlagEnum(Integer identityFlag, String identityDesc) { + this.identityFlag = identityFlag; + this.identityDesc = identityDesc; + } + + public Integer getIdentityFlag() { + return identityFlag; + } + + public void setIdentityFlag(Integer identityFlag) { + this.identityFlag = identityFlag; + } + + public String getIdentityDesc() { + return identityDesc; + } + + public void setIdentityDesc(String identityDesc) { + this.identityDesc = identityDesc; + } +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpProdOrderTicketTypeEnum.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpProdOrderTicketTypeEnum.java new file mode 100644 index 0000000..7946768 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpProdOrderTicketTypeEnum.java @@ -0,0 +1,115 @@ +package com.deepinnet.tptradeprod.common.enums; + +import cn.hutool.core.util.StrUtil; + +/** + *

+ * 票类型枚举 + *

+ * + * @author chenjiaju + * @since 2023/7/26 + */ +public enum TpProdOrderTicketTypeEnum { + + // day-次票;week-周票;month-月票;term-学期票;year-年票 + /** + * 次票 + */ + DAY("day", "日票/次票", "times_ticket_release", "single_ride"), + + /** + * 周票 + */ + WEEK("week", "周票", "week_ticket_release", "weekly"), + + /** + * 月票 + */ + MONTH("month", "月票", "month_ticket_release", "monthly"), + + /** + * 年票 + */ + YEAR("year", "年票", "year_ticket_release", "year"), + + /** + * 学期票 + */ + TERM("term", "学期票", "semester_ticket_release", "semester"), + + /** + * 区间票 + */ + DAY_RANGE("day_range", "区间票", "day_range_ticket_release", "day_range"), + + ; + + /** + * 票类型标识 + */ + private String ticketType; + + /** + * 票类型描述 + */ + private String ticketTypeDesc; + + /** + * 规则code, 与产品保持一致 + */ + private String ticketRuleCode; + + /** + * 询价票类型标识 + */ + private String inquireTicketType; + + TpProdOrderTicketTypeEnum(String ticketType, String ticketTypeDesc, String ticketRuleCode, String inquireTicketType) { + this.ticketType = ticketType; + this.ticketTypeDesc = ticketTypeDesc; + this.ticketRuleCode = ticketRuleCode; + this.inquireTicketType = inquireTicketType; + } + + public static TpProdOrderTicketTypeEnum getEnum(String ticketType) { + for (TpProdOrderTicketTypeEnum ticketTypeEnum : TpProdOrderTicketTypeEnum.values()) { + if (StrUtil.equals(ticketTypeEnum.ticketType, ticketType)) { + return ticketTypeEnum; + } + } + return null; + } + + public String getTicketType() { + return ticketType; + } + + public void setTicketType(String ticketType) { + this.ticketType = ticketType; + } + + public String getTicketTypeDesc() { + return ticketTypeDesc; + } + + public void setTicketTypeDesc(String ticketTypeDesc) { + this.ticketTypeDesc = ticketTypeDesc; + } + + public String getTicketRuleCode() { + return ticketRuleCode; + } + + public void setTicketRuleCode(String ticketRuleCode) { + this.ticketRuleCode = ticketRuleCode; + } + + public String getInquireTicketType() { + return inquireTicketType; + } + + public void setInquireTicketType(String inquireTicketType) { + this.inquireTicketType = inquireTicketType; + } +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpRefundApplyOrderModulesEnum.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpRefundApplyOrderModulesEnum.java new file mode 100644 index 0000000..b4309d7 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpRefundApplyOrderModulesEnum.java @@ -0,0 +1,45 @@ +package com.deepinnet.tptradeprod.common.enums; + +import lombok.*; + +/** + *

+ * 订单模块枚举 + *

+ * + * @author chenjiaju + * @since 2023/7/27 + */ +@AllArgsConstructor +@Getter +public enum TpRefundApplyOrderModulesEnum { + + /** + * 退票标的项 + */ + REFUND_SUBJECT_ITEM("REFUND_SUBJECT_ITEM"), + + /** + * 线路和班次信息 + */ + REFUND_ROUTE("REFUND_ROUTE"), + + /** + * 退票乘客 + */ + REFUND_PASSENGER("REFUND_PASSENGER"), + + /** + * 退票用车需求方 + */ + REFUND_REQUIREMENT_USER("REFUND_REQUIREMENT_USER"), + + /** + * 退票支付单 + */ + REFUND_PAY_ORDER("REFUND_PAY_ORDER"), + + ; + + private String module; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpTradeProdMessageConstants.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpTradeProdMessageConstants.java new file mode 100644 index 0000000..5c705bc --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/TpTradeProdMessageConstants.java @@ -0,0 +1,19 @@ +package com.deepinnet.tptradeprod.common.enums; + +/** + * 消息相关常量 + * + * @author chenjiaju + * @version 2022/11/23 11:42 + */ +public interface TpTradeProdMessageConstants { + /** + * 监听组 + */ + String TP_TRADE_PROD_GROUP = "tptradeprod-consumer-group"; + + /** + * 延迟消息监听组 + */ + String TP_TRADE_DELAY_PROD_GROUP = "tptradeprod-delay-consumer-group"; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/task/TpScheduleTaskStatusEnum.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/task/TpScheduleTaskStatusEnum.java new file mode 100644 index 0000000..fd91050 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/task/TpScheduleTaskStatusEnum.java @@ -0,0 +1,44 @@ +package com.deepinnet.tptradeprod.common.enums.task; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.apache.commons.lang3.StringUtils; + +@AllArgsConstructor +@Getter +public enum TpScheduleTaskStatusEnum { + + WAIT_EXECUTE("wait_execute", "待执行"), + + EXECUTING("executing", "执行中"), + + SUCCESS("success", "执行成功"), + + FAIL("fail", "执行失败"), + + TERMINATED("terminated", "已终止"), + + CANCELED("canceled", "已取消"); + + /** + * 类型 + */ + private String status; + + /** + * 说明 + */ + private String desc; + + public static TpScheduleTaskStatusEnum getByStatus(String status) { + if (status == null) { + return null; + } + for (TpScheduleTaskStatusEnum an : TpScheduleTaskStatusEnum.values()) { + if (StringUtils.equals(an.getStatus(), status)) + return an; + } + return null; + } + +} \ No newline at end of file diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/task/TpScheduleTaskTypeEnum.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/task/TpScheduleTaskTypeEnum.java new file mode 100644 index 0000000..e4abce3 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/enums/task/TpScheduleTaskTypeEnum.java @@ -0,0 +1,51 @@ +package com.deepinnet.tptradeprod.common.enums.task; + +import cn.hutool.core.collection.ListUtil; +import lombok.*; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; + +@AllArgsConstructor +@Getter +public enum TpScheduleTaskTypeEnum { + + AUDIT_TIME_OUT("audit_time_out", "审核超时未处理"), + + TRIP_START_BEFORE_TWO_HOURS("trip_start_before_two_hours", "行程开始前两小时"), + + TRIP_START_BEFORE_HALF_HOURS("trip_start_before_half_hours", "行程开始前半小时"), + + TRIP_END_AFTER_THREE_DAYS("trip_end_after_three_days", "行程结束后三天"), + + CLOSE_ORDER_BEFORE_TWO_HOURS("close_order_before_two_hours", "关单前两小时"), + + CLOSE_ORDER_BEFORE_HALF_HOURS("close_order_before_half_hours", "关单前半小时"), + + ; + + /** + * 类型 + */ + private final String type; + + /** + * 描述信息 + */ + private final String desc; + + public static TpScheduleTaskTypeEnum getByType(String type) { + if (type == null) { + return null; + } + for (TpScheduleTaskTypeEnum an : TpScheduleTaskTypeEnum.values()) { + if (StringUtils.equals(an.getType(), type)) { + return an; + } + } + + return null; + } + + public static final List TRADEPROD_SUPPORT_TASK_TYPE_LIST = ListUtil.toList(AUDIT_TIME_OUT.getType(), TRIP_START_BEFORE_TWO_HOURS.getType(), TRIP_START_BEFORE_HALF_HOURS.getType(), TRIP_END_AFTER_THREE_DAYS.getType(), CLOSE_ORDER_BEFORE_TWO_HOURS.getType()); +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/error/ErrorLevel.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/error/ErrorLevel.java new file mode 100644 index 0000000..9f63889 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/error/ErrorLevel.java @@ -0,0 +1,13 @@ +package com.deepinnet.tptradeprod.common.error; + +/** + * @author taobinxian + * @version 2022-11-08 + * + * 异常的等级 + */ +public enum ErrorLevel { + WARN, + + ERROR +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/error/ErrorType.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/error/ErrorType.java new file mode 100644 index 0000000..f67cf24 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/error/ErrorType.java @@ -0,0 +1,15 @@ +package com.deepinnet.tptradeprod.common.error; + +/** + * @author taobinxian + * @version 2022-11-08 + * + * 异常的类型 + */ +public enum ErrorType { + BIZ, + + THIRD_PARTY, + + SYSTEM +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/error/TpTradeProdErrorCode.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/error/TpTradeProdErrorCode.java new file mode 100644 index 0000000..9eba36a --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/error/TpTradeProdErrorCode.java @@ -0,0 +1,580 @@ +package com.deepinnet.tptradeprod.common.error; + +/** + * @author taobinxian + * @version 2022-11-08 + *

+ * 资金平台通用异常码 + */ +public enum TpTradeProdErrorCode { + + /*------------------------------------------------------------------------*/ + /* 通用事件[0000开头] */ + /*------------------------------------------------------------------------*/ + + /** + * 未知异常 + */ + UNKNOWN_EXCEPTION(ErrorLevel.ERROR, ErrorType.SYSTEM, "000", "未知异常"), + + /** + * 请求参数非法 + */ + ILLEGAL_PARAMS(ErrorLevel.ERROR, ErrorType.BIZ, "001", "参数错误"), + + + /** + * 并发操作 + */ + OPERATION_CONCURRENT_EXCP(ErrorLevel.ERROR, ErrorType.BIZ, "003", "并发处理异常"), + + /** + * 系统暂时不支持 + */ + SYSTEM_NOT_SUPPORT(ErrorLevel.ERROR, ErrorType.SYSTEM, "004", "系统暂时不支持"), + + /** + * 机构服务器异常 + */ + MERCHANT_SERVER_ERROR(ErrorLevel.ERROR, ErrorType.THIRD_PARTY, "801", "机构服务器错误"), + + /** + * 产品服务器异常 + */ + PROD_FACTORY_SERVER_ERROR(ErrorLevel.ERROR, ErrorType.THIRD_PARTY, "802", "产品服务器错误"), + + /** + * 机构网关服务器异常 + */ + GATEWAY_SERVER_ERROR(ErrorLevel.ERROR, ErrorType.THIRD_PARTY, "804", "机构网关服务器错误"), + + /** + * 业务幂等 + **/ + IDEMPOTENT_REQUEST_ERROR(ErrorLevel.ERROR, ErrorType.BIZ, "995", "业务幂等"), + + /** + * 非法请求 + **/ + ILLEGAL_REQUEST(ErrorLevel.ERROR, ErrorType.BIZ, "996", "非法请求"), + + /** + * 服务熔断不可用 + */ + SERVICE_FUSING_NOT_AVAILABLE(ErrorLevel.WARN, ErrorType.SYSTEM, "997", "服务熔断不可用"), + + /** + * 系统限流 + */ + SLA_LIMIT_ERROR(ErrorLevel.WARN, ErrorType.SYSTEM, "998", "SLA限流异常"), + + /** + * 系统内部错误 + */ + INTERNAL_SERVER_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "999", "系统开小差了"), + + /** + * 数据异常 + */ + DATA_INVALID(ErrorLevel.ERROR, ErrorType.BIZ, "1000", "数据异常"), + + + /*================订单域异常码,100开头*/ + + /** + * 订单已支付 + */ + ORDER_HAS_PAID(ErrorLevel.ERROR, ErrorType.SYSTEM, "1003", "订单已支付"), + + /** + * 订单超时 + */ + ORDER_EXPIRED(ErrorLevel.ERROR, ErrorType.SYSTEM, "1004", "订单超时未支付"), + + /** + * 询价错误 + */ + INQUIRE_PRICE(ErrorLevel.ERROR, ErrorType.SYSTEM, "1005", "询价错误"), + + /** + * 价格变更 + */ + PRICE_CHANGE(ErrorLevel.ERROR, ErrorType.SYSTEM, "1006", "价格变更"), + + /** + * 订单不存在 + */ + ORDER_NOT_FOUND(ErrorLevel.ERROR, ErrorType.SYSTEM, "1007", "订单不存在"), + + /** + * 订单查询失败 + */ + QUERY_ORDER_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "1008", "订单查询失败"), + + /** + * 列表查询失败 + */ + ORDER_LIST_QUERY_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "1009", "列表查询失败"), + + /** + * 乘客保存失败 + */ + PASSENGER_SAVE_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "1010", "乘客保存失败"), + + /** + * 乘客修改失败 + */ + PASSENGER_MODIFY_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "1011", "乘客修改失败"), + + /** + * 乘客删除失败 + */ + PASSENGER_DELETE_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "1012", "乘客删除失败"), + + /** + * 乘客查询失败 + */ + PASSENGER_QUERY_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "1013", "乘客查询失败"), + + QUERY_BIZ_RULE_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "1014", "查询业务规则失败"), + + /** + * 当前订单票数超过购买上限 + */ + USER_BUY_LIMIT_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "1015", "当前用户票数超过购买上限"), + + NOT_SUPPORT_GO_BACK_TICK(ErrorLevel.ERROR, ErrorType.SYSTEM, "1016", "不支持购买往返票"), + + /** + * 当前时间暂不能购买 + */ + USER_BUY_TIME_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "1016", "当前时间暂不能购买"), + + /** + * 票类型错误 + */ + TICKET_TYPE_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "1017", "票类型错误"), + + /** + * 该产品中未查询到售卖单元 + */ + SALES_UNIT_NOT_EXIST_IN_PRODUCT_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "1019", "该产品中未查询到售卖单元"), + + /** + * 当前售卖单元不存在 + */ + SALE_UNIT_NOT_EXIST_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "1020", "当前售卖单元不存在"), + + /** + * 售卖单元组成要素不存在 + */ + SALES_UNIT_ELEMENTS_NOT_EXIST_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "1021", "售卖单元组成要素不存在"), + + /** + * 订单状态非法 + */ + INVALID_ORDER_STATUS(ErrorLevel.ERROR, ErrorType.SYSTEM, "1022", "订单状态发生变化"), + + /** + * 创单异常 + */ + CREATE_ORDER_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "1023", "创建订单错误"), + + /** + * 当前产品类目异常 + */ + PRODUCT_CATEGORY_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "1024", "类目异常"), + + /** + * 产品业务类型为空 + */ + PRODUCT_BUSINESS_TYPE_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "1025", "业务类型异常"), + + /** + * 审核单异常 + */ + ORDER_AUDIT_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "1026", "审核单创建异常"), + + /** + * 售卖单元与行程不匹配 + */ + SUBJECT_ITEM_NOT_MATCH_WITH_TRIP_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "1027", "售卖单元与行程不匹配"), + + /** + * 订单无法取消 + */ + ORDER_CANCEL_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "1028", "订单取消异常"), + + + ORDER_CHANGE_ERROR_NOT_ALLOW_TYPE(ErrorLevel.ERROR, ErrorType.SYSTEM, "1033", "不允许变更的订单类型"), + ORDER_CHANGE_ERROR_NOT_ALLOW_STATUS(ErrorLevel.ERROR, ErrorType.SYSTEM, "1034", "不允许变更的订单状态"), + ORDER_CHANGE_ERROR_NOT_ALLOW_TIME(ErrorLevel.ERROR, ErrorType.SYSTEM, "1035", "当前时间不支持变更"), + ORDER_CANCEL_ERROR_NOT_ALLOW_TIME(ErrorLevel.ERROR, ErrorType.SYSTEM, "1036", "当前时间不支持取消"), + ORDER_CHANGE_NOT_ALLOW(ErrorLevel.ERROR, ErrorType.SYSTEM, "1029", "不允许行程变更"), + ORDER_CHANGE_OVER_TIMES(ErrorLevel.ERROR, ErrorType.SYSTEM, "1029", "行程变更超过次数"), + + ORDER_CHANGE_APPLY_PUSH_STATUS_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "1029", "订单变更申请单状态推进失败"), + + /** + * 订单分配异常 + */ + ORDER_DISTRIBUTE_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "1030", "订单分配异常"), + + /** + * 行程同步失败 + */ + TRIP_SYNC_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "1031", "行程同步主数据异常"), + + /** + * 存在未通过的申请单,不能重复申请 + */ + ORDER_CHANGE_APPLY_EXIST_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "1031", "存在未通过的申请单,不能重复申请"), + + /** + * 派单详情查询失败 + */ + ORDER_DISPATCH_ORDER_SEARCH_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "1032", "派单详情查询失败"), + + /** + * 支付消息消费失败 + */ + PAY_MESSAGE_CONSUME_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "1033", "支付消息消费失败"), + + /** + * 行程无需同步 + */ + ORDER_TRIP_NOT_NEED_SYNC_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "1033", "行程无需同步"), + + /** + * 下单失败 + */ + BUY_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "1034", "下单失败"), + + /** + * 当前拼车单无法取消 + */ + CARPOOL_NOT_ALLOW_CANCEL_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "1035", "当前拼车单无法取消"), + + BATCH_EXECUTE_RULE_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "1036", "批量执行规则失败"), + + /** + * 拼车-推送国朗消息失败 + */ + PUSH_GUO_LANG_FAIL(ErrorLevel.ERROR, ErrorType.SYSTEM, "1037", "推送国朗消息失败"), + + /** + * 库存扣减异常 + */ + STOCK_REDUCE_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "1038", "库存扣减异常"), + + /*================履约域异常码,200开头*/ + ORDER_NOT_BELONG_TO_CUR_USER(ErrorLevel.ERROR, ErrorType.BIZ, "2001", "该订单不属于该登录用户"), + + REFUND_PASSENGER_COUNT_INVALID(ErrorLevel.ERROR, ErrorType.BIZ, "2002", "退款人数不能超过下单购买的人数"), + + INVALID_REFUND_TIME(ErrorLevel.ERROR, ErrorType.BIZ, "2003", "当前时间不支持退票"), + + NOT_CORRECT_REFUND_AMOUNT(ErrorLevel.ERROR, ErrorType.BIZ, "2004", "传入的退款金额不正确"), + + OVER_MAX_REFUND_COUNT(ErrorLevel.ERROR, ErrorType.BIZ, "2005", "该用户在当月/当天内已超过最高退款次数,不可退款"), + + REFUND_TICKET_HAS_VERIFICATION_RECORD(ErrorLevel.ERROR, ErrorType.BIZ, "2006", "该订单已有乘车记录,无法进行退票"), + + REFUND_TICKET_COUNT_INVALID(ErrorLevel.ERROR, ErrorType.BIZ, "2007", "退票数量非法"), + + NOT_FOUND_REFUND_AVAILABLE_VOUCHER(ErrorLevel.ERROR, ErrorType.BIZ, "2008", "不存在可以退款的车票"), + + REDUCE_SERVICE_CHARGE_ERROR(ErrorLevel.ERROR, ErrorType.BIZ, "2009", "手续费减免流程异常"), + + + NOT_FOUND_CURRENT_SALE_UNIT_PRICE_DETAIL(ErrorLevel.ERROR, ErrorType.BIZ, "2009", "当前售卖单元的价格明细不存在"), + + REFUND_AMOUNT_INVALID(ErrorLevel.ERROR, ErrorType.BIZ, "2010", "退款金额非法"), + + REFUND_CHARGE_AMOUNT_INVALID(ErrorLevel.ERROR, ErrorType.BIZ, "2011", "退票手续费金额非法"), + + CALCULATE_REFUND_AMOUNT_ERROR(ErrorLevel.ERROR, ErrorType.BIZ, "2012", "计算退票金额失败"), + + REFUND_CHECK_ERROR(ErrorLevel.ERROR, ErrorType.BIZ, "2013", "退票校验失败"), + + REFUND_BUTTON_SHOWABLE_ERROR(ErrorLevel.ERROR, ErrorType.BIZ, "2014", "是否展示退票按钮校验失败"), + + /*================资金域异常码,300开头*/ + REFUND_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "3001", "退款失败"), + + REFUND_SUCCESS_CALLBACK_PROCESS_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "3002", "退款成功回调处理失败"), + + ORDER_STATUS_NOT_SUPPORT_QUERY_PAY_RESULT(ErrorLevel.ERROR, ErrorType.SYSTEM, "3003", "当前订单状态不支持查询支付结果"), + + NOT_FOUND_PAID_PAY_ORDER(ErrorLevel.ERROR, ErrorType.BIZ, "3004", "不存在已支付的支付单"), + + FOUND_DUPLICATE_PAID_PAY_ORDER(ErrorLevel.ERROR, ErrorType.BIZ, "3005", "存在多笔已支付的支付单"), + + RESCHEDULE_PAID_SUCCESS_PROCESS_ERROR(ErrorLevel.ERROR, ErrorType.BIZ, "3006", "改签订单支付成功处理失败"), + + RESCHEDULE_INVALID_VOUCHER_PROCESS_ERROR(ErrorLevel.ERROR, ErrorType.BIZ, "3007", "改签订单失效凭证失败"), + + ROUTE_OUT_OF_SERVICE(ErrorLevel.ERROR, ErrorType.BIZ, "3008", "线路已经停运无法改签"), + + /*================凭证域异常码,400开头*/ + NOT_FOUND_VOUCHER(ErrorLevel.ERROR, ErrorType.BIZ, "4001", "凭证不存在"), + + DUPLICATED_REFUNDING_APPLY_ORDER(ErrorLevel.ERROR, ErrorType.BIZ, "4002", "存在在途的退票申请单,不能继续申请"), + + INVALID_TICKET_TYPE(ErrorLevel.ERROR, ErrorType.BIZ, "4003", "不支持的票类型"), + + NOT_FOUND_NEED_REFUND_NON_REAL_NAME_VOUCHER(ErrorLevel.ERROR, ErrorType.BIZ, "4004", "找不到申请退票的非实名凭证"), + + NOT_SUPPORT_RESCHEDULE_VOUCHER_TYPE(ErrorLevel.ERROR, ErrorType.BIZ, "4005", "当前的票类型不支持改签,只有日票支持改签"), + + NOT_FOUND_AVAILABLE_RESCHEDULE_VOUCHER(ErrorLevel.ERROR, ErrorType.BIZ, "4006", "当前订单没有可以改签的车票,只有未核销的次票支持改签"), + + NOT_SUPPORT_RESCHEDULE_TIME(ErrorLevel.ERROR, ErrorType.BIZ, "4007", "当前时间不支持改签"), + + TENANT_NOT_SUPPORT_RESCHEDULE(ErrorLevel.ERROR, ErrorType.BIZ, "4008", "当前租户不允许改签"), + + /*================除交易域外依赖的第三方业务,500开头*/ + PRODUCT_BIZ_RULE_NOT_EXIST_ERROR(ErrorLevel.ERROR, ErrorType.BIZ, "5001", "产品规则不存在"), + + + /** + * 产品标识非法 + */ + PRODUCT_FORMAL_FLAG_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "5002", "产品标识非法"), + + /** + * 产品不存在 + */ + PRODUCT_NOT_EXIST_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "5003", "产品不存在"), + + /** + * 线路不一致 + */ + ROUTE_COMPARE_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "5004", "线路比对不一致"), + + /** + * 线路信息不存在 + */ + ROUTE_NOT_EXIST_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "5005", "线路信息不存在"), + + TICKET_TYPE_NOT_EXIST(ErrorLevel.ERROR, ErrorType.SYSTEM, "5006", "当前票类型不存在"), + + /** + * 短信发送失败 + */ + SMS_SEND_ERROR(ErrorLevel.ERROR, ErrorType.BIZ, "5007", "短信发送失败"), + + /** + * 邮件发送失败 + */ + EMAIL_SEND_ERROR(ErrorLevel.ERROR, ErrorType.BIZ, "5008", "邮件发送失败"), + + /** + * 规则执行失败 + */ + RULE_EXECUTE_ERROR(ErrorLevel.ERROR, ErrorType.BIZ, "5009", "规则执行失败"), + + /** + * 当前时间暂不可预约 + */ + CURRENT_TIME_BOOK_ERROR(ErrorLevel.ERROR, ErrorType.BIZ, "5010", "当前时间暂不可预约"), + CURRENT_TIME_ERROR(ErrorLevel.ERROR, ErrorType.BIZ, "5010", "出发时间不能晚于当前时间"), + + PRODUCT_EXTEND_ATTRIBUTE_NOT_EXIST_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "5011", "产品拓展属性不存在"), + + /** + * 订单确认审核执行异常 + */ + ORDER_AUDIT_CONFIRM_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "6001", "订单确认审核执行异常"), + /** + * 该订单无申请单 + */ + ORDER_AUDIT_APPLY_NONE_EXIST_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "6001", "该订单无申请单"), + + /** + * 该订单的申请单已达到最终状态 + */ + ORDER_AUDIT_APPLY_NONE_VALID_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "6001", "该订单的申请单已达到最终状态"), + + /** + * 该订单的申请单已达到最终状态 + */ + ORDER_PRICE_CHANGE_ABOVE_MIN_PRICE_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "6001", "业务员改价超出内部最低价格"), + + /** + * 订单全款减少手续费确认审核执行异常 + */ + ORDER_FULL_RSC_AUDIT_CONFIRM_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "6002", "订单全款减少手续费确认审核执行异常"), + + + /** + * 订单变更申请单创建执行异常 + */ + CREATE_ORDER_CHANGE_APPLY_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "6003", "订单变更申请单创建执行异常"), + + + /** + * 该订单属于特殊订单,仅某公司方可接单,对应组织名称需要在展示在提示信息里 + */ + ORDER_HAS_SPECAIL_ORG_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "6004", "该订单属于专属承运公司订单,仅能派给以下公司:{}"), + + /** + * 该订单已分配过公司,不能再分配 + */ + ORDER_ALREADY_DISPATCH_ORG_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "6004", "该订单已分配过公司,不能再分配"), + + /** + * 该订单没有指定承运公司 + */ + ORDER_NONE_DISPATCH_ORG_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "6005", "该订单没有指定承运公司"), + /** + * 该订单已被某承运接单 + */ + ORDER_ALREADY_RECEIVED_ORG_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "60041", "该订单已被某承运公司接单"), + + /** + * 该订单已被召回 + */ + ORDER_ALREADY_CALLBACK_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "60044", "该订单已被总公司召回"), + + /** + * 该订单已被召回 + */ + ORDER_ALREADY_GIVEBACK_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "60046", "该订单已被分公司退回"), + + /** + * 该订单已完成审核确认 + */ + ORDER_ALREADY_CONFIRM_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "60042", "该订单已完成审核确认"), + + + /** + * 公司组织不匹配 + */ + ORDER_ORG_NOT_MATCH__ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "60043", "公司组织不匹配"), + + + ORDER_NEED_PAY_AMOUNT_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "6006", "订单需支付金额异常"), + + /** + * 订单变更申请单不存在 + */ + CHANGE_ORDER_APPLY_NOT_EXIST_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "6007", "订单变更申请单不存在"), + + /** + * 订单变更申请单已经审核完成 + */ + CHANGE_ORDER_APPLY_APPROVED_FINISH_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "6008", "订单变更申请单已经审核完成"), + + + /** + * 订单枚举转换异常 + */ + ORDER_CHANGE_ENUM_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "6009", "订单枚举转换审核状态异常"), + + /** + * 到达审核超时时间,订单无需变更进行超时处理 + */ + ORDER_STATUS_NOT_NEED_PROCESS_ERROR(ErrorLevel.ERROR, ErrorType.SYSTEM, "6010", "到达审核超时时间,订单无需变更进行超时处理"), + + + /** + * 找不到派单成功的派单记录 + */ + NOT_FOUND_SUCCESS_DISPATCH_RECORD(ErrorLevel.ERROR, ErrorType.SYSTEM, "6011", "找不到派单成功的派单记录"), + + + /** + * 订单信息已变化,请查看最新信息后再进行相关操作 + **/ + ORDER_HAS_CHANGED_ERROR(ErrorLevel.ERROR, ErrorType.BIZ, "6012", "订单信息已变化,请查看最新信息后再进行相关操作"), + + /** + * 业务锁获取失败 + **/ + BIZ_LOCK_GET_ERROR(ErrorLevel.ERROR, ErrorType.BIZ, "6013", "业务锁获取失败,暂时不能执行"), + + ORG_DETAIL_QUERY_ERROR(ErrorLevel.ERROR, ErrorType.BIZ, "6014", "暂未查询到对应的组织信息"), + + ORDER_CHANGE_ERROR(ErrorLevel.ERROR, ErrorType.BIZ, "6015", "变更订单异常"), + + CARPOOL_SALE_UNIT_QUERY_ERROR(ErrorLevel.ERROR, ErrorType.BIZ, "6016", "开线信息查询异常"), + + CARPOOL_SWIPE_CARD_NO_EXIST_ERROR(ErrorLevel.ERROR, ErrorType.BIZ, "6017", "请先退出再重新刷卡预约"), + + + // =========== 定时任务6xxx + INSERT_TASK_ERROR(ErrorLevel.ERROR, ErrorType.BIZ, "6001", "插入定时任务表失败"), + + UPDATE_TASK_STATUS_ERROR(ErrorLevel.ERROR, ErrorType.BIZ, "6002", "更新定时任务状态失败"), + + ILLEGAL_SCHEDULE_TASK_TYPE(ErrorLevel.ERROR, ErrorType.BIZ, "6003", "非法的定时任务类型"), + + // =========== 往返程&改签业务 + RESCHEDULE_NOT_FOUND_TRIP_TYPE_SUBJECT_ITEM(ErrorLevel.ERROR, ErrorType.BIZ, "7001", "未找到指定行程类型的标的项"), + + ROUND_TRIP_NOT_SUPPORT_TICKET_TYPE(ErrorLevel.ERROR, ErrorType.BIZ, "7002", "当前的车票类型不允许购买往返程"), + + ORDER_NOT_ALLOW_RESCHEDULE_ERROR(ErrorLevel.ERROR, ErrorType.BIZ, "7003", "当前不允许改签"), + + ORDER_RESCHEDULE_ERROR(ErrorLevel.ERROR, ErrorType.BIZ, "7004", "改签异常"), + + RESCHEDULE_TICKET_COUNT_ERROR(ErrorLevel.ERROR, ErrorType.BIZ, "7005", "选择改签的票数量与改签后的数量不一致"), + + ; + /** + * 系统编码 + */ + public static final String TP_TRADE_PROD_CODE = "001"; + + /** + * 错误级别 + */ + private ErrorLevel errorLevel; + + /** + * 错误类型 + */ + private ErrorType errorType; + + /** + * 错误编码 + */ + private String code; + + /** + * 错误描述 + */ + private String desc; + + /** + * 构造方法 + * + * @param errorLevel + * @param errorType + * @param code + * @param desc + */ + TpTradeProdErrorCode(ErrorLevel errorLevel, ErrorType errorType, String code, String desc) { + this.errorLevel = errorLevel; + this.errorType = errorType; + this.code = code; + this.desc = desc; + } + + public ErrorLevel getErrorLevel() { + return errorLevel; + } + + public ErrorType getErrorType() { + return errorType; + } + + public String getCode() { + return code; + } + + public String getDesc() { + return desc; + } +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/exception/TpTradeProdException.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/exception/TpTradeProdException.java new file mode 100644 index 0000000..f84c643 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/exception/TpTradeProdException.java @@ -0,0 +1,137 @@ +/* + * Alipay.com Inc. + * Copyright (c) 2004-2005 All Rights Reserved. + */ +package com.deepinnet.tptradeprod.common.exception; + + +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import lombok.Data; +import org.apache.commons.lang3.StringUtils; + +import java.util.*; + +/** + * 投保核心异常基类。 + * + * @author taobinxian + * @version 2022-11-08 + */ +@Data +public class TpTradeProdException extends RuntimeException { + + /** + * 错误码 + */ + protected TpTradeProdErrorCode errorCode; + + /** + * 错误时相关参数 + */ + protected Map parameters; + + /** + * 异常信息 + */ + protected String message; + + /** + * 异常构造函数。 + * + * @param errorCode 内部错误码 + */ + public TpTradeProdException(TpTradeProdErrorCode errorCode) { + this(errorCode, null, null, null); + } + + /** + * 异常构造函数。 + * + * @param errorCode 内部错误码 + * @param cause 错误原因 + */ + public TpTradeProdException(TpTradeProdErrorCode errorCode, Throwable cause) { + this(errorCode, null, null, cause); + } + + /** + * 异常构造函数。 + * + *

内部异常时使用 + * + * @param errorCode 内部错误码 + * @param message 异常信息 + */ + public TpTradeProdException(TpTradeProdErrorCode errorCode, String message) { + this(errorCode, message, null, null); + } + + + /** + * 异常构造函数。 + * + *

内部异常时使用 + * + * @param errorCode 内部错误码 + * @param message 异常信息 + * @param parameters 错误时相关参数 + */ + public TpTradeProdException(TpTradeProdErrorCode errorCode, String message, Map parameters) { + this(errorCode, message, parameters, null); + } + + /** + * 异常构造函数。 + * + * @param errorCode 内部错误码 + * @param message 异常信息 + * @param cause + */ + public TpTradeProdException(TpTradeProdErrorCode errorCode, String message, Throwable cause) { + this(errorCode, message, null, cause); + } + + /** + * 异常构造函数。 + * + *

内部异常时使用 + * + * @param errorCode + * @param message + * @param parameters + * @param cause + */ + public TpTradeProdException(TpTradeProdErrorCode errorCode, String message, Map parameters, Throwable cause) { + super(message, cause); + this.errorCode = errorCode; + this.message = message; + this.parameters = parameters; + } + + /** + * @see Throwable#getMessage() + */ + @Override + public String getMessage() { + if (StringUtils.isNotBlank(message)) { + return message; + } + return errorCode.getDesc(); + } + + /** + * 增加扩展信息 + * + * @param key + * @param value + * @return 自身 + */ + public TpTradeProdException addExtInfo(String key, String value) { + if (parameters == null) { + parameters = new HashMap(); + } + parameters.put(key, value); + + return this; + } +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/CarPoolPosGuoLangMessageEntity.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/CarPoolPosGuoLangMessageEntity.java new file mode 100644 index 0000000..ad2c46b --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/CarPoolPosGuoLangMessageEntity.java @@ -0,0 +1,46 @@ +package com.deepinnet.tptradeprod.common.model; + +import lombok.Data; + +import java.io.Serializable; + +/** + *

+ * + *

+ * + * @author chenjiaju + * @since 2024/5/21 + */ + +@Data +public class CarPoolPosGuoLangMessageEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 卡号 + */ + private String cardNo; + + /** + * 外部流水号 + */ + private String outTradeNo; + + /** + * 预约班次时间,格式:yyyy-MM-dd HH:mm:ss + */ + private String planTravelTime; + + /** + * pos机器编号 + */ + private String posNo; + + /** + * 租户id + */ + private String tenantId; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/OrderDelayMessageEntity.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/OrderDelayMessageEntity.java new file mode 100644 index 0000000..0fa5439 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/OrderDelayMessageEntity.java @@ -0,0 +1,26 @@ +package com.deepinnet.tptradeprod.common.model; + +import lombok.Data; + +/** + *

+ * 订单延迟消息实体 + *

+ * + * @author chenjiaju + * @since 2023/9/7 + */ + +@Data +public class OrderDelayMessageEntity { + + /** + * 订单编号 + */ + private String orderNo; + + /** + * 租户编号 + */ + private String tenantId; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/PayOrderDelayMessageEntity.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/PayOrderDelayMessageEntity.java new file mode 100644 index 0000000..a8c9b98 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/PayOrderDelayMessageEntity.java @@ -0,0 +1,26 @@ +package com.deepinnet.tptradeprod.common.model; + +import lombok.Data; + +/** + *

+ * 订单延迟消息实体 + *

+ * + * @author chenjiaju + * @since 2023/9/7 + */ + +@Data +public class PayOrderDelayMessageEntity { + + /** + * 支付单号 + */ + private String payOrderNo; + + /** + * 租户编号 + */ + private String tenantId; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/PayRefundDelayMessageEntity.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/PayRefundDelayMessageEntity.java new file mode 100644 index 0000000..e3fb106 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/PayRefundDelayMessageEntity.java @@ -0,0 +1,26 @@ +package com.deepinnet.tptradeprod.common.model; + +import lombok.Data; + +/** + *

+ * 退款订单延迟消息实体 + *

+ * + * @author chenjiaju + * @since 2023/9/7 + */ + +@Data +public class PayRefundDelayMessageEntity { + + /** + * 原始订单编号 + */ + private String originalOrderNo; + + /** + * 租户编号 + */ + private String tenantId; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/PaySuccessMessageEntity.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/PaySuccessMessageEntity.java new file mode 100644 index 0000000..6f997f3 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/PaySuccessMessageEntity.java @@ -0,0 +1,39 @@ +package com.deepinnet.tptradeprod.common.model; + +import lombok.Data; + +/** + *

+ * 支付成功消息实体 + *

+ * + * @author chenjiaju + * @since 2023/9/4 + */ +@Data +public class PaySuccessMessageEntity { + /** + * 支付单号 + */ + private String payOrderNo; + + /** + * 订单号 + */ + private String orderNo; + + /** + * 支付成功时间 + */ + private Long payTime; + + /** + * bizType + */ + private String bizType; + + /** + * 租户id + */ + private String tenantId; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/RefundSuccessMessageEntity.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/RefundSuccessMessageEntity.java new file mode 100644 index 0000000..adedf72 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/RefundSuccessMessageEntity.java @@ -0,0 +1,35 @@ +package com.deepinnet.tptradeprod.common.model; + +import lombok.Data; + +/** + * @author amos wong + * @create 2022-11-22 21:33 + */ +@Data +public class RefundSuccessMessageEntity { + /** + * 原始订单号 + */ + private String orderNo; + + /** + * 退款支付单号 + */ + private String refundPayOrderNo; + + /** + * 退款业务单号,如果是定制公交,这里代表退票申请单号 + */ + private String refundBizNo; + + /** + * 业务类型 + */ + private String bizType; + + /** + * 租户id + */ + private String tenantId; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/TicketRefundMessageEntity.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/TicketRefundMessageEntity.java new file mode 100644 index 0000000..fe8778f --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/TicketRefundMessageEntity.java @@ -0,0 +1,60 @@ +package com.deepinnet.tptradeprod.common.model; + +import lombok.Data; + +import java.io.Serializable; + +/** + *

+ * 退款成功消息体 + *

+ * + * @author chenjiaju + * @since 2023/9/6 + */ + +@Data +public class TicketRefundMessageEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 订单号 + */ + private String orderNo; + + /** + * 退票申请单号 + */ + private String refundApplyOrderNo; + + /** + * 核销时间 + */ + private Long refundTime; + + /** + * 租户id + */ + private String tenantId; + + /** + * 是否存在退票 + */ + private boolean existRefund; + + /** + * 是否存在核销 + */ + private boolean existVerification; + + /** + * 是否存在有效凭证 + */ + private boolean existValid; + + /** + * 是否存在过期凭证 + */ + private boolean existExpire; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/TpMessageEntity.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/TpMessageEntity.java new file mode 100644 index 0000000..f950bad --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/TpMessageEntity.java @@ -0,0 +1,47 @@ +package com.deepinnet.tptradeprod.common.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * @author chenjiaju + * @version 2023/1/9 + */ + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TpMessageEntity implements Serializable { + + /** + * topic + */ + private String topic; + + /** + * tag + */ + private String tag; + + /** + * consumeGroup + */ + + private String consumerGroup; + + /** + * key + */ + private String messageKey; + + /** + * 接收到的消息 + */ + private String message; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/VoucherExpireMessageEntity.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/VoucherExpireMessageEntity.java new file mode 100644 index 0000000..fd1666a --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/VoucherExpireMessageEntity.java @@ -0,0 +1,47 @@ +package com.deepinnet.tptradeprod.common.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + *

+ * 凭证过期消息实体 + *

+ * + * @author chenjiaju + * @since 2023/9/11 + */ + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class VoucherExpireMessageEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 订单编号 + */ + private String orderNo; + + /** + * 凭证编号 + */ + private String voucherNo; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 是否存在有效凭证 + */ + private boolean existValid; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/VoucherRescheduleInvalidMessageEntity.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/VoucherRescheduleInvalidMessageEntity.java new file mode 100644 index 0000000..22b7eac --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/VoucherRescheduleInvalidMessageEntity.java @@ -0,0 +1,28 @@ +package com.deepinnet.tptradeprod.common.model; + +import lombok.Data; + +/** + * @author amos wong + * @create 2024-07-19 10:40 + *

+ * 改签订单失效凭证后订单推进到已失效 + */ +@Data +public class VoucherRescheduleInvalidMessageEntity { + + /** + * 订单号 + */ + private String orderNo; + + /** + * 是否存在退票 + */ + private Boolean existRefund; + + /** + * 租户id + */ + private String tenantId; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/VoucherVerificationMessageEntity.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/VoucherVerificationMessageEntity.java new file mode 100644 index 0000000..fe44c74 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/model/VoucherVerificationMessageEntity.java @@ -0,0 +1,60 @@ +package com.deepinnet.tptradeprod.common.model; + +import lombok.Data; + +import java.io.Serializable; + +/** + *

+ * 凭证核销成功消息体 + *

+ * + * @author chenjiaju + * @since 2023/9/6 + */ + +@Data +public class VoucherVerificationMessageEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 订单号 + */ + private String orderNo; + + /** + * 凭证编号 + */ + private String voucherNo; + + /** + * 核销时间 + */ + private Long verificationTime; + + /** + * 租户id + */ + private String tenantId; + + /** + * 是否存在退票 + */ + private boolean existRefund; + + /** + * 是否存在核销 + */ + private boolean existVerification; + + /** + * 是否存在有效凭证 + */ + private boolean existValid; + + /** + * 是否存在过期凭证 + */ + private boolean existExpire; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/service/facade/TpContractAcceptanceFacade.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/service/facade/TpContractAcceptanceFacade.java new file mode 100644 index 0000000..b225c28 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/service/facade/TpContractAcceptanceFacade.java @@ -0,0 +1,80 @@ +package com.deepinnet.tptradeprod.common.service.facade; + +import com.deepinnet.tp.common.lang.page.CommonPage; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.vo.*; + +import javax.validation.constraints.*; +import java.util.List; + +/** + * @author amos wong + * @create 2023/9/8 16:21 + * @Description + */ +public interface TpContractAcceptanceFacade { + + /** + * 申请退票 + * + * @param refundApplyDTO 入参 + * @return 是否成功 + */ + TpResult refundTicket(@NotNull(message = "请求参数不能为空") TpProdRefundApplyDTO refundApplyDTO); + + /** + * 校验退票按钮是否需要展示 + * + * @param showRefundButtonCheckDTO + * @return + */ + TpResult checkRefundTicketButtonShowable(TpProdShowRefundButtonCheckDTO showRefundButtonCheckDTO); + + /** + * 退票金额试算 + * + * @param refundAmountDTO + * @return + */ + TpResult calculateRefundAmount(@NotNull(message = "入参不能为空") TpProdCalculateRefundAmountDTO refundAmountDTO); + + /** + * 查询可退的凭证列表 + * + * @param availableVoucherDTO + * @return + */ + TpResult queryAvailableRefundVoucherList(@NotNull(message = "入参不能为空") TpProdQueryAvailableRefundVoucherDTO availableVoucherDTO); + + /** + * 分页查询退票申请单列表(搜索) + * + * @return 退票申请单 + */ + TpResult> pageQueryApplyRefundOrders(@NotNull(message = "请求参数不能为空") TpProdPageQueryRefundApplyOrderDTO queryDTO); + + /** + * 查询退票申请单列表 + * + * @return 退票申请单 + */ + TpResult> getRefundApplyOrderList(@NotBlank(message = "请求参数不能为空") TpProdQueryRefundApplyOrderDTO queryDTO); + + /** + * 查询退票详情 + * + * @param queryDTO 查询条件 + * @return + */ + TpResult getRefundDetail(@NotNull(message = "请求参数不能为空") TpProdQueryRefundDetailDTO queryDTO); + + + /** + * 校验是否能够退票 + * + * @param refundAvailableCheckDTO 入参 + * @return + */ + TpResult checkRefundAvailable(@NotNull(message = "请求参数不能为空") TpProdRefundAvailableCheckDTO refundAvailableCheckDTO); +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/service/facade/TpOrderAcceptanceFacade.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/service/facade/TpOrderAcceptanceFacade.java new file mode 100644 index 0000000..6662b98 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/service/facade/TpOrderAcceptanceFacade.java @@ -0,0 +1,154 @@ +package com.deepinnet.tptradeprod.common.service.facade; + +import com.deepinnet.tp.common.lang.page.CommonPage; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.vo.*; + +import javax.validation.constraints.NotNull; +import java.util.List; + + +/** + * @author amos wong + * @create 2023/9/2 14:32 + * @Description 订单受理facade + */ +public interface TpOrderAcceptanceFacade { + /** + * 创建订单 + * + * @param dto 下单参数 + * @return 创建订单结果VO + */ + TpResult createOrder(TpProdOrderCreateDTO dto); + + /** + * 改签订单 + * + * @param dto 改签订单参数 + * @return 订单改签结果VO + */ + @Deprecated + TpResult endorseOrder(TpProdOrderCreateDTO dto); + + /** + * 预支付 + * + * @param dto 预支付参数 + * @return 收银台相关参数 + */ + TpResult payOrder(TpProdOrderPayDTO dto); + + /** + * 已支付推进订单状态 + * + * @param dto 订单参数 + * @return 订单推进支付状态返回参数 + */ + TpResult paid(TpProdOrderPaidDTO dto); + + /** + * 查询订单详情 + * @param dto 查询参数 + * @return 详情 + */ + TpResult getOrderDetail(TpProdOrderQueryDTO dto); + + /** + * 订单列表查询 + * @param dto 查询参数 + * @return 列表数据 + */ + TpResult> getOrderList(TpProdOrderListQueryDTO dto); + + /** + * 新增乘客 + * @param dto 入参 + * @return 是否成功 + */ + TpResult savePassenger(@NotNull TpUserPassengerDTO dto); + + /** + * 编辑乘客 + * @param dto 入参 + * @return 是否成功 + */ + TpResult editPassenger(@NotNull TpUserPassengerDTO dto); + + /** + * 删除乘客 + * @param dto 入参 + * @return 是否成功 + */ + TpResult delPassenger(@NotNull TpUserPassengerQueryDTO dto); + + /** + * 乘客列表 + * @param dto 入参 + * @return 乘客列表 + */ + TpResult> passengerList(@NotNull TpUserPassengerQueryDTO dto); + + /** + * 手续费试算 + * @param dto 入参 + * @return 手续费 + */ + TpResult orderServiceChargeCal(TpServiceChargeDTO dto); + + /** + * 取消订单 + * @param dto 入参 + * @return 取消订单申请状态 + */ + TpResult cancelOrder(TpOrderCancelDTO dto); + + /** + * 手动同步行程 + * @param dto 入参 + * @return 是否同步成功 + */ + TpResult manualSyncTrip(TpProdOrderQueryDTO dto); + + /** + * 定制公交查询列表定位标识 + */ + TpResult customBusPositionFlag(TpProdOrderListQueryDTO dto); + + + /** + * 检票成功回调 + * @param checkSuccessCallbackDTO + * @return + */ + TpResult checkSuccessCallback(TpProdCheckSuccessCallbackDTO checkSuccessCallbackDTO); + + /** + * POS机PAD端约车记录 + * @param dto 查询参数 + * @return 订单数据 + */ + TpResult> padCarpoolOrderList(TpProdOrderListQueryDTO dto); + + /** + * 取消拼车 + * @param dto 查询参数 + * @return 取消拼车结果 + */ + TpResult cancelCarpoolOrder(TpProdOrderQueryDTO dto); + + /** + * 是否可改签 + * @param dto 查询参数 + * @return 是否可改签 + */ + TpResult isReschedule(TpProdOrderQueryDTO dto); + + /** + * 改签接口 + * @param dto 改签参数 + * @return 改签结果 + */ + TpResult rescheduleOrder(TpProdOrderRescheduleDTO dto); +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/service/facade/TpOrderAuditAcceptanceFacade.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/service/facade/TpOrderAuditAcceptanceFacade.java new file mode 100644 index 0000000..b9efd8e --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/service/facade/TpOrderAuditAcceptanceFacade.java @@ -0,0 +1,103 @@ +package com.deepinnet.tptradeprod.common.service.facade; + +import com.deepinnet.tp.common.lang.page.CommonPage; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderAuditConfirmOrderVO; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderRscConfirmVO; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditLatestDetailDTO; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditListVO; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditQueryDetailDTO; +import com.deepinnet.tptradeprod.common.vo.audit.TpProdAuditVO; + +import javax.validation.constraints.NotNull; + + +/** + * @author xiehuaqiao + * @create 2023/11/0 14:32 + * @Description 订单确认Facade + */ +public interface TpOrderAuditAcceptanceFacade { + + + /** + * 订单确认审核 + * + * @param dto 确认结果 + * @return 确认结果 + */ + TpResult confirmOrder(TpProdOrderAuditConfirmDTO dto); + + + /** + * 全额减免服务费审核确认 + * @param reduceDTO + * @return + */ + @Deprecated + TpResult reduceFullServiceCharge(TpProdOrderServiceChargeReduceConfirmDTO reduceDTO) ; + + + /** + * 减免服务费审核确认 + * @param reduceDTO + * @return + */ + TpResult reduceServiceChargeConfirm(TpProdOrderServiceChargeReduceConfirmDTO reduceDTO) ; + + + /** + * + * 查询审核单详情 + * + * @return + */ + TpResult getAuditDetail(@NotNull(message = "入参不能为空") TpProdAuditQueryDetailDTO tpAuditQueryDetailDTO); + + + + /** + * 获取指定订单的最近一个审核单详情信息 + * + * @return + */ + TpResult getLatestAuditDetail(@NotNull(message = "入参不能为空") TpProdAuditLatestDetailDTO auditLatestDetailDTO); + + + /** + * 订单确认审核-获取订单相关信息 + * + * @return 返回订单相关数据详情 + */ + TpResult getOrderAuditConfirmOrderDetail(@NotNull(message = "入参不能为空") TpProdOrderConfirmViewDTO confirmViewDTO); + + /** + * 审核单列表查询 + * @param dto 查询参数 + * @return 列表数据 + */ + TpResult> pageAuditList(TpProdAuditOrderListPagedQueryDTO dto); + + /** + * 减免服务费审批时查询订单退款金额信息 + * @param confirmQueryDTO + * @return + */ + TpResult getOrderRefundInfoForRscConfirm(@NotNull(message = "入参不能为空") TpProdOrderRscConfirmQueryDTO confirmQueryDTO); + + /** + * 减免服务费审批时查询订单退款金额信息 + * @param confirmQueryDTO + * @return + */ + @Deprecated + TpResult getOrderRefundInfoForFscConfirm(@NotNull(message = "入参不能为空") TpProdOrderRscConfirmQueryDTO confirmQueryDTO); + + /** + * 订单行程结束价格确认 + * @param orderEndTripPriceConfirmDTO + * @return + */ + TpResult endTripPriceConfirm(@NotNull(message = "入参不能为空") TpProdOrderEndTripPriceConfirmDTO orderEndTripPriceConfirmDTO); +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/service/facade/TpOrderChangeAcceptanceFacade.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/service/facade/TpOrderChangeAcceptanceFacade.java new file mode 100644 index 0000000..dee74ab --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/service/facade/TpOrderChangeAcceptanceFacade.java @@ -0,0 +1,61 @@ +package com.deepinnet.tptradeprod.common.service.facade; + +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderChangeApplyCreatedDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderChangeApplyDetailDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderChangeApplyListDTO; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderChangeApplyDetailVO; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderChangeApplyListVO; + +import javax.validation.constraints.NotNull; +import java.util.List; + + +/** + * @author xiehuaqiao + * @create 2023/11/0 14:32 + * @Description 订单变更详情Facade + */ +public interface TpOrderChangeAcceptanceFacade { + + /** + * 查询订单变更申请单详情 + * + * @param dto 查询条件 + * @return 订单变更申请单详情 + */ + TpResult getOrderChangeDetail(TpProdOrderChangeApplyDetailDTO dto); + + + /** + * 查询订单变更申请历史列表:订单变更申请单列表 + * + * @param dto 查询条件 + * @return 订单变更申请单详情 + */ + TpResult> listOrderChangeApplyHistory(TpProdOrderChangeApplyListDTO dto); + + /** + * 查询订单结束确认费用的记录 + * + * @param dto 查询条件 + * @return 订单变更申请单详情 + */ + TpResult getOrderEndTripChangeChargeRecord(TpProdOrderChangeApplyListDTO dto); + + /** + * 查询最近有效的订单变更申请单详情 + * + * @param dto 查询条件 + * @return 订单变更申请单详情 + */ + TpResult getLatestOrderChangeApplyDetail(TpProdOrderChangeApplyListDTO dto); + + /** + * 创建订单变更申请单:申请订单变更 + * + * @param orderChangeApplyCreatedDTO + * @return + */ + TpResult createOrderChangeApply(@NotNull(message = "入参不能为空") TpProdOrderChangeApplyCreatedDTO orderChangeApplyCreatedDTO); +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/service/facade/TpOrderDispatchAcceptanceFacade.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/service/facade/TpOrderDispatchAcceptanceFacade.java new file mode 100644 index 0000000..4c0ecfc --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/service/facade/TpOrderDispatchAcceptanceFacade.java @@ -0,0 +1,88 @@ +package com.deepinnet.tptradeprod.common.service.facade; + +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDispatchDetailVO; + +import java.util.List; + + +/** + * @author xiehuaqiao + * @create 2023/11/0 14:32 + * @Description 订单确认Facade + */ +public interface TpOrderDispatchAcceptanceFacade { + + /** + * 订单分配组织-业务员手动分配接口 + * + * @param dto 分配请求参数 + * @return 分配结果 + */ + TpResult dispatchOrder(TpProdOrderManualDispatchDTO dto); + + + /** + * 订单分配组织 + * + * @param dto 分配请求参数 + * @return 分配结果 + */ + TpResult dispatchOrder(TpProdOrderDispatchCreatedDTO dto); + + + /** + * 查询派单详情 + * + * @param dto 分配请求参数 + * @return 分配结果 + */ + TpResult getOrderDispatchDetail(TpProdOrderDispatchDetailDTO dto); + + + /** + * 派单接单 + * + * @param dto 分配请求参数 + * @return 分配结果 + */ + TpResult receiveOrder(TpProdDispatchOrderReceivedDTO dto); + + + /** + * 订单派车队 + * + * @param dto 分配请求参数 + * @return 分配结果 + */ + TpResult dispatchFleet(TpProdOrderDispatchFleetCreatedDTO dto); + + /** + * 派单召回 + * + * @param callBackDTO 派单召回实体 + * @return 召回结果 + */ + TpResult callBackOrder(TpProdOrderDispatchCallBackDTO callBackDTO); + + /** + * 派单退回 + * + * @param giveBackDTO 派单退回实体 + * @return 退回结果 + */ + TpResult giveBackOrder(TpProdOrderDispatchGiveBackDTO giveBackDTO); + + + + /** + * 查询派单列表详情 + * + * @param dto 查询参数 + * @return 订单列表 + */ + TpResult> listOrderDispatchDetail(TpProdOrderDispatchListDTO dto); + + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/service/facade/TpPaymentAcceptanceFacade.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/service/facade/TpPaymentAcceptanceFacade.java new file mode 100644 index 0000000..2336572 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/service/facade/TpPaymentAcceptanceFacade.java @@ -0,0 +1,22 @@ +package com.deepinnet.tptradeprod.common.service.facade; + +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tptradeprod.common.dto.TpProdQueryPayResultDTO; +import com.deepinnet.tptradeprod.common.vo.TpProdQueryPayResultVO; + +import javax.validation.constraints.NotNull; + +/** + * @author amos wong + * @create 2023/9/8 17:45 + * @Description + */ +public interface TpPaymentAcceptanceFacade { + + /*** + * 主动查询支付结果的接口 + * @param dto + * @return 支付结果 + */ + TpResult queryPayResult(@NotNull(message = "请求参数不能为空") TpProdQueryPayResultDTO dto); +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/service/facade/TpVoucherAcceptanceFacade.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/service/facade/TpVoucherAcceptanceFacade.java new file mode 100644 index 0000000..05833c4 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/service/facade/TpVoucherAcceptanceFacade.java @@ -0,0 +1,72 @@ +package com.deepinnet.tptradeprod.common.service.facade; + +import com.deepinnet.tp.common.lang.page.CommonPage; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.vo.*; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @author amos wong + * @create 2023/9/12 17:11 + * @Description + */ +public interface TpVoucherAcceptanceFacade { + /** + * 检票 + * + * @return 核销结果 + */ + TpResult check(@NotNull(message = "请求参数不能为空") TpProdVoucherCheckDTO checkDTO); + + /** + * 查询凭证列表 + * + * @param queryDTO + * @return + */ + TpResult> getVoucherList(@NotNull(message = "请求参数不能为空") TpProdVoucherQueryDTO queryDTO); + + /** + * 查询可改签的凭证列表 + * + * @param queryDTO + * @return + */ + TpResult queryAvailableRescheduleVoucherList(TpProdQueryAvailableRescheduleVoucherDTO queryDTO); + + /** + * 查询凭证核销记录 + * + * @param queryDTO + * @return + */ + TpResult> getVoucherVerificationRecordList(@NotNull(message = "请求参数不能为空") TpProdVoucherVerificationRecordQueryDTO queryDTO); + + /** + * 查询用户时间范围内核销成功的记录 + * + * @param queryDTO + * @return + */ + TpResult getTimeRangeExistVerificationRecordDate(TpProdTimeRangeExistVerificationRecordDateQueryDTO queryDTO); + + + /** + * 查询用户的某个时间内的乘车记录详情 + * + * @param queryDTO + * @return + */ + TpResult getTimeRangeUserVerificationRecordDetail(TpProdTimeRangeUserVerificationRecordDetailQueryDTO queryDTO); + + /** + * 查询业主后台的核销记录 + * + * @param queryDTO + * @return + */ + TpResult> queryMngVerificationRecords(TpProdMngVerificationRecordQueryDTO queryDTO); +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/DriverInfoVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/DriverInfoVO.java new file mode 100644 index 0000000..b6ad040 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/DriverInfoVO.java @@ -0,0 +1,41 @@ +package com.deepinnet.tptradeprod.common.vo; + +import lombok.Data; + +import java.io.Serializable; + +/** + *

+ * 司机和车牌信息 + *

+ * + * @author chenjiaju + * @since 2023/8/30 + */ + +@Data +public class DriverInfoVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 司机编号 + */ + private String driverNo; + + /** + * 司机名称 + */ + private String driverName; + + /** + * 车牌 + */ + private String vehicleNumber; + + /** + * 行程类型 + */ + private String tripType; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderAuditInquiryResultVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderAuditInquiryResultVO.java new file mode 100644 index 0000000..0c3e228 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderAuditInquiryResultVO.java @@ -0,0 +1,32 @@ +package com.deepinnet.tptradeprod.common.vo; + +import com.deepinnet.tp.common.lang.util.TpMoney; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +public class TpOrderAuditInquiryResultVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 原始金额 + */ + private TpMoney totalOriginalAmount; + + /** + * 优惠金额 + */ + private TpMoney totalDiscountAmount; + + /** + * 询价明细 + * 以售卖单元编号为维度 + */ + private List details; + + +} + diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderAuditPriceInquiryDetailVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderAuditPriceInquiryDetailVO.java new file mode 100644 index 0000000..e839b42 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderAuditPriceInquiryDetailVO.java @@ -0,0 +1,57 @@ +package com.deepinnet.tptradeprod.common.vo; + +import com.deepinnet.tp.common.lang.util.TpMoney; +import lombok.Data; + +import java.io.Serializable; + +/** + * TpOrderAuditPriceInquiryDetailVO + * Author: chenkaiyang + * Date: 2023/9/8 + */ +@Data +public class TpOrderAuditPriceInquiryDetailVO implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 售卖单元编号 + */ + private String salesUnitCode; + + /** + * 车票类型 + */ + private String ticketType; + + /** + * 乘客类型 + */ + private String passengerType; + + /** + * 乘客数量 + */ + private Integer passengerCount; + + /** + * 单张票-原始金额 + */ + private TpMoney singleOriginalAmount; + + /** + * 单张票-优惠金额 + */ + private TpMoney singleDiscountAmount; + + /** + * 所有票-原始金额 + */ + private TpMoney totalOriginalAmount; + + /** + * 单张票-优惠金额 + */ + private TpMoney totalDiscountAmount; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderChargeRecordVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderChargeRecordVO.java new file mode 100644 index 0000000..1414ddc --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderChargeRecordVO.java @@ -0,0 +1,77 @@ +package com.deepinnet.tptradeprod.common.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + *

+ * 订单费用 + *

+ * + * @author chenjiaju + * @since 2023/7/26 + */ + +@Data +public class TpOrderChargeRecordVO implements Serializable { + + private static final long serialVersionUID = -1934894255107914110L; + + /** + * 订单编号 + */ + private String orderNo; + + /** + * 原始订单编号 + */ + private String originalOrderNo; + + /** + * 询价金额 + */ + private String inquireAmount; + + /** + * 业务员更改价格 + */ + private String changeAmount; + + /** + * 实付金额 + */ + private String payAmount; + + /** + * 手续费 + */ + private String serviceCharge; + + /** + * 手续费比例 + */ + private String servicePercentage; + + /** + * 是否免手续费 + */ + private Integer freeServiceCharge; + + /** + * 业务类型(下单 / 变更订单 / 取消订单) + */ + private String bizType; + + /** + * 扩展字段 + */ + private Map bizData; + + /** + * 创建时间 + */ + private Long operateTime; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderDiscountVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderDiscountVO.java new file mode 100644 index 0000000..2db3ecc --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderDiscountVO.java @@ -0,0 +1,48 @@ +package com.deepinnet.tptradeprod.common.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + *

+ * 优惠信息 + *

+ * + * @author chenjiaju + * @since 2023/7/26 + */ + +@Data +public class TpOrderDiscountVO implements Serializable { + + private static final long serialVersionUID = -1414448888888888239L; + + /** + * 计价记录编号 + */ + private String pricingNo; + + /** + * 订单编码 + */ + private String orderNo; + + /** + * 优惠类型 + */ + private Integer type; + + /** + * 优惠金额 + */ + private String discountAmount; + + /** + * 扩展字段 + */ + private Map bizData; + + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderDispatchRecordVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderDispatchRecordVO.java new file mode 100644 index 0000000..6c0a30d --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderDispatchRecordVO.java @@ -0,0 +1,48 @@ +package com.deepinnet.tptradeprod.common.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.*; + +/** + * @author taobinxian + * @version 2023-08-07 + */ +@Data +public class TpOrderDispatchRecordVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 派单编码 + */ + @ApiModelProperty(value = "派单编码") + private String dispatchNo; + + /** + * 订单编码 + */ + @ApiModelProperty(value = "订单编码") + private String orderNo; + + /** + * 派单状态 + */ + @ApiModelProperty(value = "派单状态") + private Integer dispatchStatus; + + /** + * 扩展字段 + */ + @ApiModelProperty(value = "扩展状态") + private Map bizData; + + /** + * 承运交通工具 + */ + @ApiModelProperty(value = "承运交通工具") + private List orderTransportation; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderDriverInfoVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderDriverInfoVO.java new file mode 100644 index 0000000..5b24688 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderDriverInfoVO.java @@ -0,0 +1,47 @@ +package com.deepinnet.tptradeprod.common.vo; + + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + *

+ * 司机信息 + *

+ * + * @author chenjiaju + * @since 2023-07-25 15:46:31 + */ +@Data +public class TpOrderDriverInfoVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 承运交通工具编码 + */ + @ApiModelProperty(value = "交通工具编码") + private String transportationNo; + + /** + * 司机 + */ + @ApiModelProperty(value = "司机") + private String name; + + /** + * 司机联系方式 + */ + @ApiModelProperty(value = "司机联系方式") + private String contact; + + /** + * 扩展字段 + */ + @ApiModelProperty(value = "扩展字段") + private Map bizData; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderElementVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderElementVO.java new file mode 100644 index 0000000..b900116 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderElementVO.java @@ -0,0 +1,51 @@ +package com.deepinnet.tptradeprod.common.vo; + + +import lombok.Data; + +import java.io.Serializable; + +/** + *

+ * 订单要素信息 + *

+ * + * @author chenjiaju + * @since 2023-07-25 15:46:31 + */ +@Data +public class TpOrderElementVO implements Serializable{ + + private static final long serialVersionUID = 1L; + + /** + * 订单编号 + */ + private String orderNo; + + /** + * 要素类型(下单 / 退款 / 改签) + */ + private Integer elementType; + + /** + * 要素code + */ + private String elementCode; + + /** + * 要素名称 + */ + private String elementName; + + /** + * 要素Key + */ + private String elementKey; + + /** + * 要素值 + */ + private String elementValue; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderListVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderListVO.java new file mode 100644 index 0000000..6c947b0 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderListVO.java @@ -0,0 +1,309 @@ +package com.deepinnet.tptradeprod.common.vo; + +import com.deepinnet.tptradeprod.common.dto.TpProdPayOrderDTO; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.*; + +/** + * @author taobinxian + * @version 2023-08-02 + */ +@Data +public class TpOrderListVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 产品编码 + */ + @ApiModelProperty(value = "产品编码") + private String productNo; + + /** + * 产品名称 + */ + @ApiModelProperty(value = "产品名称") + private String productName; + + /** + * 产品类目编码 + */ + @ApiModelProperty(value = "产品类目编码") + private String productCategoryNo; + + /** + * 产品类目 + */ + @ApiModelProperty(value = "产品类目") + private String productCategory; + + /** + * 订单编码 + */ + @ApiModelProperty(value = "订单编号") + private String orderNo; + + /** + * 父订单编号 + */ + @ApiModelProperty(value = "父订单号") + private String parentOrderNo; + + /** + * 原订单号 + */ + @ApiModelProperty(value = "原订单号") + private String originalOrderNo; + + /** + * 是否主订单(0-否;1-是) + */ + @ApiModelProperty(value = "是否主订单(0-否;1-是)") + private Integer main; + + /** + * 订单来源 + */ + @ApiModelProperty(value = "订单来源") + private String source; + + /** + * 订单状态 + */ + @ApiModelProperty(value = "订单状态(0-订单初始化;5-订单待支付;10-订单超时;15-订单已支付;20-部分核销;25-退款中;30-部分退款成功;35-已改签;40-全部退款;45-退款失败;50-已完成(部分退款后凭证用完);55-已经完(未发生退款))") + private Integer status; + + /** + * 结束确认状态 + */ + @ApiModelProperty(value = "结束确认状态") + private Integer endConfirmStatus; + + /** + * 结束确认时间 + */ + @ApiModelProperty(value = "结束确认时间") + private Long endConfirmTime; + + /** + * 车票类型 + */ + @ApiModelProperty(value = "车票类型") + private String ticketType; + + /** + * 审核前状态 + */ + @ApiModelProperty(value = "审核前状态") + private Integer beforeApproveStatus; + + /** + * 乘客人数 + */ + @ApiModelProperty(value = "乘客人数") + private Integer passengerNumber; + + /** + * 乘客名称(聚合处理) + */ + @ApiModelProperty(value = "乘客名称") + private List passengerNames; + + /** + * 订单类型(定制公交 / 预约包车 / 改签) + */ + @ApiModelProperty(value = "订单类型(1-定制公交; 2-预约包车;)") + private Integer type; + + /** + * 行程类型 + */ + @ApiModelProperty(value = "行程类型(go; back; round)") + private String tripType; + + /** + * 付款模式 + */ + @ApiModelProperty(value = "付款模式(pay_later-先享后付;pay_now_deposit-先付后享付订金; pay_now-先付后享付全款)") + private String payMode; + + /** + * 实付金额 + */ + @ApiModelProperty(value = "实付金额") + private String payAmount; + + /** + * 应付金额 + */ + @ApiModelProperty(value = "应付金额") + private String payableAmount; + + /** + * 订单优惠前原金额 + */ + @ApiModelProperty(value = "优惠前金额") + private String originalAmount; + + /** + * 优惠金额 + */ + @ApiModelProperty(value = "优惠金额") + private String discountAmount; + + /** + * 服务费 + */ + @ApiModelProperty(value = "服务费") + private String serviceCharge; + + /** + * 下单时间 + */ + @ApiModelProperty(value = "下单时间") + private Long orderTime; + + /** + * 支付时间 + */ + @ApiModelProperty(value = "支付时间") + private Long payTime; + + /** + * 订单关闭时间 + */ + @ApiModelProperty(value = "订单关闭时间") + private Long closeTime; + + /** + * 订单过期时间 + */ + @ApiModelProperty(value = "订单过期时间") + private Long expireTime; + + /** + * 当前 应退 金额 + */ + @ApiModelProperty(value = "当前应退") + private String currentNeedRefundAmount = "0.00"; + + /** + * 当前 已退 金额 + */ + @ApiModelProperty(value = "已退金额") + private String refundedAmount = "0.00"; + + /** + * 实付金额 + */ + @ApiModelProperty(value = "实付金额") + private String actualPayAmount = "0.00"; + + /** + * 已付金额 + */ + @ApiModelProperty(value = "已付金额") + private String paidAmount = "0.00"; + + /** + * 当前需支付金额 + */ + @ApiModelProperty(value = "当前需支付金额") + private String currentNeedPayAmount = "0.00"; + + /** + * 计算公式 + */ + private String calcFormula; + + /** + * 扩展字段 + */ + @ApiModelProperty(value = "扩展字段") + private Map bizData; + + /** + * 租户ID + */ + @ApiModelProperty(value = "租户ID") + private String tenantId; + + /** + * 下单人 + */ + @ApiModelProperty(value = "下单人") + private TpOrderPlacerVO orderPlacer; + + /** + * 标的项 + */ + @ApiModelProperty(value = "标的项") + private List orderSubjectItem; + + /** + * 服务对象 + */ + @ApiModelProperty(value = "服务对象") + private TpOrderTargetServiceVO tpOrderTargetService; + + /** + * 订单线路信息 + */ + @ApiModelProperty(value = "线路") + private List routesInfo; + + /** + * 行程单信息 + */ + @ApiModelProperty(value = "行程单信息") + private List tpOrderTravelTrips; + + /** + * 子订单 + */ + @ApiModelProperty(value = "子订单") + private List subOrders; + + /** + * 用车需求方 + */ + @ApiModelProperty(value = "用车需求方") + private TpOrderRequirementUserVO requirementUser; + + /** + * 需支付尾款 + */ + @ApiModelProperty(value = "需支付尾款") + private String balanceAmount; + + /** + * 订单关联的支付单 + */ + @ApiModelProperty(value = "支付单") + private List payOrders; + + /** + * 发票 + */ + @ApiModelProperty(value = "发票") + private TpProdOrderInvoiceVO tpOrderInvoice; + + @ApiModelProperty(value = "费用信息") + private List orderChargeRecords; + + /** + * 订单是否评价过 + */ + @ApiModelProperty(value = "订单是否评价过") + private Boolean orderEvaluated; + + /** + * 拼车相关信息 + */ + @ApiModelProperty(value = "拼车相关信息") + private TpProdSalesUnitCarpoolVO carpoolInfo; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderPassengerVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderPassengerVO.java new file mode 100644 index 0000000..f90e83f --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderPassengerVO.java @@ -0,0 +1,79 @@ +package com.deepinnet.tptradeprod.common.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + *

+ * 乘客信息 + *

+ * + * @author chenjiaju + * @since 2023/7/26 + */ + +@Data +public class TpOrderPassengerVO implements Serializable { + + private static final long serialVersionUID = -7157914478824441426L; + + /** + * 乘客编号 + */ + @ApiModelProperty(value = "乘客编号") + private String passengerNo; + + /** + * 订单编号 + */ + @ApiModelProperty(value = "订单编号") + private String orderNo; + + /** + * 乘客姓名 + */ + @ApiModelProperty(value = "乘客名称") + private String passengerName; + + /** + * 乘客类型 + * @see TpUserPassengerTypeEnum + */ + @ApiModelProperty(value = "乘客类型") + private String passengerType; + + /** + * 联系方式 + */ + @ApiModelProperty(value = "联系方式") + private String passengerContact; + + /** + * 乘客证件类型 + * @see TpUserPassengerIdentityTypeEnum + */ + @ApiModelProperty(value = "证件类型(001-身份证)") + private String identificationType; + + /** + * 乘客证件编号 + */ + @ApiModelProperty(value = "证件编号") + private String identificationNumber; + + /** + * 行程类型 + */ + @ApiModelProperty(value = "行程类型") + private String tripType; + + /** + * 扩展字段 + */ + @ApiModelProperty(value = "扩展字段") + private Map bizData; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderPlacerVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderPlacerVO.java new file mode 100644 index 0000000..bf49938 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderPlacerVO.java @@ -0,0 +1,77 @@ +package com.deepinnet.tptradeprod.common.vo; + + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + *

+ * 下单人 + *

+ * + * @author chenjiaju + * @since 2023/7/26 + */ + +@Data +public class TpOrderPlacerVO implements Serializable { + + private static final long serialVersionUID = -8148089739381314981L; + + /** + * 订单编号 + */ + @ApiModelProperty(value = "订单编号") + private String orderNo; + + /** + * 下单人编号 + */ + @ApiModelProperty(value = "下单人用户编号") + private String placerNo; + + /** + * 下单人所属用户企业编号 + */ + @ApiModelProperty(value = "下单人所属用户企业编号") + private String serviceObjectCode; + + /** + * 下单人姓名 + */ + @ApiModelProperty(value = "下单人姓名") + private String placerName; + + /** + * 联系方式 + */ + @ApiModelProperty(value = "联系方式") + private String placerContact; + + /** + * 订单联系方式 + */ + @ApiModelProperty(value = "订单联系方式") + private String orderPlacerContact; + + /** + * 后台录单人编号 + */ + @ApiModelProperty(value = "后台录单人编号") + private String backendPlacerNo; + + /** + * 后台录单人员名称 + */ + @ApiModelProperty(value = "后台录单人名称") + private String backendPlacerName; + + /** + * 扩展字段 + */ + @ApiModelProperty(value = "扩展字段") + private Map bizData; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderPositionFlagVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderPositionFlagVO.java new file mode 100644 index 0000000..faf25c9 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderPositionFlagVO.java @@ -0,0 +1,29 @@ +package com.deepinnet.tptradeprod.common.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; +import lombok.Data; + +import java.io.Serializable; + +/** + *

+ * 定位标识vo + *

+ * + * @author chenjiaju + * @since 2024/3/13 + */ + +@Data +@Builder +public class TpOrderPositionFlagVO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "是否存在待支付") + private Boolean needPay; + + @ApiModelProperty(value = "是否存在待核销") + private Boolean needVerify; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderPriceRecordVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderPriceRecordVO.java new file mode 100644 index 0000000..6685563 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderPriceRecordVO.java @@ -0,0 +1,73 @@ +package com.deepinnet.tptradeprod.common.vo; + +import com.deepinnet.tptradeprod.common.dto.TpProdOrderPriceRecordDetailDTO; +import lombok.Data; + +import java.io.Serializable; +import java.util.*; + +/** + *

+ * 计价记录 + *

+ * + * @author chenjiaju + * @since 2023-07-25 15:46:31 + */ + +@Data +public class TpOrderPriceRecordVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 计价记录编号 + */ + private String pricingNo; + + /** + * 订单编码 + */ + private String orderNo; + + /** + * 计价金额 + */ + private String pricingOriginalAmount; + + /** + * 计价优惠金额 + */ + private String pricingDiscountAmount; + + /** + * 计价类型 + */ + private Integer pricingType; + + /** + * 计价参数 + */ + private String pricingParams; + + /** + * 内部询价金额 + */ + private String internalInquireAmount; + + /** + * 优惠信息 + */ + private List orderDiscount; + + /** + * 询价详情 + */ + private List orderPriceRecordDetails; + + /** + * 扩展字段 + */ + private Map bizData; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderRefundVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderRefundVO.java new file mode 100644 index 0000000..c2b986f --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderRefundVO.java @@ -0,0 +1,30 @@ +package com.deepinnet.tptradeprod.common.vo; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author taobinxian + * @version 2023-08-07 + */ +@Data +public class TpOrderRefundVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 退票订单号 + */ + private String orderNo; + + /** + * 退票状态 + */ + private String refundStatus; + + /** + * 退票申请单号 + */ + private String refundApplyOrderNo; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderRequirementUserVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderRequirementUserVO.java new file mode 100644 index 0000000..5c2eae3 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderRequirementUserVO.java @@ -0,0 +1,54 @@ +package com.deepinnet.tptradeprod.common.vo; + + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + *

+ * 用车需求方 + *

+ * + * @author chenjiaju + * @since 2023/7/26 + */ + +@Data +public class TpOrderRequirementUserVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 订单编号 + */ + @ApiModelProperty(value = "订单编号") + private String orderNo; + + /** + * 用车人名称 + */ + @ApiModelProperty(value = "用车人名称") + private String requirementName; + + /** + * 用车需求方联系人名称 + */ + @ApiModelProperty(value = "用车方联系人名称") + private String requirementContactName; + + /** + * 联系方式 + */ + @ApiModelProperty(value = "联系方式") + private String requirementContact; + + /** + * 扩展字段 + */ + @ApiModelProperty(value = "扩展字段") + private Map bizData; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderRouteShuttleVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderRouteShuttleVO.java new file mode 100644 index 0000000..b6c3597 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderRouteShuttleVO.java @@ -0,0 +1,64 @@ +package com.deepinnet.tptradeprod.common.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + *

+ * 班次 + *

+ * + * @author chenjiaju + * @since 2023-07-25 15:46:31 + */ +@Data +public class TpOrderRouteShuttleVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 订单编号 + */ + @ApiModelProperty(value = "订单编号") + private String orderNo; + + /** + * 线路编号 + */ + @ApiModelProperty(value = "线路编号") + private String routeNo; + + /** + * 班次编号 + */ + @ApiModelProperty(value = "班次编号") + private String shuttleNo; + + /** + * 班次名称 + */ + @ApiModelProperty(value = "班次名称") + private String shuttleName; + + /** + * 班次发车时间 + */ + @ApiModelProperty(value = "班次发车时间") + private String shuttleTime; + + /** + * 班次行程类型 + */ + @ApiModelProperty(value = "班次行程类型") + private String tripType; + + /** + * 扩展字段 + */ + @ApiModelProperty(value = "扩展字段") + private Map bizData; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderRouteVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderRouteVO.java new file mode 100644 index 0000000..9b07ec5 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderRouteVO.java @@ -0,0 +1,77 @@ +package com.deepinnet.tptradeprod.common.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + *

+ * 线路 + *

+ * + * @author chenjiaju + * @since 2023-07-25 15:46:31 + */ +@Data +public class TpOrderRouteVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 订单编号 + */ + @ApiModelProperty(value = "订单编号") + private String orderNo; + + /** + * 线路编号 + */ + @ApiModelProperty(value = "线路编号") + private String routeNo; + + /** + * 线路名称 + */ + @ApiModelProperty(value = "线路名称") + private String routeName; + + /** + * 去程 / 返程 + */ + @ApiModelProperty(value = "go-去程 / back-返程") + private String roundTrip; + + /** + * 营运日期 + */ + @ApiModelProperty("营运日期:work_day-仅工作日运行、weekend-仅非工作日运行、full_time-全时段运行、week_day-每周几循环运行") + private String workTime; + + /** + * 时刻表 + */ + @ApiModelProperty(value = "时刻表,滚动发车时间 / 班次时间") + private String timeSchedule; + + /** + * 线路所属车队 + */ + @ApiModelProperty(value = "线路所属车队") + private String belongFleet; + + /** + * 扩展字段 + */ + @ApiModelProperty(value = "扩展字段") + private Map bizData; + + /** + * 班次 + */ + @ApiModelProperty(value = "班次") + private List tpOrderRouteShuttle; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderSubjectItemElementVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderSubjectItemElementVO.java new file mode 100644 index 0000000..2ff4d90 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderSubjectItemElementVO.java @@ -0,0 +1,64 @@ +package com.deepinnet.tptradeprod.common.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + *

+ * 标的项要素 + *

+ * + * @author chenjiaju + * @since 2023-07-25 15:46:31 + */ +@Data +public class TpOrderSubjectItemElementVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 订单编码 + */ + @ApiModelProperty(value = "订单编号") + private String orderNo; + + /** + * 标的项编码 + */ + @ApiModelProperty(value = "标的项编号") + private String itemNo; + + /** + * 要素名称 + */ + @ApiModelProperty(value = "要素编码") + private String elementCode; + + /** + * 要素名称 + */ + @ApiModelProperty(value = "要素名称") + private String elementName; + + /** + * 要素值 + */ + @ApiModelProperty(value = "要素值") + private String elementValue; + + /** + * 要素单位 + */ + @ApiModelProperty(value = "要素单位") + private String elementUnit; + + /** + * 扩展字段 + */ + @ApiModelProperty(value = "扩展字段") + private Map bizData; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderSubjectItemVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderSubjectItemVO.java new file mode 100644 index 0000000..e638b66 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderSubjectItemVO.java @@ -0,0 +1,100 @@ +package com.deepinnet.tptradeprod.common.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.*; + +/** + *

+ * 标的项 + *

+ * + * @author chenjiaju + * @since 2023-07-25 15:46:31 + */ +@Data +public class TpOrderSubjectItemVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 标的编码 + */ + @ApiModelProperty(value = "标的项编码") + private String itemNo; + + /** + * 订单编码 + */ + @ApiModelProperty(value = "订单编码") + private String orderNo; + + /** + * 乘客编码 + */ + @ApiModelProperty(value = "乘客编码") + private String passengerNo; + + /** + * 乘客人数 + */ + @ApiModelProperty(value = "乘客人数") + private Integer passengerCount; + + /** + * 用车天数 + */ + @ApiModelProperty(value = "用车天数") + private Integer days; + + /** + * 是否包含司机食宿 + */ + @ApiModelProperty(value = "是否包含司机食宿") + private String includeDriverExpenses; + + /** + * 行程类型 + */ + @ApiModelProperty(value = "行程类型") + private String tripType; + + /** + * 标的名称 + */ + @ApiModelProperty(value = "标的项名称") + private String name; + + /** + * 标的类型 + */ + @ApiModelProperty(value = "标的项类型") + private String type; + + /** + * 购买标的项数量 + */ + @ApiModelProperty(value = "标的项数量") + private Integer count; + + /** + * 扩展字段 + */ + @ApiModelProperty(value = "扩展字段") + private Map bizData; + + /** + * 乘客信息 + */ + @ApiModelProperty(value = "乘客信息") + private TpOrderPassengerVO passenger; + + /** + * 标的项要素 + */ + @ApiModelProperty(value = "标的项要素") + private List orderItemElements; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderTargetServiceVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderTargetServiceVO.java new file mode 100644 index 0000000..a08162b --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderTargetServiceVO.java @@ -0,0 +1,47 @@ +package com.deepinnet.tptradeprod.common.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + *

+ * 服务对象 + *

+ * + * @author chenjiaju + * @since 2023/8/1 + */ + +@Data +public class TpOrderTargetServiceVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 订单编码 + */ + @ApiModelProperty(value = "订单编号") + private String orderNo; + + /** + * 服务方名称 + */ + @ApiModelProperty(value = "服务方名称") + private String targetName; + + /** + * 服务方唯一编码 + */ + @ApiModelProperty(value = "服务方唯一编码") + private String targetNumber; + + /** + * bizData + */ + @ApiModelProperty(value = "扩展字段") + private Map bizData; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderTransportationVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderTransportationVO.java new file mode 100644 index 0000000..7edae94 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderTransportationVO.java @@ -0,0 +1,77 @@ +package com.deepinnet.tptradeprod.common.vo; + + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.*; + +/** + *

+ * 承运交通工具 + *

+ * + * @author chenjiaju + * @since 2023-07-25 15:46:31 + */ +@Data +public class TpOrderTransportationVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 派单编码 + */ + @ApiModelProperty(value = "派单编码") + private String dispatchNo; + + /** + * 承运交通工具编码 + */ + @ApiModelProperty(value = "交通工具编码") + private String transportationNo; + + /** + * 司机 + */ + @ApiModelProperty(value = "司机") + private String driver; + + /** + * 状态 + */ + @ApiModelProperty(value = "状态") + private Integer status; + + /** + * 位置 + */ + @ApiModelProperty(value = "位置") + private String position; + + /** + * 类型 + */ + @ApiModelProperty(value = "类型") + private Integer type; + + /** + * 扩展字段 + */ + @ApiModelProperty(value = "扩展字段") + private Map bizData; + + /** + * 承运司机 + */ + @ApiModelProperty(value = "承运司机") + private List orderDriverInfo; + + /** + * 承运车辆信息 + */ + @ApiModelProperty(value = "承运车辆信息") + private List orderVehicleInfos; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderTravelTripVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderTravelTripVO.java new file mode 100644 index 0000000..81c1715 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderTravelTripVO.java @@ -0,0 +1,106 @@ +package com.deepinnet.tptradeprod.common.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.*; + +/** + *

+ * 行程单 + *

+ * + * @author chenjiaju + * @since 2023-07-25 15:46:31 + */ +@Data +public class TpOrderTravelTripVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 行程单编号 + */ + @ApiModelProperty(value = "行程单编号") + private String tripNo; + + /** + * 订单编号 + */ + @ApiModelProperty(value = "订单编号") + private String orderNo; + + /** + * 乘客数量 + */ + @ApiModelProperty(value = "乘客数量") + private Integer passengerCount; + + /** + * 公里数 + */ + @ApiModelProperty(value = "公里数") + private String miles; + + /** + * 上车点code + */ + @ApiModelProperty(value = "上车点code") + private String pickUpLocationCode; + + /** + * 上车点名称 + */ + @ApiModelProperty(value = "上车点名称") + private String pickUpLocation; + + /** + * 下车点code + */ + @ApiModelProperty(value = "下车点code") + private String dropOffLocationCode; + + /** + * 下车点名称 + */ + @ApiModelProperty(value = "下车点名称") + private String dropOffLocation; + + /** + * 出发时间 + */ + @ApiModelProperty(value = "出发时间") + private String startTime; + + /** + * 到达时间 + */ + @ApiModelProperty(value = "到达时间") + private String endTime; + + /** + * 行程单 行程类型 + */ + @ApiModelProperty(value = "行程单行程类型(go;back)") + private String tripType; + + /** + * 行程单状态 + */ + @ApiModelProperty(value = "行程单行程状态") + private String tripStatus; + + /** + * 扩展字段 + */ + @ApiModelProperty(value = "扩展字段") + private Map bizData; + + /** + * 位置信息 + */ + @ApiModelProperty(value = "位置信息") + private List tripPositions; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderTripPositionVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderTripPositionVO.java new file mode 100644 index 0000000..da1867f --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderTripPositionVO.java @@ -0,0 +1,64 @@ +package com.deepinnet.tptradeprod.common.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + *

+ * 位置信息 + *

+ * + * @author chenjiaju + * @since 2023-07-25 15:46:31 + */ +@Data +public class TpOrderTripPositionVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 行程单编号 + */ + @ApiModelProperty(value = "行程单编号") + private String tripNo; + + /** + * 位置编码 + */ + @ApiModelProperty(value = "位置编码") + private String locationCode; + + /** + * 位置名称 + */ + @ApiModelProperty(value = "位置名称") + private String locationName; + + /* + * 经度 + */ + @ApiModelProperty(value = "经度") + private String lng; + + /** + * 维度 + */ + @ApiModelProperty(value = "纬度") + private String lat; + + /** + * 序号 + */ + @ApiModelProperty(value = "序号") + private Integer index; + + /** + * 扩展字段 + */ + @ApiModelProperty(value = "扩展字段") + private Map bizData; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderVehicleInfoVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderVehicleInfoVO.java new file mode 100644 index 0000000..bb9c995 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpOrderVehicleInfoVO.java @@ -0,0 +1,33 @@ +package com.deepinnet.tptradeprod.common.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + *

+ * 车辆信息 + *

+ * + * @author chenjiaju + * @since 2023-07-25 15:46:31 + */ +@Data +public class TpOrderVehicleInfoVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 交通工具编码 + */ + @ApiModelProperty(value = "交通工具编码") + private String transportationNo; + + /** + * 车牌号 + */ + @ApiModelProperty(value = "车牌号") + private String vehicleNumber; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdCalculateRefundAmountVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdCalculateRefundAmountVO.java new file mode 100644 index 0000000..c5d9fe2 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdCalculateRefundAmountVO.java @@ -0,0 +1,38 @@ +package com.deepinnet.tptradeprod.common.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.*; + +import java.io.Serializable; + +/** + * @author amos wong + * @create 2023/8/22 14:30 + * @Description + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class TpProdCalculateRefundAmountVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 实退金额 + */ + @ApiModelProperty(value = "实退金额") + private String refundAmount; + + /** + * 实付金额 + */ + @ApiModelProperty(value = "实付金额") + private String payAmount; + + /** + * 计费金额-手续费 + */ + @ApiModelProperty(value = "计费金额-手续费") + private String chargeAmount; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdMngVerificationRecordVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdMngVerificationRecordVO.java new file mode 100644 index 0000000..015e215 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdMngVerificationRecordVO.java @@ -0,0 +1,59 @@ +package com.deepinnet.tptradeprod.common.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author amos wong + * @create 2024/3/12 11:40 + * @Description + */ +@Data +public class TpProdMngVerificationRecordVO implements Serializable { + @ApiModelProperty(value = "乘车时间") + private Long verificationTime; + + @ApiModelProperty(value = "乘客信息") + private TpProdVoucherPassengerVO passenger; + + @ApiModelProperty(value = "产品类目编号") + private String productCategoryNo; + + @ApiModelProperty(value = "产品类目名称") + private String productCategoryName; + + @ApiModelProperty("线路编号") + private String routeNo; + + @ApiModelProperty("线路名称") + private String routeName; + + @ApiModelProperty(value = "班次时间") + private String shuttleTime; + + @ApiModelProperty(value = "订单编号") + private String orderNo; + + @ApiModelProperty(value = "用户手机号") + private String phone; + + @ApiModelProperty(value = "用户编号") + private String userNo; + + @ApiModelProperty(value = "行程信息:包含上下车点") + private TpProdOrderTravelTripVO tpOrderTravelTrip; + + @ApiModelProperty(value = "核销方式: driver_check-司机端检票, manual-人工检票, pos-pos机检票") + private String validationType; + + @ApiModelProperty(value = "乘车人数") + private Integer verificationPassengerCount; + + @ApiModelProperty(value = "车票类型:day-日票,week-周票,term-学期票,month-月票,year-年票") + private String voucherType; + + @ApiModelProperty(value = "行程类型") + private String tripType; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderAuditConfirmOrderVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderAuditConfirmOrderVO.java new file mode 100644 index 0000000..78852e3 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderAuditConfirmOrderVO.java @@ -0,0 +1,66 @@ +package com.deepinnet.tptradeprod.common.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 订单确认审核订单信息 + * @author xiehuaqiao + */ +@Data +public class TpProdOrderAuditConfirmOrderVO implements Serializable { + + /** + * 子订单单号 + */ + @ApiModelProperty(value = "子订单单号") + private String orderNo; + + /** + * 原始订单编号 + */ + @ApiModelProperty(value = "原始订单编号") + private String originalOrderNo; + + /** + * 订单支付模式 + */ + @ApiModelProperty(value = "订单支付模式") + private String payMode; + + /** + * 用户订单价格 + */ + @ApiModelProperty(value = "用户订单价格") + private String currentPrice; + + /** + * 产品内部价格:业务员可以修改的最低价格 + */ + @ApiModelProperty(value = "产品内部价格:业务员可以修改的最低价格") + private String internalPrice; + + + /** + * 手续费:只有订单取消或者订单变更时才有手续费 + */ + @ApiModelProperty(value = "手续费:只有订单取消或者订单变更时才有手续费") + private String serviceChargeFee; + + + /** + * 订单分配组织编码 + */ + @ApiModelProperty(value = "订单分配组织编码") + private String orgCode; + + + /** + * 审核驳回原因列表 + */ + @ApiModelProperty(value = "审核驳回原因列表") + private List rejectReasons; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderChangeApplicantVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderChangeApplicantVO.java new file mode 100644 index 0000000..3615abd --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderChangeApplicantVO.java @@ -0,0 +1,29 @@ +package com.deepinnet.tptradeprod.common.vo; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author amos wong + * @create 2023/10/30 15:00 + * @Description + */ +@Data +public class TpProdOrderChangeApplicantVO implements Serializable { + private static final long serialVersionUID = 1810768307525635810L; + /** + * 申请人编号 + */ + private String applicantNo; + + /** + * 申请人名称 + */ + private String applicantName; + + /** + * 申请人手机号 + */ + private String applicantPhone; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderChangeApplyDetailVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderChangeApplyDetailVO.java new file mode 100644 index 0000000..9905e50 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderChangeApplyDetailVO.java @@ -0,0 +1,101 @@ +package com.deepinnet.tptradeprod.common.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + * @author xiehuaqiao + * @create 2023/10/30 13:53 + * @Description + */ +@Data +public class TpProdOrderChangeApplyDetailVO implements Serializable { + private static final long serialVersionUID = 6824617899547194529L; + + + /** + * 申请单号 + */ + private String applyNo; + + /** + * 申请变更的子订单号 + */ + @Deprecated + private String orderNo; + + /** + * 源订单号 + */ + private String originalOrderNo; + + /** + * 申请单状态 + */ + private String applyStatus; + + /** + * 审批完成时间 + */ + private Long approvedTime; + + /** + * 审批结果描述:如果是审批拒绝或者审批超时,需要将原因同步到申请单这 + */ + private String approvedRemark; + + /** + * 申请时间 + */ + private Long applyTime; + + /** + * 申请原因 + */ + private String applyReason; + + /** + * 申请变更的业务类型 + */ + private String applyType; + + /** + * 服务费减免申请原因 + */ + private String rscApplyReason; + + /** + * 服务费减免申请时间 + */ + private Long rscApplyTime; + + /** + * 服务费减免类型 + */ + private String rscApplyType; + + + /** + * 订单变更项 + */ + private List orderChangeItems; + + /** + * 申请人信息 + */ + private TpProdOrderChangeApplicantVO orderChangeApplicant; + + + /** + * 业务扩展字段 + */ + private Map bizData; + + /** + * 租户id + */ + private String tenantId; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderChangeApplyListVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderChangeApplyListVO.java new file mode 100644 index 0000000..f69be3b --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderChangeApplyListVO.java @@ -0,0 +1,92 @@ +package com.deepinnet.tptradeprod.common.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @author xiehuaqiao + * @create 2023/10/30 13:53 + * @Description + */ +@Data +public class TpProdOrderChangeApplyListVO implements Serializable { + + /** + * 申请单号 + */ + private String applyNo; + + /** + * 申请变更的子订单号 + */ + private String orderNo; + + /** + * 源订单号 + */ + private String originalOrderNo; + + /** + * 申请单状态 + */ + private String applyStatus; + + /** + * 审批完成时间 + */ + private Long approvedTime; + + /** + * 审批结果描述:如果是审批拒绝或者审批超时,需要将原因同步到申请单这 + */ + private String approvedRemark; + + /** + * 申请时间 + */ + private Long applyTime; + + /** + * 申请原因 + */ + private String applyReason; + + /** + * 申请变更的业务类型 + */ + private String applyType; + + /** + * 申请人编号 + */ + private String applicantNo; + + /** + * 申请人名称 + */ + private String applicantName; + + /** + * 服务费减免申请原因 + */ + private String rscApplyReason; + + /** + * 服务费减免申请时间 + */ + private Long rscApplyTime; + + /** + * 服务费减免类型 + */ + private String rscApplyType; + + + /** + * 订单变更列表 + */ + private List orderChangeItems; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderChangeItemFactorVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderChangeItemFactorVO.java new file mode 100644 index 0000000..a71ec6a --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderChangeItemFactorVO.java @@ -0,0 +1,92 @@ +package com.deepinnet.tptradeprod.common.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.Map; + +/** + * @author amos wong + * @create 2023/10/30 14:03 + * @Description + */ +@Data +public class TpProdOrderChangeItemFactorVO implements Serializable { + private static final long serialVersionUID = 2806370286802680227L; + + + /** + * 变更因子编码 + */ + @ApiModelProperty(value = "变更因子编码") + private String factorCode; + + /** + * 变更因子名称 + */ + @ApiModelProperty(value = "变更因子名称") + private String factorName; + + /** + * 变更因子类型 + */ + @ApiModelProperty(value = "变更因子类型") + private String factorType; + + /** + * 子订单单号 + */ + @ApiModelProperty(value = "子订单单号") + private String orderNo; + + + /** + * 源订单号 + */ + @ApiModelProperty(value = "源订单号") + private String originalOrderNo; + + + /** + * 变更申请单号 + */ + @ApiModelProperty(value = "申请单号") + private String applyNo; + + /** + * 变更项编号 + */ + @ApiModelProperty(value = "变更项编号") + private String changeItemNo; + + /** + * 变更前的值 + */ + @ApiModelProperty(value = "变更前的值") + private String beforeValue; + + /** + * 变更后的值 + */ + @ApiModelProperty(value = "变更后的值") + private String afterValue; + + /** + * 因子排序 + */ + @ApiModelProperty(value = "因子展示排序值") + private Integer sortIndex; + + /** + * 业务扩展字段 + */ + private Map bizData; + + /** + * 租户id + */ + @NotBlank(message = "租户id不能为空") + private String tenantId; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderChangeItemGroupListVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderChangeItemGroupListVO.java new file mode 100644 index 0000000..0846170 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderChangeItemGroupListVO.java @@ -0,0 +1,32 @@ +package com.deepinnet.tptradeprod.common.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @author amos wong + * @create 2023/10/30 14:03 + * @Description + */ +@Data +public class TpProdOrderChangeItemGroupListVO implements Serializable { + private static final long serialVersionUID = 2806370286802680227L; + + + /** + * 变更类型 + */ + @ApiModelProperty(value = "变更类型") + private String itemType; + + /** + * 变更项列表 + */ + @ApiModelProperty(value = "变更项列表") + private List items; + + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderChangeItemListVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderChangeItemListVO.java new file mode 100644 index 0000000..ecdb234 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderChangeItemListVO.java @@ -0,0 +1,46 @@ +package com.deepinnet.tptradeprod.common.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * @author amos wong + * @create 2023/10/30 14:03 + * @Description + */ +@Data +public class TpProdOrderChangeItemListVO implements Serializable { + + /** + * 变更项编码 + */ + @ApiModelProperty(value = "变更项编码") + private String factorCode; + + /** + * 变更项名称 + */ + @ApiModelProperty(value = "变更项名称") + private String factorName; + + /** + * 变更前的值:聚合后 + */ + @ApiModelProperty(value = "变更前的值") + private String beforeValue; + + /** + * 变更后的值:聚合后 + */ + @ApiModelProperty(value = "变更后的值") + private String afterValue; + + /** + * 租户id + */ + @NotBlank(message = "租户id不能为空") + private String tenantId; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderChangeItemVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderChangeItemVO.java new file mode 100644 index 0000000..e44e14b --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderChangeItemVO.java @@ -0,0 +1,70 @@ +package com.deepinnet.tptradeprod.common.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + * @author amos wong + * @create 2023/10/30 14:03 + * @Description + */ +@Data +public class TpProdOrderChangeItemVO implements Serializable { + private static final long serialVersionUID = 2806370286802680227L; + + + /** + * 变更项ID + * + */ + @ApiModelProperty(value = "变更项ID") + private String itemNo; + + /** + * 子订单单号 + */ + @ApiModelProperty(value = "子订单单号") + private String orderNo; + + + /** + * 源订单号 + */ + @ApiModelProperty(value = "源订单号") + private String originalOrderNo; + + /** + * 变更申请单号 + */ + @ApiModelProperty(value = "变更申请单号") + private String applyNo; + + /** + * 变更项类型 + */ + @ApiModelProperty(value = "变更项类型") + private String itemType; + + /** + * 变更项因子 + * + */ + @ApiModelProperty(value = "变更项因子列表") + private List itemFactors; + + + /** + * 业务扩展字段 + */ + private Map bizData; + /** + * 租户id + */ + @NotBlank(message = "租户id不能为空") + private String tenantId; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderCreateVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderCreateVO.java new file mode 100644 index 0000000..143a9d4 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderCreateVO.java @@ -0,0 +1,58 @@ +package com.deepinnet.tptradeprod.common.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + *

+ * 下单出参 + *

+ * + * @author chenjiaju + * @since 2023/8/28 + */ + +@Data +public class TpProdOrderCreateVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 订单编号 + */ + @ApiModelProperty(value = "订单编号", example = "20230828000011110") + private String orderNo; + + /** + * 原始订单编号 + */ + @ApiModelProperty(value = "原始订单编号", example = "20230828000011110") + private String originalOrderNo; + + /** + * 支付收银台地址 + */ + @ApiModelProperty(value = "收银台地址", example = "https://www.laobinggun.site") + private String payCashierUrl; + + /** + * 订单创建时间 + */ + @ApiModelProperty(value = "订单创建时间") + private Long createTime; + + /** + * 待支付金额 + */ + @ApiModelProperty(value = "待支付金额") + private String fee; + + /** + * 应付金额 + */ + @ApiModelProperty(value = "应付金额") + private String payableAmount; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderDetailVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderDetailVO.java new file mode 100644 index 0000000..61ff276 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderDetailVO.java @@ -0,0 +1,473 @@ +package com.deepinnet.tptradeprod.common.vo; + +import cn.hutool.core.collection.CollUtil; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.vo.reschedule.TpProdOrderRescheduleRecordVO; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; + +import java.io.Serializable; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author taobinxian + * @version 2023-08-07 + */ + +/** + * 出行订单 + */ +@Data +public class TpProdOrderDetailVO implements Serializable { + + private static final long serialVersionUID = 1L; + + public static final DateTimeFormatter SHUTTLE_DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd"); + + /** + * 产品编码 + */ + @ApiModelProperty(value = "产品编码") + private String productNo; + + /** + * 产品名称 + */ + @ApiModelProperty(value = "产品名称") + private String productName; + + /** + * 产品类目编码 + */ + @ApiModelProperty(value = "产品类目编码") + private String productCategoryNo; + + /** + * 产品类目中文 + */ + @ApiModelProperty(value = "产品类目中文") + private String productCategory; + + /** + * 外部业务单号 + */ + @ApiModelProperty(value = "外部业务单号", required = true) + private String outRequestNo; + + /** + * 用户编码 + */ + @ApiModelProperty(value = "用户编号") + private String userNo; + + /** + * 订单编码 + */ + @ApiModelProperty(value = "订单编号") + private String orderNo; + + /** + * 父订单编号 + */ + @ApiModelProperty(value = "父订单号") + private String parentOrderNo; + + /** + * 原订单号 + */ + @ApiModelProperty(value = "原订单号") + private String originalOrderNo; + + /** + * 是否主订单(0-否;1-是) + */ + @ApiModelProperty(value = "是否主订单(0-否;1-是)") + private Integer main; + + /** + * 订单状态 + */ + @ApiModelProperty(value = "订单状态(0-订单初始化;5-订单待支付;10-订单超时;15-订单已支付;20-部分核销;25-退款中;30-部分退款成功;35-已改签;40-全部退款;45-退款失败;50-已完成(部分退款后凭证用完);55-已经完(未发生退款);60-订单未超时未乘坐(部分退款); 65-订单未超时未乘坐(未发生退款,部分或全部未核销)))") + private Integer status; + + /** + * 审核前状态 + */ + @ApiModelProperty(value = "审核前状态") + private Integer beforeApproveStatus; + + /** + * 订单类型(定制公交 / 预约包车) + */ + @ApiModelProperty(value = "订单类型(1-定制公交; 2-预约包车)") + private Integer type; + + /** + * 行程类型 + */ + @ApiModelProperty(value = "行程类型(go; back; round)") + private String tripType; + + /** + * 付款模式 + */ + @ApiModelProperty(value = "付款模式(pay_later-先享后付;pay_now_deposit-先付后享付订金; pay_now-先付后享付全款)") + private String payMode; + + /** + * 实付金额 + */ + @ApiModelProperty(value = "实付金额") + private String payAmount; + + /** + * 应付金额 + */ + @ApiModelProperty(value = "应付金额") + private String payableAmount; + + /** + * 订单优惠前原金额 + */ + @ApiModelProperty(value = "优惠前金额") + private String originalAmount; + + /** + * 优惠金额 + */ + @ApiModelProperty(value = "优惠金额") + private String discountAmount; + + /** + * 服务费 + */ + @ApiModelProperty(value = "服务费") + private String serviceCharge; + + /** + * 订单来源(APP / 微信小程序 / 支付宝小程序 / H5) + */ + @ApiModelProperty(value = "订单来源(1-app;2-微信小程序;3-支付宝小程序;4-H5页面)") + private String source; + + /** + * 支付方式 + */ + @ApiModelProperty(value = "支付方式") + private String payType; + + /** + * 是否实名认证(0-否;1-是) + */ + @ApiModelProperty(value = "是否实名认证(0-否;1-是)") + private Integer identityVerificat; + + /** + * 乘客人数 + */ + @ApiModelProperty(value = "乘客人数") + private Integer passengerNumber; + + /** + * 结束确认状态 + */ + @ApiModelProperty(value = "结束确认状态") + private Integer endConfirmStatus; + + /** + * 结束确认时间 + */ + @ApiModelProperty(value = "结束确认时间") + private Long endConfirmTime; + + /** + * 车票类型 + * + * @see com.deepinnet.tptradecore.common.enums.voucher.TpVoucherTypeEnum + */ + @ApiModelProperty(value = "车票类型") + private String ticketType; + + /** + * 下单时间 + */ + @ApiModelProperty(value = "下单时间") + private Long orderTime; + + /** + * 支付时间 + */ + @ApiModelProperty(value = "支付时间") + private Long payTime; + + /** + * 订单关闭时间 + */ + @ApiModelProperty(value = "订单关闭时间") + private Long closeTime; + + /** + * 订单过期时间 + */ + @ApiModelProperty(value = "订单过期时间") + private Long expireTime; + + /** + * 扩展字段 + */ + @ApiModelProperty(value = "扩展字段") + private Map bizData; + + /** + * 乘客名称(聚合处理) + */ + @ApiModelProperty(value = "乘客名称") + private List passengerNames; + + /** + * 司机和车牌(实时查询) + */ + @ApiModelProperty(value = "司机对应的车牌") + private List driverInfos; + + /** + * 所属车队(需实时查询) + */ + @ApiModelProperty(value = "所属车队") + private String belongFleet; + + /** + * 要素信息 + */ + @ApiModelProperty(value = "要素信息") + private List orderElements; + + /** + * 报价记录 + */ + @ApiModelProperty(value = "报价记录") + private List orderPriceRecord; + + /** + * 下单人 + */ + @ApiModelProperty(value = "下单人") + private TpOrderPlacerVO orderPlacer; + + /** + * 用车需求方 + */ + @ApiModelProperty(value = "用车需求方") + private TpOrderRequirementUserVO orderRequirementUser; + + /** + * 标的项 + */ + @ApiModelProperty(value = "标的项") + private List orderSubjectItem; + + /** + * 派单记录 + */ + @ApiModelProperty(value = "派单记录") + private List orderDispatchRecords; + + /** + * 服务对象 + */ + @ApiModelProperty(value = "服务对象") + private TpOrderTargetServiceVO tpOrderTargetService; + + /** + * 行程单信息 + */ + @ApiModelProperty(value = "行程单信息") + private List tpOrderTravelTrips; + + /** + * 线路 / 班次 + */ + @ApiModelProperty(value = "线路信息") + private List tpOrderRoutes; + + /** + * 子订单 + */ + @ApiModelProperty(value = "子订单") + private List subOrders; + + /** + * 订单关联的支付单 + */ + @ApiModelProperty(value = "支付单") + private List payOrders; + + /** + * 订单关联的退款支付单 + */ + @ApiModelProperty(value = "订单关联的退款支付单") + private List refundPayOrders; + + /** + * 凭证列表 + */ + @ApiModelProperty(value = "凭证列表") + private List voucherDTOs; + + @ApiModelProperty(value = "非实名制退票详情") + List nonRealNameTicketRefundChoiceDTOs; + + @ApiModelProperty(value = "实名制退票详情") + List realNameTicketRefundChoiceDTOs; + + /** + * 退款单 + */ + @ApiModelProperty(value = "退款单") + List refundOrders; + + /** + * 是否允许退票 + */ + @ApiModelProperty(value = "是否允许退票") + private Boolean availableRefund; + + /** + * 费用记录 + */ + @ApiModelProperty(value = "费用记录") + private List orderChargeRecords; + + /** + * 发票 + */ + @ApiModelProperty(value = "发票") + private TpProdOrderInvoiceVO tpOrderInvoice; + + /** + * 改签信息 + */ + @ApiModelProperty(value = "改签信息") + private List tpOrderRescheduleRecords; + + /** + * 尾款需支付金额 + */ + @ApiModelProperty(value = "尾款待支付金额") + private String balanceAmount; + + /** + * 当前 应退 金额 + */ + @ApiModelProperty(value = "当前应退") + private String currentNeedRefundAmount = "0.00"; + + /** + * 当前 已退 金额 + */ + @ApiModelProperty(value = "已退金额") + private String refundedAmount = "0.00"; + + /** + * 实付金额 + */ + @ApiModelProperty(value = "实付金额") + private String actualPayAmount = "0.00"; + + /** + * 已付金额 + */ + @ApiModelProperty(value = "已付金额") + private String paidAmount = "0.00"; + + /** + * 当前需支付金额 + */ + @ApiModelProperty(value = "当前需支付金额") + private String currentNeedPayAmount = "0.00"; + + /** + * 计算公式 + */ + private String calcFormula; + + /** + * 是否显示车辆实时位置按钮 + */ + @ApiModelProperty(value = "是否显示车辆实时位置按钮") + private Boolean showBusRealTimeLocationButton; + + /** + * 订单是否评价过 + */ + @ApiModelProperty(value = "订单是否评价过") + private Boolean orderEvaluated; + + /** + * 预售结束时间 + */ + @ApiModelProperty(value = "预售结束时间") + private Long preSaleEndTime; + + /** + * 取消拼车结束时间 + */ + @ApiModelProperty(value = "取消拼车结束时间") + private Long carpoolEndTime; + + /** + * 最低拼车人数 + */ + @ApiModelProperty(value = "最低拼车人数") + private Integer carPoolLimitNum; + /** + * 期初总库存数 + */ + @ApiModelProperty(value = "预期库存总数") + private Integer beginQuantity; + /** + * 已拼车人数 + */ + @ApiModelProperty(value = "已拼车人数") + private Integer soldQuantity; + + /** + * 拼车状态 + */ + @ApiModelProperty(value = "拼车状态") + private String carPoolStatus; + + /** + * 获取订单下购买的次票班次的日期 + * */ + public List getShuttleDateList() { + if(CollectionUtils.isEmpty(getTpOrderRoutes())) return Collections.emptyList(); + + List shuttleVO = getTpOrderRoutes().get(0).getTpOrderRouteShuttle(); + // 目前只有班次的才可以拿到车辆的信息,没有班次直接退出 + if(CollUtil.isEmpty(shuttleVO)) return Collections.emptyList(); + + return CollectionUtils.emptyIfNull(getOrderSubjectItem()).stream() + .filter(si -> CollectionUtils.isNotEmpty(si.getOrderItemElements())) + .flatMap(si -> si.getOrderItemElements().stream()) + .filter(ie -> "date".equals(ie.getElementCode())) + .map(ie -> LocalDate.parse(ie.getElementValue(), SHUTTLE_DATE_FORMATTER)) + .sorted() + .collect(Collectors.toList()); + } + + /** + * 找任意一个司机的车牌 + * */ + public Optional findAnyVehicleNumberInDrivers() { + return CollectionUtils.emptyIfNull(getDriverInfos()).stream() + .map(DriverInfoVO::getVehicleNumber) + .filter(StringUtils::isNotBlank) + .findAny(); + } +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderDispatchDetailVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderDispatchDetailVO.java new file mode 100644 index 0000000..7a0596d --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderDispatchDetailVO.java @@ -0,0 +1,110 @@ +package com.deepinnet.tptradeprod.common.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + * @author amos wong + * @create 2023/10/30 17:36 + * @Description 分配订单 + */ +@Data +public class TpProdOrderDispatchDetailVO implements Serializable { + private static final long serialVersionUID = -6835649297585208663L; + + /** + * 派单编号 + */ + private String dispatchNo; + + /** + * 子订单单号 + */ + private String orderNo; + + /** + * 原始订单编号 + */ + private String originalOrderNo; + + /** + * 派单操作员编号 + */ + private String operatorNo; + + /** + * 派单操作员名称 + */ + private String operatorName; + + /** + * 派单类型 + */ + private String dispatchType; + + /** + * 分派组织代码 + */ + private String targetOrgNo; + + /** + * 分派组织类型 + */ + private String targetOrgType; + + + /** + * 分派组织名称 + */ + private String targetOrgName; + + + /** + * 下单来源承运组织编码 + */ + private String originOrgNo; + + /** + * 下单来源承运组织名称 + */ + private String originOrgName; + + /** + * 下单来源承运组织类型 + */ + private String originOrgType; + + /** + * 是否可以转分配 + */ + private Boolean isReDispatch = Boolean.FALSE; + + /** + * 分配时间 + */ + private Long dispatchTime; + + /** + * 分配单状态 + */ + private Integer dispatchStatus; + + /** + * 派车车队列表 + */ + private TpProdOrderDispatchFleetVO fleet; + + /** + * 业务扩展字段 + */ + private Map bizData; + + /** + * 租户id + */ + private String tenantId; + + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderDispatchFleetVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderDispatchFleetVO.java new file mode 100644 index 0000000..b4d03c9 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderDispatchFleetVO.java @@ -0,0 +1,78 @@ +package com.deepinnet.tptradeprod.common.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + *

+ * 订单派车领域实体 + *

+ * + * @author xiehuaqiao + * @since 2023/11/13 + */ + +@Data +public class TpProdOrderDispatchFleetVO implements Serializable { + + /** + * 派单编号 + */ + private String dispatchNo; + + /** + * 子订单单号 + */ + private String orderNo; + + /** + * 原始订单编号 + */ + private String originalOrderNo; + + /** + * 分配员编码 + */ + private String operatorNo; + + /** + * 分配员名称 + */ + private String operatorName; + + /** + * 分配目标车队编码 + */ + private String targetFleetNo; + + /** + * 分配目标车队名称 + */ + private String targetFleetName; + + /** + * 分配车队时间 + */ + private Long dispatchTime; + + /** + * 合营车队车型关系 + */ + private List goJoinFleets; + + private List backJoinFleets; + + /** + * 业务扩展字段 + */ + private Map bizData; + + /** + * 租户id + */ + private String tenantId; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderDispatchJoinFleetVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderDispatchJoinFleetVO.java new file mode 100644 index 0000000..decb934 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderDispatchJoinFleetVO.java @@ -0,0 +1,64 @@ +package com.deepinnet.tptradeprod.common.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + * Description: + * Date: 2024/6/3 + * Author: lijunheng + */ + +/** + * 订单分配的合营车队,一个车型对应一个车队 + */ +@Data +public class TpProdOrderDispatchJoinFleetVO implements Serializable { + + /** + * 派单主营车队记录编码 + */ + private String orderDispatchFleetCode; + + /** + * 行程类型(go; back) + */ + private String tripType; + + /** + * 车型编码 + */ + private String specCode; + + /** + * 车型名称 + */ + private String specName; + + /** + * 分公司编码 + */ + private String orgCode; + + /** + * 分公司名称 + */ + private String orgName; + + /** + * 车队编码 + */ + private String fleetCode; + + /** + * 车队名称 + */ + private String fleetName; + + /** + * 扩展字段 + */ + private Map bizData; +} \ No newline at end of file diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderEndorseCreateVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderEndorseCreateVO.java new file mode 100644 index 0000000..4c0d56a --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderEndorseCreateVO.java @@ -0,0 +1,24 @@ +package com.deepinnet.tptradeprod.common.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.*; + +/** + *

+ * 改签订单出参 + *

+ * + * @author chenjiaju + * @since 2023/8/28 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class TpProdOrderEndorseCreateVO extends TpProdOrderCreateVO { + + /** + * 原订单 + */ + @ApiModelProperty(value = "原订单") + private String originalOrderNo; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderInvoiceVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderInvoiceVO.java new file mode 100644 index 0000000..2b32e6b --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderInvoiceVO.java @@ -0,0 +1,47 @@ +package com.deepinnet.tptradeprod.common.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + *

+ * 发票 + *

+ * + * @author chenjiaju + * @since 2023/11/29 + */ + +@Data +public class TpProdOrderInvoiceVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 订单编号 + */ + private String orderNo; + + /** + * 发票号码 + */ + private String invoiceNo; + + /** + * 发票地址 + */ + private String invoiceAddress; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 扩展字段 + */ + private Map bizData; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderPaidVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderPaidVO.java new file mode 100644 index 0000000..1c0b6c3 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderPaidVO.java @@ -0,0 +1,28 @@ +package com.deepinnet.tptradeprod.common.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.*; + +import java.io.Serializable; + +/** + *

+ * 已支付订单DTO + *

+ * + * @author chenjiaju + * @since 2023/8/31 + */ + +@Data +@Builder +public class TpProdOrderPaidVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 订单编号 + */ + @ApiModelProperty(value = "订单编号") + private String orderNo; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderPayVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderPayVO.java new file mode 100644 index 0000000..b11bb85 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderPayVO.java @@ -0,0 +1,29 @@ +package com.deepinnet.tptradeprod.common.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author taobinxian + * @version 2023-08-07 + */ +@Data +public class TpProdOrderPayVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 待支付订单号 + */ + @ApiModelProperty(value = "订单编号") + private String orderNo; + + /** + * 拉起收银台的地址 + */ + @ApiModelProperty(value = "收银台地址") + private String cashierUrl; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderPriceRecordDetailVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderPriceRecordDetailVO.java new file mode 100644 index 0000000..2b9497b --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderPriceRecordDetailVO.java @@ -0,0 +1,77 @@ +package com.deepinnet.tptradeprod.common.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + *

+ * 价格明细 + *

+ * + * @author chenjiaju + * @since 2023/9/9 + */ + +@Data +public class TpProdOrderPriceRecordDetailVO implements Serializable { + + private static final long serialVersionUID = -1L; + + /** + * 计价记录编号 + */ + private String pricingNo; + + /** + * 订单编码 + */ + private String orderNo; + + /** + * 询价记录详情 + */ + private String itemNo; + + /** + * 乘客类型 + */ + private String passengerType; + + /** + * 乘客数量 + */ + private Integer passengerCount; + + /** + * 单原始金额 + */ + private String singleOriginalAmount; + + /** + * 单优惠金额 + */ + private String singleDiscountAmount; + + /** + * 总原始金额 + */ + private String totalOriginalAmount; + + /** + * 总优惠金额 + */ + private String totalDiscountAmount; + + /** + * 扩展字段 + */ + private Map bizData; + + /** + * 租户ID + */ + private String tenantId; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderReceivedVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderReceivedVO.java new file mode 100644 index 0000000..840ce27 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderReceivedVO.java @@ -0,0 +1,77 @@ +package com.deepinnet.tptradeprod.common.vo; + +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; +import java.util.Map; + +/** + *

+ * 订单接单 + *

+ * + * @author abel + * @since 2023-11-10 + */ +@Getter +@Setter +public class TpProdOrderReceivedVO implements Serializable { + + private static final long serialVersionUID = -6835649297585208663L; + + /** + * 接单单据好 + */ + private String receivedNo; + + /** + * 业务单据编号 + */ + private String bizObjNo; + + /** + * 业务单据类型 + */ + private String bizObjType; + + /** + * 接单组织编号 + */ + private String orgNo; + + /** + * 接单组织名称 + */ + private String orgName; + + /** + * 接单人编号 + */ + private String receiverNo; + + /** + * 接单人名称 + */ + private String receiverName; + + /** + * 接单时间 + */ + private Long receivedTime; + + /** + * 接单状态 + */ + private Integer receivedStatus; + + /** + * 业务扩展字段 + */ + private Map bizData; + /** + * 租户id + */ + private String tenantId; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderRscConfirmVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderRscConfirmVO.java new file mode 100644 index 0000000..f60925d --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderRscConfirmVO.java @@ -0,0 +1,44 @@ +package com.deepinnet.tptradeprod.common.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 订单全额审核订单金额信息 + * @author xiehuaqiao + */ +@Data +public class TpProdOrderRscConfirmVO implements Serializable { + + /** + * 子订单单号 + */ + @ApiModelProperty(value = "子订单单号") + private String orderNo; + + /** + * 原始订单编号 + */ + @ApiModelProperty(value = "原始订单编号") + private String originalOrderNo; + + /** + * 用户订单金额 + */ + @ApiModelProperty(value = "用户订单金额") + private String currentAmount; + + /** + * 全额退款金额:取payAmount 实付金额 + */ + @ApiModelProperty(value = "用户订单金额") + private String refundAmount; + + /** + * 手续费:只有订单取消或者订单变更时才有手续费 + */ + @ApiModelProperty(value = "手续费:只有订单取消或者订单变更时才有手续费") + private String serviceChargeFee; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderTravelDispatchRecordVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderTravelDispatchRecordVO.java new file mode 100644 index 0000000..0259569 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderTravelDispatchRecordVO.java @@ -0,0 +1,108 @@ +package com.deepinnet.tptradeprod.common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + *

+ * 行程单车辆派单记录 + *

+ * + * @author abel + * @since 2023-11-23 + */ +@Data +@ApiModel(value = "车辆派单记录") +public class TpProdOrderTravelDispatchRecordVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 行程单号 + */ + @ApiModelProperty(value = "行程单号") + private String tripNo; + + /** + * 行程类型(go;back) + * @see com.deepinnet.tptradecore.common.enums.order.TpOrderTripTypeEnum + */ + @ApiModelProperty(value = "行程类型(go;back)") + private String tripType; + + /** + * 车队ID + */ + @ApiModelProperty(value = "车队ID") + private String fleetId; + + /** + * 车队组织 + */ + @ApiModelProperty(value = "车队名称") + private String fleetName; + + /** + * 出发时间 + */ + @ApiModelProperty(value = "出发时间") + private Long departureTime; + + /** + * 到达时间 + */ + @ApiModelProperty(value = "到达时间") + private Long arriveTime; + + /** + * 车辆规格 + */ + @ApiModelProperty(value = "车辆规格编码") + private String busSpecificationCode; + + /** + * 车辆名称 + */ + @ApiModelProperty(value = "车辆名称") + private String busName; + + /** + * 车牌号 + */ + @ApiModelProperty(value = "车牌号") + private String busPlate; + + /** + * 司机名称 + */ + @ApiModelProperty(value = "司机名称") + private String driverName; + + /** + * 司机手机号 + */ + @ApiModelProperty(value = "司机手机号") + private String driverPhone; + + /** + * 天包车表示第几天 + */ + @ApiModelProperty(value = "包车中代表当前车辆是第几天的车辆") + private Integer dayIndex; + + /** + * 租户ID + */ + @ApiModelProperty(value = "租户ID") + private String tenantId; + + /** + * 扩展字段 + */ + @ApiModelProperty(value = "拓展字段") + private Map bizData; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderTravelTripVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderTravelTripVO.java new file mode 100644 index 0000000..c0e25d2 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderTravelTripVO.java @@ -0,0 +1,108 @@ +package com.deepinnet.tptradeprod.common.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + *

+ * 行程单 + *

+ * + * @author chenjiaju + * @since 2023-07-25 15:46:31 + */ +@Data +public class TpProdOrderTravelTripVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 行程单编号 + */ + @ApiModelProperty(value = "行程单编号") + private String tripNo; + + /** + * 订单编号 + */ + @ApiModelProperty(value = "订单编号") + private String orderNo; + + /** + * 乘客数量 + */ + @ApiModelProperty(value = "乘客数量") + private Integer passengerCount; + + /** + * 公里数 + */ + @ApiModelProperty(value = "公里数") + private String miles; + + /** + * 上车点code + */ + @ApiModelProperty(value = "上车点code") + private String pickUpLocationCode; + + /** + * 上车点名称 + */ + @ApiModelProperty(value = "上车点名称") + private String pickUpLocation; + + /** + * 下车点code + */ + @ApiModelProperty(value = "下车点code") + private String dropOffLocationCode; + + /** + * 下车点名称 + */ + @ApiModelProperty(value = "下车点名称") + private String dropOffLocation; + + /** + * 出发时间 + */ + @ApiModelProperty(value = "出发时间") + private String startTime; + + /** + * 到达时间 + */ + @ApiModelProperty(value = "到达时间") + private String endTime; + + /** + * 行程单 行程类型 + */ + @ApiModelProperty(value = "行程单行程类型(go;back)") + private String tripType; + + /** + * 该行程单状态 + * @see + */ + @ApiModelProperty(value = "行程单行程状态") + private String tripStatus; + + /** + * 扩展字段 + */ + @ApiModelProperty(value = "扩展字段") + private Map bizData; + + /** + * 位置信息 + */ + @ApiModelProperty(value = "位置信息") + private List tripPositions; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderTripPositionVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderTripPositionVO.java new file mode 100644 index 0000000..d8d6622 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdOrderTripPositionVO.java @@ -0,0 +1,64 @@ +package com.deepinnet.tptradeprod.common.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + *

+ * 位置信息 + *

+ * + * @author chenjiaju + * @since 2023-07-25 15:46:31 + */ +@Data +public class TpProdOrderTripPositionVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 行程单编号 + */ + @ApiModelProperty(value = "行程单编号") + private String tripNo; + + /** + * 位置编码 + */ + @ApiModelProperty(value = "位置编码") + private String locationCode; + + /** + * 位置名称 + */ + @ApiModelProperty(value = "位置名称") + private String locationName; + + /** + * 经度 + */ + @ApiModelProperty(value = "经度") + private String lng; + + /** + * 维度 + */ + @ApiModelProperty(value = "纬度") + private String lat; + + /** + * 序号 + */ + @ApiModelProperty(value = "序号") + private Integer index; + + /** + * 扩展字段 + */ + @ApiModelProperty(value = "扩展字段") + private Map bizData; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdQueryAvailableRefundVoucherVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdQueryAvailableRefundVoucherVO.java new file mode 100644 index 0000000..6d13dd6 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdQueryAvailableRefundVoucherVO.java @@ -0,0 +1,41 @@ +package com.deepinnet.tptradeprod.common.vo; + +import com.deepinnet.tptradeprod.common.dto.*; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +public class TpProdQueryAvailableRefundVoucherVO implements Serializable { + + private static final long serialVersionUID = 635061896960139213L; + + /** + * 凭证列表 + */ + @ApiModelProperty(value = "凭证列表") + private List voucherDTOs; + + /** + * 非实名制去程乘客退票详情 + */ + private List nonRealNamePassengerAvailableRefundDTOs; + + /** + * 实名制乘客退票详情 + */ + private List realNamePassengerAvailableRefundDTOs; + + /** + * 退票方式:com.deepinnet.tptradecore.common.enums.contract.TpRefundTypeEnum + */ + @ApiModelProperty(value = "退票方式:original_refund-原路退回") + private List refundTypes; + + /** + * 车票类型 + */ + private String voucherType; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdQueryPayResultVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdQueryPayResultVO.java new file mode 100644 index 0000000..a52b42e --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdQueryPayResultVO.java @@ -0,0 +1,60 @@ +package com.deepinnet.tptradeprod.common.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author amos wong + * @create 2022-11-08 11:37 + *

+ * 在第三方支付平台查询支付结果的返回值 + */ +@Data +public class TpProdQueryPayResultVO implements Serializable { + + private static final long serialVersionUID = 6151927360028137085L; + + /** + * 是否支付成功 + */ + @ApiModelProperty(value = "支付结果") + private boolean paySuccess; + + /** + * 订单号 + */ + @ApiModelProperty(value = "订单号") + private String bizNo; + + /** + * 支付单号 + */ + @ApiModelProperty(value = "支付单号") + private String payOrderNo; + + /** + * 支付宝或微信的交易号 + */ + @ApiModelProperty(value = "支付宝或微信的交易号") + private String outPayFlowId; + + /** + * 支付时间 + */ + @ApiModelProperty(value = "支付时间") + private Long payTime; + + /** + * 支付方式 + */ + @ApiModelProperty(value = "支付方式") + private String payType; + + /** + * 支付场景 + */ + @ApiModelProperty(value = "支付场景") + private String payScene; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdQueryRefundDetailVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdQueryRefundDetailVO.java new file mode 100644 index 0000000..75b5416 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdQueryRefundDetailVO.java @@ -0,0 +1,46 @@ +package com.deepinnet.tptradeprod.common.vo; + +import com.deepinnet.tptradeprod.common.dto.*; +import io.swagger.annotations.ApiModelProperty; +import lombok.*; + +import java.io.Serializable; +import java.util.List; + +/** + * @author amos wong + * @create 2023/8/9 15:50 + * @Description + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class TpProdQueryRefundDetailVO implements Serializable { + + private static final long serialVersionUID = 635061896960139213L; + + /** + * 退票申请单 + */ + @ApiModelProperty(value = "退票申请单") + private TpProdRefundApplyOrderDTO refundApplyOrderDTO; + + /** + * 正向支付单 + */ + @ApiModelProperty(value = "正向支付单") + private TpProdPayOrderDTO paidOrderDTO; + + @ApiModelProperty(value = "凭证类型:day-日票,week-周票,term-学期票,month-月票,year-年票") + private String voucherType; + + @ApiModelProperty(value = "是否是实名制退票") + private Boolean realNameRefund; + + @ApiModelProperty(value = "非实名制退票内容") + private List nonRealNameTicketRefundChoiceDTOs; + + @ApiModelProperty(value = "实名制退票内容") + private List realNameTicketRefundChoiceDTOs; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdSalesUnitCarpoolVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdSalesUnitCarpoolVO.java new file mode 100644 index 0000000..03a6cee --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdSalesUnitCarpoolVO.java @@ -0,0 +1,86 @@ +package com.deepinnet.tptradeprod.common.vo; + +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + *

+ * + *

+ * + * @author chenjiaju + * @since 2024/5/24 + */ + +@Data +@NoArgsConstructor +@Accessors(chain = true) +public class TpProdSalesUnitCarpoolVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + private Integer id; + /** + * 线路名称 + */ + private String routeName; + /** + * 线路编号 + */ + private String routeCode; + /** + * 产品编号 + */ + private String productCode; + /** + * 售卖单元编号 + */ + private String salesUnitCode; + /** + * 乘车日期,格式yyyyMMdd + */ + private String departDate; + /** + * 发车时间,格式HH:mm + */ + private String departTime; + /** + * 最低拼车人数 + */ + private Integer carPoolLimitNum; + /** + * 已拼车人数 + */ + private Integer soldQuantity; + /** + * 预售结束时间 + */ + private Long preSaleEndTime; + /** + * 取消拼车时间 + */ + private Long cancelCarPoolTime; + /** + * 拼车状态 + * @see com.deepinnet.tpproductcore.common.enums.TpCarPoolStatusEnum + */ + private String carPoolStatus; + /** + * 排序字段,糅合拼车状态、乘车日期和发车时间,优先展示拼车中且乘车日期和发车时间较小的拼车信息 + */ + private String sortKey; + /** + * 租户id + */ + private String tenantId; + /** + * 扩展字段 + */ + private String bizData; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdTimeRangeExistVerificationRecordDateQueryVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdTimeRangeExistVerificationRecordDateQueryVO.java new file mode 100644 index 0000000..e9ab209 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdTimeRangeExistVerificationRecordDateQueryVO.java @@ -0,0 +1,23 @@ +package com.deepinnet.tptradeprod.common.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.*; + +import java.io.Serializable; +import java.util.List; + +/** + * @author amos wong + * @create 2024/1/11 11:33 + * @Description + */ +@Data +@AllArgsConstructor +public class TpProdTimeRangeExistVerificationRecordDateQueryVO implements Serializable { + + /** + * 有核销记录的日期列表 + */ + @ApiModelProperty(value = "有核销记录的日期列表") + private List verificationSuccessTimeList; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdTimeRangeUserVerificationRecordDetailQueryVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdTimeRangeUserVerificationRecordDetailQueryVO.java new file mode 100644 index 0000000..cb04658 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdTimeRangeUserVerificationRecordDetailQueryVO.java @@ -0,0 +1,23 @@ +package com.deepinnet.tptradeprod.common.vo; + +import com.deepinnet.tptradeprod.common.dto.TpProdUserVoucherVerificationRecordDTO; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @author amos wong + * @create 2024/1/11 11:33 + * @Description + */ +@Data +public class TpProdTimeRangeUserVerificationRecordDetailQueryVO implements Serializable { + /** + * 核销记录列表,按照核销时间倒序 + */ + @ApiModelProperty(value = "核销记录列表,按照订单分组") + private List recordDTOList; +} + diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdVoucherCheckVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdVoucherCheckVO.java new file mode 100644 index 0000000..193528c --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdVoucherCheckVO.java @@ -0,0 +1,29 @@ +package com.deepinnet.tptradeprod.common.vo; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class TpProdVoucherCheckVO implements Serializable { + + /** + * 检票结果 + */ + private Boolean checkResult; + + /** + * 是否允许继续验票 + */ + private Boolean availableContinueCheck; + + /** + * 是否是一次性核销 + */ + private Boolean isOneTimeVerification; + + /** + * 核销人数 + */ + private Integer verificationPassengerCount; +} \ No newline at end of file diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdVoucherPassengerVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdVoucherPassengerVO.java new file mode 100644 index 0000000..c5109c7 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpProdVoucherPassengerVO.java @@ -0,0 +1,71 @@ +package com.deepinnet.tptradeprod.common.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + * @author amos wong + * @create 2023/7/26 10:28 + * @Description 出行凭证关联乘客 + */ +@Data +public class TpProdVoucherPassengerVO implements Serializable { + + private static final long serialVersionUID = -752707293264231779L; + + /** + * 凭证编号 + */ + @ApiModelProperty(value = "凭证编号") + private String voucherNo; + + /** + * 乘客编号 + */ + @ApiModelProperty(value = "乘客编号") + private String passengerNo; + + /** + * 姓名 + */ + @ApiModelProperty(value = "姓名") + private String name; + + /** + * 联系方式 + */ + @ApiModelProperty(value = "联系方式") + private String contactInfo; + + /** + * 证件号 + */ + @ApiModelProperty(value = "证件号") + private String certNo; + + /** + * 证件类型 + */ + @ApiModelProperty(value = "证件类型") + private String certType; + + /** + * 乘客类型 + */ + @ApiModelProperty(value = "乘客类型") + private String passengerType; + + /** + * 租户id + */ + @ApiModelProperty(value = "租户id") + private String tenantId; + + /** + * 业务数据 + */ + private Map bizData; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpQueryAvailableRescheduleVoucherDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpQueryAvailableRescheduleVoucherDTO.java new file mode 100644 index 0000000..f88b4fa --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpQueryAvailableRescheduleVoucherDTO.java @@ -0,0 +1,35 @@ +package com.deepinnet.tptradeprod.common.vo; + +import com.deepinnet.tptradeprod.common.dto.TpAvailableRescheduleVoucherDTO; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @author amos wong + * @create 2024/7/5 10:35 + * @Description 查询可改签的凭证 + */ +@Data +public class TpQueryAvailableRescheduleVoucherDTO implements Serializable { + + @ApiModelProperty("车票类型") + private String voucherType; + + @ApiModelProperty("行程类型") + private List tripTypes; + + /** + * 可改签的凭证列表 + */ + @ApiModelProperty("可改签的凭证列表") + private List voucherList; + + /** + * 线路 / 班次 + */ + @ApiModelProperty(value = "线路信息") + private TpOrderRouteVO tpOrderRoute; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpRefundDateVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpRefundDateVO.java new file mode 100644 index 0000000..66cce5c --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpRefundDateVO.java @@ -0,0 +1,20 @@ +package com.deepinnet.tptradeprod.common.vo; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author amos wong + * @create 2023/10/8 15:46 + * @Description + */ +@Data +public class TpRefundDateVO implements Serializable { + + private static final long serialVersionUID = -5287473535057938032L; + + private Long startTime; + + private Long endTime; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpServiceChargeVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpServiceChargeVO.java new file mode 100644 index 0000000..36c7b4f --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpServiceChargeVO.java @@ -0,0 +1,50 @@ +package com.deepinnet.tptradeprod.common.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + *

+ * 手续费试算出参 + *

+ * + * @author chenjiaju + * @since 2023/11/20 + */ + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TpServiceChargeVO implements Serializable { + + /** + * 包车手续费订单编号(这里使用原始订单编号) + */ + @ApiModelProperty(value = "订单号") + private String orderNo; + + /** + * 手续费 + */ + @ApiModelProperty(value = "总手续费") + private String serviceCharge; + + /** + * 当前手续费 + */ + @ApiModelProperty(value = "当前手续费") + private String currentOperateCharge; + + /** + * 费率 + */ + @ApiModelProperty(value = "手续费费率") + private String serviceChargeRate; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpUserPassengerVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpUserPassengerVO.java new file mode 100644 index 0000000..3128fef --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpUserPassengerVO.java @@ -0,0 +1,61 @@ +package com.deepinnet.tptradeprod.common.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + *

+ * 乘客信息出参 + *

+ * + * @author taobinxian + * @version 2023-08-07 + */ + +@Data +public class TpUserPassengerVO implements Serializable { + + private static final long serialVersionUID = -7157914478824441426L; + + /** + * 乘客编号 + */ + @ApiModelProperty("乘客编号") + private String passengerNo; + + /** + * 乘客类型 + * @see TpUserPassengerTypeEnum + */ + @ApiModelProperty(value = "乘客类型(成人-ADULT;儿童-CHILD;残疾人-DEFORMED_MAN;老年人-OLD_PEOPLE;军人-MILITARY)", required = true) + private String passengerType; + + /** + * 乘客姓名 + */ + @ApiModelProperty(value = "乘客名称") + private String passengerName; + + /** + * 乘客证件类型 + * @see TpUserPassengerIdentityTypeEnum + */ + @ApiModelProperty(value = "乘客证件类型(001-身份证)") + private String identityType; + + /** + * 乘客证件编号 + */ + @ApiModelProperty(value = "证件号码") + private String identityNumber; + + /** + * 扩展字段 + */ + @ApiModelProperty(value = "扩展字段") + private Map bizData; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpUserRouteCollectionVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpUserRouteCollectionVO.java new file mode 100644 index 0000000..177acba --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/TpUserRouteCollectionVO.java @@ -0,0 +1,101 @@ +package com.deepinnet.tptradeprod.common.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + *

+ * 用户线路收集 + *

+ * + * @author chenjiaju + * @since 2023/8/16 + */ + +@Data +public class TpUserRouteCollectionVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 用户编号 + */ + @ApiModelProperty(value = "用户编号") + private String userNo; + + /** + * 上车点名称 + */ + @ApiModelProperty(value = "上车点名称") + private String upLocation; + + /** + * 上车点经度 + */ + @ApiModelProperty(value = "上车点经度") + private String upLocationLng; + + /** + * 上车点维度 + */ + @ApiModelProperty(value = "上车点纬度") + private String upLocationLat; + + /** + * 下车点名称 + */ + @ApiModelProperty(value = "下车点名称") + private String downLocation; + + /** + * 下车点经度 + */ + @ApiModelProperty(value = "下车点经度") + private String downLocationLng; + + /** + * 下车点维度 + */ + @ApiModelProperty(value = "下车点纬度") + private String downLocationLat; + + /** + * 期望上车时间 + */ + @ApiModelProperty(value = "期望上车时间") + private String expectUpTime; + + /** + * 期望下车时间 + */ + @ApiModelProperty(value = "期望下车时间") + private String expectDownTime; + + /** + * 出行目的 + */ + @ApiModelProperty(value = "出行目的") + private String travelPurpose; + + /** + * 备注 + */ + @ApiModelProperty(value = "备注") + private String remark; + + /** + * 手机号 + */ + @ApiModelProperty(value = "手机号") + private String phoneNumber; + + /** + * biz_data + */ + @ApiModelProperty(value = "扩展字段") + private Map bizData; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/audit/TpProdAuditConfirmDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/audit/TpProdAuditConfirmDTO.java new file mode 100644 index 0000000..890cdd3 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/audit/TpProdAuditConfirmDTO.java @@ -0,0 +1,70 @@ +package com.deepinnet.tptradeprod.common.vo.audit; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Map; + +/** + * @author amos wong + * @create 2023/10/30 15:12 + * @Description 审核确认DTO + */ +@Data +@Builder +public class TpProdAuditConfirmDTO implements Serializable { + private static final long serialVersionUID = 6995017509898880006L; + + /** + * 审核单编号 + * + */ + @NotBlank(message = "审核单编号不能为空") + private String auditNo; + + + /** + * 审核员编号 + */ + @ApiModelProperty(value = "审核员编号") + @NotBlank(message = "审核员编号不能为空") + private String auditorNo; + + /** + * 审核员名字 + */ + @ApiModelProperty(value = "审核员编名字") + @NotBlank(message = "审核员名字不能为空") + private String auditorName; + + /** + * 审核结果状态 + */ + @ApiModelProperty(value = "审核结果状态") + @NotBlank(message = "审核结果状态不能为空") + private String status; + + /** + * 审核结果建议 + */ + @ApiModelProperty(value = "审核结果建议") + private String remark; + + + @ApiModelProperty(value = "审核时间") + @NotNull(message = "审核时间不能为空") + private Long auditTime; + + /** + * 业务扩展字段 + */ + private Map bizData; + + @NotBlank(message = "租户id不能为空") + private String tenantId; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/audit/TpProdAuditCreatedDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/audit/TpProdAuditCreatedDTO.java new file mode 100644 index 0000000..73aa2d0 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/audit/TpProdAuditCreatedDTO.java @@ -0,0 +1,100 @@ +package com.deepinnet.tptradeprod.common.vo.audit; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Map; + +/** + * @author xiehuaqiao + * @create 2023/10/30 15:12 + * @Description 审核单创建 + */ +@Data +@Builder +public class TpProdAuditCreatedDTO implements Serializable { + private static final long serialVersionUID = 6995017509898880006L; + + + /** + * 审核单业务单据类型 + */ + @ApiModelProperty(value = "审核单业务单据类型") + @NotBlank(message = "审核单业务单据类型不能为空") + private String bizObjType; + + /** + * 审核单业务单据编号 + */ + @ApiModelProperty(value = "审核单业务单据编号") + @NotBlank(message = "审核单业务单据编号不能为空") + private String bizObjectNo; + + + /** + * 审核员编号 + */ + @ApiModelProperty(value = "审核员编号") + private String auditorNo; + + /** + * 审核员名字 + */ + @ApiModelProperty(value = "审核员编名字") + private String auditorName; + + /** + * 审核处理时间 + */ + @ApiModelProperty(value = "审核处理时间") + private Long auditTime; + + /** + * 审核单类型 + */ + @ApiModelProperty(value = "审核单类型") + private Integer type; + + /** + * 审核结果状态 + */ + @ApiModelProperty(value = "审核结果状态") + private String status; + + + @ApiModelProperty(value = "提交审核时间") + @NotNull(message = "提交审核时间不能为空") + private Long submitAuditTime; + + /** + * 审核单提交人编号 + */ + @ApiModelProperty(value = "审核单提交人编号") + private String submitterNo; + + /** + * 审核单提交人名称 + */ + @ApiModelProperty(value = "审核单提交人名称") + private String submitterName; + + + /** + * 提交申请原因 + */ + @ApiModelProperty(value = "提交申请原因") + private String applyReason; + + /** + * 业务扩展字段 + */ + @ApiModelProperty(value = "业务扩展字段") + private Map bizData; + + @NotBlank(message = "租户id不能为空") + private String tenantId; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/audit/TpProdAuditLatestDetailDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/audit/TpProdAuditLatestDetailDTO.java new file mode 100644 index 0000000..1402b93 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/audit/TpProdAuditLatestDetailDTO.java @@ -0,0 +1,64 @@ +package com.deepinnet.tptradeprod.common.vo.audit; + +import com.deepinnet.tptradeprod.common.enums.TpOrderAuditConfirmTypeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.List; + +/** + * @author xiehuaqiao + * @create 2023/10/30 15:12 + * @Description 审核单创建 + */ +@Data +@Builder +public class TpProdAuditLatestDetailDTO implements Serializable { + private static final long serialVersionUID = 6995017509898880006L; + + + /** + * 审核单业务单据类型 + */ + @ApiModelProperty(value = "审核单业务单据类型") + @NotBlank(message = "审核单业务单据类型不能为空") + private String bizObjType; + + /** + * 审核单业务单据编号 + */ + @ApiModelProperty(value = "审核单业务单据编号") + @NotBlank(message = "审核单业务单据编号不能为空") + private String bizObjectNo; + + /** + * 订单审核单号:建议页面请求直接带 + */ + @ApiModelProperty(value = "审核单号") + private String auditNo; + + /** + * 审核单类型 + */ + @ApiModelProperty(value = "审核单类型") + private Integer type; + + /** + * 审核业务员编号 + */ + @ApiModelProperty(value = "审核业务员编号") + private String auditorNo; + + /** + * 审核单状态列表 + */ + @ApiModelProperty(value = "审核单状态列表") + private List auditStatuses; + + + @NotBlank(message = "租户id不能为空") + private String tenantId; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/audit/TpProdAuditListOrderVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/audit/TpProdAuditListOrderVO.java new file mode 100644 index 0000000..632974a --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/audit/TpProdAuditListOrderVO.java @@ -0,0 +1,79 @@ +package com.deepinnet.tptradeprod.common.vo.audit; + +import com.deepinnet.tptradeprod.common.vo.*; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + * @author xiehuaqiao + * @create 2023/10/30 15:12 + * @Description 审核单 + */ +@Data +public class TpProdAuditListOrderVO implements Serializable { + + + /** + * 订单号 + */ + @ApiModelProperty(value = "订单号") + private String originalOrderNo; + + /** + * 子订单号 + */ + private String orderNo; + /** + * 包车类型 + */ + @ApiModelProperty(value = "包车类型") + private String charterBusType; + + + /** + * 订单金额(应付金额) + */ + @ApiModelProperty(value = "订单金额(应付金额)") + private String payableAmount; + + /** + * 退款手续费 + */ + @ApiModelProperty(value = "退款手续费") + private String serviceCharge; + + /** + * 全额退款金额 + */ + @ApiModelProperty(value = "全额退款金额") + private String fullRefundAmount; + + /** + * 扣手续费后退款金额 + */ + @ApiModelProperty(value = "扣手续费后退款金额") + private String rscRefundAmount; + + /** + * 实际退款金额 + */ + @ApiModelProperty(value = "实际退款金额") + private String actualRefundAmount; + + /** + * 所属组织编码 + */ + @ApiModelProperty(value = "所属组织编码") + private String orgNo; + + /** + * 所属组织名称 + */ + @ApiModelProperty(value = "所属组织名称") + private String orgName; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/audit/TpProdAuditListQueryDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/audit/TpProdAuditListQueryDTO.java new file mode 100644 index 0000000..3e23ed8 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/audit/TpProdAuditListQueryDTO.java @@ -0,0 +1,41 @@ +package com.deepinnet.tptradeprod.common.vo.audit; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * @author xiehuaqiao + * @create 2023/10/30 15:12 + * @Description 审核单创建 + */ +@Data +public class TpProdAuditListQueryDTO implements Serializable { + private static final long serialVersionUID = 6995017509898880006L; + + /** + * 审核单业务单据类型 + */ + private String bizObjType; + + /** + * 审核单业务单据编号 + */ + private String bizObjectNo; + + /** + * 审核人编号 + */ + private String auditorNo; + + /** + * 审核单编号 + * + */ + private String auditNo; + + + @NotBlank(message = "租户id不能为空") + private String tenantId; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/audit/TpProdAuditListVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/audit/TpProdAuditListVO.java new file mode 100644 index 0000000..9a5ad60 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/audit/TpProdAuditListVO.java @@ -0,0 +1,105 @@ +package com.deepinnet.tptradeprod.common.vo.audit; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author xiehuaqiao + * @create 2023/10/30 15:12 + * @Description 审核单 + */ +@Data +public class TpProdAuditListVO implements Serializable { + + /** + * 审核单编号 + */ + @ApiModelProperty(value = "审核单编号") + private String auditNo; + + /** + * 审核单类型 + */ + @ApiModelProperty(value = "审核单类型") + private Integer type; + + /** + * 提交时间 + */ + @ApiModelProperty(value = "提交时间") + private Long submitTime; + + /** + * 提交人编号 + */ + @ApiModelProperty(value = "提交人编号") + private String submitterNo; + + /** + * 提交人名称 + */ + @ApiModelProperty(value = "提交人名称") + private String submitterName; + + /** + * 提交申请原因 + */ + @ApiModelProperty(value = "提交申请原因") + private String applyReason; + + /** + * 审核员编号 + */ + @ApiModelProperty(value = "审核员编号") + private String auditorNo; + + /** + * 审核员名字 + */ + @ApiModelProperty(value = "审核员名字") + private String auditorName; + + /** + * 审核状态 + *

+ * approved_success: 审核通过 + * approved_reject:审核未通过 + * waiting_approved:待审核 + * approved_timeout:审核超时 + *

+ */ + @ApiModelProperty(value = "审核状态(approved_success: 审核通过/approved_reject:审核未通过/waiting_approved:待审核/approved_timeout:审核超时)") + private String status; + + /** + * 审核建议 + */ + @ApiModelProperty(value = "审核建议") + private String remark; + + /** + * 审核时间 + */ + @ApiModelProperty(value = "审核时间") + private Long auditTime; + + /** + * 审核单关联业务单号 + */ + @ApiModelProperty(value = "审核关联业务单号") + private String bizObjectNo; + /** + * 审核单关联业务单号类型 + */ + @ApiModelProperty(value = "审核单关联业务单号类型") + private String bizObjType; + + /** + * 审核单关联的订单信息 + */ + @ApiModelProperty(value = "审核单关联业务单号类型") + private TpProdAuditListOrderVO orderListVO; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/audit/TpProdAuditQueryDetailDTO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/audit/TpProdAuditQueryDetailDTO.java new file mode 100644 index 0000000..93d8cbb --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/audit/TpProdAuditQueryDetailDTO.java @@ -0,0 +1,43 @@ +package com.deepinnet.tptradeprod.common.vo.audit; + +import lombok.*; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.List; + +/** + * @author xiehuaqiao + * @create 2023/10/30 15:12 + * @Description 审核单创建 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class TpProdAuditQueryDetailDTO implements Serializable { + private static final long serialVersionUID = 6995017509898880006L; + + /** + * 审核单编号 + * + */ + private String auditNo; + + /** + * 审核单关联业务单号 + */ + private String bizObjectNo; + /** + * 审核单关联业务单号类型 + */ + private String bizObjType; + + /** + * 审核单状态列表 + */ + private List auditStatuses; + + @NotBlank(message = "租户id不能为空") + private String tenantId; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/audit/TpProdAuditVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/audit/TpProdAuditVO.java new file mode 100644 index 0000000..863fba9 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/audit/TpProdAuditVO.java @@ -0,0 +1,112 @@ +package com.deepinnet.tptradeprod.common.vo.audit; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + * @author xiehuaqiao + * @create 2023/10/30 15:12 + * @Description 审核单 + */ +@Data +public class TpProdAuditVO implements Serializable { + + private static final long serialVersionUID = 6995017509898880006L; + + /** + * 审核单编号 + */ + @ApiModelProperty(value = "审核单编号") + private String auditNo; + + /** + * 审核单类型 + */ + @ApiModelProperty(value = "审核单类型") + private Integer type; + + /** + * 提交时间 + */ + @ApiModelProperty(value = "提交时间") + private Long submitTime; + + /** + * 审核单提交人编号 + */ + @ApiModelProperty(value = "审核单提交人编号") + private String submitterNo; + + /** + * 审核单提交人名称 + */ + @ApiModelProperty(value = "审核单提交人名称") + private String submitterName; + + /** + * 提交申请原因 + */ + @ApiModelProperty(value = "提交申请原因") + private String applyReason; + + /** + * 审核员编号 + */ + @ApiModelProperty(value = "审核员编号") + private String auditorNo; + + + /** + * 审核员名字 + */ + @ApiModelProperty(value = "审核员名字") + private String auditorName; + + /** + * 审核状态 + */ + @ApiModelProperty(value = "审核状态") + private String status; + + /** + * 审核建议 + */ + @ApiModelProperty(value = "审核建议") + private String remark; + + /** + * 审核时间 + */ + @ApiModelProperty(value = "审核时间") + private Long auditTime; + + + /** + * 审核过期时间 + */ + @ApiModelProperty(value = "审核过期时间") + private Long expireTime; + + /** + * 审核单关联业务单号 + */ + @ApiModelProperty(value = "审核单关联业务单号") + private String bizObjectNo; + /** + * 审核单关联业务单号类型 + */ + @ApiModelProperty(value = "审核单关联业务单号类型") + private String bizObjType; + + /** + * 业务扩展字段 + */ + private Map bizData; + /** + * 租户ID + */ + private String tenantId; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/reschedule/TpProdOrderRescheduleInfoVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/reschedule/TpProdOrderRescheduleInfoVO.java new file mode 100644 index 0000000..c71cf49 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/reschedule/TpProdOrderRescheduleInfoVO.java @@ -0,0 +1,71 @@ +package com.deepinnet.tptradeprod.common.vo.reschedule; + +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; + +/** + *

+ * + *

+ * + * @author abel + * @since 2024-07-15 + */ +@Getter +@Setter +public class TpProdOrderRescheduleInfoVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 改签编号 + */ + private String rescheduleNo; + + /** + * 改签前售卖单元编号 + */ + private String subjectItemNo; + + /** + * 改签后售卖单元编号 + */ + private String rescheduleSubjectItemNo; + + /** + * 班次日期 + */ + private String shuttleDate; + + /** + * 班次时间 + */ + private String shuttleTime; + + /** + * 改签后班次日期 + */ + private String rescheduleShuttleDate; + + /** + * 改签后班次时间 + */ + private String rescheduleShuttleTime; + + /** + * 乘客编号 + */ + private String passengerNo; + + /** + * 乘客姓名 + */ + private String passengerName; + + /** + * 乘客数量 + */ + private Integer passengerCount; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/reschedule/TpProdOrderRescheduleRecordVO.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/reschedule/TpProdOrderRescheduleRecordVO.java new file mode 100644 index 0000000..03a51e4 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-facade/src/main/java/com/deepinnet/tptradeprod/common/vo/reschedule/TpProdOrderRescheduleRecordVO.java @@ -0,0 +1,50 @@ +package com.deepinnet.tptradeprod.common.vo.reschedule; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * + *

+ * + * @author abel + * @since 2024-07-15 + */ +@Data +public class TpProdOrderRescheduleRecordVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 改签编号 + */ + private String rescheduleNo; + + /** + * 改签后订单编号 + */ + private String orderNo; + + /** + * 改签前订单编号 + */ + private String originalOrderNo; + + /** + * 改签信息 + */ + private List orderRescheduleInfos; + + /** + * 行程类型 + */ + private String tripType; + + /** + * 改签申请时间 + */ + private Long rescheduleTime; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/pom.xml b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/pom.xml new file mode 100644 index 0000000..034b6b6 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/pom.xml @@ -0,0 +1,97 @@ + + + 4.0.0 + + com.deepinnet + tptradeprod-common-service + 1.0-SNAPSHOT + + + tptradeprod-common-service-integration + + + + org.apache.dubbo + dubbo + + + + com.deepinnet + tptradecore-common-service-facade + + + + com.deepinnet + tptradeprod-common-service-facade + + + + com.deepinnet + tpproductcore-common-service-facade + + + + com.deepinnet + tpbaseopcore-common-service-facade + + + + com.deepinnet + tpconfigcore-common-service-facade + + + + org.mapstruct + mapstruct + + + + org.mapstruct + mapstruct-processor + + + + + org.apache.rocketmq + rocketmq-spring-boot-starter + + + + com.deepinnet + tpcommoncore-common-service-facade + + + + com.ibuscloud + pubtrans-rating-common-facade + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 11 + 11 + + + org.projectlombok + lombok + 1.18.24 + + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + + + + + + + diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpAccountClient.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpAccountClient.java new file mode 100644 index 0000000..bd2b410 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpAccountClient.java @@ -0,0 +1,53 @@ +package com.deepinnet.tptradeprod.common.service.integration.client; + +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpbaseopcore.common.dto.account.AccountDTO; +import com.deepinnet.tpbaseopcore.common.service.facade.TpAccountFacade; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.stereotype.Component; + +/** + *         ┏┓   ┏┓+ + + *        ┏┛┻━━━┛┻┓ + + + *        ┃       ┃ + *        ┃   ━   ┃ ++ + + + + *        ████━████ ┃+ + *        ┃       ┃ + + *        ┃   ┻   ┃ + *        ┃       ┃ + + + *        ┗━┓    ┏━┛ + *          ┃   ┃ + *          ┃   ┃ + + + + + *          ┃   ┃    Code is far away from bug with the animal protecting + *          ┃   ┃ +     神兽保佑,代码无bug + *          ┃   ┃ + *          ┃   ┃  + + *          ┃    ┗━━━┓ + + + *          ┃        ┣┓ + *          ┃        ┏┛ + *          ┗┓┓┏━┳┓┏┛ + + + + + *           ┃┫┫ ┃┫┫ + *           ┗┻┛ ┗┻┛+ + + + + * + * @author 唐国翔 + * @since 2023-12-22 星期五 + **/ +@Component +public class TpAccountClient { + + @DubboReference + private TpAccountFacade accountFacade; + + + public AccountDTO getByAccountId(Long accountId) { + TpResult tpResult = accountFacade.getByAccountId(accountId); + if (!tpResult.isSuccess()) { + LogUtil.error("获取账户详情查询失败,入参:{},原因:{}", accountId, tpResult.getErrorDesc()); + throw new TpException(tpResult.getErrorCode(), tpResult.getErrorDesc()); + } + return tpResult.getData(); + } + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpAuditClient.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpAuditClient.java new file mode 100644 index 0000000..4fa5550 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpAuditClient.java @@ -0,0 +1,138 @@ +package com.deepinnet.tptradeprod.common.service.integration.client; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.page.CommonPage; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.service.facade.audit.TpAuditFacade; +import com.deepinnet.tptradecore.common.vo.audit.TpAuditOrderListVO; +import com.deepinnet.tptradecore.common.vo.audit.TpAuditVO; +import com.deepinnet.tptradeprod.common.dto.TpProdAuditOrderListPagedQueryDTO; +import com.deepinnet.tptradeprod.common.service.integration.convert.TpAuditConverter; +import com.deepinnet.tptradeprod.common.vo.audit.*; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @author xiehuaqiao + * @create 2023/11/20 14:36 + * @Description + */ +@Component +public class TpAuditClient { + + @DubboReference + private TpAuditFacade tpAuditFacade; + + @Resource + private TpAuditConverter tpAuditConverter; + + /** + * 查询审核单详情 + * + * @return + */ + public TpProdAuditVO getAuditDetail(@NotNull(message = "入参不能为空") TpProdAuditQueryDetailDTO tpAuditQueryDetailDTO){ + TpResult result = tpAuditFacade.getAuditDetail(tpAuditConverter.convert2AuditQueryDetailDTO(tpAuditQueryDetailDTO)); + if (!result.isSuccess()) { + LogUtil.error("调用审核单详情查询失败,入参:{},原因:{}", JSONUtil.toJsonStr(tpAuditQueryDetailDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return tpAuditConverter.convert2ProdAuditVO(result.getData()); + } + + /** + * 获取指定业务单据的最近一个审核单详情信息 + * + * @return + */ + public TpProdAuditVO getLatestAuditDetail(@NotNull(message = "入参不能为空") TpProdAuditLatestDetailDTO auditLatestDetailDTO){ + TpResult result = tpAuditFacade.getLatestAuditDetail(tpAuditConverter.convert2AuditQueryDetailDTO(auditLatestDetailDTO)); + if (!result.isSuccess()) { + LogUtil.error("调用审核单详情查询失败,入参:{},原因:{}", JSONUtil.toJsonStr(auditLatestDetailDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return tpAuditConverter.convert2ProdAuditVO(result.getData()); + } + + + + + /** + * 查询审核单详情 + * + * @return + */ + public TpResult> listAudits(@NotNull(message = "入参不能为空") TpProdAuditListQueryDTO tpAuditListQueryDTO){ + TpResult> result = tpAuditFacade.listAudits(tpAuditConverter.convert2AuditListQueryDTO(tpAuditListQueryDTO)); + if (!result.isSuccess()) { + LogUtil.error("调用审核单列表详情查询失败,入参:{},原因:{}", JSONUtil.toJsonStr(tpAuditListQueryDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return TpResult.success(tpAuditConverter.convert2ProdAuditVOList(result.getData())); + + } + + + + /** + * 创建审核单 + * + * @return + */ + public TpResult createAudit(@NotNull(message = "入参不能为空") TpProdAuditCreatedDTO tpAuditCreatedDTO){ + TpResult result = tpAuditFacade.createAudit(tpAuditConverter.convert2AuditCreateDTO(tpAuditCreatedDTO)); + if (!result.isSuccess()) { + LogUtil.error("调用创建审核单接口失败,入参:{},原因:{}", JSONUtil.toJsonStr(tpAuditCreatedDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return TpResult.success(result.getData()); + } + + + /** + * 审核单-审核确认接口 + * + * @param confirmAuditDTO + * @return + */ + public TpResult confirmAudit(@NotNull(message = "入参不能为空") TpProdAuditConfirmDTO confirmAuditDTO){ + + TpResult result = tpAuditFacade.confirmAudit(tpAuditConverter.convert2AuditConfirmDTO(confirmAuditDTO)); + if (!result.isSuccess()) { + LogUtil.error("调用审核单确认接口失败,入参:{},原因:{}", JSONUtil.toJsonStr(confirmAuditDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return TpResult.success(result.getData()); + + } + + + public CommonPage pageAuditList(TpProdAuditOrderListPagedQueryDTO dto) { + + + TpResult> result = tpAuditFacade.pageOrderAuditList(tpAuditConverter.convert2OrderListPagedQueryDTO(dto)); + if (!result.isSuccess()) { + LogUtil.error("调用订单审核单list接口失败,入参:{},原因:{}", JSONUtil.toJsonStr(dto), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + CommonPage pageOldResult = result.getData(); + CommonPage pageNewResult = new CommonPage<>(); + pageNewResult.setTotal(pageOldResult.getTotal()); + pageNewResult.setTotalPage(pageOldResult.getTotalPage()); + pageNewResult.setPageNum(pageOldResult.getPageNum()); + pageNewResult.setPageSize(pageOldResult.getPageSize()); + pageNewResult.setList(tpAuditConverter.convert2OrderListVO(pageOldResult.getList())); + return pageNewResult; + } +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpBizRuleClient.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpBizRuleClient.java new file mode 100644 index 0000000..f4584ca --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpBizRuleClient.java @@ -0,0 +1,63 @@ +package com.deepinnet.tptradeprod.common.service.integration.client; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpproductcore.common.dto.rule.TpBizRuleDTO; +import com.deepinnet.tpproductcore.common.dto.rule.TpRuleExecuteBatchResultVO; +import com.deepinnet.tpproductcore.common.dto.rule.TpRuleExecuteDTO; +import com.deepinnet.tpproductcore.common.dto.rule.TpRuleExecuteResultVO; +import com.deepinnet.tpproductcore.common.qto.TpBizRuleQueryDTO; +import com.deepinnet.tpproductcore.common.service.facade.bizrule.TpBizRuleFacade; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + *

+ * 产品 + *

+ * + * @author chenjiaju + * @since 2023/9/5 + */ + +@Component +public class TpBizRuleClient { + + @DubboReference + private TpBizRuleFacade bizRuleFacade; + + public List listBizRules(TpBizRuleQueryDTO queryDTO) { + TpResult> result = bizRuleFacade.listBizRule(queryDTO); + if (!result.isSuccess()) { + LogUtil.error("查询业务规则失败,入参:{},失败原因:{}", JSONUtil.toJsonStr(queryDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return result.getData(); + } + + public TpRuleExecuteResultVO executeRule(TpRuleExecuteDTO bizRuleExecute) { + TpResult> result = bizRuleFacade.executeBizRule(bizRuleExecute); + if (!result.isSuccess()) { + LogUtil.error("调用规则执行接口异常,入参为:{},失败原因为:{}", JSONUtil.toJsonStr(bizRuleExecute), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return result.getData(); + } + + public TpRuleExecuteBatchResultVO batchExecuteBizRule(List> bizRuleExecuteList) { + TpResult> result = bizRuleFacade.batchExecuteBizRule(bizRuleExecuteList); + if (!result.isSuccess()) { + LogUtil.error("调用规则执行接口异常,入参为:{},失败原因为:{}", JSONUtil.toJsonStr(bizRuleExecuteList), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return result.getData(); + } + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpBusClient.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpBusClient.java new file mode 100644 index 0000000..204c675 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpBusClient.java @@ -0,0 +1,38 @@ +package com.deepinnet.tptradeprod.common.service.integration.client; + +import com.deepinnet.tenant.util.CommonTenantIdUtil; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tpbaseopcore.common.dto.bus.TpBusDynDTO; +import com.deepinnet.tpbaseopcore.common.service.facade.TpBusFacade; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.convert.TpBusDynConvert; +import com.deepinnet.tptradeprod.common.service.integration.entity.TpBusDyn; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * Creator zengjuerui + * Date 2024-01-19 + **/ + +@Component +public class TpBusClient { + + @DubboReference + private TpBusFacade tpBusFacade; + @Resource + private TpBusDynConvert tpBusDynConvert; + + + public TpBusDyn getBusDynByPlate(String busPlate, String tenantId) { + TpResult tpResult = tpBusFacade.getBusDynByPlate(busPlate, tenantId); + if(!tpResult.isSuccess()) { + throw new TpTradeProdException(TpTradeProdErrorCode.INTERNAL_SERVER_ERROR, tpResult.getErrorDesc()); + } + + return tpBusDynConvert.dtoToDomain(tpResult.getData()); + } +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpConfigClient.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpConfigClient.java new file mode 100644 index 0000000..6813873 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpConfigClient.java @@ -0,0 +1,78 @@ +package com.deepinnet.tptradeprod.common.service.integration.client; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson2.JSON; +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpconfigcore.common.dto.TpConfigItemQueryDTO; +import com.deepinnet.tpconfigcore.common.enums.*; +import com.deepinnet.tpconfigcore.common.service.facade.TpConfigItemFacade; +import com.deepinnet.tpconfigcore.common.vo.TpConfigItemVO; +import com.deepinnet.tptradecore.common.error.TpTradeCoreErrorCode; +import com.deepinnet.tptradecore.common.exception.TpTradeCoreException; +import com.deepinnet.tptradeprod.common.service.integration.entity.TpConfigItemMultiValue; +import com.deepinnet.tptradeprod.common.service.integration.entity.TpConfigItemSingleValue; +import com.google.common.collect.Lists; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * @author amos wong + * @create 2023/10/19 10:57 + * @Description + */ +@Service +public class TpConfigClient { + + @DubboReference + private TpConfigItemFacade tpConfigItemFacade; + + public List getFixedConfigValue(String tenantId, String categoryCode, String configItemKey) { + TpResult tpResult = tpConfigItemFacade.getConfigItem(TargetTypeEnum.BACK_CATEGORY.name(), categoryCode, tenantId, configItemKey); + if (!tpResult.isSuccess()) { + LogUtil.error("从交付工厂获取配置失败:{},{}", tpResult.getErrorCode(), tpResult.getErrorDesc()); + throw new TpException(tpResult.getErrorCode(), tpResult.getErrorDesc()); + } + + TpConfigItemVO data = tpResult.getData(); + if (StrUtil.equals(data.getType(),ConfigItemTypeEnum.SINGLE_CHOICE.name()) || StrUtil.equals(data.getType(),ConfigItemTypeEnum.INPUT.name())) { + TpConfigItemSingleValue configValue = JSON.parseObject(data.getProdConfigItemInstance().getValue(), TpConfigItemSingleValue.class); + return Lists.newArrayList(configValue.getSettingValue()); + } + + if (StrUtil.equals(data.getType(),ConfigItemTypeEnum.MULTI_CHOICE.name())) { + TpConfigItemMultiValue configValue = JSON.parseObject(data.getProdConfigItemInstance().getValue(), TpConfigItemMultiValue.class); + return configValue.getSettingValue(); + } + + throw new TpTradeCoreException(TpTradeCoreErrorCode.INVALID_CONFIG_TYPE); + } + + public List queryConfigItemByCodes(String tenantId, List itemCodes){ + + TpResult> tpResult = tpConfigItemFacade.queryConfigItemByCodes(TargetTypeEnum.TENANT.name(), tenantId, tenantId,itemCodes); + if (!tpResult.isSuccess()) { + LogUtil.error("从交付工厂获取配置失败:{},{}", tpResult.getErrorCode(), tpResult.getErrorDesc()); + throw new TpException(tpResult.getErrorCode(), tpResult.getErrorDesc()); + } + + if(CollectionUtil.isEmpty(tpResult.getData())) { + throw new TpTradeCoreException(TpTradeCoreErrorCode.INVALID_CONFIG_TYPE); + } + return tpResult.getData(); + + } + +} + + + + + + diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpContractClient.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpContractClient.java new file mode 100644 index 0000000..e591c2a --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpContractClient.java @@ -0,0 +1,93 @@ +package com.deepinnet.tptradeprod.common.service.integration.client; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.page.CommonPage; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.contract.*; +import com.deepinnet.tptradecore.common.dto.voucher.TpVoucherDTO; +import com.deepinnet.tptradecore.common.service.facade.contract.TpContractFacade; +import com.deepinnet.tptradecore.common.vo.contract.*; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.service.integration.convert.*; +import com.deepinnet.tptradeprod.common.vo.*; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author amos wong + * @create 2023/9/8 16:27 + * @Description + */ +@Component +public class TpContractClient { + + @DubboReference + private TpContractFacade contractFacade; + + @Resource + private TpContractConverter contractConverter; + + @Resource + private TpVoucherConverter voucherConverter; + + public String refundTicket(TpProdRefundApplyDTO refundApplyDTO) { + TpResult result = contractFacade.refundTicket(contractConverter.convert2RefundApplyDTO(refundApplyDTO)); + if (!result.isSuccess()) { + LogUtil.error("调用退票接口失败,入参:{},原因:{}", JSONUtil.toJsonStr(refundApplyDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return result.getData(); + } + + public List queryAvailableRefundVoucherList(TpProdQueryAvailableRefundVoucherDTO availableVoucherDTO) { + TpResult> result = contractFacade.queryAvailableRefundVoucherList(contractConverter.convert2QueryAvailableRefundVoucherDTO(availableVoucherDTO)); + if (!result.isSuccess()) { + LogUtil.error("查询可退凭证失败,入参:{},原因:{}", JSONUtil.toJsonStr(availableVoucherDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return voucherConverter.convert2ProdVoucherDTOs(result.getData()); + } + + public CommonPage pageQueryApplyRefundOrders(TpProdPageQueryRefundApplyOrderDTO queryDTO) { + TpResult> result = contractFacade.pageQueryApplyRefundOrders(contractConverter.convert2PageQueryApplyRefundOrders(queryDTO)); + if (!result.isSuccess()) { + LogUtil.error("分页查询退票申请单失败,入参:{},原因:{}", JSONUtil.toJsonStr(queryDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + return contractConverter.convert2PageProdRefundApplyOrderDTO(result.getData()); + } + + public List getRefundApplyOrderList(TpProdQueryRefundApplyOrderDTO queryDTO) { + TpResult> result = contractFacade.getRefundApplyOrderList(contractConverter.convert2QueryRefundApplyOrderDTO(queryDTO)); + if (!result.isSuccess()) { + LogUtil.error("查询退票申请单列表失败,入参:{},原因:{}", JSONUtil.toJsonStr(queryDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + return contractConverter.convert2ProdRefundApplyOrderDTO(result.getData()); + } + + public TpProdQueryRefundDetailVO getRefundDetail(TpProdQueryRefundDetailDTO queryDTO) { + TpResult result = contractFacade.getRefundDetail(contractConverter.convert2QueryRefundDetailDTO(queryDTO)); + if (!result.isSuccess()) { + LogUtil.error("查询退票详情失败,入参:{},原因:{}", JSONUtil.toJsonStr(queryDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return contractConverter.convert2ProdQueryRefundDetailVO(result.getData()); + } + + public Boolean refundTicketSuccess(String refundApplyOrderNo, String tenantId) { + TpRefundTicketSuccessDTO refundTicketSuccessDTO = new TpRefundTicketSuccessDTO(); + refundTicketSuccessDTO.setRefundApplyOrderNo(refundApplyOrderNo); + refundTicketSuccessDTO.setTenantId(tenantId); + TpResult result = contractFacade.refundTicketSuccess(refundTicketSuccessDTO); + return result.getData(); + } +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpInquireClient.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpInquireClient.java new file mode 100644 index 0000000..0d3bdfb --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpInquireClient.java @@ -0,0 +1,70 @@ +package com.deepinnet.tptradeprod.common.service.integration.client; + +import com.alibaba.fastjson2.JSONObject; +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tp.common.lang.util.TpMoney; +import com.deepinnet.tpproductcore.common.dto.price.chartered.TpCharteredPriceInquiryDTO; +import com.deepinnet.tpproductcore.common.service.facade.priceunit.TpPriceUnitFacade; +import com.deepinnet.tpproductcore.common.vo.price.TpCharteredPriceInquiryResultVO; +import com.deepinnet.tpproductcore.common.vo.price.TpPriceInquiryResultVO; +import com.deepinnet.tptradeprod.common.dto.TpProdPriceInquireDTO; +import com.deepinnet.tptradeprod.common.service.integration.convert.TpPricingInquireConverter; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; + +/** + *

+ * + *

+ * + * @author chenjiaju + * @since 2023/9/8 + */ + +@Component +public class TpInquireClient { + + @DubboReference + private TpPriceUnitFacade tpPriceUnitFacade; + + @Resource + private TpPricingInquireConverter tpPricingInquireConverter; + + public TpPriceInquiryResultVO inquirePrice(List dtoList) { + TpResult result = tpPriceUnitFacade.inquiryPrice(tpPricingInquireConverter.convert2PriceInquireDTOs(dtoList)); + + if (!result.isSuccess()) { + LogUtil.error("询价错误, 错误参数:{}, 错误详情:{}", JSONObject.toJSONString(dtoList), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return result.getData(); + } + + public TpCharteredPriceInquiryResultVO inquiryCharteredPrice(List charteredPriceInquiryDTOS) { + TpResult result = tpPriceUnitFacade.inquiryCharteredPrice(charteredPriceInquiryDTOS); + + if (!result.isSuccess()) { + LogUtil.error("预约包车询价错误, 错误参数:{}, 错误详情:{}", JSONObject.toJSONString(charteredPriceInquiryDTOS), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return result.getData(); + } + + public TpMoney inquiryMinPrice(List charteredPriceInquiryDTOS) { + TpResult result = tpPriceUnitFacade.inquiryMinPrice(charteredPriceInquiryDTOS); + + if (!result.isSuccess()) { + LogUtil.error("预约包车最低价询价错误, 错误参数:{}, 错误详情:{}", JSONObject.toJSONString(charteredPriceInquiryDTOS), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return result.getData(); + } +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpInventoryClient.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpInventoryClient.java new file mode 100644 index 0000000..2251f19 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpInventoryClient.java @@ -0,0 +1,39 @@ +package com.deepinnet.tptradeprod.common.service.integration.client; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpproductcore.common.dto.inventory.TpInventoryOperationDTO; +import com.deepinnet.tpproductcore.common.service.facade.inventory.TpInventoryFacade; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + *

+ * 产品 + *

+ * + * @author chenjiaju + * @since 2023/9/5 + */ + +@Component +public class TpInventoryClient { + + @DubboReference + private TpInventoryFacade inventoryFacade; + + public void batchOperateInventory(List operations) { + LogUtil.info("批量操作库存,入参为:{}", JSONUtil.toJsonStr(operations)); + TpResult result = inventoryFacade.batchOperateInventory(operations); + if (!result.isSuccess()) { + LogUtil.error("批量操作库存失败,原因:{},入参:{}", result.getErrorDesc(), JSONUtil.toJsonStr(operations)); + throw new TpTradeProdException(TpTradeProdErrorCode.STOCK_REDUCE_ERROR, result.getErrorDesc()); + } + } +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpOrderChangeApplyClient.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpOrderChangeApplyClient.java new file mode 100644 index 0000000..e9ebe02 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpOrderChangeApplyClient.java @@ -0,0 +1,193 @@ +package com.deepinnet.tptradeprod.common.service.integration.client; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.order.TpOrderChangeApplyLatestDetailDTO; +import com.deepinnet.tptradecore.common.dto.order.TpOrderChangeApplyListDTO; +import com.deepinnet.tptradecore.common.enums.order.TpOrderChangeTypeEnum; +import com.deepinnet.tptradecore.common.service.facade.order.TpOrderChangedApplyFacade; +import com.deepinnet.tptradecore.common.vo.order.TpOrderChangeApplyVO; +import com.deepinnet.tptradecore.common.vo.order.TpOrderChangeItemVO; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.service.integration.convert.TpOrderChangeApplyConverter; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderChangeApplyDetailVO; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderChangeApplyListVO; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderChangeItemVO; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import javax.validation.constraints.NotNull; +import java.util.Arrays; +import java.util.List; + +/** + * @author xiehuaqiao + * @create 2023/9/2 14:36 + * @Description + */ +@Component +public class TpOrderChangeApplyClient { + + @DubboReference + private TpOrderChangedApplyFacade orderChangedApplyFacade; + + @Resource + private TpOrderChangeApplyConverter tpOrderChangeApplyConverter; + + /** + * 查询指定订单变更申请单详情 + * + * @param orderChangeApplyQueryDTO + * @return + */ + public TpProdOrderChangeApplyDetailVO getOrderChangedApplyDetail(@NotNull(message = "入参不能为空") TpProdOrderChangeApplyDetailDTO orderChangeApplyQueryDTO){ + TpResult result = orderChangedApplyFacade.getOrderChangedApplyDetail(tpOrderChangeApplyConverter.convert2DTO(orderChangeApplyQueryDTO)); + if (!result.isSuccess()) { + LogUtil.error("调用订单变更申请单详情查询失败,入参:{},原因:{}", JSONUtil.toJsonStr(orderChangeApplyQueryDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return tpOrderChangeApplyConverter.convert2VO(result.getData()); + } + + + /** + * 查询指定申请单对应的变更项信息 + * + * @param orderChangeItemListDTO + * @return + */ + public List listOrderChangedItems(@NotNull(message = "入参不能为空") TpProdOrderChangeItemListDTO orderChangeItemListDTO){ + TpResult> result = orderChangedApplyFacade.listOrderChangedItems(tpOrderChangeApplyConverter.convert2ItemDTO(orderChangeItemListDTO)); + if (!result.isSuccess()) { + LogUtil.error("调用订单变更申请单详情查询失败,入参:{},原因:{}", JSONUtil.toJsonStr(orderChangeItemListDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return tpOrderChangeApplyConverter.convert2ItemVOList(result.getData()); + } + + + /** + * 创建订单变更申请单:申请订单变更 + * + * @param orderChangeApplyCreatedDTO + * @return + */ + public Boolean createOrderChangeApply(@NotNull(message = "入参不能为空") TpProdOrderChangeApplyCreatedDTO orderChangeApplyCreatedDTO){ + TpResult result = orderChangedApplyFacade.createOrderChangeApply(tpOrderChangeApplyConverter.convert2ApplyCreateDTO(orderChangeApplyCreatedDTO)); + if (!result.isSuccess()) { + LogUtil.error("调用创建订单变更申请单接口失败,入参:{},原因:{}", JSONUtil.toJsonStr(orderChangeApplyCreatedDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return result.getData(); + } + + + + /** + * 提交申请单审核结果 + * @param approvedSubmitDTO + * @return + */ + public Boolean submitApprovedResult(@NotNull(message = "入参不能为空") TpProdOrderChangeApplyApprovedResultSubmitDTO approvedSubmitDTO){ + TpResult result = orderChangedApplyFacade.submitApprovedApply(tpOrderChangeApplyConverter.convert2ApplyApprovedSubmitDTO(approvedSubmitDTO)); + if (!result.isSuccess()) { + LogUtil.error("调用提交申请单审核结果接口失败,入参:{},原因:{}", JSONUtil.toJsonStr(approvedSubmitDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return result.getData(); + } + + + /** + * 提交服务费减免申请 + * @param rscApplyDTO + * @return + */ + public Boolean submitReduceServiceChargeApply(@NotNull(message = "入参不能为空") TpProdOrderChangeApplySubmitRscApplyDTO rscApplyDTO){ + TpResult result = orderChangedApplyFacade.submitReduceFscApply(tpOrderChangeApplyConverter.convert2RscApplyDTO(rscApplyDTO)); + if (!result.isSuccess()) { + LogUtil.error("调用提交服务费减免申请接口失败,入参:{},原因:{}", JSONUtil.toJsonStr(rscApplyDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return result.getData(); + } + + + + /** + * 推进订单变更申请单状态变化 + * + * @param statusUpdateDTO + * @return + */ + public Boolean pushOrderChangedApplyStatus(@NotNull(message = "入参不能为空") TpProdOrderChangeApplyStatusUpdateDTO statusUpdateDTO){ + TpResult result = orderChangedApplyFacade.pushOrderChangedApplyStatus(tpOrderChangeApplyConverter.convert2StatusUpdateDTO(statusUpdateDTO)); + if (!result.isSuccess()) { + LogUtil.error("调用推进订单变更申请单状态变化接口失败,入参:{},原因:{}", JSONUtil.toJsonStr(statusUpdateDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return result.getData(); + } + + + /** + * B端订单详情查询场景使用:只查询变更和取消的记录 + * @param dto + * @return + */ + public List listOrderChangeApplyHistory(TpProdOrderChangeApplyListDTO dto) { + return listOrderChangeApplyHistory(dto, Arrays.asList(TpOrderChangeTypeEnum.ORDER_CHANGE.getType(), TpOrderChangeTypeEnum.ORDER_CANCEL.getType())); + } + + /** + * B端订单详情查询场景使用:只查询订单结束确认费用的记录 + * @param dto + * @return + */ + public TpProdOrderChangeApplyListVO getOrderEndTripChangeChargeRecord(TpProdOrderChangeApplyListDTO dto) { + List tpProdOrderChangeApplyListVOS = listOrderChangeApplyHistory(dto, Arrays.asList(TpOrderChangeTypeEnum.ORDER_END_CHARGE_CONFIRM.getType())); + if (CollectionUtils.isNotEmpty(tpProdOrderChangeApplyListVOS)) { + return tpProdOrderChangeApplyListVOS.get(0); + } else { + return null; + } + } + + /** + * B端订单变更审核场景使用:只查询变更和取消的记录 + * @param dto + * @return + */ + public TpProdOrderChangeApplyListVO getLatestOrderChangeApplyDetail(TpProdOrderChangeApplyListDTO dto) { + TpOrderChangeApplyLatestDetailDTO latestDetailDTO = tpOrderChangeApplyConverter.convert2DTO(dto); + latestDetailDTO.setApplyTypes(Arrays.asList(TpOrderChangeTypeEnum.ORDER_CHANGE.getType(),TpOrderChangeTypeEnum.ORDER_CANCEL.getType())); + TpResult result = orderChangedApplyFacade.getLatestOrderChangedApplyDetail(tpOrderChangeApplyConverter.convert2DTO(dto)); + if (!result.isSuccess()) { + LogUtil.error("调用订单变更申请单详情查询失败,入参:{},原因:{}", JSONUtil.toJsonStr(dto), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return tpOrderChangeApplyConverter.convert2ApplyListVO(result.getData()); + } + + private List listOrderChangeApplyHistory(TpProdOrderChangeApplyListDTO dto, List applyTypes) { + TpOrderChangeApplyListDTO applyListDTO = tpOrderChangeApplyConverter.convert2ApplyListDTO(dto); + applyListDTO.setApplyTypes(applyTypes); + TpResult> result = orderChangedApplyFacade.listOrderChangeApply(applyListDTO); + if (!result.isSuccess()) { + LogUtil.error("调用订单变更申请单详情查询失败,入参:{},原因:{}", JSONUtil.toJsonStr(dto), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + return tpOrderChangeApplyConverter.convert2ApplyListVOList(result.getData()); + } +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpOrderClient.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpOrderClient.java new file mode 100644 index 0000000..cc35526 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpOrderClient.java @@ -0,0 +1,376 @@ +package com.deepinnet.tptradeprod.common.service.integration.client; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson2.JSONObject; +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.page.CommonPage; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.order.*; +import com.deepinnet.tptradecore.common.service.facade.order.TpOrderFacade; +import com.deepinnet.tptradecore.common.vo.order.*; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.enums.TpOrderTypeEnum; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.convert.TpOrderConverter; +import com.deepinnet.tptradeprod.common.vo.TpOrderListVO; +import com.deepinnet.tptradeprod.common.vo.*; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author amos wong + * @create 2023/9/2 14:36 + * @Description + */ +@Component +public class TpOrderClient { + + @DubboReference + private TpOrderFacade orderFacade; + + @Resource + private TpOrderConverter orderConverter; + + /** + * 创建订单 + * + * @param dto 下单参数 + * @return 创建订单结果VO + */ + public TpProdOrderCreateVO createOrder(TpProdOrderCreateDTO dto) { + TpResult result = orderFacade.createOrder(orderConverter.convert2OrderCreateDTO(dto)); + if (!result.isSuccess()) { + LogUtil.error("用户创建订单异常,入参为:{},异常信息为:{}", JSONUtil.toJsonStr(dto), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return orderConverter.convert2ProdOrderCreateVO(result.getData()); + } + + /** + * 定制公交改签 + * + * @param dto 下单参数 + * @return 创建订单结果VO + */ + public TpProdOrderCreateVO rescheduleOrder(TpProdOrderRescheduleDTO dto) { + TpResult result = orderFacade.rescheduleOrder(orderConverter.convert2OrderRescheduleDTO(dto)); + if (!result.isSuccess()) { + LogUtil.error("用户改签订单异常,入参为:{},异常信息为:{}", JSONUtil.toJsonStr(dto), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return orderConverter.convert2ProdOrderCreateVO(result.getData()); + } + + /** + * 改签订单 + * + * @param dto 改签订单参数 + * @return 订单改签结果VO + */ + public TpProdOrderEndorseCreateVO endorseOrder(TpProdOrderCreateDTO dto) { + TpResult result = orderFacade.endorseOrder(orderConverter.convert2OrderCreateDTO(dto)); + if (!result.isSuccess()) { + LogUtil.error("用户创建改签订单异常,入参为:{},异常信息为:{}", JSONUtil.toJsonStr(dto), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return orderConverter.convert2ProdOrderEndorseVO(result.getData()); + } + + /** + * 预支付 + * + * @param dto 预支付参数 + * @return 收银台相关参数 + */ + public TpProdOrderPayVO payOrder(TpProdOrderPayDTO dto) { + TpResult result = orderFacade.payOrder(orderConverter.convert2PayOrderDTO(dto)); + if (!result.isSuccess()) { + LogUtil.error("用户预支付异常,入参为:{},异常信息为:{}", JSONUtil.toJsonStr(dto), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return orderConverter.convert2ProdPayOrderVO(result.getData()); + } + + public TpProdOrderPaidVO paid(TpProdOrderPaidDTO dto) { + TpResult result = orderFacade.paid(orderConverter.convert2OrderPaidDTO(dto)); + if (!result.isSuccess()) { + LogUtil.error("已支付推进订单状态接口执行异常,入参为:{},异常信息为:{}", JSONUtil.toJsonStr(dto), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return orderConverter.convert2ProdPaidOrderVO(result.getData()); + } + + public TpProdOrderDetailVO getOrderDetail(TpProdOrderQueryDTO dto) { + TpResult orderDetail = orderFacade.getOrderDetail(orderConverter.convert2OrderQueryDTO(dto)); + if (!orderDetail.isSuccess()) { + LogUtil.error("订单详情查询异常,入参为:{},异常信息为:{}", JSONUtil.toJsonStr(dto), orderDetail.getErrorDesc()); + throw new TpException(orderDetail.getErrorCode(), orderDetail.getErrorDesc()); + } + + return orderConverter.convert2ProdOrderDetailVO(orderDetail.getData()); + } + + public Boolean pushOrderStatus(TpOrderPushStatusDTO dto) { + TpResult booleanTpResult = orderFacade.pushOrderStatus(dto); + + if (!booleanTpResult.isSuccess()) { + LogUtil.error("订单状态推进失败, 入参:{}, 异常信息: {}", JSONObject.toJSONString(dto), booleanTpResult.getErrorDesc()); + throw new TpException(booleanTpResult.getErrorCode(), booleanTpResult.getErrorDesc()); + } + + return booleanTpResult.getData(); + } + + public Long orderCount(TpOrderCountQueryDTO query) { + TpResult longTpResult = orderFacade.queryOrderCount(query); + if (!longTpResult.isSuccess()) { + LogUtil.error("订单数量查询失败, 入参:{}, 异常信息: {}", JSONObject.toJSONString(query), longTpResult.getErrorDesc()); + throw new TpException(longTpResult.getErrorCode(), longTpResult.getErrorDesc()); + } + return longTpResult.getData(); + } + + public CommonPage getOrderList(TpProdOrderListQueryDTO dto) { + TpOrderListQueryDTO tpOrderListQueryDTO = new TpOrderListQueryDTO(); + tpOrderListQueryDTO.setPlacerNo(dto.getPlacerNo()); + tpOrderListQueryDTO.setPosCardNo(dto.getPosCardNo()); + tpOrderListQueryDTO.setTpOrderStatusEnum(dto.getTpOrderStatusEnum()); + tpOrderListQueryDTO.setTenantId(dto.getTenantId()); + tpOrderListQueryDTO.setPageNum(dto.getPageNum()); + tpOrderListQueryDTO.setPageSize(dto.getPageSize()); + tpOrderListQueryDTO.setDepartureTime(dto.getDepartureTime()); + tpOrderListQueryDTO.setOrderType(dto.getOrderType()); + + TpResult> commonPageTpResult; + + if (ObjectUtil.equals(dto.getOrderType(), TpOrderTypeEnum.CUSTOMIZED_ORDER.getType()) || ObjectUtil.equals(dto.getOrderType(), TpOrderTypeEnum.CARPOOL_ORDER.getType())) { + commonPageTpResult = orderFacade.orderList(tpOrderListQueryDTO); + } else { + commonPageTpResult = orderFacade.charterBusOrderListToC(tpOrderListQueryDTO); + } + + if (!commonPageTpResult.isSuccess()) { + LogUtil.error("订单列表查询失败, 查询参数:{}, 错误码:{}, 错误信息:{}", JSONObject.toJSONString(dto), commonPageTpResult.getErrorCode(), commonPageTpResult.getErrorDesc()); + throw new TpException(commonPageTpResult.getErrorCode(), commonPageTpResult.getErrorDesc()); + } + + return orderConverter.convert2OrderListVO(commonPageTpResult.getData()); + } + + public List batchQueryListByOriginalOrderNo(List originalOrderNoList, String tenantId) { + + TpBatchQueryOrderDTO dto = TpBatchQueryOrderDTO.builder().build(); + dto.setOriginalOrderNos(originalOrderNoList); + dto.setTenantId(tenantId); + TpResult> commonResult = orderFacade.batchQueryListByOriginalOrderNo(dto); + + if (!commonResult.isSuccess()) { + LogUtil.error("订单列表查询失败, 查询参数:{}, 错误码:{}, 错误信息:{}", JSONUtil.toJsonStr(dto), commonResult.getErrorCode(), commonResult.getErrorDesc()); + throw new TpException(commonResult.getErrorCode(), commonResult.getErrorDesc()); + } + + return orderConverter.convert2OrderListVO(commonResult.getData()); + } + + public Integer getUserBuyTickets(TpUserTicketsQueryDTO dto) { + TpResult result = orderFacade.queryUserTickets(dto); + + if (!result.isSuccess()) { + LogUtil.error("获取用户购买的票失败, 查询参数:{}, 错误码:{}, 错误信息:{}", JSONObject.toJSONString(dto), result.getErrorCode(), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return result.getData(); + } + + public boolean createDepositOrder(TpDepositOrderDTO dto) { + TpResult depositOrder = orderFacade.createDepositOrder(dto); + + if (!depositOrder.isSuccess()) { + LogUtil.error("创建订金订单异常, 参数:{}, 错误码:{}, 错误信息:{}", JSONObject.toJSONString(dto), depositOrder.getErrorCode(), depositOrder.getErrorDesc()); + throw new TpException(depositOrder.getErrorCode(), depositOrder.getErrorDesc()); + } + + return depositOrder.getData(); + } + + public boolean createBalanceOrder(TpBalanceOrderDTO dto) { + TpResult balanceOrder = orderFacade.createBalanceOrder(dto); + + if (!balanceOrder.isSuccess()) { + LogUtil.error("创建尾款订单异常, 参数:{}, 错误码:{}, 错误信息:{}", JSONObject.toJSONString(dto), balanceOrder.getErrorCode(), balanceOrder.getErrorDesc()); + throw new TpException(balanceOrder.getErrorCode(), balanceOrder.getErrorDesc()); + } + + return balanceOrder.getData(); + } + + public boolean updateChargeRecord(TpOrderChargeRecordDTO dto) { + TpResult result = orderFacade.updateChargeRecord(dto); + if (!result.isSuccess()) { + LogUtil.error("更新订单费用记录异常, 错误码:{}, 错误信息:{}", result.getErrorCode(), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return result.getData(); + } + + public boolean saveChargeRecord(TpOrderChargeRecordDTO dto) { + TpResult result = orderFacade.saveChargeRecord(dto); + if (!result.isSuccess()) { + LogUtil.error("保存订单费用记录异常, 错误码:{}, 错误信息:{}", result.getErrorCode(), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return result.getData(); + } + + public boolean removeChargeRecord(TpOrderChargeRecordDTO dto) { + TpResult result = orderFacade.removeChargeRecord(dto); + if (!result.isSuccess()) { + LogUtil.error("删除订单费用记录异常, 错误码:{}, 错误信息:{}", result.getErrorCode(), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return result.getData(); + } + + public boolean changePriceAndPayMode(TpOrderChangePriceDTO dto) { + TpResult result = orderFacade.changePriceAndPayMode(dto); + if (!result.isSuccess()) { + LogUtil.error("改价 / 改支付模式异常, 原始订单编号:{}, 错误码:{}, 错误信息:{}", dto.getOriginalOrderNo(), result.getErrorCode(), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return result.getData(); + } + + public boolean updateOrderNotVisible(String orderNo, String tenantId) { + TpResult result = orderFacade.updateOrderNotVisible(TpOrderUpdateDTO.builder().orderNo(orderNo).tenantId(tenantId).build()); + + if (!result.isSuccess()) { + LogUtil.error("订单更改为不可见异常, 错误码:{}, 错误信息:{}", result.getErrorCode(), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return result.getData(); + } + + public boolean syncTravelDispatchStatus(TpOrderTravelDispatchDTO dto) { + TpResult result = orderFacade.syncTravelDispatchStatus(dto); + + if (!result.isSuccess()) { + LogUtil.error("行程单状态更改失败, 错误码:{}, 错误信息:{}", result.getErrorCode(), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return result.getData(); + } + + public List querySyncedTripNos(TpOrderQueryDTO dto) { + TpResult> result = orderFacade.querySyncedTripNos(dto); + + if (!result.isSuccess()) { + LogUtil.error("行程单编号查询失败, 错误码:{}, 错误信息:{}", result.getErrorCode(), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return result.getData(); + } + + public Long queryCustomOrderCount(TpProdOrderListQueryDTO dto) { + TpOrderListQueryDTO queryDTO = TpOrderListQueryDTO.builder().build(); + queryDTO.setPlacerNo(dto.getPlacerNo()); + queryDTO.setTpOrderStatusEnum(dto.getTpOrderStatusEnum()); + queryDTO.setTenantId(dto.getTenantId()); + + TpResult result = orderFacade.queryCustomBusOrderCount(queryDTO); + + if (!result.isSuccess()) { + LogUtil.error("订单数量查询失败:{}", result.getErrorCode(), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return result.getData(); + } + + public Boolean endTripPriceConfirm(TpOrderEndPriceConfirmDTO dto) { + TpResult result = orderFacade.endTripPriceConfirm(dto); + if(!result.isSuccess()) { + LogUtil.error("行程结束确认费用失败, 错误码:{}, 错误信息:{}", result.getErrorCode(), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + return result.getData(); + } + + public Boolean checkSuccessCallback(TpCheckSuccessCallbackDTO checkSuccessCallbackDTO) { + TpResult result = orderFacade.checkSuccessCallback(checkSuccessCallbackDTO); + if (!result.isSuccess()) { + LogUtil.error("检票核销回调处理失败:{},入参为:{}", result.getErrorDesc(), JSONUtil.toJsonStr(checkSuccessCallbackDTO)); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return result.getData(); + } + + public CommonPage getPadCarpoolOrderList(TpProdOrderListQueryDTO dto) { + TpOrderListQueryDTO tpOrderListQueryDTO = new TpOrderListQueryDTO(); + tpOrderListQueryDTO.setPlacerNo(dto.getPlacerNo()); + tpOrderListQueryDTO.setPosCardNo(dto.getPosCardNo()); + tpOrderListQueryDTO.setTpOrderStatusEnum(dto.getTpOrderStatusEnum()); + tpOrderListQueryDTO.setTenantId(dto.getTenantId()); + tpOrderListQueryDTO.setPageNum(dto.getPageNum()); + tpOrderListQueryDTO.setPageSize(dto.getPageSize()); + tpOrderListQueryDTO.setDepartureTime(dto.getDepartureTime()); + + TpResult> commonPageTpResult = orderFacade.padCarpoolOrderList(tpOrderListQueryDTO); + + if (!commonPageTpResult.isSuccess()) { + LogUtil.error("订单列表查询失败, 查询参数:{}, 错误码:{}, 错误信息:{}", JSONObject.toJSONString(dto), commonPageTpResult.getErrorCode(), commonPageTpResult.getErrorDesc()); + throw new TpException(commonPageTpResult.getErrorCode(), commonPageTpResult.getErrorDesc()); + } + + return orderConverter.convert2OrderListVO(commonPageTpResult.getData()); + } + + public void cancelCarpoolOrder(TpCancelCarpoolDTO dto){ + TpResult booleanTpResult = orderFacade.cancelOrCarpoolFailOrder(dto); + + if (!booleanTpResult.isSuccess()) { + LogUtil.error("拼车单取消失败, 错误码:{}, 错误信息:{}", booleanTpResult.getErrorCode(), booleanTpResult.getErrorDesc()); + throw new TpException(booleanTpResult.getErrorCode(), booleanTpResult.getErrorDesc()); + } + + if (!booleanTpResult.getData()) { + LogUtil.error("拼车取消失败, 错误码:{}, 错误信息:{}", TpTradeProdErrorCode.ORDER_CANCEL_ERROR.getCode(), TpTradeProdErrorCode.ORDER_CANCEL_ERROR.getDesc()); + throw new TpTradeProdException(TpTradeProdErrorCode.ORDER_CANCEL_ERROR); + } + } + + /** + * 查询当前刷卡流水号是否存在 + * @param dto 查询入参 + * @return 存在返回true, 不存在返回false + */ + public boolean querySwipeCardNoExist(TpOrderSwipeQueryDTO dto) { + TpResult result = orderFacade.querySwipeCardNoExist(dto); + + if (!result.isSuccess()) { + LogUtil.error("查询刷卡卡号是否存在失败, 入参:{}, 错误码:{}, 错误信息:{}", JSONObject.toJSONString(dto), result.getErrorCode(), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return result.getData(); + } +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpOrderDispatchClient.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpOrderDispatchClient.java new file mode 100644 index 0000000..e63f250 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpOrderDispatchClient.java @@ -0,0 +1,183 @@ +package com.deepinnet.tptradeprod.common.service.integration.client; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson2.JSONObject; +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.order.*; +import com.deepinnet.tptradecore.common.service.facade.order.TpOrderDispatchFacade; +import com.deepinnet.tptradecore.common.vo.order.TpOrderDispatchVO; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.convert.TpOrderDispatchConverter; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDispatchDetailVO; +import org.apache.commons.lang3.StringUtils; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @author xiehuaqiao + * @create 2023/11/20 14:36 + * @Description + */ +@Component +public class TpOrderDispatchClient { + + + @DubboReference + private TpOrderDispatchFacade tpOrderDispatchFacade; + + @Resource + private TpOrderDispatchConverter orderDispatchConverter; + + /** + * 分配订单接口 + * + * @param prodOrderDispatchCreatedDTO + * @return + */ + public Boolean dispatchOrder(TpProdOrderDispatchCreatedDTO prodOrderDispatchCreatedDTO) { + + TpOrderDispatchCreatedDTO tpOrderDispatchCreatedDTO = orderDispatchConverter.convert2DTO(prodOrderDispatchCreatedDTO); + + TpResult result = tpOrderDispatchFacade.dispatchOrder(tpOrderDispatchCreatedDTO); + if (!result.isSuccess()) { + LogUtil.error("调用订单派单创建接口失败,入参:{},原因:{}", JSONUtil.toJsonStr(prodOrderDispatchCreatedDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + if (!result.getData()) { + LogUtil.error("订单分配, 订单号:{}, 创建派单参数:{}", prodOrderDispatchCreatedDTO.getOrderNo(), JSONObject.toJSONString(prodOrderDispatchCreatedDTO)); + throw new TpException(TpTradeProdErrorCode.ORDER_DISTRIBUTE_ERROR.getCode(), TpTradeProdErrorCode.ORDER_DISTRIBUTE_ERROR.getDesc()); + } + + return result.getData(); + } + + + /** + * 查询指定订单派单详情 + * + * @param orderDispatchDetailDTO + * @return + */ + public TpProdOrderDispatchDetailVO getOrderDispatchDetail(@NotNull(message = "入参不能为空") TpProdOrderDispatchDetailDTO orderDispatchDetailDTO) { + TpResult result = tpOrderDispatchFacade.getOrderDispatchDetail(orderDispatchConverter.convert2DTO(orderDispatchDetailDTO)); + if (!result.isSuccess()) { + LogUtil.error("调用订单派单详情查询失败,入参:{},原因:{}", JSONUtil.toJsonStr(orderDispatchDetailDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + if (ObjectUtil.isNull(result.getData())) { + LogUtil.error("派单详情查询失败, 入参:{}", JSONUtil.toJsonStr(orderDispatchDetailDTO)); + throw new TpException(TpTradeProdErrorCode.ORDER_DISPATCH_ORDER_SEARCH_ERROR.getCode(), TpTradeProdErrorCode.ORDER_DISPATCH_ORDER_SEARCH_ERROR.getDesc()); + } + + return orderDispatchConverter.convert2VO(result.getData()); + } + + public String getOrgCodeFromDispatchDetail(String originalOrderNo, String tenantId) { + // 和侨总确定这里不需要传状态,只会查到一笔记录 + TpProdOrderDispatchDetailDTO orderDispatchDetailDTO = new TpProdOrderDispatchDetailDTO(); + orderDispatchDetailDTO.setOriginalOrderNo(originalOrderNo); + orderDispatchDetailDTO.setTenantId(tenantId); + TpProdOrderDispatchDetailVO orderDispatchDetail = getOrderDispatchDetail(orderDispatchDetailDTO); + if (StringUtils.isBlank(orderDispatchDetail.getTargetOrgNo())) { + LogUtil.error("从派单详情里获取orgCode失败,结果为空,入参为:{}", JSONUtil.toJsonStr(orderDispatchDetailDTO)); + throw new TpTradeProdException(TpTradeProdErrorCode.NOT_FOUND_SUCCESS_DISPATCH_RECORD); + } + + return orderDispatchDetail.getTargetOrgNo(); + } + + + public Boolean dispatchFleet(TpProdOrderDispatchFleetCreatedDTO dto) { + TpResult result = tpOrderDispatchFacade.dispatchFleet(orderDispatchConverter.convert2DTO(dto)); + if (!result.isSuccess()) { + LogUtil.error("调用订单车队分配创建接口失败,入参:{},原因:{}", JSONUtil.toJsonStr(dto), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return result.getData(); + } + + /** + * 查询派单列表详情 + * + * @param dto 查询参数 + * @return 订单列表 + */ + public List listOrderDispatchDetail(@NotNull(message = "入参不能为空") TpProdOrderDispatchListDTO dto) { + TpResult> result = tpOrderDispatchFacade.listOrderDispatchDetail(orderDispatchConverter.convert2DTO(dto)); + if (!result.isSuccess()) { + LogUtil.error("调用订单详情列表查询失败,入参:{},原因:{}", JSONUtil.toJsonStr(dto), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + if (ObjectUtil.isNull(result.getData())) { + LogUtil.error("调用订单派单列表查询失败, 入参:{}", JSONUtil.toJsonStr(dto)); + throw new TpException(TpTradeProdErrorCode.ORDER_DISPATCH_ORDER_SEARCH_ERROR.getCode(), TpTradeProdErrorCode.ORDER_DISPATCH_ORDER_SEARCH_ERROR.getDesc()); + } + + return orderDispatchConverter.convert2VOList(result.getData()); + } + + + /** + * 推进派单状态变化 + * + * @param statusUpdateDTO + * @return + */ + public Boolean pushDispatchStatus(@NotNull(message = "入参不能为空") TpProdOrderDispatchStatusUpdateDTO statusUpdateDTO) { + TpResult result = tpOrderDispatchFacade.pushDispatchStatus(orderDispatchConverter.convert2DTO(statusUpdateDTO)); + if (!result.isSuccess()) { + LogUtil.error("调用订单车队分配创建接口失败,入参:{},原因:{}", JSONUtil.toJsonStr(statusUpdateDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return result.getData(); + } + + + /** + * 派单召回 + * + * @param callBackDTO 派单召回实体 + * @return 召回结果 + */ + public Boolean callBackOrder(TpProdOrderDispatchCallBackDTO callBackDTO){ + + TpResult result = tpOrderDispatchFacade.callBackOrder(orderDispatchConverter.convert2DTO(callBackDTO)); + if (!result.isSuccess()) { + LogUtil.error("调用派单召回配创建接口失败,入参:{},原因:{}", JSONUtil.toJsonStr(callBackDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return result.getData(); + } + + /** + * 派单退回 + * + * @param giveBackDTO 派单退回实体 + * @return 退回结果 + */ + public Boolean giveBackOrder(TpProdOrderDispatchGiveBackDTO giveBackDTO){ + TpResult result = tpOrderDispatchFacade.giveBackOrder(orderDispatchConverter.convert2DTO(giveBackDTO)); + if (!result.isSuccess()) { + LogUtil.error("调用派单退回接口失败,入参:{},原因:{}", JSONUtil.toJsonStr(giveBackDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return result.getData(); + } + + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpOrderReceivedClient.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpOrderReceivedClient.java new file mode 100644 index 0000000..26211ba --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpOrderReceivedClient.java @@ -0,0 +1,72 @@ +package com.deepinnet.tptradeprod.common.service.integration.client; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.order.TpOrderReceivedCreatedDTO; +import com.deepinnet.tptradecore.common.dto.order.TpOrderReceivedDetailDTO; +import com.deepinnet.tptradecore.common.service.facade.order.TpOrderReceivedFacade; +import com.deepinnet.tptradecore.common.vo.order.TpOrderDispatchVO; +import com.deepinnet.tptradecore.common.vo.order.TpOrderReceivedVO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderReceivedCreateDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderReceivedDetailDTO; +import com.deepinnet.tptradeprod.common.service.integration.convert.TpOrderReceivedConverter; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderReceivedVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import javax.validation.constraints.NotNull; + +/** + * @author xiehuaqiao + * @create 2023/11/20 14:36 + * @Description + */ +@Component +public class TpOrderReceivedClient { + + @DubboReference + private TpOrderReceivedFacade tpOrderReceivedFacade; + + @Resource + private TpOrderReceivedConverter orderReceivedConverter; + + /** + * 业务接单接口 + * + * @param tpOrderReceiveCreatedDTO + * @return + */ + public Boolean receiveOrder(TpProdOrderReceivedCreateDTO tpOrderReceiveCreatedDTO){ + TpResult result = tpOrderReceivedFacade.receiveOrder(orderReceivedConverter.convert2DTO(tpOrderReceiveCreatedDTO)); + if (!result.isSuccess()) { + LogUtil.error("调用订单接单创建接口失败,入参:{},原因:{}", JSONUtil.toJsonStr(tpOrderReceiveCreatedDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return result.getData(); + } + + + /** + * 查询指定订单派单详情 + * + * @param orderReceivedDetailDTO + * @return + */ + public TpResult getOrderReceivedDetail(@NotNull(message = "入参不能为空") TpProdOrderReceivedDetailDTO orderReceivedDetailDTO){ + TpResult result = tpOrderReceivedFacade.getOrderReceivedDetail(orderReceivedConverter.convert2DTO(orderReceivedDetailDTO)); + if (!result.isSuccess()) { + LogUtil.error("调用订单接单详情查询失败,入参:{},原因:{}", JSONUtil.toJsonStr(orderReceivedDetailDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return TpResult.success(orderReceivedConverter.convert2VO(result.getData())); + } + + + + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpOrgClient.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpOrgClient.java new file mode 100644 index 0000000..046f827 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpOrgClient.java @@ -0,0 +1,81 @@ +package com.deepinnet.tptradeprod.common.service.integration.client; + +import cn.hutool.core.collection.CollUtil; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tpbaseopcore.common.dto.org.OrgBaseDTO; +import com.deepinnet.tpbaseopcore.common.dto.org.OrgDetailDTO; +import com.deepinnet.tpbaseopcore.common.dto.org.OrgListDTO; +import com.deepinnet.tpbaseopcore.common.service.facade.TpOrgFacade; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.stereotype.Component; + +import java.util.Collections; +import java.util.List; + +/** + * @author amos wong + * @create 2023/10/17 10:42 + * @Description + */ +@Component +public class TpOrgClient { + + @DubboReference + private TpOrgFacade orgFacade; + + /** + * 查询组织明细 + * @param orgId + * @param tenantId + * @return + */ + public OrgDetailDTO getOrgDetail(String orgId, String tenantId) { + TpResult result = orgFacade.getOrgDetail(orgId, tenantId); + if (!result.isSuccess()) { + throw new TpTradeProdException(TpTradeProdErrorCode.INTERNAL_SERVER_ERROR, result.getErrorDesc()); + } + + return result.getData(); + } + + /** + * 批量查询组织列表信息 + * @param orgIds + * @param tenantId + * @return + */ + public List listOrg(List orgIds, String tenantId) { + if(CollUtil.isEmpty(orgIds)){ + return Collections.EMPTY_LIST; + } + TpResult> result = orgFacade.listOrg(orgIds,tenantId); + if (!result.isSuccess()) { + throw new TpTradeProdException(TpTradeProdErrorCode.INTERNAL_SERVER_ERROR, result.getErrorDesc()); + } + + return result.getData(); + } + + +// /** +// * 获取当前账号下的组织信息 +// * +// * @return +// */ +// public OrgBaseDTO getTopOrgBase(String tenantId){ +// TpResult> result = orgFacade.getCurrentUserOrgBase(); +// if (!result.isSuccess()) { +// throw new TpTradeProdException(TpTradeProdErrorCode.INTERNAL_SERVER_ERROR, result.getErrorDesc()); +// } +// if(CollUtil.isEmpty(result.getData())){ +// return null; +// } +// return result.getData().stream().findFirst().orElse(null); +// +// } + + + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpPaymentClient.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpPaymentClient.java new file mode 100644 index 0000000..a3de7fd --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpPaymentClient.java @@ -0,0 +1,89 @@ +package com.deepinnet.tptradeprod.common.service.integration.client; + +import cn.hutool.json.JSONUtil; +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.trans.*; +import com.deepinnet.tptradecore.common.service.facade.trans.TpPaymentFacade; +import com.deepinnet.tptradecore.common.vo.trans.TpQueryPayResultVO; +import com.deepinnet.tptradeprod.common.dto.TpProdReschedulePaidSuccessDTO; +import com.deepinnet.tptradeprod.common.service.integration.convert.*; +import com.deepinnet.tptradeprod.common.vo.TpProdQueryPayResultVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author amos wong + * @create 2023/9/8 14:39 + * @Description + */ +@Component +public class TpPaymentClient { + + @DubboReference + private TpPaymentFacade paymentFacade; + + @Resource + private TpPaymentConvert paymentConvert; + + + public TpProdQueryPayResultVO queryPayResult(TpQueryPayResultDTO queryPayResultDTO) { + TpResult result = paymentFacade.queryPayResult(queryPayResultDTO); + if (!result.isSuccess()) { + LogUtil.error("调用查询支付结果接口失败,入参为:{},原因为:{}", JSONUtil.toJsonStr(queryPayResultDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return paymentConvert.convertPayResultVO(result.getData()); + } + + public Boolean closePayOrder(TpPayOrderCloseDTO dto) { + TpResult result = paymentFacade.closePayOrder(dto); + if (!result.isSuccess()) { + LogUtil.error("调用支付单关单接口失败,入参为:{},原因为:{}", JSONUtil.toJsonStr(dto), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return result.getData(); + } + + public Boolean refund(TpPayRefundDTO payRefundDTO) { + TpResult result = paymentFacade.refund(payRefundDTO); + if (!result.isSuccess()) { + LogUtil.error("退款失败,入参为:{},原因为:{}", JSONUtil.toJsonStr(payRefundDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return true; + } + + /** + * 改签订单支付成功接口 + * + * @return + */ + public Boolean reschedulePaidSuccess(TpProdReschedulePaidSuccessDTO prodReschedulePaidSuccessDTO) { + TpReschedulePaidSuccessDTO reschedulePaidSuccessDTO = paymentConvert.convert2TpReschedulePaidSuccessDTO(prodReschedulePaidSuccessDTO); + TpResult result = paymentFacade.reschedulePaidSuccess(reschedulePaidSuccessDTO); + if (!result.isSuccess()) { + LogUtil.error("改签支付成功接口处理失败,入参为:{},原因为:{}", JSONUtil.toJsonStr(reschedulePaidSuccessDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return true; + } + + public List getPayOrderList(TpPayOrderQueryDTO queryDTO) { + TpResult> result = paymentFacade.queryPayOrderList(queryDTO); + if (!result.isSuccess()) { + LogUtil.error("查询支付单列表失败,入参为:{},原因为:{}", JSONUtil.toJsonStr(queryDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return result.getData(); + } +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpProductClient.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpProductClient.java new file mode 100644 index 0000000..fcd2c96 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpProductClient.java @@ -0,0 +1,82 @@ +package com.deepinnet.tptradeprod.common.service.integration.client; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson2.JSONObject; +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpproductcore.common.dto.product.*; +import com.deepinnet.tpproductcore.common.enums.*; +import com.deepinnet.tpproductcore.common.qto.product.TpProductQueryDTO; +import com.deepinnet.tpproductcore.common.service.facade.product.TpProductServiceFacade; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + *

+ * 产品 + *

+ * + * @author chenjiaju + * @since 2023/9/5 + */ + +@Component +public class TpProductClient { + + @DubboReference + private TpProductServiceFacade tpProductServiceFacade; + + public TpProdDetailDTO getProduct(TpProductQueryDTO productQueryDTO) { + TpResult result = tpProductServiceFacade.getProduct(productQueryDTO); + + if (!result.isSuccess()) { + LogUtil.error("产品查询失败: {}, 错误编码:{}, 错误信息: {}", JSONObject.toJSONString(productQueryDTO), result.getErrorCode(), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + if (ObjectUtil.isNull(result.getData())) { + LogUtil.error("当前查询的产品, {}, 不存在", productQueryDTO.getProductCode()); + throw new TpTradeProdException(TpTradeProdErrorCode.PRODUCT_NOT_EXIST_ERROR); + } + + return result.getData(); + } + + public TpProdDetailDTO getProduct(String productNo, String tenantId, List needProperties) { + TpProductQueryDTO tpProductQueryDTO = new TpProductQueryDTO(); + tpProductQueryDTO.setProductCode(productNo); + tpProductQueryDTO.setFormalFlag(FormalFlagEnum.FORMAL.getCode()); + tpProductQueryDTO.setTenantId(tenantId); + tpProductQueryDTO.setNeedProperties(needProperties); + TpResult result = tpProductServiceFacade.getProduct(tpProductQueryDTO); + + if (!result.isSuccess()) { + LogUtil.error("产品查询失败,入参: {}, 错误编码:{}, 错误信息: {}", productNo, result.getErrorCode(), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + if (ObjectUtil.isNull(result.getData())) { + LogUtil.error("当前查询的产品, {}, 不存在", JSONUtil.toJsonStr(tpProductQueryDTO)); + throw new TpTradeProdException(TpTradeProdErrorCode.PRODUCT_NOT_EXIST_ERROR); + } + + return result.getData(); + } + + public TpProductExtendAttributesDTO getProductExtendAttribute(String productNo, String tenantId) { + TpProdDetailDTO prodDetailDTO = getProduct(productNo, tenantId, NeedPropertiesEnum.buildNeedProperties(NeedPropertiesEnum.EXTEND_ATTRIBUTE)); + TpProductExtendAttributesDTO extendAttributes = prodDetailDTO.getExtendAttributes(); + if (extendAttributes == null) { + LogUtil.error("产品拓展属性不存在,入参为:{}", JSONUtil.toJsonStr(prodDetailDTO)); + throw new TpTradeProdException(TpTradeProdErrorCode.PRODUCT_EXTEND_ATTRIBUTE_NOT_EXIST_ERROR); + } + + return extendAttributes; + } +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpProductSalesUnitClient.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpProductSalesUnitClient.java new file mode 100644 index 0000000..c7ed2e1 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpProductSalesUnitClient.java @@ -0,0 +1,66 @@ +package com.deepinnet.tptradeprod.common.service.integration.client; + +import cn.hutool.core.collection.CollUtil; +import com.alibaba.fastjson2.JSONObject; +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpproductcore.common.qto.TpSalesUnitCarPoolListQueryDTO; +import com.deepinnet.tpproductcore.common.qto.TpSalesUnitQueryDTO; +import com.deepinnet.tpproductcore.common.service.facade.product.TpProductSalesUnitFacade; +import com.deepinnet.tpproductcore.common.vo.TpSalesUnitCarPoolVO; +import com.deepinnet.tpproductcore.common.vo.TpSalesUnitVO; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + *

+ * 售卖单元client + *

+ * + * @author chenjiaju + * @since 2023/9/21 + */ + +@Component +public class TpProductSalesUnitClient { + + @DubboReference + private TpProductSalesUnitFacade tpProductSalesUnitFacade; + + public List listTpSalesUnit(TpSalesUnitQueryDTO salesUnitQuery) { + TpResult> listTpResult = tpProductSalesUnitFacade.listTpSalesUnit(salesUnitQuery); + + if (!listTpResult.isSuccess()) { + LogUtil.error("售卖单元查询失败:{}, 错误编码:{}, 错误信息:{}", JSONObject.toJSONString(salesUnitQuery), listTpResult.getErrorCode(), listTpResult.getErrorDesc()); + throw new TpException(listTpResult.getErrorCode(), listTpResult.getErrorDesc()); + } + + if (CollUtil.isEmpty(listTpResult.getData())) { + LogUtil.error("未查询到对应的售卖单元, 查询参数:{}", JSONObject.toJSONString(salesUnitQuery), listTpResult.getErrorCode(), listTpResult.getErrorDesc()); + throw new TpException(TpTradeProdErrorCode.SALES_UNIT_NOT_EXIST_IN_PRODUCT_ERROR.getCode(), TpTradeProdErrorCode.SALES_UNIT_NOT_EXIST_IN_PRODUCT_ERROR.getDesc()); + } + + return listTpResult.getData(); + } + + public List listCarpools(TpSalesUnitCarPoolListQueryDTO dto) { + TpResult> carpoolsResult = tpProductSalesUnitFacade.listCarPools(dto); + + if (!carpoolsResult.isSuccess()) { + LogUtil.error("开线预约信息查询失败:{}, 错误编码:{}, 错误信息:{}", JSONObject.toJSONString(dto), carpoolsResult.getErrorCode(), carpoolsResult.getErrorDesc()); + throw new TpException(carpoolsResult.getErrorCode(), carpoolsResult.getErrorDesc()); + } + + if (CollUtil.isEmpty(carpoolsResult.getData())) { + LogUtil.error("未查询到对应的售卖单元开线信息, 查询参数:{}", JSONObject.toJSONString(dto), carpoolsResult.getErrorCode(), carpoolsResult.getErrorDesc()); + throw new TpException(TpTradeProdErrorCode.CARPOOL_SALE_UNIT_QUERY_ERROR.getCode(), TpTradeProdErrorCode.CARPOOL_SALE_UNIT_QUERY_ERROR.getDesc()); + } + + return carpoolsResult.getData(); + } + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpRatingFormClient.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpRatingFormClient.java new file mode 100644 index 0000000..c5993eb --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpRatingFormClient.java @@ -0,0 +1,52 @@ +package com.deepinnet.tptradeprod.common.service.integration.client; + +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.ibuscloud.rating.common.dto.RatingUserIdentificationCountDTO; +import com.ibuscloud.rating.common.facade.form.RatingFormFacade; +import com.ibuscloud.rating.common.query.form.RatingUserIdentificationCountQuery; +import com.ibuscloud.rating.common.share.result.RatingResult; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.stereotype.Service; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * Creator zengjuerui + * Date 2024-02-29 + **/ + +@Service +public class TpRatingFormClient { + + @DubboReference(timeout = 1000) + private RatingFormFacade ratingFormFacade; + + + public Map queryOrdersRated(List orderNoList, String tenantId) { + RatingUserIdentificationCountQuery query = new RatingUserIdentificationCountQuery(); + query.setUserIdentification(orderNoList); + query.setTenantId(Long.valueOf(tenantId)); + + try { + RatingResult result = ratingFormFacade.queryRatingUserIdentificationCount(query); + if(!result.isSuccess()) { + LogUtil.error("查询订单评价失败:" + result.getMessage()); + return Collections.emptyMap(); + } + if(CollectionUtils.isEmpty(result.getData().getCountMetas())) { + return Collections.emptyMap(); + } + + return result.getData().getCountMetas().stream().collect(Collectors.toMap(RatingUserIdentificationCountDTO.Meta::getUserIdentification, + m -> m.getCount() != null && m.getCount() > 0)); + } catch (Exception e) { + LogUtil.error("查询订单评价失败:" + e.getMessage(), e); + return Collections.emptyMap(); + } + } +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpRouteClient.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpRouteClient.java new file mode 100644 index 0000000..3cbd356 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpRouteClient.java @@ -0,0 +1,51 @@ +package com.deepinnet.tptradeprod.common.service.integration.client; + +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpbaseopcore.common.dto.route.*; +import com.deepinnet.tpbaseopcore.common.service.facade.*; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.stereotype.Component; + +/** + * @author amos wong + * @create 2023/9/19 14:58 + * @Description + */ +@Component +public class TpRouteClient { + + @DubboReference + private TpRouteFacade tpRouteFacade; + + public ShuttleRouteStationTimeDTO queryRouteStationInShuttle(String shuttleCode, String upStationCode, String downStationCode, String tenantId) { + TpResult result = tpRouteFacade.queryRouteStationInShuttle(shuttleCode, upStationCode, downStationCode, tenantId); + if (!result.isSuccess()) { + LogUtil.error("查询班次站点信息失败,失败原因为:{},班次code:{},上车点code:{},下车点code:{}", result.getErrorDesc(), shuttleCode, upStationCode, downStationCode); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return result.getData(); + } + + public RouteDetail2CDTO getRouteDetail2C(String routeCode, String tenantId) { + TpResult result = tpRouteFacade.queryRouteDetail2C(routeCode, tenantId); + if (!result.isSuccess()) { + LogUtil.error("查询线路详情失败,原因为:{},routeCode为:{}", result.getErrorDesc(), routeCode); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return result.getData(); + } + + public RouteRollTimeDetailDTO getRouteRollTime(String routeCode, String tenantId) { + TpResult result = tpRouteFacade.queryRouteRollTime(routeCode, tenantId); + if (!result.isSuccess()) { + LogUtil.error("查询滚动发车时间失败,原因为:{},routeCode为:{}", result.getErrorDesc(), routeCode); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return result.getData(); + } +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpShortLinkClient.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpShortLinkClient.java new file mode 100644 index 0000000..4c06ada --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpShortLinkClient.java @@ -0,0 +1,54 @@ +package com.deepinnet.tptradeprod.common.service.integration.client; + +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.JsonUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpcommoncore.common.service.dto.TpShortLinkDTO; +import com.deepinnet.tpcommoncore.common.service.facade.TpShortLinkFacade; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.stereotype.Component; + +/** + *         ┏┓   ┏┓+ + + *        ┏┛┻━━━┛┻┓ + + + *        ┃       ┃ + *        ┃   ━   ┃ ++ + + + + *        ████━████ ┃+ + *        ┃       ┃ + + *        ┃   ┻   ┃ + *        ┃       ┃ + + + *        ┗━┓    ┏━┛ + *          ┃   ┃ + *          ┃   ┃ + + + + + *          ┃   ┃    Code is far away from bug with the animal protecting + *          ┃   ┃ +     神兽保佑,代码无bug + *          ┃   ┃ + *          ┃   ┃  + + *          ┃    ┗━━━┓ + + + *          ┃        ┣┓ + *          ┃        ┏┛ + *          ┗┓┓┏━┳┓┏┛ + + + + + *           ┃┫┫ ┃┫┫ + *           ┗┻┛ ┗┻┛+ + + + + * + * @author 唐国翔 + * @since 2023-12-22 星期五 + **/ +@Component +public class TpShortLinkClient { + + @DubboReference + private TpShortLinkFacade shortLinkFacade; + + + public String createShortLink(TpShortLinkDTO shortLinkDTO) { + TpResult result = shortLinkFacade.createShortLink(shortLinkDTO); + if (!result.isSuccess()) { + LogUtil.error("获取账户详情查询失败,入参:{},原因:{}", JsonUtil.toJsonStr(shortLinkDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + return result.getData(); + } + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpSpecialCharterTypeCarrierOrganizationClient.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpSpecialCharterTypeCarrierOrganizationClient.java new file mode 100644 index 0000000..85201c1 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpSpecialCharterTypeCarrierOrganizationClient.java @@ -0,0 +1,34 @@ +package com.deepinnet.tptradeprod.common.service.integration.client; + +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tpconfigcore.common.dto.SpecialCharterTypeCarrierOrganizationListQueryDTO; +import com.deepinnet.tpconfigcore.common.dto.SpecialCharterTypeCarrierOrganizationSaveBatchQueryDTO; +import com.deepinnet.tpconfigcore.common.service.facade.TpSpecialCharterTypeCarrierOrganizationFacade; +import com.deepinnet.tpconfigcore.common.vo.SpecialCharterTypeCarrierOrganizationDTO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @className: TpCategoryClientImpl + * @description: 类目服务实现 + * @author: shiyongping + * @date: 2023/9/6 + **/ +@Service +public class TpSpecialCharterTypeCarrierOrganizationClient { + @DubboReference + private TpSpecialCharterTypeCarrierOrganizationFacade tpSpecialCharterTypeCarrierOrganizationFacade; + + + + public List listByTenantId(SpecialCharterTypeCarrierOrganizationListQueryDTO query) { + TpResult> tpResult = tpSpecialCharterTypeCarrierOrganizationFacade.list(query); + if (!tpResult.isSuccess()) { + throw new TpException(tpResult.getErrorCode(), tpResult.getErrorDesc()); + } + return tpResult.getData(); + } +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpTenantClient.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpTenantClient.java new file mode 100644 index 0000000..11715d0 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpTenantClient.java @@ -0,0 +1,75 @@ +package com.deepinnet.tptradeprod.common.service.integration.client; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; +import com.alibaba.fastjson2.JSONObject; +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpconfigcore.common.dto.TenantContractGetByOrgCodeDTO; +import com.deepinnet.tpconfigcore.common.dto.TenantContractListQueryDTO; +import com.deepinnet.tpconfigcore.common.service.facade.TpTenantFacade; +import com.deepinnet.tpconfigcore.common.vo.TpTenantContractDTO; +import com.deepinnet.tpconfigcore.common.vo.TpTenantContractListDTO; +import com.deepinnet.tptradecore.common.error.TpTradeCoreErrorCode; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author amos wong + * @create 2023/9/6 10:26 + * @Description + */ +@Component +public class TpTenantClient { + + @DubboReference + private TpTenantFacade tpTenantFacade; + + /** + * 查询组织明细 + * @param orgId + * @param tenantId + * @return + */ + public TpTenantContractDTO getOrgDetail(String orgId, String tenantId) { + TenantContractListQueryDTO dto = new TenantContractListQueryDTO(); + dto.setTenantId(tenantId); + dto.setCarrierOrg(ListUtil.toList(orgId)); + + TpResult> result = tpTenantFacade.listTenantContract(dto); + if (!result.isSuccess()) { + LogUtil.error("组织联系信息查询失败, 入参:{}, 错误信息:{}", JSONObject.toJSONString(dto), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return CollUtil.isEmpty(result.getData()) ? null : result.getData().get(0); + } + + /** + * 查询业务员联系方式 + * @param orgCode 组织编号 + * @param tenantId 租户编号 + * @return TpTenantContractListDTO 业务员联系电话 / 邮箱 + */ + public TpTenantContractListDTO getAuditorsByOrgCode(String orgCode, String tenantId) { + TenantContractGetByOrgCodeDTO dto = new TenantContractGetByOrgCodeDTO(); + dto.setTenantId(tenantId); + dto.setCarrierOrg(orgCode); + + TpResult auditorContracts = tpTenantFacade.getTenantContractByOrgCode(dto); + + if (!auditorContracts.isSuccess()) { + LogUtil.error("组织联系信息查询失败, 入参:{}, 错误信息:{}", JSONObject.toJSONString(dto), auditorContracts.getErrorDesc()); + throw new TpException(auditorContracts.getErrorCode(), auditorContracts.getErrorDesc()); + } + + LogUtil.info("组织联系信息查询成功, 返回结果:{}", JSONObject.toJSONString(auditorContracts.getData())); + + return auditorContracts.getData(); + } +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpTripClient.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpTripClient.java new file mode 100644 index 0000000..d7c2532 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpTripClient.java @@ -0,0 +1,76 @@ +package com.deepinnet.tptradeprod.common.service.integration.client; + +import com.alibaba.fastjson2.JSONObject; +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpbaseopcore.common.dto.dispatch.sync.TpCharteredBusTripDTO; +import com.deepinnet.tpbaseopcore.common.service.facade.TpTripFacade; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.stereotype.Component; + +/** + *

+ * 主数据同步行程单 + *

+ * + * @author chenjiaju + * @since 2023/11/30 + */ + +@Component +public class TpTripClient { + + @DubboReference + private TpTripFacade tpTripFacade; + + public boolean createTrip(TpCharteredBusTripDTO dto){ + LogUtil.info("[创建]当前行程同步开始, 参数:{}", JSONObject.toJSONString(dto)); + TpResult tripSyncResult = tpTripFacade.createTrip(dto); + if (!tripSyncResult.isSuccess()) { + LogUtil.error("当前行程同步失败, 参数:{}", JSONObject.toJSONString(dto)); + throw new TpException(tripSyncResult.getErrorCode(), tripSyncResult.getErrorDesc()); + } + + if (!tripSyncResult.getData()) { + LogUtil.error("当前行程同步失败, 参数:{}", JSONObject.toJSONString(dto)); + throw new TpException(TpTradeProdErrorCode.TRIP_SYNC_ERROR.getCode(), TpTradeProdErrorCode.TRIP_SYNC_ERROR.getDesc()); + } + + return tripSyncResult.getData(); + } + + public boolean updateTrip(TpCharteredBusTripDTO dto){ + LogUtil.info("[更新]当前行程同步开始, 参数:{}", JSONObject.toJSONString(dto)); + TpResult tripSyncResult = tpTripFacade.updateTrip(dto); + if (!tripSyncResult.isSuccess()) { + LogUtil.error("更新行程同步失败, 参数:{}", JSONObject.toJSONString(dto)); + throw new TpException(tripSyncResult.getErrorCode(), tripSyncResult.getErrorDesc()); + } + + if (!tripSyncResult.getData()) { + LogUtil.error("更新行程同步失败, 参数:{}", JSONObject.toJSONString(dto)); + throw new TpException(TpTradeProdErrorCode.TRIP_SYNC_ERROR.getCode(), TpTradeProdErrorCode.TRIP_SYNC_ERROR.getDesc()); + } + + return tripSyncResult.getData(); + } + + public boolean cancelTrip(TpCharteredBusTripDTO dto){ + LogUtil.info("[取消]当前行程同步开始, 参数:{}", JSONObject.toJSONString(dto)); + TpResult tripSyncResult = tpTripFacade.cancelTrip(dto); + if (!tripSyncResult.isSuccess()) { + LogUtil.error("取消行程同步失败, 参数:{}", JSONObject.toJSONString(dto)); + throw new TpException(tripSyncResult.getErrorCode(), tripSyncResult.getErrorDesc()); + } + + if (!tripSyncResult.getData()) { + LogUtil.error("取消行程同步失败, 参数:{}", JSONObject.toJSONString(dto)); + throw new TpException(TpTradeProdErrorCode.TRIP_SYNC_ERROR.getCode(), TpTradeProdErrorCode.TRIP_SYNC_ERROR.getDesc()); + } + + return tripSyncResult.getData(); + } + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpUserPassengerClient.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpUserPassengerClient.java new file mode 100644 index 0000000..022c5c2 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpUserPassengerClient.java @@ -0,0 +1,79 @@ +package com.deepinnet.tptradeprod.common.service.integration.client; + +import com.alibaba.fastjson2.JSONObject; +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.service.facade.order.TpUserPassengerFacade; +import com.deepinnet.tptradecore.common.vo.order.TpUserPassengerVO; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.service.integration.convert.TpUserPassengerConverter; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; + +/** + *

+ * 乘客信息 + *

+ * + * @author chenjiaju + * @since 2023/9/13 + */ + +@Component +public class TpUserPassengerClient { + + @DubboReference + private TpUserPassengerFacade tpUserPassengerFacade; + + @Resource + private TpUserPassengerConverter tpUserPassengerConverter; + + public String saveUserPassenger(TpUserPassengerDTO dto) { + TpResult saveResult = tpUserPassengerFacade.saveUserPassenger(tpUserPassengerConverter.convert2UserPassengerDTO(dto)); + + if (!saveResult.isSuccess()) { + LogUtil.error("乘客保存失败:{}, 错误码:{}, 错误信息:{}", JSONObject.toJSONString(dto), saveResult.getErrorCode(), saveResult.getErrorDesc()); + throw new TpException(saveResult.getErrorCode(), saveResult.getErrorDesc()); + } + + return saveResult.getData(); + } + + public Boolean modifyUserPassenger(TpUserPassengerDTO dto) { + TpResult saveResult = tpUserPassengerFacade.modifyPassenger(tpUserPassengerConverter.convert2UserPassengerDTO(dto)); + + if (!saveResult.isSuccess() || !saveResult.getData()) { + LogUtil.error("乘客修改失败:{}, 错误码:{}, 错误信息:{}", JSONObject.toJSONString(dto), saveResult.getErrorCode(), saveResult.getErrorDesc()); + throw new TpException(saveResult.getErrorCode(), saveResult.getErrorDesc()); + } + + return saveResult.getData(); + } + + public Boolean delUserPassenger(TpUserPassengerQueryDTO dto) { + TpResult saveResult = tpUserPassengerFacade.delUserPassenger(tpUserPassengerConverter.convert2UserPassengerQueryDTO(dto)); + + if (!saveResult.isSuccess() || !saveResult.getData()) { + LogUtil.error("乘客删除失败:{}, 错误码:{}, 错误信息:{}", JSONObject.toJSONString(dto), saveResult.getErrorCode(), saveResult.getErrorDesc()); + throw new TpException(saveResult.getErrorCode(), saveResult.getErrorDesc()); + } + + return saveResult.getData(); + } + + public List queryPassengerList(TpUserPassengerQueryDTO dto) { + TpResult> listResult = tpUserPassengerFacade.queryPassengerList(tpUserPassengerConverter.convert2UserPassengerQueryDTO(dto)); + + if (!listResult.isSuccess()) { + LogUtil.error("乘客查询失败:{}, 错误码:{}, 错误信息:{}", JSONObject.toJSONString(dto), listResult.getErrorCode(), listResult.getErrorDesc()); + throw new TpException(listResult.getErrorCode(), listResult.getErrorDesc()); + } + + return tpUserPassengerConverter.convert2UserPassengerVOs(listResult.getData()); + } + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpVoucherClient.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpVoucherClient.java new file mode 100644 index 0000000..993ceb2 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/TpVoucherClient.java @@ -0,0 +1,161 @@ +package com.deepinnet.tptradeprod.common.service.integration.client; + +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson2.JSONObject; +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.page.CommonPage; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.voucher.*; +import com.deepinnet.tptradecore.common.service.facade.voucher.TpVoucherFacade; +import com.deepinnet.tptradecore.common.vo.voucher.*; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.service.integration.convert.TpVoucherConverter; +import com.deepinnet.tptradeprod.common.vo.*; +import com.google.common.collect.Lists; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; + +/** + *

+ * 凭证client + *

+ * + * @author chenjiaju + * @since 2023/9/2 + */ + +@Component +public class TpVoucherClient { + + @DubboReference + private TpVoucherFacade voucherFacade; + + @Resource + private TpVoucherConverter voucherConverter; + + + public void generateVoucher(TpProdVoucherCreateDTO dto) { + TpResult result = voucherFacade.createVoucher(voucherConverter.convert2VoucherCreateDTO(dto)); + + if (!result.isSuccess()) { + LogUtil.error("创建凭证失败, 创建参数: {}, 失败原因: {}", JSONObject.toJSONString(dto), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + } + + public TpProdVoucherCheckVO check(TpProdVoucherCheckDTO checkDTO) { + TpResult result = voucherFacade.check(voucherConverter.convert2VoucherCheckDTO(checkDTO)); + if (!result.isSuccess()) { + LogUtil.error("检票失败, 入参: {}, 失败原因: {}", JSONObject.toJSONString(checkDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return voucherConverter.convert2VoucherCheckVO(result.getData()); + } + + public List getVoucherList(TpProdVoucherQueryDTO queryDTO) { + TpResult> result = voucherFacade.getVoucherList(voucherConverter.convert2VoucherQueryDTO(queryDTO)); + if (!result.isSuccess()) { + LogUtil.error("查询凭证列表失败, 入参: {}, 失败原因: {}", JSONObject.toJSONString(queryDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return voucherConverter.convert2ProdVoucherDTOs(result.getData()); + } + + public Boolean rescheduleInvalidVouchers(TpProdOrderRescheduleInvalidVoucherDTO prodOrderRescheduleInvalidVoucherDTO) { + TpRescheduleInvalidVoucherDTO rescheduleInvalidVoucherDTO = convert2RescheduleInvalidVouchers(prodOrderRescheduleInvalidVoucherDTO); + + TpResult result = voucherFacade.rescheduleInvalidVouchers(rescheduleInvalidVoucherDTO); + if (!result.isSuccess()) { + LogUtil.error("改签订单失效凭证失败, 入参: {}, 失败原因: {}", JSONObject.toJSONString(rescheduleInvalidVoucherDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return true; + } + + public boolean invalidVoucher(List voucherUpdateDTOs) { + LogUtil.info("调用失效凭证的接口,入参为:{}", JSONUtil.toJsonStr(voucherUpdateDTOs)); + TpResult result = voucherFacade.invalidVoucher(voucherUpdateDTOs); + if (result.isSuccess()) { + return result.getData(); + } + + LogUtil.error("失效凭证失败,入参:{},失败原因:{}", JSONUtil.toJsonStr(voucherUpdateDTOs), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + public List getVerificationRecordList(TpProdVoucherVerificationRecordQueryDTO verificationRecordQueryDTO) { + TpVoucherVerificationRecordQueryDTO queryDTO = voucherConverter.convert2VoucherVerificationRecordQueryDTO(verificationRecordQueryDTO); + TpResult> result = voucherFacade.getVoucherVerificationRecordList(queryDTO); + if (result.isSuccess()) { + List verificationRecordDTOs = result.getData(); + return voucherConverter.convert2VoucherVerificationRecordList(verificationRecordDTOs); + } + + LogUtil.error("查询凭证核销记录失败,入参:{}", JSONUtil.toJsonStr(queryDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + public TpBuyLimitQueryVoucherVO queryBuyLimitNeedVoucherCount(TpBuyLimitQueryVoucherDTO dto) { + TpResult result = voucherFacade.queryBuyLimitNeedVoucherCount(dto); + + if (!result.isSuccess()) { + LogUtil.error("查询购买凭证数量失败,入参:{},失败原因:{}", JSONUtil.toJsonStr(dto), result.getErrorCode(), result.getErrorDesc()); + } + + return result.getData(); + } + + public TpProdTimeRangeExistVerificationRecordDateQueryVO getTimeRangeExistVerificationRecordDate(TpProdTimeRangeExistVerificationRecordDateQueryDTO queryDTO) { + TpResult result = voucherFacade.getTimeRangeExistVerificationRecordDate(voucherConverter.convert2ProdVoucherQueryDTO(queryDTO)); + if (!result.isSuccess()) { + LogUtil.error("查询用户时间范围内核销成功的记录失败, 入参: {}, 失败原因: {}", JSONObject.toJSONString(queryDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return voucherConverter.convert2ProdVoucherQueryVO(result.getData()); + } + + public TpProdTimeRangeUserVerificationRecordDetailQueryVO getTimeRangeUserVerificationRecordDetail(TpProdTimeRangeUserVerificationRecordDetailQueryDTO queryDTO) { + TpResult result = voucherFacade.getTimeRangeUserVerificationRecordDetail(voucherConverter.convert2UserVoucherVerificationRecordQueryDTO(queryDTO)); + if (!result.isSuccess()) { + LogUtil.error("查询用户时间范围内核销成功的明细录失败, 入参: {}, 失败原因: {}", JSONObject.toJSONString(queryDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return voucherConverter.convert2UserVoucherVerificationRecordQueryVO(result.getData()); + } + + public CommonPage queryMngVerificationRecords(TpProdMngVerificationRecordQueryDTO queryDTO) { + TpResult> result = voucherFacade.queryMngVerificationRecords(voucherConverter.convert2mngVerificationRecordQueryDTO(queryDTO)); + + if (!result.isSuccess()) { + LogUtil.error("查询业主后台的核销记录失败, 入参: {}, 失败原因: {}", JSONObject.toJSONString(queryDTO), result.getErrorDesc()); + throw new TpException(result.getErrorCode(), result.getErrorDesc()); + } + + return voucherConverter.convert2prodMngVerificationRecordVOList(result.getData()); + } + + private TpRescheduleInvalidVoucherDTO convert2RescheduleInvalidVouchers(TpProdOrderRescheduleInvalidVoucherDTO prodOrderRescheduleInvalidVoucherDTO) { + TpRescheduleInvalidVoucherDTO rescheduleInvalidVoucherDTO = new TpRescheduleInvalidVoucherDTO(); + rescheduleInvalidVoucherDTO.setOriginalOrderNo(prodOrderRescheduleInvalidVoucherDTO.getOriginalOrderNo()); + rescheduleInvalidVoucherDTO.setOrderNo(prodOrderRescheduleInvalidVoucherDTO.getOrderNo()); + List invalidVoucherDTOs = Lists.newArrayList(); + prodOrderRescheduleInvalidVoucherDTO.getInvalidVoucherDTOs().forEach(v -> { + TpInvalidVoucherDTO invalidVoucherDTO = new TpInvalidVoucherDTO(); + invalidVoucherDTO.setVoucherNo(v.getVoucherNo()); + invalidVoucherDTO.setInvalidPassengerCount(v.getInvalidPassengerCount()); + invalidVoucherDTOs.add(invalidVoucherDTO); + }); + rescheduleInvalidVoucherDTO.setInvalidVoucherDTOs(invalidVoucherDTOs); + rescheduleInvalidVoucherDTO.setTenantId(prodOrderRescheduleInvalidVoucherDTO.getTenantId()); + return rescheduleInvalidVoucherDTO; + } +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/email/TpEmailClient.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/email/TpEmailClient.java new file mode 100644 index 0000000..fe69506 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/email/TpEmailClient.java @@ -0,0 +1,28 @@ +package com.deepinnet.tptradeprod.common.service.integration.client.email; + +import com.deepinnet.tpcommoncore.common.service.facade.TpEmailFacade; +import com.deepinnet.tpcommoncore.common.service.template.email.TpEmailBaseTemplate; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author amos wong + * @create 2023/11/13 15:41 + * @Description + */ +@Component +public class TpEmailClient { + + @DubboReference + private TpEmailFacade emailFacade; + + public void sendEmail(String receiveEmail, TpEmailBaseTemplate emailTemplate) { + emailFacade.sendEmailAsync(receiveEmail, emailTemplate); + } + + public void batchSendEmail(List receiveEmails, TpEmailBaseTemplate emailTemplate) { + emailFacade.batchSendEmailAsync(receiveEmails, emailTemplate); + } +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/mq/constants/MessageConstants.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/mq/constants/MessageConstants.java new file mode 100644 index 0000000..1ee6753 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/mq/constants/MessageConstants.java @@ -0,0 +1,49 @@ +package com.deepinnet.tptradeprod.common.service.integration.client.mq.constants; + +/** + * @author amos wong + * @create 2023/9/4 09:56 + * @Description + */ +public interface MessageConstants { + + /** + * 交易核心topic + */ + String TRADECORE_EVENT_TOPIC = "TP_TRADECORE_EVENT_TOPIC"; + + /** + * 交易核心延时topic + */ + String TRADECORE_DELAY_EVENT_TOPIC = "TP_TRADECORE_DELAY_EVENT_TOPIC"; + + /** + * 资金中心支付成功事件 + **/ + String EVENT_CODE_TRANS_PAY_SUCCESS = "EC_TRANS_PAY_SUCCESS"; + + /** + * 退票成功消息 + **/ + String EVENT_CODE_REFUND_TICKET_SUCCESS = "EC_REFUND_TICKET_SUCCESS"; + + /** + * 凭证核销成功事件 + **/ + String EVENT_CODE_VOUCHER_VERIFICATION_SUCCESS = "EC_VOUCHER_VERIFICATION_SUCCESS"; + + /** + * 凭证过期事件 + **/ + String EVENT_CODE_VOUCHER_EXPIRED_SUCCESS = "EC_VOUCHER_EXPIRED_SUCCESS"; + + /** + * 订单过期延时消息 + */ + String EVENT_ORDER_DELAY_TAG_SUCCESS = "EVENT_ORDER_DELAY_TAG_SUCCESS"; + + /** + * 支付单过期延时消息 + */ + String EVENT_PAY_ORDER_DELAY_TAG_SUCCESS = "EVENT_PAY_ORDER_DELAY_TAG_SUCCESS"; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/mq/constants/MessageDelayLevel.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/mq/constants/MessageDelayLevel.java new file mode 100644 index 0000000..a37d794 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/mq/constants/MessageDelayLevel.java @@ -0,0 +1,28 @@ +package com.deepinnet.tptradeprod.common.service.integration.client.mq.constants; + +/** + * MQ延迟等级 + * + * @author tianxincode@163.com + * @since 2022/6/16 + */ +public interface MessageDelayLevel { + int ONE_SECOND = 1; + int FIVE_SECOND = 2; + int TEN_SECOND = 3; + int THIRTY_SECOND = 4; + int ONE_MINUTE = 5; + int TWO_MINUTE = 6; + int THREE_MINUTE = 7; + int FOUR_MINUTE = 8; + int FIVE_MINUTE = 9; + int SIX_MINUTE = 10; + int SEVEN_MINUTE = 11; + int EIGHT_MINUTE = 12; + int NINE_MINUTE = 13; + int TEN_MINUTE = 14; + int TWENTY_MINUTE = 15; + int THIRTY_MINUTE = 16; + int ONE_HOUR = 17; + int TWO_HOUR = 18; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/mq/constants/MessageSysConstants.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/mq/constants/MessageSysConstants.java new file mode 100644 index 0000000..15d3948 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/mq/constants/MessageSysConstants.java @@ -0,0 +1,44 @@ +package com.deepinnet.tptradeprod.common.service.integration.client.mq.constants; + +/** + * MQ系统级常量 + * + * @author amos wong + * @since 2022/11/6 + */ +public class MessageSysConstants { + /** + * 分隔符 + */ + public final static String DELIMITER = ":"; + + /** + * 消息来源-履约域(退票) + */ + public final static String SOURCE_CONTRACT = "TPTRADECORE-CONTRACT"; + + /** + * 消息来源-凭证 + */ + public final static String SOURCE_VOUCHER = "TPTRADECORE-VOUCHER"; + + /** + * 消息来源-资金域 + */ + public final static String SOURCE_TRANS = "TPTRADECORE-TRANS"; + + /** + * 消息来源-订单域 + */ + public final static String SOURCE_ORDER = "TPTRADEPROD-ORDER"; + + /** + * 消费者组名称 + */ + public final static String CONSUMER_GROUP = "tptradecore-provider-group"; + + /** + * 生产者组名称 + */ + public final static String PROVIDER_GROUP = "tptradecore-consumer-group"; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/mq/entity/BaseMessageEntity.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/mq/entity/BaseMessageEntity.java new file mode 100644 index 0000000..2432f75 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/mq/entity/BaseMessageEntity.java @@ -0,0 +1,36 @@ +package com.deepinnet.tptradeprod.common.service.integration.client.mq.entity; + +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author amos wong + * @create 2022-11-22 20:57 + * + * MQ消息体基类 + */ +@Data +public class BaseMessageEntity { + + /** + * 发送消息的来源,这里为应用名称 + */ + protected String source; + + /** + * 业务键,用于RocketMQ控制台查看消费情况 + */ + protected String key; + + /* + * 发送时间 + */ + protected LocalDateTime sendTime = LocalDateTime.now(); + + /** + * 业务消息内容 + */ + private String body; + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/mq/entity/TicketRefundSuccessMessageEntity.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/mq/entity/TicketRefundSuccessMessageEntity.java new file mode 100644 index 0000000..950718d --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/mq/entity/TicketRefundSuccessMessageEntity.java @@ -0,0 +1,51 @@ +package com.deepinnet.tptradeprod.common.service.integration.client.mq.entity; + +import lombok.Data; + +/** + * @author amos wong + * @create 2022-11-22 21:33 + */ +@Data +public class TicketRefundSuccessMessageEntity extends BaseMessageEntity { + + /** + * 订单号 + */ + private String orderNo; + + /** + * 退票申请单号 + */ + private String refundApplyOrderNo; + + /** + * 退票时间 + */ + private Long refundTime; + + /** + * 租户id + */ + private String tenantId; + + /** + * 是否存在退票 + */ + private boolean existRefund; + + /** + * 是否存在核销 + */ + private boolean existVerification; + + /** + * 是否存在有效凭证 + */ + private boolean existValid; + + /** + * 是否存在过期凭证 + */ + private boolean existExpire; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/mq/template/MessageClient.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/mq/template/MessageClient.java new file mode 100644 index 0000000..2912611 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/mq/template/MessageClient.java @@ -0,0 +1,111 @@ +package com.deepinnet.tptradeprod.common.service.integration.client.mq.template; + +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSONObject; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradeprod.common.service.integration.client.mq.constants.*; +import com.deepinnet.tptradeprod.common.service.integration.client.mq.entity.BaseMessageEntity; +import org.apache.rocketmq.client.producer.*; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.apache.rocketmq.spring.support.RocketMQHeaders; +import org.slf4j.*; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.messaging.Message; +import org.springframework.messaging.support.MessageBuilder; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + + + +/** + * 封装MQ发送消息的逻辑 + */ +@Component +public class MessageClient { + + @Resource + private RocketMQTemplate rocketMQTemplate; + + @Value("${spring.profiles.active}") + private String env; + + private static final Logger MESSAGE_LOG = LoggerFactory.getLogger("MESSAGE-LOG"); + + public String getMessageTopic() { + return MessageConstants.TRADECORE_EVENT_TOPIC + "-" + env; + } + + public String getDelayMessageTopic() { + return MessageConstants.TRADECORE_DELAY_EVENT_TOPIC + "-" + env; + } + + /** + * 构建目的地 + */ + public String buildDestination(String topic, String tag) { + return topic + MessageSysConstants.DELIMITER + tag; + } + + /** + * 发送同步消息 + * + * @param topic 发送的主题 + * @param tag 路由标签 + * @param message 消息体 + * @param + * @return + */ + public SendResult send(String topic, String tag, T message) { + LogUtil.info(MESSAGE_LOG, "{},{},{}", topic, tag, message); + return send(topic + MessageSysConstants.DELIMITER + tag, message); + } + + private SendResult send(String destination, T message) { + Message sendMessage = MessageBuilder.withPayload(message).setHeader(RocketMQHeaders.KEYS, message.getKey()).build(); + SendResult sendResult = rocketMQTemplate.syncSend(destination, sendMessage); + LogUtil.info("[{}]同步消息[{}]发送结果[{}]", destination, JSONUtil.toJsonStr(message), JSONObject.toJSON(sendResult)); + return sendResult; + } + + /** + * 发送延迟消息 + * + * @param topic 发送的主题 + * @param tag 路由标签 + * @param message 消息体 + * @param delayTime 延迟时间毫秒值 + * @return + */ + public SendResult send(String topic, String tag, T message, long delayTime) { + return send(topic + MessageSysConstants.DELIMITER + tag, message, delayTime); + } + + private SendResult send(String destination, T message, Long delayTime) { + Message sendMessage = MessageBuilder.withPayload(message).setHeader(RocketMQHeaders.KEYS, message.getKey()).build(); + SendResult sendResult = rocketMQTemplate.syncSendDeliverTimeMills(destination, sendMessage, delayTime); + LogUtil.info("[{}]延迟时间[{}]消息[{}]发送结果[{}]", destination, delayTime, JSONUtil.toJsonStr(message), JSONUtil.toJsonStr(sendResult)); + return sendResult; + } + + /** + * 发送事务消息 + * + * @param topic 发送的主题 + * @param tag 路由标签 + * @param message 消息体 + * @param arg 额外信息 + * @param + * @return + */ + public SendResult sendTransactional(String topic, String tag, T message, Object arg) { + return send(topic + MessageSysConstants.DELIMITER + tag, message, arg); + } + + private SendResult send(String destination, T message, Object arg) { + Message sendMessage = MessageBuilder.withPayload(message).setHeader(RocketMQHeaders.KEYS, message.getKey()).build(); + TransactionSendResult sendResult = rocketMQTemplate.sendMessageInTransaction(destination, sendMessage, arg); + LogUtil.info("事务消息,业务key={},发送成功", destination, message.getKey()); + return sendResult; + } +} \ No newline at end of file diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/sms/TpSmsClient.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/sms/TpSmsClient.java new file mode 100644 index 0000000..cc81e47 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/client/sms/TpSmsClient.java @@ -0,0 +1,28 @@ +package com.deepinnet.tptradeprod.common.service.integration.client.sms; + +import com.deepinnet.tpcommoncore.common.service.facade.TpSmsFacade; +import com.deepinnet.tpcommoncore.common.service.template.sms.user.TpSmsBaseTemplate; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author amos wong + * @create 2023/11/21 14:11 + * @Description + */ +@Component +public class TpSmsClient { + + @DubboReference + private TpSmsFacade smsFacade; + + public void sendSms(String mobile, TpSmsBaseTemplate smsTemplate) { + smsFacade.sendSmsAsync(mobile, smsTemplate); + } + + public void batchSendSms(List mobiles, TpSmsBaseTemplate smsTemplate) { + smsFacade.batchSendSmsAsync(mobiles, smsTemplate); + } +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpAuditConverter.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpAuditConverter.java new file mode 100644 index 0000000..f91b521 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpAuditConverter.java @@ -0,0 +1,54 @@ +package com.deepinnet.tptradeprod.common.service.integration.convert; + +import com.deepinnet.tptradecore.common.dto.audit.*; +import com.deepinnet.tptradecore.common.vo.audit.TpAuditOrderListVO; +import com.deepinnet.tptradecore.common.vo.audit.TpAuditVO; +import com.deepinnet.tptradeprod.common.dto.TpProdAuditOrderListPagedQueryDTO; +import com.deepinnet.tptradeprod.common.vo.audit.*; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.MappingConstants; + +import java.util.List; + +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface TpAuditConverter { + TpAuditQueryDetailDTO convert2AuditQueryDetailDTO(TpProdAuditQueryDetailDTO tpAuditQueryDetailDTO); + + TpProdAuditVO convert2ProdAuditVO(TpAuditVO data); + + List convert2ProdAuditVOList(List data); + + TpAuditListQueryDTO convert2AuditListQueryDTO(TpProdAuditListQueryDTO tpAuditListQueryDTO); + + TpAuditCreatedDTO convert2AuditCreateDTO(TpProdAuditCreatedDTO tpAuditCreatedDTO); + + TpAuditApprovedSubmitDTO convert2AuditConfirmDTO(TpProdAuditConfirmDTO confirmAuditDTO); + + TpAuditLatestDetailDTO convert2AuditQueryDetailDTO(TpProdAuditLatestDetailDTO auditLatestDetailDTO); + + default TpOrderAuditPagedQueryDTO convert2OrderListPagedQueryDTO(TpProdAuditOrderListPagedQueryDTO dto){ + if ( dto == null ) { + return null; + } + + TpOrderAuditPagedQueryDTO tpOrderAuditPagedQueryDTO = TpOrderAuditPagedQueryDTO.builder().build(); + + tpOrderAuditPagedQueryDTO.setOrderNo( dto.getOrderNo() ); + tpOrderAuditPagedQueryDTO.setOriginalOrderNo(dto.getOriginalOrderNo()); + tpOrderAuditPagedQueryDTO.setCharterBusType( dto.getCharterBusType() ); + tpOrderAuditPagedQueryDTO.setAuditTypes(dto.getAuditTypes()); + tpOrderAuditPagedQueryDTO.setAuditStatus(dto.getAuditStatus()); + tpOrderAuditPagedQueryDTO.setOrgNo(dto.getOrgCode()); + tpOrderAuditPagedQueryDTO.setOrgCodes(dto.getOrgCodes()); + tpOrderAuditPagedQueryDTO.setTenantId( dto.getTenantId() ); + tpOrderAuditPagedQueryDTO.setPageSize(dto.getPageSize()); + tpOrderAuditPagedQueryDTO.setPageNum(dto.getPageNum()); + + return tpOrderAuditPagedQueryDTO; + } + + @Mapping(source = "auditOrder",target = "orderListVO") + TpProdAuditListVO convert2OrderListVO(TpAuditOrderListVO tpAuditOrderListVO); + List convert2OrderListVO(List list); +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpBizRuleConvert.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpBizRuleConvert.java new file mode 100644 index 0000000..f6a9a8c --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpBizRuleConvert.java @@ -0,0 +1,21 @@ +package com.deepinnet.tptradeprod.common.service.integration.convert; + +import com.deepinnet.tpproductcore.common.dto.rule.TpBizRuleDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdBizRuleDTO; +import org.mapstruct.*; + +import java.util.List; + +/** + * @author amos wong + * @create 2023/9/8 16:41 + * @Description + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface TpBizRuleConvert { + + TpProdBizRuleDTO convert2ProdBizRule(TpBizRuleDTO bizRuleDTO); + + List convert2ProdBizRuleList(List bizRuleDTOs); + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpBusDynConvert.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpBusDynConvert.java new file mode 100644 index 0000000..8c6963a --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpBusDynConvert.java @@ -0,0 +1,17 @@ +package com.deepinnet.tptradeprod.common.service.integration.convert; + +import com.deepinnet.tpbaseopcore.common.dto.bus.TpBusDynDTO; +import com.deepinnet.tptradeprod.common.service.integration.entity.TpBusDyn; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; + +/** + * Creator zengjuerui + * Date 2024-01-19 + **/ + +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface TpBusDynConvert { + + TpBusDyn dtoToDomain(TpBusDynDTO dto); +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpCarpoolConverter.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpCarpoolConverter.java new file mode 100644 index 0000000..0fea3ee --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpCarpoolConverter.java @@ -0,0 +1,16 @@ +package com.deepinnet.tptradeprod.common.service.integration.convert; + +import com.deepinnet.tptradecore.common.dto.order.TpCheckSuccessCallbackDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdCheckSuccessCallbackDTO; +import org.mapstruct.*; + +/** + * @author amos wong + * @create 2024/5/21 15:54 + * @Description + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface TpCarpoolConverter { + + TpCheckSuccessCallbackDTO convert2CheckSuccessCallbackDTO(TpProdCheckSuccessCallbackDTO dto); +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpContractConverter.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpContractConverter.java new file mode 100644 index 0000000..00560a4 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpContractConverter.java @@ -0,0 +1,43 @@ +package com.deepinnet.tptradeprod.common.service.integration.convert; + +import com.deepinnet.tp.common.lang.page.CommonPage; +import com.deepinnet.tptradecore.common.dto.contract.*; +import com.deepinnet.tptradecore.common.vo.contract.*; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.vo.*; +import org.mapstruct.*; + +import java.util.List; + +/** + * @author amos wong + * @create 2023/9/8 16:41 + * @Description + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface TpContractConverter { + + TpRefundApplyDTO convert2RefundApplyDTO(TpProdRefundApplyDTO dto); + + TpQueryAvailableRefundVoucherDTO convert2QueryAvailableRefundVoucherDTO(TpProdQueryAvailableRefundVoucherDTO dto); + + TpCalculateRefundAmountDTO convert2CalculateRefundAmountDTO(TpProdCalculateRefundAmountDTO vo); + + TpPageQueryRefundApplyOrderDTO convert2PageQueryApplyRefundOrders(TpProdPageQueryRefundApplyOrderDTO dto); + + TpQueryRefundApplyOrderDTO convert2QueryRefundApplyOrderDTO(TpProdQueryRefundApplyOrderDTO vo); + + TpQueryRefundDetailDTO convert2QueryRefundDetailDTO(TpProdQueryRefundDetailDTO vo); + + TpProdQueryAvailableRefundVoucherVO convert2QueryAvailableRefundVoucherVO(TpQueryAvailableRefundVoucherVO vo); + + TpProdCalculateRefundAmountVO convert2ProdRefundAmountVO(TpCalculateRefundAmountVO dto); + + TpProdRefundApplyOrderDTO convert2ProdRefundApplyOrderDTO(TpRefundApplyOrderDTO dto); + + CommonPage convert2PageProdRefundApplyOrderDTO(CommonPage dto); + + List convert2ProdRefundApplyOrderDTO(List dtos); + + TpProdQueryRefundDetailVO convert2ProdQueryRefundDetailVO(TpQueryRefundDetailVO vo); +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpOrderChangeApplyConverter.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpOrderChangeApplyConverter.java new file mode 100644 index 0000000..746d979 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpOrderChangeApplyConverter.java @@ -0,0 +1,125 @@ +package com.deepinnet.tptradeprod.common.service.integration.convert; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.nacos.common.utils.MapUtil; +import com.deepinnet.tptradecore.common.dto.order.*; +import com.deepinnet.tptradecore.common.vo.order.TpOrderChangeApplyVO; +import com.deepinnet.tptradecore.common.vo.order.TpOrderChangeItemFactorVO; +import com.deepinnet.tptradecore.common.vo.order.TpOrderChangeItemVO; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.vo.*; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; + +import javax.validation.constraints.NotNull; +import java.util.*; + +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface TpOrderChangeApplyConverter { + TpOrderChangeApplyDetailDTO convert2DTO(TpProdOrderChangeApplyDetailDTO orderChangeApplyQueryDTO); + + TpProdOrderChangeApplyDetailVO convert2VO(TpOrderChangeApplyVO vo); + + TpOrderChangeItemListDTO convert2ItemDTO(TpProdOrderChangeItemListDTO orderChangeItemListDTO); + + List convert2ItemVOList(List data); + + TpOrderChangeApplyCreatedDTO convert2ApplyCreateDTO(TpProdOrderChangeApplyCreatedDTO orderChangeApplyCreatedDTO); + + TpOrderChangeApplyStatusUpdateDTO convert2StatusUpdateDTO(TpProdOrderChangeApplyStatusUpdateDTO statusUpdateDTO); + + TpOrderChangeApplyLatestDetailDTO convert2DTO(TpProdOrderChangeApplyListDTO dto); + + TpOrderChangeApplyListDTO convert2ApplyListDTO(TpProdOrderChangeApplyListDTO dto); + + + default TpProdOrderChangeApplyListVO convert2ApplyListVO(TpOrderChangeApplyVO vo) { + if (vo == null) { + return null; + } + TpProdOrderChangeApplyListVO prodOrderChangeApplyListVO = new TpProdOrderChangeApplyListVO(); + prodOrderChangeApplyListVO.setApplyNo(vo.getApplyNo()); + prodOrderChangeApplyListVO.setOrderNo(vo.getOrderNo()); + prodOrderChangeApplyListVO.setApplyType(vo.getApplyType()); + prodOrderChangeApplyListVO.setApplyStatus(vo.getApplyStatus()); + prodOrderChangeApplyListVO.setApplyTime(vo.getApplyTime()); + prodOrderChangeApplyListVO.setApprovedRemark(vo.getApprovedRemark()); + prodOrderChangeApplyListVO.setApprovedTime(vo.getApprovedTime()); + prodOrderChangeApplyListVO.setApplyReason(vo.getApplyReason()); + prodOrderChangeApplyListVO.setRscApplyReason(vo.getRscApplyReason()); + prodOrderChangeApplyListVO.setRscApplyTime(vo.getRscApplyTime()); + prodOrderChangeApplyListVO.setRscApplyType(vo.getRscApplyType()); + if (vo.getOrderChangeApplicant() != null) { + prodOrderChangeApplyListVO.setApplicantNo(vo.getOrderChangeApplicant().getApplicantNo()); + prodOrderChangeApplyListVO.setApplicantName(vo.getOrderChangeApplicant().getApplicantName()); + } + prodOrderChangeApplyListVO.setOrderChangeItems(buildListOrderChangedItems(vo.getOrderChangeItems())); + + return prodOrderChangeApplyListVO; + + } + + default List buildListOrderChangedItems(List orderChangeItems) { + if (CollUtil.isEmpty(orderChangeItems)) { + return Collections.emptyList(); + } + List itemGroupListVOS = new ArrayList<>(); + orderChangeItems.stream().forEach(orderChangeItem -> { + TpProdOrderChangeItemGroupListVO itemGroupListVO = new TpProdOrderChangeItemGroupListVO(); + itemGroupListVO.setItemType(orderChangeItem.getItemType()); + itemGroupListVO.setItems(buildItemFactors(orderChangeItem.getItemFactors())); + itemGroupListVOS.add(itemGroupListVO); + + }); + return itemGroupListVOS; + + } + + default List buildItemFactors(List itemFactors) { + if (CollUtil.isEmpty(itemFactors)) { + return Collections.emptyList(); + } +// Map> itemsFactorMaps +// = itemFactors.stream().collect(Collectors.groupingBy(TpOrderChangeItemFactorVO::getFactorCode)); + Map itemGroupListVOS = new HashMap<>(); + itemFactors.forEach(itemFactorVO -> { + TpProdOrderChangeItemListVO itemGroupListVO = itemGroupListVOS.get(itemFactorVO.getFactorCode()); + if (itemGroupListVO == null) { + itemGroupListVO = new TpProdOrderChangeItemListVO(); + } + itemGroupListVO.setFactorCode(itemFactorVO.getFactorCode()); + itemGroupListVO.setFactorName(itemFactorVO.getFactorName()); + itemGroupListVO.setBeforeValue(appendFactorValue(itemGroupListVO.getBeforeValue(), itemFactorVO.getBeforeValue())); + itemGroupListVO.setAfterValue(appendFactorValue(itemGroupListVO.getAfterValue(), itemFactorVO.getAfterValue())); + itemGroupListVO.setTenantId(itemFactorVO.getTenantId()); + itemGroupListVOS.put(itemFactorVO.getFactorCode(), itemGroupListVO); + + }); + if (MapUtil.isEmpty(itemGroupListVOS)) { + return Collections.emptyList(); + } + return CollUtil.newArrayList(itemGroupListVOS.values()); + } + + default String appendFactorValue(String currentValue, String appendValue) { + if (StrUtil.isEmpty(currentValue)) { + return appendValue; + } + if (StrUtil.isEmpty(appendValue)) { + return currentValue; + } + + return currentValue + "," + appendValue; + + } + + List convert2ApplyListVOList(List data); + + + TpOrderChangeApplyApprovedSubmitDTO convert2ApplyApprovedSubmitDTO(TpProdOrderChangeApplyApprovedResultSubmitDTO approvedSubmitDTO); + + TpOrderChangeApplyApprovedSubmitDTO convert2ApprovedSubmitDTO(TpProdOrderChangeApplyApprovedSubmitDTO approvedSubmitDTO); + + TpOrderChangeApplyRscApplyDTO convert2RscApplyDTO(@NotNull(message = "入参不能为空") TpProdOrderChangeApplySubmitRscApplyDTO applyRscApplyDTO); +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpOrderConverter.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpOrderConverter.java new file mode 100644 index 0000000..6fd1572 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpOrderConverter.java @@ -0,0 +1,48 @@ +package com.deepinnet.tptradeprod.common.service.integration.convert; + +import com.deepinnet.tp.common.lang.page.CommonPage; +import com.deepinnet.tptradecore.common.dto.order.*; +import com.deepinnet.tptradecore.common.vo.order.*; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.vo.*; +import com.deepinnet.tptradeprod.common.vo.TpOrderListVO; +import com.deepinnet.tptradeprod.common.vo.TpOrderPriceRecordVO; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderPayVO; +import org.mapstruct.*; + +import java.util.List; + +/** + * @author amos wong + * @create 2023/9/2 15:16 + * @Description + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface TpOrderConverter { + + TpOrderRescheduleDTO convert2OrderRescheduleDTO(TpProdOrderRescheduleDTO dto); + + TpProdOrderDetailVO convert2ProdOrderDetailVO(TpOrderDetailVO orderDetailVO); + + TpOrderCreateDTO convert2OrderCreateDTO(TpProdOrderCreateDTO createOrderDTO); + + TpProdOrderCreateVO convert2ProdOrderCreateVO(TpOrderCreateVO orderCreateVO); + + TpProdOrderEndorseCreateVO convert2ProdOrderEndorseVO(TpOrderEndorseVO orderEndorseVO); + + TpOrderPayDTO convert2PayOrderDTO(TpProdOrderPayDTO orderPayDTO); + + TpProdOrderPayVO convert2ProdPayOrderVO(TpOrderPayVO orderPayV); + + TpOrderPaidDTO convert2OrderPaidDTO(TpProdOrderPaidDTO orderPaidDTO); + + TpProdOrderPaidVO convert2ProdPaidOrderVO(TpOrderPaidVO orderPaidVO); + + TpOrderQueryDTO convert2OrderQueryDTO(TpProdOrderQueryDTO dto); + + CommonPage convert2OrderListVO(CommonPage vo); + List convert2OrderListVO(List vo); + + @Mapping(target = "orderNo", ignore = true) + List convert2OrderPriceDTO(List voList); +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpOrderDispatchConverter.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpOrderDispatchConverter.java new file mode 100644 index 0000000..88d05c0 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpOrderDispatchConverter.java @@ -0,0 +1,33 @@ +package com.deepinnet.tptradeprod.common.service.integration.convert; + +import com.deepinnet.tptradecore.common.dto.order.*; +import com.deepinnet.tptradecore.common.vo.order.TpOrderDispatchVO; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDispatchDetailVO; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; + +import java.util.List; + +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface TpOrderDispatchConverter { + TpOrderDispatchCreatedDTO convert2DTO(TpProdOrderDispatchCreatedDTO orderDispatchCreatedDTO); + + + TpOrderDispatchStatusUpdateDTO convert2DTO(TpProdOrderDispatchStatusUpdateDTO statusUpdateDTO); + + TpOrderDispatchFleetCreatedDTO convert2DTO(TpProdOrderDispatchFleetCreatedDTO orderDispatchFleetCreatedDTO); + + + TpOrderDispatchDetailDTO convert2DTO(TpProdOrderDispatchDetailDTO orderDispatchDetailDTO); + + TpProdOrderDispatchDetailVO convert2VO(TpOrderDispatchVO data); + + TpOrderDispatchListDTO convert2DTO(TpProdOrderDispatchListDTO dto); + + List convert2VOList(List data); + + TpOrderDispatchCallBackDTO convert2DTO(TpProdOrderDispatchCallBackDTO callBackDTO); + + TpOrderDispatchGiveBackDTO convert2DTO(TpProdOrderDispatchGiveBackDTO giveBackDTO); +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpOrderReceivedConverter.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpOrderReceivedConverter.java new file mode 100644 index 0000000..866d291 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpOrderReceivedConverter.java @@ -0,0 +1,19 @@ +package com.deepinnet.tptradeprod.common.service.integration.convert; + +import com.deepinnet.tptradecore.common.dto.order.TpOrderReceivedCreatedDTO; +import com.deepinnet.tptradecore.common.dto.order.TpOrderReceivedDetailDTO; +import com.deepinnet.tptradecore.common.vo.order.TpOrderReceivedVO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderReceivedCreateDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderReceivedDetailDTO; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderReceivedVO; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; + +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface TpOrderReceivedConverter { + TpOrderReceivedCreatedDTO convert2DTO(TpProdOrderReceivedCreateDTO tpOrderReceiveCreatedDTO); + + TpOrderReceivedDetailDTO convert2DTO(TpProdOrderReceivedDetailDTO orderReceivedDetailDTO); + + TpProdOrderReceivedVO convert2VO(TpOrderReceivedVO data); +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpPayOrderConvert.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpPayOrderConvert.java new file mode 100644 index 0000000..13e102e --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpPayOrderConvert.java @@ -0,0 +1,17 @@ +package com.deepinnet.tptradeprod.common.service.integration.convert; + +import com.deepinnet.tptradecore.common.dto.trans.*; +import com.deepinnet.tptradeprod.common.dto.*; +import org.mapstruct.*; + +/** + * @author amos wong + * @create 2023/9/9 10:23 + * @Description + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface TpPayOrderConvert { + + TpProdPayOrderDTO convert2ProdPayOrderDTO(TpPayOrderDTO payOrderDTO); + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpPaymentConvert.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpPaymentConvert.java new file mode 100644 index 0000000..399adbb --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpPaymentConvert.java @@ -0,0 +1,22 @@ +package com.deepinnet.tptradeprod.common.service.integration.convert; + +import com.deepinnet.tptradecore.common.dto.trans.*; +import com.deepinnet.tptradecore.common.vo.trans.TpQueryPayResultVO; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.vo.TpProdQueryPayResultVO; +import org.mapstruct.*; + +/** + * @author amos wong + * @create 2023/9/9 10:23 + * @Description + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface TpPaymentConvert { + + TpProdQueryPayResultVO convertPayResultVO(TpQueryPayResultVO queryPayResultVO); + + TpQueryPayResultDTO convert2QueryPayResultDTO(TpProdQueryPayResultDTO payResultDTO); + + TpReschedulePaidSuccessDTO convert2TpReschedulePaidSuccessDTO(TpProdReschedulePaidSuccessDTO reschedulePaidSuccessDTO); +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpPricingInquireConverter.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpPricingInquireConverter.java new file mode 100644 index 0000000..de27665 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpPricingInquireConverter.java @@ -0,0 +1,29 @@ +package com.deepinnet.tptradeprod.common.service.integration.convert; + +import com.deepinnet.tpproductcore.common.dto.price.TpPriceInquiryDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdPriceInquireDTO; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.MappingConstants; + +import java.util.List; + +/** + *

+ * 询价参数转换 + *

+ * + * @author chenjiaju + * @since 2023/9/8 + */ + +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, uses = { + TpPricingParamConverter.class +}) +public interface TpPricingInquireConverter { + + List convert2PriceInquireDTOs(List dtos); + + @Mapping(source = "dto.pricingParam", target = "pricingParam") + TpPriceInquiryDTO convert2PriceInquireDTO(TpProdPriceInquireDTO dto); +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpPricingParamConverter.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpPricingParamConverter.java new file mode 100644 index 0000000..42d7943 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpPricingParamConverter.java @@ -0,0 +1,21 @@ +package com.deepinnet.tptradeprod.common.service.integration.convert; + +import com.deepinnet.tpproductcore.common.dto.rule.TpPricingParamDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdPricingParamDTO; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; + +/** + *

+ * + *

+ * + * @author chenjiaju + * @since 2023/9/8 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface TpPricingParamConverter { + + TpPricingParamDTO convert2PricingParamDTO(TpProdPricingParamDTO dto); + +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpShuttleConvert.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpShuttleConvert.java new file mode 100644 index 0000000..ad73174 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpShuttleConvert.java @@ -0,0 +1,18 @@ +package com.deepinnet.tptradeprod.common.service.integration.convert; + +import com.deepinnet.tpbaseopcore.common.dto.shuttle.ShuttleDetailDTO; +import com.deepinnet.tptradeprod.common.service.integration.entity.Shuttle; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; + +/** + * Creator zengjuerui + * Date 2024-01-19 + **/ + +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface TpShuttleConvert { + + + Shuttle dto2Domain(ShuttleDetailDTO dto); +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpUserPassengerConverter.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpUserPassengerConverter.java new file mode 100644 index 0000000..41c0979 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpUserPassengerConverter.java @@ -0,0 +1,29 @@ +package com.deepinnet.tptradeprod.common.service.integration.convert; + +import com.deepinnet.tptradecore.common.dto.order.TpUserPassengerDTO; +import com.deepinnet.tptradecore.common.dto.order.TpUserPassengerQueryDTO; +import com.deepinnet.tptradecore.common.vo.order.TpUserPassengerVO; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; + +import java.util.List; + +/** + *

+ * 乘客转换器 + *

+ * + * @author chenjiaju + * @since 2023/9/13 + */ + +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface TpUserPassengerConverter { + TpUserPassengerDTO convert2UserPassengerDTO(com.deepinnet.tptradeprod.common.dto.TpUserPassengerDTO dto); + + TpUserPassengerQueryDTO convert2UserPassengerQueryDTO(com.deepinnet.tptradeprod.common.dto.TpUserPassengerQueryDTO dto); + + List convert2UserPassengerVOs(List vos); + + com.deepinnet.tptradeprod.common.vo.TpUserPassengerVO convert2UserPassengerVO(TpUserPassengerVO vo); +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpVoucherConverter.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpVoucherConverter.java new file mode 100644 index 0000000..84bc2f3 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/convert/TpVoucherConverter.java @@ -0,0 +1,54 @@ +package com.deepinnet.tptradeprod.common.service.integration.convert; + +import com.deepinnet.tp.common.lang.page.CommonPage; +import com.deepinnet.tptradecore.common.dto.voucher.*; +import com.deepinnet.tptradecore.common.vo.voucher.*; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.vo.*; +import org.mapstruct.*; + +import java.util.List; + +/** + *

+ * + *

+ * + * @author chenjiaju + * @since 2023/9/2 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface TpVoucherConverter { + + TpVoucherCreateDTO convert2VoucherCreateDTO(TpProdVoucherCreateDTO dto); + + TpVoucherCheckDTO convert2VoucherCheckDTO(TpProdVoucherCheckDTO dto); + + TpProdVoucherCheckVO convert2VoucherCheckVO(TpVoucherCheckVO checkVO); + + TpVoucherQueryDTO convert2VoucherQueryDTO(TpProdVoucherQueryDTO dto); + + TpProdVoucherDTO convert2ProdVoucherDTO(TpVoucherDTO voucherDTO); + + List convert2ProdVoucherDTOs(List voucherDTOS); + + TpTimeRangeExistVerificationRecordDateQueryDTO convert2ProdVoucherQueryDTO(TpProdTimeRangeExistVerificationRecordDateQueryDTO dto); + + TpProdTimeRangeExistVerificationRecordDateQueryVO convert2ProdVoucherQueryVO(TpTimeRangeExistVerificationRecordDateQueryVO vo); + + TpTimeRangeUserVerificationRecordDetailQueryDTO convert2UserVoucherVerificationRecordQueryDTO(TpProdTimeRangeUserVerificationRecordDetailQueryDTO dto); + + TpProdTimeRangeUserVerificationRecordDetailQueryVO convert2UserVoucherVerificationRecordQueryVO(TpTimeRangeUserVerificationRecordDetailQueryVO vo); + + TpVoucherVerificationRecordQueryDTO convert2VoucherVerificationRecordQueryDTO(TpProdVoucherVerificationRecordQueryDTO dto); + + TpProdVoucherVerificationRecordDTO convert2VoucherVerificationRecord(TpVoucherVerificationRecordDTO voucherVerificationRecordDTO); + + List convert2VoucherVerificationRecordList(List voucherVerificationRecordDTOS); + + TpMngVerificationRecordQueryDTO convert2mngVerificationRecordQueryDTO(TpProdMngVerificationRecordQueryDTO queryDTO); + @Mapping(target = "passenger",source = "passengerDTO") + TpProdMngVerificationRecordVO convert2prodMngVerificationRecordVO(TpMngVerificationRecordDTO tpMngVerificationRecordDTO); + + CommonPage convert2prodMngVerificationRecordVOList(CommonPage tpMngVerificationRecordDTOS); +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/entity/BusDriver.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/entity/BusDriver.java new file mode 100644 index 0000000..4c5db7b --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/entity/BusDriver.java @@ -0,0 +1,32 @@ +package com.deepinnet.tptradeprod.common.service.integration.entity; + +import lombok.Data; + +/** + * Creator zengjuerui + * Date 2024-01-19 + **/ + +@Data +public class BusDriver { + + /** + * 车辆代码 + */ + private String busCode; + + /** + * 车牌号 + */ + private String busPlate; + + /** + * 驾驶员代码 + */ + private String driverCode; + + /** + * 驾驶员名 + */ + private String driverName; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/entity/Shuttle.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/entity/Shuttle.java new file mode 100644 index 0000000..bda083a --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/entity/Shuttle.java @@ -0,0 +1,58 @@ +package com.deepinnet.tptradeprod.common.service.integration.entity; + +import lombok.Data; + +import java.util.List; + +/** + * Creator zengjuerui + * Date 2024-01-19 + **/ + +@Data +public class Shuttle { + /** + * 班次代码 + */ + private String shuttleCode; + + /** + * 所属线路ID + */ + private String routeCode; + + /** + * 线路名称 + */ + private String routeName; + + /** + * 行驶时间,单位分 + */ + private Integer travelTime; + + /** + * 班次状态 + */ + private String status; + + /** + * 去/回程类型 + */ + private String goBackType; + + /** + * 发车时间,格式:13:30 + */ + private String departTime; + + /** + * 车辆司机明细 + */ + private List busDriverDetail; + + /** + * 时间站点明细 + */ + private List stationTimeDetail; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/entity/StationTime.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/entity/StationTime.java new file mode 100644 index 0000000..e0bb6d6 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/entity/StationTime.java @@ -0,0 +1,22 @@ +package com.deepinnet.tptradeprod.common.service.integration.entity; + +import lombok.Data; + +/** + * Creator zengjuerui + * Date 2024-01-19 + **/ + +@Data +public class StationTime { + + /** + * 到站时间 + */ + private String time; + + /** + * 站点名称 + */ + private String stationName; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/entity/TpBusDyn.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/entity/TpBusDyn.java new file mode 100644 index 0000000..6696af7 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/entity/TpBusDyn.java @@ -0,0 +1,69 @@ +package com.deepinnet.tptradeprod.common.service.integration.entity; + +import lombok.Data; + +/** + * Creator zengjuerui + * Date 2024-01-19 + **/ + +@Data +public class TpBusDyn { + + /** + * 司机编码 + */ + private String driverNo; + /** + * 车辆编码 + */ + private String busNo; + /** + * 车牌 + */ + private String plateNo; + /** + * 车辆id + */ + private String busId; + /** + * 经度 + */ + private String lng; + /** + * 纬度 + */ + private String lat; + /** + * 线路ID + */ + private String routeId; + /** + * 线路名称 + */ + private String routeName; + /** + * 方向 + */ + private String direction; + + /** + * 下站名称 + */ + private String nextStaName; + + /** + * 下段距离 + */ + private String nextDistance; + + /** + * 更新时间 + */ + private String updateTime; + + /** + * GPS时间 + */ + private String gpsTime; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/entity/TpConfigItemMultiValue.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/entity/TpConfigItemMultiValue.java new file mode 100644 index 0000000..b6c6225 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/entity/TpConfigItemMultiValue.java @@ -0,0 +1,18 @@ +package com.deepinnet.tptradeprod.common.service.integration.entity; + +import lombok.Data; + +import java.util.List; + +@Data +public class TpConfigItemMultiValue { + /** + * 配置项Code + */ + private String code; + + /** + * 配置项值 + */ + private List settingValue; +} diff --git a/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/entity/TpConfigItemSingleValue.java b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/entity/TpConfigItemSingleValue.java new file mode 100644 index 0000000..db38eec --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-service/tptradeprod-common-service-integration/src/main/java/com/deepinnet/tptradeprod/common/service/integration/entity/TpConfigItemSingleValue.java @@ -0,0 +1,16 @@ +package com.deepinnet.tptradeprod.common.service.integration.entity; + +import lombok.Data; + +@Data +public class TpConfigItemSingleValue { + /** + * 配置项Code + */ + private String code; + + /** + * 配置项值 + */ + private String settingValue; +} \ No newline at end of file diff --git a/tptradeprod-common/tptradeprod-common-util/pom.xml b/tptradeprod-common/tptradeprod-common-util/pom.xml new file mode 100644 index 0000000..03e32a1 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-util/pom.xml @@ -0,0 +1,20 @@ + + + 4.0.0 + + com.deepinnet + tptradeprod-common + 1.0-SNAPSHOT + + + tptradeprod-common-util + + + + com.deepinnet + tptradeprod-common-service-facade + + + diff --git a/tptradeprod-common/tptradeprod-common-util/src/main/java/com/deepinnet/tptradeprod/common/util/constants/BizDataKeyConstants.java b/tptradeprod-common/tptradeprod-common-util/src/main/java/com/deepinnet/tptradeprod/common/util/constants/BizDataKeyConstants.java new file mode 100644 index 0000000..14de975 --- /dev/null +++ b/tptradeprod-common/tptradeprod-common-util/src/main/java/com/deepinnet/tptradeprod/common/util/constants/BizDataKeyConstants.java @@ -0,0 +1,11 @@ +package com.deepinnet.tptradeprod.common.util.constants; + +/** + * @author amos wong + * @create 2024/4/16 10:35 + * @Description + */ +public class BizDataKeyConstants { + + public static final String ONE_TIME_VERIFICATION_TICKET = "oneTimeVerificationTicket"; +} diff --git a/tptradeprod-core/pom.xml b/tptradeprod-core/pom.xml new file mode 100644 index 0000000..f51195e --- /dev/null +++ b/tptradeprod-core/pom.xml @@ -0,0 +1,19 @@ + + + 4.0.0 + + com.deepinnet + tptradeprod + 1.0-SNAPSHOT + + + tptradeprod-core + pom + + tptradeprod-core-model + tptradeprod-core-service + + + diff --git a/tptradeprod-core/tptradeprod-core-model/pom.xml b/tptradeprod-core/tptradeprod-core-model/pom.xml new file mode 100644 index 0000000..1c9c46c --- /dev/null +++ b/tptradeprod-core/tptradeprod-core-model/pom.xml @@ -0,0 +1,32 @@ + + + 4.0.0 + + com.deepinnet + tptradeprod-core + 1.0-SNAPSHOT + + + tptradeprod-core-model + + + + com.deepinnet + tptradeprod-common-service-facade + + + + com.deepinnet + tptradeprod-common-service-integration + + + + org.apache.dubbo + dubbo + + + + + diff --git a/tptradeprod-core/tptradeprod-core-model/src/main/java/com/deepinnet/tptradeprod/core/model/task/TpScheduleTask.java b/tptradeprod-core/tptradeprod-core-model/src/main/java/com/deepinnet/tptradeprod/core/model/task/TpScheduleTask.java new file mode 100644 index 0000000..3cb2093 --- /dev/null +++ b/tptradeprod-core/tptradeprod-core-model/src/main/java/com/deepinnet/tptradeprod/core/model/task/TpScheduleTask.java @@ -0,0 +1,53 @@ +package com.deepinnet.tptradeprod.core.model.task; + +import lombok.Data; + +/** + * @author amos wong + * @create 2022-11-23 11:57 + */ +@Data +public class TpScheduleTask { + + private Long id; + /** + * 内部业务号,可能为支付单号或者订单号,根据任务类型来区分 + * 如果是关闭支付单的任务就是支付单号 + */ + private String bizNo; + + /** + * 任务类型 + * + * @see com.deepinnet.tptradecore.common.enums.task.TpScheduleTaskTypeEnum + */ + private String taskType; + + /** + * 任务的状态 + * + * @see com.deepinnet.tptradecore.common.enums.task.TpScheduleTaskStatusEnum + */ + private String status; + + private String source; + + private String env; + + /** + * 预计触发的时间 + */ + private Long triggerTime; + + /** + * 实际执行的时间 + */ + private Long executeTime; + + /** + * 重试的次数 + */ + private Integer retryCount; + + private String tenantId; +} diff --git a/tptradeprod-core/tptradeprod-core-service/pom.xml b/tptradeprod-core/tptradeprod-core-service/pom.xml new file mode 100644 index 0000000..2ae3b31 --- /dev/null +++ b/tptradeprod-core/tptradeprod-core-service/pom.xml @@ -0,0 +1,101 @@ + + + 4.0.0 + + com.deepinnet + tptradeprod-core + 1.0-SNAPSHOT + + + tptradeprod-core-service + + + 3.18.0 + + + + + com.deepinnet + tptradeprod-core-model + + + + com.deepinnet + tptradeprod-common-util + + + + com.deepinnet + tptradeprod-core-model + + + + com.deepinnet + tptradeprod-common-dal + + + + com.deepinnet + tptradeprod-common-service-facade + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.springframework + spring-tx + + + org.springframework + spring-jdbc + + + org.mockito + mockito-core + test + + + + com.github.jsonzou + jmockdata + 4.3.0 + test + + + + junit + junit + test + + + + org.apache.rocketmq + rocketmq-spring-boot-starter + + + + + org.redisson + redisson-spring-boot-starter + + + org.redssion + redisson-spring-data-27 + + + + + + org.redisson + redisson-spring-data-26 + ${redisson-spring-data.version} + + + + diff --git a/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/compoment/TpChangePriceAndPayModeComponent.java b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/compoment/TpChangePriceAndPayModeComponent.java new file mode 100644 index 0000000..b9ebe5d --- /dev/null +++ b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/compoment/TpChangePriceAndPayModeComponent.java @@ -0,0 +1,389 @@ +package com.deepinnet.tptradeprod.core.compoment; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpproductcore.common.dto.product.TpProdDetailDTO; +import com.deepinnet.tpproductcore.common.dto.rule.*; +import com.deepinnet.tpproductcore.common.enums.FormalFlagEnum; +import com.deepinnet.tpproductcore.common.enums.NeedPropertiesEnum; +import com.deepinnet.tpproductcore.common.enums.TpRuleExpressionGroupEnum; +import com.deepinnet.tpproductcore.common.qto.product.TpProductQueryDTO; +import com.deepinnet.tptradecore.common.dto.order.TpOrderChangePriceDTO; +import com.deepinnet.tptradecore.common.dto.order.TpOrderChargeRecordDTO; +import com.deepinnet.tptradecore.common.dto.order.TpOrderPushStatusDTO; +import com.deepinnet.tptradecore.common.enums.order.*; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderChangeApplyDetailDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderQueryDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderPayModeEnum; +import com.deepinnet.tptradeprod.common.enums.TpOrderStatusEnum; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.TpBizRuleClient; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderChangeApplyClient; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.service.integration.client.TpProductClient; +import com.deepinnet.tptradeprod.common.vo.TpOrderChargeRecordVO; +import com.deepinnet.tptradeprod.common.vo.TpOrderTravelTripVO; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderChangeApplyDetailVO; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.google.common.collect.Lists; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + *

+ * 审核改价组件 + *

+ * + * @author chenjiaju + * @since 2023/10/12 + */ + +@Component +@RequiredArgsConstructor +public class TpChangePriceAndPayModeComponent { + + private final TpOrderClient tpOrderClient; + + private final TpProductClient tpProductClient; + + private final TpBizRuleClient tpBizRuleClient; + + private final TpOrderChangeApplyClient tpOrderChangeApplyClient; + + public void execute(TpOrderChangePriceDTO dto) { + // 查询订单详情 + TpProdOrderDetailVO orderDetail = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .originalOrderNo(dto.getOriginalOrderNo()) + .tenantId(dto.getTenantId()) + .needModules(Lists.newArrayList(TpOrderModulesEnum.ORDER_TRAVEL_TRIP.getModule(), TpOrderModulesEnum.CHARGE_RECORD.getModule())).build()); + + // 订单为待确认状态 + if (ObjectUtil.notEqual(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_NEED_CONFIRM.getStatus()) + && ObjectUtil.notEqual(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_CHANGE_AUDITING.getStatus()) + && ObjectUtil.notEqual(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_CANCEL_AUDITING.getStatus())) { + LogUtil.error("当前订单:{}, 源订单:{}, 状态为:{}, 暂无法审核", orderDetail.getOrderNo(), orderDetail.getOriginalOrderNo(), orderDetail.getStatus()); + throw new TpTradeProdException(TpTradeProdErrorCode.INVALID_ORDER_STATUS); + } + + // 审核失败 + // 首次申请,驳回 + if (!dto.getAuditStatus() && ObjectUtil.equals(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_NEED_CONFIRM.getStatus())) { + LogUtil.info("当前订单:{}, 源订单:{}, 确认审核驳回", orderDetail.getOrderNo(), orderDetail.getOriginalOrderNo()); + tpOrderClient.pushOrderStatus(TpOrderPushStatusDTO.builder() + .orderNo(orderDetail.getOrderNo()) + .tenantId(dto.getTenantId()) + .tpOrderPushStatusEnum(TpOrderPushStatusEnum.ORDER_REJECTED).build()); + // 删除当前订单产生的价格记录 + tpOrderClient.removeChargeRecord(buildRemoveChargeRecord(orderDetail.getOrderNo(), dto.getTenantId(), TpAuditOrChangePriceBizTypeEnum.CONFIRM_ORDER.getBizType())); + return; + } + + // 变更申请,驳回 + if (!dto.getAuditStatus() && ObjectUtil.equals(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_CHANGE_AUDITING.getStatus())) { + LogUtil.info("变更订单:{}, 源订单:{}, 变更审核驳回", orderDetail.getOrderNo(), orderDetail.getOriginalOrderNo()); + // 将当前最新订单置为不可见,将本订单置为不可见 + tpOrderClient.updateOrderNotVisible(orderDetail.getOrderNo(), dto.getTenantId()); + // 删除当前订单产生的价格记录 + tpOrderClient.removeChargeRecord(buildRemoveChargeRecord(orderDetail.getOrderNo(), dto.getTenantId(), TpAuditOrChangePriceBizTypeEnum.CHANGE_ORDER.getBizType())); + return; + } + + // 取消订单,驳回 + if (!dto.getAuditStatus() && ObjectUtil.equals(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_CANCEL_AUDITING.getStatus())) { + LogUtil.info("当前订单:{}, 取消审核驳回", orderDetail.getOrderNo()); + // 将当前订单恢复至之前的状态 + TpOrderStatusEnum tpOrderStatusEnumByStatus = TpOrderStatusEnum.getTpOrderStatusEnumByStatus(orderDetail.getBeforeApproveStatus(), orderDetail.getType()); + TpOrderPushStatusEnum pushStatusEnum = TpOrderPushStatusEnum.getPushStatusByType(String.valueOf(tpOrderStatusEnumByStatus)); + tpOrderClient.pushOrderStatus(TpOrderPushStatusDTO.builder() + .orderNo(orderDetail.getOrderNo()) + .tenantId(dto.getTenantId()) + .tpOrderPushStatusEnum(pushStatusEnum).build()); + + // 删除当前订单产生的价格记录 + tpOrderClient.removeChargeRecord(buildRemoveChargeRecord(orderDetail.getOrderNo(), dto.getTenantId(), TpAuditOrChangePriceBizTypeEnum.CANCEL_ORDER.getBizType())); + return; + } + + dto.setPayMode(StrUtil.isEmpty(dto.getPayMode()) ? orderDetail.getPayMode() : dto.getPayMode()); + + BigDecimal changeAmount = StrUtil.isEmpty(dto.getChangeAmount()) ? new BigDecimal(orderDetail.getPayableAmount()).setScale(2, RoundingMode.DOWN) : new BigDecimal(dto.getChangeAmount()).setScale(2, RoundingMode.DOWN); + + dto.setChangeAmount(changeAmount.toString()); + + TpOrderPushStatusEnum statusEnum = null; + + // 首次确认 + if (ObjectUtil.equals(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_NEED_CONFIRM.getStatus())) { + statusEnum = TpOrderPushStatusEnum.ORDER_ALREADY_CONFIRM; + + // 判断当前支付模式如果是先付后享的情况下,计算定金 + if (StrUtil.equals(dto.getPayMode(), TpOrderPayModeEnum.PAY_BEFORE.getPayMode())) { + TpProdDetailDTO productDetail = queryProduct(orderDetail.getProductNo(), dto.getTenantId()); + BigDecimal prepayRate = productDetail.getExtendAttributes().getPrepayRate(); + // mock 预付金额 + // BigDecimal prepayRate = new BigDecimal("0.3"); + BigDecimal payableAmount = new BigDecimal(dto.getChangeAmount()).setScale(2, RoundingMode.DOWN); + BigDecimal depositAmount = payableAmount.multiply(prepayRate).setScale(2, RoundingMode.CEILING); + dto.setPayAmount(depositAmount.toString()); + } + + // 先付后享,付全款模式 + if (StrUtil.equals(dto.getPayMode(), TpOrderPayModeEnum.PAY_BEFORE_ALL.getPayMode())) { + dto.setPayAmount(dto.getChangeAmount()); + } + + // 先享后付 + if (StrUtil.equals(dto.getPayMode(), TpOrderPayModeEnum.PAY_AFTER.getPayMode())) { + dto.setPayAmount(BigDecimal.ZERO.setScale(2, RoundingMode.DOWN).toString()); + } + + // 查询当前订单是否存在父订单,如果有父订单说明是确认中修改 + dto.setBizType(StrUtil.isNotEmpty(orderDetail.getParentOrderNo()) ? TpAuditOrChangePriceBizTypeEnum.CHANGE_ORDER.getBizType() : TpAuditOrChangePriceBizTypeEnum.CONFIRM_ORDER.getBizType()); + } + + // 变更订单改价 + if (ObjectUtil.equals(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_CHANGE_AUDITING.getStatus())) { + statusEnum = TpOrderPushStatusEnum.ORDER_CHANGE_AUDITED; + // 更改订单同意后计算手续费 + orderChangeCalServiceCharge(dto, orderDetail); + } + + // 取消订单审核 + if (ObjectUtil.equals(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_CANCEL_AUDITING.getStatus())) { + statusEnum = TpOrderPushStatusEnum.ORDER_CANCEL_AUDITED; + + // 计算取消手续费,继续推进状态,是取消退款还是取消支付 + orderCancelCalServiceCharge(dto, orderDetail); + } + +// if (ObjectUtil.isNotNull(dto.getReduceServiceCharge()) && ObjectUtil.equals(dto.getReduceServiceCharge(), Boolean.TRUE)) { +// dto.setServiceCharge(BigDecimal.ZERO.toString()); +// } + + // 改价 + tpOrderClient.changePriceAndPayMode(dto); + + // 推进订单状态 + tpOrderClient.pushOrderStatus(TpOrderPushStatusDTO.builder() + .tenantId(dto.getTenantId()) + .orderNo(orderDetail.getOrderNo()) + .tpOrderPushStatusEnum(statusEnum).build()); + } + + private TpOrderChargeRecordDTO buildRemoveChargeRecord(String orderNo, String tenantId, String bizType) { + TpOrderChargeRecordDTO tpOrderChargeRecordDTO = new TpOrderChargeRecordDTO(); + tpOrderChargeRecordDTO.setOrderNo(orderNo); + tpOrderChargeRecordDTO.setBizType(bizType); + tpOrderChargeRecordDTO.setTenantId(tenantId); + return tpOrderChargeRecordDTO; + } + + private void orderChangeCalServiceCharge(TpOrderChangePriceDTO dto, TpProdOrderDetailVO orderDetail) { + // 变更订单审核更改价格与支付模式 + // 查询上一笔订单应付金额,如当前改价后价格大于上一笔无需计算手续费,如小于,需要通过当前变更手续费 + TpProdOrderDetailVO previousOrderDetail = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .orderNo(orderDetail.getParentOrderNo()) + .tenantId(dto.getTenantId()).build()); + + // 查询产品信息 + TpProdDetailDTO productDetail = queryProduct(previousOrderDetail.getProductNo(), dto.getTenantId()); + + // 变更订单前状态为订金待支付情况下不返回手续费 + // 上一笔待支付的情况下,重新计算当前需要支付的金额 + if (ObjectUtil.equals(previousOrderDetail.getStatus(), TpOrderStatusEnum.ORDER_DEPOSIT_NEED_PAY.getStatus()) + && StrUtil.equals(previousOrderDetail.getPayMode(), TpOrderPayModeEnum.PAY_BEFORE.getPayMode())) { + BigDecimal prepayRate = productDetail.getExtendAttributes().getPrepayRate(); + BigDecimal payableAmount = new BigDecimal(dto.getChangeAmount()).setScale(2, RoundingMode.DOWN); + BigDecimal depositAmount = payableAmount.multiply(prepayRate).setScale(2, RoundingMode.DOWN); + dto.setPayAmount(depositAmount.toString()); + return; + } + + // 订金待支付情况下且付全款情况下变更订单需使用改价后的价格作为支付金额 + if (ObjectUtil.equals(previousOrderDetail.getStatus(), TpOrderStatusEnum.ORDER_DEPOSIT_NEED_PAY.getStatus()) + && StrUtil.equals(previousOrderDetail.getPayMode(), TpOrderPayModeEnum.PAY_BEFORE_ALL.getPayMode())) { + dto.setPayAmount(dto.getChangeAmount()); + return; + } + + // 上一笔产生的手续费 + BigDecimal serviceCharge = StrUtil.isEmpty(previousOrderDetail.getServiceCharge()) ? BigDecimal.ZERO : new BigDecimal(previousOrderDetail.getServiceCharge()); + + // 当前变更订单免手续费 + if (StrUtil.equals(TpServiceChargeOperationTypeEnum.SINGLE_FREE_SERVICE_CHARGE.getBizType(), dto.getServiceChargeOperationType())) { + dto.setCurrentOperatorServiceCharge(null); + dto.setServiceCharge(serviceCharge.setScale(2, RoundingMode.DOWN).toString()); + dto.setPayAmount(orderDetail.getPayAmount()); + return; + } + + BigDecimal previousPayableAmount = new BigDecimal(previousOrderDetail.getPayableAmount()); + BigDecimal currentPayableAmount = new BigDecimal(dto.getChangeAmount()).setScale(2, RoundingMode.DOWN); + + // 当前变更后的价格小于上一笔订单的应付金额,需要计算手续费 + if (currentPayableAmount.compareTo(previousPayableAmount) < 0) { + + List changeRecord = orderDetail.getOrderChargeRecords().stream().filter(record -> StrUtil.equals(orderDetail.getOrderNo(), record.getOrderNo()) && StrUtil.equals(dto.getBizType(), TpAuditOrChangePriceBizTypeEnum.CHANGE_ORDER.getBizType())).collect(Collectors.toList()); + + BigDecimal subtractMoney = previousPayableAmount.subtract(currentPayableAmount); + + TpOrderChargeRecordVO tpOrderChargeRecordVO = changeRecord.get(0); + + BigDecimal currentOperatorServiceCharge = subtractMoney.multiply(StrUtil.isEmpty(tpOrderChargeRecordVO.getServicePercentage()) ? BigDecimal.ZERO : new BigDecimal(tpOrderChargeRecordVO.getServicePercentage())); + // BigDecimal currentOperatorServiceCharge = StrUtil.isEmpty(tpOrderChargeRecordVO.getServiceCharge()) ? BigDecimal.ZERO : new BigDecimal(tpOrderChargeRecordVO.getServiceCharge()); + // 计算总手续费 + dto.setServiceCharge(serviceCharge.add(currentOperatorServiceCharge).setScale(2, RoundingMode.DOWN).toString()); + // 当前操作手续费 + dto.setCurrentOperatorServiceCharge(currentOperatorServiceCharge.setScale(2, RoundingMode.DOWN).toString()); + // 当前操作手续费费率 + dto.setServicePercentage(StrUtil.isEmpty(tpOrderChargeRecordVO.getServicePercentage()) ? BigDecimal.ZERO.setScale(2, RoundingMode.DOWN).toString() : tpOrderChargeRecordVO.getServicePercentage()); + } else { + // 如果当前不收取手续费,需要将原来手续费带到当前订单中 + dto.setServiceCharge(serviceCharge.toString()); + dto.setCurrentOperatorServiceCharge(null); + } + + if (ObjectUtil.equals(previousOrderDetail.getStatus(), TpOrderStatusEnum.ORDER_NEED_DISPATCH.getStatus()) + || ObjectUtil.equals(previousOrderDetail.getStatus(), TpOrderStatusEnum.ORDER_DISPATCHED.getStatus())) { + dto.setPayAmount(previousOrderDetail.getPayAmount()); + } + } + + private TpRuleExecuteDTO getChangeRuleDTO(TpOrderChangePriceDTO dto, TpProdDetailDTO productDetail, BigDecimal subtractMoney, List tpOrderTravelTrips) { + // 找到发车时间最早的时间 + Long pickUpTime; + if (tpOrderTravelTrips.size() == 1) { + pickUpTime = Convert.toLong(tpOrderTravelTrips.get(0).getStartTime()); + } else { + List goTrip = tpOrderTravelTrips.stream().filter(station -> StrUtil.equals(station.getTripType(), TpOrderTripTypeEnum.GO.getCode())).collect(Collectors.toList()); + pickUpTime = Convert.toLong(goTrip.get(0).getStartTime()); + } + + TpProdOrderChangeApplyDetailVO orderChangedApplyDetail = tpOrderChangeApplyClient.getOrderChangedApplyDetail(TpProdOrderChangeApplyDetailDTO.builder() + .originalOrderNo(dto.getOriginalOrderNo()) + .applyType(TpOrderChangeTypeEnum.ORDER_CHANGE.getType()) + .tenantId(dto.getTenantId()).build()); + Long applyTime = orderChangedApplyDetail.getApplyTime(); + + // 将产品信息对应的规则信息转换成Map + Map> rulesMap = productDetail.getRules().stream().collect(Collectors.groupingBy(TpBizRuleDTO::getRuleGroup)); + + // 找到对应的变更手续费的规则 + List buyRules = rulesMap.get(TpRuleExpressionGroupEnum.CHANGE_ORDER_CHARGE.getCode()); + List rules = Lists.newArrayList(); + buyRules.forEach(rule -> rules.add(rule.getExpression())); + + // 构建执行入参 + TpChangeOrderChargeParamDTO param = new TpChangeOrderChargeParamDTO(); + param.setOrderPriceChange(subtractMoney); + // 发车时间 + param.setDepartureTime(pickUpTime); + param.setOccurTime(applyTime); + + TpRuleExecuteDTO ruleExecuteDTO = new TpRuleExecuteDTO<>(); + ruleExecuteDTO.setRuleList(rules); + ruleExecuteDTO.setParameter(param); + ruleExecuteDTO.setRuleExpressionGroup(TpRuleExpressionGroupEnum.CHANGE_ORDER_CHARGE); + ruleExecuteDTO.setTenantId(dto.getTenantId()); + return ruleExecuteDTO; + } + + private void orderCancelCalServiceCharge(TpOrderChangePriceDTO dto, TpProdOrderDetailVO orderDetail) { + // 之前的手续费 + BigDecimal preServiceCharge = StrUtil.isEmpty(orderDetail.getServiceCharge()) ? BigDecimal.ZERO.setScale(2, RoundingMode.DOWN) : new BigDecimal(orderDetail.getServiceCharge()).setScale(2, RoundingMode.DOWN); + + List cancelRecord = orderDetail.getOrderChargeRecords().stream().filter(record -> + StrUtil.equals(record.getBizType(), TpAuditOrChangePriceBizTypeEnum.CANCEL_ORDER.getBizType())) + .collect(Collectors.toList()); + + BigDecimal currentOperatorServiceCharge = StrUtil.isEmpty(cancelRecord.get(0).getServiceCharge()) ? BigDecimal.ZERO.setScale(2, RoundingMode.DOWN) : new BigDecimal(cancelRecord.get(0).getServiceCharge()).setScale(2, RoundingMode.DOWN); + + // 单次取消减免手续费,设置当前操作手续费为0 + if (StrUtil.equals(TpServiceChargeOperationTypeEnum.SINGLE_FREE_SERVICE_CHARGE.getBizType(), dto.getServiceChargeOperationType())) { + currentOperatorServiceCharge = null; + } + + // 全部手续费减免, 设置当前操作手续费为0, 前置之前的手续费也置为0 + if (StrUtil.equals(TpServiceChargeOperationTypeEnum.FREE_SERVICE_CHARGE.getBizType(), dto.getServiceChargeOperationType())) { + currentOperatorServiceCharge = null; + preServiceCharge = BigDecimal.ZERO; + } + + dto.setServiceCharge(preServiceCharge.add(ObjectUtil.isNull(currentOperatorServiceCharge) ? BigDecimal.ZERO : currentOperatorServiceCharge).setScale(2, RoundingMode.DOWN).toString()); + dto.setCurrentOperatorServiceCharge(ObjectUtil.isNull(currentOperatorServiceCharge) ? null : currentOperatorServiceCharge.toString()); + dto.setServicePercentage(StrUtil.isEmpty(cancelRecord.get(0).getServicePercentage()) ? null : cancelRecord.get(0).getServicePercentage()); + + // 更改后的金额置空 + dto.setChangeAmount(null); + + } + + private TpRuleExecuteDTO getCancelRuleDTO(TpOrderChangePriceDTO dto, TpProdDetailDTO productDetail, BigDecimal amount, List travelTripVOs) { + // 找到发车时间最早的时间 + Long pickUpTime; + if (travelTripVOs.size() == 1) { + pickUpTime = Convert.toLong(travelTripVOs.get(0).getStartTime()); + } else { + List goTrip = travelTripVOs.stream().filter(station -> StrUtil.equals(station.getTripType(), TpOrderTripTypeEnum.GO.getCode())).collect(Collectors.toList()); + pickUpTime = Convert.toLong(goTrip.get(0).getStartTime()); + } + TpProdOrderChangeApplyDetailVO orderChangedApplyDetail = tpOrderChangeApplyClient.getOrderChangedApplyDetail(TpProdOrderChangeApplyDetailDTO.builder() + .orderNo(dto.getOriginalOrderNo()) + .originalOrderNo(dto.getOriginalOrderNo()) + .applyType(TpOrderChangeTypeEnum.ORDER_CANCEL.getType()) + .tenantId(dto.getTenantId()).build()); + Long applyTime = orderChangedApplyDetail.getApplyTime(); + + // 将产品信息对应的规则信息转换成Map + Map> rulesMap = productDetail.getRules().stream().collect(Collectors.groupingBy(TpBizRuleDTO::getRuleGroup)); + + // 找到对应的变更手续费的规则 + List buyRules = rulesMap.get(TpRuleExpressionGroupEnum.CHARTER_REFUND_CHARGE.getCode()); + List rules = Lists.newArrayList(); + buyRules.forEach(rule -> rules.add(rule.getExpression())); + + // 构建执行入参 + TpCharterRefundParamDTO param = new TpCharterRefundParamDTO(); + param.setOrderPrice(amount); + param.setDepartureTime(pickUpTime); + param.setOccurTime(applyTime); + + TpRuleExecuteDTO ruleExecuteDTO = new TpRuleExecuteDTO<>(); + ruleExecuteDTO.setRuleList(rules); + ruleExecuteDTO.setParameter(param); + ruleExecuteDTO.setRuleExpressionGroup(TpRuleExpressionGroupEnum.CHARTER_REFUND_CHARGE); + ruleExecuteDTO.setTenantId(dto.getTenantId()); + + return ruleExecuteDTO; + } + + private TpProdDetailDTO queryProduct(String productNo, String tenantId) { + TpProductQueryDTO tpProductQueryDTO = new TpProductQueryDTO(); + tpProductQueryDTO.setProductCode(productNo); + tpProductQueryDTO.setFormalFlag(FormalFlagEnum.FORMAL.getCode()); + tpProductQueryDTO.setTenantId(tenantId); + tpProductQueryDTO.setNeedProperties(Lists.newArrayList( + NeedPropertiesEnum.SERVICE_OBJECT.getCode(), + //NeedPropertiesEnum.SUBJECT_ITEM.getCode(), + NeedPropertiesEnum.SALES_UNIT.getCode(), + NeedPropertiesEnum.BIZ_RULE.getCode(), + NeedPropertiesEnum.ROUTE.getCode(), + NeedPropertiesEnum.FRONT_CATEGORY.getCode(), + NeedPropertiesEnum.BACK_CATEGORY.getCode(), + NeedPropertiesEnum.EXTEND_ATTRIBUTE.getCode() + //NeedPropertiesEnum.PRICE_UNIT.getCode() + //NeedPropertiesEnum.INVENTORY.getCode() + )); + return tpProductClient.getProduct(tpProductQueryDTO); + } + +} diff --git a/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/compoment/TpCharterBusInquireComponent.java b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/compoment/TpCharterBusInquireComponent.java new file mode 100644 index 0000000..9fd95cd --- /dev/null +++ b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/compoment/TpCharterBusInquireComponent.java @@ -0,0 +1,155 @@ +package com.deepinnet.tptradeprod.core.compoment; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson2.JSONObject; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tp.common.lang.util.TpMoney; +import com.deepinnet.tpproductcore.common.dto.price.chartered.TpCharteredPriceInquiryDTO; +import com.deepinnet.tpproductcore.common.dto.rule.TpCharteredBusPricingParamDTO; +import com.deepinnet.tpproductcore.common.vo.price.TpCharteredPriceInquiryDetailVO; +import com.deepinnet.tpproductcore.common.vo.price.TpCharteredPriceInquiryResultVO; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.enums.TpOrderTypeEnum; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.TpInquireClient; +import com.google.common.collect.Lists; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; +import java.util.stream.Collectors; + +/** + *

+ * 定制包车询价组建 + *

+ * + * @author chenjiaju + * @since 2023/10/12 + */ + +@Component +@RequiredArgsConstructor +public class TpCharterBusInquireComponent { + + private final TpInquireClient tpInquireClient; + + public List execute(TpProdOrderCreateDTO dto) { + List prodInquireParams = dto.getInquireParams(); + List inquireDTOList = buildInquireDtoList(prodInquireParams); + TpCharteredPriceInquiryResultVO inquiryResultVO = tpInquireClient.inquiryCharteredPrice(inquireDTOList); + + // 预约包车价格判断 + if (ObjectUtil.equal(dto.getType(), TpOrderTypeEnum.PACKING_ORDER.getType()) + && ObjectUtil.notEqual(inquiryResultVO.getTotalDiscountAmount().compare(new TpMoney(dto.getPayableAmount(), TpMoney.ValueUnitEnum.YUAN)), TpMoney.CompareResult.EQUAL)) { + // 票价格不等 + LogUtil.error("[预约包车]应付金额发生变更, 询价结果:{}, 前端传入结果:{}", inquiryResultVO.getTotalDiscountAmount().toString(), dto.getPayAmount()); + throw new TpTradeProdException(TpTradeProdErrorCode.PRICE_CHANGE); + } + + /*TpMoney prePayAmount = ObjectUtil.isNull(inquiryResultVO.getPrepayAmount()) ? new TpMoney("0", TpMoney.ValueUnitEnum.YUAN) : inquiryResultVO.getPrepayAmount(); + + // 预约包车价格判断 + if (ObjectUtil.equal(dto.getType(), TpOrderTypeEnum.PACKING_ORDER.getType()) + && ObjectUtil.notEqual(prePayAmount.compare(new TpMoney(dto.getPayAmount(), TpMoney.ValueUnitEnum.YUAN)), TpMoney.CompareResult.EQUAL)) { + // 票价格不等 + LogUtil.error("[预约包车]实际需支付价格发生变更, 询价结果:{}, 前端传入结果:{}", inquiryResultVO.getTotalDiscountAmount().toString(), dto.getPayAmount()); + throw new TpTradeProdException(TpTradeProdErrorCode.PRICE_CHANGE); + }*/ + + // 询价后的参数 + return buildTpOrderPriceRecord(dto, inquiryResultVO, JSONObject.toJSONString(inquireDTOList)); + } + + /** + * 内部价格询价 + * @param inquirePriceParams + * @return + */ + public String inquireInternalPrice(String inquirePriceParams) { + if(StrUtil.isEmpty(inquirePriceParams)){ + return null; + } + List prodInquireParams = JSONUtil.toList(inquirePriceParams,TpProdCharteredPriceInquiryDTO.class); + + List inquireDTOList = buildInquireDtoList(prodInquireParams); + TpMoney inquiryMinPrice = tpInquireClient.inquiryMinPrice(inquireDTOList); + if(inquiryMinPrice == null){ + return null; + } + return inquiryMinPrice.getMoney().getAmount().toString(); + + } + + private List buildInquireDtoList(List prodInquireParams) { + return prodInquireParams.stream().map(param -> { + TpCharteredPriceInquiryDTO tpCharteredPriceInquiryDTO = new TpCharteredPriceInquiryDTO(); + tpCharteredPriceInquiryDTO.setPricingParam(buildPricingParam(param.getPricingParam())); + tpCharteredPriceInquiryDTO.setSalesUnitCode(param.getSalesUnitCode()); + tpCharteredPriceInquiryDTO.setTripType(param.getTripType()); + tpCharteredPriceInquiryDTO.setCount(param.getCount()); + return tpCharteredPriceInquiryDTO; + }).collect(Collectors.toList()); + } + + private TpCharteredBusPricingParamDTO buildPricingParam(TpProdCharteredBusPricingParamDTO pricingParam) { + TpCharteredBusPricingParamDTO pricingParamDTO = new TpCharteredBusPricingParamDTO(); + pricingParamDTO.setMiles(pricingParam.getMiles()); + pricingParamDTO.setDuration(pricingParam.getDuration()); + pricingParamDTO.setProvideLodging(pricingParam.getProvideLodging()); + pricingParamDTO.setUseCarDayNum(pricingParam.getUseCarDayNum()); + pricingParamDTO.setLodgingDayNum(pricingParam.getLodgingDayNum()); + pricingParamDTO.setCarOvernightDayNum(pricingParam.getCarOvernightDayNum()); + pricingParamDTO.setTravelTimeRangeLeft(pricingParam.getTravelTimeRangeLeft()); + pricingParamDTO.setTravelTimeRangeRight(pricingParam.getTravelTimeRangeRight()); + return pricingParamDTO; + } + + private List buildTpOrderPriceRecord(TpProdOrderCreateDTO dto, TpCharteredPriceInquiryResultVO inquiryResultVO, String inquireParams) { + BigDecimal totalOriginalAmount = inquiryResultVO.getTotalOriginalAmount().getMoney().getAmount().setScale(2, RoundingMode.DOWN); + BigDecimal totalDiscountAmount = inquiryResultVO.getTotalDiscountAmount().getMoney().getAmount().setScale(2, RoundingMode.DOWN); + List records = Lists.newArrayList(); + TpProdOrderPriceRecordDTO tpProdOrderPriceRecordDTO = new TpProdOrderPriceRecordDTO(); + tpProdOrderPriceRecordDTO.setPricingOriginalAmount(totalOriginalAmount.toString()); + tpProdOrderPriceRecordDTO.setPricingDiscountAmount(totalDiscountAmount.toString()); + tpProdOrderPriceRecordDTO.setOrderPriceRecordDetails(buildPriceRecordDetail(inquiryResultVO.getDetails())); + tpProdOrderPriceRecordDTO.setTenantId(dto.getTenantId()); + tpProdOrderPriceRecordDTO.setPricingParams(inquireParams); + tpProdOrderPriceRecordDTO.setPayPercentage(inquiryResultVO.getPrepayRate()); + tpProdOrderPriceRecordDTO.setBizData(dto.getInquireParams().get(0).getBizData()); + records.add(tpProdOrderPriceRecordDTO); + + BigDecimal payAmount = new BigDecimal(dto.getPayAmount()).setScale(2, RoundingMode.DOWN); + BigDecimal payableAmount = new BigDecimal(dto.getPayableAmount()).setScale(2, RoundingMode.DOWN); + BigDecimal originalAmount = new BigDecimal(dto.getOriginalAmount()).setScale(2, RoundingMode.DOWN); + dto.setPayAmount(payAmount.toString()); + dto.setPayableAmount(payableAmount.toString()); + dto.setOriginalAmount(originalAmount.toString()); + return records; + } + + private List buildPriceRecordDetail(List details) { + List detailDTOList = Lists.newArrayList(); + details.forEach(detail -> { + TpProdOrderPriceRecordDetailDTO tpProdOrderPriceRecordDetailDTO = new TpProdOrderPriceRecordDetailDTO(); + tpProdOrderPriceRecordDetailDTO.setItemNo(detail.getSalesUnitCode()); + tpProdOrderPriceRecordDetailDTO.setSingleOriginalAmount(ObjectUtil.isNotNull(detail.getSingleOriginalAmount()) ? detail.getSingleOriginalAmount().getMoney().getAmount().setScale(2, RoundingMode.DOWN).toString() : null); + tpProdOrderPriceRecordDetailDTO.setSingleDiscountAmount(ObjectUtil.isNotNull(detail.getSingleDiscountAmount()) ? detail.getSingleDiscountAmount().getMoney().getAmount().setScale(2, RoundingMode.DOWN).toString() : null); + tpProdOrderPriceRecordDetailDTO.setTotalOriginalAmount(ObjectUtil.isNotNull(detail.getTotalOriginalAmount()) ? detail.getTotalOriginalAmount().getMoney().getAmount().setScale(2, RoundingMode.DOWN).toString() : null); + tpProdOrderPriceRecordDetailDTO.setTotalDiscountAmount(ObjectUtil.isNotNull(detail.getTotalDiscountAmount()) ? detail.getTotalDiscountAmount().getMoney().getAmount().setScale(2, RoundingMode.DOWN).toString() : null); + Map bizData = new HashMap<>(); + bizData.put("count", detail.getCount()); + bizData.put("singleOrRoundTrip", detail.getSingleOrRoundTrip()); + bizData.put("details", JSONObject.toJSONString(detail.getDetails())); + tpProdOrderPriceRecordDetailDTO.setBizData(bizData); + detailDTOList.add(tpProdOrderPriceRecordDetailDTO); + }); + return detailDTOList; + } + +} diff --git a/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/compoment/TpCreateOrderComponent.java b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/compoment/TpCreateOrderComponent.java new file mode 100644 index 0000000..d29ae15 --- /dev/null +++ b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/compoment/TpCreateOrderComponent.java @@ -0,0 +1,69 @@ +package com.deepinnet.tptradeprod.core.compoment; + +import com.alibaba.fastjson2.JSONObject; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpproductcore.common.dto.inventory.TpInventoryOperationDTO; +import com.deepinnet.tpproductcore.common.enums.TpInventoryBizTypeEnum; +import com.deepinnet.tpproductcore.common.enums.TpInventoryOperationTypeEnum; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.enums.TpProdOrderIdentityFlagEnum; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.TpInventoryClient; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderCreateVO; +import com.google.common.collect.Lists; +import lombok.RequiredArgsConstructor; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +/** + *

+ * 创建订单组件 + *

+ * + * @author chenjiaju + * @since 2023/10/12 + */ + +@Component +@RequiredArgsConstructor +public class TpCreateOrderComponent { + + private final RedissonClient redissonClient; + + private final TpOrderClient tpOrderClient; + + public TpProdOrderCreateVO execute(TpProdOrderCreateDTO dto) { + // 使用外部请求号当作redisson分布式锁的key,由 timestamp + user + productNo 组成 + String outRequestNo = dto.getOutRequestNo(); + RLock lock = redissonClient.getLock(outRequestNo); + boolean tryLock = lock.tryLock(); + // 判断是否获取到当锁 + if (!tryLock) { + LogUtil.error("重复提交:{}", JSONObject.toJSONString(dto)); + throw new TpTradeProdException(TpTradeProdErrorCode.IDEMPOTENT_REQUEST_ERROR); + } + + try { + LogUtil.info("创单组件获取到锁,锁定对象:{}", outRequestNo); + return tpOrderClient.createOrder(dto); + } catch (Exception e) { + LogUtil.error("创单失败:", e); + throw new TpTradeProdException(TpTradeProdErrorCode.CREATE_ORDER_ERROR); + } finally { + // 释放锁 + if (lock.isLocked() && lock.isHeldByCurrentThread()) { + lock.unlock(); + } + } + } + +} diff --git a/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/compoment/TpInquireComponent.java b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/compoment/TpInquireComponent.java new file mode 100644 index 0000000..e43b0b0 --- /dev/null +++ b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/compoment/TpInquireComponent.java @@ -0,0 +1,159 @@ +package com.deepinnet.tptradeprod.core.compoment; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson2.JSONObject; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tp.common.lang.util.TpMoney; +import com.deepinnet.tpproductcore.common.vo.price.TpPriceInquiryDetailVO; +import com.deepinnet.tpproductcore.common.vo.price.TpPriceInquiryResultVO; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.enums.TpOrderTypeEnum; +import com.deepinnet.tptradeprod.common.enums.TpProdOrderTicketTypeEnum; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.TpInquireClient; +import com.google.common.collect.Lists; +import lombok.RequiredArgsConstructor; +import org.jetbrains.annotations.NotNull; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + *

+ * 询价组件 + *

+ * + * @author chenjiaju + * @since 2023/10/12 + */ + +@Component +@RequiredArgsConstructor +public class TpInquireComponent { + + private final TpInquireClient tpInquireClient; + + public List execute(TpProdOrderCreateDTO dto) { + List inquireDTOList = getPrice(dto); + LogUtil.info("[定制公交]询价参数:{}", JSONObject.toJSONString(inquireDTOList)); + TpPriceInquiryResultVO tpPriceInquiryResultVO = tpInquireClient.inquirePrice(inquireDTOList); + + // 定制公交价格判断 + if (ObjectUtil.equal(dto.getType(), TpOrderTypeEnum.CUSTOMIZED_ORDER.getType()) + && ObjectUtil.notEqual(tpPriceInquiryResultVO.getTotalDiscountAmount().compare(new TpMoney(dto.getPayAmount(), TpMoney.ValueUnitEnum.YUAN)), TpMoney.CompareResult.EQUAL)) { + // 票价格不等 + LogUtil.error("[定制公交]票价发生变更, 询价结果:{}, 前端传入结果:{}", tpPriceInquiryResultVO.getTotalDiscountAmount().toString(), dto.getPayAmount()); + throw new TpTradeProdException(TpTradeProdErrorCode.PRICE_CHANGE); + } + + // 询价后的参数 + return buildTpOrderPriceRecord(dto, tpPriceInquiryResultVO, JSONObject.toJSONString(inquireDTOList)); + } + + private List buildTpOrderPriceRecord(TpProdOrderCreateDTO dto, TpPriceInquiryResultVO inquiryResultVO, String inquireParams) { + List records = Lists.newArrayList(); + TpProdOrderPriceRecordDTO tpProdOrderPriceRecordDTO = new TpProdOrderPriceRecordDTO(); + tpProdOrderPriceRecordDTO.setPricingOriginalAmount(inquiryResultVO.getTotalOriginalAmount().toString()); + tpProdOrderPriceRecordDTO.setPricingDiscountAmount(inquiryResultVO.getTotalDiscountAmount().toString()); + tpProdOrderPriceRecordDTO.setOrderPriceRecordDetails(buildPriceRecordDetail(inquiryResultVO.getDetails())); + tpProdOrderPriceRecordDTO.setTenantId(dto.getTenantId()); + tpProdOrderPriceRecordDTO.setPricingParams(inquireParams); + records.add(tpProdOrderPriceRecordDTO); + return records; + } + + private List buildPriceRecordDetail(List details) { + List detailDTOList = Lists.newArrayList(); + details.forEach(detail -> { + TpProdOrderPriceRecordDetailDTO tpProdOrderPriceRecordDetailDTO = new TpProdOrderPriceRecordDetailDTO(); + tpProdOrderPriceRecordDetailDTO.setItemNo(detail.getSalesUnitCode()); + tpProdOrderPriceRecordDetailDTO.setPassengerType(detail.getPassengerType()); + tpProdOrderPriceRecordDetailDTO.setPassengerCount(detail.getPassengerCount()); + tpProdOrderPriceRecordDetailDTO.setSingleOriginalAmount(ObjectUtil.isNotNull(detail.getSingleOriginalAmount()) ? detail.getSingleOriginalAmount().toString() : null); + tpProdOrderPriceRecordDetailDTO.setSingleDiscountAmount(ObjectUtil.isNotNull(detail.getSingleDiscountAmount()) ? detail.getSingleDiscountAmount().toString() : null); + tpProdOrderPriceRecordDetailDTO.setTotalOriginalAmount(ObjectUtil.isNotNull(detail.getTotalOriginalAmount()) ? detail.getTotalOriginalAmount().toString() : null); + tpProdOrderPriceRecordDetailDTO.setTotalDiscountAmount(ObjectUtil.isNotNull(detail.getTotalDiscountAmount()) ? detail.getTotalDiscountAmount().toString() : null); + + detailDTOList.add(tpProdOrderPriceRecordDetailDTO); + }); + return detailDTOList; + } + + /** + * 构建询价参数 + * + * @param dto 创建订单参数 + * @return 询价参数 + */ + private List getPrice(TpProdOrderCreateDTO dto) { + List inquireList = Lists.newArrayList(); + + // 售卖单元去重,根据售卖单元相同的乘客数量相加 +// List dedupedSubjectItemList = getTpOrderSubjectItemDTOS(dto); + List dedupedSubjectItemList = dto.getOrderSubjectItem(); + long currentTimestamp = DateUtil.current(); + // BigDecimal miles = StrUtil.isEmpty(dto.getStationDTO().getMiles()) ? null : new BigDecimal(dto.getStationDTO().getMiles()); + + Map busStationTripTypeMap = dto.getCharterBusStations().stream().collect(Collectors.toMap(TpOrderStationDTO::getTripType, Function.identity(), (k1, k2) -> k2)); + dedupedSubjectItemList.forEach(subjectItemDTO -> { + TpOrderStationDTO tripTypeStation = busStationTripTypeMap.get(subjectItemDTO.getTripType()); + BigDecimal miles = null; + if (CollUtil.isNotEmpty(dto.getCharterBusStations()) && CollUtil.isNotEmpty(dto.getCharterBusStations().stream().filter(station -> StrUtil.equals(station.getTripType(), subjectItemDTO.getTripType())).collect(Collectors.toList()))) { + TpOrderStationDTO stationDTO = dto.getCharterBusStations().stream().filter(station -> StrUtil.equals(station.getTripType(), subjectItemDTO.getTripType())).collect(Collectors.toList()).get(0); + miles = new BigDecimal(stationDTO.getMiles()); + } + + inquireList.add(TpProdPriceInquireDTO.builder() + .tenantId(dto.getTenantId()) + .salesUnitCode(subjectItemDTO.getItemNo()) + .passengerType(ObjectUtil.isNull(subjectItemDTO.getPassengerInfo()) ? null : subjectItemDTO.getPassengerInfo().getPassengerType()) + .pricingParam(TpProdPricingParamDTO.builder() + .nowTime(currentTimestamp) + .miles(miles) + .passengerType(ObjectUtil.isNull(subjectItemDTO.getPassengerInfo()) ? null : subjectItemDTO.getPassengerInfo().getPassengerType()) + .stationCount(tripTypeStation.getStationCount()) + .passengerCount(subjectItemDTO.getCount()) + .ticketType(switchInquireTicketType(dto.getTicketType())) + .goBackType(subjectItemDTO.getTripType()).build()).build()); + }); + return inquireList; + } + + private String switchInquireTicketType(String ticketType) { + TpProdOrderTicketTypeEnum ticketTypeEnum = Optional.ofNullable(TpProdOrderTicketTypeEnum.getEnum(ticketType)).orElseThrow(() -> new TpTradeProdException(TpTradeProdErrorCode.TICKET_TYPE_NOT_EXIST)); + return ticketTypeEnum.getInquireTicketType(); + } + + @NotNull + private static List getTpOrderSubjectItemDTOS(TpProdOrderCreateDTO dto) { + Map distinctMap = new HashMap<>(); + + List orderSubjectItem = dto.getOrderSubjectItem(); + orderSubjectItem.forEach(item -> { + String passengerType = item.getPassengerInfo() != null ? item.getPassengerInfo().getPassengerType() : null; + String key = item.getItemNo() + "_" + passengerType; + + distinctMap.compute(key, (k, v) -> { + TpOrderSubjectItemDTO tpOrderSubjectItemDTO = new TpOrderSubjectItemDTO(); + if (ObjectUtil.isNull(v)) { + BeanUtil.copyProperties(item, tpOrderSubjectItemDTO); + } else { + BeanUtil.copyProperties(v, tpOrderSubjectItemDTO); + tpOrderSubjectItemDTO.setCount(tpOrderSubjectItemDTO.getCount() + 1); + } + return tpOrderSubjectItemDTO; + }); + }); + + return new ArrayList<>(distinctMap.values()); + } + +} diff --git a/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/compoment/TpOrderSyncTripComponent.java b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/compoment/TpOrderSyncTripComponent.java new file mode 100644 index 0000000..617140f --- /dev/null +++ b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/compoment/TpOrderSyncTripComponent.java @@ -0,0 +1,317 @@ +package com.deepinnet.tptradeprod.core.compoment; + +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpbaseopcore.common.dto.dispatch.sync.TpCharteredBusTripDTO; +import com.deepinnet.tpbaseopcore.common.dto.dispatch.sync.TpCoordinatesDto; +import com.deepinnet.tpbaseopcore.common.dto.dispatch.sync.TpFleetRelationDTO; +import com.deepinnet.tpproductcore.common.enums.TpFactorCodeEnum; +import com.deepinnet.tptradecore.common.dto.order.TpOrderQueryDTO; +import com.deepinnet.tptradecore.common.dto.order.TpOrderTravelDispatchDTO; +import com.deepinnet.tptradecore.common.enums.order.TpOrderTravelTripStatusEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderTripTypeEnum; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderDispatchDetailDTO; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderDispatchClient; +import com.deepinnet.tptradeprod.common.service.integration.client.TpTripClient; +import com.deepinnet.tptradeprod.common.vo.*; +import org.apache.commons.collections4.CollectionUtils; +import org.jetbrains.annotations.NotNull; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + *

+ * 行程同步组件 + *

+ * + * @author chenjiaju + * @since 2023/12/1 + */ + +@Component +public class TpOrderSyncTripComponent { + + @Resource + private TpOrderClient tpOrderClient; + + @Resource + private TpTripClient tpTripClient; + + @Resource + private TpOrderDispatchClient tpOrderDispatchClient; + + public void createSync(TpProdOrderDetailVO orderDetail, String tenantId) { + List unSyncTrips = orderDetail.getTpOrderTravelTrips().stream().filter(trip -> StrUtil.equals(trip.getTripStatus(), TpOrderTravelTripStatusEnum.UN_SYNC.getDispatchStatus())).collect(Collectors.toList()); + + // 如果重试时所有行程单都同步完成,则跳过当前节点 + if (CollUtil.isEmpty(unSyncTrips)) { + LogUtil.info("当前订单:{}, 创建行程单同步完成, 跳过当前同步步骤", orderDetail.getOrderNo()); + return; + } + + List orderSubjectItem = orderDetail.getOrderSubjectItem(); + + // 查询当前分配的车队ID + TpProdOrderDispatchDetailDTO tpOrderDispatchDetailDTO = new TpProdOrderDispatchDetailDTO(); + tpOrderDispatchDetailDTO.setOrderNo(orderDetail.getOriginalOrderNo()); + tpOrderDispatchDetailDTO.setTenantId(tenantId); + + TpProdOrderDispatchDetailVO orderDispatchDetail = tpOrderDispatchClient.getOrderDispatchDetail(tpOrderDispatchDetailDTO); + + for (TpOrderTravelTripVO unSyncTrip : unSyncTrips) { + // 某一行程车辆信息 + List singleTripSubjectItem = orderSubjectItem.stream().filter(subjectItem -> StrUtil.equals(subjectItem.getTripType(), unSyncTrip.getTripType())).collect(Collectors.toList()); + + // 全部位置信息 + List tripPositions = unSyncTrip.getTripPositions(); + // 途径点信息 + ArrayList pathPoints = new ArrayList<>(tripPositions.subList(1, tripPositions.size() - 1)); + + TpCharteredBusTripDTO tpCharteredBusTripDTO = buildSyncCharterBusTripParams(unSyncTrip, tenantId, orderDetail, tripPositions, pathPoints, singleTripSubjectItem, orderDispatchDetail); + + // 同步当前行程到主数据 + tpTripClient.createTrip(tpCharteredBusTripDTO); + + // 同步后更改当前行程单状态 + TpOrderTravelDispatchDTO tpOrderTravelDispatchDTO = buildTripStatusParams(unSyncTrip, orderDetail.getOrderNo(), tenantId, TpOrderTravelTripStatusEnum.ALREADY_SYNC); + tpOrderClient.syncTravelDispatchStatus(tpOrderTravelDispatchDTO); + } + } + + public void updateSync(TpProdOrderDetailVO nowOrder, TpProdOrderDetailVO oldOrder, String tenantId) { + List oldSyncTrips = oldOrder.getTpOrderTravelTrips(); + List nowSyncTrips = nowOrder.getTpOrderTravelTrips(); + List orderSubjectItem = nowOrder.getOrderSubjectItem(); + + List unSyncTrips = nowSyncTrips.stream().filter(trip -> StrUtil.equals(trip.getTripStatus(), TpOrderTravelTripStatusEnum.UN_SYNC.getDispatchStatus())).collect(Collectors.toList()); + + // 如果重试时所有行程单都同步完成,则跳过当前节点 + if (CollUtil.isEmpty(unSyncTrips)) { + LogUtil.info("当前订单:{}, 更新行程单已同步完成, 跳过当前同步步骤", nowOrder.getOrderNo()); + return; + } + + // 查询当前分配的车队ID + TpProdOrderDispatchDetailDTO tpOrderDispatchDetailDTO = new TpProdOrderDispatchDetailDTO(); + tpOrderDispatchDetailDTO.setOriginalOrderNo(nowOrder.getOriginalOrderNo()); + tpOrderDispatchDetailDTO.setTenantId(tenantId); + + TpProdOrderDispatchDetailVO orderDispatchDetail = tpOrderDispatchClient.getOrderDispatchDetail(tpOrderDispatchDetailDTO); + + Map oldSyncTripsMap = CollStreamUtil.toIdentityMap(oldSyncTrips, TpOrderTravelTripVO::getTripNo); + + unSyncTrips.forEach(nowSyncTrip -> { + // 某一行程车辆信息 + List singleTripSubjectItem = orderSubjectItem.stream().filter(subjectItem -> StrUtil.equals(subjectItem.getTripType(), nowSyncTrip.getTripType())).collect(Collectors.toList()); + + // 全部位置信息 + List tripPositions = nowSyncTrip.getTripPositions(); + // 途径点信息 + ArrayList pathPoints = new ArrayList<>(tripPositions.subList(1, tripPositions.size() - 1)); + + TpCharteredBusTripDTO tpCharteredBusTripDTO = buildSyncCharterBusTripParams(nowSyncTrip, tenantId, nowOrder, tripPositions, pathPoints, singleTripSubjectItem, orderDispatchDetail); + + String tripNo = nowSyncTrip.getTripNo(); + TpOrderTravelTripVO oldTrip = oldSyncTripsMap.get(tripNo); + if (oldTrip == null) { + //说明是新增 + // 同步当前行程到主数据 + tpTripClient.createTrip(tpCharteredBusTripDTO); + // 同步后更改当前行程单状态 + TpOrderTravelDispatchDTO tpOrderTravelDispatchDTO = buildTripStatusParams(nowSyncTrip, nowOrder.getOrderNo(), tenantId, TpOrderTravelTripStatusEnum.ALREADY_SYNC); + tpOrderClient.syncTravelDispatchStatus(tpOrderTravelDispatchDTO); + } + if (oldTrip != null) { + //判斷老訂單是否同步過,沒有同步過需要同步 + if (Objects.equals(TpOrderTravelTripStatusEnum.UN_SYNC.getDispatchStatus(), oldTrip.getTripStatus())) { + tpTripClient.createTrip(tpCharteredBusTripDTO); + } else { + //说明是修改 + // 同步当前行程到主数据 + tpTripClient.updateTrip(tpCharteredBusTripDTO); + } + // 同步后更改当前行程单状态 + TpOrderTravelDispatchDTO tpOrderTravelDispatchDTO = buildTripStatusParams(nowSyncTrip, nowOrder.getOrderNo(), tenantId, TpOrderTravelTripStatusEnum.ALREADY_SYNC); + tpOrderClient.syncTravelDispatchStatus(tpOrderTravelDispatchDTO); + oldSyncTripsMap.remove(tripNo); + } + }); + + if (MapUtil.isNotEmpty(oldSyncTripsMap)) { + //取消 + oldSyncTripsMap.forEach((tripNo, trip) -> { + if (!Objects.equals(TpOrderTravelTripStatusEnum.UN_SYNC.getDispatchStatus(), trip.getTripStatus())) { + // 某一行程车辆信息 + List singleTripSubjectItem = oldOrder.getOrderSubjectItem().stream().filter(subjectItem -> StrUtil.equals(subjectItem.getTripType(), trip.getTripType())).collect(Collectors.toList()); + + // 全部位置信息 + List tripPositions = trip.getTripPositions(); + // 途径点信息 + ArrayList pathPoints = new ArrayList<>(tripPositions.subList(1, tripPositions.size() - 1)); + + TpCharteredBusTripDTO tpCharteredBusTripDTO = buildSyncCharterBusTripParams(trip, tenantId, oldOrder, tripPositions, pathPoints, singleTripSubjectItem, orderDispatchDetail); + tpTripClient.cancelTrip(tpCharteredBusTripDTO); + + // 同步后更改老行程单状态 + TpOrderTravelDispatchDTO tpOrderTravelDispatchDTO = buildTripStatusParams(trip, oldOrder.getOrderNo(), tenantId, TpOrderTravelTripStatusEnum.CANCEL_SYNC); + tpOrderClient.syncTravelDispatchStatus(tpOrderTravelDispatchDTO); + } + }); + } + } + + private static TpOrderTravelDispatchDTO buildTripStatusParams(TpOrderTravelTripVO unSyncTrip, String orderNo, String tenantId, TpOrderTravelTripStatusEnum tripStatusEnum) { + TpOrderTravelDispatchDTO tpOrderTravelDispatchDTO = new TpOrderTravelDispatchDTO(); + tpOrderTravelDispatchDTO.setOrderNo(orderNo); + tpOrderTravelDispatchDTO.setTripNo(unSyncTrip.getTripNo()); + tpOrderTravelDispatchDTO.setTripStatus(tripStatusEnum.getDispatchStatus()); + tpOrderTravelDispatchDTO.setTenantId(tenantId); + return tpOrderTravelDispatchDTO; + } + + /** + * + * @param unSyncTrip 未同步的行程单 + * @param tenantId + * @param orderDetail 订单明细 + * @param tripPositions 全部位置信息 + * @param pathPoints 途经点,不包含起止 + * @param singleTripSubjectItem 行程单的标的项集合,主要是车型、车数、天数 + * @param orderDispatchDetail 订单分配的公司及车队 + * @return + */ + private TpCharteredBusTripDTO buildSyncCharterBusTripParams(TpOrderTravelTripVO unSyncTrip, String tenantId, TpProdOrderDetailVO orderDetail, + List tripPositions, ArrayList pathPoints, + List singleTripSubjectItem, TpProdOrderDispatchDetailVO orderDispatchDetail) { + TpCharteredBusTripDTO tpCharteredBusTripDTO = new TpCharteredBusTripDTO(); + tpCharteredBusTripDTO.setTenantId(tenantId); + tpCharteredBusTripDTO.setFleetId(Convert.toLong(orderDispatchDetail.getFleet().getTargetFleetNo())); + tpCharteredBusTripDTO.setOrderNo(orderDetail.getOriginalOrderNo()); + tpCharteredBusTripDTO.setTripNo(unSyncTrip.getTripNo()); + tpCharteredBusTripDTO.setTripType(orderDetail.getProductCategory()); + tpCharteredBusTripDTO.setDirection(StrUtil.equals(unSyncTrip.getTripType(), TpOrderTripTypeEnum.GO.getCode()) ? 1 : 2); + tpCharteredBusTripDTO.setDepartureTime(DateUtil.date(Convert.toLong(unSyncTrip.getStartTime()))); + tpCharteredBusTripDTO.setArriveTime(DateUtil.date(Convert.toLong(unSyncTrip.getEndTime()))); + tpCharteredBusTripDTO.setCharterDaysCnt(orderDetail.getOrderSubjectItem().get(0).getDays()); + tpCharteredBusTripDTO.setDeparturePositionName(tripPositions.get(0).getLocationName()); + tpCharteredBusTripDTO.setDeparturePositionCoordinates(getLocation(tripPositions.get(0).getLng(), tripPositions.get(0).getLat())); + tpCharteredBusTripDTO.setArrivePositionName(tripPositions.get(tripPositions.size() - 1).getLocationName()); + tpCharteredBusTripDTO.setArrivePositionCoordinates(getLocation(tripPositions.get(tripPositions.size() - 1).getLng(), tripPositions.get(tripPositions.size() - 1).getLat())); + tpCharteredBusTripDTO.setMidPositionNameList(CollUtil.isEmpty(pathPoints) ? null : pathPoints.stream().map(TpOrderTripPositionVO::getLocationName).collect(Collectors.toList())); + tpCharteredBusTripDTO.setMidPositionCoordinatesList(CollUtil.isEmpty(pathPoints) ? null : getLocations(pathPoints)); + tpCharteredBusTripDTO.setMileage(Float.valueOf(unSyncTrip.getMiles())); + tpCharteredBusTripDTO.setFleetRelationList(getSpecifications(unSyncTrip.getTripType(), orderDispatchDetail.getFleet(), singleTripSubjectItem)); + return tpCharteredBusTripDTO; + } + + // 拿到所有的车型code和数量 + private List getSpecifications(String tripType, TpProdOrderDispatchFleetVO fleetVO, List singleTripSubjectItem) { + List joinFleets; + if (StrUtil.equals(tripType, TpOrderTripTypeEnum.GO.getCode())) { + joinFleets = fleetVO.getGoJoinFleets(); + } else { + joinFleets = fleetVO.getBackJoinFleets(); + } + //如果合营车队集合为空,那就从订单标的项获取车型和车辆数 + if (CollectionUtils.isEmpty(joinFleets)) { + List fleetRelationDTOList = new ArrayList<>(); + singleTripSubjectItem.forEach(subjectItem -> { + String specCode = null; + for (TpOrderSubjectItemElementVO element : subjectItem.getOrderItemElements()) { + if (StrUtil.equals(element.getElementCode(), TpFactorCodeEnum.CAR_TYPE_CODE.getCode())) { + specCode = element.getElementValue(); + break; + } + } + if (specCode != null) { + for (Integer i = 0; i < subjectItem.getCount(); i++) { + fleetRelationDTOList.add(new TpFleetRelationDTO(specCode, Long.valueOf(fleetVO.getTargetFleetNo()))); + } + } + }); + return fleetRelationDTOList; + } else { + return joinFleets.stream().map(joinFleet -> new TpFleetRelationDTO(joinFleet.getSpecCode(), Long.valueOf(joinFleet.getFleetCode()))).collect(Collectors.toList()); + } + } + + private List getLocations(ArrayList pathPoints) { + return pathPoints.stream().map(point -> getLocation(point.getLng(), point.getLat())).collect(Collectors.toList()); + } + + private TpCoordinatesDto getLocation(String lng, String lat) { + return new TpCoordinatesDto(lng, lat); + } + + public void cancelSync(TpProdOrderDetailVO orderDetail, String tenantId) { + List alreadyCancelTrips = orderDetail.getTpOrderTravelTrips().stream().filter(trip -> StrUtil.equals(trip.getTripStatus(), TpOrderTravelTripStatusEnum.CANCEL_SYNC.getDispatchStatus())).collect(Collectors.toList()); + + // 如果重试时所有行程单都取消同步完成,则跳过当前节点 + if (CollUtil.isNotEmpty(alreadyCancelTrips) && alreadyCancelTrips.size() == orderDetail.getTpOrderTravelTrips().size()) { + LogUtil.info("当前订单:{}, 取消行程单已同步完成, 跳过当前同步步骤", orderDetail.getOrderNo()); + return; + } + + List tpOrderTravelTrips = orderDetail.getTpOrderTravelTrips(); + + // 取消当前订单下的行程,跳过未同步的 + for (TpOrderTravelTripVO unSyncTrip : tpOrderTravelTrips) { + if (StrUtil.equals(unSyncTrip.getTripStatus(), TpOrderTravelTripStatusEnum.CANCEL_SYNC.getDispatchStatus()) + || StrUtil.equals(unSyncTrip.getTripStatus(), TpOrderTravelTripStatusEnum.UN_SYNC.getDispatchStatus())) { + continue; + } + + // 取消 同步当前行程到主数据 + tpTripClient.cancelTrip(buildCancelDTO(orderDetail, tenantId, unSyncTrip.getTripNo())); + + // 同步后更改当前行程单状态 + TpOrderTravelDispatchDTO tpOrderTravelDispatchDTO = buildTripStatusParams(unSyncTrip, orderDetail.getOrderNo(), tenantId, TpOrderTravelTripStatusEnum.CANCEL_SYNC); + tpOrderClient.syncTravelDispatchStatus(tpOrderTravelDispatchDTO); + } + + List alreadySyncTripNos = tpOrderClient.querySyncedTripNos(TpOrderQueryDTO.builder().originalOrderNo(orderDetail.getOriginalOrderNo()).tenantId(tenantId).build()); + + if (CollUtil.isEmpty(alreadySyncTripNos)) { + LogUtil.info("此时无需进入补偿逻辑,直接返回"); + return; + } + + // 取消补偿 + // 查询已同步的订单tripNo且之前未取消的行程 + List nowTrips = tpOrderTravelTrips.stream().map(TpOrderTravelTripVO::getTripNo).collect(Collectors.toList()); + Map nowTripMap = tpOrderTravelTrips.stream().collect(Collectors.toMap(TpOrderTravelTripVO::getTripNo, Function.identity())); + + for (String alreadySyncTripNo : alreadySyncTripNos) { + // 取消 同步当前行程到主数据 + tpTripClient.cancelTrip(buildCancelDTO(orderDetail, tenantId, alreadySyncTripNo)); + if (nowTrips.contains(alreadySyncTripNo)) { + LogUtil.info("查询已同步的行程单且之前未取消的行程,开始进行取消补偿,取消当前行程:{}", alreadySyncTripNo); + TpOrderTravelTripVO tpOrderTravelTripVO = nowTripMap.get(alreadySyncTripNo); + tpOrderClient.syncTravelDispatchStatus(buildTripStatusParams(tpOrderTravelTripVO, orderDetail.getOrderNo(), tenantId, TpOrderTravelTripStatusEnum.CANCEL_SYNC)); + } + } + } + + @NotNull + private static TpCharteredBusTripDTO buildCancelDTO(TpProdOrderDetailVO orderDetail, String tenantId, String unSyncTripNo) { + TpCharteredBusTripDTO tpCharteredBusTripDTO = new TpCharteredBusTripDTO(); + tpCharteredBusTripDTO.setTenantId(tenantId); + tpCharteredBusTripDTO.setOrderNo(orderDetail.getOriginalOrderNo()); + tpCharteredBusTripDTO.setTripNo(unSyncTripNo); + return tpCharteredBusTripDTO; + } + +} diff --git a/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/compoment/TpRescheduleOrderComponent.java b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/compoment/TpRescheduleOrderComponent.java new file mode 100644 index 0000000..2b5cdf0 --- /dev/null +++ b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/compoment/TpRescheduleOrderComponent.java @@ -0,0 +1,57 @@ +package com.deepinnet.tptradeprod.core.compoment; + +import com.alibaba.fastjson2.JSONObject; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderRescheduleDTO; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderCreateVO; +import lombok.RequiredArgsConstructor; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.springframework.stereotype.Component; + +/** + *

+ * 改签订单组件 + *

+ * + * @author chenjiaju + * @since 2023/10/12 + */ + +@Component +@RequiredArgsConstructor +public class TpRescheduleOrderComponent { + + private final RedissonClient redissonClient; + + private final TpOrderClient tpOrderClient; + + public TpProdOrderCreateVO execute(TpProdOrderRescheduleDTO dto) { + // 使用外部请求号当作redisson分布式锁的key,由 timestamp + user + productNo 组成 + String outRequestNo = dto.getCreateOrderDto().getOutRequestNo(); + RLock lock = redissonClient.getLock(outRequestNo); + boolean tryLock = lock.tryLock(); + // 判断是否获取到当锁 + if (!tryLock) { + LogUtil.error("改签订单重复提交:{}", JSONObject.toJSONString(dto)); + throw new TpTradeProdException(TpTradeProdErrorCode.IDEMPOTENT_REQUEST_ERROR); + } + + try { + LogUtil.info("改签组件获取到锁,锁定对象:{}", outRequestNo); + return tpOrderClient.rescheduleOrder(dto); + } catch (Exception e) { + LogUtil.error("改签失败:", e); + throw new TpTradeProdException(TpTradeProdErrorCode.CREATE_ORDER_ERROR); + } finally { + // 释放锁 + if (lock.isLocked() && lock.isHeldByCurrentThread()) { + lock.unlock(); + } + } + } + +} diff --git a/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/compoment/TpTenantNacosConfigComponent.java b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/compoment/TpTenantNacosConfigComponent.java new file mode 100644 index 0000000..5c207fa --- /dev/null +++ b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/compoment/TpTenantNacosConfigComponent.java @@ -0,0 +1,47 @@ +package com.deepinnet.tptradeprod.core.compoment; + +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + *

+ * nacos配置组件 + *

+ * + * @author chenjiaju + * @since 2024/1/4 + */ + +@Data +@Component +@RefreshScope +public class TpTenantNacosConfigComponent { + + @Value("${tenantDomain}") + private String tenantDomain; + + private final Map tenantDomainMap = new ConcurrentHashMap<>(); + + @PostConstruct + private void init() { + setDomainLinkMap(this.tenantDomain); + } + + private void setDomainLinkMap(String tenantDomain) { + tenantDomainMap.clear(); + String[] pairs = tenantDomain.split(","); + for (String pair : pairs) { + int dashIndex = pair.indexOf("-"); + if (dashIndex != -1) { + tenantDomainMap.put(pair.substring(0, dashIndex), pair.substring(dashIndex + 1)); + } + } + } + +} diff --git a/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/constants/MessageConstants.java b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/constants/MessageConstants.java new file mode 100644 index 0000000..6c2240b --- /dev/null +++ b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/constants/MessageConstants.java @@ -0,0 +1,63 @@ +package com.deepinnet.tptradeprod.core.constants; + +/** + *

+ * 消息常量类 + *

+ * + * @author chenjiaju + * @since 2023/9/2 + */ +public class MessageConstants { + + /** + * 资金中心支付成功消息 + */ + public static final String EC_TRANS_PAY_SUCCESS = "EC_TRANS_PAY_SUCCESS"; + + /** + * 凭证核销成功消息 + */ + public static final String EC_VOUCHER_VERIFICATION_SUCCESS = "EC_VOUCHER_VERIFICATION_SUCCESS"; + + /** + * 资金域退款成功消息 + */ + public static final String EVENT_CODE_TRANS_REFUND_SUCCESS = "EC_TRANS_REFUND_SUCCESS"; + + /** + * 凭证退款成功消息 + */ + public static final String EC_TICKET_REFUND_SUCCESS = "EC_REFUND_TICKET_SUCCESS"; + + /** + * 延迟消息 + */ + public static final String EVENT_ORDER_DELAY_TAG_SUCCESS = "EVENT_ORDER_DELAY_TAG_SUCCESS"; + + /** + * 支付单过期延时消息 + */ + public static final String EVENT_PAY_ORDER_DELAY_TAG_SUCCESS = "EVENT_PAY_ORDER_DELAY_TAG_SUCCESS"; + + /** + * 退款延时消息TAG + */ + public static final String EVENT_REFUND_ORDER_DELAY_TAG_SUCCESS = "EVENT_REFUND_ORDER_DELAY_TAG_SUCCESS"; + + /** + * 凭证过期消息 + */ + public static final String EC_VOUCHER_EXPIRED_SUCCESS = "EC_VOUCHER_EXPIRED_SUCCESS"; + + /** + * 订单拼车成功国朗通知 + */ + public static final String EVENT_CAR_POOL_GUO_LANG_NOTICE_TAG_SUCCESS = "EVENT_CAR_POOL_GUO_LANG_NOTICE_TAG_SUCCESS"; + + /** + * 改签订单对应的原始订单 没有可用的凭证 通知tag + */ + public static final String EVENT_CODE_RESCHEDULE_VOUCHER_INVALID_SUCCESS = "EC_RESCHEDULE_VOUCHER_INVALID_SUCCESS"; + +} diff --git a/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/factory/TpOperatorInventoryStrategyFactory.java b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/factory/TpOperatorInventoryStrategyFactory.java new file mode 100644 index 0000000..f8337f4 --- /dev/null +++ b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/factory/TpOperatorInventoryStrategyFactory.java @@ -0,0 +1,33 @@ +package com.deepinnet.tptradeprod.core.factory; + +import com.deepinnet.tpproductcore.common.enums.TpInventoryOperationTypeEnum; +import com.deepinnet.tptradeprod.core.strategy.TpInventoryStrategy; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + *

+ * 策略通过工厂获取实现类(库存操作) + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@Component +public class TpOperatorInventoryStrategyFactory implements InitializingBean { + + @Resource + private Map insCreateStrategyMap; + + public Map operationStrategyMap = new ConcurrentHashMap<>(); + + @Override + public void afterPropertiesSet() throws Exception { + insCreateStrategyMap.values().parallelStream().forEach(strategy -> operationStrategyMap.put(strategy.supportOperation(), strategy)); + } +} diff --git a/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpCarPoolGuoLangNoticeMessageHandler.java b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpCarPoolGuoLangNoticeMessageHandler.java new file mode 100644 index 0000000..6421619 --- /dev/null +++ b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpCarPoolGuoLangNoticeMessageHandler.java @@ -0,0 +1,98 @@ +package com.deepinnet.tptradeprod.core.handler; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.SecureUtil; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSONObject; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.error.TpTradeCoreErrorCode; +import com.deepinnet.tptradecore.common.exception.TpTradeCoreException; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.model.CarPoolPosGuoLangMessageEntity; +import com.deepinnet.tptradeprod.common.model.TpMessageEntity; +import com.deepinnet.tptradeprod.core.constants.MessageConstants; +import lombok.RequiredArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * @author cky + * @version 2024/02/21 16:15 + */ +@Service +@RequiredArgsConstructor +public class TpCarPoolGuoLangNoticeMessageHandler implements TpMessageHandler { + private static final Logger LOGGER = LoggerFactory.getLogger(TpCarPoolGuoLangNoticeMessageHandler.class); + + + @Value("${pos.guolang.url}") + private String guoLangUrl; + + @Value("${pos.guolang.secretKey}") + private String secretKey; + + + @Override + public String supportTag() { + return MessageConstants.EVENT_CAR_POOL_GUO_LANG_NOTICE_TAG_SUCCESS; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void handle(TpMessageEntity messageEntity) { + // 解析消息 + String bodyMsg = buildMessage(messageEntity); + CarPoolPosGuoLangMessageEntity paySuccessMessageEntity = JSONObject.parseObject(bodyMsg, CarPoolPosGuoLangMessageEntity.class); + // 发送国朗通知 + pushGuoLangSuccessNotice(paySuccessMessageEntity, guoLangUrl, secretKey); + } + + private static boolean pushGuoLangSuccessNotice(CarPoolPosGuoLangMessageEntity posGuoLangDTO, String guoLangUrl, String secretKey) { + long begin = System.currentTimeMillis(); + LOGGER.info("pushPosGuoLang req:{}", JSONUtil.toJsonStr(posGuoLangDTO)); + HttpResponse response = null; + boolean success = false; + try { + response = HttpUtil.createPost(guoLangUrl).header("timestamp", String.valueOf(begin)).header("sign", getSign(begin, secretKey)).timeout(3000) + .body(JSONUtil.toJsonStr(posGuoLangDTO)).execute(); + if (response != null && StrUtil.isNotBlank(response.body())) { + com.alibaba.fastjson2.JSONObject obj = com.alibaba.fastjson2.JSONObject.parseObject(response.body()); + if (obj != null) { + String code = obj.getString("code"); + if ("1".equals(code)) { + success = true; + } + } + } + LOGGER.info("pushPosGuoLang resp:{}", JSONUtil.toJsonStr(response.body())); + } catch (Exception e) { + LOGGER.info("pushPosGuoLang fail:{} e", JSONUtil.toJsonStr(response), e); + throw new TpTradeProdException(TpTradeProdErrorCode.PUSH_GUO_LANG_FAIL); + } + return success; + } + + private static String getSign(long timeStamp, String secretKey) { + return SecureUtil.md5(timeStamp + secretKey); + } + + + private String buildMessage(TpMessageEntity messageEntity) { + String message = messageEntity.getMessage(); + LogUtil.info("------------------------------收到推送国朗消息:{}", message); + JSONObject jsonObject = JSONObject.parseObject(message); + + String messageKey = (String) jsonObject.get("key"); + + // message key + messageEntity.setMessageKey(messageKey); + + return (String) jsonObject.get("body"); + } +} diff --git a/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpDelayOrderMessageHandler.java b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpDelayOrderMessageHandler.java new file mode 100644 index 0000000..b7fed78 --- /dev/null +++ b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpDelayOrderMessageHandler.java @@ -0,0 +1,138 @@ +package com.deepinnet.tptradeprod.core.handler; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpproductcore.common.dto.inventory.TpInventoryOperationDTO; +import com.deepinnet.tpproductcore.common.enums.TpInventoryBizTypeEnum; +import com.deepinnet.tpproductcore.common.enums.TpInventoryOperationTypeEnum; +import com.deepinnet.tptradecore.common.dto.order.TpOrderPushStatusDTO; +import com.deepinnet.tptradecore.common.enums.order.TpOrderModulesEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderPushStatusEnum; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderQueryDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderStatusEnum; +import com.deepinnet.tptradeprod.common.enums.TpProdOrderIdentityFlagEnum; +import com.deepinnet.tptradeprod.common.model.OrderDelayMessageEntity; +import com.deepinnet.tptradeprod.common.model.TpMessageEntity; +import com.deepinnet.tptradeprod.common.service.integration.client.TpInventoryClient; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.vo.TpOrderSubjectItemVO; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.deepinnet.tptradeprod.core.constants.MessageConstants; +import com.google.common.collect.Lists; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +/** + * @author chenjiaju + * @version 2022/11/22 16:15 + */ +@Service +@RequiredArgsConstructor +public class TpDelayOrderMessageHandler implements TpMessageHandler { + + @Resource + private TpOrderClient tpOrderClient; + + @Resource + private TpInventoryClient inventoryClient; + + + @Override + public String supportTag() { + return MessageConstants.EVENT_ORDER_DELAY_TAG_SUCCESS; + } + + @Override + public void handle(TpMessageEntity messageEntity) { + String bodyMsg = buildMessage(messageEntity); + + // 超时关单 + OrderDelayMessageEntity delayMessageEntity = JSONObject.parseObject(bodyMsg, OrderDelayMessageEntity.class); + + TpProdOrderDetailVO orderDetail = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .orderNo(delayMessageEntity.getOrderNo()) + .tenantId(delayMessageEntity.getTenantId()) + .needModules(Lists.newArrayList(TpOrderModulesEnum.ORDER_SUBJECT_ITEM.getModule())).build()); + + // 当前订单初始化 + if (ObjectUtil.equal(orderDetail.getStatus(), TpOrderStatusEnum.INIT.getStatus())) { + LogUtil.warn("订单:{}, 初始化状态, 无需超时关单, 但需释放库存", orderDetail.getOrderNo()); + + // 释放库存 + releaseInventory(orderDetail, delayMessageEntity.getTenantId()); + return; + } + + // 当前订单已超时 + if (ObjectUtil.equal(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_TIMEOUT.getStatus())) { + LogUtil.warn("订单:{}, 已关单, 无需再次关单", orderDetail.getOrderNo()); + return; + } + + // 当前订单状态如果为已支付后续状态,则直接跳过消息 + if (orderDetail.getStatus().compareTo(TpOrderStatusEnum.ALREADY_PAY.getStatus()) >= 0) { + LogUtil.warn("订单:{}, 已支付, 跳过超时关单", orderDetail.getOrderNo()); + return; + } + + // 订单过期推进状态 + tpOrderClient.pushOrderStatus(TpOrderPushStatusDTO.builder() + .orderNo(delayMessageEntity.getOrderNo()) + .tenantId(delayMessageEntity.getTenantId()) + .tpOrderPushStatusEnum(TpOrderPushStatusEnum.ORDER_EXPIRE_PUSH_STATUS).build()); + + releaseInventory(orderDetail, delayMessageEntity.getTenantId()); + } + + private String buildMessage(TpMessageEntity messageEntity) { + String message = messageEntity.getMessage(); + LogUtil.info("收到订单过期消息:{}", message); + JSONObject jsonObject = JSONObject.parseObject(message); + + String messageKey = (String) jsonObject.get("key"); + + // message key + messageEntity.setMessageKey(messageKey); + + return (String) jsonObject.get("body"); + } + + private void releaseInventory(TpProdOrderDetailVO orderDetail, String tenantId) { + List orderSubjectItem = orderDetail.getOrderSubjectItem(); + + List operationDTOs = Lists.newArrayList(); + Map orderItemMap; + + // 实名认证 + if (Objects.equals(orderDetail.getIdentityVerificat(), TpProdOrderIdentityFlagEnum.REAL_NAME_ORDER.getIdentityFlag())) { + orderItemMap = orderSubjectItem.stream().collect(Collectors.groupingBy(TpOrderSubjectItemVO::getItemNo, Collectors.collectingAndThen(Collectors.toList(), List::size))); + } else { + orderItemMap = orderSubjectItem.stream().collect(Collectors.groupingBy(TpOrderSubjectItemVO::getItemNo, Collectors.summingInt(TpOrderSubjectItemVO::getCount))); + } + + AtomicInteger flagCount = new AtomicInteger(0); + orderItemMap.forEach((itemNo, count) -> { + flagCount.getAndIncrement(); + TpInventoryOperationDTO operationDTO = new TpInventoryOperationDTO(); + operationDTO.setCarrierCode(itemNo); + operationDTO.setBizType(TpInventoryBizTypeEnum.ORDER.getType()); + operationDTO.setBizNo(orderDetail.getOrderNo()); + operationDTO.setOperationInventoryCount(count); + operationDTO.setOperationType(TpInventoryOperationTypeEnum.FREEZE_TO_ROLLBACK.getType()); + operationDTO.setTransactionNo(orderDetail.getOrderNo() + "_" + TpInventoryOperationTypeEnum.FREEZE_TO_ROLLBACK.getType() + "_" + flagCount.get()); + operationDTO.setTenantId(tenantId); + operationDTOs.add(operationDTO); + }); + + inventoryClient.batchOperateInventory(operationDTOs); + } +} diff --git a/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpDelayPayOrderMessageHandler.java b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpDelayPayOrderMessageHandler.java new file mode 100644 index 0000000..48b7316 --- /dev/null +++ b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpDelayPayOrderMessageHandler.java @@ -0,0 +1,55 @@ +package com.deepinnet.tptradeprod.core.handler; + +import com.alibaba.fastjson.JSONObject; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.trans.TpPayOrderCloseDTO; +import com.deepinnet.tptradeprod.common.model.*; +import com.deepinnet.tptradeprod.common.service.integration.client.TpPaymentClient; +import com.deepinnet.tptradeprod.core.constants.MessageConstants; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * @author amos wong + * @create 2023/9/8 14:38 + * @Description + */ +@Service +@RequiredArgsConstructor +public class TpDelayPayOrderMessageHandler implements TpMessageHandler { + + @Resource + private TpPaymentClient paymentClient; + + @Override + public String supportTag() { + return MessageConstants.EVENT_PAY_ORDER_DELAY_TAG_SUCCESS; + } + + @Override + public void handle(TpMessageEntity messageEntity) { + String bodyMsg = buildMessage(messageEntity); + + PayOrderDelayMessageEntity delayMessageEntity = JSONObject.parseObject(bodyMsg, PayOrderDelayMessageEntity.class); + + paymentClient.closePayOrder(TpPayOrderCloseDTO.builder() + .payOrderNo(delayMessageEntity.getPayOrderNo()) + .tenantId(delayMessageEntity.getTenantId()).build()); + } + + private String buildMessage(TpMessageEntity messageEntity) { + String message = messageEntity.getMessage(); + LogUtil.info("收到支付单过期消息:{}", message); + JSONObject jsonObject = JSONObject.parseObject(message); + + String messageKey = (String) jsonObject.get("key"); + + // message key + messageEntity.setMessageKey(messageKey); + + return (String) jsonObject.get("body"); + } + +} diff --git a/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpDelayRefundOrderMessageHandler.java b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpDelayRefundOrderMessageHandler.java new file mode 100644 index 0000000..0a6d5ca --- /dev/null +++ b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpDelayRefundOrderMessageHandler.java @@ -0,0 +1,103 @@ +package com.deepinnet.tptradeprod.core.handler; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSONObject; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tp.common.lang.util.TpMoney; +import com.deepinnet.tptradecore.common.dto.order.TpOrderPushStatusDTO; +import com.deepinnet.tptradecore.common.dto.trans.TpPayRefundDTO; +import com.deepinnet.tptradecore.common.enums.TpBizTypeEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderPushStatusEnum; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderQueryDTO; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.model.PayRefundDelayMessageEntity; +import com.deepinnet.tptradeprod.common.model.TpMessageEntity; +import com.deepinnet.tptradeprod.common.service.integration.client.*; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.deepinnet.tptradeprod.core.constants.MessageConstants; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.math.BigDecimal; + +/** + * @author chenjiaju + * @create 2023/12/8 11:19 + */ +@Service +@RequiredArgsConstructor +public class TpDelayRefundOrderMessageHandler implements TpMessageHandler { + + @Resource + private TpPaymentClient paymentClient; + + @Resource + private TpOrderClient tpOrderClient; + + @Resource + private TpOrderDispatchClient dispatchClient; + + @Override + public String supportTag() { + return MessageConstants.EVENT_REFUND_ORDER_DELAY_TAG_SUCCESS; + } + + @Override + public void handle(TpMessageEntity messageEntity) { + String bodyMsg = buildMessage(messageEntity); + + PayRefundDelayMessageEntity delayRefundMessageEntity = JSONObject.parseObject(bodyMsg, PayRefundDelayMessageEntity.class); + + TpProdOrderDetailVO orderDetail = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .originalOrderNo(delayRefundMessageEntity.getOriginalOrderNo()) + .tenantId(delayRefundMessageEntity.getTenantId()).build()); + + // 从派单详情里获取orgCode + String orgCode = dispatchClient.getOrgCodeFromDispatchDetail(orderDetail.getOriginalOrderNo(), delayRefundMessageEntity.getTenantId()); + + // 已付款金额 + BigDecimal payAmount = new BigDecimal(orderDetail.getPayAmount()); + BigDecimal payableAmount = new BigDecimal(orderDetail.getPayableAmount()); + BigDecimal serviceCharge = StrUtil.isEmpty(orderDetail.getServiceCharge()) ? BigDecimal.ZERO : new BigDecimal(orderDetail.getServiceCharge()); + + TpPayRefundDTO tpPayRefundDTO = TpPayRefundDTO.builder() + .refundBizNo(delayRefundMessageEntity.getOriginalOrderNo() + TpBizTypeEnum.DEPOSIT_REFUND.getCode()) + .refundBizType(TpBizTypeEnum.DEPOSIT_REFUND.getCode()) + .payBizNo(delayRefundMessageEntity.getOriginalOrderNo() + TpBizTypeEnum.DEPOSIT_PAY.getCode()) + .refundAmount(new TpMoney(payAmount.subtract(serviceCharge.add(payableAmount)).toString(), TpMoney.ValueUnitEnum.YUAN)) + .chargeAmount(new TpMoney(StrUtil.isEmpty(orderDetail.getServiceCharge()) ? BigDecimal.ZERO.toString() : orderDetail.getServiceCharge(), TpMoney.ValueUnitEnum.YUAN)) + .orgCode(orgCode) + .tenantId(delayRefundMessageEntity.getTenantId()) + .build(); + + boolean refundRes = paymentClient.refund(tpPayRefundDTO); + + if (!refundRes) { + LogUtil.error("申请退票接口执行失败,原因:退款失败,入参为:{}", JSONUtil.toJsonStr(tpPayRefundDTO)); + throw new TpTradeProdException(TpTradeProdErrorCode.REFUND_ERROR); + } + + // 推进订单状态 + tpOrderClient.pushOrderStatus(TpOrderPushStatusDTO.builder() + .tenantId(delayRefundMessageEntity.getTenantId()) + .orderNo(orderDetail.getOrderNo()) + .tpOrderPushStatusEnum(TpOrderPushStatusEnum.ORDER_TRIP_END_REFUNDED).build()); + } + + private String buildMessage(TpMessageEntity messageEntity) { + String message = messageEntity.getMessage(); + LogUtil.info("收到订单延时退款消息:{}", message); + JSONObject jsonObject = JSONObject.parseObject(message); + + String messageKey = (String) jsonObject.get("key"); + + // message key + messageEntity.setMessageKey(messageKey); + + return (String) jsonObject.get("body"); + } + +} diff --git a/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpMessageHandler.java b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpMessageHandler.java new file mode 100644 index 0000000..2aedd5e --- /dev/null +++ b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpMessageHandler.java @@ -0,0 +1,23 @@ +package com.deepinnet.tptradeprod.core.handler; + +import com.deepinnet.tptradeprod.common.model.TpMessageEntity; + +/** + * @author chenjiaju + * @version 2022/11/22 16:11 + */ +public interface TpMessageHandler { + + /** + * tag + * @return tag + */ + String supportTag(); + + /** + * 处理消息 + * @param message + */ + void handle(TpMessageEntity message); + +} diff --git a/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpPayMessageHandler.java b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpPayMessageHandler.java new file mode 100644 index 0000000..2cd4347 --- /dev/null +++ b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpPayMessageHandler.java @@ -0,0 +1,107 @@ +package com.deepinnet.tptradeprod.core.handler; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.deepinnet.tp.common.lang.result.TpResult; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.enums.TpBizTypeEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderModulesEnum; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.enums.TpOrderStatusEnum; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.model.*; +import com.deepinnet.tptradeprod.common.service.facade.TpOrderAcceptanceFacade; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderPaidVO; +import com.deepinnet.tptradeprod.core.constants.MessageConstants; +import com.google.common.collect.Lists; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author chenjiaju + * @version 2022/11/22 16:15 + */ +@Service +@RequiredArgsConstructor +public class TpPayMessageHandler implements TpMessageHandler { + + @Resource + private TpOrderAcceptanceFacade orderAcceptanceFacade; + + @Resource + private TpOrderClient tpOrderClient; + + + @Override + public String supportTag() { + return MessageConstants.EC_TRANS_PAY_SUCCESS; + } + + @Override + public void handle(TpMessageEntity messageEntity) { + String bodyMsg = buildMessage(messageEntity); + + // 订单状态推进及凭证生成 + PaySuccessMessageEntity paySuccessMessageEntity = JSONObject.parseObject(bodyMsg, PaySuccessMessageEntity.class); + + TpProdOrderDetailVO orderDetail = null; + List modules = Lists.newArrayList(); + modules.add(TpOrderModulesEnum.ORDER_SUBJECT_ITEM.getModule()); + modules.add(TpOrderModulesEnum.ORDER_ROUTE_INFO.getModule()); + modules.add(TpOrderModulesEnum.ORDER_TRAVEL_TRIP.getModule()); + + if (TpBizTypeEnum.CUSTOM_BUS_BIZ_TYPE.contains(paySuccessMessageEntity.getBizType())) { + orderDetail = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .orderNo(paySuccessMessageEntity.getOrderNo()) + .tenantId(paySuccessMessageEntity.getTenantId()) + .needModules(modules).build()); + } else { + orderDetail = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .originalOrderNo(paySuccessMessageEntity.getOrderNo()) + .tenantId(paySuccessMessageEntity.getTenantId()) + .needModules(modules).build()); + } + + if (ObjectUtil.equal(orderDetail.getStatus(), TpOrderStatusEnum.ALREADY_PAY.getStatus()) + || ObjectUtil.equal(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_DEPOSIT_PAID.getStatus()) + || ObjectUtil.equal(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_TRIP_END_PAID.getStatus()) + || ObjectUtil.equal(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_CANCEL_PAID.getStatus())) { + LogUtil.warn("当前订单:{}, 已支付", orderDetail.getOrderNo()); + return; + } + + TpResult result = orderAcceptanceFacade.paid(TpProdOrderPaidDTO.builder() + .orderNo(paySuccessMessageEntity.getOrderNo()) + .tenantId(paySuccessMessageEntity.getTenantId()) + .payTime(paySuccessMessageEntity.getPayTime()) + .bizType(paySuccessMessageEntity.getBizType()) + .orderDetailVO(orderDetail).build()); + + if (!result.isSuccess()) { + LogUtil.error("支付成功消息处理失败, 订单号:{}, 错误信息:{}", paySuccessMessageEntity.getOrderNo(), result.getErrorDesc()); + throw new TpTradeProdException(TpTradeProdErrorCode.PAY_MESSAGE_CONSUME_ERROR); + } + + } + + private String buildMessage(TpMessageEntity messageEntity) { + String message = messageEntity.getMessage(); + LogUtil.info("收到支付成功消息:{}", message); + JSONObject jsonObject = JSONObject.parseObject(message); + + String messageKey = (String) jsonObject.get("key"); + + // message key + messageEntity.setMessageKey(messageKey); + + String bodyMsg = (String) jsonObject.get("body"); + String source = (String) jsonObject.get("source"); + return bodyMsg; + } +} diff --git a/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpRefundSuccessMessageHandler.java b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpRefundSuccessMessageHandler.java new file mode 100644 index 0000000..fb0a665 --- /dev/null +++ b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpRefundSuccessMessageHandler.java @@ -0,0 +1,221 @@ +package com.deepinnet.tptradeprod.core.handler; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSONObject; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tpproductcore.common.dto.inventory.TpInventoryOperationDTO; +import com.deepinnet.tpproductcore.common.enums.*; +import com.deepinnet.tptradecore.common.dto.order.TpOrderPushStatusDTO; +import com.deepinnet.tptradecore.common.enums.TpBizTypeEnum; +import com.deepinnet.tptradecore.common.enums.order.TpOrderPushStatusEnum; +import com.deepinnet.tptradecore.common.enums.voucher.TpVoucherStatusEnum; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.enums.TpOrderStatusEnum; +import com.deepinnet.tptradeprod.common.enums.TpRefundApplyOrderModulesEnum; +import com.deepinnet.tptradeprod.common.error.TpTradeProdErrorCode; +import com.deepinnet.tptradeprod.common.exception.TpTradeProdException; +import com.deepinnet.tptradeprod.common.model.*; +import com.deepinnet.tptradeprod.common.service.integration.client.*; +import com.deepinnet.tptradeprod.common.service.integration.client.mq.constants.MessageSysConstants; +import com.deepinnet.tptradeprod.common.service.integration.client.mq.entity.*; +import com.deepinnet.tptradeprod.common.service.integration.client.mq.template.MessageClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.deepinnet.tptradeprod.core.constants.MessageConstants; +import com.google.common.collect.Lists; +import lombok.RequiredArgsConstructor; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.Assert; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + + +/** + * @author chenjiaju + * @version 2022/11/22 16:15 + */ +@Service +@RequiredArgsConstructor +public class TpRefundSuccessMessageHandler implements TpMessageHandler { + + @Resource + private TpContractClient contractClient; + + @Resource + private MessageClient messageClient; + + @Resource + private TpVoucherClient voucherClient; + + @Resource + private TpInventoryClient inventoryClient; + + @Resource + private TpOrderClient tpOrderClient; + + @Override + public String supportTag() { + return MessageConstants.EVENT_CODE_TRANS_REFUND_SUCCESS; + } + + @Override + public void handle(TpMessageEntity messageEntity) { + String bodyMsg = buildMessage(messageEntity); + LogUtil.info("退款成功消息体为:{}", bodyMsg); + RefundSuccessMessageEntity refundSuccessMessage = JSONObject.parseObject(bodyMsg, RefundSuccessMessageEntity.class); + String refundBizNo = refundSuccessMessage.getRefundBizNo(); + String tenantId = refundSuccessMessage.getTenantId(); + String orderNo = refundSuccessMessage.getOrderNo(); + String bizType = refundSuccessMessage.getBizType(); + + // 定制包车的业务处理 + if (TpBizTypeEnum.CUSTOM_BUS_BIZ_TYPE.contains(bizType)) { + // 退票申请单状态改为退票成功 + contractClient.refundTicketSuccess(refundBizNo, tenantId); + + // 向订单域发送退票成功的消息 + sendRefundMessage(orderNo, refundBizNo, tenantId); + + // 回滚库存 + rollbackInventory(refundBizNo, tenantId); + } else { + TpOrderPushStatusEnum statusEnum = null; + // 预约包车业务处理 + TpProdOrderDetailVO orderDetail = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .tenantId(tenantId) + .originalOrderNo(orderNo).build()); + + // 订单取消退款中状态 + if (ObjectUtil.equals(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_CANCEL_REFUNDING.getStatus())) { + statusEnum = TpOrderPushStatusEnum.ORDER_CANCEL_REFUNDED; + } + + // 订单结束退款中 + if (ObjectUtil.equals(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_TRIP_END_REFUNDING.getStatus())) { + statusEnum = TpOrderPushStatusEnum.ORDER_TRIP_END_REFUNDED; + } + + if (ObjectUtil.isNull(statusEnum)) { + LogUtil.warn("当前订单:{}, 暂无推进状态, 请检查", orderNo); + throw new TpTradeProdException(TpTradeProdErrorCode.INVALID_ORDER_STATUS); + } + + tpOrderClient.pushOrderStatus(TpOrderPushStatusDTO.builder() + .orderNo(orderDetail.getOrderNo()) + .tenantId(tenantId) + .tpOrderPushStatusEnum(statusEnum).build()); + + } + } + + private void rollbackInventory(String refundApplyOrderNo, String tenantId) { + List refundApplyOrderList = contractClient.getRefundApplyOrderList(TpProdQueryRefundApplyOrderDTO.builder() + .refundApplyOrderNo(refundApplyOrderNo) + .tenantId(tenantId) + .needProperties(Lists.newArrayList(TpRefundApplyOrderModulesEnum.REFUND_SUBJECT_ITEM.getModule())) + .build()); + if (CollectionUtils.isEmpty(refundApplyOrderList)) { + LogUtil.error("退款成功回调处理失败,退票申请单不存在,入参为:{}", refundApplyOrderNo); + throw new TpTradeProdException(TpTradeProdErrorCode.REFUND_SUCCESS_CALLBACK_PROCESS_ERROR); + } + + TpProdRefundApplyOrderDTO refundApplyOrderDTO = refundApplyOrderList.get(0); + List refundSubjectItemDTOs = refundApplyOrderDTO.getSubjectItemList(); + Assert.notEmpty(refundSubjectItemDTOs, "退票标的项不能为空"); + Map refundItemMap; + + // 实名认证 + TpRefundPassengerDTO passenger = refundSubjectItemDTOs.get(0).getPassenger(); + if (passenger != null) { + refundItemMap = refundSubjectItemDTOs.stream().collect(Collectors.groupingBy(TpRefundSubjectItemDTO::getSubjectItemId, Collectors.collectingAndThen(Collectors.toList(), List::size))); + } else { + refundItemMap = refundSubjectItemDTOs.stream().collect(Collectors.groupingBy(TpRefundSubjectItemDTO::getSubjectItemId, Collectors.summingInt(TpRefundSubjectItemDTO::getQuantity))); + } + + List operationDTOs = new ArrayList<>(); + AtomicInteger sequence = new AtomicInteger(0); + refundItemMap.forEach((itemNo, count) -> { + TpInventoryOperationDTO operationDTO = new TpInventoryOperationDTO(); + operationDTO.setCarrierCode(itemNo); + operationDTO.setBizType(TpInventoryBizTypeEnum.ORDER.getType()); + operationDTO.setBizNo(refundApplyOrderDTO.getRefundApplyOrderNo()); + operationDTO.setOperationInventoryCount(count); + operationDTO.setOperationType(TpInventoryOperationTypeEnum.DEDUCT_TO_ROLLBACK.getType()); + operationDTO.setTransactionNo(refundApplyOrderDTO.getRefundApplyOrderNo() + sequence); + operationDTO.setTenantId(tenantId); + operationDTOs.add(operationDTO); + sequence.incrementAndGet(); + }); + + inventoryClient.batchOperateInventory(operationDTOs); + } + + private String buildMessage(TpMessageEntity messageEntity) { + String message = messageEntity.getMessage(); + JSONObject jsonObject = JSONObject.parseObject(message); + + String messageKey = (String) jsonObject.get("key"); + + // message key + messageEntity.setMessageKey(messageKey); + + return (String) jsonObject.get("body"); + } + + /** + * 发送退票成功的消息,需要判断是否已经全部退票完成了 + */ + private void sendRefundMessage(String orderNo, String refundApplyOrderNo, String tenantId) { + boolean existRefund = true; + + // 判断是否存在有效的凭证 + List curVoucherList = getVoucherList(orderNo, tenantId); + + boolean existValid = curVoucherList.stream() + .anyMatch(voucherDTO -> StringUtils.equals(voucherDTO.getStatus(), TpVoucherStatusEnum.CREATED.getCode()) + || StringUtils.equals(voucherDTO.getStatus(), TpVoucherStatusEnum.PARTIAL_VERIFIED.getCode())); + + boolean existVerification = curVoucherList.stream() + .anyMatch(voucherDTO -> StringUtils.equals(voucherDTO.getStatus(), TpVoucherStatusEnum.FULLY_VERIFIED.getCode()) || + StringUtils.equals(voucherDTO.getStatus(), TpVoucherStatusEnum.PARTIAL_VERIFIED.getCode())); + + boolean existExpired = curVoucherList.stream() + .anyMatch(voucherDTO -> StringUtils.equals(voucherDTO.getStatus(), TpVoucherStatusEnum.EXPIRED.getCode())); + + BaseMessageEntity baseMessageEntity = new BaseMessageEntity(); + baseMessageEntity.setSource(MessageSysConstants.SOURCE_CONTRACT); + baseMessageEntity.setKey(refundApplyOrderNo); + baseMessageEntity.setSendTime(LocalDateTime.now()); + + TicketRefundSuccessMessageEntity refundSuccessMessage = new TicketRefundSuccessMessageEntity(); + refundSuccessMessage.setOrderNo(orderNo); + refundSuccessMessage.setRefundApplyOrderNo(refundApplyOrderNo); + refundSuccessMessage.setRefundTime(System.currentTimeMillis()); + refundSuccessMessage.setTenantId(tenantId); + refundSuccessMessage.setExistRefund(existRefund); + refundSuccessMessage.setExistValid(existValid); + refundSuccessMessage.setExistVerification(existVerification); + refundSuccessMessage.setExistExpire(existExpired); + baseMessageEntity.setBody(JSONUtil.toJsonStr(refundSuccessMessage)); + + messageClient.send(messageClient.getMessageTopic(), MessageConstants.EC_TICKET_REFUND_SUCCESS, baseMessageEntity); + LogUtil.info("发送退票成功的消息,消息内容为:{}", JSONUtil.toJsonStr(baseMessageEntity)); + } + + private List getVoucherList(String orderNo, String tenantId) { + TpProdVoucherQueryDTO queryDTO = new TpProdVoucherQueryDTO(); + List voucherList = voucherClient.getVoucherList(queryDTO.setOrderNo(orderNo).setTenantId(tenantId)); + if (CollectionUtils.isEmpty(voucherList)) { + LogUtil.error("凭证不存在,无法进行退票处理,入参为:{}", orderNo); + throw new TpTradeProdException(TpTradeProdErrorCode.NOT_FOUND_VOUCHER); + } + + return voucherList; + } +} diff --git a/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpRescheduleInvalidTicketMessageHandler.java b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpRescheduleInvalidTicketMessageHandler.java new file mode 100644 index 0000000..75b6222 --- /dev/null +++ b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpRescheduleInvalidTicketMessageHandler.java @@ -0,0 +1,94 @@ +package com.deepinnet.tptradeprod.core.handler; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.order.TpOrderPushStatusDTO; +import com.deepinnet.tptradecore.common.enums.order.TpOrderPushStatusEnum; +import com.deepinnet.tptradeprod.common.dto.*; +import com.deepinnet.tptradeprod.common.enums.TpOrderStatusEnum; +import com.deepinnet.tptradeprod.common.enums.TpPayOrderStatusEnum; +import com.deepinnet.tptradeprod.common.model.TpMessageEntity; +import com.deepinnet.tptradeprod.common.model.VoucherRescheduleInvalidMessageEntity; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.deepinnet.tptradeprod.core.constants.MessageConstants; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 改签票过期消息处理器 + * @author chenjiaju + * @version 2022/11/22 16:15 + */ +@Service +@RequiredArgsConstructor +public class TpRescheduleInvalidTicketMessageHandler implements TpMessageHandler { + + @Resource + private TpOrderClient tpOrderClient; + + @Override + public String supportTag() { + return MessageConstants.EVENT_CODE_RESCHEDULE_VOUCHER_INVALID_SUCCESS; + } + + @Override + public void handle(TpMessageEntity messageEntity) { + String bodyMsg = buildMessage(messageEntity); + LogUtil.info("改签成功失效凭证消息体:{}", bodyMsg); + VoucherRescheduleInvalidMessageEntity voucherRescheduleInvalidMessage = JSONObject.parseObject(bodyMsg, VoucherRescheduleInvalidMessageEntity.class); + + String orderNo = voucherRescheduleInvalidMessage.getOrderNo(); + String tenantId = voucherRescheduleInvalidMessage.getTenantId(); + + TpProdOrderDetailVO orderDetail = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder().orderNo(orderNo).tenantId(tenantId).build()); + + // 当前订单如果属于已完结的状态,则不允许进行状态推进,控制台打印错误消息 + if (orderDetail.getStatus().compareTo(TpOrderStatusEnum.ALREADY_CHANGE.getStatus()) >= 0 + || orderDetail.getStatus().compareTo(TpOrderStatusEnum.ALREADY_PAY.getStatus()) < 0) { + LogUtil.error("改签成功失效凭证消息状态推进异常, 当前订单:{}, 状态细分:{}, 状态编码:{}", orderDetail.getOrderNo(), TpOrderStatusEnum.getTpOrderStatusEnumByStatus(orderDetail.getStatus(), orderDetail.getType()), orderDetail.getStatus()); + return; + } + + // 构建订单推进状态dto + TpOrderPushStatusDTO dto = TpOrderPushStatusDTO.builder() + .orderNo(orderNo) + .tenantId(tenantId).build(); + + List payOrders = orderDetail.getPayOrders(); + + if (CollUtil.isEmpty(payOrders)) { + dto.setTpOrderPushStatusEnum(TpOrderPushStatusEnum.ORDER_RESCHEDULE_NO_REFUND); + } else { + List refundOrders = payOrders.stream() + .filter(payOrder -> StrUtil.equals(payOrder.getStatus(), TpPayOrderStatusEnum.REFUND.getCode())) + .collect(Collectors.toList()); + + TpOrderPushStatusEnum statusEnum = CollUtil.isNotEmpty(refundOrders) + ? TpOrderPushStatusEnum.ORDER_RESCHEDULE_HAS_REFUND + : TpOrderPushStatusEnum.ORDER_RESCHEDULE_NO_REFUND; + + dto.setTpOrderPushStatusEnum(statusEnum); + } + + tpOrderClient.pushOrderStatus(dto); + } + + private String buildMessage(TpMessageEntity messageEntity) { + String message = messageEntity.getMessage(); + JSONObject jsonObject = JSONObject.parseObject(message); + + String messageKey = (String) jsonObject.get("key"); + + // message key + messageEntity.setMessageKey(messageKey); + + return (String) jsonObject.get("body"); + } +} diff --git a/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpTicketRefundMessageHandler.java b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpTicketRefundMessageHandler.java new file mode 100644 index 0000000..afd4158 --- /dev/null +++ b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpTicketRefundMessageHandler.java @@ -0,0 +1,106 @@ +package com.deepinnet.tptradeprod.core.handler; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.order.TpOrderPushStatusDTO; +import com.deepinnet.tptradecore.common.enums.order.TpOrderPushStatusEnum; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderQueryDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderStatusEnum; +import com.deepinnet.tptradeprod.common.model.TicketRefundMessageEntity; +import com.deepinnet.tptradeprod.common.model.TpMessageEntity; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.deepinnet.tptradeprod.core.constants.MessageConstants; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * @author chenjiaju + * @version 2022/11/22 16:15 + */ +@Service +@RequiredArgsConstructor +public class TpTicketRefundMessageHandler implements TpMessageHandler { + + @Resource + private TpOrderClient tpOrderClient; + + + @Override + public String supportTag() { + return MessageConstants.EC_TICKET_REFUND_SUCCESS; + } + + @Override + public void handle(TpMessageEntity messageEntity) { + String bodyMsg = buildMessage(messageEntity); + + // 退款成功时推进订单状态 + TicketRefundMessageEntity ticketRefundMessage = JSONObject.parseObject(bodyMsg, TicketRefundMessageEntity.class); + + TpProdOrderDetailVO orderDetail = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .orderNo(ticketRefundMessage.getOrderNo()) + .tenantId(ticketRefundMessage.getTenantId()) + .needModules(null).build()); + + // 当前订单如果属于已完结的状态,则不允许进行状态推进,控制台打印错误消息 + if (orderDetail.getStatus().compareTo(TpOrderStatusEnum.ALREADY_CHANGE.getStatus()) >= 0 + || orderDetail.getStatus().compareTo(TpOrderStatusEnum.ALREADY_PAY.getStatus()) < 0) { + LogUtil.error("退款成功推进订单, 当前订单:{}, 状态暂不可推进, 状态细分:{}, 状态编码:{}", orderDetail.getOrderNo(), TpOrderStatusEnum.getTpOrderStatusEnumByStatus(orderDetail.getStatus(), orderDetail.getType()), orderDetail.getStatus()); + return; + } + + // 构建订单推进状态dto + TpOrderPushStatusDTO dto = TpOrderPushStatusDTO.builder() + .orderNo(orderDetail.getOrderNo()) + .tenantId(ticketRefundMessage.getTenantId()).build(); + + // 已支付情况下,不存在有效凭证,推进为全部退款,存在有效凭证情况下推进为部分退款 + if (ObjectUtil.equal(orderDetail.getStatus(), TpOrderStatusEnum.ALREADY_PAY.getStatus())) { + dto.setTpOrderPushStatusEnum(ObjectUtil.equal(Boolean.TRUE, ticketRefundMessage.isExistValid()) ? TpOrderPushStatusEnum.PART_REFUND_NOT_VERIFIED_PUSH_STATUS : TpOrderPushStatusEnum.ALL_REFUND_PUSH_STATUS); + } + + // 或 订单为部分核销的情况下,判断消息是否将凭证全部核销完成,将订单推进到部分退款 / 已完成(存在退款) + // 或 订单为部分退款的状态,若存在有效凭证则还是部分退款,若不存在有效凭证,则推进为已完成(含退款) + // 或 订单为退款中的状态,若存在有效凭证则还是部分退款,若不存在有效凭证,则推进为已完成(含退款) + if (ObjectUtil.equal(orderDetail.getStatus(), TpOrderStatusEnum.PARTLY_VERIFICATION.getStatus()) + || ObjectUtil.equal(orderDetail.getStatus(), TpOrderStatusEnum.PARTLY_REFUND.getStatus()) + || ObjectUtil.equal(orderDetail.getStatus(), TpOrderStatusEnum.ORDER_REFUNDING.getStatus())) { + // 若存在有效凭证则推进为部分退款成功,若不存在有效凭证 且 存在已核销凭证 则推进为已完成(存在退款),若不存在有效凭证 且 不存在核销凭证则推进为全部退款 + dto.setTpOrderPushStatusEnum(ObjectUtil.equal(Boolean.TRUE, ticketRefundMessage.isExistValid()) ? TpOrderPushStatusEnum.PART_REFUND_NOT_VERIFIED_PUSH_STATUS : (ObjectUtil.equal(Boolean.TRUE, ticketRefundMessage.isExistVerification()) ? TpOrderPushStatusEnum.PART_REFUND_ALL_VERIFIED_PUSH_STATUS : TpOrderPushStatusEnum.ALL_REFUND_PUSH_STATUS)); + } + + // 判断推进状态是否有值,没有值直接返回 + if (ObjectUtil.isNull(dto.getTpOrderPushStatusEnum())) { + LogUtil.error("当前订单:{}, 状态:{}, 暂无不可推进", orderDetail.getOrderNo(), orderDetail.getStatus()); + return; + } + + // 如果当前订单状态为部分退款,推进状态也是部分退款,则终止推进状态 + if (ObjectUtil.equal(orderDetail.getStatus(), dto.getTpOrderPushStatusEnum().getStatus())) { + LogUtil.warn("当前订单:{}, 状态暂不推进, 状态已是:{},需推进状态为:{}", orderDetail.getOrderNo(), orderDetail.getStatus(), dto.getTpOrderPushStatusEnum().getStatus()); + return; + } + + LogUtil.info("退款成功推进订单, 当前订单:{}, 状态:{}, 将订单状态推进为:{}", orderDetail.getOrderNo(), orderDetail.getStatus(), dto.getTpOrderPushStatusEnum().getStrategyDesc()); + + tpOrderClient.pushOrderStatus(dto); + + } + + private String buildMessage(TpMessageEntity messageEntity) { + String message = messageEntity.getMessage(); + LogUtil.info("------------------------------收到退款成功消息:{}", message); + JSONObject jsonObject = JSONObject.parseObject(message); + + String messageKey = (String) jsonObject.get("key"); + + // message key + messageEntity.setMessageKey(messageKey); + + return (String) jsonObject.get("body"); + } +} diff --git a/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpVoucherExpireMessageHandler.java b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpVoucherExpireMessageHandler.java new file mode 100644 index 0000000..8335bc5 --- /dev/null +++ b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpVoucherExpireMessageHandler.java @@ -0,0 +1,123 @@ +package com.deepinnet.tptradeprod.core.handler; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.order.TpOrderPushStatusDTO; +import com.deepinnet.tptradecore.common.enums.order.TpOrderPushStatusEnum; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderQueryDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderStatusEnum; +import com.deepinnet.tptradeprod.common.enums.TpOrderTypeEnum; +import com.deepinnet.tptradeprod.common.model.TpMessageEntity; +import com.deepinnet.tptradeprod.common.model.VoucherExpireMessageEntity; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.deepinnet.tptradeprod.core.constants.MessageConstants; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * + *

+ * 凭证过期消息处理器 + *

+ * + * @author chenjiaju + * @version 2022/11/22 16:15 + */ +@Service +@RequiredArgsConstructor +public class TpVoucherExpireMessageHandler implements TpMessageHandler { + + @Resource + private TpOrderClient tpOrderClient; + + + @Override + public String supportTag() { + return MessageConstants.EC_VOUCHER_EXPIRED_SUCCESS; + } + + @Override + public void handle(TpMessageEntity messageEntity) { + String bodyMsg = buildMessage(messageEntity); + + // 凭证核销时推进订单状态 + VoucherExpireMessageEntity voucherExpireMessage = JSONObject.parseObject(bodyMsg, VoucherExpireMessageEntity.class); + + TpProdOrderDetailVO orderDetail = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .orderNo(voucherExpireMessage.getOrderNo()) + .tenantId(voucherExpireMessage.getTenantId()) + .needModules(null).build()); + + if (ObjectUtil.equals(orderDetail.getType(), TpOrderTypeEnum.CARPOOL_ORDER.getType())) { + LogUtil.info("拼车订单凭证失效成功, 订单号:{}, 无需推进订单状态", orderDetail.getOrderNo(), orderDetail.getStatus()); + return; + } + + // 当前订单如果属于已完结的状态,则不允许进行状态推进,控制台打印错误消息 + if (orderDetail.getStatus().compareTo(TpOrderStatusEnum.ALREADY_CHANGE.getStatus()) >= 0) { + LogUtil.error("凭证失效成功, 当前订单:{}, 状态暂不可推进, 状态细分:{}, 状态编码:{}", orderDetail.getOrderNo(), TpOrderStatusEnum.getTpOrderStatusEnumByStatus(orderDetail.getStatus(), orderDetail.getType()), orderDetail.getStatus()); + return; + } + + pushStatus(orderDetail, voucherExpireMessage); + + } + + private void pushStatus(TpProdOrderDetailVO orderDetail, VoucherExpireMessageEntity voucherExpireMessage) { + // 构建订单推进状态dto + TpOrderPushStatusDTO dto = TpOrderPushStatusDTO.builder() + .orderNo(orderDetail.getOrderNo()) + .tenantId(voucherExpireMessage.getTenantId()).build(); + + // 不存在退款 + if (ObjectUtil.equal(orderDetail.getStatus(), TpOrderStatusEnum.PARTLY_VERIFICATION.getStatus())) { + // 如果存在可用凭证,则状态还应为:部分核销;如果不存在可用凭证,则状态应推进为: 部分过期(不存在退款) + dto.setTpOrderPushStatusEnum(ObjectUtil.equal(Boolean.TRUE, voucherExpireMessage.isExistValid()) ? TpOrderPushStatusEnum.PART_VERIFIED_VOUCHER_EXIST_UNVERIFIED_PUSH_STATUS : TpOrderPushStatusEnum.PART_EXPIRE); + } + + // 存在退款 + if (ObjectUtil.equal(orderDetail.getStatus(), TpOrderStatusEnum.PARTLY_REFUND.getStatus())) { + // 如果存在可用凭证,则状态还应为:部分退款;如果不存在可用凭证,则状态推进为:部分过期(存在退款) + dto.setTpOrderPushStatusEnum(ObjectUtil.equal(Boolean.TRUE, voucherExpireMessage.isExistValid()) ? TpOrderPushStatusEnum.PART_REFUND_NOT_VERIFIED_PUSH_STATUS : TpOrderPushStatusEnum.PART_EXPIRE_EXIST_REFUND); + } + + // 未核销的情况下,全部过期 + if (ObjectUtil.equal(orderDetail.getStatus(), TpOrderStatusEnum.ALREADY_PAY.getStatus())) { + // 如果存在可用凭证,则状态还应为:已支付;如果不存在可用凭证,则状态推进为:全部过期 + dto.setTpOrderPushStatusEnum(ObjectUtil.equal(Boolean.TRUE, voucherExpireMessage.isExistValid()) ? TpOrderPushStatusEnum.PAID_ORDER_PUSH_STATUS : TpOrderPushStatusEnum.ALL_EXPIRE); + } + + // 判断推进状态是否有值,没有值直接返回 + if (ObjectUtil.isNull(dto.getTpOrderPushStatusEnum())) { + LogUtil.error("当前订单:{}, 状态:{}, 暂无不可推进", orderDetail.getOrderNo(), orderDetail.getStatus()); + return; + } + + // 订单状态如果和要推进的状态一致则跳过 + if (ObjectUtil.equal(orderDetail.getStatus(), dto.getTpOrderPushStatusEnum().getStatus())) { + LogUtil.warn("当前订单:{}, 暂不推进订单状态, 状态为:{}, 需要推进状态为:{}", orderDetail.getOrderNo(), orderDetail.getStatus(), dto.getTpOrderPushStatusEnum().getStatus()); + return; + } + + LogUtil.info("凭证失效成功, 当前订单:{}, 状态:{}, 将订单状态推进为:{}", orderDetail.getOrderNo(), orderDetail.getStatus(), dto.getTpOrderPushStatusEnum()); + + tpOrderClient.pushOrderStatus(dto); + } + + private String buildMessage(TpMessageEntity messageEntity) { + String message = messageEntity.getMessage(); + LogUtil.info("------------------------------收到凭证失效消息:{}", message); + JSONObject jsonObject = JSONObject.parseObject(message); + + String messageKey = (String) jsonObject.get("key"); + + // message key + messageEntity.setMessageKey(messageKey); + + return (String) jsonObject.get("body"); + } +} diff --git a/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpVoucherVerificationMessageHandler.java b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpVoucherVerificationMessageHandler.java new file mode 100644 index 0000000..63ca654 --- /dev/null +++ b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/handler/TpVoucherVerificationMessageHandler.java @@ -0,0 +1,121 @@ +package com.deepinnet.tptradeprod.core.handler; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradecore.common.dto.order.TpOrderPushStatusDTO; +import com.deepinnet.tptradecore.common.enums.order.TpOrderPushStatusEnum; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderQueryDTO; +import com.deepinnet.tptradeprod.common.enums.TpOrderStatusEnum; +import com.deepinnet.tptradeprod.common.model.TpMessageEntity; +import com.deepinnet.tptradeprod.common.model.VoucherVerificationMessageEntity; +import com.deepinnet.tptradeprod.common.service.integration.client.TpOrderClient; +import com.deepinnet.tptradeprod.common.vo.TpProdOrderDetailVO; +import com.deepinnet.tptradeprod.core.constants.MessageConstants; +import lombok.RequiredArgsConstructor; +import org.jetbrains.annotations.NotNull; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + *

+ * 凭证核销消息处理器 + *

+ * + * @author chenjiaju + * @version 2022/11/22 16:15 + */ +@Service +@RequiredArgsConstructor +public class TpVoucherVerificationMessageHandler implements TpMessageHandler { + + @Resource + private TpOrderClient tpOrderClient; + + + @Override + public String supportTag() { + return MessageConstants.EC_VOUCHER_VERIFICATION_SUCCESS; + } + + @Override + public void handle(TpMessageEntity messageEntity) { + String bodyMsg = buildMessage(messageEntity); + + // 凭证核销时推进订单状态 + VoucherVerificationMessageEntity verificationMessage = JSONObject.parseObject(bodyMsg, VoucherVerificationMessageEntity.class); + + TpProdOrderDetailVO orderDetail = tpOrderClient.getOrderDetail(TpProdOrderQueryDTO.builder() + .orderNo(verificationMessage.getOrderNo()) + .tenantId(verificationMessage.getTenantId()) + .needModules(null).build()); + + // 当前订单如果属于已完结的状态,则不允许进行状态推进,控制台打印错误消息 + if (orderDetail.getStatus().compareTo(TpOrderStatusEnum.ALREADY_PAY.getStatus()) < 0) { + LogUtil.error("凭证核销成功, 当前订单:{}, 状态暂不可推进, 状态细分:{}, 状态编码:{}", orderDetail.getOrderNo(), TpOrderStatusEnum.getTpOrderStatusEnumByStatus(orderDetail.getStatus(), orderDetail.getType()), orderDetail.getStatus()); + return; + } + + // 构建订单推进状态dto + TpOrderPushStatusDTO dto = TpOrderPushStatusDTO.builder() + .orderNo(orderDetail.getOrderNo()) + .tenantId(verificationMessage.getTenantId()).build(); + + // 订单状态为待核销的情况下,直接推进为部分核销 / 已完成 + // 或 订单为部分核销的情况下,判断消息是否将凭证全部核销完成,将订单推进到部分核销 / 已完成 + if (ObjectUtil.equal(orderDetail.getStatus(), TpOrderStatusEnum.ALREADY_PAY.getStatus()) + || ObjectUtil.equal(orderDetail.getStatus(), TpOrderStatusEnum.PARTLY_VERIFICATION.getStatus())) { + // 如果当前存在剩余有效凭证,不管存不存在过期,均为部分核销 + // 如果当前不存在剩余有效凭证,如果存在部分过期的,则推进为:部分过期(不存在退款),如果不存在部分过期的则推进为:全部核销 + dto.setTpOrderPushStatusEnum(ObjectUtil.equal(Boolean.TRUE, verificationMessage.isExistValid()) ? TpOrderPushStatusEnum.PART_VERIFIED_VOUCHER_EXIST_UNVERIFIED_PUSH_STATUS : getPartExpireNotRefund(verificationMessage)); + } + + // 订单是否为部分退款的状态 + if (ObjectUtil.equal(orderDetail.getStatus(), TpOrderStatusEnum.PARTLY_REFUND.getStatus())) { + // 若当前部分退款且存在有效凭证,不管是否存在过期的凭证,均为部分退款 + // 若当前部分退款且不存在有效凭证,如果存在部分过期的,则推进为:部分过期(存在退款),如果不存在部分过期的则推进为:已完成(存在退款) + dto.setTpOrderPushStatusEnum(ObjectUtil.equal(Boolean.TRUE, verificationMessage.isExistValid()) ? TpOrderPushStatusEnum.PART_VERIFIED_VOUCHER_EXIST_UNVERIFIED_PUSH_STATUS : getPartExpireHasRefund(verificationMessage)); + } + + // 判断推进状态是否有值,没有值直接返回 + if (ObjectUtil.isNull(dto.getTpOrderPushStatusEnum())) { + LogUtil.error("当前订单:{}, 状态:{}, 暂无不可推进", orderDetail.getOrderNo(), orderDetail.getStatus()); + return; + } + + // 判断当前状态与需要推进的状态否为均为 部分核销 / 部分退款, 如果是,则状态不予推进 + if (ObjectUtil.equal(orderDetail.getStatus(), dto.getTpOrderPushStatusEnum().getStatus())) { + LogUtil.warn("当前订单:{}, 暂不推进订单状态, 状态为:{}, 需要推进状态为:{}, ", orderDetail.getOrderNo(), orderDetail.getStatus(), dto.getTpOrderPushStatusEnum().getStatus()); + return; + } + + LogUtil.info("凭证核销成功, 当前订单:{}, 状态:{}, 将订单状态推进为:{}", orderDetail.getOrderNo(), orderDetail.getStatus(), dto.getTpOrderPushStatusEnum()); + + tpOrderClient.pushOrderStatus(dto); + + } + + @NotNull + private static TpOrderPushStatusEnum getPartExpireHasRefund(VoucherVerificationMessageEntity verificationMessage) { + return ObjectUtil.equal(Boolean.TRUE, verificationMessage.isExistExpire()) ? TpOrderPushStatusEnum.PART_EXPIRE_EXIST_REFUND : TpOrderPushStatusEnum.PART_REFUND_ALL_VERIFIED_PUSH_STATUS; + } + + @NotNull + private static TpOrderPushStatusEnum getPartExpireNotRefund(VoucherVerificationMessageEntity verificationMessage) { + return ObjectUtil.equal(Boolean.TRUE, verificationMessage.isExistExpire()) ? TpOrderPushStatusEnum.PART_EXPIRE : TpOrderPushStatusEnum.ALL_VERIFIED_PUSH_STATUS; + } + + private String buildMessage(TpMessageEntity messageEntity) { + String message = messageEntity.getMessage(); + LogUtil.info("------------------------------收到凭证核销成功消息:{}", message); + JSONObject jsonObject = JSONObject.parseObject(message); + + String messageKey = (String) jsonObject.get("key"); + + // message key + messageEntity.setMessageKey(messageKey); + + return (String) jsonObject.get("body"); + } +} diff --git a/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/listener/BaseMqMessageListener.java b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/listener/BaseMqMessageListener.java new file mode 100644 index 0000000..f79551d --- /dev/null +++ b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/listener/BaseMqMessageListener.java @@ -0,0 +1,99 @@ +package com.deepinnet.tptradeprod.core.listener; + +import cn.hutool.core.collection.CollectionUtil; +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradeprod.common.model.TpMessageEntity; +import com.deepinnet.tptradeprod.core.handler.TpMessageHandler; +import org.apache.rocketmq.common.message.MessageExt; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + + +/** + * 抽象消息监听器,封装了所有公共处理业务 + * + * @author chenjiaju + * @version 2022/11/23 09:28 + */ + +@Component +@RocketMQMessageListener( + topic = "${message.trans-pay-topic}", + consumerGroup = "${message.consumerGroup}" +) +public class BaseMqMessageListener implements RocketMQListener { + + @Resource + private Map messageHandlerMap = new ConcurrentHashMap<>(); + + @Value("${message.consumerGroup}") + private String group; + + protected String consumerGroup() { + return group; + } + + /** + * @param messageExt 消息 + */ + @Override + public void onMessage(MessageExt messageExt) { + this.consumeMessage(messageExt); + } + + /** + * 打日志 & 分发处理器 + * + * @param messageExt 消息 + */ + public void consumeMessage(MessageExt messageExt) { + String message = new String(messageExt.getBody(), StandardCharsets.UTF_8); + LogUtil.info("消费组[{}], 接收TOPIC:[{}], tag:[{}], messageKey:[{}], 消息内容[{}]", consumerGroup(), messageExt.getTopic(), messageExt.getTags(), messageExt.getKeys(), messageExt); + try { + // 消息分发到具体的处理器 + _dispatchMessage(TpMessageEntity.builder() + .tag(messageExt.getTags()) + .message(message) + .messageKey(messageExt.getKeys()) + .consumerGroup(consumerGroup()) + .topic(messageExt.getTopic()).build()); + } catch (Exception e) { + LogUtil.error("消息消费异常, 异常消息:{}", message, e); + throw new TpException("消费消息异常:", e); + } + } + + /** + * 消息分发 + */ + protected void _dispatchMessage(TpMessageEntity message) { + // Optional thisMessageHandler = messageHandlerMap.values().parallelStream().filter(messageHandler -> message.getTag().equals(messageHandler.supportTag())).findFirst(); + + + List messageHandlers = messageHandlerMap.values().stream().filter(messageHandler -> message.getTag().equals(messageHandler.supportTag())).collect(Collectors.toList()); + + if (CollectionUtil.isEmpty(messageHandlers)) { + LogUtil.error("message find no handler:{}", message); + throw new TpException("未找到具体的handler"); + } + +// if (thisMessageHandler.isEmpty()) { +// LogUtil.error("message find no handler:{}", message); +// throw new TpException("未找到具体的handler"); +// } + + // 消息实际处理 + //thisMessageHandler.get().handle(message); + messageHandlers.parallelStream().forEach(messageHandler -> messageHandler.handle(message)); + } +} diff --git a/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/listener/DelayMqMessageListener.java b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/listener/DelayMqMessageListener.java new file mode 100644 index 0000000..86bd47e --- /dev/null +++ b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/listener/DelayMqMessageListener.java @@ -0,0 +1,88 @@ +package com.deepinnet.tptradeprod.core.listener; + +import com.deepinnet.tp.common.lang.exception.TpException; +import com.deepinnet.tp.common.lang.util.LogUtil; +import com.deepinnet.tptradeprod.common.enums.TpTradeProdMessageConstants; +import com.deepinnet.tptradeprod.common.model.TpMessageEntity; +import com.deepinnet.tptradeprod.core.handler.TpMessageHandler; +import org.apache.rocketmq.common.message.MessageExt; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.nio.charset.StandardCharsets; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; + + +/** + * 抽象延迟消息监听器,封装了所有公共处理业务 + * + * @author chenjiaju + * @version 2022/11/23 09:28 + */ + +@Component +@RocketMQMessageListener( + topic = "${message.delay-topic}", + consumerGroup = "${message.delayConsumerGroup}" +) +public class DelayMqMessageListener implements RocketMQListener { + + @Resource + private Map messageHandlerMap = new ConcurrentHashMap<>(); + + @Value("${message.delayConsumerGroup}") + private String group; + + protected String consumerGroup() { + return group; + } + + /** + * @param messageExt 消息 + */ + @Override + public void onMessage(MessageExt messageExt) { + this.consumeMessage(messageExt); + } + + /** + * 打日志 & 分发处理器 + * @param messageExt 消息 + */ + public void consumeMessage(MessageExt messageExt) { + String message = new String(messageExt.getBody(), StandardCharsets.UTF_8); + LogUtil.info("消费组[{}], 接收DELAY_TOPIC:[{}], tag:[{}], messageKey:[{}], 消息内容[{}]", consumerGroup(), messageExt.getTopic(), messageExt.getTags(), messageExt.getKeys(), messageExt); + try { + // 消息分发到具体的处理器 + _dispatchMessage(TpMessageEntity.builder() + .tag(messageExt.getTags()) + .message(message) + .messageKey(messageExt.getKeys()) + .consumerGroup(consumerGroup()) + .topic(messageExt.getTopic()).build()); + } catch (Exception e) { + LogUtil.error("消息消费异常, 异常消息:{}", message, e); + throw new TpException("消费消息异常:", e); + } + } + + /** + * 消息分发 + */ + protected void _dispatchMessage(TpMessageEntity message) { + Optional thisMessageHandler = messageHandlerMap.values().parallelStream().filter(messageHandler -> message.getTag().equals(messageHandler.supportTag())).findFirst(); + + if (!thisMessageHandler.isPresent()) { + LogUtil.error("message find no handler:{}", message); + throw new TpException("未找到具体的handler"); + } + + // 消息实际处理 + thisMessageHandler.get().handle(message); + } +} diff --git a/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/listener/NacosAbstractListener.java b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/listener/NacosAbstractListener.java new file mode 100644 index 0000000..3695138 --- /dev/null +++ b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/listener/NacosAbstractListener.java @@ -0,0 +1,142 @@ +package com.deepinnet.tptradeprod.core.listener; + +import com.alibaba.nacos.api.NacosFactory; +import com.alibaba.nacos.api.PropertyKeyConst; +import com.alibaba.nacos.api.config.ConfigService; +import com.alibaba.nacos.api.config.listener.Listener; +import com.alibaba.nacos.api.exception.NacosException; +import com.deepinnet.tp.common.lang.util.LogUtil; +import lombok.Getter; +import org.springframework.beans.factory.InitializingBean; + +import java.util.Properties; +import java.util.concurrent.Executor; +import java.util.concurrent.LinkedBlockingDeque; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + *

+ * 主动监听nacos配置 类 + * @param + *

+ * + * @author chenjiaju + * @since 2024/1/25 + */ +public abstract class NacosAbstractListener implements InitializingBean, Listener { + + /** + * 获取nacos dataId + * + * @return nacos dataId + */ + protected abstract String getDataId(); + + /** + * 获取nacos groupId + *

默认NacosConstant.GROUP_ID

+ * + * @return nacos groupId + */ + protected abstract String getGroupId(); + + protected abstract String getNameSpace(); + + /** + * 获取nacos 超时时间 + *

默认NacosConstant.TIMEOUT

+ * + * @return nacos 超时时间 + */ + protected long getTimeout() { + return 3000L; + } + + /** + * 将输入转为数据 + * + * @param dataStr 数据内容 + */ + protected abstract void compile(String dataStr); + + + protected final String clazzSimpleName = getClass().getSimpleName(); + + + @Getter + protected T data; + + /** + * bean初始化 触发 执行 + */ + @Override + public void afterPropertiesSet() throws NacosException { + LogUtil.info("NacosAbstractListener init..."); + ConfigService configService = this.getConfigService(); + try { + String config = configService.getConfig(getDataId(), getGroupId(), getTimeout()); + LogUtil.info("{}#afterPropertiesSet init configInfo. configInfo={}", clazzSimpleName, config); + compile(config); + configService.addListener(getDataId(), getGroupId(), this); + } catch (NacosException e) { + LogUtil.error("nacos config get error. dataId={}, groupId={}", getDataId(), getGroupId()); + throw new NacosException(); + } + LogUtil.info("NacosAbstractListener init success"); + } + + /** + * 获取ConfigService + * + * @return ConfigService + */ + private ConfigService getConfigService() { + String serverAddr = getServerAddr(); + String nameSpace = this.getNameSpace(); + Properties properties = new Properties(); + properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr); + properties.put(PropertyKeyConst.NAMESPACE, nameSpace); + ConfigService configService; + try { + configService = NacosFactory.createConfigService(properties); + } catch (NacosException e) { + LogUtil.error("Nacos config 配置 异常"); + throw new RuntimeException("Nacos config 配置 异常"); + } + return configService; + } + + /** + * 获取server addr + * + * @return server addr + */ + protected abstract String getServerAddr(); + + + /** + * 监听-工作线程池 + * @return executor + */ + @Override + public Executor getExecutor() { + return threadPoolExecutor; + } + + private static final ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( + 2, 4, 1, TimeUnit.SECONDS, new LinkedBlockingDeque<>(100), + new ThreadPoolExecutor.CallerRunsPolicy() + ); + + /** + * 接受到Nacos 具体 配置信息变动 + * + * @param configInfo 配置信息 + */ + @Override + public void receiveConfigInfo(String configInfo) { + LogUtil.info("{}#receiveConfigInfo receive configInfo. configInfo={}", clazzSimpleName, configInfo); + compile(configInfo); + } +} diff --git a/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/listener/NacosJsonDefaultListener.java b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/listener/NacosJsonDefaultListener.java new file mode 100644 index 0000000..f4a0344 --- /dev/null +++ b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/listener/NacosJsonDefaultListener.java @@ -0,0 +1,42 @@ +package com.deepinnet.tptradeprod.core.listener; + +import com.alibaba.cloud.nacos.NacosConfigProperties; +import com.alibaba.fastjson2.JSONObject; +import lombok.RequiredArgsConstructor; + +/** + *

+ * + *

+ * + * @author chenjiaju + * @since 2024/1/25 + */ + +@RequiredArgsConstructor +public abstract class NacosJsonDefaultListener extends NacosAbstractListener { + + private final NacosConfigProperties nacosConfigProperties; + @Override + protected String getGroupId() { + return nacosConfigProperties.getGroup(); + } + + @Override + protected String getNameSpace() { + return nacosConfigProperties.getNamespace(); + } + + @Override + protected String getServerAddr() { + return nacosConfigProperties.getServerAddr(); + } + + @Override + protected void compile(String dataStr) { + data = JSONObject.parseObject(dataStr, this.JsonToObjectClass()); + } + + protected abstract Class JsonToObjectClass(); + +} diff --git a/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/strategy/TpInventoryStrategy.java b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/strategy/TpInventoryStrategy.java new file mode 100644 index 0000000..2f60aca --- /dev/null +++ b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/strategy/TpInventoryStrategy.java @@ -0,0 +1,29 @@ +package com.deepinnet.tptradeprod.core.strategy; + +import com.deepinnet.tpproductcore.common.enums.TpInventoryOperationTypeEnum; + +/** + *

+ * + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ +public interface TpInventoryStrategy { + + /** + * 当前业务处理器支持的业务动作 + * + * @return 操作枚举类 + */ + TpInventoryOperationTypeEnum supportOperation(); + + /** + * 库存操作 + * @param operatorEntity 订单入参 + * @param tenantId 租户ID + */ + void operatorInventory(T operatorEntity, String tenantId); + +} diff --git a/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/strategy/impl/TpDeductInventoryStrategyImpl.java b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/strategy/impl/TpDeductInventoryStrategyImpl.java new file mode 100644 index 0000000..36e750e --- /dev/null +++ b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/strategy/impl/TpDeductInventoryStrategyImpl.java @@ -0,0 +1,73 @@ +package com.deepinnet.tptradeprod.core.strategy.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.deepinnet.tpproductcore.common.dto.inventory.TpInventoryOperationDTO; +import com.deepinnet.tpproductcore.common.enums.*; +import com.deepinnet.tptradeprod.common.enums.TpOrderTypeEnum; +import com.deepinnet.tptradeprod.common.enums.TpProdOrderIdentityFlagEnum; +import com.deepinnet.tptradeprod.common.service.integration.client.TpInventoryClient; +import com.deepinnet.tptradeprod.common.vo.*; +import com.deepinnet.tptradeprod.core.strategy.TpInventoryStrategy; +import com.google.common.collect.Lists; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +/** + *

+ * 扣减库存策略实现 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@Component +@RequiredArgsConstructor +public class TpDeductInventoryStrategyImpl implements TpInventoryStrategy { + + private final TpInventoryClient inventoryClient; + + @Override + public TpInventoryOperationTypeEnum supportOperation() { + return TpInventoryOperationTypeEnum.FREEZE_TO_DEDUCT; + } + + @Override + public void operatorInventory(TpProdOrderDetailVO orderDetail, String tenantId) { + List orderSubjectItem = orderDetail.getOrderSubjectItem(); + + List operationDTOs = Lists.newArrayList(); + Map orderItemMap; + + // 实名认证 + if (Objects.equals(orderDetail.getIdentityVerificat(), TpProdOrderIdentityFlagEnum.REAL_NAME_ORDER.getIdentityFlag())) { + orderItemMap = orderSubjectItem.stream().collect(Collectors.groupingBy(TpOrderSubjectItemVO::getItemNo, Collectors.collectingAndThen(Collectors.toList(), List::size))); + } else { + orderItemMap = orderSubjectItem.stream().collect(Collectors.groupingBy(TpOrderSubjectItemVO::getItemNo, Collectors.summingInt(TpOrderSubjectItemVO::getCount))); + } + + String orderNo = ObjectUtil.equals(TpOrderTypeEnum.CUSTOMIZED_RESCHEDULE_ORDER.getType(), orderDetail.getType()) ? orderDetail.getOriginalOrderNo() : orderDetail.getOrderNo(); + + AtomicInteger flagCount = new AtomicInteger(0); + orderItemMap.forEach((itemNo, count) -> { + flagCount.incrementAndGet(); + TpInventoryOperationDTO operationDTO = new TpInventoryOperationDTO(); + operationDTO.setCarrierCode(itemNo); + operationDTO.setBizType(TpInventoryBizTypeEnum.ORDER.getType()); + operationDTO.setBizNo(orderNo); + operationDTO.setOperationInventoryCount(count); + operationDTO.setOperationType(supportOperation().getType()); + operationDTO.setTransactionNo(DateUtil.current() + "_" + orderNo + "_" + supportOperation().getType() + "_" + flagCount); + operationDTO.setTenantId(tenantId); + operationDTOs.add(operationDTO); + }); + + inventoryClient.batchOperateInventory(operationDTOs); + } + +} diff --git a/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/strategy/impl/TpFreezeInventoryStrategyImpl.java b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/strategy/impl/TpFreezeInventoryStrategyImpl.java new file mode 100644 index 0000000..75a8c0e --- /dev/null +++ b/tptradeprod-core/tptradeprod-core-service/src/main/java/com/deepinnet/tptradeprod/core/strategy/impl/TpFreezeInventoryStrategyImpl.java @@ -0,0 +1,76 @@ +package com.deepinnet.tptradeprod.core.strategy.impl; + +import cn.hutool.core.util.StrUtil; +import com.deepinnet.tpproductcore.common.dto.inventory.TpInventoryOperationDTO; +import com.deepinnet.tpproductcore.common.enums.TpInventoryBizTypeEnum; +import com.deepinnet.tpproductcore.common.enums.TpInventoryOperationTypeEnum; +import com.deepinnet.tptradeprod.common.dto.TpOrderSubjectItemDTO; +import com.deepinnet.tptradeprod.common.dto.TpProdOrderCreateDTO; +import com.deepinnet.tptradeprod.common.enums.TpProdOrderIdentityFlagEnum; +import com.deepinnet.tptradeprod.common.service.integration.client.TpInventoryClient; +import com.deepinnet.tptradeprod.core.strategy.TpInventoryStrategy; +import com.google.common.collect.Lists; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +/** + *

+ * 冻结库存策略实现 + *

+ * + * @author chenjiaju + * @since 2023/10/16 + */ + +@Component +@RequiredArgsConstructor +public class TpFreezeInventoryStrategyImpl implements TpInventoryStrategy { + + private final TpInventoryClient inventoryClient; + + @Override + public TpInventoryOperationTypeEnum supportOperation() { + return TpInventoryOperationTypeEnum.FREEZE; + } + + @Override + public void operatorInventory(TpProdOrderCreateDTO dto, String tenantId) { + // 冻结库存 + List orderSubjectItem = dto.getOrderSubjectItem(); + + List operationDTOs = Lists.newArrayList(); + Map orderItemMap; + + // 实名认证 + if (Objects.equals(dto.getIdentityVerificat(), TpProdOrderIdentityFlagEnum.REAL_NAME_ORDER.getIdentityFlag())) { + orderItemMap = orderSubjectItem.stream().collect(Collectors.groupingBy(TpOrderSubjectItemDTO::getItemNo, Collectors.collectingAndThen(Collectors.toList(), List::size))); + } else { + orderItemMap = orderSubjectItem.stream().collect(Collectors.groupingBy(TpOrderSubjectItemDTO::getItemNo, Collectors.summingInt(TpOrderSubjectItemDTO::getCount))); + } + + String orderNo = StrUtil.isNotEmpty(dto.getOriginalOrderNo()) ? dto.getOriginalOrderNo() : dto.getOrderNo(); + + AtomicInteger flagCount = new AtomicInteger(); + orderItemMap.forEach((itemNo, count) -> { + flagCount.getAndIncrement(); + TpInventoryOperationDTO operationDTO = new TpInventoryOperationDTO(); + operationDTO.setCarrierCode(itemNo); + operationDTO.setBizType(TpInventoryBizTypeEnum.ORDER.getType()); + operationDTO.setBizNo(orderNo); + operationDTO.setOperationInventoryCount(count); + operationDTO.setOperationType(supportOperation().getType()); + operationDTO.setTransactionNo(flagCount.get() + "_" + dto.getOutRequestNo() + "_" + orderNo + "_" + supportOperation().getType()); + operationDTO.setTenantId(dto.getTenantId()); + operationDTOs.add(operationDTO); + }); + + inventoryClient.batchOperateInventory(operationDTOs); + } + +}