import cn.hutool.json.JSONUtil; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.alipay.easysdk.factory.Factory; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.google.common.primitives.Bytes; import com.huifu.adapay.core.exception.BaseAdaPayException; 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.config.AbstractAdapayConfig; import com.jsowell.adapay.dto.*; import com.jsowell.adapay.factory.AdapayConfigFactory; import com.jsowell.adapay.operation.PaymentReverseOperation; import com.jsowell.adapay.response.*; import com.jsowell.adapay.service.AdapayService; import com.jsowell.adapay.vo.AdapayCorpMemberVO; import com.jsowell.adapay.vo.DrawCashDetailVO; import com.jsowell.adapay.vo.PaymentInfo; import com.jsowell.common.constant.CacheConstants; import com.jsowell.common.constant.Constants; import com.jsowell.common.core.domain.entity.SysDictData; import com.jsowell.common.core.domain.ykc.LoginRequestData; import com.jsowell.common.core.domain.ykc.TransactionRecordsData; import com.jsowell.common.core.redis.RedisCache; import com.jsowell.common.enums.AcquirerEnum; import com.jsowell.common.enums.DelFlagEnum; import com.jsowell.common.enums.thirdparty.ThirdPlatformTypeEnum; import com.jsowell.common.enums.ykc.*; import com.jsowell.common.exception.BusinessException; import com.jsowell.common.util.*; import com.jsowell.common.util.Cp56Time2a.Cp56Time2aUtil; import com.jsowell.common.util.http.HttpUtils; import com.jsowell.common.util.id.IdUtils; import com.jsowell.common.util.id.SnowflakeIdWorker; import com.jsowell.common.util.ip.AddressUtils; import com.jsowell.netty.handler.yunkuaichong.HeartbeatRequestHandler; import com.jsowell.netty.handler.yunkuaichong.TransactionRecordsRequestHandler; import com.jsowell.netty.service.camera.impl.CameraBusinessServiceImpl; import com.jsowell.netty.service.yunkuaichong.YKCBusinessService; import com.jsowell.pile.domain.*; import com.jsowell.pile.domain.ykcCommond.IssueQRCodeCommand; import com.jsowell.pile.domain.ykcCommond.ProofreadTimeCommand; import com.jsowell.pile.dto.*; import com.jsowell.pile.dto.amap.GetStationInfoDTO; import com.jsowell.pile.dto.lutongyunting.BindCouponDTO; import com.jsowell.pile.mapper.MemberBasicInfoMapper; import com.jsowell.pile.mapper.PileBillingTemplateMapper; import com.jsowell.pile.service.*; import com.jsowell.pile.service.programlogic.AbstractProgramLogic; import com.jsowell.pile.service.programlogic.ProgramLogicFactory; import com.jsowell.pile.thirdparty.CommonParamsDTO; import com.jsowell.pile.transaction.dto.OrderTransactionDTO; import com.jsowell.pile.transaction.service.TransactionService; import com.jsowell.pile.util.SnUtils; import com.jsowell.pile.vo.base.MemberWalletVO; import com.jsowell.pile.vo.base.PileInfoVO; import com.jsowell.pile.vo.uniapp.customer.CurrentTimePriceDetails; import com.jsowell.pile.vo.uniapp.customer.MemberPlateNumberVO; import com.jsowell.pile.vo.uniapp.customer.MemberVO; import com.jsowell.pile.vo.uniapp.customer.PileConnectorDetailVO; import com.jsowell.pile.vo.web.*; import com.jsowell.service.MemberService; import com.jsowell.service.OrderService; import com.jsowell.service.PileService; import com.jsowell.service.TempService; import com.jsowell.thirdparty.amap.service.AMapService; import com.jsowell.thirdparty.common.NotificationDTO; import com.jsowell.thirdparty.common.NotificationService; import com.jsowell.thirdparty.huawei.HuaWeiService; import com.jsowell.thirdparty.lianlian.service.LianLianService; import com.jsowell.thirdparty.lutongyunting.service.LTYTService; import com.jsowell.thirdparty.platform.util.Cryptos; import com.jsowell.thirdparty.platform.util.Encodes; import com.jsowell.thirdparty.platform.util.GBSignUtils; import com.jsowell.thirdparty.zhongdianlian.service.ZDLService; import com.jsowell.wxpay.common.WeChatPayParameter; import com.jsowell.wxpay.dto.AppletTemplateMessageSendDTO; import com.jsowell.wxpay.response.WechatPayRefundRequest; import com.jsowell.wxpay.service.WxAppletRemoteService; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.RandomStringUtils; import org.junit.Test; import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.util.StopWatch; import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import java.math.RoundingMode; import java.nio.charset.StandardCharsets; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @ActiveProfiles("dev") @SpringBootTest(classes = JsowellApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @RunWith(SpringRunner.class) public class SpringBootTestController { protected final Logger logger = LoggerFactory.getLogger(this.getClass()); private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String wechatAppId1 = "wxbb3e0d474569481d"; // 万车充 String wechatAppId2 = "wx20abc5210391649c"; // 嘉佳充电 @Autowired private SnUtils snUtils; @Autowired private PileService pileService; @Autowired private YKCPushCommandService ykcPushCommandService; @Autowired private AdapayMemberAccountService adapayMemberAccountService; @Autowired private PileMsgRecordService pileMsgRecordService; @Autowired private PileStationInfoService pileStationInfoService; @Autowired private YKCPushCommandService ykcPushBusinessService; @Autowired private HeartbeatRequestHandler heartbeatRequestHandler; @Autowired private YKCBusinessService ykcBusinessService; @Autowired private PileBillingTemplateMapper pileBillingTemplateMapper; @Autowired private PileRemoteService pileRemoteService; @Autowired private MemberService memberService; @Autowired private OrderService orderService; @Autowired private PileBillingTemplateService pileBillingTemplateService; @Autowired private MemberBasicInfoMapper memberBasicInfoMapper; @Autowired private SimCardService simCardService; @Autowired private PileBasicInfoService pileBasicInfoService; @Autowired private WechatPayService wechatPayService; @Autowired private OrderBasicInfoService orderBasicInfoService; @Autowired private WxpayCallbackRecordService wxpayCallbackRecordService; @Autowired private WxAppletRemoteService wxAppletRemoteService; @Autowired private RedisCache redisCache; @Autowired private PileAuthCardService pileAuthCardService; @Autowired private LianLianService lianLianService; @Autowired private MemberPlateNumberRelationService memberPlateNumberRelationService; static final String MAC_KEY = "53TtFpc4gdVZbF3x"; static final String ALGORITHM_MAC = "HmacMD5"; @Autowired private AdapayCallbackRecordService adapayCallbackRecordService; @Autowired private AdapayRefundRecordService adapayRefundRecordService; @Autowired private AdapayService adapayService; @Autowired private AMapService aMapService; @Autowired private PileConnectorInfoService pileConnectorInfoService; @Autowired private TransactionRecordsRequestHandler transactionRecordsRequestHandler; @Autowired private MemberBasicInfoService memberBasicInfoService; @Autowired private ClearingWithdrawInfoService clearingWithdrawInfoService; @Autowired private OrderPileOccupyService orderPileOccupyService; @Autowired private CameraBusinessServiceImpl cameraBusinessServiceImpl; @Autowired private LTYTService ltytService; @Autowired private PileMerchantInfoService pileMerchantInfoService; @Autowired private MemberAdapayRecordService memberAdapayRecordService; @Autowired private TransactionService transactionService; @Autowired private OrderPayRecordService orderPayRecordService; @Autowired private TempService tempService; @Autowired private MemberWalletInfoService memberWalletInfoService; @Autowired private MemberGroupService memberGroupService; @Autowired private HuaWeiService huaWeiService; @Autowired private NotificationService notificationService; @Autowired private PileReservationInfoService pileReservationInfoService; @Autowired private ZDLService zdlService; @Test public void thirdPartyTest() { QueryStationInfoDTO dto = new QueryStationInfoDTO(); dto.setOperatorId("14405899X"); dto.setThirdPlatformType(ThirdPlatformTypeEnum.NING_BO_PLATFORM.getTypeCode()); zdlService.queryStationsInfo(dto); } @Test public void personPileStopChargingTest() { String memberId = "84085683"; String pileConnectorCode = "8823000000141001"; PersonPileStopChargingDTO dto = PersonPileStopChargingDTO.builder() .memberId(memberId) .pileConnectorCode(pileConnectorCode) .build(); pileReservationInfoService.personPileStopCharging(dto); } @Test public void selectMemberPlateNumberRelationTest() { String memberId = "25950857"; List plateNumberVOList = memberPlateNumberRelationService.selectMemberPlateNumberRelation(memberId); System.out.println(JSON.toJSONString(plateNumberVOList)); } @Test public void activateReservedTest() { PileReservationDTO dto = new PileReservationDTO(); dto.setReservedId("15"); dto.setMemberId("25950857"); // 启用 pileReservationInfoService.activateReserved(dto); } @Test public void payOrderV2Test() { String s = "{\n" + " \"alipayAppId\": \"2021004145642756\",\n" + " \"code\": \"10bb693b0f2346dcb9b70d92322dNC91\",\n" + " \"goodsDesc\": \"充电桩预付款金额\",\n" + " \"goodsTitle\": \"充电费用\",\n" + " \"lockValue\": \"f0f6a356-a720-49d1-ad21-bb685af91703\",\n" + " \"memberId\": \"65622699\",\n" + " \"orderCode\": \"C84239627240\",\n" + " \"payAmount\": 50,\n" + " \"payMode\": \"5\",\n" + " \"requestSource\": \"alipay_lite\",\n" + " \"type\": \"order\"\n" + "}"; PayOrderDTO dto = JSON.parseObject(s, PayOrderDTO.class); orderService.payOrderV2(dto); } @Test public void queryPaymentReverseTest2() { String paymentId = "002212024061717243610648707836701741056"; try { adapayService.queryPaymentReverse(paymentId, wechatAppId1); } catch (BaseAdaPayException e) { throw new RuntimeException(e); } } @Test public void createBalancePaymentRequestTest() { String outMemberId = "ACM42875164"; // 出账memberId String inMemberId = "0"; // 入账memberId String transAmt = "798.20"; // 金额 String title = "提取余额到自己账户"; // 标题 String desc = "2024年7月31日08点55分,售后需求:客户重新添加结算账户, 原账户余额无法提取, 由现下打款给客户"; // 描述 String wechatAppId = wechatAppId1; // 万车充id adapayService.createBalancePaymentRequest(outMemberId, inMemberId, transAmt, title, desc, wechatAppId); } @Test public void decryptPhoneNum() throws Exception { String content = "/CunEGSbDxsQaKllc35Q+4lJdLiprZhrHFt9er/ZriETVHv2IrtZsmC8cA6DE5l8GgzvgHCPdGp1iUJQhNyKog=="; // 通过密文解密 获取手机号码 String mobileNumber = Factory.Util.AES().decrypt(content); System.out.println(mobileNumber); } @Test public void getOrderRefundInfoListTest() { String orderCode = "C44565166677"; OrderBasicInfo orderBasicInfo = new OrderBasicInfo(); orderBasicInfo.setOrderCode(orderCode); orderBasicInfo.setMerchantId("33"); orderBasicInfo.setPayMode("4"); // 查询退款明细 List orderRefundInfoList = orderBasicInfoService.getOrderRefundInfoList(orderBasicInfo); System.out.println(JSON.toJSONString(orderRefundInfoList)); } @Test public void getSnowflakeIdTest() { for (int i = 0; i < 100; i++) { String snowflakeId = SnowflakeIdWorker.getSnowflakeId(); System.out.println("第" + i + "个snowflakeId:" + snowflakeId); } } @Test public void getOrderCodeTest() { for (int i = 0; i < 10; i++) { String orderCode = IdUtils.getOrderCode(); System.out.println("第" + i + 1 + "个orderCode:" + orderCode); } } @Test public void notificationStationInfoTest() { String stationId = "19"; NotificationDTO dto = new NotificationDTO(); dto.setStationId(stationId); dto.setPlatformType("1"); notificationService.notificationStationInfo(dto); } @Test public void queryBillingPriceTest() { String stationId = "19"; // List billingPriceVOS = pileBillingTemplateService.queryBillingPriceOld(stationId); // System.out.println("老版:" + JSON.toJSONString(billingPriceVOS)); // // List billingPriceVOS1 = pileBillingTemplateService.queryBillingPrice(stationId); // System.out.println("新版:" + JSON.toJSONString(billingPriceVOS1)); CurrentTimePriceDetails currentTimePriceDetails = pileBillingTemplateService.getCurrentTimePriceDetails(stationId); System.out.println("currentTimePriceDetails:" + JSON.toJSONString(currentTimePriceDetails)); } @Test public void queryPaymentRefundTest() { String paymentId = "002212023122615542010585629628950949888"; try { adapayService.queryPaymentRefund(paymentId, wechatAppId2); } catch (BaseAdaPayException e) { throw new RuntimeException(e); } } @Test public void testnotificationOperationSystemInfo() { // HWStationInfo hwStationInfo = huaWeiService.notificationOperationSystemInfo("19"); // String s = JSON.toJSONString(hwStationInfo); // System.out.println(s); } @Test public void selectByMemberWalletListTest() { String memberId = "12345678"; List memberWalletVOS = memberWalletInfoService.selectByMemberWalletList(memberId); System.out.println(JSON.toJSONString(memberWalletVOS)); } @Test public void testMqttSendMsg() throws InterruptedException { String channelId = "94dd42b6"; String topic = "/GroundlockStatus"; JSONObject jsonObject = new JSONObject(); jsonObject.put("sign","F4213AD90EBC72C678E03450E4E091EE"); jsonObject.put("sn","e27f089d-5fadf6c6"); jsonObject.put("timestamp","2021-07-01 12:00:01"); jsonObject.put("msg_id","GS2021070112000101"); jsonObject.put("msg_type","GroundlockStatus"); jsonObject.put("msg_data",null); // ChannelFuture future = cameraBusinessServiceImpl.sendMsg(channelId, topic, JSON.toJSONString()); // System.out.println(future.toString()); } @Test public void testDeliverEquipBusinessPolicy() { String result = huaWeiService.deliverEquipBusinessPolicy("test123451694073123456", "8823000000073501"); System.out.println(result); } @Test public void testDiscount() { OrderBasicInfo orderBasicInfo = new OrderBasicInfo(); orderBasicInfo.setMemberId("12345678"); orderBasicInfo.setMerchantId("1"); orderBasicInfo.setStationId("19"); orderBasicInfo.setPayAmount(new BigDecimal("200")); OrderDetail orderDetail = new OrderDetail(); orderDetail.setTotalElectricityAmount(new BigDecimal("3")); orderDetail.setTotalServiceAmount(new BigDecimal("0.18")); String memberId = orderBasicInfo.getMemberId(); // 会员id String merchantId = orderBasicInfo.getMerchantId(); // 运营商id String stationId = orderBasicInfo.getStationId(); // 站点id // 电费折扣金额 BigDecimal discountElectricityAmount = BigDecimal.ZERO; // 服务费折扣金额 BigDecimal discountServiceAmount = BigDecimal.ZERO; BigDecimal afterServiceAmountDiscount = BigDecimal.ZERO; BigDecimal afterElectricityAmountDiscount = BigDecimal.ZERO; // 查询会员在此站点会员折扣 MemberDiscountVO memberDiscountVO = memberGroupService.queryMemberDiscount(merchantId, stationId, memberId); if (memberDiscountVO != null) { BigDecimal discount = memberDiscountVO.getDiscount(); // 折扣率 String groupType = memberDiscountVO.getGroupType(); // 类型(1-服务费折扣,2-电费折扣 ,3-电费和服务费一起折扣) BigDecimal totalElectricityAmount = orderDetail.getTotalElectricityAmount(); // 电费 BigDecimal totalServiceAmount = orderDetail.getTotalServiceAmount(); // 服务费 afterServiceAmountDiscount = totalServiceAmount; afterElectricityAmountDiscount = totalElectricityAmount; if (Constants.ONE.equals(groupType)) { afterServiceAmountDiscount = totalServiceAmount.multiply(discount).setScale(4, RoundingMode.DOWN); discountServiceAmount = totalServiceAmount.subtract(afterServiceAmountDiscount); } else if (Constants.TWO.equals(groupType)) { afterElectricityAmountDiscount = totalElectricityAmount.multiply(discount).setScale(4, RoundingMode.DOWN); discountElectricityAmount = totalElectricityAmount.subtract(afterElectricityAmountDiscount); } else { // BigDecimal afterServiceAmountDiscount = totalServiceAmount.multiply(discount).setScale(2, RoundingMode.DOWN); // discountServiceAmount = totalServiceAmount.subtract(afterServiceAmountDiscount); // BigDecimal afterElectricityAmountDiscount = totalElectricityAmount.multiply(discount).setScale(2, RoundingMode.DOWN); // discountElectricityAmount = totalElectricityAmount.subtract(afterElectricityAmountDiscount); afterServiceAmountDiscount = totalServiceAmount.multiply(discount).setScale(4, RoundingMode.DOWN); afterElectricityAmountDiscount = totalElectricityAmount.multiply(discount).setScale(4, RoundingMode.DOWN); discountServiceAmount = totalServiceAmount.subtract(afterServiceAmountDiscount); discountElectricityAmount = totalElectricityAmount.subtract(afterElectricityAmountDiscount); } } // 订单折扣金额 BigDecimal discountAmount = discountServiceAmount.add(discountElectricityAmount); orderBasicInfo.setDiscountAmount(discountAmount); // 更新退款金额 = 退款金额 - 折扣金额 // BigDecimal refundAmount = orderBasicInfo.getRefundAmount().subtract(discountAmount); // 总消费金额 = 折扣后电费 + 折扣后服务费 BigDecimal totalConsumeAmount = afterServiceAmountDiscount.add(afterElectricityAmountDiscount); // 更新退款金额 BigDecimal refundAmount = orderBasicInfo.getPayAmount().subtract(totalConsumeAmount).setScale(2, RoundingMode.DOWN); orderBasicInfo.setRefundAmount(refundAmount); orderDetail.setDiscountElectricityAmount(discountElectricityAmount); orderDetail.setDiscountServiceAmount(discountServiceAmount); } @Test public void queryPaymentByOrderNoTest() { String orderNo = "C88850447008_20240415083226"; String orderCode = orderNo.substring(0, orderNo.indexOf("_")); String wechatAppId = wechatAppId1; try { // List adaPayments = adapayService.queryPaymentsByOrderNo(orderNo, wechatAppId); // System.out.println(JSON.toJSONString(adaPayments)); Set paymentInfoSet = Sets.newHashSet(); List paymentInfos = adapayService.queryPaymentInfosByOrderNo(orderNo, wechatAppId); paymentInfoSet.addAll(paymentInfos); System.out.println("1111:" + JSON.toJSONString(paymentInfos)); List orderPayRecordList = orderPayRecordService.getOrderPayRecordList(orderCode); if (CollectionUtils.isNotEmpty(orderPayRecordList)) { for (OrderPayRecord orderPayRecord : orderPayRecordList) { List paymentInfos2 = orderPayRecordService.parseDeductionRecord(orderPayRecord.getDeductionRecord()); paymentInfoSet.addAll(paymentInfos2); System.out.println("2222:" + JSON.toJSONString(paymentInfos2)); } } System.out.println("set:" + JSON.toJSONString(paymentInfoSet)); } catch (BaseAdaPayException e) { throw new RuntimeException(e); } } @Test public void checkPaymentTest() { QueryOrderDTO dto = new QueryOrderDTO(); String startTime = "2023-09-01 00:00:00"; String endTime = "2023-09-30 23:59:59"; dto.setStartTime(startTime); dto.setEndTime(endTime); try { tempService.checkPayment(dto); } catch (BaseAdaPayException e) { throw new RuntimeException(e); } } @Test public void toStringTest() { String jsonString = "{\"business\":\"00\",\"communicationVersion\":\"v1.5\",\"connectorNum\":\"01\",\"iccid\":\"89860620180085681816\",\"internetConnection\":\"00\",\"pileSn\":\"88230000000259\",\"pileType\":\"01\",\"programVersion\":\"gyk-V29\\u0000\"}"; LoginRequestData loginRequestData = JSONObject.parseObject(jsonString, LoginRequestData.class); System.out.println(loginRequestData.toString()); } /** * 单元测试,测试订单流程 */ @Test public void testTheOrderProcess() throws Exception { // 生成订单 // OrderBasicInfo orderBasicInfo = generateAnOrder(); // System.out.println(orderBasicInfo); // // 支付订单 // int a = payOrder(orderBasicInfo); // System.out.println(a); // 结算订单 OrderBasicInfo orderBasicInfo = orderBasicInfoService.getOrderInfoByOrderCode("C46006767636"); settleOrder(orderBasicInfo); // 订单退款 BigDecimal payAmount = orderBasicInfo.getPayAmount(); BigDecimal settleAmount = orderBasicInfo.getSettleAmount(); BigDecimal refundAmt = payAmount.subtract(settleAmount); // 延时分账的,可以部分解冻 memberAdapayRecordService.updateRefundAmountFromFreezeAmount("1234", refundAmt); // 实时分账,全部解冻 // memberAdapayRecordService.unfreezeAmountAndUpdateSpendAmount("test01", payAmount, refundAmt); } // 生成订单 private OrderBasicInfo generateAnOrder() throws ParseException { GenerateOrderDTO dto = new GenerateOrderDTO(); PileConnectorDetailVO vo = new PileConnectorDetailVO(); vo.setStationId("2"); dto.setPileConnector(vo); dto.setMemberId("1"); dto.setStartMode("1"); dto.setPayMode("4"); dto.setPileSn("88000000000001"); dto.setConnectorCode("01"); dto.setChargeAmount(new BigDecimal("10")); // 查询充电桩的计费模板 BillingTemplateVO billingTemplateVO = pileBillingTemplateService.selectBillingTemplateDetailByPileSn(dto.getPileSn()); dto.setBillingTemplate(billingTemplateVO); OrderBasicInfo orderBasicInfo = orderBasicInfoService.saveOrder2Database(dto); return orderBasicInfo; } // 支付订单 private int payOrder(OrderBasicInfo orderBasicInfo) throws Exception { // PayOrderDTO dto = new PayOrderDTO(); // dto.setMemberId(orderBasicInfo.getMemberId()); // dto.setOrderCode(orderBasicInfo.getOrderCode()); // dto.setStartMode(orderBasicInfo.getStartMode()); // dto.setPayMode(orderBasicInfo.getPayMode()); // dto.setPayAmount(orderBasicInfo.getPayAmount()); // // Map map = orderBasicInfoService.payOrder(dto); // return map; String paymentId = "1234"; BigDecimal amount = orderBasicInfo.getPayAmount(); String orderCode = orderBasicInfo.getOrderCode(); JSONObject json = new JSONObject(); json.put("paymentId", paymentId); json.put("amount", amount); // 记录订单支付流水 OrderPayRecord orderPayRecord = OrderPayRecord.builder() .orderCode(orderCode) .payMode(OrderPayRecordEnum.WECHATPAY_PAYMENT.getValue()) .payAmount(amount) .acquirer(AcquirerEnum.ADAPAY.getValue()) .deductionRecord(json.toJSONString()) .createBy(null) .delFlag(DelFlagEnum.NORMAL.getValue()) .build(); orderPayRecordService.batchInsert(Lists.newArrayList(orderPayRecord)); // 更新冻结金额 支付成功后全部冻结 memberAdapayRecordService.updateFreezeAmount(paymentId, amount); // 支付订单成功 PayOrderSuccessCallbackDTO callbackDTO = PayOrderSuccessCallbackDTO.builder() .orderCode(orderCode) .payAmount(amount) .payMode(OrderPayModeEnum.PAYMENT_OF_WECHATPAY.getValue()) .acquirer(AcquirerEnum.ADAPAY.getValue()) .build(); // 订单支付成功 支付回调 // orderBasicInfoService.payOrderSuccessCallback(callbackDTO); OrderBasicInfo orderInfo = orderBasicInfoService.getOrderInfoByOrderCode(callbackDTO.getOrderCode()); // 修改订单 orderInfo.setPayMode(callbackDTO.getPayMode()); orderInfo.setPayStatus(Constants.ONE); orderInfo.setPayAmount(callbackDTO.getPayAmount()); orderInfo.setPayTime(new Date()); orderInfo.setChargeStartTime(new Date()); orderInfo.setOrderStatus(OrderStatusEnum.IN_THE_CHARGING.getValue()); return orderBasicInfoService.updateOrderBasicInfo(orderInfo); } // 结算订单 private void settleOrder(OrderBasicInfo orderBasicInfo) { TransactionRecordsData data = TransactionRecordsData.builder() .transactionCode(orderBasicInfo.getTransactionCode()) .pileSn(orderBasicInfo.getPileSn()) .connectorCode(orderBasicInfo.getConnectorCode()) .startTime("2023-03-10 17:10:24") .endTime("2023-03-10 17:10:46") .sharpPrice("1.10000") .sharpUsedElectricity("2.0000") .sharpAmount("2.2000") .peakPrice("1.20000") .peakUsedElectricity("0") .peakAmount("0") .flatPrice("1.30000") .flatUsedElectricity("0") .flatAmount("0") .valleyPrice("1.40000") .valleyUsedElectricity("0") .valleyAmount("0") .totalElectricity("2") .consumptionAmount("5.3000") .vinCode("\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000") .transactionIdentifier("01") .transactionTime("2023-03-10 17:10:46") .stopReasonMsg("结束充电,APP远程停止") .logicCard("0") .createTime(new Date()) .build(); // orderBasicInfoService.settleOrder(data, orderBasicInfo); // 获取更新数据后的orderBasicInfo对象 orderBasicInfoService.returnUpdateOrderBasicInfo(orderBasicInfo, data); // 获取更新数据后的orderDetail对象/更新订单详情 查询订单详情 修改订单数据 OrderDetail orderDetail = orderBasicInfoService.returnUpdateOrderDetail(orderBasicInfo, data); // 更新数据库 OrderTransactionDTO dto = new OrderTransactionDTO(); dto.setOrderBasicInfo(orderBasicInfo); dto.setOrderDetail(orderDetail); transactionService.doUpdateOrder(dto); } public static List calculateRefund(BigDecimal totalAmount, List payments) { List refundList = new ArrayList<>(); BigDecimal remainingAmount = totalAmount; for (BigDecimal payment : payments) { if (remainingAmount.compareTo(BigDecimal.ZERO) <= 0) { // refundList.add(BigDecimal.ZERO); refundList.add(payment); } else { BigDecimal refundPerPayment = remainingAmount.min(payment); // refundList.add(refundPerPayment); refundList.add(payment.subtract(refundPerPayment)); remainingAmount = remainingAmount.subtract(refundPerPayment); } } return refundList; } /** * 测试多笔支付情况,解冻部分金额 */ @Test public void calculateUnfreezeAmountTest() { BigDecimal orderAmount = new BigDecimal("0.06"); List payRecordList = Lists.newArrayList(); // 第一笔支付记录 JSONObject jsonObject = new JSONObject(); jsonObject.put("paymentId", "002212023083114213410543206907226374144"); jsonObject.put("amount", "0.97"); JSONObject jsonObject2 = new JSONObject(); jsonObject2.put("paymentId", "002212023083114213410543206907226374144"); jsonObject2.put("amount", "1"); JSONArray jsonArray = new JSONArray(); jsonArray.add(jsonObject); jsonArray.add(jsonObject2); OrderPayRecord build = OrderPayRecord.builder() .payAmount(new BigDecimal("1.97")) .deductionRecord(jsonArray.toJSONString()) .build(); payRecordList.add(build); AbstractProgramLogic orderLogic = ProgramLogicFactory.getProgramLogic("1"); List> maps = orderLogic.calculateUnfreezeAmount(orderAmount, payRecordList); System.out.println(maps); } @Test public void unfreezeAmountAndUpdateSpendAmountTest() { String paymentId = "123"; memberAdapayRecordService.updateRefundAmount(paymentId, new BigDecimal("5")); // memberAdapayRecordService.updateRefundAmountFromFreezeAmount(paymentId, new BigDecimal("20")); // BigDecimal unfreezeAmount = new BigDecimal("32"); // BigDecimal spendAmount = new BigDecimal("10"); // memberAdapayRecordService.unfreezeAmountAndUpdateSpendAmount(paymentId, unfreezeAmount, spendAmount); // memberAdapayRecordService.updateRefundAmountFromFreezeAmount(paymentId, new BigDecimal("2")); } @Test public void getFirstLevelMerchantByMerchantIdTest() { String merchantId = "13"; PileMerchantInfo merchantInfo = pileMerchantInfoService.getFirstLevelMerchantByMerchantId(merchantId); System.out.println(JSON.toJSONString(merchantInfo)); } @Test public void queryPaymentInfoTest() throws BaseAdaPayException { String paymentId = "002212023082514501110541039779091623936"; // 在完成初始化设置情况下,调用查询方法,获取 Payment 查询结果 Map response = Payment.query(paymentId, wechatAppId1); System.out.println(response); } /** * 【用户需要换绑银行卡 1-删除结算账户信息,2-使用新账户信息创建结算账户】 * 删除结算账户信息 * @throws BaseAdaPayException */ @Test public void createDeleteSettleAccountRequestTest() throws BaseAdaPayException { String adapayMemberId = "AM40919405"; String settleAccountId = "0540761871278208"; adapayService.createDeleteSettleAccountRequest(adapayMemberId, settleAccountId, wechatAppId1); } /** * 手动变更银行卡信息 */ @Test public void createSettleAccountRequestTest() throws BaseAdaPayException { SettleAccountDTO dto = new SettleAccountDTO(); dto.setCardId("45050160425000000627"); dto.setCardName("广西昂晟节能科技有限公司"); dto.setTelNo("19163816451"); dto.setBankCode("01050000"); dto.setBankAcctType("1"); dto.setProvCode("0045"); dto.setAreaCode("4501"); String adapayMemberId = "ACM82792551"; adapayService.createSettleAccountRequest(dto, adapayMemberId, wechatAppId1); } @Test public void queryDrawcashDetailTest() throws BaseAdaPayException { String orderNo = "drawcash_1692339516947"; DrawCashDetailVO drawCashDetailVO = adapayService.queryDrawCashDetail(orderNo, wechatAppId1); System.out.println(drawCashDetailVO); } @Test public void refundOrderTest() { String orderCode = "C80410085692"; OrderBasicInfo orderBasicInfo = orderBasicInfoService.getOrderInfoByOrderCode(orderCode); String mode = pileMerchantInfoService.getDelayModeByMerchantId(orderBasicInfo.getMerchantId()); AbstractProgramLogic orderLogic = ProgramLogicFactory.getProgramLogic(mode); orderLogic.refundOrder(orderBasicInfo); } @Test public void queryPaymentConfirmListTest() { QueryPaymentConfirmDTO dto = new QueryPaymentConfirmDTO(); dto.setWechatAppId(wechatAppId1); dto.setPaymentId("002212023122208033310584061601344237568"); QueryPaymentConfirmDetailResponse response = adapayService.queryPaymentConfirmList(dto); List paymentConfirms = response.getPaymentConfirms(); // 如果没有分账信息,说明没有清分 String clearingStatus = null; if (org.springframework.util.CollectionUtils.isEmpty(paymentConfirms)) { clearingStatus = "未清分"; } else { clearingStatus = "已清分"; } System.out.println(clearingStatus); } @Test public void queryAcctFlowListTest() { QueryAcctFlowDTO dto = new QueryAcctFlowDTO(); try { dto.setPageNo(1); dto.setPageSize(100); dto.setAcctType("01"); dto.setWechatAppId(wechatAppId1); dto.setAdapayMemberId("ACM69424215"); dto.setBeginDate("20230823"); dto.setEndDate("20230823"); adapayService.queryAcctFlowList(dto); } catch (BaseAdaPayException e) { throw new RuntimeException(e); } } @Test public void testCalculateTheBalanceDeductionAmount() { String memberId = "123456"; BigDecimal amount = new BigDecimal("20"); List resultList = Lists.newArrayList(); // 查询会员的余额充值记录 按照充值时间正序 List memberAdapayRecords = Lists.newArrayList(); memberAdapayRecords.add(MemberAdapayRecord.builder().paymentId("1").balanceAmt(new BigDecimal("50")).build()); memberAdapayRecords.add(MemberAdapayRecord.builder().paymentId("2").balanceAmt(new BigDecimal("60")).build()); memberAdapayRecords.add(MemberAdapayRecord.builder().paymentId("3").balanceAmt(new BigDecimal("10")).build()); // 定义一个临时金额等于消费金额 BigDecimal tempAmount = new BigDecimal(amount.toString()); for (MemberAdapayRecord memberAdapayRecord : memberAdapayRecords) { // 该笔支付剩余金额 取出一笔判断是否剩余金额够支付订单消费吗 BigDecimal balanceAmt = memberAdapayRecord.getBalanceAmt(); // 该笔支付扣除金额 BigDecimal deductionAmount; // 获取延时分账模式 延时分账的使用撤销方法退款,实时分账的使用退款方法 // AdapayCallbackRecord callbackRecord = adapayCallbackRecordService.selectByPaymentId(memberAdapayRecord.getPaymentId()); // String payMode = null; // if (callbackRecord != null) { // JSONObject expendJsonObject = JSON.parseObject(callbackRecord.getExpend()); // payMode = expendJsonObject.getString("payMode"); // } // 消费金额 - 剩余金额 tempAmount = tempAmount.subtract(balanceAmt); if (tempAmount.compareTo(BigDecimal.ZERO) >= 0) { // 计算以后,大于等于0,说明这笔支付剩余金额需要扣完 deductionAmount = balanceAmt; BalanceDeductionAmountVO build = BalanceDeductionAmountVO.builder() .memberId(memberId) .paymentId(memberAdapayRecord.getPaymentId()) .deductionAmount(deductionAmount) .build(); resultList.add(build); } else { // 如果小于0,则说明剩余的钱用不完,扣除金额等于消费金额,并结束循环 deductionAmount = balanceAmt.add(tempAmount); BalanceDeductionAmountVO build = BalanceDeductionAmountVO.builder() .memberId(memberId) .paymentId(memberAdapayRecord.getPaymentId()) .deductionAmount(deductionAmount) .build(); resultList.add(build); break; } } System.out.println(JSON.toJSONString(resultList)); } @Test public void testGenerateOccupyPileOrder() { String memberId = "67569684"; String pileSn = "88230000000135"; String connectorCode = "01"; GenerateOccupyOrderDTO dto = new GenerateOccupyOrderDTO(); dto.setMemberId(memberId); dto.setPileSn(pileSn); dto.setConnectorCode(connectorCode); orderPileOccupyService.generateOccupyPileOrder(dto); } @Test public void testQueryConfirmReverse() throws BaseAdaPayException { QueryConfirmReverseDTO dto = QueryConfirmReverseDTO.builder() .paymentConfirmId("0022120231023104957990562360205131259904") .wechatAppId(wechatAppId1) .build(); adapayService.queryConfirmReverse(dto); } @Test public void testStopOccupyPileOrder() { String wechatAppId = "54135135"; AbstractAdapayConfig config = AdapayConfigFactory.getConfig(wechatAppId); System.out.println(JSON.toJSONString(config)); AbstractAdapayConfig config2 = AdapayConfigFactory.getConfig(wechatAppId1); System.out.println(JSON.toJSONString(config2)); } // 需要重新分账的订单信息(针对未分账的订单) public JSONArray getPaymentList() { String jsonArrayString = "[" + "{\"orderCode\":\"C67926008811\", \"settleAmount\":\"14.91\", \"paymentId\":\"002212024020312191210599708616768860160\"}" + "{\"orderCode\":\"C42430351162\", \"settleAmount\":\"29.91\", \"paymentId\":\"002212024020417400510600151759191855104\"}" + "{\"orderCode\":\"C46840673835\", \"settleAmount\":\"49.91\", \"paymentId\":\"002212024020508232410600374051907993600\"}" + "{\"orderCode\":\"C80418255104\", \"settleAmount\":\"49.91\", \"paymentId\":\"002212024020519172410600538637863464960\"}" + "{\"orderCode\":\"C27663220132\", \"settleAmount\":\"49.92\", \"paymentId\":\"002212024020615260710600842821125234688\"}" + "{\"orderCode\":\"C46848081446\", \"settleAmount\":\"24.36\", \"paymentId\":\"002212024020708224510601098662578515968\"}" + "{\"orderCode\":\"C61630340544\", \"settleAmount\":\"49.91\", \"paymentId\":\"002212024020813363810601540042416410624\"}" + "{\"orderCode\":\"C80011863345\", \"settleAmount\":\"14.91\", \"paymentId\":\"002212024021416374510603759951855538176\"}" + "{\"orderCode\":\"C25198228680\", \"settleAmount\":\"4.91\", \"paymentId\":\"002212024021513502010604080206798815232\"}" + "{\"orderCode\":\"C29771066410\", \"settleAmount\":\"49.92\", \"paymentId\":\"002212024021719245910604889199513939968\"}" + "{\"orderCode\":\"C29391457129\", \"settleAmount\":\"9.90\", \"paymentId\":\"002212024022016543010605938491023716352\"}" + "]"; return JSONArray.parseArray(jsonArrayString); } /** * 批量执行分账 */ @Test public void batchCreatePaymentConfirm() { JSONArray paymentList = getPaymentList(); // TODO 获取默认结算账户,如需分给对应商户就填写正确的汇付会员id // AdapayMemberAccount adapayMemberAccount = adapayMemberAccountService.getDefault(); AdapayMemberAccount adapayMemberAccount = new AdapayMemberAccount(); adapayMemberAccount.setAdapayMemberId("ACM21943395"); for (int i = 0; i < paymentList.size(); i++) { JSONObject jsonObject = (JSONObject) paymentList.get(i); BigDecimal confirmAmt = jsonObject.getBigDecimal("settleAmount"); // 确认金额就是结算金额 String paymentId = jsonObject.getString("paymentId"); // 支付id String orderCode = jsonObject.getString("orderCode"); // 订单编号 // 延时分账,使用确认交易API PaymentConfirmResponse paymentConfirmResponse = adapayService.createPaymentConfirmRequest(paymentId, adapayMemberAccount, confirmAmt, orderCode, wechatAppId1); System.out.println(JSON.toJSONString(paymentConfirmResponse)); } } /** * 查询分账信息 * @throws BaseAdaPayException */ @Test public void queryCreateConfirmReverse() throws BaseAdaPayException { List paymentIdList = getPaymentIdList(); // 查询分账信息 List unSplitList = Lists.newArrayList(); // 未分帐 List splitList = Lists.newArrayList(); // 已分帐 BigDecimal total = BigDecimal.ZERO; List selfList = Lists.newArrayList(); Map map = Maps.newHashMap(); for (String paymentId : paymentIdList) { if (StringUtils.isBlank(paymentId)) { continue; } // 查询支付确认id QueryPaymentConfirmDTO dto = new QueryPaymentConfirmDTO(); dto.setPaymentId(paymentId); dto.setWechatAppId(wechatAppId1); // 查询分账信息 QueryPaymentConfirmDetailResponse response = adapayService.queryPaymentConfirmList(dto); if (response != null) { List confirms = response.getPaymentConfirms(); if (CollectionUtils.isEmpty(confirms)) { unSplitList.add(paymentId); } else { splitList.add(paymentId); for (QueryPaymentConfirmDetailResponse.PaymentConfirmInfo confirm : confirms) { if (queryConfirmReverseStatus(confirm)) { System.out.println("支付确认id:" + confirm.getId() + "撤销了。。。"); continue; } JSONObject jsonObject = JSON.parseObject(confirm.getDescription()); String adapayMemberId = jsonObject.getString("adapayMemberId"); BigDecimal confirmedAmt = new BigDecimal(confirm.getConfirmedAmt()); total = total.add(confirmedAmt); // 放map map.merge(adapayMemberId, confirmedAmt, BigDecimal::add); if (StringUtils.equals(adapayMemberId, "0")) { selfList.add(paymentId); } } } } else { unSplitList.add(paymentId); } } System.out.println("=================未分账:" + JSON.toJSONString(unSplitList) + ", 数量:" + unSplitList.size()); System.out.println("=================已分账:" + JSON.toJSONString(map) + ", 总分账:" + total + ", 数量:" + splitList.size()); System.out.println("=================自己:" + JSON.toJSONString(selfList) + ", 数量:" + selfList.size()); } private boolean queryConfirmReverseStatus(QueryPaymentConfirmDetailResponse.PaymentConfirmInfo confirm) throws BaseAdaPayException { boolean result = false; QueryConfirmReverseDTO dto = QueryConfirmReverseDTO.builder() .paymentConfirmId(confirm.getId()) .wechatAppId(wechatAppId1) .build(); ConfirmReverseResponse confirmReverseResponse = adapayService.queryConfirmReverse(dto); if (confirmReverseResponse.isSuccess()) { result = true; } return result; } /** * 延迟分账未确认调撤销调撤销接口退款/部分退 */ @Test public void createPaymentReverseRequestTest() { String paymentId = "002212024080610282310666722484828160000"; BigDecimal refundAmount = new BigDecimal("20.28"); String memberId = "25994783"; String orderCode = "C61883385858"; // 延迟分账未确认调撤销调撤销接口退款 PaymentReverseOperation operation = new PaymentReverseOperation(); operation.setPaymentId(paymentId); operation.setReverseAmt(refundAmount); operation.setMerchantKey(wechatAppId1); operation.setMemberId(memberId); operation.setScenarioType(ScenarioEnum.ORDER.getValue()); operation.setOrderCode(orderCode); PaymentReverseResponse response = adapayService.createPaymentReverseRequest(operation); System.out.println(JSON.toJSONString(response)); } /** * 测试创建退款请求 */ @Test public void createRefundRequestTest() { String paymentId = "0022120231226155420105856296289509498883333"; BigDecimal refundAmount = new BigDecimal("11.62"); String memberId = "46487809"; String orderCode = "C80414417003"; // 调汇付的交易退款接口 RefundResponse response = adapayService.createRefundRequest(paymentId, refundAmount, wechatAppId2, memberId, ScenarioEnum.ORDER.getValue(), orderCode); System.out.println(JSON.toJSONString(response)); } /** * 批量支付确认撤销 * @throws BaseAdaPayException */ @Test public void testCreateConfirmReverse() throws BaseAdaPayException { List list = getPaymentIdList(); // 批量支付确认撤销 for (String paymentId : list) { // 查询支付确认id QueryPaymentConfirmDTO dto = new QueryPaymentConfirmDTO(); dto.setPaymentId(paymentId); dto.setWechatAppId(wechatAppId1); QueryPaymentConfirmDetailResponse response = adapayService.queryPaymentConfirmList(dto); if (response != null) { List confirms = response.getPaymentConfirms(); System.out.println("支付id:" + paymentId + ", 确认信息:" + JSON.toJSONString(confirms)); if (CollectionUtils.isNotEmpty(confirms)) { for (QueryPaymentConfirmDetailResponse.PaymentConfirmInfo confirm : confirms) { adapayService.createConfirmReverse(confirm.getId(), wechatAppId1); } } } } } /** * 查询撤销列表 * @throws BaseAdaPayException */ @Test public void queryPaymentReverseListTest() throws BaseAdaPayException { JSONArray jsonList = getJsonList(); List idList = Lists.newArrayList(); for (int i = 0; i < jsonList.size(); i++) { JSONObject jsonObject = (JSONObject) jsonList.get(i); // System.out.println(JSON.toJSONString()); BigDecimal refundAmount = jsonObject.getBigDecimal("refundAmount"); String paymentId = jsonObject.getString("paymentId"); adapayService.createPaymentReverseRequest(paymentId, refundAmount, wechatAppId1, "", ScenarioEnum.ORDER.getValue(), ""); } System.out.println("需要撤销idList:" + idList); } public JSONArray getJsonList() { String jsonArrayString = "[{\"refundAmount\":\"354.84\", \"paymentId\":\"002212023102509474610563069333816762368\"}]"; JSONArray jsonArray = JSONArray.parseArray(jsonArrayString); return jsonArray; } private List getPaymentIdList1() { List list = Lists.newArrayList(); list.add("002212024063019153910653446823208845312"); list.add("002212024063019333910653451354565480448"); list.add("002212024063020120010653461003825848320"); list.add("002212024063020164610653462203656101888"); list.add("002212024063021540510653486694827216896"); list.add("002212024063022090910653490489297354752"); list.add("002212024063023152510653507166029918208"); list.add("002212024070100032010653519223591591936"); list.add("002212024070100070510653520164398272512"); list.add("002212024070100100910653520939317780480"); list.add("002212024070101520910653546608303972352"); list.add("002212024070107295910653631624618889216"); list.add("002212024070108141010653642747079180288"); list.add("002212024070109504010653667030322298880"); list.add("002212024070111252110653690855937368064"); list.add("002212024070112022410653700181202190336"); list.add("002212024070114425510653740575734018048"); list.add("002212024070117300010653782623067541504"); list.add("002212024070117420010653785643043704832"); list.add("002212024070118002210653790265628086272"); list.add("002212024070119182010653809888832753664"); list.add("002212024070119363410653814474845339648"); list.add("002212024070120195710653825394154700800"); list.add("002212024070121081110653837532633198592"); list.add("002212024070122582010653865253213540352"); list.add("002212024070123234110653871633297018880"); list.add("002212024070123250310653871977170296832"); list.add("002212024070200003010653880896310394880"); list.add("002212024070200085910653883033759162368"); list.add("002212024070200300810653888354992791552"); list.add("002212024070208370510654010898954469376"); list.add("002212024070210403310654041973098725376"); list.add("002212024070211281710654053983767203840"); list.add("002212024070211551710654060777452396544"); list.add("002212024070211594410654061899120934912"); list.add("002212024070213274310654084039234379776"); list.add("002212024070215594910654122315480485888"); list.add("002212024070217441810654148612768575488"); list.add("002212024070217501510654150108051107840"); list.add("002212024070218042710654153683651616768"); list.add("002212024070218285810654159850489430016"); list.add("002212024070218333910654161030190116864"); list.add("002212024070218511810654165472050327552"); list.add("002212024070219210810654172982117371904"); list.add("002212024070220350910654191607741448192"); list.add("002212024070221574610654212396526522368"); list.add("002212024070222331610654221330641330176"); list.add("002212024070222423010654223656797429760"); list.add("002212024070222484110654225211178000384"); list.add("002212024070223093010654230450027110400"); list.add("002212024070300391810654253051071258624"); list.add("002212024070301091910654260603666358272"); list.add("002212024070307070010654350616367173632"); list.add("002212024070308093310654366360100323328"); list.add("002212024070313312810654447370082865152"); list.add("002212024070313331010654447800708177920"); list.add("002212024070313410210654449777592664064"); list.add("002212024070313412210654449862338576384"); list.add("002212024070315331910654478037165064192"); list.add("002212024070316305710654492540400992256"); list.add("002212024070316321810654492878030213120"); list.add("002212024070317494010654512352134430720"); list.add("002212024070317585210654514664594317312"); list.add("002212024070317595310654514920050614272"); list.add("002212024070318205410654520211465994240"); list.add("002212024070318304310654522682393120768"); list.add("002212024070318453010654526401123450880"); list.add("002212024070318464410654526710800498688"); list.add("002212024070319151110654533871735717888"); list.add("002212024070319205510654535312017399808"); list.add("002212024070319410910654540406954569728"); list.add("002212024070320055210654546626492547072"); list.add("002212024070320075510654547139866599424"); list.add("002212024070320494410654557664153866240"); list.add("002212024070322065210654577075991044096"); list.add("002212024070322463310654587064410398720"); list.add("002212024070322500410654587946865631232"); list.add("002212024070323055310654591927182647296"); list.add("002212024070323083110654592592834088960"); list.add("002212024070323182210654595071746613248"); list.add("002212024070400043510654606700514279424"); list.add("002212024070401070110654622413509582848"); list.add("002212024070411202610654776785829150720"); list.add("002212024070411452510654783073156247552"); list.add("002212024070414215310654822445935337472"); list.add("002212024070415295710654839576183922688"); list.add("002212024070415352210654840942190563328"); list.add("002212024070415533810654845536025968640"); list.add("002212024070416200710654852201766096896"); list.add("002212024070417134910654865715534544896"); list.add("002212024070417244110654868449402511360"); list.add("002212024070418125410654880586149617664"); list.add("002212024070418211110654882671140974592"); list.add("002212024070418221110654882919225192448"); list.add("002212024070418531410654890734787076096"); list.add("002212024070419015410654892917545984000"); list.add("002212024070419271510654899294473785344"); list.add("002212024070420544210654921301937737728"); list.add("002212024070422553510654951724405956608"); list.add("002212024070422585010654952541457440768"); list.add("002212024070423031110654953637526859776"); list.add("002212024070500321510654976053021728768"); list.add("002212024070507361410655082748140490752"); list.add("002212024070507414910655084155359305728"); list.add("002212024070507540210655087229685989376"); list.add("002212024070508461810655100382228094976"); list.add("002212024070509343710655112542049214464"); list.add("002212024070509372810655113259535613952"); list.add("002212024070512023910655149796289646592"); list.add("002212024070512182110655153748099960832"); list.add("002212024070513131710655167572507729920"); list.add("002212024070516282010655216656372092928"); list.add("002212024070517193210655229540392153088"); list.add("002212024070517242110655230753206145024"); list.add("002212024070518071010655241528445198336"); list.add("002212024070518234510655245703651835904"); list.add("002212024070518331910655248109020557312"); list.add("002212024070519112710655257706414387200"); list.add("002212024070519125410655258073885941760"); list.add("002212024070519240710655260893953613824"); list.add("002212024070519255010655261328764526592"); list.add("002212024070519303310655262514976915456"); list.add("002212024070519330510655263150606909440"); list.add("002212024070519392610655264748257562624"); list.add("002212024070520405010655280199963615232"); list.add("002212024070521091010655287331636322304"); list.add("002212024070521111110655287840426328064"); list.add("002212024070521545210655298833732075520"); list.add("002212024070522281210655307219839967232"); list.add("002212024070522334310655308609772818432"); list.add("002212024070522413110655310572729257984"); list.add("002212024070522484310655312385309196288"); list.add("002212024070600115910655333338944000000"); list.add("002212024070601465610655357233207402496"); list.add("002212024070608150310655454906787037184"); list.add("002212024070609443210655477425073000448"); list.add("002212024070609470210655478055367917568"); list.add("002212024070610025010655482031497805824"); list.add("002212024070610133310655484726802616320"); list.add("002212024070611124110655499611523194880"); list.add("002212024070611492310655508845049634816"); list.add("002212024070612244210655517734433681408"); list.add("002212024070612522810655524719983185920"); list.add("002212024070615224910655562557442396160"); list.add("002212024070616444310655583170279395328"); list.add("002212024070617184010655591713568108544"); list.add("002212024070617594610655602054681550848"); list.add("002212024070618121310655605190602571776"); list.add("002212024070618280810655609193977581568"); list.add("002212024070618344710655610866438918144"); list.add("002212024070619121910655620313005850624"); list.add("002212024070619292710655624624479141888"); list.add("002212024070620475410655644368126713856"); list.add("002212024070621285010655654667959623680"); list.add("002212024070622032910655663388524433408"); list.add("002212024070622133210655665917259415552"); list.add("002212024070622494410655675027426115584"); list.add("002212024070622531710655675919249608704"); list.add("002212024070622532710655675964148113408"); list.add("002212024070623375810655687168240619520"); list.add("002212024070623571010655691996148473856"); list.add("002212024070701064310655709501076217856"); list.add("002212024070703170210655742298149986304"); list.add("002212024070711241010655864885930844160"); list.add("002212024070711333910655867272184057856"); list.add("002212024070711391210655868668839624704"); list.add("002212024070711464610655870576101601280"); list.add("002212024070712342910655882584466964480"); list.add("002212024070713145110655892741667278848"); list.add("002212024070714180110655908638340378624"); list.add("002212024070714182810655908749871321088"); list.add("002212024070714255410655910621177098240"); list.add("002212024070714581210655918751400493056"); list.add("002212024070715042010655920295677222912"); list.add("002212024070716433010655945250131255296"); list.add("002212024070716563110655948526360162304"); list.add("002212024070717073910655951327763152896"); list.add("002212024070717275510655956430003945472"); list.add("002212024070719105510655982349233311744"); list.add("002212024070720000710655994729787527168"); list.add("002212024070720065010655996419065630720"); list.add("002212024070720230310656000500815364096"); list.add("002212024070720231410656000549828632576"); list.add("002212024070720412810656005137347293184"); list.add("002212024070720524610656007981028315136"); list.add("002212024070721025310656010527680757760"); list.add("002212024070721263210656016476817637376"); list.add("002212024070722111310656027721786421248"); list.add("002212024070723320610656048078178660352"); list.add("002212024070800244810656061338556272640"); list.add("002212024070801101010656072755464343552"); list.add("002212024070801284310656077424099065856"); list.add("002212024070812511910656249205153554432"); list.add("002212024070812555110656250349805801472"); list.add("002212024070813190810656256205966327808"); list.add("002212024070814440510656277585945124864"); list.add("002212024070818265710656333670815485952"); list.add("002212024070818324110656335114252750848"); list.add("002212024070818340910656335483692851200"); list.add("002212024070818375310656336421887311872"); list.add("002212024070819095910656344502896340992"); list.add("002212024070819114910656344964292460544"); list.add("002212024070819185610656346755184693248"); list.add("002212024070819243810656348187279462400"); list.add("002212024070819390110656351807508783104"); list.add("002212024070821202610656377331394506752"); list.add("002212024070822141410656390870672564224"); list.add("002212024070822155610656391296960634880"); list.add("002212024070822260210656393837772189696"); list.add("002212024070822443310656398499647442944"); list.add("002212024070822531210656400677518401536"); list.add("002212024070823373910656411861952978944"); list.add("002212024070823463010656414091182231552"); list.add("002212024070823524210656415649555595264"); list.add("002212024070912035710656599673915797504"); list.add("002212024070912201710656603786087604224"); list.add("002212024070915434410656654984798711808"); list.add("002212024070918170510656693575173496832"); list.add("002212024070918214610656694754481741824"); list.add("002212024070918274610656696263882096640"); list.add("002212024070918512910656702233019113472"); list.add("002212024070918514810656702312949190656"); list.add("002212024070919005010656704585385349120"); list.add("002212024070919120010656707395706834944"); list.add("002212024070919460810656715984938586112"); list.add("002212024070919473210656716339923083264"); list.add("002212024070919540110656717971815313408"); list.add("002212024070920050110656720739976454144"); list.add("002212024070920484110656731726689861632"); list.add("002212024070921292110656741961891745793"); list.add("002212024070921480410656746673746595840"); list.add("002212024070922272610656756578458640384"); list.add("002212024070922525910656763011069554688"); list.add("002212024070923393210656774725237637120"); list.add("002212024070923544210656778540210192384"); list.add("002212024071000383510656789584638902272"); list.add("002212024071010133010656934265967042560"); list.add("002212024071011060810656947514322423808"); list.add("002212024071012221210656966657260175360"); list.add("002212024071012302010656968702566031360"); list.add("002212024071013083510656978329889058816"); list.add("002212024071015563010657020587005562880"); list.add("002212024071016040010657022473409445888"); list.add("002212024071017292010657043947560738816"); list.add("002212024071017373010657046004543426560"); list.add("002212024071018230510657057476182970368"); list.add("002212024071018362410657060823931191296"); list.add("002212024071019002110657066853582655488"); list.add("002212024071019174310657071222014869504"); list.add("002212024071020144710657085583465877504"); list.add("002212024071020395010657091890486648832"); list.add("002212024071021072710657098839364636672"); list.add("002212024071021162410657101090939895808"); list.add("002212024071021375810657106519018090496"); list.add("002212024071021391210657106827129872384"); list.add("002212024071022223010657117725882015744"); list.add("002212024071023350710657136000491229184"); list.add("002212024071100112610657145139130765312"); list.add("002212024071109021710657278734080118784"); list.add("002212024071111034110657309285941104640"); list.add("002212024071112520110657336548354646016"); list.add("002212024071113385310657348339878768640"); list.add("002212024071115045910657370007443517440"); list.add("002212024071115192510657373640100581376"); list.add("002212024071115511710657381659649204224"); list.add("002212024071116221610657389459108839424"); list.add("002212024071117413510657409419432124416"); list.add("002212024071117584910657413755782991872"); list.add("002212024071118531310657427446852374528"); list.add("002212024071119012510657429507929165824"); list.add("002212024071119212510657434542920171520"); list.add("002212024071119282410657436301489807360"); list.add("002212024071119335110657437672744587264"); list.add("002212024071119394610657439158669053952"); list.add("002212024071119395910657439214293913600"); list.add("002212024071120585810657459093215793152"); list.add("002212024071121435210657470389454344192"); list.add("002212024071122154510657478413626028032"); list.add("002212024071122513010657487413303808000"); list.add("002212024071123561410657503703519944704"); list.add("002212024071200340710657513234679115776"); list.add("002212024071202043410657536000580612096"); list.add("002212024071204333010657573477580443648"); list.add("002212024071211323310657678935035699200"); list.add("002212024071211380410657680324959830016"); list.add("002212024071213554910657714989515104256"); list.add("002212024071214010010657716296226398208"); list.add("002212024071217172810657765737572249600"); list.add("002212024071217182110657765957822173184"); list.add("002212024071218094110657778878196183041"); list.add("002212024071218144710657780159988068352"); list.add("002212024071218570810657790818915876864"); list.add("002212024071219324010657799762957209600"); list.add("002212024071219400110657801610545221632"); list.add("002212024071220132610657810021746913280"); list.add("002212024071220210810657811957216407552"); list.add("002212024071221381110657831350571474944"); list.add("002212024071221551810657835654929354752"); list.add("002212024071222421510657847470173151232"); list.add("002212024071222583910657851600559046656"); list.add("002212024071223510910657864810678603776"); list.add("002212024071300200310657872082335666176"); list.add("002212024071300404210657877282689286144"); list.add("002212024071300583010657881761235968000"); list.add("002212024071302302910657904909738156032"); list.add("002212024071307403610657982953855766528"); list.add("002212024071309591010658017822784200704"); list.add("002212024071312015010658048692860080128"); list.add("002212024071312380310658057806120980480"); list.add("002212024071316233510658114564513452032"); list.add("002212024071316254810658115121511026688"); list.add("002212024071316445110658119918843379712"); list.add("002212024071317335010658132244744523776"); list.add("002212024071317541010658137359831638016"); list.add("002212024071319373410658163382800240640"); list.add("002212024071319502610658166621430575104"); list.add("002212024071320183010658173685240401920"); list.add("002212024071320260710658175600118902784"); list.add("002212024071320341010658177625419988992"); list.add("002212024071320384010658178759129993216"); list.add("002212024071320542710658182730569650176"); list.add("002212024071320555710658183108601053184"); list.add("002212024071321021310658184687082713088"); list.add("002212024071322073110658201118324867072"); list.add("002212024071322103610658201895744425984"); list.add("002212024071322104610658201937978433536"); list.add("002212024071322242710658205378722357248"); list.add("002212024071322383910658208953166929920"); list.add("002212024071323065510658216065751580672"); list.add("002212024071323201810658219435336974336"); list.add("002212024071323534810658227866867773440"); list.add("002212024071401135710658248034367266816"); list.add("002212024071402574710658274165264183296"); list.add("002212024071409464210658377075400003584"); list.add("002212024071410333610658388877494882304"); list.add("002212024071411305410658403297631100928"); list.add("002212024071415143610658459592126996480"); list.add("002212024071416203610658476203262287872"); list.add("002212024071416290210658478325575602176"); list.add("002212024071416330210658479331466170368"); list.add("002212024071416442310658482188440481792"); list.add("002212024071417222310658491748499324928"); list.add("002212024071417463110658497824297807872"); list.add("002212024071418095210658503700136697856"); list.add("002212024071418241910658507337462292480"); list.add("002212024071418520910658514340199268352"); list.add("002212024071419065410658518053344296960"); list.add("002212024071419093610658518730817785856"); list.add("002212024071420000910658531454371991552"); list.add("002212024071420440110658542494894174208"); list.add("002212024071421410710658556864312266752"); list.add("002212024071421533610658560004148953088"); list.add("002212024071421534710658560051303829504"); list.add("002212024071422205310658566870639534080"); list.add("002212024071422292510658569018839027712"); list.add("002212024071422293510658569058408697856"); list.add("002212024071422483210658573829309059072"); list.add("002212024071423385310658586499360448512"); list.add("002212024071500084010658593995683635200"); list.add("002212024071501090910658609217545293824"); list.add("002212024071511161410658761994496540672"); list.add("002212024071513280410658795172632420352"); list.add("002212024071513441810658799254744453120"); list.add("002212024071514134010658806644448399360"); list.add("002212024071514322410658811358983069696"); list.add("002212024071516152310658837279305076736"); list.add("002212024071516571010658847792281640960"); list.add("002212024071517344110658857233118822400"); list.add("002212024071518335110658872124857171968"); list.add("002212024071519145310658882450216890368"); list.add("002212024071519151110658882526294532096"); list.add("002212024071519251010658885039130062848"); list.add("002212024071519270910658885535523086336"); list.add("002212024071519303010658886379672903680"); list.add("002212024071520292110658901191358373888"); list.add("002212024071521030510658909677543014400"); list.add("002212024071522295810658931544999493632"); list.add("002212024071522424710658934770277769216"); list.add("002212024071523074010658941031189741568"); list.add("002212024071600000410658954218836901888"); list.add("002212024071603434610659010515370684416"); list.add("002212024071606254010659051257723785216"); list.add("002212024071606312010659052682687021056"); list.add("002212024071611313710659128254829215744"); list.add("002212024071611474810659132327465963520"); list.add("002212024071613412510659160920036331520"); list.add("002212024071614202210659170718330302464"); list.add("002212024071614455310659177142450769920"); list.add("002212024071616120110659198817581924352"); list.add("002212024071617402210659221053621665792"); list.add("002212024071618360110659235057642184704"); list.add("002212024071618581310659240642243567616"); list.add("002212024071620560710659270313064173568"); list.add("002212024071621181610659275887985033216"); list.add("002212024071621183310659275958260293632"); list.add("002212024071621225310659277048132362240"); list.add("002212024071622011010659286684718043136"); list.add("002212024071622283510659293584995241984"); list.add("002212024071623282610659308644488142848"); list.add("002212024071623480510659313589164646400"); list.add("002212024071700220910659322163814879232"); list.add("002212024071700535410659330153477775360"); list.add("002212024071707214210659427746084458496"); list.add("002212024071708594610659452427842617344"); list.add("002212024071711003510659482829413117952"); list.add("002212024071712094910659500253107081216"); list.add("002212024071712183410659502455532601344"); list.add("002212024071713530510659526239962578944"); list.add("002212024071714262810659534643640029184"); list.add("002212024071716220510659563737027678208"); list.add("002212024071717502710659585976355422208"); list.add("002212024071717541810659586948200550400"); list.add("002212024071718140210659591910154731520"); list.add("002212024071718261510659594987159101440"); list.add("002212024071718285910659595676147216384"); list.add("002212024071718385110659598156935901184"); list.add("002212024071718462610659600064509554688"); list.add("002212024071718561810659602547476238336"); list.add("002212024071719115810659606489581707265"); list.add("002212024071719263910659610186310455296"); list.add("002212024071719275610659610511448432640"); list.add("002212024071719532810659616936728170496"); list.add("002212024071719543310659617209810993152"); list.add("002212024071720280610659625649236770816"); list.add("002212024071720333810659627042321727488"); list.add("002212024071720421310659629204341755904"); list.add("002212024071721111310659636502437666816"); list.add("002212024071721593710659648680759861248"); list.add("002212024071722022710659649394210971648"); list.add("002212024071722451410659660160519536640"); list.add("002212024071723043810659665046152114176"); list.add("002212024071723083410659666033322491904"); list.add("002212024071800142710659682613491306496"); list.add("002212024071800571210659693370750214144"); list.add("002212024071802195510659714189578956800"); list.add("002212024071812473910659872164945903616"); list.add("002212024071813220610659880830803808256"); list.add("002212024071814462810659902064822030336"); list.add("002212024071816351710659929448841175040"); list.add("002212024071817535710659949244943396864"); list.add("002212024071817582210659950358319030272"); list.add("002212024071818334610659959267898687489"); list.add("002212024071818483310659962988370812928"); list.add("002212024071819032810659966741164240896"); list.add("002212024071819242610659972015167315968"); list.add("002212024071819394310659975862358790144"); list.add("002212024071820260210659987517399076864"); list.add("002212024071820324410659989203875385344"); list.add("002212024071821363610660005278326939648"); list.add("002212024071821381710660005699964858368"); list.add("002212024071821400910660006171053805568"); list.add("002212024071821434910660007095399399424"); list.add("002212024071822152910660015062249082880"); list.add("002212024071823502310660038944565121024"); list.add("002212024071823554310660040288344625152"); list.add("002212024071901330110660064775793647616"); list.add("002212024071908362310660171316458123264"); list.add("002212024071910070310660194134058074112"); list.add("002212024071912325810660230856912101376"); list.add("002212024071912510610660235418379923456"); list.add("002212024071912533010660236023805366272"); list.add("002212024071914133210660256164214112256"); list.add("002212024071915062610660269477543239680"); list.add("002212024071915423610660278578141376512"); list.add("002212024071916085410660285196926353408"); list.add("002212024071917520310660311154555666432"); list.add("002212024071918313710660321113217404928"); list.add("002212024071918345710660321951587139584"); list.add("002212024071919112210660331117254279168"); list.add("002212024071919164110660332454306119680"); list.add("002212024071919283610660335453217918976"); list.add("002212024071919334110660336731753504768"); list.add("002212024071919431410660339134941831168"); list.add("002212024071919432810660339194256531456"); list.add("002212024071920091210660345672701313024"); list.add("002212024071920154110660347300766244864"); list.add("002212024071920223610660349042645901312"); list.add("002212024071921470610660370309860970496"); list.add("002212024071922233010660379466675695616"); list.add("002212024071922301010660381147116228608"); list.add("002212024071922560310660387658671693825"); list.add("002212024071923210310660393951240331264"); list.add("002212024072001563710660433101498777600"); list.add("002212024072008340510660533125984202752"); list.add("002212024072010335110660563267700805632"); list.add("002212024072010385610660564544769073152"); list.add("002212024072010411310660565122622529536"); list.add("002212024072011052010660571188585873408"); list.add("002212024072011552210660583781464236032"); list.add("002212024072011555710660583928339677184"); list.add("002212024072013572910660614512231366656"); list.add("002212024072014424810660625916837466112"); list.add("002212024072015510710660643111617110016"); list.add("002212024072016435810660656410357051392"); list.add("002212024072017321210660668547296620544"); list.add("002212024072017511710660673352314359808"); list.add("002212024072018195710660680562863726592"); list.add("002212024072019311810660698519623143424"); list.add("002212024072021184910660725578040832000"); list.add("002212024072022060610660737478827663360"); list.add("002212024072022095110660738422694383616"); list.add("002212024072022285410660743215805366272"); list.add("002212024072022434410660746945973559296"); list.add("002212024072101061510660782811850182656"); list.add("002212024072101415610660791794814595072"); list.add("002212024072108352310660895839786311680"); list.add("002212024072109241810660908150468497408"); list.add("002212024072111115210660935222133784576"); list.add("002212024072111190310660937031436382208"); list.add("002212024072112101910660949930262884352"); list.add("002212024072112103410660949993850638336"); list.add("002212024072112172110660951702897594368"); list.add("002212024072114130110660980811018010624"); list.add("002212024072114411210660987900811956224"); list.add("002212024072114580110660992134161047552"); list.add("002212024072116463310661019446894366720"); list.add("002212024072117135610661026337405698048"); list.add("002212024072117203210661028001354309632"); list.add("002212024072117523610661036069702033408"); list.add("002212024072117534110661036340577800192"); list.add("002212024072118293110661045361061969920"); list.add("002212024072119335810661061580418076672"); list.add("002212024072119364710661062289260331008"); list.add("002212024072119370910661062379868172288"); list.add("002212024072121453010661094681760387072"); list.add("002212024072122025410661099061711646720"); list.add("002212024072122475510661110387772448768"); list.add("002212024072123500110661126014958792704"); list.add("002212024072200060910661130077043736576"); list.add("002212024072200405110661138810633162752"); list.add("002212024072200455010661140061427240960"); list.add("002212024072211055510661296112135413760"); list.add("002212024072211192110661299494831640576"); list.add("002212024072212401410661319848941703168"); list.add("002212024072213072510661326687296077824"); list.add("002212024072213424910661335598480433152"); list.add("002212024072214205510661345186060656640"); list.add("002212024072214360110661348986164310016"); list.add("002212024072217462910661396919777718272"); list.add("002212024072218295610661407851657142272"); list.add("002212024072219034810661416374111789056"); list.add("002212024072219253410661421855267524608"); list.add("002212024072220000510661430540861878272"); list.add("002212024072220244310661436740307431424"); list.add("002212024072220341810661439151171031040"); list.add("002212024072220444710661441787717443584"); list.add("002212024072220504010661443267925426176"); list.add("002212024072220570110661444866881839104"); list.add("002212024072222121310661463790457397248"); list.add("002212024072222204810661465951628427264"); list.add("002212024072222343410661469418185719808"); list.add("002212024072223223110661481482059689984"); list.add("002212024072300460410661502509520146432"); list.add("002212024072308211510661617060238065664"); list.add("002212024072308461010661623330723762176"); list.add("002212024072310130110661645187749687296"); list.add("002212024072312422810661682799113842688"); list.add("002212024072313162610661691345359196160"); list.add("002212024072314285910661709602762747904"); list.add("002212024072315342310661726063310610432"); list.add("002212024072316012910661732883531419648"); list.add("002212024072317565210661761918588276736"); list.add("002212024072318030410661763480097177601"); list.add("002212024072319094010661780240724353024"); list.add("002212024072319154510661781770336673792"); list.add("002212024072319231910661783676281327616"); list.add("002212024072320284910661800160531013632"); list.add("002212024072320433610661803880117866496"); list.add("002212024072322300310661830669448163328"); list.add("002212024072322363110661832295173169152"); list.add("002212024072322373210661832551203020800"); list.add("002212024072322393310661833057128648704"); list.add("002212024072322594010661838121214935040"); list.add("002212024072323114710661841170223771648"); list.add("002212024072323140110661841734526455808"); list.add("002212024072323263010661844874588282880"); list.add("002212024072401121010661871466556805120"); list.add("002212024072402380710661893096266473472"); list.add("002212024072411213010662024810671636480"); list.add("002212024072411314310662027382244204544"); list.add("002212024072411444410662030657385623552"); list.add("002212024072412421310662045123676442624"); list.add("002212024072414252810662071106696224768"); list.add("002212024072414353810662073663728492544"); list.add("002212024072415114710662082764211982336"); list.add("002212024072416360110662103959310434304"); list.add("002212024072417243810662116195447447552"); list.add("002212024072418244010662131301192192000"); list.add("002212024072418323010662133275245838336"); list.add("002212024072419412310662150609387126784"); list.add("002212024072420191210662160126138560512"); list.add("002212024072420331810662163674097827840"); list.add("002212024072421150610662174195163295744"); list.add("002212024072421191410662175234400411648"); list.add("002212024072421524910662183685548322816"); list.add("002212024072422054210662186928072663040"); list.add("002212024072422391410662195366426624000"); list.add("002212024072422451410662196875497746432"); list.add("002212024072423544610662214375649517568"); list.add("002212024072500013910662216107302846464"); list.add("002212024072500141410662219275458801664"); list.add("002212024072501203410662235969809752064"); list.add("002212024072501391810662240683988004864"); list.add("002212024072512201010662401963658539008"); list.add("002212024072513434710662423002989350912"); list.add("002212024072514312210662434978347003904"); list.add("002212024072515273610662449131530653696"); list.add("002212024072517585610662487213909737472"); list.add("002212024072518514010662500486880911360"); list.add("002212024072519022610662503194177249280"); list.add("002212024072519120310662505614073618432"); list.add("002212024072519345310662511363568340992"); list.add("002212024072519364510662511829930708992"); list.add("002212024072519374810662512095916691456"); list.add("002212024072520511310662530572639584256"); list.add("002212024072521275310662539798382342144"); list.add("002212024072522122810662551018453831680"); list.add("002212024072522521310662561022518697984"); list.add("002212024072523001210662563030722383872"); list.add("002212024072523122110662566090312040448"); list.add("002212024072600172610662582468216201216"); list.add("002212024072600190210662582869410873344"); list.add("002212024072601344110662601908745101312"); list.add("002212024072611422710662754857725452288"); list.add("002212024072612290910662766611114344448"); list.add("002212024072612430110662770098166218752"); list.add("002212024072613315610662782411633713152"); list.add("002212024072614282610662796629251555328"); list.add("002212024072614484010662801720243642368"); list.add("002212024072614500510662802075453935616"); list.add("002212024072614543010662803188519251968"); list.add("002212024072616072910662821554372837376"); list.add("002212024072617284110662841989332434944"); list.add("002212024072617422910662845463691198464"); list.add("002212024072618024710662850573449814016"); list.add("002212024072618104110662852560895598592"); list.add("002212024072618423610662860591497150464"); list.add("002212024072618481810662862027435245568"); list.add("002212024072618532410662863311535456256"); list.add("002212024072618591110662864765108101120"); list.add("002212024072619062710662866595653345280"); list.add("002212024072619151210662868796523266048"); list.add("002212024072619170310662869261451186176"); list.add("002212024072620120410662883108109074432"); list.add("002212024072620344910662888833099153408"); list.add("002212024072620505310662892876711788544"); list.add("002212024072621520010662908255929827328"); list.add("002212024072622263010662916936528527360"); list.add("002212024072622313610662918219964448768"); list.add("002212024072622424510662921027761700864"); list.add("002212024072623204610662930595696197632"); list.add("002212024072623451910662936771811540992"); list.add("002212024072700460010662952045679136768"); list.add("002212024072702111310662973492050010112"); list.add("002212024072708482010663073426228838400"); list.add("002212024072712573010663136130998476800"); list.add("002212024072713305910663144558488829952"); list.add("002212024072713595810663151851537817600"); list.add("002212024072714024110663152536007311360"); list.add("002212024072714152110663155725185499136"); list.add("002212024072714423710663162586565128192"); list.add("002212024072715003810663167120806084608"); list.add("002212024072715380510663176546879504384"); list.add("002212024072717262810663203821630177280"); list.add("002212024072717435810663208223953920000"); list.add("002212024072717481710663209312427098112"); list.add("002212024072719025210663228078236827648"); list.add("002212024072719301310663234962318942208"); list.add("002212024072719452610663238790849855488"); list.add("002212024072721175310663262059237933056"); list.add("002212024072721253310663263985865187328"); list.add("002212024072721451410663268939213504512"); list.add("002212024072722162810663276800488759296"); list.add("002212024072722190310663277453268942848"); list.add("002212024072722220010663278195291152384"); list.add("002212024072722335310663281184663265280"); list.add("002212024072722422810663283344554786816"); list.add("002212024072723245310663294019568873472"); list.add("002212024072800131410663306185077653504"); list.add("002212024072801535110663331505630588928"); list.add("002212024072808394210663433641836130304"); list.add("002212024072811283610663476148493361152"); list.add("002212024072812204410663489267949875200"); list.add("002212024072813420310663509730340089856"); list.add("002212024072814010210663514507537506304"); list.add("002212024072814163510663518422364438528"); list.add("002212024072814290610663521570372648960"); list.add("002212024072814402810663524432623919104"); list.add("002212024072815402010663539499842850816"); list.add("002212024072816491910663556859089321984"); list.add("002212024072817525310663572858029850625"); list.add("002212024072818080910663576697455693824"); list.add("002212024072818272410663581540980031488"); list.add("002212024072818591510663589559566532608"); list.add("002212024072819080610663591783213424640"); list.add("002212024072819372810663599174219825152"); list.add("002212024072820054710663606301289021440"); list.add("002212024072820213110663610259744423936"); list.add("002212024072820295010663612354917048320"); list.add("002212024072820433810663615825347850240"); list.add("002212024072820470510663616696720678912"); list.add("002212024072821035310663620921002491904"); list.add("002212024072821331210663628300301565952"); list.add("002212024072821533310663633422290235392"); list.add("002212024072822243510663641233208557568"); list.add("002212024072822285610663642328485539840"); list.add("002212024072823294010663657612256862208"); list.add("002212024072900034510663666188039872512"); list.add("002212024072900274510663672229277433856"); list.add("002212024072906485210663768138442264576"); list.add("002212024072910472010663828148988510208"); list.add("002212024072914102010663879235867500544"); list.add("002212024072916031510663907653475053568"); list.add("002212024072918070710663938826113306624"); list.add("002212024072918422210663947697234038784"); list.add("002212024072919074210663954070626598912"); list.add("002212024072919075610663954132222816256"); list.add("002212024072919084210663954323615494144"); list.add("002212024072919282910663959304597364736"); list.add("002212024072919295410663959659570536448"); list.add("002212024072919425410663962931520274432"); list.add("002212024072920210410663972535940374528"); list.add("002212024072920285110663974493530304512"); list.add("002212024072921244610663988564858187776"); list.add("002212024072921312210663990228635344896"); list.add("002212024072922343810664006147944210432"); list.add("002212024072922531010664010811004796928"); list.add("002212024072922540410664011039579168768"); list.add("002212024072923175610664017047036866560"); list.add("002212024072923382310664022193383067648"); list.add("002212024073001412910664053170718384128"); list.add("002212024073012140510664212369414488064"); list.add("002212024073015423010664264820845654016"); list.add("002212024073017263310664291004912435200"); list.add("002212024073018174110664303873070673920"); list.add("002212024073018255210664305933879529472"); list.add("002212024073018473110664311380141629440"); list.add("002212024073018542910664313133895368704"); list.add("002212024073019391410664324395507843072"); list.add("002212024073019510510664327376421003264"); list.add("002212024073022340310664368388547796992"); list.add("002212024073023121110664377984430047232"); list.add("002212024073100175010664394509192200192"); list.add("002212024073100222210664395650593636352"); list.add("002212024073100413910664400499374227456"); list.add("002212024073102491810664432626716073984"); list.add("002212024073104022910664451042307407872"); list.add("002212024073111253410664562548772954112"); list.add("002212024073111452110664567525092032512"); list.add("002212024073118043010664662942944002048"); list.add("002212024073118140810664665367261749248"); list.add("002212024073118214610664667288861138944"); list.add("002212024073118381910664671452108894208"); list.add("002212024073118390910664671663595708416"); list.add("002212024073119371110664686269646602240"); list.add("002212024073119475410664688964712390656"); list.add("002212024073120524910664705300197199872"); list.add("002212024073121223810664712805447860224"); list.add("002212024073123052910664738687723356160"); list.add("002212024073123090910664739609386516480"); return list; } public List getPaymentIdList() { List paymentIdList1 = getPaymentIdList1(); List resultList = Lists.newArrayList(); resultList.addAll(paymentIdList1); return resultList; } @Test public void testClearingWithdraw() { // 保存提现记录 ClearingWithdrawInfo record = new ClearingWithdrawInfo(); record.setWithdrawCode("132321354"); record.setWithdrawStatus(Constants.ZERO); Date now = new Date(); record.setApplicationTime(now); record.setCreateTime(now); record.setDelFlag(DelFlagEnum.NORMAL.getValue()); clearingWithdrawInfoService.insertOrUpdate(record); } @Test public void testGetPileTypeNum() { Long stationId = 1L; pileConnectorInfoService.getPileTypeNum(stationId); } @Test public void testUpdateStatus() { String pileConnectorCode = "8800000000012601"; String status = "0"; pileConnectorInfoService.updateConnectorStatus(pileConnectorCode, status); } @Test public void testRedisSet() { String redisKey = "push_station_connector"; redisCache.setCacheSet(redisKey, Sets.newHashSet("1")); redisCache.setCacheSet(redisKey, Sets.newHashSet("3")); redisCache.setCacheSet(redisKey, Sets.newHashSet("5")); redisCache.setCacheSet(redisKey, Sets.newHashSet("1")); redisCache.setCacheSet(redisKey, Sets.newHashSet("1")); redisCache.setCacheSet(redisKey, Sets.newHashSet("7")); redisCache.setCacheSet(redisKey, Sets.newHashSet("3")); Set cacheSet = redisCache.getCacheSet(redisKey); System.out.println(cacheSet); } @Test public void testSettleOrder() { Map returnAmountMap = Maps.newHashMap(); returnAmountMap.put("returnPrincipal", new BigDecimal("16.8700")); // 更新会员钱包 BigDecimal returnPrincipal = returnAmountMap.get("returnPrincipal"); // if (returnPrincipal != null && principalPayRecord != null) { // principalPayRecord.setRefundAmount(returnPrincipal); // updatePayRecordList.add(principalPayRecord); // } BigDecimal returnGift = returnAmountMap.get("returnGift"); System.out.println(returnPrincipal); // if (returnGift != null && giftPayRecord != null) { // giftPayRecord.setRefundAmount(returnGift); // updatePayRecordList.add(giftPayRecord); // // 支付的赠送金额-退回的赠送金额 = 实际使用赠送金额消费的部分 // virtualAmount = giftPay.subtract(returnGift); // } // UpdateMemberBalanceDTO updateMemberBalanceDTO = UpdateMemberBalanceDTO.builder() // .memberId(orderBasicInfo.getMemberId()) // .type(MemberWalletEnum.TYPE_IN.getValue()) // 进账 // .subType(MemberWalletEnum.SUBTYPE_ORDER_SETTLEMENT_REFUND.getValue()) // 订单结算退款 // .updatePrincipalBalance(returnPrincipal) // .updateGiftBalance(returnGift) // .relatedOrderCode(orderBasicInfo.getOrderCode()) // .build(); // memberBasicInfoService.updateMemberBalance(updateMemberBalanceDTO); } @Test public void testVin() { String vinCode = "tango"; MemberPlateNumberRelation memberPlateInfoByVinCode = memberPlateNumberRelationService.getMemberPlateInfoByVinCode(vinCode); System.out.println(memberPlateInfoByVinCode); } @Test public void testParking() throws UnsupportedEncodingException { // GetTokenDTO dto = new GetTokenDTO(); // dto.setAppId("I2qa3hdr116100dc"); // dto.setSecretKey("2qa3hdr13754a8e"); // String token = ltytService.getToken(dto); // System.out.println(token); BindCouponDTO dto = new BindCouponDTO(); dto.setAppId("I2qa3hdr116100dc"); dto.setSecretKey("2qa3hdr13754a8e"); dto.setMerchantId("3prv98bm8db70a9"); dto.setCouponId("3prvd0q7a4817bf"); dto.setPlateNumber("贵A12345"); dto.setPlateColor(1); String s = ltytService.bindCoupon(dto); System.out.println(s); } @Test public void testUpdateConnectorStatus() { String pileConnectorCode = "8800000000000101"; String status = PileConnectorStatusEnum.FREE.getValue(); pileConnectorInfoService.updateConnectorStatus(pileConnectorCode, status); } @Test public void testOrder() throws Exception { // 通过vin码查询数据库绑定用户信息 MemberPlateNumberRelation plateInfo = memberPlateNumberRelationService.getMemberPlateInfoByVinCode("LNBSCC4H1LT107646"); GenerateOrderDTO dto = new GenerateOrderDTO(); dto.setMemberPlateNumberRelation(plateInfo); dto.setPileSn("88000000000126"); dto.setConnectorCode("01"); dto.setStartMode(StartModeEnum.VIN_CODE.getValue()); dto.setMemberId(plateInfo.getMemberId()); // 通过memberId获取账户余额 MemberVO memberVO = memberBasicInfoService.queryMemberInfoByMemberId(dto.getMemberId()); if (memberVO == null) { throw new BusinessException(ReturnCodeEnum.CODE_GET_MEMBER_ACCOUNT_AMOUNT_ERROR); } BigDecimal totalAccountAmount = memberVO.getTotalBalance(); if (totalAccountAmount.compareTo(BigDecimal.ZERO) <= 0) { throw new BusinessException(ReturnCodeEnum.CODE_BALANCE_IS_INSUFFICIENT); } dto.setChargeAmount(totalAccountAmount); // 充电金额 dto.setPayMode(OrderPayModeEnum.PAYMENT_OF_BALANCE.getValue()); // 1-余额支付 OrderBasicInfo basicInfo = orderBasicInfoService.generateOrder(dto); // 支付订单 // PayOrderDTO payOrderDTO = new PayOrderDTO(); // payOrderDTO.setOrderCode(basicInfo.getOrderCode()); // payOrderDTO.setPayAmount(totalAccountAmount); // payOrderDTO.setPayMode(dto.getPayMode()); // payOrderDTO.setMemberId(dto.getMemberId()); // payOrderDTO.setCode(); // payOrderDTO.setLockValue(); // payOrderDTO.setOrderBasicInfo(basicInfo); PayOrderDTO build = PayOrderDTO.builder() .orderCode(basicInfo.getOrderCode()) .payAmount(totalAccountAmount) .payMode(dto.getPayMode()) .memberId(dto.getMemberId()) .build(); // Map map = orderBasicInfoService.payOrder(payOrderDTO); // System.out.println(map); } @Test public void testTransactionRecord() { // 获取消息体 String msg = "8823000000123302230707215317078588230000001233020000341507071763023615070717b02a0200a00f0000000000003016000090dc010000000000000000000000000020c50100000000000000000000000000888a0100000000000000000000000000b0220749005032074900a00f000000000000e01500004c4e425343433448314c543130373634360563023615070717450000000000000000"; byte[] msgBody = BytesUtil.str2Bcd(msg); int startIndex = 0; int length = 16; // 交易流水号 byte[] orderCodeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String transactionCode = BytesUtil.bcd2Str(orderCodeByteArr); // 桩编码 startIndex += length; length = 7; byte[] pileSnByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String pileSn = BytesUtil.bcd2Str(pileSnByteArr); // 枪号 startIndex += length; length = 1; byte[] connectorCodeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String connectorCode = BytesUtil.bcd2Str(connectorCodeByteArr); // 开始时间 CP56Time2a 格式 startIndex += length; length = 7; byte[] startTimeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); // String binary = BytesUtil.binary(startTimeByteArr, 16); Date startDate = Cp56Time2aUtil.byte2Hdate(startTimeByteArr); String startTime = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, startDate); // 结束时间 CP56Time2a 格式 startIndex += length; byte[] endTimeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); Date endDate = Cp56Time2aUtil.byte2Hdate(endTimeByteArr); String endTime = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, endDate); // 尖单价 精确到小数点后五位(尖电费+尖服务费,见费率帧) startIndex += length; length = 4; byte[] sharpPriceByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String sharpPrice = YKCUtils.convertDecimalPoint(sharpPriceByteArr, 5); // 尖电量 精确到小数点后四位 startIndex += length; length = 4; byte[] sharpUsedElectricityByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String sharpUsedElectricity = YKCUtils.convertDecimalPoint(sharpUsedElectricityByteArr, 4); // 计损尖电量 startIndex += length; byte[] sharpPlanLossElectricityByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String sharpPlanLossElectricity = YKCUtils.convertDecimalPoint(sharpPlanLossElectricityByteArr, 4); // 尖金额 startIndex += length; byte[] sharpAmountByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String sharpAmount = YKCUtils.convertDecimalPoint(sharpAmountByteArr, 4); // 峰单价 精确到小数点后五位(峰电费+峰服务费) startIndex += length; byte[] peakPriceByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String peakPrice = YKCUtils.convertDecimalPoint(peakPriceByteArr, 5); // 峰电量 startIndex += length; byte[] peakUsedElectricityByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String peakUsedElectricity = YKCUtils.convertDecimalPoint(peakUsedElectricityByteArr, 4); // 计损峰电量 startIndex += length; byte[] peakPlanLossElectricityByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String peakPlanLossElectricity = YKCUtils.convertDecimalPoint(peakPlanLossElectricityByteArr, 4); // 峰金额 startIndex += length; byte[] peakAmountByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String peakAmount = YKCUtils.convertDecimalPoint(peakAmountByteArr, 4); // 平单价 精确到小数点后五位(平电费+平服务费) startIndex += length; byte[] flatPriceByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String flatPrice = YKCUtils.convertDecimalPoint(flatPriceByteArr, 5); // 平电量 startIndex += length; byte[] flatUsedElectricityByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String flatUsedElectricity = YKCUtils.convertDecimalPoint(flatUsedElectricityByteArr, 4); // 计损平电量 startIndex += length; byte[] flatPlanLossElectricityByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String flatPlanLossElectricity = YKCUtils.convertDecimalPoint(flatPlanLossElectricityByteArr, 4); // 平金额 startIndex += length; byte[] flatAmountByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String flatAmount = YKCUtils.convertDecimalPoint(flatAmountByteArr, 4); // 谷单价 精确到小数点后五位(谷电费+谷 服务费) startIndex += length; byte[] valleyPriceByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String valleyPrice = YKCUtils.convertDecimalPoint(valleyPriceByteArr, 5); // 谷电量 startIndex += length; byte[] valleyUsedElectricityByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String valleyUsedElectricity = YKCUtils.convertDecimalPoint(valleyUsedElectricityByteArr, 4); // 计损谷电量 startIndex += length; byte[] valleyPlanLossElectricityByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String valleyPlanLossElectricity = YKCUtils.convertDecimalPoint(valleyPlanLossElectricityByteArr, 4); // 谷金额 startIndex += length; byte[] valleyAmountByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String valleyAmount = YKCUtils.convertDecimalPoint(valleyAmountByteArr, 4); // 电表总起值 startIndex += length; length = 5; byte[] ammeterTotalStartByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String ammeterTotalStart = YKCUtils.convertDecimalPoint(ammeterTotalStartByteArr, 4); // 电表总止值 startIndex += length; byte[] ammeterTotalEndByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String ammeterTotalEnd = YKCUtils.convertDecimalPoint(ammeterTotalEndByteArr, 4); // 总电量 startIndex += length; length = 4; byte[] totalElectricityByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String totalElectricity = YKCUtils.convertDecimalPoint(totalElectricityByteArr, 4); // 计损总电量 startIndex += length; byte[] planLossTotalElectricityByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String planLossTotalElectricity = YKCUtils.convertDecimalPoint(planLossTotalElectricityByteArr, 4); // 消费金额 精确到小数点后四位,包含电费、 服务费 startIndex += length; byte[] consumptionAmountByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String consumptionAmount = YKCUtils.convertDecimalPoint(consumptionAmountByteArr, 4); // VIN 码 VIN 码,此处 VIN 码和充电时 VIN 码不同, 正序直接上传, 无需补 0 和反序 startIndex += length; length = 17; byte[] vinCodeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String vinCode = BytesUtil.ascii2Str(vinCodeByteArr); /** * 交易标识 * 0x01: app 启动 * 0x02:卡启动 * 0x04:离线卡启动 * 0x05: vin 码启动充电 */ startIndex += length; length = 1; byte[] transactionIdentifierByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String transactionIdentifier = BytesUtil.bcd2Str(transactionIdentifierByteArr); // 交易时间 CP56Time2a 格式 startIndex += length; length = 7; byte[] transactionTimeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); Date transactionDate = Cp56Time2aUtil.byte2Hdate(transactionTimeByteArr); String transactionTime = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, transactionDate); // 停止原因 startIndex += length; length = 1; byte[] stopReasonByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String stopReason = BytesUtil.bin2HexStr(stopReasonByteArr); String stopReasonMsg = YKCChargingStopReasonEnum.getMsgByCode(Integer.parseInt(stopReason, 16)); // 物理卡号 不足 8 位补 0 startIndex += length; length = 8; byte[] cardNumByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); // byte[] logicCardNum = BytesUtil.checkLengthAndBehindAppendZero(cardNumByteArr, 16); String logicCard = BytesUtil.binary(cardNumByteArr, 16); // log.info("桩号:{}发送交易记录物理卡号:{}", pileSn, logicCard); // // log.info("[===交易记录===]交易流水号:{}, 桩编号:{}, 枪号:{}, 开始时间:{}, 结束时间:{}, 尖单价:{}, 尖电量:{}, 计损尖电量:{}, 尖金额:{}, " + // "峰单价:{}, 峰电量:{}, 计损峰电量:{}, 峰金额:{}, 平单价:{}, 平电量:{}, 计损平电量:{}, 平金额:{}, " + // "谷单价:{}, 谷电量:{}, 计损谷电量:{}, 谷金额:{}, 电表总起值:{}, 电表总止值:{}, 总电量:{}, 计损总电量:{}, 消费金额:{}, " + // "电动汽车唯一标识:{}, 交易标识:{}, 交易日期、时间:{}, 停止原因码:{}, 停止原因描述:{}, 物理卡号:{}", // transactionCode, pileSn, connectorCode, startTime, endTime, sharpPrice, sharpUsedElectricity, sharpPlanLossElectricity, sharpAmount, // peakPrice, peakUsedElectricity, peakPlanLossElectricity, peakAmount, flatPrice, flatUsedElectricity, flatPlanLossElectricity, flatAmount, // valleyPrice, valleyUsedElectricity, valleyPlanLossElectricity, valleyAmount, ammeterTotalStart, ammeterTotalEnd, totalElectricity, planLossTotalElectricity, // consumptionAmount, vinCode, transactionIdentifier, transactionTime, stopReason, stopReasonMsg, logicCard); // 交易记录封装到对象里 TransactionRecordsData data = TransactionRecordsData.builder() // .orderCode(transactionCode) .transactionCode(transactionCode) .pileSn(pileSn) .connectorCode(connectorCode) .startTime(startTime) .endTime(endTime) .sharpPrice(sharpPrice) .sharpUsedElectricity(sharpUsedElectricity) .sharpPlanLossElectricity(sharpPlanLossElectricity) .sharpAmount(sharpAmount) .peakPrice(peakPrice) .peakUsedElectricity(peakUsedElectricity) .peakPlanLossElectricity(peakPlanLossElectricity) .peakAmount(peakAmount) .flatPrice(flatPrice) .flatUsedElectricity(flatUsedElectricity) .flatPlanLossElectricity(flatPlanLossElectricity) .flatAmount(flatAmount) .valleyPrice(valleyPrice) .valleyUsedElectricity(valleyUsedElectricity) .valleyPlanLossElectricity(valleyPlanLossElectricity) .valleyAmount(valleyAmount) .ammeterTotalStart(ammeterTotalStart) .ammeterTotalEnd(ammeterTotalEnd) .totalElectricity(totalElectricity) .planLossTotalElectricity(planLossTotalElectricity) .consumptionAmount(consumptionAmount) .vinCode(vinCode) .transactionIdentifier(transactionIdentifier) .transactionTime(transactionTime) .stopReasonMsg(stopReasonMsg) .logicCard(logicCard) .build(); // boolean flag = !StringUtils.equals("0000000000000000", "a511101970000000"); // System.out.println(flag); // 处理订单加锁 String lockKey = "settle_order_" + transactionCode; String uuid = IdUtils.fastUUID(); try { // redis锁 Boolean isLock = redisCache.lock(lockKey, uuid, 1500); if (isLock) { // transactionRecordsRequestHandler.processOrder(data); } } catch (Exception e) { System.out.println("处理订单发生异常: " + e); } finally { if (uuid.equals(redisCache.getCacheObject(lockKey).toString())) { redisCache.unLock(lockKey); } } } @Test public void testFault() { StringBuffer sb = new StringBuffer("0100"); String lowOrder = sb.substring(0, 2); String highOrder = sb.substring(2, 4); // String hardwareFault = highOrder + lowOrder; byte[] hardwareFaultByteArr = BytesUtil.str2Bcd(highOrder + lowOrder); String binStr = BytesUtil.bytes2BinStr(hardwareFaultByteArr); // log.info("binStr:{}", binStr); // 0000 0000 0000 0001 int faultCode = 0; for (int i = 0; i < binStr.length(); i++) { if (binStr.charAt(i) == '1') { faultCode = 15 - i; break; } } String faultReason = YKCPileFaultReasonEnum.getValueByCode(faultCode); System.out.println(faultReason); } @Test public void testQueryCorpMember() { List accountList = adapayMemberAccountService.selectAdapayMemberAccountList(new AdapayMemberAccount()); if (CollectionUtils.isNotEmpty(accountList)) { List ids = accountList.stream().map(x -> x.getId() + "").collect(Collectors.toList()); adapayMemberAccountService.deleteAdapayMemberAccountByIds(ids); } // try { // Map map = adapayMemberService.selectAdapayMember("5"); // // String adapayMemberId = "ACM29562569"; // AdapayCorpMemberVO adapayCorpMemberVO = adapayMemberService.queryCorpAdapayMemberInfo(adapayMemberId); // System.out.println(adapayCorpMemberVO); // // // } catch (BaseAdaPayException e) { // throw new RuntimeException(e); // } } @Test public void testGetPileListByStationIdList() { // List stationIdList = Lists.newArrayList("2"); // Map> pileListByStationIdList = aMapService.getPileListByStationIdList(stationIdList); // System.out.println(pileListByStationIdList); GetStationInfoDTO dto = new GetStationInfoDTO(); dto.setType("page"); dto.setIdList(Lists.newArrayList("395")); aMapService.getStationInfosV2(dto); } @Test public void testMultiSave() { String prefix = "test_multi_save:"; Map redisMap = Maps.newHashMap(); for (int i = 0; i < 1000; i++) { redisMap.put(prefix + i, PileInfoVO.builder().pileSn(i + "").build()); } redisCache.multiSave(redisMap, 60); } @Test public void testBillingTemplate() { pileBillingTemplateService.queryStationBillingTemplateListForUniApp("2"); } /** * 查询汇付会员信息 */ @Test public void testQueryAdapayMemberInfo() { String adapayMemberId = "ACM82792551"; String settleAccountId = null; try { AdapayCorpMemberVO adapayCorpMemberVO = adapayService.queryCorpAdapayMemberInfo(adapayMemberId, wechatAppId1); // AdapaySettleAccountVO vo = adapayService.queryAdapaySettleAccount(adapayMemberId, settleAccountId, wechatAppId1); System.out.println(JSON.toJSONString(adapayCorpMemberVO)); } catch (BaseAdaPayException e) { throw new RuntimeException(e); } } @Test public void testSaveAdapayCallbackRecord() throws JsonProcessingException { String data = "{\n" + " \"object\": \"refund\",\n" + " \"status\": \"succeeded\",\n" + " \"prod_mode\": \"true\",\n" + " \"id\": \"0022120230531111946980509821471137853440\",\n" + " \"refund_order_no\": \"823725974557265920\",\n" + " \"payment_id\": \"002212023053110524210509814658135928832\",\n" + " \"payment_order_no\": \"C27262970851\",\n" + " \"refund_amt\": \"7.82\",\n" + " \"fee_amt\": \"0.04\",\n" + " \"channel_no\": \"2023053121R064uj\",\n" + " \"created_time\": \"1685503187000\",\n" + " \"succeed_time\": \"1685503199000\",\n" + " \"app_id\": \"app_d0c80cb1-ffc8-48cb-a030-fe9bec823aaa\",\n" + " \"reason\": \"\",\n" + " \"notify_url\": \"https://api.jsowellcloud.com/uniapp/pay/adapayRefundCallback\"\n" + "}"; JSONObject jsonObject = JSON.parseObject(data); ObjectMapper mapper = new ObjectMapper(); mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); AdapayRefundRecord adapayRefundRecord = mapper.readValue(jsonObject.toJSONString(), AdapayRefundRecord.class); adapayRefundRecord.setRefundId(jsonObject.getString("id")); // 保存到数据库 adapayRefundRecordService.insertAdapayRefundRecord(adapayRefundRecord); } @Test public void testQueryCallback() { AdapayCallbackRecord aaaa = adapayCallbackRecordService.selectByOrderCode("aaaa"); System.out.println(aaaa); } @Test public void testAdapayRefund() { // 创建汇付退款对象 在完成初始化设置情况下,调用方法,获取 Refund对象 try { String id = "002212023052710075810508353847861903360"; String refundAmount = "0.01"; Map refundParams = Maps.newHashMap(); refundParams.put("refund_amt", AdapayUtil.formatAmount(refundAmount)); refundParams.put("refund_order_no", SnowflakeIdWorker.getSnowflakeId()); refundParams.put("notify_url", "https://api.jsowellcloud.com/uniapp/pay/adapayRefundCallback"); Map response = Refund.create(id, refundParams); System.out.println(JSON.toJSONString(response)); // if (response != null && !response.isEmpty()) { // JSONObject jsonObject = JSONObject.parseObject(response.get("expend").toString()); // JSONObject pay_info = jsonObject.getJSONObject("pay_info"); // Map resultMap = JSONObject.parseObject(pay_info.toJSONString(), new TypeReference>() {}); // } } catch (Exception e) { System.out.println(e); } } @Test public void testSaveCallback() throws JsonProcessingException { String data = "{\"app_id2\":\"app_d0c80cb1-ffc8-48cb-a030-fe9bec823aaa\",\"created_time\":\"20230530132956\",\"description\":\"{\\\"orderCode\\\":\\\"C29505932783\\\",\\\"type\\\":\\\"order\\\"}\",\"end_time\":\"20230530133027\",\"expend\":{\"bank_type\":\"OTHERS\",\"open_id\":\"o8jhot6PJF93EPhNISsXi28dKdS8\",\"sub_open_id\":\"o4REX5MprZfTaLnVNxfdOY-wnwGI\"},\"fee_amt\":\"0.11\",\"id\":\"002212023053013295610509491838664794112\",\"order_no\":\"C29505932783\",\"out_trans_id\":\"4200001855202305308670391485\",\"party_order_id\":\"02212305304859640306711\",\"pay_amt\":\"20.00\",\"pay_channel\":\"wx_lite\",\"real_amt\":\"20.00\",\"share_eq\":\"Y\",\"status\":\"succeeded\",\"wx_user_id\":\"\"}"; JSONObject jsonObject = JSON.parseObject(data); ObjectMapper mapper = new ObjectMapper(); mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); AdapayCallbackRecord adapayCallbackRecord = mapper.readValue(jsonObject.toJSONString(), AdapayCallbackRecord.class); adapayCallbackRecord.setExpend(jsonObject.getString("expend")); adapayCallbackRecord.setPaymentId(jsonObject.getString("id")); // adapayCallbackRecordService.saveAdapayCallbackRecord(adapayCallbackRecord); } @Test public void testAMap() throws Exception { String pileConnectorCode = "8800000000012601"; // String s = aMapService.pushChargingDeviceDynamics(pileConnectorCode); GetStationInfoDTO dto = new GetStationInfoDTO(); dto.setType("page"); // aMapService.getStationInfos(dto); } @Test public void testVinCode() { String msg = "880000000000210203000000000000000000000000000000000000000000000000004C5257594743454B584D43303437313434"; // 获取消息体 byte[] msgBody = BytesUtil.str2Bcd(msg); int startIndex = 0; int length = 7; // 桩编码 byte[] pileSnByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String pileSn = BytesUtil.binary(pileSnByteArr, 16); // 保存时间 // saveLastTime(pileSn, channel); // 枪号 startIndex += length; length = 1; byte[] connectorNumByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String connectorCode = BytesUtil.bcd2Str(connectorNumByteArr); // 启动方式 // 0x01 表示通过刷卡启动充电 // 0x02 表求通过帐号启动充电 (暂不支持) // 0x03 表示vin码启动充电 startIndex += length; byte[] startModeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String startMode = BytesUtil.bcd2Str(startModeByteArr); // 是否需要密码 0x00 不需要 0x01 需要 startIndex += length; byte[] needPasswordFlagByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String needPasswordFlag = BytesUtil.bcd2Str(needPasswordFlagByteArr); // 物理卡号 不足 8 位补 0 startIndex += length; length = 8; byte[] cardNumByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String physicsCard = BytesUtil.binary(cardNumByteArr, 16); // 输入密码 对用户输入的密码进行16 位MD5 加密,采用小写上传 startIndex += length; length = 16; byte[] inputPasswordByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); // VIN码 startIndex += length; length = 17; byte[] vinCodeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String vinCode = BytesUtil.ascii2Str(vinCodeByteArr); System.out.println("桩号:" + pileSn + "申请充电VIN码:" + vinCode); /** * 刷卡启动充电 */ String logicCard = ""; byte[] authenticationFlagByteArr = Constants.zeroByteArray; // 鉴权成功标识 byte[] accountBalanceByteArr = Constants.zeroByteArray; // 账户余额 String transactionCode = ""; try { /** * VIN码启动充电 */ if (StringUtils.equals("03", startMode)) { // 通过vin码查询数据库绑定用户信息 MemberPlateNumberRelation plateInfo = memberPlateNumberRelationService.getMemberPlateInfoByVinCode(vinCode); if (plateInfo == null) { throw new BusinessException("", "未查到绑定用户信息"); } if (!StringUtils.equals("1", plateInfo.getVinStatus())) { // 1- 正常使用 throw new BusinessException("", "vin状态不正确"); } // vin码生成订单 vin启动充电 GenerateOrderDTO dto = new GenerateOrderDTO(); dto.setMemberPlateNumberRelation(plateInfo); dto.setPileSn(pileSn); dto.setConnectorCode(connectorCode); dto.setStartMode(StartModeEnum.VIN_CODE.getValue()); Map map = orderBasicInfoService.generateOrderByCard(dto); if (map != null) { transactionCode = (String) map.get("transactionCode"); accountBalanceByteArr = YKCUtils.getPriceByte(String.valueOf(map.get("accountBalance")), 2); // 鉴权成功标识 0x00 失败 0x01 成功 authenticationFlagByteArr = Constants.oneByteArray; } else { throw new BusinessException("", "生成vin订单失败"); } } } catch (BusinessException e) { e.printStackTrace(); System.out.println("1"); // log.error("VIN码启动充电鉴权 error:{}, {}", e.getCode(), e.getMessage()); } catch (Exception e) { e.printStackTrace(); System.out.println("2"); transactionCode = "00000000000000000000000000000000"; accountBalanceByteArr = BytesUtil.checkLengthAndBehindAppendZero(accountBalanceByteArr, 8); authenticationFlagByteArr = Constants.zeroByteArray; // log.error("VIN码启动充电鉴权 error", e); } byte[] serialNumByteArr = BytesUtil.str2Bcd(transactionCode); byte[] defeatReasonByteArr = Constants.zeroByteArray; // 不足位数的值补零 // cardNumByteArr = BytesUtil.checkLengthAndBehindAppendZero(cardNumByteArr, 16); // serialNumByteArr = BytesUtil.checkLengthAndBehindAppendZero(serialNumByteArr, 32); // pileSnByteArr = BytesUtil.checkLengthAndBehindAppendZero(pileSnByteArr, 14); // accountBalanceByteArr = BytesUtil.checkLengthAndBehindAppendZero(accountBalanceByteArr, 8); // 拼装消息体 byte[] msgBodyByteArr = Bytes.concat(serialNumByteArr, pileSnByteArr, connectorNumByteArr, cardNumByteArr, accountBalanceByteArr, authenticationFlagByteArr, defeatReasonByteArr); String s = BytesUtil.bin2HexStr(msgBodyByteArr); System.out.println(s); } @Test public void testGenerateLianlianToken() throws UnsupportedEncodingException { String OperatorID = "425010765"; String OperatorSecret = "123123123123aaaa"; // 1234567890abcdef //请求dataX Map data = new HashMap<>(); data.put("OperatorID", OperatorID); data.put("OperatorSecret", OperatorSecret); String dataJson = JSONUtil.toJsonStr(data); //加密 byte[] encryptText = Cryptos.aesEncrypt(dataJson.getBytes(StandardCharsets.UTF_8), OperatorSecret.getBytes(), OperatorSecret.getBytes()); String strData = Encodes.encodeBase64(encryptText); Map request = new LinkedHashMap<>(); request.put("OperatorID", OperatorID); request.put("Data", strData); request.put("TimeStamp", System.currentTimeMillis() + ""); request.put("Seq", "0001"); //生成签名 String sig = GBSignUtils.sign(request, OperatorSecret); request.put("Sig", sig); String tokenRequest = JSONUtil.toJsonStr(request); CommonParamsDTO dto = JSONObject.parseObject(tokenRequest, CommonParamsDTO.class); lianLianService.generateToken(dto); } @Test public void testupdateElecAmount() { // orderBasicInfoService.updateElecAmount(); } @Test public void testSelectSomeStatusCardInfo() { PileAuthCard pileAuthCard = pileAuthCardService.selectCardInfoByLogicCard("1111111111111111"); System.out.println(pileAuthCard); } @Test public void testLianLian() throws UnsupportedEncodingException { // 获取令牌 // LianLianGetTokenDTO dto = new LianLianGetTokenDTO(); // dto.setOperatorId("MA1JLFUU8"); // dto.setOperatorSecret("Nh62XxlIR5OjAzFj"); // String token = lianLianService.getToken("", "MA1JLFUU8", "fGwLsxW1HdzLw7jp"); // System.out.println("token:" + token); String operatorId = "425010765"; String operatorSecret = "3DSBTWHVIC6KVCKI"; // 请求data // Map data = new HashMap<>(); // data.put("OperatorID", operatorId); // data.put("OperatorSecret", operatorSecret); // String dataJson = JSONUtil.toJsonStr(data); JSONObject json = new JSONObject(); // json.put("StationIDs", com.google.common.collect.Lists.newArrayList("1", "2")); json.put("LastQueryTime", "2023-05-29 10:00:00"); json.put("PageNo", 1); json.put("PageSize", 10); String dataJson = JSON.toJSONString(json); // 加密 byte[] encryptText = Cryptos.aesEncrypt(dataJson.getBytes(StandardCharsets.UTF_8), operatorSecret.getBytes(), operatorSecret.getBytes()); String strData = Encodes.encodeBase64(encryptText); String timeStamp = DateUtils.parseDateToStr(DateUtils.YYYYMMDDHHMMSS, new Date()); Map request = new LinkedHashMap<>(); request.put("OperatorID", operatorId); request.put("Data", strData); request.put("TimeStamp", timeStamp); request.put("Seq", "0001"); // 生成签名 String sig = GBSignUtils.sign(request, operatorSecret); request.put("Sig", sig); JSONObject jsonObject = new JSONObject(request); System.out.println(jsonObject); // CommonParamsDTO dto = new CommonParamsDTO(); // dto.setOperatorID(operatorId); // dto.setData(strData); // dto.setTimeStamp(timeStamp); // dto.setSeq("0001"); // dto.setSig(sig); // Map map = lianLianService.generateToken(dto); QueryStationInfoDTO dto = new QueryStationInfoDTO(); dto.setOperatorId(operatorId); Map map = lianLianService.query_stations_info(dto); // String data1 = map.get("Data"); // 解密data // String data1 = "JudlP17tnYuQc2zwOzmjJAb9hgghIymefG5v3ZzSOlPDh5+bJHIedsYzKMD56tHlmlg6Cb7vG+o6KjMSSpn1fyqBH3UVaEFF7uEc+lOuEc9c1vUzq20vBQ7N3EpDKqVBKjZbOezMsKYaCX7Br8XTsCYT8VCQui/np3cn+phi3VC+0s1coNxBX7xoEDZ7iuPjPoSWL7g3J0uOw2SoGaIdBQG3eTxaZJ5L+vBmuDF0pEXgazTMnuKml1mx1QHkig2F7h/ILT0VEKVXWMmmogYgiBk5ItO0DyzRl+ASb184gOhYGo82GJmWRiXrAXmceCiSNvTGg6aL26imIGKkJNfOx9/9mTqjGvy6kzxvWJ29PBU="; // byte[] plainText = Cryptos.aesDecrypt(Encodes.decodeBase64(data1), // operatorSecret.getBytes(), operatorSecret.getBytes()); // String dataStr = new String(plainText, "UTF-8"); // Map resultMap = (Map) JSON.parse(dataStr); // // String token = resultMap.get("AccessToken"); // // System.out.println("解密后token:" + token); // LianLianPushStationInfoDTO dto1 = LianLianPushStationInfoDTO.builder() // .OperatorID("MA1JLFUU8") // .DataSecret("HVicnbRZbhPdIdpF") // .DataSecretIV("JNvcjSOn1vhrE11M") // .SigSecret("53TtFpc4gdVZbF3x") // // .token(token) // .stationId(2L) // // .build(); // lianLianService.pushStationInfo(dto1); // 推送订单状态 // lianLianService.pushConnectorStatus("8800000000000101", "1"); // 推送订单信息 // lianLianService.pushOrderInfo("C27680791529"); // 推送启动充电结果 // lianLianService.pushStartChargeResult("C27680791529"); // 推送充电状态 // lianLianService.pushChargeStatus("C27680791529"); // 推送停止充电结果 // lianLianService.pushStopChargeResult("C27680791529"); // 推送充电订单信息 // lianLianService.pushChargeOrderInfo("C27680791529"); // 推送订单结算信息 // lianLianService.pushOrderSettlementInfo("C27680791529"); // 查询订单结算信息 // lianLianService.queryOrderSettlementInfo("C27680791529"); // 推送订单对账结果信息 // lianLianService.pushOrderReconciliationInfo("C27680791529"); // 测试生成、解密令牌 // long ttlMillis = 60 * 60 * 24 * 1000; // String token = JWTUtils.createToken(operatorId, operatorSecret, ttlMillis); // System.out.println(JWTUtils.checkThirdPartyToken(token)); JSONObject jsonObject1 = new JSONObject(map); jsonObject1.put("OperatorID", "425010765"); jsonObject1.put("Data", "Ntu99RpveEOm2VUNq6RpD7OuOPXRbNxMOPmaBl67nkLk0nD/VmhipdSpq/Qfswhe1o55YMT+3Z7e6xe3fiJA3cZcvetxOEUF6sjvKLRq2rU="); jsonObject1.put("TimeStamp", "20230530090132"); jsonObject1.put("Seq", "0001"); jsonObject1.put("Sig", "1568D2D35B245A0205B33D0EF92E7981"); String jsonString = JSON.toJSONString(jsonObject1); String result = HttpUtils.sendPostContentType("http://localhost:8080/LianLian/v1/query_stations_info", jsonString, "application/json"); JSONObject object = JSONObject.parseObject(result); String data1 = (String) object.get("data"); // 解密data byte[] plainText = Cryptos.aesDecrypt(Encodes.decodeBase64(data1), operatorSecret.getBytes(), operatorSecret.getBytes()); String dataStr = new String(plainText, StandardCharsets.UTF_8); Map resultMap = (Map) JSON.parse(dataStr); } @Test public void testRefundForBalance() { BigDecimal refundAmount = new BigDecimal("2"); // 退款金额 元转分 123 int refundTotalCents = refundAmount.multiply(new BigDecimal(100)).intValue(); // 查询用户充值余额订单 过滤掉已经退款的充值订单 refundableOrder List recordList = Lists.newArrayList(); // recordList.add(RefundableWxPayOrderData.builder().outTradeNo("1").transactionId("1").payerAmount(new BigDecimal("1000")).refundableAmount(new BigDecimal("0")).build()); // recordList.add(RefundableWxPayOrderData.builder().outTradeNo("2").transactionId("2").payerAmount(new BigDecimal("1000")).refundableAmount(new BigDecimal("0")).build()); recordList.add(RefundableWxPayOrderData.builder().outTradeNo("3").transactionId("3").payerAmount(Constants.WHITELIST_DEFAULT_AMOUNT).refundableAmount(new BigDecimal("300")).build()); // 也许需要多笔支付订单才够退款 List requestList = com.google.common.collect.Lists.newArrayList(); WechatPayRefundRequest request; for (RefundableWxPayOrderData record : recordList) { int refundableTotal = record.getRefundableAmount().intValue(); // 该笔支付订单的可退金额,单位分 int payerTotal = record.getPayerAmount().intValue(); // 该笔支付订单的支付金额,单位分 // 用户申请退款金额-可退金额 refundTotalCents = refundTotalCents - refundableTotal; // 123 - 100 request = new WechatPayRefundRequest(); request.setTransaction_id(record.getTransactionId()); // 微信支付单号 request.setOut_trade_no(record.getOutTradeNo()); // 商户订单号 request.setOut_refund_no(SnowflakeIdWorker.getSnowflakeId()); // 商户退款单号 request.setNotify_url(WeChatPayParameter.refundNotifyUrl); // 回调接口 request.setReason("用户余额退款"); request.setFunds_account("AVAILABLE"); if (refundTotalCents > 0) { // 如果大于0说明,这笔单退完也不够 WechatPayRefundRequest.Amount amount = new WechatPayRefundRequest.Amount(); amount.setRefund(refundableTotal); // 退款金额 amount.setTotal(payerTotal); // 原订单金额 request.setAmount(amount); requestList.add(request); } else { // 如果小于0,这笔单退一部分 // 生成退款单号 WechatPayRefundRequest.Amount amount = new WechatPayRefundRequest.Amount(); // 部分退 int i = refundableTotal + refundTotalCents; amount.setRefund(i); // 退款金额 amount.setTotal(payerTotal); // 原订单金额 request.setAmount(amount); requestList.add(request); break; } } System.out.println(requestList); } @Test public void testCloseStartFailedOrder() { String startTime = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, DateUtils.addDays(new Date(), -2)); String endTime = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, new Date()); orderBasicInfoService.closeStartFailedOrder(startTime, endTime); } @Test public void testRedisSaveRealTimeData() { String pileSn = "88000000000001"; String connectorCode = "01"; String orderCode = "88000000000001012211161342359448"; String pileConnectorCode = pileSn + connectorCode; String redisKey = CacheConstants.PILE_REAL_TIME_MONITOR_DATA + pileConnectorCode + "_" + orderCode; // for (int i = 0; i < 10; i++) { // try { // Thread.sleep(10000); // } catch (InterruptedException e) { // e.printStackTrace(); // } // Date now = new Date(); // redisCache.hset(redisKey, DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:00", now), i + ":" + DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", now)); // } orderBasicInfoService.getChargingRealTimeData(orderCode); } @Test public void testuniformMessageSend() { AppletTemplateMessageSendDTO appletTemplateMessageSendDTO = new AppletTemplateMessageSendDTO(); // String openId = wxAppletRemoteService.getOpenIdByCode("0537u2100jTXsP1Y0Y300j426t47u210"); // System.out.println("openId:" + openId); appletTemplateMessageSendDTO.setTouser("o4REX5MprZfTaLnVNxfdOY-wnwGI"); // openid String templateId = "UyBPbADlZfsCj89rh_xvfZGlxTW5J5KURpZtt9CNFrY"; appletTemplateMessageSendDTO.setTemplate_id(templateId); // appletTemplateMessageSendDTO.setPage("跳转的页面"); Map map = new HashMap<>(); map.put("amount17", ImmutableMap.of("value", "¥100")); // 结束时间 map.put("time3", ImmutableMap.of("value", "2022-12-30")); // 结束时间 map.put("thing7", ImmutableMap.of("value", "thing7")); // 结束原因 // map.put("thing5", ImmutableMap.of("value", "thing5")); // 结束原因 // map.put("time2", ImmutableMap.of("value", "time2")); // 结束原因 appletTemplateMessageSendDTO.setData(map); wxAppletRemoteService.uniformMessageSend(appletTemplateMessageSendDTO); } @Test public void testWeChatRefund() { ApplyRefundDTO dto = new ApplyRefundDTO(); dto.setRefundType("2"); dto.setMemberId("82100864"); dto.setRefundAmount(new BigDecimal("1.23")); orderBasicInfoService.weChatRefund(dto); } @Test public void testSelectBalanceRechargeRecord() { List list = wxpayCallbackRecordService.queryBalanceRechargeRecordOfTheLatestYear("82100864"); System.out.println(list); } @Test public void testSelectOrderBasicInfoList() { QueryOrderDTO orderBasicInfo = new QueryOrderDTO(); orderBasicInfo.setPileSn("88000000000001"); orderBasicInfo.setOrderStatus(OrderStatusEnum.IN_THE_CHARGING.getValue()); List orderListVOS = orderBasicInfoService.selectOrderBasicInfoList(orderBasicInfo); System.out.println(orderListVOS); for (OrderListVO orderListVO : orderListVOS) { if (StringUtils.equals(orderListVO.getOrderStatus(), OrderStatusEnum.IN_THE_CHARGING.getValue())) { // 修改数据库订单状态 OrderBasicInfo info = OrderBasicInfo.builder() .id(Integer.parseInt(orderListVO.getId())) .orderStatus(OrderStatusEnum.ABNORMAL.getValue()) .build(); orderBasicInfoService.updateOrderBasicInfo(info); } } } @Test public void testWechatRefund() throws JsonProcessingException { WechatPayRefundRequest request = new WechatPayRefundRequest(); request.setTransaction_id("4200001656202212302746036536"); // 微信支付单号 request.setOut_trade_no("768677222373363712"); // 商户订单号 // 生成退款单号 request.setOut_refund_no(SnowflakeIdWorker.getSnowflakeId()); // 商户退款单号 request.setNotify_url(WeChatPayParameter.refundNotifyUrl); // 回调接口 WechatPayRefundRequest.Amount amount = new WechatPayRefundRequest.Amount(); amount.setRefund(10 * 100); // 退款金额 amount.setTotal(10 * 100); // 原订单金额 request.setAmount(amount); request.setReason("结算退款"); request.setFunds_account("AVAILABLE"); wechatPayService.ApplyForWechatPayRefundV3(request); // 退款方法 } @Test public void testUpdatePileSimInfo() { String pileSn = "88000000000001"; String iccid = "89860402102091089943"; pileBasicInfoService.updatePileSimInfo(pileSn, iccid); } @Test public void testPay() { // String code = "081zIoGa11GamE0iVVIa1aaJ4G0zIoGE"; // String openId = memberService.getOpenIdByCode(code); // Map pay = null; // try { // WeixinPayDTO dto = new WeixinPayDTO(); // dto.setOpenId(openId); // dto.setAmount("0.01"); // pay = orderService.weixinPayV3(dto); // } catch (Exception e) { // e.printStackTrace(); // } // System.out.println(JSON.toJSONString(pay)); } @Test public void testMemberRegisterAndLogin() throws BaseAdaPayException { } @Test public void testMemberBasicInfoMapper() { // String memberId = "21772870"; // BigDecimal principalBalance = new BigDecimal("-10"); // BigDecimal giftBalance = new BigDecimal("-110"); // Integer version = 2; // int i = memberBasicInfoMapper.updateMemberBalance(memberId, principalBalance, giftBalance, version); // if (i == 1) { // System.out.println("更新余额成功"); // } else { // System.out.println("更新余额失败"); // } Map refundParams = new HashMap<>(2); refundParams.put("payment_id", "002212023071011321210524320114191904768"); // refundParams.put("refund_id", refund_id); // refundParams.put("refund_order_no", refund_order_no); try { Map refund = Refund.query(refundParams); System.out.println(refund); } catch (BaseAdaPayException e) { throw new RuntimeException(e); } } /** * 查询退款信息 */ @Test public void queryRefundTest() { List list = getPaymentIdList(); // 查询退款信息 for (String paymentId : list) { Map refundParams = Maps.newHashMap(); refundParams.put("payment_id", paymentId); try { Map refund = Refund.query(refundParams, wechatAppId2); System.out.println("支付id:" + paymentId + ", 退款信息:" + JSON.toJSONString(refund)); System.out.println(); } catch (BaseAdaPayException e) { throw new RuntimeException(e); } } } /** * 查询支付撤销信息 */ @Test public void queryPaymentReverseTest() { List list = getPaymentIdList(); // 查询支付撤销信息 for (String paymentId : list) { try { Map reverse = Maps.newHashMap(); reverse.put("payment_id", paymentId); reverse.put("app_id", wechatAppId2); Map response = PaymentReverse.queryList(reverse, wechatAppId2); System.out.printf("支付id: %s, 支付撤销信息: %s%n", paymentId, JSON.toJSONString(response)); System.out.println(); } catch (BaseAdaPayException e) { throw new RuntimeException(e); } } } @Test public void testGenerateBillingTemplateMsgBody() { String pileSn = "88000000000001"; // 根据桩号查询计费模板 BillingTemplateVO billingTemplateVO = pileBillingTemplateService.selectBillingTemplateDetailByPileSn(pileSn); byte[] messageBody = pileBillingTemplateService.generateBillingTemplateMsgBody(pileSn, billingTemplateVO); System.out.println(BytesUtil.binary(messageBody, 16)); } @Test public void testAnalysisPileParameter() { BasicPileDTO dto = new BasicPileDTO(); // 3个都不传的情况 try { System.out.println("3个都不传的情况"); dto.setPileSn(""); dto.setConnectorCode(""); dto.setPileConnectorCode(""); // orderService.analysisPileParameter(dto); System.out.println("数据正确"); } catch (BusinessException e) { System.out.println(e.getMessage()); } System.out.println(); // 只传sn的情况 try { System.out.println("只传sn的情况"); dto.setConnectorCode(""); dto.setPileConnectorCode(""); dto.setPileSn("88000000000001"); // orderService.analysisPileParameter(dto); System.out.println("数据正确"); } catch (BusinessException e) { System.out.println(e.getMessage()); } System.out.println(); // try { System.out.println("只穿枪口号的情况"); dto.setConnectorCode("01"); dto.setPileConnectorCode(""); dto.setPileSn(""); // orderService.analysisPileParameter(dto); System.out.println("数据正确"); } catch (BusinessException e) { System.out.println(e.getMessage()); } System.out.println(); // 只传充电桩枪口编号的情况 try { System.out.println("只传充电桩枪口编号的情况"); dto.setPileConnectorCode("8800000000000101"); dto.setConnectorCode(""); dto.setPileSn(""); // orderService.analysisPileParameter(dto); System.out.println("数据正确"); } catch (BusinessException e) { System.out.println(e.getMessage()); } try { System.out.println(); System.out.println("传充电桩枪sn+枪口号的情况"); dto.setPileConnectorCode(""); dto.setConnectorCode("01"); dto.setPileSn("88000000000001"); // orderService.analysisPileParameter(dto); System.out.println("数据正确"); } catch (BusinessException e) { System.out.println(e.getMessage()); } } @Test public void testImportBillingTemplate() { ImportBillingTemplateDTO dto = new ImportBillingTemplateDTO(); dto.setBillingTemplateId("1"); // 查询公共计费模板是否存在 PileBillingTemplate pileBillingTemplate = pileBillingTemplateMapper.selectPileBillingTemplateById(Long.valueOf(dto.getBillingTemplateId())); if (pileBillingTemplate == null) { } List billingDetailList = pileBillingTemplate.getPileBillingDetailList(); } @Test public void testProcess() { // 62 68 String msgString = "680da300000388000000000001010020d06840a40000130000000000000000000000000000000088000000000001010202000000000000000000000000000000000000000000000000000000000000000000001516"; byte[] msg = BytesUtil.str2Bcd(msgString); boolean b = YKCUtils.checkMsg(msg); // ykcBusinessService.process(msg, null); } @Test public void testHeartbeat() { // heartbeatRequestHandler.updateStatus("88000000000001", "01", "0"); // heartbeatRequestHandler.updateStatus("88000000000001", "02", "0"); } @Test public void testPush() { byte[] msg = new byte[]{}; String pileSn = "88000000000001"; // ykcPushBusinessService.push(msg, pileSn, YKCFrameTypeCode.READ_REAL_TIME_MONITOR_DATA_CODE); } @Test public void TestMapUtils() { String address = "淀山湖镇黄浦江南路278号"; String areaCode = "320000,320500,320583"; Map longitudeAndLatitude = AddressUtils.getLongitudeAndLatitude(areaCode, address); System.out.println(longitudeAndLatitude); } @Test public void testCreatePile() { BatchCreatePileDTO dto = BatchCreatePileDTO.builder() .merchantId("1") .stationId("1") .softwareProtocol("1") // .connectorNum(1) // .num(10) // .productionDate(new Date()) .build(); pileService.batchCreatePile(dto); } @Test public void testGetIncre() { StopWatch stopWatch = new StopWatch(); // 生成100个 stopWatch.start("生成100个sn号"); List list2 = snUtils.generateSN(1); stopWatch.stop(); System.out.println(list2); System.out.println(stopWatch.getLastTaskTimeMillis()); } @Test public void testDict() { // String dictValue = DictUtils.getDictValue("query_pile_info", "url"); // String station_type = DictUtils.getDictLabel("station_type", "1"); // System.out.println(station_type); // System.out.println("123"); List adapay_station = DictUtils.getDictCache("adapay_station"); List stationIdList = com.google.common.collect.Lists.newArrayList(); if (CollectionUtils.isNotEmpty(adapay_station)) { for (SysDictData sysDictData : adapay_station) { stationIdList.add(sysDictData.getDictValue()); } } System.out.println(stationIdList); } @Test public void testSelectByMerchantId() { List list = pileStationInfoService.selectStationListByMerchantId(Long.valueOf(Constants.ONE)); System.out.println(list); } @Test public void testStr2Bcd() { String logicCardNum = "00000000"; byte[] logicCardNumByteArr = BytesUtil.str2Bcd(logicCardNum); System.out.println(Arrays.toString(logicCardNumByteArr)); } @Test public void testBigDecimalMultiply() { BigDecimal a = new BigDecimal("216.5"); BigDecimal b = new BigDecimal("11.5"); BigDecimal result = a.multiply(b).setScale(2, BigDecimal.ROUND_HALF_UP); System.out.println(result); } @Test public void testRemoteUpdate() { ArrayList list = new ArrayList<>(); list.add("88000000000001"); // pileRemoteService.updateFirmware(list); } @Test public void testGetUserPhoneNum() { String code = "0e5394cfa4eb41c6181ed257f2368a86dfe4ebdac0a4fac85df63657637e6cc3"; wxAppletRemoteService.getMobileNumberByCode(code); } @Test public void testDistance() { QueryStationDTO dto = new QueryStationDTO(); dto.setStationLat("123.2222"); dto.setStationLng("55.6232"); // pileStationInfoService.uniAppQueryStationInfos(dto); } /** * 生成英文字母随机数 RandomStringUtils.randomAlphabetic(10); * 生成数字随机数 RandomStringUtils.randomNumeric(10); * 字母+数字结合 RandomStringUtils.randomAlphanumeric(10); */ @Test public void Test() throws ParseException { /*String s = RandomStringUtils.randomAlphanumeric(32); System.out.println(s); // PuLe4Tyyg1jSFNPhF5d2Ts9ejRn6E8KQ String str = "JS160829"; System.out.println(Md5Utils.hash(str).toUpperCase(Locale.ROOT)); */ String s = RandomStringUtils.randomAlphanumeric(16).toUpperCase(Locale.ROOT); System.out.println(s); Date startTimeDate = sdf.parse("2022-11-26 10:44:11"); Date endTimeDate = sdf.parse("2022-11-27 12:45:11"); System.out.println(DateUtils.getDatePoor(endTimeDate, startTimeDate)); // 1天2小时1分钟 /*String stra = "sp_mchid=1632405339&sub_mchid=1632405339&out_trade_no=1217752501201407033233368318&sp_appid=wxbb3e0d474569481d&sub_appid=wxbb3e0d474569481d" + "bbac689f4654b209de4d6944808ec80b"; System.out.println(Md5Utils.hash(stra).toUpperCase(Locale.ROOT));*/ } @Test public void testSimCard() throws ParseException { ArrayList list = Lists.newArrayList(); Collections.addAll(list, "898607B9102090253556", "898607B9102090253560"); // String s = list.toString().replaceAll("(?:\\[|null|\\]| +)", ""); // System.out.println(s); // List simCardVOList = simCardService.selectSimCardInfoByIccId(list); // System.out.println(simCardVOList.toString()); // simCardService.XunZhongSimRenewal(list, 12); // System.out.println(s); // SimCardVO simCardVO = simCardService.searchByLoop("898607B9102090253556"); // // System.out.println(simCardVO.toString()); simCardService.WuLianSimRenew(list, 1); } @Test public void testRefund() { OrderBasicInfo orderInfo = orderBasicInfoService.getOrderInfoByOrderCode("88000000000001012212171045412218"); orderInfo.setReason("充电异常中止,急停开入"); TransactionRecordsData data = TransactionRecordsData.builder() .transactionCode("88000000000001012212171045412218") .consumptionAmount(String.valueOf(0.00)) .stopReasonMsg(orderInfo.getReason()) .totalElectricity("0") .sharpUsedElectricity("0") .peakUsedElectricity("0") .flatUsedElectricity("0") .valleyUsedElectricity("0") .build(); // orderBasicInfoService.settleOrder(data, orderInfo); } @Test public void testLoginHandler() { String msg = "8800000000001001010f63362d333000000000898604b319227036282200"; byte[] msgBody = BytesUtil.str2Bcd(msg); int startIndex = 0; int length = 7; // 桩编码 byte[] pileSnByte = BytesUtil.copyBytes(msgBody, startIndex, length); String pileSn = BytesUtil.binary(pileSnByte, 16); // log.info("桩号:{}", pileSn); // 桩类型 0 表示直流桩, 1 表示交流桩 startIndex += length; length = 1; byte[] pileTypeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String pileType = BytesUtil.bcd2Str(pileTypeByteArr); // 充电枪数量 startIndex += length; byte[] connectorNumByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String connectorNum = BytesUtil.bcd2Str(connectorNumByteArr); // 通信协议版本 版本号乘 10,v1.0 表示 0x0A startIndex += length; byte[] communicationVersionByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); // int i = Integer.parseInt(BytesUtil.bcd2Str(communicationVersionByteArr)); // 0F --> 15 BigDecimal bigDecimal = new BigDecimal(BytesUtil.bcd2Str(communicationVersionByteArr)); BigDecimal communicationVersionTemp = bigDecimal.divide(new BigDecimal(10)); String communicationVersion = "v" + communicationVersionTemp; // 程序版本 startIndex += length; length = 8; byte[] programVersionByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String programVersion = BytesUtil.bcd2Str(programVersionByteArr); // 网络连接类型 0x00 SIM 卡 0x01 LAN 0x02 WAN 0x03 其他 startIndex += length; length = 1; byte[] internetConnectionTypeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String internetConnection = BytesUtil.bcd2Str(internetConnectionTypeByteArr); // sim卡 startIndex += length; length = 10; byte[] simCardNumByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String iccid = BytesUtil.bin2HexStr(simCardNumByteArr); // 运营商 0x00 移动 0x02 电信 0x03 联通 0x04 其他 startIndex += length; length = 1; byte[] businessTypeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String business = BytesUtil.bcd2Str(businessTypeByteArr); LoginRequestData loginRequestData = LoginRequestData.builder() .pileSn(pileSn) .pileType(pileType) .connectorNum(connectorNum) .communicationVersion(communicationVersion) .programVersion(programVersion) .internetConnection(internetConnection) .iccid(iccid) .business(business) .build(); // 结果(默认 0x01:登录失败) byte[] flag = Constants.oneByteArray; // 通过桩编码SN查询数据库,如果有数据,则登录成功,否则登录失败 QueryPileDTO dto = new QueryPileDTO(); dto.setPileSn(pileSn); List list = pileBasicInfoService.queryPileInfos(dto); if (CollectionUtils.isNotEmpty(list)) { flag = Constants.zeroByteArray; // 登录成功,保存桩号和channel的关系 // PileChannelEntity.put(pileSn, channel); // 更改桩和该桩下的枪口状态分别为 在线、空闲 // pileBasicInfoService.updatePileStatus(pileSn, PileStatusEnum.ON_LINE.getValue()); // pileConnectorInfoService.updateConnectorStatusByPileSn(pileSn, PileConnectorDataBaseStatusEnum.FREE.getValue()); // 对时 ProofreadTimeCommand command = ProofreadTimeCommand.builder().pileSn(pileSn).build(); ykcPushCommandService.pushProofreadTimeCommand(command); // 公共方法修改状态 pileBasicInfoService.updateStatus(BytesUtil.bcd2Str(new byte[]{0x01}), pileSn, null, null, null); // 下发二维码 IssueQRCodeCommand issueQRCodeCommand = IssueQRCodeCommand.builder().pileSn(pileSn).build(); ykcPushCommandService.pushIssueQRCodeCommand(issueQRCodeCommand); } // 充电桩使用的sim卡,把信息存库 if (StringUtils.equals("00", internetConnection)) { try { pileBasicInfoService.updatePileSimInfo(pileSn, iccid); } catch (Exception e) { // log.error("更新充电桩sim卡信息失败", e); System.out.println(e.getMessage()); } } // 保存报文 String jsonMsg = JSON.toJSONString(loginRequestData); // pileMsgRecordService.save(pileSn, pileSn, type, jsonMsg, ykcDataProtocol.getHEXString()); // // 消息体 // byte[] messageBody = Bytes.concat(pileSnByte, flag); // return getResult(ykcDataProtocol, messageBody); } @Test public void testGetMemberToken() { String memberId = JWTUtils.getMemberId("eyJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE2NzY1MTY5MzgsImV4cCI6MTY3OTEwODkzOH0.4MwhZIOpnCfQloR7zEm2hwPOh2yyI2qxbBbTcv_SnZ4"); System.out.println(memberId); } /** * 测试更新银行卡 */ @Test public void changeBankCardTest() throws BaseAdaPayException { ChangeBankCardDTO dto = new ChangeBankCardDTO(); dto.setCardId("1018810800000168"); dto.setCardName("海南信祥物业管理有限公司"); dto.setTelNo("17384941319"); dto.setBankCode("88000835"); dto.setBankAcctType("1"); dto.setProvCode("0046"); dto.setAreaCode("4601"); String wechatAppId = wechatAppId1; // 1-删除结算账户信息 // String adapayMemberId = account.getAdapayMemberId(); String adapayMemberId = "ACM69867986"; String settleAccountId = null; AdapayCorpMemberVO adapayCorpMemberVO = adapayService.queryCorpAdapayMemberInfo(adapayMemberId, wechatAppId); if (adapayCorpMemberVO != null) { settleAccountId = adapayCorpMemberVO.getSettleAccountId(); } adapayService.createDeleteSettleAccountRequest(adapayMemberId, settleAccountId, wechatAppId); // 2-使用新账户信息创建结算账户 SettleAccountDTO settleAccountDTO = new SettleAccountDTO(); settleAccountDTO.setCardId(dto.getCardId()); settleAccountDTO.setCardName(dto.getCardName()); settleAccountDTO.setTelNo(dto.getTelNo()); settleAccountDTO.setBankCode(dto.getBankCode()); settleAccountDTO.setBankAcctType(dto.getBankAcctType()); settleAccountDTO.setProvCode(dto.getProvCode()); settleAccountDTO.setAreaCode(dto.getAreaCode()); adapayService.createSettleAccountRequest(settleAccountDTO, adapayMemberId, wechatAppId); } public static void main(String[] args) { String data = "{\"total\":1,\"stationStatusInfo\":{\"operationID\":\"123456789\",\"stationID\":\"111111111111111\",\"connectorStatusInfos\":{\"connectorID\":1,\"equipmentID\":\"10000000000000000000001\",\"status\":4,\"currentA\":0,\"currentB\":0,\"currentC\":0,\"voltageA\":0,\"voltageB\":0,\"voltageC\":0,\"soc\":10}}}"; String dataSecret = "1234567890abcdef"; String dataSecretIv = "1234567890abcdef"; // 加密数据 String encryptData = Cryptos.encrypt(JSON.toJSONString(data), dataSecret, dataSecretIv); String encryptData2 = Cryptos.aesEncrypt(JSON.toJSONString(data), dataSecret, dataSecretIv); System.out.println(StringUtils.equals(encryptData, encryptData2)); String str = "il7B0BSEjFdzpyKzfOFpvg/Se1CP802RItKYFPfSLRxJ3jf0bVl9hvYOEktPAYW2nd7S8MBcyHYyacHKbI" + "Sq5iTmDzG+ivnR+SZJv3USNTYVMz9rCQVSxd0cLlqsJauko79NnwQJbzDTyLooYoIwz75qBOH2/x" + "OMirpeEqRJrF/EQjWekJmGk9RtboXePu2rka+Xm51syBPhiXJAq0GfbfaFu9tNqs/e2Vjja/ltE1M0lq" + "vxfXQ6da6HrThsm5id4ClZFIi0acRfrsPLRixS/IQYtksxghvJwbqOsbIsITail9Ayy4tKcogeEZiOO+4Ed2" + "64NSKmk7l3wKwJLAFjCFogBx8GE3OBz4pqcAn/ydA="; System.out.println(StringUtils.equals(encryptData, str)); System.out.println(StringUtils.equals(encryptData2, str)); } }