2025年06月20日 1.0.2 重新获取统计日期的明细及汇总文件时DCPC_GD_PAY_INFO、DCPC_GD_SUMMARY_INFO按主键先删后插

main
gaoshuguang 5 months ago
parent f39f5d71ac
commit 09dbc18bb8

Binary file not shown.

@ -2,9 +2,12 @@ package com.nmg.gs.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.apache.ibatis.type.JdbcType;
import java.util.Date;
/**
* @author: shuguang
* @date: 20250418 10:22
@ -16,8 +19,11 @@ public class GDCpcPayInfo {
/**
* YYYY-MM-DD
*/
@TableField(value = "CLASS_DATE", jdbcType = JdbcType.DATE, update = "to_date(#{CLASS_DATE},'yyyy-mm-dd')")
private String class_date;
@TableField(value = "CLASS_DATE", jdbcType = JdbcType.DATE)
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date class_date;
/**
*
*/
@ -77,6 +83,7 @@ public class GDCpcPayInfo {
/**
*
*/
@TableField(value = "INSERT_DATE", jdbcType = JdbcType.DATE, update = "to_date(#{INSERT_DATE},'yyyy-mm-dd hh24:mi:ss')")
private String insert_date;
@TableField(value = "INSERT_DATE", jdbcType = JdbcType.DATE)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date insert_date;
}

@ -2,9 +2,12 @@ package com.nmg.gs.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.apache.ibatis.type.JdbcType;
import java.util.Date;
/**
* @author: shuguang
* @date: 20250423 8:06
@ -16,8 +19,9 @@ public class Summary {
/**
* YYYY-MM-DD
*/
@TableField(value = "CLASS_DATE", jdbcType = JdbcType.DATE, update = "to_date(#{CLASS_DATE},'yyyy-mm-dd')")
private String class_date;
@TableField(value = "CLASS_DATE", jdbcType = JdbcType.DATE)
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date class_date;
/**
*
*/
@ -47,6 +51,7 @@ public class Summary {
/**
*
*/
@TableField(value = "INSERT_DATE", jdbcType = JdbcType.DATE, update = "to_date(#{INSERT_DATE},'yyyy-mm-dd hh24:mi:ss')")
private String insert_date;
@TableField(value = "INSERT_DATE", jdbcType = JdbcType.DATE)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date insert_date;
}

@ -5,7 +5,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.nmg.gs.common.emnu.Constant;
import com.nmg.gs.common.emnu.MessageEnum;
import com.nmg.gs.common.exception.PPException;
import com.nmg.gs.common.utils.DateTimeUtil;
import com.nmg.gs.common.utils.MyOkHttpUtil;
import com.nmg.gs.common.utils.NewFileUtils;
import com.nmg.gs.common.utils.PathUtil;
@ -174,40 +173,33 @@ public class RequestInterfaceServiceImpl implements RequestInterfaceService {
}
}
}
int count = 0;
int repeatCount = 0;
log.info("[uuid:{}]-解析zip文件{}生成对象完成", uuid, fileName);
Date nowDate = new Date();
if (!detailList.isEmpty()) {
log.info("[uuid:{}]-数据库表DCPC_GD_PAY_INFO按照主键PAY_NO先删后插", uuid);
for (GDCpcPayInfo info : detailList) {
QueryWrapper<GDCpcPayInfo> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("PAY_NO", info.getPay_no());
boolean exists = gdCpcPayInfoMapper.exists(queryWrapper);
if (!exists) {
//按主键先删后插
gdCpcPayInfoMapper.delete(queryWrapper);
info.setZip_filename(fileName);
info.setInsert_date(DateTimeUtil.getFormateString(new Date(), Constant.YYYY_MM_DD_HH_MM_SS));
info.setInsert_date(nowDate);
gdCpcPayInfoMapper.insert(info);
count++;
} else {
repeatCount++;
}
}
log.info("[uuid:{}]-插入数据库表DCPC_GD_PAY_INFO条数为{},重复条数为{}", uuid, count, repeatCount);
log.info("[uuid:{}]-插入数据库表DCPC_GD_PAY_INFO条数为{}", uuid, count);
}
if (summary != null) {
log.info("[uuid:{}]-数据库表DCPC_GD_SUMMARY_INFO按照主键CLASS_DATE先删后插", uuid);
QueryWrapper<Summary> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("CLASS_DATE", DateTimeUtil.getFormatDate(summary.getClass_date(), Constant.YYYY_MM_DD));
boolean exists = summaryMapper.exists(queryWrapper);
if (!exists) {
queryWrapper.eq("CLASS_DATE", summary.getClass_date());
summaryMapper.delete(queryWrapper);
summary.setZip_filename(fileName);
summary.setInsert_date(DateTimeUtil.getFormateString(new Date(), Constant.YYYY_MM_DD_HH_MM_SS));
summary.setInsert_date(nowDate);
int insert = summaryMapper.insert(summary);
log.info("[uuid:{}]-插入数据库表DCPC_GD_SUMMARY_INFO,统计日:{},条数:{}", uuid, summary.getClass_date(), insert);
} else {
log.info("[uuid:{}]-插入数据库表DCPC_GD_SUMMARY_INFO,统计日:{},数据已存在", uuid, summary.getClass_date());
}
}
}

@ -94,6 +94,7 @@ public class GuavaTest {
* Graphs
*/
@Test
public void testGraphs() {
// 创建图
MutableGraph<String> graph = GraphBuilder.directed().build();
@ -343,13 +344,35 @@ public class GuavaTest {
// true
System.out.println("60分是及格吗" + isPass);
System.out.println("passRange" + passRange);
System.out.println("===================================================");
// 创建一个开区间 (80, 90)
Range<Integer> goodRange = Range.open(80, 90);
// true
System.out.println("80分是良好吗" + goodRange.contains(80));
System.out.println("goodRange" + goodRange);
System.out.println("===================================================");
// 创建一个左闭右开区间 [80, 90)
Range<Integer> goodRange2 = Range.closedOpen(80, 90);
System.out.println("左闭右开区间 [80, 90)");
System.out.println("80 是否在区间内:" + goodRange2.contains(80));
System.out.println("90 是否在区间内:" + goodRange2.contains(90));
System.out.println("85 是否在区间内:" + goodRange2.contains(85));
System.out.println("goodRange2" + goodRange2);
System.out.println("===================================================");
// 创建一个左开右闭区间 (70, 80]
Range<Integer> anotherGoodRange = Range.openClosed(70, 80);
System.out.println("左开右闭区间 (70, 80]");
System.out.println("70 是否在区间内:" + anotherGoodRange.contains(70));
System.out.println("80 是否在区间内:" + anotherGoodRange.contains(80));
System.out.println("75 是否在区间内:" + anotherGoodRange.contains(75));
System.out.println("anotherGoodRange" + anotherGoodRange);
}

@ -1,299 +0,0 @@
package com.nmg.gs.test;
import com.alibaba.fastjson2.JSON;
import com.nmg.gs.common.emnu.Constant;
import com.nmg.gs.common.utils.DateTimeUtil;
import com.nmg.gs.common.utils.MyOkHttpUtil;
import com.nmg.gs.common.utils.NewFileUtils;
import com.nmg.gs.common.utils.SignUtil;
import com.nmg.gs.common.utils.UnzipUtil;
import com.nmg.gs.entity.GDCpcPayInfo;
import com.nmg.gs.entity.Signature;
import com.nmg.gs.entity.Summary;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.ResourceUtils;
import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
* @author: shuguang
* @date: 20250418 14:50
* @description:
*/
public class Test02 {
private static final String VERIFY_INTERFACE_URL = "https://openapi.mtuoluo.com/api/dcpc/user";
private static final String GET_FILE_INTERFACE_URL = "https://openapi.mtuoluo.com/api/dcpc/billCheck";
private static final String DB_URL = "jdbc:oracle:thin:@10.15.0.12:1521/ORCL";
private static final String DB_USER = "nmgjtjt";
private static final String DB_PASSWORD = "sysadmin";
public static void main(String[] args) {
// 设置时间范围
String startDate = "2025-04-18";
String endDate = "2025-04-18";
// 将日期字符串转换为日期对象
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date start;
Date end;
try {
start = sdf.parse(startDate);
end = sdf.parse(endDate);
} catch (Exception e) {
e.printStackTrace();
return;
}
// 检查开始日期是否小于结束日期
if (start.after(end)) {
System.out.println("开始日期不能大于结束日期");
return;
}
// 在指定的时间范围内循环
while (start.before(end) || start.equals(end)) {
String queryDate = sdf.format(start);
System.out.println("查询日期:" + queryDate);
String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
String encryptTimestamp = SignUtil.generateSign(timestamp);
// 构建包含查询参数的URL
HttpUrl.Builder urlBuilder = Objects.requireNonNull(HttpUrl.parse(VERIFY_INTERFACE_URL)).newBuilder();
urlBuilder.addQueryParameter("timestamp", timestamp);
String requestUrl = urlBuilder.build().toString();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
System.out.println("请求地址:" + requestUrl);
System.out.println("timestamp: " + timestamp);
System.out.println("app-key: " + Constant.APP_KEY);
System.out.println("signature: " + encryptTimestamp);
Request request = new Request.Builder()
.url(requestUrl)
.method("GET", null)
.addHeader("app-key", Constant.APP_KEY)
.addHeader("signature", encryptTimestamp)
.build();
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) {
System.out.println(response.code());
throw new IOException("返回码 " + response.code());
}
String responseData = Objects.requireNonNull(response.body()).string();
// 检查返回数据是否为 JSON 格式
if (!isJson(responseData)) {
System.out.println(responseData);
throw new IOException("返回数据格式错误,返回内容:" + responseData);
}
System.out.println("验签接口返回response" + responseData);
System.out.println("==============================================");
Signature signature = JSON.parseObject(responseData, Signature.class);
if (signature.getCode().equals(Constant.INT_10000)) {
// 设置请求的URL
// 设置文件保存的目录
String saveDirectory = "D:\\downTest\\DownloadFilePath\\";
String unzip = "D:\\downTest\\DownloadFilePath\\unzip\\";
System.out.println("获取文件接口地址:" + GET_FILE_INTERFACE_URL);
// 调用工具类方法下载文件
String fileName = MyOkHttpUtil.downloadFile(GET_FILE_INTERFACE_URL, timestamp, queryDate, saveDirectory);
if (fileName != null) {
System.out.println("下载的文件名:" + fileName);
} else {
System.out.println("文件下载失败");
}
List<String> jsonPathList = unzipFile(saveDirectory, unzip, fileName);
Summary summary = null;
List<GDCpcPayInfo> detailList = new ArrayList<>();
try {
if (jsonPathList.size() > 0) {
for (String jsonPath : jsonPathList) {
File file2 = ResourceUtils.getFile(jsonPath);
String json = FileUtils.readFileToString(file2, Constant.UTF_8);
if (jsonPath.contains("summary")) {
// 解析 Summary 对象
summary = JSON.parseObject(json, Summary.class);
} else if (jsonPath.contains("detail")) {
// 解析 GDCpcPayInfo 列表
List<GDCpcPayInfo> details = JSON.parseArray(json, GDCpcPayInfo.class);
if (details != null) {
detailList.addAll(details);
}
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(summary);
System.out.println(detailList.size());
if (StringUtils.isNotBlank(fileName)) {
// 入库操作
insertGdCpcPayInfo(summary, detailList, fileName);
}
// 增加一天
start = DateTimeUtil.addDateDays(start, 1);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
*
*/
private static List<String> unzipFile(String saveDirectory, String unzip, String fileName) {
// 被解压的压缩文件
String fileZip = saveDirectory + fileName;
// 解压的目标目录
NewFileUtils.fileCreat(unzip);
// 解压之前先清空解压目标目录
NewFileUtils.removeFiles(new File(unzip));
// 解压缩文件
UnzipUtil.dealUnZip(fileZip, unzip);
return NewFileUtils.getJsonPaths(unzip);
}
private static boolean isJson(String str) {
try {
JSON.parseObject(str);
return true;
} catch (Exception e) {
return false;
}
}
/**
* zipjsonDCPC_GD_PAY_INFODCPC_GD_SUMMARY_INFO
*/
private static void insertGdCpcPayInfo(Summary summary, List<GDCpcPayInfo> detailList, String fileName) {
Connection conn = null;
try {
// 加载Oracle驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
// 建立数据库连接
conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
// 插入DCPC_GD_PAY_INFO表
String insertPayInfoSql = "INSERT INTO DCPC_GD_PAY_INFO (CLASS_DATE, CLASS_NO, LIST_NO, PAY_NO, ROAD_NO, STA_NO, LANE_NO, PAY_FEE, FEE, DISCOUNT_FEE, ORDER_ID, ZIP_FILENAME, INSERT_DATE) VALUES (to_date(?,'yyyy-mm-dd'), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, to_date(?,'yyyy-mm-dd hh24:mi:ss'))";
PreparedStatement payInfoStmt = conn.prepareStatement(insertPayInfoSql);
int count = 0;
int repeatCount = 0;
for (GDCpcPayInfo info : detailList) {
String selectPayNoSql = "SELECT PAY_NO FROM DCPC_GD_PAY_INFO WHERE PAY_NO = ?";
PreparedStatement selectStmt = conn.prepareStatement(selectPayNoSql);
selectStmt.setString(1, info.getPay_no());
ResultSet rs = selectStmt.executeQuery();
if (!rs.next()) {
payInfoStmt.setString(1, info.getClass_date());
payInfoStmt.setString(2, info.getClass_no());
payInfoStmt.setString(3, info.getList_no());
payInfoStmt.setString(4, info.getPay_no());
payInfoStmt.setInt(5, info.getRoad_no());
payInfoStmt.setInt(6, info.getSta_no());
payInfoStmt.setInt(7, info.getLane_no());
payInfoStmt.setLong(8, info.getPay_fee());
payInfoStmt.setLong(9, info.getFee());
payInfoStmt.setLong(10, info.getDiscount_fee());
payInfoStmt.setString(11, info.getOrder_id());
payInfoStmt.setString(12, fileName);
payInfoStmt.setString(13, DateTimeUtil.getFormateString(new Date(), Constant.YYYY_MM_DD_HH_MM_SS));
int rows = payInfoStmt.executeUpdate();
if (rows > 0) {
count++;
}
} else {
repeatCount++;
}
selectStmt.close();
rs.close();
}
System.out.println("插入数据库表DCPC_GD_PAY_INFO条数为" + count + ",重复条数为" + repeatCount);
// 插入DCPC_GD_SUMMARY_INFO表
if (summary != null) {
String selectClassDateSql = "SELECT CLASS_DATE FROM DCPC_GD_SUMMARY_INFO WHERE CLASS_DATE = to_date(?,'yyyy-mm-dd')";
PreparedStatement selectStmt = conn.prepareStatement(selectClassDateSql);
selectStmt.setString(1, summary.getClass_date());
ResultSet rs = selectStmt.executeQuery();
if (!rs.next()) {
String insertSummarySql = "INSERT INTO DCPC_GD_SUMMARY_INFO (CLASS_DATE, TOTAL_COUNT, TOTAL_PAY_FEE, TOTAL_FEE, TOTAL_DISCOUNT_FEE, ZIP_FILENAME, INSERT_DATE) VALUES (to_date(?,'yyyy-mm-dd'), ?, ?, ?, ?, ?, to_date(?,'yyyy-mm-dd hh24:mi:ss'))";
PreparedStatement summaryStmt = conn.prepareStatement(insertSummarySql);
summaryStmt.setString(1, summary.getClass_date());
summaryStmt.setInt(2, summary.getTotal_count());
summaryStmt.setLong(3, summary.getTotal_pay_fee());
summaryStmt.setLong(4, summary.getTotal_fee());
summaryStmt.setLong(5, summary.getTotal_discount_fee());
summaryStmt.setString(6, fileName);
summaryStmt.setString(7, DateTimeUtil.getFormateString(new Date(), Constant.YYYY_MM_DD_HH_MM_SS));
int rows = summaryStmt.executeUpdate();
if (rows > 0) {
System.out.println("插入数据库表DCPC_GD_SUMMARY_INFO,统计日:" + summary.getClass_date() + ",条数:" + rows);
} else {
System.out.println("插入数据库表DCPC_GD_SUMMARY_INFO,统计日:" + summary.getClass_date() + "已存在");
}
} else {
System.out.println("插入数据库表DCPC_GD_SUMMARY_INFO,统计日:" + summary.getClass_date() + "已存在");
}
selectStmt.close();
rs.close();
}
} catch (ClassNotFoundException e) {
System.out.println("Oracle驱动加载失败");
e.printStackTrace();
} catch (SQLException e) {
System.out.println("数据库操作失败");
e.printStackTrace();
} finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}

@ -1,22 +0,0 @@
package com.nmg.gs.test;
import com.nmg.gs.common.utils.SignUtil;
/**
* @author: shuguang
* @date: 20250421 16:56
* @description:
*/
public class Test03 {
public static void main(String[] args) {
String timestamp=String.valueOf(System.currentTimeMillis() / 1000);
String signature = SignUtil.generateSign(timestamp);
String date = "2025-04-18";
String signature2 = SignUtil.generateSign2(timestamp,date);
System.out.println("timestamp="+timestamp);
System.out.println("signature="+signature);
System.out.println("date="+date);
System.out.println(signature2);
}
}

@ -6,3 +6,4 @@
verifyInterfaceUrl=https://openapi.mtuoluo.com/api/dcpc/user
reconciliationInterfaceUrl=https://openapi.mtuoluo.com/api/dcpc/billCheck
2 2025年06月18日 1.0.1 增加查询明细及统计日对账查询页面
3 2025年06月20日 1.0.2 重新获取统计日期的明细及汇总文件时DCPC_GD_PAY_INFO、DCPC_GD_SUMMARY_INFO按主键先删后插

@ -0,0 +1,9 @@
序号 日期 版本号 说明
1 2025年04月18日 1.0.0 初始版本号数字CPC车道系统-国道服务器对接接口-对账)
#DCPC验签接口及获取对账文件接口--目前是测试环境,后期换成内网地址
#是否开启获取国道CPC对账文件 0--不开启1-开启
isOpenDCPCTimeTask=0
verifyInterfaceUrl=https://openapi.mtuoluo.com/api/dcpc/user
reconciliationInterfaceUrl=https://openapi.mtuoluo.com/api/dcpc/billCheck
2 2025年06月18日 1.0.1 增加查询明细及统计日对账查询页面
3 2025年06月20日 1.0.2 重新获取统计日期的明细及汇总文件时DCPC_GD_PAY_INFO、DCPC_GD_SUMMARY_INFO按主键先删后插

@ -0,0 +1,9 @@
序号 日期 版本号 说明
1 2025年04月18日 1.0.0 初始版本号数字CPC车道系统-国道服务器对接接口-对账)
#DCPC验签接口及获取对账文件接口--目前是测试环境,后期换成内网地址
#是否开启获取国道CPC对账文件 0--不开启1-开启
isOpenDCPCTimeTask=0
verifyInterfaceUrl=https://openapi.mtuoluo.com/api/dcpc/user
reconciliationInterfaceUrl=https://openapi.mtuoluo.com/api/dcpc/billCheck
2 2025年06月18日 1.0.1 增加查询明细及统计日对账查询页面
3 2025年06月20日 1.0.2 重新获取统计日期的明细及汇总文件时DCPC_GD_PAY_INFO、DCPC_GD_SUMMARY_INFO按主键先删后插

@ -19,7 +19,7 @@
:row-style="{height:'50px'}"
>
<!-- :show-overflow-tooltip="true" -->
<el-table-column prop="PAY_NO" label="交易流水号" align="center" ></el-table-column>
<el-table-column prop="ROAD_NO" label="出口路段编码" align="center"></el-table-column>
<el-table-column prop="ROADNAME" label="出口路段名称" align="center"></el-table-column>
<el-table-column prop="STA_NO" label="出口站编码" align="center" ></el-table-column>
@ -29,7 +29,6 @@
<el-table-column prop="LANE_NO" label="出口车道号" align="center"></el-table-column>
<el-table-column prop="CLASS_NO" label="班次号" align="center"></el-table-column>
<el-table-column prop="LIST_NO" label="流水号" align="center"></el-table-column>
<el-table-column prop="PAY_NO" label="交易流水号" align="center" ></el-table-column>
<el-table-column prop="PAY_FEE" label="应收金额(元)" align="center" :formatter="roundingAmount"></el-table-column>
<el-table-column prop="FEE" label="实收金额(元)" align="center" :formatter="roundingAmount"></el-table-column>
<el-table-column prop="DISCOUNT_FEE" label="优惠金额(元)" align="center" :formatter="roundingAmount"></el-table-column>

@ -25,7 +25,7 @@
<el-icon style="vertical-align: middle;">
<search/>
</el-icon>
<span style="vertical-align: middle;">重新获取统计日期的明细及汇总文件并做判重插入</span>
<span style="vertical-align: middle;">重新获取统计日期的明细及汇总文件</span>
</el-button>
</el-col>
</el-row>

@ -28,7 +28,7 @@
<el-icon style="vertical-align: middle;">
<search/>
</el-icon>
<span style="vertical-align: middle;">重新获取统计日期的明细及汇总文件并做判重插入</span>
<span style="vertical-align: middle;">重新获取统计日期的明细及汇总文件</span>
</el-button>
</el-row>
</el-form>

Loading…
Cancel
Save