公司实习 2022/12/20 ——2023/1/19 追溯系统订单导入、导出 ,订单登录
主要技术栈: SpringBatch
用到了mybatis的逆向插件,jdk1.8要求版本在1.8.0.60以上版本 ,之前D盘下的不满足,所以重新装了放在C盘,以后装jdk11也可以效仿
切换只需要改JAVA_HOME即可
https://blog.csdn.net/m0_71777195/article/details/127933674
2023/1/16 今天把公司的阿里云数据库copy到本地 本地用的mysql5.5.15 但是公司用的是5.7.21
执行sql文件时报错 原因:mysql5.7对sql_mode的设置比mysql5.6更严格了
一直对驱动有个疑惑:
mysql版本5.x、8.x 和驱动(mysql-connector-java)版本 5.x、8.x 不是一个东西
驱动也就是jar包、 之前学习jdbc 没用maven的时候 需要自己引入 用了maven 只需要添加依赖即可
MySQL Connector/J 8.0版本驱动向下兼容之前的5.5+版本MySQL 但是需要Driver Class换成: com.mysql.cj.jdbc.Driver 同时需要指定时区
com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver 的区别https://blog.csdn.net/a907691592/article/details/96876030
总结: 目前用的较多mysql是5.x版本, 驱动可以用5.x和8.x 但是推荐用8.x版本。
公司用的驱动如下图 mysql:5.7.21
解决 : mysql5.5保留(3306) 再装一个5.7.40 (端口是3307
本地同时运行5.5和5.7的mysql的服务
https://blog.csdn.net/goog_man/article/details/108175281
2023/1/31 测试的时候 连接数据库提示密码过期
ERROR 1862 (HY000): Your password has expired. To log in you must change it using a client that supports expired passwords.
“可能是你在安装 MySQL过程中,通过mysqld --initialize 初始化 mysql 操作后,生成临时密码后,没有直接进行 MySQL连接,中途重启服务或者重启机器等,导致密码失效问题”
解决 第一篇文章对我没有用 设置成永不过期
(75条消息) MySQL忘记临时密码/密码_是玖肆六阿的博客-CSDN博客_mysql的临时密码
(75条消息) mysql5.7密码过期ERROR 1862 (HY000): Your password has expired. To log in you must change_chenlongjs的博客-CSDN博客
注意用cmd打开mysql 命令: mysql -uroot -p -P3307 加上端口号!
有些jar包不能maven直接导入, 用的同事打包过来的maven仓库 两步!
clone、 (不需要初始化本地库VCS --> create Git Respository)
在自己的分支上开发、 由经理合并
RabbitMQ 、zookeeper、Redis
查看占用的端口
一、在dos窗口中输入指令:netstat -ano | findstr 8080,其中8080是指你被占用的端口号,然后会显示出现在占用该端口号的pid。
二、输入 taskkill /f /pid 52068,关闭该进程即可
2.1c_config 充当配置文件了
2.2c_message 注意 {} []
去MessageConstant里面加常量 然后去Cmessage加记录
2.3 Ifsales_import_data 中间表
[]没有特殊的作用 {}中的值会动态的传进去
2.4 m_customer根据客户编号去客户主表查询
2.5m_sales_channel 销售组织
2.6m_customer_shipto 客户交货地主表
2.7m_product 商品主表
2.8m_sales_channel_product 销售组织商品主表 根据商品编号,销售组织,从销售组织商品主表获取商品组ID
2.9edi_config 、edi_log_detail 等
2.10 g_sales_order和g_sales_order_detail 最主要的业务表
因为这个功能是追加的 需要修改表结构、实体类、example、mapper.xml
//拿到文件夹
File fileFolder = new File(localRealFilePath);
String[] list = fileFolder.list();
boolean fileExist = false;//用于判断文件是否存在
//多个文件循环处理
for (String s : list) {
//以9451开头的文件
if(s.indexOf(FileName)==0){
File file = new File(localRealFilePath + File.separator + s);
fileExist = true;
List csvList = CSVUtils.readSalesImportDataCSV(file);
if (csvList != null && csvList.size() > 0) {
for (IfSalesImportData ifSalesImportData : csvList) {
ifSalesImportDataDAO.insert(ifSalesImportData);
}
}
//备份 9450+“/bak/SalesOrderImport/” realFile方法会在文件名上给你加时间戳 并且remove走原文件
String bakPath = localFilePath + File.separator + "bak" + File.separator + path;
FileUtils.realFile(file, bakPath);
}
}
//说明没有以9451开头的文件
if (fileExist == false){
throw new RuntimeException("追溯系统订单导入文件不存在");
}
(把以下函数串起来 就是整个功能)
File.separator
fileFolder.list()
s.indexOf(FileName)==0
public static List
importCsvUTF8(fileInputStream)
dataList.get(i).replaceAll("\"","").split(",")
strToDateForIfSalesImportData(str[1]) 注意: .parse()中引入的日期参数格式必须与调用该方法的SimpleDateFormat对象封装的格式一致,若不一致会报错。
FileUtils.realFile(file, bakPath);
File.remove 注意 返回值是布尔
接口订单导入主表(中间表)外部订单编号相同的行 和订单主表多对一 ,和订单详细主表 一对一
首先: 查询中间表接口状态为空的外部订单编号(去重) List
然后: 遍历这个集合(遍历每个外部订单编号)
{
其中: 每次循环 检查(见下文) 1、插入订单主表一条数据 2、插入订单详情表多条数据
插的过程中数据来源:去别的表查、中间表、现生成(例如销售订单编号)
结束: 1. 处理成功: 修改中间表Flg、处理时间 ⭕2.处理失败(不是异常) 修改中间表Flg、错误原因、处理时间
}
继续下一个外部订单编号的循环
............................
所有中间表中的数据处理完毕后 1.回写edi配置表 2. 处理结果放到消息队列里面
因为有些数据需要去别的表插,为防止空指针异常等问题 做出8个检查 对于一个外部订单编号只检查一次
检查1. [外部订单编号] 不能为空
检查2. [外部订单编号] 在[订单主表]的外部订单编号中是否存在
Optional gSalesOrderOptional =
gSalesOrderList.stream().filter(x -> s.equals(x.getExtSalesOrderNo())).findFirst();
if(gSalesOrderOptional.isPresent()){
// [外部订单编号] 在订单主表的外部订单编号中存在
errorList.add(MessageConstant.EIF001_0021,s);
}
。。。。。。。。
若errorList.isEmpty()为true 插入 执行2中的
若为false 则“ 对这个外部订单编号的所有行 执行出错处理,跳过这个外部订单编号,继续循环” 执行2中的⭕
没有用全局异常处理 而是一个大的try-catch
看我的另一篇文章
https://blog.csdn.net/weiyuhaodashabi/article/details/128351833
File csvFile = CSVUtils.createCSVFile(csvHeader, datalist, localRealFilePath, fileName);
该方法的四个参数 csv的标题行、数据行、文件的地址、文件名(不带.csv
File.createNewFile(); (是会生成文件的
未改动 直接拿来用的https://blog.csdn.net/lfy609225258/article/details/89519712
6.2 定时任务 quartz
2023/1/31
配置文件 共4处 1和2 dubbo的provider和consumer
3.当时报错 这个项目采取的是下面博客的第二种 配置好就ok
(76条消息) Cannot resolve reference to bean 'ItemCatService' while setting bean property 'ref'_青苔小榭的博客-CSDN博客
4 .quartz的配置
(76条消息) 常用cron表达式_0 0/2 * * * ?_明平姚博客的博客-CSDN博客
注意: 配置完1.2.3以后 注入的“iF_SalesExportDataService” 不能乱写了 否则会报错
定时任务调用的是下面这个类
测试成功
导出同理 以上是导入
之前操作
(1+n)次查询中间表, n是外部订单编号的数量(去重)
优化
把IF表的查询放在循环外面 只需要查询一次 用流来处理
List extSalesOrderNoList = queryAll.stream().map(IfSalesImportData::getExtSalesOrderNo).distinct().collect(Collectors.toList());
List query = queryAll.stream().filter(x -> x.getExtSalesOrderNo().equals(s)).collect(Collectors.toList());
有空对比一下 crm项目 MultipartFile file的导入导出