From ffb382ba34aca2dce08ab9e4ef09adc946cf23c8 Mon Sep 17 00:00:00 2001
From: ZY <zc857179121@qq.com>
Date: 星期日, 27 四月 2025 17:26:31 +0800
Subject: [PATCH] 双数据源

---
 src/main/java/com/zy/common/config/ds/DataSourceType.java            |   32 ++
 src/main/resources/config.properties                                 |   10 
 src/main/java/com/zy/common/config/ds/DataSourceConfig.java          |   49 ++++
 src/main/java/com/zy/nc/vo/SaleOutHeadVO.java                        |   85 +++++++
 src/main/java/com/zy/asrs/task/OverYearLogScheduler.java             |    2 
 src/main/java/com/zy/asrs/task/WorkMastScheduler.java                |    2 
 pom.xml                                                              |    3 
 src/main/java/com/zy/common/config/ds/DynamicDataSource.java         |   11 +
 src/main/java/com/zy/asrs/task/PlcLogScheduler.java                  |    2 
 src/main/java/com/zy/asrs/task/BareBoardScheduler.java               |    2 
 src/main/java/com/zy/common/config/ds/DataSourceAop.java             |   27 ++
 src/main/java/com/zy/common/config/ds/SecondaryDataSourceConfig.java |   32 ++
 src/main/java/com/zy/common/config/ds/AbstractRoutingDataSource.java |   38 +++
 src/main/java/com/zy/asrs/task/ErrorStockScheduler.java              |    2 
 src/main/resources/mapper2/test                                      |    0 
 src/main/java/com/zy/asrs/task/WorkLogScheduler.java                 |    2 
 src/main/java/com/zy/nc/vo/SaleOutBodyVO.java                        |  253 +++++++++++++++++++++++
 src/main/resources/application.yml                                   |   20 +
 src/main/java/com/zy/asrs/task/NotifyLogScheduler.java               |    2 
 src/main/java/com/zy/common/config/ds/PrimaryDataSourceConfig.java   |   35 +++
 20 files changed, 587 insertions(+), 22 deletions(-)

diff --git a/pom.xml b/pom.xml
index 6151db3..2697c69 100644
--- a/pom.xml
+++ b/pom.xml
@@ -16,7 +16,7 @@
     <properties>
         <java.version>1.8</java.version>
         <cool.version>3.4.0</cool.version>
-        <mysql-driver.version>5.1.47</mysql-driver.version>
+        <mysql-driver.version>8.0.28</mysql-driver.version>
         <mybatis-plus.version>2.3.2</mybatis-plus.version>
         <fastjson.version>1.2.58</fastjson.version>
         <springfox.version>2.7.0</springfox.version>
@@ -50,6 +50,7 @@
             <artifactId>mysql-connector-java</artifactId>
             <version>${mysql-driver.version}</version>
         </dependency>
+
         <dependency>
             <groupId>com.microsoft.sqlserver</groupId>
             <artifactId>mssql-jdbc</artifactId>
diff --git a/src/main/java/com/zy/asrs/task/BareBoardScheduler.java b/src/main/java/com/zy/asrs/task/BareBoardScheduler.java
index 498483b..001c62b 100644
--- a/src/main/java/com/zy/asrs/task/BareBoardScheduler.java
+++ b/src/main/java/com/zy/asrs/task/BareBoardScheduler.java
@@ -29,7 +29,7 @@
     * 鑷姩璋冪┖鏉垮嚭搴�
     * */
     @Scheduled(cron = "0/3 * * * * ? ")
-    private void execute(){
+    public void execute(){
         if (slaveWmsParameterProperties.isAutomaticFillingBoardStaNosBoolean()){
             Config config = configService.selectConfigByCode("AutomaticFillingBoard");
             if (!Cools.isEmpty(config) && !Cools.isEmpty(config.getValue()) && config.getValue().equals("true")){
diff --git a/src/main/java/com/zy/asrs/task/ErrorStockScheduler.java b/src/main/java/com/zy/asrs/task/ErrorStockScheduler.java
index 917cfc4..4d79614 100644
--- a/src/main/java/com/zy/asrs/task/ErrorStockScheduler.java
+++ b/src/main/java/com/zy/asrs/task/ErrorStockScheduler.java
@@ -20,7 +20,7 @@
     private ErrorStockHandler errorStockHandler;
 
     @Scheduled(cron = "0/3 * * * * ? ")
-    private void execute(){
+    public void execute(){
         ReturnT<String> returnT = errorStockHandler.start();
         if (!returnT.isSuccess()) {
             log.error(returnT.getMsg());
diff --git a/src/main/java/com/zy/asrs/task/NotifyLogScheduler.java b/src/main/java/com/zy/asrs/task/NotifyLogScheduler.java
index 93799d9..c69354e 100644
--- a/src/main/java/com/zy/asrs/task/NotifyLogScheduler.java
+++ b/src/main/java/com/zy/asrs/task/NotifyLogScheduler.java
@@ -20,7 +20,7 @@
     private NotifyLogHandler notifyLogHandler;
 
     @Scheduled(cron = "0/3 * * * * ? ")
-    private void execute(){
+    public void execute(){
         ReturnT<String> returnT = notifyLogHandler.start();
         if (!returnT.isSuccess()) {
             log.error(returnT.getMsg());
diff --git a/src/main/java/com/zy/asrs/task/OverYearLogScheduler.java b/src/main/java/com/zy/asrs/task/OverYearLogScheduler.java
index 2865cc3..53b4408 100644
--- a/src/main/java/com/zy/asrs/task/OverYearLogScheduler.java
+++ b/src/main/java/com/zy/asrs/task/OverYearLogScheduler.java
@@ -20,7 +20,7 @@
     private OverYearLogHandler overYearLogHandler;
 
     @Scheduled(cron = "0 0 1 * * ? ")
-    private void execute(){
+    public void execute(){
         ReturnT<String> returnT = overYearLogHandler.start();
         if (!returnT.isSuccess()) {
             log.error(returnT.getMsg());
diff --git a/src/main/java/com/zy/asrs/task/PlcLogScheduler.java b/src/main/java/com/zy/asrs/task/PlcLogScheduler.java
index 708392f..57517fe 100644
--- a/src/main/java/com/zy/asrs/task/PlcLogScheduler.java
+++ b/src/main/java/com/zy/asrs/task/PlcLogScheduler.java
@@ -20,7 +20,7 @@
     private PlcLogHandler plcLogHandler;
 
     @Scheduled(cron = "0/3 * * * * ? ")
-    private void execute(){
+    public void execute(){
         ReturnT<String> returnT = plcLogHandler.start();
         if (!returnT.isSuccess()) {
             log.error(returnT.getMsg());
diff --git a/src/main/java/com/zy/asrs/task/WorkLogScheduler.java b/src/main/java/com/zy/asrs/task/WorkLogScheduler.java
index 06a0624..ee29a50 100644
--- a/src/main/java/com/zy/asrs/task/WorkLogScheduler.java
+++ b/src/main/java/com/zy/asrs/task/WorkLogScheduler.java
@@ -24,7 +24,7 @@
     private WrkMastService wrkMastService;
 
     @Scheduled(cron = "0/3 * * * * ? ")
-    private void execute(){
+    public void execute(){
         List<WrkMast> wrkMasts = wrkMastService.selectToBeHistoryData();
         if (wrkMasts.isEmpty()) {
             return;
diff --git a/src/main/java/com/zy/asrs/task/WorkMastScheduler.java b/src/main/java/com/zy/asrs/task/WorkMastScheduler.java
index 10bffd4..ebfb840 100644
--- a/src/main/java/com/zy/asrs/task/WorkMastScheduler.java
+++ b/src/main/java/com/zy/asrs/task/WorkMastScheduler.java
@@ -27,7 +27,7 @@
     private WorkMastHandler workMastHandler;
 
     @Scheduled(cron = "0/3 * * * * ? ")
-    private void execute(){
+    public void execute(){
         List<WrkMast> wrkMasts = wrkMastService.selectToBeCompleteData();
         if (wrkMasts.isEmpty()) {
             return;
diff --git a/src/main/java/com/zy/common/config/ds/AbstractRoutingDataSource.java b/src/main/java/com/zy/common/config/ds/AbstractRoutingDataSource.java
new file mode 100644
index 0000000..d8b8519
--- /dev/null
+++ b/src/main/java/com/zy/common/config/ds/AbstractRoutingDataSource.java
@@ -0,0 +1,38 @@
+package com.zy.common.config.ds;
+
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.jdbc.datasource.AbstractDataSource;
+import org.springframework.util.Assert;
+
+import javax.sql.DataSource;
+import java.util.Map;
+
+public abstract class AbstractRoutingDataSource extends AbstractDataSource implements InitializingBean {
+    //澶氭暟鎹簮map闆嗗悎
+    private Map<Object, Object> targetDataSources;
+    //榛樿鏁版嵁婧�
+    private Object defaultTargetDataSource;
+    //鍏跺疄灏辨槸targetDataSources锛屽悗闈㈢殑afterPropertiesSet锛堬級鏂规硶浼氬皢targetDataSources璧嬪�肩粰resolvedDataSources
+    private Map<Object, DataSource> resolvedDataSources;
+    private DataSource resolvedDefaultDataSource;
+
+    public void setTargetDataSources(Map<Object, Object> targetDataSources) {
+        this.targetDataSources = targetDataSources;
+    }
+
+    protected DataSource determineTargetDataSource() {
+        Assert.notNull(this.resolvedDataSources, "DataSource router not initialized");
+        Object lookupKey = this.determineCurrentLookupKey();
+        DataSource dataSource = (DataSource) this.resolvedDataSources.get(lookupKey);
+        if (dataSource == null && ( lookupKey == null)) {
+            dataSource = this.resolvedDefaultDataSource;
+        }
+        if (dataSource == null) {
+            throw new IllegalStateException("Cannot determine target DataSource for lookup key [" + lookupKey + "]");
+        } else {
+            return dataSource;
+        }
+    }
+
+    protected abstract Object determineCurrentLookupKey();
+}
\ No newline at end of file
diff --git a/src/main/java/com/zy/common/config/ds/DataSourceAop.java b/src/main/java/com/zy/common/config/ds/DataSourceAop.java
new file mode 100644
index 0000000..98c2d56
--- /dev/null
+++ b/src/main/java/com/zy/common/config/ds/DataSourceAop.java
@@ -0,0 +1,27 @@
+package com.zy.common.config.ds;
+
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.springframework.stereotype.Component;
+
+@Aspect
+@Component
+public class DataSourceAop {
+    @Before("execution(* com.zy.asrs..*(..))")
+    public void setDataSource2test01() {
+        System.err.println("test01涓氬姟");
+        DataSourceType.setDataBaseType(DataSourceType.DataBaseType.TEST01);
+    }
+
+    @Before("execution(* com.zy.system..*(..))")
+    public void setDataSource2test012() {
+        System.err.println("test01涓氬姟");
+        DataSourceType.setDataBaseType(DataSourceType.DataBaseType.TEST01);
+    }
+
+    @Before("execution(* com.zy.nc..*(..))")
+    public void setDataSource2test02() {
+        System.err.println("test02涓氬姟");
+        DataSourceType.setDataBaseType(DataSourceType.DataBaseType.TEST02);
+    }
+}
diff --git a/src/main/java/com/zy/common/config/ds/DataSourceConfig.java b/src/main/java/com/zy/common/config/ds/DataSourceConfig.java
new file mode 100644
index 0000000..fc406a7
--- /dev/null
+++ b/src/main/java/com/zy/common/config/ds/DataSourceConfig.java
@@ -0,0 +1,49 @@
+package com.zy.common.config.ds;
+
+import com.zaxxer.hikari.HikariDataSource;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.jdbc.DataSourceBuilder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+
+import javax.sql.DataSource;
+
+import static com.sun.xml.internal.ws.spi.db.BindingContextFactory.LOGGER;
+
+@Configuration
+public class DataSourceConfig {
+
+    @Value("${other.datasource.jdbc-url}")
+    private String url;
+    @Value("${other.datasource.username}")
+    private String username;
+    @Value("${other.datasource.password}")
+    private String password;
+    @Value("${other.datasource.driver-class-name}")
+    private String driverClassName;
+
+    // 涓绘暟鎹簮
+    @Bean(name = "dataSource")
+    @Primary
+    @ConfigurationProperties(prefix = "spring.datasource")
+    public DataSource primaryDataSource() {
+        return DataSourceBuilder.create().build();
+    }
+
+    // 娆℃暟鎹簮
+    @Bean(name = "slaveDataSource")
+    public DataSource secondaryDataSource() {
+        System.out.println(driverClassName);
+        return DataSourceBuilder.create()
+                .driverClassName(driverClassName)
+                .url(url)
+                .username(username)
+                .password(password)
+                .build();
+
+    }
+
+}
diff --git a/src/main/java/com/zy/common/config/ds/DataSourceType.java b/src/main/java/com/zy/common/config/ds/DataSourceType.java
new file mode 100644
index 0000000..d64f307
--- /dev/null
+++ b/src/main/java/com/zy/common/config/ds/DataSourceType.java
@@ -0,0 +1,32 @@
+package com.zy.common.config.ds;
+
+public class DataSourceType {
+
+    public enum DataBaseType {
+        TEST01, TEST02
+    }
+
+    // 浣跨敤ThreadLocal淇濊瘉绾跨▼瀹夊叏
+    private static final ThreadLocal<DataBaseType> TYPE = new ThreadLocal<DataBaseType>();
+
+    // 寰�褰撳墠绾跨▼閲岃缃暟鎹簮绫诲瀷
+    public static void setDataBaseType(DataBaseType dataBaseType) {
+        if (dataBaseType == null) {
+            throw new NullPointerException();
+        }
+        System.err.println("[灏嗗綋鍓嶆暟鎹簮鏀逛负]锛�" + dataBaseType);
+        TYPE.set(dataBaseType);
+    }
+
+    // 鑾峰彇鏁版嵁婧愮被鍨�
+    public static DataBaseType getDataBaseType() {
+        DataBaseType dataBaseType = TYPE.get() == null ? DataBaseType.TEST01 : TYPE.get();
+        System.err.println("[鑾峰彇褰撳墠鏁版嵁婧愮殑绫诲瀷涓篯锛�" + dataBaseType);
+        return dataBaseType;
+    }
+
+    // 娓呯┖鏁版嵁绫诲瀷
+    public static void clearDataBaseType() {
+        TYPE.remove();
+    }
+}
diff --git a/src/main/java/com/zy/common/config/ds/DynamicDataSource.java b/src/main/java/com/zy/common/config/ds/DynamicDataSource.java
new file mode 100644
index 0000000..a0e228c
--- /dev/null
+++ b/src/main/java/com/zy/common/config/ds/DynamicDataSource.java
@@ -0,0 +1,11 @@
+package com.zy.common.config.ds;
+
+import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
+
+public class DynamicDataSource  extends AbstractRoutingDataSource {
+    @Override
+    protected Object determineCurrentLookupKey() {
+        DataSourceType.DataBaseType dataBaseType = DataSourceType.getDataBaseType();
+        return dataBaseType;
+    }
+}
diff --git a/src/main/java/com/zy/common/config/ds/PrimaryDataSourceConfig.java b/src/main/java/com/zy/common/config/ds/PrimaryDataSourceConfig.java
new file mode 100644
index 0000000..f6f5cb3
--- /dev/null
+++ b/src/main/java/com/zy/common/config/ds/PrimaryDataSourceConfig.java
@@ -0,0 +1,35 @@
+package com.zy.common.config.ds;
+
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+
+import javax.sql.DataSource;
+
+@Configuration
+@MapperScan(basePackages = {"com.zy.asrs.*.*", "com.zy.system.*.*"}, sqlSessionFactoryRef = "primarySqlSessionFactory")
+public class PrimaryDataSourceConfig {
+
+    @Bean(name = "primarySqlSessionFactory")
+    @Primary
+    public SqlSessionFactory primarySqlSessionFactory(@Qualifier("dataSource") DataSource dataSource) throws Exception {
+        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
+        sessionFactory.setDataSource(dataSource);
+        // 璁剧疆MyBatis鐨凪apper XML鏂囦欢璺緞
+        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
+                .getResources("classpath:mapper/*.xml"));
+        return sessionFactory.getObject();
+    }
+
+    @Bean(name = "transactionManager")
+    @Primary
+    public DataSourceTransactionManager primaryTransactionManager(@Qualifier("dataSource") DataSource dataSource) {
+        return new DataSourceTransactionManager(dataSource);
+    }
+}
diff --git a/src/main/java/com/zy/common/config/ds/SecondaryDataSourceConfig.java b/src/main/java/com/zy/common/config/ds/SecondaryDataSourceConfig.java
new file mode 100644
index 0000000..b03cd82
--- /dev/null
+++ b/src/main/java/com/zy/common/config/ds/SecondaryDataSourceConfig.java
@@ -0,0 +1,32 @@
+package com.zy.common.config.ds;
+
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+
+import javax.sql.DataSource;
+
+@Configuration
+@MapperScan(basePackages = "com.zy.nc", sqlSessionFactoryRef = "secondarySqlSessionFactory")
+public class SecondaryDataSourceConfig {
+
+    @Bean(name = "secondarySqlSessionFactory")
+    public SqlSessionFactory secondarySqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception {
+        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
+        sessionFactory.setDataSource(dataSource);
+        // 璁剧疆MyBatis鐨凪apper XML鏂囦欢璺緞
+        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
+                .getResources("classpath:mapper2/*.xml"));
+        return sessionFactory.getObject();
+    }
+
+    @Bean(name = "secondaryTransactionManager")
+    public DataSourceTransactionManager secondaryTransactionManager(@Qualifier("slaveDataSource") DataSource dataSource) {
+        return new DataSourceTransactionManager(dataSource);
+    }
+}
diff --git a/src/main/java/com/zy/nc/vo/SaleOutBodyVO.java b/src/main/java/com/zy/nc/vo/SaleOutBodyVO.java
index c09ae17..cc8e678 100644
--- a/src/main/java/com/zy/nc/vo/SaleOutBodyVO.java
+++ b/src/main/java/com/zy/nc/vo/SaleOutBodyVO.java
@@ -1,4 +1,257 @@
 package com.zy.nc.vo;
 
+import lombok.Data;
+
+@Data
 public class SaleOutBodyVO {
+    // 蹇呭~瀛楁
+    private String csourcebillbid; // 鏉ユ簮鍗曟嵁琛ㄤ綋涓婚敭
+    private String csourcebillhid; // 鏉ユ簮鍗曟嵁琛ㄥご涓婚敭
+    private String csourcetype; // 鏉ユ簮鍗曟嵁绫诲瀷
+    private Double nnum; // 瀹炲彂涓绘暟閲�
+
+    // 鍙�夊瓧娈�
+    private Boolean badvfeeflag; // 浠e灚杩愯垂
+    private Boolean bbarcodeclose; // 鍗曟嵁琛屾槸鍚︽潯鐮佸叧闂�
+    private Boolean bcloseordflag; // 鍑哄簱鍏抽棴
+    private Boolean binvoiceflag; // 寮�绁�
+    private Boolean blendoutflag; // 鍊熷嚭杞攢鍞�
+    private Boolean bonroadflag; // 鍦ㄩ��
+    private Boolean breturnprofit; // 杩斿埄
+    private Boolean bsafeprice; // 浠蜂繚
+    private Boolean bsample; // 鏍峰搧
+    private Boolean bsourcelargess; // 涓婃父璧犲搧琛�
+    private Boolean btou8rm; // 宸蹭笅鍙戦浂鍞�
+    private Boolean btranendflag; // 杩愯緭鍏抽棴
+    private Boolean bwastageflag; // 绛炬敹
+    private String casscustid; // 瀹㈡埛
+    private String castunitid; // 鍗曚綅
+    private String cbodytranstypecode; // 鍑哄叆搴撶被鍨�
+    private String cbodywarehouseid; // 搴撳瓨浠撳簱
+    private String ccorrespondbid; // 瀵瑰簲鍏ュ簱鍗曟嵁琛ㄤ綋涓婚敭
+    private String ccorrespondcode; // 瀵瑰簲鍏ュ簱鍗曞崟鎹彿
+    private String ccorrespondhid; // 瀵瑰簲鍏ュ簱鍗曚富閿�
+    private String ccorrespondrowno; // 瀵瑰簲鍏ュ簱鍗曡鍙�
+    private String ccorrespondtranstype; // 瀵瑰簲鍏ュ簱鍗曚氦鏄撶被鍨�
+    private String ccorrespondtype; // 瀵瑰簲鍏ュ簱鍗曠被鍨�
+    private String ccostobject; // 鎴愭湰瀵硅薄
+    private String ccurrencyid; // 鏈綅甯�
+    private String ccustmaterialid; // 瀹㈡埛鐗╂枡鐮�
+    private String cdelivery_bbid; // 鍙戣揣鍗曟姤妫�鍗曟嵁涓婚敭
+    private String cffileid; // 鐗瑰緛鐮�
+    private String cfirstbillbid; // 婧愬ご鍗曟嵁琛ㄤ綋涓婚敭
+    private String cfirstbilldate; // 婧愬ご鍗曟嵁鏃ユ湡
+    private String cfirstbillhid; // 婧愬ご鍗曟嵁琛ㄥご涓婚敭
+    private String cfirsttranstype; // 婧愬ご浜ゆ槗绫诲瀷
+    private String cfirsttype; // 婧愬ご鍗曟嵁绫诲瀷
+    private String cgeneralbid; // 鍑哄簱鍗曡〃浣撲富閿�
+    private String cglobalcurrencyid; // 鍏ㄥ眬鏈綅甯�
+    private String cgroupcurrencyid; // 闆嗗洟鏈綅甯�
+    private String cinvoicecustid; // 寮�绁ㄥ鎴�
+    private String cioliabilityoid; // 鍙戣揣鍒╂鼎涓績
+    private String cioliabilityvid; // 鍙戣揣鍒╂鼎涓績
+    private String cliabilityoid; // 缁撶畻鍒╂鼎涓績
+    private String cliabilityvid; // 缁撶畻鍒╂鼎涓績
+    private String clocationid; // 璐т綅
+    private String cmaterialoid; // 鐗╂枡
+    private String cmaterialvid; // 鐗╂枡缂栫爜
+    private String corigareaid; // 鍘熶骇鍦板尯
+    private String corigcountryid; // 鍘熶骇鍥�
+    private String corigcurrencyid; // 甯佺
+    private String cprodlineid; // 浜у搧绾�
+    private String cproductorid; // 鐢熶骇鍘傚晢
+    private String cprojectid; // 椤圭洰
+    private String cqtunitid; // 鎶ヤ环鍗曚綅
+    private String cqualitylevelid; // 璐ㄩ噺绛夌骇
+    private String creceieveid; // 鏀惰揣瀹㈡埛
+    private String creceiveareaid; // 鏀惰揣鍦板尯
+    private String creceivepointid; // 鏀惰揣鍦扮偣
+    private String crowno; // 琛屽彿
+    private String cselastunitid; // 閫夋嫨鎷嗚В鍗曚綅
+    private String csignwastbid; // 鍑哄叆搴撳崟鍏跺畠鏉ユ簮鍗曟嵁琛屼富閿�
+    private String csignwasthid; // 鍑哄叆搴撳崟鍏跺畠鏉ユ簮鍗曟嵁涓婚敭
+    private String csignwasttype; // 鍑哄叆搴撳崟鍏跺畠鏉ユ簮绫诲瀷
+    private String csnqualitylevelid; // 搴忓垪鍙疯川閲忕瓑绾�
+    private String csnunitid; // 搴忓垪鍙峰崟浣�
+    private String csourcebilldate; // 鏉ユ簮鍗曟嵁鏃ユ湡
+    private String csourcematerialoid; // 鏉ユ簮鍗曟嵁鐗╂枡
+    private String csourcetranstype; // 鏉ユ簮浜ゆ槗绫诲瀷
+    private String csourcewastbid; // 鏉ユ簮閫旀崯鍗曟嵁琛ㄤ綋涓婚敭
+    private String csourcewasthid; // 鏉ユ簮閫旀崯鍗曟嵁涓婚敭
+    private String csourcewasttranstype; // 鏉ユ簮閫旀崯浜ゆ槗绫诲瀷
+    private String csourcewasttype; // 鏉ユ簮閫旀崯鍗曟嵁绫诲瀷
+    private String csrc2billbid; // 鍏朵粬鏉ユ簮鍗曡涓婚敭
+    private String csrc2billhid; // 鍏朵粬鏉ユ簮鍗曚富閿�
+    private String csrc2billtype; // 鍏朵粬鏉ユ簮鍗曟嵁绫诲瀷缂栫爜
+    private String csrc2transtype; // 鍏朵粬鏉ユ簮浜ゆ槗绫诲瀷缂栫爜
+    private String csrcmaterialoid; // 鏉ユ簮鐗╂枡
+    private String csrcmaterialvid; // 鏉ユ簮鐗╂枡缂栫爜
+    private String cstateid; // 搴撳瓨鐘舵��
+    private String csumid; // VMI姹囨��
+    private String ctaxcodeid; // 绋庣爜
+    private String ctplcustomerid; // 璐т富瀹㈡埛
+    private String cunitid; // 涓诲崟浣�
+    private String cvendorid; // 渚涘簲鍟�
+    private String cvmivenderid; // 瀵勫瓨渚涘簲鍟�
+    private String dbizdate; // 鍑哄簱鏃ユ湡
+    private String ddeliverdate; // 瑕佹眰鏀惰揣鏃ユ湡
+    private String dinbounddate; // 棣栨鍏ュ簱鏃ユ湡
+    private String dproducedate; // 鐢熶骇鏃ユ湡
+    private String dvalidate; // 澶辨晥鏃ユ湡
+    private Integer fbillrowflag; // 閰嶅鏍囧織
+    private Boolean flargess; // 璧犲搧
+    private Integer ftaxtypeflag; // 鎵g◣绫诲埆
+    private Integer ibcversion; // 鎵规鐗堟湰
+    private Integer idesatype; // 鎷嗚В绫诲瀷
+    private Double naccumoutbacknum; // 绱鍑哄簱閫�鍥炰富鏁伴噺
+    private Double naccumoutsignnum; // 绱绛炬敹涓绘暟閲�
+    private Double naccumvminum; // 绱姹囨�诲尮閰嶄富鏁伴噺
+    private Double naccumwastnum; // 绱閫旀崯涓绘暟閲�
+    private Double nassistnum; // 瀹炲彂鏁伴噺
+    private Double nbarcodenum; // 鏉$爜涓绘暟閲�
+    private Double nbdiscountrate; // 鏁村崟鎶樻墸
+    private Double ncaltaxmny; // 璁$◣閲戦
+    private Double nchangestdrate; // 鎶樻湰姹囩巼
+    private Double ncorrespondastnum; // 绱鍑哄簱鏁伴噺
+    private Double ncorrespondgrsnum; // 绱鍑哄簱姣涢噸涓绘暟閲�
+    private Double ncorrespondnum; // 绱鍑哄簱涓绘暟閲�
+    private Double ncostmny; // 閲戦
+    private Double ncostprice; // 鍗曚环
+    private Double ncountnum; // 绠辨暟
+    private Double nglobalexchgrate; // 鍏ㄥ眬鏈綅甯佹眹鐜�
+    private Double nglobalmny; // 鍏ㄥ眬鏈竵鏃犵◣閲戦
+    private Double nglobaltaxmny; // 鍏ㄥ眬鏈竵浠风◣鍚堣
+    private Double ngrossnum; // 姣涢噸涓绘暟閲�
+    private Double ngroupexchgrate; // 闆嗗洟鏈綅甯佹眹鐜�
+    private Double ngroupmny; // 闆嗗洟鏈竵鏃犵◣閲戦
+    private Double ngrouptaxmny; // 闆嗗洟鏈竵浠风◣鍚堣
+    private Double ninvoicemny; // 鍙紑绁ㄩ噾棰�
+    private Double ninvoicenum; // 鍙紑绁ㄦ暟閲�
+    private Double nitemdiscountrate; // 鍗曞搧鎶樻墸
+    private Double nmny; // 鏈竵鏃犵◣閲戦
+    private Double nnetprice; // 涓绘湰甯佹棤绋庡噣浠�
+    private Double norigmny; // 鏃犵◣閲戦
+    private Double norignetprice; // 涓绘棤绋庡噣浠�
+    private Double norigprice; // 涓绘棤绋庡崟浠�
+    private Double norigtaxmny; // 浠风◣鍚堣
+    private Double norigtaxnetprice; // 涓诲惈绋庡噣浠�
+    private Double norigtaxprice; // 涓诲惈绋庡崟浠�
+    private Double npiece; // 浠舵暟
+    private Double nplannedmny; // 璁″垝閲戦
+    private Double nplannedprice; // 璁″垝鍗曚环
+    private Double nprice; // 涓绘湰甯佹棤绋庡崟浠�
+    private Double nqtnetprice; // 鏈竵鏃犵◣鍑�浠�
+    private Double nqtorignetprice; // 鏃犵◣鍑�浠�
+    private Double nqtorigprice; // 鏃犵◣鍗曚环
+    private Double nqtorigtaxnetprc; // 鎶ヤ环鍗曚綅鍚◣鍑�浠�
+    private Double nqtorigtaxnetprice; // 鍚◣鍑�浠�
+    private Double nqtorigtaxprice; // 鍚◣鍗曚环
+    private Double nqtprice; // 鏈竵鏃犵◣鍗曚环
+    private Double nqttaxnetprice; // 鏈竵鍚◣鍑�浠�
+    private Double nqttaxprice; // 鏈竵鍚◣鍗曚环
+    private Double nqtunitnum; // 鎶ヤ环鏁伴噺
+    private Double nreplenishednum; // 绱閫�璐т富鏁伴噺
+    private Double nrushnum; // 绱瀵瑰啿涓绘暟閲�
+    private Double nshouldassistnum; // 搴斿彂鏁伴噺
+    private Double nshouldnum; // 搴斿彂涓绘暟閲�
+    private Double nsignnum; // 绱寮�绁ㄤ富鏁伴噺
+    private Double ntarenum; // 鐨噸涓绘暟閲�
+    private Double ntax; // 绋庨
+    private Double ntaxmny; // 鏈竵浠风◣鍚堣
+    private Double ntaxnetprice; // 涓绘湰甯佸惈绋庡噣浠�
+    private Double ntaxprice; // 涓绘湰甯佸惈绋庡崟浠�
+    private Double ntaxrate; // 绋庣巼
+    private Double ntotaltrannum; // 绱杩愯緭涓绘暟閲�
+    private Double nvolume; // 浣撶Н
+    private Double nweight; // 閲嶉噺
+    private String pk_batchcode; // 鎵规涓婚敭
+    private String pk_group; // 闆嗗洟
+    private String pk_measware; // 璁¢噺鍣ㄥ叿
+    private String pk_org; // 搴撳瓨缁勭粐鏈�鏂扮増鏈�
+    private String pk_org_v; // 搴撳瓨缁勭粐
+    private String pk_packsort; // 鍖呰绫诲瀷
+    private String pk_returnreason; // 閫�璐у師鍥�
+    private String pk_serialcode; // 搴忓垪鍙蜂富閿�
+    private String tchecktime; // 妫�楠屾椂闂�
+    private String tsourcebbts; // 鏉ユ簮鍙戣揣鍗曟姤妫�鍗曟椂闂存埑
+    private String tsourcebodyts; // 鏉ユ簮琛ㄤ綋鏃堕棿鎴�
+    private String tsourceheadts; // 鏉ユ簮琛ㄥご鏃堕棿鎴�
+    private String vbatchcode; // 鎵规鍙�
+    private String vbatchcodenote; // 鎵规澶囨敞
+    private String vbcdef1; // 鎵规鑷畾涔夐」1
+    private String vbcdef10; // 鎵规鑷畾涔夐」10
+    private String vbcdef11; // 鎵规鑷畾涔夐」11
+    private String vbcdef12; // 鎵规鑷畾涔夐」12
+    private String vbcdef13; // 鎵规鑷畾涔夐」13
+    private String vbcdef14; // 鎵规鑷畾涔夐」14
+    private String vbcdef15; // 鎵规鑷畾涔夐」15
+    private String vbcdef16; // 鎵规鑷畾涔夐」16
+    private String vbcdef17; // 鎵规鑷畾涔夐」17
+    private String vbcdef18; // 鎵规鑷畾涔夐」18
+    private String vbcdef19; // 鎵规鑷畾涔夐」19
+    private String vbcdef2; // 鎵规鑷畾涔夐」2
+    private String vbcdef20; // 鎵规鑷畾涔夐」20
+    private String vbcdef3; // 鎵规鑷畾涔夐」3
+    private String vbcdef4; // 鎵规鑷畾涔夐」4
+    private String vbcdef5; // 鎵规鑷畾涔夐」5
+    private String vbcdef6; // 鎵规鑷畾涔夐」6
+    private String vbcdef7; // 鎵规鑷畾涔夐」7
+    private String vbcdef8; // 鎵规鑷畾涔夐」8
+    private String vbcdef9; // 鎵规鑷畾涔夐」9
+    private String vbdef1; // 琛ㄤ綋鑷畾涔夐」1
+    private String vbdef10; // 琛ㄤ綋鑷畾涔夐」10
+    private String vbdef11; // 琛ㄤ綋鑷畾涔夐」11
+    private String vbdef12; // 琛ㄤ綋鑷畾涔夐」12
+    private String vbdef13; // 琛ㄤ綋鑷畾涔夐」13
+    private String vbdef14; // 琛ㄤ綋鑷畾涔夐」14
+    private String vbdef15; // 琛ㄤ綋鑷畾涔夐」15
+    private String vbdef16; // 琛ㄤ綋鑷畾涔夐」16
+    private String vbdef17; // 琛ㄤ綋鑷畾涔夐」17
+    private String vbdef18; // 琛ㄤ綋鑷畾涔夐」18
+    private String vbdef19; // 琛ㄤ綋鑷畾涔夐」19
+    private String vbdef2; // 琛ㄤ綋鑷畾涔夐」2
+    private String vbdef20; // 琛ㄤ綋鑷畾涔夐」20
+    private String vbdef3; // 琛ㄤ綋鑷畾涔夐」3
+    private String vbdef4; // 琛ㄤ綋鑷畾涔夐」4
+    private String vbdef5; // 琛ㄤ綋鑷畾涔夐」5
+    private String vbdef6; // 琛ㄤ綋鑷畾涔夐」6
+    private String vbdef7; // 琛ㄤ綋鑷畾涔夐」7
+    private String vbdef8; // 琛ㄤ綋鑷畾涔夐」8
+    private String vbdef9; // 琛ㄤ綋鑷畾涔夐」9
+    private String vbillbarcode; // 鍗曟嵁鏉$爜
+    private String vbilltypeu8rm; // 鏉ヨ嚜浜庨浂鍞箣鍗曟嵁绫诲瀷
+    private String vchangerate; // 鎹㈢畻鐜�
+    private String vexigencybid; // 绱ф�ユ斁琛岀敵璇峰崟琛屼富閿�
+    private String vexigencycode; // 绱ф�ユ斁琛岀敵璇峰崟鍙�
+    private String vexigencyhid; // 绱ф�ユ斁琛岀敵璇峰崟涓婚敭
+    private String vexigencyrowno; // 绱ф�ユ斁琛岀敵璇峰崟琛屽彿
+    private String vexigencytype; // 绱ф�ユ斁琛屽崟鎹被鍨�
+    private String vfirstbillcode; // 婧愬ご鍗曟嵁鍙�
+    private String vfirstrowno; // 婧愬ご鍗曟嵁琛屽彿
+    private String vfree1; // 鑷敱杈呭姪灞炴��1
+    private String vfree10; // 鑷敱杈呭姪灞炴��10
+    private String vfree2; // 鑷敱杈呭姪灞炴��2
+    private String vfree3; // 鑷敱杈呭姪灞炴��3
+    private String vfree4; // 鑷敱杈呭姪灞炴��4
+    private String vfree5; // 鑷敱杈呭姪灞炴��5
+    private String vfree6; // 鑷敱杈呭姪灞炴��6
+    private String vfree7; // 鑷敱杈呭姪灞炴��7
+    private String vfree8; // 鑷敱杈呭姪灞炴��8
+    private String vfree9; // 鑷敱杈呭姪灞炴��9
+    private String vnotebody; // 琛屽娉�
+    private String vpickdetailbid; // 鎷i厤鏄庣粏琛�
+    private String vpickdetailrowno; // 鎷i厤鏄庣粏琛屽彿
+    private String vqtunitrate; // 鎶ヤ环鎹㈢畻鐜�
+    private String vreceiveaddress; // 鏀惰揣鍦板潃
+    private String vserialcode; // 搴忓垪鍙�
+    private String vsignwastcode; // 鍑哄叆搴撳崟鍏跺畠鏉ユ簮鍗曟嵁鍙�
+    private String vsignwastrowno; // 鍑哄叆搴撳崟鍏跺畠鏉ユ簮鍗曟嵁琛屾爣璇�
+    private String vsndef1; // 搴忓垪鍙疯嚜瀹氫箟椤�1
+    private String vsndef10; // 搴忓垪鍙疯嚜瀹氫箟椤�10
+    private String vsndef11; // 搴忓垪鍙疯嚜瀹氫箟椤�11
+    private String vsndef12; // 搴忓垪鍙疯嚜瀹氫箟椤�12
+    private String vsndef13; // 搴忓垪鍙疯嚜瀹氫箟椤�13
+    private String vsndef14; // 搴忓垪鍙疯嚜瀹氫箟椤�14
+    private String vsndef15; // 搴忓垪鍙疯嚜瀹氫箟椤�15
+    private String vsndef16; // 搴忓垪鍙疯嚜瀹氫箟椤�16
 }
diff --git a/src/main/java/com/zy/nc/vo/SaleOutHeadVO.java b/src/main/java/com/zy/nc/vo/SaleOutHeadVO.java
index 257167c..2c3bbd2 100644
--- a/src/main/java/com/zy/nc/vo/SaleOutHeadVO.java
+++ b/src/main/java/com/zy/nc/vo/SaleOutHeadVO.java
@@ -1,4 +1,89 @@
 package com.zy.nc.vo;
 
+import lombok.Data;
+
+@Data
 public class SaleOutHeadVO {
+
+    // 蹇呭~瀛楁
+    private String pkOrg; // 搴撳瓨缁勭粐鏈�鏂扮増鏈�
+    private String cwarehouseid; // 浠撳簱
+
+    // 鍙�夊瓧娈�
+    private String approver; // 绛惧瓧浜�
+    private String billmaker; // 鍒跺崟浜�
+    private Boolean boutretflag; // 閿�鍞��鍥�
+    private Boolean bsalecooppur; // 宸插崗鍚岀敓鎴愰噰璐叆搴撳崟
+    private Boolean btriatradeflag; // 涓夎璐告槗
+    private String cbizid; // 涓氬姟鍛�
+    private String cbiztype; // 涓氬姟娴佺▼
+    private String ccostdomainid; // 缁撶畻鎴愭湰鍩�
+    private String ccustomerid; // 璁㈠崟瀹㈡埛
+    private String cdilivertypeid; // 杩愯緭鏂瑰紡
+    private String cdptid; // 閮ㄩ棬鏈�鏂扮増鏈�
+    private String cdptvid; // 閮ㄩ棬
+    private String cfanaceorgoid; // 缁撶畻璐㈠姟缁勭粐鏈�鏂扮増鏈�
+    private String cfanaceorgvid; // 缁撶畻璐㈠姟缁勭粐
+    private String cgeneralhid; // 鍑哄簱鍗曡〃澶翠富閿�
+    private String corpoid; // 鍏徃鏈�鏂扮増鏈�
+    private String corpvid; // 鍏徃
+    private String cothercalbodyoid; // 鍏ュ簱搴撳瓨缁勭粐鏈�鏂扮増鏈�
+    private String cothercalbodyvid; // 鍏ュ簱搴撳瓨缁勭粐
+    private String cotherwhid; // 鍏ュ簱浠撳簱
+    private String creationtime; // 鍒涘缓鏃堕棿
+    private String creator; // 鍒涘缓浜�
+    private String crececountryid; // 鏀惰揣鍥�
+    private String creceivfinorgoid; // 搴旀敹璐㈠姟缁勭粐鏈�鏂扮増鏈�
+    private String creceivfinorgvid; // 搴旀敹璐㈠姟缁勭粐
+    private String csaleorgoid; // 閿�鍞粍缁囨渶鏂扮増鏈�
+    private String csaleorgvid; // 閿�鍞粍缁�
+    private String csendcountryid; // 鍙戣揣鍥�
+    private String ctaxcountryid; // 鎶ョ◣鍥�
+    private String ctradewordid; // 璐告槗鏈
+    private String ctrancustid; // 鎵胯繍鍟�
+    private String ctrantypeid; // 鍑哄叆搴撶被鍨�
+    private String cwhsmanagerid; // 搴撶鍛�
+    private String dbilldate; // 鍗曟嵁鏃ユ湡
+    private String dmakedate; // 鍒跺崟鏃ユ湡
+    private Integer fbillflag; // 鍗曟嵁鐘舵��
+    private Integer fbuysellflag; // 璐攢绫诲瀷
+    private Boolean freplenishflag; // 閿�鍞��璐�
+    private Integer iprintcount; // 鎵撳嵃娆℃暟
+    private String modifiedtime; // 鏈�鍚庝慨鏀规椂闂�
+    private String modifier; // 鏈�鍚庝慨鏀逛汉
+    private Double ntotalnum; // 鎬绘暟閲�
+    private Double ntotalpiece; // 鎬讳欢鏁�
+    private Double ntotalvolume; // 鎬讳綋绉�
+    private Double ntotalweight; // 鎬婚噸閲�
+    private String pkGroup; // 闆嗗洟
+    private String pkMeasware; // 璁¢噺鍣ㄥ叿
+    private String pkOrgV; // 搴撳瓨缁勭粐
+    private String taudittime; // 绛惧瓧鏃ユ湡
+    private String trafficorgoid; // 鐗╂祦缁勭粐鏈�鏂扮増鏈�
+    private String trafficorgvid; // 鐗╂祦缁勭粐
+    private String vbillcode; // 鍗曟嵁鍙�
+    private String vdef1; // 琛ㄥご鑷畾涔夐」1
+    private String vdef10; // 琛ㄥご鑷畾涔夐」10
+    private String vdef11; // 琛ㄥご鑷畾涔夐」11
+    private String vdef12; // 琛ㄥご鑷畾涔夐」12
+    private String vdef13; // 琛ㄥご鑷畾涔夐」13
+    private String vdef14; // 琛ㄥご鑷畾涔夐」14
+    private String vdef15; // 琛ㄥご鑷畾涔夐」15
+    private String vdef16; // 琛ㄥご鑷畾涔夐」16
+    private String vdef17; // 琛ㄥご鑷畾涔夐」17
+    private String vdef18; // 琛ㄥご鑷畾涔夐」18
+    private String vdef19; // 琛ㄥご鑷畾涔夐」19
+    private String vdef2; // 琛ㄥご鑷畾涔夐」2
+    private String vdef20; // 琛ㄥご鑷畾涔夐」20
+    private String vdef3; // 琛ㄥご鑷畾涔夐」3
+    private String vdef4; // 琛ㄥご鑷畾涔夐」4
+    private String vdef5; // 琛ㄥご鑷畾涔夐」5
+    private String vdef6; // 琛ㄥご鑷畾涔夐」6
+    private String vdef7; // 琛ㄥご鑷畾涔夐」7
+    private String vdef8; // 琛ㄥご鑷畾涔夐」8
+    private String vdef9; // 琛ㄥご鑷畾涔夐」9
+    private String vdiliveraddress; // 杩愯緭鍦板潃
+    private String vnote; // 澶囨敞
+    private String vtrantypecode; // 鍑哄叆搴撶被鍨嬬紪鐮�
+
 }
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 125b490..6ab51fd 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -10,26 +10,28 @@
     enabled: false
   datasource:
     driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
-#    url: jdbc:sqlserver://192.168.4.191:1433;databasename=integrationasrs
-#    username: sa
-#    password: sa@123
-    url: jdbc:sqlserver://192.168.4.191:50948;databasename=source
+    jdbc-url: jdbc:sqlserver://127.0.0.1:1433;databasename=ytflasrs
     username: sa
     password: sa@123
-#    url: jdbc:sqlserver://127.0.0.1:51433;databasename=source
-#    username: sa
-#    password: Zoneyung@zy56$
+
+
   mvc:
     static-path-pattern: /**
   redis:
     host: localhost
     port: 6379
     database: 0
-#    password: xltys1995
+  #    password: xltys1995
   servlet:
     multipart:
       maxFileSize: 100MB
       maxRequestSize: 100MB
+other:
+  datasource:
+    jdbc-url: jdbc:mysql://192.168.5.61:3306/datareports
+    username: liku
+    password: 123456
+    driver-class-name: com.mysql.cj.jdbc.Driver
 
 mybatis-plus:
   mapper-locations: classpath:mapper/*.xml
@@ -159,7 +161,7 @@
     #缁撴灉涓婃姤锛堝鏍革級鍗曞湴鍧�
     outaddressAudit: K3CLOUD/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Audit.common.kdsvc
   #  鐧诲綍璐﹀彿绠$悊
-  login :
+  login:
     acctID: "647e849ab6fa0f"
     username: "llw"
     password: "666666"
diff --git a/src/main/resources/config.properties b/src/main/resources/config.properties
index a47ff24..9569026 100644
--- a/src/main/resources/config.properties
+++ b/src/main/resources/config.properties
@@ -1,6 +1,6 @@
 #####涓嶅彉鍙傛暟
-client_id=tchzt2
-client_secret=aad2433934c141b58937
+client_id=WMS
+client_secret=b5ee040e00584e518c06
 pubKey=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhxRFEtPfreu+ROWtC5IQZVy1Vkkqi0Fk7A4tGvyfLIw2qPNLWrTmCJeJwXLmgiB+EU0RW9U8jFYRAhSKaQY1HTjHMZcXdfH6m7WitT+sIyDVfTO3wVWtvjFBF1o6qi+T7pNsmCjstArnm/OS55kn0zJcRiTTwP1UU1LrkQbytf9ZHOcbKfqjIL8amsinjdxd6ioUM3JT3PpOXCIRDHsQgvAnFx2q7Y902S0PFzc40FwtuwsuKqesvEbIImUcq1wbIDtMegixy+TfJMWcByNLp2iv8/+Zos+hePhfWRPlD2x0vk30xDXMiUVgq0dhxC5C3yeD2QEbLxIlDqK2WebzZQIDAQAB
 secret_level=L0
 #autotest=ture
@@ -32,9 +32,9 @@
 #pwd=123456a!
 #busi_center=1001
 
-username=WMS
-pwd=b5ee040e00584e518c06
-busi_center=fulai??0731
+username=wmsliku
+pwd=liku@135
+busi_center=F
 
 #username=01
 #pwd=123456a!
diff --git a/src/main/resources/mapper2/test b/src/main/resources/mapper2/test
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/main/resources/mapper2/test

--
Gitblit v1.9.1