Commit 577de999 by ddx

init

parents
.idea/
*.iml
*/target
/target/sonar
/logs/
data/hanlp/**/*.bin
data/hanlp/**/*.dat
data/index/
data/model/
/ai-server/src/test/
init project on 2024-04-17
\ No newline at end of file
<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>etax-income-api</artifactId>
<groupId>com.sxc.etaxincome</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>etax-income-common</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>etax-income-common</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.sxc.framework</groupId>
<artifactId>framework-common</artifactId>
</dependency>
<dependency>
<groupId>com.sxc.framework</groupId>
<artifactId>model-token</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<dependency>
<groupId>com.github.rholder</groupId>
<artifactId>guava-retrying</artifactId>
</dependency>
<!-- unit test start -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite-api</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-inline</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito2</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<artifactId>mockito-core</artifactId>
<groupId>org.mockito</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.17.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<!-- unit test end -->
</dependencies>
</project>
package com.sxc.etaxincome.common.enums;
import lombok.Getter;
@Getter
public enum CountTypeCode {
HOUR("hour", "时"),
DAY("day", "天"),
WEEK("week", "周"),
MONTH("month", "月"),
YEAR("year", "年");
private final String code;
private final String desc;
CountTypeCode(String code, String desc) {
this.code = code;
this.desc = desc;
}
public static CountTypeCode as(String code) {
for (CountTypeCode countTypeCode : CountTypeCode.values()) {
if (countTypeCode.code.equals(code)) {
return countTypeCode;
}
}
return null;
}
}
package com.sxc.etaxincome.common.model.report;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @ProjectName: etax-income-api
* @Package: com.sxc.etaxincome.common.model.report
* @ClassName: IncomeExceptionStatResult
* @Author: ddx
* @Description:
* @Date: 2024-06-20 16:48
* @Version: 1.0
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class IncomeExceptionStatResult {
private String resCode;
private String resMsg;
private Integer resNum;
}
package com.sxc.etaxincome.common.model.report;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class IncomeInvoiceStatResult {
/**
* 用户名
*/
private String userName;
/**
* 统计日期(yyyy-MM-dd)
*/
private String statDate;
/**
* 地区数量
*/
private Integer zoneTotalNum;
/**
* 接口请求成功数量
*/
private Integer successTotalNum;
/**
* 接口请求失败数量
*/
private Integer failTotalNum;
/**
* 税号数量
*/
private Integer taxnoTotalNum;
/**
* 接口请求数量合计
*/
private Integer sumTotalNum;
/**
* 地区最大请求接口数量
*/
private Integer faceMaxNum;
}
package com.sxc.etaxincome.common.util;
import lombok.extern.slf4j.Slf4j;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.UnknownHostException;
import java.util.Enumeration;
/**
* @author caosongqing
* @date 2022/11/3
* @description
*/
@Slf4j
public class IPUtils {
private IPUtils() {
}
public static String getIP() {
try {
InetAddress inetAddress = getLocalHostExactAddress();
if (inetAddress != null) {
InetAddress addr = InetAddress.getLocalHost();
return addr.getHostAddress();
}
} catch (UnknownHostException e) {
log.error("get ip error:", e);
}
return "";
}
public static InetAddress getLocalHostExactAddress() {
try {
InetAddress candidateAddress = null;
Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
while (networkInterfaces.hasMoreElements()) {
NetworkInterface iface = networkInterfaces.nextElement();
// 该网卡接口下的ip会有多个,也需要一个个的遍历,找到自己所需要的
for (Enumeration<InetAddress> inetAddrs = iface.getInetAddresses(); inetAddrs.hasMoreElements(); ) {
InetAddress inetAddr = inetAddrs.nextElement();
// 排除loopback回环类型地址(不管是IPv4还是IPv6 只要是回环地址都会返回true)
if (inetAddr.isLoopbackAddress()) {
continue;
}
if (inetAddr.isSiteLocalAddress()) {
// 如果是site-local地址,就是它了 就是我们要找的
// ~~~~~~~~~~~~~绝大部分情况下都会在此处返回你的ip地址值~~~~~~~~~~~~~
return inetAddr;
}
// 若不是site-local地址 那就记录下该地址当作候选
if (candidateAddress == null) {
candidateAddress = inetAddr;
}
}
}
// 如果出去loopback回环地之外无其它地址了,那就回退到原始方案吧
return candidateAddress == null ? InetAddress.getLocalHost() : candidateAddress;
} catch (Exception e) {
log.error("获取IP失败", e);
}
return null;
}
}
package com.sxc.etaxincome.common.util;
import ch.qos.logback.core.PropertyDefinerBase;
import cn.hutool.http.HttpUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
/**
* @author caosongqing
* @date 2022/10/31
* @description
*/
@Slf4j
public class LogIpConfig extends PropertyDefinerBase {
private String getIpUrl = "http://ocr.taxservices.cn/opserver/myip.do";
@Override
public String getPropertyValue() {
String ip;
ip = IPUtils.getIP();
if (StringUtils.isBlank(ip) || "127.0.0.1".equals(ip)) {
try {
ip = HttpUtil.get(getIpUrl);
log.info("get ip:{} with url:{}", ip, getIpUrl);
} catch (Exception ex) {
log.error("get ip error:", ex);
}
}
log.info("log with ip: {}", ip);
return ip;
}
}
package com.sxc.etaxincome.common.util;
import com.sxc.framework.common.exception.HttpClientException;
import com.sxc.framework.common.httpclient.HttpHelper;
import com.sxc.framework.common.httpclient.ResponseContent;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.NoHttpResponseException;
import org.apache.http.conn.ConnectTimeoutException;
import java.nio.charset.StandardCharsets;
import java.util.Map;
@Slf4j
public class RetryHttpHelper {
private RetryHttpHelper() {
}
public static final int COLLECTION_REQUEST_TIMEOUT_MILLIS = 5000;
public static final int CONNECTION_TIMEOUT_MILLS = 5000;
public static final int SOCKET_TIMEOUT_MILLIS = 90000;
/**
* retry times
*/
public static final int RETRY_TIMES = 3;
public static final int WAIT_SECONDS = 2;
public static ResponseContent retryPostUrl(String url, Map<String, Object> paramsMap) {
return retryPostUrl(url, paramsMap, CONNECTION_TIMEOUT_MILLS, SOCKET_TIMEOUT_MILLIS);
}
public static ResponseContent retryPostUrl(String url, Map<String, Object> paramsMap, Integer connectTimeoutMilliSeconds, Integer socketTimeoutMilliSeconds) {
RetryUtil<ResponseContent> retryUtil = RetryUtil.<ResponseContent>builder().times(RETRY_TIMES).waitSeconds(WAIT_SECONDS).build();
try {
return retryUtil.retry(() -> postUrl(url, paramsMap, connectTimeoutMilliSeconds, socketTimeoutMilliSeconds));
} catch (Exception e) {
throw new HttpClientException(e.getCause().getMessage());
}
}
private static ResponseContent postUrl(String url, Map<String, Object> paramsMap, Integer connectTimeoutMilliSeconds, Integer socketTimeoutMilliSeconds) {
return postUrl(() -> HttpHelper.postUrl(url, paramsMap, connectTimeoutMilliSeconds, socketTimeoutMilliSeconds));
}
public static ResponseContent retryPostJsonEntity(String url, String jsonBody) {
return retryPostJsonEntity(url, jsonBody, COLLECTION_REQUEST_TIMEOUT_MILLIS, CONNECTION_TIMEOUT_MILLS, SOCKET_TIMEOUT_MILLIS);
}
public static ResponseContent retryPostJsonEntity(String url, String jsonBody, int connectionRequestTimeout, int connectTimeout, int socketTimeout) {
RetryUtil<ResponseContent> retryUtil = RetryUtil.<ResponseContent>builder().times(RETRY_TIMES).waitSeconds(WAIT_SECONDS).build();
try {
return retryUtil.retry(() -> postJsonEntity(url, jsonBody, connectionRequestTimeout, connectTimeout, socketTimeout));
} catch (Exception e) {
throw new HttpClientException(e.getCause().getMessage());
}
}
private static ResponseContent postJsonEntity(String url, String jsonBody, int connectionRequestTimeout, int connectTimeout, int socketTimeout) {
return postUrl(() -> HttpHelper.postJsonEntity(url, jsonBody, connectionRequestTimeout, connectTimeout, socketTimeout));
}
private static ResponseContent postUrl(ExecuteRequestCallback executeRequestCallback) {
try {
return executeRequestCallback.execute();
} catch (HttpClientException e) {
/*
HttpClientException是HttpHelper工具封装的异常
*/
log.error("execute makeout invoice http request error:", e);
/*
NoHttpResponseException 重试
ConnectTimeoutException 连接超时重试
SocketTimeoutException 响应超时不重试,避免造成业务数据不一致
*/
Throwable causeException = e.getCause();
/*
NoHttpResponseException说明
httpclient之前与服务端建立的链接已经失效(例如:tomcat 默认的keep-alive timeout :20s),
再次从连接池拿该失效链接进行请求时,就会报错。
*/
String causeExceptionMessage = causeException.getMessage();
if (causeException instanceof NoHttpResponseException
|| causeException instanceof ConnectTimeoutException) {
log.error("retry exception");
throw new HttpClientException(causeExceptionMessage);
} else {
log.error("cause exception message:{}", causeExceptionMessage);
ResponseContent responseContent = new ResponseContent();
responseContent.setContentBytes(causeExceptionMessage.getBytes(StandardCharsets.UTF_8));
return responseContent;
}
}
}
interface ExecuteRequestCallback {
ResponseContent execute();
}
}
package com.sxc.etaxincome.common.util;
import com.github.rholder.retry.*;
import com.google.common.base.Predicates;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
/**
* @author caosongqing
* @date 2023/1/16
* @description retry util.
*/
@Slf4j
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class RetryUtil<T> {
private int times = 2;
private int waitSeconds = 10;
public T retry(Callable<T> callable) throws ExecutionException, RetryException {
//定义重试机制
Retryer<T> retryer = RetryerBuilder.<T>newBuilder()
//retryIf 重试条件
.retryIfException()
.retryIfRuntimeException()
.retryIfExceptionOfType(Exception.class)
.retryIfException(Predicates.equalTo(new Exception()))
//等待策略:每次请求间隔1s
//fixedWait 固定X秒后重试
//noWait不等时间直接重试
//incrementingWait 第一个参数为第一次重试时间,后面会通过设置间隔递增秒数重试
//randomWait 随机等待设置范围内的时间重试
.withWaitStrategy(WaitStrategies.fixedWait(waitSeconds, TimeUnit.SECONDS))
//停止策略 : 尝试请求n次
.withStopStrategy(StopStrategies.stopAfterAttempt(times))
.withRetryListener(new TimesRetryListener())
.withRetryListener(new ExceptionRetryListener())
.build();
//利用重试器调用请求
return retryer.call(callable);
}
private class TimesRetryListener implements RetryListener {
@Override
public <V> void onRetry(Attempt<V> attempt) {
log.info("try {} times", attempt.getAttemptNumber());
}
}
private class ExceptionRetryListener implements RetryListener {
@Override
public <V> void onRetry(Attempt<V> attempt) {
if (attempt.hasException()) {
log.error("error:", attempt.getExceptionCause());
}
}
}
}
package com.sxc.etaxincome.common.generator.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
*
* </p>
*
* @author mybatis-plus-generator
* @since 2024-04-25 16:15:59
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class EtaxReportResultConfig implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 自增主键
*/
private Long id;
/**
* 接口编号
*/
private String apiCode;
/**
* 报表名
*/
private String tableName;
/**
* 报表编码
*/
private String tableCode;
/**
* 行位置
*/
private String locationRow;
/**
* 列位置
*/
private String locationCol;
/**
* 电子税局参数名
*/
private String etaxParamName;
/**
* 映射关系参数名
*/
private String etaxExportName;
/**
* 电子税局value
*/
private String etaxParamValue;
/**
* 是否显示 0-否 1-是
*/
private String showFlag;
/**
* 是否校验 0-否 1-是
*/
private String checkFlag;
/**
* 校验适配类
*/
private String checkClass;
/**
* 说明
*/
private String remark;
/**
* 创建日期
*/
private LocalDateTime createTime;
/**
* 最后更新日期
*/
private LocalDateTime updateTime;
}
<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>etax-income-api</artifactId>
<groupId>com.sxc.etaxincome</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>etax-income-controller</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>etax-income-controller</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.sxc.etaxincome</groupId>
<artifactId>etax-income-domain</artifactId>
</dependency>
<dependency>
<groupId>com.sxc.etaxincome</groupId>
<artifactId>etax-income-service</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>io.undertow</groupId>
<artifactId>undertow-servlet</artifactId>
</dependency>
<!-- unit test start -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite-api</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test-autoconfigure</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.skyscreamer</groupId>
<artifactId>jsonassert</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito2</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<artifactId>mockito-core</artifactId>
<groupId>org.mockito</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<scope>test</scope>
</dependency>
<!-- unit test end -->
</dependencies>
</project>
package com.sxc.etaxincome.controller;
import com.sxc.etaxincome.common.enums.CountTypeCode;
import com.sxc.etaxincome.domain.command.analysis.IAnalysisCommand;
import com.sxc.etaxincome.domain.model.report.AnalysisCriteria;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
@RequestMapping("/analysis")
public class AnalysisController {
@Autowired
@Qualifier(value = "analysisCommand")
private IAnalysisCommand analysisCommand;
@Autowired
@Qualifier(value = "areaGroupCommand")
private IAnalysisCommand areaGroupCommand;
@Autowired
@Qualifier(value = "queryIncomeSuccessAnalysisCommand")
private IAnalysisCommand queryIncomeSuccessAnalysisCommand;
@Autowired
@Qualifier(value = "groupAnalysisCommand")
private IAnalysisCommand groupAnalysisCommand;
@Autowired
@Qualifier(value = "sellerGrowthCommand")
private IAnalysisCommand sellerGrowthCommand;
@GetMapping("/hourly")
public String analysisHourly(AnalysisCriteria analysisCriteria) {
analysisCriteria.setCountType(CountTypeCode.HOUR.getCode());
return analysisCommand.handle(analysisCriteria);
}
@GetMapping("/daily")
public String analysisDaily(AnalysisCriteria analysisCriteria) {
analysisCriteria.setCountType(CountTypeCode.DAY.getCode());
return analysisCommand.handle(analysisCriteria);
}
@GetMapping("/monthly")
public String analysisMonthly(AnalysisCriteria analysisCriteria) {
analysisCriteria.setCountType(CountTypeCode.MONTH.getCode());
return analysisCommand.handle(analysisCriteria);
}
@GetMapping("/weekly")
public String analysisWeekly(AnalysisCriteria analysisCriteria) {
analysisCriteria.setCountType(CountTypeCode.WEEK.getCode());
return analysisCommand.handle(analysisCriteria);
}
@GetMapping("/area-group")
public String analysisAreaGroup(AnalysisCriteria analysisCriteria) {
return areaGroupCommand.handle(analysisCriteria);
}
@GetMapping("/query-income-success")
public String queryIncomeSuccessList(AnalysisCriteria analysisCriteria) {
return queryIncomeSuccessAnalysisCommand.handle(analysisCriteria);
}
@GetMapping("/daily-group")
public String analysisDailyGroup(AnalysisCriteria analysisCriteria) {
analysisCriteria.setCountType(CountTypeCode.DAY.getCode());
return groupAnalysisCommand.handle(analysisCriteria);
}
@GetMapping("/seller-growth")
public String analysisSellerGrowth(AnalysisCriteria analysisCriteria) {
return sellerGrowthCommand.handle(analysisCriteria);
}
}
package com.sxc.etaxincome.controller;
import com.sxc.etaxincome.domain.business.IExceptionManager;
import com.sxc.etaxincome.domain.model.report.AnalysisCriteria;
import com.sxc.framework.common.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
@RequestMapping("/exception")
public class ExceptionController {
@Autowired
private IExceptionManager exceptionManager;
@GetMapping("/stat")
public String exceptionStat(AnalysisCriteria analysisCriteria) {
return JSONUtil.toString(exceptionManager.getExceptionStatList(analysisCriteria));
}
}
package com.sxc.etaxincome.controller;
import cn.hutool.core.convert.impl.UUIDConverter;
import com.alibaba.fastjson2.util.UUIDUtils;
import com.sxc.etaxincome.domain.command.report.IReportCommand;
import com.sxc.etaxincome.domain.model.common.CommonRequestWrapper;
import com.sxc.etaxincome.domain.model.common.CommonResponse;
import com.sxc.etaxincome.domain.model.report.IReportResponse;
import com.sxc.framework.common.identity.UUIDGenerator;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.httpclient.util.DateUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.UUID;
/**
* @author caosongqing
* @date 2024/4/24
* @description
*/
@Slf4j
@RestController
@RequestMapping("/manage")
public class ManageController {
@Autowired
@Qualifier(value = "cancelReportCommand")
private IReportCommand cancelReportCommand;
@Autowired
@Qualifier(value = "forceReportCommand")
private IReportCommand forceReportCommand;
@PostMapping("/cancel")
public CommonResponse<IReportResponse> cancelReport(@Validated CommonRequestWrapper commonRequestWrapper) {
return cancelReportCommand.execute(commonRequestWrapper);
}
@PostMapping("/cancel/json")
public CommonResponse<IReportResponse> cancelReportJson(@Validated @RequestBody CommonRequestWrapper requestCommonWrapper) {
return cancelReportCommand.execute(requestCommonWrapper);
}
@PostMapping("/force")
public CommonResponse<IReportResponse> forceReport(@Validated CommonRequestWrapper commonRequestWrapper) {
return forceReportCommand.execute(commonRequestWrapper);
}
@PostMapping("/force/json")
public CommonResponse<IReportResponse> forceReportJson(@Validated @RequestBody CommonRequestWrapper requestCommonWrapper) {
return forceReportCommand.execute(requestCommonWrapper);
}
@PostMapping("/force/test")
public String forceReportTest() throws Exception {
String abc = UUIDGenerator.generate() + "helloword";
Thread.sleep(40000);
System.out.println(abc);
return abc;
}
}
package com.sxc.etaxincome.controller;
import com.sxc.etaxincome.criteria.IncomeQueryCriteria;
import com.sxc.etaxincome.domain.business.IQueryManager;
import com.sxc.etaxincome.domain.command.query.IQueryCommand;
import com.sxc.etaxincome.domain.command.query.IQueryPageListCommand;
import com.sxc.etaxincome.domain.model.common.CommonRequestWrapper;
import com.sxc.etaxincome.domain.model.common.CommonResponse;
import com.sxc.etaxincome.domain.model.common.PageList;
import com.sxc.etaxincome.domain.model.report.IReportResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
* @author caosongqing
* @date 2024/4/24
* @description
*/
@Slf4j
@RestController
@RequestMapping("/query")
public class QueryController {
@Autowired
@Qualifier(value = "queryCancelListQueryPageListCommand")
private IQueryPageListCommand queryCancelListQueryPageListCommand;
@Autowired
@Qualifier(value = "queryReportListQueryPageListCommand")
private IQueryPageListCommand queryReportListQueryPageListCommand;
@Autowired
@Qualifier(value = "queryReportItemQueryCommand")
private IQueryCommand queryReportItemQueryCommand;
@Autowired
@Qualifier(value = "queryManager")
private IQueryManager queryManager;
@PostMapping("/cancel-list")
public CommonResponse<PageList<IReportResponse>> queryCancelList(@Validated CommonRequestWrapper commonRequestWrapper) {
return queryCancelListQueryPageListCommand.execute(commonRequestWrapper);
}
@PostMapping("/cancel-list/json")
public CommonResponse<PageList<IReportResponse>> queryCancelListJson(@Validated @RequestBody CommonRequestWrapper requestCommonWrapper) {
return queryCancelListQueryPageListCommand.execute(requestCommonWrapper);
}
@PostMapping("/report-list")
public CommonResponse<PageList<IReportResponse>> queryReportList(@Validated CommonRequestWrapper commonRequestWrapper) {
return queryReportListQueryPageListCommand.execute(commonRequestWrapper);
}
@PostMapping("/report-list/json")
public CommonResponse<PageList<IReportResponse>> queryReportListJson(@Validated @RequestBody CommonRequestWrapper requestCommonWrapper) {
return queryReportListQueryPageListCommand.execute(requestCommonWrapper);
}
@PostMapping("/report-item")
public CommonResponse<IReportResponse> queryReportItem(@Validated CommonRequestWrapper commonRequestWrapper) {
return queryReportItemQueryCommand.execute(commonRequestWrapper);
}
@PostMapping("/report-item/json")
public CommonResponse<IReportResponse> queryReportItemJson(@Validated @RequestBody CommonRequestWrapper requestCommonWrapper) {
return queryReportItemQueryCommand.execute(requestCommonWrapper);
}
@PostMapping("/page-list/order-by-updateTime-desc")
public String queryPageListOrderByUpdateTimeDesc(@RequestBody IncomeQueryCriteria incomeQueryCriteria) {
return queryManager.queryPageListOrderByUpdateTimeDesc(incomeQueryCriteria);
}
@GetMapping("/complete-period/apply-id")
public String completePeriodWithApplyId(Long applyId) {
return queryManager.completePeriod(applyId);
}
}
package com.sxc.etaxincome.controller;
import com.sxc.etaxincome.domain.command.report.IReportCommand;
import com.sxc.etaxincome.domain.model.common.CommonRequestWrapper;
import com.sxc.etaxincome.domain.model.common.CommonResponse;
import com.sxc.etaxincome.domain.model.report.IReportResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author caosongqing
* @date 2024/4/24
* @description
*/
@Slf4j
@RestController
@RequestMapping("/report")
public class ReportController {
@Autowired
@Qualifier(value = "generalTaxpayerReportCommand")
private IReportCommand generalTaxpayerReportCommand;
@PostMapping("/general-taxpayer")
public CommonResponse<IReportResponse> reportGeneralTaxpayer(@Validated CommonRequestWrapper commonRequestWrapper) {
return generalTaxpayerReportCommand.execute(commonRequestWrapper);
}
@PostMapping("/general-taxpayer/json")
public CommonResponse<IReportResponse> reportGeneralTaxpayerJson(@Validated @RequestBody CommonRequestWrapper requestCommonWrapper) {
return generalTaxpayerReportCommand.execute(requestCommonWrapper);
}
}
package com.sxc.etaxincome.controller;
import com.sxc.etaxincome.domain.business.ISysManageManager;
import com.sxc.etaxincome.domain.exception.EtaxIncomeException;
import com.sxc.etaxincome.domain.model.common.CommonResponse;
import com.sxc.etaxincome.domain.model.sysManage.SysAppUserSummary;
import com.sxc.etaxincome.entity.FinSysDict;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @ProjectName: etax-income-api
* @Package: com.sxc.etaxincome.controller
* @ClassName: SysManageController
* @Author: ddx
* @Description: system manager controller
* @Date: 2024-05-28 10:32
* @Version: 1.0
*/
@Slf4j
@RestController
@RequestMapping("/sysManage")
public class SysManageController {
@Autowired
private ISysManageManager sysManageManager;
@GetMapping("/sys-app-user-query")
public CommonResponse<List<SysAppUserSummary>> sysAppUserQuery() {
try {
List<SysAppUserSummary> sysAppUserList = sysManageManager.queryListByCriteria();
return CommonResponse.success(sysAppUserList);
} catch (Exception e) {
log.error("query sys app user result error:", e);
throw new EtaxIncomeException("fail query sys app user result");
}
}
@GetMapping("/sys-app-dict-query")
public List<FinSysDict> sysAppDictQuery(String dictGroup) {
try {
return sysManageManager.queryDictListByDictGroup(dictGroup);
} catch (Exception e) {
log.error("query sys dict result error:", e);
throw new EtaxIncomeException("fail query sys dict result");
}
}
}
<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>etax-income-api</artifactId>
<groupId>com.sxc.etaxincome</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>etax-income-domain</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>etax-income-domain</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<buildnumber-maven-plugin.version>1.4</buildnumber-maven-plugin.version>
<templating-maven-plugin.version>1.0.0</templating-maven-plugin.version>
</properties>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
</dependency>
<dependency>
<groupId>com.sxc.etaxincome</groupId>
<artifactId>etax-income-common</artifactId>
</dependency>
<dependency>
<groupId>com.sxc.etaxincome</groupId>
<artifactId>etax-income-mapper</artifactId>
</dependency>
<dependency>
<groupId>com.sxc.etaxincome</groupId>
<artifactId>etax-income-service</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
<dependency>
<groupId>com.esotericsoftware</groupId>
<artifactId>kryo</artifactId>
</dependency>
<dependency>
<groupId>com.alicp.jetcache</groupId>
<artifactId>jetcache-starter-redis-lettuce</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito2</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<artifactId>mockito-core</artifactId>
<groupId>org.mockito</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<scm>
<connection>scm:git:http://git.taxservices.cn/e-tax/etax-income-api.git</connection>
<developerConnection>scm:git:http://git.taxservices.cn/e-tax/etax-income-api.git</developerConnection>
<url>http://git.taxservices.cn/e-tax/etax-income-api.git</url>
</scm>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>buildnumber-maven-plugin</artifactId>
<version>${buildnumber-maven-plugin.version}</version>
<executions>
<execution>
<id>bn1</id>
<goals>
<!-- 创建${buildNumber} -->
<goal>create</goal>
</goals>
</execution>
<execution>
<id>bn2</id>
<goals>
<!-- 创建时间戳${buildtimestamp} -->
<goal>create-timestamp</goal>
</goals>
<configuration>
<!-- 指定时间戳变量名 -->
<timestampPropertyName>buildtimestamp</timestampPropertyName>
<!-- 指定日期格式 -->
<timestampFormat>yyyy-MM-dd HH:mm:ss</timestampFormat>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>templating-maven-plugin</artifactId>
<version>${templating-maven-plugin.version}</version>
<executions>
<execution>
<id>filter-src</id>
<goals>
<goal>filter-sources</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
package com.sxc.etaxincome.domain;
public final class Version {
private Version() {
}
/**
* project version
*/
public static final String PROJECT_VERSION = "${project.version}";
/**
* SCM(git) revision
*/
public static final String SCM_REVISION= "${buildNumber}";
/**
* SCM branch
*/
public static final String SCM_BRANCH = "${scmBranch}";
/**
* build timestamp
*/
public static final String TIMESTAMP ="${buildtimestamp}";
}
\ No newline at end of file
package com.sxc.etaxincome.domain.business;
import com.sxc.etaxincome.domain.model.report.ApiConfig;
public interface IApiConfigManager {
ApiConfig getApiConfig(String apiCode);
}
package com.sxc.etaxincome.domain.business;
import com.sxc.etaxincome.entity.EtaxReportResultConfig;
import com.sxc.etaxincome.entity.FinSysDict;
import java.util.List;
public interface ICachedConfigManager {
List<FinSysDict> queryDictConfig(String dictGroup);
}
package com.sxc.etaxincome.domain.business;
import com.sxc.etaxincome.domain.model.report.AnalysisCriteria;
import com.sxc.etaxincome.domain.model.report.ExceptionStat;
import java.util.List;
public interface IExceptionManager {
List<ExceptionStat> getExceptionStatList(AnalysisCriteria analysisCriteria);
}
package com.sxc.etaxincome.domain.business;
import com.sxc.etaxincome.criteria.IncomeQueryCommon;
import com.sxc.etaxincome.domain.model.report.AreaCodeStat;
import java.util.List;
/**
* @ProjectName: etax-income-api
* @Package: com.sxc.etaxincome.domain.business
* @ClassName: IMonitorManager
* @Author: ddx
* @Description:
* @Date: 2024-06-06 16:40
* @Version: 1.0
*/
public interface IMonitorManager {
List<AreaCodeStat> statAreaIncome(IncomeQueryCommon incomeQueryCommon);
}
package com.sxc.etaxincome.domain.business;
import com.sxc.etaxincome.criteria.IncomeQueryCriteria;
import com.sxc.etaxincome.entity.FinRealLog;
public interface IQueryManager {
String queryPageListOrderByUpdateTimeDesc(IncomeQueryCriteria incomeQueryCriteria);
String completePeriod(Long applyId);
String completePeriod(FinRealLog incomeInvoiceApply);
}
package com.sxc.etaxincome.domain.business;
import java.util.Map;
public interface IResultTransferManager {
Map<String, String> transferToMap(String formData, String tableCode);
String transferToJson(String formData, String tableCode);
}
package com.sxc.etaxincome.domain.business;
import com.sxc.etaxincome.domain.model.sysManage.SysAppUserSummary;
import com.sxc.etaxincome.entity.FinSysDict;
import java.util.List;
/**
* @ProjectName: etax-income-api
* @Package: com.sxc.etaxincome.domain.business
* @ClassName: ISysManageManager
* @Author: ddx
* @Description:
* @Date: 2024-05-28 10:50
* @Version: 1.0
*/
public interface ISysManageManager {
List<SysAppUserSummary> queryListByCriteria();
List<FinSysDict> queryDictListByDictGroup(String dictGroup);
}
package com.sxc.etaxincome.domain.business;
/**
* @author caosongqing
* @date 2022/12/12
* @description
*/
public interface IVersionManager {
String version();
String buildVersion();
String allVersion();
String latestVersion();
}
package com.sxc.etaxincome.domain.business.impl;
import com.google.common.collect.Lists;
import com.sxc.etaxincome.domain.business.IApiConfigManager;
import com.sxc.etaxincome.domain.format.ReportParamFormat;
import com.sxc.etaxincome.domain.model.report.ApiConfig;
import com.sxc.etaxincome.domain.model.report.ApiParamMapping;
import com.sxc.etaxincome.entity.EtaxReportApiConfig;
import com.sxc.etaxincome.entity.EtaxReportParamConfig;
import com.sxc.etaxincome.enums.ApiParamReadonly;
import com.sxc.etaxincome.service.IEtaxReportApiConfigService;
import com.sxc.etaxincome.service.IEtaxReportParamConfigService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Slf4j
@Service
public class ApiConfigManager implements IApiConfigManager {
@Autowired
private IEtaxReportApiConfigService etaxReportApiConfigService;
@Autowired
private IEtaxReportParamConfigService etaxReportParamConfigService;
@Override
public ApiConfig getApiConfig(String apiCode) {
EtaxReportParamConfig etaxReportParamConfigCriteria = new EtaxReportParamConfig();
etaxReportParamConfigCriteria.setApiCode(apiCode);
etaxReportParamConfigCriteria.setReadonly(ApiParamReadonly.NO.getCode());
List<EtaxReportParamConfig> etaxReportParamConfigList = etaxReportParamConfigService.queryList(etaxReportParamConfigCriteria);
List<ApiParamMapping> apiParamMappingList = Lists.newArrayListWithExpectedSize(etaxReportParamConfigList.size());
for (EtaxReportParamConfig etaxReportParamConfig : etaxReportParamConfigList) {
apiParamMappingList.add(ApiParamMapping.builder().apiParamName(this.renderApiParamName(etaxReportParamConfig)).etaxParamName(etaxReportParamConfig.getEtaxParamName()).build());
}
EtaxReportApiConfig etaxReportApiConfigCriteria = new EtaxReportApiConfig();
etaxReportApiConfigCriteria.setApiCode(apiCode);
EtaxReportApiConfig etaxReportApiConfig = etaxReportApiConfigService.queryOne(etaxReportApiConfigCriteria);
return ApiConfig.builder()
.apiCode(etaxReportApiConfig.getApiCode())
.apiUrl(etaxReportApiConfig.getApiUrl())
.apiParamMappingList(apiParamMappingList).build();
}
private String renderApiParamName(EtaxReportParamConfig etaxReportParamConfig) {
String tableCode = etaxReportParamConfig.getTableCode();
String row = etaxReportParamConfig.getLocationRow();
String col = etaxReportParamConfig.getLocationCol();
return ReportParamFormat.formatReportParam(tableCode, row, col);
}
}
package com.sxc.etaxincome.domain.business.impl;
import com.alicp.jetcache.anno.CacheType;
import com.alicp.jetcache.anno.Cached;
import com.sxc.etaxincome.domain.business.ICachedConfigManager;
import com.sxc.etaxincome.entity.EtaxReportResultConfig;
import com.sxc.etaxincome.entity.FinSysDict;
import com.sxc.etaxincome.service.IEtaxReportResultConfigService;
import com.sxc.etaxincome.service.IFinSysDictService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Slf4j
@Service
public class CachedConfigManager implements ICachedConfigManager {
@Autowired
private IFinSysDictService finSysDictService;
@Cached(name = "etax-income:dict:config", key = "#dictGroup", expire = 36000, cacheType = CacheType.LOCAL)
public List<FinSysDict> queryDictConfig(String dictGroup) {
FinSysDict sysDict = new FinSysDict();
sysDict.setDictGroup(dictGroup);
return finSysDictService.queryDictListByCriteria(sysDict);
}
}
package com.sxc.etaxincome.domain.business.impl;
import com.alibaba.nacos.shaded.com.google.common.collect.Lists;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.google.common.collect.Maps;
import com.sxc.etaxincome.common.model.report.IncomeExceptionStatResult;
import com.sxc.etaxincome.criteria.IncomeQueryCommon;
import com.sxc.etaxincome.domain.business.IExceptionManager;
import com.sxc.etaxincome.domain.constants.EtaxExceptionConstants;
import com.sxc.etaxincome.domain.model.report.AnalysisCriteria;
import com.sxc.etaxincome.domain.model.report.ExceptionStat;
import com.sxc.etaxincome.domain.support.DateProvider;
import com.sxc.etaxincome.service.IFinRealLogService;
import com.sxc.framework.common.date.DateUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Slf4j
@Service
public class ExceptionManager implements IExceptionManager {
@Autowired
private IFinRealLogService finRealLogService;
@Override
public List<ExceptionStat> getExceptionStatList(AnalysisCriteria analysisCriteria) {
IncomeQueryCommon incomeQueryCommon = IncomeQueryCommon.builder()
.userName(analysisCriteria.getUsername())
.areaCode(analysisCriteria.getAreaCode())
.startDateTime(LocalDateTime.parse(DateProvider.getLongDateTimeHead(analysisCriteria.getStartDateTime()), DateTimeFormatter.ofPattern(DateUtils.YMDHMS_DASH)))
.endDateTime(LocalDateTime.parse(DateProvider.getLongDateTimeHead(analysisCriteria.getEndDateTime()), DateTimeFormatter.ofPattern(DateUtils.YMDHMS_DASH)))
.build();
List<IncomeExceptionStatResult> incomeInvoiceApplyList = finRealLogService.queryExceptionList(incomeQueryCommon);
if (CollectionUtils.isEmpty(incomeInvoiceApplyList)) {
return Collections.emptyList();
}
Map<String, Integer> exceptionMap = Maps.newLinkedHashMapWithExpectedSize(10);
incomeInvoiceApplyList.forEach(e -> {
if(StringUtils.isEmpty(e.getResMsg())) {
e.setResMsg(EtaxExceptionConstants.ETAX_EXCEPTION_TAX_NULL);
}
if(e.getResMsg().contains(EtaxExceptionConstants.ETAX_EXCEPTION_TAX_BUSY)) {
e.setResMsg(EtaxExceptionConstants.ETAX_EXCEPTION_TAX_BUSY);
}
if(null==exceptionMap.get(e.getResMsg())) {
exceptionMap.put(e.getResMsg(), e.getResNum());
} else {
exceptionMap.put(e.getResMsg(), exceptionMap.get(e.getResMsg()) + e.getResNum());
}
});
List<ExceptionStat> exceptionStatList = Lists.newArrayListWithExpectedSize(10);
exceptionMap.forEach((key, value) -> exceptionStatList.add(ExceptionStat.builder().message(key).count(value).build()));
List<ExceptionStat> exceptionSortedList = exceptionStatList.stream().sorted(Comparator.comparing(ExceptionStat::getCount).reversed()).limit(8).collect(Collectors.toList());
return exceptionSortedList;
}
}
package com.sxc.etaxincome.domain.business.impl;
import com.sxc.etaxincome.criteria.IncomeQueryCommon;
import com.sxc.etaxincome.domain.business.IMonitorManager;
import com.sxc.etaxincome.domain.model.report.AreaCodeStat;
import com.sxc.etaxincome.domain.support.ZoneProvider;
import com.sxc.etaxincome.entity.FinCountReport;
import com.sxc.etaxincome.service.IFinRealLogService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.compress.utils.Lists;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
/**
* @ProjectName: etax-income-api
* @Package: com.sxc.etaxincome.domain.business.impl
* @ClassName: MonitorManager
* @Author: ddx
* @Description:
* @Date: 2024-06-06 16:40
* @Version: 1.0
*/
@Slf4j
@Service
public class MonitorManager implements IMonitorManager {
@Autowired
private IFinRealLogService finRealLogService;
@Override
public List<AreaCodeStat> statAreaIncome(IncomeQueryCommon incomeQueryCommon) {
List<FinCountReport> countReportList = finRealLogService.statAreaIncome(incomeQueryCommon);
List<AreaCodeStat> areaCodeStatList = Lists.newArrayList();
countReportList.stream().forEach(e -> {
areaCodeStatList.add(AreaCodeStat.builder().areaCode(e.getZoneCode())
.name(ZoneProvider.getZoneNameByCode(e.getZoneCode()))
.taxnoCount(Long.valueOf(e.getTaxnoNum())).requsetCount(Long.valueOf(e.getTotalNum())).build());
});
return areaCodeStatList;
}
}
package com.sxc.etaxincome.domain.business.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.google.common.collect.Lists;
import com.sxc.etaxincome.criteria.FinRealLogCriteria;
import com.sxc.etaxincome.criteria.IncomeQueryCriteria;
import com.sxc.etaxincome.domain.business.IQueryManager;
import com.sxc.etaxincome.domain.constants.CommonConstants;
import com.sxc.etaxincome.domain.model.common.PageList;
import com.sxc.etaxincome.domain.model.report.IncomeCompletePeriod;
import com.sxc.etaxincome.entity.FinRealLog;
import com.sxc.etaxincome.service.IFinRealLogService;
import com.sxc.framework.common.code.EncryptUtil;
import com.sxc.framework.common.json.JSONUtil;
import com.sxc.framework.common.string.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author caosongqing
* @date 2023/2/10
* @description
*/
@Slf4j
@Service
public class QueryManager implements IQueryManager {
@Autowired
private IFinRealLogService finRealLogService;
@Override
public String queryPageListOrderByUpdateTimeDesc(IncomeQueryCriteria incomeQueryCriteria) {
FinRealLogCriteria finRealLogCriteria = FinRealLogCriteria.builder()
.userCode(incomeQueryCriteria.getUserCode())
.zoneCode(incomeQueryCriteria.getZoneCode())
.taxno(incomeQueryCriteria.getTaxno())
.itype(incomeQueryCriteria.getItype())
.reqSign(incomeQueryCriteria.getReqSign())
.reqContext(incomeQueryCriteria.getReqContext())
.resContext(incomeQueryCriteria.getResContext())
.resMsg(incomeQueryCriteria.getResMsg())
.timeFlag(incomeQueryCriteria.getTimeFlag())
.resCode(incomeQueryCriteria.getResCode())
.dateTimeStart(incomeQueryCriteria.getStartDateTime())
.dateTimeEnd(incomeQueryCriteria.getEndDateTime())
.startTimeDiff(incomeQueryCriteria.getStartTimeDiff())
.endTimeDiff(incomeQueryCriteria.getEndTimeDiff())
.build();
int start = incomeQueryCriteria.getPageNumber();
int limit = incomeQueryCriteria.getPageSize();
IPage<FinRealLog> incomeInvoiceApplyPage = finRealLogService.queryPageListOrderByRequestTimeDesc(finRealLogCriteria, start, limit);
List<FinRealLog> incomeInvoiceApplyList = incomeInvoiceApplyPage.getRecords();
PageList<FinRealLog> incomeInvoiceApplyPageList = PageList.<FinRealLog>builder()
.total(Integer.valueOf(String.valueOf(incomeInvoiceApplyPage.getTotal())))
.pageNumber(start)
.pageSize(limit)
.list(incomeInvoiceApplyList).build();
return JSONUtil.toString(incomeInvoiceApplyPageList);
}
@Override
public String completePeriod(Long applyId) {
FinRealLog incomeInvoiceApply = finRealLogService.getBaseMapper().selectById(applyId);
return this.completePeriod(incomeInvoiceApply);
}
@Override
public String completePeriod(FinRealLog incomeInvoiceApply) {
JSONObject requestParam = new JSONObject();
JSONObject cookie = new JSONObject();
String reqContext = incomeInvoiceApply.getReqContext();
if (StringUtil.isNotEmpty(reqContext)) {
if(reqContext.contains("token")) {
String preReqContext = reqContext.substring(reqContext.indexOf("T1C2K3"));
String cookieContext = EncryptUtil.decryptAesCk(preReqContext.substring(0, preReqContext.indexOf("\\")));
if(StringUtil.isNotEmpty(cookieContext)) {
cookie = JSON.parseObject(cookieContext);
requestParam.put("cookie", cookie.get("cookie"));
requestParam.put("dqdm", incomeInvoiceApply.getZoneCode());
}
}
}
JSONObject responseResult = null;
IncomeCompletePeriod incomeCompletePeriod = IncomeCompletePeriod.builder()
.cookie(cookie)
.requestParam(requestParam)
.reqContext(incomeInvoiceApply.getReqContext())
.resContext(incomeInvoiceApply.getResContext())
.build();
return JSONUtil.toString(incomeCompletePeriod);
}
}
package com.sxc.etaxincome.domain.business.impl;
import com.alibaba.fastjson.JSON;
import com.google.common.collect.Maps;
import com.sxc.etaxincome.domain.business.ICachedConfigManager;
import com.sxc.etaxincome.domain.business.IResultTransferManager;
import com.sxc.etaxincome.domain.format.ReportParamFormat;
import com.sxc.etaxincome.entity.EtaxReportResultConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
@Slf4j
@Service
public class ResultTransferManager implements IResultTransferManager {
@Autowired
private ICachedConfigManager cachedConfigManager;
public Map<String, EtaxReportResultConfig> queryMapByTableCode(String tableCode, boolean fullFlag) {
Map<String, EtaxReportResultConfig> resultConfigMap = Maps.newHashMap();
// List<EtaxReportResultConfig> resultConfigList = cachedConfigManager.queryReportResultConfig(tableCode);
// log.info("resultConfigList size:{}", resultConfigList.size());
// if(fullFlag) {
// resultConfigList.forEach(x-> resultConfigMap.put(x.getEtaxParamName(), x));
// } else {
// resultConfigList.stream().filter(x -> "1".equals(x.getShowFlag())).forEach(x-> resultConfigMap.put(x.getEtaxParamName(), x));
// }
return resultConfigMap;
}
public Map<String, String> transferToMap(String formData, String tableCode) {
Map<String, String> resultMap = Maps.newHashMap();
// log.info("formData:{} tableCode:{}", formData, tableCode);
// //准备数据
// Map<String, String> tableFullMap = HtmlParseUtil.parseTableHtmlToMap(formData, tableCode, false);
// log.info("tableFullMap:{}", tableFullMap);
// Map<String, EtaxReportResultConfig> tableShowMap = this.queryMapByTableCode(tableCode, false);
//
// for (String etaxParamName: tableShowMap.keySet()) {
// log.info("etaxParamName:{}", etaxParamName);
// EtaxReportResultConfig resultConfig = tableShowMap.get(etaxParamName);
// String resultParamKey = this.getExportParamKey(resultConfig);
// log.info("resultParamKey:{}", resultParamKey);
// resultMap.put(resultParamKey, tableFullMap.get(etaxParamName));
// }
return resultMap;
}
public String transferToJson(String formData, String tableCode) {
Map<String, String> resultMap = transferToMap(formData, tableCode);
return JSON.toJSONString(resultMap);
}
private String getExportParamKey(EtaxReportResultConfig resultConfig) {
if ("-1".equals(resultConfig.getLocationRow())) {
return resultConfig.getEtaxExportName();
}
return ReportParamFormat.formatReportParam(resultConfig.getTableCode(), resultConfig.getLocationRow(), resultConfig.getLocationCol());
}
}
package com.sxc.etaxincome.domain.business.impl;
import com.sxc.etaxincome.domain.business.ICachedConfigManager;
import com.sxc.etaxincome.domain.business.ISysManageManager;
import com.sxc.etaxincome.domain.model.sysManage.SysAppUserSummary;
import com.sxc.etaxincome.entity.FinSysDict;
import com.sxc.etaxincome.entity.SysAppUser;
import com.sxc.etaxincome.service.IFinSysDictService;
import com.sxc.etaxincome.service.ISysAppUserService;
import com.sxc.framework.common.date.DateUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.format.DateTimeFormatter;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
/**
* @ProjectName: etax-income-api
* @Package: com.sxc.etaxincome.domain.business.impl
* @ClassName: SysManageManager
* @Author: ddx
* @Description:
* @Date: 2024-05-28 10:51
* @Version: 1.0
*/
@Slf4j
@Service
public class SysManageManager implements ISysManageManager {
@Autowired
private ISysAppUserService sysAppUserService;
@Autowired
private ICachedConfigManager cachedConfigManager;
public List<SysAppUserSummary> queryListByCriteria() {
SysAppUser sysAppUserCriteria = new SysAppUser();
List<SysAppUser> sysAppUserList = sysAppUserService.queryListByCriteria(sysAppUserCriteria);
return sysAppUserList.stream().sorted(Comparator.comparing(SysAppUser::getName)).map(e -> {
return SysAppUserSummary.builder()
.userName(e.getUsername())
.nickName(e.getName())
.status(e.getStatus()).build();
}).collect(Collectors.toList());
}
public List<FinSysDict> queryDictListByDictGroup(String dictGroup) {
List<FinSysDict> sysDictList = cachedConfigManager.queryDictConfig(dictGroup);
return sysDictList;
}
}
package com.sxc.etaxincome.domain.business.impl;
import com.alibaba.fastjson.JSON;
import com.alicp.jetcache.anno.CacheType;
import com.alicp.jetcache.anno.Cached;
import com.sxc.etaxincome.domain.Version;
import com.sxc.etaxincome.domain.business.IVersionManager;
import com.sxc.etaxincome.domain.model.common.AggregateVersion;
import com.sxc.etaxincome.domain.model.common.ApiVersion;
import com.sxc.etaxincome.domain.model.common.BuildVersion;
import com.sxc.framework.common.file.FileUtil;
import com.sxc.framework.common.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
/**
* @author caosongqing
* @date 2022/12/12
* @description
*/
@Slf4j
@Service
public class VersionManager implements IVersionManager {
private static final int VERSION_LENGTH = 10;
@Override
@Cached(name = "income-invoice:version:version", expire = 36000, cacheType = CacheType.LOCAL)
public String version() {
String startWith = "s";
int subRevisionLength = VERSION_LENGTH;
String latestVersion;
try {
String versionJson = this.allVersion();
ApiVersion apiVersion = JSON.parseObject(versionJson, ApiVersion.class);
latestVersion = apiVersion.getLatestVersion().getVersion();
} catch (Exception e) {
latestVersion = "unknown";
log.error("get version error:", e);
}
String revision = Version.SCM_REVISION;
int lengthRevision = revision.length();
String subRevision = StringUtils.substring(revision, lengthRevision - subRevisionLength, lengthRevision);
String version = String.format("%s_%s_%s", startWith, latestVersion, subRevision);
log.info("version:{}", version);
return version;
}
@Override
@Cached(name = "income-invoice:version:buildVersion", expire = 36000, cacheType = CacheType.LOCAL)
public String buildVersion() {
BuildVersion buildVersion = BuildVersion.builder()
.projectVersion(Version.PROJECT_VERSION)
.revision(Version.SCM_REVISION)
.branch(Version.SCM_BRANCH)
.date(Version.TIMESTAMP).build();
return JSONUtil.toString(buildVersion);
}
@Override
@Cached(name = "income-invoice:version:allVersion", expire = 36000, cacheType = CacheType.LOCAL)
public String allVersion() {
return FileUtil.readContent("version/version.json");
}
@Override
@Cached(name = "income-invoice:version:latestVersion", expire = 36000, cacheType = CacheType.LOCAL)
public String latestVersion() {
String version = this.allVersion();
ApiVersion apiVersion = JSON.parseObject(version, ApiVersion.class);
BuildVersion buildVersion = BuildVersion.builder()
.projectVersion(Version.PROJECT_VERSION)
.revision(Version.SCM_REVISION)
.branch(Version.SCM_BRANCH)
.date(Version.TIMESTAMP)
.build();
AggregateVersion aggregateVersion = AggregateVersion.builder()
.apiVersionLog(apiVersion.getLatestVersion())
.buildVersion(buildVersion)
.build();
return JSONUtil.toString(aggregateVersion);
}
}
package com.sxc.etaxincome.domain.command.analysis;
import com.sxc.etaxincome.common.enums.CountTypeCode;
import com.sxc.etaxincome.common.model.report.IncomeInvoiceStatResult;
import com.sxc.etaxincome.criteria.IncomeQueryCommon;
import com.sxc.etaxincome.domain.model.report.AnalysisCriteria;
import com.sxc.etaxincome.domain.support.DateProvider;
import com.sxc.etaxincome.service.IFinCountReportService;
import com.sxc.framework.common.date.DateUtils;
import com.sxc.framework.common.json.JSONUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
@Component(value = "analysisCommand")
public class AnalysisCommand implements IAnalysisCommand {
@Autowired
private IFinCountReportService finCountReportService;
@Override
public String handle(AnalysisCriteria analysisCriteria) {
IncomeQueryCommon incomeQueryCommon = IncomeQueryCommon.builder()
.userName(analysisCriteria.getUsername())
.countType(analysisCriteria.getCountType())
.startDateTime(LocalDateTime.parse(DateProvider.getLongDateTimeHead(analysisCriteria.getStartDateTime()), DateTimeFormatter.ofPattern(DateUtils.YMDHMS_DASH)))
.endDateTime(LocalDateTime.parse(DateProvider.getLongDateTimeHead(analysisCriteria.getEndDateTime()), DateTimeFormatter.ofPattern(DateUtils.YMDHMS_DASH)))
.build();
List<IncomeInvoiceStatResult> incomeInvoiceStatResultList = finCountReportService.queryReportListByDate(incomeQueryCommon);
incomeInvoiceStatResultList.stream().forEach(e -> {
if(!analysisCriteria.getCountType().equals(CountTypeCode.HOUR.getCode())) {
e.setStatDate(e.getStatDate().substring(0, 10));
}
});
return JSONUtil.toString(incomeInvoiceStatResultList);
}
}
package com.sxc.etaxincome.domain.command.analysis;
import com.sxc.etaxincome.criteria.IncomeQueryCommon;
import com.sxc.etaxincome.domain.business.IMonitorManager;
import com.sxc.etaxincome.domain.model.report.AnalysisCriteria;
import com.sxc.etaxincome.domain.support.DateProvider;
import com.sxc.framework.common.date.DateUtils;
import com.sxc.framework.common.json.JSONUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@Component(value = "areaGroupCommand")
public class AreaGroupCommand implements IAnalysisCommand {
@Autowired
private IMonitorManager monitorManager;
@Override
public String handle(AnalysisCriteria analysisCriteria) {
IncomeQueryCommon incomeQueryCommon = IncomeQueryCommon.builder()
.userName(analysisCriteria.getUsername())
.startDateTime(LocalDateTime.parse(DateProvider.getLongDateTimeHead(analysisCriteria.getStartDateTime()), DateTimeFormatter.ofPattern(DateUtils.YMDHMS_DASH)))
.endDateTime(LocalDateTime.parse(DateProvider.getLongDateTimeTail(analysisCriteria.getEndDateTime()), DateTimeFormatter.ofPattern(DateUtils.YMDHMS_DASH)))
.build();
return JSONUtil.toString(monitorManager.statAreaIncome(incomeQueryCommon));
}
}
package com.sxc.etaxincome.domain.command.analysis;
import com.sxc.etaxincome.common.enums.CountTypeCode;
import com.sxc.etaxincome.common.model.report.IncomeInvoiceStatResult;
import com.sxc.etaxincome.criteria.IncomeQueryCommon;
import com.sxc.etaxincome.domain.model.report.AnalysisCriteria;
import com.sxc.etaxincome.domain.support.DateProvider;
import com.sxc.etaxincome.service.IFinCountReportService;
import com.sxc.framework.common.date.DateUtils;
import com.sxc.framework.common.json.JSONUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
@Component(value = "groupAnalysisCommand")
public class GroupAnalysisCommand implements IAnalysisCommand {
@Autowired
private IFinCountReportService finCountReportService;
@Override
public String handle(AnalysisCriteria analysisCriteria) {
IncomeQueryCommon incomeQueryCommon = IncomeQueryCommon.builder()
.userName(analysisCriteria.getUsername())
.countType(analysisCriteria.getCountType())
.startDateTime(LocalDateTime.parse(DateProvider.getLongDateTimeHead(analysisCriteria.getStartDateTime()), DateTimeFormatter.ofPattern(DateUtils.YMDHMS_DASH)))
.endDateTime(LocalDateTime.parse(DateProvider.getLongDateTimeHead(analysisCriteria.getEndDateTime()), DateTimeFormatter.ofPattern(DateUtils.YMDHMS_DASH)))
.build();
List<IncomeInvoiceStatResult> incomeInvoiceStatResultList = finCountReportService.queryReportListByUser(incomeQueryCommon);
return JSONUtil.toString(incomeInvoiceStatResultList);
}
}
package com.sxc.etaxincome.domain.command.analysis;
import com.sxc.etaxincome.domain.model.report.AnalysisCriteria;
public interface IAnalysisCommand {
String handle(AnalysisCriteria analysisCriteria);
}
package com.sxc.etaxincome.domain.command.analysis;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.sxc.etaxincome.criteria.FinRealLogCriteria;
import com.sxc.etaxincome.domain.constants.CommonConstants;
import com.sxc.etaxincome.domain.model.common.DateTimeRange;
import com.sxc.etaxincome.domain.model.report.AnalysisCriteria;
import com.sxc.etaxincome.domain.support.DateProvider;
import com.sxc.etaxincome.entity.FinRealLog;
import com.sxc.etaxincome.service.IFinRealLogService;
import com.sxc.framework.common.json.JSONUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Comparator;
import java.util.List;
/**
* @ProjectName: etax-income-api
* @Package: com.sxc.etaxincome.domain.command.analysis
* @ClassName: QueryIncomeSuccessAnalysisCommand
* @Author: ddx
* @Description:
* @Date: 2024-06-21 17:21
* @Version: 1.0
*/
@Component(value = "queryIncomeSuccessAnalysisCommand")
public class QueryIncomeSuccessAnalysisCommand implements IAnalysisCommand {
@Autowired
private IFinRealLogService finRealLogService;
@Override
public String handle(AnalysisCriteria analysisCriteria) {
DateTimeRange dateTimeRange = DateProvider.today();
FinRealLogCriteria finRealLogCriteria = FinRealLogCriteria.builder()
.userCode(analysisCriteria.getUsername())
.zoneCode(analysisCriteria.getAreaCode())
.resCode(CommonConstants.SUCCESS)
.dateTimeStart(dateTimeRange.getStartDateTime())
.dateTimeEnd(dateTimeRange.getEndDateTime())
.build();
int start = 1;
int limit = 100;
IPage<FinRealLog> realLogPage = finRealLogService.queryPageListOrderByRequestTimeDesc(finRealLogCriteria, start, limit);
List<FinRealLog> realLogList = realLogPage.getRecords();
if (CollectionUtils.isNotEmpty(realLogList)) {
realLogList.sort(Comparator.comparing(FinRealLog::getReqDate));
return JSONUtil.toString(realLogList);
}
return "[]";
}
}
package com.sxc.etaxincome.domain.command.analysis;
import cn.hutool.core.date.DateUtil;
import com.google.common.collect.Lists;
import com.sxc.etaxincome.criteria.IncomeQueryCommon;
import com.sxc.etaxincome.domain.model.report.AnalysisCriteria;
import com.sxc.etaxincome.domain.model.report.SellerGrowth;
import com.sxc.etaxincome.domain.support.DateProvider;
import com.sxc.etaxincome.entity.FinUserTaxno;
import com.sxc.etaxincome.service.IFinUserTaxnoService;
import com.sxc.framework.common.json.JSONUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author caosongqing
* @date 2023/11/10
* @description
*/
@Component(value = "sellerGrowthCommand")
public class SellerGrowthCommand implements IAnalysisCommand {
@Autowired
private IFinUserTaxnoService finUserTaxnoService;
@Override
public String handle(AnalysisCriteria analysisCriteria) {
String startDate = analysisCriteria.getStartDateTime();
String endDate = analysisCriteria.getEndDateTime();
List<String> dateList = DateProvider.dateListBetween(startDate, endDate);
List<SellerGrowth> sellerGrowthList = Lists.newArrayListWithExpectedSize(20);
for (String targetDate : dateList) {
IncomeQueryCommon incomeQueryCommon = IncomeQueryCommon.builder()
.userName(analysisCriteria.getUsername())
.startDateTime(DateUtil.parseLocalDateTime(DateProvider.getDateTimeHead(targetDate)))
.endDateTime(DateUtil.parseLocalDateTime(DateProvider.getDateTimeTail(targetDate))).build();
List<FinUserTaxno> makeoutInvoiceSellerList = finUserTaxnoService.queryList(incomeQueryCommon);
sellerGrowthList.add(SellerGrowth.builder().date(targetDate).count(makeoutInvoiceSellerList.size()).build());
}
return JSONUtil.toString(sellerGrowthList);
}
}
package com.sxc.etaxincome.domain.command.query;
import com.sxc.etaxincome.domain.model.common.CommonRequestWrapper;
import com.sxc.etaxincome.domain.model.common.CommonResponse;
import com.sxc.etaxincome.domain.model.common.PageList;
import com.sxc.etaxincome.domain.model.report.IReportResponse;
public interface IQueryCommand {
CommonResponse<IReportResponse> execute(CommonRequestWrapper commonRequestWrapper);
}
package com.sxc.etaxincome.domain.command.query;
import com.sxc.etaxincome.domain.model.common.CommonRequestWrapper;
import com.sxc.etaxincome.domain.model.common.PageList;
import com.sxc.etaxincome.domain.model.common.CommonResponse;
import com.sxc.etaxincome.domain.model.report.IReportResponse;
public interface IQueryPageListCommand {
CommonResponse<PageList<IReportResponse>> execute(CommonRequestWrapper commonRequestWrapper);
}
package com.sxc.etaxincome.domain.command.query;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.nacos.api.config.annotation.NacosValue;
import com.google.common.base.Stopwatch;
import com.google.common.collect.Lists;
import com.sxc.etaxincome.common.util.RetryHttpHelper;
import com.sxc.etaxincome.domain.business.IApiConfigManager;
import com.sxc.etaxincome.domain.constants.EtaxReportConstants;
import com.sxc.etaxincome.domain.exception.EtaxIncomeException;
import com.sxc.etaxincome.domain.model.common.CommonRequestWrapper;
import com.sxc.etaxincome.domain.model.common.PageList;
import com.sxc.etaxincome.domain.model.common.CommonResponse;
import com.sxc.etaxincome.domain.model.cookie.TokenNecessary;
import com.sxc.etaxincome.domain.model.report.ApiConfig;
import com.sxc.etaxincome.domain.model.report.CancelReportResponse;
import com.sxc.etaxincome.domain.model.report.IReportResponse;
import com.sxc.etaxincome.domain.model.report.QueryCancelListRequestWrapper;
import com.sxc.etaxincome.domain.template.ResponseHandlerTemplate;
import com.sxc.etaxincome.enums.ApiCode;
import com.sxc.framework.common.httpclient.ResponseContent;
import com.sxc.framework.common.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.concurrent.TimeUnit;
import static com.sxc.etaxincome.domain.constants.EtaxReportConstants.*;
@Slf4j
@Component(value = "queryCancelListQueryPageListCommand")
public class QueryCancelListQueryPageListCommand implements IQueryPageListCommand {
@NacosValue(value = "${url.etax.report}", autoRefreshed = true)
private String etaxReportUrl;
@Autowired
private IApiConfigManager apiConfigManager;
@Override
public CommonResponse<PageList<IReportResponse>> execute(CommonRequestWrapper commonRequestWrapper) {
Stopwatch stopwatch = Stopwatch.createStarted();
ApiConfig apiConfig = apiConfigManager.getApiConfig(ApiCode.QUERY_CANCEL_PAGE_LIST.getCode());
JSONObject requestDataJsonObject = new JSONObject();
String requestDataStr = commonRequestWrapper.getData();
String requestSerialNo = commonRequestWrapper.getRequestSerialNo();
log.info("queryCancelPageList requestSerialNo:{} data:{}", requestSerialNo, requestDataStr);
QueryCancelListRequestWrapper queryCancelListRequestWrapper = JSON.parseObject(requestDataStr, QueryCancelListRequestWrapper.class);
TokenNecessary tokenNecessary = queryCancelListRequestWrapper.decodeToken();
String token = tokenNecessary.getToken();
requestDataJsonObject.put(API_PARAM_TOKEN, token);
requestDataJsonObject.put(API_PARAM_AREA_CODE, queryCancelListRequestWrapper.getArea());
String test = queryCancelListRequestWrapper.getTest();
if (StringUtils.isNotBlank(test)) {
requestDataJsonObject.put(API_PARAM_TEST, test);
}
if (StringUtils.isNotBlank(queryCancelListRequestWrapper.getReportDateStart())) {
requestDataJsonObject.put("sbrqq", queryCancelListRequestWrapper.getReportDateStart());
}
if (StringUtils.isNotBlank(queryCancelListRequestWrapper.getReportDateEnd())) {
requestDataJsonObject.put("sbrqz", queryCancelListRequestWrapper.getReportDateEnd());
}
if (queryCancelListRequestWrapper.getPageSize() != null) {
requestDataJsonObject.put("pageSize", queryCancelListRequestWrapper.getPageSize().toString());
}
if (queryCancelListRequestWrapper.getPageNumber() != null) {
requestDataJsonObject.put("pageNumber", queryCancelListRequestWrapper.getPageNumber().toString());
}
try {
String etaxReportUrlFull = etaxReportUrl + apiConfig.getApiUrl();
log.info("url:{}", etaxReportUrlFull);
String requestJson = JSONUtil.toString(requestDataJsonObject);
log.info("request:{}", requestJson);
ResponseContent responseContent = RetryHttpHelper.retryPostJsonEntity(etaxReportUrlFull, requestJson);
String response = responseContent.getContent();
log.info("response:{}", response);
stopwatch.stop();
log.info("query cancel page list elapsed time:{}ms", stopwatch.elapsed(TimeUnit.MILLISECONDS));
return new ResponseHandlerTemplate<PageList<IReportResponse>>() {
@Override
public CommonResponse<PageList<IReportResponse>> handleSuccess(JSONObject jsonObject) {
JSONObject resultJsonObject = jsonObject.getJSONObject(EtaxReportConstants.ETAX_RESPONSE_DATA_KEY);
JSONArray jsonArray = resultJsonObject.getJSONArray("List");
Integer total = resultJsonObject.getInteger("Total");
Integer pageSize = resultJsonObject.getInteger("PageSize");
Integer pageNumber = resultJsonObject.getInteger("PageNumber");
List<IReportResponse> invoiceResponseList = Lists.newArrayListWithExpectedSize(10);
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject jsonObjectInvoice = jsonArray.getJSONObject(i);
CancelReportResponse cancelReportResponse = new CancelReportResponse();
cancelReportResponse.putAll(jsonObjectInvoice);
invoiceResponseList.add(cancelReportResponse);
}
PageList<IReportResponse> pageList = PageList.<IReportResponse>builder()
.total(total)
.pageNumber(pageNumber)
.pageSize(pageSize)
.list(invoiceResponseList).build();
return CommonResponse.success(pageList);
}
}.handle(response);
} catch (Exception e) {
log.error("query cancel page list error:", e);
throw new EtaxIncomeException(e);
}
}
}
package com.sxc.etaxincome.domain.command.query;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.nacos.api.config.annotation.NacosValue;
import com.google.common.base.Stopwatch;
import com.sxc.etaxincome.common.util.RetryHttpHelper;
import com.sxc.etaxincome.domain.business.IApiConfigManager;
import com.sxc.etaxincome.domain.business.IResultTransferManager;
import com.sxc.etaxincome.domain.constants.EtaxReportConstants;
import com.sxc.etaxincome.domain.exception.EtaxIncomeException;
import com.sxc.etaxincome.domain.model.common.CommonRequestWrapper;
import com.sxc.etaxincome.domain.model.common.CommonResponse;
import com.sxc.etaxincome.domain.model.cookie.TokenNecessary;
import com.sxc.etaxincome.domain.model.report.*;
import com.sxc.etaxincome.domain.template.ResponseHandlerTemplate;
import com.sxc.etaxincome.entity.EtaxReportType;
import com.sxc.etaxincome.enums.ApiCode;
import com.sxc.etaxincome.service.IEtaxReportTypeService;
import com.sxc.framework.common.httpclient.ResponseContent;
import com.sxc.framework.common.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import static com.sxc.etaxincome.domain.constants.EtaxReportConstants.*;
@Slf4j
@Component(value = "queryReportItemQueryCommand")
public class QueryReportItemQueryCommand implements IQueryCommand {
@NacosValue(value = "${url.etax.report}", autoRefreshed = true)
private String etaxReportUrl;
@Autowired
private IApiConfigManager apiConfigManager;
@Autowired
private IResultTransferManager resultTransfarManager;
@Autowired
private IEtaxReportTypeService etaxReportTypeService;
@Override
public CommonResponse<IReportResponse> execute(CommonRequestWrapper commonRequestWrapper) {
Stopwatch stopwatch = Stopwatch.createStarted();
ApiConfig apiConfig = apiConfigManager.getApiConfig(ApiCode.QUERY_REPORT_ITEM.getCode());
JSONObject requestDataJsonObject = new JSONObject();
String requestDataStr = commonRequestWrapper.getData();
String requestSerialNo = commonRequestWrapper.getRequestSerialNo();
log.info("queryReportItem requestSerialNo:{} data:{}", requestSerialNo, requestDataStr);
QueryReportItemRequestWrapper queryReportItemRequestWrapper = JSON.parseObject(requestDataStr, QueryReportItemRequestWrapper.class);
TokenNecessary tokenNecessary = queryReportItemRequestWrapper.decodeToken();
String token = tokenNecessary.getToken();
requestDataJsonObject.put(API_PARAM_TOKEN, token);
requestDataJsonObject.put(API_PARAM_AREA_CODE, queryReportItemRequestWrapper.getArea());
String test = queryReportItemRequestWrapper.getTest();
if (StringUtils.isNotBlank(test)) {
requestDataJsonObject.put(API_PARAM_TEST, test);
}
if (StringUtils.isNotBlank(queryReportItemRequestWrapper.getDeclareDateStart())) {
requestDataJsonObject.put("skssqq", queryReportItemRequestWrapper.getDeclareDateStart());
}
if (StringUtils.isNotBlank(queryReportItemRequestWrapper.getDeclareDateEnd())) {
requestDataJsonObject.put("skssqz", queryReportItemRequestWrapper.getDeclareDateEnd());
}
if (StringUtils.isNotBlank(queryReportItemRequestWrapper.getSbuuid())) {
requestDataJsonObject.put("sbuuid", queryReportItemRequestWrapper.getSbuuid());
}
if (StringUtils.isNotBlank(queryReportItemRequestWrapper.getReportType())) {
JSONArray reportIdJsonArray = new JSONArray();
reportIdJsonArray.add(queryReportItemRequestWrapper.getReportType());
requestDataJsonObject.put("reportIdList", reportIdJsonArray);
}
try {
String etaxReportUrlFull = etaxReportUrl + apiConfig.getApiUrl();
log.info("url:{}", etaxReportUrlFull);
String requestJson = JSONUtil.toString(requestDataJsonObject);
log.info("request:{}", requestJson);
ResponseContent responseContent = RetryHttpHelper.retryPostJsonEntity(etaxReportUrlFull, requestJson);
String response = responseContent.getContent();
log.info("response:{}", response);
stopwatch.stop();
log.info("query report item elapsed time:{}ms", stopwatch.elapsed(TimeUnit.MILLISECONDS));
return new ResponseHandlerTemplate<IReportResponse>() {
@Override
public CommonResponse<IReportResponse> handleSuccess(JSONObject jsonObject) {
EtaxReportType etaxReportTypeCriteria = new EtaxReportType();
etaxReportTypeCriteria.setReportId(queryReportItemRequestWrapper.getReportType());
EtaxReportType etaxReportType = etaxReportTypeService.queryOne(etaxReportTypeCriteria);
if (etaxReportType == null) {
return CommonResponse.error("未查询到报表信息");
}
String tableCode = etaxReportType.getTableCode();
String formData = jsonObject.getString(EtaxReportConstants.ETAX_RESPONSE_DATA_KEY);
ReportItemResponse reportItemResponse = new ReportItemResponse();
Map<String, String> reportItemMap = resultTransfarManager.transferToMap(formData, tableCode);
reportItemResponse.putAll(reportItemMap);
return CommonResponse.success(reportItemResponse);
}
}.handle(response);
} catch (Exception e) {
log.error("query report item error:", e);
throw new EtaxIncomeException(e);
}
}
}
package com.sxc.etaxincome.domain.command.query;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.nacos.api.config.annotation.NacosValue;
import com.google.common.base.Stopwatch;
import com.google.common.collect.Lists;
import com.sxc.etaxincome.common.util.RetryHttpHelper;
import com.sxc.etaxincome.domain.business.IApiConfigManager;
import com.sxc.etaxincome.domain.constants.EtaxReportConstants;
import com.sxc.etaxincome.domain.exception.EtaxIncomeException;
import com.sxc.etaxincome.domain.model.common.CommonRequestWrapper;
import com.sxc.etaxincome.domain.model.common.CommonResponse;
import com.sxc.etaxincome.domain.model.common.PageList;
import com.sxc.etaxincome.domain.model.cookie.TokenNecessary;
import com.sxc.etaxincome.domain.model.report.*;
import com.sxc.etaxincome.domain.template.ResponseHandlerTemplate;
import com.sxc.etaxincome.enums.ApiCode;
import com.sxc.framework.common.httpclient.ResponseContent;
import com.sxc.framework.common.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;
import static com.sxc.etaxincome.domain.constants.EtaxReportConstants.*;
@Slf4j
@Component(value = "queryReportListQueryPageListCommand")
public class QueryReportListQueryPageListCommand implements IQueryPageListCommand {
@NacosValue(value = "${url.etax.report}", autoRefreshed = true)
private String etaxReportUrl;
@Autowired
private IApiConfigManager apiConfigManager;
@Override
public CommonResponse<PageList<IReportResponse>> execute(CommonRequestWrapper commonRequestWrapper) {
Stopwatch stopwatch = Stopwatch.createStarted();
ApiConfig apiConfig = apiConfigManager.getApiConfig(ApiCode.QUERY_REPORT_PAGE_LIST.getCode());
JSONObject requestDataJsonObject = new JSONObject();
String requestDataStr = commonRequestWrapper.getData();
String requestSerialNo = commonRequestWrapper.getRequestSerialNo();
log.info("queryReportPageList requestSerialNo:{} data:{}", requestSerialNo, requestDataStr);
QueryReportListRequestWrapper queryReportListRequestWrapper = JSON.parseObject(requestDataStr, QueryReportListRequestWrapper.class);
TokenNecessary tokenNecessary = queryReportListRequestWrapper.decodeToken();
String token = tokenNecessary.getToken();
requestDataJsonObject.put(API_PARAM_TOKEN, token);
requestDataJsonObject.put(API_PARAM_AREA_CODE, queryReportListRequestWrapper.getArea());
String test = queryReportListRequestWrapper.getTest();
if (StringUtils.isNotBlank(test)) {
requestDataJsonObject.put(API_PARAM_TEST, test);
}
if (StringUtils.isNotBlank(queryReportListRequestWrapper.getReportDateStart())) {
requestDataJsonObject.put("sbrqq", queryReportListRequestWrapper.getReportDateStart());
}
if (StringUtils.isNotBlank(queryReportListRequestWrapper.getReportDateEnd())) {
requestDataJsonObject.put("sbrqz", queryReportListRequestWrapper.getReportDateEnd());
}
if (StringUtils.isNotBlank(queryReportListRequestWrapper.getDeclareDateStart())) {
requestDataJsonObject.put("skssqq", queryReportListRequestWrapper.getDeclareDateStart());
}
if (StringUtils.isNotBlank(queryReportListRequestWrapper.getDeclareDateEnd())) {
requestDataJsonObject.put("skssqz", queryReportListRequestWrapper.getDeclareDateEnd());
}
if (StringUtils.isNotBlank(queryReportListRequestWrapper.getCancelStatus())) {
requestDataJsonObject.put("zfbz", queryReportListRequestWrapper.getCancelStatus());
}
if (StringUtils.isNotBlank(queryReportListRequestWrapper.getReportType())) {
requestDataJsonObject.put("yzpzzlDm", queryReportListRequestWrapper.getReportType());
}
if (CollectionUtils.isNotEmpty(queryReportListRequestWrapper.getUpdateTypeList())) {
requestDataJsonObject.put("gzlx", queryReportListRequestWrapper.getUpdateTypeList());
}
if (queryReportListRequestWrapper.getPageSize() != null) {
requestDataJsonObject.put("pageSize", queryReportListRequestWrapper.getPageSize().toString());
}
if (queryReportListRequestWrapper.getPageNumber() != null) {
requestDataJsonObject.put("pageNumber", queryReportListRequestWrapper.getPageNumber().toString());
}
try {
String etaxReportUrlFull = etaxReportUrl + apiConfig.getApiUrl();
log.info("url:{}", etaxReportUrlFull);
String requestJson = JSONUtil.toString(requestDataJsonObject);
log.info("request:{}", requestJson);
ResponseContent responseContent = RetryHttpHelper.retryPostJsonEntity(etaxReportUrlFull, requestJson);
String response = responseContent.getContent();
log.info("response:{}", response);
stopwatch.stop();
log.info("query report page list elapsed time:{}ms", stopwatch.elapsed(TimeUnit.MILLISECONDS));
return new ResponseHandlerTemplate<PageList<IReportResponse>>() {
@Override
public CommonResponse<PageList<IReportResponse>> handleSuccess(JSONObject jsonObject) {
JSONObject resultJsonObject = jsonObject.getJSONObject(EtaxReportConstants.ETAX_RESPONSE_DATA_KEY);
JSONArray jsonArray = resultJsonObject.getJSONArray("List");
Integer total = resultJsonObject.getInteger("Total");
Integer pageSize = resultJsonObject.getInteger("PageSize");
Integer pageNumber = resultJsonObject.getInteger("PageNumber");
List<IReportResponse> invoiceResponseList = Lists.newArrayListWithExpectedSize(10);
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject jsonObjectInvoice = jsonArray.getJSONObject(i);
ReportResponse reportResponse = new ReportResponse();
reportResponse.putAll(jsonObjectInvoice);
invoiceResponseList.add(reportResponse);
}
PageList<IReportResponse> pageList = PageList.<IReportResponse>builder()
.total(total)
.pageNumber(pageNumber)
.pageSize(pageSize)
.list(invoiceResponseList).build();
return CommonResponse.success(pageList);
}
}.handle(response);
} catch (Exception e) {
log.error("query report page list error:", e);
throw new EtaxIncomeException(e);
}
}
}
package com.sxc.etaxincome.domain.command.report;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.nacos.api.config.annotation.NacosValue;
import com.google.common.base.Stopwatch;
import com.sxc.etaxincome.common.util.RetryHttpHelper;
import com.sxc.etaxincome.domain.business.IApiConfigManager;
import com.sxc.etaxincome.domain.exception.EtaxIncomeException;
import com.sxc.etaxincome.domain.handler.transferparam.IReportTransferParamHandler;
import com.sxc.etaxincome.domain.model.common.CommonRequestWrapper;
import com.sxc.etaxincome.domain.model.common.CommonResponse;
import com.sxc.etaxincome.domain.model.cookie.TokenNecessary;
import com.sxc.etaxincome.domain.model.report.*;
import com.sxc.etaxincome.domain.template.ResponseHandlerTemplate;
import com.sxc.etaxincome.enums.ApiCode;
import com.sxc.framework.common.httpclient.ResponseContent;
import com.sxc.framework.common.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.concurrent.TimeUnit;
import static com.sxc.etaxincome.domain.constants.EtaxReportConstants.*;
@Slf4j
@Component(value = "cancelReportCommand")
public class CancelReportCommand implements IReportCommand {
@NacosValue(value = "${url.etax.report}", autoRefreshed = true)
private String etaxReportUrl;
@Autowired
private IApiConfigManager apiConfigManager;
@Autowired
private List<IReportTransferParamHandler> reportTransferParamHandlerList;
@Override
public CommonResponse<IReportResponse> execute(CommonRequestWrapper commonRequestWrapper) {
Stopwatch stopwatch = Stopwatch.createStarted();
ApiConfig apiConfig = apiConfigManager.getApiConfig(ApiCode.CANCEL_REPORT.getCode());
JSONObject requestDataJsonObject = new JSONObject();
String requestDataStr = commonRequestWrapper.getData();
String requestSerialNo = commonRequestWrapper.getRequestSerialNo();
log.info("cancel report requestSerialNo:{} data:{}", requestSerialNo, requestDataStr);
CancelReportRequestWrapper cancelReportRequestWrapper = JSON.parseObject(requestDataStr, CancelReportRequestWrapper.class);
TokenNecessary tokenNecessary = cancelReportRequestWrapper.decodeToken();
String token = tokenNecessary.getToken();
requestDataJsonObject.put(API_PARAM_TOKEN, token);
requestDataJsonObject.put(API_PARAM_AREA_CODE, cancelReportRequestWrapper.getArea());
String test = cancelReportRequestWrapper.getTest();
if (StringUtils.isNotBlank(test)) {
requestDataJsonObject.put(API_PARAM_TEST, test);
}
if (StringUtils.isNotBlank(cancelReportRequestWrapper.getPzxh())) {
requestDataJsonObject.put("pzxh", cancelReportRequestWrapper.getPzxh());
}
if (StringUtils.isNotBlank(cancelReportRequestWrapper.getReportType())) {
requestDataJsonObject.put("yzpzzlDm", cancelReportRequestWrapper.getReportType());
}
if (StringUtils.isNotBlank(cancelReportRequestWrapper.getDeclareDateStart())) {
requestDataJsonObject.put("skssqq", cancelReportRequestWrapper.getDeclareDateStart());
}
if (StringUtils.isNotBlank(cancelReportRequestWrapper.getDeclareDateEnd())) {
requestDataJsonObject.put("skssqz", cancelReportRequestWrapper.getDeclareDateEnd());
}
if (StringUtils.isNotBlank(cancelReportRequestWrapper.getSbuuid())) {
requestDataJsonObject.put("sbuuid", cancelReportRequestWrapper.getSbuuid());
}
if (StringUtils.isNotBlank(cancelReportRequestWrapper.getZsxmDm())) {
requestDataJsonObject.put("zsxmDm", cancelReportRequestWrapper.getZsxmDm());
}
try {
String etaxReportUrlFull = etaxReportUrl + apiConfig.getApiUrl();
log.info("url:{}", etaxReportUrlFull);
String requestJson = JSONUtil.toString(requestDataJsonObject);
log.info("request:{}", requestJson);
ResponseContent responseContent = RetryHttpHelper.retryPostJsonEntity(etaxReportUrlFull, requestJson);
String response = responseContent.getContent();
log.info("response:{}", response);
stopwatch.stop();
log.info("cancel report elapsed time:{}ms", stopwatch.elapsed(TimeUnit.MILLISECONDS));
return new ResponseHandlerTemplate<IReportResponse>() {
@Override
public CommonResponse<IReportResponse> handleSuccess(JSONObject jsonObject) {
String message = jsonObject.getString(ETAX_RESPONSE_MESSAGE_KEY);
return CommonResponse.success(message);
}
}.handle(response);
} catch (Exception e) {
log.error("cancel report error:", e);
throw new EtaxIncomeException(e);
}
}
}
package com.sxc.etaxincome.domain.command.report;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.nacos.api.config.annotation.NacosValue;
import com.google.common.base.Stopwatch;
import com.sxc.etaxincome.common.util.RetryHttpHelper;
import com.sxc.etaxincome.domain.business.IApiConfigManager;
import com.sxc.etaxincome.domain.exception.EtaxIncomeException;
import com.sxc.etaxincome.domain.model.common.CommonRequestWrapper;
import com.sxc.etaxincome.domain.model.common.CommonResponse;
import com.sxc.etaxincome.domain.model.cookie.TokenNecessary;
import com.sxc.etaxincome.domain.model.report.ApiConfig;
import com.sxc.etaxincome.domain.model.report.ForceReportRequestWrapper;
import com.sxc.etaxincome.domain.model.report.IReportResponse;
import com.sxc.etaxincome.domain.template.ResponseHandlerTemplate;
import com.sxc.etaxincome.enums.ApiCode;
import com.sxc.framework.common.httpclient.ResponseContent;
import com.sxc.framework.common.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.concurrent.TimeUnit;
import static com.sxc.etaxincome.domain.constants.EtaxReportConstants.*;
@Slf4j
@Component(value = "forceReportCommand")
public class ForceReportCommand implements IReportCommand {
@NacosValue(value = "${url.etax.report}", autoRefreshed = true)
private String etaxReportUrl;
@Autowired
private IApiConfigManager apiConfigManager;
@Override
public CommonResponse<IReportResponse> execute(CommonRequestWrapper commonRequestWrapper) {
Stopwatch stopwatch = Stopwatch.createStarted();
ApiConfig apiConfig = apiConfigManager.getApiConfig(ApiCode.FORCE_REPORT.getCode());
JSONObject requestDataJsonObject = new JSONObject();
String requestDataStr = commonRequestWrapper.getData();
String requestSerialNo = commonRequestWrapper.getRequestSerialNo();
log.info("cancel report requestSerialNo:{} data:{}", requestSerialNo, requestDataStr);
ForceReportRequestWrapper forceReportRequestWrapper = JSON.parseObject(requestDataStr, ForceReportRequestWrapper.class);
TokenNecessary tokenNecessary = forceReportRequestWrapper.decodeToken();
String token = tokenNecessary.getToken();
requestDataJsonObject.put(API_PARAM_TOKEN, token);
requestDataJsonObject.put(API_PARAM_AREA_CODE, forceReportRequestWrapper.getArea());
String test = forceReportRequestWrapper.getTest();
if (StringUtils.isNotBlank(test)) {
requestDataJsonObject.put(API_PARAM_TEST, test);
}
if (StringUtils.isNotBlank(forceReportRequestWrapper.getPch())) {
requestDataJsonObject.put("pch", forceReportRequestWrapper.getPch());
}
if (StringUtils.isNotBlank(forceReportRequestWrapper.getReportType())) {
requestDataJsonObject.put("yzpzzlDm", forceReportRequestWrapper.getReportType());
}
if (StringUtils.isNotBlank(forceReportRequestWrapper.getSbxh())) {
requestDataJsonObject.put("sbxh", forceReportRequestWrapper.getSbxh());
}
if (StringUtils.isNotBlank(forceReportRequestWrapper.getForceReason())) {
requestDataJsonObject.put("qtyy", forceReportRequestWrapper.getForceReason());
}
try {
String etaxReportUrlFull = etaxReportUrl + apiConfig.getApiUrl();
log.info("url:{}", etaxReportUrlFull);
String requestJson = JSONUtil.toString(requestDataJsonObject);
log.info("request:{}", requestJson);
ResponseContent responseContent = RetryHttpHelper.retryPostJsonEntity(etaxReportUrlFull, requestJson);
String response = responseContent.getContent();
log.info("response:{}", response);
stopwatch.stop();
log.info("cancel report elapsed time:{}ms", stopwatch.elapsed(TimeUnit.MILLISECONDS));
return new ResponseHandlerTemplate<IReportResponse>() {
@Override
public CommonResponse<IReportResponse> handleSuccess(JSONObject jsonObject) {
String message = jsonObject.getString(ETAX_RESPONSE_MESSAGE_KEY);
return CommonResponse.success(message);
}
}.handle(response);
} catch (Exception e) {
log.error("cancel report error:", e);
throw new EtaxIncomeException(e);
}
}
}
package com.sxc.etaxincome.domain.command.report;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.nacos.api.config.annotation.NacosValue;
import com.google.common.base.Stopwatch;
import com.sxc.etaxincome.common.util.RetryHttpHelper;
import com.sxc.etaxincome.domain.business.IApiConfigManager;
import com.sxc.etaxincome.domain.constants.EtaxReportConstants;
import com.sxc.etaxincome.domain.exception.EtaxIncomeException;
import com.sxc.etaxincome.domain.handler.transferparam.IReportTransferParamHandler;
import com.sxc.etaxincome.domain.model.cookie.TokenNecessary;
import com.sxc.etaxincome.domain.model.report.*;
import com.sxc.etaxincome.domain.model.common.CommonRequestWrapper;
import com.sxc.etaxincome.domain.model.common.CommonResponse;
import com.sxc.etaxincome.domain.template.ResponseHandlerTemplate;
import com.sxc.etaxincome.enums.ApiCode;
import com.sxc.framework.common.httpclient.ResponseContent;
import com.sxc.framework.common.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.concurrent.TimeUnit;
import static com.sxc.etaxincome.domain.constants.EtaxReportConstants.*;
@Slf4j
@Component(value = "generalTaxpayerReportCommand")
public class GeneralTaxpayerReportCommand implements IReportCommand {
@NacosValue(value = "${url.etax.report}", autoRefreshed = true)
private String etaxReportUrl;
@Autowired
private IApiConfigManager apiConfigManager;
@Autowired
private List<IReportTransferParamHandler> reportTransferParamHandlerList;
@Override
public CommonResponse<IReportResponse> execute(CommonRequestWrapper commonRequestWrapper) {
Stopwatch stopwatch = Stopwatch.createStarted();
ApiConfig apiConfig = apiConfigManager.getApiConfig(ApiCode.REPORT.getCode());
JSONObject requestDataJsonObject = new JSONObject();
String requestDataStr = commonRequestWrapper.getData();
String requestSerialNo = commonRequestWrapper.getRequestSerialNo();
log.info("report requestSerialNo:{} data:{}", requestSerialNo, requestDataStr);
ReportRequestWrapper reportRequestWrapper = JSON.parseObject(requestDataStr, ReportRequestWrapper.class);
TokenNecessary tokenNecessary = reportRequestWrapper.decodeToken();
String token = tokenNecessary.getToken();
requestDataJsonObject.put(API_PARAM_TOKEN, token);
requestDataJsonObject.put(API_PARAM_AREA_CODE, reportRequestWrapper.getArea());
String test = reportRequestWrapper.getTest();
if (StringUtils.isNotBlank(test)) {
requestDataJsonObject.put(API_PARAM_TEST, test);
}
reportTransferParamHandlerList.forEach(e -> e.handle(apiConfig, commonRequestWrapper, reportRequestWrapper));
requestDataJsonObject.put("formData", reportRequestWrapper.getFormData());
try {
String etaxReportUrlFull = etaxReportUrl + apiConfig.getApiUrl();
log.info("url:{}", etaxReportUrlFull);
String requestJson = JSONUtil.toString(requestDataJsonObject);
log.info("request:{}", requestJson);
ResponseContent responseContent = RetryHttpHelper.retryPostJsonEntity(etaxReportUrlFull, requestJson);
String response = responseContent.getContent();
log.info("response:{}", response);
stopwatch.stop();
log.info("query cancel page list elapsed time:{}ms", stopwatch.elapsed(TimeUnit.MILLISECONDS));
return new ResponseHandlerTemplate<IReportResponse>() {
@Override
public CommonResponse<IReportResponse> handleSuccess(JSONObject jsonObject) {
JSONObject resultJsonObject = jsonObject.getJSONObject(EtaxReportConstants.ETAX_RESPONSE_DATA_KEY);
ReportResponse reportResponse = new ReportResponse();
reportResponse.putAll(resultJsonObject);
return CommonResponse.success(reportResponse);
}
}.handle(response);
} catch (Exception e) {
log.error("report error:", e);
throw new EtaxIncomeException(e);
}
}
}
package com.sxc.etaxincome.domain.command.report;
import com.sxc.etaxincome.domain.model.report.IReportResponse;
import com.sxc.etaxincome.domain.model.common.CommonResponse;
import com.sxc.etaxincome.domain.model.common.CommonRequestWrapper;
public interface IReportCommand {
CommonResponse<IReportResponse> execute(CommonRequestWrapper commonRequestWrapper);
}
package com.sxc.etaxincome.domain.constants;
public class CommonConstants {
private CommonConstants() {
}
public static final String SUCCESS = "00";
}
package com.sxc.etaxincome.domain.constants;
public class EtaxExceptionConstants {
private EtaxExceptionConstants() {
}
public static final String ETAX_EXCEPTION_TAX_BUSY = "税号访问频繁,请10秒后再试";
public static final String ETAX_EXCEPTION_TAX_NULL = "空值";
}
package com.sxc.etaxincome.domain.constants;
public class EtaxReportConstants {
private EtaxReportConstants() {
}
public static final String ETAX_RESPONSE_CODE_KEY = "code";
public static final String ETAX_RESPONSE_MESSAGE_KEY = "message";
public static final String ETAX_RESPONSE_DATA_KEY = "data";
public static final String ETAX_ERROR_INVALID_TOKEN = "w4000000";
public static final String ETAX_SUCCESS_CODE = "0";
public static final String ETAX_ERROR_CODE = "-1";
public static final String PROXY_KEY_IN_COOKIE = "psswoeoeqqxxx";
public static final String API_PARAM_TOKEN = "cookie";
public static final String API_PARAM_AREA_CODE = "zoneCode";
public static final String API_PARAM_TEST = "test";
}
package com.sxc.etaxincome.domain.exception;
/**
* @author caosongqing
* @date 2024/4/23
* @description
*/
public class EtaxIncomeException extends RuntimeException {
public EtaxIncomeException(final String errorMessage, final Object... args) {
super(String.format(errorMessage, args));
}
public EtaxIncomeException(final Throwable cause) {
super(cause);
}
}
package com.sxc.etaxincome.domain.format;
public class ReportParamFormat {
private ReportParamFormat() {
}
public static String formatReportParam(String tableCode, String row, String col) {
return String.format("%s_row_%s|%s_col_%s", tableCode, row, tableCode, col);
}
}
package com.sxc.etaxincome.domain.handler.transferparam;
import com.sxc.etaxincome.domain.model.common.CommonRequestWrapper;
import com.sxc.etaxincome.domain.model.report.ApiConfig;
import com.sxc.etaxincome.domain.model.report.ReportRequestWrapper;
/**
* @author caosongqing
* @date 2023/9/7
* @description
*/
public interface IReportTransferParamHandler {
void handle(ApiConfig apiConfig, CommonRequestWrapper requestCommonWrapper, ReportRequestWrapper reportRequestWrapper);
}
package com.sxc.etaxincome.domain.handler.transferparam;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import com.sxc.etaxincome.domain.model.common.CommonRequestWrapper;
import com.sxc.etaxincome.domain.model.report.ApiConfig;
import com.sxc.etaxincome.domain.model.report.ApiParamMapping;
import com.sxc.etaxincome.domain.model.report.ReportRequestWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Slf4j
@Component
public class MappingReportTransferParamHandler implements IReportTransferParamHandler {
@Override
public void handle(ApiConfig apiConfig, CommonRequestWrapper requestCommonWrapper, ReportRequestWrapper reportRequestWrapper) {
List<ApiParamMapping> apiParamMappingList = apiConfig.getApiParamMappingList();
Map<String, String> apiParamMapping = apiParamMappingList.stream().collect(Collectors.toMap(ApiParamMapping::getApiParamName, ApiParamMapping::getEtaxParamName, (k1, k2) -> k1));
LinkedHashMap<String, String> requestFormDataJsonObject = reportRequestWrapper.getFormData();
LinkedHashMap<String, String> targetFormDataJsonObject = Maps.newLinkedHashMapWithExpectedSize(10);
for (ApiParamMapping apiParamMappingEach : apiParamMappingList) {
String dataKey = apiParamMappingEach.getApiParamName();
log.info("dataKey:{}", dataKey);
if (requestFormDataJsonObject.containsKey(dataKey)) {
targetFormDataJsonObject.put(apiParamMapping.get(dataKey), requestFormDataJsonObject.get(dataKey));
}
}
reportRequestWrapper.setFormData(targetFormDataJsonObject);
}
}
package com.sxc.etaxincome.domain.infrastructure;
import com.alicp.jetcache.Cache;
/**
* @author caosongqing
* @date 2023/2/10
* @description
*/
public interface ICacheService {
Cache<String ,String> getJetCache();
String get(String key);
void put(String key, String value, long expiredTimeSeconds);
boolean del(String key);
}
package com.sxc.etaxincome.domain.infrastructure.impl;
import com.alicp.jetcache.Cache;
import com.alicp.jetcache.CacheManager;
import com.alicp.jetcache.anno.CacheType;
import com.alicp.jetcache.template.QuickConfig;
import com.sxc.etaxincome.domain.infrastructure.ICacheService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.time.Duration;
import java.util.concurrent.TimeUnit;
/**
* @author caosongqing
* @date 2023/3/22
* @description
*/
@Slf4j
@Service
public class CacheService implements ICacheService {
public static final long DEFAULT_EXPIRED_TIME = 3600L;
public static final String GX2022_AREA_LIST_KEY_PREFIX = "gx2022:areaList";
public static final String DATA_PRIVILEGE_AREA_KEY_PREFIX = "erm:dataPrivilege:area:%s";
public static final String DATA_PRIVILEGE_TAXNO_KEY_PREFIX = "erm:dataPrivilege:taxno:%s";
public static final String DATA_PRIVILEGE_TAXCOUNT_KEY_PREFIX = "erm:dataPrivilege:taxcount:%s";
public static final String GOODS_CATEGORY_KEY_PREFIX = "goods:category:%s";
public static final String COOKIE_KEY_PREFIX = "cookie:%s";
@Autowired
private CacheManager cacheManager;
private Cache<String, String> jetCache;
@PostConstruct
public void init() {
QuickConfig qc = QuickConfig.newBuilder("cache:makeout-invoice:")
.expire(Duration.ofSeconds(60 * 60L))
.cacheType(CacheType.REMOTE)
.syncLocal(true)
.build();
jetCache = cacheManager.getOrCreateCache(qc);
}
@Override
public String get(String key) {
return jetCache.get(key);
}
@Override
public void put(String key, String value, long expiredTimeSeconds) {
jetCache.put(key, value, expiredTimeSeconds, TimeUnit.SECONDS);
}
@Override
public Cache<String ,String> getJetCache() {
return this.jetCache;
}
@Override
public boolean del(String key) {
return jetCache.remove(key);
}
}
package com.sxc.etaxincome.domain.init;
import cn.hutool.http.HttpUtil;
import com.alibaba.nacos.api.config.annotation.NacosValue;
import com.sxc.etaxincome.domain.business.IVersionManager;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
/**
* @author caosongqing
* @date 2022/12/12
* @description
*/
@Slf4j
@Component
public class SendVersionRunner implements CommandLineRunner, Ordered {
@Autowired
private IVersionManager versionService;
@NacosValue(value = "${url.monitor.version}", autoRefreshed = true)
private String sendVersionUrl;
@NacosValue(value = "${send.version.enabled}", autoRefreshed = true)
private boolean sendVersionEnabled;
private void handle() {
log.info("sendVersionEnabled:{}", sendVersionEnabled);
if (sendVersionEnabled) {
try {
String response = HttpUtil.get(sendVersionUrl + "?version=" + versionService.version());
log.info("start application send version response:{}", response);
} catch (Exception e) {
log.error("send version error:{}", e);
}
}
}
@Override
public void run(String... args) throws Exception {
handle();
}
@Override
public int getOrder() {
return 0;
}
}
package com.sxc.etaxincome.domain.job;
import cn.hutool.http.HttpUtil;
import com.alibaba.nacos.api.config.annotation.NacosValue;
import com.sxc.etaxincome.domain.business.IVersionManager;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
/**
* @author caosongqing
* @date 2022/12/23
* @description
*/
@Configuration
@EnableScheduling
@Slf4j
public class SendVersionJob {
@Autowired
private IVersionManager versionManager;
@NacosValue(value = "${url.monitor.version}", autoRefreshed = true)
private String sendVersionUrl;
@NacosValue(value = "${send.version.enabled}", autoRefreshed = true)
private boolean sendVersionEnabled;
@Scheduled(cron = "${job.send-version.cron}")
private void handle() {
log.info("sendVersionEnabled:{}", sendVersionEnabled);
if (sendVersionEnabled) {
try {
String response = HttpUtil.get(sendVersionUrl + "?version=" + versionManager.version());
log.info("job send version response:{}", response);
} catch (Exception e) {
log.error("send version error:", e);
}
}
}
}
package com.sxc.etaxincome.domain.model.common;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author caosongqing
* @date 2022/11/17
* @description
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class AggregateVersion {
private ApiVersionLog apiVersionLog;
private BuildVersion buildVersion;
}
package com.sxc.etaxincome.domain.model.common;
import lombok.Data;
import java.util.List;
/**
* @author caosongqing
* @date 2022/8/23
* @description
*/
@Data
public class ApiVersion {
private String latestVersion;
private List<ApiVersionLog> versionList;
public ApiVersionLog getLatestVersion() {
for (ApiVersionLog apiVersionLog : versionList) {
if (latestVersion.equals(apiVersionLog.getVersion())) {
return apiVersionLog;
}
}
return new ApiVersionLog();
}
}
package com.sxc.etaxincome.domain.model.common;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
import java.util.Date;
/**
* @author caosongqing
* @date 2022/8/23
* @description
*/
@Data
public class ApiVersionLog {
private String version;
private String previousVersion;
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private Date date;
private String description;
}
package com.sxc.etaxincome.domain.model.common;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author caosongqing
* @date 2023/1/31
* @description
*/
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
public class BuildVersion {
private String projectVersion;
private String revision;
private String branch;
private String date;
}
package com.sxc.etaxincome.domain.model.common;
import com.alibaba.fastjson2.JSON;
import com.sxc.etaxincome.domain.exception.EtaxIncomeException;
import com.sxc.etaxincome.domain.model.cookie.CookieCarrier;
import com.sxc.etaxincome.domain.model.cookie.TokenNecessary;
import com.sxc.framework.common.code.EncryptUtil;
import com.sxc.framework.common.json.JSONUtil;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import org.apache.commons.lang3.StringUtils;
import java.io.Serializable;
import static com.sxc.etaxincome.domain.constants.EtaxReportConstants.PROXY_KEY_IN_COOKIE;
/**
* @author caosongqing
* @date 2022/9/21
* @description
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
public class BusinessCommonRequestWrapper implements Serializable {
private static final long serialVersionUID = -4090578281523166142L;
private String taxno;
private String area;
private String site;
private String token;
private String test;
public String getPlainToken() {
return this.decodeToken().getToken();
}
public TokenNecessary decodeToken() {
String decodeToken = token;
if (token.startsWith(EncryptUtil.FKEY)) {
decodeToken = EncryptUtil.decryptAesCk(StringUtils.replace(token, " ", "+"));
}
String targetToken;
String proxy;
String session = null;
if (JSONUtil.isJSONObject(decodeToken)) {
CookieCarrier cookieCarrier = JSON.parseObject(decodeToken, CookieCarrier.class);
targetToken = cookieCarrier.getCookie();
proxy = cookieCarrier.getProxyIp();
session = cookieCarrier.getSession();
} else {
if (decodeToken.length() < 100) {
throw new IllegalArgumentException("Token不合法,请检查");
}
targetToken = delCookieProxy(decodeToken);
proxy = getCookieProxy(decodeToken);
}
return TokenNecessary.builder().token(targetToken).proxy(proxy).session(session).build();
}
public String getCookieProxy(String cookie) {
if (cookie != null && cookie.contains(PROXY_KEY_IN_COOKIE)) {
String[] ss = cookie.split(";");
for (int i = 0; i < ss.length; i++) {
if (ss[i].contains(PROXY_KEY_IN_COOKIE)) {
String[] ssss = ss[i].split("=");
return ssss[1];
}
}
}
return "";
}
public String delCookieProxy(String cookie) {
if (cookie != null && cookie.contains(PROXY_KEY_IN_COOKIE)) {
String[] ss = cookie.split(";");
for (int i = 0; i < ss.length; i++) {
if (ss[i].contains(PROXY_KEY_IN_COOKIE)) {
return cookie.replace(ss[i], "");
}
}
}
return cookie;
}
public void doCheckRequestBusinessParam() {
if (StringUtils.isBlank(this.getArea())) {
throw new EtaxIncomeException("area is empty");
} else if (this.getArea().length() != 4) {
throw new EtaxIncomeException("area is invalid");
}
if (StringUtils.isBlank(this.getTaxno())) {
throw new EtaxIncomeException("taxno is empty");
}
if (StringUtils.isBlank(this.getToken())) {
throw new EtaxIncomeException("token is empty");
}
}
}
package com.sxc.etaxincome.domain.model.common;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* @author caosongqing
* @date 2022/9/20
* @description
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class CommonRequestWrapper implements Serializable {
private static final long serialVersionUID = 191691175092676480L;
/**
* request serial number
*/
@NotNull(message = "请求流水号不能为空")
@Length(message = "请求流水号最大长度范围1-50", min = 1, max = 50)
private String requestSerialNo;
/**
* username
*/
@NotNull(message = "用户名不能为空")
@Length(message = "用户名不能为空", min = 1)
private String username;
/**
* sign
*/
@NotNull(message = "签名字符串不能为空")
@Length(message = "签名字符串不能为空", min = 1)
private String sign;
/**
* 接口类型
*/
private String rtype;
/**
* timestamp
*/
@NotNull(message = "时间戳不能为空")
@Length(message = "时间戳格式为yyyyMMddHHmmss", min = 14, max = 14)
private String timestamp;
/**
* request business data
*/
@NotNull(message = "业务数据不能为空")
@Length(message = "业务数据不能为空", min = 1)
private String data;
}
package com.sxc.etaxincome.domain.model.common;
import com.alibaba.fastjson2.annotation.JSONField;
import com.google.common.collect.Lists;
import com.sxc.etaxincome.enums.ResponseCode;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* @author caosongqing
* @date 2024/4/23
* @description
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CommonResponse<T> implements Serializable {
private static final long serialVersionUID = 3212054091102827090L;
/**
* code
*/
@JSONField(name = "resultCode")
private String resultCode;
/**
* message
*/
@JSONField(name = "resultMessage")
private String resultMessage;
/**
* data
*/
@JSONField(name = "data")
@SuppressWarnings("java:S1948")
private T data;
private CommonResponse(String resultCode, String resultMessage) {
this.resultCode = resultCode;
this.resultMessage = resultMessage;
this.data = null;
}
public boolean resultSuccess() {
return ResponseCode.SUCCESS.getCode().equals(resultCode);
}
public boolean invalidToken() {
return ResponseCode.TOKEN_INVALID.getCode().equals(resultCode);
}
public boolean requiredQrcodeSecurity() {
return ResponseCode.ETAX_QR_CODE_CHECK.getCode().equals(resultCode);
}
public boolean notifyIgnore() {
List<ResponseCode> ignoreResponseCodeList = Lists.newArrayListWithExpectedSize(10);
ignoreResponseCodeList.add(ResponseCode.SUCCESS);
ignoreResponseCodeList.add(ResponseCode.ETAX_LOGIN_INVALID);
ignoreResponseCodeList.add(ResponseCode.ETAX_QR_CODE_CHECK);
ignoreResponseCodeList.add(ResponseCode.TOKEN_INVALID);
ignoreResponseCodeList.add(ResponseCode.MAKEOUT_INVOICE_NO_EXPIRED);
ignoreResponseCodeList.add(ResponseCode.MAKEOUT_INVOICE_NO_REQUIRED);
ignoreResponseCodeList.add(ResponseCode.ERROR_TAX);
ignoreResponseCodeList.add(ResponseCode.MAKEOUT_INVOICE_PROXY_ERROR);
ignoreResponseCodeList.add(ResponseCode.NOT_FOUND_ITEM);
ignoreResponseCodeList.add(ResponseCode.OVER_CREDIT_LINE);
ignoreResponseCodeList.add(ResponseCode.FREEZE_CREDIT_LINE);
ignoreResponseCodeList.add(ResponseCode.DISCOUNT_OVER_ITEM_AMOUNT);
ignoreResponseCodeList.add(ResponseCode.WRONG_FORMAT_BANK_ACCOUNT);
ignoreResponseCodeList.add(ResponseCode.ILLEGAL_PARAM);
ignoreResponseCodeList.add(ResponseCode.RESPONSE_419_ERROR);
ignoreResponseCodeList.add(ResponseCode.NOT_FOUND_BUYER_TAXNO);
return ignoreResponseCodeList.contains(ResponseCode.as(resultCode));
}
public static <T> CommonResponse<T> success(T data) {
return new CommonResponse<>(ResponseCode.SUCCESS.getCode(), ResponseCode.SUCCESS.getDesc(), data);
}
public static <T> CommonResponse<T> success() {
return success(null);
}
public static <T> CommonResponse<T> success(String message) {
return new CommonResponse<>(ResponseCode.SUCCESS.getCode(), message);
}
public static <T> CommonResponse<T> error(ResponseCode responseCode) {
return new CommonResponse<>(responseCode.getCode(), responseCode.getDesc());
}
public static <T> CommonResponse<T> error(ResponseCode responseCode, String msg) {
return new CommonResponse<>(responseCode.getCode(), msg);
}
public static <T> CommonResponse<T> error(ResponseCode responseCode, T data) {
return new CommonResponse<>(responseCode.getCode(), responseCode.getDesc(), data);
}
public static <T> CommonResponse<T> error(ResponseCode responseCode, String msg, T data) {
return new CommonResponse<>(responseCode.getCode(), msg, data);
}
public static <T> CommonResponse<T> error(String code, String msg) {
return new CommonResponse<>(code, msg);
}
public static <T> CommonResponse<T> error(String msg) {
return new CommonResponse<>(ResponseCode.ERROR.getCode(), msg);
}
}
package com.sxc.etaxincome.domain.model.common;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author caosongqing
* @date 2023/1/11
* @description
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class DateTimeRange {
private String startDateTime;
private String endDateTime;
}
package com.sxc.etaxincome.domain.model.common;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author caosongqing
* @date 2023/4/19
* @description
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class PageList<E> {
private Integer total;
private Integer pageNumber;
private Integer pageSize;
private List<E> list;
}
package com.sxc.etaxincome.domain.model.cookie;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author caosongqing
* @date 2023/3/30
* @description
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class CookieCarrier {
private String cookie;
private String proxyIp;
private String session;
}
package com.sxc.etaxincome.domain.model.cookie;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author caosongqing
* @date 2023/3/28
* @description
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class TokenNecessary {
private String token;
private String proxy;
private String session;
}
package com.sxc.etaxincome.domain.model.report;
import lombok.Data;
@Data
public class AnalysisCriteria {
private String username;
private String taxno;
private String areaCode;
private String startDate;
private String endDate;
private String startDateTime;
private String endDateTime;
private String countType;
}
package com.sxc.etaxincome.domain.model.report;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ApiConfig {
private String apiCode;
private String apiUrl;
private List<ApiParamMapping> apiParamMappingList;
}
package com.sxc.etaxincome.domain.model.report;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ApiParamMapping {
private String apiParamName;
private String etaxParamName;
}
package com.sxc.etaxincome.domain.model.report;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author caosongqing
* @date 2023/4/13
* @description
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class AreaCodeStat {
private String areaCode;
private String name;
private Long taxnoCount;
private Long requsetCount;
}
package com.sxc.etaxincome.domain.model.report;
import com.sxc.etaxincome.domain.model.common.BusinessCommonRequestWrapper;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
@Data
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
public class CancelReportRequestWrapper extends BusinessCommonRequestWrapper {
private String pzxh;
private String reportType;
private String declareDateStart;
private String declareDateEnd;
private String sbuuid;
private String zsxmDm;
}
package com.sxc.etaxincome.domain.model.report;
import com.alibaba.fastjson.JSONObject;
public class CancelReportResponse extends JSONObject implements IReportResponse {
}
package com.sxc.etaxincome.domain.model.report;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author caosongqing
* @date 2023/11/2
* @description
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ExceptionStat {
private String message;
private Integer count;
}
package com.sxc.etaxincome.domain.model.report;
import com.sxc.etaxincome.domain.model.common.BusinessCommonRequestWrapper;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
@EqualsAndHashCode(callSuper = true)
@Data
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
public class ForceReportRequestWrapper extends BusinessCommonRequestWrapper {
/**
* ???
*/
private String pch;
/**
* 申报序号
*/
private String sbxh;
/**
* 申报种类
*/
private String reportType;
/**
* 强制提交原因
*/
private String forceReason;
}
package com.sxc.etaxincome.domain.model.report;
public interface IReportRequest {
}
package com.sxc.etaxincome.domain.model.report;
public interface IReportResponse {
}
package com.sxc.etaxincome.domain.model.report;
import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @ProjectName: etax-income-api
* @Package: com.sxc.etaxincome.domain.model.report
* @ClassName: IncomeCompletePeriod
* @Author: ddx
* @Description:
* @Date: 2024-07-02 14:25
* @Version: 1.0
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class IncomeCompletePeriod {
private JSONObject requestParam;
private JSONObject cookie;
private String reqContext;
private String resContext;
}
package com.sxc.etaxincome.domain.model.report;
import com.sxc.etaxincome.domain.model.common.BusinessCommonRequestWrapper;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
@Data
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
public class QueryCancelListRequestWrapper extends BusinessCommonRequestWrapper {
/**
* 申报日期(起)
*/
private String reportDateStart;
/**
* 申报日期(止)
*/
private String reportDateEnd;
/**
* 当前页号
*/
private Integer pageNumber;
/**
* 每页记录数
*/
private Integer pageSize;
}
package com.sxc.etaxincome.domain.model.report;
import com.sxc.etaxincome.domain.model.common.BusinessCommonRequestWrapper;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
@EqualsAndHashCode(callSuper = true)
@Data
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
public class QueryReportItemRequestWrapper extends BusinessCommonRequestWrapper {
/**
* 税款所属期(起)
*/
private String declareDateStart;
/**
* 税款所属期(止)
*/
private String declareDateEnd;
/**
* 申报uuid
*/
private String sbuuid;
/**
* 报表id
*/
private String reportType;
}
package com.sxc.etaxincome.domain.model.report;
import com.sxc.etaxincome.domain.model.common.BusinessCommonRequestWrapper;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
public class QueryReportListRequestWrapper extends BusinessCommonRequestWrapper {
/**
* 申报日期(起)
*/
private String reportDateStart;
/**
* 申报日期(止)
*/
private String reportDateEnd;
/**
* 税款所属期(起)
*/
private String declareDateStart;
/**
* 税款所属期(止)
*/
private String declareDateEnd;
/**
* 作废状态
*/
private String cancelStatus;
/**
* 报表类型
*/
private String reportType;
/**
* 更正类型
*/
private List<String> updateTypeList;
/**
* 分页号
*/
private Integer pageNumber;
/**
* 每页记录数
*/
private Integer pageSize;
}
package com.sxc.etaxincome.domain.model.report;
import com.alibaba.fastjson.JSONObject;
public class ReportItemResponse extends JSONObject implements IReportResponse {
}
package com.sxc.etaxincome.domain.model.report;
import com.alibaba.fastjson.JSONObject;
public class ReportRequest implements IReportRequest {
private String cookie;
private String zoneCode;
private JSONObject formData;
}
package com.sxc.etaxincome.domain.model.report;
import com.alibaba.fastjson.JSONObject;
import com.sxc.etaxincome.domain.model.common.BusinessCommonRequestWrapper;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import java.util.LinkedHashMap;
@Data
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
public class ReportRequestWrapper extends BusinessCommonRequestWrapper {
private LinkedHashMap<String, String> formData;
}
package com.sxc.etaxincome.domain.model.report;
import com.alibaba.fastjson.JSONObject;
public class ReportResponse extends JSONObject implements IReportResponse {
}
package com.sxc.etaxincome.domain.model.report;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @ProjectName: etax-report-api
* @Package: com.sxc.etaxincome.domain.model.report
* @ClassName: ReportResultMapping
* @Author: ddx
* @Description: 报表转换结果
* @Date: 2024-04-25 17:39
* @Version: 1.0
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ReportResultMapping {
private String etaxExportName;
private String etaxExportValue;
}
package com.sxc.etaxincome.domain.model.report;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
/**
* @author caosongqing
* @date 2023/11/10
* @description
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
public class SellerGrowth {
private String date;
private int count;
}
package com.sxc.etaxincome.domain.model.sysManage;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author ddx
* @date 2024/05/28
* @description
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class SysAppUserSummary {
private String userName;
private String nickName;
private String status;
}
package com.sxc.etaxincome.domain.support;
import com.google.common.collect.Maps;
import java.util.Map;
/**
* @ProjectName: etax-income-api
* @Package: com.sxc.etaxincome.domain.support
* @ClassName: ZoneProvider
* @Author: ddx
* @Description: 地区码
* @Date: 2024-06-06 15:06
* @Version: 1.0
*/
public class ZoneProvider {
public static Map<String, String> zoneInfoMap = Maps.newHashMap();
static {
zoneInfoMap.put("1100","北京");
zoneInfoMap.put("1200","天津");
zoneInfoMap.put("1300","河北");
zoneInfoMap.put("1400","山西");
zoneInfoMap.put("1500","内蒙古");
zoneInfoMap.put("2100","辽宁");
zoneInfoMap.put("2102","大连");
zoneInfoMap.put("2200","吉林");
zoneInfoMap.put("2300","黑龙江");
zoneInfoMap.put("3100","上海");
zoneInfoMap.put("3200","江苏");
zoneInfoMap.put("3300","浙江");
zoneInfoMap.put("3302","宁波");
zoneInfoMap.put("3400","安徽");
zoneInfoMap.put("3500","福建");
zoneInfoMap.put("3502","厦门");
zoneInfoMap.put("3600","江西");
zoneInfoMap.put("3700","山东");
zoneInfoMap.put("3702","青岛");
zoneInfoMap.put("4100","河南");
zoneInfoMap.put("4200","湖北");
zoneInfoMap.put("4300","湖南");
zoneInfoMap.put("4400","广东");
zoneInfoMap.put("4403","深圳");
zoneInfoMap.put("4500","广西");
zoneInfoMap.put("4600","海南");
zoneInfoMap.put("5000","重庆");
zoneInfoMap.put("5100","四川");
zoneInfoMap.put("5200","贵州");
zoneInfoMap.put("5300","云南");
zoneInfoMap.put("5400","西藏");
zoneInfoMap.put("6100","陕西");
zoneInfoMap.put("6200","甘肃");
zoneInfoMap.put("6300","青海");
zoneInfoMap.put("6400","宁夏");
zoneInfoMap.put("6500","新疆");
zoneInfoMap.put("6789","空值");
}
public static String getZoneNameByCode(String zoneCode) {
return zoneInfoMap.get(zoneCode);
}
}
package com.sxc.etaxincome.domain.template;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.sxc.etaxincome.domain.model.common.CommonResponse;
import com.sxc.etaxincome.enums.ResponseCode;
import com.sxc.framework.common.json.JSONUtil;
import com.sxc.etaxincome.domain.constants.EtaxReportConstants;
import lombok.extern.slf4j.Slf4j;
/**
* handle response result
* @author caosongqing
* @date 2022/11/29
* @description
*/
@Slf4j
public abstract class ResponseHandlerTemplate<T> {
public CommonResponse<T> handle(String response) {
if (!JSONUtil.isJSONObject(response)) {
return CommonResponse.error(ResponseCode.ERROR);
}
CommonResponse<T> responseCommon;
JSONObject jsonObject = JSON.parseObject(response);
String responseCode = jsonObject.getString(EtaxReportConstants.ETAX_RESPONSE_CODE_KEY);
if (EtaxReportConstants.ETAX_SUCCESS_CODE.equals(responseCode)) {
responseCommon = this.handleSuccess(jsonObject);
} else if (EtaxReportConstants.ETAX_ERROR_CODE.equals(responseCode)) {
String errorMessage = jsonObject.getString(EtaxReportConstants.ETAX_RESPONSE_MESSAGE_KEY);
responseCommon = CommonResponse.error(errorMessage);
this.handleError(errorMessage);
} else if (EtaxReportConstants.ETAX_ERROR_INVALID_TOKEN.equals(responseCode)) {
responseCommon = CommonResponse.error(ResponseCode.TOKEN_INVALID);
} else {
String errorMessage = jsonObject.getString(EtaxReportConstants.ETAX_RESPONSE_MESSAGE_KEY);
responseCommon = CommonResponse.error(responseCode, errorMessage);
this.handleError(errorMessage);
}
return responseCommon;
}
protected abstract CommonResponse<T> handleSuccess(JSONObject jsonObject);
protected void handleError(String errorMessage) {
log.info("response errorMessage:{}", errorMessage);
}
}
{
"latestVersion": "1.0.3",
"versionList": [{
"version": "1.0.3",
"previousVersion": "1.0.2",
"date": "2024-05-15 16:55:00",
"description": "add api param priority"
},{
"version": "1.0.2",
"previousVersion": "1.0.1",
"date": "2024-04-25 14:30:00",
"description": "add 2002"
},{
"version": "1.0.1",
"previousVersion": "1.0.0",
"date": "2024-04-24 18:21:00",
"description": "add 1001/1901/2001"
},{
"version": "1.0.0",
"previousVersion": "",
"date": "2024-04-17 15:18:00",
"description": "init project"
}]
}
\ No newline at end of file
package com.sxc.etaxincome.domain.format;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class ReportParamFormatTest {
@Test
public void testFormatReportParam() {
String result = ReportParamFormat.formatReportParam("A06488", "37", "03");
String expected = "A06488_row_37|A06488_col_03";
assertEquals(expected, result);
}
}
\ No newline at end of file
package com.sxc.etaxincome.domain.handler.transferparam;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.sxc.etaxincome.domain.model.common.CommonRequestWrapper;
import com.sxc.etaxincome.domain.model.report.ApiConfig;
import com.sxc.etaxincome.domain.model.report.ApiParamMapping;
import com.sxc.etaxincome.domain.model.report.ReportRequestWrapper;
import com.sxc.framework.common.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import java.util.LinkedHashMap;
import java.util.List;
@Slf4j
public class MappingReportTransferParamHandlerTest {
@Test
public void testHandle() {
MappingReportTransferParamHandler mappingReportTransferParamHandler = new MappingReportTransferParamHandler();
List<ApiParamMapping> apiParamMappingList = Lists.newArrayListWithExpectedSize(10);
apiParamMappingList.add(ApiParamMapping.builder().etaxParamName("getObjFromList(ywbw.sbZzsYbnsr,'ewblxh','1').asysljsxse").apiParamName("A06493_row_01|A06493_col_01").build());
apiParamMappingList.add(ApiParamMapping.builder().etaxParamName("getObjFromList(ywbw.sbZzsYbnsr,'ewblxh','1').yshwxse").apiParamName("A06493_row_02|A06493_col_01").build());
apiParamMappingList.add(ApiParamMapping.builder().etaxParamName("getObjFromList(ywbw.sbZzsYbnsr,'ewblxh','1').yslwxse").apiParamName("A06493_row_03|A06493_col_01").build());
ApiConfig apiConfig = ApiConfig.builder().apiParamMappingList(apiParamMappingList).build();
CommonRequestWrapper requestCommonWrapper = CommonRequestWrapper.builder().build();
LinkedHashMap<String, String> formData = Maps.newLinkedHashMapWithExpectedSize(10);
formData.put("A06493_row_03|A06493_col_01", "3");
formData.put("A06493_row_01|A06493_col_01", "1");
formData.put("A06493_row_02|A06493_col_01", "2");
log.info("request param:{}", JSONUtil.toString(formData));
ReportRequestWrapper reportRequestWrapper = ReportRequestWrapper.builder().formData(formData).build();
mappingReportTransferParamHandler.handle(apiConfig, requestCommonWrapper, reportRequestWrapper);
log.info("formData:{}", JSONUtil.toString(reportRequestWrapper.getFormData()));
}
}
\ No newline at end of file
This diff is collapsed. Click to expand it.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment