提交git

This commit is contained in:
2025-08-25 18:51:02 +08:00
commit 9dd33ed2b9
2171 changed files with 172166 additions and 0 deletions

41
uling-alert/pom.xml Normal file
View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>uling</artifactId>
<groupId>cc.uling</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>uling-alert</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>cc.uling</groupId>
<artifactId>uling-common</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>cc.uling</groupId>
<artifactId>uling-yc-service</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.13.1</version> <!-- 使用最新版本 -->
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,13 @@
package cc.uling.alert.entity;
import lombok.Data;
import java.io.Serializable;
@Data
public class AlertConfig implements Serializable {
private String url;
}

View File

@ -0,0 +1,19 @@
package cc.uling.alert.entity;
import cc.uling.common.enums.RenderType;
import lombok.Data;
import java.io.Serializable;
@Data
public class AlertResult<T> implements Serializable {
private T result;
private RenderType type;
public AlertResult(RenderType type, T result) {
this.type = type;
this.result = result;
}
}

View File

@ -0,0 +1,48 @@
package cc.uling.alert.entity.austreme;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class Austreme implements Serializable {
private String EthocaID;
private Date AlertTimestamp;
private String Age;
private String Issuer;
private String CardNumber;
private Date TransactionTimestamp;
private String MerchantDescriptor;
private String EthocaMerchantID;
private BigDecimal Amount;
private String Currency;
private String TransactionType;
private String TransactionId;
private String InitiatedBy;
private String Liability;
private String authCode;
private String MerchantName;
private String PartnerMerchantID;
private String ChargebackReasonCode;
}

View File

@ -0,0 +1,28 @@
package cc.uling.alert.entity.austreme;
import cc.uling.alert.entity.AlertConfig;
import lombok.Data;
import java.io.Serializable;
@Data
public class AustremeConfig extends AlertConfig implements Serializable {
private String usernamer;
private String password;
public static void main(String[] args) {
}
public static AustremeConfig test() {
AustremeConfig austremeConfig = new AustremeConfig();
austremeConfig.setUrl("https://dispute-test.austreme.com/v1/ethoca/merchant/alert_outcome");
austremeConfig.setUsernamer("phxalerts_MmL23zpvmU");
austremeConfig.setPassword("YfjV3S5k4dOsxHtZ6JDKWAyvB7uDkU");
return austremeConfig;
}
}

View File

@ -0,0 +1,27 @@
package cc.uling.alert.entity.austreme;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import lombok.Data;
import org.nustaq.serialization.annotations.Serialize;
import java.io.Serializable;
/**
* @author yousuf
**/
@Data
@JacksonXmlRootElement(localName = "Alert")
public class ConfirmedAlert implements Serializable {
@Serialize
private static final long serialVersionUID = 4767487231266894375L;
@JacksonXmlProperty(localName = "EthocaID")
private String ethocaId;
@JacksonXmlProperty(localName = "Status")
private String status;
public ConfirmedAlert(String ethocaId) {
this.ethocaId = ethocaId;
this.status = "received";
}
}

View File

@ -0,0 +1,27 @@
package cc.uling.alert.entity.austreme;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import lombok.Data;
import org.nustaq.serialization.annotations.Serialize;
import java.io.Serializable;
/**
* @author yousuf
**/
@Data
@JacksonXmlRootElement(localName = "EthocaAlertConfirmation")
public class EthocaAlertConfirmation implements Serializable {
@Serialize
private static final long serialVersionUID = 4415899947251139258L;
@JacksonXmlProperty(localName = "Alert")
private ConfirmedAlert alert;
public EthocaAlertConfirmation() {
}
public EthocaAlertConfirmation(ConfirmedAlert alert) {
this.alert = alert;
}
}

View File

@ -0,0 +1,15 @@
package cc.uling.alert.entity.austreme;
import lombok.Data;
import java.io.Serializable;
@Data
public class UpdateAlertStatus implements Serializable {
private String alertId;
private String status;
}

View File

@ -0,0 +1,34 @@
package cc.uling.alert.service;
import cc.uling.alert.entity.AlertConfig;
import cc.uling.alert.entity.AlertResult;
import com.web.gen.model.RefuseWarningOrder;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
public interface AlertNoticeService<T extends AlertConfig> {
AlertResult notice(HttpServletRequest request, Map<String, String> params, String body);
/**
* 预警订单
*
* @param order
*/
void updateStatus(RefuseWarningOrder order);
/**
* 获取配置
*
* @param config
* @return
*/
T getConfig(String config);
}

View File

@ -0,0 +1,11 @@
package cc.uling.alert.service;
import cc.uling.alert.entity.AlertConfig;
import io.jboot.aop.annotation.Bean;
@Bean
public abstract class AlertNoticeServiceImpl<T extends AlertConfig> implements AlertNoticeService<AlertConfig> {
}

View File

@ -0,0 +1,199 @@
package cc.uling.alert.service;
import cc.uling.alert.entity.AlertResult;
import cc.uling.alert.entity.austreme.Austreme;
import cc.uling.alert.entity.austreme.AustremeConfig;
import cc.uling.common.enums.RenderType;
import cc.uling.common.exception.BizException;
import cc.uling.common.utils.BigDecimalUtil;
import cc.uling.common.utils.HttpUtil;
import cc.uling.common.utils.StringUtil;
import cc.uling.domain.bo.warning.RefuseWarningBO;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.jfinal.aop.Inject;
import com.web.gen.model.*;
import com.web.gen.model.Currency;
import com.web.gen.service.*;
import io.jboot.aop.annotation.Bean;
import io.jboot.aop.annotation.Transactional;
import io.jboot.db.model.Columns;
import lombok.extern.slf4j.Slf4j;
import javax.servlet.http.HttpServletRequest;
import java.util.*;
@Slf4j
@Bean
public class AustremeAlertNoticeServiceImpl extends AlertNoticeServiceImpl<AustremeConfig> {
private static final String TYPE = "Ethoca";
@Inject
private CurrencyService currencyService;
@Inject
private PayOrderService payOrderService;
@Inject
private RefuseWarningOrderService refuseWarningOrderService;
@Inject
private MchWarningChannelService mchWarningChannelService;
@Inject
private SettlementOrderService settlementOrderService;
@Inject
private RefuseWarningChannelService refuseWarningChannelService;
@Override
public AlertResult<String> notice(HttpServletRequest request, Map<String, String> params, String body) {
try {
JSONObject json = JSONUtil.xmlToJson(body);
log.info(" Austreme 预警通知 Params: {}", json);
if (!json.containsKey("EthocaAlertNotification")) {
return new AlertResult<>(RenderType.TEXT, success(""));
}
JSONObject notification = getJSONObject(json, "EthocaAlertNotification");
JSONObject alerts = getJSONObject(notification, "CustomerDisputeAlerts", "ConfirmedFraudAlerts");
JSONObject alert = getJSONObject(alerts, "Alert");
Austreme austreme = JSONUtil.toBean(alert, Austreme.class);
pushUpdateResult(austreme);
log.info(" Austreme 预警通知: {}", austreme);
return new AlertResult<>(RenderType.TEXT, success(austreme.getEthocaID()));
} catch (Exception e) {
return new AlertResult<>(RenderType.TEXT, failure(e.getMessage()));
}
}
/*
API密钥
Usernamer: phxalerts_MmL23zpvmU
Password: YfjV3S5k4dOsxHtZ6JDKWAyvB7uDkU
推送密钥:
Push Usernamephxalerts_SBfScMMibf
Push Password4F8pH6KAjcDr4LiVthJU2GZizzHZF2
*/
@Override
public void updateStatus(RefuseWarningOrder order) {
RefuseWarningChannel channel = refuseWarningChannelService.findById(order.getChannelId());
if (channel == null) {
throw new BizException("alert.configuration.error");
}
AustremeConfig config = getConfig(channel.getConfig());
JSONObject object = new JSONObject();
JSONObject ethocaAlertsUpdate = new JSONObject();
ethocaAlertsUpdate.set("Username", config.getUsernamer());
ethocaAlertsUpdate.set("Password", config.getPassword());
List<JSONObject> list = new ArrayList<>();
JSONObject ethocaUpdateEvent = new JSONObject();
ethocaUpdateEvent.set("EthocaID", order.getOutWarningId());
ethocaUpdateEvent.set("Outcome", order.getStatus());
ethocaUpdateEvent.set("Refunded", order.getRefundResult());
ethocaUpdateEvent.set("FirstPartyFraud", order.getRefundResult());
ethocaUpdateEvent.set("AmountStopped", order.getRefundResult());
ethocaUpdateEvent.set("ActionTimestamp", order.getRefundResult());
list.add(ethocaUpdateEvent);
ethocaAlertsUpdate.set("EthocaUpdateEvent", list);
object.set("EthocaAlertsUpdate", ethocaAlertsUpdate);
String xml = JSONUtil.toXmlStr(object);
String url = config.getUrl() + "/v1/ethoca/merchant/alert_outcome";
String response = HttpUtil.postXml(url, xml);
if (StringUtil.isNotBlank(response)) {
}
}
@Override
public AustremeConfig getConfig(String config) {
return JSON.parseObject(config, AustremeConfig.class);
}
@Transactional
public void pushUpdateResult(Austreme austreme) {
RefuseWarningOrder order = refuseWarningOrderService.findFirstByColumns(Columns.create("out_warning_id", austreme.getEthocaID()));
if (order != null) {
return;
}
PayOrder payOrder = payOrderService.findFirstByColumns(Columns.create("pay_order_id", austreme.getTransactionType()));
Date startTime = DateUtil.offsetMinute(austreme.getTransactionTimestamp(), -3);
Date endTime = DateUtil.offsetMinute(austreme.getTransactionTimestamp(), 3);
String cardNumber = getCardNumber(austreme.getCardNumber());
Currency currency = currencyService.findByCode(austreme.getCurrency());
Long amount = BigDecimalUtil.toLongCent(austreme.getAmount(), currency.getPoint());
log.info(" 卡号 {} 金额 {}", cardNumber, amount);
if (payOrder == null) {
payOrder = payOrderService.findFirstByColumns(Columns.create("bank_card_encryption", cardNumber).eq("amount", amount).between("success_time", startTime.toString(), endTime.toString()));
}
if (payOrder == null) {
return;
}
MchWarningChannel channel = mchWarningChannelService.getMchWarningChannel(payOrder.getMchNo(), null, TYPE);
RefuseWarningBO bo = new RefuseWarningBO();
bo.setWarningId(austreme.getEthocaID());
bo.setMethod(austreme.getChargebackReasonCode());
bo.setTransactionId(payOrder.getPayOrderId());
bo.setCardNumber(cardNumber);
bo.setAlertTime(austreme.getAlertTimestamp());
RefuseWarningOrder warningOrder = refuseWarningOrderService.addWarningOrders(payOrder, channel, bo);
warningOrder.save();
SettlementOrder settlementOrder = settlementOrderService.refuseWarning(payOrder, currency.getCurrency(), channel.getFee());
settlementOrder.save();
}
private String success(String alertId) {
JSONObject object = new JSONObject();
JSONObject ethocaAlertConfirmation = new JSONObject();
JSONObject confirmedAlert = new JSONObject();
confirmedAlert.put("ethocaId", alertId);
confirmedAlert.put("status", "received");
ethocaAlertConfirmation.put("Alert", confirmedAlert);
object.put("EthocaAlertConfirmation", ethocaAlertConfirmation);
return object.toString();
}
private String failure(String message) {
JSONObject object = new JSONObject();
JSONObject ethocaAlertConfirmation = new JSONObject();
JSONObject confirmedAlert = new JSONObject();
confirmedAlert.put("ethocaId", "");
confirmedAlert.put("status", message);
ethocaAlertConfirmation.put("Alert", confirmedAlert);
object.put("EthocaAlertConfirmation", ethocaAlertConfirmation);
return object.toString();
}
private JSONObject getJSONObject(JSONObject jsonObject, String... keys) {
for (String key : keys) {
if (jsonObject.containsKey(key)) {
return jsonObject.getJSONObject(key);
}
}
throw new BizException("missing.important.parameters").add(keys);
}
private static String getCardNumber(String card) {
return card.substring(0, 6) + "******" + card.substring(card.length() - 4, card.length());
}
}

154
uling-alert/uling-alert.iml Normal file
View File

@ -0,0 +1,154 @@
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="uling-common" />
<orderEntry type="library" name="Maven: com.github.oshi:oshi-core:6.5.0" level="project" />
<orderEntry type="library" name="Maven: net.java.dev.jna:jna:5.14.0" level="project" />
<orderEntry type="library" name="Maven: net.java.dev.jna:jna-platform:5.14.0" level="project" />
<orderEntry type="library" name="Maven: com.google.zxing:javase:3.3.0" level="project" />
<orderEntry type="library" name="Maven: com.google.zxing:core:3.3.0" level="project" />
<orderEntry type="library" name="Maven: com.beust:jcommander:1.48" level="project" />
<orderEntry type="library" name="Maven: com.github.jai-imageio:jai-imageio-core:1.3.1" level="project" />
<orderEntry type="library" name="Maven: org.redisson:redisson:3.12.3" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-common:4.1.45.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.45.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.45.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.45.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.45.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-resolver-dns:4.1.45.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-codec-dns:4.1.45.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.45.Final" level="project" />
<orderEntry type="library" name="Maven: javax.cache:cache-api:1.0.0" level="project" />
<orderEntry type="library" name="Maven: io.projectreactor:reactor-core:3.3.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.3" level="project" />
<orderEntry type="library" name="Maven: io.reactivex.rxjava2:rxjava:2.2.17" level="project" />
<orderEntry type="library" name="Maven: org.yaml:snakeyaml:1.25" level="project" />
<orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy:1.10.7" level="project" />
<orderEntry type="library" name="Maven: org.jodd:jodd-bean:5.0.13" level="project" />
<orderEntry type="library" name="Maven: org.jodd:jodd-core:5.0.13" level="project" />
<orderEntry type="library" name="Maven: com.jhlabs:filters:2.0.235" level="project" />
<orderEntry type="library" name="Maven: com.sun.mail:javax.mail:1.6.2" level="project" />
<orderEntry type="library" name="Maven: javax.activation:activation:1.1" level="project" />
<orderEntry type="library" name="Maven: com.alibaba:fastjson:2.0.52" level="project" />
<orderEntry type="library" name="Maven: com.alibaba.fastjson2:fastjson2-extension:2.0.52" level="project" />
<orderEntry type="library" name="Maven: com.alibaba.fastjson2:fastjson2:2.0.52" level="project" />
<orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.9.4" level="project" />
<orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2.2" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.6" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpmime:4.3.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:fluent-hc:4.5.2" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.2" level="project" />
<orderEntry type="library" name="Maven: commons-httpclient:commons-httpclient:3.0.1" level="project" />
<orderEntry type="library" name="Maven: junit:junit:3.8.1" level="project" />
<orderEntry type="library" name="Maven: com.alibaba:easyexcel:4.0.3" level="project" />
<orderEntry type="library" name="Maven: com.alibaba:easyexcel-core:4.0.3" level="project" />
<orderEntry type="library" name="Maven: com.alibaba:easyexcel-support:3.3.4" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-csv:1.11.0" level="project" />
<orderEntry type="library" name="Maven: org.ehcache:ehcache:3.9.11" level="project" />
<orderEntry type="library" name="Maven: commons-io:commons-io:2.14.0" level="project" />
<orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml:5.2.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.poi:poi:5.2.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-math3:3.6.1" level="project" />
<orderEntry type="library" name="Maven: com.zaxxer:SparseBitSet:1.2" level="project" />
<orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml-lite:5.2.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.xmlbeans:xmlbeans:5.1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-compress:1.21" level="project" />
<orderEntry type="library" name="Maven: com.github.virtuald:curvesapi:1.07" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-collections4:4.4" level="project" />
<orderEntry type="module" module-name="uling-yc-service" />
<orderEntry type="module" module-name="uling-system" />
<orderEntry type="module" module-name="uling-framework" />
<orderEntry type="library" name="Maven: cn.hutool:hutool-jwt:5.8.27" level="project" />
<orderEntry type="library" name="Maven: cn.hutool:hutool-json:5.8.27" level="project" />
<orderEntry type="library" name="Maven: cn.hutool:hutool-core:5.8.27" level="project" />
<orderEntry type="library" name="Maven: cn.hutool:hutool-crypto:5.8.27" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-text:1.10.0" level="project" />
<orderEntry type="library" name="Maven: org.quartz-scheduler:quartz:2.3.2" level="project" />
<orderEntry type="library" name="Maven: com.mchange:mchange-commons-java:0.2.15" level="project" />
<orderEntry type="library" name="Maven: com.zaxxer:HikariCP-java7:2.4.13" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5" level="project" />
<orderEntry type="library" name="Maven: cloud.tianai.captcha:tianai-captcha:1.5.1" level="project" />
<orderEntry type="module" module-name="uling-components" />
<orderEntry type="library" name="Maven: com.rabbitmq:amqp-client:5.11.0" level="project" />
<orderEntry type="module" module-name="uling-api-demo" />
<orderEntry type="library" name="Maven: io.swagger:swagger-core:1.5.21" level="project" />
<orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.21" level="project" />
<orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.21" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.13.1" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.13.1" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.13.1" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.13.1" level="project" />
<orderEntry type="library" name="Maven: org.codehaus.woodstox:stax2-api:4.2.1" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.woodstox:woodstox-core:6.2.7" level="project" />
<orderEntry type="library" name="Maven: io.jboot:jboot:3.15.7" level="project" />
<orderEntry type="library" name="Maven: com.jfinal:jfinal:5.0.1" level="project" />
<orderEntry type="library" name="Maven: com.jfinal:cos:2022.2" level="project" />
<orderEntry type="library" name="Maven: com.jfinal:jfinal-undertow:3.1" level="project" />
<orderEntry type="library" name="Maven: io.undertow:undertow-core:2.2.18.Final" level="project" />
<orderEntry type="library" name="Maven: org.jboss.xnio:xnio-api:3.8.7.Final" level="project" />
<orderEntry type="library" name="Maven: org.wildfly.common:wildfly-common:1.5.4.Final" level="project" />
<orderEntry type="library" name="Maven: org.wildfly.client:wildfly-client-config:1.0.1.Final" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.jboss.xnio:xnio-nio:3.8.7.Final" level="project" />
<orderEntry type="library" name="Maven: org.jboss.threads:jboss-threads:3.1.0.Final" level="project" />
<orderEntry type="library" name="Maven: io.undertow:undertow-servlet:2.2.18.Final" level="project" />
<orderEntry type="library" name="Maven: javax.servlet:javax.servlet-api:4.0.1" level="project" />
<orderEntry type="library" name="Maven: cglib:cglib:3.3.0" level="project" />
<orderEntry type="library" name="Maven: org.ow2.asm:asm:7.1" level="project" />
<orderEntry type="library" name="Maven: io.undertow:undertow-websockets-jsr:2.2.18.Final" level="project" />
<orderEntry type="library" name="Maven: org.jboss.spec.javax.websocket:jboss-websocket-api_1.1_spec:2.0.0.Final" level="project" />
<orderEntry type="library" name="Maven: com.zaxxer:HikariCP:4.0.3" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.3" level="project" />
<orderEntry type="library" name="Maven: mysql:mysql-connector-java:5.1.49" level="project" />
<orderEntry type="library" name="Maven: de.ruedigermoeller:fst:2.57" level="project" />
<orderEntry type="library" name="Maven: org.objenesis:objenesis:2.5.1" level="project" />
<orderEntry type="library" name="Maven: org.javassist:javassist:3.29.0-GA" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:guava:31.1-jre" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:failureaccess:1.0.1" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava" level="project" />
<orderEntry type="library" name="Maven: com.google.code.findbugs:jsr305:3.0.2" level="project" />
<orderEntry type="library" name="Maven: org.checkerframework:checker-qual:3.12.0" level="project" />
<orderEntry type="library" name="Maven: com.google.errorprone:error_prone_annotations:2.11.0" level="project" />
<orderEntry type="library" name="Maven: com.google.j2objc:j2objc-annotations:1.3" level="project" />
<orderEntry type="library" name="Maven: it.sauronsoftware.cron4j:cron4j:2.2.5" level="project" />
<orderEntry type="library" name="Maven: org.jsoup:jsoup:1.14.3" level="project" />
<orderEntry type="library" name="Maven: com.github.ben-manes.caffeine:caffeine:2.9.3" level="project" />
<orderEntry type="library" name="Maven: javax.annotation:javax.annotation-api:1.3.2" level="project" />
<orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.0.21.Final" level="project" />
<orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.3.2.Final" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml:classmate:1.3.4" level="project" />
<orderEntry type="library" name="Maven: org.glassfish:javax.el:3.0.0" level="project" />
<orderEntry type="library" name="Maven: io.dropwizard.metrics:metrics-core:4.2.9" level="project" />
<orderEntry type="library" name="Maven: io.dropwizard.metrics:metrics-servlets:4.2.9" level="project" />
<orderEntry type="library" name="Maven: io.dropwizard.metrics:metrics-json:4.2.9" level="project" />
<orderEntry type="library" name="Maven: com.helger:profiler:1.1.1" level="project" />
<orderEntry type="library" name="Maven: io.dropwizard.metrics:metrics-healthchecks:4.2.9" level="project" />
<orderEntry type="library" name="Maven: io.dropwizard.metrics:metrics-jvm:4.2.9" level="project" />
<orderEntry type="library" name="Maven: io.jsonwebtoken:jjwt:0.9.1" level="project" />
<orderEntry type="library" name="Maven: c3p0:c3p0:0.9.1.2" level="project" />
<orderEntry type="library" name="Maven: com.alibaba:druid:1.0.21" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-pool2:2.4.3" level="project" />
<orderEntry type="library" name="Maven: redis.clients:jedis:3.2.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.projectlombok:lombok:1.18.16" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.30" level="project" />
<orderEntry type="library" name="Maven: log4j:log4j:1.2.17" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-core:2.23.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.23.1" level="project" />
<orderEntry type="library" name="Maven: javax.validation:validation-api:2.0.1.Final" level="project" />
<orderEntry type="library" name="Maven: commons-logging:commons-logging:1.2" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.6" level="project" />
<orderEntry type="library" name="Maven: commons-codec:commons-codec:1.10" level="project" />
<orderEntry type="library" name="Maven: cn.hutool:hutool-all:5.8.29" level="project" />
<orderEntry type="library" name="Maven: pro.fessional:kaptcha:2.3.3" level="project" />
<orderEntry type="library" name="Maven: eu.bitwalker:UserAgentUtils:1.19" level="project" />
</component>
</module>