diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..5287d96 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/../../../../:\code\casic-metering-readwriter\.idea/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..5287d96 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/../../../../:\code\casic-metering-readwriter\.idea/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..3c031c9 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..5287d96 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/../../../../:\code\casic-metering-readwriter\.idea/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..3c031c9 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..63e9001 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..5287d96 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/../../../../:\code\casic-metering-readwriter\.idea/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..3c031c9 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..63e9001 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..9907c1d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..5287d96 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/../../../../:\code\casic-metering-readwriter\.idea/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..3c031c9 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..63e9001 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..9907c1d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..4b661a5 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..5287d96 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/../../../../:\code\casic-metering-readwriter\.idea/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..3c031c9 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..63e9001 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..9907c1d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..4b661a5 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..5287d96 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/../../../../:\code\casic-metering-readwriter\.idea/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..3c031c9 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..63e9001 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..9907c1d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..4b661a5 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..033c242 --- /dev/null +++ b/pom.xml @@ -0,0 +1,85 @@ + + + 4.0.0 + + com.casic.missiles + casic-metering-readwriter + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.4.5 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + + + + com.new.reader + reader-api + 1.0 + + + + + com.gg.reader + greader-api + 1.0 + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.0.2 + + + + **/*-*.yml + + + + com.casic.missiles.CasicApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.3.0 + + false + + src/main/build/package.xml + + + + + make-assembly + package + + single + + + + + + + + \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..5287d96 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/../../../../:\code\casic-metering-readwriter\.idea/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..3c031c9 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..63e9001 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..9907c1d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..4b661a5 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..033c242 --- /dev/null +++ b/pom.xml @@ -0,0 +1,85 @@ + + + 4.0.0 + + com.casic.missiles + casic-metering-readwriter + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.4.5 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + + + + com.new.reader + reader-api + 1.0 + + + + + com.gg.reader + greader-api + 1.0 + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.0.2 + + + + **/*-*.yml + + + + com.casic.missiles.CasicApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.3.0 + + false + + src/main/build/package.xml + + + + + make-assembly + package + + single + + + + + + + + \ No newline at end of file diff --git a/src/main/build/bin/start.bat b/src/main/build/bin/start.bat new file mode 100644 index 0000000..f7270e6 --- /dev/null +++ b/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title casic-metering-readwriter-1.0-SNAPSHOT.jar +java -jar D:\metering\casic-metering-readwriter-1.0-SNAPSHOT\lib\casic-metering-readwriter-1.0-SNAPSHOT.jar +@pause diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..5287d96 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/../../../../:\code\casic-metering-readwriter\.idea/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..3c031c9 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..63e9001 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..9907c1d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..4b661a5 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..033c242 --- /dev/null +++ b/pom.xml @@ -0,0 +1,85 @@ + + + 4.0.0 + + com.casic.missiles + casic-metering-readwriter + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.4.5 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + + + + com.new.reader + reader-api + 1.0 + + + + + com.gg.reader + greader-api + 1.0 + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.0.2 + + + + **/*-*.yml + + + + com.casic.missiles.CasicApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.3.0 + + false + + src/main/build/package.xml + + + + + make-assembly + package + + single + + + + + + + + \ No newline at end of file diff --git a/src/main/build/bin/start.bat b/src/main/build/bin/start.bat new file mode 100644 index 0000000..f7270e6 --- /dev/null +++ b/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title casic-metering-readwriter-1.0-SNAPSHOT.jar +java -jar D:\metering\casic-metering-readwriter-1.0-SNAPSHOT\lib\casic-metering-readwriter-1.0-SNAPSHOT.jar +@pause diff --git a/src/main/build/bin/start.sh b/src/main/build/bin/start.sh new file mode 100644 index 0000000..c4722ff --- /dev/null +++ b/src/main/build/bin/start.sh @@ -0,0 +1 @@ +java -jar ./lib/casic-metering-readwriter-1.0-SNAPSHOT.jar \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..5287d96 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/../../../../:\code\casic-metering-readwriter\.idea/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..3c031c9 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..63e9001 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..9907c1d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..4b661a5 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..033c242 --- /dev/null +++ b/pom.xml @@ -0,0 +1,85 @@ + + + 4.0.0 + + com.casic.missiles + casic-metering-readwriter + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.4.5 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + + + + com.new.reader + reader-api + 1.0 + + + + + com.gg.reader + greader-api + 1.0 + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.0.2 + + + + **/*-*.yml + + + + com.casic.missiles.CasicApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.3.0 + + false + + src/main/build/package.xml + + + + + make-assembly + package + + single + + + + + + + + \ No newline at end of file diff --git a/src/main/build/bin/start.bat b/src/main/build/bin/start.bat new file mode 100644 index 0000000..f7270e6 --- /dev/null +++ b/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title casic-metering-readwriter-1.0-SNAPSHOT.jar +java -jar D:\metering\casic-metering-readwriter-1.0-SNAPSHOT\lib\casic-metering-readwriter-1.0-SNAPSHOT.jar +@pause diff --git a/src/main/build/bin/start.sh b/src/main/build/bin/start.sh new file mode 100644 index 0000000..c4722ff --- /dev/null +++ b/src/main/build/bin/start.sh @@ -0,0 +1 @@ +java -jar ./lib/casic-metering-readwriter-1.0-SNAPSHOT.jar \ No newline at end of file diff --git a/src/main/build/package.xml b/src/main/build/package.xml new file mode 100644 index 0000000..97bc675 --- /dev/null +++ b/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..5287d96 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/../../../../:\code\casic-metering-readwriter\.idea/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..3c031c9 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..63e9001 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..9907c1d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..4b661a5 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..033c242 --- /dev/null +++ b/pom.xml @@ -0,0 +1,85 @@ + + + 4.0.0 + + com.casic.missiles + casic-metering-readwriter + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.4.5 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + + + + com.new.reader + reader-api + 1.0 + + + + + com.gg.reader + greader-api + 1.0 + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.0.2 + + + + **/*-*.yml + + + + com.casic.missiles.CasicApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.3.0 + + false + + src/main/build/package.xml + + + + + make-assembly + package + + single + + + + + + + + \ No newline at end of file diff --git a/src/main/build/bin/start.bat b/src/main/build/bin/start.bat new file mode 100644 index 0000000..f7270e6 --- /dev/null +++ b/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title casic-metering-readwriter-1.0-SNAPSHOT.jar +java -jar D:\metering\casic-metering-readwriter-1.0-SNAPSHOT\lib\casic-metering-readwriter-1.0-SNAPSHOT.jar +@pause diff --git a/src/main/build/bin/start.sh b/src/main/build/bin/start.sh new file mode 100644 index 0000000..c4722ff --- /dev/null +++ b/src/main/build/bin/start.sh @@ -0,0 +1 @@ +java -jar ./lib/casic-metering-readwriter-1.0-SNAPSHOT.jar \ No newline at end of file diff --git a/src/main/build/package.xml b/src/main/build/package.xml new file mode 100644 index 0000000..97bc675 --- /dev/null +++ b/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/src/main/java/com/casic/missiles/CasicApplication.java b/src/main/java/com/casic/missiles/CasicApplication.java new file mode 100644 index 0000000..36fdfee --- /dev/null +++ b/src/main/java/com/casic/missiles/CasicApplication.java @@ -0,0 +1,19 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @Description: SpringBoot启动类 + * @Author: wangpeng + * @Date: 2023/6/15 15:27 + */ +@Slf4j +@SpringBootApplication +public class CasicApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApplication.class,args); + log.info("CasicApplication is success!"); + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..5287d96 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/../../../../:\code\casic-metering-readwriter\.idea/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..3c031c9 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..63e9001 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..9907c1d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..4b661a5 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..033c242 --- /dev/null +++ b/pom.xml @@ -0,0 +1,85 @@ + + + 4.0.0 + + com.casic.missiles + casic-metering-readwriter + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.4.5 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + + + + com.new.reader + reader-api + 1.0 + + + + + com.gg.reader + greader-api + 1.0 + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.0.2 + + + + **/*-*.yml + + + + com.casic.missiles.CasicApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.3.0 + + false + + src/main/build/package.xml + + + + + make-assembly + package + + single + + + + + + + + \ No newline at end of file diff --git a/src/main/build/bin/start.bat b/src/main/build/bin/start.bat new file mode 100644 index 0000000..f7270e6 --- /dev/null +++ b/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title casic-metering-readwriter-1.0-SNAPSHOT.jar +java -jar D:\metering\casic-metering-readwriter-1.0-SNAPSHOT\lib\casic-metering-readwriter-1.0-SNAPSHOT.jar +@pause diff --git a/src/main/build/bin/start.sh b/src/main/build/bin/start.sh new file mode 100644 index 0000000..c4722ff --- /dev/null +++ b/src/main/build/bin/start.sh @@ -0,0 +1 @@ +java -jar ./lib/casic-metering-readwriter-1.0-SNAPSHOT.jar \ No newline at end of file diff --git a/src/main/build/package.xml b/src/main/build/package.xml new file mode 100644 index 0000000..97bc675 --- /dev/null +++ b/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/src/main/java/com/casic/missiles/CasicApplication.java b/src/main/java/com/casic/missiles/CasicApplication.java new file mode 100644 index 0000000..36fdfee --- /dev/null +++ b/src/main/java/com/casic/missiles/CasicApplication.java @@ -0,0 +1,19 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @Description: SpringBoot启动类 + * @Author: wangpeng + * @Date: 2023/6/15 15:27 + */ +@Slf4j +@SpringBootApplication +public class CasicApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApplication.class,args); + log.info("CasicApplication is success!"); + } +} diff --git a/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java b/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java new file mode 100644 index 0000000..836c0bf --- /dev/null +++ b/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java @@ -0,0 +1,23 @@ +package com.casic.missiles.common; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:12 + */ +public interface AbstractBaseExceptionEnum { + /** + * 获取异常的状态码 + * + * @return 异常状态码 + */ + Integer getCode(); + + + /** + * 获取异常的提示信息 + * + * @return 异常提示消息 + */ + String getMessage(); +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..5287d96 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/../../../../:\code\casic-metering-readwriter\.idea/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..3c031c9 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..63e9001 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..9907c1d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..4b661a5 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..033c242 --- /dev/null +++ b/pom.xml @@ -0,0 +1,85 @@ + + + 4.0.0 + + com.casic.missiles + casic-metering-readwriter + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.4.5 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + + + + com.new.reader + reader-api + 1.0 + + + + + com.gg.reader + greader-api + 1.0 + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.0.2 + + + + **/*-*.yml + + + + com.casic.missiles.CasicApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.3.0 + + false + + src/main/build/package.xml + + + + + make-assembly + package + + single + + + + + + + + \ No newline at end of file diff --git a/src/main/build/bin/start.bat b/src/main/build/bin/start.bat new file mode 100644 index 0000000..f7270e6 --- /dev/null +++ b/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title casic-metering-readwriter-1.0-SNAPSHOT.jar +java -jar D:\metering\casic-metering-readwriter-1.0-SNAPSHOT\lib\casic-metering-readwriter-1.0-SNAPSHOT.jar +@pause diff --git a/src/main/build/bin/start.sh b/src/main/build/bin/start.sh new file mode 100644 index 0000000..c4722ff --- /dev/null +++ b/src/main/build/bin/start.sh @@ -0,0 +1 @@ +java -jar ./lib/casic-metering-readwriter-1.0-SNAPSHOT.jar \ No newline at end of file diff --git a/src/main/build/package.xml b/src/main/build/package.xml new file mode 100644 index 0000000..97bc675 --- /dev/null +++ b/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/src/main/java/com/casic/missiles/CasicApplication.java b/src/main/java/com/casic/missiles/CasicApplication.java new file mode 100644 index 0000000..36fdfee --- /dev/null +++ b/src/main/java/com/casic/missiles/CasicApplication.java @@ -0,0 +1,19 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @Description: SpringBoot启动类 + * @Author: wangpeng + * @Date: 2023/6/15 15:27 + */ +@Slf4j +@SpringBootApplication +public class CasicApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApplication.class,args); + log.info("CasicApplication is success!"); + } +} diff --git a/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java b/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java new file mode 100644 index 0000000..836c0bf --- /dev/null +++ b/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java @@ -0,0 +1,23 @@ +package com.casic.missiles.common; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:12 + */ +public interface AbstractBaseExceptionEnum { + /** + * 获取异常的状态码 + * + * @return 异常状态码 + */ + Integer getCode(); + + + /** + * 获取异常的提示信息 + * + * @return 异常提示消息 + */ + String getMessage(); +} diff --git a/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java b/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java new file mode 100644 index 0000000..75763c2 --- /dev/null +++ b/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java @@ -0,0 +1,110 @@ +package com.casic.missiles.common; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + TRAIN_STAFF_NULL(2400, "培训学员不能为空"), + TRAIN_LOG_ID_NULL(2400, "培训记录主键不能为空"), + ORGANIZE_ID_NULL(2400, "计量组织主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + EDUCATION_NOT_EXISTENCE(2300, "导入文化程度不存在;"), + TECHNOLOGY_JOB_NOT_EXISTENCE(2300, "导入技术职位不存在;"), + ADMINISTRATION_JOB_NOT_EXISTENCE(2300, "导入行政职务不存在;"), + DEPT_NOT_EXISTENCE(2300, "导入部门不存在;"), + SEX_NOT_CORRECT(2300, "性别填写有误(男,女);"), + MAIN_EXAMINER_NOT_CORRECT(2300, "是否主考人填写有误(是,否);"), + SPECIAL_OPERATOR_NOT_CORRECT(2300, "是否特操人填写有误(是,否);"), + TECHNOLOGY_EXAM_NOT_CORRECT(2300, "是否技术考核填写有误(是,否);"), + WORK_DATE_NOT_CORRECT(2300, "从事日期格式错误(2022-15-05);"), + BIRTHDAY_NOT_CORRECT(2300, "生日格式错误(2022-15-05);"), + CERTIFICATE_DATE_NOT_CORRECT(2300, "发证日期格式错误(2022-15-05);"), + VALID_DATE_NOT_CORRECT(2300, "有效日期格式错误(2022-15-05);"), + STAFF_NOT_EXISTENCE(2300, "人员编号不存在"), + CHECK_TYPE_NOT_EXISTENCE(2300, "校验类型不存在;"), + PRICE_TYPE_NOT_EXISTENCE(2300, "价格类别不存在;"), + PRICE_ITEM_NOT_EXISTENCE(2300, "项目不存在;"), + OPERATOR_DISCOUNT_PERMISSION_NOT_EXISTENCE(2300, "业务员折扣权限不存在;"), + DIRECTOR_DISCOUNT_PERMISSION_NOT_EXISTENCE(2300, "负责人折扣权限不存在;"), + TRACE_SUPPLIER_ID_NULL(2400, "培训记录主键不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + NOT_FOUND_USER_INFO(2402, "未找到用户信息"), + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRAIN_PLAN_SAVE_FAILED(2403, "培训计划保存至草稿箱失败"), + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + TRAIN_PLAN_SUBMIT_FAILED(2406, "培训计划提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..5287d96 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/../../../../:\code\casic-metering-readwriter\.idea/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..3c031c9 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..63e9001 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..9907c1d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..4b661a5 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..033c242 --- /dev/null +++ b/pom.xml @@ -0,0 +1,85 @@ + + + 4.0.0 + + com.casic.missiles + casic-metering-readwriter + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.4.5 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + + + + com.new.reader + reader-api + 1.0 + + + + + com.gg.reader + greader-api + 1.0 + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.0.2 + + + + **/*-*.yml + + + + com.casic.missiles.CasicApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.3.0 + + false + + src/main/build/package.xml + + + + + make-assembly + package + + single + + + + + + + + \ No newline at end of file diff --git a/src/main/build/bin/start.bat b/src/main/build/bin/start.bat new file mode 100644 index 0000000..f7270e6 --- /dev/null +++ b/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title casic-metering-readwriter-1.0-SNAPSHOT.jar +java -jar D:\metering\casic-metering-readwriter-1.0-SNAPSHOT\lib\casic-metering-readwriter-1.0-SNAPSHOT.jar +@pause diff --git a/src/main/build/bin/start.sh b/src/main/build/bin/start.sh new file mode 100644 index 0000000..c4722ff --- /dev/null +++ b/src/main/build/bin/start.sh @@ -0,0 +1 @@ +java -jar ./lib/casic-metering-readwriter-1.0-SNAPSHOT.jar \ No newline at end of file diff --git a/src/main/build/package.xml b/src/main/build/package.xml new file mode 100644 index 0000000..97bc675 --- /dev/null +++ b/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/src/main/java/com/casic/missiles/CasicApplication.java b/src/main/java/com/casic/missiles/CasicApplication.java new file mode 100644 index 0000000..36fdfee --- /dev/null +++ b/src/main/java/com/casic/missiles/CasicApplication.java @@ -0,0 +1,19 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @Description: SpringBoot启动类 + * @Author: wangpeng + * @Date: 2023/6/15 15:27 + */ +@Slf4j +@SpringBootApplication +public class CasicApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApplication.class,args); + log.info("CasicApplication is success!"); + } +} diff --git a/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java b/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java new file mode 100644 index 0000000..836c0bf --- /dev/null +++ b/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java @@ -0,0 +1,23 @@ +package com.casic.missiles.common; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:12 + */ +public interface AbstractBaseExceptionEnum { + /** + * 获取异常的状态码 + * + * @return 异常状态码 + */ + Integer getCode(); + + + /** + * 获取异常的提示信息 + * + * @return 异常提示消息 + */ + String getMessage(); +} diff --git a/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java b/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java new file mode 100644 index 0000000..75763c2 --- /dev/null +++ b/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java @@ -0,0 +1,110 @@ +package com.casic.missiles.common; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + TRAIN_STAFF_NULL(2400, "培训学员不能为空"), + TRAIN_LOG_ID_NULL(2400, "培训记录主键不能为空"), + ORGANIZE_ID_NULL(2400, "计量组织主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + EDUCATION_NOT_EXISTENCE(2300, "导入文化程度不存在;"), + TECHNOLOGY_JOB_NOT_EXISTENCE(2300, "导入技术职位不存在;"), + ADMINISTRATION_JOB_NOT_EXISTENCE(2300, "导入行政职务不存在;"), + DEPT_NOT_EXISTENCE(2300, "导入部门不存在;"), + SEX_NOT_CORRECT(2300, "性别填写有误(男,女);"), + MAIN_EXAMINER_NOT_CORRECT(2300, "是否主考人填写有误(是,否);"), + SPECIAL_OPERATOR_NOT_CORRECT(2300, "是否特操人填写有误(是,否);"), + TECHNOLOGY_EXAM_NOT_CORRECT(2300, "是否技术考核填写有误(是,否);"), + WORK_DATE_NOT_CORRECT(2300, "从事日期格式错误(2022-15-05);"), + BIRTHDAY_NOT_CORRECT(2300, "生日格式错误(2022-15-05);"), + CERTIFICATE_DATE_NOT_CORRECT(2300, "发证日期格式错误(2022-15-05);"), + VALID_DATE_NOT_CORRECT(2300, "有效日期格式错误(2022-15-05);"), + STAFF_NOT_EXISTENCE(2300, "人员编号不存在"), + CHECK_TYPE_NOT_EXISTENCE(2300, "校验类型不存在;"), + PRICE_TYPE_NOT_EXISTENCE(2300, "价格类别不存在;"), + PRICE_ITEM_NOT_EXISTENCE(2300, "项目不存在;"), + OPERATOR_DISCOUNT_PERMISSION_NOT_EXISTENCE(2300, "业务员折扣权限不存在;"), + DIRECTOR_DISCOUNT_PERMISSION_NOT_EXISTENCE(2300, "负责人折扣权限不存在;"), + TRACE_SUPPLIER_ID_NULL(2400, "培训记录主键不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + NOT_FOUND_USER_INFO(2402, "未找到用户信息"), + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRAIN_PLAN_SAVE_FAILED(2403, "培训计划保存至草稿箱失败"), + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + TRAIN_PLAN_SUBMIT_FAILED(2406, "培训计划提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java new file mode 100644 index 0000000..d54b93a --- /dev/null +++ b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java @@ -0,0 +1,74 @@ +package com.casic.missiles.cotroller; + +import com.casic.missiles.model.ReturnDTO; +import com.casic.missiles.service.IBusinessReadWriterService; +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.Set; +import java.util.concurrent.ExecutionException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:01 + */ +@Slf4j +@RestController +@RequestMapping("/business/readWriter") +public class BusinessReadWriterController { + @Autowired + private IBusinessReadWriterService readWriterService; + + /** + * 获取大读写器识别的标签TID列表 + * 大读写器 + * TCP连接,需配置和192.168.1.201一个段 + * 读取读写器获取标签TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @GetMapping("/tId/readList") + public ReturnDTO> tIdNewReadList() { + return readWriterService.tIdNewReadList(); + } + + /** + * 获取小读写器识别的标签TID列表 + * USB-HID连接(HID是一种USB通信协议,无需安装驱动就能进行交互) + * 读取读写器获取TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @GetMapping("/tId/mini/readList") + public ReturnDTO> tIdMiniReadList() { + return readWriterService.tIdMiniReadList(); + } + + /** + * 获取有线扫码枪识别列表(二维码) + * USB串口连接(模拟COM口),USB模拟串行通讯模式,连接后在设备管理器-端口(COM和LPT)可查看连接设备 + * 目前设置:扫码一次读取一个,扫码结果无回车 + * 二维码由样品编号/设备编号生成 + * 扫描收入、扫描检完等,以及大读写器的补充(包括新建委托书和待收入中使用) + */ + @GetMapping("/code/gun/readList") + public ReturnDTO> codeGunReadList() { + return readWriterService.codeGunReadList(); + } + + /** + * 有线扫码枪(二维码)和大读写器结合扫描 + */ + @GetMapping("/gunAndTId/readList") + public ReturnDTO> equipmentLabelReadList() throws ExecutionException, InterruptedException { + return readWriterService.gunAndTIdNewReadList(); + } + + /** + * 大读写器和小读写器识别结合的结果TID列表 + */ + @GetMapping("/tIdAndMini/readList") + public ReturnDTO> allTidReadList() throws ExecutionException, InterruptedException { + return readWriterService.tIdAndMiniReadList(); + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..5287d96 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/../../../../:\code\casic-metering-readwriter\.idea/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..3c031c9 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..63e9001 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..9907c1d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..4b661a5 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..033c242 --- /dev/null +++ b/pom.xml @@ -0,0 +1,85 @@ + + + 4.0.0 + + com.casic.missiles + casic-metering-readwriter + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.4.5 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + + + + com.new.reader + reader-api + 1.0 + + + + + com.gg.reader + greader-api + 1.0 + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.0.2 + + + + **/*-*.yml + + + + com.casic.missiles.CasicApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.3.0 + + false + + src/main/build/package.xml + + + + + make-assembly + package + + single + + + + + + + + \ No newline at end of file diff --git a/src/main/build/bin/start.bat b/src/main/build/bin/start.bat new file mode 100644 index 0000000..f7270e6 --- /dev/null +++ b/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title casic-metering-readwriter-1.0-SNAPSHOT.jar +java -jar D:\metering\casic-metering-readwriter-1.0-SNAPSHOT\lib\casic-metering-readwriter-1.0-SNAPSHOT.jar +@pause diff --git a/src/main/build/bin/start.sh b/src/main/build/bin/start.sh new file mode 100644 index 0000000..c4722ff --- /dev/null +++ b/src/main/build/bin/start.sh @@ -0,0 +1 @@ +java -jar ./lib/casic-metering-readwriter-1.0-SNAPSHOT.jar \ No newline at end of file diff --git a/src/main/build/package.xml b/src/main/build/package.xml new file mode 100644 index 0000000..97bc675 --- /dev/null +++ b/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/src/main/java/com/casic/missiles/CasicApplication.java b/src/main/java/com/casic/missiles/CasicApplication.java new file mode 100644 index 0000000..36fdfee --- /dev/null +++ b/src/main/java/com/casic/missiles/CasicApplication.java @@ -0,0 +1,19 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @Description: SpringBoot启动类 + * @Author: wangpeng + * @Date: 2023/6/15 15:27 + */ +@Slf4j +@SpringBootApplication +public class CasicApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApplication.class,args); + log.info("CasicApplication is success!"); + } +} diff --git a/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java b/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java new file mode 100644 index 0000000..836c0bf --- /dev/null +++ b/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java @@ -0,0 +1,23 @@ +package com.casic.missiles.common; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:12 + */ +public interface AbstractBaseExceptionEnum { + /** + * 获取异常的状态码 + * + * @return 异常状态码 + */ + Integer getCode(); + + + /** + * 获取异常的提示信息 + * + * @return 异常提示消息 + */ + String getMessage(); +} diff --git a/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java b/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java new file mode 100644 index 0000000..75763c2 --- /dev/null +++ b/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java @@ -0,0 +1,110 @@ +package com.casic.missiles.common; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + TRAIN_STAFF_NULL(2400, "培训学员不能为空"), + TRAIN_LOG_ID_NULL(2400, "培训记录主键不能为空"), + ORGANIZE_ID_NULL(2400, "计量组织主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + EDUCATION_NOT_EXISTENCE(2300, "导入文化程度不存在;"), + TECHNOLOGY_JOB_NOT_EXISTENCE(2300, "导入技术职位不存在;"), + ADMINISTRATION_JOB_NOT_EXISTENCE(2300, "导入行政职务不存在;"), + DEPT_NOT_EXISTENCE(2300, "导入部门不存在;"), + SEX_NOT_CORRECT(2300, "性别填写有误(男,女);"), + MAIN_EXAMINER_NOT_CORRECT(2300, "是否主考人填写有误(是,否);"), + SPECIAL_OPERATOR_NOT_CORRECT(2300, "是否特操人填写有误(是,否);"), + TECHNOLOGY_EXAM_NOT_CORRECT(2300, "是否技术考核填写有误(是,否);"), + WORK_DATE_NOT_CORRECT(2300, "从事日期格式错误(2022-15-05);"), + BIRTHDAY_NOT_CORRECT(2300, "生日格式错误(2022-15-05);"), + CERTIFICATE_DATE_NOT_CORRECT(2300, "发证日期格式错误(2022-15-05);"), + VALID_DATE_NOT_CORRECT(2300, "有效日期格式错误(2022-15-05);"), + STAFF_NOT_EXISTENCE(2300, "人员编号不存在"), + CHECK_TYPE_NOT_EXISTENCE(2300, "校验类型不存在;"), + PRICE_TYPE_NOT_EXISTENCE(2300, "价格类别不存在;"), + PRICE_ITEM_NOT_EXISTENCE(2300, "项目不存在;"), + OPERATOR_DISCOUNT_PERMISSION_NOT_EXISTENCE(2300, "业务员折扣权限不存在;"), + DIRECTOR_DISCOUNT_PERMISSION_NOT_EXISTENCE(2300, "负责人折扣权限不存在;"), + TRACE_SUPPLIER_ID_NULL(2400, "培训记录主键不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + NOT_FOUND_USER_INFO(2402, "未找到用户信息"), + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRAIN_PLAN_SAVE_FAILED(2403, "培训计划保存至草稿箱失败"), + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + TRAIN_PLAN_SUBMIT_FAILED(2406, "培训计划提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java new file mode 100644 index 0000000..d54b93a --- /dev/null +++ b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java @@ -0,0 +1,74 @@ +package com.casic.missiles.cotroller; + +import com.casic.missiles.model.ReturnDTO; +import com.casic.missiles.service.IBusinessReadWriterService; +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.Set; +import java.util.concurrent.ExecutionException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:01 + */ +@Slf4j +@RestController +@RequestMapping("/business/readWriter") +public class BusinessReadWriterController { + @Autowired + private IBusinessReadWriterService readWriterService; + + /** + * 获取大读写器识别的标签TID列表 + * 大读写器 + * TCP连接,需配置和192.168.1.201一个段 + * 读取读写器获取标签TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @GetMapping("/tId/readList") + public ReturnDTO> tIdNewReadList() { + return readWriterService.tIdNewReadList(); + } + + /** + * 获取小读写器识别的标签TID列表 + * USB-HID连接(HID是一种USB通信协议,无需安装驱动就能进行交互) + * 读取读写器获取TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @GetMapping("/tId/mini/readList") + public ReturnDTO> tIdMiniReadList() { + return readWriterService.tIdMiniReadList(); + } + + /** + * 获取有线扫码枪识别列表(二维码) + * USB串口连接(模拟COM口),USB模拟串行通讯模式,连接后在设备管理器-端口(COM和LPT)可查看连接设备 + * 目前设置:扫码一次读取一个,扫码结果无回车 + * 二维码由样品编号/设备编号生成 + * 扫描收入、扫描检完等,以及大读写器的补充(包括新建委托书和待收入中使用) + */ + @GetMapping("/code/gun/readList") + public ReturnDTO> codeGunReadList() { + return readWriterService.codeGunReadList(); + } + + /** + * 有线扫码枪(二维码)和大读写器结合扫描 + */ + @GetMapping("/gunAndTId/readList") + public ReturnDTO> equipmentLabelReadList() throws ExecutionException, InterruptedException { + return readWriterService.gunAndTIdNewReadList(); + } + + /** + * 大读写器和小读写器识别结合的结果TID列表 + */ + @GetMapping("/tIdAndMini/readList") + public ReturnDTO> allTidReadList() throws ExecutionException, InterruptedException { + return readWriterService.tIdAndMiniReadList(); + } +} diff --git a/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java b/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java new file mode 100644 index 0000000..89095aa --- /dev/null +++ b/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java @@ -0,0 +1,27 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.service.impl.BusinessReadWriterServiceImpl; +import com.casic.missiles.utils.SerialPortUtil; +import gnu.io.SerialPortEvent; +import gnu.io.SerialPortEventListener; + +import java.util.HashSet; +import java.util.Set; + +/** + * @Description: 设备串口接收数据监听器 + * @Author: wangpeng + * @Date: 2023/4/4 16:46 + */ +public class CodeGunDataListener implements SerialPortEventListener { + public static Set dataSet = new HashSet<>(); + + @Override + public void serialEvent(SerialPortEvent event) { + if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) { + SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil(); + byte[] bytes = serialPortUtil.readFromPort(BusinessReadWriterServiceImpl.serialPort); + dataSet.add(new String(bytes, 0, bytes.length).trim()); + } + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..5287d96 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/../../../../:\code\casic-metering-readwriter\.idea/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..3c031c9 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..63e9001 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..9907c1d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..4b661a5 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..033c242 --- /dev/null +++ b/pom.xml @@ -0,0 +1,85 @@ + + + 4.0.0 + + com.casic.missiles + casic-metering-readwriter + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.4.5 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + + + + com.new.reader + reader-api + 1.0 + + + + + com.gg.reader + greader-api + 1.0 + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.0.2 + + + + **/*-*.yml + + + + com.casic.missiles.CasicApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.3.0 + + false + + src/main/build/package.xml + + + + + make-assembly + package + + single + + + + + + + + \ No newline at end of file diff --git a/src/main/build/bin/start.bat b/src/main/build/bin/start.bat new file mode 100644 index 0000000..f7270e6 --- /dev/null +++ b/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title casic-metering-readwriter-1.0-SNAPSHOT.jar +java -jar D:\metering\casic-metering-readwriter-1.0-SNAPSHOT\lib\casic-metering-readwriter-1.0-SNAPSHOT.jar +@pause diff --git a/src/main/build/bin/start.sh b/src/main/build/bin/start.sh new file mode 100644 index 0000000..c4722ff --- /dev/null +++ b/src/main/build/bin/start.sh @@ -0,0 +1 @@ +java -jar ./lib/casic-metering-readwriter-1.0-SNAPSHOT.jar \ No newline at end of file diff --git a/src/main/build/package.xml b/src/main/build/package.xml new file mode 100644 index 0000000..97bc675 --- /dev/null +++ b/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/src/main/java/com/casic/missiles/CasicApplication.java b/src/main/java/com/casic/missiles/CasicApplication.java new file mode 100644 index 0000000..36fdfee --- /dev/null +++ b/src/main/java/com/casic/missiles/CasicApplication.java @@ -0,0 +1,19 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @Description: SpringBoot启动类 + * @Author: wangpeng + * @Date: 2023/6/15 15:27 + */ +@Slf4j +@SpringBootApplication +public class CasicApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApplication.class,args); + log.info("CasicApplication is success!"); + } +} diff --git a/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java b/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java new file mode 100644 index 0000000..836c0bf --- /dev/null +++ b/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java @@ -0,0 +1,23 @@ +package com.casic.missiles.common; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:12 + */ +public interface AbstractBaseExceptionEnum { + /** + * 获取异常的状态码 + * + * @return 异常状态码 + */ + Integer getCode(); + + + /** + * 获取异常的提示信息 + * + * @return 异常提示消息 + */ + String getMessage(); +} diff --git a/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java b/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java new file mode 100644 index 0000000..75763c2 --- /dev/null +++ b/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java @@ -0,0 +1,110 @@ +package com.casic.missiles.common; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + TRAIN_STAFF_NULL(2400, "培训学员不能为空"), + TRAIN_LOG_ID_NULL(2400, "培训记录主键不能为空"), + ORGANIZE_ID_NULL(2400, "计量组织主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + EDUCATION_NOT_EXISTENCE(2300, "导入文化程度不存在;"), + TECHNOLOGY_JOB_NOT_EXISTENCE(2300, "导入技术职位不存在;"), + ADMINISTRATION_JOB_NOT_EXISTENCE(2300, "导入行政职务不存在;"), + DEPT_NOT_EXISTENCE(2300, "导入部门不存在;"), + SEX_NOT_CORRECT(2300, "性别填写有误(男,女);"), + MAIN_EXAMINER_NOT_CORRECT(2300, "是否主考人填写有误(是,否);"), + SPECIAL_OPERATOR_NOT_CORRECT(2300, "是否特操人填写有误(是,否);"), + TECHNOLOGY_EXAM_NOT_CORRECT(2300, "是否技术考核填写有误(是,否);"), + WORK_DATE_NOT_CORRECT(2300, "从事日期格式错误(2022-15-05);"), + BIRTHDAY_NOT_CORRECT(2300, "生日格式错误(2022-15-05);"), + CERTIFICATE_DATE_NOT_CORRECT(2300, "发证日期格式错误(2022-15-05);"), + VALID_DATE_NOT_CORRECT(2300, "有效日期格式错误(2022-15-05);"), + STAFF_NOT_EXISTENCE(2300, "人员编号不存在"), + CHECK_TYPE_NOT_EXISTENCE(2300, "校验类型不存在;"), + PRICE_TYPE_NOT_EXISTENCE(2300, "价格类别不存在;"), + PRICE_ITEM_NOT_EXISTENCE(2300, "项目不存在;"), + OPERATOR_DISCOUNT_PERMISSION_NOT_EXISTENCE(2300, "业务员折扣权限不存在;"), + DIRECTOR_DISCOUNT_PERMISSION_NOT_EXISTENCE(2300, "负责人折扣权限不存在;"), + TRACE_SUPPLIER_ID_NULL(2400, "培训记录主键不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + NOT_FOUND_USER_INFO(2402, "未找到用户信息"), + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRAIN_PLAN_SAVE_FAILED(2403, "培训计划保存至草稿箱失败"), + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + TRAIN_PLAN_SUBMIT_FAILED(2406, "培训计划提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java new file mode 100644 index 0000000..d54b93a --- /dev/null +++ b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java @@ -0,0 +1,74 @@ +package com.casic.missiles.cotroller; + +import com.casic.missiles.model.ReturnDTO; +import com.casic.missiles.service.IBusinessReadWriterService; +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.Set; +import java.util.concurrent.ExecutionException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:01 + */ +@Slf4j +@RestController +@RequestMapping("/business/readWriter") +public class BusinessReadWriterController { + @Autowired + private IBusinessReadWriterService readWriterService; + + /** + * 获取大读写器识别的标签TID列表 + * 大读写器 + * TCP连接,需配置和192.168.1.201一个段 + * 读取读写器获取标签TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @GetMapping("/tId/readList") + public ReturnDTO> tIdNewReadList() { + return readWriterService.tIdNewReadList(); + } + + /** + * 获取小读写器识别的标签TID列表 + * USB-HID连接(HID是一种USB通信协议,无需安装驱动就能进行交互) + * 读取读写器获取TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @GetMapping("/tId/mini/readList") + public ReturnDTO> tIdMiniReadList() { + return readWriterService.tIdMiniReadList(); + } + + /** + * 获取有线扫码枪识别列表(二维码) + * USB串口连接(模拟COM口),USB模拟串行通讯模式,连接后在设备管理器-端口(COM和LPT)可查看连接设备 + * 目前设置:扫码一次读取一个,扫码结果无回车 + * 二维码由样品编号/设备编号生成 + * 扫描收入、扫描检完等,以及大读写器的补充(包括新建委托书和待收入中使用) + */ + @GetMapping("/code/gun/readList") + public ReturnDTO> codeGunReadList() { + return readWriterService.codeGunReadList(); + } + + /** + * 有线扫码枪(二维码)和大读写器结合扫描 + */ + @GetMapping("/gunAndTId/readList") + public ReturnDTO> equipmentLabelReadList() throws ExecutionException, InterruptedException { + return readWriterService.gunAndTIdNewReadList(); + } + + /** + * 大读写器和小读写器识别结合的结果TID列表 + */ + @GetMapping("/tIdAndMini/readList") + public ReturnDTO> allTidReadList() throws ExecutionException, InterruptedException { + return readWriterService.tIdAndMiniReadList(); + } +} diff --git a/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java b/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java new file mode 100644 index 0000000..89095aa --- /dev/null +++ b/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java @@ -0,0 +1,27 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.service.impl.BusinessReadWriterServiceImpl; +import com.casic.missiles.utils.SerialPortUtil; +import gnu.io.SerialPortEvent; +import gnu.io.SerialPortEventListener; + +import java.util.HashSet; +import java.util.Set; + +/** + * @Description: 设备串口接收数据监听器 + * @Author: wangpeng + * @Date: 2023/4/4 16:46 + */ +public class CodeGunDataListener implements SerialPortEventListener { + public static Set dataSet = new HashSet<>(); + + @Override + public void serialEvent(SerialPortEvent event) { + if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) { + SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil(); + byte[] bytes = serialPortUtil.readFromPort(BusinessReadWriterServiceImpl.serialPort); + dataSet.add(new String(bytes, 0, bytes.length).trim()); + } + } +} diff --git a/src/main/java/com/casic/missiles/model/ErrorResponseData.java b/src/main/java/com/casic/missiles/model/ErrorResponseData.java new file mode 100644 index 0000000..af437a5 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ErrorResponseData.java @@ -0,0 +1,26 @@ +package com.casic.missiles.model; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:07 + */ +public class ErrorResponseData extends ResponseData { + + /** + * 异常的具体类名称 + */ + private String exceptionClazz; + + public ErrorResponseData(String message) { + super(false, ResponseData.DEFAULT_ERROR_CODE, message, null); + } + + public ErrorResponseData(Integer code, String message) { + super(false, code, message, null); + } + + public ErrorResponseData(Integer code, String message, Object object) { + super(false, code, message, object); + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..5287d96 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/../../../../:\code\casic-metering-readwriter\.idea/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..3c031c9 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..63e9001 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..9907c1d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..4b661a5 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..033c242 --- /dev/null +++ b/pom.xml @@ -0,0 +1,85 @@ + + + 4.0.0 + + com.casic.missiles + casic-metering-readwriter + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.4.5 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + + + + com.new.reader + reader-api + 1.0 + + + + + com.gg.reader + greader-api + 1.0 + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.0.2 + + + + **/*-*.yml + + + + com.casic.missiles.CasicApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.3.0 + + false + + src/main/build/package.xml + + + + + make-assembly + package + + single + + + + + + + + \ No newline at end of file diff --git a/src/main/build/bin/start.bat b/src/main/build/bin/start.bat new file mode 100644 index 0000000..f7270e6 --- /dev/null +++ b/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title casic-metering-readwriter-1.0-SNAPSHOT.jar +java -jar D:\metering\casic-metering-readwriter-1.0-SNAPSHOT\lib\casic-metering-readwriter-1.0-SNAPSHOT.jar +@pause diff --git a/src/main/build/bin/start.sh b/src/main/build/bin/start.sh new file mode 100644 index 0000000..c4722ff --- /dev/null +++ b/src/main/build/bin/start.sh @@ -0,0 +1 @@ +java -jar ./lib/casic-metering-readwriter-1.0-SNAPSHOT.jar \ No newline at end of file diff --git a/src/main/build/package.xml b/src/main/build/package.xml new file mode 100644 index 0000000..97bc675 --- /dev/null +++ b/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/src/main/java/com/casic/missiles/CasicApplication.java b/src/main/java/com/casic/missiles/CasicApplication.java new file mode 100644 index 0000000..36fdfee --- /dev/null +++ b/src/main/java/com/casic/missiles/CasicApplication.java @@ -0,0 +1,19 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @Description: SpringBoot启动类 + * @Author: wangpeng + * @Date: 2023/6/15 15:27 + */ +@Slf4j +@SpringBootApplication +public class CasicApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApplication.class,args); + log.info("CasicApplication is success!"); + } +} diff --git a/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java b/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java new file mode 100644 index 0000000..836c0bf --- /dev/null +++ b/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java @@ -0,0 +1,23 @@ +package com.casic.missiles.common; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:12 + */ +public interface AbstractBaseExceptionEnum { + /** + * 获取异常的状态码 + * + * @return 异常状态码 + */ + Integer getCode(); + + + /** + * 获取异常的提示信息 + * + * @return 异常提示消息 + */ + String getMessage(); +} diff --git a/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java b/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java new file mode 100644 index 0000000..75763c2 --- /dev/null +++ b/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java @@ -0,0 +1,110 @@ +package com.casic.missiles.common; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + TRAIN_STAFF_NULL(2400, "培训学员不能为空"), + TRAIN_LOG_ID_NULL(2400, "培训记录主键不能为空"), + ORGANIZE_ID_NULL(2400, "计量组织主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + EDUCATION_NOT_EXISTENCE(2300, "导入文化程度不存在;"), + TECHNOLOGY_JOB_NOT_EXISTENCE(2300, "导入技术职位不存在;"), + ADMINISTRATION_JOB_NOT_EXISTENCE(2300, "导入行政职务不存在;"), + DEPT_NOT_EXISTENCE(2300, "导入部门不存在;"), + SEX_NOT_CORRECT(2300, "性别填写有误(男,女);"), + MAIN_EXAMINER_NOT_CORRECT(2300, "是否主考人填写有误(是,否);"), + SPECIAL_OPERATOR_NOT_CORRECT(2300, "是否特操人填写有误(是,否);"), + TECHNOLOGY_EXAM_NOT_CORRECT(2300, "是否技术考核填写有误(是,否);"), + WORK_DATE_NOT_CORRECT(2300, "从事日期格式错误(2022-15-05);"), + BIRTHDAY_NOT_CORRECT(2300, "生日格式错误(2022-15-05);"), + CERTIFICATE_DATE_NOT_CORRECT(2300, "发证日期格式错误(2022-15-05);"), + VALID_DATE_NOT_CORRECT(2300, "有效日期格式错误(2022-15-05);"), + STAFF_NOT_EXISTENCE(2300, "人员编号不存在"), + CHECK_TYPE_NOT_EXISTENCE(2300, "校验类型不存在;"), + PRICE_TYPE_NOT_EXISTENCE(2300, "价格类别不存在;"), + PRICE_ITEM_NOT_EXISTENCE(2300, "项目不存在;"), + OPERATOR_DISCOUNT_PERMISSION_NOT_EXISTENCE(2300, "业务员折扣权限不存在;"), + DIRECTOR_DISCOUNT_PERMISSION_NOT_EXISTENCE(2300, "负责人折扣权限不存在;"), + TRACE_SUPPLIER_ID_NULL(2400, "培训记录主键不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + NOT_FOUND_USER_INFO(2402, "未找到用户信息"), + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRAIN_PLAN_SAVE_FAILED(2403, "培训计划保存至草稿箱失败"), + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + TRAIN_PLAN_SUBMIT_FAILED(2406, "培训计划提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java new file mode 100644 index 0000000..d54b93a --- /dev/null +++ b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java @@ -0,0 +1,74 @@ +package com.casic.missiles.cotroller; + +import com.casic.missiles.model.ReturnDTO; +import com.casic.missiles.service.IBusinessReadWriterService; +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.Set; +import java.util.concurrent.ExecutionException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:01 + */ +@Slf4j +@RestController +@RequestMapping("/business/readWriter") +public class BusinessReadWriterController { + @Autowired + private IBusinessReadWriterService readWriterService; + + /** + * 获取大读写器识别的标签TID列表 + * 大读写器 + * TCP连接,需配置和192.168.1.201一个段 + * 读取读写器获取标签TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @GetMapping("/tId/readList") + public ReturnDTO> tIdNewReadList() { + return readWriterService.tIdNewReadList(); + } + + /** + * 获取小读写器识别的标签TID列表 + * USB-HID连接(HID是一种USB通信协议,无需安装驱动就能进行交互) + * 读取读写器获取TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @GetMapping("/tId/mini/readList") + public ReturnDTO> tIdMiniReadList() { + return readWriterService.tIdMiniReadList(); + } + + /** + * 获取有线扫码枪识别列表(二维码) + * USB串口连接(模拟COM口),USB模拟串行通讯模式,连接后在设备管理器-端口(COM和LPT)可查看连接设备 + * 目前设置:扫码一次读取一个,扫码结果无回车 + * 二维码由样品编号/设备编号生成 + * 扫描收入、扫描检完等,以及大读写器的补充(包括新建委托书和待收入中使用) + */ + @GetMapping("/code/gun/readList") + public ReturnDTO> codeGunReadList() { + return readWriterService.codeGunReadList(); + } + + /** + * 有线扫码枪(二维码)和大读写器结合扫描 + */ + @GetMapping("/gunAndTId/readList") + public ReturnDTO> equipmentLabelReadList() throws ExecutionException, InterruptedException { + return readWriterService.gunAndTIdNewReadList(); + } + + /** + * 大读写器和小读写器识别结合的结果TID列表 + */ + @GetMapping("/tIdAndMini/readList") + public ReturnDTO> allTidReadList() throws ExecutionException, InterruptedException { + return readWriterService.tIdAndMiniReadList(); + } +} diff --git a/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java b/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java new file mode 100644 index 0000000..89095aa --- /dev/null +++ b/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java @@ -0,0 +1,27 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.service.impl.BusinessReadWriterServiceImpl; +import com.casic.missiles.utils.SerialPortUtil; +import gnu.io.SerialPortEvent; +import gnu.io.SerialPortEventListener; + +import java.util.HashSet; +import java.util.Set; + +/** + * @Description: 设备串口接收数据监听器 + * @Author: wangpeng + * @Date: 2023/4/4 16:46 + */ +public class CodeGunDataListener implements SerialPortEventListener { + public static Set dataSet = new HashSet<>(); + + @Override + public void serialEvent(SerialPortEvent event) { + if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) { + SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil(); + byte[] bytes = serialPortUtil.readFromPort(BusinessReadWriterServiceImpl.serialPort); + dataSet.add(new String(bytes, 0, bytes.length).trim()); + } + } +} diff --git a/src/main/java/com/casic/missiles/model/ErrorResponseData.java b/src/main/java/com/casic/missiles/model/ErrorResponseData.java new file mode 100644 index 0000000..af437a5 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ErrorResponseData.java @@ -0,0 +1,26 @@ +package com.casic.missiles.model; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:07 + */ +public class ErrorResponseData extends ResponseData { + + /** + * 异常的具体类名称 + */ + private String exceptionClazz; + + public ErrorResponseData(String message) { + super(false, ResponseData.DEFAULT_ERROR_CODE, message, null); + } + + public ErrorResponseData(Integer code, String message) { + super(false, code, message, null); + } + + public ErrorResponseData(Integer code, String message, Object object) { + super(false, code, message, object); + } +} diff --git a/src/main/java/com/casic/missiles/model/ResponseData.java b/src/main/java/com/casic/missiles/model/ResponseData.java new file mode 100644 index 0000000..9e9c910 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ResponseData.java @@ -0,0 +1,73 @@ +package com.casic.missiles.model; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:06 + */ +@Data +public class ResponseData { + public static final String DEFAULT_SUCCESS_MESSAGE = "请求成功"; + + public static final String DEFAULT_ERROR_MESSAGE = "网络异常"; + + public static final Integer DEFAULT_SUCCESS_CODE = 200; + + public static final Integer DEFAULT_ERROR_CODE = 500; + + /** + * 请求是否成功 + */ + private Boolean success; + + /** + * 响应状态码 + */ + private Integer code; + + /** + * 响应信息 + */ + private String message; + + /** + * 响应对象 + */ + private Object data; + + public ResponseData() { + } + + public ResponseData(Boolean success, Integer code, String message, Object data) { + this.success = success; + this.code = code; + this.message = message; + this.data = data; + } + + public static SuccessResponseData success() { + return new SuccessResponseData(); + } + + public static SuccessResponseData success(Object object) { + return new SuccessResponseData(object); + } + + public static SuccessResponseData success(Integer code, String message, Object object) { + return new SuccessResponseData(code, message, object); + } + + public static ErrorResponseData error(String message) { + return new ErrorResponseData(message); + } + + public static ErrorResponseData error(Integer code, String message) { + return new ErrorResponseData(code, message); + } + + public static ErrorResponseData error(Integer code, String message, Object object) { + return new ErrorResponseData(code, message, object); + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..5287d96 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/../../../../:\code\casic-metering-readwriter\.idea/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..3c031c9 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..63e9001 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..9907c1d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..4b661a5 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..033c242 --- /dev/null +++ b/pom.xml @@ -0,0 +1,85 @@ + + + 4.0.0 + + com.casic.missiles + casic-metering-readwriter + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.4.5 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + + + + com.new.reader + reader-api + 1.0 + + + + + com.gg.reader + greader-api + 1.0 + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.0.2 + + + + **/*-*.yml + + + + com.casic.missiles.CasicApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.3.0 + + false + + src/main/build/package.xml + + + + + make-assembly + package + + single + + + + + + + + \ No newline at end of file diff --git a/src/main/build/bin/start.bat b/src/main/build/bin/start.bat new file mode 100644 index 0000000..f7270e6 --- /dev/null +++ b/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title casic-metering-readwriter-1.0-SNAPSHOT.jar +java -jar D:\metering\casic-metering-readwriter-1.0-SNAPSHOT\lib\casic-metering-readwriter-1.0-SNAPSHOT.jar +@pause diff --git a/src/main/build/bin/start.sh b/src/main/build/bin/start.sh new file mode 100644 index 0000000..c4722ff --- /dev/null +++ b/src/main/build/bin/start.sh @@ -0,0 +1 @@ +java -jar ./lib/casic-metering-readwriter-1.0-SNAPSHOT.jar \ No newline at end of file diff --git a/src/main/build/package.xml b/src/main/build/package.xml new file mode 100644 index 0000000..97bc675 --- /dev/null +++ b/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/src/main/java/com/casic/missiles/CasicApplication.java b/src/main/java/com/casic/missiles/CasicApplication.java new file mode 100644 index 0000000..36fdfee --- /dev/null +++ b/src/main/java/com/casic/missiles/CasicApplication.java @@ -0,0 +1,19 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @Description: SpringBoot启动类 + * @Author: wangpeng + * @Date: 2023/6/15 15:27 + */ +@Slf4j +@SpringBootApplication +public class CasicApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApplication.class,args); + log.info("CasicApplication is success!"); + } +} diff --git a/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java b/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java new file mode 100644 index 0000000..836c0bf --- /dev/null +++ b/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java @@ -0,0 +1,23 @@ +package com.casic.missiles.common; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:12 + */ +public interface AbstractBaseExceptionEnum { + /** + * 获取异常的状态码 + * + * @return 异常状态码 + */ + Integer getCode(); + + + /** + * 获取异常的提示信息 + * + * @return 异常提示消息 + */ + String getMessage(); +} diff --git a/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java b/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java new file mode 100644 index 0000000..75763c2 --- /dev/null +++ b/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java @@ -0,0 +1,110 @@ +package com.casic.missiles.common; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + TRAIN_STAFF_NULL(2400, "培训学员不能为空"), + TRAIN_LOG_ID_NULL(2400, "培训记录主键不能为空"), + ORGANIZE_ID_NULL(2400, "计量组织主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + EDUCATION_NOT_EXISTENCE(2300, "导入文化程度不存在;"), + TECHNOLOGY_JOB_NOT_EXISTENCE(2300, "导入技术职位不存在;"), + ADMINISTRATION_JOB_NOT_EXISTENCE(2300, "导入行政职务不存在;"), + DEPT_NOT_EXISTENCE(2300, "导入部门不存在;"), + SEX_NOT_CORRECT(2300, "性别填写有误(男,女);"), + MAIN_EXAMINER_NOT_CORRECT(2300, "是否主考人填写有误(是,否);"), + SPECIAL_OPERATOR_NOT_CORRECT(2300, "是否特操人填写有误(是,否);"), + TECHNOLOGY_EXAM_NOT_CORRECT(2300, "是否技术考核填写有误(是,否);"), + WORK_DATE_NOT_CORRECT(2300, "从事日期格式错误(2022-15-05);"), + BIRTHDAY_NOT_CORRECT(2300, "生日格式错误(2022-15-05);"), + CERTIFICATE_DATE_NOT_CORRECT(2300, "发证日期格式错误(2022-15-05);"), + VALID_DATE_NOT_CORRECT(2300, "有效日期格式错误(2022-15-05);"), + STAFF_NOT_EXISTENCE(2300, "人员编号不存在"), + CHECK_TYPE_NOT_EXISTENCE(2300, "校验类型不存在;"), + PRICE_TYPE_NOT_EXISTENCE(2300, "价格类别不存在;"), + PRICE_ITEM_NOT_EXISTENCE(2300, "项目不存在;"), + OPERATOR_DISCOUNT_PERMISSION_NOT_EXISTENCE(2300, "业务员折扣权限不存在;"), + DIRECTOR_DISCOUNT_PERMISSION_NOT_EXISTENCE(2300, "负责人折扣权限不存在;"), + TRACE_SUPPLIER_ID_NULL(2400, "培训记录主键不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + NOT_FOUND_USER_INFO(2402, "未找到用户信息"), + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRAIN_PLAN_SAVE_FAILED(2403, "培训计划保存至草稿箱失败"), + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + TRAIN_PLAN_SUBMIT_FAILED(2406, "培训计划提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java new file mode 100644 index 0000000..d54b93a --- /dev/null +++ b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java @@ -0,0 +1,74 @@ +package com.casic.missiles.cotroller; + +import com.casic.missiles.model.ReturnDTO; +import com.casic.missiles.service.IBusinessReadWriterService; +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.Set; +import java.util.concurrent.ExecutionException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:01 + */ +@Slf4j +@RestController +@RequestMapping("/business/readWriter") +public class BusinessReadWriterController { + @Autowired + private IBusinessReadWriterService readWriterService; + + /** + * 获取大读写器识别的标签TID列表 + * 大读写器 + * TCP连接,需配置和192.168.1.201一个段 + * 读取读写器获取标签TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @GetMapping("/tId/readList") + public ReturnDTO> tIdNewReadList() { + return readWriterService.tIdNewReadList(); + } + + /** + * 获取小读写器识别的标签TID列表 + * USB-HID连接(HID是一种USB通信协议,无需安装驱动就能进行交互) + * 读取读写器获取TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @GetMapping("/tId/mini/readList") + public ReturnDTO> tIdMiniReadList() { + return readWriterService.tIdMiniReadList(); + } + + /** + * 获取有线扫码枪识别列表(二维码) + * USB串口连接(模拟COM口),USB模拟串行通讯模式,连接后在设备管理器-端口(COM和LPT)可查看连接设备 + * 目前设置:扫码一次读取一个,扫码结果无回车 + * 二维码由样品编号/设备编号生成 + * 扫描收入、扫描检完等,以及大读写器的补充(包括新建委托书和待收入中使用) + */ + @GetMapping("/code/gun/readList") + public ReturnDTO> codeGunReadList() { + return readWriterService.codeGunReadList(); + } + + /** + * 有线扫码枪(二维码)和大读写器结合扫描 + */ + @GetMapping("/gunAndTId/readList") + public ReturnDTO> equipmentLabelReadList() throws ExecutionException, InterruptedException { + return readWriterService.gunAndTIdNewReadList(); + } + + /** + * 大读写器和小读写器识别结合的结果TID列表 + */ + @GetMapping("/tIdAndMini/readList") + public ReturnDTO> allTidReadList() throws ExecutionException, InterruptedException { + return readWriterService.tIdAndMiniReadList(); + } +} diff --git a/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java b/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java new file mode 100644 index 0000000..89095aa --- /dev/null +++ b/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java @@ -0,0 +1,27 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.service.impl.BusinessReadWriterServiceImpl; +import com.casic.missiles.utils.SerialPortUtil; +import gnu.io.SerialPortEvent; +import gnu.io.SerialPortEventListener; + +import java.util.HashSet; +import java.util.Set; + +/** + * @Description: 设备串口接收数据监听器 + * @Author: wangpeng + * @Date: 2023/4/4 16:46 + */ +public class CodeGunDataListener implements SerialPortEventListener { + public static Set dataSet = new HashSet<>(); + + @Override + public void serialEvent(SerialPortEvent event) { + if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) { + SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil(); + byte[] bytes = serialPortUtil.readFromPort(BusinessReadWriterServiceImpl.serialPort); + dataSet.add(new String(bytes, 0, bytes.length).trim()); + } + } +} diff --git a/src/main/java/com/casic/missiles/model/ErrorResponseData.java b/src/main/java/com/casic/missiles/model/ErrorResponseData.java new file mode 100644 index 0000000..af437a5 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ErrorResponseData.java @@ -0,0 +1,26 @@ +package com.casic.missiles.model; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:07 + */ +public class ErrorResponseData extends ResponseData { + + /** + * 异常的具体类名称 + */ + private String exceptionClazz; + + public ErrorResponseData(String message) { + super(false, ResponseData.DEFAULT_ERROR_CODE, message, null); + } + + public ErrorResponseData(Integer code, String message) { + super(false, code, message, null); + } + + public ErrorResponseData(Integer code, String message, Object object) { + super(false, code, message, object); + } +} diff --git a/src/main/java/com/casic/missiles/model/ResponseData.java b/src/main/java/com/casic/missiles/model/ResponseData.java new file mode 100644 index 0000000..9e9c910 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ResponseData.java @@ -0,0 +1,73 @@ +package com.casic.missiles.model; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:06 + */ +@Data +public class ResponseData { + public static final String DEFAULT_SUCCESS_MESSAGE = "请求成功"; + + public static final String DEFAULT_ERROR_MESSAGE = "网络异常"; + + public static final Integer DEFAULT_SUCCESS_CODE = 200; + + public static final Integer DEFAULT_ERROR_CODE = 500; + + /** + * 请求是否成功 + */ + private Boolean success; + + /** + * 响应状态码 + */ + private Integer code; + + /** + * 响应信息 + */ + private String message; + + /** + * 响应对象 + */ + private Object data; + + public ResponseData() { + } + + public ResponseData(Boolean success, Integer code, String message, Object data) { + this.success = success; + this.code = code; + this.message = message; + this.data = data; + } + + public static SuccessResponseData success() { + return new SuccessResponseData(); + } + + public static SuccessResponseData success(Object object) { + return new SuccessResponseData(object); + } + + public static SuccessResponseData success(Integer code, String message, Object object) { + return new SuccessResponseData(code, message, object); + } + + public static ErrorResponseData error(String message) { + return new ErrorResponseData(message); + } + + public static ErrorResponseData error(Integer code, String message) { + return new ErrorResponseData(code, message); + } + + public static ErrorResponseData error(Integer code, String message, Object object) { + return new ErrorResponseData(code, message, object); + } +} diff --git a/src/main/java/com/casic/missiles/model/ReturnDTO.java b/src/main/java/com/casic/missiles/model/ReturnDTO.java new file mode 100644 index 0000000..4c102f2 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ReturnDTO.java @@ -0,0 +1,31 @@ +package com.casic.missiles.model; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:05 + */ +@Data +public class ReturnDTO implements Serializable { + private Integer code; + private String message; + private T data; + + public ReturnDTO(Integer code, String message, T data) { + this.code = code; + this.message = message; + this.data = data; + } + + public ReturnDTO(Integer code, String message) { + this.code = code; + this.message = message; + } + + public ReturnDTO() { + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..5287d96 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/../../../../:\code\casic-metering-readwriter\.idea/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..3c031c9 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..63e9001 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..9907c1d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..4b661a5 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..033c242 --- /dev/null +++ b/pom.xml @@ -0,0 +1,85 @@ + + + 4.0.0 + + com.casic.missiles + casic-metering-readwriter + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.4.5 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + + + + com.new.reader + reader-api + 1.0 + + + + + com.gg.reader + greader-api + 1.0 + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.0.2 + + + + **/*-*.yml + + + + com.casic.missiles.CasicApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.3.0 + + false + + src/main/build/package.xml + + + + + make-assembly + package + + single + + + + + + + + \ No newline at end of file diff --git a/src/main/build/bin/start.bat b/src/main/build/bin/start.bat new file mode 100644 index 0000000..f7270e6 --- /dev/null +++ b/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title casic-metering-readwriter-1.0-SNAPSHOT.jar +java -jar D:\metering\casic-metering-readwriter-1.0-SNAPSHOT\lib\casic-metering-readwriter-1.0-SNAPSHOT.jar +@pause diff --git a/src/main/build/bin/start.sh b/src/main/build/bin/start.sh new file mode 100644 index 0000000..c4722ff --- /dev/null +++ b/src/main/build/bin/start.sh @@ -0,0 +1 @@ +java -jar ./lib/casic-metering-readwriter-1.0-SNAPSHOT.jar \ No newline at end of file diff --git a/src/main/build/package.xml b/src/main/build/package.xml new file mode 100644 index 0000000..97bc675 --- /dev/null +++ b/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/src/main/java/com/casic/missiles/CasicApplication.java b/src/main/java/com/casic/missiles/CasicApplication.java new file mode 100644 index 0000000..36fdfee --- /dev/null +++ b/src/main/java/com/casic/missiles/CasicApplication.java @@ -0,0 +1,19 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @Description: SpringBoot启动类 + * @Author: wangpeng + * @Date: 2023/6/15 15:27 + */ +@Slf4j +@SpringBootApplication +public class CasicApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApplication.class,args); + log.info("CasicApplication is success!"); + } +} diff --git a/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java b/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java new file mode 100644 index 0000000..836c0bf --- /dev/null +++ b/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java @@ -0,0 +1,23 @@ +package com.casic.missiles.common; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:12 + */ +public interface AbstractBaseExceptionEnum { + /** + * 获取异常的状态码 + * + * @return 异常状态码 + */ + Integer getCode(); + + + /** + * 获取异常的提示信息 + * + * @return 异常提示消息 + */ + String getMessage(); +} diff --git a/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java b/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java new file mode 100644 index 0000000..75763c2 --- /dev/null +++ b/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java @@ -0,0 +1,110 @@ +package com.casic.missiles.common; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + TRAIN_STAFF_NULL(2400, "培训学员不能为空"), + TRAIN_LOG_ID_NULL(2400, "培训记录主键不能为空"), + ORGANIZE_ID_NULL(2400, "计量组织主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + EDUCATION_NOT_EXISTENCE(2300, "导入文化程度不存在;"), + TECHNOLOGY_JOB_NOT_EXISTENCE(2300, "导入技术职位不存在;"), + ADMINISTRATION_JOB_NOT_EXISTENCE(2300, "导入行政职务不存在;"), + DEPT_NOT_EXISTENCE(2300, "导入部门不存在;"), + SEX_NOT_CORRECT(2300, "性别填写有误(男,女);"), + MAIN_EXAMINER_NOT_CORRECT(2300, "是否主考人填写有误(是,否);"), + SPECIAL_OPERATOR_NOT_CORRECT(2300, "是否特操人填写有误(是,否);"), + TECHNOLOGY_EXAM_NOT_CORRECT(2300, "是否技术考核填写有误(是,否);"), + WORK_DATE_NOT_CORRECT(2300, "从事日期格式错误(2022-15-05);"), + BIRTHDAY_NOT_CORRECT(2300, "生日格式错误(2022-15-05);"), + CERTIFICATE_DATE_NOT_CORRECT(2300, "发证日期格式错误(2022-15-05);"), + VALID_DATE_NOT_CORRECT(2300, "有效日期格式错误(2022-15-05);"), + STAFF_NOT_EXISTENCE(2300, "人员编号不存在"), + CHECK_TYPE_NOT_EXISTENCE(2300, "校验类型不存在;"), + PRICE_TYPE_NOT_EXISTENCE(2300, "价格类别不存在;"), + PRICE_ITEM_NOT_EXISTENCE(2300, "项目不存在;"), + OPERATOR_DISCOUNT_PERMISSION_NOT_EXISTENCE(2300, "业务员折扣权限不存在;"), + DIRECTOR_DISCOUNT_PERMISSION_NOT_EXISTENCE(2300, "负责人折扣权限不存在;"), + TRACE_SUPPLIER_ID_NULL(2400, "培训记录主键不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + NOT_FOUND_USER_INFO(2402, "未找到用户信息"), + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRAIN_PLAN_SAVE_FAILED(2403, "培训计划保存至草稿箱失败"), + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + TRAIN_PLAN_SUBMIT_FAILED(2406, "培训计划提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java new file mode 100644 index 0000000..d54b93a --- /dev/null +++ b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java @@ -0,0 +1,74 @@ +package com.casic.missiles.cotroller; + +import com.casic.missiles.model.ReturnDTO; +import com.casic.missiles.service.IBusinessReadWriterService; +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.Set; +import java.util.concurrent.ExecutionException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:01 + */ +@Slf4j +@RestController +@RequestMapping("/business/readWriter") +public class BusinessReadWriterController { + @Autowired + private IBusinessReadWriterService readWriterService; + + /** + * 获取大读写器识别的标签TID列表 + * 大读写器 + * TCP连接,需配置和192.168.1.201一个段 + * 读取读写器获取标签TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @GetMapping("/tId/readList") + public ReturnDTO> tIdNewReadList() { + return readWriterService.tIdNewReadList(); + } + + /** + * 获取小读写器识别的标签TID列表 + * USB-HID连接(HID是一种USB通信协议,无需安装驱动就能进行交互) + * 读取读写器获取TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @GetMapping("/tId/mini/readList") + public ReturnDTO> tIdMiniReadList() { + return readWriterService.tIdMiniReadList(); + } + + /** + * 获取有线扫码枪识别列表(二维码) + * USB串口连接(模拟COM口),USB模拟串行通讯模式,连接后在设备管理器-端口(COM和LPT)可查看连接设备 + * 目前设置:扫码一次读取一个,扫码结果无回车 + * 二维码由样品编号/设备编号生成 + * 扫描收入、扫描检完等,以及大读写器的补充(包括新建委托书和待收入中使用) + */ + @GetMapping("/code/gun/readList") + public ReturnDTO> codeGunReadList() { + return readWriterService.codeGunReadList(); + } + + /** + * 有线扫码枪(二维码)和大读写器结合扫描 + */ + @GetMapping("/gunAndTId/readList") + public ReturnDTO> equipmentLabelReadList() throws ExecutionException, InterruptedException { + return readWriterService.gunAndTIdNewReadList(); + } + + /** + * 大读写器和小读写器识别结合的结果TID列表 + */ + @GetMapping("/tIdAndMini/readList") + public ReturnDTO> allTidReadList() throws ExecutionException, InterruptedException { + return readWriterService.tIdAndMiniReadList(); + } +} diff --git a/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java b/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java new file mode 100644 index 0000000..89095aa --- /dev/null +++ b/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java @@ -0,0 +1,27 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.service.impl.BusinessReadWriterServiceImpl; +import com.casic.missiles.utils.SerialPortUtil; +import gnu.io.SerialPortEvent; +import gnu.io.SerialPortEventListener; + +import java.util.HashSet; +import java.util.Set; + +/** + * @Description: 设备串口接收数据监听器 + * @Author: wangpeng + * @Date: 2023/4/4 16:46 + */ +public class CodeGunDataListener implements SerialPortEventListener { + public static Set dataSet = new HashSet<>(); + + @Override + public void serialEvent(SerialPortEvent event) { + if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) { + SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil(); + byte[] bytes = serialPortUtil.readFromPort(BusinessReadWriterServiceImpl.serialPort); + dataSet.add(new String(bytes, 0, bytes.length).trim()); + } + } +} diff --git a/src/main/java/com/casic/missiles/model/ErrorResponseData.java b/src/main/java/com/casic/missiles/model/ErrorResponseData.java new file mode 100644 index 0000000..af437a5 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ErrorResponseData.java @@ -0,0 +1,26 @@ +package com.casic.missiles.model; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:07 + */ +public class ErrorResponseData extends ResponseData { + + /** + * 异常的具体类名称 + */ + private String exceptionClazz; + + public ErrorResponseData(String message) { + super(false, ResponseData.DEFAULT_ERROR_CODE, message, null); + } + + public ErrorResponseData(Integer code, String message) { + super(false, code, message, null); + } + + public ErrorResponseData(Integer code, String message, Object object) { + super(false, code, message, object); + } +} diff --git a/src/main/java/com/casic/missiles/model/ResponseData.java b/src/main/java/com/casic/missiles/model/ResponseData.java new file mode 100644 index 0000000..9e9c910 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ResponseData.java @@ -0,0 +1,73 @@ +package com.casic.missiles.model; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:06 + */ +@Data +public class ResponseData { + public static final String DEFAULT_SUCCESS_MESSAGE = "请求成功"; + + public static final String DEFAULT_ERROR_MESSAGE = "网络异常"; + + public static final Integer DEFAULT_SUCCESS_CODE = 200; + + public static final Integer DEFAULT_ERROR_CODE = 500; + + /** + * 请求是否成功 + */ + private Boolean success; + + /** + * 响应状态码 + */ + private Integer code; + + /** + * 响应信息 + */ + private String message; + + /** + * 响应对象 + */ + private Object data; + + public ResponseData() { + } + + public ResponseData(Boolean success, Integer code, String message, Object data) { + this.success = success; + this.code = code; + this.message = message; + this.data = data; + } + + public static SuccessResponseData success() { + return new SuccessResponseData(); + } + + public static SuccessResponseData success(Object object) { + return new SuccessResponseData(object); + } + + public static SuccessResponseData success(Integer code, String message, Object object) { + return new SuccessResponseData(code, message, object); + } + + public static ErrorResponseData error(String message) { + return new ErrorResponseData(message); + } + + public static ErrorResponseData error(Integer code, String message) { + return new ErrorResponseData(code, message); + } + + public static ErrorResponseData error(Integer code, String message, Object object) { + return new ErrorResponseData(code, message, object); + } +} diff --git a/src/main/java/com/casic/missiles/model/ReturnDTO.java b/src/main/java/com/casic/missiles/model/ReturnDTO.java new file mode 100644 index 0000000..4c102f2 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ReturnDTO.java @@ -0,0 +1,31 @@ +package com.casic.missiles.model; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:05 + */ +@Data +public class ReturnDTO implements Serializable { + private Integer code; + private String message; + private T data; + + public ReturnDTO(Integer code, String message, T data) { + this.code = code; + this.message = message; + this.data = data; + } + + public ReturnDTO(Integer code, String message) { + this.code = code; + this.message = message; + } + + public ReturnDTO() { + } +} diff --git a/src/main/java/com/casic/missiles/model/ReturnUtil.java b/src/main/java/com/casic/missiles/model/ReturnUtil.java new file mode 100644 index 0000000..c30a732 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ReturnUtil.java @@ -0,0 +1,36 @@ +package com.casic.missiles.model; + +/** + * @Description: for return + * @Author: wangpeng + * @Date: 2022/11/27 00:56 + */ +public class ReturnUtil { + public ReturnUtil() { + } + + public static ReturnDTO success() { + return new ReturnDTO(ResponseData.DEFAULT_SUCCESS_CODE, ResponseData.DEFAULT_SUCCESS_MESSAGE); + } + + public static ReturnDTO success(Object data) { + return new ReturnDTO(ResponseData.DEFAULT_SUCCESS_CODE, ResponseData.DEFAULT_SUCCESS_MESSAGE, data); + } + + public static ReturnDTO success(Integer code, String message) { + return new ReturnDTO(code, message); + } + + public static ReturnDTO failed() { + return new ReturnDTO(ResponseData.DEFAULT_ERROR_CODE, ResponseData.DEFAULT_ERROR_MESSAGE); + } + + public static ReturnDTO failed(String message) { + return new ReturnDTO(ResponseData.DEFAULT_ERROR_CODE, message); + } + + public static ReturnDTO failed(Integer code, String message) { + return new ReturnDTO(code, message); + } + +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..5287d96 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/../../../../:\code\casic-metering-readwriter\.idea/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..3c031c9 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..63e9001 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..9907c1d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..4b661a5 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..033c242 --- /dev/null +++ b/pom.xml @@ -0,0 +1,85 @@ + + + 4.0.0 + + com.casic.missiles + casic-metering-readwriter + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.4.5 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + + + + com.new.reader + reader-api + 1.0 + + + + + com.gg.reader + greader-api + 1.0 + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.0.2 + + + + **/*-*.yml + + + + com.casic.missiles.CasicApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.3.0 + + false + + src/main/build/package.xml + + + + + make-assembly + package + + single + + + + + + + + \ No newline at end of file diff --git a/src/main/build/bin/start.bat b/src/main/build/bin/start.bat new file mode 100644 index 0000000..f7270e6 --- /dev/null +++ b/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title casic-metering-readwriter-1.0-SNAPSHOT.jar +java -jar D:\metering\casic-metering-readwriter-1.0-SNAPSHOT\lib\casic-metering-readwriter-1.0-SNAPSHOT.jar +@pause diff --git a/src/main/build/bin/start.sh b/src/main/build/bin/start.sh new file mode 100644 index 0000000..c4722ff --- /dev/null +++ b/src/main/build/bin/start.sh @@ -0,0 +1 @@ +java -jar ./lib/casic-metering-readwriter-1.0-SNAPSHOT.jar \ No newline at end of file diff --git a/src/main/build/package.xml b/src/main/build/package.xml new file mode 100644 index 0000000..97bc675 --- /dev/null +++ b/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/src/main/java/com/casic/missiles/CasicApplication.java b/src/main/java/com/casic/missiles/CasicApplication.java new file mode 100644 index 0000000..36fdfee --- /dev/null +++ b/src/main/java/com/casic/missiles/CasicApplication.java @@ -0,0 +1,19 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @Description: SpringBoot启动类 + * @Author: wangpeng + * @Date: 2023/6/15 15:27 + */ +@Slf4j +@SpringBootApplication +public class CasicApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApplication.class,args); + log.info("CasicApplication is success!"); + } +} diff --git a/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java b/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java new file mode 100644 index 0000000..836c0bf --- /dev/null +++ b/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java @@ -0,0 +1,23 @@ +package com.casic.missiles.common; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:12 + */ +public interface AbstractBaseExceptionEnum { + /** + * 获取异常的状态码 + * + * @return 异常状态码 + */ + Integer getCode(); + + + /** + * 获取异常的提示信息 + * + * @return 异常提示消息 + */ + String getMessage(); +} diff --git a/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java b/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java new file mode 100644 index 0000000..75763c2 --- /dev/null +++ b/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java @@ -0,0 +1,110 @@ +package com.casic.missiles.common; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + TRAIN_STAFF_NULL(2400, "培训学员不能为空"), + TRAIN_LOG_ID_NULL(2400, "培训记录主键不能为空"), + ORGANIZE_ID_NULL(2400, "计量组织主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + EDUCATION_NOT_EXISTENCE(2300, "导入文化程度不存在;"), + TECHNOLOGY_JOB_NOT_EXISTENCE(2300, "导入技术职位不存在;"), + ADMINISTRATION_JOB_NOT_EXISTENCE(2300, "导入行政职务不存在;"), + DEPT_NOT_EXISTENCE(2300, "导入部门不存在;"), + SEX_NOT_CORRECT(2300, "性别填写有误(男,女);"), + MAIN_EXAMINER_NOT_CORRECT(2300, "是否主考人填写有误(是,否);"), + SPECIAL_OPERATOR_NOT_CORRECT(2300, "是否特操人填写有误(是,否);"), + TECHNOLOGY_EXAM_NOT_CORRECT(2300, "是否技术考核填写有误(是,否);"), + WORK_DATE_NOT_CORRECT(2300, "从事日期格式错误(2022-15-05);"), + BIRTHDAY_NOT_CORRECT(2300, "生日格式错误(2022-15-05);"), + CERTIFICATE_DATE_NOT_CORRECT(2300, "发证日期格式错误(2022-15-05);"), + VALID_DATE_NOT_CORRECT(2300, "有效日期格式错误(2022-15-05);"), + STAFF_NOT_EXISTENCE(2300, "人员编号不存在"), + CHECK_TYPE_NOT_EXISTENCE(2300, "校验类型不存在;"), + PRICE_TYPE_NOT_EXISTENCE(2300, "价格类别不存在;"), + PRICE_ITEM_NOT_EXISTENCE(2300, "项目不存在;"), + OPERATOR_DISCOUNT_PERMISSION_NOT_EXISTENCE(2300, "业务员折扣权限不存在;"), + DIRECTOR_DISCOUNT_PERMISSION_NOT_EXISTENCE(2300, "负责人折扣权限不存在;"), + TRACE_SUPPLIER_ID_NULL(2400, "培训记录主键不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + NOT_FOUND_USER_INFO(2402, "未找到用户信息"), + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRAIN_PLAN_SAVE_FAILED(2403, "培训计划保存至草稿箱失败"), + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + TRAIN_PLAN_SUBMIT_FAILED(2406, "培训计划提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java new file mode 100644 index 0000000..d54b93a --- /dev/null +++ b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java @@ -0,0 +1,74 @@ +package com.casic.missiles.cotroller; + +import com.casic.missiles.model.ReturnDTO; +import com.casic.missiles.service.IBusinessReadWriterService; +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.Set; +import java.util.concurrent.ExecutionException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:01 + */ +@Slf4j +@RestController +@RequestMapping("/business/readWriter") +public class BusinessReadWriterController { + @Autowired + private IBusinessReadWriterService readWriterService; + + /** + * 获取大读写器识别的标签TID列表 + * 大读写器 + * TCP连接,需配置和192.168.1.201一个段 + * 读取读写器获取标签TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @GetMapping("/tId/readList") + public ReturnDTO> tIdNewReadList() { + return readWriterService.tIdNewReadList(); + } + + /** + * 获取小读写器识别的标签TID列表 + * USB-HID连接(HID是一种USB通信协议,无需安装驱动就能进行交互) + * 读取读写器获取TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @GetMapping("/tId/mini/readList") + public ReturnDTO> tIdMiniReadList() { + return readWriterService.tIdMiniReadList(); + } + + /** + * 获取有线扫码枪识别列表(二维码) + * USB串口连接(模拟COM口),USB模拟串行通讯模式,连接后在设备管理器-端口(COM和LPT)可查看连接设备 + * 目前设置:扫码一次读取一个,扫码结果无回车 + * 二维码由样品编号/设备编号生成 + * 扫描收入、扫描检完等,以及大读写器的补充(包括新建委托书和待收入中使用) + */ + @GetMapping("/code/gun/readList") + public ReturnDTO> codeGunReadList() { + return readWriterService.codeGunReadList(); + } + + /** + * 有线扫码枪(二维码)和大读写器结合扫描 + */ + @GetMapping("/gunAndTId/readList") + public ReturnDTO> equipmentLabelReadList() throws ExecutionException, InterruptedException { + return readWriterService.gunAndTIdNewReadList(); + } + + /** + * 大读写器和小读写器识别结合的结果TID列表 + */ + @GetMapping("/tIdAndMini/readList") + public ReturnDTO> allTidReadList() throws ExecutionException, InterruptedException { + return readWriterService.tIdAndMiniReadList(); + } +} diff --git a/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java b/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java new file mode 100644 index 0000000..89095aa --- /dev/null +++ b/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java @@ -0,0 +1,27 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.service.impl.BusinessReadWriterServiceImpl; +import com.casic.missiles.utils.SerialPortUtil; +import gnu.io.SerialPortEvent; +import gnu.io.SerialPortEventListener; + +import java.util.HashSet; +import java.util.Set; + +/** + * @Description: 设备串口接收数据监听器 + * @Author: wangpeng + * @Date: 2023/4/4 16:46 + */ +public class CodeGunDataListener implements SerialPortEventListener { + public static Set dataSet = new HashSet<>(); + + @Override + public void serialEvent(SerialPortEvent event) { + if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) { + SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil(); + byte[] bytes = serialPortUtil.readFromPort(BusinessReadWriterServiceImpl.serialPort); + dataSet.add(new String(bytes, 0, bytes.length).trim()); + } + } +} diff --git a/src/main/java/com/casic/missiles/model/ErrorResponseData.java b/src/main/java/com/casic/missiles/model/ErrorResponseData.java new file mode 100644 index 0000000..af437a5 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ErrorResponseData.java @@ -0,0 +1,26 @@ +package com.casic.missiles.model; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:07 + */ +public class ErrorResponseData extends ResponseData { + + /** + * 异常的具体类名称 + */ + private String exceptionClazz; + + public ErrorResponseData(String message) { + super(false, ResponseData.DEFAULT_ERROR_CODE, message, null); + } + + public ErrorResponseData(Integer code, String message) { + super(false, code, message, null); + } + + public ErrorResponseData(Integer code, String message, Object object) { + super(false, code, message, object); + } +} diff --git a/src/main/java/com/casic/missiles/model/ResponseData.java b/src/main/java/com/casic/missiles/model/ResponseData.java new file mode 100644 index 0000000..9e9c910 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ResponseData.java @@ -0,0 +1,73 @@ +package com.casic.missiles.model; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:06 + */ +@Data +public class ResponseData { + public static final String DEFAULT_SUCCESS_MESSAGE = "请求成功"; + + public static final String DEFAULT_ERROR_MESSAGE = "网络异常"; + + public static final Integer DEFAULT_SUCCESS_CODE = 200; + + public static final Integer DEFAULT_ERROR_CODE = 500; + + /** + * 请求是否成功 + */ + private Boolean success; + + /** + * 响应状态码 + */ + private Integer code; + + /** + * 响应信息 + */ + private String message; + + /** + * 响应对象 + */ + private Object data; + + public ResponseData() { + } + + public ResponseData(Boolean success, Integer code, String message, Object data) { + this.success = success; + this.code = code; + this.message = message; + this.data = data; + } + + public static SuccessResponseData success() { + return new SuccessResponseData(); + } + + public static SuccessResponseData success(Object object) { + return new SuccessResponseData(object); + } + + public static SuccessResponseData success(Integer code, String message, Object object) { + return new SuccessResponseData(code, message, object); + } + + public static ErrorResponseData error(String message) { + return new ErrorResponseData(message); + } + + public static ErrorResponseData error(Integer code, String message) { + return new ErrorResponseData(code, message); + } + + public static ErrorResponseData error(Integer code, String message, Object object) { + return new ErrorResponseData(code, message, object); + } +} diff --git a/src/main/java/com/casic/missiles/model/ReturnDTO.java b/src/main/java/com/casic/missiles/model/ReturnDTO.java new file mode 100644 index 0000000..4c102f2 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ReturnDTO.java @@ -0,0 +1,31 @@ +package com.casic.missiles.model; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:05 + */ +@Data +public class ReturnDTO implements Serializable { + private Integer code; + private String message; + private T data; + + public ReturnDTO(Integer code, String message, T data) { + this.code = code; + this.message = message; + this.data = data; + } + + public ReturnDTO(Integer code, String message) { + this.code = code; + this.message = message; + } + + public ReturnDTO() { + } +} diff --git a/src/main/java/com/casic/missiles/model/ReturnUtil.java b/src/main/java/com/casic/missiles/model/ReturnUtil.java new file mode 100644 index 0000000..c30a732 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ReturnUtil.java @@ -0,0 +1,36 @@ +package com.casic.missiles.model; + +/** + * @Description: for return + * @Author: wangpeng + * @Date: 2022/11/27 00:56 + */ +public class ReturnUtil { + public ReturnUtil() { + } + + public static ReturnDTO success() { + return new ReturnDTO(ResponseData.DEFAULT_SUCCESS_CODE, ResponseData.DEFAULT_SUCCESS_MESSAGE); + } + + public static ReturnDTO success(Object data) { + return new ReturnDTO(ResponseData.DEFAULT_SUCCESS_CODE, ResponseData.DEFAULT_SUCCESS_MESSAGE, data); + } + + public static ReturnDTO success(Integer code, String message) { + return new ReturnDTO(code, message); + } + + public static ReturnDTO failed() { + return new ReturnDTO(ResponseData.DEFAULT_ERROR_CODE, ResponseData.DEFAULT_ERROR_MESSAGE); + } + + public static ReturnDTO failed(String message) { + return new ReturnDTO(ResponseData.DEFAULT_ERROR_CODE, message); + } + + public static ReturnDTO failed(Integer code, String message) { + return new ReturnDTO(code, message); + } + +} diff --git a/src/main/java/com/casic/missiles/model/SuccessResponseData.java b/src/main/java/com/casic/missiles/model/SuccessResponseData.java new file mode 100644 index 0000000..a54debe --- /dev/null +++ b/src/main/java/com/casic/missiles/model/SuccessResponseData.java @@ -0,0 +1,21 @@ +package com.casic.missiles.model; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:07 + */ +public class SuccessResponseData extends ResponseData { + + public SuccessResponseData() { + super(true, DEFAULT_SUCCESS_CODE, DEFAULT_SUCCESS_MESSAGE, null); + } + + public SuccessResponseData(Object object) { + super(true, DEFAULT_SUCCESS_CODE, DEFAULT_SUCCESS_MESSAGE, object); + } + + public SuccessResponseData(Integer code, String message, Object object) { + super(true, code, message, object); + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..5287d96 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/../../../../:\code\casic-metering-readwriter\.idea/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..3c031c9 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..63e9001 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..9907c1d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..4b661a5 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..033c242 --- /dev/null +++ b/pom.xml @@ -0,0 +1,85 @@ + + + 4.0.0 + + com.casic.missiles + casic-metering-readwriter + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.4.5 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + + + + com.new.reader + reader-api + 1.0 + + + + + com.gg.reader + greader-api + 1.0 + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.0.2 + + + + **/*-*.yml + + + + com.casic.missiles.CasicApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.3.0 + + false + + src/main/build/package.xml + + + + + make-assembly + package + + single + + + + + + + + \ No newline at end of file diff --git a/src/main/build/bin/start.bat b/src/main/build/bin/start.bat new file mode 100644 index 0000000..f7270e6 --- /dev/null +++ b/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title casic-metering-readwriter-1.0-SNAPSHOT.jar +java -jar D:\metering\casic-metering-readwriter-1.0-SNAPSHOT\lib\casic-metering-readwriter-1.0-SNAPSHOT.jar +@pause diff --git a/src/main/build/bin/start.sh b/src/main/build/bin/start.sh new file mode 100644 index 0000000..c4722ff --- /dev/null +++ b/src/main/build/bin/start.sh @@ -0,0 +1 @@ +java -jar ./lib/casic-metering-readwriter-1.0-SNAPSHOT.jar \ No newline at end of file diff --git a/src/main/build/package.xml b/src/main/build/package.xml new file mode 100644 index 0000000..97bc675 --- /dev/null +++ b/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/src/main/java/com/casic/missiles/CasicApplication.java b/src/main/java/com/casic/missiles/CasicApplication.java new file mode 100644 index 0000000..36fdfee --- /dev/null +++ b/src/main/java/com/casic/missiles/CasicApplication.java @@ -0,0 +1,19 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @Description: SpringBoot启动类 + * @Author: wangpeng + * @Date: 2023/6/15 15:27 + */ +@Slf4j +@SpringBootApplication +public class CasicApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApplication.class,args); + log.info("CasicApplication is success!"); + } +} diff --git a/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java b/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java new file mode 100644 index 0000000..836c0bf --- /dev/null +++ b/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java @@ -0,0 +1,23 @@ +package com.casic.missiles.common; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:12 + */ +public interface AbstractBaseExceptionEnum { + /** + * 获取异常的状态码 + * + * @return 异常状态码 + */ + Integer getCode(); + + + /** + * 获取异常的提示信息 + * + * @return 异常提示消息 + */ + String getMessage(); +} diff --git a/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java b/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java new file mode 100644 index 0000000..75763c2 --- /dev/null +++ b/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java @@ -0,0 +1,110 @@ +package com.casic.missiles.common; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + TRAIN_STAFF_NULL(2400, "培训学员不能为空"), + TRAIN_LOG_ID_NULL(2400, "培训记录主键不能为空"), + ORGANIZE_ID_NULL(2400, "计量组织主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + EDUCATION_NOT_EXISTENCE(2300, "导入文化程度不存在;"), + TECHNOLOGY_JOB_NOT_EXISTENCE(2300, "导入技术职位不存在;"), + ADMINISTRATION_JOB_NOT_EXISTENCE(2300, "导入行政职务不存在;"), + DEPT_NOT_EXISTENCE(2300, "导入部门不存在;"), + SEX_NOT_CORRECT(2300, "性别填写有误(男,女);"), + MAIN_EXAMINER_NOT_CORRECT(2300, "是否主考人填写有误(是,否);"), + SPECIAL_OPERATOR_NOT_CORRECT(2300, "是否特操人填写有误(是,否);"), + TECHNOLOGY_EXAM_NOT_CORRECT(2300, "是否技术考核填写有误(是,否);"), + WORK_DATE_NOT_CORRECT(2300, "从事日期格式错误(2022-15-05);"), + BIRTHDAY_NOT_CORRECT(2300, "生日格式错误(2022-15-05);"), + CERTIFICATE_DATE_NOT_CORRECT(2300, "发证日期格式错误(2022-15-05);"), + VALID_DATE_NOT_CORRECT(2300, "有效日期格式错误(2022-15-05);"), + STAFF_NOT_EXISTENCE(2300, "人员编号不存在"), + CHECK_TYPE_NOT_EXISTENCE(2300, "校验类型不存在;"), + PRICE_TYPE_NOT_EXISTENCE(2300, "价格类别不存在;"), + PRICE_ITEM_NOT_EXISTENCE(2300, "项目不存在;"), + OPERATOR_DISCOUNT_PERMISSION_NOT_EXISTENCE(2300, "业务员折扣权限不存在;"), + DIRECTOR_DISCOUNT_PERMISSION_NOT_EXISTENCE(2300, "负责人折扣权限不存在;"), + TRACE_SUPPLIER_ID_NULL(2400, "培训记录主键不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + NOT_FOUND_USER_INFO(2402, "未找到用户信息"), + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRAIN_PLAN_SAVE_FAILED(2403, "培训计划保存至草稿箱失败"), + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + TRAIN_PLAN_SUBMIT_FAILED(2406, "培训计划提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java new file mode 100644 index 0000000..d54b93a --- /dev/null +++ b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java @@ -0,0 +1,74 @@ +package com.casic.missiles.cotroller; + +import com.casic.missiles.model.ReturnDTO; +import com.casic.missiles.service.IBusinessReadWriterService; +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.Set; +import java.util.concurrent.ExecutionException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:01 + */ +@Slf4j +@RestController +@RequestMapping("/business/readWriter") +public class BusinessReadWriterController { + @Autowired + private IBusinessReadWriterService readWriterService; + + /** + * 获取大读写器识别的标签TID列表 + * 大读写器 + * TCP连接,需配置和192.168.1.201一个段 + * 读取读写器获取标签TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @GetMapping("/tId/readList") + public ReturnDTO> tIdNewReadList() { + return readWriterService.tIdNewReadList(); + } + + /** + * 获取小读写器识别的标签TID列表 + * USB-HID连接(HID是一种USB通信协议,无需安装驱动就能进行交互) + * 读取读写器获取TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @GetMapping("/tId/mini/readList") + public ReturnDTO> tIdMiniReadList() { + return readWriterService.tIdMiniReadList(); + } + + /** + * 获取有线扫码枪识别列表(二维码) + * USB串口连接(模拟COM口),USB模拟串行通讯模式,连接后在设备管理器-端口(COM和LPT)可查看连接设备 + * 目前设置:扫码一次读取一个,扫码结果无回车 + * 二维码由样品编号/设备编号生成 + * 扫描收入、扫描检完等,以及大读写器的补充(包括新建委托书和待收入中使用) + */ + @GetMapping("/code/gun/readList") + public ReturnDTO> codeGunReadList() { + return readWriterService.codeGunReadList(); + } + + /** + * 有线扫码枪(二维码)和大读写器结合扫描 + */ + @GetMapping("/gunAndTId/readList") + public ReturnDTO> equipmentLabelReadList() throws ExecutionException, InterruptedException { + return readWriterService.gunAndTIdNewReadList(); + } + + /** + * 大读写器和小读写器识别结合的结果TID列表 + */ + @GetMapping("/tIdAndMini/readList") + public ReturnDTO> allTidReadList() throws ExecutionException, InterruptedException { + return readWriterService.tIdAndMiniReadList(); + } +} diff --git a/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java b/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java new file mode 100644 index 0000000..89095aa --- /dev/null +++ b/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java @@ -0,0 +1,27 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.service.impl.BusinessReadWriterServiceImpl; +import com.casic.missiles.utils.SerialPortUtil; +import gnu.io.SerialPortEvent; +import gnu.io.SerialPortEventListener; + +import java.util.HashSet; +import java.util.Set; + +/** + * @Description: 设备串口接收数据监听器 + * @Author: wangpeng + * @Date: 2023/4/4 16:46 + */ +public class CodeGunDataListener implements SerialPortEventListener { + public static Set dataSet = new HashSet<>(); + + @Override + public void serialEvent(SerialPortEvent event) { + if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) { + SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil(); + byte[] bytes = serialPortUtil.readFromPort(BusinessReadWriterServiceImpl.serialPort); + dataSet.add(new String(bytes, 0, bytes.length).trim()); + } + } +} diff --git a/src/main/java/com/casic/missiles/model/ErrorResponseData.java b/src/main/java/com/casic/missiles/model/ErrorResponseData.java new file mode 100644 index 0000000..af437a5 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ErrorResponseData.java @@ -0,0 +1,26 @@ +package com.casic.missiles.model; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:07 + */ +public class ErrorResponseData extends ResponseData { + + /** + * 异常的具体类名称 + */ + private String exceptionClazz; + + public ErrorResponseData(String message) { + super(false, ResponseData.DEFAULT_ERROR_CODE, message, null); + } + + public ErrorResponseData(Integer code, String message) { + super(false, code, message, null); + } + + public ErrorResponseData(Integer code, String message, Object object) { + super(false, code, message, object); + } +} diff --git a/src/main/java/com/casic/missiles/model/ResponseData.java b/src/main/java/com/casic/missiles/model/ResponseData.java new file mode 100644 index 0000000..9e9c910 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ResponseData.java @@ -0,0 +1,73 @@ +package com.casic.missiles.model; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:06 + */ +@Data +public class ResponseData { + public static final String DEFAULT_SUCCESS_MESSAGE = "请求成功"; + + public static final String DEFAULT_ERROR_MESSAGE = "网络异常"; + + public static final Integer DEFAULT_SUCCESS_CODE = 200; + + public static final Integer DEFAULT_ERROR_CODE = 500; + + /** + * 请求是否成功 + */ + private Boolean success; + + /** + * 响应状态码 + */ + private Integer code; + + /** + * 响应信息 + */ + private String message; + + /** + * 响应对象 + */ + private Object data; + + public ResponseData() { + } + + public ResponseData(Boolean success, Integer code, String message, Object data) { + this.success = success; + this.code = code; + this.message = message; + this.data = data; + } + + public static SuccessResponseData success() { + return new SuccessResponseData(); + } + + public static SuccessResponseData success(Object object) { + return new SuccessResponseData(object); + } + + public static SuccessResponseData success(Integer code, String message, Object object) { + return new SuccessResponseData(code, message, object); + } + + public static ErrorResponseData error(String message) { + return new ErrorResponseData(message); + } + + public static ErrorResponseData error(Integer code, String message) { + return new ErrorResponseData(code, message); + } + + public static ErrorResponseData error(Integer code, String message, Object object) { + return new ErrorResponseData(code, message, object); + } +} diff --git a/src/main/java/com/casic/missiles/model/ReturnDTO.java b/src/main/java/com/casic/missiles/model/ReturnDTO.java new file mode 100644 index 0000000..4c102f2 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ReturnDTO.java @@ -0,0 +1,31 @@ +package com.casic.missiles.model; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:05 + */ +@Data +public class ReturnDTO implements Serializable { + private Integer code; + private String message; + private T data; + + public ReturnDTO(Integer code, String message, T data) { + this.code = code; + this.message = message; + this.data = data; + } + + public ReturnDTO(Integer code, String message) { + this.code = code; + this.message = message; + } + + public ReturnDTO() { + } +} diff --git a/src/main/java/com/casic/missiles/model/ReturnUtil.java b/src/main/java/com/casic/missiles/model/ReturnUtil.java new file mode 100644 index 0000000..c30a732 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ReturnUtil.java @@ -0,0 +1,36 @@ +package com.casic.missiles.model; + +/** + * @Description: for return + * @Author: wangpeng + * @Date: 2022/11/27 00:56 + */ +public class ReturnUtil { + public ReturnUtil() { + } + + public static ReturnDTO success() { + return new ReturnDTO(ResponseData.DEFAULT_SUCCESS_CODE, ResponseData.DEFAULT_SUCCESS_MESSAGE); + } + + public static ReturnDTO success(Object data) { + return new ReturnDTO(ResponseData.DEFAULT_SUCCESS_CODE, ResponseData.DEFAULT_SUCCESS_MESSAGE, data); + } + + public static ReturnDTO success(Integer code, String message) { + return new ReturnDTO(code, message); + } + + public static ReturnDTO failed() { + return new ReturnDTO(ResponseData.DEFAULT_ERROR_CODE, ResponseData.DEFAULT_ERROR_MESSAGE); + } + + public static ReturnDTO failed(String message) { + return new ReturnDTO(ResponseData.DEFAULT_ERROR_CODE, message); + } + + public static ReturnDTO failed(Integer code, String message) { + return new ReturnDTO(code, message); + } + +} diff --git a/src/main/java/com/casic/missiles/model/SuccessResponseData.java b/src/main/java/com/casic/missiles/model/SuccessResponseData.java new file mode 100644 index 0000000..a54debe --- /dev/null +++ b/src/main/java/com/casic/missiles/model/SuccessResponseData.java @@ -0,0 +1,21 @@ +package com.casic.missiles.model; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:07 + */ +public class SuccessResponseData extends ResponseData { + + public SuccessResponseData() { + super(true, DEFAULT_SUCCESS_CODE, DEFAULT_SUCCESS_MESSAGE, null); + } + + public SuccessResponseData(Object object) { + super(true, DEFAULT_SUCCESS_CODE, DEFAULT_SUCCESS_MESSAGE, object); + } + + public SuccessResponseData(Integer code, String message, Object object) { + super(true, code, message, object); + } +} diff --git a/src/main/java/com/casic/missiles/service/IBusinessReadWriterService.java b/src/main/java/com/casic/missiles/service/IBusinessReadWriterService.java new file mode 100644 index 0000000..745a727 --- /dev/null +++ b/src/main/java/com/casic/missiles/service/IBusinessReadWriterService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.service; + +import com.casic.missiles.model.ReturnDTO; + +import java.util.Set; +import java.util.concurrent.ExecutionException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:02 + */ +public interface IBusinessReadWriterService { + ReturnDTO> tIdNewReadList(); + + ReturnDTO> tIdMiniReadList(); + + ReturnDTO> codeGunReadList(); + + ReturnDTO> gunAndTIdNewReadList() throws ExecutionException, InterruptedException; + + ReturnDTO> tIdAndMiniReadList() throws ExecutionException, InterruptedException; +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..5287d96 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/../../../../:\code\casic-metering-readwriter\.idea/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..3c031c9 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..63e9001 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..9907c1d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..4b661a5 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..033c242 --- /dev/null +++ b/pom.xml @@ -0,0 +1,85 @@ + + + 4.0.0 + + com.casic.missiles + casic-metering-readwriter + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.4.5 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + + + + com.new.reader + reader-api + 1.0 + + + + + com.gg.reader + greader-api + 1.0 + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.0.2 + + + + **/*-*.yml + + + + com.casic.missiles.CasicApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.3.0 + + false + + src/main/build/package.xml + + + + + make-assembly + package + + single + + + + + + + + \ No newline at end of file diff --git a/src/main/build/bin/start.bat b/src/main/build/bin/start.bat new file mode 100644 index 0000000..f7270e6 --- /dev/null +++ b/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title casic-metering-readwriter-1.0-SNAPSHOT.jar +java -jar D:\metering\casic-metering-readwriter-1.0-SNAPSHOT\lib\casic-metering-readwriter-1.0-SNAPSHOT.jar +@pause diff --git a/src/main/build/bin/start.sh b/src/main/build/bin/start.sh new file mode 100644 index 0000000..c4722ff --- /dev/null +++ b/src/main/build/bin/start.sh @@ -0,0 +1 @@ +java -jar ./lib/casic-metering-readwriter-1.0-SNAPSHOT.jar \ No newline at end of file diff --git a/src/main/build/package.xml b/src/main/build/package.xml new file mode 100644 index 0000000..97bc675 --- /dev/null +++ b/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/src/main/java/com/casic/missiles/CasicApplication.java b/src/main/java/com/casic/missiles/CasicApplication.java new file mode 100644 index 0000000..36fdfee --- /dev/null +++ b/src/main/java/com/casic/missiles/CasicApplication.java @@ -0,0 +1,19 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @Description: SpringBoot启动类 + * @Author: wangpeng + * @Date: 2023/6/15 15:27 + */ +@Slf4j +@SpringBootApplication +public class CasicApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApplication.class,args); + log.info("CasicApplication is success!"); + } +} diff --git a/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java b/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java new file mode 100644 index 0000000..836c0bf --- /dev/null +++ b/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java @@ -0,0 +1,23 @@ +package com.casic.missiles.common; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:12 + */ +public interface AbstractBaseExceptionEnum { + /** + * 获取异常的状态码 + * + * @return 异常状态码 + */ + Integer getCode(); + + + /** + * 获取异常的提示信息 + * + * @return 异常提示消息 + */ + String getMessage(); +} diff --git a/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java b/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java new file mode 100644 index 0000000..75763c2 --- /dev/null +++ b/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java @@ -0,0 +1,110 @@ +package com.casic.missiles.common; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + TRAIN_STAFF_NULL(2400, "培训学员不能为空"), + TRAIN_LOG_ID_NULL(2400, "培训记录主键不能为空"), + ORGANIZE_ID_NULL(2400, "计量组织主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + EDUCATION_NOT_EXISTENCE(2300, "导入文化程度不存在;"), + TECHNOLOGY_JOB_NOT_EXISTENCE(2300, "导入技术职位不存在;"), + ADMINISTRATION_JOB_NOT_EXISTENCE(2300, "导入行政职务不存在;"), + DEPT_NOT_EXISTENCE(2300, "导入部门不存在;"), + SEX_NOT_CORRECT(2300, "性别填写有误(男,女);"), + MAIN_EXAMINER_NOT_CORRECT(2300, "是否主考人填写有误(是,否);"), + SPECIAL_OPERATOR_NOT_CORRECT(2300, "是否特操人填写有误(是,否);"), + TECHNOLOGY_EXAM_NOT_CORRECT(2300, "是否技术考核填写有误(是,否);"), + WORK_DATE_NOT_CORRECT(2300, "从事日期格式错误(2022-15-05);"), + BIRTHDAY_NOT_CORRECT(2300, "生日格式错误(2022-15-05);"), + CERTIFICATE_DATE_NOT_CORRECT(2300, "发证日期格式错误(2022-15-05);"), + VALID_DATE_NOT_CORRECT(2300, "有效日期格式错误(2022-15-05);"), + STAFF_NOT_EXISTENCE(2300, "人员编号不存在"), + CHECK_TYPE_NOT_EXISTENCE(2300, "校验类型不存在;"), + PRICE_TYPE_NOT_EXISTENCE(2300, "价格类别不存在;"), + PRICE_ITEM_NOT_EXISTENCE(2300, "项目不存在;"), + OPERATOR_DISCOUNT_PERMISSION_NOT_EXISTENCE(2300, "业务员折扣权限不存在;"), + DIRECTOR_DISCOUNT_PERMISSION_NOT_EXISTENCE(2300, "负责人折扣权限不存在;"), + TRACE_SUPPLIER_ID_NULL(2400, "培训记录主键不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + NOT_FOUND_USER_INFO(2402, "未找到用户信息"), + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRAIN_PLAN_SAVE_FAILED(2403, "培训计划保存至草稿箱失败"), + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + TRAIN_PLAN_SUBMIT_FAILED(2406, "培训计划提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java new file mode 100644 index 0000000..d54b93a --- /dev/null +++ b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java @@ -0,0 +1,74 @@ +package com.casic.missiles.cotroller; + +import com.casic.missiles.model.ReturnDTO; +import com.casic.missiles.service.IBusinessReadWriterService; +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.Set; +import java.util.concurrent.ExecutionException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:01 + */ +@Slf4j +@RestController +@RequestMapping("/business/readWriter") +public class BusinessReadWriterController { + @Autowired + private IBusinessReadWriterService readWriterService; + + /** + * 获取大读写器识别的标签TID列表 + * 大读写器 + * TCP连接,需配置和192.168.1.201一个段 + * 读取读写器获取标签TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @GetMapping("/tId/readList") + public ReturnDTO> tIdNewReadList() { + return readWriterService.tIdNewReadList(); + } + + /** + * 获取小读写器识别的标签TID列表 + * USB-HID连接(HID是一种USB通信协议,无需安装驱动就能进行交互) + * 读取读写器获取TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @GetMapping("/tId/mini/readList") + public ReturnDTO> tIdMiniReadList() { + return readWriterService.tIdMiniReadList(); + } + + /** + * 获取有线扫码枪识别列表(二维码) + * USB串口连接(模拟COM口),USB模拟串行通讯模式,连接后在设备管理器-端口(COM和LPT)可查看连接设备 + * 目前设置:扫码一次读取一个,扫码结果无回车 + * 二维码由样品编号/设备编号生成 + * 扫描收入、扫描检完等,以及大读写器的补充(包括新建委托书和待收入中使用) + */ + @GetMapping("/code/gun/readList") + public ReturnDTO> codeGunReadList() { + return readWriterService.codeGunReadList(); + } + + /** + * 有线扫码枪(二维码)和大读写器结合扫描 + */ + @GetMapping("/gunAndTId/readList") + public ReturnDTO> equipmentLabelReadList() throws ExecutionException, InterruptedException { + return readWriterService.gunAndTIdNewReadList(); + } + + /** + * 大读写器和小读写器识别结合的结果TID列表 + */ + @GetMapping("/tIdAndMini/readList") + public ReturnDTO> allTidReadList() throws ExecutionException, InterruptedException { + return readWriterService.tIdAndMiniReadList(); + } +} diff --git a/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java b/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java new file mode 100644 index 0000000..89095aa --- /dev/null +++ b/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java @@ -0,0 +1,27 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.service.impl.BusinessReadWriterServiceImpl; +import com.casic.missiles.utils.SerialPortUtil; +import gnu.io.SerialPortEvent; +import gnu.io.SerialPortEventListener; + +import java.util.HashSet; +import java.util.Set; + +/** + * @Description: 设备串口接收数据监听器 + * @Author: wangpeng + * @Date: 2023/4/4 16:46 + */ +public class CodeGunDataListener implements SerialPortEventListener { + public static Set dataSet = new HashSet<>(); + + @Override + public void serialEvent(SerialPortEvent event) { + if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) { + SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil(); + byte[] bytes = serialPortUtil.readFromPort(BusinessReadWriterServiceImpl.serialPort); + dataSet.add(new String(bytes, 0, bytes.length).trim()); + } + } +} diff --git a/src/main/java/com/casic/missiles/model/ErrorResponseData.java b/src/main/java/com/casic/missiles/model/ErrorResponseData.java new file mode 100644 index 0000000..af437a5 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ErrorResponseData.java @@ -0,0 +1,26 @@ +package com.casic.missiles.model; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:07 + */ +public class ErrorResponseData extends ResponseData { + + /** + * 异常的具体类名称 + */ + private String exceptionClazz; + + public ErrorResponseData(String message) { + super(false, ResponseData.DEFAULT_ERROR_CODE, message, null); + } + + public ErrorResponseData(Integer code, String message) { + super(false, code, message, null); + } + + public ErrorResponseData(Integer code, String message, Object object) { + super(false, code, message, object); + } +} diff --git a/src/main/java/com/casic/missiles/model/ResponseData.java b/src/main/java/com/casic/missiles/model/ResponseData.java new file mode 100644 index 0000000..9e9c910 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ResponseData.java @@ -0,0 +1,73 @@ +package com.casic.missiles.model; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:06 + */ +@Data +public class ResponseData { + public static final String DEFAULT_SUCCESS_MESSAGE = "请求成功"; + + public static final String DEFAULT_ERROR_MESSAGE = "网络异常"; + + public static final Integer DEFAULT_SUCCESS_CODE = 200; + + public static final Integer DEFAULT_ERROR_CODE = 500; + + /** + * 请求是否成功 + */ + private Boolean success; + + /** + * 响应状态码 + */ + private Integer code; + + /** + * 响应信息 + */ + private String message; + + /** + * 响应对象 + */ + private Object data; + + public ResponseData() { + } + + public ResponseData(Boolean success, Integer code, String message, Object data) { + this.success = success; + this.code = code; + this.message = message; + this.data = data; + } + + public static SuccessResponseData success() { + return new SuccessResponseData(); + } + + public static SuccessResponseData success(Object object) { + return new SuccessResponseData(object); + } + + public static SuccessResponseData success(Integer code, String message, Object object) { + return new SuccessResponseData(code, message, object); + } + + public static ErrorResponseData error(String message) { + return new ErrorResponseData(message); + } + + public static ErrorResponseData error(Integer code, String message) { + return new ErrorResponseData(code, message); + } + + public static ErrorResponseData error(Integer code, String message, Object object) { + return new ErrorResponseData(code, message, object); + } +} diff --git a/src/main/java/com/casic/missiles/model/ReturnDTO.java b/src/main/java/com/casic/missiles/model/ReturnDTO.java new file mode 100644 index 0000000..4c102f2 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ReturnDTO.java @@ -0,0 +1,31 @@ +package com.casic.missiles.model; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:05 + */ +@Data +public class ReturnDTO implements Serializable { + private Integer code; + private String message; + private T data; + + public ReturnDTO(Integer code, String message, T data) { + this.code = code; + this.message = message; + this.data = data; + } + + public ReturnDTO(Integer code, String message) { + this.code = code; + this.message = message; + } + + public ReturnDTO() { + } +} diff --git a/src/main/java/com/casic/missiles/model/ReturnUtil.java b/src/main/java/com/casic/missiles/model/ReturnUtil.java new file mode 100644 index 0000000..c30a732 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ReturnUtil.java @@ -0,0 +1,36 @@ +package com.casic.missiles.model; + +/** + * @Description: for return + * @Author: wangpeng + * @Date: 2022/11/27 00:56 + */ +public class ReturnUtil { + public ReturnUtil() { + } + + public static ReturnDTO success() { + return new ReturnDTO(ResponseData.DEFAULT_SUCCESS_CODE, ResponseData.DEFAULT_SUCCESS_MESSAGE); + } + + public static ReturnDTO success(Object data) { + return new ReturnDTO(ResponseData.DEFAULT_SUCCESS_CODE, ResponseData.DEFAULT_SUCCESS_MESSAGE, data); + } + + public static ReturnDTO success(Integer code, String message) { + return new ReturnDTO(code, message); + } + + public static ReturnDTO failed() { + return new ReturnDTO(ResponseData.DEFAULT_ERROR_CODE, ResponseData.DEFAULT_ERROR_MESSAGE); + } + + public static ReturnDTO failed(String message) { + return new ReturnDTO(ResponseData.DEFAULT_ERROR_CODE, message); + } + + public static ReturnDTO failed(Integer code, String message) { + return new ReturnDTO(code, message); + } + +} diff --git a/src/main/java/com/casic/missiles/model/SuccessResponseData.java b/src/main/java/com/casic/missiles/model/SuccessResponseData.java new file mode 100644 index 0000000..a54debe --- /dev/null +++ b/src/main/java/com/casic/missiles/model/SuccessResponseData.java @@ -0,0 +1,21 @@ +package com.casic.missiles.model; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:07 + */ +public class SuccessResponseData extends ResponseData { + + public SuccessResponseData() { + super(true, DEFAULT_SUCCESS_CODE, DEFAULT_SUCCESS_MESSAGE, null); + } + + public SuccessResponseData(Object object) { + super(true, DEFAULT_SUCCESS_CODE, DEFAULT_SUCCESS_MESSAGE, object); + } + + public SuccessResponseData(Integer code, String message, Object object) { + super(true, code, message, object); + } +} diff --git a/src/main/java/com/casic/missiles/service/IBusinessReadWriterService.java b/src/main/java/com/casic/missiles/service/IBusinessReadWriterService.java new file mode 100644 index 0000000..745a727 --- /dev/null +++ b/src/main/java/com/casic/missiles/service/IBusinessReadWriterService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.service; + +import com.casic.missiles.model.ReturnDTO; + +import java.util.Set; +import java.util.concurrent.ExecutionException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:02 + */ +public interface IBusinessReadWriterService { + ReturnDTO> tIdNewReadList(); + + ReturnDTO> tIdMiniReadList(); + + ReturnDTO> codeGunReadList(); + + ReturnDTO> gunAndTIdNewReadList() throws ExecutionException, InterruptedException; + + ReturnDTO> tIdAndMiniReadList() throws ExecutionException, InterruptedException; +} diff --git a/src/main/java/com/casic/missiles/service/impl/BusinessReadWriterServiceImpl.java b/src/main/java/com/casic/missiles/service/impl/BusinessReadWriterServiceImpl.java new file mode 100644 index 0000000..1f3a09e --- /dev/null +++ b/src/main/java/com/casic/missiles/service/impl/BusinessReadWriterServiceImpl.java @@ -0,0 +1,278 @@ +package com.casic.missiles.service.impl; + +import com.casic.missiles.common.BusinessExceptionEnum; +import com.casic.missiles.listeners.CodeGunDataListener; +import com.casic.missiles.model.ReturnDTO; +import com.casic.missiles.model.ReturnUtil; +import com.casic.missiles.service.IBusinessReadWriterService; +import com.casic.missiles.utils.SerialPortUtil; +import com.gg.reader.api.dal.GClient; +import com.gg.reader.api.dal.HandlerTagEpcLog; +import com.gg.reader.api.dal.HandlerTagEpcOver; +import com.gg.reader.api.protocol.gx.*; +import com.gg.reader.api.utils.UsbHidUtils; +import com.rfid.API.CommonReader; +import com.rfid.API.ProtocolVersion; +import com.rfid.API.Util; +import com.rfid.API.core.BaseReader; +import com.rfid.ui.GlobalData; +import gnu.io.SerialPort; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.hid4java.HidDevice; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.concurrent.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:03 + */ +@Slf4j +@Service +public class BusinessReadWriterServiceImpl implements IBusinessReadWriterService { + @Autowired + private ForkJoinPool forkJoinPool; + + public static SerialPort serialPort = null; + + @Override + public ReturnDTO> tIdNewReadList() { + CommonReader reader = new CommonReader("Reader1", GlobalData.ConnectType.TcpClient.name(), "192.168.1.201:9090"); + try { +// CommonReader reader = new CommonReader("Reader1", "RS232", "COM20:115200"); +// CommonReader reader = new CommonReader("Reader1", "USB-HID", ""); + reader.setProtocol(ProtocolVersion.CRP); + reader.setReaderProtocol(ProtocolVersion.CRP); +// reader.setPortSum(4);//只对LRP的有效 + reader.connect(false, new BaseReader.IConnectListener() { + @Override + public void callback(boolean b) { +// log.info("大读写器设备连接状态:" + b); + } + }); + if (reader.getIsConnected() == true) { + Set tIds = receiveNewTIds(reader); + if (CollectionUtils.isEmpty(tIds)) { + return ReturnUtil.failed(BusinessExceptionEnum.FAIL_READ_EPC_TID.getCode(), BusinessExceptionEnum.FAIL_READ_EPC_TID.getMessage()); + } + return ReturnUtil.success(tIds); + } else { + return ReturnUtil.failed(BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED.getCode(), BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED.getMessage()); + } + } catch (InterruptedException e) { + log.error("大读写器读取标签异常:{}", e.getMessage()); + return ReturnUtil.failed(BusinessExceptionEnum.FAIL_READ_EPC_TID.getCode(), BusinessExceptionEnum.FAIL_READ_EPC_TID.getMessage()); + } finally { + //不断开连接,读写器会每秒发送心跳 +// reader.disconnect(); + } + } + + @Override + public ReturnDTO> tIdMiniReadList() { + GClient client = new GClient(); + Set tIds = new HashSet<>(); + try { + List attachedHidDevices = UsbHidUtils.getAttachedHidDevices(); + if (CollectionUtils.isEmpty(attachedHidDevices)) { + return ReturnUtil.failed(BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED.getCode(), BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED.getMessage()); + } + //循环每个USB接口数据 + for (HidDevice hidDevice : attachedHidDevices) { + if (client.openUsbHid(hidDevice)) { + tIds.addAll(receiveTIds(client)); + } + } + if (CollectionUtils.isEmpty(tIds)) { + return ReturnUtil.failed(BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED_OR_NO_TID.getCode(), BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED_OR_NO_TID.getMessage()); + } + return ReturnUtil.success(tIds); + } catch (InterruptedException e) { + log.error("读写器循环读取事件时间设置,异常信息:{}", e.getMessage()); + return ReturnUtil.failed(); + } finally { + client.close(); + } + } + + @Override + public ReturnDTO> codeGunReadList() { + SerialPortUtil serialPortUtil = null; + Set resultSet = new HashSet<>(); + try { + //添加监听器 + serialPortUtil = SerialPortUtil.getSerialPortUtil(); + List ports = serialPortUtil.findPort(); + log.info("有线扫码枪,当前可用串口:{}", ports); + if (CollectionUtils.isEmpty(ports)) { + return ReturnUtil.failed(BusinessExceptionEnum.NO_PROPERLY_CONNECTED.getMessage()); + } + for (String port : ports) { + //有线扫码枪已经设置的是一次读取一个,要是多个这里逻辑需要调整 + serialPort = serialPortUtil.openPort(port, 19200, SerialPort.DATABITS_8, SerialPort.PARITY_NONE, SerialPort.PARITY_ODD); + serialPortUtil.addListener(serialPort, new CodeGunDataListener()); + } + //监听器接收指定时间的数据 + TimeUnit.SECONDS.sleep(10); + resultSet.addAll(CodeGunDataListener.dataSet); + CodeGunDataListener.dataSet = new HashSet<>(); + } catch (Exception e) { + log.error("有线扫码枪识别失败,异常:", e.getMessage()); + return ReturnUtil.failed(BusinessExceptionEnum.HANDLE_FAILED.getMessage()); + } finally { + if (Objects.nonNull(serialPortUtil) && Objects.nonNull(serialPort)) { + //删除监听器 + serialPortUtil.removeListener(serialPort, new CodeGunDataListener()); + serialPortUtil.closePort(serialPort); + } + } + return ReturnUtil.success(resultSet); + } + + @Override + public ReturnDTO> gunAndTIdNewReadList() throws ExecutionException, InterruptedException { + //异步请求大读写器 + ForkJoinTask>> taskResponse = forkJoinPool.submit(new RecursiveTask>>() { + @SneakyThrows + @Override + protected ReturnDTO> compute() { + return tIdNewReadList(); + } + }); + //有线扫码枪(二维码)识别设备id列表 + Set gunSet = queryGunReturnDTO(this.codeGunReadList()); + //大读写器识别tId列表 + Set tIdsSet = queryGunReturnDTO(taskResponse.get()); + Set resultSet = new HashSet<>(); + resultSet.addAll(tIdsSet); + resultSet.addAll(gunSet); + return ReturnUtil.success(resultSet); + } + + @Override + public ReturnDTO> tIdAndMiniReadList() throws ExecutionException, InterruptedException { + //异步请求大读写器 + ForkJoinTask>> taskResponse = forkJoinPool.submit(new RecursiveTask>>() { + @SneakyThrows + @Override + protected ReturnDTO> compute() { + return tIdNewReadList(); + } + }); + //小读写器识别tId列表 + ReturnDTO> minTIdReturnDTO = this.tIdMiniReadList(); + Set minTIdsSet = new HashSet<>(); + if (ReturnUtil.success().getCode().equals(minTIdReturnDTO.getCode()) && Objects.nonNull(minTIdReturnDTO.getData())) { + minTIdsSet.addAll(minTIdReturnDTO.getData()); + } + //大读写器识别tId列表 + Set tIdsSet = queryGunReturnDTO(taskResponse.get()); + Set resultSet = new HashSet<>(); + resultSet.addAll(tIdsSet); + resultSet.addAll(minTIdsSet); + return ReturnUtil.success(resultSet); + } + + private Set receiveNewTIds(CommonReader reader) throws InterruptedException { + Set tIds = new HashSet<>(); +// boolean a = reader.BuzzerControl(true, false);//蜂鸣器协议 +// ScanTagParameter param = new ScanTagParameter(); +// param.antenna = 0x0001; +// param.isLoop = true;//持续盘点 +// boolean b = reader.reader_Inventory(param, (byte) 0x0001); + //四个天线都开填0x0F,需要4个天线都连上才行 + boolean b1 = reader.ScanTID(0x0001, true, 1111); + log.info("大读写器开始盘点:" + b1); + reader.OnTagDataReceivedHandle = (gateName, tagData) -> { + if (tagData != null && tagData.getTID() != null) { + String tid = Util.convertByteArrayToHexString(tagData.getTID()); + log.info("大读写器TID标签读取成功"); + tIds.add(tid); + } + }; + //连续读取3s + TimeUnit.SECONDS.sleep(3); +// reader.disconnect(); + boolean stop = reader.reader_StopInventory(); + return tIds; + } + + private Set receiveTIds(GClient client) throws InterruptedException { + Set tIds = new HashSet<>(); + //标签上报事件、结束事件订阅 + eventSubscribe(tIds, client); + + // 4个天线读卡, 读取EPC数据区以及TID数据区 + MsgBaseInventoryEpc msgBaseInventoryEpc = new MsgBaseInventoryEpc(); + msgBaseInventoryEpc.setAntennaEnable(EnumG.AntennaNo_1 | EnumG.AntennaNo_2 | EnumG.AntennaNo_3 | EnumG.AntennaNo_4); + // 0: 单次读取模式,读写器尽在各个使能的天线上进行一轮读卡操作便结束读卡操作并自动进入空闲状态 + // 1: 连续读取模式,读写器一直进行读卡操作直到读写器收到停止指令后结束读卡 + msgBaseInventoryEpc.setInventoryMode(EnumG.InventoryMode_Inventory); + ParamEpcReadTid tid = new ParamEpcReadTid(); + tid.setMode(EnumG.ParamTidMode_Auto); + tid.setLen(6); + msgBaseInventoryEpc.setReadTid(tid); + client.sendSynMsg(msgBaseInventoryEpc); + if (0 == msgBaseInventoryEpc.getRtCode()) { + log.info("EPC、TID标签读取成功"); + } else { + log.info("EPC、TID标签读取失败"); + client.close(); + return new HashSet<>(); + } + //连续读取,让事件接收3秒,也可采用单次读取方式(没有连续读取识别效果好) + TimeUnit.SECONDS.sleep(3); + // 停止指令,空闲态 + MsgBaseStop msgBaseStop = new MsgBaseStop(); + client.sendSynMsg(msgBaseStop); + if (0 == msgBaseStop.getRtCode()) { + log.info("EPC、TID标签停止读取成功"); + } else { + log.info("EPC、TID标签停止读取失败"); + } + return tIds; + } + + private void eventSubscribe(Set set, GClient client) { + // 订阅标签上报事件 + client.onTagEpcLog = new HandlerTagEpcLog() { + @Override + public void log(String readName, LogBaseEpcInfo logBaseEpcInfo) { + // 回调内部如有阻塞,会影响API正常使用 + // 标签回调数量较多,请将标签数据先缓存起来再作业务处理 + if (null != logBaseEpcInfo && 0 == logBaseEpcInfo.getResult()) { + System.out.println(logBaseEpcInfo); + log.info("收到标签上报事件,{}", logBaseEpcInfo.toString()); + set.add(logBaseEpcInfo.getTid()); + } + } + }; + // 上报结束事件 + client.onTagEpcOver = new HandlerTagEpcOver() { + @Override + public void log(String readName, LogBaseEpcOver logBaseEpcOver) { + if (null != logBaseEpcOver) { + log.info("收到标签上报结束事件,{}", logBaseEpcOver.toString()); + } + } + }; + } + + private Set queryGunReturnDTO(ReturnDTO> setReturnDTO) { + Set gunSet = new HashSet<>(); + ReturnDTO> gunReturnDTO = setReturnDTO; + if (ReturnUtil.success().getCode().equals(gunReturnDTO.getCode()) && Objects.nonNull(gunReturnDTO.getData())) { + gunSet.addAll(gunReturnDTO.getData()); + } + return gunSet; + } + +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..5287d96 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/../../../../:\code\casic-metering-readwriter\.idea/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..3c031c9 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..63e9001 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..9907c1d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..4b661a5 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..033c242 --- /dev/null +++ b/pom.xml @@ -0,0 +1,85 @@ + + + 4.0.0 + + com.casic.missiles + casic-metering-readwriter + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.4.5 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + + + + com.new.reader + reader-api + 1.0 + + + + + com.gg.reader + greader-api + 1.0 + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.0.2 + + + + **/*-*.yml + + + + com.casic.missiles.CasicApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.3.0 + + false + + src/main/build/package.xml + + + + + make-assembly + package + + single + + + + + + + + \ No newline at end of file diff --git a/src/main/build/bin/start.bat b/src/main/build/bin/start.bat new file mode 100644 index 0000000..f7270e6 --- /dev/null +++ b/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title casic-metering-readwriter-1.0-SNAPSHOT.jar +java -jar D:\metering\casic-metering-readwriter-1.0-SNAPSHOT\lib\casic-metering-readwriter-1.0-SNAPSHOT.jar +@pause diff --git a/src/main/build/bin/start.sh b/src/main/build/bin/start.sh new file mode 100644 index 0000000..c4722ff --- /dev/null +++ b/src/main/build/bin/start.sh @@ -0,0 +1 @@ +java -jar ./lib/casic-metering-readwriter-1.0-SNAPSHOT.jar \ No newline at end of file diff --git a/src/main/build/package.xml b/src/main/build/package.xml new file mode 100644 index 0000000..97bc675 --- /dev/null +++ b/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/src/main/java/com/casic/missiles/CasicApplication.java b/src/main/java/com/casic/missiles/CasicApplication.java new file mode 100644 index 0000000..36fdfee --- /dev/null +++ b/src/main/java/com/casic/missiles/CasicApplication.java @@ -0,0 +1,19 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @Description: SpringBoot启动类 + * @Author: wangpeng + * @Date: 2023/6/15 15:27 + */ +@Slf4j +@SpringBootApplication +public class CasicApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApplication.class,args); + log.info("CasicApplication is success!"); + } +} diff --git a/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java b/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java new file mode 100644 index 0000000..836c0bf --- /dev/null +++ b/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java @@ -0,0 +1,23 @@ +package com.casic.missiles.common; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:12 + */ +public interface AbstractBaseExceptionEnum { + /** + * 获取异常的状态码 + * + * @return 异常状态码 + */ + Integer getCode(); + + + /** + * 获取异常的提示信息 + * + * @return 异常提示消息 + */ + String getMessage(); +} diff --git a/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java b/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java new file mode 100644 index 0000000..75763c2 --- /dev/null +++ b/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java @@ -0,0 +1,110 @@ +package com.casic.missiles.common; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + TRAIN_STAFF_NULL(2400, "培训学员不能为空"), + TRAIN_LOG_ID_NULL(2400, "培训记录主键不能为空"), + ORGANIZE_ID_NULL(2400, "计量组织主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + EDUCATION_NOT_EXISTENCE(2300, "导入文化程度不存在;"), + TECHNOLOGY_JOB_NOT_EXISTENCE(2300, "导入技术职位不存在;"), + ADMINISTRATION_JOB_NOT_EXISTENCE(2300, "导入行政职务不存在;"), + DEPT_NOT_EXISTENCE(2300, "导入部门不存在;"), + SEX_NOT_CORRECT(2300, "性别填写有误(男,女);"), + MAIN_EXAMINER_NOT_CORRECT(2300, "是否主考人填写有误(是,否);"), + SPECIAL_OPERATOR_NOT_CORRECT(2300, "是否特操人填写有误(是,否);"), + TECHNOLOGY_EXAM_NOT_CORRECT(2300, "是否技术考核填写有误(是,否);"), + WORK_DATE_NOT_CORRECT(2300, "从事日期格式错误(2022-15-05);"), + BIRTHDAY_NOT_CORRECT(2300, "生日格式错误(2022-15-05);"), + CERTIFICATE_DATE_NOT_CORRECT(2300, "发证日期格式错误(2022-15-05);"), + VALID_DATE_NOT_CORRECT(2300, "有效日期格式错误(2022-15-05);"), + STAFF_NOT_EXISTENCE(2300, "人员编号不存在"), + CHECK_TYPE_NOT_EXISTENCE(2300, "校验类型不存在;"), + PRICE_TYPE_NOT_EXISTENCE(2300, "价格类别不存在;"), + PRICE_ITEM_NOT_EXISTENCE(2300, "项目不存在;"), + OPERATOR_DISCOUNT_PERMISSION_NOT_EXISTENCE(2300, "业务员折扣权限不存在;"), + DIRECTOR_DISCOUNT_PERMISSION_NOT_EXISTENCE(2300, "负责人折扣权限不存在;"), + TRACE_SUPPLIER_ID_NULL(2400, "培训记录主键不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + NOT_FOUND_USER_INFO(2402, "未找到用户信息"), + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRAIN_PLAN_SAVE_FAILED(2403, "培训计划保存至草稿箱失败"), + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + TRAIN_PLAN_SUBMIT_FAILED(2406, "培训计划提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java new file mode 100644 index 0000000..d54b93a --- /dev/null +++ b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java @@ -0,0 +1,74 @@ +package com.casic.missiles.cotroller; + +import com.casic.missiles.model.ReturnDTO; +import com.casic.missiles.service.IBusinessReadWriterService; +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.Set; +import java.util.concurrent.ExecutionException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:01 + */ +@Slf4j +@RestController +@RequestMapping("/business/readWriter") +public class BusinessReadWriterController { + @Autowired + private IBusinessReadWriterService readWriterService; + + /** + * 获取大读写器识别的标签TID列表 + * 大读写器 + * TCP连接,需配置和192.168.1.201一个段 + * 读取读写器获取标签TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @GetMapping("/tId/readList") + public ReturnDTO> tIdNewReadList() { + return readWriterService.tIdNewReadList(); + } + + /** + * 获取小读写器识别的标签TID列表 + * USB-HID连接(HID是一种USB通信协议,无需安装驱动就能进行交互) + * 读取读写器获取TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @GetMapping("/tId/mini/readList") + public ReturnDTO> tIdMiniReadList() { + return readWriterService.tIdMiniReadList(); + } + + /** + * 获取有线扫码枪识别列表(二维码) + * USB串口连接(模拟COM口),USB模拟串行通讯模式,连接后在设备管理器-端口(COM和LPT)可查看连接设备 + * 目前设置:扫码一次读取一个,扫码结果无回车 + * 二维码由样品编号/设备编号生成 + * 扫描收入、扫描检完等,以及大读写器的补充(包括新建委托书和待收入中使用) + */ + @GetMapping("/code/gun/readList") + public ReturnDTO> codeGunReadList() { + return readWriterService.codeGunReadList(); + } + + /** + * 有线扫码枪(二维码)和大读写器结合扫描 + */ + @GetMapping("/gunAndTId/readList") + public ReturnDTO> equipmentLabelReadList() throws ExecutionException, InterruptedException { + return readWriterService.gunAndTIdNewReadList(); + } + + /** + * 大读写器和小读写器识别结合的结果TID列表 + */ + @GetMapping("/tIdAndMini/readList") + public ReturnDTO> allTidReadList() throws ExecutionException, InterruptedException { + return readWriterService.tIdAndMiniReadList(); + } +} diff --git a/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java b/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java new file mode 100644 index 0000000..89095aa --- /dev/null +++ b/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java @@ -0,0 +1,27 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.service.impl.BusinessReadWriterServiceImpl; +import com.casic.missiles.utils.SerialPortUtil; +import gnu.io.SerialPortEvent; +import gnu.io.SerialPortEventListener; + +import java.util.HashSet; +import java.util.Set; + +/** + * @Description: 设备串口接收数据监听器 + * @Author: wangpeng + * @Date: 2023/4/4 16:46 + */ +public class CodeGunDataListener implements SerialPortEventListener { + public static Set dataSet = new HashSet<>(); + + @Override + public void serialEvent(SerialPortEvent event) { + if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) { + SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil(); + byte[] bytes = serialPortUtil.readFromPort(BusinessReadWriterServiceImpl.serialPort); + dataSet.add(new String(bytes, 0, bytes.length).trim()); + } + } +} diff --git a/src/main/java/com/casic/missiles/model/ErrorResponseData.java b/src/main/java/com/casic/missiles/model/ErrorResponseData.java new file mode 100644 index 0000000..af437a5 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ErrorResponseData.java @@ -0,0 +1,26 @@ +package com.casic.missiles.model; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:07 + */ +public class ErrorResponseData extends ResponseData { + + /** + * 异常的具体类名称 + */ + private String exceptionClazz; + + public ErrorResponseData(String message) { + super(false, ResponseData.DEFAULT_ERROR_CODE, message, null); + } + + public ErrorResponseData(Integer code, String message) { + super(false, code, message, null); + } + + public ErrorResponseData(Integer code, String message, Object object) { + super(false, code, message, object); + } +} diff --git a/src/main/java/com/casic/missiles/model/ResponseData.java b/src/main/java/com/casic/missiles/model/ResponseData.java new file mode 100644 index 0000000..9e9c910 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ResponseData.java @@ -0,0 +1,73 @@ +package com.casic.missiles.model; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:06 + */ +@Data +public class ResponseData { + public static final String DEFAULT_SUCCESS_MESSAGE = "请求成功"; + + public static final String DEFAULT_ERROR_MESSAGE = "网络异常"; + + public static final Integer DEFAULT_SUCCESS_CODE = 200; + + public static final Integer DEFAULT_ERROR_CODE = 500; + + /** + * 请求是否成功 + */ + private Boolean success; + + /** + * 响应状态码 + */ + private Integer code; + + /** + * 响应信息 + */ + private String message; + + /** + * 响应对象 + */ + private Object data; + + public ResponseData() { + } + + public ResponseData(Boolean success, Integer code, String message, Object data) { + this.success = success; + this.code = code; + this.message = message; + this.data = data; + } + + public static SuccessResponseData success() { + return new SuccessResponseData(); + } + + public static SuccessResponseData success(Object object) { + return new SuccessResponseData(object); + } + + public static SuccessResponseData success(Integer code, String message, Object object) { + return new SuccessResponseData(code, message, object); + } + + public static ErrorResponseData error(String message) { + return new ErrorResponseData(message); + } + + public static ErrorResponseData error(Integer code, String message) { + return new ErrorResponseData(code, message); + } + + public static ErrorResponseData error(Integer code, String message, Object object) { + return new ErrorResponseData(code, message, object); + } +} diff --git a/src/main/java/com/casic/missiles/model/ReturnDTO.java b/src/main/java/com/casic/missiles/model/ReturnDTO.java new file mode 100644 index 0000000..4c102f2 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ReturnDTO.java @@ -0,0 +1,31 @@ +package com.casic.missiles.model; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:05 + */ +@Data +public class ReturnDTO implements Serializable { + private Integer code; + private String message; + private T data; + + public ReturnDTO(Integer code, String message, T data) { + this.code = code; + this.message = message; + this.data = data; + } + + public ReturnDTO(Integer code, String message) { + this.code = code; + this.message = message; + } + + public ReturnDTO() { + } +} diff --git a/src/main/java/com/casic/missiles/model/ReturnUtil.java b/src/main/java/com/casic/missiles/model/ReturnUtil.java new file mode 100644 index 0000000..c30a732 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ReturnUtil.java @@ -0,0 +1,36 @@ +package com.casic.missiles.model; + +/** + * @Description: for return + * @Author: wangpeng + * @Date: 2022/11/27 00:56 + */ +public class ReturnUtil { + public ReturnUtil() { + } + + public static ReturnDTO success() { + return new ReturnDTO(ResponseData.DEFAULT_SUCCESS_CODE, ResponseData.DEFAULT_SUCCESS_MESSAGE); + } + + public static ReturnDTO success(Object data) { + return new ReturnDTO(ResponseData.DEFAULT_SUCCESS_CODE, ResponseData.DEFAULT_SUCCESS_MESSAGE, data); + } + + public static ReturnDTO success(Integer code, String message) { + return new ReturnDTO(code, message); + } + + public static ReturnDTO failed() { + return new ReturnDTO(ResponseData.DEFAULT_ERROR_CODE, ResponseData.DEFAULT_ERROR_MESSAGE); + } + + public static ReturnDTO failed(String message) { + return new ReturnDTO(ResponseData.DEFAULT_ERROR_CODE, message); + } + + public static ReturnDTO failed(Integer code, String message) { + return new ReturnDTO(code, message); + } + +} diff --git a/src/main/java/com/casic/missiles/model/SuccessResponseData.java b/src/main/java/com/casic/missiles/model/SuccessResponseData.java new file mode 100644 index 0000000..a54debe --- /dev/null +++ b/src/main/java/com/casic/missiles/model/SuccessResponseData.java @@ -0,0 +1,21 @@ +package com.casic.missiles.model; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:07 + */ +public class SuccessResponseData extends ResponseData { + + public SuccessResponseData() { + super(true, DEFAULT_SUCCESS_CODE, DEFAULT_SUCCESS_MESSAGE, null); + } + + public SuccessResponseData(Object object) { + super(true, DEFAULT_SUCCESS_CODE, DEFAULT_SUCCESS_MESSAGE, object); + } + + public SuccessResponseData(Integer code, String message, Object object) { + super(true, code, message, object); + } +} diff --git a/src/main/java/com/casic/missiles/service/IBusinessReadWriterService.java b/src/main/java/com/casic/missiles/service/IBusinessReadWriterService.java new file mode 100644 index 0000000..745a727 --- /dev/null +++ b/src/main/java/com/casic/missiles/service/IBusinessReadWriterService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.service; + +import com.casic.missiles.model.ReturnDTO; + +import java.util.Set; +import java.util.concurrent.ExecutionException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:02 + */ +public interface IBusinessReadWriterService { + ReturnDTO> tIdNewReadList(); + + ReturnDTO> tIdMiniReadList(); + + ReturnDTO> codeGunReadList(); + + ReturnDTO> gunAndTIdNewReadList() throws ExecutionException, InterruptedException; + + ReturnDTO> tIdAndMiniReadList() throws ExecutionException, InterruptedException; +} diff --git a/src/main/java/com/casic/missiles/service/impl/BusinessReadWriterServiceImpl.java b/src/main/java/com/casic/missiles/service/impl/BusinessReadWriterServiceImpl.java new file mode 100644 index 0000000..1f3a09e --- /dev/null +++ b/src/main/java/com/casic/missiles/service/impl/BusinessReadWriterServiceImpl.java @@ -0,0 +1,278 @@ +package com.casic.missiles.service.impl; + +import com.casic.missiles.common.BusinessExceptionEnum; +import com.casic.missiles.listeners.CodeGunDataListener; +import com.casic.missiles.model.ReturnDTO; +import com.casic.missiles.model.ReturnUtil; +import com.casic.missiles.service.IBusinessReadWriterService; +import com.casic.missiles.utils.SerialPortUtil; +import com.gg.reader.api.dal.GClient; +import com.gg.reader.api.dal.HandlerTagEpcLog; +import com.gg.reader.api.dal.HandlerTagEpcOver; +import com.gg.reader.api.protocol.gx.*; +import com.gg.reader.api.utils.UsbHidUtils; +import com.rfid.API.CommonReader; +import com.rfid.API.ProtocolVersion; +import com.rfid.API.Util; +import com.rfid.API.core.BaseReader; +import com.rfid.ui.GlobalData; +import gnu.io.SerialPort; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.hid4java.HidDevice; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.concurrent.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:03 + */ +@Slf4j +@Service +public class BusinessReadWriterServiceImpl implements IBusinessReadWriterService { + @Autowired + private ForkJoinPool forkJoinPool; + + public static SerialPort serialPort = null; + + @Override + public ReturnDTO> tIdNewReadList() { + CommonReader reader = new CommonReader("Reader1", GlobalData.ConnectType.TcpClient.name(), "192.168.1.201:9090"); + try { +// CommonReader reader = new CommonReader("Reader1", "RS232", "COM20:115200"); +// CommonReader reader = new CommonReader("Reader1", "USB-HID", ""); + reader.setProtocol(ProtocolVersion.CRP); + reader.setReaderProtocol(ProtocolVersion.CRP); +// reader.setPortSum(4);//只对LRP的有效 + reader.connect(false, new BaseReader.IConnectListener() { + @Override + public void callback(boolean b) { +// log.info("大读写器设备连接状态:" + b); + } + }); + if (reader.getIsConnected() == true) { + Set tIds = receiveNewTIds(reader); + if (CollectionUtils.isEmpty(tIds)) { + return ReturnUtil.failed(BusinessExceptionEnum.FAIL_READ_EPC_TID.getCode(), BusinessExceptionEnum.FAIL_READ_EPC_TID.getMessage()); + } + return ReturnUtil.success(tIds); + } else { + return ReturnUtil.failed(BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED.getCode(), BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED.getMessage()); + } + } catch (InterruptedException e) { + log.error("大读写器读取标签异常:{}", e.getMessage()); + return ReturnUtil.failed(BusinessExceptionEnum.FAIL_READ_EPC_TID.getCode(), BusinessExceptionEnum.FAIL_READ_EPC_TID.getMessage()); + } finally { + //不断开连接,读写器会每秒发送心跳 +// reader.disconnect(); + } + } + + @Override + public ReturnDTO> tIdMiniReadList() { + GClient client = new GClient(); + Set tIds = new HashSet<>(); + try { + List attachedHidDevices = UsbHidUtils.getAttachedHidDevices(); + if (CollectionUtils.isEmpty(attachedHidDevices)) { + return ReturnUtil.failed(BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED.getCode(), BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED.getMessage()); + } + //循环每个USB接口数据 + for (HidDevice hidDevice : attachedHidDevices) { + if (client.openUsbHid(hidDevice)) { + tIds.addAll(receiveTIds(client)); + } + } + if (CollectionUtils.isEmpty(tIds)) { + return ReturnUtil.failed(BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED_OR_NO_TID.getCode(), BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED_OR_NO_TID.getMessage()); + } + return ReturnUtil.success(tIds); + } catch (InterruptedException e) { + log.error("读写器循环读取事件时间设置,异常信息:{}", e.getMessage()); + return ReturnUtil.failed(); + } finally { + client.close(); + } + } + + @Override + public ReturnDTO> codeGunReadList() { + SerialPortUtil serialPortUtil = null; + Set resultSet = new HashSet<>(); + try { + //添加监听器 + serialPortUtil = SerialPortUtil.getSerialPortUtil(); + List ports = serialPortUtil.findPort(); + log.info("有线扫码枪,当前可用串口:{}", ports); + if (CollectionUtils.isEmpty(ports)) { + return ReturnUtil.failed(BusinessExceptionEnum.NO_PROPERLY_CONNECTED.getMessage()); + } + for (String port : ports) { + //有线扫码枪已经设置的是一次读取一个,要是多个这里逻辑需要调整 + serialPort = serialPortUtil.openPort(port, 19200, SerialPort.DATABITS_8, SerialPort.PARITY_NONE, SerialPort.PARITY_ODD); + serialPortUtil.addListener(serialPort, new CodeGunDataListener()); + } + //监听器接收指定时间的数据 + TimeUnit.SECONDS.sleep(10); + resultSet.addAll(CodeGunDataListener.dataSet); + CodeGunDataListener.dataSet = new HashSet<>(); + } catch (Exception e) { + log.error("有线扫码枪识别失败,异常:", e.getMessage()); + return ReturnUtil.failed(BusinessExceptionEnum.HANDLE_FAILED.getMessage()); + } finally { + if (Objects.nonNull(serialPortUtil) && Objects.nonNull(serialPort)) { + //删除监听器 + serialPortUtil.removeListener(serialPort, new CodeGunDataListener()); + serialPortUtil.closePort(serialPort); + } + } + return ReturnUtil.success(resultSet); + } + + @Override + public ReturnDTO> gunAndTIdNewReadList() throws ExecutionException, InterruptedException { + //异步请求大读写器 + ForkJoinTask>> taskResponse = forkJoinPool.submit(new RecursiveTask>>() { + @SneakyThrows + @Override + protected ReturnDTO> compute() { + return tIdNewReadList(); + } + }); + //有线扫码枪(二维码)识别设备id列表 + Set gunSet = queryGunReturnDTO(this.codeGunReadList()); + //大读写器识别tId列表 + Set tIdsSet = queryGunReturnDTO(taskResponse.get()); + Set resultSet = new HashSet<>(); + resultSet.addAll(tIdsSet); + resultSet.addAll(gunSet); + return ReturnUtil.success(resultSet); + } + + @Override + public ReturnDTO> tIdAndMiniReadList() throws ExecutionException, InterruptedException { + //异步请求大读写器 + ForkJoinTask>> taskResponse = forkJoinPool.submit(new RecursiveTask>>() { + @SneakyThrows + @Override + protected ReturnDTO> compute() { + return tIdNewReadList(); + } + }); + //小读写器识别tId列表 + ReturnDTO> minTIdReturnDTO = this.tIdMiniReadList(); + Set minTIdsSet = new HashSet<>(); + if (ReturnUtil.success().getCode().equals(minTIdReturnDTO.getCode()) && Objects.nonNull(minTIdReturnDTO.getData())) { + minTIdsSet.addAll(minTIdReturnDTO.getData()); + } + //大读写器识别tId列表 + Set tIdsSet = queryGunReturnDTO(taskResponse.get()); + Set resultSet = new HashSet<>(); + resultSet.addAll(tIdsSet); + resultSet.addAll(minTIdsSet); + return ReturnUtil.success(resultSet); + } + + private Set receiveNewTIds(CommonReader reader) throws InterruptedException { + Set tIds = new HashSet<>(); +// boolean a = reader.BuzzerControl(true, false);//蜂鸣器协议 +// ScanTagParameter param = new ScanTagParameter(); +// param.antenna = 0x0001; +// param.isLoop = true;//持续盘点 +// boolean b = reader.reader_Inventory(param, (byte) 0x0001); + //四个天线都开填0x0F,需要4个天线都连上才行 + boolean b1 = reader.ScanTID(0x0001, true, 1111); + log.info("大读写器开始盘点:" + b1); + reader.OnTagDataReceivedHandle = (gateName, tagData) -> { + if (tagData != null && tagData.getTID() != null) { + String tid = Util.convertByteArrayToHexString(tagData.getTID()); + log.info("大读写器TID标签读取成功"); + tIds.add(tid); + } + }; + //连续读取3s + TimeUnit.SECONDS.sleep(3); +// reader.disconnect(); + boolean stop = reader.reader_StopInventory(); + return tIds; + } + + private Set receiveTIds(GClient client) throws InterruptedException { + Set tIds = new HashSet<>(); + //标签上报事件、结束事件订阅 + eventSubscribe(tIds, client); + + // 4个天线读卡, 读取EPC数据区以及TID数据区 + MsgBaseInventoryEpc msgBaseInventoryEpc = new MsgBaseInventoryEpc(); + msgBaseInventoryEpc.setAntennaEnable(EnumG.AntennaNo_1 | EnumG.AntennaNo_2 | EnumG.AntennaNo_3 | EnumG.AntennaNo_4); + // 0: 单次读取模式,读写器尽在各个使能的天线上进行一轮读卡操作便结束读卡操作并自动进入空闲状态 + // 1: 连续读取模式,读写器一直进行读卡操作直到读写器收到停止指令后结束读卡 + msgBaseInventoryEpc.setInventoryMode(EnumG.InventoryMode_Inventory); + ParamEpcReadTid tid = new ParamEpcReadTid(); + tid.setMode(EnumG.ParamTidMode_Auto); + tid.setLen(6); + msgBaseInventoryEpc.setReadTid(tid); + client.sendSynMsg(msgBaseInventoryEpc); + if (0 == msgBaseInventoryEpc.getRtCode()) { + log.info("EPC、TID标签读取成功"); + } else { + log.info("EPC、TID标签读取失败"); + client.close(); + return new HashSet<>(); + } + //连续读取,让事件接收3秒,也可采用单次读取方式(没有连续读取识别效果好) + TimeUnit.SECONDS.sleep(3); + // 停止指令,空闲态 + MsgBaseStop msgBaseStop = new MsgBaseStop(); + client.sendSynMsg(msgBaseStop); + if (0 == msgBaseStop.getRtCode()) { + log.info("EPC、TID标签停止读取成功"); + } else { + log.info("EPC、TID标签停止读取失败"); + } + return tIds; + } + + private void eventSubscribe(Set set, GClient client) { + // 订阅标签上报事件 + client.onTagEpcLog = new HandlerTagEpcLog() { + @Override + public void log(String readName, LogBaseEpcInfo logBaseEpcInfo) { + // 回调内部如有阻塞,会影响API正常使用 + // 标签回调数量较多,请将标签数据先缓存起来再作业务处理 + if (null != logBaseEpcInfo && 0 == logBaseEpcInfo.getResult()) { + System.out.println(logBaseEpcInfo); + log.info("收到标签上报事件,{}", logBaseEpcInfo.toString()); + set.add(logBaseEpcInfo.getTid()); + } + } + }; + // 上报结束事件 + client.onTagEpcOver = new HandlerTagEpcOver() { + @Override + public void log(String readName, LogBaseEpcOver logBaseEpcOver) { + if (null != logBaseEpcOver) { + log.info("收到标签上报结束事件,{}", logBaseEpcOver.toString()); + } + } + }; + } + + private Set queryGunReturnDTO(ReturnDTO> setReturnDTO) { + Set gunSet = new HashSet<>(); + ReturnDTO> gunReturnDTO = setReturnDTO; + if (ReturnUtil.success().getCode().equals(gunReturnDTO.getCode()) && Objects.nonNull(gunReturnDTO.getData())) { + gunSet.addAll(gunReturnDTO.getData()); + } + return gunSet; + } + +} diff --git a/src/main/java/com/casic/missiles/utils/SerialPortUtil.java b/src/main/java/com/casic/missiles/utils/SerialPortUtil.java new file mode 100644 index 0000000..634fc3c --- /dev/null +++ b/src/main/java/com/casic/missiles/utils/SerialPortUtil.java @@ -0,0 +1,211 @@ +package com.casic.missiles.utils; + +import gnu.io.*; +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; +import java.util.TooManyListenersException; + +/** + * @Description: USB串口通信工具 + * @Author: wangpeng + * @Date: 2023/4/4 16:19 + */ +@Slf4j +public class SerialPortUtil { + private static SerialPortUtil serialPortUtil = null; + + static { + //在该类被ClassLoader加载时就初始化一个SerialTool对象 + if (serialPortUtil == null) { + serialPortUtil = new SerialPortUtil(); + } + } + + //私有化SerialTool类的构造方法,不允许其他类生成SerialTool对象 + private SerialPortUtil() { + } + + /** + * 获取提供服务的SerialTool对象 + * @return serialPortUtil + */ + public static SerialPortUtil getSerialPortUtil() { + if (serialPortUtil == null) { + serialPortUtil = new SerialPortUtil(); + } + return serialPortUtil; + } + + /** + * 查找所有可用端口 + * @return 可用端口名称列表 + */ + public List findPort() { + //获得当前所有可用串口 + Enumeration portList = CommPortIdentifier.getPortIdentifiers(); + List portNameList = new ArrayList<>(); + //将可用串口名添加到List并返回该List + while (portList.hasMoreElements()) { + String portName = portList.nextElement().getName(); + portNameList.add(portName); + } + return portNameList; + } + + /** + * 打开串口 + * @param portName 端口名称 + * @param baudrate 波特率 19200 + * @param databits 数据位 8 + * @param parity 校验位(奇偶位) NONE :0 + * @param stopbits 停止位 1 + * @return 串口对象 + */ + public SerialPort openPort(String portName, int baudrate, int databits, int parity, int stopbits) { + try { + //通过端口名识别端口 + CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName); + //打开端口,并给端口名字和一个timeout(打开操作的超时时间) + CommPort commPort = portIdentifier.open(portName, 2000); + //判断是不是串口 + if (commPort instanceof SerialPort) { + SerialPort serialPort = (SerialPort) commPort; + try { + //设置一下串口的波特率等参数 + serialPort.setSerialPortParams(baudrate, databits, stopbits, parity); + } catch (UnsupportedCommOperationException e) { + } +// System.out.println("Open " + portName + " sucessfully !"); + return serialPort; + } else { + log.error("串口通信工具-不是串口"); + } + } catch (NoSuchPortException e1) { + log.error("串口通信工具-没有找到端口"); + e1.printStackTrace(); + } catch (PortInUseException e2) { + log.error("串口通信工具-端口被占用"); + e2.printStackTrace(); + } + return null; + } + + /** + * 关闭串口 + * @param serialPort 待关闭的串口对象 + */ + public void closePort(SerialPort serialPort) { + if (serialPort != null) { + serialPort.close(); + } + } + + /** + * 往串口发送数据 + * @param serialPort 串口对象 + * @param order 待发送数据 + */ + public void sendToPort(SerialPort serialPort, byte[] order) { + OutputStream out = null; + try { + out = serialPort.getOutputStream(); + out.write(order); + out.flush(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (out != null) { + out.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + /** + * 从串口读取数据 + * @param serialPort 当前已建立连接的SerialPort对象 + * @return 读取到的数据 + */ + public byte[] readFromPort(SerialPort serialPort) { + InputStream in = null; + byte[] bytes = null; + try { + in = serialPort.getInputStream(); + int bufflenth = in.available(); + while (bufflenth != 0) { + bytes = new byte[bufflenth]; + in.read(bytes); + bufflenth = in.available(); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (in != null) { + in.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + return bytes; + } + + /** + * 添加监听器 + * @param port 串口对象 + * @param listener 串口监听器 + */ + public void addListener(SerialPort port, SerialPortEventListener listener) { + try { + //给串口添加监听器 + port.addEventListener(listener); + //设置当有数据到达时唤醒监听接收线程 + port.notifyOnDataAvailable(true); + //设置当通信中断时唤醒中断线程 + port.notifyOnBreakInterrupt(true); + } catch (TooManyListenersException e) { +// throw new TooManyListeners(); + log.error("串口通信工具-监听器设置过多"); + e.printStackTrace(); + } + } + + /** + * 删除监听器 + * @param port 串口对象 + * @param listener 串口监听器 + */ + public void removeListener(SerialPort port, SerialPortEventListener listener) { + //删除串口监听器 + port.removeEventListener(); + } + + /** + * 设置串口的Listener + * @param serialPort + * @param listener + */ + public static void setListenerToSerialPort(SerialPort serialPort, SerialPortEventListener listener){ + try { + //给串口添加事件监听 + serialPort.addEventListener(listener); + } catch (TooManyListenersException e) { + e.printStackTrace(); + } + //串口有数据监听 + serialPort.notifyOnDataAvailable(true); + //中断事件监听 + serialPort.notifyOnBreakInterrupt(true); + } + +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..5287d96 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/../../../../:\code\casic-metering-readwriter\.idea/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..3c031c9 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..63e9001 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..9907c1d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..4b661a5 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..033c242 --- /dev/null +++ b/pom.xml @@ -0,0 +1,85 @@ + + + 4.0.0 + + com.casic.missiles + casic-metering-readwriter + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.4.5 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + + + + com.new.reader + reader-api + 1.0 + + + + + com.gg.reader + greader-api + 1.0 + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.0.2 + + + + **/*-*.yml + + + + com.casic.missiles.CasicApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.3.0 + + false + + src/main/build/package.xml + + + + + make-assembly + package + + single + + + + + + + + \ No newline at end of file diff --git a/src/main/build/bin/start.bat b/src/main/build/bin/start.bat new file mode 100644 index 0000000..f7270e6 --- /dev/null +++ b/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title casic-metering-readwriter-1.0-SNAPSHOT.jar +java -jar D:\metering\casic-metering-readwriter-1.0-SNAPSHOT\lib\casic-metering-readwriter-1.0-SNAPSHOT.jar +@pause diff --git a/src/main/build/bin/start.sh b/src/main/build/bin/start.sh new file mode 100644 index 0000000..c4722ff --- /dev/null +++ b/src/main/build/bin/start.sh @@ -0,0 +1 @@ +java -jar ./lib/casic-metering-readwriter-1.0-SNAPSHOT.jar \ No newline at end of file diff --git a/src/main/build/package.xml b/src/main/build/package.xml new file mode 100644 index 0000000..97bc675 --- /dev/null +++ b/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/src/main/java/com/casic/missiles/CasicApplication.java b/src/main/java/com/casic/missiles/CasicApplication.java new file mode 100644 index 0000000..36fdfee --- /dev/null +++ b/src/main/java/com/casic/missiles/CasicApplication.java @@ -0,0 +1,19 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @Description: SpringBoot启动类 + * @Author: wangpeng + * @Date: 2023/6/15 15:27 + */ +@Slf4j +@SpringBootApplication +public class CasicApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApplication.class,args); + log.info("CasicApplication is success!"); + } +} diff --git a/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java b/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java new file mode 100644 index 0000000..836c0bf --- /dev/null +++ b/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java @@ -0,0 +1,23 @@ +package com.casic.missiles.common; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:12 + */ +public interface AbstractBaseExceptionEnum { + /** + * 获取异常的状态码 + * + * @return 异常状态码 + */ + Integer getCode(); + + + /** + * 获取异常的提示信息 + * + * @return 异常提示消息 + */ + String getMessage(); +} diff --git a/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java b/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java new file mode 100644 index 0000000..75763c2 --- /dev/null +++ b/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java @@ -0,0 +1,110 @@ +package com.casic.missiles.common; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + TRAIN_STAFF_NULL(2400, "培训学员不能为空"), + TRAIN_LOG_ID_NULL(2400, "培训记录主键不能为空"), + ORGANIZE_ID_NULL(2400, "计量组织主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + EDUCATION_NOT_EXISTENCE(2300, "导入文化程度不存在;"), + TECHNOLOGY_JOB_NOT_EXISTENCE(2300, "导入技术职位不存在;"), + ADMINISTRATION_JOB_NOT_EXISTENCE(2300, "导入行政职务不存在;"), + DEPT_NOT_EXISTENCE(2300, "导入部门不存在;"), + SEX_NOT_CORRECT(2300, "性别填写有误(男,女);"), + MAIN_EXAMINER_NOT_CORRECT(2300, "是否主考人填写有误(是,否);"), + SPECIAL_OPERATOR_NOT_CORRECT(2300, "是否特操人填写有误(是,否);"), + TECHNOLOGY_EXAM_NOT_CORRECT(2300, "是否技术考核填写有误(是,否);"), + WORK_DATE_NOT_CORRECT(2300, "从事日期格式错误(2022-15-05);"), + BIRTHDAY_NOT_CORRECT(2300, "生日格式错误(2022-15-05);"), + CERTIFICATE_DATE_NOT_CORRECT(2300, "发证日期格式错误(2022-15-05);"), + VALID_DATE_NOT_CORRECT(2300, "有效日期格式错误(2022-15-05);"), + STAFF_NOT_EXISTENCE(2300, "人员编号不存在"), + CHECK_TYPE_NOT_EXISTENCE(2300, "校验类型不存在;"), + PRICE_TYPE_NOT_EXISTENCE(2300, "价格类别不存在;"), + PRICE_ITEM_NOT_EXISTENCE(2300, "项目不存在;"), + OPERATOR_DISCOUNT_PERMISSION_NOT_EXISTENCE(2300, "业务员折扣权限不存在;"), + DIRECTOR_DISCOUNT_PERMISSION_NOT_EXISTENCE(2300, "负责人折扣权限不存在;"), + TRACE_SUPPLIER_ID_NULL(2400, "培训记录主键不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + NOT_FOUND_USER_INFO(2402, "未找到用户信息"), + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRAIN_PLAN_SAVE_FAILED(2403, "培训计划保存至草稿箱失败"), + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + TRAIN_PLAN_SUBMIT_FAILED(2406, "培训计划提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java new file mode 100644 index 0000000..d54b93a --- /dev/null +++ b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java @@ -0,0 +1,74 @@ +package com.casic.missiles.cotroller; + +import com.casic.missiles.model.ReturnDTO; +import com.casic.missiles.service.IBusinessReadWriterService; +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.Set; +import java.util.concurrent.ExecutionException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:01 + */ +@Slf4j +@RestController +@RequestMapping("/business/readWriter") +public class BusinessReadWriterController { + @Autowired + private IBusinessReadWriterService readWriterService; + + /** + * 获取大读写器识别的标签TID列表 + * 大读写器 + * TCP连接,需配置和192.168.1.201一个段 + * 读取读写器获取标签TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @GetMapping("/tId/readList") + public ReturnDTO> tIdNewReadList() { + return readWriterService.tIdNewReadList(); + } + + /** + * 获取小读写器识别的标签TID列表 + * USB-HID连接(HID是一种USB通信协议,无需安装驱动就能进行交互) + * 读取读写器获取TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @GetMapping("/tId/mini/readList") + public ReturnDTO> tIdMiniReadList() { + return readWriterService.tIdMiniReadList(); + } + + /** + * 获取有线扫码枪识别列表(二维码) + * USB串口连接(模拟COM口),USB模拟串行通讯模式,连接后在设备管理器-端口(COM和LPT)可查看连接设备 + * 目前设置:扫码一次读取一个,扫码结果无回车 + * 二维码由样品编号/设备编号生成 + * 扫描收入、扫描检完等,以及大读写器的补充(包括新建委托书和待收入中使用) + */ + @GetMapping("/code/gun/readList") + public ReturnDTO> codeGunReadList() { + return readWriterService.codeGunReadList(); + } + + /** + * 有线扫码枪(二维码)和大读写器结合扫描 + */ + @GetMapping("/gunAndTId/readList") + public ReturnDTO> equipmentLabelReadList() throws ExecutionException, InterruptedException { + return readWriterService.gunAndTIdNewReadList(); + } + + /** + * 大读写器和小读写器识别结合的结果TID列表 + */ + @GetMapping("/tIdAndMini/readList") + public ReturnDTO> allTidReadList() throws ExecutionException, InterruptedException { + return readWriterService.tIdAndMiniReadList(); + } +} diff --git a/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java b/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java new file mode 100644 index 0000000..89095aa --- /dev/null +++ b/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java @@ -0,0 +1,27 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.service.impl.BusinessReadWriterServiceImpl; +import com.casic.missiles.utils.SerialPortUtil; +import gnu.io.SerialPortEvent; +import gnu.io.SerialPortEventListener; + +import java.util.HashSet; +import java.util.Set; + +/** + * @Description: 设备串口接收数据监听器 + * @Author: wangpeng + * @Date: 2023/4/4 16:46 + */ +public class CodeGunDataListener implements SerialPortEventListener { + public static Set dataSet = new HashSet<>(); + + @Override + public void serialEvent(SerialPortEvent event) { + if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) { + SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil(); + byte[] bytes = serialPortUtil.readFromPort(BusinessReadWriterServiceImpl.serialPort); + dataSet.add(new String(bytes, 0, bytes.length).trim()); + } + } +} diff --git a/src/main/java/com/casic/missiles/model/ErrorResponseData.java b/src/main/java/com/casic/missiles/model/ErrorResponseData.java new file mode 100644 index 0000000..af437a5 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ErrorResponseData.java @@ -0,0 +1,26 @@ +package com.casic.missiles.model; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:07 + */ +public class ErrorResponseData extends ResponseData { + + /** + * 异常的具体类名称 + */ + private String exceptionClazz; + + public ErrorResponseData(String message) { + super(false, ResponseData.DEFAULT_ERROR_CODE, message, null); + } + + public ErrorResponseData(Integer code, String message) { + super(false, code, message, null); + } + + public ErrorResponseData(Integer code, String message, Object object) { + super(false, code, message, object); + } +} diff --git a/src/main/java/com/casic/missiles/model/ResponseData.java b/src/main/java/com/casic/missiles/model/ResponseData.java new file mode 100644 index 0000000..9e9c910 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ResponseData.java @@ -0,0 +1,73 @@ +package com.casic.missiles.model; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:06 + */ +@Data +public class ResponseData { + public static final String DEFAULT_SUCCESS_MESSAGE = "请求成功"; + + public static final String DEFAULT_ERROR_MESSAGE = "网络异常"; + + public static final Integer DEFAULT_SUCCESS_CODE = 200; + + public static final Integer DEFAULT_ERROR_CODE = 500; + + /** + * 请求是否成功 + */ + private Boolean success; + + /** + * 响应状态码 + */ + private Integer code; + + /** + * 响应信息 + */ + private String message; + + /** + * 响应对象 + */ + private Object data; + + public ResponseData() { + } + + public ResponseData(Boolean success, Integer code, String message, Object data) { + this.success = success; + this.code = code; + this.message = message; + this.data = data; + } + + public static SuccessResponseData success() { + return new SuccessResponseData(); + } + + public static SuccessResponseData success(Object object) { + return new SuccessResponseData(object); + } + + public static SuccessResponseData success(Integer code, String message, Object object) { + return new SuccessResponseData(code, message, object); + } + + public static ErrorResponseData error(String message) { + return new ErrorResponseData(message); + } + + public static ErrorResponseData error(Integer code, String message) { + return new ErrorResponseData(code, message); + } + + public static ErrorResponseData error(Integer code, String message, Object object) { + return new ErrorResponseData(code, message, object); + } +} diff --git a/src/main/java/com/casic/missiles/model/ReturnDTO.java b/src/main/java/com/casic/missiles/model/ReturnDTO.java new file mode 100644 index 0000000..4c102f2 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ReturnDTO.java @@ -0,0 +1,31 @@ +package com.casic.missiles.model; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:05 + */ +@Data +public class ReturnDTO implements Serializable { + private Integer code; + private String message; + private T data; + + public ReturnDTO(Integer code, String message, T data) { + this.code = code; + this.message = message; + this.data = data; + } + + public ReturnDTO(Integer code, String message) { + this.code = code; + this.message = message; + } + + public ReturnDTO() { + } +} diff --git a/src/main/java/com/casic/missiles/model/ReturnUtil.java b/src/main/java/com/casic/missiles/model/ReturnUtil.java new file mode 100644 index 0000000..c30a732 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ReturnUtil.java @@ -0,0 +1,36 @@ +package com.casic.missiles.model; + +/** + * @Description: for return + * @Author: wangpeng + * @Date: 2022/11/27 00:56 + */ +public class ReturnUtil { + public ReturnUtil() { + } + + public static ReturnDTO success() { + return new ReturnDTO(ResponseData.DEFAULT_SUCCESS_CODE, ResponseData.DEFAULT_SUCCESS_MESSAGE); + } + + public static ReturnDTO success(Object data) { + return new ReturnDTO(ResponseData.DEFAULT_SUCCESS_CODE, ResponseData.DEFAULT_SUCCESS_MESSAGE, data); + } + + public static ReturnDTO success(Integer code, String message) { + return new ReturnDTO(code, message); + } + + public static ReturnDTO failed() { + return new ReturnDTO(ResponseData.DEFAULT_ERROR_CODE, ResponseData.DEFAULT_ERROR_MESSAGE); + } + + public static ReturnDTO failed(String message) { + return new ReturnDTO(ResponseData.DEFAULT_ERROR_CODE, message); + } + + public static ReturnDTO failed(Integer code, String message) { + return new ReturnDTO(code, message); + } + +} diff --git a/src/main/java/com/casic/missiles/model/SuccessResponseData.java b/src/main/java/com/casic/missiles/model/SuccessResponseData.java new file mode 100644 index 0000000..a54debe --- /dev/null +++ b/src/main/java/com/casic/missiles/model/SuccessResponseData.java @@ -0,0 +1,21 @@ +package com.casic.missiles.model; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:07 + */ +public class SuccessResponseData extends ResponseData { + + public SuccessResponseData() { + super(true, DEFAULT_SUCCESS_CODE, DEFAULT_SUCCESS_MESSAGE, null); + } + + public SuccessResponseData(Object object) { + super(true, DEFAULT_SUCCESS_CODE, DEFAULT_SUCCESS_MESSAGE, object); + } + + public SuccessResponseData(Integer code, String message, Object object) { + super(true, code, message, object); + } +} diff --git a/src/main/java/com/casic/missiles/service/IBusinessReadWriterService.java b/src/main/java/com/casic/missiles/service/IBusinessReadWriterService.java new file mode 100644 index 0000000..745a727 --- /dev/null +++ b/src/main/java/com/casic/missiles/service/IBusinessReadWriterService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.service; + +import com.casic.missiles.model.ReturnDTO; + +import java.util.Set; +import java.util.concurrent.ExecutionException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:02 + */ +public interface IBusinessReadWriterService { + ReturnDTO> tIdNewReadList(); + + ReturnDTO> tIdMiniReadList(); + + ReturnDTO> codeGunReadList(); + + ReturnDTO> gunAndTIdNewReadList() throws ExecutionException, InterruptedException; + + ReturnDTO> tIdAndMiniReadList() throws ExecutionException, InterruptedException; +} diff --git a/src/main/java/com/casic/missiles/service/impl/BusinessReadWriterServiceImpl.java b/src/main/java/com/casic/missiles/service/impl/BusinessReadWriterServiceImpl.java new file mode 100644 index 0000000..1f3a09e --- /dev/null +++ b/src/main/java/com/casic/missiles/service/impl/BusinessReadWriterServiceImpl.java @@ -0,0 +1,278 @@ +package com.casic.missiles.service.impl; + +import com.casic.missiles.common.BusinessExceptionEnum; +import com.casic.missiles.listeners.CodeGunDataListener; +import com.casic.missiles.model.ReturnDTO; +import com.casic.missiles.model.ReturnUtil; +import com.casic.missiles.service.IBusinessReadWriterService; +import com.casic.missiles.utils.SerialPortUtil; +import com.gg.reader.api.dal.GClient; +import com.gg.reader.api.dal.HandlerTagEpcLog; +import com.gg.reader.api.dal.HandlerTagEpcOver; +import com.gg.reader.api.protocol.gx.*; +import com.gg.reader.api.utils.UsbHidUtils; +import com.rfid.API.CommonReader; +import com.rfid.API.ProtocolVersion; +import com.rfid.API.Util; +import com.rfid.API.core.BaseReader; +import com.rfid.ui.GlobalData; +import gnu.io.SerialPort; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.hid4java.HidDevice; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.concurrent.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:03 + */ +@Slf4j +@Service +public class BusinessReadWriterServiceImpl implements IBusinessReadWriterService { + @Autowired + private ForkJoinPool forkJoinPool; + + public static SerialPort serialPort = null; + + @Override + public ReturnDTO> tIdNewReadList() { + CommonReader reader = new CommonReader("Reader1", GlobalData.ConnectType.TcpClient.name(), "192.168.1.201:9090"); + try { +// CommonReader reader = new CommonReader("Reader1", "RS232", "COM20:115200"); +// CommonReader reader = new CommonReader("Reader1", "USB-HID", ""); + reader.setProtocol(ProtocolVersion.CRP); + reader.setReaderProtocol(ProtocolVersion.CRP); +// reader.setPortSum(4);//只对LRP的有效 + reader.connect(false, new BaseReader.IConnectListener() { + @Override + public void callback(boolean b) { +// log.info("大读写器设备连接状态:" + b); + } + }); + if (reader.getIsConnected() == true) { + Set tIds = receiveNewTIds(reader); + if (CollectionUtils.isEmpty(tIds)) { + return ReturnUtil.failed(BusinessExceptionEnum.FAIL_READ_EPC_TID.getCode(), BusinessExceptionEnum.FAIL_READ_EPC_TID.getMessage()); + } + return ReturnUtil.success(tIds); + } else { + return ReturnUtil.failed(BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED.getCode(), BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED.getMessage()); + } + } catch (InterruptedException e) { + log.error("大读写器读取标签异常:{}", e.getMessage()); + return ReturnUtil.failed(BusinessExceptionEnum.FAIL_READ_EPC_TID.getCode(), BusinessExceptionEnum.FAIL_READ_EPC_TID.getMessage()); + } finally { + //不断开连接,读写器会每秒发送心跳 +// reader.disconnect(); + } + } + + @Override + public ReturnDTO> tIdMiniReadList() { + GClient client = new GClient(); + Set tIds = new HashSet<>(); + try { + List attachedHidDevices = UsbHidUtils.getAttachedHidDevices(); + if (CollectionUtils.isEmpty(attachedHidDevices)) { + return ReturnUtil.failed(BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED.getCode(), BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED.getMessage()); + } + //循环每个USB接口数据 + for (HidDevice hidDevice : attachedHidDevices) { + if (client.openUsbHid(hidDevice)) { + tIds.addAll(receiveTIds(client)); + } + } + if (CollectionUtils.isEmpty(tIds)) { + return ReturnUtil.failed(BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED_OR_NO_TID.getCode(), BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED_OR_NO_TID.getMessage()); + } + return ReturnUtil.success(tIds); + } catch (InterruptedException e) { + log.error("读写器循环读取事件时间设置,异常信息:{}", e.getMessage()); + return ReturnUtil.failed(); + } finally { + client.close(); + } + } + + @Override + public ReturnDTO> codeGunReadList() { + SerialPortUtil serialPortUtil = null; + Set resultSet = new HashSet<>(); + try { + //添加监听器 + serialPortUtil = SerialPortUtil.getSerialPortUtil(); + List ports = serialPortUtil.findPort(); + log.info("有线扫码枪,当前可用串口:{}", ports); + if (CollectionUtils.isEmpty(ports)) { + return ReturnUtil.failed(BusinessExceptionEnum.NO_PROPERLY_CONNECTED.getMessage()); + } + for (String port : ports) { + //有线扫码枪已经设置的是一次读取一个,要是多个这里逻辑需要调整 + serialPort = serialPortUtil.openPort(port, 19200, SerialPort.DATABITS_8, SerialPort.PARITY_NONE, SerialPort.PARITY_ODD); + serialPortUtil.addListener(serialPort, new CodeGunDataListener()); + } + //监听器接收指定时间的数据 + TimeUnit.SECONDS.sleep(10); + resultSet.addAll(CodeGunDataListener.dataSet); + CodeGunDataListener.dataSet = new HashSet<>(); + } catch (Exception e) { + log.error("有线扫码枪识别失败,异常:", e.getMessage()); + return ReturnUtil.failed(BusinessExceptionEnum.HANDLE_FAILED.getMessage()); + } finally { + if (Objects.nonNull(serialPortUtil) && Objects.nonNull(serialPort)) { + //删除监听器 + serialPortUtil.removeListener(serialPort, new CodeGunDataListener()); + serialPortUtil.closePort(serialPort); + } + } + return ReturnUtil.success(resultSet); + } + + @Override + public ReturnDTO> gunAndTIdNewReadList() throws ExecutionException, InterruptedException { + //异步请求大读写器 + ForkJoinTask>> taskResponse = forkJoinPool.submit(new RecursiveTask>>() { + @SneakyThrows + @Override + protected ReturnDTO> compute() { + return tIdNewReadList(); + } + }); + //有线扫码枪(二维码)识别设备id列表 + Set gunSet = queryGunReturnDTO(this.codeGunReadList()); + //大读写器识别tId列表 + Set tIdsSet = queryGunReturnDTO(taskResponse.get()); + Set resultSet = new HashSet<>(); + resultSet.addAll(tIdsSet); + resultSet.addAll(gunSet); + return ReturnUtil.success(resultSet); + } + + @Override + public ReturnDTO> tIdAndMiniReadList() throws ExecutionException, InterruptedException { + //异步请求大读写器 + ForkJoinTask>> taskResponse = forkJoinPool.submit(new RecursiveTask>>() { + @SneakyThrows + @Override + protected ReturnDTO> compute() { + return tIdNewReadList(); + } + }); + //小读写器识别tId列表 + ReturnDTO> minTIdReturnDTO = this.tIdMiniReadList(); + Set minTIdsSet = new HashSet<>(); + if (ReturnUtil.success().getCode().equals(minTIdReturnDTO.getCode()) && Objects.nonNull(minTIdReturnDTO.getData())) { + minTIdsSet.addAll(minTIdReturnDTO.getData()); + } + //大读写器识别tId列表 + Set tIdsSet = queryGunReturnDTO(taskResponse.get()); + Set resultSet = new HashSet<>(); + resultSet.addAll(tIdsSet); + resultSet.addAll(minTIdsSet); + return ReturnUtil.success(resultSet); + } + + private Set receiveNewTIds(CommonReader reader) throws InterruptedException { + Set tIds = new HashSet<>(); +// boolean a = reader.BuzzerControl(true, false);//蜂鸣器协议 +// ScanTagParameter param = new ScanTagParameter(); +// param.antenna = 0x0001; +// param.isLoop = true;//持续盘点 +// boolean b = reader.reader_Inventory(param, (byte) 0x0001); + //四个天线都开填0x0F,需要4个天线都连上才行 + boolean b1 = reader.ScanTID(0x0001, true, 1111); + log.info("大读写器开始盘点:" + b1); + reader.OnTagDataReceivedHandle = (gateName, tagData) -> { + if (tagData != null && tagData.getTID() != null) { + String tid = Util.convertByteArrayToHexString(tagData.getTID()); + log.info("大读写器TID标签读取成功"); + tIds.add(tid); + } + }; + //连续读取3s + TimeUnit.SECONDS.sleep(3); +// reader.disconnect(); + boolean stop = reader.reader_StopInventory(); + return tIds; + } + + private Set receiveTIds(GClient client) throws InterruptedException { + Set tIds = new HashSet<>(); + //标签上报事件、结束事件订阅 + eventSubscribe(tIds, client); + + // 4个天线读卡, 读取EPC数据区以及TID数据区 + MsgBaseInventoryEpc msgBaseInventoryEpc = new MsgBaseInventoryEpc(); + msgBaseInventoryEpc.setAntennaEnable(EnumG.AntennaNo_1 | EnumG.AntennaNo_2 | EnumG.AntennaNo_3 | EnumG.AntennaNo_4); + // 0: 单次读取模式,读写器尽在各个使能的天线上进行一轮读卡操作便结束读卡操作并自动进入空闲状态 + // 1: 连续读取模式,读写器一直进行读卡操作直到读写器收到停止指令后结束读卡 + msgBaseInventoryEpc.setInventoryMode(EnumG.InventoryMode_Inventory); + ParamEpcReadTid tid = new ParamEpcReadTid(); + tid.setMode(EnumG.ParamTidMode_Auto); + tid.setLen(6); + msgBaseInventoryEpc.setReadTid(tid); + client.sendSynMsg(msgBaseInventoryEpc); + if (0 == msgBaseInventoryEpc.getRtCode()) { + log.info("EPC、TID标签读取成功"); + } else { + log.info("EPC、TID标签读取失败"); + client.close(); + return new HashSet<>(); + } + //连续读取,让事件接收3秒,也可采用单次读取方式(没有连续读取识别效果好) + TimeUnit.SECONDS.sleep(3); + // 停止指令,空闲态 + MsgBaseStop msgBaseStop = new MsgBaseStop(); + client.sendSynMsg(msgBaseStop); + if (0 == msgBaseStop.getRtCode()) { + log.info("EPC、TID标签停止读取成功"); + } else { + log.info("EPC、TID标签停止读取失败"); + } + return tIds; + } + + private void eventSubscribe(Set set, GClient client) { + // 订阅标签上报事件 + client.onTagEpcLog = new HandlerTagEpcLog() { + @Override + public void log(String readName, LogBaseEpcInfo logBaseEpcInfo) { + // 回调内部如有阻塞,会影响API正常使用 + // 标签回调数量较多,请将标签数据先缓存起来再作业务处理 + if (null != logBaseEpcInfo && 0 == logBaseEpcInfo.getResult()) { + System.out.println(logBaseEpcInfo); + log.info("收到标签上报事件,{}", logBaseEpcInfo.toString()); + set.add(logBaseEpcInfo.getTid()); + } + } + }; + // 上报结束事件 + client.onTagEpcOver = new HandlerTagEpcOver() { + @Override + public void log(String readName, LogBaseEpcOver logBaseEpcOver) { + if (null != logBaseEpcOver) { + log.info("收到标签上报结束事件,{}", logBaseEpcOver.toString()); + } + } + }; + } + + private Set queryGunReturnDTO(ReturnDTO> setReturnDTO) { + Set gunSet = new HashSet<>(); + ReturnDTO> gunReturnDTO = setReturnDTO; + if (ReturnUtil.success().getCode().equals(gunReturnDTO.getCode()) && Objects.nonNull(gunReturnDTO.getData())) { + gunSet.addAll(gunReturnDTO.getData()); + } + return gunSet; + } + +} diff --git a/src/main/java/com/casic/missiles/utils/SerialPortUtil.java b/src/main/java/com/casic/missiles/utils/SerialPortUtil.java new file mode 100644 index 0000000..634fc3c --- /dev/null +++ b/src/main/java/com/casic/missiles/utils/SerialPortUtil.java @@ -0,0 +1,211 @@ +package com.casic.missiles.utils; + +import gnu.io.*; +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; +import java.util.TooManyListenersException; + +/** + * @Description: USB串口通信工具 + * @Author: wangpeng + * @Date: 2023/4/4 16:19 + */ +@Slf4j +public class SerialPortUtil { + private static SerialPortUtil serialPortUtil = null; + + static { + //在该类被ClassLoader加载时就初始化一个SerialTool对象 + if (serialPortUtil == null) { + serialPortUtil = new SerialPortUtil(); + } + } + + //私有化SerialTool类的构造方法,不允许其他类生成SerialTool对象 + private SerialPortUtil() { + } + + /** + * 获取提供服务的SerialTool对象 + * @return serialPortUtil + */ + public static SerialPortUtil getSerialPortUtil() { + if (serialPortUtil == null) { + serialPortUtil = new SerialPortUtil(); + } + return serialPortUtil; + } + + /** + * 查找所有可用端口 + * @return 可用端口名称列表 + */ + public List findPort() { + //获得当前所有可用串口 + Enumeration portList = CommPortIdentifier.getPortIdentifiers(); + List portNameList = new ArrayList<>(); + //将可用串口名添加到List并返回该List + while (portList.hasMoreElements()) { + String portName = portList.nextElement().getName(); + portNameList.add(portName); + } + return portNameList; + } + + /** + * 打开串口 + * @param portName 端口名称 + * @param baudrate 波特率 19200 + * @param databits 数据位 8 + * @param parity 校验位(奇偶位) NONE :0 + * @param stopbits 停止位 1 + * @return 串口对象 + */ + public SerialPort openPort(String portName, int baudrate, int databits, int parity, int stopbits) { + try { + //通过端口名识别端口 + CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName); + //打开端口,并给端口名字和一个timeout(打开操作的超时时间) + CommPort commPort = portIdentifier.open(portName, 2000); + //判断是不是串口 + if (commPort instanceof SerialPort) { + SerialPort serialPort = (SerialPort) commPort; + try { + //设置一下串口的波特率等参数 + serialPort.setSerialPortParams(baudrate, databits, stopbits, parity); + } catch (UnsupportedCommOperationException e) { + } +// System.out.println("Open " + portName + " sucessfully !"); + return serialPort; + } else { + log.error("串口通信工具-不是串口"); + } + } catch (NoSuchPortException e1) { + log.error("串口通信工具-没有找到端口"); + e1.printStackTrace(); + } catch (PortInUseException e2) { + log.error("串口通信工具-端口被占用"); + e2.printStackTrace(); + } + return null; + } + + /** + * 关闭串口 + * @param serialPort 待关闭的串口对象 + */ + public void closePort(SerialPort serialPort) { + if (serialPort != null) { + serialPort.close(); + } + } + + /** + * 往串口发送数据 + * @param serialPort 串口对象 + * @param order 待发送数据 + */ + public void sendToPort(SerialPort serialPort, byte[] order) { + OutputStream out = null; + try { + out = serialPort.getOutputStream(); + out.write(order); + out.flush(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (out != null) { + out.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + /** + * 从串口读取数据 + * @param serialPort 当前已建立连接的SerialPort对象 + * @return 读取到的数据 + */ + public byte[] readFromPort(SerialPort serialPort) { + InputStream in = null; + byte[] bytes = null; + try { + in = serialPort.getInputStream(); + int bufflenth = in.available(); + while (bufflenth != 0) { + bytes = new byte[bufflenth]; + in.read(bytes); + bufflenth = in.available(); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (in != null) { + in.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + return bytes; + } + + /** + * 添加监听器 + * @param port 串口对象 + * @param listener 串口监听器 + */ + public void addListener(SerialPort port, SerialPortEventListener listener) { + try { + //给串口添加监听器 + port.addEventListener(listener); + //设置当有数据到达时唤醒监听接收线程 + port.notifyOnDataAvailable(true); + //设置当通信中断时唤醒中断线程 + port.notifyOnBreakInterrupt(true); + } catch (TooManyListenersException e) { +// throw new TooManyListeners(); + log.error("串口通信工具-监听器设置过多"); + e.printStackTrace(); + } + } + + /** + * 删除监听器 + * @param port 串口对象 + * @param listener 串口监听器 + */ + public void removeListener(SerialPort port, SerialPortEventListener listener) { + //删除串口监听器 + port.removeEventListener(); + } + + /** + * 设置串口的Listener + * @param serialPort + * @param listener + */ + public static void setListenerToSerialPort(SerialPort serialPort, SerialPortEventListener listener){ + try { + //给串口添加事件监听 + serialPort.addEventListener(listener); + } catch (TooManyListenersException e) { + e.printStackTrace(); + } + //串口有数据监听 + serialPort.notifyOnDataAvailable(true); + //中断事件监听 + serialPort.notifyOnBreakInterrupt(true); + } + +} diff --git a/src/main/java/com/casic/missiles/utils/SpringContextUtil.java b/src/main/java/com/casic/missiles/utils/SpringContextUtil.java new file mode 100644 index 0000000..6f12ec7 --- /dev/null +++ b/src/main/java/com/casic/missiles/utils/SpringContextUtil.java @@ -0,0 +1,102 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (!StringUtils.isEmpty(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..5287d96 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/../../../../:\code\casic-metering-readwriter\.idea/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..3c031c9 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..63e9001 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..9907c1d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..4b661a5 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..033c242 --- /dev/null +++ b/pom.xml @@ -0,0 +1,85 @@ + + + 4.0.0 + + com.casic.missiles + casic-metering-readwriter + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.4.5 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + + + + com.new.reader + reader-api + 1.0 + + + + + com.gg.reader + greader-api + 1.0 + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.0.2 + + + + **/*-*.yml + + + + com.casic.missiles.CasicApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.3.0 + + false + + src/main/build/package.xml + + + + + make-assembly + package + + single + + + + + + + + \ No newline at end of file diff --git a/src/main/build/bin/start.bat b/src/main/build/bin/start.bat new file mode 100644 index 0000000..f7270e6 --- /dev/null +++ b/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title casic-metering-readwriter-1.0-SNAPSHOT.jar +java -jar D:\metering\casic-metering-readwriter-1.0-SNAPSHOT\lib\casic-metering-readwriter-1.0-SNAPSHOT.jar +@pause diff --git a/src/main/build/bin/start.sh b/src/main/build/bin/start.sh new file mode 100644 index 0000000..c4722ff --- /dev/null +++ b/src/main/build/bin/start.sh @@ -0,0 +1 @@ +java -jar ./lib/casic-metering-readwriter-1.0-SNAPSHOT.jar \ No newline at end of file diff --git a/src/main/build/package.xml b/src/main/build/package.xml new file mode 100644 index 0000000..97bc675 --- /dev/null +++ b/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/src/main/java/com/casic/missiles/CasicApplication.java b/src/main/java/com/casic/missiles/CasicApplication.java new file mode 100644 index 0000000..36fdfee --- /dev/null +++ b/src/main/java/com/casic/missiles/CasicApplication.java @@ -0,0 +1,19 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @Description: SpringBoot启动类 + * @Author: wangpeng + * @Date: 2023/6/15 15:27 + */ +@Slf4j +@SpringBootApplication +public class CasicApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApplication.class,args); + log.info("CasicApplication is success!"); + } +} diff --git a/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java b/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java new file mode 100644 index 0000000..836c0bf --- /dev/null +++ b/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java @@ -0,0 +1,23 @@ +package com.casic.missiles.common; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:12 + */ +public interface AbstractBaseExceptionEnum { + /** + * 获取异常的状态码 + * + * @return 异常状态码 + */ + Integer getCode(); + + + /** + * 获取异常的提示信息 + * + * @return 异常提示消息 + */ + String getMessage(); +} diff --git a/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java b/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java new file mode 100644 index 0000000..75763c2 --- /dev/null +++ b/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java @@ -0,0 +1,110 @@ +package com.casic.missiles.common; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + TRAIN_STAFF_NULL(2400, "培训学员不能为空"), + TRAIN_LOG_ID_NULL(2400, "培训记录主键不能为空"), + ORGANIZE_ID_NULL(2400, "计量组织主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + EDUCATION_NOT_EXISTENCE(2300, "导入文化程度不存在;"), + TECHNOLOGY_JOB_NOT_EXISTENCE(2300, "导入技术职位不存在;"), + ADMINISTRATION_JOB_NOT_EXISTENCE(2300, "导入行政职务不存在;"), + DEPT_NOT_EXISTENCE(2300, "导入部门不存在;"), + SEX_NOT_CORRECT(2300, "性别填写有误(男,女);"), + MAIN_EXAMINER_NOT_CORRECT(2300, "是否主考人填写有误(是,否);"), + SPECIAL_OPERATOR_NOT_CORRECT(2300, "是否特操人填写有误(是,否);"), + TECHNOLOGY_EXAM_NOT_CORRECT(2300, "是否技术考核填写有误(是,否);"), + WORK_DATE_NOT_CORRECT(2300, "从事日期格式错误(2022-15-05);"), + BIRTHDAY_NOT_CORRECT(2300, "生日格式错误(2022-15-05);"), + CERTIFICATE_DATE_NOT_CORRECT(2300, "发证日期格式错误(2022-15-05);"), + VALID_DATE_NOT_CORRECT(2300, "有效日期格式错误(2022-15-05);"), + STAFF_NOT_EXISTENCE(2300, "人员编号不存在"), + CHECK_TYPE_NOT_EXISTENCE(2300, "校验类型不存在;"), + PRICE_TYPE_NOT_EXISTENCE(2300, "价格类别不存在;"), + PRICE_ITEM_NOT_EXISTENCE(2300, "项目不存在;"), + OPERATOR_DISCOUNT_PERMISSION_NOT_EXISTENCE(2300, "业务员折扣权限不存在;"), + DIRECTOR_DISCOUNT_PERMISSION_NOT_EXISTENCE(2300, "负责人折扣权限不存在;"), + TRACE_SUPPLIER_ID_NULL(2400, "培训记录主键不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + NOT_FOUND_USER_INFO(2402, "未找到用户信息"), + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRAIN_PLAN_SAVE_FAILED(2403, "培训计划保存至草稿箱失败"), + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + TRAIN_PLAN_SUBMIT_FAILED(2406, "培训计划提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java new file mode 100644 index 0000000..d54b93a --- /dev/null +++ b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java @@ -0,0 +1,74 @@ +package com.casic.missiles.cotroller; + +import com.casic.missiles.model.ReturnDTO; +import com.casic.missiles.service.IBusinessReadWriterService; +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.Set; +import java.util.concurrent.ExecutionException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:01 + */ +@Slf4j +@RestController +@RequestMapping("/business/readWriter") +public class BusinessReadWriterController { + @Autowired + private IBusinessReadWriterService readWriterService; + + /** + * 获取大读写器识别的标签TID列表 + * 大读写器 + * TCP连接,需配置和192.168.1.201一个段 + * 读取读写器获取标签TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @GetMapping("/tId/readList") + public ReturnDTO> tIdNewReadList() { + return readWriterService.tIdNewReadList(); + } + + /** + * 获取小读写器识别的标签TID列表 + * USB-HID连接(HID是一种USB通信协议,无需安装驱动就能进行交互) + * 读取读写器获取TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @GetMapping("/tId/mini/readList") + public ReturnDTO> tIdMiniReadList() { + return readWriterService.tIdMiniReadList(); + } + + /** + * 获取有线扫码枪识别列表(二维码) + * USB串口连接(模拟COM口),USB模拟串行通讯模式,连接后在设备管理器-端口(COM和LPT)可查看连接设备 + * 目前设置:扫码一次读取一个,扫码结果无回车 + * 二维码由样品编号/设备编号生成 + * 扫描收入、扫描检完等,以及大读写器的补充(包括新建委托书和待收入中使用) + */ + @GetMapping("/code/gun/readList") + public ReturnDTO> codeGunReadList() { + return readWriterService.codeGunReadList(); + } + + /** + * 有线扫码枪(二维码)和大读写器结合扫描 + */ + @GetMapping("/gunAndTId/readList") + public ReturnDTO> equipmentLabelReadList() throws ExecutionException, InterruptedException { + return readWriterService.gunAndTIdNewReadList(); + } + + /** + * 大读写器和小读写器识别结合的结果TID列表 + */ + @GetMapping("/tIdAndMini/readList") + public ReturnDTO> allTidReadList() throws ExecutionException, InterruptedException { + return readWriterService.tIdAndMiniReadList(); + } +} diff --git a/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java b/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java new file mode 100644 index 0000000..89095aa --- /dev/null +++ b/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java @@ -0,0 +1,27 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.service.impl.BusinessReadWriterServiceImpl; +import com.casic.missiles.utils.SerialPortUtil; +import gnu.io.SerialPortEvent; +import gnu.io.SerialPortEventListener; + +import java.util.HashSet; +import java.util.Set; + +/** + * @Description: 设备串口接收数据监听器 + * @Author: wangpeng + * @Date: 2023/4/4 16:46 + */ +public class CodeGunDataListener implements SerialPortEventListener { + public static Set dataSet = new HashSet<>(); + + @Override + public void serialEvent(SerialPortEvent event) { + if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) { + SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil(); + byte[] bytes = serialPortUtil.readFromPort(BusinessReadWriterServiceImpl.serialPort); + dataSet.add(new String(bytes, 0, bytes.length).trim()); + } + } +} diff --git a/src/main/java/com/casic/missiles/model/ErrorResponseData.java b/src/main/java/com/casic/missiles/model/ErrorResponseData.java new file mode 100644 index 0000000..af437a5 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ErrorResponseData.java @@ -0,0 +1,26 @@ +package com.casic.missiles.model; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:07 + */ +public class ErrorResponseData extends ResponseData { + + /** + * 异常的具体类名称 + */ + private String exceptionClazz; + + public ErrorResponseData(String message) { + super(false, ResponseData.DEFAULT_ERROR_CODE, message, null); + } + + public ErrorResponseData(Integer code, String message) { + super(false, code, message, null); + } + + public ErrorResponseData(Integer code, String message, Object object) { + super(false, code, message, object); + } +} diff --git a/src/main/java/com/casic/missiles/model/ResponseData.java b/src/main/java/com/casic/missiles/model/ResponseData.java new file mode 100644 index 0000000..9e9c910 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ResponseData.java @@ -0,0 +1,73 @@ +package com.casic.missiles.model; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:06 + */ +@Data +public class ResponseData { + public static final String DEFAULT_SUCCESS_MESSAGE = "请求成功"; + + public static final String DEFAULT_ERROR_MESSAGE = "网络异常"; + + public static final Integer DEFAULT_SUCCESS_CODE = 200; + + public static final Integer DEFAULT_ERROR_CODE = 500; + + /** + * 请求是否成功 + */ + private Boolean success; + + /** + * 响应状态码 + */ + private Integer code; + + /** + * 响应信息 + */ + private String message; + + /** + * 响应对象 + */ + private Object data; + + public ResponseData() { + } + + public ResponseData(Boolean success, Integer code, String message, Object data) { + this.success = success; + this.code = code; + this.message = message; + this.data = data; + } + + public static SuccessResponseData success() { + return new SuccessResponseData(); + } + + public static SuccessResponseData success(Object object) { + return new SuccessResponseData(object); + } + + public static SuccessResponseData success(Integer code, String message, Object object) { + return new SuccessResponseData(code, message, object); + } + + public static ErrorResponseData error(String message) { + return new ErrorResponseData(message); + } + + public static ErrorResponseData error(Integer code, String message) { + return new ErrorResponseData(code, message); + } + + public static ErrorResponseData error(Integer code, String message, Object object) { + return new ErrorResponseData(code, message, object); + } +} diff --git a/src/main/java/com/casic/missiles/model/ReturnDTO.java b/src/main/java/com/casic/missiles/model/ReturnDTO.java new file mode 100644 index 0000000..4c102f2 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ReturnDTO.java @@ -0,0 +1,31 @@ +package com.casic.missiles.model; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:05 + */ +@Data +public class ReturnDTO implements Serializable { + private Integer code; + private String message; + private T data; + + public ReturnDTO(Integer code, String message, T data) { + this.code = code; + this.message = message; + this.data = data; + } + + public ReturnDTO(Integer code, String message) { + this.code = code; + this.message = message; + } + + public ReturnDTO() { + } +} diff --git a/src/main/java/com/casic/missiles/model/ReturnUtil.java b/src/main/java/com/casic/missiles/model/ReturnUtil.java new file mode 100644 index 0000000..c30a732 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ReturnUtil.java @@ -0,0 +1,36 @@ +package com.casic.missiles.model; + +/** + * @Description: for return + * @Author: wangpeng + * @Date: 2022/11/27 00:56 + */ +public class ReturnUtil { + public ReturnUtil() { + } + + public static ReturnDTO success() { + return new ReturnDTO(ResponseData.DEFAULT_SUCCESS_CODE, ResponseData.DEFAULT_SUCCESS_MESSAGE); + } + + public static ReturnDTO success(Object data) { + return new ReturnDTO(ResponseData.DEFAULT_SUCCESS_CODE, ResponseData.DEFAULT_SUCCESS_MESSAGE, data); + } + + public static ReturnDTO success(Integer code, String message) { + return new ReturnDTO(code, message); + } + + public static ReturnDTO failed() { + return new ReturnDTO(ResponseData.DEFAULT_ERROR_CODE, ResponseData.DEFAULT_ERROR_MESSAGE); + } + + public static ReturnDTO failed(String message) { + return new ReturnDTO(ResponseData.DEFAULT_ERROR_CODE, message); + } + + public static ReturnDTO failed(Integer code, String message) { + return new ReturnDTO(code, message); + } + +} diff --git a/src/main/java/com/casic/missiles/model/SuccessResponseData.java b/src/main/java/com/casic/missiles/model/SuccessResponseData.java new file mode 100644 index 0000000..a54debe --- /dev/null +++ b/src/main/java/com/casic/missiles/model/SuccessResponseData.java @@ -0,0 +1,21 @@ +package com.casic.missiles.model; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:07 + */ +public class SuccessResponseData extends ResponseData { + + public SuccessResponseData() { + super(true, DEFAULT_SUCCESS_CODE, DEFAULT_SUCCESS_MESSAGE, null); + } + + public SuccessResponseData(Object object) { + super(true, DEFAULT_SUCCESS_CODE, DEFAULT_SUCCESS_MESSAGE, object); + } + + public SuccessResponseData(Integer code, String message, Object object) { + super(true, code, message, object); + } +} diff --git a/src/main/java/com/casic/missiles/service/IBusinessReadWriterService.java b/src/main/java/com/casic/missiles/service/IBusinessReadWriterService.java new file mode 100644 index 0000000..745a727 --- /dev/null +++ b/src/main/java/com/casic/missiles/service/IBusinessReadWriterService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.service; + +import com.casic.missiles.model.ReturnDTO; + +import java.util.Set; +import java.util.concurrent.ExecutionException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:02 + */ +public interface IBusinessReadWriterService { + ReturnDTO> tIdNewReadList(); + + ReturnDTO> tIdMiniReadList(); + + ReturnDTO> codeGunReadList(); + + ReturnDTO> gunAndTIdNewReadList() throws ExecutionException, InterruptedException; + + ReturnDTO> tIdAndMiniReadList() throws ExecutionException, InterruptedException; +} diff --git a/src/main/java/com/casic/missiles/service/impl/BusinessReadWriterServiceImpl.java b/src/main/java/com/casic/missiles/service/impl/BusinessReadWriterServiceImpl.java new file mode 100644 index 0000000..1f3a09e --- /dev/null +++ b/src/main/java/com/casic/missiles/service/impl/BusinessReadWriterServiceImpl.java @@ -0,0 +1,278 @@ +package com.casic.missiles.service.impl; + +import com.casic.missiles.common.BusinessExceptionEnum; +import com.casic.missiles.listeners.CodeGunDataListener; +import com.casic.missiles.model.ReturnDTO; +import com.casic.missiles.model.ReturnUtil; +import com.casic.missiles.service.IBusinessReadWriterService; +import com.casic.missiles.utils.SerialPortUtil; +import com.gg.reader.api.dal.GClient; +import com.gg.reader.api.dal.HandlerTagEpcLog; +import com.gg.reader.api.dal.HandlerTagEpcOver; +import com.gg.reader.api.protocol.gx.*; +import com.gg.reader.api.utils.UsbHidUtils; +import com.rfid.API.CommonReader; +import com.rfid.API.ProtocolVersion; +import com.rfid.API.Util; +import com.rfid.API.core.BaseReader; +import com.rfid.ui.GlobalData; +import gnu.io.SerialPort; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.hid4java.HidDevice; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.concurrent.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:03 + */ +@Slf4j +@Service +public class BusinessReadWriterServiceImpl implements IBusinessReadWriterService { + @Autowired + private ForkJoinPool forkJoinPool; + + public static SerialPort serialPort = null; + + @Override + public ReturnDTO> tIdNewReadList() { + CommonReader reader = new CommonReader("Reader1", GlobalData.ConnectType.TcpClient.name(), "192.168.1.201:9090"); + try { +// CommonReader reader = new CommonReader("Reader1", "RS232", "COM20:115200"); +// CommonReader reader = new CommonReader("Reader1", "USB-HID", ""); + reader.setProtocol(ProtocolVersion.CRP); + reader.setReaderProtocol(ProtocolVersion.CRP); +// reader.setPortSum(4);//只对LRP的有效 + reader.connect(false, new BaseReader.IConnectListener() { + @Override + public void callback(boolean b) { +// log.info("大读写器设备连接状态:" + b); + } + }); + if (reader.getIsConnected() == true) { + Set tIds = receiveNewTIds(reader); + if (CollectionUtils.isEmpty(tIds)) { + return ReturnUtil.failed(BusinessExceptionEnum.FAIL_READ_EPC_TID.getCode(), BusinessExceptionEnum.FAIL_READ_EPC_TID.getMessage()); + } + return ReturnUtil.success(tIds); + } else { + return ReturnUtil.failed(BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED.getCode(), BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED.getMessage()); + } + } catch (InterruptedException e) { + log.error("大读写器读取标签异常:{}", e.getMessage()); + return ReturnUtil.failed(BusinessExceptionEnum.FAIL_READ_EPC_TID.getCode(), BusinessExceptionEnum.FAIL_READ_EPC_TID.getMessage()); + } finally { + //不断开连接,读写器会每秒发送心跳 +// reader.disconnect(); + } + } + + @Override + public ReturnDTO> tIdMiniReadList() { + GClient client = new GClient(); + Set tIds = new HashSet<>(); + try { + List attachedHidDevices = UsbHidUtils.getAttachedHidDevices(); + if (CollectionUtils.isEmpty(attachedHidDevices)) { + return ReturnUtil.failed(BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED.getCode(), BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED.getMessage()); + } + //循环每个USB接口数据 + for (HidDevice hidDevice : attachedHidDevices) { + if (client.openUsbHid(hidDevice)) { + tIds.addAll(receiveTIds(client)); + } + } + if (CollectionUtils.isEmpty(tIds)) { + return ReturnUtil.failed(BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED_OR_NO_TID.getCode(), BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED_OR_NO_TID.getMessage()); + } + return ReturnUtil.success(tIds); + } catch (InterruptedException e) { + log.error("读写器循环读取事件时间设置,异常信息:{}", e.getMessage()); + return ReturnUtil.failed(); + } finally { + client.close(); + } + } + + @Override + public ReturnDTO> codeGunReadList() { + SerialPortUtil serialPortUtil = null; + Set resultSet = new HashSet<>(); + try { + //添加监听器 + serialPortUtil = SerialPortUtil.getSerialPortUtil(); + List ports = serialPortUtil.findPort(); + log.info("有线扫码枪,当前可用串口:{}", ports); + if (CollectionUtils.isEmpty(ports)) { + return ReturnUtil.failed(BusinessExceptionEnum.NO_PROPERLY_CONNECTED.getMessage()); + } + for (String port : ports) { + //有线扫码枪已经设置的是一次读取一个,要是多个这里逻辑需要调整 + serialPort = serialPortUtil.openPort(port, 19200, SerialPort.DATABITS_8, SerialPort.PARITY_NONE, SerialPort.PARITY_ODD); + serialPortUtil.addListener(serialPort, new CodeGunDataListener()); + } + //监听器接收指定时间的数据 + TimeUnit.SECONDS.sleep(10); + resultSet.addAll(CodeGunDataListener.dataSet); + CodeGunDataListener.dataSet = new HashSet<>(); + } catch (Exception e) { + log.error("有线扫码枪识别失败,异常:", e.getMessage()); + return ReturnUtil.failed(BusinessExceptionEnum.HANDLE_FAILED.getMessage()); + } finally { + if (Objects.nonNull(serialPortUtil) && Objects.nonNull(serialPort)) { + //删除监听器 + serialPortUtil.removeListener(serialPort, new CodeGunDataListener()); + serialPortUtil.closePort(serialPort); + } + } + return ReturnUtil.success(resultSet); + } + + @Override + public ReturnDTO> gunAndTIdNewReadList() throws ExecutionException, InterruptedException { + //异步请求大读写器 + ForkJoinTask>> taskResponse = forkJoinPool.submit(new RecursiveTask>>() { + @SneakyThrows + @Override + protected ReturnDTO> compute() { + return tIdNewReadList(); + } + }); + //有线扫码枪(二维码)识别设备id列表 + Set gunSet = queryGunReturnDTO(this.codeGunReadList()); + //大读写器识别tId列表 + Set tIdsSet = queryGunReturnDTO(taskResponse.get()); + Set resultSet = new HashSet<>(); + resultSet.addAll(tIdsSet); + resultSet.addAll(gunSet); + return ReturnUtil.success(resultSet); + } + + @Override + public ReturnDTO> tIdAndMiniReadList() throws ExecutionException, InterruptedException { + //异步请求大读写器 + ForkJoinTask>> taskResponse = forkJoinPool.submit(new RecursiveTask>>() { + @SneakyThrows + @Override + protected ReturnDTO> compute() { + return tIdNewReadList(); + } + }); + //小读写器识别tId列表 + ReturnDTO> minTIdReturnDTO = this.tIdMiniReadList(); + Set minTIdsSet = new HashSet<>(); + if (ReturnUtil.success().getCode().equals(minTIdReturnDTO.getCode()) && Objects.nonNull(minTIdReturnDTO.getData())) { + minTIdsSet.addAll(minTIdReturnDTO.getData()); + } + //大读写器识别tId列表 + Set tIdsSet = queryGunReturnDTO(taskResponse.get()); + Set resultSet = new HashSet<>(); + resultSet.addAll(tIdsSet); + resultSet.addAll(minTIdsSet); + return ReturnUtil.success(resultSet); + } + + private Set receiveNewTIds(CommonReader reader) throws InterruptedException { + Set tIds = new HashSet<>(); +// boolean a = reader.BuzzerControl(true, false);//蜂鸣器协议 +// ScanTagParameter param = new ScanTagParameter(); +// param.antenna = 0x0001; +// param.isLoop = true;//持续盘点 +// boolean b = reader.reader_Inventory(param, (byte) 0x0001); + //四个天线都开填0x0F,需要4个天线都连上才行 + boolean b1 = reader.ScanTID(0x0001, true, 1111); + log.info("大读写器开始盘点:" + b1); + reader.OnTagDataReceivedHandle = (gateName, tagData) -> { + if (tagData != null && tagData.getTID() != null) { + String tid = Util.convertByteArrayToHexString(tagData.getTID()); + log.info("大读写器TID标签读取成功"); + tIds.add(tid); + } + }; + //连续读取3s + TimeUnit.SECONDS.sleep(3); +// reader.disconnect(); + boolean stop = reader.reader_StopInventory(); + return tIds; + } + + private Set receiveTIds(GClient client) throws InterruptedException { + Set tIds = new HashSet<>(); + //标签上报事件、结束事件订阅 + eventSubscribe(tIds, client); + + // 4个天线读卡, 读取EPC数据区以及TID数据区 + MsgBaseInventoryEpc msgBaseInventoryEpc = new MsgBaseInventoryEpc(); + msgBaseInventoryEpc.setAntennaEnable(EnumG.AntennaNo_1 | EnumG.AntennaNo_2 | EnumG.AntennaNo_3 | EnumG.AntennaNo_4); + // 0: 单次读取模式,读写器尽在各个使能的天线上进行一轮读卡操作便结束读卡操作并自动进入空闲状态 + // 1: 连续读取模式,读写器一直进行读卡操作直到读写器收到停止指令后结束读卡 + msgBaseInventoryEpc.setInventoryMode(EnumG.InventoryMode_Inventory); + ParamEpcReadTid tid = new ParamEpcReadTid(); + tid.setMode(EnumG.ParamTidMode_Auto); + tid.setLen(6); + msgBaseInventoryEpc.setReadTid(tid); + client.sendSynMsg(msgBaseInventoryEpc); + if (0 == msgBaseInventoryEpc.getRtCode()) { + log.info("EPC、TID标签读取成功"); + } else { + log.info("EPC、TID标签读取失败"); + client.close(); + return new HashSet<>(); + } + //连续读取,让事件接收3秒,也可采用单次读取方式(没有连续读取识别效果好) + TimeUnit.SECONDS.sleep(3); + // 停止指令,空闲态 + MsgBaseStop msgBaseStop = new MsgBaseStop(); + client.sendSynMsg(msgBaseStop); + if (0 == msgBaseStop.getRtCode()) { + log.info("EPC、TID标签停止读取成功"); + } else { + log.info("EPC、TID标签停止读取失败"); + } + return tIds; + } + + private void eventSubscribe(Set set, GClient client) { + // 订阅标签上报事件 + client.onTagEpcLog = new HandlerTagEpcLog() { + @Override + public void log(String readName, LogBaseEpcInfo logBaseEpcInfo) { + // 回调内部如有阻塞,会影响API正常使用 + // 标签回调数量较多,请将标签数据先缓存起来再作业务处理 + if (null != logBaseEpcInfo && 0 == logBaseEpcInfo.getResult()) { + System.out.println(logBaseEpcInfo); + log.info("收到标签上报事件,{}", logBaseEpcInfo.toString()); + set.add(logBaseEpcInfo.getTid()); + } + } + }; + // 上报结束事件 + client.onTagEpcOver = new HandlerTagEpcOver() { + @Override + public void log(String readName, LogBaseEpcOver logBaseEpcOver) { + if (null != logBaseEpcOver) { + log.info("收到标签上报结束事件,{}", logBaseEpcOver.toString()); + } + } + }; + } + + private Set queryGunReturnDTO(ReturnDTO> setReturnDTO) { + Set gunSet = new HashSet<>(); + ReturnDTO> gunReturnDTO = setReturnDTO; + if (ReturnUtil.success().getCode().equals(gunReturnDTO.getCode()) && Objects.nonNull(gunReturnDTO.getData())) { + gunSet.addAll(gunReturnDTO.getData()); + } + return gunSet; + } + +} diff --git a/src/main/java/com/casic/missiles/utils/SerialPortUtil.java b/src/main/java/com/casic/missiles/utils/SerialPortUtil.java new file mode 100644 index 0000000..634fc3c --- /dev/null +++ b/src/main/java/com/casic/missiles/utils/SerialPortUtil.java @@ -0,0 +1,211 @@ +package com.casic.missiles.utils; + +import gnu.io.*; +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; +import java.util.TooManyListenersException; + +/** + * @Description: USB串口通信工具 + * @Author: wangpeng + * @Date: 2023/4/4 16:19 + */ +@Slf4j +public class SerialPortUtil { + private static SerialPortUtil serialPortUtil = null; + + static { + //在该类被ClassLoader加载时就初始化一个SerialTool对象 + if (serialPortUtil == null) { + serialPortUtil = new SerialPortUtil(); + } + } + + //私有化SerialTool类的构造方法,不允许其他类生成SerialTool对象 + private SerialPortUtil() { + } + + /** + * 获取提供服务的SerialTool对象 + * @return serialPortUtil + */ + public static SerialPortUtil getSerialPortUtil() { + if (serialPortUtil == null) { + serialPortUtil = new SerialPortUtil(); + } + return serialPortUtil; + } + + /** + * 查找所有可用端口 + * @return 可用端口名称列表 + */ + public List findPort() { + //获得当前所有可用串口 + Enumeration portList = CommPortIdentifier.getPortIdentifiers(); + List portNameList = new ArrayList<>(); + //将可用串口名添加到List并返回该List + while (portList.hasMoreElements()) { + String portName = portList.nextElement().getName(); + portNameList.add(portName); + } + return portNameList; + } + + /** + * 打开串口 + * @param portName 端口名称 + * @param baudrate 波特率 19200 + * @param databits 数据位 8 + * @param parity 校验位(奇偶位) NONE :0 + * @param stopbits 停止位 1 + * @return 串口对象 + */ + public SerialPort openPort(String portName, int baudrate, int databits, int parity, int stopbits) { + try { + //通过端口名识别端口 + CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName); + //打开端口,并给端口名字和一个timeout(打开操作的超时时间) + CommPort commPort = portIdentifier.open(portName, 2000); + //判断是不是串口 + if (commPort instanceof SerialPort) { + SerialPort serialPort = (SerialPort) commPort; + try { + //设置一下串口的波特率等参数 + serialPort.setSerialPortParams(baudrate, databits, stopbits, parity); + } catch (UnsupportedCommOperationException e) { + } +// System.out.println("Open " + portName + " sucessfully !"); + return serialPort; + } else { + log.error("串口通信工具-不是串口"); + } + } catch (NoSuchPortException e1) { + log.error("串口通信工具-没有找到端口"); + e1.printStackTrace(); + } catch (PortInUseException e2) { + log.error("串口通信工具-端口被占用"); + e2.printStackTrace(); + } + return null; + } + + /** + * 关闭串口 + * @param serialPort 待关闭的串口对象 + */ + public void closePort(SerialPort serialPort) { + if (serialPort != null) { + serialPort.close(); + } + } + + /** + * 往串口发送数据 + * @param serialPort 串口对象 + * @param order 待发送数据 + */ + public void sendToPort(SerialPort serialPort, byte[] order) { + OutputStream out = null; + try { + out = serialPort.getOutputStream(); + out.write(order); + out.flush(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (out != null) { + out.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + /** + * 从串口读取数据 + * @param serialPort 当前已建立连接的SerialPort对象 + * @return 读取到的数据 + */ + public byte[] readFromPort(SerialPort serialPort) { + InputStream in = null; + byte[] bytes = null; + try { + in = serialPort.getInputStream(); + int bufflenth = in.available(); + while (bufflenth != 0) { + bytes = new byte[bufflenth]; + in.read(bytes); + bufflenth = in.available(); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (in != null) { + in.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + return bytes; + } + + /** + * 添加监听器 + * @param port 串口对象 + * @param listener 串口监听器 + */ + public void addListener(SerialPort port, SerialPortEventListener listener) { + try { + //给串口添加监听器 + port.addEventListener(listener); + //设置当有数据到达时唤醒监听接收线程 + port.notifyOnDataAvailable(true); + //设置当通信中断时唤醒中断线程 + port.notifyOnBreakInterrupt(true); + } catch (TooManyListenersException e) { +// throw new TooManyListeners(); + log.error("串口通信工具-监听器设置过多"); + e.printStackTrace(); + } + } + + /** + * 删除监听器 + * @param port 串口对象 + * @param listener 串口监听器 + */ + public void removeListener(SerialPort port, SerialPortEventListener listener) { + //删除串口监听器 + port.removeEventListener(); + } + + /** + * 设置串口的Listener + * @param serialPort + * @param listener + */ + public static void setListenerToSerialPort(SerialPort serialPort, SerialPortEventListener listener){ + try { + //给串口添加事件监听 + serialPort.addEventListener(listener); + } catch (TooManyListenersException e) { + e.printStackTrace(); + } + //串口有数据监听 + serialPort.notifyOnDataAvailable(true); + //中断事件监听 + serialPort.notifyOnBreakInterrupt(true); + } + +} diff --git a/src/main/java/com/casic/missiles/utils/SpringContextUtil.java b/src/main/java/com/casic/missiles/utils/SpringContextUtil.java new file mode 100644 index 0000000..6f12ec7 --- /dev/null +++ b/src/main/java/com/casic/missiles/utils/SpringContextUtil.java @@ -0,0 +1,102 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (!StringUtils.isEmpty(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..e48d589 --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,10 @@ +server: + port: 8083 + +logging: + config: classpath:logback-spring.xml + level.root: info + level.com.casic: debug + level.org.springframework.web: info +log: + path: D:\metering\casic-metering-readwriter-1.0-SNAPSHOT \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..5287d96 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/../../../../:\code\casic-metering-readwriter\.idea/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..3c031c9 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..63e9001 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..9907c1d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..4b661a5 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..033c242 --- /dev/null +++ b/pom.xml @@ -0,0 +1,85 @@ + + + 4.0.0 + + com.casic.missiles + casic-metering-readwriter + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.4.5 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + + + + com.new.reader + reader-api + 1.0 + + + + + com.gg.reader + greader-api + 1.0 + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.0.2 + + + + **/*-*.yml + + + + com.casic.missiles.CasicApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.3.0 + + false + + src/main/build/package.xml + + + + + make-assembly + package + + single + + + + + + + + \ No newline at end of file diff --git a/src/main/build/bin/start.bat b/src/main/build/bin/start.bat new file mode 100644 index 0000000..f7270e6 --- /dev/null +++ b/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title casic-metering-readwriter-1.0-SNAPSHOT.jar +java -jar D:\metering\casic-metering-readwriter-1.0-SNAPSHOT\lib\casic-metering-readwriter-1.0-SNAPSHOT.jar +@pause diff --git a/src/main/build/bin/start.sh b/src/main/build/bin/start.sh new file mode 100644 index 0000000..c4722ff --- /dev/null +++ b/src/main/build/bin/start.sh @@ -0,0 +1 @@ +java -jar ./lib/casic-metering-readwriter-1.0-SNAPSHOT.jar \ No newline at end of file diff --git a/src/main/build/package.xml b/src/main/build/package.xml new file mode 100644 index 0000000..97bc675 --- /dev/null +++ b/src/main/build/package.xml @@ -0,0 +1,43 @@ + + + package + + zip + + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/src/main/java/com/casic/missiles/CasicApplication.java b/src/main/java/com/casic/missiles/CasicApplication.java new file mode 100644 index 0000000..36fdfee --- /dev/null +++ b/src/main/java/com/casic/missiles/CasicApplication.java @@ -0,0 +1,19 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @Description: SpringBoot启动类 + * @Author: wangpeng + * @Date: 2023/6/15 15:27 + */ +@Slf4j +@SpringBootApplication +public class CasicApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApplication.class,args); + log.info("CasicApplication is success!"); + } +} diff --git a/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java b/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java new file mode 100644 index 0000000..836c0bf --- /dev/null +++ b/src/main/java/com/casic/missiles/common/AbstractBaseExceptionEnum.java @@ -0,0 +1,23 @@ +package com.casic.missiles.common; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:12 + */ +public interface AbstractBaseExceptionEnum { + /** + * 获取异常的状态码 + * + * @return 异常状态码 + */ + Integer getCode(); + + + /** + * 获取异常的提示信息 + * + * @return 异常提示消息 + */ + String getMessage(); +} diff --git a/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java b/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java new file mode 100644 index 0000000..75763c2 --- /dev/null +++ b/src/main/java/com/casic/missiles/common/BusinessExceptionEnum.java @@ -0,0 +1,110 @@ +package com.casic.missiles.common; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + TRAIN_STAFF_NULL(2400, "培训学员不能为空"), + TRAIN_LOG_ID_NULL(2400, "培训记录主键不能为空"), + ORGANIZE_ID_NULL(2400, "计量组织主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + EDUCATION_NOT_EXISTENCE(2300, "导入文化程度不存在;"), + TECHNOLOGY_JOB_NOT_EXISTENCE(2300, "导入技术职位不存在;"), + ADMINISTRATION_JOB_NOT_EXISTENCE(2300, "导入行政职务不存在;"), + DEPT_NOT_EXISTENCE(2300, "导入部门不存在;"), + SEX_NOT_CORRECT(2300, "性别填写有误(男,女);"), + MAIN_EXAMINER_NOT_CORRECT(2300, "是否主考人填写有误(是,否);"), + SPECIAL_OPERATOR_NOT_CORRECT(2300, "是否特操人填写有误(是,否);"), + TECHNOLOGY_EXAM_NOT_CORRECT(2300, "是否技术考核填写有误(是,否);"), + WORK_DATE_NOT_CORRECT(2300, "从事日期格式错误(2022-15-05);"), + BIRTHDAY_NOT_CORRECT(2300, "生日格式错误(2022-15-05);"), + CERTIFICATE_DATE_NOT_CORRECT(2300, "发证日期格式错误(2022-15-05);"), + VALID_DATE_NOT_CORRECT(2300, "有效日期格式错误(2022-15-05);"), + STAFF_NOT_EXISTENCE(2300, "人员编号不存在"), + CHECK_TYPE_NOT_EXISTENCE(2300, "校验类型不存在;"), + PRICE_TYPE_NOT_EXISTENCE(2300, "价格类别不存在;"), + PRICE_ITEM_NOT_EXISTENCE(2300, "项目不存在;"), + OPERATOR_DISCOUNT_PERMISSION_NOT_EXISTENCE(2300, "业务员折扣权限不存在;"), + DIRECTOR_DISCOUNT_PERMISSION_NOT_EXISTENCE(2300, "负责人折扣权限不存在;"), + TRACE_SUPPLIER_ID_NULL(2400, "培训记录主键不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + NOT_FOUND_USER_INFO(2402, "未找到用户信息"), + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRAIN_PLAN_SAVE_FAILED(2403, "培训计划保存至草稿箱失败"), + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + TRAIN_PLAN_SUBMIT_FAILED(2406, "培训计划提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java new file mode 100644 index 0000000..d54b93a --- /dev/null +++ b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java @@ -0,0 +1,74 @@ +package com.casic.missiles.cotroller; + +import com.casic.missiles.model.ReturnDTO; +import com.casic.missiles.service.IBusinessReadWriterService; +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.Set; +import java.util.concurrent.ExecutionException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:01 + */ +@Slf4j +@RestController +@RequestMapping("/business/readWriter") +public class BusinessReadWriterController { + @Autowired + private IBusinessReadWriterService readWriterService; + + /** + * 获取大读写器识别的标签TID列表 + * 大读写器 + * TCP连接,需配置和192.168.1.201一个段 + * 读取读写器获取标签TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @GetMapping("/tId/readList") + public ReturnDTO> tIdNewReadList() { + return readWriterService.tIdNewReadList(); + } + + /** + * 获取小读写器识别的标签TID列表 + * USB-HID连接(HID是一种USB通信协议,无需安装驱动就能进行交互) + * 读取读写器获取TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @GetMapping("/tId/mini/readList") + public ReturnDTO> tIdMiniReadList() { + return readWriterService.tIdMiniReadList(); + } + + /** + * 获取有线扫码枪识别列表(二维码) + * USB串口连接(模拟COM口),USB模拟串行通讯模式,连接后在设备管理器-端口(COM和LPT)可查看连接设备 + * 目前设置:扫码一次读取一个,扫码结果无回车 + * 二维码由样品编号/设备编号生成 + * 扫描收入、扫描检完等,以及大读写器的补充(包括新建委托书和待收入中使用) + */ + @GetMapping("/code/gun/readList") + public ReturnDTO> codeGunReadList() { + return readWriterService.codeGunReadList(); + } + + /** + * 有线扫码枪(二维码)和大读写器结合扫描 + */ + @GetMapping("/gunAndTId/readList") + public ReturnDTO> equipmentLabelReadList() throws ExecutionException, InterruptedException { + return readWriterService.gunAndTIdNewReadList(); + } + + /** + * 大读写器和小读写器识别结合的结果TID列表 + */ + @GetMapping("/tIdAndMini/readList") + public ReturnDTO> allTidReadList() throws ExecutionException, InterruptedException { + return readWriterService.tIdAndMiniReadList(); + } +} diff --git a/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java b/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java new file mode 100644 index 0000000..89095aa --- /dev/null +++ b/src/main/java/com/casic/missiles/listeners/CodeGunDataListener.java @@ -0,0 +1,27 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.service.impl.BusinessReadWriterServiceImpl; +import com.casic.missiles.utils.SerialPortUtil; +import gnu.io.SerialPortEvent; +import gnu.io.SerialPortEventListener; + +import java.util.HashSet; +import java.util.Set; + +/** + * @Description: 设备串口接收数据监听器 + * @Author: wangpeng + * @Date: 2023/4/4 16:46 + */ +public class CodeGunDataListener implements SerialPortEventListener { + public static Set dataSet = new HashSet<>(); + + @Override + public void serialEvent(SerialPortEvent event) { + if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) { + SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil(); + byte[] bytes = serialPortUtil.readFromPort(BusinessReadWriterServiceImpl.serialPort); + dataSet.add(new String(bytes, 0, bytes.length).trim()); + } + } +} diff --git a/src/main/java/com/casic/missiles/model/ErrorResponseData.java b/src/main/java/com/casic/missiles/model/ErrorResponseData.java new file mode 100644 index 0000000..af437a5 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ErrorResponseData.java @@ -0,0 +1,26 @@ +package com.casic.missiles.model; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:07 + */ +public class ErrorResponseData extends ResponseData { + + /** + * 异常的具体类名称 + */ + private String exceptionClazz; + + public ErrorResponseData(String message) { + super(false, ResponseData.DEFAULT_ERROR_CODE, message, null); + } + + public ErrorResponseData(Integer code, String message) { + super(false, code, message, null); + } + + public ErrorResponseData(Integer code, String message, Object object) { + super(false, code, message, object); + } +} diff --git a/src/main/java/com/casic/missiles/model/ResponseData.java b/src/main/java/com/casic/missiles/model/ResponseData.java new file mode 100644 index 0000000..9e9c910 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ResponseData.java @@ -0,0 +1,73 @@ +package com.casic.missiles.model; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:06 + */ +@Data +public class ResponseData { + public static final String DEFAULT_SUCCESS_MESSAGE = "请求成功"; + + public static final String DEFAULT_ERROR_MESSAGE = "网络异常"; + + public static final Integer DEFAULT_SUCCESS_CODE = 200; + + public static final Integer DEFAULT_ERROR_CODE = 500; + + /** + * 请求是否成功 + */ + private Boolean success; + + /** + * 响应状态码 + */ + private Integer code; + + /** + * 响应信息 + */ + private String message; + + /** + * 响应对象 + */ + private Object data; + + public ResponseData() { + } + + public ResponseData(Boolean success, Integer code, String message, Object data) { + this.success = success; + this.code = code; + this.message = message; + this.data = data; + } + + public static SuccessResponseData success() { + return new SuccessResponseData(); + } + + public static SuccessResponseData success(Object object) { + return new SuccessResponseData(object); + } + + public static SuccessResponseData success(Integer code, String message, Object object) { + return new SuccessResponseData(code, message, object); + } + + public static ErrorResponseData error(String message) { + return new ErrorResponseData(message); + } + + public static ErrorResponseData error(Integer code, String message) { + return new ErrorResponseData(code, message); + } + + public static ErrorResponseData error(Integer code, String message, Object object) { + return new ErrorResponseData(code, message, object); + } +} diff --git a/src/main/java/com/casic/missiles/model/ReturnDTO.java b/src/main/java/com/casic/missiles/model/ReturnDTO.java new file mode 100644 index 0000000..4c102f2 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ReturnDTO.java @@ -0,0 +1,31 @@ +package com.casic.missiles.model; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:05 + */ +@Data +public class ReturnDTO implements Serializable { + private Integer code; + private String message; + private T data; + + public ReturnDTO(Integer code, String message, T data) { + this.code = code; + this.message = message; + this.data = data; + } + + public ReturnDTO(Integer code, String message) { + this.code = code; + this.message = message; + } + + public ReturnDTO() { + } +} diff --git a/src/main/java/com/casic/missiles/model/ReturnUtil.java b/src/main/java/com/casic/missiles/model/ReturnUtil.java new file mode 100644 index 0000000..c30a732 --- /dev/null +++ b/src/main/java/com/casic/missiles/model/ReturnUtil.java @@ -0,0 +1,36 @@ +package com.casic.missiles.model; + +/** + * @Description: for return + * @Author: wangpeng + * @Date: 2022/11/27 00:56 + */ +public class ReturnUtil { + public ReturnUtil() { + } + + public static ReturnDTO success() { + return new ReturnDTO(ResponseData.DEFAULT_SUCCESS_CODE, ResponseData.DEFAULT_SUCCESS_MESSAGE); + } + + public static ReturnDTO success(Object data) { + return new ReturnDTO(ResponseData.DEFAULT_SUCCESS_CODE, ResponseData.DEFAULT_SUCCESS_MESSAGE, data); + } + + public static ReturnDTO success(Integer code, String message) { + return new ReturnDTO(code, message); + } + + public static ReturnDTO failed() { + return new ReturnDTO(ResponseData.DEFAULT_ERROR_CODE, ResponseData.DEFAULT_ERROR_MESSAGE); + } + + public static ReturnDTO failed(String message) { + return new ReturnDTO(ResponseData.DEFAULT_ERROR_CODE, message); + } + + public static ReturnDTO failed(Integer code, String message) { + return new ReturnDTO(code, message); + } + +} diff --git a/src/main/java/com/casic/missiles/model/SuccessResponseData.java b/src/main/java/com/casic/missiles/model/SuccessResponseData.java new file mode 100644 index 0000000..a54debe --- /dev/null +++ b/src/main/java/com/casic/missiles/model/SuccessResponseData.java @@ -0,0 +1,21 @@ +package com.casic.missiles.model; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:07 + */ +public class SuccessResponseData extends ResponseData { + + public SuccessResponseData() { + super(true, DEFAULT_SUCCESS_CODE, DEFAULT_SUCCESS_MESSAGE, null); + } + + public SuccessResponseData(Object object) { + super(true, DEFAULT_SUCCESS_CODE, DEFAULT_SUCCESS_MESSAGE, object); + } + + public SuccessResponseData(Integer code, String message, Object object) { + super(true, code, message, object); + } +} diff --git a/src/main/java/com/casic/missiles/service/IBusinessReadWriterService.java b/src/main/java/com/casic/missiles/service/IBusinessReadWriterService.java new file mode 100644 index 0000000..745a727 --- /dev/null +++ b/src/main/java/com/casic/missiles/service/IBusinessReadWriterService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.service; + +import com.casic.missiles.model.ReturnDTO; + +import java.util.Set; +import java.util.concurrent.ExecutionException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:02 + */ +public interface IBusinessReadWriterService { + ReturnDTO> tIdNewReadList(); + + ReturnDTO> tIdMiniReadList(); + + ReturnDTO> codeGunReadList(); + + ReturnDTO> gunAndTIdNewReadList() throws ExecutionException, InterruptedException; + + ReturnDTO> tIdAndMiniReadList() throws ExecutionException, InterruptedException; +} diff --git a/src/main/java/com/casic/missiles/service/impl/BusinessReadWriterServiceImpl.java b/src/main/java/com/casic/missiles/service/impl/BusinessReadWriterServiceImpl.java new file mode 100644 index 0000000..1f3a09e --- /dev/null +++ b/src/main/java/com/casic/missiles/service/impl/BusinessReadWriterServiceImpl.java @@ -0,0 +1,278 @@ +package com.casic.missiles.service.impl; + +import com.casic.missiles.common.BusinessExceptionEnum; +import com.casic.missiles.listeners.CodeGunDataListener; +import com.casic.missiles.model.ReturnDTO; +import com.casic.missiles.model.ReturnUtil; +import com.casic.missiles.service.IBusinessReadWriterService; +import com.casic.missiles.utils.SerialPortUtil; +import com.gg.reader.api.dal.GClient; +import com.gg.reader.api.dal.HandlerTagEpcLog; +import com.gg.reader.api.dal.HandlerTagEpcOver; +import com.gg.reader.api.protocol.gx.*; +import com.gg.reader.api.utils.UsbHidUtils; +import com.rfid.API.CommonReader; +import com.rfid.API.ProtocolVersion; +import com.rfid.API.Util; +import com.rfid.API.core.BaseReader; +import com.rfid.ui.GlobalData; +import gnu.io.SerialPort; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.hid4java.HidDevice; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.concurrent.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/6/15 16:03 + */ +@Slf4j +@Service +public class BusinessReadWriterServiceImpl implements IBusinessReadWriterService { + @Autowired + private ForkJoinPool forkJoinPool; + + public static SerialPort serialPort = null; + + @Override + public ReturnDTO> tIdNewReadList() { + CommonReader reader = new CommonReader("Reader1", GlobalData.ConnectType.TcpClient.name(), "192.168.1.201:9090"); + try { +// CommonReader reader = new CommonReader("Reader1", "RS232", "COM20:115200"); +// CommonReader reader = new CommonReader("Reader1", "USB-HID", ""); + reader.setProtocol(ProtocolVersion.CRP); + reader.setReaderProtocol(ProtocolVersion.CRP); +// reader.setPortSum(4);//只对LRP的有效 + reader.connect(false, new BaseReader.IConnectListener() { + @Override + public void callback(boolean b) { +// log.info("大读写器设备连接状态:" + b); + } + }); + if (reader.getIsConnected() == true) { + Set tIds = receiveNewTIds(reader); + if (CollectionUtils.isEmpty(tIds)) { + return ReturnUtil.failed(BusinessExceptionEnum.FAIL_READ_EPC_TID.getCode(), BusinessExceptionEnum.FAIL_READ_EPC_TID.getMessage()); + } + return ReturnUtil.success(tIds); + } else { + return ReturnUtil.failed(BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED.getCode(), BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED.getMessage()); + } + } catch (InterruptedException e) { + log.error("大读写器读取标签异常:{}", e.getMessage()); + return ReturnUtil.failed(BusinessExceptionEnum.FAIL_READ_EPC_TID.getCode(), BusinessExceptionEnum.FAIL_READ_EPC_TID.getMessage()); + } finally { + //不断开连接,读写器会每秒发送心跳 +// reader.disconnect(); + } + } + + @Override + public ReturnDTO> tIdMiniReadList() { + GClient client = new GClient(); + Set tIds = new HashSet<>(); + try { + List attachedHidDevices = UsbHidUtils.getAttachedHidDevices(); + if (CollectionUtils.isEmpty(attachedHidDevices)) { + return ReturnUtil.failed(BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED.getCode(), BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED.getMessage()); + } + //循环每个USB接口数据 + for (HidDevice hidDevice : attachedHidDevices) { + if (client.openUsbHid(hidDevice)) { + tIds.addAll(receiveTIds(client)); + } + } + if (CollectionUtils.isEmpty(tIds)) { + return ReturnUtil.failed(BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED_OR_NO_TID.getCode(), BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED_OR_NO_TID.getMessage()); + } + return ReturnUtil.success(tIds); + } catch (InterruptedException e) { + log.error("读写器循环读取事件时间设置,异常信息:{}", e.getMessage()); + return ReturnUtil.failed(); + } finally { + client.close(); + } + } + + @Override + public ReturnDTO> codeGunReadList() { + SerialPortUtil serialPortUtil = null; + Set resultSet = new HashSet<>(); + try { + //添加监听器 + serialPortUtil = SerialPortUtil.getSerialPortUtil(); + List ports = serialPortUtil.findPort(); + log.info("有线扫码枪,当前可用串口:{}", ports); + if (CollectionUtils.isEmpty(ports)) { + return ReturnUtil.failed(BusinessExceptionEnum.NO_PROPERLY_CONNECTED.getMessage()); + } + for (String port : ports) { + //有线扫码枪已经设置的是一次读取一个,要是多个这里逻辑需要调整 + serialPort = serialPortUtil.openPort(port, 19200, SerialPort.DATABITS_8, SerialPort.PARITY_NONE, SerialPort.PARITY_ODD); + serialPortUtil.addListener(serialPort, new CodeGunDataListener()); + } + //监听器接收指定时间的数据 + TimeUnit.SECONDS.sleep(10); + resultSet.addAll(CodeGunDataListener.dataSet); + CodeGunDataListener.dataSet = new HashSet<>(); + } catch (Exception e) { + log.error("有线扫码枪识别失败,异常:", e.getMessage()); + return ReturnUtil.failed(BusinessExceptionEnum.HANDLE_FAILED.getMessage()); + } finally { + if (Objects.nonNull(serialPortUtil) && Objects.nonNull(serialPort)) { + //删除监听器 + serialPortUtil.removeListener(serialPort, new CodeGunDataListener()); + serialPortUtil.closePort(serialPort); + } + } + return ReturnUtil.success(resultSet); + } + + @Override + public ReturnDTO> gunAndTIdNewReadList() throws ExecutionException, InterruptedException { + //异步请求大读写器 + ForkJoinTask>> taskResponse = forkJoinPool.submit(new RecursiveTask>>() { + @SneakyThrows + @Override + protected ReturnDTO> compute() { + return tIdNewReadList(); + } + }); + //有线扫码枪(二维码)识别设备id列表 + Set gunSet = queryGunReturnDTO(this.codeGunReadList()); + //大读写器识别tId列表 + Set tIdsSet = queryGunReturnDTO(taskResponse.get()); + Set resultSet = new HashSet<>(); + resultSet.addAll(tIdsSet); + resultSet.addAll(gunSet); + return ReturnUtil.success(resultSet); + } + + @Override + public ReturnDTO> tIdAndMiniReadList() throws ExecutionException, InterruptedException { + //异步请求大读写器 + ForkJoinTask>> taskResponse = forkJoinPool.submit(new RecursiveTask>>() { + @SneakyThrows + @Override + protected ReturnDTO> compute() { + return tIdNewReadList(); + } + }); + //小读写器识别tId列表 + ReturnDTO> minTIdReturnDTO = this.tIdMiniReadList(); + Set minTIdsSet = new HashSet<>(); + if (ReturnUtil.success().getCode().equals(minTIdReturnDTO.getCode()) && Objects.nonNull(minTIdReturnDTO.getData())) { + minTIdsSet.addAll(minTIdReturnDTO.getData()); + } + //大读写器识别tId列表 + Set tIdsSet = queryGunReturnDTO(taskResponse.get()); + Set resultSet = new HashSet<>(); + resultSet.addAll(tIdsSet); + resultSet.addAll(minTIdsSet); + return ReturnUtil.success(resultSet); + } + + private Set receiveNewTIds(CommonReader reader) throws InterruptedException { + Set tIds = new HashSet<>(); +// boolean a = reader.BuzzerControl(true, false);//蜂鸣器协议 +// ScanTagParameter param = new ScanTagParameter(); +// param.antenna = 0x0001; +// param.isLoop = true;//持续盘点 +// boolean b = reader.reader_Inventory(param, (byte) 0x0001); + //四个天线都开填0x0F,需要4个天线都连上才行 + boolean b1 = reader.ScanTID(0x0001, true, 1111); + log.info("大读写器开始盘点:" + b1); + reader.OnTagDataReceivedHandle = (gateName, tagData) -> { + if (tagData != null && tagData.getTID() != null) { + String tid = Util.convertByteArrayToHexString(tagData.getTID()); + log.info("大读写器TID标签读取成功"); + tIds.add(tid); + } + }; + //连续读取3s + TimeUnit.SECONDS.sleep(3); +// reader.disconnect(); + boolean stop = reader.reader_StopInventory(); + return tIds; + } + + private Set receiveTIds(GClient client) throws InterruptedException { + Set tIds = new HashSet<>(); + //标签上报事件、结束事件订阅 + eventSubscribe(tIds, client); + + // 4个天线读卡, 读取EPC数据区以及TID数据区 + MsgBaseInventoryEpc msgBaseInventoryEpc = new MsgBaseInventoryEpc(); + msgBaseInventoryEpc.setAntennaEnable(EnumG.AntennaNo_1 | EnumG.AntennaNo_2 | EnumG.AntennaNo_3 | EnumG.AntennaNo_4); + // 0: 单次读取模式,读写器尽在各个使能的天线上进行一轮读卡操作便结束读卡操作并自动进入空闲状态 + // 1: 连续读取模式,读写器一直进行读卡操作直到读写器收到停止指令后结束读卡 + msgBaseInventoryEpc.setInventoryMode(EnumG.InventoryMode_Inventory); + ParamEpcReadTid tid = new ParamEpcReadTid(); + tid.setMode(EnumG.ParamTidMode_Auto); + tid.setLen(6); + msgBaseInventoryEpc.setReadTid(tid); + client.sendSynMsg(msgBaseInventoryEpc); + if (0 == msgBaseInventoryEpc.getRtCode()) { + log.info("EPC、TID标签读取成功"); + } else { + log.info("EPC、TID标签读取失败"); + client.close(); + return new HashSet<>(); + } + //连续读取,让事件接收3秒,也可采用单次读取方式(没有连续读取识别效果好) + TimeUnit.SECONDS.sleep(3); + // 停止指令,空闲态 + MsgBaseStop msgBaseStop = new MsgBaseStop(); + client.sendSynMsg(msgBaseStop); + if (0 == msgBaseStop.getRtCode()) { + log.info("EPC、TID标签停止读取成功"); + } else { + log.info("EPC、TID标签停止读取失败"); + } + return tIds; + } + + private void eventSubscribe(Set set, GClient client) { + // 订阅标签上报事件 + client.onTagEpcLog = new HandlerTagEpcLog() { + @Override + public void log(String readName, LogBaseEpcInfo logBaseEpcInfo) { + // 回调内部如有阻塞,会影响API正常使用 + // 标签回调数量较多,请将标签数据先缓存起来再作业务处理 + if (null != logBaseEpcInfo && 0 == logBaseEpcInfo.getResult()) { + System.out.println(logBaseEpcInfo); + log.info("收到标签上报事件,{}", logBaseEpcInfo.toString()); + set.add(logBaseEpcInfo.getTid()); + } + } + }; + // 上报结束事件 + client.onTagEpcOver = new HandlerTagEpcOver() { + @Override + public void log(String readName, LogBaseEpcOver logBaseEpcOver) { + if (null != logBaseEpcOver) { + log.info("收到标签上报结束事件,{}", logBaseEpcOver.toString()); + } + } + }; + } + + private Set queryGunReturnDTO(ReturnDTO> setReturnDTO) { + Set gunSet = new HashSet<>(); + ReturnDTO> gunReturnDTO = setReturnDTO; + if (ReturnUtil.success().getCode().equals(gunReturnDTO.getCode()) && Objects.nonNull(gunReturnDTO.getData())) { + gunSet.addAll(gunReturnDTO.getData()); + } + return gunSet; + } + +} diff --git a/src/main/java/com/casic/missiles/utils/SerialPortUtil.java b/src/main/java/com/casic/missiles/utils/SerialPortUtil.java new file mode 100644 index 0000000..634fc3c --- /dev/null +++ b/src/main/java/com/casic/missiles/utils/SerialPortUtil.java @@ -0,0 +1,211 @@ +package com.casic.missiles.utils; + +import gnu.io.*; +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; +import java.util.TooManyListenersException; + +/** + * @Description: USB串口通信工具 + * @Author: wangpeng + * @Date: 2023/4/4 16:19 + */ +@Slf4j +public class SerialPortUtil { + private static SerialPortUtil serialPortUtil = null; + + static { + //在该类被ClassLoader加载时就初始化一个SerialTool对象 + if (serialPortUtil == null) { + serialPortUtil = new SerialPortUtil(); + } + } + + //私有化SerialTool类的构造方法,不允许其他类生成SerialTool对象 + private SerialPortUtil() { + } + + /** + * 获取提供服务的SerialTool对象 + * @return serialPortUtil + */ + public static SerialPortUtil getSerialPortUtil() { + if (serialPortUtil == null) { + serialPortUtil = new SerialPortUtil(); + } + return serialPortUtil; + } + + /** + * 查找所有可用端口 + * @return 可用端口名称列表 + */ + public List findPort() { + //获得当前所有可用串口 + Enumeration portList = CommPortIdentifier.getPortIdentifiers(); + List portNameList = new ArrayList<>(); + //将可用串口名添加到List并返回该List + while (portList.hasMoreElements()) { + String portName = portList.nextElement().getName(); + portNameList.add(portName); + } + return portNameList; + } + + /** + * 打开串口 + * @param portName 端口名称 + * @param baudrate 波特率 19200 + * @param databits 数据位 8 + * @param parity 校验位(奇偶位) NONE :0 + * @param stopbits 停止位 1 + * @return 串口对象 + */ + public SerialPort openPort(String portName, int baudrate, int databits, int parity, int stopbits) { + try { + //通过端口名识别端口 + CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName); + //打开端口,并给端口名字和一个timeout(打开操作的超时时间) + CommPort commPort = portIdentifier.open(portName, 2000); + //判断是不是串口 + if (commPort instanceof SerialPort) { + SerialPort serialPort = (SerialPort) commPort; + try { + //设置一下串口的波特率等参数 + serialPort.setSerialPortParams(baudrate, databits, stopbits, parity); + } catch (UnsupportedCommOperationException e) { + } +// System.out.println("Open " + portName + " sucessfully !"); + return serialPort; + } else { + log.error("串口通信工具-不是串口"); + } + } catch (NoSuchPortException e1) { + log.error("串口通信工具-没有找到端口"); + e1.printStackTrace(); + } catch (PortInUseException e2) { + log.error("串口通信工具-端口被占用"); + e2.printStackTrace(); + } + return null; + } + + /** + * 关闭串口 + * @param serialPort 待关闭的串口对象 + */ + public void closePort(SerialPort serialPort) { + if (serialPort != null) { + serialPort.close(); + } + } + + /** + * 往串口发送数据 + * @param serialPort 串口对象 + * @param order 待发送数据 + */ + public void sendToPort(SerialPort serialPort, byte[] order) { + OutputStream out = null; + try { + out = serialPort.getOutputStream(); + out.write(order); + out.flush(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (out != null) { + out.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + /** + * 从串口读取数据 + * @param serialPort 当前已建立连接的SerialPort对象 + * @return 读取到的数据 + */ + public byte[] readFromPort(SerialPort serialPort) { + InputStream in = null; + byte[] bytes = null; + try { + in = serialPort.getInputStream(); + int bufflenth = in.available(); + while (bufflenth != 0) { + bytes = new byte[bufflenth]; + in.read(bytes); + bufflenth = in.available(); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (in != null) { + in.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + return bytes; + } + + /** + * 添加监听器 + * @param port 串口对象 + * @param listener 串口监听器 + */ + public void addListener(SerialPort port, SerialPortEventListener listener) { + try { + //给串口添加监听器 + port.addEventListener(listener); + //设置当有数据到达时唤醒监听接收线程 + port.notifyOnDataAvailable(true); + //设置当通信中断时唤醒中断线程 + port.notifyOnBreakInterrupt(true); + } catch (TooManyListenersException e) { +// throw new TooManyListeners(); + log.error("串口通信工具-监听器设置过多"); + e.printStackTrace(); + } + } + + /** + * 删除监听器 + * @param port 串口对象 + * @param listener 串口监听器 + */ + public void removeListener(SerialPort port, SerialPortEventListener listener) { + //删除串口监听器 + port.removeEventListener(); + } + + /** + * 设置串口的Listener + * @param serialPort + * @param listener + */ + public static void setListenerToSerialPort(SerialPort serialPort, SerialPortEventListener listener){ + try { + //给串口添加事件监听 + serialPort.addEventListener(listener); + } catch (TooManyListenersException e) { + e.printStackTrace(); + } + //串口有数据监听 + serialPort.notifyOnDataAvailable(true); + //中断事件监听 + serialPort.notifyOnBreakInterrupt(true); + } + +} diff --git a/src/main/java/com/casic/missiles/utils/SpringContextUtil.java b/src/main/java/com/casic/missiles/utils/SpringContextUtil.java new file mode 100644 index 0000000..6f12ec7 --- /dev/null +++ b/src/main/java/com/casic/missiles/utils/SpringContextUtil.java @@ -0,0 +1,102 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; + +/** + * @Description: Spring应用上下文工具 + * @Author: wangpeng + * @Date: 2022/8/11 18:04 + */ +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ApplicationContext applicationContext; + + private static ConfigurableListableBeanFactory beanFactory; + + /** + * 实现ApplicationContextAware接口的回调方法,设置上下文环境 + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringContextUtil.beanFactory = beanFactory; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + + public static T getBean(Class requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + public static T registerBean(String beanName, Class clazz, Function function) { + // 生成bean定义 + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); + // 执行bean处理函数 + AbstractBeanDefinition beanDefinition = function.apply(beanDefinitionBuilder); + BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) SpringContextUtil.beanFactory; + // 判断是否通过beanName注册 + if (!StringUtils.isEmpty(beanName) && !containsBean(beanName)) { + beanFactory.registerBeanDefinition(beanName, beanDefinition); + return getBean(beanName); + } else { + // 非命名bean注册 + String name = BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, beanFactory); + return getBean(name); + } + } + + public static T registerBean(String beanName, Class clazz, List args, Map property) { + return registerBean(beanName, clazz, beanDefinitionBuilder -> { + // 放入构造参数 + if (!CollectionUtils.isEmpty(args)) { + args.forEach(beanDefinitionBuilder::addConstructorArgValue); + } + // 放入属性 + if (!CollectionUtils.isEmpty(property)) { + property.forEach(beanDefinitionBuilder::addPropertyValue); + } + return beanDefinitionBuilder.getBeanDefinition(); + }); + } + + @Bean + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(100); + } + +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..e48d589 --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,10 @@ +server: + port: 8083 + +logging: + config: classpath:logback-spring.xml + level.root: info + level.com.casic: debug + level.org.springframework.web: info +log: + path: D:\metering\casic-metering-readwriter-1.0-SNAPSHOT \ No newline at end of file diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file