189 8069 5689

fortune项目-创新互联

公司实习 2022/12/20 ——2023/1/19 追溯系统订单导入、导出 ,订单登录

让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名与空间、雅安服务器托管、营销软件、网站建设、纳溪网站维护、网站推广。

主要技术栈: SpringBatch

一、环境配置 1. jdk自由切换

用到了mybatis的逆向插件,jdk1.8要求版本在1.8.0.60以上版本 ,之前D盘下的不满足,所以重新装了放在C盘,以后装jdk11也可以效仿

切换只需要改JAVA_HOME即可

https://blog.csdn.net/m0_71777195/article/details/127933674

2.导入MySQL数据库时报错1067 – Invalid default value for ‘字段名

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

3. Maven仓库

有些jar包不能maven直接导入, 用的同事打包过来的maven仓库 两步!

3.1 maven文件下复制一份setting.xml 修改仓库地址 3.2 idea中设置

4. git

clone、 (不需要初始化本地库VCS -->create Git Respository)

在自己的分支上开发、 由经理合并

5. 中间件

RabbitMQ 、zookeeper、Redis

6. TOMCAT

查看占用的端口

一、在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;
                    ListcsvList = 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 ListreadSalesImportDataCSV(File file)

importCsvUTF8(fileInputStream)

dataList.get(i).replaceAll("\"","").split(",")

strToDateForIfSalesImportData(str[1]) 注意: .parse()中引入的日期参数格式必须与调用该方法的SimpleDateFormat对象封装的格式一致,若不一致会报错。

FileUtils.realFile(file, bakPath);

File.remove 注意 返回值是布尔

2.往订单表和订单详细表中插入数据 麻烦之处:

接口订单导入主表(中间表)外部订单编号相同的行 和订单主表多对一 ,和订单详细主 一对一

处理过程:
  • 首先: 查询中间表接口状态为空的外部订单编号(去重) ListextSalesOrderNoList = ifSalesImportDataDAO.selectExtSalesOrderNo();

  • 然后: 遍历这个集合(遍历每个外部订单编号)

{

  • 其中: 每次循环 检查(见下文) 🙋1、插入订单主表一条数据 2、插入订单详情表多条数据

插的过程中数据来源:去别的表查、中间表、现生成(例如销售订单编号)

  • 结束: 🙋1. 处理成功: 修改中间表Flg、处理时间 ⭕2.处理失败(不是异常) 修改中间表Flg、错误原因、处理时间

}

  • 继续下一个外部订单编号的循环

............................

  • 所有中间表中的数据处理完毕后 1.回写edi配置表 2. 处理结果放到消息队列里面

3. 检查

因为有些数据需要去别的表插,为防止空指针异常等问题 做出8个检查 对于一个外部订单编号只检查一次

检查1. [外部订单编号] 不能为空

检查2. [外部订单编号] 在[订单主表]的外部订单编号中是否存在

OptionalgSalesOrderOptional = 
    gSalesOrderList.stream().filter(x    ->s.equals(x.getExtSalesOrderNo())).findFirst();
            if(gSalesOrderOptional.isPresent()){
                // [外部订单编号] 在订单主表的外部订单编号中存在
                   errorList.add(MessageConstant.EIF001_0021,s);
             }

。。。。。。。。

检查完毕 :

若errorList.isEmpty()为true 插入 执行2中的 🙋

若为false 则“ 对这个外部订单编号的所有行 执行出错处理,跳过这个外部订单编号,继续循环” 执行2中的⭕

4. 异常

没有用全局异常处理 而是一个大的try-catch

看我的另一篇文章

https://blog.csdn.net/weiyuhaodashabi/article/details/128351833

5. 导出

File csvFile = CSVUtils.createCSVFile(csvHeader, datalist, localRealFilePath, fileName);

该方法的四个参数 csv的标题行、数据行、文件的地址、文件名(不带.csv

File.createNewFile(); (是会生成文件的

未改动 直接拿来用的https://blog.csdn.net/lfy609225258/article/details/89519712

6. 执行 6.1 前端手动执行

6.2 定时任务

有空对比一下 crm项目 MultipartFile file的导入导出

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享名称:fortune项目-创新互联
文章网址:http://cdxtjz.com/article/ddesgg.html

其他资讯