diff --git a/jsowell-admin/src/main/java/com/jsowell/service/OrderService.java b/jsowell-admin/src/main/java/com/jsowell/service/OrderService.java index 2167eed08..b241d8d41 100644 --- a/jsowell-admin/src/main/java/com/jsowell/service/OrderService.java +++ b/jsowell-admin/src/main/java/com/jsowell/service/OrderService.java @@ -17,6 +17,7 @@ import com.jsowell.adapay.vo.PaymentInfo; import com.jsowell.common.YouDianUtils; import com.jsowell.common.constant.CacheConstants; import com.jsowell.common.constant.Constants; +import com.jsowell.common.constant.mq.ThirdPartyRabbitConstants; import com.jsowell.common.core.domain.vo.AuthorizedDeptVO; import com.jsowell.common.core.domain.ykc.RealTimeMonitorData; import com.jsowell.common.core.domain.ykc.TransactionRecordsData; @@ -875,23 +876,23 @@ public class OrderService { log.info("人工结算订单-end orderCode:{}", dto.getOrderCode()); // 异步推送第三方平台订单信息 - CompletableFuture.runAsync(() -> { - try { - commonService.commonPushOrderInfo(orderBasicInfo); - } catch (Exception e) { - log.error("人工结算订单 推送第三方平台订单信息error, orderCode:{}", orderBasicInfo.getOrderCode(), e); - } - }, thirdpartyTaskExecutor); +// CompletableFuture.runAsync(() -> { +// try { +// commonService.commonPushOrderInfo(orderBasicInfo); +// } catch (Exception e) { +// log.error("人工结算订单 推送第三方平台订单信息error, orderCode:{}", orderBasicInfo.getOrderCode(), e); +// } +// }, thirdpartyTaskExecutor); // TODO 测试mq // 向mq中发送实时数据消息,给第三方服务消费 -// CompletableFuture.runAsync(() -> { -// try { -// rabbitTemplate.convertAndSend(ThirdPartyRabbitConstants.WCC_THIRDPARTY_NAME , ThirdPartyRabbitConstants.ROUTING_KEY_CHARGE_ORDER_PUSH ,orderBasicInfo ); -// } catch (Exception e) { -// log.error("向mq中发送实时数据消息供第三方服务消费 error, " , e); -// } -// }, thirdpartyTaskExecutor); + CompletableFuture.runAsync(() -> { + try { + rabbitTemplate.convertAndSend(ThirdPartyRabbitConstants.WCC_THIRDPARTY_NAME , ThirdPartyRabbitConstants.ROUTING_KEY_CHARGE_ORDER_PUSH ,orderBasicInfo ); + } catch (Exception e) { + log.error("向mq中发送实时数据消息供第三方服务消费 error, " , e); + } + }, thirdpartyTaskExecutor); return true; } diff --git a/jsowell-admin/src/main/java/com/jsowell/service/TempService.java b/jsowell-admin/src/main/java/com/jsowell/service/TempService.java index b3107fc10..0975d0a22 100644 --- a/jsowell-admin/src/main/java/com/jsowell/service/TempService.java +++ b/jsowell-admin/src/main/java/com/jsowell/service/TempService.java @@ -1514,7 +1514,7 @@ public class TempService { throw new RuntimeException("订单不是异常订单:" + orderCode); } - if (!Objects.equals(orderBasicInfo.getPayMode(), PayModeEnum.PAYMENT_OF_WHITELIST.getValue())) { + if (!Objects.equals(orderBasicInfo.getPayMode(), "3")) { throw new RuntimeException("订单不是白名单支付方式:" + orderCode); } diff --git a/jsowell-admin/src/test/java/PaymentTestController.java b/jsowell-admin/src/test/java/PaymentTestController.java index db1febebf..58a5c7d1d 100644 --- a/jsowell-admin/src/test/java/PaymentTestController.java +++ b/jsowell-admin/src/test/java/PaymentTestController.java @@ -1,6 +1,7 @@ import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; +import com.github.pagehelper.PageHelper; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.huifu.adapay.core.exception.BaseAdaPayException; @@ -8,6 +9,7 @@ import com.huifu.adapay.model.Payment; import com.huifu.adapay.model.PaymentReverse; import com.huifu.adapay.model.Refund; import com.jsowell.JsowellApplication; +import com.jsowell.adapay.common.DivMember; import com.jsowell.adapay.common.PaymentConfirmInfo; import com.jsowell.adapay.dto.PaymentConfirmParam; import com.jsowell.adapay.dto.QueryPaymentConfirmDTO; @@ -20,16 +22,22 @@ import com.jsowell.adapay.vo.AdapayCorpMemberVO; import com.jsowell.adapay.vo.OrderSplitResult; import com.jsowell.api.uniapp.customer.TempController; import com.jsowell.common.constant.CacheConstants; +import com.jsowell.common.constant.Constants; import com.jsowell.common.core.redis.RedisCache; import com.jsowell.common.enums.ykc.ScenarioEnum; +import com.jsowell.common.util.AdapayUtil; import com.jsowell.common.util.DateUtils; +import com.jsowell.common.util.PageUtils; +import com.jsowell.pile.domain.AdapayUnsplitRecord; import com.jsowell.pile.domain.OrderBasicInfo; import com.jsowell.pile.domain.OrderDetail; import com.jsowell.pile.domain.OrderUnsplitRecord; import com.jsowell.pile.dto.AfterSettleOrderDTO; import com.jsowell.pile.dto.DebugOrderDTO; +import com.jsowell.pile.service.AdapayUnsplitRecordService; import com.jsowell.pile.service.OrderBasicInfoService; import com.jsowell.pile.service.OrderUnsplitRecordService; +import com.jsowell.pile.vo.AdapayUnsplitRecordVO; import org.apache.commons.collections4.CollectionUtils; import org.junit.Test; import org.junit.runner.RunWith; @@ -75,6 +83,9 @@ public class PaymentTestController { @Autowired private OrderBasicInfoService orderBasicInfoService; + @Autowired + private AdapayUnsplitRecordService adapayUnsplitRecordService; + /** * 从payment_ids文件中获取支付id, 并批量查询分账信息 * 如需撤销分账, 请使用 {@link PaymentTestController#testCreateConfirmReverse()} 可以本地运行 @@ -412,10 +423,10 @@ public class PaymentTestController { */ @Test public void createPaymentReverseRequestTest() { - String paymentId = "002212025100513581210820790129447211008"; - BigDecimal refundAmount = new BigDecimal("0.5"); - String memberId = "84488845"; - String orderCode = "C82180436213"; + String paymentId = "002212025010720373310722683516795273216"; + BigDecimal refundAmount = new BigDecimal("1.08"); + String memberId = "48781184"; + String orderCode = "C67335843091"; // 延迟分账未确认调撤销调撤销接口退款 PaymentReverseOperation operation = new PaymentReverseOperation(); @@ -787,4 +798,143 @@ public class PaymentTestController { orderBasicInfoService.splittingMethodTemp(afterSettleOrderDTO); } + + @Test + public void processUnSettledOrder() { + // 现查询需要分账或者退款的数据 + int pageNum = 1; + int pageSize = 3; + PageHelper.startPage(pageNum, pageSize); + List adapayUnsplitRecordVOS = adapayUnsplitRecordService.queryList(); + + // 分账账户 + List divMemberList = Lists.newArrayList(); + for (AdapayUnsplitRecordVO adapayUnsplitRecordVO : adapayUnsplitRecordVOS) { + String orderCode = adapayUnsplitRecordVO.getOrderCode(); + String paymentId = adapayUnsplitRecordVO.getPaymentId(); + // 获取待分账金额 + BigDecimal waitSplitAmount = adapayUnsplitRecordVO.getWaitSplitAmount() != null ? new BigDecimal(adapayUnsplitRecordVO.getWaitSplitAmount()) : BigDecimal.ZERO; + // 如果waitSplitAmount > 0, 调用分账接口 + if (waitSplitAmount.compareTo(BigDecimal.ZERO) > 0) { + logger.info("订单{}, 待分账金额{}", orderCode, waitSplitAmount); + DivMember divMember = new DivMember(); + divMember.setMemberId(Constants.ZERO); // 若是商户本身时,传入0 + divMember.setAmount(AdapayUtil.formatAmount(waitSplitAmount)); + divMember.setFeeFlag(Constants.Y); + divMemberList.add(divMember); + // 调用分账接口 + PaymentConfirmParam param = PaymentConfirmParam.builder() + .paymentId(paymentId) + .divMemberList(divMemberList) + .confirmAmt(waitSplitAmount) // 订单结算金额 + 保险金额 + .orderCode(orderCode) + .wechatAppId(wechatAppId1) + .build(); + PaymentConfirmResponse paymentConfirmRequest = adapayService.createPaymentConfirmRequest(param); + if (paymentConfirmRequest.isSuccess()) { + logger.info("分账成功, 订单号:{}, 分账信息:{}", orderCode, JSON.toJSONString(paymentConfirmRequest)); + } else { + logger.info("分账失败, 订单号:{}, 分账信息:{}", orderCode, JSON.toJSONString(paymentConfirmRequest)); + } + divMemberList.clear(); + } + + // 获取待退款金额 (sql已经计算过了,refundPayAmount = 订单表中应退款金额 - 汇付查询的已退款金额) + // BigDecimal refundPayAmount = adapayUnsplitRecordVO.getRefundPayAmount() != null ? new BigDecimal(adapayUnsplitRecordVO.getRefundPayAmount()) : BigDecimal.ZERO; + // if (refundPayAmount.compareTo(BigDecimal.ZERO) > 0) { + // // 调用退款接口 + // logger.info("订单号:{}, 退款金额:{}", orderCode, refundPayAmount); + // PaymentReverseResponse response = adapayService.createPaymentReverseRequest(paymentId, refundPayAmount, + // wechatAppId1, "", ScenarioEnum.ORDER.getValue(), orderCode); + // } + } + + } + + @Test + public void queryAdapayData() { + String startTime = "2025-01-01 00:00:00"; + String endTime = "2025-12-31 23:59:59"; + + // 查询未分帐订单 + PageUtils.startPage(1, 99999); + List list = adapayUnsplitRecordService.queryUnsplitOrders(startTime, endTime); + + // 需要更新的数据 + List updateList = Lists.newArrayList(); + + List listA = Lists.newArrayList(); + List listB = Lists.newArrayList(); + + // 实用并行流处理list + list.parallelStream().forEach(adapayUnsplitRecord -> { + QueryPaymentConfirmDTO dto = new QueryPaymentConfirmDTO(); + dto.setWechatAppId(Constants.DEFAULT_APP_ID); + dto.setPaymentId(adapayUnsplitRecord.getPaymentId()); + QueryPaymentConfirmDetailResponse response = adapayService.queryPaymentConfirmList(dto); + List paymentConfirms = response.getPaymentConfirms(); + if (CollectionUtils.isEmpty(paymentConfirms)) { + return; + } + PaymentConfirmInfo paymentConfirmInfo = paymentConfirms.get(0); + String orderCode = adapayUnsplitRecord.getOrderCode(); + BigDecimal confirmedAmt = new BigDecimal(paymentConfirmInfo.getConfirmedAmt()); // 汇付返回分账金额 + BigDecimal confirmedSplitAmount = adapayUnsplitRecord.getConfirmedSplitAmount(); // 表中记录分账金额 + BigDecimal reservedAmt = new BigDecimal(paymentConfirmInfo.getReservedAmt()); // 汇付返回退款金额 + BigDecimal refundAmount = adapayUnsplitRecord.getRefundAmount(); // 表中记录退款金额 + logger.info("订单号:{}, 汇付返回分账金额:{}, 表中记录分账金额:{}, 汇付返回退款金额:{}, 表中记录退款金额:{}", + orderCode, confirmedAmt, confirmedSplitAmount, reservedAmt, refundAmount); + + boolean updateFlag = false; + + // 如果汇付返回分账金额与表中记录分账金额不一致,则更新表 + if (confirmedAmt.compareTo(confirmedSplitAmount) > 0) { + adapayUnsplitRecord.setConfirmedSplitAmount(confirmedAmt); + updateFlag = true; + } else if (confirmedAmt.compareTo(confirmedSplitAmount) < 0) { + listA.add(JSONObject.of("orderCode", orderCode, "confirmedAmt", confirmedAmt, "confirmedSplitAmount", confirmedSplitAmount)); + } + + // 如果汇付返回退款金额与表中记录退款金额不一致,则更新表 + if (reservedAmt.compareTo(refundAmount) > 0) { + adapayUnsplitRecord.setRefundAmount(reservedAmt); + updateFlag = true; + } else if (reservedAmt.compareTo(refundAmount) < 0) { + listB.add(JSONObject.of("orderCode", orderCode, "reservedAmt", reservedAmt, "refundAmount", refundAmount)); + } + + if (updateFlag) { + updateList.add(adapayUnsplitRecord); + } + }); + + + // if (CollectionUtils.isNotEmpty(updateList)) { + // // 分批处理updateList, 每批处理1000条数据 + // List> partition = Lists.partition(updateList, 1000); + // partition.parallelStream().forEach(list2 -> { + // adapayUnsplitRecordService.updateBatchSelective(list2); + // }); + // } + logger.info("第{}批处理数据,更新表成功, 共更新{}条数据", 1, updateList.size()); + logger.info("listA共更新{}条数据, {}", listA.size(), listA); + logger.info("listB共更新{}条数据, {}", listB.size(), listB); + } + + @Test + public void queryAdapayV2() { + String paymentId = "002212025070321462910786843519524786176"; + + QueryPaymentConfirmDTO dto = new QueryPaymentConfirmDTO(); + dto.setWechatAppId(Constants.DEFAULT_APP_ID); + dto.setPaymentId(paymentId); + QueryPaymentConfirmDetailResponse response = adapayService.queryPaymentConfirmList(dto); + List paymentConfirms = response.getPaymentConfirms(); + if (CollectionUtils.isEmpty(paymentConfirms)) { + return; + } + PaymentConfirmInfo paymentConfirmInfo = paymentConfirms.get(0); + logger.info("{}", JSON.toJSONString(paymentConfirmInfo)); + + } } diff --git a/jsowell-admin/src/test/resources/payment_ids b/jsowell-admin/src/test/resources/payment_ids index 2262d1e96..2cc6200cb 100644 --- a/jsowell-admin/src/test/resources/payment_ids +++ b/jsowell-admin/src/test/resources/payment_ids @@ -1,14 +1,1869 @@ -002212025060310590410775808955660226560 -002212025060209335010775425114719989760 -002212025060119145310775208954038964224 -002212025052308545110771791425828184064 -002212025060408400910776136380814315520 -002212025060113395910775124672697036800 -002212025053010191210774349368864821248 -002212025060809394310777600925872390144 -002212025053022491710774538136450727936 -002212025061217110110779164047563894784 -002212025060123174410775270071608823808 -002212025060312255210775830799009579008 -002212025052016133710770814683822862336 -002212025051612530210769314653202984960 \ No newline at end of file +002212025110300325910831096740062662656 +002212025110303023610831134392589676544 +002212025110306072710831180907773403136 +002212025110306350710831187872687800320 +002212025110306394210831189025974587392 +002212025110306483710831191271235883008 +002212025110307130710831197437093421056 +002212025110307265310831200900263137280 +002212025110307325410831202412632690688 +002212025110307284210831201358553776128 +002212025110307373410831203589256593408 +002212025110308102810831211866648428544 +002212025110308240910831215312785055744 +002212025110308194310831214194248052736 +002212025110308242910831215396155244544 +002212025110307422310831204798826786816 +002212025110307515310831207190234378240 +002212025110308390510831219068167725056 +002212025110308445610831220540662022144 +002212025110308452610831220668680605696 +002212025110307565210831208446633947136 +002212025110309404410831234582826909696 +002212025110309171010831228652869595136 +002212025110309523010831237545314185216 +002212025110309303410831232024444071936 +002212025110309285310831231602182549504 +002212025110309203110831229494934843392 +002212025110310014510831239873027080192 +002212025110310062710831241056751915008 +002212025110310404110831249673261613056 +002212025110310142810831243071951417344 +002212025110311035610831255523464261632 +002212025110310264610831246170946465792 +002212025110310450010831250757891895296 +002212025110310524210831252695404490752 +002212025110311000110831254536875876352 +002212025110311302210831262176444108800 +002212025110311320810831262620306333696 +002212025110311313510831262482003333120 +002212025110311191810831259388284731392 +002212025110311341810831263163892330496 +002212025110311335510831263067926626304 +002212025110311424310831265281952952320 +002212025110311502210831267205557235712 +002212025110311065110831256254963470336 +002212025110311514310831267546751262720 +002212025110311365310831263813669711872 +002212025110311285510831261811464138752 +002212025110311535410831268095160721408 +002212025110311410410831264867631198208 +002212025110312101810831272224549441536 +002212025110312154810831273608619462656 +002212025110312243810831275829608271872 +002212025110312230410831275435289165824 +002212025110311482610831266719231860736 +002212025110312163510831273806380888064 +002212025110311430310831265368204582912 +002212025110312394610831279638870978560 +002212025110313032610831285596896579585 +002212025110313151310831288559291527168 +002212025110313145110831288466584875008 +002212025110312455810831281199827353600 +002212025110313022810831285354293821440 +002212025110312371910831279022182469632 +002212025110313230210831290526919241728 +002212025110313050110831285993413521408 +002212025110313182110831289347317379072 +002212025110313471910831296637076463616 +002212025110313211210831290067143839744 +002212025110313295110831292243530448896 +002212025110312515810831282708145188864 +002212025110313522110831297905694056448 +002212025110314032910831300708344758272 +002212025110313541610831298388634587136 +002212025110313491410831297122365837312 +002212025110313525610831298051437694976 +002212025110314140610831303379172675584 +002212025110314374410831309326368567296 +002212025110314194710831304808230793216 +002212025110314331810831308213221289984 +002212025110314550210831313678692982784 +002212025110314585510831314659522621440 +002212025110315183710831319615797415936 +002212025110315383210831324628213018624 +002212025110315081010831316984857337856 +002212025110314515110831312879317389312 +002212025110315331410831323293623209984 +002212025110315500710831327541685620736 +002212025110315424810831325701094993920 +002212025110316101210831332596031619072 +002212025110315581810831329601948704768 +002212025110315364110831324162393571328 +002212025110316194810831335013104177152 +002212025110316275310831337046414675968 +002212025110316101510831332610065780736 +002212025110316142510831333656754323456 +002212025110316203110831335191924158464 +002212025110315520410831328032347848704 +002212025110316360810831339121223643136 +002212025110316474010831342024072044544 +002212025110316282710831337189503340544 +002212025110316421310831340654795395072 +002212025110316352210831338930345062400 +002212025110316345110831338798874595328 +002212025110316472110831341943918923776 +002212025110317193010831350038346797056 +002212025110317043310831346273799565312 +002212025110317045810831346380519485440 +002212025110317072010831346973761835008 +002212025110317135710831348638032261120 +002212025110317183910831349824483446784 +002212025110317160310831349168708214784 +002212025110317272010831352009002782720 +002212025110317475110831357169649250304 +002212025110317315210831353148742000640 +002212025110318230510831366036261126144 +002212025110317281310831352229145063424 +002212025110318261210831366822642810880 +002212025110318010710831360509724565504 +002212025110317572210831359568040386560 +002212025110318131310831363553216376832 +002212025110318475710831372295265796096 +002212025110318360810831369322259247104 +002212025110318344910831368991089561600 +002212025110318400510831370317441753088 +002212025110318502610831372918937817088 +002212025110318490510831372580109389825 +002212025110318583010831374952147668992 +002212025110319002110831375417677680640 +002212025110318590510831375096268161024 +002212025110319051510831376650266169344 +002212025110319313910831383292701515776 +002212025110319054110831376757657137152 +002212025110319232210831381208002437120 +002212025110319424310831386079107715072 +002212025110319273210831382259036303360 +002212025110319591410831390233452580864 +002212025110319514410831388347831894016 +002212025110320322110831398568247635968 +002212025110321012110831405868073070592 +002212025110320183710831395112791240704 +002212025110321074210831407466937532416 +002212025110321442410831416700441919488 +002212025110321215110831411027138260992 +002212025110401242310831472062742331392 +002212025110406414710831551939407474688 +002212025110406512710831554369813671936 +002212025110406534210831554937877667840 +002212025110406582510831556123343163392 +002212025110406503510831554151898632192 +002212025110406550610831555290954145792 +002212025110407295810831564061650673664 +002212025110407394610831566528379555840 +002212025110407511110831569402270539776 +002212025110408014610831572067167719424 +002212025110408190010831576403453087744 +002212025110407573510831571011746615296 +002212025110407511510831569420863860736 +002212025110408124910831574848955985920 +002212025110408065110831573347449630720 +002212025110408055210831573099813736448 +002212025110408224610831577351067992064 +002212025110407355810831565573030383616 +002212025110408143910831575306864930816 +002212025110409024610831587416122535936 +002212025110408464410831583380770070528 +002212025110408192210831576493773221888 +002212025110408365310831580902418767872 +002212025110409121810831589818758307840 +002212025110409123010831589868192333824 +002212025110409403010831596915105411072 +002212025110410111410831604646990278656 +002212025110410365210831611097175506944 +002212025110410553410831615802731601920 +002212025110410555710831615900844789760 +002212025110410451010831613186865860608 +002212025110410524910831615114513424384 +002212025110410231410831607668025815040 +002212025110411052910831618300821323776 +002212025110411202610831622063657250816 +002212025110411271210831623764548206592 +002212025110411285410831624193302568960 +002212025110411390110831626740599853056 +002212025110411191010831621742281314304 +002212025110411281210831624018014208000 +002212025110411261410831623520720715776 +002212025110411371110831626275837399040 +002212025110411455510831628477276581888 +002212025110411305410831624695859838976 +002212025110411530910831630295163400192 +002212025110411235810831622952623206400 +002212025110412074810831633983630168064 +002212025110411385310831626704520441856 +002212025110411483410831629142975512576 +002212025110412074610831633973370904576 +002212025110412452810831643461582798848 +002212025110412315110831640033670443008 +002212025110412165410831636274118631424 +002212025110412283210831639198643208192 +002212025110411421610831627557973237760 +002212025110412420110831642594951532544 +002212025110412141910831635623682744320 +002212025110413054710831648575517319168 +002212025110412513710831645010174386176 +002212025110413072310831648978749296640 +002212025110413341210831655727480901632 +002212025110413315110831655133672308736 +002212025110413414310831657618491248640 +002212025110413150310831650907407740928 +002212025110413341310831655729712287744 +002212025110414361410831671335434039296 +002212025110414354610831671221281845248 +002212025110414572910831676684056596480 +002212025110414524510831675495315361792 +002212025110414393110831672165595807744 +002212025110415163610831681496630370304 +002212025110415285410831684591682789376 +002212025110414382110831671869578620928 +002212025110415114110831680259864371200 +002212025110415345510831686105742655488 +002212025110415062610831678938742489088 +002212025110415261510831683925191094272 +002212025110415323410831685511988604928 +002212025110415455010831688850969157632 +002212025110415580210831691924764856320 +002212025110415391210831687184047906816 +002212025110415344510831686063908687872 +002212025110415251710831683682387042304 +002212025110415483110831689527598460928 +002212025110415581110831691960647106560 +002212025110416182710831697059284979712 +002212025110416061010831693969710333952 +002212025110416094510831694870143496192 +002212025110416275110831699424574681088 +002212025110416320510831700492444450816 +002212025110416535710831705993425149952 +002212025110417042310831708621185957888 +002212025110417155210831711508255404032 +002212025110417345110831716285504745472 +002212025110416590610831707291331547136 +002212025110417134710831710987947806720 +002212025110417502010831720185406390272 +002212025110417234310831713486637326336 +002212025110417525310831720825964699648 +002212025110416561110831706558485987328 +002212025110417240410831713572658315264 +002212025110417171410831711854256136192 +002212025110417532010831720940787965952 +002212025110417422610831718198006718464 +002212025110417520810831720635513892864 +002212025110417561510831721674904387584 +002212025110418003610831722766937563136 +002212025110417580410831722130531659776 +002212025110418060910831724166052556800 +002212025110418402810831732802204139520 +002212025110418331110831730965879132160 +002212025110418044810831723826452328448 +002212025110417575910831722110839377920 +002212025110418222010831728236880408576 +002212025110419020610831738243843821568 +002212025110418581210831737261797867520 +002212025110418044610831723815169630208 +002212025110418491110831734995518984192 +002212025110418581710831737286317813760 +002212025110418590810831737497199017984 +002212025110419142410831741342222319616 +002212025110419214810831743203658653696 +002212025110419000710831737747439546368 +002212025110419162010831741824940584960 +002212025110419222410831743353185611776 +002212025110419103610831740382934691840 +002212025110419193810831742659242184704 +002212025110419372910831747150947491840 +002212025110419331410831746081441947648 +002212025110419381210831747329071202304 +002212025110419300010831745266786451456 +002212025110419251010831744048387284992 +002212025110420062510831754430644432896 +002212025110419080310831739742925815808 +002212025110419581210831752362215010304 +002212025110419435210831748754874523648 +002212025110419580910831752349841838080 +002212025110419261010831744299722543104 +002212025110420165210831757059927773184 +002212025110420113110831755714525102080 +002212025110420252510831759211073048576 +002212025110421074810831769877175570432 +002212025110420465210831764609968603136 +002212025110423032210831798959623868416 +002212025110504570410831887971646644224 +002212025110506175110831908304814579712 +002212025110506535010831917359008268288 +002212025110506573010831918280048087040 +002212025110507131410831922242482577408 +002212025110506552110831917741201649664 +002212025110507453610831930385946058752 +002212025110507564710831933201053888512 +002212025110507264210831925631513731072 +002212025110507300310831926472220028928 +002212025110507292510831926312366698496 +002212025110507333210831927348749885440 +002212025110507455410831930459530915840 +002212025110508144710831937729526431744 +002212025110508010210831934269854781440 +002212025110508282310831941150967050240 +002212025110507541010831932543105986560 +002212025110508192810831938908675317760 +002212025110508285810831941299743195136 +002212025110508343910831942731565318144 +002212025110508412310831944424373817344 +002212025110508380310831943585580158976 +002212025110508372710831943435176595456 +002212025110508584010831948772885610496 +002212025110508143410831937675805806592 +002212025110508491910831946420044660736 +002212025110509093410831951516316942336 +002212025110508505310831946813210337280 +002212025110509204210831954317289947136 +002212025110509302610831956766952189952 +002212025110509223010831954771306545152 +002212025110510155110831968198112514048 +002212025110509572910831963574479560704 +002212025110511124710831982523481042944 +002212025110511083610831981471771860992 +002212025110511170210831983596849545216 +002212025110511015110831979774219587584 +002212025110511392410831989222069735424 +002212025110510550110831978052935970816 +002212025110511325810831987605341708288 +002212025110511453710831990786264072192 +002212025110511293710831986763154825216 +002212025110511273910831986267027341312 +002212025110511351010831988158352261120 +002212025110511374210831988796565950464 +002212025110512104610831997116634832896 +002212025110511301310831986913877110784 +002212025110511513210831992275741143040 +002212025110512054810831995868573528064 +002212025110512072110831996257649795072 +002212025110512145010831998138828656640 +002212025110512025410831995136122261504 +002212025110511311210831987160141484032 +002212025110512283010832001578623496192 +002212025110512263110832001079883042816 +002212025110511571710831993723015114752 +002212025110511453810831990792836591616 +002212025110512014810831994861462466560 +002212025110512320110832002466398277632 +002212025110512560310832008514110693376 +002212025110512111010831997218397028352 +002212025110512361510832003531780870144 +002212025110512091110831996720130510848 +002212025110513192510832014391635050496 +002212025110512201210831999492288614400 +002212025110513221610832015109842472960 +002212025110512470810832006268870430720 +002212025110512540210832008004666335232 +002212025110513291710832016874809827328 +002212025110513064310832011196410077184 +002212025110513245110832015759536001024 +002212025110513432610832020438609227776 +002212025110513343110832018194585284608 +002212025110513411410832019883262451712 +002212025110514071410832026424975785984 +002212025110513541310832023152810475520 +002212025110514143210832028264912056320 +002212025110514564310832038881567916032 +002212025110514175310832029107233173504 +002212025110515522010832052876270075904 +002212025110516030810832055595185684480 +002212025110515545410832053523396620288 +002212025110516141810832058403549044736 +002212025110516034110832055731248889856 +002212025110516064010832056481349824512 +002212025110515591310832054608144314368 +002212025110516371710832064186785423360 +002212025110516383310832064507720970240 +002212025110516425310832065595811491840 +002212025110516385110832064580617969664 +002212025110517322010832078040227622912 +002212025110517313610832077857121079296 +002212025110516475410832066859974762496 +002212025110517124410832073107638022144 +002212025110517135110832073389382012928 +002212025110517143510832073574266896384 +002212025110518215510832090520530141184 +002212025110517521410832083048692142080 +002212025110518072210832086857770307584 +002212025110517461010832081523815186432 +002212025110518312210832092899187060736 +002212025110518361310832094119880495104 +002212025110518195610832090019147259904 +002212025110518233010832090917525192704 +002212025110518302110832092644450201600 +002212025110518505510832097818669428736 +002212025110518441710832096148006875136 +002212025110518352310832093910605692928 +002212025110518572010832099433027686400 +002212025110519054910832101568930848768 +002212025110519274610832107089947721728 +002212025110519334910832108613029543936 +002212025110519185410832104862306729984 +002212025110519001310832100159506280448 +002212025110519234810832106095629250560 +002212025110519535810832113686396768256 +002212025110519222810832105758780514304 +002212025110518385810832094810711756800 +002212025110519534410832113625759682560 +002212025110519480710832112211465531392 +002212025110519411810832110497232539648 +002212025110520203610832120386453442560 +002212025110520100210832117727164063744 +002212025110520391510832125081448288256 +002212025110607232710832287201112588288 +002212025110608432910832307339887046656 +002212025110523570810832174881451503616 +002212025110523135010832163982804234240 +002212025110609114210832314442588573696 +002212025110613094710832374358107979776 +002212025110612141410832360375628021760 +002212025110611521510832354843991158784 +002212025110611534710832355231817465856 +002212025110613433410832382859635011584 +002212025110613553510832385884525137920 +002212025110613462910832383592723881984 +002212025110614062610832388614031388672 +002212025110604385110832245776064950272 +002212025110608020010832296900545429504 +002212025110608254310832302868171796480 +002212025110608581810832311071265755136 +002212025110609164310832315704570740736 +002212025110609385910832321307305275392 +002212025110612060010832358304010924032 +002212025110612371910832366187993821184 +002212025110612385210832366575274930176 +002212025110613540610832385509487239168 +002212025110614132510832390369095954432 +002212025110612301310832364400142405632 +002212025110612194510832361764341129216 +002212025110610542510832340291882799104 +002212025110614304610832394735718735872 +002212025110614392710832396920858849280 +002212025110614454510832398508251914240 +002212025110615241710832408204685807616 +002212025110615492210832414518430375936 +002212025110615593610832417092608925696 +002212025110615521510832415241528385536 +002212025110616000810832417228907044864 +002212025110615554710832416130913730560 +002212025110616241710832423305983774720 +002212025110616130410832420479979159552 +002212025110615465210832413889364463616 +002212025110616214310832422660459413504 +002212025110616180010832421723061854208 +002212025110607055110832282770946060288 +002212025110616343810832425910076149760 +002212025110616425310832427983815553024 +002212025110608142310832300018813333504 +002212025110616102510832419816729677824 +002212025110616242310832423330692427776 +002212025110616215210832422695058231296 +002212025110616505810832430019588096000 +002212025110617024810832432996692480000 +002212025110617041510832433362796511232 +002212025110617330210832440607923970048 +002212025110617214810832437781218959360 +002212025110616534010832430699358916608 +002212025110616542010832430866459983872 +002212025110617472210832444214115241984 +002212025110617480010832444371271651328 +002212025110617404710832442558531198976 +002212025110618270810832454219715506176 +002212025110617520710832445408510451712 +002212025110617474910832444324496764928 +002212025110612350410832365621091696640 +002212025110618393710832457362285199360 +002212025110618532110832460819675156480 +002212025110619125110832465727312842752 +002212025110619020110832463000323190784 +002212025110619150810832466301169143808 +002212025110611572910832356160507678720 +002212025110619004510832462680637546496 +002212025110618280410832454455070507008 +002212025110619421910832473141768560640 +002212025110619221410832468089297395712 +002212025110619124910832465718513184768 +002212025110619313610832470445783228416 +002212025110619355910832471549317181440 +002212025110619212110832467864956633088 +002212025110618444010832458631804592128 +002212025110620044410832478781291339776 +002212025110619595510832477570672562176 +002212025110620321510832485707995652096 +002212025110620280010832484636678103040 +002212025110620313110832485523148476416 +002212025110620265810832484376555773952 +002212025110620435110832488626996322304 +002212025110620560210832491691497439232 +002212025110620353610832486550853603328 +002212025110621355610832501734032773120 +002212025110621543410832506425185628160 +002212025110622244610832514024396267520 +002212025110706373010832638024241876992 +002212025110706544110832642348938395648 +002212025110707201910832648797034835968 +002212025110707365910832652992551030784 +002212025110707041910832644770523987968 +002212025110706544110832642346837041152 +002212025110707415110832654217526841344 +002212025110707290610832651007261118464 +002212025110707423010832654380416831488 +002212025110707591310832658588784332800 +002212025110612272510832363694383632384 +002212025110707490110832656020918194176 +002212025110521161010832134371517116416 +002212025110708413310832669243407048704 +002212025110708340710832667370461560832 +002212025110708095310832661273944199168 +002212025110708082510832660904426024960 +002212025110708383310832668487958327296 +002212025110709033810832674799731580928 +002212025110708501210832671419437109248 +002212025110709001110832673931846184960 +002212025110709363510832683089454661632 +002212025110709030810832674672128233472 +002212025110709523210832687104154365952 +002212025110709310710832681716352782336 +002212025110710044810832690190721691648 +002212025110709312210832681777891606528 +002212025110709361310832683000828985344 +002212025110709304310832681614938685440 +002212025110709301010832681476845400064 +002212025110710164210832693185328926720 +002212025110710160110832693017053470720 +002212025110710203810832694175360847872 +002212025110710464610832700752159547392 +002212025110710595010832704041315971072 +002212025110711160410832708128312860672 +002212025110711063510832705742420811776 +002212025110711554310832718104804696064 +002212025110711411310832714454678044672 +002212025110711540810832717708631699456 +002212025110711302210832711725004058624 +002212025110711344110832712812847140864 +002212025110711222810832709735859585024 +002212025110711505710832716905908998144 +002212025110711364910832713348363259904 +002212025110711532210832717512560541696 +002212025110712014910832719640435830784 +002212025110712181010832723757128417280 +002212025110712213910832724632043487232 +002212025110712260810832725758633553920 +002212025110712280110832726232480821248 +002212025110712504710832731962323714048 +002212025110713070510832736063405105152 +002212025110713022610832734897220841472 +002212025110713090410832736565387825152 +002212025110713020810832734819106091008 +002212025110713105010832737009254211584 +002212025110713070110832736048729251840 +002212025110713324410832742518761930752 +002212025110713195410832739289642790912 +002212025110713015810832734777351811072 +002212025110713200210832739324023480320 +002212025110713394510832744287646756864 +002212025110713250310832740585452027904 +002212025110713120410832737321486610432 +002212025110713291910832741661186174976 +002212025110714250410832755692152221696 +002212025110713580310832748893302923264 +002212025110714050210832750647457329152 +002212025110714321510832757500048281600 +002212025110714280710832756456429957120 +002212025110714280310832756441733091328 +002212025110714290610832756704653058048 +002212025110714332110832757774921957376 +002212025110714245610832755658929184768 +002212025110715011210832764785780830208 +002212025110714483610832761613339291648 +002212025110715020310832764998935359488 +002212025110714353010832758317069320192 +002212025110715020610832765009119121408 +002212025110715240210832770528043024384 +002212025110715264310832771205179850752 +002212025110715593310832779467749007360 +002212025110715360910832773578556129280 +002212025110715241510832770585903435776 +002212025110715513710832777473185509376 +002212025110715575710832779065251041280 +002212025110716205610832784848726454272 +002212025110716470410832791424342396928 +002212025110716402810832789766870892544 +002212025110716470410832791425848123392 +002212025110716553110832793554251890688 +002212025110716362610832788749957701632 +002212025110716564210832793850352984064 +002212025110716374910832789098726649856 +002212025110716081510832781657079242752 +002212025110716412710832790011231055872 +002212025110717121610832797769477103616 +002212025110717041810832795764209688576 +002212025110717413910832805161753354240 +002212025110717342910832803357107912704 +002212025110717275210832801694573887488 +002212025110717185510832799442907918336 +002212025110717443010832805877884624896 +002212025110718105410832812522056384512 +002212025110718040310832810798516207616 +002212025110718195910832814810414125056 +002212025110718115010832812756459253760 +002212025110718245110832816033540296704 +002212025110718204510832815003054333952 +002212025110718571810832824198583496704 +002212025110718471010832821649365200896 +002212025110719224510832830604531408896 +002212025110719455610832836439118684160 +002212025110719161010832828949605859328 +002212025110719144910832828607879143424 +002212025110719191610832829729448611840 +002212025110719204710832830111281278976 +002212025110719364410832834123619569664 +002212025110719472210832836801925951488 +002212025110719192310832829759505002496 +002212025110719084010832827061770620928 +002212025110720033110832840865384452096 +002212025110719395610832834930586902528 +002212025110719334310832833363599101952 +002212025110720185110832844722424459264 +002212025110720050310832841248215347200 +002212025110720111410832842808349634560 +002212025110720593710832854980840628224 +002212025110720542210832853662184976384 +002212025110720450510832851324514803712 +002212025110721560110832869176940670976 +002212025110723171010832889599849857024 +002212025110722491710832882579599982592 +002212025110800253410832906809704165376 +002212025110801410610832925818059165696 +002212025110801420210832926055465189376 +002212025110804314610832968768650711040 +002212025110805540710832989493780525056 +002212025110806070810832992767476736000 +002212025110806463410833002691648782336 +002212025110807332910833014500468404224 +002212025110807023810833006737252122624 +002212025110806374310833000464200728576 +002212025110807072010833007919743844352 +002212025110807370210833015391900639232 +002212025110807220210833011617748422656 +002212025110807440310833017158994472960 +002212025110807352110833014968846344192 +002212025110807415110833016606243917824 +002212025110807232810833011979746246656 +002212025110807444810833017348753170432 +002212025110808354510833030171273179136 +002212025110807575810833020662072950784 +002212025110807444210833017323021107200 +002212025110807582610833020779987431424 +002212025110808404410833031426213109760 +002212025110808323410833029370123325440 +002212025110808370310833030496918904832 +002212025110809064810833037984191938560 +002212025110809211610833041626529771520 +002212025110809143510833039940864135168 +002212025110809333410833044719992512512 +002212025110809094810833038738902458368 +002212025110809352410833045181080756224 +002212025110809505410833049082811101184 +002212025110810484310833063633778618368 +002212025110810465210833063168185667584 +002212025110811113210833069373973045248 +002212025110810505010833064164832006144 +002212025110811240810833072544774598656 +002212025110810422310833062037204217856 +002212025110811090710833068766637813760 +002212025110810475210833063416828227584 +002212025110811030610833067250904424448 +002212025110810450110833062700931854336 +002212025110811332010833074862492413952 +002212025110811564810833080764192735232 +002212025110811511710833079376343699456 +002212025110811272710833073380812599296 +002212025110811563410833080706525233152 +002212025110812202710833086719412338688 +002212025110812271510833088427085471744 +002212025110812434210833092570776821760 +002212025110812160110833085603861704704 +002212025110812433810833092552334446592 +002212025110812390810833091418794438656 +002212025110812465410833093373981863936 +002212025110812530310833094919951974400 +002212025110813121610833099759067283456 +002212025110813181610833101267984912384 +002212025110812421210833092193209749504 +002212025110813215110833102169630269440 +002212025110813040410833097695071277056 +002212025110813283310833103854234710016 +002212025110813410010833106989229502464 +002212025110814162210833115888888274944 +002212025110813364710833105926015393792 +002212025110814072710833113645606719488 +002212025110814174610833116241817956352 +002212025110814162810833115915828264960 +002212025110814200310833116814625685504 +002212025110814264310833118493609783296 +002212025110814582610833126474309107712 +002212025110814490410833124118163030016 +002212025110814575510833126344004673536 +002212025110815050510833128149644144640 +002212025110815210310833132167485403136 +002212025110815391310833136737934598144 +002212025110815370810833136214879703040 +002212025110815401610833137001412395008 +002212025110816015410833142448580132864 +002212025110816130810833145275067088896 +002212025110816342410833150627338739712 +002212025110816142210833145584925487104 +002212025110816522910833155177445548032 +002212025110816551610833155876040437760 +002212025110816295410833149495363211264 +002212025110816242010833148094138511360 +002212025110817073610833158982472007680 +002212025110816561710833156133306429440 +002212025110816563610833156212549414912 +002212025110817143810833160752162119680 +002212025110817203410833162245757947904 +002212025110817535610833170640779042816 +002212025110817551610833170977946562560 +002212025110817531310833170459832594432 +002212025110817591910833171995254005760 +002212025110817404810833167337307463680 +002212025110817461610833168710312878080 +002212025110817495810833169644002701312 +002212025110818244910833178413650612224 +002212025110818185910833176947225473024 +002212025110818350710833181005508177920 +002212025110818390110833181985536704512 +002212025110818403010833182359383404544 +002212025110818443210833183374094577664 +002212025110818360810833181263365611520 +002212025110818492510833184604145541120 +002212025110818491910833184579495600128 +002212025110818034210833173100448952320 +002212025110819291810833194643002425344 +002212025110819130310833190553912557568 +002212025110819100510833189804193300480 +002212025110819411810833197661554970624 +002212025110819473110833199225833213952 +002212025110819421910833197917256523776 +002212025110820093810833204789984337920 +002212025110820375510833211907810496512 +002212025110821124810833220689101787136 +002212025110821350010833226274945855488 +002212025110821512410833230400203235328 +002212025110821592510833232421119528960 +002212025110822071410833234388231331840 +002212025110823521410833260810526236672 +002212025110823292510833255066821152768 +002212025110900134910833266242296684544 +002212025110901432010833288768670343168 +002212025110901570910833292247530946560 +002212025110905235610833344285828657152 +002212025110906555910833367449623261184 +002212025110907064210833370146787254272 +002212025110906563610833367606037295104 +002212025110907262210833375098548981760 +002212025110907230010833374251081478144 +002212025110907420610833379055749009408 +002212025110907315010833376473915781120 +002212025110908052110833384906324922368 +002212025110908470810833395421646368768 +002212025110908492310833395990612127744 +002212025110908423510833394278350417920 +002212025110909101310833401231059419136 +002212025110908134810833387032526647296 +002212025110909300610833406237468717056 +002212025110911205310833434114977406976 +002212025110911183610833433540672327680 +002212025110911194510833433829571801088 +002212025110911392910833438795409600512 +002212025110912001310833444014986039296 +002212025110912151410833447792342700032 +002212025110912381410833453580339572736 +002212025110911435810833439924788883456 +002212025110912144210833447657961365504 +002212025110912191410833448800443666432 +002212025110912283210833451138524872704 +002212025110912190810833448775927951360 +002212025110912183710833448644436508672 +002212025110912351610833452832667172864 +002212025110912511310833456847144550400 +002212025110912573110833458435443597312 +002212025110912584110833458726188564480 +002212025110912501310833456597415710720 +002212025110913080210833461078937251840 +002212025110913295110833466571692937216 +002212025110913272910833465975883649024 +002212025110913363310833468256783888384 +002212025110913570910833473442457821184 +002212025110913414110833469546637234176 +002212025110913371210833468418793099264 +002212025110913504010833471809405550592 +002212025110913480410833471153328328704 +002212025110914415810833484718139465728 +002212025110914351610833483031853068288 +002212025110914081410833476228490682368 +002212025110914510410833487010683105280 +002212025110914530510833487516444852224 +002212025110915072210833491112062332928 +002212025110914393010833484099055972352 +002212025110915424110833500000526479360 +002212025110915483410833501481325502464 +002212025110915541710833502917920784384 +002212025110915415210833499795794120704 +002212025110915264510833495988863442944 +002212025110916204910833509595030450176 +002212025110915440510833500350625038336 +002212025110916332610833512769896280064 +002212025110916362810833513535063175168 +002212025110916333610833512812275535872 +002212025110916175410833508861442502656 +002212025110916363610833513568156217344 +002212025110916263710833511055524868096 +002212025110917055710833520952740122625 +002212025110916390010833514173658492928 +002212025110916242310833510491546124288 +002212025110916405710833514660533350400 +002212025110916522710833517556217913344 +002212025110916393310833514312158646272 +002212025110917125110833522691845328896 +002212025110916574210833518879139147776 +002212025110916391710833514241048395776 +002212025110916442010833515514569113600 +002212025110917005610833519691093442560 +002212025110917234810833525446009876480 +002212025110917324510833527700108566528 +002212025110917122310833522573847011328 +002212025110917181810833524062455824384 +002212025110918025310833535281950593024 +002212025110917180610833524013223051264 +002212025110917460610833531058676506624 +002212025110917503110833532168736837632 +002212025110918113110833537455409524736 +002212025110917461110833531077261479936 +002212025110917472010833531369759682560 +002212025110918174210833539011219501056 +002212025110918390310833544382097084416 +002212025110918173310833538971998597120 +002212025110917550910833533336825323520 +002212025110918132510833537933686038528 +002212025110918521710833547711783067648 +002212025110918332610833542971623931904 +002212025110919003410833549799778910208 +002212025110918560610833548673968992256 +002212025110919231810833555518129414144 +002212025110918521010833547682217398272 +002212025110919290510833556976304324608 +002212025110919355910833558713002045440 +002212025110919040910833550699222237184 +002212025110919425110833560440430325760 +002212025110919373210833559100195016704 +002212025110919483210833561867479375872 +002212025110919593110833564633073397760 +002212025110919525210833562961894916096 +002212025110919374310833559145841618944 +002212025110920143110833568409024921600 +002212025110921074510833581803463454720 +002212025110921135110833583339442761728 +002212025110922050010833596212365725696 +002212025110922360910833604050332893184 +002212025110922280810833602033946394624 +002212025110923115210833613038235656192 +002212025111006341110833724353553829888 +002212025111006581810833730423559008256 +002212025111007061510833732423822557184 +002212025111007000110833730853915533312 +002212025111007311610833738719011516416 +002212025111006414710833726266005463040 +002212025111007532110833744273456975872 +002212025111007270010833737643029901312 +002212025111008114610833748911702913024 +002212025111008063510833747606099922944 +002212025111007282010833737981145317376 +002212025111007555810833744932545708032 +002212025111008062010833747544410140672 +002212025111007412610833741277503361024 +002212025111008144510833749661665411072 +002212025111008273510833752890268659712 +002212025111008292110833753334969729024 +002212025111008113810833748877032767488 +002212025111008053310833747346644475904 +002212025111008171210833750277494083584 +002212025111008064510833747647048908800 +002212025111008380610833755537927254016 +002212025111008412110833756355321638912 +002212025111009032310833761901814718464 +002212025111008535110833759500793782272 +002212025111009050210833762314538422272 +002212025111009014510833761489720160256 +002212025111009304410833768781060448256 +002212025111010151810833779996902010880 +002212025111010171310833780481021157376 +002212025111010101210833778715940573184 +002212025111010104810833778866469924864 +002212025111010321010833784241151758336 +002212025111010425510833786950235947008 +002212025111011200410833796299322748928 +002212025111010580810833790776598786048 +002212025111011012210833791590490935296 +002212025111011030710833792032948047872 +002212025111011065110833792973118070784 +002212025111011301310833798853767180288 +002212025111010473810833788135533666304 +002212025111011460210833802833129828352 +002212025111011533410833804727277522944 +002212025111011352010833800137584881664 +002212025111011343110833799932651184129 +002212025111011431310833802121629085696 +002212025111011485610833803563001671680 +002212025111011300810833798831407329280 +002212025111012221410833811943137161216 +002212025111011301910833798878496796672 +002212025111012231710833812205331513344 +002212025111012115410833809343771770880 +002212025111011582510833805946968555520 +002212025111012284910833813598872240128 +002212025111012265410833813115927486464 +002212025111013121710833824536258101248 +002212025111012394010833816330731491328 +002212025111011553910833805253130031104 +002212025111013242310833827582094569472 +002212025111013095710833823948954857472 +002212025111012362210833815499051347968 +002212025110608050310832297670229557248 +002212025110607490410832293646084296704 +002212025110611524610832354976027856896 +002212025111013251510833827801347584000 +002212025111013434810833832468320309248 +002212025111013235110833827446484299776 +002212025111013533910833834948122857472 +002212025111013325010833829709487480832 +002212025111013483310833833663948591104 +002212025111013435010833832478155935744 +002212025111014255410833843063337721856 +002212025111014033310833837440923566080 +002212025111014304910833844300565155840 +002212025111014085510833838788154974208 +002212025111014112710833839426238631936 +002212025111014242710833842700320735232 +002212025111014291310833843898553667584 +002212025111015002210833851736546045952 +002212025111015022210833852240311300096 +002212025111014531810833849958014337024 +002212025111015120710833854692729225216 +002212025111015401610833861779932794880 +002212025111015023710833852303901155328 +002212025111015353110833860583998296064 +002212025111016022910833867370436730880 +002212025111016232510833872636712538112 +002212025111016002410833866847587377152 +002212025111016082710833868871880105984 +002212025111016492410833879175678615552 +002212025111016330110833875054561030144 +002212025111016290310833874057658855424 +002212025111016422210833877407741718528 +002212025111016315810833874791343296512 +002212025111017173610833886273271468032 +002212025111016591610833881660992491520 +002212025111017141410833885428047908864 +002212025111017333010833890276692672512 +002212025111017540910833895473259188224 +002212025111017592010833896776605560832 +002212025111017523310833895069897138176 +002212025111018035110833897912959967232 +002212025111017415810833892405595578368 +002212025111018001410833897002959601664 +002212025111018123210833900098154622976 +002212025111017502410833894526663483392 +002212025111018241410833903043185188864 +002212025111018142610833900574883414016 +002212025111018595910833912037341618176 +002212025111018480610833909048719654912 +002212025111018383610833906656796155904 +002212025111018175910833901467716513792 +002212025111018392510833906863244021760 +002212025111019264610833918780213776384 +002212025111018573510833911435534471168 +002212025111019255410833918563368280064 +002212025111019183510833916721452232704 +002212025111019474810833924074172018688 +002212025111019295110833919557506412544 +002212025111019443510833923263228518400 +002212025111020282510833934295443374080 +002212025111019293610833919491806814209 +002212025111020463410833938861274669056 +002212025111020303610833934843877990400 +002212025111020480510833939244940218368 +002212025111020434610833938155486547968 +002212025111021020210833942755295854592 +002212025111023073410833974347129135104 +002212025111023250210833978739433615360 +002212025111023172210833976810464829440 +002212025111100223110833993207471345664 +002212025111100205710833992814599311360 +002212025111104002810834048054908391424 +002212025111106560110834092235588608000 +002212025111106592010834093067881082880 +002212025111107030110834093995803762688 +002212025111107233810834099186666008576 +002212025111107451510834104623905845248 +002212025111107144310834096939668271104 +002212025111108034710834109290962460672 +002212025111107553110834107207597096960 +002212025111107330410834101557026562048 +002212025111107384510834102990585135104 +002212025111107433810834104218467643392 +002212025111107342310834101890167562240 +002212025111107462610834104924239007744 +002212025111107414810834103758365073408 +002212025111108025810834109084321656832 +002212025111108080710834110379514372096 +002212025111109043010834124570925133824 +002212025111108333210834116777711198208 +002212025111109213910834128883336548352 +002212025111109204410834128653576790016 +002212025111108092110834110691759329280 +002212025111109244610834129670791958528 +002212025111109141110834127006297440256 +002212025111109133510834126855474466816 +002212025111110225510834144303598759936 +002212025111109453610834134911532892160 +002212025111110082910834140672292007936 +002212025111110295610834146067341328384 +002212025111110132310834141902959476736 +002212025111110592610834153492748398592 +002212025111110253310834144965887754240 +002212025111111304710834161383953862656 +002212025111111320510834161707758333952 +002212025111111232710834159536627232768 +002212025111110565910834152877045510144 +002212025111111350710834162471989911552 +002212025111111322410834161790969163776 +002212025111111152510834157515811561472 +002212025111112045110834169954691149824 +002212025111112100610834171276811276288 +002212025111111502010834166302802935808 +002212025111112133110834172137432125440 +002212025111111380010834163199357714432 +002212025111112140610834172281284132864 +002212025111112285710834176020774617088 +002212025111113034010834184758118014976 +002212025111112305410834176512552558592 +002212025111112445510834180039513444352 +002212025111112571810834183152983011328 +002212025111113350510834192662682378240 +002212025111113114510834186792359645184 +002212025111113434910834194861915324416 +002212025111114045210834200156808876032 +002212025111113583210834198564441382912 +002212025111114235910834204967616851968 +002212025111114265510834205708205109248 +002212025111114391310834208801210703872 +002212025111115084010834216216303984640 +002212025111115010010834214284067803136 +002212025111115351510834222902418796544 +002212025111114553910834212937729810432 +002212025111115280910834221116089921536 +002212025111115534910834227575263531008 +002212025111115445910834225355197456384 +002212025111116115410834232126880296960 +002212025111115415310834224575459569664 +002212025111116393910834239109939306496 +002212025111116075010834231104246050816 +002212025111116330310834237450718777344 +002212025111114335810834207483393949696 +002212025111116335410834237662682116096 +002212025111116334710834237634915815424 +002212025111116302910834236804863053824 +002212025111116295310834236652718845952 +002212025111117011210834244535669952512 +002212025111116444710834240403726860288 +002212025111116575110834243690068905984 +002212025111116351110834237989124808704 +002212025111117033610834245137644843008 +002212025111116480410834241228960407552 +002212025111117335610834252771236192256 +002212025111117002010834244316593102848 +002212025111116570810834243511127343104 +002212025111117511310834257122092593152 +002212025111117484110834256485762134016 +002212025111116591810834244056743362560 +002212025111117500010834256817250603008 +002212025111118001710834259401210261504 +002212025111117373610834253696713576448 +002212025111118155410834263333701648384 +002212025111118242710834265486486876160 +002212025111118144010834263021569937408 +002212025111118325010834267593021521920 +002212025111118410310834269661610323968 +002212025111119130310834277717081567232 +002212025111118444510834270593890869248 +002212025111119100010834276947841978368 +002212025111119111310834277253996822528 +002212025111118550910834273209609818112 +002212025111119113410834277343234842624 +002212025111119005210834274647882792960 +002212025111118442210834270495966449664 +002212025111119164510834278644861591552 +002212025111119375110834283956326842368 +002212025111119170010834278709256753152 +002212025111119000210834274438347993088 +002212025111118464910834271114991202304 +002212025111120202510834294667182575616 +002212025111120045510834290768577007616 +002212025111120013910834289947525206016 +002212025111120255810834296066180079616 +002212025111120411210834299900373741568 +002212025111120534210834303045569048576 +002212025111120273010834296449765965824 +002212025111121253910834311085273870336 +002212025111121472810834316574271442944 +002212025111121215810834310157690970112 +002212025111120222710834295182570246144 +002212025111122123510834322896119369728 +002212025111200064710834351635947520000 +002212025111200183610834354611349073920 +002212025111202540210834393727658840064 +002212025111205351510834434295214583808 +002212025111206040010834441530422562816 +002212025111206415710834451084292104192 +002212025111206580010834455121313898496 +002212025111206182010834445138815848448 +002212025111207100910834458180953767936 +002212025111207551810834469540466982912 +002212025111207122410834458743858769920 +002212025111207243210834461799014948864 +002212025111207083910834457802505953280 +002212025111207565010834469927215398912 +002212025111207324710834463875535171584 +002212025111207492010834468041032708096 +002212025111208282410834477869796888576 +002212025111208495110834483271963963392 +002212025111208354510834479722366468096 +002212025111209512210834498753165234176 +002212025111209170810834490136710025216 +002212025111209205210834491076599042048 +002212025111209231610834491679018549248 +002212025111210152610834504807445901312 +002212025111210235110834506926420856832 +002212025111210553110834514896395403264 +002212025111211073910834517948485529600 +002212025111211030710834516809635545088 +002212025111211465010834527807335530496 +002212025111211465110834527815065604096 +002212025111211551010834529906798600192 +002212025111211273410834522960561414144 +002212025111211210110834521312329928704 +002212025111212092410834533489375948800 +002212025111211444510834527284410654720 +002212025111212145910834534894954291200 +002212025111211414010834526509492039680 +002212025111212192410834536006197383168 +002212025111211322610834524184404770816 +002212025111212161910834535226908282880 +002212025111211534910834529568007892992 +002212025111211295810834523566265044992 +002212025111212423110834541820597456896 +002212025111212391010834540979027161088 +002212025111212492510834543557785911296 +002212025111213062810834547849322254336 +002212025111213000010834546222515326976 +002212025111213061510834547793735143424 +002212025111212495710834543692964114432 +002212025111213075810834548227719778304 +002212025111213104810834548941099593728 +002212025111213432010834557126241873920 +002212025111212444510834542384429371392 +002212025111213321210834554324987908096 +002212025111213280610834553295164620800 +002212025111214044410834562514441928704 +002212025111213434510834557230533292032 +002212025111213370710834555564354404352 +002212025111214135810834564837423665152 +002212025111214073910834563246037622784 +002212025111214121610834564408333758464 +002212025111213500110834558807302156288 +002212025111214223710834567011956375552 +002212025111214072710834563196599377920 +002212025111214440810834572427868209152 +002212025111215235010834582417559486464 +002212025111215042410834577529517596672 +002212025111215145910834580191139004416 +002212025111214572210834575759089266688 +002212025111215040110834577432692076544 +002212025111215272710834583328189030400 +002212025111215471110834588297248063488 +002212025111215570710834590794662477824 +002212025111215352710834585343908577280 +002212025111216044310834592709374861312 +002212025111216194910834596509003214848 +002212025111216273210834598451783868416 +002212025111216150210834595304797577216 +002212025111216041810834592601493164032 +002212025111216150610834595319167262720 +002212025111216250910834597848231903232 +002212025111216301210834599119093428224 +002212025111216371310834600887693053952 +002212025111216433110834602471504171008 +002212025111216424510834602277773451264 +002212025111216383110834601212302794752 +002212025111216311210834599372609753088 +002212025111217153410834610536995573760 +002212025111216380310834601096145739776 +002212025111217064410834608315671207936 +002212025111217054510834608067733315584 +002212025111217093510834609031123017728 +002212025111217101710834609206965002240 +002212025111217041210834607678308962304 +002212025111217054110834608050133995520 +002212025111217300910834614209242935296 +002212025111217235710834612645925175296 +002212025111217341210834615225879302144 +002212025111216040310834592540596051968 +002212025111217502510834619309235564544 +002212025111217410410834616954683355136 +002212025111218323210834629907553931264 +002212025111218102310834624331944005632 +002212025111217352410834615527512666112 +002212025111218420410834632308029616128 +002212025111218392910834631655735644160 +002212025111218385010834631493567078400 +002212025111218264310834628444115124224 +002212025111218493010834634177913225216 +002212025111218114810834624689332240384 +002212025111218204510834626941929332736 +002212025111218273410834628658821545984 +002212025111219162710834640960551600128 +002212025111219065910834638577918472192 +002212025111218585110834636528539611136 +002212025111219113210834639719696130048 +002212025111219071210834638631911755776 +002212025111219205010834642060478443520 +002212025111219534310834650337459257344 +002212025111219261210834643414232006656 +002212025111219480810834648930932989952 +002212025111220271610834658781494988800 +002212025111220061610834653493975027712 +002212025111220381010834661521948364800 +002212025111220355610834660959538327552 +002212025111220552510834665863409524736 +002212025111220500410834664518547873792 +002212025111222004310834682299498565632 +002212025111221364510834676267246354432 +002212025111221574510834681551696142336 +002212025111222202710834687265013448704 +002212025111222462410834693796647858176 +002212025111222111310834684940681146368 +002212025111222102110834684722317307904 +002212025111223083210834699363332333568 +002212025111223352110834706115197087744 +002212025111223263310834703897194639360 +002212025111306095510834805407660310528 +002212025111307003110834818143312117760 +002212025111307243110834824184829517824 +002212025111307361010834827116387999744 +002212025111307362210834827163133513728 +002212025111307313610834825965831651328 +002212025111308174010834837559051497472 +002212025111308145510834836867838578688 +002212025111307302310834825661165801472 +002212025111308085410834835352138780672 +002212025111307583210834832744175046656 +002212025111308224710834838846623137792 +002212025111308555110834847167442825216 +002212025111309100510834850750041128960 +002212025111308450310834844448946601984 +002212025111309360910834857309244690432 +002212025111309463710834859944383307776 +002212025111310224510834869035704975360 +002212025111310392410834873227538567168 +002212025111310505110834876108568244224 +002212025111311103910834881090570887168 +002212025111311054010834879835345739776 +002212025111310562710834877515639771136 +002212025111310421510834873942893899776 +002212025111310344010834872037853597696 +002212025111311140210834881942014590976 +002212025111311012610834878769984114688 +002212025111311340410834886983987437568 +002212025111311320410834886481455316992 +002212025111311422710834889092111769600 +002212025111311304010834886127493791744 +002212025111311344010834887137318612992 +002212025111311440010834889485420003328 +002212025111312155310834897508171493376 +002212025111312190710834898320478130176 +002212025111312142710834897145682923520 +002212025111312144010834897200489926656 +002212025111311562510834892609002110976 +002212025111311592010834893342703325184 +002212025111312471510834905400207413248 +002212025111312184910834898247560146944 +002212025111312561610834907669535588352 +002212025111312284210834900734044246016 +002212025111312050410834894785590018048 +002212025111312445310834904806604345344 +002212025111313162510834912743192215552 +002212025111313040010834909617672351744 +002212025111313262710834915264665186304 +002212025111313103110834911258094055424 +002212025111313310310834916422964154368 +002212025111313390310834918437702307840 +002212025111313525210834921915388502016 +002212025111314085810834925965714628608 +002212025111314103710834926382011875328 +002212025111315143210834942465129263104 +002212025111315005310834939030225006592 +002212025111315240110834944851088449536 +002212025111315293510834946255567917056 +002212025111315181710834943408935776256 +002212025111315303410834946501152796672 +002212025111315295510834946339294609408 +002212025111314565210834938021968826368 +002212025111315551310834952706348752896 +002212025111316263010834960576700162048 +002212025111315581410834953465643634688 +002212025111316082510834956028640186368 +002212025111316124310834957109734600704 +002212025111316291910834961287089422336 +002212025111316303610834961607609782272 +002212025111316234410834959881292935168 +002212025111316460410834965502289444864 +002212025111316535210834967465894834176 +002212025111316424610834964671393628160 +002212025111316400010834963974308732928 +002212025111316522510834967099534950400 +002212025111316562710834968116188090368 +002212025111316454010834965402934808576 +002212025111316454610834965425957302272 +002212025111316574710834968448691544064 +002212025111317141910834972612737822720 +002212025111317500710834981619561078784 +002212025111317283910834976217943457792 +002212025111317031710834969836280545280 +002212025111317253210834975433231151104 +002212025111317194710834973985046990848 +002212025111317340610834977589241794560 +002212025111317483610834981239578136576 +002212025110612252010832363170791923712 +002212025110612234910832362788720148480 +002212025110612094610832359255186812928 +002212025111317485410834981312206692352 +002212025111317391510834978885625643008 +002212025111317593010834983981285597184 +002212025111318141110834987674902941696 +002212025111318195410834989116279709696 +002212025111318164210834988311170461696 +002212025111318153210834988018370306048 +002212025111318222310834989740056616960 +002212025111318055810834985607706640384 +002212025111318473510834996080883769344 +002212025111318542210834997791216046080 +002212025111319181710835003810268770304 +002212025111318543910834997859826507776 +002212025111319263710835005903566225408 +002212025111318533410834997589662990336 +002212025111319102510835001828103634944 +002212025111319072110835001058348208128 +002212025111319051610835000533556895744 +002212025111319242510835005351474212864 +002212025111319285210835006472351625216 +002212025111319421310835009831225737216 +002212025111319575610835013786651521024 +002212025111320081610835016388961349632 +002212025111319502710835011902540845056 +002212025111319262510835005855147171840 +002212025111320013310835014698191269888 +002212025111320280510835021375447711744 +002212025111320183510835018981150244864 +002212025111321171210835033735575052288 +002212025111321002110835029495859331072 +002212025111321110310835032188195631104 +002212025111320583510835029050319384576 +002212025111321565210835043717066452992 +002212025111322120210835047535225311232 +002212025111322444810835055778030903296 +002212025111322401810835054647858913280 +002212025111323130810835062908700037120 +002212025111322481510835056646633488384 +002212025111323432110835070513619095552 +002212025111405235610835156223550255104 +002212025111406012210835165646293278720 +002212025111406172110835169667317985280 +002212025111406385110835175076992856064 +002212025111407255410835186919568261120 +002212025110611533510832355180395294720 +002212025111407411910835190799026847744 +002212025111407385110835190176193675264 +002212025111408104810835198216804454400 +002212025111407383110835190093976911872 +002212025111408220210835201046235803648 +002212025111408020610835196030296985600 +002212025111408481510835207643775303680 +002212025111408150710835199305004044288 +002212025111408523010835208710839816192 +002212025111408214410835200968465027072 +002212025111408495410835208058071883776 +002212025111408372110835204899828084736 +002212025111408422710835206183050248193 +002212025111409292010835217980423643136 +002212025111409314110835218572642545664 +002212025111409173110835215009115774976 +002212025111409391310835220468870615040 +002212025111409415210835221134292770816 +002212025111409494710835223127908392960 +002212025111409340310835219168867074048 +002212025111409434710835221620362244096 +002212025111409310110835218406980141056 +002212025111410295110835233210612559872 +002212025111411121710835243889243426816 +002212025111410422110835236355421999104 +002212025111411350010835249606474031104 +002212025111411231010835246630405640192 +002212025111410504410835238465756667904 +002212025111411315210835248819664531456 +002212025111412014010835256317058437120 +002212025111411445110835252086343675904 +002212025111412082410835258013696339968 +002212025111411510410835253648793243648 +002212025111412040710835256933818236928 +002212025111412275710835262932989976576 +002212025111412140810835259456239120384 +002212025111412131310835259224369639424 +002212025111412362510835265061469229056 +002212025111412053010835257281807089664 +002212025111412131010835259209962192896 +002212025111412521510835269046875926528 +002212025111412401810835266042391105536 +002212025111412475210835267946345066496 +002212025111412404910835266172116725760 +002212025111412513410835268876230696960 +002212025111413191610835275847344291840 +002212025111413501310835283637081145344 +002212025111413542310835284684579225600 +002212025111413433910835281984122716160 +002212025111413504010835283749329104896 +002212025111413575510835285573494853632 +002212025111413592410835285946301378560 +002212025111413513010835283958889140224 +002212025061713093110780915214891429888 +002212025111414141210835289670495195136 +002212025111414311110835293943408832512 +002212025111414220510835291656078725120 +002212025111415152910835305094804901888 +002212025111415032610835302059735187456 +002212025111415090010835303462843154432 +002212025111415312310835309093935337472 +002212025110522493210832157869425790976 +002212025110522242510832151549242966017 +002212025111415540710835314814320054272 +002212025110521302610832137960809541632 +002212025111416012510835316651731431424 +002212025111416015410835316773471096832 +002212025111416212510835321685231730688 +002212025111416224610835322026505506816 +002212025111416101210835318863035564032 +002212025111416452810835327738598080512 +002212025111416055610835317790438797312 +002212025111416355210835325324436369408 +002212025111416274910835323296633028608 +002212025111416102910835318935446052864 +002212025111417133410835334809263489024 +002212025111417080810835333440913731584 +002212025111416493410835328771474817024 +002212025111416574210835330818693636096 +002212025111417172910835335796573310976 +002212025111417395510835341439598292992 +002212025111416580710835330920644567040 +002212025111417240910835337474764673024 +002212025111417030910835332190302351360 +002212025111417453110835342851300335616 +002212025111417391210835341258949623808 +002212025111417091510835333725316927488 +002212025111417454110835342890475155456 +002212025111417364910835340660871221248 +002212025111418023210835347131176554496 +002212025111418085110835348724517126144 +002212025111417501510835344041538957312 +002212025111417553710835345392180350976 +002212025111418214310835351959374090240 +002212025111418200310835351541130670080 +002212025111418202910835351650023194624 +002212025111419021510835362159783026688 +002212025111419044910835362807106732032 +002212025111419101210835364160491184128 +002212025111418574310835361021235007488 +002212025111419471710835373495267028992 +002212025111419220110835367136530202624 +002212025111419261910835368216789983232 +002212025111419273410835368530393919488 +002212025111419163010835365746386857984 +002212025111419215410835367107451109376 +002212025111419315710835369637459480576 +002212025111419373710835371061606064128 +002212025111419355010835370611720814592 +002212025111419490610835373950382579712 +002212025111419343610835370304395735040 +002212025111420241310835382790540955648 +002212025111420333510835385147806920704 +002212025111421023110835392428632121344 +002212025111421091810835394134816264192 +002212025111421370610835401130600787968 +002212025111421544210835405559114739712 +002212025111422340210835415456988459008 +002212025111422522110835420067627499520 +002212025111422310210835414701669814272 +002212025111423481310835434125080633344 +002212025111506364110835536919917686784 +002212025111507043910835543960472207360 +002212025111507163710835546970258604032 +002212025111507323910835551004751253504 +002212025111507373110835552230096195584 +002212025111507302310835550433956798464 +002212025111507263210835549466146328576 +002212025111507342510835551452031819776 +002212025111507465010835554574116519936 +002212025111507444910835554068950368256 +002212025111508024310835558574136193024 +002212025111507532110835556215238647808 +002212025072016563210792931144879456256 +002212025071610003410791376908670558208 +002212025111508345610835566678248763392 +002212025071414194710790717369093795840 +002212025111509161210835577064771530752 +002212025111508401310835568010917539840 +002212025111509085410835575226542301184 +002212025111509161310835577067074203648 +002212025070717202210788226097939062784 +002212025111508542310835571574905696256 +002212025111509040410835574011670499328 +002212025111509161510835577077668978688 +002212025111509463110835584694667665408 +002212025111510053010835589471002624000 +002212025111509295510835580516604022784 +002212025111509092510835575357073231872 +002212025111509340010835581544439156736 +002212025111509510410835585838651469824 +002212025111510023510835588739079802880 +002212025111510575010835602642664890368 +002212025111510135910835591608117968896 +002212025111511092310835605547778281472 +002212025111511311010835611031000256512 +002212025111511402610835613363918299136 +002212025111511410210835613513411682304 +002212025111512022410835618890995920896 +002212025111511371210835612548067422208 +002212025111512260610835624853945671680 +002212025111512273510835625226366324736 +002212025111512123810835621463769432064 +002212025110611444110832352939441586176 +002212025110611430710832352545311264768 +002212025110611274210832348665760415744 +002212025110611233910832347649421832192 +002212025111512400110835628357846233088 +002212025111512564610835632573507645440 +002212025110611080910832343747175596032 +002212025110611005010832341907524497408 +002212025110610564510832340876833026048 +002212025110521104310832132999807700992 +002212025110610372210832336000090578944 +002212025110610190210832331386565918720 +002212025110610082010832328691817852928 +002212025110610034210832327528674426880 +002212025110610010310832326859678789632 +002212025111513104610835636094474878976 +002212025110609113910832314426989957120 +002212025110609092610832313872884645888 +002212025110609070610832313283173875712 +002212025110608492910832308852470517760 +002212025111513471510835645278306107392 +002212025110608261610832303006617403392 +002212025110608250110832302694431154176 +002212025111514044010835649660657573888 +002212025111514151310835652315022831616 +002212025110607593910832296307642830848 +002212025110607435010832292328582131712 +002212025110607430510832292141948186624 +002212025110607253710832287743574478848 +002212025110607232510832287189783736320 +002212025111514045810835649736557694976 +002212025110607174710832285773660909568 +002212025110607033110832282185127641088 +002212025110600105910832178363705282560 +002212025110606495910832278775640838144 +002212025110606490910832278568605782016 +002212025110606371310832275566209736704 +002212025110606312110832274088527101952 +002212025110602275410832212823293247488 +002212025111515010510835663859009933312 +002212025111514462510835660167158394880 +002212025111515112410835666454533320704 +002212025111515002110835663671855894528 +002212025111515363010835672769376776192 +002212025111515304110835671307309486080 +002212025111515140010835667109675200512 +002212025111515041610835664657978703872 +002212025111516141610835682275599007744 +002212025111516072910835680567653261312 +002212025111515575710835678168100302848 +002212025111516300210835686242835951616 +002212025111516241810835684797847920640 +002212025111516294010835686151769231360 +002212025111516342410835687341592612864 +002212025111516422610835689363540774912 +002212025111516551210835692574389510144 +002212025111517015510835694264069103616 +002212025111516442310835689852487528448 +002212025111517143910835697470148943872 +002212025111517190910835698603495981056 +002212025111517200810835698848611135488 +002212025111517101010835696341251997696 +002212025111517375210835703315322589184 +002212025111517465010835705571837153280 +002212025111517284810835701030492241920 +002212025111518161610835712976914452480 +002212025111517491010835706157060014080 +002212025111517025310835694509632978944 +002212025111517380410835703361891926016 +002212025111517464510835705550156812288 +002212025111517552210835707716166725632 +002212025111518002710835708996360531968 +002212025111518163510835713056648142848 +002212025111518521510835722033528242176 +002212025111518302910835716553254858752 +002212025111518380210835718452817391616 +002212025111518225310835714642652901376 +002212025111518475810835720955508236288 +002212025111519465110835735772503699456 +002212025111519091510835726311835807744 +002212025111519223010835729646320070656 +002212025111519373710835733447533887488 +002212025111520110510835741872200286208 +002212025111519450710835735338791661568 +002212025111520153310835742995426545664 +002212025111520333310835747524196933632 +002212025111522003710835769434389557248 +002212025111523042410835785488830517248 +002212025111523044110835785558330155008 +002212025111523245410835790647446949888 +002212025111601470210835826415758446592 +002212025111602381110835839288622661632 +002212025111605414110835885469092503552 +002212025111605523510835888210758033408 +002212025111606023110835890712664555520 +002212025111606194610835895052884180992 +002212025111606530810835903448714788864 +002212025111607154510835909142427951104 +002212025111607353010835914109620535296 +002212025111607142310835908794913062912 +002212025111607340510835913753217966080 +002212025111607460710835916781736108032 +002212025111608012010835920610040979456 +002212025111607415210835915712561901568 +002212025111608104110835922966379995136 +002212025111607512010835918095434100736 +002212025111608242210835926407957426176 +002212025111608432210835931189573021696 +002212025111608233310835926203342499840 +002212025111609011510835935688320569344 +002212025111609173710835939808892882944 +002212025111608591510835935186010705920 +002212025111609081610835937456618147840 +002212025111609163010835939527715147776 +002212025111610195310835955480280633344 +002212025111610023110835951106791788544 +002212025111611001410835965633960833024 +002212025111611514910835978616346730496 +002212025111611403910835975803126358016 +002212025111612031110835981475960266752 +002212025111611200010835970605838479360 +002212025111611340510835974150037893120 +002212025111612051410835981989703811072 +002212025111612284710835987917991796736 +002212025111612005910835980920915443712 +002212025111612523010835993885588824064 +002212025111612524810835993960771690496 +002212025111612455510835992229480435712 +002212025111613040110835996782661685248 +002212025111613392710836005700142043136 +002212025111613344410836004514290663424 +002212025111613334610836004272916881408 +002212025111613364110836005003531063296 +002212025111613403810836005999380480000 +002212025111614114110836013811921780736 +002212025111613441110836006891009830912 +002212025111614323910836019090151419904 +002212025111614530210836024221345492992 +002212025111615091110836028283323392000 +002212025111615083710836028142231166976 +002212025111615270310836032780678414336 +002212025111614594710836025917748490240 +002212025111615262910836032638126608384 +002212025111615293410836033414534217728 +002212025111615340110836034535000600576 +002212025111615493210836038438517673984 +002212025111615035410836026954295214080 +002212025111615551710836039886487920640 +002212025111616080710836043114491346944 +002212025111615392810836035904398893056 +002212025111616120610836044117882114048 +002212025111615570810836040350575067136 +002212025111615553510836039961633050624 +002212025111616190810836045887257636864 +002212025111616145410836044820302200832 +002212025111617033310836057063240732672 +002212025111617051810836057505928548352 +002212025111616512210836054000136290304 +002212025111616284210836048293299200000 +002212025111617121210836059240138993664 +002212025111617194210836061130511806464 +002212025111617010310836056437601542144 +002212025111617395010836066196736135168 +002212025111618030910836072062210252800 +002212025111617354410836065166061445120 +002212025111617161410836060256360144896 +002212025111618150610836075069857542144 +002212025111618090710836073563372609536 +002212025111618164610836075489095032832 +002212025111618141810836074871462776832 +002212025111618065110836072994247499776 +002212025111619032010836087208831844352 +002212025111618350510836080098102419456 +002212025111619104510836089077624950784 +002212025111619130010836089641410719744 +002212025111619050310836087642329939968 +002212025111619311510836094235138281472 +002212025111619361710836095503575482368 +002212025111619104510836089074609229824 +002212025111619190010836091152815583232 +002212025111619290910836093707889090560 +002212025111619550010836100212285710336 +002212025111620023910836102138154905601 +002212025111620101110836104031832838144 +002212025111620524210836114731695292416 +002212025111620013410836101865902649344 +002212025111621054110836117999704043520 +002212025111620303010836109144307728384 +002212025111620570710836115843550777344 +002212025111621032110836117412740534272 +002212025111621344210836125302431899648 +002212025111621400010836126636992319488 +002212025111621095310836119057377484800 +002212025111622012010836132004233453568 +002212025111621474210836128572307099648 +002212025111700103710836164539566989312 +002212025111703491710836219569414311936 +002212025111706230810836258287529451520 +002212025111707154310836271521401638912 +002212025111707215110836273064431562752 +002212025111708004510836282853190504448 +002212025111707390210836277387756523520 +002212025111707444710836278832824262656 +002212025111707473510836279539207962624 +002212025111707491010836279938077880320 +002212025111708104310836285360486674432 +002212025111708061310836284226485305344 +002212025111707382710836277240557412352 +002212025111708292910836290084728442880 +002212025111708554910836296711980417024 +002212025111708294810836290164365676544 +002212025111708502910836295366909079552 +002212025111709384010836307494105726976 +002212025111709174110836302215746138112 +002212025111709173010836302167138308096 +002212025111710093810836315287105785856 +002212025111710271610836319725769949184 +002212025111710221910836318479101132800 +002212025111710504610836325639319142401 +002212025111710345310836321642134863872 +002212025111711234810836333950412210176 +002212025111711110810836330763546472448 +002212025111711283410836335151686057984 +002212025111711334610836336461294579712 +002212025111711504410836340732039741440 +002212025111711431210836338832472997888 +002212025111711211410836333307823853568 +002212025111711392410836337879149678592 +002212025111711325110836336228883996672 +002212025111712034610836344008944582656 +002212025111711441210836339083976044544 +002212025111712140110836346589683101696 +002212025111711363110836337151911866368 +002212025111711535210836341519906209792 +002212025111712081710836345145575800832 +002212025111711565110836342270116200448 +002212025111712373210836352509016244224 +002212025111712262010836349688590077952 +002212025111712521710836356220060889088 +002212025111713163710836362344977862656 +002212025111713272810836365075700469760 +002212025111713400310836368238490918912 +002212025111713582810836372874123751424 +002212025111713472510836370092935294976 +002212025111714215310836378768546951168 +002212025111714355210836382285995134976 +002212025111714124910836376485562105856 +002212025111714484210836385516578115584 +002212025111715003810836388518001094656 +002212025111714554810836387303842344960 +002212025111715251010836394695019667456 +002212025111714350010836382069187362816 +002212025111715373810836397830123503616 +002212025111715463610836400088785567744 +002212025111716101910836406054318964736 +002212025111716063310836405108956434432 +002212025111715525310836401670239510528 +002212025111715304010836396079433588736 +002212025111716134610836406925698240512 +002212025111716212010836408829979373568 +002212025111716374810836412972462731264 +002212025111716194610836408435706388480 +002212025111715565910836402700318621696 +002212025111716573510836417951286108160 +002212025111716365110836412733760704512 +002212025111717082110836420658856161280 +002212025111717203210836423728415567872 +002212025111717120910836421618974298112 +002212025111717165410836422813403009024 +002212025111716590010836418308116529152 +002212025111717315910836426608660901888 +002212025111717160710836422613858992128 +002212025111717380710836428153913831424 +002212025111718101710836436247418966016 +002212025111718054710836435113476292608 +002212025111718060710836435196859056128 +002212025111718032010836434496049586176 +002212025111717380710836428153204973568 +002212025111718031110836434459479461888 +002212025111718144310836437361283510272 +002212025111718141010836437224494673920 +002212025111718031010836434455947837440 +002212025111718291210836441007362609152 +002212025111718200910836438728190439424 +002212025111718231110836439491448872960 +002212025111718235410836439675633332224 +002212025111719004010836448924962865152 +002212025111718504110836446414109872128 +002212025111719222910836454417613684736 +002212025111718405110836443937587286016 +002212025111718480610836445762310840320 +002212025111718572910836448126270898176 +002212025111718504710836446437904171008 +002212025111719333310836457200052027392 +002212025111719153510836452678902689792 +002212025111719092710836451136992673792 +002212025111719281510836455865818742784 +002212025111720093310836466262613356544 +002212025111719140210836452291466432512 +002212025111719195310836453762840854528 +002212025111719514210836461767804272640 +002212025111719272510836455656632029184 +002212025111719484110836461009910308864 +002212025111720265110836470615214624768 +002212025111720150910836467672729985024 +002212025111720370710836473200340307968 +002212025111721474610836490979583934464 +002212025111722400010836504121613422592 +002212025111721491210836491337081253888 +002212025111722465810836505877932122112 \ No newline at end of file diff --git a/jsowell-common/src/main/java/com/jsowell/common/util/DateUtils.java b/jsowell-common/src/main/java/com/jsowell/common/util/DateUtils.java index dc8562b02..0629b9fef 100644 --- a/jsowell-common/src/main/java/com/jsowell/common/util/DateUtils.java +++ b/jsowell-common/src/main/java/com/jsowell/common/util/DateUtils.java @@ -15,6 +15,7 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.*; import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; import java.time.temporal.ChronoUnit; import java.util.*; @@ -53,6 +54,9 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"}; + public static final DateTimeFormatter DEFAULT_DATE_TIME_FORMATTER = + DateTimeFormatter.ofPattern(YYYY_MM_DD_HH_MM_SS); + /** * 获取当前Date型日期 * @@ -251,10 +255,10 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { */ public static long minutesSince(String dateString) { // 定义日期时间格式 - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + // DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); // 解析给定的日期字符串 - LocalDateTime givenDateTime = LocalDateTime.parse(dateString, formatter); + LocalDateTime givenDateTime = LocalDateTime.parse(dateString, DEFAULT_DATE_TIME_FORMATTER); // 获取当前时间 LocalDateTime now = LocalDateTime.now(); @@ -283,6 +287,12 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { return Date.from(instant); } + /** + * LocalDate转Date + * + * @param localDate + * @return + */ public static Date localDate2Date(LocalDate localDate) { if (localDate == null) { return null; @@ -393,8 +403,8 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { // 判断是否包含时间部分 if (trimmed.contains(":")) { // 包含时间部分,按完整日期时间格式解析 - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - return DateUtils.formatDateTime(LocalDateTime.parse(trimmed, formatter).toLocalDate().atStartOfDay()); + // DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + return DateUtils.formatDateTime(LocalDateTime.parse(trimmed, DEFAULT_DATE_TIME_FORMATTER).toLocalDate().atStartOfDay()); } else { // 不包含时间部分,按日期格式解析 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); @@ -416,8 +426,8 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { // 判断是否包含时间部分 if (trimmed.contains(":")) { // 包含时间部分,按完整日期时间格式解析 - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - return DateUtils.formatDateTime(LocalDateTime.parse(trimmed, formatter).toLocalDate().atTime(LocalTime.MAX)); + // DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + return DateUtils.formatDateTime(LocalDateTime.parse(trimmed, DEFAULT_DATE_TIME_FORMATTER).toLocalDate().atTime(LocalTime.MAX)); } else { // 不包含时间部分,按日期格式解析 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); @@ -425,6 +435,32 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { } } + /** + * 判断时间是否是今天 + * + * @param dateTimeStr 日期时间字符串,格式为 "yyyy-MM-dd HH:mm:ss" + * @return + */ + public static boolean isToday(String dateTimeStr) { + // 判断入参 时间是否在 今天 + if (dateTimeStr == null || dateTimeStr.trim().isEmpty()) { + return false; + } + + try { + // DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + LocalDateTime dateTime = LocalDateTime.parse(dateTimeStr, DEFAULT_DATE_TIME_FORMATTER); + LocalDate date = dateTime.toLocalDate(); + LocalDate today = LocalDate.now(); + + return date.isEqual(today); + } catch (DateTimeParseException e) { + // 如果解析失败,说明格式不正确 + return false; + } + } + + public enum IntervalType { DAY, HOUR, @@ -632,6 +668,12 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { return c.getTime(); } + /** + * 时间格式化 + * + * @param date + * @return + */ public static String formatDateTime(Date date) { if (date == null) { return ""; @@ -640,6 +682,11 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { return simpleDateFormat.format(date); } + /** + * 时间格式化 + * @param localDateTime + * @return + */ public static String formatDateTime(LocalDateTime localDateTime) { if (localDateTime == null) { return ""; @@ -648,6 +695,11 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { return formatDateTime(date); } + /** + * 时间格式化 + * @param localTime + * @return + */ public static String formatDateTime(LocalTime localTime) { if (localTime == null) { return ""; @@ -1239,7 +1291,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { return LocalDateTime.of( LocalDate.now(), LocalTime.parse(timeStr, DateTimeFormatter.ofPattern("HH:mm")).withSecond(0) - ).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + ).format(DEFAULT_DATE_TIME_FORMATTER); } @@ -1251,15 +1303,15 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { public static String convertDateToDateTime(String dateStr) { LocalDate endLocalDate = LocalDate.parse(dateStr); LocalDateTime endLocalDateTime = endLocalDate.atStartOfDay(); - return endLocalDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + return endLocalDateTime.format(DEFAULT_DATE_TIME_FORMATTER); } public static String getEndTime(String dateStr) { DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); LocalDate date = LocalDate.parse(dateStr, inputFormatter); LocalDateTime endTime = date.atTime(23, 59, 59); - DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - return endTime.format(outputFormatter); + // DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + return endTime.format(DEFAULT_DATE_TIME_FORMATTER); } } diff --git a/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/RemoteStartChargingRequestHandler.java b/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/RemoteStartChargingRequestHandler.java index 05182a143..e2cdd1c57 100644 --- a/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/RemoteStartChargingRequestHandler.java +++ b/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/RemoteStartChargingRequestHandler.java @@ -109,54 +109,54 @@ public class RemoteStartChargingRequestHandler extends AbstractYkcHandler { orderBasicInfoService.chargingPileStartedSuccessfully(transactionCode); } // 异步推送第三方平台 - CompletableFuture.runAsync(() -> { - OrderBasicInfo orderInfo = orderBasicInfoService.getOrderInfoByTransactionCode(transactionCode); - if (orderInfo == null) { - return; - } - try { - // 启动结果回复 - commonService.commonPushStartChargeResultV2(orderInfo); - } catch (Exception e) { - e.printStackTrace(); - } - // 启动失败, 推送第三方订单信息 - if (StringUtils.equals(startResult, Constants.DOUBLE_ZERO)) { - try { - Thread.sleep(500); - commonService.commonPushOrderInfoV2(orderInfo); - } catch (Exception e) { - log.error("统一推送第三方平台订单信息error, ", e); - } - } - }, thirdpartyTaskExecutor); - - // TODO 测试mq - // 异步发送mq // CompletableFuture.runAsync(() -> { // OrderBasicInfo orderInfo = orderBasicInfoService.getOrderInfoByTransactionCode(transactionCode); // if (orderInfo == null) { // return; // } // try { -// // 推送启动充电结果 -// Thread.sleep(1000); -// rabbitTemplate.convertAndSend(ThirdPartyRabbitConstants.WCC_THIRDPARTY_NAME,ThirdPartyRabbitConstants.ROUTING_KEY_CHARGE_RESULT_PUSH, orderInfo); +// // 启动结果回复 +// commonService.commonPushStartChargeResultV2(orderInfo); // } catch (Exception e) { // e.printStackTrace(); // } // // 启动失败, 推送第三方订单信息 // if (StringUtils.equals(startResult, Constants.DOUBLE_ZERO)) { // try { -// Thread.sleep(1000); -// //充电订单信息推送,订单信息推送,停止充电结果推送,充电账单推送 -// rabbitTemplate.convertAndSend(ThirdPartyRabbitConstants.WCC_THIRDPARTY_NAME,ThirdPartyRabbitConstants.ROUTING_KEY_STARTUP_CHARGING_FAILED_PUSH, orderInfo); +// Thread.sleep(500); +// commonService.commonPushOrderInfoV2(orderInfo); // } catch (Exception e) { // log.error("统一推送第三方平台订单信息error, ", e); // } // } // }, thirdpartyTaskExecutor); + // TODO 测试mq + // 异步发送mq + CompletableFuture.runAsync(() -> { + OrderBasicInfo orderInfo = orderBasicInfoService.getOrderInfoByTransactionCode(transactionCode); + if (orderInfo == null) { + return; + } + try { + // 推送启动充电结果 + Thread.sleep(1000); + rabbitTemplate.convertAndSend(ThirdPartyRabbitConstants.WCC_THIRDPARTY_NAME,ThirdPartyRabbitConstants.ROUTING_KEY_CHARGE_RESULT_PUSH, orderInfo); + } catch (Exception e) { + e.printStackTrace(); + } + // 启动失败, 推送第三方订单信息 + if (StringUtils.equals(startResult, Constants.DOUBLE_ZERO)) { + try { + Thread.sleep(1000); + //充电订单信息推送,订单信息推送,停止充电结果推送,充电账单推送 + rabbitTemplate.convertAndSend(ThirdPartyRabbitConstants.WCC_THIRDPARTY_NAME,ThirdPartyRabbitConstants.ROUTING_KEY_STARTUP_CHARGING_FAILED_PUSH, orderInfo); + } catch (Exception e) { + log.error("统一推送第三方平台订单信息error, ", e); + } + } + }, thirdpartyTaskExecutor); + return null; } } diff --git a/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/TransactionRecordsRequestHandler.java b/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/TransactionRecordsRequestHandler.java index 840cfb6bf..2267485ee 100644 --- a/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/TransactionRecordsRequestHandler.java +++ b/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/TransactionRecordsRequestHandler.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson2.JSON; import com.google.common.primitives.Bytes; import com.jsowell.common.constant.CacheConstants; import com.jsowell.common.constant.Constants; +import com.jsowell.common.constant.mq.ThirdPartyRabbitConstants; import com.jsowell.common.core.domain.ykc.TransactionRecordsData; import com.jsowell.common.core.domain.ykc.YKCDataProtocol; import com.jsowell.common.core.domain.ykc.YKCFrameTypeCode; @@ -686,7 +687,7 @@ public class TransactionRecordsRequestHandler extends AbstractYkcHandler { OrderBasicInfo finalOrderBasicInfo = orderBasicInfo; -// // TODO 异步推送第三方平台订单信息 + // TODO 异步推送第三方平台订单信息 CompletableFuture.runAsync(() -> { try { commonService.commonPushOrderInfo(finalOrderBasicInfo); @@ -719,10 +720,41 @@ public class TransactionRecordsRequestHandler extends AbstractYkcHandler { // CompletableFuture.runAsync(() -> { // try { // rabbitTemplate.convertAndSend(ThirdPartyRabbitConstants.WCC_THIRDPARTY_NAME,ThirdPartyRabbitConstants.ROUTING_KEY_CHARGE_ORDER_PUSH, finalOrderBasicInfo); +// CompletableFuture.runAsync(() -> { +// try { +// commonService.commonPushOrderInfo(finalOrderBasicInfo); // } catch (Exception e) { // log.error("推送第三方平台订单信息error, ", e); // } // }, thirdpartyTaskExecutor); +// +// // TODO 异步推送第三方平台订单信息V2 +// CompletableFuture.runAsync(() -> { +// try { +// commonService.commonPushOrderInfoV2(finalOrderBasicInfo); +// } catch (Exception e) { +// log.error("推送第三方平台订单信息error, ", e); +// } +// }, thirdpartyTaskExecutor); + + // 异步推送充电订单算法平台 + CompletableFuture.runAsync(() -> { + try { + String result = chargeAlgorithmService.pushOrderInfo(finalOrderBasicInfo.getOrderCode()); + log.info("异步推送充电订单算法平台 result:{}", result); + } catch (Exception e) { + log.error("异步推送充电订单算法平台 error, ", e); + } + }, thirdpartyTaskExecutor); + + + CompletableFuture.runAsync(() -> { + try { + rabbitTemplate.convertAndSend(ThirdPartyRabbitConstants.WCC_THIRDPARTY_NAME,ThirdPartyRabbitConstants.ROUTING_KEY_CHARGE_ORDER_PUSH, finalOrderBasicInfo); + } catch (Exception e) { + log.error("推送第三方平台订单信息error, ", e); + } + }, thirdpartyTaskExecutor); } else { // 平台没有查到订单 diff --git a/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/UploadRealTimeMonitorHandler.java b/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/UploadRealTimeMonitorHandler.java index 597115a0c..56f0f65fe 100644 --- a/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/UploadRealTimeMonitorHandler.java +++ b/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/UploadRealTimeMonitorHandler.java @@ -361,46 +361,46 @@ public class UploadRealTimeMonitorHandler extends AbstractYkcHandler { } // 异步推送第三方平台实时数据V2 - CompletableFuture.runAsync(() -> { - try { - commonService.pushRealTimeInfoV2(pileSn, connectorCode, connectorStatus, realTimeMonitorData, transactionCode); -// log.info("统一推送第三方平台实时数据V2 success, pileSn:{}, connectorCode:{}, connectorStatus:{}, realTimeMonitorData:{}, transactionCode:{}", pileSn, connectorCode, connectorStatus, realTimeMonitorData, transactionCode); - } catch (Exception e) { - log.error("统一推送第三方平台实时数据V2 error, ", e); - } - }, thirdpartyTaskExecutor); - - if (StringUtils.equals(connectorStatus, Constants.ONE)) { - // 故障 - // 异步推送第三方平台告警信息 - CompletableFuture.runAsync(() -> { - try { - commonService.commonPushAlarmInfo(pileConnectorCode, connectorStatus, realTimeMonitorData.getPutGunType()); - } catch (Exception e) { - log.error("统一推送第三方平台告警信息 error, ", e); - } - }, thirdpartyTaskExecutor); - } - - // TODO 测试mq - // 向mq中发送实时数据消息,给第三方服务消费 // CompletableFuture.runAsync(() -> { // try { -// log.info("向mq中发送实时数据消息供第三方服务消费, realTimeMonitorData:{}", realTimeMonitorData); -// rabbitTemplate.convertAndSend(ThirdPartyRabbitConstants.WCC_THIRDPARTY_NAME,ThirdPartyRabbitConstants.ROUTING_KEY_REALTIME_DATA_PUSH, realTimeMonitorData); -// } catch (Exception e){ -// log.error("向mq中发送实时数据消息供第三方服务消费 error, ", e); +// commonService.pushRealTimeInfoV2(pileSn, connectorCode, connectorStatus, realTimeMonitorData, transactionCode); +//// log.info("统一推送第三方平台实时数据V2 success, pileSn:{}, connectorCode:{}, connectorStatus:{}, realTimeMonitorData:{}, transactionCode:{}", pileSn, connectorCode, connectorStatus, realTimeMonitorData, transactionCode); +// } catch (Exception e) { +// log.error("统一推送第三方平台实时数据V2 error, ", e); // } -// if (StringUtils.equals(connectorStatus,Constants.ONE)){ -// // 故障 -// // 异步推送第三方平台告警信息 +// }, thirdpartyTaskExecutor); +// +// if (StringUtils.equals(connectorStatus, Constants.ONE)) { +// // 故障 +// // 异步推送第三方平台告警信息 +// CompletableFuture.runAsync(() -> { // try { -// rabbitTemplate.convertAndSend(ThirdPartyRabbitConstants.WCC_THIRDPARTY_NAME,ThirdPartyRabbitConstants.ROUTING_KEY_ALARM_PUSH, realTimeMonitorData.getPutGunType()); +// commonService.commonPushAlarmInfo(pileConnectorCode, connectorStatus, realTimeMonitorData.getPutGunType()); // } catch (Exception e) { // log.error("统一推送第三方平台告警信息 error, ", e); // } -// } -// }, executor); +// }, thirdpartyTaskExecutor); +// } + + // TODO 测试mq + // 向mq中发送实时数据消息,给第三方服务消费 + CompletableFuture.runAsync(() -> { + try { + log.info("向mq中发送实时数据消息供第三方服务消费, realTimeMonitorData:{}", realTimeMonitorData); + rabbitTemplate.convertAndSend(ThirdPartyRabbitConstants.WCC_THIRDPARTY_NAME,ThirdPartyRabbitConstants.ROUTING_KEY_REALTIME_DATA_PUSH, realTimeMonitorData); + } catch (Exception e){ + log.error("向mq中发送实时数据消息供第三方服务消费 error, ", e); + } + if (StringUtils.equals(connectorStatus,Constants.ONE)){ + // 故障 + // 异步推送第三方平台告警信息 + try { + rabbitTemplate.convertAndSend(ThirdPartyRabbitConstants.WCC_THIRDPARTY_NAME,ThirdPartyRabbitConstants.ROUTING_KEY_ALARM_PUSH, realTimeMonitorData.getPutGunType()); + } catch (Exception e) { + log.error("统一推送第三方平台告警信息 error, ", e); + } + } + }, executor); return null; diff --git a/jsowell-netty/src/main/java/com/jsowell/netty/service/rabbitmq/PileRabbitListener.java b/jsowell-netty/src/main/java/com/jsowell/netty/service/rabbitmq/PileRabbitListener.java index f49d66ef4..c2a7961be 100644 --- a/jsowell-netty/src/main/java/com/jsowell/netty/service/rabbitmq/PileRabbitListener.java +++ b/jsowell-netty/src/main/java/com/jsowell/netty/service/rabbitmq/PileRabbitListener.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson2.JSON; import com.google.common.primitives.Bytes; import com.jsowell.common.constant.CacheConstants; import com.jsowell.common.constant.Constants; +import com.jsowell.common.constant.mq.ThirdPartyRabbitConstants; import com.jsowell.common.core.domain.ykc.LoginRequestData; import com.jsowell.common.core.domain.ykc.RealTimeMonitorData; import com.jsowell.common.core.domain.ykc.YKCDataProtocol; @@ -387,53 +388,53 @@ public class PileRabbitListener { } // // 异步推送第三方平台实时数据 - CompletableFuture.runAsync(() -> { - try { - commonService.pushRealTimeInfo(pileSn, connectorCode, connectorStatus, realTimeMonitorData, transactionCode); - } catch (Exception e) { - log.error("统一推送第三方平台实时数据 error,", e); - } - }, thirdpartyTaskExecutor); - - // 异步推送第三方平台实时数据V2 - CompletableFuture.runAsync(() -> { - try { - commonService.pushRealTimeInfoV2(pileSn, connectorCode, connectorStatus, realTimeMonitorData, transactionCode); - } catch (Exception e) { - log.error("统一推送第三方平台实时数据V2 error, ", e); - } - }, thirdpartyTaskExecutor); - - if (StringUtils.equals(connectorStatus, Constants.ONE)) { - // 故障 - // 异步推送第三方平台告警信息 - CompletableFuture.runAsync(() -> { - try { - commonService.commonPushAlarmInfo(pileConnectorCode, connectorStatus, realTimeMonitorData.getPutGunType()); - } catch (Exception e) { - log.error("统一推送第三方平台告警信息 error, ", e); - } - }, thirdpartyTaskExecutor); - } - - // TODO 测试mq - // 向mq中发送实时数据消息,给第三方服务消费 // CompletableFuture.runAsync(() -> { // try { -// rabbitTemplate.convertAndSend(ThirdPartyRabbitConstants.WCC_THIRDPARTY_NAME,ThirdPartyRabbitConstants.ROUTING_KEY_REALTIME_DATA_PUSH, realTimeMonitorData); -// } catch (Exception e){ -// log.error("向mq中发送实时数据消息供第三方服务消费 error, ", e); +// commonService.pushRealTimeInfo(pileSn, connectorCode, connectorStatus, realTimeMonitorData, transactionCode); +// } catch (Exception e) { +// log.error("统一推送第三方平台实时数据 error,", e); // } -// if (StringUtils.equals(connectorStatus,Constants.ONE)){ -// // 故障 -// // 异步推送第三方平台告警信息 +// }, thirdpartyTaskExecutor); +// +// // 异步推送第三方平台实时数据V2 +// CompletableFuture.runAsync(() -> { +// try { +// commonService.pushRealTimeInfoV2(pileSn, connectorCode, connectorStatus, realTimeMonitorData, transactionCode); +// } catch (Exception e) { +// log.error("统一推送第三方平台实时数据V2 error, ", e); +// } +// }, thirdpartyTaskExecutor); +// +// if (StringUtils.equals(connectorStatus, Constants.ONE)) { +// // 故障 +// // 异步推送第三方平台告警信息 +// CompletableFuture.runAsync(() -> { // try { -// rabbitTemplate.convertAndSend(ThirdPartyRabbitConstants.WCC_THIRDPARTY_NAME,ThirdPartyRabbitConstants.ROUTING_KEY_ALARM_PUSH, realTimeMonitorData.getPutGunType()); +// commonService.commonPushAlarmInfo(pileConnectorCode, connectorStatus, realTimeMonitorData.getPutGunType()); // } catch (Exception e) { // log.error("统一推送第三方平台告警信息 error, ", e); // } -// } -// }, executor); +// }, thirdpartyTaskExecutor); +// } + + // TODO 测试mq + // 向mq中发送实时数据消息,给第三方服务消费 + CompletableFuture.runAsync(() -> { + try { + rabbitTemplate.convertAndSend(ThirdPartyRabbitConstants.WCC_THIRDPARTY_NAME,ThirdPartyRabbitConstants.ROUTING_KEY_REALTIME_DATA_PUSH, realTimeMonitorData); + } catch (Exception e){ + log.error("向mq中发送实时数据消息供第三方服务消费 error, ", e); + } + if (StringUtils.equals(connectorStatus,Constants.ONE)){ + // 故障 + // 异步推送第三方平台告警信息 + try { + rabbitTemplate.convertAndSend(ThirdPartyRabbitConstants.WCC_THIRDPARTY_NAME,ThirdPartyRabbitConstants.ROUTING_KEY_ALARM_PUSH, realTimeMonitorData.getPutGunType()); + } catch (Exception e) { + log.error("统一推送第三方平台告警信息 error, ", e); + } + } + }, executor); } diff --git a/jsowell-netty/src/main/java/com/jsowell/netty/strategy/ykc/RemoteStartChargingStrategy.java b/jsowell-netty/src/main/java/com/jsowell/netty/strategy/ykc/RemoteStartChargingStrategy.java index beb1be04d..c50325824 100644 --- a/jsowell-netty/src/main/java/com/jsowell/netty/strategy/ykc/RemoteStartChargingStrategy.java +++ b/jsowell-netty/src/main/java/com/jsowell/netty/strategy/ykc/RemoteStartChargingStrategy.java @@ -112,44 +112,44 @@ public class RemoteStartChargingStrategy implements AbstractYkcStrategy { log.info("远程启动充电命令回复-交易流水号:{}, 桩编码:{}, 枪号:{}, 启动结果(00-失败, 01-成功):{}, 失败原因:{}", transactionCode, pileSn, connectorCode, startResult, failedReasonMsg); // 异步推送第三方平台 - CompletableFuture.runAsync(() -> { - OrderBasicInfo orderInfo = orderBasicInfoService.getOrderInfoByTransactionCode(transactionCode); - if (orderInfo == null) { - return; - } - try { - // 启动结果回复 - commonService.commonPushStartChargeResult(orderInfo); - - } catch (Exception e) { - e.printStackTrace(); - } - // 启动失败, 推送第三方订单信息 - if (StringUtils.equals(startResult, Constants.DOUBLE_ZERO)) { - try { - Thread.sleep(500); - commonService.commonPushOrderInfo(orderInfo); - } catch (Exception e) { - log.error("统一推送第三方平台订单信息error, ", e); - } - } - }, executor); - // Todo 待完善 // CompletableFuture.runAsync(() -> { // OrderBasicInfo orderInfo = orderBasicInfoService.getOrderInfoByTransactionCode(transactionCode); // if (orderInfo == null) { // return; // } -// if (StringUtils.equals(startResult, Constants.DOUBLE_ZERO)){ -// // 启动失败, 推送第三方订单信息 +// try { +// // 启动结果回复 +// commonService.commonPushStartChargeResult(orderInfo); +// +// } catch (Exception e) { +// e.printStackTrace(); +// } +// // 启动失败, 推送第三方订单信息 +// if (StringUtils.equals(startResult, Constants.DOUBLE_ZERO)) { // try { // Thread.sleep(500); -// rabbitTemplate.convertAndSend(ThirdPartyRabbitConstants.WCC_THIRDPARTY_NAME, ThirdPartyRabbitConstants.ROUTING_KEY_STARTUP_CHARGING_FAILED_PUSH, orderInfo); +// commonService.commonPushOrderInfo(orderInfo); // } catch (Exception e) { // log.error("统一推送第三方平台订单信息error, ", e); // } // } // }, executor); + // Todo 待完善 + CompletableFuture.runAsync(() -> { + OrderBasicInfo orderInfo = orderBasicInfoService.getOrderInfoByTransactionCode(transactionCode); + if (orderInfo == null) { + return; + } + if (StringUtils.equals(startResult, Constants.DOUBLE_ZERO)){ + // 启动失败, 推送第三方订单信息 + try { + Thread.sleep(500); + rabbitTemplate.convertAndSend(ThirdPartyRabbitConstants.WCC_THIRDPARTY_NAME, ThirdPartyRabbitConstants.ROUTING_KEY_STARTUP_CHARGING_FAILED_PUSH, orderInfo); + } catch (Exception e) { + log.error("统一推送第三方平台订单信息error, ", e); + } + } + }, executor); return null; diff --git a/jsowell-netty/src/main/java/com/jsowell/netty/strategy/ykc/UploadRealTimeMonitorStrategy.java b/jsowell-netty/src/main/java/com/jsowell/netty/strategy/ykc/UploadRealTimeMonitorStrategy.java index 8afd878b1..bdde705a5 100644 --- a/jsowell-netty/src/main/java/com/jsowell/netty/strategy/ykc/UploadRealTimeMonitorStrategy.java +++ b/jsowell-netty/src/main/java/com/jsowell/netty/strategy/ykc/UploadRealTimeMonitorStrategy.java @@ -347,53 +347,53 @@ public class UploadRealTimeMonitorStrategy implements AbstractYkcStrategy { } // // 异步推送第三方平台实时数据 - CompletableFuture.runAsync(() -> { - try { - commonService.pushRealTimeInfo(pileSn, connectorCode, connectorStatus, realTimeMonitorData, transactionCode); - } catch (Exception e) { - log.error("统一推送第三方平台实时数据 error,", e); - } - }, executor); - - // 异步推送第三方平台实时数据V2 - CompletableFuture.runAsync(() -> { - try { - commonService.pushRealTimeInfoV2(pileSn, connectorCode, connectorStatus, realTimeMonitorData, transactionCode); - } catch (Exception e) { - log.error("统一推送第三方平台实时数据V2 error, ", e); - } - }, executor); - - if (StringUtils.equals(connectorStatus, Constants.ONE)) { - // 故障 - // 异步推送第三方平台告警信息 - CompletableFuture.runAsync(() -> { - try { - commonService.commonPushAlarmInfo(pileConnectorCode, connectorStatus, realTimeMonitorData.getPutGunType()); - } catch (Exception e) { - log.error("统一推送第三方平台告警信息 error, ", e); - } - }, executor); - } - - // TODO 测试mq - // 向mq中发送实时数据消息,给第三方服务消费 // CompletableFuture.runAsync(() -> { // try { -// rabbitTemplate.convertAndSend(ThirdPartyRabbitConstants.WCC_THIRDPARTY_NAME,ThirdPartyRabbitConstants.ROUTING_KEY_REALTIME_DATA_PUSH, realTimeMonitorData); -// } catch (Exception e){ -// log.error("向mq中发送实时数据消息供第三方服务消费 error, ", e); +// commonService.pushRealTimeInfo(pileSn, connectorCode, connectorStatus, realTimeMonitorData, transactionCode); +// } catch (Exception e) { +// log.error("统一推送第三方平台实时数据 error,", e); // } -// if (StringUtils.equals(connectorStatus,Constants.ONE)){ -// // 故障 -// // 异步推送第三方平台告警信息 +// }, executor); +// +// // 异步推送第三方平台实时数据V2 +// CompletableFuture.runAsync(() -> { +// try { +// commonService.pushRealTimeInfoV2(pileSn, connectorCode, connectorStatus, realTimeMonitorData, transactionCode); +// } catch (Exception e) { +// log.error("统一推送第三方平台实时数据V2 error, ", e); +// } +// }, executor); +// +// if (StringUtils.equals(connectorStatus, Constants.ONE)) { +// // 故障 +// // 异步推送第三方平台告警信息 +// CompletableFuture.runAsync(() -> { // try { -// rabbitTemplate.convertAndSend(ThirdPartyRabbitConstants.WCC_THIRDPARTY_NAME,ThirdPartyRabbitConstants.ROUTING_KEY_ALARM_PUSH, realTimeMonitorData.getPutGunType()); +// commonService.commonPushAlarmInfo(pileConnectorCode, connectorStatus, realTimeMonitorData.getPutGunType()); // } catch (Exception e) { // log.error("统一推送第三方平台告警信息 error, ", e); // } -// } -// }, executor); +// }, executor); +// } + + // TODO 测试mq + // 向mq中发送实时数据消息,给第三方服务消费 + CompletableFuture.runAsync(() -> { + try { + rabbitTemplate.convertAndSend(ThirdPartyRabbitConstants.WCC_THIRDPARTY_NAME,ThirdPartyRabbitConstants.ROUTING_KEY_REALTIME_DATA_PUSH, realTimeMonitorData); + } catch (Exception e){ + log.error("向mq中发送实时数据消息供第三方服务消费 error, ", e); + } + if (StringUtils.equals(connectorStatus,Constants.ONE)){ + // 故障 + // 异步推送第三方平台告警信息 + try { + rabbitTemplate.convertAndSend(ThirdPartyRabbitConstants.WCC_THIRDPARTY_NAME,ThirdPartyRabbitConstants.ROUTING_KEY_ALARM_PUSH, realTimeMonitorData.getPutGunType()); + } catch (Exception e) { + log.error("统一推送第三方平台告警信息 error, ", e); + } + } + }, executor); return null; } diff --git a/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayService.java b/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayService.java index 57449d21b..ed1f2b6ae 100644 --- a/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayService.java +++ b/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayService.java @@ -678,20 +678,35 @@ public class AdapayService { // if (CollectionUtils.isNotEmpty(withdrawInfoVOS)) { // totalWithdraw = withdrawInfoVOS.stream().map(WithdrawInfoVO::getCashAmt).reduce(BigDecimal.ZERO, BigDecimal::add); // } - BigDecimal totalWithdraw = clearingWithdrawInfoService.queryTotalWithdraw(merchantId); - vo.setTotalWithdraw(totalWithdraw); + // BigDecimal totalWithdraw = clearingWithdrawInfoService.queryTotalWithdraw(merchantId); + vo.setTotalWithdraw(clearingWithdrawInfoService.queryTotalWithdraw(merchantId)); // 在途金额 BigDecimal pendingAmount = BigDecimal.ZERO; + BigDecimal todayWithdrawalAmount = BigDecimal.ZERO; List withdrawInfoVOS = clearingWithdrawInfoService.selectByMerchantId(merchantId); - log.info("==查询提现在途金额param:{}, result:{}", JSON.toJSONString(withdrawInfoVOS), JSON.toJSONString(pendingAmount)); + // log.info("==查询提现在途金额param:{}, result:{}", JSON.toJSONString(withdrawInfoVOS), JSON.toJSONString(pendingAmount)); if (CollectionUtils.isNotEmpty(withdrawInfoVOS)) { pendingAmount = withdrawInfoVOS.stream() .filter(item -> Constants.ZERO.equals(item.getStatusDesc())) .map(WithdrawInfoVO::getCashAmt) .reduce(BigDecimal.ZERO, BigDecimal::add); + + // 查询今天的提现金额 + for (WithdrawInfoVO withdrawInfoVO : withdrawInfoVOS) { + // 如果applicationTime在当天,则加到todayWithdrawalAmount中 + if (DateUtils.isToday(withdrawInfoVO.getApplicationTime())) { + todayWithdrawalAmount = todayWithdrawalAmount.add(withdrawInfoVO.getCashAmt()); + } + } } vo.setPendingAmount(pendingAmount); + + // BigDecimal todayWithdrawalAmount = clearingWithdrawInfoService.queryTodayWithdrawalAmount(merchantId); + // 如果大于0,则重新更新LastAvlBalance + if (todayWithdrawalAmount.compareTo(BigDecimal.ZERO) > 0) { + vo.setLastAvlBalance(BigDecimal.ZERO.max(vo.getLastAvlBalance().subtract(todayWithdrawalAmount))); + } return vo; } diff --git a/jsowell-pile/src/main/java/com/jsowell/adapay/vo/AdapayAccountBalanceVO.java b/jsowell-pile/src/main/java/com/jsowell/adapay/vo/AdapayAccountBalanceVO.java index 67561da07..5d1583479 100644 --- a/jsowell-pile/src/main/java/com/jsowell/adapay/vo/AdapayAccountBalanceVO.java +++ b/jsowell-pile/src/main/java/com/jsowell/adapay/vo/AdapayAccountBalanceVO.java @@ -22,7 +22,7 @@ public class AdapayAccountBalanceVO { // 冻结余额,当配置了自动结算功能,在每日发起结算时会将可用余额转为冻结金额。该部分金额不允许取现。 private BigDecimal frzBalance; - // 昨日日终余额。 + // 昨日日终余额。(页面显示为可提现金额) private BigDecimal lastAvlBalance; // 汇付会员id diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/domain/AdapayUnsplitRecord.java b/jsowell-pile/src/main/java/com/jsowell/pile/domain/AdapayUnsplitRecord.java index 316f7c607..b816a3150 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/domain/AdapayUnsplitRecord.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/domain/AdapayUnsplitRecord.java @@ -1,13 +1,16 @@ package com.jsowell.pile.domain; -import java.math.BigDecimal; -import java.util.Date; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import lombok.experimental.SuperBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import java.math.BigDecimal; +import java.util.Date; @Data @Accessors(chain = true) @@ -100,4 +103,27 @@ public class AdapayUnsplitRecord { * 更新时间 */ private Date updateTime; + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.JSON_STYLE) + .append("id", id) + .append("merchantCode", merchantCode) + .append("payTime", payTime) + .append("paymentId", paymentId) + .append("orderNo", orderNo) + .append("payAmount", payAmount) + .append("confirmedSplitAmount", confirmedSplitAmount) + .append("refundAmount", refundAmount) + .append("paymentRevokeAmount", paymentRevokeAmount) + .append("remainingSplitAmount", remainingSplitAmount) + .append("orderCode", orderCode) + .append("pileType", pileType) + .append("dueRefundAmount", dueRefundAmount) + .append("settleAmount", settleAmount) + .append("refundFlag", refundFlag) + .append("splitFlag", splitFlag) + .append("updateTime", updateTime) + .toString(); + } } \ No newline at end of file diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/AdapayUnsplitRecordMapper.java b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/AdapayUnsplitRecordMapper.java index 50e148b84..60e7f9218 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/AdapayUnsplitRecordMapper.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/AdapayUnsplitRecordMapper.java @@ -1,10 +1,13 @@ package com.jsowell.pile.mapper; import com.jsowell.pile.domain.AdapayUnsplitRecord; +import com.jsowell.pile.vo.AdapayUnsplitRecordVO; import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; import java.util.List; +@Repository public interface AdapayUnsplitRecordMapper { int deleteByPrimaryKey(Integer id); @@ -29,4 +32,6 @@ public interface AdapayUnsplitRecordMapper { int batchInsert(@Param("list") List list); List queryUnsplitOrders(@Param("startTime") String startTime, @Param("endTime") String endTime); + + List queryList(); } \ No newline at end of file diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/AdapayUnsplitRecordService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/AdapayUnsplitRecordService.java index af3738bfb..ba7d84052 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/AdapayUnsplitRecordService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/AdapayUnsplitRecordService.java @@ -1,6 +1,8 @@ package com.jsowell.pile.service; import com.jsowell.pile.domain.AdapayUnsplitRecord; +import com.jsowell.pile.vo.AdapayUnsplitRecordVO; + import java.util.List; public interface AdapayUnsplitRecordService{ @@ -27,4 +29,6 @@ public interface AdapayUnsplitRecordService{ int batchInsert(List list); List queryUnsplitOrders(String startTime, String endTime); + + List queryList(); } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/ClearingWithdrawInfoService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/ClearingWithdrawInfoService.java index aaf5c8d1c..2717c7560 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/ClearingWithdrawInfoService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/ClearingWithdrawInfoService.java @@ -43,4 +43,5 @@ public interface ClearingWithdrawInfoService{ PageResponse queryWithdrawList(QueryWithdrawListDTO dto) throws BaseAdaPayException; BigDecimal queryTotalWithdraw(String merchantId); + } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/ClearingWithdrawInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/ClearingWithdrawInfoServiceImpl.java index c827c1966..15c82f981 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/ClearingWithdrawInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/ClearingWithdrawInfoServiceImpl.java @@ -5,7 +5,6 @@ import com.github.pagehelper.PageInfo; import com.google.common.collect.Lists; import com.huifu.adapay.core.exception.BaseAdaPayException; import com.jsowell.adapay.dto.QueryWithdrawListDTO; -import com.jsowell.adapay.service.AdapayService; import com.jsowell.common.constant.Constants; import com.jsowell.common.core.page.PageResponse; import com.jsowell.common.util.DateUtils; @@ -13,11 +12,9 @@ import com.jsowell.common.util.StringUtils; import com.jsowell.pile.domain.ClearingWithdrawInfo; import com.jsowell.pile.mapper.ClearingWithdrawInfoMapper; import com.jsowell.pile.service.ClearingWithdrawInfoService; -import com.jsowell.pile.service.PileMerchantInfoService; import com.jsowell.pile.vo.web.ClearingBillVO; import com.jsowell.pile.vo.web.WithdrawInfoVO; import org.apache.commons.collections4.CollectionUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberBasicInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberBasicInfoServiceImpl.java index 17391761e..4a364c152 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberBasicInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberBasicInfoServiceImpl.java @@ -642,11 +642,26 @@ public class MemberBasicInfoServiceImpl implements MemberBasicInfoService { List merchantIdList = merchantInfoVOList.stream() .map(MerchantInfoVO::getMerchantId).collect(Collectors.toList()); + List queryMerchantIds; + + // 权限校验一下 + if (StringUtils.isNotBlank(dto.getMerchantId())) { + if (!merchantIdList.contains(dto.getMerchantId())) { + throw new BusinessException("403", "没有权限查询该运营商数据"); + } + // 只查当前筛选的运营商 + queryMerchantIds = Collections.singletonList(dto.getMerchantId()); + } else { + // 查全部权限内的运营商 + queryMerchantIds = merchantIdList; + } + // 分页 int pageNum = dto.getPageNum() == null ? 1 : dto.getPageNum(); int pageSize = dto.getPageSize() == null ? 10 : dto.getPageSize(); PageHelper.startPage(pageNum, pageSize); - List resultList = memberBasicInfoMapper.queryMerchantVipList(merchantIdList, dto); + List resultList = memberBasicInfoMapper.queryMerchantVipList(queryMerchantIds, dto); + if (CollectionUtils.isNotEmpty(resultList)) { for (MerchantVipVO merchantVipVO : resultList) { BigDecimal principalBalance = merchantVipVO.getPrincipalBalance() == null ? BigDecimal.ZERO : merchantVipVO.getPrincipalBalance(); diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/vo/AdapayUnsplitRecordVO.java b/jsowell-pile/src/main/java/com/jsowell/pile/vo/AdapayUnsplitRecordVO.java new file mode 100644 index 000000000..c4c72d4e8 --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/pile/vo/AdapayUnsplitRecordVO.java @@ -0,0 +1,33 @@ +package com.jsowell.pile.vo; + +import lombok.Data; + +@Data +public class AdapayUnsplitRecordVO { + // 订单号 + private String orderCode; + + // 支付ID + private String paymentId; + + // 支付金额 + private String payAmount; + + // 结算金额 + private String settleAmount; + + // 确认分账金额 + private String confirmedSplitAmount; + + // 待分账金额 + private String waitSplitAmount; + + // 应退款金额 + private String refundAmount; + + // 已退款金额 + private String paidAmount; + + // 待退款金额 + private String refundPayAmount; +} diff --git a/jsowell-pile/src/main/java/com/jsowell/web/controller/pile/AdapayUnsplitRecordServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/web/controller/pile/AdapayUnsplitRecordServiceImpl.java index 363164f25..b3b26b4d6 100644 --- a/jsowell-pile/src/main/java/com/jsowell/web/controller/pile/AdapayUnsplitRecordServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/web/controller/pile/AdapayUnsplitRecordServiceImpl.java @@ -3,6 +3,7 @@ package com.jsowell.web.controller.pile; import com.jsowell.pile.domain.AdapayUnsplitRecord; import com.jsowell.pile.mapper.AdapayUnsplitRecordMapper; import com.jsowell.pile.service.AdapayUnsplitRecordService; +import com.jsowell.pile.vo.AdapayUnsplitRecordVO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -73,4 +74,9 @@ public class AdapayUnsplitRecordServiceImpl implements AdapayUnsplitRecordServic return adapayUnsplitRecordMapper.queryUnsplitOrders(startTime, endTime); } + @Override + public List queryList() { + return adapayUnsplitRecordMapper.queryList(); + } + } diff --git a/jsowell-pile/src/main/resources/mapper/pile/AdapayUnsplitRecordMapper.xml b/jsowell-pile/src/main/resources/mapper/pile/AdapayUnsplitRecordMapper.xml index bb03de5fa..eeb45595b 100644 --- a/jsowell-pile/src/main/resources/mapper/pile/AdapayUnsplitRecordMapper.xml +++ b/jsowell-pile/src/main/resources/mapper/pile/AdapayUnsplitRecordMapper.xml @@ -702,8 +702,25 @@ + + + + + + \ No newline at end of file diff --git a/jsowell-quartz/src/main/java/com/jsowell/quartz/task/JsowellTask.java b/jsowell-quartz/src/main/java/com/jsowell/quartz/task/JsowellTask.java index 711c73643..4903d98b2 100644 --- a/jsowell-quartz/src/main/java/com/jsowell/quartz/task/JsowellTask.java +++ b/jsowell-quartz/src/main/java/com/jsowell/quartz/task/JsowellTask.java @@ -1,7 +1,10 @@ package com.jsowell.quartz.task; +import com.alibaba.fastjson2.JSON; import com.google.common.collect.Lists; +import com.jsowell.adapay.dto.QueryPaymentConfirmDTO; import com.jsowell.adapay.dto.WithdrawDTO; +import com.jsowell.adapay.response.QueryPaymentConfirmDetailResponse; import com.jsowell.adapay.service.AdapayService; import com.jsowell.common.YouDianUtils; import com.jsowell.common.constant.CacheConstants; @@ -411,11 +414,15 @@ public class JsowellTask { // processUnSettledOrderOld(); // 旧方法 for (int i = 0; i < 35; i++) { int batchNum = i + 1; - processUnSettledOrderNew(batchNum); // 新方法 + processUnSettledOrderV2(batchNum); // 新方法 } } - private void processUnSettledOrderNew(int batchNum) { + /** + * V1方法,获取退款金额与结算金额 + * @param batchNum + */ + private void processUnSettledOrderV1(int batchNum) { String startTime = "2025-01-01 00:00:00"; String endTime = "2025-12-31 23:59:59"; @@ -456,6 +463,30 @@ public class JsowellTask { log.info("第{}批次,共更新{}条数据", batchNum, updateList.size()); } + /** + * 更新adapay_unsplit_record表, 去汇付查询最新的数据 + * @param batchNum + */ + private void processUnSettledOrderV2(int batchNum) { + String startTime = "2025-01-01 00:00:00"; + String endTime = "2025-12-31 23:59:59"; + + // 查询未分帐订单 + PageUtils.startPage(1, 3); + List list = adapayUnsplitRecordService.queryUnsplitOrders(startTime, endTime); + + // 根据paymentId去汇付查询最新数据 + for (AdapayUnsplitRecord adapayUnsplitRecord : list) { + String paymentId = adapayUnsplitRecord.getPaymentId(); + + QueryPaymentConfirmDTO dto = new QueryPaymentConfirmDTO(); + dto.setWechatAppId(Constants.DEFAULT_APP_ID); + dto.setPaymentId(paymentId); + QueryPaymentConfirmDetailResponse response = adapayService.queryPaymentConfirmList(dto); + System.out.println(JSON.toJSONString(response)); + } + } + // private void processUnSettledOrderOld() { // String startTime = "2023-01-01 00:00:00"; // String endTime = "2024-12-31 23:59:59"; diff --git a/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/common/CommonService.java b/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/common/CommonService.java index 6a821c584..0faac6ebc 100644 --- a/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/common/CommonService.java +++ b/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/common/CommonService.java @@ -477,7 +477,8 @@ public class CommonService { thirdPartySecretInfoVO.getPlatformType(), e.getMessage(), e); } } else { - log.info("无订单信息,仅推送站点状态,平台类型:{}", thirdPartySecretInfoVO.getPlatformType()); + return; +// log.info("无订单信息,仅推送站点状态,平台类型:{}", thirdPartySecretInfoVO.getPlatformType()); } } catch (Exception e) { log.error("推送实时数据到平台失败,平台类型:{},错误信息:{}",