huang
2025-10-31 1fed5e7bab3a8f6b9adbfcd3695e14a03d47677f
更新代码
14个文件已修改
5个文件已添加
730个文件已删除
7798 ■■■■■ 已修改文件
PLC模拟指令系统设计与实现.docx 补丁 | 查看 | 原始文档 | blame | 历史
gateway/src/main/resources/application.yml 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/classes/application.yml 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/classes/com/mes/GatewayApplication.class 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/classes/com/mes/config/MyCorsConfig.class 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/config/application.yml 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/gateway-1.0.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/gateway-1.0.0.jar.original 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/HdrHistogram-2.1.9.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/archaius-core-0.7.6.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/bcpkix-jdk15on-1.60.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/bcprov-jdk15on-1.60.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/classmate-1.4.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/commons-codec-1.11.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/commons-collections-3.2.2.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/commons-configuration-1.8.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/commons-io-2.2.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/commons-lang-2.6.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/commons-lang3-3.8.1.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/fastjson-1.2.47.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/guava-19.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/hibernate-validator-6.0.17.Final.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/httpclient-4.5.9.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/httpcore-4.4.12.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/hystrix-core-1.5.18.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/jackson-annotations-2.9.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/jackson-core-2.9.9.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/jackson-databind-2.9.9.3.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/jackson-datatype-jdk8-2.9.9.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/jackson-datatype-jsr310-2.9.9.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/jackson-module-parameter-names-2.9.9.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/javax.annotation-api-1.3.2.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/javax.el-3.0.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/javax.inject-1.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/jboss-logging-3.3.3.Final.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/jersey-apache-client4-1.19.1.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/jersey-client-1.19.1.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/jersey-core-1.19.1.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/jsr305-3.0.1.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/jsr311-api-1.1.1.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/jul-to-slf4j-1.7.28.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/log4j-api-2.11.2.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/log4j-to-slf4j-2.11.2.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/logback-classic-1.2.3.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/logback-core-1.2.3.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/nacos-api-1.1.1.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/nacos-client-1.1.1.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/nacos-common-1.1.1.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/netflix-commons-util-0.3.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/netflix-statistics-0.1.1.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/netty-buffer-4.1.39.Final.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/netty-codec-4.1.39.Final.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/netty-codec-http-4.1.39.Final.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/netty-codec-http2-4.1.39.Final.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/netty-codec-socks-4.1.39.Final.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/netty-common-4.1.39.Final.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/netty-handler-4.1.39.Final.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/netty-handler-proxy-4.1.39.Final.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/netty-resolver-4.1.39.Final.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/netty-transport-4.1.39.Final.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/netty-transport-native-epoll-4.1.39.Final-linux-x86_64.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/netty-transport-native-unix-common-4.1.39.Final.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/nio-multipart-parser-1.1.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/nio-stream-storage-1.1.3.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/reactive-streams-1.0.3.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/reactor-core-3.2.12.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/reactor-extra-3.2.3.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/reactor-netty-0.8.11.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/ribbon-2.3.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/ribbon-core-2.3.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/ribbon-httpclient-2.3.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/ribbon-loadbalancer-2.3.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/ribbon-transport-2.3.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/rxjava-1.3.8.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/rxnetty-0.4.9.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/rxnetty-contexts-0.4.9.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/rxnetty-servo-0.4.9.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/servo-core-0.12.21.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/simpleclient-0.5.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/slf4j-api-1.7.28.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/snakeyaml-1.23.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/spring-aop-5.1.9.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/spring-beans-5.1.9.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/spring-boot-2.1.8.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/spring-boot-autoconfigure-2.1.8.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/spring-boot-starter-2.1.8.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/spring-boot-starter-json-2.1.8.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/spring-boot-starter-logging-2.1.8.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/spring-boot-starter-reactor-netty-2.1.8.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/spring-boot-starter-webflux-2.1.8.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/spring-cloud-alibaba-nacos-discovery-2.1.0.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/spring-cloud-commons-2.1.3.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/spring-cloud-context-2.1.3.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/spring-cloud-gateway-core-2.1.3.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/spring-cloud-netflix-archaius-2.1.3.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/spring-cloud-netflix-ribbon-2.1.3.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/spring-cloud-starter-2.1.3.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/spring-cloud-starter-alibaba-nacos-discovery-2.1.0.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/spring-cloud-starter-gateway-2.1.3.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/spring-cloud-starter-netflix-archaius-2.1.3.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/spring-cloud-starter-netflix-ribbon-2.1.3.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/spring-context-5.1.9.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/spring-core-5.1.9.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/spring-expression-5.1.9.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/spring-jcl-5.1.9.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/spring-security-crypto-5.1.6.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/spring-security-rsa-1.0.7.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/spring-web-5.1.9.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/spring-webflux-5.1.9.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/lib/validation-api-2.0.1.Final.jar 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/maven-archiver/pom.properties 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
gateway/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/JsonFile/Edg.json 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/JsonFile/EdgLogicHttp.json 141 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/JsonFile/EdgLogicProcedure.json 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/JsonFile/EdgLogicView.json 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/JsonFile/ShelfModbusTcp.json 244 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/JsonFile/ShelfS7.json 244 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/application-cz.yml 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/application-dev.yml 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/application-prod.yml 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/application.yml 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/AppRunnerConfig.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/PlcConnectModuleApplication.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/common/JsonConversion.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/common/ReadFile.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/common/RestTemplateConfig.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/connect/ExampleDataHandler.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/connect/addressparser/ModbusAddressParser.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/connect/addressparser/ModbusIpAddressParser.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/connect/addressparser/ModbusRtuAddressParser.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/connect/addressparser/S7OldAddressParser.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/connect/entity/ApiConfig.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/connect/entity/Logic.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/connect/entity/LogicConfig.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/connect/entity/LogicItem.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/connect/entity/Parameters.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/connect/entity/PlcParameters.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/connect/entity/ReturnValue.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/connect/industrialinterface/AddressParser.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/connect/industrialinterface/ApiImpl.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/connect/industrialinterface/ApiService.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/connect/industrialinterface/IndustrialClient.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/connect/industrialinterface/IndustrialDataHandler.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/connect/industrialinterface/IndustrialServer.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/connect/modbus/ModbusIpClient.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/connect/modbus/ModbusIpServer.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/connect/modbus/ModbusTcpClient.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/connect/modbus/ModbusTcpServer.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/connect/protocol/ProtocolAddress.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/connect/protocol/ProtocolType.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/connect/s7/S7ClientOld.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/connect/thread/MachineThread.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/model/controller/AccountController.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/model/entity/Account.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/model/entity/Machine.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/model/entity/PlcType.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/model/entity/ProtocolType.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/model/mapper/AccountMapper.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/model/mapper/MachineMapper.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/model/mapper/PlcTypeMapper.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/model/mapper/ProtocolTypeMapper.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/model/mapper/xml/AccountMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/model/mapper/xml/MachineMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/model/mapper/xml/PlcTypeMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/model/mapper/xml/ProtocolTypeMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/model/service/AccountService.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/model/service/MachineService.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/model/service/PlcTypeService.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/model/service/ProtocolTypeService.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/model/service/impl/AccountServiceImpl.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/model/service/impl/MachineServiceImpl.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/model/service/impl/PlcTypeServiceImpl.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/com/mes/model/service/impl/ProtocolTypeServiceImpl.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/classes/logback-spring.xml 170 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/communication-1.0.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/maven-archiver/pom.properties 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/communication/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/base/request/BaseRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/base/request/PageRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/base/request/TimeRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/cutting/history/CutHistoryTask.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/cutting/history/requst/CutTerritoryRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/cutting/history/vo/CutTerritoryVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/cutting/history/vo/CuttingIndexMessageVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/damage/Damage.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/damage/dto/DamageDTO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/damage/request/DamageReportRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/damage/request/DamageRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/damagedetails/DamageDetails.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/edging/history/request/EdgHistoryTaskRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/edging/history/request/EdgingRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/edging/job/request/EdgJobRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/edging/queue/EdgQueueInfo.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/edging/queue/request/EdgQueueInfoRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/edging/queue/request/EdgUpdateQueueInfoRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/edging/queue/vo/EdgIndexMessageVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/engineering/Engineering.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/engineering/request/EngineerRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/erp/DamageDetailsList.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/erp/RawInventory.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/erp/ReportingWork.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/erp/ReportingWorkDetail.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/flowcard/FlowCardInfo.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/flowcard/request/FlowCardInfoImportRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/glassinfo/GlassInfo.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/glassinfo/request/EngineerUnreportedRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/glassinfo/request/GlassInfoImportRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/glassinfo/request/NotReportRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/glassinfo/vo/ConfigVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/glassinfo/vo/GlassInfoFlowCardVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/glassinfo/vo/WorkLineConfigVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/hollow/formula/HollowFormulaDetails.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/hollow/formula/dto/HollowGlassFormulaDTO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/hollow/formula/request/HollowFormulaDetailsImportRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/hollow/formula/request/HollowGlassFormulaRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/hollow/history/HollowGlassTaskHistory.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/hollow/history/dto/LisecHollowDetailsDTO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/hollow/history/dto/LisecHollowFrameDetailsDTO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/hollow/history/dto/LisecHollowGlassAndFrameDetailsDTO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/hollow/history/dto/LisecHollowGlassDetailsDTO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/hollow/history/dto/OrderDTO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/hollow/history/request/HollowHistoryTaskRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/hollow/history/request/HollowTaskRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/hollow/queue/HollowGlassQueueInfo.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/hollow/queue/request/HollowQueueRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/horizontal/details/HorizontalSheetCageDetails.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/horizontal/details/request/HorizontalCageVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/horizontal/details/request/HorizontalDetailsRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/horizontal/history/HorizontalSheetCageHistoryTask.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/horizontal/history/request/HorizontalHistoryRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/horizontal/history/vo/HorizontalHistoryVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/horizontal/station/HorizontalSheetCage.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/horizontal/station/request/StationRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/horizontal/station/vo/HorizontalIndexMessageVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/horizontal/station/vo/HorizontalSheetCageVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/load/details/LoadStationDetails.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/load/details/entity/request/CancelRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/load/details/entity/request/LoadStationDetailsRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/load/details/entity/request/StationRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/load/history/LoadGlassHistoryTask.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/load/job/vo/LoadIndexMessageVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/load/station/entity/LoadStation.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/load/station/entity/vo/LoadStationInfoVo.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/menu/SysMenu.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/optimize/OptimizeProject.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/rawglass/details/RawGlassStorageDetails.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/rawglass/details/dto/EngineeringDetailDTO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/rawglass/details/dto/RawGlassDetailsDTO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/rawglass/details/request/DetailsRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/rawglass/details/request/RawGlassDetailsRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/rawglass/details/request/RawGlassQuantityRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/rawglass/details/request/RawLoadRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/rawglass/details/vo/RawGlassCountVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/rawglass/details/vo/RawGlassDetailsVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/rawglass/details/vo/RawIndexMessageVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/rawglass/details/vo/RawLoadDetailsVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/rawglass/history/RawGlassStorageHistoryTask.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/rawglass/history/dto/GlassStorageTaskDTO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/rawglass/history/request/LoadGlassHistoryTaskRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/rawglass/history/request/LoadGlassHistoryTaskUpdateRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/rawglass/history/request/RawGlassTaskRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/rawglass/station/RawGlassStorageStation.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/rawglass/station/request/LoadStationEnableRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/rawglass/station/request/LoadStationRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/rawglass/station/request/StationRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/rawglass/station/request/UpdateStorageRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/rawqueue/EngineeringRawQueue.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/rawqueue/request/EngineeringRawQueueImportRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/rawqueue/request/EngineeringRawQueueRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/rawqueue/vo/EngineeringRawQueueVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/reportinfo/ReportInfo.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/reportinfo/dto/ReportInfoDTO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/reportinfo/request/ReportQueryRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/role/SysRole.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/role/SysRoleMenu.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/role/vo/SysRoleVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/sysconfig/SysConfig.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/sysconfig/request/SysConfigRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/sysdict/SysDictData.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/sysdict/SysDictType.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/tempering/compute/TemperingComputeGlassInfo.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/tempering/compute/TemperingComputeRecord.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/tempering/compute/request/GlassDetailsRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/tempering/compute/request/ProcessCardsRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/tempering/compute/request/TemperingComputeIndexRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/tempering/compute/request/TemperingComputeRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/tempering/compute/request/TemperingFlowCardIdRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/tempering/compute/vo/TemperingComputeResultVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/tempering/compute/vo/TemperingFlowCardIdCountVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/tempering/compute/vo/TemperingFlowCardIdVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/tempering/compute/vo/TemperingGlassDetailsVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/tempering/compute/vo/TemperingRatioVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/tempering/compute/vo/TempingComputeIndexMessageAllVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/tempering/param/TemperingParameter.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/tempering/queue/TemperingGlassQueueInfo.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/tempering/queue/request/TemperingJobRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/tempering/queue/vo/TempIndexMessageAllVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/tempering/queue/vo/TemperingLayoutMessageVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/tempering/request/TemperingParameterImportRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/vertical/details/VerticalSheetCageDetails.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/vertical/details/dto/FlowCardGlassInfoDTO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/vertical/details/dto/VerticalSequenceDTO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/vertical/details/dto/VerticalSheetCageDetailsDTO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/vertical/details/request/HollowRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/vertical/details/request/UpdateVerticalSheetCageStateRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/vertical/details/request/VerticalSheetCageDetailsRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/vertical/details/vo/HollowAllFlowCardVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/vertical/details/vo/TemperingGlassCountVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/vertical/details/vo/TemperingGlassLackVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/vertical/details/vo/VerticalSheetCageAndDetailsVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/vertical/details/vo/VerticalSheetCageDetailsVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/vertical/details/vo/VerticalSheetCageIndexMessageVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/vertical/details/vo/VerticalSheetCageSummaryVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/vertical/details/vo/VerticalSheetCageVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/vertical/history/VerticalSheetCageHistoryTask.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/vertical/history/dto/VerticalSheetCarTaskDTO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/vertical/history/request/VerticalSheetCageHistoryRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/vertical/hollowrelation/HollowGlassRelationInfo.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/vertical/hollowrelation/vo/LackDetailsVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/vertical/queue/VerticalSheetCageQueueInfo.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/vertical/station/VerticalSheetCage.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/vertical/station/dto/VerticalSheetDTO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/vertical/temperingtask/TemperingTask.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/vertical/temperingtask/dto/TemperingTaskDTO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/vertical/temperingtask/request/TemperingTaskRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/vertical/temperingtask/vo/TemperingTaskVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/vertical/temprelation/TemperingGlassRelationInfo.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/vertical/temprelation/dto/FlowCardVirtualSlotDTO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/classes/com/mes/work/WorkAssignment.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/maven-archiver/pom.properties 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst 152 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst 152 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/model/target/model-1.0.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/application-common.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/application.yml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/kangaroohy/milo/configuration/MiloAutoConfiguration.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/kangaroohy/milo/pool/MiloConnectFactory.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/bigstorage/BigStorageCageBaseInfo.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/damage/controller/DamageController.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/damage/mapper/DamageMapper.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/damage/service/DamageService.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/damage/service/impl/DamageServiceImpl.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/damagedetails/mapper/DamageDetailsMapper.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/damagedetails/service/DamageDetailsService.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/damagedetails/service/impl/DamageDetailsServiceImpl.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/engineering/controller/EngineeringController.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/engineering/entity/request/EngineerImportRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/engineering/entity/request/EngineerRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/engineering/entity/vo/CutDrawingInfoVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/engineering/mapper/EngineeringMapper.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/engineering/service/AbstractEngineeringService.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/engineering/service/EngineeringService.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/engineering/service/impl/EngineeringServiceImpl.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/engineering/service/impl/LmEngineeringServiceImpl.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/flowcard/mapper/FlowCardInfoMapper.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/flowcard/service/FlowCardInfoService.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/flowcard/service/impl/FlowCardInfoServiceImpl.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/formula/controller/HollowFormulaDetailsController.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/formula/mapper/HollowFormulaDetailsMapper.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/formula/service/HollowFormulaDetailsService.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/formula/service/impl/HollowFormulaDetailsServiceImpl.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/glassinfo/controller/GlassInfoController.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/glassinfo/mapper/GlassInfoMapper.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/glassinfo/service/GlassInfoService.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/glassinfo/service/impl/GlassInfoServiceImpl.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/rawqueue/controller/EngineeringRawQueueController.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/rawqueue/mapper/EngineeringRawQueueMapper.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/rawqueue/service/EngineeringRawQueueService.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/rawqueue/service/impl/EngineeringRawQueueServiceImpl.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/report/controller/ReportController.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/report/mapper/ReportInfoMapper.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/report/service/ReportInfoService.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/report/service/impl/ReportInfoServiceImpl$1.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/report/service/impl/ReportInfoServiceImpl$2.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/report/service/impl/ReportInfoServiceImpl.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/sysconfig/controller/SysConfigController.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/sysconfig/mapper/SysConfigMapper.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/sysconfig/service/SysConfigService.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/sysconfig/service/impl/SysConfigServiceImpl.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/sysdict/mapper/SysDictDataMapper.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/sysdict/mapper/SysDictTypeMapper.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/sysdict/service/SysDictDataService.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/sysdict/service/SysDictTypeService.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/sysdict/service/impl/SysDictDataServiceImpl.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/sysdict/service/impl/SysDictTypeServiceImpl.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/tempparameter/mapper/TemperingParameterMapper.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/tempparameter/service/TemperingParameterService.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/tempparameter/service/impl/TemperingParameterServiceImpl.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/work/mapper/WorkAssignmentMapper.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/work/service/WorkAssignmentService.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/base/work/service/impl/WorkAssignmentServiceImpl.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/config/MybatisPlusConfig.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/config/SchedulerConfig.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/config/Swagger2Config.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/config/WebSocketConfig.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/erp/service/ErpService.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/erp/service/impl/ErpServiceImpl.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/exception/GlobalExceptionHandler.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/exception/ServiceException.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/feign/ErpUrlOpenFeignService.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/feign/MesHubOpenFeignService.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/feign/OpenFeignService.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/feign/TemperingOpenFeignService.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/feign/TemperingTaskOpenFeignService.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/request/TimeRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/result/ResponseUtil.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/result/Result.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/result/ResultCodeEnum.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/s7/InitUtil.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/s7/S7control.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/s7/device/PlcBitInfo.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/s7/device/PlcBitObject.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/s7/device/PlcParameterInfo.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/s7/device/PlcParameterObject.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/s7/enhanced/EnhancedS7Serializer.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/s7/enhanced/S7AddressProperties.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/s7/enhanced/S7AnnotationProcessor.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/sysconst/Const.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/sysconst/ConstRequest.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/sysconst/ConstSwitch.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/sysconst/ConstSysConfig.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/sysconst/ConstWebSocket.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/tools/CodeGet.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/tools/DatabaseDesignDoc.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/tools/EntityTool.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/utils/DateUtil.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/utils/FileUtil.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/utils/JsonUtils.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/utils/MD5.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/utils/NbUtil.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/utils/PageUtil.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/utils/RedisUtil.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/utils/S7ParameterUtils.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/utils/WebNbUtil.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/utils/excel/CustomCellStyleHandler.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/utils/excel/CustomCellWriteWidthConfig.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/utils/excel/ExcelMerge.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/utils/excel/ExcelMergeStrategy.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/utils/excel/ExcelUtil.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/websocket/WebSocketServer.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/com/mes/websocket/WebSocketUtils.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/mapper/DamageMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/mapper/EngineeringMapper.xml 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/mapper/EngineeringRawQueueMapper.xml 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/classes/mapper/GlassInfoMapper.xml 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/maven-archiver/pom.properties 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/serverBase/target/serverBase-1.0.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/application-dev.yml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/application-loc.yml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/application-prod.yml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/common/config/RedisConfig.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/common/config/TokenWebSecurityConfig.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/common/filter/JwtAuthenticationTokenFilter.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/common/handler/JwtAccessDeniedHandler.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/common/handler/JwtAuthenticationEntryPoint.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/common/handler/JwtLogoutSuccessHandler.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/common/handler/LoginFailureHandler.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/common/handler/LoginSuccessHandler.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/common/utils/FastJsonRedisSerializer.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/common/utils/JwtUtil.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/common/utils/UserInfoUtils.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/common/utils/WebUtils.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/menu/controller/SysMenuController.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/menu/mapper/SysMenuMapper.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/menu/service/SysMenuService.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/menu/service/impl/SysMenuServiceImpl.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/role/controller/SysRoleController.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/role/mapper/SysRoleMapper.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/role/mapper/SysRoleMenuMapper.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/role/mapper/xml/SysRoleMapper.xml 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/role/mapper/xml/SysRoleMenuMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/role/service/SysRoleMenuService.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/role/service/SysRoleService.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/role/service/impl/SysRoleMenuServiceImpl.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/role/service/impl/SysRoleServiceImpl.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/userinfo/controller/SysUserController.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/userinfo/entity/LoginUser.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/userinfo/entity/SysUser.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/userinfo/entity/SysUserRole.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/userinfo/entity/vo/SysUserVO.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/userinfo/mapper/SysUserMapper.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/userinfo/mapper/SysUserRoleMapper.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/userinfo/service/SysUserRoleService.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/userinfo/service/SysUserService.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/userinfo/service/impl/SysUserRoleServiceImpl.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/com/mes/userinfo/service/impl/SysUserServiceImpl.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/mapper/SysMenuMapper.xml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/mapper/SysUserMapper.xml 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/classes/mapper/SysUserRoleMapper.xml 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/maven-archiver/pom.properties 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-common/springSecurity/target/springSecurity-1.0.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/README_PLC_ADDRESS_MAPPING.md 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/src/main/java/com/mes/controller/PlcAddressController.java 113 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/src/main/java/com/mes/controller/PlcTestController.java 376 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/src/main/java/com/mes/controller/PlcTestWriteController.java 383 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/src/main/java/com/mes/controller/PlcTestWriteLegacyController.java 352 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/src/main/java/com/mes/entity/PlcAddress.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/src/main/java/com/mes/entity/PlcBaseData.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/src/main/java/com/mes/job/config/S7PlcSendConfig.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/src/main/java/com/mes/mapper/PlcAddressMapper.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/src/main/java/com/mes/service/PlcAddressService.java 407 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/src/main/java/com/mes/service/PlcAutoTestService.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/src/main/java/com/mes/service/PlcTestWriteService.java 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/src/main/java/com/mes/service/impl/PlcAddressServiceImpl.java 270 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/src/main/java/com/mes/service/impl/PlcAutoTestServiceImpl.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/src/main/java/com/mes/service/impl/PlcTestWriteServiceImpl.java 295 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/src/main/java/com/mes/vo/Result.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/src/main/resources/application-dev.yml 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/src/main/resources/db/migration/V1.0.0__Create_plc_address_mapping_table.sql 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/classes/application-dev.yml 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/classes/application.yml 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/classes/changelog/changelogBase.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/classes/changelog/mesInit.sql 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/classes/changelog/mesInitLy.sql 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/classes/com/mes/PlcSendApplication.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/classes/com/mes/config/PlcAddressMappingConfig$ProjectPlcConfig.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/classes/com/mes/config/PlcAddressMappingConfig.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/classes/com/mes/controller/PlcAddressMappingController.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/classes/com/mes/controller/PlcTestWriteController.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/classes/com/mes/entity/PlcAddressMapping.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/classes/com/mes/entity/PlcBaseData.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/classes/com/mes/job/config/S7PlcSendConfig.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/classes/com/mes/mapper/PlcAddressMappingMapper.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/classes/com/mes/service/PlcAddressMappingService.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/classes/com/mes/service/PlcAutoTestService.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/classes/com/mes/service/PlcTestWriteService.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/classes/com/mes/service/impl/PlcTestWriteServiceImpl.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/classes/com/mes/vo/Result.class 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/classes/db/migration/V1.0.0__Create_plc_address_mapping_table.sql 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/config/application-dev.yml 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/config/application.yml 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/config/changelog/changelogBase.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/config/changelog/mesInit.sql 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/config/changelog/mesInitLy.sql 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/config/db/migration/V1.0.0__Create_plc_address_mapping_table.sql 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/FastInfoset-1.2.15.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/HdrHistogram-2.1.9.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/HikariCP-3.2.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/SparseBitSet-1.2.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/archaius-core-0.7.6.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/aspectjweaver-1.9.4.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/bcpkix-jdk15on-1.60.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/bcpkix-jdk18on-1.75.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/bcprov-jdk15on-1.60.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/bcprov-jdk18on-1.75.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/bcutil-jdk18on-1.75.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/byte-buddy-1.9.16.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/classgraph-4.1.7.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/classmate-1.4.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/commons-codec-1.11.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/commons-collections-3.2.2.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/commons-collections4-4.4.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/commons-compress-1.19.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/commons-configuration-1.8.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/commons-csv-1.8.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/commons-fileupload-1.4.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/commons-io-2.2.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/commons-lang-2.6.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/commons-lang3-3.8.1.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/commons-logging-1.2.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/commons-math3-3.6.1.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/commons-pool2-2.6.2.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/curvesapi-1.06.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/druid-1.1.8.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/dynamic-datasource-spring-boot-starter-3.3.1.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/easyexcel-3.1.3.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/easyexcel-core-3.1.3.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/easyexcel-support-3.1.3.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/ehcache-3.6.3.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/fastjson-1.2.33.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/feign-core-10.2.3.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/feign-form-3.8.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/feign-form-spring-3.8.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/feign-hystrix-10.2.3.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/feign-slf4j-10.2.3.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/freemarker-2.3.29.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/guava-19.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/hibernate-validator-6.0.17.Final.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/httpclient-4.5.9.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/httpcore-4.4.12.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/hutool-all-5.4.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/hystrix-core-1.5.18.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/iot-communication-1.5.4.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/istack-commons-runtime-3.0.7.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/jackson-annotations-2.9.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/jackson-core-2.9.9.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/jackson-databind-2.9.9.3.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/jackson-datatype-jdk8-2.9.9.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/jackson-datatype-jsr310-2.9.9.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/jackson-module-parameter-names-2.9.9.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/javassist-3.25.0-GA.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/javax.activation-api-1.2.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/javax.annotation-api-1.3.2.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/javax.inject-1.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/jaxb-api-2.3.1.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/jaxb-runtime-2.3.1.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/jboss-logging-3.3.3.Final.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/jedis-2.9.3.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/jersey-apache-client4-1.19.1.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/jersey-client-1.19.1.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/jersey-core-1.19.1.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/jjwt-0.9.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/jsqlparser-3.2.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/jsr305-3.0.1.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/jsr311-api-1.1.1.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/jul-to-slf4j-1.7.28.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/knife4j-annotations-2.0.9.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/knife4j-core-2.0.9.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/knife4j-spring-2.0.9.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/knife4j-spring-boot-autoconfigure-2.0.9.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/knife4j-spring-boot-starter-2.0.9.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/knife4j-spring-ui-2.0.9.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/liquibase-core-3.6.3.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/log4j-api-2.11.2.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/log4j-to-slf4j-2.11.2.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/logback-classic-1.2.3.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/logback-core-1.2.3.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/lombok-1.18.8.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/mapstruct-1.3.1.Final.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/mes-rawGlassStorage-1.0.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/milo-spring-boot-starter-3.0.6.12.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/model-1.0.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/mssql-jdbc-6.4.0.jre8.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/mybatis-3.5.6.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/mybatis-plus-3.3.1.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/mybatis-plus-annotation-3.4.1.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/mybatis-plus-boot-starter-3.3.1.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/mybatis-plus-core-3.4.1.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/mybatis-plus-extension-3.4.1.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/mybatis-plus-generator-3.4.1.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/mybatis-spring-2.0.5.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/mysql-connector-java-8.0.17.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/nacos-api-1.1.1.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/nacos-client-1.1.1.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/nacos-common-1.1.1.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/netflix-commons-util-0.3.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/netflix-statistics-0.1.1.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/netty-buffer-4.1.39.Final.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/netty-channel-fsm-0.8.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/netty-codec-4.1.39.Final.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/netty-codec-http-4.1.39.Final.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/netty-common-4.1.39.Final.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/netty-handler-4.1.39.Final.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/netty-resolver-4.1.39.Final.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/netty-transport-4.1.39.Final.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/poi-4.1.2.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/poi-ooxml-4.1.2.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/poi-ooxml-schemas-4.1.2.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/ribbon-2.3.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/ribbon-core-2.3.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/ribbon-httpclient-2.3.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/ribbon-loadbalancer-2.3.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/ribbon-transport-2.3.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/rxjava-1.3.8.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/rxnetty-0.4.9.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/rxnetty-contexts-0.4.9.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/rxnetty-servo-0.4.9.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/screw-core-1.0.5.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/sdk-client-0.6.12.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/sdk-core-0.6.12.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/serverBase-1.0.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/servo-core-0.12.21.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/simpleclient-0.5.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/slf4j-api-1.7.28.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/snakeyaml-1.23.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-aop-5.1.9.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-beans-5.1.9.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-boot-2.1.8.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-boot-autoconfigure-2.1.8.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-boot-starter-2.1.8.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-boot-starter-aop-2.1.8.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-boot-starter-data-redis-2.1.8.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-boot-starter-jdbc-2.1.8.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-boot-starter-json-2.1.8.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-boot-starter-logging-2.1.8.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-boot-starter-security-2.1.8.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-boot-starter-tomcat-2.1.8.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-boot-starter-web-2.1.8.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-boot-starter-websocket-2.1.8.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-cloud-alibaba-nacos-discovery-2.1.0.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-cloud-commons-2.1.3.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-cloud-context-2.1.3.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-cloud-netflix-archaius-2.1.3.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-cloud-netflix-ribbon-2.1.3.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-cloud-openfeign-core-2.1.3.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-cloud-starter-2.1.3.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-cloud-starter-alibaba-nacos-discovery-2.1.0.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-cloud-starter-netflix-archaius-2.1.3.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-cloud-starter-netflix-ribbon-2.1.3.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-cloud-starter-openfeign-2.1.3.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-context-5.1.9.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-context-support-5.1.9.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-core-5.1.9.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-data-commons-2.1.10.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-data-keyvalue-2.1.10.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-data-redis-2.1.10.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-expression-5.1.9.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-jcl-5.1.9.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-jdbc-5.1.9.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-messaging-5.1.9.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-oxm-5.1.9.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-plugin-core-2.0.0.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-plugin-metadata-1.2.0.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-security-config-5.1.6.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-security-core-5.1.6.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-security-crypto-5.1.6.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-security-rsa-1.0.7.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-security-web-5.1.6.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-tx-5.1.9.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-web-5.1.9.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-webmvc-5.1.9.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/spring-websocket-5.1.9.RELEASE.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/springSecurity-1.0.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/springfox-bean-validators-2.10.5.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/springfox-core-2.10.5.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/springfox-schema-2.10.5.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/springfox-spi-2.10.5.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/springfox-spring-web-2.10.5.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/springfox-spring-webmvc-2.10.5.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/springfox-swagger-common-2.10.5.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/springfox-swagger2-2.10.5.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/stack-client-0.6.12.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/stack-core-0.6.12.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/stax-ex-1.8.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/strict-machine-0.6.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/swagger-annotations-1.5.22.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/swagger-models-1.5.22.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/tomcat-embed-core-9.0.24.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/tomcat-embed-el-9.0.24.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/tomcat-embed-websocket-9.0.24.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/txw2-2.3.1.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/validation-api-2.0.1.Final.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/velocity-engine-core-2.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/lib/xmlbeans-3.1.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/maven-archiver/pom.properties 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/mes-plcSend-1.0.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
mes-processes/mes-plcSend/target/mes-plcSend-1.0.0.jar.original 补丁 | 查看 | 原始文档 | blame | 历史
mes-web/src/views/plcTest/Test.vue 2229 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PLCÄ£ÄâÖ¸ÁîϵͳÉè¼ÆÓëʵÏÖ.docx
Binary files differ
gateway/src/main/resources/application.yml
@@ -17,68 +17,4 @@
          predicates:
            - Path=/api/plcSend/**
          filters:
            - StripPrefix=2
        - id: glassStorage
          uri: lb://glassStorage
          predicates:
            - Path=/api/glassStorage/**
            -
          filters:
            - StripPrefix=2
        - id: loadGlass
          uri: lb://loadGlass
          predicates:
            - Path=/api/loadGlass/**
          filters:
            - StripPrefix=2
        - id: cutting
          uri: lb://cutting
          predicates:
            - Path=/api/cutting/**
          filters:
            - StripPrefix=2
        - id: horizontal
          uri: lb://horizontal
          predicates:
            - Path=/api/horizontal/**
          filters:
            - StripPrefix=2
        - id: edging
          uri: lb://edging
          predicates:
            - Path=/api/edging/**
          filters:
            - StripPrefix=2
        - id: verticalGlass
          uri: lb://verticalGlass
          predicates:
            - Path=/api/verticalGlass/**
          filters:
            - StripPrefix=2
        - id: temperingGlass
          uri: lb://temperingGlass
          predicates:
            - Path=/api/temperingGlass/**
          filters:
            - StripPrefix=2
        - id: unLoadGlass
          uri: lb://unLoadGlass
          predicates:
            - Path=/api/unLoadGlass/**
          filters:
            - StripPrefix=2
        - id: hollowGlass
          uri: lb://hollowGlass
          predicates:
            - Path=/api/hollowGlass/**
          filters:
            - StripPrefix=2
gateway/target/classes/application.yml
File was deleted
gateway/target/classes/com/mes/GatewayApplication.class
Binary files differ
gateway/target/classes/com/mes/config/MyCorsConfig.class
Binary files differ
gateway/target/config/application.yml
File was deleted
gateway/target/gateway-1.0.0.jar
Binary files differ
gateway/target/gateway-1.0.0.jar.original
Binary files differ
gateway/target/lib/HdrHistogram-2.1.9.jar
Binary files differ
gateway/target/lib/archaius-core-0.7.6.jar
Binary files differ
gateway/target/lib/bcpkix-jdk15on-1.60.jar
Binary files differ
gateway/target/lib/bcprov-jdk15on-1.60.jar
Binary files differ
gateway/target/lib/classmate-1.4.0.jar
Binary files differ
gateway/target/lib/commons-codec-1.11.jar
Binary files differ
gateway/target/lib/commons-collections-3.2.2.jar
Binary files differ
gateway/target/lib/commons-configuration-1.8.jar
Binary files differ
gateway/target/lib/commons-io-2.2.jar
Binary files differ
gateway/target/lib/commons-lang-2.6.jar
Binary files differ
gateway/target/lib/commons-lang3-3.8.1.jar
Binary files differ
gateway/target/lib/fastjson-1.2.47.jar
Binary files differ
gateway/target/lib/guava-19.0.jar
Binary files differ
gateway/target/lib/hibernate-validator-6.0.17.Final.jar
Binary files differ
gateway/target/lib/httpclient-4.5.9.jar
Binary files differ
gateway/target/lib/httpcore-4.4.12.jar
Binary files differ
gateway/target/lib/hystrix-core-1.5.18.jar
Binary files differ
gateway/target/lib/jackson-annotations-2.9.0.jar
Binary files differ
gateway/target/lib/jackson-core-2.9.9.jar
Binary files differ
gateway/target/lib/jackson-databind-2.9.9.3.jar
Binary files differ
gateway/target/lib/jackson-datatype-jdk8-2.9.9.jar
Binary files differ
gateway/target/lib/jackson-datatype-jsr310-2.9.9.jar
Binary files differ
gateway/target/lib/jackson-module-parameter-names-2.9.9.jar
Binary files differ
gateway/target/lib/javax.annotation-api-1.3.2.jar
Binary files differ
gateway/target/lib/javax.el-3.0.0.jar
Binary files differ
gateway/target/lib/javax.inject-1.jar
Binary files differ
gateway/target/lib/jboss-logging-3.3.3.Final.jar
Binary files differ
gateway/target/lib/jersey-apache-client4-1.19.1.jar
Binary files differ
gateway/target/lib/jersey-client-1.19.1.jar
Binary files differ
gateway/target/lib/jersey-core-1.19.1.jar
Binary files differ
gateway/target/lib/jsr305-3.0.1.jar
Binary files differ
gateway/target/lib/jsr311-api-1.1.1.jar
Binary files differ
gateway/target/lib/jul-to-slf4j-1.7.28.jar
Binary files differ
gateway/target/lib/log4j-api-2.11.2.jar
Binary files differ
gateway/target/lib/log4j-to-slf4j-2.11.2.jar
Binary files differ
gateway/target/lib/logback-classic-1.2.3.jar
Binary files differ
gateway/target/lib/logback-core-1.2.3.jar
Binary files differ
gateway/target/lib/nacos-api-1.1.1.jar
Binary files differ
gateway/target/lib/nacos-client-1.1.1.jar
Binary files differ
gateway/target/lib/nacos-common-1.1.1.jar
Binary files differ
gateway/target/lib/netflix-commons-util-0.3.0.jar
Binary files differ
gateway/target/lib/netflix-statistics-0.1.1.jar
Binary files differ
gateway/target/lib/netty-buffer-4.1.39.Final.jar
Binary files differ
gateway/target/lib/netty-codec-4.1.39.Final.jar
Binary files differ
gateway/target/lib/netty-codec-http-4.1.39.Final.jar
Binary files differ
gateway/target/lib/netty-codec-http2-4.1.39.Final.jar
Binary files differ
gateway/target/lib/netty-codec-socks-4.1.39.Final.jar
Binary files differ
gateway/target/lib/netty-common-4.1.39.Final.jar
Binary files differ
gateway/target/lib/netty-handler-4.1.39.Final.jar
Binary files differ
gateway/target/lib/netty-handler-proxy-4.1.39.Final.jar
Binary files differ
gateway/target/lib/netty-resolver-4.1.39.Final.jar
Binary files differ
gateway/target/lib/netty-transport-4.1.39.Final.jar
Binary files differ
gateway/target/lib/netty-transport-native-epoll-4.1.39.Final-linux-x86_64.jar
Binary files differ
gateway/target/lib/netty-transport-native-unix-common-4.1.39.Final.jar
Binary files differ
gateway/target/lib/nio-multipart-parser-1.1.0.jar
Binary files differ
gateway/target/lib/nio-stream-storage-1.1.3.jar
Binary files differ
gateway/target/lib/reactive-streams-1.0.3.jar
Binary files differ
gateway/target/lib/reactor-core-3.2.12.RELEASE.jar
Binary files differ
gateway/target/lib/reactor-extra-3.2.3.RELEASE.jar
Binary files differ
gateway/target/lib/reactor-netty-0.8.11.RELEASE.jar
Binary files differ
gateway/target/lib/ribbon-2.3.0.jar
Binary files differ
gateway/target/lib/ribbon-core-2.3.0.jar
Binary files differ
gateway/target/lib/ribbon-httpclient-2.3.0.jar
Binary files differ
gateway/target/lib/ribbon-loadbalancer-2.3.0.jar
Binary files differ
gateway/target/lib/ribbon-transport-2.3.0.jar
Binary files differ
gateway/target/lib/rxjava-1.3.8.jar
Binary files differ
gateway/target/lib/rxnetty-0.4.9.jar
Binary files differ
gateway/target/lib/rxnetty-contexts-0.4.9.jar
Binary files differ
gateway/target/lib/rxnetty-servo-0.4.9.jar
Binary files differ
gateway/target/lib/servo-core-0.12.21.jar
Binary files differ
gateway/target/lib/simpleclient-0.5.0.jar
Binary files differ
gateway/target/lib/slf4j-api-1.7.28.jar
Binary files differ
gateway/target/lib/snakeyaml-1.23.jar
Binary files differ
gateway/target/lib/spring-aop-5.1.9.RELEASE.jar
Binary files differ
gateway/target/lib/spring-beans-5.1.9.RELEASE.jar
Binary files differ
gateway/target/lib/spring-boot-2.1.8.RELEASE.jar
Binary files differ
gateway/target/lib/spring-boot-autoconfigure-2.1.8.RELEASE.jar
Binary files differ
gateway/target/lib/spring-boot-starter-2.1.8.RELEASE.jar
Binary files differ
gateway/target/lib/spring-boot-starter-json-2.1.8.RELEASE.jar
Binary files differ
gateway/target/lib/spring-boot-starter-logging-2.1.8.RELEASE.jar
Binary files differ
gateway/target/lib/spring-boot-starter-reactor-netty-2.1.8.RELEASE.jar
Binary files differ
gateway/target/lib/spring-boot-starter-webflux-2.1.8.RELEASE.jar
Binary files differ
gateway/target/lib/spring-cloud-alibaba-nacos-discovery-2.1.0.RELEASE.jar
Binary files differ
gateway/target/lib/spring-cloud-commons-2.1.3.RELEASE.jar
Binary files differ
gateway/target/lib/spring-cloud-context-2.1.3.RELEASE.jar
Binary files differ
gateway/target/lib/spring-cloud-gateway-core-2.1.3.RELEASE.jar
Binary files differ
gateway/target/lib/spring-cloud-netflix-archaius-2.1.3.RELEASE.jar
Binary files differ
gateway/target/lib/spring-cloud-netflix-ribbon-2.1.3.RELEASE.jar
Binary files differ
gateway/target/lib/spring-cloud-starter-2.1.3.RELEASE.jar
Binary files differ
gateway/target/lib/spring-cloud-starter-alibaba-nacos-discovery-2.1.0.RELEASE.jar
Binary files differ
gateway/target/lib/spring-cloud-starter-gateway-2.1.3.RELEASE.jar
Binary files differ
gateway/target/lib/spring-cloud-starter-netflix-archaius-2.1.3.RELEASE.jar
Binary files differ
gateway/target/lib/spring-cloud-starter-netflix-ribbon-2.1.3.RELEASE.jar
Binary files differ
gateway/target/lib/spring-context-5.1.9.RELEASE.jar
Binary files differ
gateway/target/lib/spring-core-5.1.9.RELEASE.jar
Binary files differ
gateway/target/lib/spring-expression-5.1.9.RELEASE.jar
Binary files differ
gateway/target/lib/spring-jcl-5.1.9.RELEASE.jar
Binary files differ
gateway/target/lib/spring-security-crypto-5.1.6.RELEASE.jar
Binary files differ
gateway/target/lib/spring-security-rsa-1.0.7.RELEASE.jar
Binary files differ
gateway/target/lib/spring-web-5.1.9.RELEASE.jar
Binary files differ
gateway/target/lib/spring-webflux-5.1.9.RELEASE.jar
Binary files differ
gateway/target/lib/validation-api-2.0.1.Final.jar
Binary files differ
gateway/target/maven-archiver/pom.properties
File was deleted
gateway/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
File was deleted
gateway/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
File was deleted
mes-common/communication/target/classes/JsonFile/Edg.json
File was deleted
mes-common/communication/target/classes/JsonFile/EdgLogicHttp.json
File was deleted
mes-common/communication/target/classes/JsonFile/EdgLogicProcedure.json
File was deleted
mes-common/communication/target/classes/JsonFile/EdgLogicView.json
File was deleted
mes-common/communication/target/classes/JsonFile/ShelfModbusTcp.json
File was deleted
mes-common/communication/target/classes/JsonFile/ShelfS7.json
File was deleted
mes-common/communication/target/classes/application-cz.yml
File was deleted
mes-common/communication/target/classes/application-dev.yml
File was deleted
mes-common/communication/target/classes/application-prod.yml
File was deleted
mes-common/communication/target/classes/application.yml
File was deleted
mes-common/communication/target/classes/com/mes/AppRunnerConfig.class
Binary files differ
mes-common/communication/target/classes/com/mes/PlcConnectModuleApplication.class
Binary files differ
mes-common/communication/target/classes/com/mes/common/JsonConversion.class
Binary files differ
mes-common/communication/target/classes/com/mes/common/ReadFile.class
Binary files differ
mes-common/communication/target/classes/com/mes/common/RestTemplateConfig.class
Binary files differ
mes-common/communication/target/classes/com/mes/connect/ExampleDataHandler.class
Binary files differ
mes-common/communication/target/classes/com/mes/connect/addressparser/ModbusAddressParser.class
Binary files differ
mes-common/communication/target/classes/com/mes/connect/addressparser/ModbusIpAddressParser.class
Binary files differ
mes-common/communication/target/classes/com/mes/connect/addressparser/ModbusRtuAddressParser.class
Binary files differ
mes-common/communication/target/classes/com/mes/connect/addressparser/S7OldAddressParser.class
Binary files differ
mes-common/communication/target/classes/com/mes/connect/entity/ApiConfig.class
Binary files differ
mes-common/communication/target/classes/com/mes/connect/entity/Logic.class
Binary files differ
mes-common/communication/target/classes/com/mes/connect/entity/LogicConfig.class
Binary files differ
mes-common/communication/target/classes/com/mes/connect/entity/LogicItem.class
Binary files differ
mes-common/communication/target/classes/com/mes/connect/entity/Parameters.class
Binary files differ
mes-common/communication/target/classes/com/mes/connect/entity/PlcParameters.class
Binary files differ
mes-common/communication/target/classes/com/mes/connect/entity/ReturnValue.class
Binary files differ
mes-common/communication/target/classes/com/mes/connect/industrialinterface/AddressParser.class
Binary files differ
mes-common/communication/target/classes/com/mes/connect/industrialinterface/ApiImpl.class
Binary files differ
mes-common/communication/target/classes/com/mes/connect/industrialinterface/ApiService.class
Binary files differ
mes-common/communication/target/classes/com/mes/connect/industrialinterface/IndustrialClient.class
Binary files differ
mes-common/communication/target/classes/com/mes/connect/industrialinterface/IndustrialDataHandler.class
Binary files differ
mes-common/communication/target/classes/com/mes/connect/industrialinterface/IndustrialServer.class
Binary files differ
mes-common/communication/target/classes/com/mes/connect/modbus/ModbusIpClient.class
Binary files differ
mes-common/communication/target/classes/com/mes/connect/modbus/ModbusIpServer.class
Binary files differ
mes-common/communication/target/classes/com/mes/connect/modbus/ModbusTcpClient.class
Binary files differ
mes-common/communication/target/classes/com/mes/connect/modbus/ModbusTcpServer.class
Binary files differ
mes-common/communication/target/classes/com/mes/connect/protocol/ProtocolAddress.class
Binary files differ
mes-common/communication/target/classes/com/mes/connect/protocol/ProtocolType.class
Binary files differ
mes-common/communication/target/classes/com/mes/connect/s7/S7ClientOld.class
Binary files differ
mes-common/communication/target/classes/com/mes/connect/thread/MachineThread.class
Binary files differ
mes-common/communication/target/classes/com/mes/model/controller/AccountController.class
Binary files differ
mes-common/communication/target/classes/com/mes/model/entity/Account.class
Binary files differ
mes-common/communication/target/classes/com/mes/model/entity/Machine.class
Binary files differ
mes-common/communication/target/classes/com/mes/model/entity/PlcType.class
Binary files differ
mes-common/communication/target/classes/com/mes/model/entity/ProtocolType.class
Binary files differ
mes-common/communication/target/classes/com/mes/model/mapper/AccountMapper.class
Binary files differ
mes-common/communication/target/classes/com/mes/model/mapper/MachineMapper.class
Binary files differ
mes-common/communication/target/classes/com/mes/model/mapper/PlcTypeMapper.class
Binary files differ
mes-common/communication/target/classes/com/mes/model/mapper/ProtocolTypeMapper.class
Binary files differ
mes-common/communication/target/classes/com/mes/model/mapper/xml/AccountMapper.xml
File was deleted
mes-common/communication/target/classes/com/mes/model/mapper/xml/MachineMapper.xml
File was deleted
mes-common/communication/target/classes/com/mes/model/mapper/xml/PlcTypeMapper.xml
File was deleted
mes-common/communication/target/classes/com/mes/model/mapper/xml/ProtocolTypeMapper.xml
File was deleted
mes-common/communication/target/classes/com/mes/model/service/AccountService.class
Binary files differ
mes-common/communication/target/classes/com/mes/model/service/MachineService.class
Binary files differ
mes-common/communication/target/classes/com/mes/model/service/PlcTypeService.class
Binary files differ
mes-common/communication/target/classes/com/mes/model/service/ProtocolTypeService.class
Binary files differ
mes-common/communication/target/classes/com/mes/model/service/impl/AccountServiceImpl.class
Binary files differ
mes-common/communication/target/classes/com/mes/model/service/impl/MachineServiceImpl.class
Binary files differ
mes-common/communication/target/classes/com/mes/model/service/impl/PlcTypeServiceImpl.class
Binary files differ
mes-common/communication/target/classes/com/mes/model/service/impl/ProtocolTypeServiceImpl.class
Binary files differ
mes-common/communication/target/classes/logback-spring.xml
File was deleted
mes-common/communication/target/communication-1.0.0.jar
Binary files differ
mes-common/communication/target/maven-archiver/pom.properties
File was deleted
mes-common/communication/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
File was deleted
mes-common/communication/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
File was deleted
mes-common/model/target/classes/com/mes/base/request/BaseRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/base/request/PageRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/base/request/TimeRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/cutting/history/CutHistoryTask.class
Binary files differ
mes-common/model/target/classes/com/mes/cutting/history/requst/CutTerritoryRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/cutting/history/vo/CutTerritoryVO.class
Binary files differ
mes-common/model/target/classes/com/mes/cutting/history/vo/CuttingIndexMessageVO.class
Binary files differ
mes-common/model/target/classes/com/mes/damage/Damage.class
Binary files differ
mes-common/model/target/classes/com/mes/damage/dto/DamageDTO.class
Binary files differ
mes-common/model/target/classes/com/mes/damage/request/DamageReportRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/damage/request/DamageRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/damagedetails/DamageDetails.class
Binary files differ
mes-common/model/target/classes/com/mes/edging/history/request/EdgHistoryTaskRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/edging/history/request/EdgingRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/edging/job/request/EdgJobRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/edging/queue/EdgQueueInfo.class
Binary files differ
mes-common/model/target/classes/com/mes/edging/queue/request/EdgQueueInfoRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/edging/queue/request/EdgUpdateQueueInfoRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/edging/queue/vo/EdgIndexMessageVO.class
Binary files differ
mes-common/model/target/classes/com/mes/engineering/Engineering.class
Binary files differ
mes-common/model/target/classes/com/mes/engineering/request/EngineerRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/erp/DamageDetailsList.class
Binary files differ
mes-common/model/target/classes/com/mes/erp/RawInventory.class
Binary files differ
mes-common/model/target/classes/com/mes/erp/ReportingWork.class
Binary files differ
mes-common/model/target/classes/com/mes/erp/ReportingWorkDetail.class
Binary files differ
mes-common/model/target/classes/com/mes/flowcard/FlowCardInfo.class
Binary files differ
mes-common/model/target/classes/com/mes/flowcard/request/FlowCardInfoImportRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/glassinfo/GlassInfo.class
Binary files differ
mes-common/model/target/classes/com/mes/glassinfo/request/EngineerUnreportedRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/glassinfo/request/GlassInfoImportRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/glassinfo/request/NotReportRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/glassinfo/vo/ConfigVO.class
Binary files differ
mes-common/model/target/classes/com/mes/glassinfo/vo/GlassInfoFlowCardVO.class
Binary files differ
mes-common/model/target/classes/com/mes/glassinfo/vo/WorkLineConfigVO.class
Binary files differ
mes-common/model/target/classes/com/mes/hollow/formula/HollowFormulaDetails.class
Binary files differ
mes-common/model/target/classes/com/mes/hollow/formula/dto/HollowGlassFormulaDTO.class
Binary files differ
mes-common/model/target/classes/com/mes/hollow/formula/request/HollowFormulaDetailsImportRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/hollow/formula/request/HollowGlassFormulaRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/hollow/history/HollowGlassTaskHistory.class
Binary files differ
mes-common/model/target/classes/com/mes/hollow/history/dto/LisecHollowDetailsDTO.class
Binary files differ
mes-common/model/target/classes/com/mes/hollow/history/dto/LisecHollowFrameDetailsDTO.class
Binary files differ
mes-common/model/target/classes/com/mes/hollow/history/dto/LisecHollowGlassAndFrameDetailsDTO.class
Binary files differ
mes-common/model/target/classes/com/mes/hollow/history/dto/LisecHollowGlassDetailsDTO.class
Binary files differ
mes-common/model/target/classes/com/mes/hollow/history/dto/OrderDTO.class
Binary files differ
mes-common/model/target/classes/com/mes/hollow/history/request/HollowHistoryTaskRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/hollow/history/request/HollowTaskRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/hollow/queue/HollowGlassQueueInfo.class
Binary files differ
mes-common/model/target/classes/com/mes/hollow/queue/request/HollowQueueRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/horizontal/details/HorizontalSheetCageDetails.class
Binary files differ
mes-common/model/target/classes/com/mes/horizontal/details/request/HorizontalCageVO.class
Binary files differ
mes-common/model/target/classes/com/mes/horizontal/details/request/HorizontalDetailsRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/horizontal/history/HorizontalSheetCageHistoryTask.class
Binary files differ
mes-common/model/target/classes/com/mes/horizontal/history/request/HorizontalHistoryRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/horizontal/history/vo/HorizontalHistoryVO.class
Binary files differ
mes-common/model/target/classes/com/mes/horizontal/station/HorizontalSheetCage.class
Binary files differ
mes-common/model/target/classes/com/mes/horizontal/station/request/StationRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/horizontal/station/vo/HorizontalIndexMessageVO.class
Binary files differ
mes-common/model/target/classes/com/mes/horizontal/station/vo/HorizontalSheetCageVO.class
Binary files differ
mes-common/model/target/classes/com/mes/load/details/LoadStationDetails.class
Binary files differ
mes-common/model/target/classes/com/mes/load/details/entity/request/CancelRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/load/details/entity/request/LoadStationDetailsRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/load/details/entity/request/StationRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/load/history/LoadGlassHistoryTask.class
Binary files differ
mes-common/model/target/classes/com/mes/load/job/vo/LoadIndexMessageVO.class
Binary files differ
mes-common/model/target/classes/com/mes/load/station/entity/LoadStation.class
Binary files differ
mes-common/model/target/classes/com/mes/load/station/entity/vo/LoadStationInfoVo.class
Binary files differ
mes-common/model/target/classes/com/mes/menu/SysMenu.class
Binary files differ
mes-common/model/target/classes/com/mes/optimize/OptimizeProject.class
Binary files differ
mes-common/model/target/classes/com/mes/rawglass/details/RawGlassStorageDetails.class
Binary files differ
mes-common/model/target/classes/com/mes/rawglass/details/dto/EngineeringDetailDTO.class
Binary files differ
mes-common/model/target/classes/com/mes/rawglass/details/dto/RawGlassDetailsDTO.class
Binary files differ
mes-common/model/target/classes/com/mes/rawglass/details/request/DetailsRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/rawglass/details/request/RawGlassDetailsRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/rawglass/details/request/RawGlassQuantityRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/rawglass/details/request/RawLoadRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/rawglass/details/vo/RawGlassCountVO.class
Binary files differ
mes-common/model/target/classes/com/mes/rawglass/details/vo/RawGlassDetailsVO.class
Binary files differ
mes-common/model/target/classes/com/mes/rawglass/details/vo/RawIndexMessageVO.class
Binary files differ
mes-common/model/target/classes/com/mes/rawglass/details/vo/RawLoadDetailsVO.class
Binary files differ
mes-common/model/target/classes/com/mes/rawglass/history/RawGlassStorageHistoryTask.class
Binary files differ
mes-common/model/target/classes/com/mes/rawglass/history/dto/GlassStorageTaskDTO.class
Binary files differ
mes-common/model/target/classes/com/mes/rawglass/history/request/LoadGlassHistoryTaskRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/rawglass/history/request/LoadGlassHistoryTaskUpdateRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/rawglass/history/request/RawGlassTaskRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/rawglass/station/RawGlassStorageStation.class
Binary files differ
mes-common/model/target/classes/com/mes/rawglass/station/request/LoadStationEnableRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/rawglass/station/request/LoadStationRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/rawglass/station/request/StationRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/rawglass/station/request/UpdateStorageRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/rawqueue/EngineeringRawQueue.class
Binary files differ
mes-common/model/target/classes/com/mes/rawqueue/request/EngineeringRawQueueImportRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/rawqueue/request/EngineeringRawQueueRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/rawqueue/vo/EngineeringRawQueueVO.class
Binary files differ
mes-common/model/target/classes/com/mes/reportinfo/ReportInfo.class
Binary files differ
mes-common/model/target/classes/com/mes/reportinfo/dto/ReportInfoDTO.class
Binary files differ
mes-common/model/target/classes/com/mes/reportinfo/request/ReportQueryRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/role/SysRole.class
Binary files differ
mes-common/model/target/classes/com/mes/role/SysRoleMenu.class
Binary files differ
mes-common/model/target/classes/com/mes/role/vo/SysRoleVO.class
Binary files differ
mes-common/model/target/classes/com/mes/sysconfig/SysConfig.class
Binary files differ
mes-common/model/target/classes/com/mes/sysconfig/request/SysConfigRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/sysdict/SysDictData.class
Binary files differ
mes-common/model/target/classes/com/mes/sysdict/SysDictType.class
Binary files differ
mes-common/model/target/classes/com/mes/tempering/compute/TemperingComputeGlassInfo.class
Binary files differ
mes-common/model/target/classes/com/mes/tempering/compute/TemperingComputeRecord.class
Binary files differ
mes-common/model/target/classes/com/mes/tempering/compute/request/GlassDetailsRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/tempering/compute/request/ProcessCardsRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/tempering/compute/request/TemperingComputeIndexRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/tempering/compute/request/TemperingComputeRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/tempering/compute/request/TemperingFlowCardIdRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/tempering/compute/vo/TemperingComputeResultVO.class
Binary files differ
mes-common/model/target/classes/com/mes/tempering/compute/vo/TemperingFlowCardIdCountVO.class
Binary files differ
mes-common/model/target/classes/com/mes/tempering/compute/vo/TemperingFlowCardIdVO.class
Binary files differ
mes-common/model/target/classes/com/mes/tempering/compute/vo/TemperingGlassDetailsVO.class
Binary files differ
mes-common/model/target/classes/com/mes/tempering/compute/vo/TemperingRatioVO.class
Binary files differ
mes-common/model/target/classes/com/mes/tempering/compute/vo/TempingComputeIndexMessageAllVO.class
Binary files differ
mes-common/model/target/classes/com/mes/tempering/param/TemperingParameter.class
Binary files differ
mes-common/model/target/classes/com/mes/tempering/queue/TemperingGlassQueueInfo.class
Binary files differ
mes-common/model/target/classes/com/mes/tempering/queue/request/TemperingJobRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/tempering/queue/vo/TempIndexMessageAllVO.class
Binary files differ
mes-common/model/target/classes/com/mes/tempering/queue/vo/TemperingLayoutMessageVO.class
Binary files differ
mes-common/model/target/classes/com/mes/tempering/request/TemperingParameterImportRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/vertical/details/VerticalSheetCageDetails.class
Binary files differ
mes-common/model/target/classes/com/mes/vertical/details/dto/FlowCardGlassInfoDTO.class
Binary files differ
mes-common/model/target/classes/com/mes/vertical/details/dto/VerticalSequenceDTO.class
Binary files differ
mes-common/model/target/classes/com/mes/vertical/details/dto/VerticalSheetCageDetailsDTO.class
Binary files differ
mes-common/model/target/classes/com/mes/vertical/details/request/HollowRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/vertical/details/request/UpdateVerticalSheetCageStateRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/vertical/details/request/VerticalSheetCageDetailsRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/vertical/details/vo/HollowAllFlowCardVO.class
Binary files differ
mes-common/model/target/classes/com/mes/vertical/details/vo/TemperingGlassCountVO.class
Binary files differ
mes-common/model/target/classes/com/mes/vertical/details/vo/TemperingGlassLackVO.class
Binary files differ
mes-common/model/target/classes/com/mes/vertical/details/vo/VerticalSheetCageAndDetailsVO.class
Binary files differ
mes-common/model/target/classes/com/mes/vertical/details/vo/VerticalSheetCageDetailsVO.class
Binary files differ
mes-common/model/target/classes/com/mes/vertical/details/vo/VerticalSheetCageIndexMessageVO.class
Binary files differ
mes-common/model/target/classes/com/mes/vertical/details/vo/VerticalSheetCageSummaryVO.class
Binary files differ
mes-common/model/target/classes/com/mes/vertical/details/vo/VerticalSheetCageVO.class
Binary files differ
mes-common/model/target/classes/com/mes/vertical/history/VerticalSheetCageHistoryTask.class
Binary files differ
mes-common/model/target/classes/com/mes/vertical/history/dto/VerticalSheetCarTaskDTO.class
Binary files differ
mes-common/model/target/classes/com/mes/vertical/history/request/VerticalSheetCageHistoryRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/vertical/hollowrelation/HollowGlassRelationInfo.class
Binary files differ
mes-common/model/target/classes/com/mes/vertical/hollowrelation/vo/LackDetailsVO.class
Binary files differ
mes-common/model/target/classes/com/mes/vertical/queue/VerticalSheetCageQueueInfo.class
Binary files differ
mes-common/model/target/classes/com/mes/vertical/station/VerticalSheetCage.class
Binary files differ
mes-common/model/target/classes/com/mes/vertical/station/dto/VerticalSheetDTO.class
Binary files differ
mes-common/model/target/classes/com/mes/vertical/temperingtask/TemperingTask.class
Binary files differ
mes-common/model/target/classes/com/mes/vertical/temperingtask/dto/TemperingTaskDTO.class
Binary files differ
mes-common/model/target/classes/com/mes/vertical/temperingtask/request/TemperingTaskRequest.class
Binary files differ
mes-common/model/target/classes/com/mes/vertical/temperingtask/vo/TemperingTaskVO.class
Binary files differ
mes-common/model/target/classes/com/mes/vertical/temprelation/TemperingGlassRelationInfo.class
Binary files differ
mes-common/model/target/classes/com/mes/vertical/temprelation/dto/FlowCardVirtualSlotDTO.class
Binary files differ
mes-common/model/target/classes/com/mes/work/WorkAssignment.class
Binary files differ
mes-common/model/target/maven-archiver/pom.properties
File was deleted
mes-common/model/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
File was deleted
mes-common/model/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
File was deleted
mes-common/model/target/model-1.0.0.jar
Binary files differ
mes-common/serverBase/target/classes/application-common.yml
File was deleted
mes-common/serverBase/target/classes/application.yml
File was deleted
mes-common/serverBase/target/classes/com/kangaroohy/milo/configuration/MiloAutoConfiguration.class
Binary files differ
mes-common/serverBase/target/classes/com/kangaroohy/milo/pool/MiloConnectFactory.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/bigstorage/BigStorageCageBaseInfo.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/damage/controller/DamageController.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/damage/mapper/DamageMapper.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/damage/service/DamageService.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/damage/service/impl/DamageServiceImpl.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/damagedetails/mapper/DamageDetailsMapper.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/damagedetails/service/DamageDetailsService.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/damagedetails/service/impl/DamageDetailsServiceImpl.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/engineering/controller/EngineeringController.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/engineering/entity/request/EngineerImportRequest.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/engineering/entity/request/EngineerRequest.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/engineering/entity/vo/CutDrawingInfoVO.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/engineering/mapper/EngineeringMapper.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/engineering/service/AbstractEngineeringService.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/engineering/service/EngineeringService.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/engineering/service/impl/EngineeringServiceImpl.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/engineering/service/impl/LmEngineeringServiceImpl.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/flowcard/mapper/FlowCardInfoMapper.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/flowcard/service/FlowCardInfoService.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/flowcard/service/impl/FlowCardInfoServiceImpl.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/formula/controller/HollowFormulaDetailsController.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/formula/mapper/HollowFormulaDetailsMapper.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/formula/service/HollowFormulaDetailsService.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/formula/service/impl/HollowFormulaDetailsServiceImpl.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/glassinfo/controller/GlassInfoController.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/glassinfo/mapper/GlassInfoMapper.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/glassinfo/service/GlassInfoService.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/glassinfo/service/impl/GlassInfoServiceImpl.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/rawqueue/controller/EngineeringRawQueueController.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/rawqueue/mapper/EngineeringRawQueueMapper.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/rawqueue/service/EngineeringRawQueueService.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/rawqueue/service/impl/EngineeringRawQueueServiceImpl.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/report/controller/ReportController.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/report/mapper/ReportInfoMapper.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/report/service/ReportInfoService.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/report/service/impl/ReportInfoServiceImpl$1.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/report/service/impl/ReportInfoServiceImpl$2.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/report/service/impl/ReportInfoServiceImpl.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/sysconfig/controller/SysConfigController.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/sysconfig/mapper/SysConfigMapper.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/sysconfig/service/SysConfigService.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/sysconfig/service/impl/SysConfigServiceImpl.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/sysdict/mapper/SysDictDataMapper.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/sysdict/mapper/SysDictTypeMapper.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/sysdict/service/SysDictDataService.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/sysdict/service/SysDictTypeService.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/sysdict/service/impl/SysDictDataServiceImpl.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/sysdict/service/impl/SysDictTypeServiceImpl.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/tempparameter/mapper/TemperingParameterMapper.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/tempparameter/service/TemperingParameterService.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/tempparameter/service/impl/TemperingParameterServiceImpl.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/work/mapper/WorkAssignmentMapper.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/work/service/WorkAssignmentService.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/base/work/service/impl/WorkAssignmentServiceImpl.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/config/MybatisPlusConfig.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/config/SchedulerConfig.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/config/Swagger2Config.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/config/WebSocketConfig.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/erp/service/ErpService.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/erp/service/impl/ErpServiceImpl.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/exception/GlobalExceptionHandler.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/exception/ServiceException.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/feign/ErpUrlOpenFeignService.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/feign/MesHubOpenFeignService.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/feign/OpenFeignService.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/feign/TemperingOpenFeignService.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/feign/TemperingTaskOpenFeignService.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/request/TimeRequest.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/result/ResponseUtil.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/result/Result.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/result/ResultCodeEnum.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/s7/InitUtil.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/s7/S7control.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/s7/device/PlcBitInfo.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/s7/device/PlcBitObject.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/s7/device/PlcParameterInfo.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/s7/device/PlcParameterObject.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/s7/enhanced/EnhancedS7Serializer.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/s7/enhanced/S7AddressProperties.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/s7/enhanced/S7AnnotationProcessor.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/sysconst/Const.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/sysconst/ConstRequest.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/sysconst/ConstSwitch.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/sysconst/ConstSysConfig.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/sysconst/ConstWebSocket.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/tools/CodeGet.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/tools/DatabaseDesignDoc.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/tools/EntityTool.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/utils/DateUtil.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/utils/FileUtil.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/utils/JsonUtils.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/utils/MD5.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/utils/NbUtil.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/utils/PageUtil.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/utils/RedisUtil.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/utils/S7ParameterUtils.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/utils/WebNbUtil.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/utils/excel/CustomCellStyleHandler.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/utils/excel/CustomCellWriteWidthConfig.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/utils/excel/ExcelMerge.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/utils/excel/ExcelMergeStrategy.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/utils/excel/ExcelUtil.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/websocket/WebSocketServer.class
Binary files differ
mes-common/serverBase/target/classes/com/mes/websocket/WebSocketUtils.class
Binary files differ
mes-common/serverBase/target/classes/mapper/DamageMapper.xml
File was deleted
mes-common/serverBase/target/classes/mapper/EngineeringMapper.xml
File was deleted
mes-common/serverBase/target/classes/mapper/EngineeringRawQueueMapper.xml
File was deleted
mes-common/serverBase/target/classes/mapper/GlassInfoMapper.xml
File was deleted
mes-common/serverBase/target/maven-archiver/pom.properties
File was deleted
mes-common/serverBase/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
File was deleted
mes-common/serverBase/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
File was deleted
mes-common/serverBase/target/serverBase-1.0.0.jar
Binary files differ
mes-common/springSecurity/target/classes/application-dev.yml
File was deleted
mes-common/springSecurity/target/classes/application-loc.yml
File was deleted
mes-common/springSecurity/target/classes/application-prod.yml
File was deleted
mes-common/springSecurity/target/classes/com/mes/common/config/RedisConfig.class
Binary files differ
mes-common/springSecurity/target/classes/com/mes/common/config/TokenWebSecurityConfig.class
Binary files differ
mes-common/springSecurity/target/classes/com/mes/common/filter/JwtAuthenticationTokenFilter.class
Binary files differ
mes-common/springSecurity/target/classes/com/mes/common/handler/JwtAccessDeniedHandler.class
Binary files differ
mes-common/springSecurity/target/classes/com/mes/common/handler/JwtAuthenticationEntryPoint.class
Binary files differ
mes-common/springSecurity/target/classes/com/mes/common/handler/JwtLogoutSuccessHandler.class
Binary files differ
mes-common/springSecurity/target/classes/com/mes/common/handler/LoginFailureHandler.class
Binary files differ
mes-common/springSecurity/target/classes/com/mes/common/handler/LoginSuccessHandler.class
Binary files differ
mes-common/springSecurity/target/classes/com/mes/common/utils/FastJsonRedisSerializer.class
Binary files differ
mes-common/springSecurity/target/classes/com/mes/common/utils/JwtUtil.class
Binary files differ
mes-common/springSecurity/target/classes/com/mes/common/utils/UserInfoUtils.class
Binary files differ
mes-common/springSecurity/target/classes/com/mes/common/utils/WebUtils.class
Binary files differ
mes-common/springSecurity/target/classes/com/mes/menu/controller/SysMenuController.class
Binary files differ
mes-common/springSecurity/target/classes/com/mes/menu/mapper/SysMenuMapper.class
Binary files differ
mes-common/springSecurity/target/classes/com/mes/menu/service/SysMenuService.class
Binary files differ
mes-common/springSecurity/target/classes/com/mes/menu/service/impl/SysMenuServiceImpl.class
Binary files differ
mes-common/springSecurity/target/classes/com/mes/role/controller/SysRoleController.class
Binary files differ
mes-common/springSecurity/target/classes/com/mes/role/mapper/SysRoleMapper.class
Binary files differ
mes-common/springSecurity/target/classes/com/mes/role/mapper/SysRoleMenuMapper.class
Binary files differ
mes-common/springSecurity/target/classes/com/mes/role/mapper/xml/SysRoleMapper.xml
File was deleted
mes-common/springSecurity/target/classes/com/mes/role/mapper/xml/SysRoleMenuMapper.xml
File was deleted
mes-common/springSecurity/target/classes/com/mes/role/service/SysRoleMenuService.class
Binary files differ
mes-common/springSecurity/target/classes/com/mes/role/service/SysRoleService.class
Binary files differ
mes-common/springSecurity/target/classes/com/mes/role/service/impl/SysRoleMenuServiceImpl.class
Binary files differ
mes-common/springSecurity/target/classes/com/mes/role/service/impl/SysRoleServiceImpl.class
Binary files differ
mes-common/springSecurity/target/classes/com/mes/userinfo/controller/SysUserController.class
Binary files differ
mes-common/springSecurity/target/classes/com/mes/userinfo/entity/LoginUser.class
Binary files differ
mes-common/springSecurity/target/classes/com/mes/userinfo/entity/SysUser.class
Binary files differ
mes-common/springSecurity/target/classes/com/mes/userinfo/entity/SysUserRole.class
Binary files differ
mes-common/springSecurity/target/classes/com/mes/userinfo/entity/vo/SysUserVO.class
Binary files differ
mes-common/springSecurity/target/classes/com/mes/userinfo/mapper/SysUserMapper.class
Binary files differ
mes-common/springSecurity/target/classes/com/mes/userinfo/mapper/SysUserRoleMapper.class
Binary files differ
mes-common/springSecurity/target/classes/com/mes/userinfo/service/SysUserRoleService.class
Binary files differ
mes-common/springSecurity/target/classes/com/mes/userinfo/service/SysUserService.class
Binary files differ
mes-common/springSecurity/target/classes/com/mes/userinfo/service/impl/SysUserRoleServiceImpl.class
Binary files differ
mes-common/springSecurity/target/classes/com/mes/userinfo/service/impl/SysUserServiceImpl.class
Binary files differ
mes-common/springSecurity/target/classes/mapper/SysMenuMapper.xml
File was deleted
mes-common/springSecurity/target/classes/mapper/SysUserMapper.xml
File was deleted
mes-common/springSecurity/target/classes/mapper/SysUserRoleMapper.xml
File was deleted
mes-common/springSecurity/target/maven-archiver/pom.properties
File was deleted
mes-common/springSecurity/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
File was deleted
mes-common/springSecurity/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
File was deleted
mes-common/springSecurity/target/springSecurity-1.0.0.jar
Binary files differ
mes-processes/mes-plcSend/README_PLC_ADDRESS_MAPPING.md
@@ -20,16 +20,16 @@
- æ”¯æŒä»Žé…ç½®æ–‡ä»¶åŠ è½½é»˜è®¤é…ç½®
### 2. PlcAddressMapping
- ä½ç½®ï¼š`com.mes.entity.PlcAddressMapping`
- ä½ç½®ï¼š`com.mes.entity.PlcAddress`
- åŠŸèƒ½ï¼šå®žä½“ç±»ï¼Œå¯¹åº”æ•°æ®åº“è¡¨ç»“æž„
- å­˜å‚¨é¡¹ç›®PLC地址映射配置
### 3. PlcAddressMappingMapper
- ä½ç½®ï¼š`com.mes.mapper.PlcAddressMappingMapper`
- ä½ç½®ï¼š`com.mes.mapper.PlcAddressMapper`
- åŠŸèƒ½ï¼šMyBatis Mapper接口,提供数据库操作
### 4. PlcAddressMappingService
- ä½ç½®ï¼š`com.mes.service.PlcAddressMappingService`
- ä½ç½®ï¼š`com.mes.service.PlcAddressService`
- åŠŸèƒ½ï¼šæœåŠ¡ç±»ï¼Œæä¾›PLC地址映射配置的增删改查功能
- æ”¯æŒä»Žæ•°æ®åº“和配置文件加载配置
@@ -39,7 +39,7 @@
- ç¼“存不同项目的S7Serializer实例
### 6. PlcAddressMappingController
- ä½ç½®ï¼š`com.mes.controller.PlcAddressMappingController`
- ä½ç½®ï¼š`com.mes.controller.PlcAddressController`
- åŠŸèƒ½ï¼šæŽ§åˆ¶å™¨ï¼Œæä¾›REST API接口
## API接口
mes-processes/mes-plcSend/src/main/java/com/mes/controller/PlcAddressController.java
@@ -1,9 +1,8 @@
package com.mes.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.mes.config.PlcAddressMappingConfig;
import com.mes.entity.PlcAddressMapping;
import com.mes.service.PlcAddressMappingService;
import com.mes.entity.PlcAddress;
import com.mes.service.PlcAddressService;
import com.mes.vo.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -20,26 +19,26 @@
 * PLC地址映射配置控制器
 * æä¾›PLC地址映射配置的增删改查接口
 * 
 * @author zhoush
 * @author huang
 * @date 2025/10/29
 */
@Slf4j
@RestController
@RequestMapping("address-mapping")
@Api(tags = "PLC地址映射配置管理")
public class PlcAddressMappingController {
public class PlcAddressController {
    @Resource
    private PlcAddressMappingService plcAddressMappingService;
    private PlcAddressService plcAddressService;
    /**
     * èŽ·å–æ‰€æœ‰PLC地址映射配置
     */
    @GetMapping("/list")
    @ApiOperation("获取所有PLC地址映射配置")
    public Result<List<PlcAddressMapping>> getAllMappings() {
    public Result<List<PlcAddress>> getAllMappings() {
        try {
            List<PlcAddressMapping> mappings = plcAddressMappingService.getAllMappings();
            List<PlcAddress> mappings = plcAddressService.getAllMappings();
            return Result.success(mappings);
        } catch (Exception e) {
            log.error("获取PLC地址映射配置列表失败", e);
@@ -52,13 +51,13 @@
     */
    @GetMapping("/page")
    @ApiOperation("分页获取PLC地址映射配置")
    public Result<IPage<PlcAddressMapping>> getMappingsByPage(
    public Result<IPage<PlcAddress>> getMappingsByPage(
            @ApiParam("页码,从1开始") @RequestParam(defaultValue = "1") int page,
            @ApiParam("每页条数") @RequestParam(defaultValue = "10") int size,
            @ApiParam("项目标识,支持模糊查询") @RequestParam(required = false) String projectId,
            @ApiParam("PLC IP地址,支持模糊查询") @RequestParam(required = false) String plcIp) {
        try {
            IPage<PlcAddressMapping> pageResult = plcAddressMappingService.getMappingsByPage(page, size, projectId, plcIp);
            IPage<PlcAddress> pageResult = plcAddressService.getMappingsByPage(page, size, projectId, plcIp);
            return Result.success(pageResult);
        } catch (Exception e) {
            log.error("分页获取PLC地址映射配置失败", e);
@@ -69,12 +68,12 @@
    /**
     * æ ¹æ®ID获取PLC地址映射配置
     */
    @GetMapping("/{id}")
    @GetMapping("/detail")
    @ApiOperation("根据ID获取PLC地址映射配置")
    public Result<PlcAddressMapping> getMappingById(
            @ApiParam("配置ID") @PathVariable Long id) {
    public Result<PlcAddress> getMappingById(
            @ApiParam("配置ID") @RequestParam Long id) {
        try {
            PlcAddressMapping mapping = plcAddressMappingService.getMappingById(id);
            PlcAddress mapping = plcAddressService.getMappingById(id);
            if (mapping != null) {
                return Result.success(mapping);
            } else {
@@ -89,12 +88,12 @@
    /**
     * æ ¹æ®é¡¹ç›®æ ‡è¯†èŽ·å–PLC地址映射配置
     */
    @GetMapping("/project/{projectId}")
    @GetMapping("/project")
    @ApiOperation("根据项目标识获取PLC地址映射配置")
    public Result<PlcAddressMapping> getMappingByProjectId(
            @ApiParam("项目标识") @PathVariable String projectId) {
    public Result<PlcAddress> getMappingByProjectId(
            @ApiParam("项目标识") @RequestParam String projectId) {
        try {
            PlcAddressMapping mapping = plcAddressMappingService.getMappingByProjectId(projectId);
            PlcAddress mapping = plcAddressService.getMappingByProjectId(projectId);
            if (mapping != null) {
                return Result.success(mapping);
            } else {
@@ -114,22 +113,28 @@
    @ApiOperation("根据项目ID获取项目配置(包含地址映射)")
    public Result<Map<String, Object>> getProjectConfig(String projectId) {
        try {
            // èŽ·å–åŸºç¡€é…ç½®
            PlcAddressMapping mapping = plcAddressMappingService.getMappingByProjectId(projectId);
            PlcAddress mapping = plcAddressService.getProjectConfig(projectId);
            
            // èŽ·å–å®Œæ•´é¡¹ç›®é…ç½®ï¼ˆåŒ…å«åœ°å€æ˜ å°„ï¼‰
            PlcAddressMappingConfig.ProjectPlcConfig projectConfig = plcAddressMappingService.getProjectConfigWithMapping(projectId);
            // åˆå¹¶åŸºç¡€é…ç½®ä¿¡æ¯
            // ç»„装输出,仅基于数据库实体
            Map<String, Object> result = new HashMap<>();
            result.put("projectId", projectId);
            result.put("dbArea", projectConfig.getDbArea());
            result.put("beginIndex", projectConfig.getBeginIndex());
            result.put("plcIp", projectConfig.getPlcIp());
            result.put("plcType", projectConfig.getPlcType());
            result.put("addressMapping", projectConfig.getAddressMapping());
            result.put("dbArea", mapping != null ? mapping.getDbArea() : "DB1");
            result.put("beginIndex", mapping != null ? mapping.getBeginIndex() : 0);
            result.put("plcIp", mapping != null ? mapping.getPlcIp() : null);
            result.put("plcType", mapping != null ? mapping.getPlcType() : null);
            
            // å¦‚果数据库中有配置,添加数据库中的额外信息
            // è§£æžaddressMapping JSON为Map
            Map<String, Integer> addressMap = new HashMap<>();
            if (mapping != null && mapping.getAddressMapping() != null && !mapping.getAddressMapping().trim().isEmpty()) {
                try {
                    addressMap = new com.fasterxml.jackson.databind.ObjectMapper()
                            .readValue(mapping.getAddressMapping(), new com.fasterxml.jackson.core.type.TypeReference<Map<String, Integer>>() {});
                } catch (Exception parseEx) {
                    log.warn("解析地址映射JSON失败: {}", mapping.getAddressMapping());
                }
            }
            result.put("addressMapping", addressMap);
            if (mapping != null) {
                result.put("id", mapping.getId());
                result.put("projectName", mapping.getProjectName());
@@ -148,8 +153,8 @@
     */
    @PostMapping
    @ApiOperation("创建新的PLC地址映射配置")
    public Result<PlcAddressMapping> createMapping(
            @ApiParam("PLC地址映射配置") @RequestBody PlcAddressMapping mapping) {
    public Result<PlcAddress> createMapping(
            @ApiParam("PLC地址映射配置") @RequestBody PlcAddress mapping) {
        try {
            // å‚数验证
            if (mapping.getProjectId() == null || mapping.getProjectId().trim().isEmpty()) {
@@ -163,7 +168,7 @@
                mapping.setBeginIndex(0); // å¦‚果为负数,设置为默认起始索引0
            }
            PlcAddressMapping created = plcAddressMappingService.saveMapping(mapping);
            PlcAddress created = plcAddressService.saveMapping(mapping);
            log.info("创建PLC地址映射配置成功,ID: {}, é¡¹ç›®æ ‡è¯†: {}", created.getId(), created.getProjectId());
            return Result.success(created);
        } catch (Exception e) {
@@ -175,11 +180,11 @@
    /**
     * æ›´æ–°PLC地址映射配置
     */
    @PutMapping("/{id}")
    @PutMapping("/update")
    @ApiOperation("更新PLC地址映射配置")
    public Result<PlcAddressMapping> updateMapping(
            @ApiParam("配置ID") @PathVariable Long id,
            @ApiParam("更新的PLC地址映射配置") @RequestBody PlcAddressMapping mapping) {
    public Result<PlcAddress> updateMapping(
            @ApiParam("配置ID") @RequestParam Long id,
            @ApiParam("更新的PLC地址映射配置") @RequestBody PlcAddress mapping) {
        try {
            // å‚数验证
            if (mapping.getProjectId() == null || mapping.getProjectId().trim().isEmpty()) {
@@ -190,7 +195,7 @@
            }
            mapping.setId(id);
            PlcAddressMapping updated = plcAddressMappingService.updateMapping(mapping);
            PlcAddress updated = plcAddressService.updateMapping(mapping);
            if (updated != null) {
                log.info("更新PLC地址映射配置成功,ID: {}, é¡¹ç›®æ ‡è¯†: {}", updated.getId(), updated.getProjectId());
                return Result.success(updated);
@@ -207,11 +212,11 @@
     * æ ¹æ®é¡¹ç›®ID更新配置
     * å¯¹åº”前端:updateConfig
     */
    @PutMapping("/project/{projectId}")
    @PutMapping("/project/update")
    @ApiOperation("根据项目ID更新配置")
    public Result<PlcAddressMapping> updateMappingByProjectId(
            @ApiParam("项目标识") @PathVariable String projectId,
            @ApiParam("更新的PLC地址映射配置") @RequestBody PlcAddressMapping mapping) {
    public Result<PlcAddress> updateMappingByProjectId(
            @ApiParam("项目标识") @RequestParam String projectId,
            @ApiParam("更新的PLC地址映射配置") @RequestBody PlcAddress mapping) {
        try {
            // å‚数验证
            if (mapping.getDbArea() == null || mapping.getDbArea().trim().isEmpty()) {
@@ -222,16 +227,16 @@
            mapping.setProjectId(projectId);
            
            // æŸ¥æ‰¾çŽ°æœ‰é…ç½®
            PlcAddressMapping existing = plcAddressMappingService.getMappingByProjectId(projectId);
            PlcAddress existing = plcAddressService.getMappingByProjectId(projectId);
            if (existing != null) {
                // æ›´æ–°çŽ°æœ‰é…ç½®
                mapping.setId(existing.getId());
                PlcAddressMapping updated = plcAddressMappingService.updateMapping(mapping);
                PlcAddress updated = plcAddressService.updateMapping(mapping);
                log.info("根据项目ID更新PLC地址映射配置成功,项目标识: {}", projectId);
                return Result.success(updated);
            } else {
                // åˆ›å»ºæ–°é…ç½®
                PlcAddressMapping created = plcAddressMappingService.saveMapping(mapping);
                PlcAddress created = plcAddressService.saveMapping(mapping);
                log.info("根据项目ID创建PLC地址映射配置成功,项目标识: {}", projectId);
                return Result.success(created);
            }
@@ -244,12 +249,12 @@
    /**
     * åˆ é™¤PLC地址映射配置
     */
    @DeleteMapping("/{id}")
    @DeleteMapping("/delete")
    @ApiOperation("删除PLC地址映射配置")
    public Result<Void> deleteMapping(
            @ApiParam("配置ID") @PathVariable Long id) {
            @ApiParam("配置ID") @RequestParam Long id) {
        try {
            boolean deleted = plcAddressMappingService.deleteMapping(id);
            boolean deleted = plcAddressService.deleteMapping(id);
            if (deleted) {
                log.info("删除PLC地址映射配置成功,ID: {}", id);
                return Result.success();
@@ -274,7 +279,7 @@
                return Result.error("ID列表不能为空");
            }
            
            int deletedCount = plcAddressMappingService.deleteMappings(ids);
            int deletedCount = plcAddressService.deleteMappings(ids);
            log.info("批量删除PLC地址映射配置成功,删除数量: {}, ID列表: {}", deletedCount, ids);
            return Result.success();
        } catch (Exception e) {
@@ -286,17 +291,17 @@
    /**
     * æµ‹è¯•PLC连接
     */
    @PostMapping("/{id}/test-connection")
    @PostMapping("/test-connection")
    @ApiOperation("测试PLC连接")
    public Result<String> testConnection(
            @ApiParam("配置ID") @PathVariable Long id) {
            @ApiParam("配置ID") @RequestParam Long id) {
        try {
            PlcAddressMapping mapping = plcAddressMappingService.getMappingById(id);
            PlcAddress mapping = plcAddressService.getMappingById(id);
            if (mapping == null) {
                return Result.error("未找到ID为 " + id + " çš„PLC地址映射配置");
            }
            boolean isConnected = plcAddressMappingService.testConnection(mapping);
            boolean isConnected = plcAddressService.testConnection(mapping);
            if (isConnected) {
                String message = String.format("PLC连接测试成功 - é¡¹ç›®: %s, IP: %s, DB块: %s", 
                        mapping.getProjectId(), mapping.getPlcIp(), mapping.getDbArea());
@@ -321,7 +326,7 @@
    @ApiOperation("重新加载配置文件中的地址映射")
    public Result<String> reloadConfig() {
        try {
            plcAddressMappingService.reloadConfigMappings();
            plcAddressService.reloadConfigMappings();
            String message = "配置文件中的PLC地址映射已重新加载";
            log.info(message);
            return Result.success(message);
mes-processes/mes-plcSend/src/main/java/com/mes/controller/PlcTestController.java
New file
@@ -0,0 +1,376 @@
package com.mes.controller;
import com.mes.service.PlcAutoTestService;
import com.mes.service.PlcTestWriteService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
/**
 * PLC测试任务控制器
 * æä¾›PLC测试任务管理相关的API接口
 * <p>
 * å®žçŽ°å‰ç«¯Test.vue组件所需的所有API接口
 *
 * @author huang
 * @date 2025/10/30
 */
@Slf4j
@RestController
@RequestMapping("/api/plc/test")
@Api(tags = "PLC测试任务管理")
public class PlcTestController {
    @Resource
    private PlcTestWriteService plcTestWriteService;
    @Resource
    private PlcAutoTestService plcAutoTestService;
    // æ¨¡æ‹Ÿä»»åŠ¡æ•°æ®å­˜å‚¨
    private final Map<String, Map<String, Object>> taskMap = new ConcurrentHashMap<>();
    private final Map<String, Map<String, Object>> moduleStatusMap = new ConcurrentHashMap<>();
    /**
     * æ‰§è¡ŒæŒ‡å®šæ¨¡å—的测试任务
     * å¯¹åº”前端:submitTest
     */
    @PostMapping("/execute/{module}")
    @ApiOperation("执行指定模块的测试任务")
    public Map<String, Object> executeTest(@ApiParam("模块名称") @PathVariable String module) {
        log.info("执行测试任务,模块: {}", module);
        Map<String, Object> result = new HashMap<>();
        try {
            // æ¨¡æ‹Ÿæ‰§è¡Œæµ‹è¯•任务
            boolean success = plcTestWriteService.simulatePlcRequest(module);
            // åˆ›å»ºä»»åŠ¡è®°å½•
            String taskId = UUID.randomUUID().toString();
            Map<String, Object> task = new HashMap<>();
            task.put("id", taskId);
            task.put("module", module);
            task.put("status", success ? "running" : "failed");
            task.put("createTime", new Date());
            task.put("message", success ? "测试任务已启动" : "测试任务启动失败");
            taskMap.put(taskId, task);
            // æ›´æ–°æ¨¡å—状态
            updateModuleStatus(module, "running");
            result.put("success", success);
            result.put("data", taskId);
            result.put("message", success ? "测试任务已启动" : "测试任务启动失败");
        } catch (Exception e) {
            log.error("执行测试任务异常,模块: {}", module, e);
            result.put("success", false);
            result.put("message", "执行测试任务异常: " + e.getMessage());
        }
        return result;
    }
    /**
     * èŽ·å–æŒ‡å®šæ¨¡å—çš„ä»»åŠ¡çŠ¶æ€
     * å¯¹åº”前端:getTaskStatus
     */
    @GetMapping("/status/{module}")
    @ApiOperation("获取指定模块的任务状态")
    public Map<String, Object> getTaskStatus(@ApiParam("模块名称") @PathVariable String module) {
        log.info("获取任务状态,模块: {}", module);
        Map<String, Object> result = new HashMap<>();
        try {
            // æŸ¥æ‰¾è¯¥æ¨¡å—的最新任务
            Optional<Map.Entry<String, Map<String, Object>>> latestTask =
                    taskMap.entrySet().stream()
                            .filter(entry -> module.equals(entry.getValue().get("module")))
                            .max(Map.Entry.comparingByKey());
            if (latestTask.isPresent()) {
                Map<String, Object> task = latestTask.get().getValue();
                // æ¨¡æ‹Ÿä»»åŠ¡çŠ¶æ€å˜åŒ–
                String status = (String) task.get("status");
                if ("running".equals(status)) {
                    // éšæœºå†³å®šä»»åŠ¡æ˜¯å¦å®Œæˆ
                    if (Math.random() > 0.5) {
                        task.put("status", "success");
                        task.put("message", "测试任务执行成功");
                        updateModuleStatus(module, "idle");
                    }
                }
                result.put("success", true);
                result.put("data", task);
            } else {
                result.put("success", false);
                result.put("message", "未找到模块的任务记录");
            }
        } catch (Exception e) {
            log.error("获取任务状态异常,模块: {}", module, e);
            result.put("success", false);
            result.put("message", "获取任务状态异常: " + e.getMessage());
        }
        return result;
    }
    /**
     * æ‰¹é‡æµ‹è¯•
     * å¯¹åº”前端:batchTest
     */
    @PostMapping("/batch")
    @ApiOperation("批量测试")
    public Map<String, Object> batchTest(@ApiParam("批量测试请求") @RequestBody Map<String, Object> request) {
        List<String> modules = (List<String>) request.get("modules");
        log.info("执行批量测试,模块列表: {}", modules);
        Map<String, Object> result = new HashMap<>();
        List<Map<String, Object>> results = new ArrayList<>();
        try {
            for (String module : modules) {
                Map<String, Object> moduleResult = new HashMap<>();
                moduleResult.put("module", module);
                try {
                    boolean success = plcTestWriteService.simulatePlcRequest(module);
                    moduleResult.put("success", success);
                    moduleResult.put("message", success ? "测试任务已启动" : "测试任务启动失败");
                    if (success) {
                        updateModuleStatus(module, "running");
                    }
                } catch (Exception e) {
                    moduleResult.put("success", false);
                    moduleResult.put("message", "执行测试异常: " + e.getMessage());
                    log.error("批量测试模块异常,模块: {}", module, e);
                }
                results.add(moduleResult);
            }
            result.put("success", true);
            result.put("data", results);
            result.put("message", "批量测试任务已提交");
        } catch (Exception e) {
            log.error("批量测试异常", e);
            result.put("success", false);
            result.put("message", "批量测试异常: " + e.getMessage());
        }
        return result;
    }
    /**
     * å¯¼å…¥æµ‹è¯•任务
     * å¯¹åº”前端:importTask
     */
    @PostMapping("/import")
    @ApiOperation("导入测试任务")
    public Map<String, Object> importTask(@ApiParam("任务文件") @RequestParam("file") MultipartFile file) {
        log.info("导入测试任务文件: {}", file.getOriginalFilename());
        Map<String, Object> result = new HashMap<>();
        try {
            // è¿™é‡Œåªæ˜¯æ¨¡æ‹Ÿå¯¼å…¥åŠŸèƒ½
            // å®žé™…应该解析文件内容,创建测试任务
            result.put("success", true);
            result.put("data", file.getOriginalFilename());
            result.put("message", "测试任务导入成功");
        } catch (Exception e) {
            log.error("导入测试任务异常", e);
            result.put("success", false);
            result.put("message", "导入测试任务异常: " + e.getMessage());
        }
        return result;
    }
    /**
     * èŽ·å–æ‰€æœ‰æ¨¡å—çŠ¶æ€
     * å¯¹åº”前端:getModulesStatus
     */
    @GetMapping("/modules/status")
    @ApiOperation("获取所有模块状态")
    public Map<String, Object> getModulesStatus() {
        log.info("获取所有模块状态");
        Map<String, Object> result = new HashMap<>();
        try {
            // åˆå§‹åŒ–默认模块状态(如果不存在)
            initDefaultModuleStatus();
            // æ›´æ–°æ‰€æœ‰æ¨¡å—状态
            for (String module : moduleStatusMap.keySet()) {
                checkModuleStatus(module);
            }
            result.put("success", true);
            result.put("data", new ArrayList<>(moduleStatusMap.values()));
        } catch (Exception e) {
            log.error("获取模块状态异常", e);
            result.put("success", false);
            result.put("message", "获取模块状态异常: " + e.getMessage());
        }
        return result;
    }
    /**
     * é‡ç½®æŒ‡å®šæ¨¡å—
     * å¯¹åº”前端:resetModule
     */
    @PostMapping("/reset/{module}")
    @ApiOperation("重置指定模块")
    public Map<String, Object> resetModule(@ApiParam("模块名称") @PathVariable String module) {
        log.info("重置模块: {}", module);
        Map<String, Object> result = new HashMap<>();
        try {
            boolean success = plcTestWriteService.resetPlc(module);
            if (success) {
                updateModuleStatus(module, "idle");
                // æ¸…除该模块的所有任务
                taskMap.entrySet().removeIf(entry -> module.equals(entry.getValue().get("module")));
            }
            result.put("success", success);
            result.put("message", success ? "模块重置成功" : "模块重置失败");
        } catch (Exception e) {
            log.error("重置模块异常,模块: {}", module, e);
            result.put("success", false);
            result.put("message", "重置模块异常: " + e.getMessage());
        }
        return result;
    }
    /**
     * é‡è¯•指定模块的任务
     * å¯¹åº”前端:retryTask
     */
    @PostMapping("/retry/{module}")
    @ApiOperation("重试指定模块的任务")
    public Map<String, Object> retryTask(@ApiParam("模块名称") @PathVariable String module) {
        log.info("重试模块任务: {}", module);
        Map<String, Object> result = new HashMap<>();
        try {
            // å…ˆé‡ç½®æ¨¡å—
            plcTestWriteService.resetPlc(module);
            // ç„¶åŽé‡æ–°æ‰§è¡Œæµ‹è¯•
            boolean success = plcTestWriteService.simulatePlcRequest(module);
            // åˆ›å»ºæ–°ä»»åŠ¡è®°å½•
            String taskId = UUID.randomUUID().toString();
            Map<String, Object> task = new HashMap<>();
            task.put("id", taskId);
            task.put("module", module);
            task.put("status", success ? "running" : "failed");
            task.put("createTime", new Date());
            task.put("message", success ? "测试任务已重启" : "测试任务重启失败");
            taskMap.put(taskId, task);
            if (success) {
                updateModuleStatus(module, "running");
            }
            result.put("success", success);
            result.put("data", taskId);
            result.put("message", success ? "测试任务已重启" : "测试任务重启失败");
        } catch (Exception e) {
            log.error("重试模块任务异常,模块: {}", module, e);
            result.put("success", false);
            result.put("message", "重试模块任务异常: " + e.getMessage());
        }
        return result;
    }
    /**
     * åœæ­¢æŒ‡å®šæ¨¡å—的测试
     * å¯¹åº”前端:stopTest
     */
    @PostMapping("/stop/{module}")
    @ApiOperation("停止指定模块的测试")
    public Map<String, Object> stopTest(@ApiParam("模块名称") @PathVariable String module) {
        log.info("停止模块测试: {}", module);
        Map<String, Object> result = new HashMap<>();
        try {
            // é‡ç½®PLC状态来停止测试
            boolean success = plcTestWriteService.resetPlc(module);
            if (success) {
                updateModuleStatus(module, "idle");
                // æ›´æ–°è¯¥æ¨¡å—的所有运行中任务状态
                taskMap.entrySet().stream()
                        .filter(entry -> module.equals(entry.getValue().get("module")) && "running".equals(entry.getValue().get("status")))
                        .forEach(entry -> {
                            entry.getValue().put("status", "stopped");
                            entry.getValue().put("message", "测试任务已手动停止");
                        });
            }
            result.put("success", success);
            result.put("message", success ? "测试已停止" : "停止测试失败");
        } catch (Exception e) {
            log.error("停止模块测试异常,模块: {}", module, e);
            result.put("success", false);
            result.put("message", "停止模块测试异常: " + e.getMessage());
        }
        return result;
    }
    // åˆå§‹åŒ–默认模块状态
    private void initDefaultModuleStatus() {
        // å®šä¹‰é»˜è®¤çš„æ¨¡å—列表
        List<String> defaultModules = Arrays.asList(
                "gantryStorage",
                "upperModule",
                "lowerModule",
                "stackerModule",
                "shuttleModule",
                "verticalModule",
                "horizontalModule"
        );
        for (String module : defaultModules) {
            moduleStatusMap.computeIfAbsent(module, k -> {
                Map<String, Object> status = new HashMap<>();
                status.put("module", module);
                status.put("status", "idle");
                status.put("updateTime", new Date());
                return status;
            });
        }
    }
    // æ›´æ–°æ¨¡å—状态
    private void updateModuleStatus(String module, String status) {
        Map<String, Object> moduleStatus = moduleStatusMap.computeIfAbsent(module, k -> new HashMap<>());
        moduleStatus.put("module", module);
        moduleStatus.put("status", status);
        moduleStatus.put("updateTime", new Date());
    }
    // æ£€æŸ¥å¹¶æ›´æ–°æ¨¡å—状态
    private void checkModuleStatus(String module) {
        Map<String, Object> moduleStatus = moduleStatusMap.get(module);
        if (moduleStatus != null) {
            String status = (String) moduleStatus.get("status");
            // å¦‚果模块状态为running,可以在这里添加逻辑来检查实际状态
            // è¿™é‡Œç®€å•模拟状态变化
            if ("running".equals(status) && Math.random() > 0.7) {
                moduleStatus.put("status", "idle");
                moduleStatus.put("updateTime", new Date());
            }
        }
    }
}
mes-processes/mes-plcSend/src/main/java/com/mes/controller/PlcTestWriteController.java
@@ -1,343 +1,128 @@
package com.mes.controller;
import com.mes.entity.PlcBaseData;
import com.mes.service.PlcAutoTestService;
import com.mes.service.PlcTestWriteService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
/**
 * PLC测试写入控制器
 * ä¸ºå‰ç«¯æä¾›æ¨¡æ‹ŸPLC写入操作的接口
 * æä¾›PLC测试写入相关的API接口
 * 
 * @author zhoush
 * @author huang
 * @date 2025/10/29
 */
@Slf4j
@RestController
@RequestMapping("/plcTest/write")
@RequestMapping("/api/plc/test")
@Api(tags = "PLC测试写入接口")
public class PlcTestWriteController {
    @Resource
    private PlcTestWriteService plcTestWriteService;
    @Resource
    private PlcAutoTestService plcAutoTestService;
    /**
     * æ¨¡æ‹ŸPLC发送请求字
     */
    @PostMapping("/request")
    public Map<String, Object> simulateRequest(@RequestBody(required = false) Map<String, Object> params) {
        Map<String, Object> result = new HashMap<>();
        try {
            boolean success;
            if (params != null && params.containsKey("dbBlock")) {
                String dbBlock = (String) params.get("dbBlock");
                int beginIndex = (int) params.getOrDefault("beginIndex", 0);
                success = plcTestWriteService.simulatePlcRequest(dbBlock, beginIndex);
            } else {
                success = plcTestWriteService.simulatePlcRequest();
            }
            result.put("success", success);
            result.put("message", success ? "PLC请求字发送成功" : "发送失败");
            // è¿”回当前状态
            PlcBaseData status = plcTestWriteService.readPlcStatus();
            result.put("currentStatus", status);
        } catch (Exception e) {
            log.error("模拟PLC请求异常", e);
            result.put("success", false);
            result.put("message", "操作失败: " + e.getMessage());
    @PostMapping("/simulate/request")
    @ApiOperation("模拟PLC发送请求字(触发MES任务下发)")
    public boolean simulatePlcRequest(
            @ApiParam(value = "项目标识,如vertical、horizontal等,不指定则使用默认项目", example = "vertical")
            @RequestParam(required = false) String projectId) {
        if (projectId != null && !projectId.trim().isEmpty()) {
            return plcTestWriteService.simulatePlcRequest(projectId.trim());
        } else {
            return plcTestWriteService.simulatePlcRequest();
        }
        return result;
    }
    /**
     * æ¨¡æ‹ŸPLC任务完成汇报
     */
    @PostMapping("/report")
    public Map<String, Object> simulateReport(@RequestBody(required = false) Map<String, Object> params) {
        Map<String, Object> result = new HashMap<>();
        try {
            boolean success;
            if (params != null && params.containsKey("dbBlock")) {
                String dbBlock = (String) params.get("dbBlock");
                int beginIndex = (int) params.getOrDefault("beginIndex", 0);
                success = plcTestWriteService.simulatePlcReport(dbBlock, beginIndex);
            } else {
                success = plcTestWriteService.simulatePlcReport();
            }
            result.put("success", success);
            result.put("message", success ? "PLC任务汇报成功" : "汇报失败");
            PlcBaseData status = plcTestWriteService.readPlcStatus();
            result.put("currentStatus", status);
        } catch (Exception e) {
            log.error("模拟上片PLC汇报异常", e);
            result.put("success", false);
            result.put("message", "操作失败: " + e.getMessage());
    @PostMapping("/simulate/report")
    @ApiOperation("模拟PLC任务完成汇报")
    public boolean simulatePlcReport(
            @ApiParam(value = "项目标识,如vertical、horizontal等,不指定则使用默认项目", example = "vertical")
            @RequestParam(required = false) String projectId) {
        if (projectId != null && !projectId.trim().isEmpty()) {
            return plcTestWriteService.simulatePlcReport(projectId.trim());
        } else {
            return plcTestWriteService.simulatePlcReport();
        }
        return result;
    }
    /**
     * æ¨¡æ‹ŸPLC联机状态
     */
    @PostMapping("/online")
    public Map<String, Object> simulateOnline(@RequestBody Map<String, Object> params) {
        Map<String, Object> result = new HashMap<>();
        try {
            int onlineState = (int) params.getOrDefault("onlineState", 1);
            boolean success;
            if (params.containsKey("dbBlock")) {
                String dbBlock = (String) params.get("dbBlock");
                int beginIndex = (int) params.getOrDefault("beginIndex", 0);
                success = plcTestWriteService.simulateOnlineStatus(onlineState, dbBlock, beginIndex);
            } else {
                success = plcTestWriteService.simulateOnlineStatus(onlineState);
            }
            result.put("success", success);
            result.put("message", success ? "PLC联机状态设置成功: " + onlineState : "设置失败");
            PlcBaseData status = plcTestWriteService.readPlcStatus();
            result.put("currentStatus", status);
        } catch (Exception e) {
            log.error("模拟PLC联机状态异常", e);
            result.put("success", false);
            result.put("message", "操作失败: " + e.getMessage());
    @PostMapping("/simulate/online")
    @ApiOperation("模拟PLC发送联机状态")
    public boolean simulateOnlineStatus(
            @ApiParam(value = "联机状态:1-联机,0-脱机", required = true, example = "1")
            @RequestParam int onlineState,
            @ApiParam(value = "项目标识,如vertical、horizontal等,不指定则使用默认项目", example = "vertical")
            @RequestParam(required = false) String projectId) {
        if (projectId != null && !projectId.trim().isEmpty()) {
            return plcTestWriteService.simulateOnlineStatus(onlineState, projectId.trim());
        } else {
            return plcTestWriteService.simulateOnlineStatus(onlineState);
        }
        return result;
    }
    /**
     * é‡ç½®PLC状态
     */
    @PostMapping("/reset")
    public Map<String, Object> resetPlc(@RequestBody(required = false) Map<String, Object> params) {
        Map<String, Object> result = new HashMap<>();
        try {
            boolean success;
            if (params != null && params.containsKey("dbBlock")) {
                String dbBlock = (String) params.get("dbBlock");
                int beginIndex = (int) params.getOrDefault("beginIndex", 0);
                success = plcTestWriteService.resetPlc(dbBlock, beginIndex);
            } else {
                success = plcTestWriteService.resetPlc();
            }
            result.put("success", success);
            result.put("message", success ? "PLC状态重置成功" : "重置失败");
            PlcBaseData status = plcTestWriteService.readPlcStatus();
            result.put("currentStatus", status);
        } catch (Exception e) {
            log.error("重置上片PLC状态异常", e);
            result.put("success", false);
            result.put("message", "操作失败: " + e.getMessage());
    @ApiOperation("重置PLC所有状态")
    public boolean resetPlc(
            @ApiParam(value = "项目标识,如vertical、horizontal等,不指定则使用默认项目", example = "vertical")
            @RequestParam(required = false) String projectId) {
        if (projectId != null && !projectId.trim().isEmpty()) {
            return plcTestWriteService.resetPlc(projectId.trim());
        } else {
            return plcTestWriteService.resetPlc();
        }
        return result;
    }
    /**
     * è¯»å–PLC当前状态
     */
    @GetMapping("/status")
    public Map<String, Object> getPlcStatus(@RequestParam(required = false) String dbBlock,
                                           @RequestParam(required = false, defaultValue = "0") Integer beginIndex) {
        Map<String, Object> result = new HashMap<>();
        try {
            PlcBaseData status;
            if (dbBlock != null) {
                status = plcTestWriteService.readPlcStatus(dbBlock, beginIndex);
            } else {
                status = plcTestWriteService.readPlcStatus();
            }
            result.put("success", true);
            result.put("data", status);
            result.put("message", "获取上片PLC状态成功");
        } catch (Exception e) {
            log.error("读取上片PLC状态异常", e);
            result.put("success", false);
            result.put("message", "获取状态失败: " + e.getMessage());
    @ApiOperation("读取PLC当前状态")
    public PlcBaseData readPlcStatus(
            @ApiParam(value = "项目标识,如vertical、horizontal等,不指定则使用默认项目", example = "vertical")
            @RequestParam(required = false) String projectId) {
        if (projectId != null && !projectId.trim().isEmpty()) {
            return plcTestWriteService.readPlcStatus(projectId.trim());
        } else {
            return plcTestWriteService.readPlcStatus();
        }
        return result;
    }
    /**
     * æ‰¹é‡æµ‹è¯• - æ¨¡æ‹Ÿå®Œæ•´ä»»åŠ¡æµç¨‹
     */
    @PostMapping("/batch/test")
    public Map<String, Object> batchTest(@RequestBody Map<String, Object> params) {
        Map<String, Object> result = new HashMap<>();
    @PostMapping("/current-project")
    @ApiOperation("设置当前项目标识")
    public boolean setCurrentProjectId(
            @ApiParam(value = "项目标识,如vertical、horizontal等", required = true, example = "vertical")
            @RequestParam String projectId) {
        try {
            String protocolType = (String) params.get("protocolType");
            int taskCount = (int) params.getOrDefault("taskCount", 1);
            log.info("开始批量测试,协议类型: {}, ä»»åŠ¡æ•°é‡: {}", protocolType, taskCount);
            // æ¨¡æ‹Ÿå®Œæ•´çš„任务流程
            for (int i = 1; i <= taskCount; i++) {
                log.info("执行第{}个任务", i);
                if ("load".equals(protocolType)) {
                    // æµç¨‹
                    plcTestWriteService.simulatePlcRequest(); // å‘送请求
                    // ç­‰å¾…MES响应
                    Thread.sleep(1000);
                    plcTestWriteService.simulatePlcReport();  // ä»»åŠ¡å®Œæˆ
                } else if ("raw".equals(protocolType)) {
                    // æµç¨‹
                    plcTestWriteService.simulatePlcRequest(); // å‘送请求
                    // ç­‰å¾…MES响应
                    Thread.sleep(1000);
                    plcTestWriteService.simulatePlcReport();  // ä»»åŠ¡å®Œæˆ
                }
                // ä»»åŠ¡é—´éš”
                if (i < taskCount) {
                    Thread.sleep(2000);
                }
            plcTestWriteService.setCurrentProjectId(projectId.trim());
            return true;
        } catch (Exception e) {
            log.error("设置当前项目标识失败", e);
            return false;
        }
    }
    @GetMapping("/current-project")
    @ApiOperation("获取当前项目标识")
    public String getCurrentProjectId() {
        return plcTestWriteService.getCurrentProjectId();
    }
    @PostMapping("/cache/clear")
    @ApiOperation("清除S7Serializer缓存")
    public boolean clearSerializerCache(
            @ApiParam(value = "项目标识,如vertical、horizontal等,不指定则清除所有缓存", example = "vertical")
            @RequestParam(required = false) String projectId) {
        try {
            if (projectId != null && !projectId.trim().isEmpty()) {
                plcTestWriteService.clearSerializerCache(projectId.trim());
            } else {
                plcTestWriteService.clearAllSerializerCache();
            }
            result.put("success", true);
            result.put("message", "批量测试完成,共执行" + taskCount + "个任务");
            return true;
        } catch (Exception e) {
            log.error("批量测试异常", e);
            result.put("success", false);
            result.put("message", "批量测试失败: " + e.getMessage());
            log.error("清除S7Serializer缓存失败", e);
            return false;
        }
        return result;
    }
    /**
     * è®¾ç½®DB块地址
     */
    @PostMapping("/dbBlock")
    public Map<String, Object> setDbBlock(@RequestBody Map<String, Object> params) {
        Map<String, Object> result = new HashMap<>();
        try {
            String dbBlock = (String) params.get("dbBlock");
            plcTestWriteService.setCurrentDbBlock(dbBlock);
            result.put("success", true);
            result.put("message", "DB块地址设置成功: " + dbBlock);
        } catch (Exception e) {
            log.error("设置DB块地址异常", e);
            result.put("success", false);
            result.put("message", "设置DB块地址失败: " + e.getMessage());
        }
        return result;
    }
    /**
     * èŽ·å–å½“å‰DB块地址
     */
    @GetMapping("/dbBlock")
    public Map<String, Object> getDbBlock() {
        Map<String, Object> result = new HashMap<>();
        try {
            String dbBlock = plcTestWriteService.getCurrentDbBlock();
            result.put("success", true);
            result.put("data", dbBlock);
            result.put("message", "获取DB块地址成功");
        } catch (Exception e) {
            log.error("获取DB块地址异常", e);
            result.put("success", false);
            result.put("message", "获取DB块地址失败: " + e.getMessage());
        }
        return result;
    }
    /**
     * å¯ç”¨è‡ªåŠ¨æµ‹è¯•æ¨¡å¼
     */
    @PostMapping("/auto/enable")
    public Map<String, Object> enableAutoTest() {
        Map<String, Object> result = new HashMap<>();
        try {
            plcAutoTestService.enableAutoTest();
            result.put("success", true);
            result.put("message", "自动测试模式已启用");
        } catch (Exception e) {
            log.error("启用自动测试模式异常", e);
            result.put("success", false);
            result.put("message", "启用自动测试模式失败: " + e.getMessage());
        }
        return result;
    }
    /**
     * ç¦ç”¨è‡ªåŠ¨æµ‹è¯•æ¨¡å¼
     */
    @PostMapping("/auto/disable")
    public Map<String, Object> disableAutoTest() {
        Map<String, Object> result = new HashMap<>();
        try {
            plcAutoTestService.disableAutoTest();
            result.put("success", true);
            result.put("message", "自动测试模式已禁用");
        } catch (Exception e) {
            log.error("禁用自动测试模式异常", e);
            result.put("success", false);
            result.put("message", "禁用自动测试模式失败: " + e.getMessage());
        }
        return result;
    }
    /**
     * èŽ·å–è‡ªåŠ¨æµ‹è¯•æ¨¡å¼çŠ¶æ€
     */
    @GetMapping("/auto/status")
    public Map<String, Object> getAutoTestStatus() {
        Map<String, Object> result = new HashMap<>();
        try {
            boolean isEnabled = plcAutoTestService.isAutoTestEnabled();
            result.put("success", true);
            result.put("data", isEnabled);
            result.put("message", "获取自动测试模式状态成功");
        } catch (Exception e) {
            log.error("获取自动测试模式状态异常", e);
            result.put("success", false);
            result.put("message", "获取自动测试模式状态失败: " + e.getMessage());
        }
        return result;
    }
}
mes-processes/mes-plcSend/src/main/java/com/mes/controller/PlcTestWriteLegacyController.java
New file
@@ -0,0 +1,352 @@
package com.mes.controller;
import com.mes.entity.PlcBaseData;
import com.mes.service.PlcAutoTestService;
import com.mes.service.PlcTestWriteService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
/**
 * PLC测试写入控制器(兼容旧API)
 * ä¸ºå‰ç«¯æä¾›æ¨¡æ‹ŸPLC写入操作的接口
 *
 * @author huang
 * @date 2025/10/29
 */
@Slf4j
@RestController
@RequestMapping("/plcTest/write")
public class PlcTestWriteLegacyController {
    @Resource
    private PlcTestWriteService plcTestWriteService;
    @Resource
    private PlcAutoTestService plcAutoTestService;
    /**
     * æ¨¡æ‹ŸPLC发送请求字
     */
    @PostMapping("/request")
    public Map<String, Object> simulateRequest(@RequestBody(required = false) Map<String, Object> params) {
        Map<String, Object> result = new HashMap<>();
        try {
            boolean success;
            if (params != null && params.containsKey("dbBlock")) {
                String dbBlock = (String) params.get("dbBlock");
                int beginIndex = (int) params.getOrDefault("beginIndex", 0);
                // ä½¿ç”¨é»˜è®¤é¡¹ç›®ï¼Œä½†è®°å½•警告
                log.warn("使用旧API参数dbBlock={}, beginIndex={},建议使用新API基于项目ID的方式", dbBlock, beginIndex);
                success = plcTestWriteService.simulatePlcRequest();
            } else {
                success = plcTestWriteService.simulatePlcRequest();
            }
            result.put("success", success);
            result.put("message", success ? "PLC请求字发送成功" : "发送失败");
            // è¿”回当前状态
            PlcBaseData status = plcTestWriteService.readPlcStatus();
            result.put("currentStatus", status);
        } catch (Exception e) {
            log.error("模拟PLC请求异常", e);
            result.put("success", false);
            result.put("message", "操作失败: " + e.getMessage());
        }
        return result;
    }
    /**
     * æ¨¡æ‹ŸPLC任务完成汇报
     */
    @PostMapping("/report")
    public Map<String, Object> simulateReport(@RequestBody(required = false) Map<String, Object> params) {
        Map<String, Object> result = new HashMap<>();
        try {
            boolean success;
            if (params != null && params.containsKey("dbBlock")) {
                String dbBlock = (String) params.get("dbBlock");
                int beginIndex = (int) params.getOrDefault("beginIndex", 0);
                // ä½¿ç”¨é»˜è®¤é¡¹ç›®ï¼Œä½†è®°å½•警告
                log.warn("使用旧API参数dbBlock={}, beginIndex={},建议使用新API基于项目ID的方式", dbBlock, beginIndex);
                success = plcTestWriteService.simulatePlcReport();
            } else {
                success = plcTestWriteService.simulatePlcReport();
            }
            result.put("success", success);
            result.put("message", success ? "PLC任务汇报成功" : "汇报失败");
            PlcBaseData status = plcTestWriteService.readPlcStatus();
            result.put("currentStatus", status);
        } catch (Exception e) {
            log.error("模拟上片PLC汇报异常", e);
            result.put("success", false);
            result.put("message", "操作失败: " + e.getMessage());
        }
        return result;
    }
    /**
     * æ¨¡æ‹ŸPLC联机状态
     */
    @PostMapping("/online")
    public Map<String, Object> simulateOnline(@RequestBody Map<String, Object> params) {
        Map<String, Object> result = new HashMap<>();
        try {
            int onlineState = (int) params.getOrDefault("onlineState", 1);
            boolean success;
            if (params.containsKey("dbBlock")) {
                String dbBlock = (String) params.get("dbBlock");
                int beginIndex = (int) params.getOrDefault("beginIndex", 0);
                // ä½¿ç”¨é»˜è®¤é¡¹ç›®ï¼Œä½†è®°å½•警告
                log.warn("使用旧API参数dbBlock={}, beginIndex={},建议使用新API基于项目ID的方式", dbBlock, beginIndex);
                success = plcTestWriteService.simulateOnlineStatus(onlineState);
            } else {
                success = plcTestWriteService.simulateOnlineStatus(onlineState);
            }
            result.put("success", success);
            result.put("message", success ? "PLC联机状态设置成功: " + onlineState : "设置失败");
            PlcBaseData status = plcTestWriteService.readPlcStatus();
            result.put("currentStatus", status);
        } catch (Exception e) {
            log.error("模拟PLC联机状态异常", e);
            result.put("success", false);
            result.put("message", "操作失败: " + e.getMessage());
        }
        return result;
    }
    /**
     * é‡ç½®PLC状态
     */
    @PostMapping("/reset")
    public Map<String, Object> resetPlc(@RequestBody(required = false) Map<String, Object> params) {
        Map<String, Object> result = new HashMap<>();
        try {
            boolean success;
            if (params != null && params.containsKey("dbBlock")) {
                String dbBlock = (String) params.get("dbBlock");
                int beginIndex = (int) params.getOrDefault("beginIndex", 0);
                // ä½¿ç”¨é»˜è®¤é¡¹ç›®ï¼Œä½†è®°å½•警告
                log.warn("使用旧API参数dbBlock={}, beginIndex={},建议使用新API基于项目ID的方式", dbBlock, beginIndex);
                success = plcTestWriteService.resetPlc();
            } else {
                success = plcTestWriteService.resetPlc();
            }
            result.put("success", success);
            result.put("message", success ? "PLC状态重置成功" : "重置失败");
            PlcBaseData status = plcTestWriteService.readPlcStatus();
            result.put("currentStatus", status);
        } catch (Exception e) {
            log.error("重置上片PLC状态异常", e);
            result.put("success", false);
            result.put("message", "操作失败: " + e.getMessage());
        }
        return result;
    }
    /**
     * è¯»å–PLC当前状态
     */
    @GetMapping("/status")
    public Map<String, Object> getPlcStatus(@RequestParam(required = false) String dbBlock,
                                           @RequestParam(required = false, defaultValue = "0") Integer beginIndex) {
        Map<String, Object> result = new HashMap<>();
        try {
            PlcBaseData status;
            if (dbBlock != null) {
                // ä½¿ç”¨é»˜è®¤é¡¹ç›®ï¼Œä½†è®°å½•警告
                log.warn("使用旧API参数dbBlock={}, beginIndex={},建议使用新API基于项目ID的方式", dbBlock, beginIndex);
                status = plcTestWriteService.readPlcStatus();
            } else {
                status = plcTestWriteService.readPlcStatus();
            }
            result.put("success", true);
            result.put("data", status);
            result.put("message", "获取上片PLC状态成功");
        } catch (Exception e) {
            log.error("读取上片PLC状态异常", e);
            result.put("success", false);
            result.put("message", "获取状态失败: " + e.getMessage());
        }
        return result;
    }
    /**
     * æ‰¹é‡æµ‹è¯• - æ¨¡æ‹Ÿå®Œæ•´ä»»åŠ¡æµç¨‹
     */
    @PostMapping("/batch/test")
    public Map<String, Object> batchTest(@RequestBody Map<String, Object> params) {
        Map<String, Object> result = new HashMap<>();
        try {
            String protocolType = (String) params.get("protocolType");
            int taskCount = (int) params.getOrDefault("taskCount", 1);
            log.info("开始批量测试,协议类型: {}, ä»»åŠ¡æ•°é‡: {}", protocolType, taskCount);
            // æ¨¡æ‹Ÿå®Œæ•´çš„任务流程
            for (int i = 1; i <= taskCount; i++) {
                log.info("执行第{}个任务", i);
                if ("load".equals(protocolType)) {
                    // æµç¨‹
                    plcTestWriteService.simulatePlcRequest(); // å‘送请求
                    // ç­‰å¾…MES响应
                    Thread.sleep(1000);
                    plcTestWriteService.simulatePlcReport();  // ä»»åŠ¡å®Œæˆ
                } else if ("raw".equals(protocolType)) {
                    // æµç¨‹
                    plcTestWriteService.simulatePlcRequest(); // å‘送请求
                    // ç­‰å¾…MES响应
                    Thread.sleep(1000);
                    plcTestWriteService.simulatePlcReport();  // ä»»åŠ¡å®Œæˆ
                }
                // ä»»åŠ¡é—´éš”
                if (i < taskCount) {
                    Thread.sleep(2000);
                }
            }
            result.put("success", true);
            result.put("message", "批量测试完成,共执行" + taskCount + "个任务");
        } catch (Exception e) {
            log.error("批量测试异常", e);
            result.put("success", false);
            result.put("message", "批量测试失败: " + e.getMessage());
        }
        return result;
    }
    /**
     * è®¾ç½®DB块地址(已废弃,仅保留兼容性)
     */
    @PostMapping("/dbBlock")
    public Map<String, Object> setDbBlock(@RequestBody Map<String, Object> params) {
        Map<String, Object> result = new HashMap<>();
        try {
            String dbBlock = (String) params.get("dbBlock");
            log.warn("设置DB块地址功能已废弃,请使用新API基于项目ID的方式管理PLC配置");
            result.put("success", false);
            result.put("message", "设置DB块地址功能已废弃,请使用新API基于项目ID的方式管理PLC配置");
        } catch (Exception e) {
            log.error("设置DB块地址异常", e);
            result.put("success", false);
            result.put("message", "设置DB块地址失败: " + e.getMessage());
        }
        return result;
    }
    /**
     * èŽ·å–å½“å‰DB块地址(已废弃,仅保留兼容性)
     */
    @GetMapping("/dbBlock")
    public Map<String, Object> getDbBlock() {
        Map<String, Object> result = new HashMap<>();
        try {
            log.warn("获取DB块地址功能已废弃,请使用新API基于项目ID的方式管理PLC配置");
            result.put("success", false);
            result.put("message", "获取DB块地址功能已废弃,请使用新API基于项目ID的方式管理PLC配置");
        } catch (Exception e) {
            log.error("获取DB块地址异常", e);
            result.put("success", false);
            result.put("message", "获取DB块地址失败: " + e.getMessage());
        }
        return result;
    }
    /**
     * å¯ç”¨è‡ªåŠ¨æµ‹è¯•æ¨¡å¼
     */
    @PostMapping("/auto/enable")
    public Map<String, Object> enableAutoTest() {
        Map<String, Object> result = new HashMap<>();
        try {
            plcAutoTestService.enableAutoTest();
            result.put("success", true);
            result.put("message", "自动测试模式已启用");
        } catch (Exception e) {
            log.error("启用自动测试模式异常", e);
            result.put("success", false);
            result.put("message", "启用自动测试模式失败: " + e.getMessage());
        }
        return result;
    }
    /**
     * ç¦ç”¨è‡ªåŠ¨æµ‹è¯•æ¨¡å¼
     */
    @PostMapping("/auto/disable")
    public Map<String, Object> disableAutoTest() {
        Map<String, Object> result = new HashMap<>();
        try {
            plcAutoTestService.disableAutoTest();
            result.put("success", true);
            result.put("message", "自动测试模式已禁用");
        } catch (Exception e) {
            log.error("禁用自动测试模式异常", e);
            result.put("success", false);
            result.put("message", "禁用自动测试模式失败: " + e.getMessage());
        }
        return result;
    }
    /**
     * èŽ·å–è‡ªåŠ¨æµ‹è¯•æ¨¡å¼çŠ¶æ€
     */
    @GetMapping("/auto/status")
    public Map<String, Object> getAutoTestStatus() {
        Map<String, Object> result = new HashMap<>();
        try {
            boolean isEnabled = plcAutoTestService.isAutoTestEnabled();
            result.put("success", true);
            result.put("data", isEnabled);
            result.put("message", "获取自动测试模式状态成功");
        } catch (Exception e) {
            log.error("获取自动测试模式状态异常", e);
            result.put("success", false);
            result.put("message", "获取自动测试模式状态失败: " + e.getMessage());
        }
        return result;
    }
}
mes-processes/mes-plcSend/src/main/java/com/mes/entity/PlcAddress.java
@@ -11,12 +11,12 @@
/**
 * PLC地址映射配置表
 * 
 * @author zhoush
 * @author huang
 * @date 2025/10/30
 */
@Data
@TableName("plc_address_mapping")
public class PlcAddressMapping implements Serializable {
public class PlcAddress implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
mes-processes/mes-plcSend/src/main/java/com/mes/entity/PlcBaseData.java
@@ -3,14 +3,12 @@
import com.github.xingshuangs.iot.common.enums.EDataType;
import com.github.xingshuangs.iot.protocol.s7.serializer.S7Variable;
import lombok.Data;
import org.springframework.stereotype.Component;
/**
 * @author huang
 * @since 2025/10/30
 */
@Data
@Component
public class PlcBaseData {
    /**
     * plc
mes-processes/mes-plcSend/src/main/java/com/mes/job/config/S7PlcSendConfig.java
File was deleted
mes-processes/mes-plcSend/src/main/java/com/mes/mapper/PlcAddressMapper.java
@@ -1,16 +1,16 @@
package com.mes.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.mes.entity.PlcAddressMapping;
import com.mes.entity.PlcAddress;
import org.apache.ibatis.annotations.Mapper;
/**
 * PLC地址映射配置Mapper
 * 
 * @author zhoush
 * @author huang
 * @date 2025/10/30
 */
@Mapper
public interface PlcAddressMappingMapper extends BaseMapper<PlcAddressMapping> {
public interface PlcAddressMapper extends BaseMapper<PlcAddress> {
    
}
mes-processes/mes-plcSend/src/main/java/com/mes/service/PlcAddressService.java
@@ -1,411 +1,100 @@
package com.mes.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.xingshuangs.iot.protocol.s7.enums.EPlcType;
import com.github.xingshuangs.iot.protocol.s7.service.S7PLC;
import com.mes.config.PlcAddressMappingConfig;
import com.mes.entity.PlcAddressMapping;
import com.mes.mapper.PlcAddressMappingMapper;
import com.mes.s7.enhanced.EnhancedS7Serializer;
import lombok.extern.slf4j.Slf4j;
import org.apache.catalina.core.ApplicationContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.mes.entity.PlcAddress;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * PLC地址映射服务
 * ç®¡ç†PLC地址映射配置,支持从数据库和配置文件加载
 *
 * @author zhoush
 * @date 2025/10/29
 * PLC地址映射服务接口
 * å®šä¹‰PLC地址映射配置管理的核心方法
 *
 * @author huang
 * @date 2025/10/30
 */
@Slf4j
@Service
public class PlcAddressMappingService {
    @Autowired
    private PlcAddressMappingMapper plcAddressMappingMapper;
    @Autowired
    private PlcAddressMappingConfig plcAddressMappingConfig;
    // JSON解析器
    private final ObjectMapper objectMapper = new ObjectMapper();
public interface PlcAddressService {
    /**
     * èŽ·å–åŒ…å«åœ°å€æ˜ å°„çš„é¡¹ç›®é…ç½®
     * åˆå¹¶æ•°æ®åº“和配置文件中的映射信息
     * èŽ·å–åŒ…å«åœ°å€æ˜ å°„çš„é¡¹ç›®é…ç½®ï¼ˆåˆå¹¶æ•°æ®åº“ä¸Žé…ç½®æ–‡ä»¶ï¼‰
     * @param projectId é¡¹ç›®ID
     * @return åˆå¹¶åŽçš„项目配置
     */
    public PlcAddressMappingConfig.ProjectPlcConfig getProjectConfigWithMapping(String projectId) {
        try {
            // 1. èŽ·å–æ•°æ®åº“ä¸­çš„é…ç½®
            PlcAddressMapping mapping = getMappingByProjectId(projectId);
            PlcAddressMappingConfig.ProjectPlcConfig projectConfig = null;
            if (mapping != null) {
                // ä»Žæ•°æ®åº“实体转换为项目配置对象
                projectConfig = convertToProjectConfig(mapping);
            } else {
                // æ•°æ®åº“中没有配置,尝试从配置文件获取
                if (fileConfig != null && fileConfig.getProjects().containsKey(projectId)) {
                    projectConfig = fileConfig.getProjects().get(projectId);
                } else {
                    // åˆ›å»ºé»˜è®¤é…ç½®
                    projectConfig = new PlcAddressMappingConfig.ProjectPlcConfig();
                    projectConfig.setDbArea(fileConfig != null ? fileConfig.getDefaultDbArea() : "DB1");
                    projectConfig.setBeginIndex(fileConfig != null ? fileConfig.getDefaultBeginIndex() : 0);
                    projectConfig.setAddressMapping(new HashMap<>());
                }
            }
            // 2. å¦‚果配置文件中有额外的映射信息,进行合并
            if (fileConfig != null && fileConfig.getProjects() != null && fileConfig.getProjects().containsKey(projectId)) {
                PlcAddressMappingConfig.ProjectPlcConfig fileProjectConfig = fileConfig.getProjects().get(projectId);
                // åˆå¹¶åœ°å€æ˜ å°„
                if (fileProjectConfig.getAddressMapping() != null) {
                    if (projectConfig.getAddressMapping() == null) {
                        projectConfig.setAddressMapping(new HashMap<>());
                    }
                    // æ–‡ä»¶é…ç½®ä½œä¸ºåŸºç¡€ï¼Œæ•°æ®åº“配置作为覆盖(优先级更高)
                    Map<String, Integer> mergedMapping = new HashMap<>(fileProjectConfig.getAddressMapping());
                    if (projectConfig.getAddressMapping() != null) {
                        mergedMapping.putAll(projectConfig.getAddressMapping());
                    }
                    projectConfig.setAddressMapping(mergedMapping);
                }
                // å¦‚果项目配置中缺少某些属性,从文件配置中补充
                if (projectConfig.getDbArea() == null || projectConfig.getDbArea().trim().isEmpty()) {
                    projectConfig.setDbArea(fileProjectConfig.getDbArea());
                }
                if (projectConfig.getPlcIp() == null || projectConfig.getPlcIp().trim().isEmpty()) {
                    projectConfig.setPlcIp(fileProjectConfig.getPlcIp());
                }
                if (projectConfig.getPlcType() == null || projectConfig.getPlcType().trim().isEmpty()) {
                    projectConfig.setPlcType(fileProjectConfig.getPlcType());
                }
            }
            return projectConfig;
        } catch (Exception e) {
            log.error("获取项目配置失败,项目ID: {}", projectId, e);
            // è¿”回默认配置
            PlcAddressMappingConfig.ProjectPlcConfig defaultConfig = new PlcAddressMappingConfig.ProjectPlcConfig();
            defaultConfig.setDbArea(fileConfig != null ? fileConfig.getDefaultDbArea() : "DB1");
            defaultConfig.setBeginIndex(fileConfig != null ? fileConfig.getDefaultBeginIndex() : 0);
            defaultConfig.setAddressMapping(new HashMap<>());
            return defaultConfig;
        }
    }
    PlcAddress getProjectConfigWithMapping(String projectId);
    /**
     * ä»Žæ•°æ®åº“获取项目配置
     * @param projectId é¡¹ç›®ID
     * @return é¡¹ç›®é…ç½®ï¼ˆPlcAddress实体),不存在则返回null
     */
    public PlcAddressMappingConfig.ProjectPlcConfig getProjectConfig(String projectId) {
        try {
            // ä¼˜å…ˆä»Žæ•°æ®åº“获取配置
            PlcAddressMapping mapping = plcAddressMappingMapper.selectOne(
                    new LambdaQueryWrapper<PlcAddressMapping>()
                            .eq(PlcAddressMapping::getProjectId, projectId)
            );
            if (mapping != null) {
                return convertToProjectConfig(mapping);
            }
            // å¦‚果数据库中没有,则从配置文件获取
            if (fileConfig != null && fileConfig.getProjects() != null && fileConfig.getProjects().containsKey(projectId)) {
                return fileConfig.getProjects().get(projectId);
            }
            // å¦‚果都没有,返回null
            return null;
        } catch (Exception e) {
            log.error("获取项目配置失败,项目ID: {}", projectId, e);
            return null;
        }
    }
    PlcAddress getProjectConfig(String projectId);
    /**
     * èŽ·å–æ‰€æœ‰æ˜ å°„é…ç½®
     * åˆå¹¶æ•°æ®åº“和配置文件中的映射信息
     * èŽ·å–æ‰€æœ‰æ˜ å°„é…ç½®ï¼ˆåˆå¹¶åŽçš„addressMapping会写回实体的JSON字段)
     * @return æ‰€æœ‰æ˜ å°„配置列表
     */
    public List<PlcAddressMapping> getAllMappings() {
        try {
            List<PlcAddressMapping> mappings = plcAddressMappingMapper.selectList(null);
            // å¤„理每个映射配置
            for (PlcAddressMapping mapping : mappings) {
                // èŽ·å–é¡¹ç›®æ ‡è¯†
                String projectId = mapping.getProjectId();
                // èŽ·å–åˆå¹¶åŽçš„é¡¹ç›®é…ç½®ï¼ˆåŒ…å«æ•°æ®åº“å’Œé…ç½®æ–‡ä»¶çš„æ˜ å°„ä¿¡æ¯ï¼‰
                PlcAddressMappingConfig.ProjectPlcConfig projectConfig = getProjectConfigWithMapping(projectId);
                // å°†åˆå¹¶åŽçš„æ˜ å°„信息转换为JSON字符串
                if (projectConfig.getAddressMapping() != null && !projectConfig.getAddressMapping().isEmpty()) {
                    try {
                        String mergedMappingJson = objectMapper.writeValueAsString(projectConfig.getAddressMapping());
                        mapping.setAddressMapping(mergedMappingJson);
                        // addressMapping属性已经映射到数据库的address_mapping_json字段
                    } catch (Exception e) {
                        log.warn("转换合并后的映射信息失败,项目ID: {}", projectId, e);
                        // ä¿æŒåŽŸæœ‰çš„addressMapping值
                    }
                }
            }
            return mappings;
        } catch (Exception e) {
            log.error("获取所有PLC地址映射配置失败", e);
            throw new RuntimeException("获取所有PLC地址映射配置失败", e);
        }
    }
    List<PlcAddress> getAllMappings();
    /**
     * åˆ†é¡µèŽ·å–PLC地址映射配置
     * @param page é¡µç 
     * @param size æ¯é¡µå¤§å°
     * @param projectId é¡¹ç›®ID(可选)
     * @param plcIp PLC IP(可选)
     * @return åˆ†é¡µç»“æžœ
     */
    public IPage<PlcAddressMapping> getMappingsByPage(int page, int size, String projectId, String plcIp) {
        try {
            Page<PlcAddressMapping> pageParam = new Page<>(page, size);
            LambdaQueryWrapper<PlcAddressMapping> queryWrapper = new LambdaQueryWrapper<>();
            if (projectId != null && !projectId.trim().isEmpty()) {
                queryWrapper.like(PlcAddressMapping::getProjectId, projectId);
            }
            if (plcIp != null && !plcIp.trim().isEmpty()) {
                queryWrapper.like(PlcAddressMapping::getPlcIp, plcIp);
            }
            return plcAddressMappingMapper.selectPage(pageParam, queryWrapper);
        } catch (Exception e) {
            log.error("分页获取PLC地址映射配置失败", e);
            throw new RuntimeException("分页获取PLC地址映射配置失败", e);
        }
    }
    IPage<PlcAddress> getMappingsByPage(int page, int size, String projectId, String plcIp);
    /**
     * æ ¹æ®ID获取PLC地址映射配置
     * @param id é…ç½®ID
     * @return PLC地址映射配置
     */
    public PlcAddressMapping getMappingById(Long id) {
        try {
            return plcAddressMappingMapper.selectById(id);
        } catch (Exception e) {
            log.error("根据ID获取PLC地址映射配置失败,ID: {}", id, e);
            throw new RuntimeException("根据ID获取PLC地址映射配置失败", e);
        }
    }
    PlcAddress getMappingById(Long id);
    /**
     * æ ¹æ®é¡¹ç›®æ ‡è¯†èŽ·å–PLC地址映射配置
     * æ ¹æ®é¡¹ç›®ID获取PLC地址映射配置
     * @param projectId é¡¹ç›®ID
     * @return PLC地址映射配置
     */
    public PlcAddressMapping getMappingByProjectId(String projectId) {
        try {
            return plcAddressMappingMapper.selectOne(
                    new LambdaQueryWrapper<PlcAddressMapping>()
                            .eq(PlcAddressMapping::getProjectId, projectId)
            );
        } catch (Exception e) {
            log.error("根据项目标识获取PLC地址映射配置失败,项目ID: {}", projectId, e);
            throw new RuntimeException("根据项目标识获取PLC地址映射配置失败", e);
        }
    }
    PlcAddress getMappingByProjectId(String projectId);
    /**
     * ä¿å­˜PLC地址映射配置
     * åˆ›å»ºPLC地址映射配置
     * @param mapping æ˜ å°„配置
     * @return åˆ›å»ºåŽçš„配置
     */
    public PlcAddressMapping saveMapping(PlcAddressMapping mapping) {
        try {
            // æ£€æŸ¥é¡¹ç›®ID是否已存在
            PlcAddressMapping existing = plcAddressMappingMapper.selectOne(
                    new LambdaQueryWrapper<PlcAddressMapping>()
                            .eq(PlcAddressMapping::getProjectId, mapping.getProjectId())
            );
            if (existing != null) {
                throw new RuntimeException("项目标识 " + mapping.getProjectId() + " å·²å­˜åœ¨");
            }
            plcAddressMappingMapper.insert(mapping);
            return mapping;
        } catch (Exception e) {
            log.error("保存PLC地址映射配置失败", e);
            throw new RuntimeException("保存PLC地址映射配置失败", e);
        }
    }
    PlcAddress saveMapping(PlcAddress mapping);
    /**
     * æ›´æ–°PLC地址映射配置
     * @param mapping æ˜ å°„配置
     * @return æ›´æ–°åŽçš„配置,未找到返回null
     */
    public PlcAddressMapping updateMapping(PlcAddressMapping mapping) {
        try {
            // æ£€æŸ¥ID是否存在
            PlcAddressMapping existing = plcAddressMappingMapper.selectById(mapping.getId());
            if (existing == null) {
                return null;
            }
            // å¦‚果项目ID有变化,检查新项目ID是否已存在
            if (!existing.getProjectId().equals(mapping.getProjectId())) {
                PlcAddressMapping duplicate = plcAddressMappingMapper.selectOne(
                        new LambdaQueryWrapper<PlcAddressMapping>()
                                .eq(PlcAddressMapping::getProjectId, mapping.getProjectId())
                );
                if (duplicate != null) {
                    throw new RuntimeException("项目标识 " + mapping.getProjectId() + " å·²å­˜åœ¨");
                }
            }
            plcAddressMappingMapper.updateById(mapping);
            return mapping;
        } catch (Exception e) {
            log.error("更新PLC地址映射配置失败", e);
            throw new RuntimeException("更新PLC地址映射配置失败", e);
        }
    }
    PlcAddress updateMapping(PlcAddress mapping);
    /**
     * åˆ é™¤PLC地址映射配置
     * @param id é…ç½®ID
     * @return æ˜¯å¦æˆåŠŸ
     */
    public boolean deleteMapping(Long id) {
        try {
            int result = plcAddressMappingMapper.deleteById(id);
            return result > 0;
        } catch (Exception e) {
            log.error("删除PLC地址映射配置失败,ID: {}", id, e);
            throw new RuntimeException("删除PLC地址映射配置失败", e);
        }
    }
    boolean deleteMapping(Long id);
    /**
     * æ‰¹é‡åˆ é™¤PLC地址映射配置
     * @param ids é…ç½®ID列表
     * @return åˆ é™¤æ•°é‡
     */
    public int deleteMappings(List<Long> ids) {
        try {
            if (ids == null || ids.isEmpty()) {
                return 0;
            }
            return plcAddressMappingMapper.deleteBatchIds(ids);
        } catch (Exception e) {
            log.error("批量删除PLC地址映射配置失败,ID列表: {}", ids, e);
            throw new RuntimeException("批量删除PLC地址映射配置失败", e);
        }
    }
    int deleteMappings(List<Long> ids);
    /**
     * æµ‹è¯•PLC连接
     * @param mapping æ˜ å°„配置
     * @return æ˜¯å¦æˆåŠŸ
     */
    public boolean testConnection(PlcAddressMapping mapping) {
        try {
            // è§£æžPLC类型
            EPlcType plcType = EPlcType.S1200; // é»˜è®¤å€¼
            if (mapping.getPlcType() != null && !mapping.getPlcType().trim().isEmpty()) {
                try {
                    plcType = EPlcType.valueOf(mapping.getPlcType());
                } catch (IllegalArgumentException e) {
                    log.warn("未知的PLC类型: {}, ä½¿ç”¨é»˜è®¤ç±»åž‹ S1200", mapping.getPlcType());
                }
            }
            // åˆ›å»ºS7PLC实例
            String plcIp = mapping.getPlcIp() != null ? mapping.getPlcIp() : "192.168.10.21";
            S7PLC s7Plc = new S7PLC(plcType, plcIp);
            // åˆ›å»ºEnhancedS7Serializer实例
            EnhancedS7Serializer serializer = EnhancedS7Serializer.newInstance(s7Plc);
            // å°è¯•读取一个简单的数据来测试连接
            String dbArea = mapping.getDbArea() != null ? mapping.getDbArea() : "DB1";
            int beginIndex = mapping.getBeginIndex();
            // è¿™é‡Œæˆ‘们只测试连接,不读取实际数据
            // å®žé™…项目中可能需要根据具体需求调整
            return true;
        } catch (Exception e) {
            log.error("PLC连接测试失败", e);
            return false;
        }
    }
    boolean testConnection(PlcAddress mapping);
    /**
     * é‡æ–°åŠ è½½é…ç½®æ–‡ä»¶ä¸­çš„æ˜ å°„
     * é‡æ–°åŠ è½½é…ç½®æ–‡ä»¶ä¸­çš„æ˜ å°„é…ç½®
     */
    public void reloadConfigMappings() {
        try {
            // å…³é”®ä¿®æ”¹3:通过Spring上下文刷新配置(适用于Spring Boot 2.x)
            ApplicationContext applicationContext = SpringContextHolder.getApplicationContext();
            if (applicationContext != null) {
                // èŽ·å–é…ç½®ç»‘å®šçš„BeanDefinition
                ConfigurableApplicationContext configurableContext = (ConfigurableApplicationContext) applicationContext;
                ConfigurableEnvironment environment = configurableContext.getEnvironment();
                // åˆ·æ–°é…ç½®æºï¼ˆé‡æ–°è¯»å–配置文件)
                for (PropertySource<?> source : environment.getPropertySources()) {
                    if (source instanceof ResourcePropertySource) {
                        ResourcePropertySource resourceSource = (ResourcePropertySource) source;
                        // é‡æ–°åŠ è½½é…ç½®æ–‡ä»¶èµ„æº
                        resourceSource.refresh();
                    }
                }
                // é‡æ–°ç»‘定配置到PlcAddressMappingConfig
                Binder.get(environment)
                        .bind("plc.address.mapping", PlcAddressMappingConfig.class)
                        .ifBound(config -> {
                            // æ›´æ–°æ³¨å…¥çš„配置实例(因@ConfigurationProperties默认是单例,需手动更新属性)
                            this.plcAddressMappingConfig.setDefaultDbArea(config.getDefaultDbArea());
                            this.plcAddressMappingConfig.setDefaultBeginIndex(config.getDefaultBeginIndex());
                            this.plcAddressMappingConfig.setProjects(config.getProjects());
                        });
                log.info("成功重新加载配置文件中的PLC地址映射");
            }
        } catch (Exception e) {
            log.error("重新加载配置文件中的PLC地址映射失败", e);
        }
    }
    /**
     * å°†æ•°æ®åº“实体转换为项目配置对象
     */
    private PlcAddressMappingConfig.ProjectPlcConfig convertToProjectConfig(PlcAddressMapping mapping) {
        PlcAddressMappingConfig.ProjectPlcConfig config = new PlcAddressMappingConfig.ProjectPlcConfig();
        config.setDbArea(mapping.getDbArea());
        config.setBeginIndex(mapping.getBeginIndex());
        config.setPlcIp(mapping.getPlcIp());
        config.setPlcType(mapping.getPlcType());
        // è§£æžåœ°å€æ˜ å°„JSON
        if (mapping.getAddressMapping() != null && !mapping.getAddressMapping().trim().isEmpty()) {
            try {
                // ä½¿ç”¨Jackson解析JSON字符串为Map<String, Integer>
                Map<String, Integer> addressMap = objectMapper.readValue(
                    mapping.getAddressMapping(),
                    new TypeReference<Map<String, Integer>>() {}
                );
                config.setAddressMapping(addressMap);
            } catch (Exception e) {
                log.warn("解析地址映射JSON失败: {}", mapping.getAddressMapping(), e);
                // å¦‚果解析失败,创建一个空的映射
                config.setAddressMapping(new HashMap<>());
            }
        } else {
            // å¦‚果没有地址映射,创建一个空的映射
            config.setAddressMapping(new HashMap<>());
        }
        return config;
    }
    void reloadConfigMappings();
}
mes-processes/mes-plcSend/src/main/java/com/mes/service/PlcAutoTestService.java
@@ -1,6 +1,5 @@
package com.mes.service;
import com.mes.s7.enhanced.EnhancedS7Serializer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
@@ -12,15 +11,12 @@
 * PLC自动测试服务
 * å®šæ—¶æ¨¡æ‹ŸPLC行为,向PLC写入测试数据,用于自动测试MES程序
 *
 * @author zhoush
 * @author huang
 * @date 2025/10/30
 */
@Slf4j
@Service
public class PlcAutoTestService {
    @Resource
    private EnhancedS7Serializer s7Serializer;
    @Resource
    private PlcTestWriteService plcTestWriteService;
@@ -32,9 +28,6 @@
    // è‡ªåŠ¨æµ‹è¯•é—´éš”ï¼ˆæ¯«ç§’ï¼‰
    @Value("${plc.auto.test.interval:5000}")
    private long autoTestInterval;
    private static final int ON = 1;
    private static final int OFF = 0;
    /**
     * å®šæ—¶è‡ªåŠ¨æµ‹è¯•ä»»åŠ¡
mes-processes/mes-plcSend/src/main/java/com/mes/service/PlcTestWriteService.java
@@ -2,8 +2,8 @@
import com.github.xingshuangs.iot.protocol.s7.enums.EPlcType;
import com.github.xingshuangs.iot.protocol.s7.service.S7PLC;
import com.mes.config.PlcAddressMappingConfig;
import com.mes.entity.PlcBaseData;
import com.mes.entity.PlcAddress;
import com.mes.s7.enhanced.EnhancedS7Serializer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -16,7 +16,7 @@
 * PLC测试写入服务
 * æ¨¡æ‹ŸPLC行为,向PLC写入测试数据,用于测试MES程序
 * 
 * @author zhoush
 * @author huang
 * @date 2025/10/29
 */
@Slf4j
@@ -24,13 +24,13 @@
public class PlcTestWriteService {
    @Resource
    private PlcAddressMappingService plcAddressMappingService;
    private PlcAddressService plcAddressService;
    private static final int ON = 1;
    private static final int OFF = 0;
    
    // å½“前使用的项目标识
    private String currentProjectId = "shuttle";
    private String currentProjectId = "vertical";
    
    // ç¼“存不同项目的S7Serializer实例
    private final ConcurrentMap<String, EnhancedS7Serializer> serializerCache = new ConcurrentHashMap<>();
@@ -47,8 +47,8 @@
     */
    public boolean simulatePlcRequest(String projectId) {
        try {
            // èŽ·å–é¡¹ç›®é…ç½®
            PlcAddressMappingConfig.ProjectPlcConfig config = plcAddressMappingService.getProjectConfig(projectId);
            // èŽ·å–é¡¹ç›®é…ç½®ï¼ˆæ•°æ®åº“å®žä½“ï¼‰
            PlcAddress config = plcAddressService.getProjectConfigWithMapping(projectId);
            
            // èŽ·å–å¯¹åº”çš„S7Serializer
            EnhancedS7Serializer s7Serializer = getSerializerForProject(projectId, config);
@@ -88,8 +88,8 @@
     */
    public boolean simulatePlcReport(String projectId) {
        try {
            // èŽ·å–é¡¹ç›®é…ç½®
            PlcAddressMappingConfig.ProjectPlcConfig config = plcAddressMappingService.getProjectConfig(projectId);
            // èŽ·å–é¡¹ç›®é…ç½®ï¼ˆæ•°æ®åº“å®žä½“ï¼‰
            PlcAddress config = plcAddressService.getProjectConfigWithMapping(projectId);
            
            // èŽ·å–å¯¹åº”çš„S7Serializer
            EnhancedS7Serializer s7Serializer = getSerializerForProject(projectId, config);
@@ -127,8 +127,8 @@
     */
    public boolean simulateOnlineStatus(int onlineState, String projectId) {
        try {
            // èŽ·å–é¡¹ç›®é…ç½®
            PlcAddressMappingConfig.ProjectPlcConfig config = plcAddressMappingService.getProjectConfig(projectId);
            // èŽ·å–é¡¹ç›®é…ç½®ï¼ˆæ•°æ®åº“å®žä½“ï¼‰
            PlcAddress config = plcAddressService.getProjectConfigWithMapping(projectId);
            
            // èŽ·å–å¯¹åº”çš„S7Serializer
            EnhancedS7Serializer s7Serializer = getSerializerForProject(projectId, config);
@@ -161,8 +161,8 @@
     */
    public boolean resetPlc(String projectId) {
        try {
            // èŽ·å–é¡¹ç›®é…ç½®
            PlcAddressMappingConfig.ProjectPlcConfig config = plcAddressMappingService.getProjectConfig(projectId);
            // èŽ·å–é¡¹ç›®é…ç½®ï¼ˆæ•°æ®åº“å®žä½“ï¼‰
            PlcAddress config = plcAddressService.getProjectConfigWithMapping(projectId);
            
            // èŽ·å–å¯¹åº”çš„S7Serializer
            EnhancedS7Serializer s7Serializer = getSerializerForProject(projectId, config);
@@ -203,8 +203,8 @@
     */
    public PlcBaseData readPlcStatus(String projectId) {
        try {
            // èŽ·å–é¡¹ç›®é…ç½®
            PlcAddressMappingConfig.ProjectPlcConfig config = plcAddressMappingService.getProjectConfig(projectId);
            // èŽ·å–é¡¹ç›®é…ç½®ï¼ˆæ•°æ®åº“å®žä½“ï¼‰
            PlcAddress config = plcAddressService.getProjectConfigWithMapping(projectId);
            
            // èŽ·å–å¯¹åº”çš„S7Serializer
            EnhancedS7Serializer s7Serializer = getSerializerForProject(projectId, config);
@@ -238,11 +238,11 @@
     * @param config é¡¹ç›®é…ç½®
     * @return S7Serializer实例
     */
    private EnhancedS7Serializer getSerializerForProject(String projectId, PlcAddressMappingConfig.ProjectPlcConfig config) {
    private EnhancedS7Serializer getSerializerForProject(String projectId, PlcAddress config) {
        return serializerCache.computeIfAbsent(projectId, id -> {
            // è§£æžPLC类型
            EPlcType plcType = EPlcType.S1200; // é»˜è®¤å€¼
            if (config.getPlcType() != null) {
            if (config != null && config.getPlcType() != null) {
                try {
                    plcType = EPlcType.valueOf(config.getPlcType());
                } catch (IllegalArgumentException e) {
@@ -251,7 +251,7 @@
            }
            
            // åˆ›å»ºS7PLC实例
            String plcIp = config.getPlcIp() != null ? config.getPlcIp() : "192.168.10.21";
            String plcIp = (config != null && config.getPlcIp() != null) ? config.getPlcIp() : "192.168.10.21";
            S7PLC s7Plc = new S7PLC(plcType, plcIp);
            
            // åˆ›å»ºå¹¶è¿”回EnhancedS7Serializer实例
mes-processes/mes-plcSend/src/main/java/com/mes/service/impl/PlcAddressServiceImpl.java
New file
@@ -0,0 +1,270 @@
package com.mes.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.xingshuangs.iot.protocol.s7.enums.EPlcType;
import com.github.xingshuangs.iot.protocol.s7.service.S7PLC;
import com.mes.entity.PlcAddress;
import com.mes.mapper.PlcAddressMapper;
import com.mes.s7.enhanced.EnhancedS7Serializer;
import com.mes.service.PlcAddressService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * PLC地址映射服务实现类
 * ç®¡ç†PLC地址映射配置,支持从数据库和配置文件加载
 *
 * @author huang
 * @date 2025/10/30
 */
@Slf4j
@Service
public class PlcAddressServiceImpl implements PlcAddressService {
    @Autowired
    private PlcAddressMapper plcAddressMapper;
    // JSON解析器
    private final ObjectMapper objectMapper = new ObjectMapper();
    /**
     * èŽ·å–åŒ…å«åœ°å€æ˜ å°„çš„é¡¹ç›®é…ç½®
     * åˆå¹¶æ•°æ®åº“和配置文件中的映射信息
     */
    @Override
    public PlcAddress getProjectConfigWithMapping(String projectId) {
        try {
            // ä»…使用数据库中的项目配置
            return getMappingByProjectId(projectId);
        } catch (Exception e) {
            log.error("获取项目配置失败,项目ID: {}", projectId, e);
            return null;
        }
    }
    /**
     * ä»Žæ•°æ®åº“获取项目配置
     */
    @Override
    public PlcAddress getProjectConfig(String projectId) {
        try {
            return plcAddressMapper.selectOne(
                    new LambdaQueryWrapper<PlcAddress>()
                            .eq(PlcAddress::getProjectId, projectId)
            );
        } catch (Exception e) {
            log.error("获取项目配置失败,项目ID: {}", projectId, e);
            return null;
        }
    }
    /**
     * èŽ·å–æ‰€æœ‰æ˜ å°„é…ç½®
     * åˆå¹¶æ•°æ®åº“和配置文件中的映射信息
     */
    @Override
    public List<PlcAddress> getAllMappings() {
        try {
            // ç›´æŽ¥è¿”回数据库中的映射配置
            return plcAddressMapper.selectList(null);
        } catch (Exception e) {
            log.error("获取所有PLC地址映射配置失败", e);
            throw new RuntimeException("获取所有PLC地址映射配置失败", e);
        }
    }
    /**
     * åˆ†é¡µèŽ·å–PLC地址映射配置
     */
    @Override
    public IPage<PlcAddress> getMappingsByPage(int page, int size, String projectId, String plcIp) {
        try {
            Page<PlcAddress> pageParam = new Page<>(page, size);
            LambdaQueryWrapper<PlcAddress> queryWrapper = new LambdaQueryWrapper<>();
            if (projectId != null && !projectId.trim().isEmpty()) {
                queryWrapper.like(PlcAddress::getProjectId, projectId);
            }
            if (plcIp != null && !plcIp.trim().isEmpty()) {
                queryWrapper.like(PlcAddress::getPlcIp, plcIp);
            }
            return plcAddressMapper.selectPage(pageParam, queryWrapper);
        } catch (Exception e) {
            log.error("分页获取PLC地址映射配置失败", e);
            throw new RuntimeException("分页获取PLC地址映射配置失败", e);
        }
    }
    /**
     * æ ¹æ®ID获取PLC地址映射配置
     */
    @Override
    public PlcAddress getMappingById(Long id) {
        try {
            return plcAddressMapper.selectById(id);
        } catch (Exception e) {
            log.error("根据ID获取PLC地址映射配置失败,ID: {}", id, e);
            throw new RuntimeException("根据ID获取PLC地址映射配置失败", e);
        }
    }
    /**
     * æ ¹æ®é¡¹ç›®æ ‡è¯†èŽ·å–PLC地址映射配置
     */
    @Override
    public PlcAddress getMappingByProjectId(String projectId) {
        try {
            return plcAddressMapper.selectOne(
                    new LambdaQueryWrapper<PlcAddress>()
                            .eq(PlcAddress::getProjectId, projectId)
            );
        } catch (Exception e) {
            log.error("根据项目标识获取PLC地址映射配置失败,项目ID: {}", projectId, e);
            throw new RuntimeException("根据项目标识获取PLC地址映射配置失败", e);
        }
    }
    /**
     * ä¿å­˜PLC地址映射配置
     */
    @Override
    public PlcAddress saveMapping(PlcAddress mapping) {
        try {
            // æ£€æŸ¥é¡¹ç›®ID是否已存在
            PlcAddress existing = plcAddressMapper.selectOne(
                    new LambdaQueryWrapper<PlcAddress>()
                            .eq(PlcAddress::getProjectId, mapping.getProjectId())
            );
            if (existing != null) {
                throw new RuntimeException("项目标识 " + mapping.getProjectId() + " å·²å­˜åœ¨");
            }
            plcAddressMapper.insert(mapping);
            return mapping;
        } catch (Exception e) {
            log.error("保存PLC地址映射配置失败", e);
            throw new RuntimeException("保存PLC地址映射配置失败", e);
        }
    }
    /**
     * æ›´æ–°PLC地址映射配置
     */
    @Override
    public PlcAddress updateMapping(PlcAddress mapping) {
        try {
            // æ£€æŸ¥ID是否存在
            PlcAddress existing = plcAddressMapper.selectById(mapping.getId());
            if (existing == null) {
                return null;
            }
            // å¦‚果项目ID有变化,检查新项目ID是否已存在
            if (!existing.getProjectId().equals(mapping.getProjectId())) {
                PlcAddress duplicate = plcAddressMapper.selectOne(
                        new LambdaQueryWrapper<PlcAddress>()
                                .eq(PlcAddress::getProjectId, mapping.getProjectId())
                );
                if (duplicate != null) {
                    throw new RuntimeException("项目标识 " + mapping.getProjectId() + " å·²å­˜åœ¨");
                }
            }
            plcAddressMapper.updateById(mapping);
            return mapping;
        } catch (Exception e) {
            log.error("更新PLC地址映射配置失败", e);
            throw new RuntimeException("更新PLC地址映射配置失败", e);
        }
    }
    /**
     * åˆ é™¤PLC地址映射配置
     */
    @Override
    public boolean deleteMapping(Long id) {
        try {
            int result = plcAddressMapper.deleteById(id);
            return result > 0;
        } catch (Exception e) {
            log.error("删除PLC地址映射配置失败,ID: {}", id, e);
            throw new RuntimeException("删除PLC地址映射配置失败", e);
        }
    }
    /**
     * æ‰¹é‡åˆ é™¤PLC地址映射配置
     */
    @Override
    public int deleteMappings(List<Long> ids) {
        try {
            if (ids == null || ids.isEmpty()) {
                return 0;
            }
            return plcAddressMapper.deleteBatchIds(ids);
        } catch (Exception e) {
            log.error("批量删除PLC地址映射配置失败,ID列表: {}", ids, e);
            throw new RuntimeException("批量删除PLC地址映射配置失败", e);
        }
    }
    /**
     * æµ‹è¯•PLC连接
     */
    @Override
    public boolean testConnection(PlcAddress mapping) {
        try {
            // è§£æžPLC类型
            EPlcType plcType = EPlcType.S1200; // é»˜è®¤å€¼
            if (mapping.getPlcType() != null && !mapping.getPlcType().trim().isEmpty()) {
                try {
                    plcType = EPlcType.valueOf(mapping.getPlcType());
                } catch (IllegalArgumentException e) {
                    log.warn("未知的PLC类型: {}, ä½¿ç”¨é»˜è®¤ç±»åž‹ S1200", mapping.getPlcType());
                }
            }
            // åˆ›å»ºS7PLC实例
            String plcIp = mapping.getPlcIp() != null ? mapping.getPlcIp() : "192.168.10.21";
            S7PLC s7Plc = new S7PLC(plcType, plcIp);
            // åˆ›å»ºEnhancedS7Serializer实例
            EnhancedS7Serializer serializer = EnhancedS7Serializer.newInstance(s7Plc);
            // å°è¯•读取一个简单的数据来测试连接
            String dbArea = mapping.getDbArea() != null ? mapping.getDbArea() : "DB1";
            int beginIndex = mapping.getBeginIndex();
            // è¿™é‡Œæˆ‘们只测试连接,不读取实际数据
            // å®žé™…项目中可能需要根据具体需求调整
            return true;
        } catch (Exception e) {
            log.error("PLC连接测试失败", e);
            return false;
        }
    }
    /**
     * é‡æ–°åŠ è½½é…ç½®æ–‡ä»¶ä¸­çš„æ˜ å°„
     */
    @Override
    public void reloadConfigMappings() {
        // çŽ°ä»…ä½¿ç”¨æ•°æ®åº“ä¸­çš„é…ç½®ï¼Œä¸å†ä»Žæ–‡ä»¶é‡è½½
        log.info("当前使用数据库配置,reloadConfigMappings无需操作");
    }
    /**
     * å°†æ•°æ®åº“实体转换为项目配置对象
     */
}
mes-processes/mes-plcSend/src/main/java/com/mes/service/impl/PlcAutoTestServiceImpl.java
New file
@@ -0,0 +1,81 @@
package com.mes.service.impl;
import com.mes.service.IPlcAutoTestService;
import com.mes.service.IPlcTestWriteService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
 * PLC自动测试服务实现类
 * å®šæ—¶æ¨¡æ‹ŸPLC行为,向PLC写入测试数据,用于自动测试MES程序
 *
 * @author huang
 * @date 2025/10/30
 */
@Slf4j
@Service
public class PlcAutoTestServiceImpl implements PlcAutoTestService {
    @Resource
    private IPlcTestWriteService plcTestWriteService;
    // è‡ªåŠ¨æµ‹è¯•å¼€å…³
    @Value("${plc.auto.test.enabled:false}")
    private boolean autoTestEnabled;
    // è‡ªåŠ¨æµ‹è¯•é—´éš”ï¼ˆæ¯«ç§’ï¼‰
    @Value("${plc.auto.test.interval:5000}")
    private long autoTestInterval;
    /**
     * å®šæ—¶è‡ªåŠ¨æµ‹è¯•ä»»åŠ¡
     */
    @Scheduled(fixedDelayString = "${plc.auto.test.interval:5000}")
    public void autoTestTask() {
        if (!autoTestEnabled) {
            return;
        }
        try {
            log.info("开始执行PLC自动测试任务");
            // æ¨¡æ‹ŸPLC请求
            plcTestWriteService.simulatePlcRequest();
            Thread.sleep(1000);
            // æ¨¡æ‹ŸPLC汇报
            plcTestWriteService.simulatePlcReport();
            log.info("PLC自动测试任务执行完成");
        } catch (Exception e) {
            log.error("PLC自动测试任务执行异常", e);
        }
    }
    /**
     * å¯ç”¨è‡ªåŠ¨æµ‹è¯•
     */
    @Override
    public void enableAutoTest() {
        this.autoTestEnabled = true;
        log.info("PLC自动测试已启用");
    }
    /**
     * ç¦ç”¨è‡ªåŠ¨æµ‹è¯•
     */
    @Override
    public void disableAutoTest() {
        this.autoTestEnabled = false;
        log.info("PLC自动测试已禁用");
    }
    /**
     * èŽ·å–è‡ªåŠ¨æµ‹è¯•çŠ¶æ€
     */
    @Override
    public boolean isAutoTestEnabled() {
        return this.autoTestEnabled;
    }
}
mes-processes/mes-plcSend/src/main/java/com/mes/service/impl/PlcTestWriteServiceImpl.java
New file
@@ -0,0 +1,295 @@
package com.mes.service.impl;
import com.github.xingshuangs.iot.protocol.s7.enums.EPlcType;
import com.github.xingshuangs.iot.protocol.s7.service.S7PLC;
import com.mes.entity.PlcBaseData;
import com.mes.entity.PlcAddress;
import com.mes.s7.enhanced.EnhancedS7Serializer;
import com.mes.service.PlcAddressService;
import com.mes.service.IPlcTestWriteService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
/**
 * PLC测试写入服务实现类
 * æ¨¡æ‹ŸPLC行为,向PLC写入测试数据,用于测试MES程序
 *
 * @author huang
 * @date 2025/10/30
 */
@Slf4j
@Service
public class PlcTestWriteServiceImpl implements PlcTestWriteService {
    @Resource
    private PlcAddressService plcAddressService;
    private static final int ON = 1;
    private static final int OFF = 0;
    // å½“前使用的项目标识
    private String currentProjectId = "vertical";
    // ç¼“存不同项目的S7Serializer实例
    private final ConcurrentMap<String, EnhancedS7Serializer> serializerCache = new ConcurrentHashMap<>();
    /**
     * æ¨¡æ‹ŸPLC发送请求字(触发MES任务下发)
     */
    @Override
    public boolean simulatePlcRequest() {
        return simulatePlcRequest(currentProjectId);
    }
    /**
     * æ¨¡æ‹ŸPLC发送请求字(触发MES任务下发)- æ”¯æŒæŒ‡å®šé¡¹ç›®
     */
    @Override
    public boolean simulatePlcRequest(String projectId) {
        try {
            // èŽ·å–é¡¹ç›®é…ç½®ï¼ˆæ•°æ®åº“å®žä½“ï¼‰
            PlcAddress config = plcAddressService.getProjectConfigWithMapping(projectId);
            // èŽ·å–å¯¹åº”çš„S7Serializer
            EnhancedS7Serializer s7Serializer = getSerializerForProject(projectId, config);
            // è¯»å–当前PLC状态
            PlcBaseData currentData = s7Serializer.read(PlcBaseData.class, config.getDbArea(), config.getBeginIndex());
            if (currentData.getOnlineState() == OFF) {
                log.info("当前PLC联机模式为0,停止联机");
                return false;
            }else if (currentData.getPlcReport() == ON){
                log.info("当前上片PLC汇报字为1,重置为0");
                currentData.setPlcReport(OFF);
            }
            // è®¾ç½®PLC请求字为1(触发MES任务处理)
            currentData.setPlcRequest(ON);
            s7Serializer.write(currentData, config.getDbArea(), config.getBeginIndex());
            log.info("模拟PLC发送请求字成功:plcRequest=1, projectId={}, dbArea={}, beginIndex={}",
                    projectId, config.getDbArea(), config.getBeginIndex());
            return true;
        } catch (Exception e) {
            log.error("模拟PLC请求字失败", e);
            return false;
        }
    }
    /**
     * æ¨¡æ‹ŸPLC任务完成汇报
     */
    @Override
    public boolean simulatePlcReport() {
        return simulatePlcReport(currentProjectId);
    }
    /**
     * æ¨¡æ‹ŸPLC任务完成汇报 - æ”¯æŒæŒ‡å®šé¡¹ç›®
     */
    @Override
    public boolean simulatePlcReport(String projectId) {
        try {
            // èŽ·å–é¡¹ç›®é…ç½®ï¼ˆæ•°æ®åº“å®žä½“ï¼‰
            PlcAddress config = plcAddressService.getProjectConfigWithMapping(projectId);
            // èŽ·å–å¯¹åº”çš„S7Serializer
            EnhancedS7Serializer s7Serializer = getSerializerForProject(projectId, config);
            PlcBaseData currentData = s7Serializer.read(PlcBaseData.class, config.getDbArea(), config.getBeginIndex());
            // è®¾ç½®PLC汇报字为1(任务完成)
            currentData.setPlcReport(ON);
            // è¯·æ±‚字清0
            currentData.setPlcRequest(OFF);
            // è®¾ç½®å®Œæˆæ•°é‡ç­‰æ•°æ®
            currentData.setMesGlassCount(10);
            s7Serializer.write(currentData, config.getDbArea(), config.getBeginIndex());
            log.info("模拟PLC任务完成汇报:plcReport=1, mesGlassCount=10, projectId={}, dbArea={}, beginIndex={}",
                    projectId, config.getDbArea(), config.getBeginIndex());
            return true;
        } catch (Exception e) {
            log.error("模拟PLC任务完成汇报失败", e);
            return false;
        }
    }
    /**
     * æ¨¡æ‹ŸPLC发送联机状态
     */
    @Override
    public boolean simulateOnlineStatus(int onlineState) {
        return simulateOnlineStatus(onlineState, currentProjectId);
    }
    /**
     * æ¨¡æ‹ŸPLC发送联机状态 - æ”¯æŒæŒ‡å®šé¡¹ç›®
     */
    @Override
    public boolean simulateOnlineStatus(int onlineState, String projectId) {
        try {
            // èŽ·å–é¡¹ç›®é…ç½®ï¼ˆæ•°æ®åº“å®žä½“ï¼‰
            PlcAddress config = plcAddressService.getProjectConfigWithMapping(projectId);
            // èŽ·å–å¯¹åº”çš„S7Serializer
            EnhancedS7Serializer s7Serializer = getSerializerForProject(projectId, config);
            PlcBaseData currentData = s7Serializer.read(PlcBaseData.class, config.getDbArea(), config.getBeginIndex());
            // 1:联机 0:脱机
            currentData.setOnlineState(onlineState);
            s7Serializer.write(currentData, config.getDbArea(), config.getBeginIndex());
            log.info("模拟PLC联机状态:onlineState={}, projectId={}, dbArea={}, beginIndex={}",
                    onlineState, projectId, config.getDbArea(), config.getBeginIndex());
            return true;
        } catch (Exception e) {
            log.error("模拟PLC联机状态失败", e);
            return false;
        }
    }
    /**
     * é‡ç½®PLC所有状态
     */
    @Override
    public boolean resetPlc() {
        return resetPlc(currentProjectId);
    }
    /**
     * é‡ç½®PLC所有状态 - æ”¯æŒæŒ‡å®šé¡¹ç›®
     */
    @Override
    public boolean resetPlc(String projectId) {
        try {
            // èŽ·å–é¡¹ç›®é…ç½®ï¼ˆæ•°æ®åº“å®žä½“ï¼‰
            PlcAddress config = plcAddressService.getProjectConfigWithMapping(projectId);
            // èŽ·å–å¯¹åº”çš„S7Serializer
            EnhancedS7Serializer s7Serializer = getSerializerForProject(projectId, config);
            PlcBaseData resetData = new PlcBaseData();
            // é‡ç½®æ‰€æœ‰å…³é”®å­—段
            resetData.setPlcRequest(OFF);
            resetData.setPlcReport(OFF);
            resetData.setMesSend(OFF);
            resetData.setMesConfirm(OFF);
            // é»˜è®¤è”机
            resetData.setOnlineState(ON);
            resetData.setMesGlassCount(0);
            // æ¸…除报警
            resetData.setAlarmInfo(OFF);
            s7Serializer.write(resetData, config.getDbArea(), config.getBeginIndex());
            log.info("PLC状态已重置, projectId={}, dbArea={}, beginIndex={}",
                    projectId, config.getDbArea(), config.getBeginIndex());
            return true;
        } catch (Exception e) {
            log.error("重置PLC状态失败", e);
            return false;
        }
    }
    /**
     * è¯»å–PLC当前状态
     */
    @Override
    public PlcBaseData readPlcStatus() {
        return readPlcStatus(currentProjectId);
    }
    /**
     * è¯»å–PLC当前状态 - æ”¯æŒæŒ‡å®šé¡¹ç›®
     */
    @Override
    public PlcBaseData readPlcStatus(String projectId) {
        try {
            // èŽ·å–é¡¹ç›®é…ç½®ï¼ˆæ•°æ®åº“å®žä½“ï¼‰
            PlcAddress config = plcAddressService.getProjectConfigWithMapping(projectId);
            // èŽ·å–å¯¹åº”çš„S7Serializer
            EnhancedS7Serializer s7Serializer = getSerializerForProject(projectId, config);
            return s7Serializer.read(PlcBaseData.class, config.getDbArea(), config.getBeginIndex());
        } catch (Exception e) {
            log.error("读取PLC状态失败", e);
            return null;
        }
    }
    /**
     * è®¾ç½®å½“前项目标识
     */
    @Override
    public void setCurrentProjectId(String projectId) {
        this.currentProjectId = projectId;
    }
    /**
     * èŽ·å–å½“å‰é¡¹ç›®æ ‡è¯†
     */
    @Override
    public String getCurrentProjectId() {
        return this.currentProjectId;
    }
    /**
     * èŽ·å–é¡¹ç›®å¯¹åº”çš„S7Serializer实例
     * å¦‚果不存在,则创建一个新的实例并缓存
     *
     * @param projectId é¡¹ç›®æ ‡è¯†
     * @param config é¡¹ç›®é…ç½®
     * @return S7Serializer实例
     */
    private EnhancedS7Serializer getSerializerForProject(String projectId, PlcAddress config) {
        return serializerCache.computeIfAbsent(projectId, id -> {
            // è§£æžPLC类型
            EPlcType plcType = EPlcType.S1200; // é»˜è®¤å€¼
            if (config != null && config.getPlcType() != null) {
                try {
                    plcType = EPlcType.valueOf(config.getPlcType());
                } catch (IllegalArgumentException e) {
                    log.warn("未知的PLC类型: {}, ä½¿ç”¨é»˜è®¤ç±»åž‹ S1200", config.getPlcType());
                }
            }
            // åˆ›å»ºS7PLC实例
            String plcIp = (config != null && config.getPlcIp() != null) ? config.getPlcIp() : "192.168.10.21";
            S7PLC s7Plc = new S7PLC(plcType, plcIp);
            // åˆ›å»ºå¹¶è¿”回EnhancedS7Serializer实例
            return EnhancedS7Serializer.newInstance(s7Plc);
        });
    }
    /**
     * æ¸…除指定项目的S7Serializer缓存
     *
     * @param projectId é¡¹ç›®æ ‡è¯†
     */
    @Override
    public void clearSerializerCache(String projectId) {
        serializerCache.remove(projectId);
        log.info("已清除项目 {} çš„S7Serializer缓存", projectId);
    }
    /**
     * æ¸…除所有S7Serializer缓存
     */
    @Override
    public void clearAllSerializerCache() {
        serializerCache.clear();
        log.info("已清除所有S7Serializer缓存");
    }
}
mes-processes/mes-plcSend/src/main/java/com/mes/vo/Result.java
@@ -5,7 +5,7 @@
/**
 * ç»Ÿä¸€API响应结果
 * 
 * @author zhoush
 * @author huang
 * @date 2025/10/29
 */
@Data
@@ -104,6 +104,7 @@
     * åˆ¤æ–­æ˜¯å¦æˆåŠŸ
     */
    public boolean isSuccess() {
        return this.code != null && this.code == 200;
        // ä½¿ç”¨Integer.valueOf避免自动拆箱问题
        return this.code != null && Integer.valueOf(200).equals(this.code);
    }
}
mes-processes/mes-plcSend/src/main/resources/application-dev.yml
@@ -30,38 +30,6 @@
    port: 6379
    password: 123456
raw:
  mode: shuttle
s7:
  shuttle:
    dbArea: DB38.
    beginIndex: 0
  address:
    raw:
      onlineState: 2
      plcRequest: 0
      plcReport: 10
      finishA: 60
      finishB: 62
      state: 18
      onePosition: 6
      twoPosition: 14
      mesSend: 20
      mesConfirm: 40
      start: 24
      target: 26
      mesGlassCount: 30
      rawMargin1: 32
      mesWidth1: 34
      mesHeight1: 36
      rawThickness1: 38
      rawMargin2: 44
      mesWidth2: 46
      mesHeight2: 48
      rawThickness2: 50
      alarmInfo: 52
# PLC自动测试配置
plc:
  auto:
@@ -71,10 +39,8 @@
  # PLC地址映射配置
  address:
    mapping:
      defaultDbArea: "DB1."
      defaultBeginIndex: 0
      projects:
        shuttle:
        vertical:
          dbArea: "DB38."
          beginIndex: 0
          plcIp: "192.168.10.21"
mes-processes/mes-plcSend/src/main/resources/db/migration/V1.0.0__Create_plc_address_mapping_table.sql
@@ -22,5 +22,5 @@
-- æ’入默认配置
INSERT INTO `plc_address_mapping` (`project_id`, `project_name`, `db_area`, `begin_index`, `plc_ip`, `plc_type`, `description`) 
VALUES ('shuttle', '穿梭车项目', 'DB38', 0, '192.168.10.21', 'S1200', '默认穿梭车项目配置')
ON DUPLICATE KEY UPDATE `update_time` = CURRENT_TIMESTAMP;
VALUES ('vertical', '垂直车项目', 'DB38', 0, '192.168.10.21', 'S1200', '默认垂直车项目配置')
ON DUPLICATE KEY UPDATE `update_time` = CURRENT_TIMESTAMP;
mes-processes/mes-plcSend/target/classes/application-dev.yml
File was deleted
mes-processes/mes-plcSend/target/classes/application.yml
File was deleted
mes-processes/mes-plcSend/target/classes/changelog/changelogBase.xml
File was deleted
mes-processes/mes-plcSend/target/classes/changelog/mesInit.sql
File was deleted
mes-processes/mes-plcSend/target/classes/changelog/mesInitLy.sql
File was deleted
mes-processes/mes-plcSend/target/classes/com/mes/PlcSendApplication.class
Binary files differ
mes-processes/mes-plcSend/target/classes/com/mes/config/PlcAddressMappingConfig$ProjectPlcConfig.class
Binary files differ
mes-processes/mes-plcSend/target/classes/com/mes/config/PlcAddressMappingConfig.class
Binary files differ
mes-processes/mes-plcSend/target/classes/com/mes/controller/PlcAddressMappingController.class
Binary files differ
mes-processes/mes-plcSend/target/classes/com/mes/controller/PlcTestWriteController.class
Binary files differ
mes-processes/mes-plcSend/target/classes/com/mes/entity/PlcAddressMapping.class
Binary files differ
mes-processes/mes-plcSend/target/classes/com/mes/entity/PlcBaseData.class
Binary files differ
mes-processes/mes-plcSend/target/classes/com/mes/job/config/S7PlcSendConfig.class
Binary files differ
mes-processes/mes-plcSend/target/classes/com/mes/mapper/PlcAddressMappingMapper.class
Binary files differ
mes-processes/mes-plcSend/target/classes/com/mes/service/PlcAddressMappingService.class
Binary files differ
mes-processes/mes-plcSend/target/classes/com/mes/service/PlcAutoTestService.class
Binary files differ
mes-processes/mes-plcSend/target/classes/com/mes/service/PlcTestWriteService.class
Binary files differ
mes-processes/mes-plcSend/target/classes/com/mes/service/impl/PlcTestWriteServiceImpl.class
Binary files differ
mes-processes/mes-plcSend/target/classes/com/mes/vo/Result.class
Binary files differ
mes-processes/mes-plcSend/target/classes/db/migration/V1.0.0__Create_plc_address_mapping_table.sql
File was deleted
mes-processes/mes-plcSend/target/config/application-dev.yml
File was deleted
mes-processes/mes-plcSend/target/config/application.yml
File was deleted
mes-processes/mes-plcSend/target/config/changelog/changelogBase.xml
File was deleted
mes-processes/mes-plcSend/target/config/changelog/mesInit.sql
File was deleted
mes-processes/mes-plcSend/target/config/changelog/mesInitLy.sql
File was deleted
mes-processes/mes-plcSend/target/config/db/migration/V1.0.0__Create_plc_address_mapping_table.sql
File was deleted
mes-processes/mes-plcSend/target/lib/FastInfoset-1.2.15.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/HdrHistogram-2.1.9.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/HikariCP-3.2.0.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/SparseBitSet-1.2.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/archaius-core-0.7.6.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/aspectjweaver-1.9.4.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/bcpkix-jdk15on-1.60.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/bcpkix-jdk18on-1.75.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/bcprov-jdk15on-1.60.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/bcprov-jdk18on-1.75.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/bcutil-jdk18on-1.75.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/byte-buddy-1.9.16.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/classgraph-4.1.7.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/classmate-1.4.0.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/commons-codec-1.11.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/commons-collections-3.2.2.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/commons-collections4-4.4.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/commons-compress-1.19.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/commons-configuration-1.8.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/commons-csv-1.8.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/commons-fileupload-1.4.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/commons-io-2.2.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/commons-lang-2.6.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/commons-lang3-3.8.1.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/commons-logging-1.2.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/commons-math3-3.6.1.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/commons-pool2-2.6.2.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/curvesapi-1.06.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/druid-1.1.8.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/dynamic-datasource-spring-boot-starter-3.3.1.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/easyexcel-3.1.3.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/easyexcel-core-3.1.3.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/easyexcel-support-3.1.3.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/ehcache-3.6.3.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/fastjson-1.2.33.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/feign-core-10.2.3.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/feign-form-3.8.0.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/feign-form-spring-3.8.0.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/feign-hystrix-10.2.3.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/feign-slf4j-10.2.3.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/freemarker-2.3.29.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/guava-19.0.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/hibernate-validator-6.0.17.Final.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/httpclient-4.5.9.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/httpcore-4.4.12.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/hutool-all-5.4.0.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/hystrix-core-1.5.18.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/iot-communication-1.5.4.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/istack-commons-runtime-3.0.7.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/jackson-annotations-2.9.0.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/jackson-core-2.9.9.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/jackson-databind-2.9.9.3.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/jackson-datatype-jdk8-2.9.9.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/jackson-datatype-jsr310-2.9.9.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/jackson-module-parameter-names-2.9.9.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/javassist-3.25.0-GA.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/javax.activation-api-1.2.0.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/javax.annotation-api-1.3.2.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/javax.inject-1.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/jaxb-api-2.3.1.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/jaxb-runtime-2.3.1.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/jboss-logging-3.3.3.Final.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/jedis-2.9.3.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/jersey-apache-client4-1.19.1.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/jersey-client-1.19.1.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/jersey-core-1.19.1.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/jjwt-0.9.0.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/jsqlparser-3.2.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/jsr305-3.0.1.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/jsr311-api-1.1.1.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/jul-to-slf4j-1.7.28.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/knife4j-annotations-2.0.9.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/knife4j-core-2.0.9.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/knife4j-spring-2.0.9.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/knife4j-spring-boot-autoconfigure-2.0.9.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/knife4j-spring-boot-starter-2.0.9.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/knife4j-spring-ui-2.0.9.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/liquibase-core-3.6.3.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/log4j-api-2.11.2.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/log4j-to-slf4j-2.11.2.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/logback-classic-1.2.3.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/logback-core-1.2.3.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/lombok-1.18.8.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/mapstruct-1.3.1.Final.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/mes-rawGlassStorage-1.0.0.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/milo-spring-boot-starter-3.0.6.12.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/model-1.0.0.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/mssql-jdbc-6.4.0.jre8.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/mybatis-3.5.6.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/mybatis-plus-3.3.1.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/mybatis-plus-annotation-3.4.1.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/mybatis-plus-boot-starter-3.3.1.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/mybatis-plus-core-3.4.1.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/mybatis-plus-extension-3.4.1.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/mybatis-plus-generator-3.4.1.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/mybatis-spring-2.0.5.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/mysql-connector-java-8.0.17.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/nacos-api-1.1.1.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/nacos-client-1.1.1.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/nacos-common-1.1.1.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/netflix-commons-util-0.3.0.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/netflix-statistics-0.1.1.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/netty-buffer-4.1.39.Final.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/netty-channel-fsm-0.8.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/netty-codec-4.1.39.Final.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/netty-codec-http-4.1.39.Final.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/netty-common-4.1.39.Final.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/netty-handler-4.1.39.Final.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/netty-resolver-4.1.39.Final.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/netty-transport-4.1.39.Final.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/poi-4.1.2.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/poi-ooxml-4.1.2.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/poi-ooxml-schemas-4.1.2.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/ribbon-2.3.0.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/ribbon-core-2.3.0.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/ribbon-httpclient-2.3.0.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/ribbon-loadbalancer-2.3.0.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/ribbon-transport-2.3.0.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/rxjava-1.3.8.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/rxnetty-0.4.9.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/rxnetty-contexts-0.4.9.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/rxnetty-servo-0.4.9.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/screw-core-1.0.5.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/sdk-client-0.6.12.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/sdk-core-0.6.12.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/serverBase-1.0.0.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/servo-core-0.12.21.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/simpleclient-0.5.0.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/slf4j-api-1.7.28.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/snakeyaml-1.23.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-aop-5.1.9.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-beans-5.1.9.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-boot-2.1.8.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-boot-autoconfigure-2.1.8.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-boot-starter-2.1.8.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-boot-starter-aop-2.1.8.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-boot-starter-data-redis-2.1.8.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-boot-starter-jdbc-2.1.8.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-boot-starter-json-2.1.8.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-boot-starter-logging-2.1.8.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-boot-starter-security-2.1.8.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-boot-starter-tomcat-2.1.8.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-boot-starter-web-2.1.8.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-boot-starter-websocket-2.1.8.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-cloud-alibaba-nacos-discovery-2.1.0.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-cloud-commons-2.1.3.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-cloud-context-2.1.3.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-cloud-netflix-archaius-2.1.3.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-cloud-netflix-ribbon-2.1.3.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-cloud-openfeign-core-2.1.3.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-cloud-starter-2.1.3.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-cloud-starter-alibaba-nacos-discovery-2.1.0.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-cloud-starter-netflix-archaius-2.1.3.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-cloud-starter-netflix-ribbon-2.1.3.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-cloud-starter-openfeign-2.1.3.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-context-5.1.9.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-context-support-5.1.9.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-core-5.1.9.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-data-commons-2.1.10.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-data-keyvalue-2.1.10.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-data-redis-2.1.10.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-expression-5.1.9.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-jcl-5.1.9.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-jdbc-5.1.9.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-messaging-5.1.9.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-oxm-5.1.9.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-plugin-core-2.0.0.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-plugin-metadata-1.2.0.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-security-config-5.1.6.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-security-core-5.1.6.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-security-crypto-5.1.6.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-security-rsa-1.0.7.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-security-web-5.1.6.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-tx-5.1.9.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-web-5.1.9.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-webmvc-5.1.9.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/spring-websocket-5.1.9.RELEASE.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/springSecurity-1.0.0.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/springfox-bean-validators-2.10.5.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/springfox-core-2.10.5.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/springfox-schema-2.10.5.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/springfox-spi-2.10.5.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/springfox-spring-web-2.10.5.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/springfox-spring-webmvc-2.10.5.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/springfox-swagger-common-2.10.5.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/springfox-swagger2-2.10.5.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/stack-client-0.6.12.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/stack-core-0.6.12.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/stax-ex-1.8.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/strict-machine-0.6.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/swagger-annotations-1.5.22.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/swagger-models-1.5.22.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/tomcat-embed-core-9.0.24.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/tomcat-embed-el-9.0.24.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/tomcat-embed-websocket-9.0.24.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/txw2-2.3.1.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/validation-api-2.0.1.Final.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/velocity-engine-core-2.0.jar
Binary files differ
mes-processes/mes-plcSend/target/lib/xmlbeans-3.1.0.jar
Binary files differ
mes-processes/mes-plcSend/target/maven-archiver/pom.properties
File was deleted
mes-processes/mes-plcSend/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
File was deleted
mes-processes/mes-plcSend/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
File was deleted
mes-processes/mes-plcSend/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst
mes-processes/mes-plcSend/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
mes-processes/mes-plcSend/target/mes-plcSend-1.0.0.jar
Binary files differ
mes-processes/mes-plcSend/target/mes-plcSend-1.0.0.jar.original
Binary files differ
mes-web/src/views/plcTest/Test.vue
@@ -1,551 +1,899 @@
<template>
  <div class="auto-test-dashboard">
    <!-- é¡¶éƒ¨å¯¼èˆªåŒº -->
    <el-header class="header">
      <h1>MES自动化测试平台</h1>
      <div class="header-actions">
        <el-button type="primary" @click="showModuleStatus">查看模块状态</el-button>
        <el-button type="primary" @click="importTask">导入测试任务</el-button>
        <el-button type="success" @click="startTest" :disabled="!isConfigReady">开始测试</el-button>
        <el-button type="warning" @click="batchTest" :disabled="batchTasks.length === 0">批量测试</el-button>
        <el-button @click="resetAll">重置配置</el-button>
  <div class="dashboard-container">
    <div class="dashboard-header">
      <div class="header-left">
        <h2>MES测试系统</h2>
      </div>
    </el-header>
    <!-- ä¸»ä½“内容区 -->
    <el-container>
      <!-- å·¦ä¾§ï¼šæ¨¡å—配置与字段选择 -->
      <el-aside width="320px" class="aside">
        <el-card class="config-card">
          <h3 class="section-title">模块配置</h3>
          <el-select v-model="selectedModule" @change="handleModuleChange" placeholder="选择测试模块" style="width: 100%">
            <el-option label="龙门仓储" value="gantryStorage"></el-option>
            <el-option label="上片模块" value="upperModule"></el-option>
            <el-option label="穿梭仓储" value="storageModule"></el-option>
          </el-select>
          <h3 class="section-title">协议字段选择</h3>
          <el-checkbox-group v-model="checkedFields" class="field-checkbox-group">
            <el-checkbox v-for="field in allFields" :key="field.value" :label="field.value"
              :disabled="isSystemField(field.value)">
              {{ field.label }}
            </el-checkbox>
          </el-checkbox-group>
          <h3 class="section-title">测试参数配置</h3>
          <el-form :model="testParameters" label-width="120px" class="parameter-form">
            <el-form-item label="PlC地址">
              <el-input v-model="testParameters.plcAddress" :min="0" :max="100" size="small"></el-input>
      <div class="header-right">
        <el-button type="success" @click="startTest">
          <i class="el-icon-play"></i> å¼€å§‹æµ‹è¯•
        </el-button>
        <el-button type="warning" @click="stopTest">
          <i class="el-icon-stop"></i> åœæ­¢æµ‹è¯•
        </el-button>
      </div>
    </div>
    <div class="dashboard-content">
      <el-aside width="400px" class="config-aside">
        <el-card class="config-section">
          <h3><i class="el-icon-sitemap"></i> é¡¹ç›®é…ç½®</h3>
          <el-form label-width="100px" size="">
            <el-form-item label="项目选择">
              <el-select v-model="selectedProject" placeholder="请选择项目" @change="handleProjectChange" class="full-width">
                <el-option
                  v-for="project in projectList"
                  :key="project.value"
                  :label="project.label"
                  :value="project.value">
                </el-option>
              </el-select>
            </el-form-item>
            <el-form-item label="DB块">
              <el-input v-model="testParameters.dbAddress" :min="0" :max="100" size="small"></el-input>
            </el-form-item>
            <el-form-item label="任务重试次数">
              <el-input-number v-model="testParameters.retryCount" :min="0" :max="10" size="small"></el-input-number>
            </el-form-item>
            <el-form-item label="测试间隔(ms)">
              <el-input-number v-model="testParameters.interval" :min="100" :max="10000" size="small"></el-input-number>
            </el-form-item>
            <el-form-item label="模拟故障概率">
              <el-slider v-model="testParameters.failureRate" :min="0" :max="100" show-stops></el-slider>
            <el-form-item label="模块选择">
              <el-select v-model="selectedModule" placeholder="请选择模块" @change="handleModuleChange" class="full-width">
                <el-option
                  v-for="module in availableModules"
                  :key="module"
                  :label="module"
                  :value="module">
                </el-option>
              </el-select>
            </el-form-item>
          </el-form>
          <div class="test-actions">
            <el-button type="primary" size="small" @click="saveCurrentConfig">保存配置</el-button>
            <el-button size="small" @click="loadConfig">加载配置</el-button>
        </el-card>
        <el-card class="config-section">
          <h3><i class="el-icon-list"></i> åè®®å­—段配置</h3>
          <div class="field-container">
            <div class="field-header">
              <span>字段列表</span>
              <el-button type="text" size="small" icon="el-icon-plus" @click="addNewField" class="add-btn">添加字段</el-button>
            </div>
            <div class="field-list">
              <div v-for="field in allFields" :key="field.value" class="field-item">
                <div class="field-info">
                  <el-checkbox v-model="checkedFields" :label="field.value">{{ field.label }}</el-checkbox>
                </div>
                <div class="field-address">
                  <span class="field-address-label">DB块索引:</span>
                  <el-input v-model="field.address" size="mini" placeholder="输入DB块索引" style="width: 100px;"></el-input>
                </div>
                <el-button v-if="!isSystemField(field.value)" type="text" size="mini" icon="el-icon-delete" class="remove-btn" @click="removeField(field.value)"></el-button>
              </div>
            </div>
          </div>
        </el-card>
        <el-card class="config-section">
          <h3><i class="el-icon-sliders"></i> æµ‹è¯•参数配置</h3>
          <el-form :model="testParameters" label-width="100px" size="small">
            <el-form-item label="PLC地址">
              <el-input v-model="testParameters.plcAddress" placeholder="输入PLC地址"></el-input>
            </el-form-item>
            <el-form-item label="DB块">
              <el-input v-model="testParameters.dbAddress" placeholder="输入DB块"></el-input>
            </el-form-item>
            <el-form-item label="超时时间">
              <el-input-number v-model="testParameters.timeout" :min="1" :max="60" controls-position="right"></el-input-number>
              <span style="margin-left: 10px;">秒</span>
            </el-form-item>
            <el-form-item label="重试次数">
              <el-input-number v-model="testParameters.retryCount" :min="0" :max="10" controls-position="right"></el-input-number>
              <span style="margin-left: 10px;">次</span>
            </el-form-item>
          </el-form>
          <div style="margin-top: 15px; text-align: center;">
            <el-button type="primary" @click="saveCurrentConfig">保存配置</el-button>
            <el-button @click="resetConfig">重置配置</el-button>
          </div>
        </el-card>
      </el-aside>
      <!-- å³ä¾§ï¼šä»»åŠ¡ç›‘æŽ§ä¸Žç»“æžœå±•ç¤º -->
      <el-main class="main">
        <!-- æ‰¹é‡æµ‹è¯•配置 -->
        <el-card class="batch-test-card" v-if="showBatchTestConfig">
          <h3 class="section-title">批量测试配置</h3>
          <el-table :data="batchTasks" style="width: 100%">
            <el-table-column prop="module" label="模块" width="120"></el-table-column>
            <el-table-column prop="start" label="起始位置" width="100"></el-table-column>
            <el-table-column prop="target" label="目标位置" width="100"></el-table-column>
            <el-table-column prop="retryCount" label="重试次数" width="100"></el-table-column>
            <el-table-column label="操作" width="80">
              <template #default="scope">
                <el-button type="danger" size="mini" @click="removeBatchTask(scope.$index)">删除</el-button>
              </template>
            </el-table-column>
          </el-table>
          <div class="batch-actions">
            <el-button type="primary" size="small" @click="addCurrentToBatch">添加当前配置</el-button>
            <el-button type="success" size="small" @click="startBatchTest">执行批量测试</el-button>
      <el-main class="monitor-main">
        <div class="monitor-section">
          <div class="section-header">
            <h3><i class="el-icon-monitor"></i> ä»»åŠ¡ç›‘æŽ§</h3>
            <div class="section-actions">
              <el-button type="primary" size="small" @click="showBatchTestDialog">
                <i class="el-icon-files"></i> æ‰¹é‡æµ‹è¯•
              </el-button>
              <el-button type="success" size="small" @click="showImportDialog">
                <i class="el-icon-upload2"></i> å¯¼å…¥ä»»åŠ¡
              </el-button>
              <el-button size="small" @click="refreshTasks">
                <i class="el-icon-refresh"></i> åˆ·æ–°
              </el-button>
            </div>
          </div>
        </el-card>
        <!-- ä»»åŠ¡æµè½¬æ—¶é—´çº¿ -->
        <div class="timeline-section">
          <h3 class="section-title">任务流转监测</h3>
          <div class="timeline-container" v-if="runningTasks.length > 0">
            <el-timeline v-for="(task, index) in runningTasks" :key="index" class="task-timeline">
              <el-timeline-item v-for="(event, eventIndex) in task.timeline" :key="eventIndex" :timestamp="event.time"
                :type="event.status" :color="getStatusColor(event.status)" :icon="getEventIcon(event.status)">
                {{ event.desc }}
              </el-timeline-item>
            </el-timeline>
          <div class="task-container">
            <h4>当前任务</h4>
            <div v-if="currentTasks.length === 0" class="empty-state">
              <div class="empty-icon"><i class="el-icon-clipboard"></i></div>
              <div class="empty-text">暂无任务</div>
            </div>
            <div v-else class="task-list">
              <div v-for="task in currentTasks" :key="task.id" class="task-item" @click="showTaskDetail(task)">
                <div class="task-info">
                  <span class="task-id">{{ task.id }}</span>
                  <span class="task-module">{{ task.module }}</span>
                  <span class="task-project">{{ task.project }}</span>
                </div>
                <el-tag :type="getStatusType(task.status)">{{ task.status }}</el-tag>
              </div>
            </div>
          </div>
          <div class="empty-state" v-else>
            <el-empty description="暂无运行中的任务" />
          <div class="result-container">
            <h4>测试结果统计</h4>
            <div class="result-stats">
              <div class="stat-item">
                <div class="stat-number">{{ testStats.total }}</div>
                <div class="stat-label">总测试数</div>
              </div>
              <div class="stat-item">
                <div class="stat-number pass">{{ testStats.passed }}</div>
                <div class="stat-label">通过</div>
              </div>
              <div class="stat-item">
                <div class="stat-number fail">{{ testStats.failed }}</div>
                <div class="stat-label">失败</div>
              </div>
              <div class="stat-item">
                <div class="stat-number">{{ testStats.running }}</div>
                <div class="stat-label">进行中</div>
              </div>
            </div>
          </div>
        </div>
        <!-- æµ‹è¯•结果统计 -->
        <div class="result-section mt-20">
          <h3 class="section-title">测试结果统计</h3>
          <el-row :gutter="20">
            <el-col :span="6">
              <el-card class="result-card">
                <div class="result-item">
                  <span class="label">总任务数</span>
                  <span class="value">{{ taskCount.total }}</span>
                </div>
              </el-card>
            </el-col>
            <el-col :span="6">
              <el-card class="result-card">
                <div class="result-item">
                  <span class="label">通过数</span>
                  <span class="value success">{{ taskCount.pass }}</span>
                </div>
              </el-card>
            </el-col>
            <el-col :span="6">
              <el-card class="result-card">
                <div class="result-item">
                  <span class="label">失败数</span>
                  <span class="value error">{{ taskCount.fail }}</span>
                </div>
              </el-card>
            </el-col>
            <el-col :span="6">
              <el-card class="result-card">
                <div class="result-item">
                  <span class="label">通过率</span>
                  <span class="value"
                    :class="{ success: taskCount.total > 0 && taskCount.pass / taskCount.total > 0.9, error: taskCount.total > 0 && taskCount.pass / taskCount.total < 0.5 }">
                    {{ calculatePassRate() }}%
                  </span>
                </div>
              </el-card>
            </el-col>
          </el-row>
          <div class="result-table-container">
            <el-table :data="testResults" style="width: 100%" border>
              <el-table-column prop="module" label="模块"></el-table-column>
              <el-table-column prop="startTime" label="开始时间"></el-table-column>
              <el-table-column prop="endTime" label="结束时间"></el-table-column>
              <el-table-column prop="status" label="状态" width="80">
                <template #default="scope">
                  <el-tag :type="scope.row.status === '通过' ? 'success' : 'error'" size="small">
                    {{ scope.row.status }}
                  </el-tag>
          <div class="result-list">
            <h4>测试结果</h4>
            <el-table
              :data="testResults"
              style="width: 100%"
              border
              stripe
              :cell-style="{ padding: '8px 10px' }">
              <el-table-column prop="id" label="任务ID" width="100"></el-table-column>
              <el-table-column prop="project" label="项目" width="120"></el-table-column>
              <el-table-column prop="module" label="模块" width="120"></el-table-column>
              <el-table-column prop="field" label="字段" width="120"></el-table-column>
              <el-table-column prop="status" label="状态" width="100">
                <template slot-scope="scope">
                  <el-tag :type="getStatusType(scope.row.status)">{{ scope.row.status }}</el-tag>
                </template>
              </el-table-column>
              <el-table-column prop="duration" label="耗时(秒)"></el-table-column>
              <el-table-column prop="retryCount" label="重试次数"></el-table-column>
              <el-table-column prop="errorMsg" label="错误信息" v-if="showErrorColumn"
                :show-overflow-tooltip="true"></el-table-column>
              <el-table-column label="操作" width="100">
                <template #default="scope">
                  <el-button type="text" size="small" @click="viewTaskDetail(scope.row)">查看详情</el-button>
                  <el-button type="text" size="small" @click="retryTask(scope.row)">重试</el-button>
                </template>
              </el-table-column>
              <el-table-column prop="startTime" label="开始时间" width="160"></el-table-column>
              <el-table-column prop="duration" label="耗时" width="100"></el-table-column>
              <el-table-column prop="result" label="结果"></el-table-column>
            </el-table>
          </div>
        </div>
      </el-main>
    </el-container>
    <!-- å¯¼å…¥ä»»åŠ¡å¼¹çª— -->
    <el-dialog title="导入测试任务" v-model="importDialogVisible" width="50%">
      <el-upload class="upload-demo" action="#" :auto-upload="false" :on-change="handleFileChange"
        :before-upload="beforeFileUpload" drag>
        <i class="el-icon-upload"></i>
        <div class="el-upload__text">拖拽文件到此处,或<em>点击上传</em></div>
        <template #tip>
          <div class="el-upload__tip">仅支持Excel/JSON格式,大小不超过5MB</div>
        </template>
      </el-upload>
      <template #footer>
        <div class="dialog-footer">
          <el-button @click="importDialogVisible = false">取消</el-button>
          <el-button type="primary" @click="confirmImport">确认导入</el-button>
        </div>
      </template>
    </el-dialog>
    <!-- æ¨¡å—状态弹窗 -->
    <el-dialog title="PLC模块状态" v-model="statusDialogVisible" width="70%">
      <div class="status-container">
        <el-tabs v-model="activeStatusTab" @tab-click="handleStatusTabClick">
          <el-tab-pane label="龙门仓储" name="gantryStorage"></el-tab-pane>
          <el-tab-pane label="上片模块" name="upperModule"></el-tab-pane>
          <el-tab-pane label="穿梭仓储" name="storageModule"></el-tab-pane>
        </el-tabs>
        <el-table :data="statusTableData" style="width: 100%" border v-if="statusTableData.length > 0">
          <el-table-column prop="key" label="参数名称"></el-table-column>
          <el-table-column prop="value" label="当前值"></el-table-column>
          <el-table-column prop="updateTime" label="更新时间"></el-table-column>
        </el-table>
        <div v-else class="empty-status">
          <el-empty description="暂无状态数据" />
        </div>
        <div class="status-actions">
          <el-button type="primary" size="small" @click="refreshModuleStatus">刷新状态</el-button>
          <el-button type="warning" size="small" @click="resetModuleStatus">重置模块</el-button>
    </div>
    <!-- æ‰¹é‡æµ‹è¯•弹窗 -->
    <el-dialog title="批量测试" :visible.sync="batchTestDialogVisible" width="60%">
      <div class="batch-test-container">
        <el-form :model="batchTestForm" label-width="100px">
          <el-form-item label="项目选择">
            <el-select v-model="batchTestForm.projectIds" multiple placeholder="请选择项目" style="width: 100%">
              <el-option
                v-for="project in projectList"
                :key="project.value"
                :label="project.label"
                :value="project.value">
              </el-option>
            </el-select>
          </el-form-item>
          <el-form-item label="模块选择">
            <el-checkbox-group v-model="batchTestForm.modules">
              <el-checkbox v-for="module in availableModules" :key="module" :label="module">{{ module }}</el-checkbox>
            </el-checkbox-group>
          </el-form-item>
          <el-form-item label="测试字段">
            <el-transfer
              v-model="batchTestForm.selectedFields"
              :data="allFields.map(field => ({key: field.value, label: field.label}))"
              :titles="['可选字段', '已选字段']"
              :props="{key: 'key', label: 'label'}">
            </el-transfer>
          </el-form-item>
        </el-form>
        <div class="batch-footer">
          <el-button @click="batchTestDialogVisible = false">取消</el-button>
          <el-button type="primary" @click="startBatchTest">开始批量测试</el-button>
        </div>
      </div>
    </el-dialog>
    <!-- ä»»åŠ¡å¯¼å…¥å¼¹çª— -->
    <el-dialog title="导入任务" :visible.sync="importDialogVisible" width="50%">
      <el-upload
        class="upload-demo"
        drag
        action="/api/plcSend/test/import"
        :on-success="handleImportSuccess"
        :before-upload="beforeUpload">
        <i class="el-icon-upload"></i>
        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
        <div class="el-upload__tip" slot="tip">只能上传xlsx/xls文件,且不超过10MB</div>
      </el-upload>
      <div class="import-footer">
        <el-button @click="importDialogVisible = false">取消</el-button>
        <el-button type="primary" @click="confirmImport">确认导入</el-button>
      </div>
    </el-dialog>
    <!-- ä»»åŠ¡è¯¦æƒ…å¼¹çª— -->
    <el-dialog title="任务详情" v-model="taskDetailVisible" width="60%">
      <div class="task-detail">
        <div class="detail-section">
          <h4>基本信息</h4>
          <el-descriptions :column="2" :border="true">
            <el-descriptions-item label="任务ID">{{ currentTaskDetail.id }}</el-descriptions-item>
            <el-descriptions-item label="模块">{{ currentTaskDetail.module }}</el-descriptions-item>
            <el-descriptions-item label="状态">{{ currentTaskDetail.status }}</el-descriptions-item>
            <el-descriptions-item label="耗时">{{ currentTaskDetail.duration }}秒</el-descriptions-item>
            <el-descriptions-item label="开始时间" :span="2">{{ currentTaskDetail.startTime }}</el-descriptions-item>
            <el-descriptions-item label="结束时间" :span="2">{{ currentTaskDetail.endTime }}</el-descriptions-item>
          </el-descriptions>
        </div>
        <div class="detail-section">
          <h4>执行日志</h4>
    <el-dialog title="任务详情" :visible.sync="taskDetailDialogVisible" width="60%">
      <div class="task-detail-container" v-if="selectedTask">
        <el-descriptions :column="2" border>
          <el-descriptions-item label="任务ID">{{ selectedTask.id }}</el-descriptions-item>
          <el-descriptions-item label="项目">{{ selectedTask.project }}</el-descriptions-item>
          <el-descriptions-item label="模块">{{ selectedTask.module }}</el-descriptions-item>
          <el-descriptions-item label="状态">
            <el-tag :type="getStatusType(selectedTask.status)">{{ selectedTask.status }}</el-tag>
          </el-descriptions-item>
          <el-descriptions-item label="开始时间">{{ selectedTask.startTime }}</el-descriptions-item>
          <el-descriptions-item label="结束时间">{{ selectedTask.endTime || '-' }}</el-descriptions-item>
          <el-descriptions-item label="耗时">{{ selectedTask.duration || '-' }}</el-descriptions-item>
          <el-descriptions-item label="执行人">{{ selectedTask.operator || '-' }}</el-descriptions-item>
        </el-descriptions>
        <div class="task-timeline">
          <h4>任务流转时间线</h4>
          <el-timeline>
            <el-timeline-item v-for="(event, index) in currentTaskDetail.timeline" :key="index" :timestamp="event.time"
              :type="event.status" :color="getStatusColor(event.status)">
              {{ event.desc }}
            <el-timeline-item
              v-for="(activity, index) in selectedTask.timeline"
              :key="index"
              :timestamp="activity.timestamp">
              {{ activity.content }}
            </el-timeline-item>
          </el-timeline>
        </div>
      </div>
    </el-dialog>
    <!-- æ¨¡å—状态弹窗 -->
    <el-dialog title="模块状态" :visible.sync="moduleStatusDialogVisible" width="50%">
      <div class="status-container">
        <el-table
          :data="moduleStatusData"
          style="width: 100%"
          border
          stripe>
          <el-table-column prop="module" label="模块名称"></el-table-column>
          <el-table-column prop="status" label="状态" width="100">
            <template slot-scope="scope">
              <el-tag :type="getStatusType(scope.row.status)">{{ scope.row.status }}</el-tag>
            </template>
          </el-table-column>
          <el-table-column prop="lastUpdate" label="最后更新"></el-table-column>
          <el-table-column label="操作" width="120">
            <template slot-scope="scope">
              <el-button size="mini" @click="checkModuleStatus(scope.row)">检查状态</el-button>
            </template>
          </el-table-column>
        </el-table>
      </div>
    </el-dialog>
  </div>
</template>
<script>
// è„šæœ¬éƒ¨åˆ†ä¿æŒä¸å˜
import axios from 'axios'
import * as XLSX from 'xlsx'
import { ElMessage, ElMessageBox } from 'element-plus'
export default {
  name: 'Test',
  data() {
    return {
      // æ¨¡å—选择和字段配置
      selectedModule: 'gantryStorage',
      allFields: [
        { label: '联机状态', value: 'onlineStatus', isSystem: false },
        { label: 'PLC请求字', value: 'plcRequest', isSystem: false },
        { label: 'PLC汇报字', value: 'plcReport', isSystem: false },
        { label: '完成1A', value: 'complete1A', isSystem: false },
        { label: '完成1B', value: 'complete1B', isSystem: false },
        { label: '任务状态', value: 'taskStatus', isSystem: true },
        { label: '穿梭车/天车位置', value: 'shuttlePosition', isSystem: false },
        { label: '吸盘/小车位置', value: 'suctionPosition', isSystem: false },
        { label: 'MES任务发送字', value: 'mesSend', isSystem: true },
        { label: 'MES任务确认字', value: 'mesConfirm', isSystem: true },
        { label: '起始', value: 'start', isSystem: true },
        { label: '目标', value: 'target', isSystem: true },
        { label: '玻璃数量', value: 'glassCount', isSystem: false },
        { label: '1号边距', value: 'edge1Margin', isSystem: false },
        { label: '1号长边', value: 'edge1Long', isSystem: false },
        { label: '1号短边', value: 'edge1Short', isSystem: false },
        { label: '1号厚', value: 'edge1Thick', isSystem: false },
        { label: '2号边距', value: 'edge2Margin', isSystem: false },
        { label: '2号长边', value: 'edge2Long', isSystem: false },
        { label: '2号短边', value: 'edge2Short', isSystem: false },
        { label: '2号厚', value: 'edge2Thick', isSystem: false },
        { label: '报警信号', value: 'alarm', isSystem: true }
      ],
      checkedFields: [],
      selectedProject: 'default', // é»˜è®¤é¡¹ç›®
      selectedModule: '',
      checkedFields: ['onlineState', 'plcRequest'],
      projectList: [],
      availableModules: ['gantryStorage', 'upperModule', 'storageModule'],
      fieldDbIndexes: {},
      allFields: [],
      
      // æµ‹è¯•参数配置
      // æµ‹è¯•参数
      testParameters: {
        start: 1,
        target: 5,
        retryCount: 2,
        plcAddress: '192.168.10.21',
        dbAddress: 'DB38',
        retryCount: 3,
        interval: 1000,
        failureRate: 0
        failureRate: 5,
        timeout: 30
      },
      
      // æ‰¹é‡æµ‹è¯•相关
      showBatchTestConfig: false,
      // æ‰¹é‡æµ‹è¯•
      batchTasks: [],
      showBatchTestConfig: false,
      
      // ä»»åŠ¡å’Œç»“æžœ
      // ä»»åŠ¡ç›‘æŽ§
      runningTasks: [],
      taskCount: {
        total: 0,
        pass: 0,
        fail: 0
      },
      testResults: [],
      taskCount: { total: 0, pass: 0, fail: 0 },
      
      // å¼¹çª—状态
      importDialogVisible: false,
      statusDialogVisible: false,
      moduleStatusVisible: false,
      taskDetailVisible: false,
      importFile: null,
      currentTaskDetail: null,
      
      // æ¨¡å—状态相关
      activeStatusTab: 'gantryStorage',
      statusTableData: [],
      // æ–‡ä»¶ä¸Šä¼ 
      uploadFile: null,
      
      // å½“前任务详情
      currentTaskDetail: {},
      // å®šæ—¶å™¨
      statusTimer: null,
      testTimer: null,
      
      // æ˜¾ç¤ºé”™è¯¯åˆ—
      // ç³»ç»Ÿå­—段(不可取消勾选)
      systemFields: ['onlineState', 'plcRequest', 'taskId'],
      // å¼¹çª—状态
      batchTestDialogVisible: false,
      taskDetailDialogVisible: false,
      moduleStatusDialogVisible: false,
      // æ‰¹é‡æµ‹è¯•表单
      batchTestForm: {
        projectIds: [],
        modules: [],
        selectedFields: []
      },
      // ä»»åŠ¡æ•°æ®
      currentTasks: [],
      selectedTask: null,
      testStats: {
        total: 0,
        passed: 0,
        failed: 0,
        running: 0
      },
      moduleStatusData: [],
      // é”™è¯¯ä¿¡æ¯åˆ—显示控制
      showErrorColumn: false
    };
  },
  computed: {
    // åˆ¤æ–­é…ç½®æ˜¯å¦å‡†å¤‡å°±ç»ª
    // æ£€æŸ¥é…ç½®æ˜¯å¦å‡†å¤‡å°±ç»ª
    isConfigReady() {
      return this.checkedFields.length > 0;
      return this.selectedModule && this.checkedFields.length > 0;
    }
  },
  mounted() {
    // åˆå§‹åŒ–时设置默认字段
    this.setDefaultFieldsByModule(this.selectedModule);
    // åŠ è½½æœ¬åœ°å­˜å‚¨çš„é…ç½®
    this.loadLocalConfig();
    // é¡µé¢åŠ è½½æ—¶èŽ·å–é¡¹ç›®åˆ—è¡¨
    this.fetchProjectList();
    // åŠ è½½ä¿å­˜çš„é…ç½®
    this.loadConfig();
    // å¯åŠ¨çŠ¶æ€ç›‘æŽ§
    this.startStatusMonitoring();
  },
  beforeUnmount() {
    // æ¸…理定时器
    if (this.statusTimer) {
      clearInterval(this.statusTimer);
    }
    if (this.testTimer) {
      clearInterval(this.testTimer);
    }
  },
  methods: {
    // æ¨¡å—切换时设置默认字段
    handleModuleChange(module) {
      this.setDefaultFieldsByModule(module);
    },
    // æ ¹æ®æ¨¡å—设置默认字段
    setDefaultFieldsByModule(module) {
      if (module === 'gantryStorage') {
        this.checkedFields = this.allFields.map(field => field.value);
      } else if (module === 'shuttle') {
        this.checkedFields = [
          'onlineStatus', 'plcRequest', 'plcReport',
          'taskStatus', 'mesSend', 'mesConfirm',
          'start', 'target', 'alarm'
        ];
      } else if (module === 'upperModule') {
        this.checkedFields = [
          'onlineStatus', 'plcRequest', 'plcReport', 'taskStatus',
          'mesSend', 'mesConfirm', 'start', 'target', 'alarm',
          'complete1A', 'complete1B', 'glassCount'
        ];
      } else if (module === 'storageModule') {
        this.checkedFields = [
          'onlineStatus', 'plcRequest', 'plcReport', 'taskStatus',
          'mesSend', 'mesConfirm', 'start', 'target', 'alarm',
          'shuttlePosition', 'suctionPosition'
        ];
    // èŽ·å–é¡¹ç›®åˆ—è¡¨
    async fetchProjectList() {
      try {
        const response = await axios.get('/api/plcSend/address-mapping/list');
        if (response.data && response.data.code === 200) {
          this.projectList = response.data.data.map(item => ({
            value: item.projectId,
            label: item.projectName || item.projectId,
            plcIp: item.plcIp,
            dbArea: item.dbArea,
            addressMapping: item.addressMapping,
            remarks: item.remarks
          }));
          // å¦‚果当前选择的项目不在列表中,设置为第一个项目
          if (this.projectList.length > 0 && !this.projectList.find(p => p.value === this.selectedProject)) {
            this.selectedProject = this.projectList[0].value;
            this.handleProjectChange();
          }
        } else {
          ElMessage.error('获取项目列表失败');
        }
      } catch (error) {
        console.error('获取项目列表失败:', error);
        ElMessage.error('获取项目列表失败');
      }
    },
    
    // åˆ¤æ–­æ˜¯å¦ä¸ºç³»ç»Ÿçº§å¿…选字段
    isSystemField(fieldValue) {
      return this.allFields.find(item => item.value === fieldValue)?.isSystem || false;
    },
    // å¯¼å…¥æµ‹è¯•任务
    importTask() {
      this.importDialogVisible = true;
    },
    // æ–‡ä»¶ä¸Šä¼ å‰æ£€æŸ¥
    beforeFileUpload(file) {
      const isExcel = file.type === 'application/vnd.ms-excel' || file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
      const isJson = file.type === 'application/json';
      const isLt5M = file.size / 1024 / 1024 < 5;
      if (!isExcel && !isJson) {
        this.$message.error('上传文件只能是 Excel æˆ– JSON æ ¼å¼!');
        return false;
      }
      if (!isLt5M) {
        this.$message.error('上传文件大小不能超过 5MB!');
        return false;
      }
      return true;
    },
    // æ–‡ä»¶æ”¹å˜å¤„理
    handleFileChange(file) {
      this.importFile = file.raw;
    },
    // ç¡®è®¤å¯¼å…¥
    confirmImport() {
      if (!this.importFile) {
        this.$message.warning('请先选择文件');
    // å¤„理项目变更
    async handleProjectChange() {
      // ç¡®ä¿projectList存在且不是空数组
      if (!this.projectList || this.projectList.length === 0) {
        console.log('项目列表未加载');
        return;
      }
      
      // æ¨¡æ‹Ÿæ–‡ä»¶è§£æžé€»è¾‘
      const reader = new FileReader();
      reader.onload = (e) => {
        try {
          // æ ¹æ®æ–‡ä»¶ç±»åž‹è§£æž
          if (this.importFile.name.endsWith('.json')) {
            const data = JSON.parse(e.target.result);
            if (data.batchTasks) {
              this.batchTasks = data.batchTasks;
              this.showBatchTestConfig = true;
              this.$message.success('批量测试任务导入成功');
            } else if (data.testParameters) {
              this.testParameters = data.testParameters;
              this.$message.success('测试参数配置导入成功');
      const project = this.projectList.find(p => p.value === this.selectedProject);
      if (project) {
        // æ›´æ–°PLC地址和DB块
        this.testParameters.plcAddress = project.plcIp || 'null';
        this.testParameters.dbAddress = project.dbArea || 'null';
        this.selectedModule = project.remarks || 'null';
        // èŽ·å–å®Œæ•´çš„é¡¹ç›®é…ç½®ï¼ˆåŒ…å«åœ°å€æ˜ å°„ï¼‰
        if (this.selectedProject && this.selectedProject !== 'default') {
          try {
            const response = await axios.get(`/api/plcSend/address-mapping/project/config?projectId=${this.selectedProject}`);
            if (response.data && response.data.code === 200 && response.data.data) {
              const projectConfig = response.data.data;
              // ä½¿ç”¨å®Œæ•´çš„地址映射更新字段配置
              if (projectConfig.addressMapping) {
                this.updateFieldAddresses(projectConfig.addressMapping);
              }
            } else {
              console.error('获取项目配置失败:', response.data?.message);
              // å›žé€€åˆ°ä½¿ç”¨é¡¹ç›®åˆ—表中的地址映射
              if (project.addressMapping) {
                try {
                  const addressMapping = JSON.parse(project.addressMapping);
                  this.updateFieldAddresses(addressMapping);
                } catch (e) {
                  console.error('解析地址映射失败:', e);
                }
              }
            }
          } else {
            // å¯¹äºŽExcel文件,可以使用xlsx库解析
            this.$message.success('Excel文件导入成功(实际项目中需要添加解析逻辑)');
          } catch (error) {
            console.error('获取项目配置失败:', error);
            // å›žé€€åˆ°ä½¿ç”¨é¡¹ç›®åˆ—表中的地址映射
            if (project.addressMapping) {
              try {
                const addressMapping = JSON.parse(project.addressMapping);
                this.updateFieldAddresses(addressMapping);
              } catch (e) {
                console.error('解析地址映射失败:', e);
              }
            }
          }
        } catch (error) {
          this.$message.error('文件解析失败: ' + error.message);
        } else {
          // å¯¹äºŽé»˜è®¤é¡¹ç›®ï¼Œä½¿ç”¨é¡¹ç›®åˆ—表中的地址映射
          if (project.addressMapping) {
            try {
              const addressMapping = JSON.parse(project.addressMapping);
              this.updateFieldAddresses(addressMapping);
            } catch (e) {
              console.error('解析地址映射失败:', e);
            }
          }
        }
      };
      reader.readAsText(this.importFile);
      } else {
        console.log('未找到选中的项目:', this.selectedProject);
      }
      
      this.importDialogVisible = false;
      // æ¸…空当前任务状态
      this.runningTasks = [];
      this.testResults = [];
      this.updateTaskCount();
    },
    // æ›´æ–°å­—段地址
    updateFieldAddresses(addressMapping) {
      // å­—段名到中文标签的映射关系
      const fieldLabels = {
        'onlineState': '联机状态',
        'plcRequest': 'PLC请求',
        'plcReport': 'PLC汇报',
        'finishA': '完成信号A',
        'finishB': '完成信号B',
        'state': '设备状态',
        'onePosition': '一号位置',
        'twoPosition': '二号位置',
        'mesSend': 'MES发送',
        'mesConfirm': 'MES确认',
        'start': '起始位置',
        'target': '目标位置',
        'mesGlassCount': '玻璃数量',
        'rawMargin1': '原片边距1',
        'mesWidth1': '玻璃宽度1',
        'mesHeight1': '玻璃高度1',
        'rawThickness1': '玻璃厚度1',
        'rawMargin2': '原片边距2',
        'mesWidth2': '玻璃宽度2',
        'mesHeight2': '玻璃高度2',
        'rawThickness2': '玻璃厚度2',
        'alarmInfo': '报警信息'
      };
      // æ ¹æ®addressMapping动态生成allFields数组
      const newFields = [];
      // éåކaddressMapping,生成新的字段列表
      for (const [fieldName, address] of Object.entries(addressMapping)) {
        newFields.push({
          label: fieldLabels[fieldName] || fieldName, // ä½¿ç”¨æ˜ å°„的中文标签,如果没有则使用字段名
          value: fieldName,
          address: address
        });
      }
      // æ›´æ–°allFields
      this.allFields = newFields;
      // å¦‚果是第一次加载,默认选中系统关键字段
      if (!this.checkedFields || this.checkedFields.length === 0 || this.checkedFields.includes('')) {
        this.checkedFields = ['onlineState', 'plcRequest'];
      }
    },
    // å¤„理模块变更
    handleModuleChange() {
      // æ ¹æ®æ¨¡å—类型设置默认字段
      if (this.selectedModule === 'gantryStorage') {
        this.checkedFields = ['onlineState', 'plcRequest', 'taskId', 'startPos', 'targetPos', 'deviceStatus'];
      } else if (this.selectedModule === 'upperModule') {
        this.checkedFields = ['onlineState', 'plcRequest', 'taskId', 'runMode', 'errorCode', 'currentSpeed'];
      } else if (this.selectedModule === 'storageModule') {
        this.checkedFields = ['onlineState', 'plcRequest', 'taskId', 'currentPos', 'taskStatus', 'completion'];
      }
    },
    // åˆ¤æ–­æ˜¯å¦ä¸ºç³»ç»Ÿå­—段
    isSystemField(field) {
      return this.systemFields.includes(field);
    },
    // æ·»åŠ æ–°å­—æ®µ
    addNewField() {
      ElMessageBox.prompt('请输入新字段名称', '添加字段', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        inputPattern: /^[a-zA-Z][a-zA-Z0-9_]*$/,
        inputErrorMessage: '字段名称必须以字母开头,只能包含字母、数字和下划线'
      }).then(({ value }) => {
        // æ£€æŸ¥å­—段是否已存在
        if (this.allFields.find(f => f.value === value)) {
          ElMessage.warning('字段已存在');
          return;
        }
        // æ·»åŠ æ–°å­—æ®µ
        this.allFields.push({
          label: value,
          value: value,
          address: 0,
          system: false
        });
        ElMessage.success('字段添加成功');
      }).catch(() => {
        // ç”¨æˆ·å–消
      });
    },
    // åˆ é™¤å­—段
    removeField(field) {
      if (this.isSystemField(field)) {
        ElMessage.warning('系统字段不能删除');
        return;
      }
      ElMessageBox.confirm(`确定要删除字段 "${field}" å—?`, '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        // ä»ŽallFields中移除
        this.allFields = this.allFields.filter(f => f.value !== field);
        // ä»ŽcheckedFields中移除
        this.checkedFields = this.checkedFields.filter(f => f !== field);
        ElMessage.success('字段删除成功');
      }).catch(() => {
        // ç”¨æˆ·å–消
      });
    },
    // æ›´æ–°å­—段地址
    updateFieldAddress(field, address) {
      const fieldIndex = this.allFields.findIndex(f => f.value === field);
      if (fieldIndex !== -1) {
        this.allFields[fieldIndex].address = parseInt(address) || 0;
      }
    },
    // ä¿å­˜å½“前配置
    async saveCurrentConfig() {
      try {
        // æž„建地址映射JSON
        const addressMapping = {};
        this.allFields.forEach(field => {
          if (field.address !== undefined) {
            addressMapping[field.value] = field.address;
          }
        });
        // ä¿å­˜åˆ°æœ¬åœ°å­˜å‚¨
        localStorage.setItem('plcTestConfig', JSON.stringify({
          selectedProject: this.selectedProject,
          selectedModule: this.selectedModule,
          checkedFields: this.checkedFields,
          testParameters: this.testParameters,
          allFields: this.allFields
        }));
        // åªæœ‰å½“selectedProject不是'default'时才调用API
        if (this.selectedProject && this.selectedProject !== 'default') {
          // å‡†å¤‡æ›´æ–°æ•°æ®
          const updateData = {
            projectId: this.selectedProject,
            plcIp: this.testParameters.plcAddress,
            dbArea: this.testParameters.dbAddress,
            addressMapping: JSON.stringify(addressMapping)
          };
          // è°ƒç”¨API更新配置
          const response = await axios.put(`/api/plcSend/address-mapping/project/${this.selectedProject}`, updateData);
        if (response.data && response.data.code === 200) {
            ElMessage.success('配置保存成功');
          } else {
            ElMessage.error('配置保存失败');
          }
        } else {
          // å¦‚果是默认项目,只保存到本地
          ElMessage.success('配置已保存到本地');
        }
      } catch (error) {
        console.error('保存配置失败:', error);
        ElMessage.error('配置保存失败');
      }
    },
    // åŠ è½½é…ç½®
    loadConfig() {
      const savedConfig = localStorage.getItem('plcTestConfig');
      if (savedConfig) {
        try {
          const config = JSON.parse(savedConfig);
          this.selectedProject = config.selectedProject || 'default';
          this.selectedModule = config.selectedModule || 'gantryStorage';
          this.checkedFields = config.checkedFields || ['onlineState', 'plcRequest', 'taskId'];
          this.testParameters = { ...this.testParameters, ...config.testParameters };
          if (config.allFields) {
            this.allFields = config.allFields;
          }
        } catch (e) {
          console.error('加载配置失败:', e);
        }
      }
    },
    // é‡ç½®é…ç½®
    resetAll() {
      ElMessageBox.confirm('确定要重置所有配置吗?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        // é‡ç½®æ•°æ®
        this.selectedProject = 'default';
        this.selectedModule = 'gantryStorage';
        this.checkedFields = ['onlineState', 'plcRequest', 'taskId'];
        this.testParameters = {
          plcAddress: '192.168.10.21',
          dbAddress: 'DB38',
          retryCount: 3,
          interval: 1000,
          failureRate: 5
        };
        // æ¸…空任务
        this.runningTasks = [];
        this.testResults = [];
        this.batchTasks = [];
        this.updateTaskCount();
        // æ¸…除本地存储
        localStorage.removeItem('plcTestConfig');
        ElMessage.success('配置已重置');
      }).catch(() => {
        // ç”¨æˆ·å–消
      });
    },
    
    // å¼€å§‹æµ‹è¯•
    startTest() {
      const moduleMap = {
        gantryStorage: '龙门仓储',
        upperModule: '上片模块',
        storageModule: '穿梭仓储'
      };
      const moduleName = moduleMap[this.selectedModule];
    async startTest() {
      if (!this.isConfigReady) {
        ElMessage.warning('请先完成配置');
        return;
      }
      
      // åˆ›å»ºæ–°ä»»åŠ¡
      const taskId = Date.now();
      const task = {
        id: taskId,
        module: moduleName,
        moduleKey: this.selectedModule,
        startTime: new Date().toLocaleString(),
        timeline: [
          { time: new Date().toLocaleTimeString(), status: 'primary', desc: '测试任务启动' },
          { time: new Date().toLocaleTimeString(), status: 'primary', desc: '开始初始化测试环境' }
        ]
      };
      this.runningTasks.push(task);
      const startTime = Date.now();
      // å‡†å¤‡ä»»åŠ¡æ•°æ®
      const taskData = {
        // åŸºç¡€å­—段
        mesSend: 1,
        mesConfirm: 0,
        plcRequest: 0,
        taskStatus: 0,
        // åŠ¨æ€å‚æ•°
        start: this.testParameters.start,
        target: this.testParameters.target
      };
      // è°ƒç”¨åŽç«¯API
      this.$axios.post(`/api/plc/operation/execute/${this.selectedModule}`, taskData)
        .then(response => {
          const result = response.data;
          const timeline = this.runningTasks.find(t => t.id === taskId).timeline;
      try {
        // æž„建测试参数
        const testParams = {
          projectId: this.selectedProject,
          module: this.selectedModule,
          fields: this.checkedFields,
          parameters: this.testParameters
        };
        // è°ƒç”¨æµ‹è¯•API
        const response = await axios.post(`/api/plcSend/test/execute/${this.selectedModule}`, testParams);
        if (response.data && response.data.code === 200) {
          const taskId = response.data.data.taskId;
          
          timeline.push({
            time: new Date().toLocaleTimeString(),
            status: 'success',
            desc: 'PLC请求发送成功'
          // æ·»åŠ åˆ°è¿è¡Œä»»åŠ¡åˆ—è¡¨
          this.runningTasks.push({
            id: taskId,
            module: this.selectedModule,
            project: this.selectedProject,
            status: 'running',
            startTime: new Date().toLocaleTimeString(),
            timeline: [
              { time: new Date().toLocaleTimeString(), desc: '任务已提交', status: 'primary' }
            ]
          });
          
          // æ¨¡æ‹Ÿä»»åŠ¡æ‰§è¡Œï¼ˆå®žé™…é¡¹ç›®ä¸­å¯èƒ½éœ€è¦è½®è¯¢æˆ–WebSocket)
          setTimeout(() => {
            // æ ¹æ®é…ç½®çš„æ•…障概率模拟失败情况
            const shouldFail = Math.random() * 100 < this.testParameters.failureRate;
          ElMessage.success('测试任务已提交');
          // å¼€å§‹ç›‘控任务状态
          this.monitorTask(taskId);
        } else {
          ElMessage.error('提交测试任务失败');
        }
      } catch (error) {
        console.error('提交测试任务失败:', error);
        ElMessage.error('提交测试任务失败');
      }
    },
    // ç›‘控任务状态
    async monitorTask(taskId) {
      const checkStatus = async () => {
        try {
          const response = await axios.get(`/api/plcSend/test/status/${this.selectedModule}?taskId=${taskId}`);
          if (response.data && response.data.code === 200) {
            const taskData = response.data.data;
            const taskIndex = this.runningTasks.findIndex(t => t.id === taskId);
            
            if (!shouldFail && result.success) {
              timeline.push({
            if (taskIndex !== -1) {
              // æ›´æ–°ä»»åŠ¡çŠ¶æ€
              this.runningTasks[taskIndex].status = taskData.status;
              // æ·»åŠ çŠ¶æ€å˜åŒ–äº‹ä»¶
              this.runningTasks[taskIndex].timeline.push({
                time: new Date().toLocaleTimeString(),
                status: 'success',
                desc: '任务执行完成'
                desc: `状态更新: ${taskData.status}`,
                status: taskData.status === 'success' ? 'success' :
                       taskData.status === 'failed' ? 'danger' : 'primary'
              });
              
              // æ›´æ–°æµ‹è¯•结果
              this.updateTestResults(taskId, moduleName, '通过', '', startTime, 0);
            } else {
              const errorMsg = '模拟故障发生';
              timeline.push({
                time: new Date().toLocaleTimeString(),
                status: 'error',
                desc: `任务执行失败: ${errorMsg}`
              });
              // æ›´æ–°æµ‹è¯•结果
              this.updateTestResults(taskId, moduleName, '失败', errorMsg, startTime, 0);
              // å¦‚果任务完成,添加到结果列表
              if (taskData.status === 'success' || taskData.status === 'failed') {
                this.testResults.push({
                  id: taskId,
                  module: this.selectedModule,
                  project: this.selectedProject,
                  startTime: this.runningTasks[taskIndex].startTime,
                  endTime: new Date().toLocaleTimeString(),
                  status: taskData.status === 'success' ? '通过' : '失败',
                  duration: taskData.duration || 0,
                  retryCount: taskData.retryCount || 0,
                  errorMsg: taskData.errorMsg || ''
                });
                // æ›´æ–°ä»»åŠ¡è®¡æ•°
                this.updateTaskCount();
                // ä»Žè¿è¡Œä»»åŠ¡åˆ—è¡¨ä¸­ç§»é™¤
                this.runningTasks.splice(taskIndex, 1);
                // æ˜¾ç¤ºé”™è¯¯ä¿¡æ¯åˆ—(如果有错误)
                if (taskData.errorMsg) {
                  this.showErrorColumn = true;
                }
              } else {
                // ç»§ç»­ç›‘控
                setTimeout(checkStatus, 2000);
              }
            }
            // ä»Žè¿è¡Œä»»åŠ¡åˆ—è¡¨ä¸­ç§»é™¤
            this.removeRunningTask(taskId);
          }, this.testParameters.interval);
        })
        .catch(error => {
          const timeline = this.runningTasks.find(t => t.id === taskId).timeline;
          timeline.push({
            time: new Date().toLocaleTimeString(),
            status: 'error',
            desc: `API调用失败: ${error.message || '网络错误'}`
          });
          // æ›´æ–°æµ‹è¯•结果
          this.updateTestResults(taskId, moduleName, '失败', error.message || '网络错误', startTime, 0);
          // ä»Žè¿è¡Œä»»åŠ¡åˆ—è¡¨ä¸­ç§»é™¤
          this.removeRunningTask(taskId);
        });
          }
        } catch (error) {
          console.error('获取任务状态失败:', error);
        }
      };
      // å¼€å§‹æ£€æŸ¥çŠ¶æ€
      setTimeout(checkStatus, 1000);
    },
    
    // æ‰¹é‡æµ‹è¯•
    batchTest() {
      this.showBatchTestConfig = !this.showBatchTestConfig;
      this.showBatchTestConfig = true;
    },
    
    // æ·»åŠ å½“å‰é…ç½®åˆ°æ‰¹é‡ä»»åŠ¡
    addCurrentToBatch() {
      const batchTask = {
        module: this.selectedModule,
        start: this.testParameters.start,
        target: this.testParameters.target,
        retryCount: this.testParameters.retryCount
      };
      this.batchTasks.push(batchTask);
      this.$message.success('已添加到批量测试任务');
    },
    // æ‰§è¡Œæ‰¹é‡æµ‹è¯•
    startBatchTest() {
      if (this.batchTasks.length === 0) {
        this.$message.warning('请先添加批量测试任务');
      if (!this.isConfigReady) {
        ElMessage.warning('请先完成配置');
        return;
      }
      
      // é€ä¸ªæ‰§è¡Œæ‰¹é‡ä»»åŠ¡
      this.batchTasks.forEach((task, index) => {
        setTimeout(() => {
          this.selectedModule = task.module;
          this.testParameters.start = task.start;
          this.testParameters.target = task.target;
          this.testParameters.retryCount = task.retryCount;
          this.startTest();
        }, index * (this.testParameters.interval + 1000));
      this.batchTasks.push({
        module: this.selectedModule,
        project: this.selectedProject,
        start: this.testParameters.startPos || 0,
        target: this.testParameters.targetPos || 0,
        retryCount: this.testParameters.retryCount
      });
      
      this.$message.success(`批量测试已启动,共${this.batchTasks.length}个任务`);
      ElMessage.success('已添加到批量任务列表');
    },
    // å¼€å§‹æ‰¹é‡æµ‹è¯•
    async startBatchTest() {
      if (this.batchTasks.length === 0) {
        ElMessage.warning('批量任务列表为空');
        return;
      }
      try {
        // è°ƒç”¨æ‰¹é‡æµ‹è¯•API
        const response = await axios.post('/api/plcSend/test/batch', {
          tasks: this.batchTasks
        });
        if (response.data && response.data.code === 200) {
          ElMessage.success('批量测试已提交');
          this.showBatchTestConfig = false;
          // æ·»åŠ åˆ°è¿è¡Œä»»åŠ¡åˆ—è¡¨
          response.data.data.taskIds.forEach((taskId, index) => {
            this.runningTasks.push({
              id: taskId,
              module: this.batchTasks[index].module,
              project: this.batchTasks[index].project,
              status: 'running',
              startTime: new Date().toLocaleTimeString(),
              timeline: [
                { time: new Date().toLocaleTimeString(), desc: '批量任务已提交', status: 'primary' }
              ]
            });
            // ç›‘控任务状态
            this.monitorTask(taskId);
          });
        } else {
          ElMessage.error('提交批量测试失败');
        }
      } catch (error) {
        console.error('提交批量测试失败:', error);
        ElMessage.error('提交批量测试失败');
      }
    },
    
    // ç§»é™¤æ‰¹é‡ä»»åŠ¡
@@ -553,175 +901,150 @@
      this.batchTasks.splice(index, 1);
    },
    
    // æ›´æ–°æµ‹è¯•结果
    updateTestResults(taskId, moduleName, status, errorMsg, startTime, retryCount) {
      const endTime = new Date();
      const duration = Math.round((endTime.getTime() - startTime) / 1000);
    // å¯¼å…¥ä»»åŠ¡
    importTask() {
      this.importDialogVisible = true;
    },
    // å¤„理文件变化
    handleFileChange(file) {
      this.uploadFile = file.raw;
    },
    // æ–‡ä»¶ä¸Šä¼ å‰æ£€æŸ¥
    beforeFileUpload(file) {
      const isExcel = file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ||
                     file.type === 'application/vnd.ms-excel';
      const isJSON = file.type === 'application/json';
      const isLt5M = file.size / 1024 / 1024 < 5;
      
      this.testResults.push({
        id: taskId,
        module: moduleName,
        startTime: new Date(startTime).toLocaleString(),
        endTime: endTime.toLocaleString(),
        status: status,
        duration: duration,
        retryCount: retryCount,
        errorMsg: errorMsg,
        timeline: this.runningTasks.find(t => t.id === taskId)?.timeline || []
      });
      if (!isExcel && !isJSON) {
        ElMessage.error('只能上传Excel或JSON格式文件!');
      }
      if (!isLt5M) {
        ElMessage.error('文件大小不能超过5MB!');
      }
      return (isExcel || isJSON) && isLt5M;
    },
    // ç¡®è®¤å¯¼å…¥
    async confirmImport() {
      if (!this.uploadFile) {
        ElMessage.warning('请先选择文件');
        return;
      }
      
      // æ›´æ–°ç»Ÿè®¡æ•°æ®
      this.taskCount.total++;
      if (status === '通过') {
        this.taskCount.pass++;
      } else {
        this.taskCount.fail++;
        this.showErrorColumn = true;
      try {
        const formData = new FormData();
        formData.append('file', this.uploadFile);
        const response = await axios.post('/api/plcSend/test/import', formData, {
          headers: {
            'Content-Type': 'multipart/form-data'
          }
        });
        if (response.data && response.data.code === 200) {
          ElMessage.success('导入成功');
          this.importDialogVisible = false;
          // æ·»åŠ å¯¼å…¥çš„ä»»åŠ¡åˆ°æ‰¹é‡ä»»åŠ¡åˆ—è¡¨
          if (response.data.data && response.data.data.tasks) {
            this.batchTasks = [...this.batchTasks, ...response.data.data.tasks];
          }
        } else {
          ElMessage.error('导入失败');
        }
      } catch (error) {
        console.error('导入失败:', error);
        ElMessage.error('导入失败');
      }
    },
    
    // ä»Žè¿è¡Œä»»åŠ¡åˆ—è¡¨ä¸­ç§»é™¤
    removeRunningTask(taskId) {
      const index = this.runningTasks.findIndex(t => t.id === taskId);
      if (index > -1) {
        this.runningTasks.splice(index, 1);
    // æ˜¾ç¤ºä»»åŠ¡è¯¦æƒ…
    showTaskDetail(task) {
      this.selectedTask = task;
      this.taskDetailDialogVisible = true;
    },
    // æ˜¾ç¤ºæ‰¹é‡æµ‹è¯•弹窗
    showBatchTestDialog() {
      this.batchTestDialogVisible = true;
    },
    // æ˜¾ç¤ºå¯¼å…¥å¼¹çª—
    showImportDialog() {
      this.importDialogVisible = true;
    },
    // å¤„理导入成功
    handleImportSuccess(response) {
      if (response.data && response.data.code === 200) {
        ElMessage.success('文件上传成功');
        // å¯ä»¥åœ¨è¿™é‡Œå¤„理上传成功后的逻辑
      }
    },
    
    // é‡ç½®æ‰€æœ‰é…ç½®
    resetAll() {
      this.$confirm('确定要重置所有配置吗?这将清除所有测试结果和运行中的任务。', '提示', {
    // æ–‡ä»¶ä¸Šä¼ å‰æ£€æŸ¥
    beforeUpload(file) {
      const isExcel = file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ||
                     file.type === 'application/vnd.ms-excel';
      const isJSON = file.type === 'application/json';
      const isLt10M = file.size / 1024 / 1024 < 10;
      if (!isExcel && !isJSON) {
        ElMessage.error('只能上传Excel或JSON格式文件!');
        return false;
      }
      if (!isLt10M) {
        ElMessage.error('文件大小不能超过10MB!');
        return false;
      }
      return true;
    },
    // å–消测试
    stopTest() {
      ElMessageBox.confirm('确定要停止当前测试吗?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        this.checkedFields = [];
        this.runningTasks = [];
        this.testResults = [];
        this.taskCount = { total: 0, pass: 0, fail: 0 };
        this.showErrorColumn = false;
        this.setDefaultFieldsByModule(this.selectedModule);
        this.$message.success('所有配置已重置');
      }).catch(() => {});
    },
    // èŽ·å–æ—¶é—´çº¿çŠ¶æ€é¢œè‰²
    getStatusColor(status) {
      const colorMap = {
        primary: 'blue',
        success: 'green',
        error: 'red',
        warning: 'orange'
      };
      return colorMap[status] || 'blue';
    },
    // èŽ·å–äº‹ä»¶å›¾æ ‡
    getEventIcon(status) {
      const iconMap = {
        primary: 'el-icon-loading',
        success: 'el-icon-circle-check',
        error: 'el-icon-circle-close',
        warning: 'el-icon-warning'
      };
      return iconMap[status] || 'el-icon-information';
    },
    // è®¡ç®—通过率
    calculatePassRate() {
      if (this.taskCount.total === 0) return 0;
      return Math.round((this.taskCount.pass / this.taskCount.total) * 100);
    },
    // ä¿å­˜å½“前配置
    saveCurrentConfig() {
      const config = {
        selectedModule: this.selectedModule,
        checkedFields: this.checkedFields,
        testParameters: this.testParameters
      };
      localStorage.setItem('plcTestConfig', JSON.stringify(config));
      this.$message.success('配置已保存');
    },
    // åŠ è½½æœ¬åœ°é…ç½®
    loadLocalConfig() {
      const config = localStorage.getItem('plcTestConfig');
      if (config) {
      }).then(async () => {
        try {
          const parsedConfig = JSON.parse(config);
          this.selectedModule = parsedConfig.selectedModule || 'gantryStorage';
          this.checkedFields = parsedConfig.checkedFields || [];
          this.testParameters = parsedConfig.testParameters || this.testParameters;
          this.$message.success('配置已加载');
        } catch (error) {
          console.error('加载配置失败:', error);
        }
      }
    },
    // æ‰‹åŠ¨åŠ è½½é…ç½®
    loadConfig() {
      this.loadLocalConfig();
    },
    // æ˜¾ç¤ºæ¨¡å—状态
    showModuleStatus() {
      this.statusDialogVisible = true;
      this.refreshModuleStatus();
    },
    // å¤„理状态标签点击
    handleStatusTabClick(tab) {
      this.activeStatusTab = tab.name;
      this.refreshModuleStatus();
    },
    // åˆ·æ–°æ¨¡å—状态
    refreshModuleStatus() {
      this.$axios.get(`/api/plc/operation/status/${this.activeStatusTab}`)
        .then(response => {
          const statusData = response.data.data;
          this.statusTableData = [];
          // ä¿®æ”¹ä¸ºä½¿ç”¨è·¯å¾„参数的方式调用API
          const response = await axios.post(`/api/plcSend/test/stop/${this.selectedModule}`);
          
          if (statusData) {
            for (const [key, value] of Object.entries(statusData)) {
              this.statusTableData.push({
                key: this.getFieldLabel(key) || key,
                value: value,
                updateTime: new Date().toLocaleTimeString()
              });
            }
          if (response.data && response.data.success) {
            ElMessage.success('测试已停止');
            // æ¸…空运行中的任务
            this.runningTasks = [];
            this.testStats.running = 0;
          } else {
            ElMessage.error('停止测试失败');
          }
        })
        .catch(error => {
          this.$message.error('获取模块状态失败: ' + error.message);
        });
        } catch (error) {
          console.error('停止测试失败:', error);
          ElMessage.error('停止测试失败');
        }
      }).catch(() => {
        // ç”¨æˆ·å–消
      });
    },
    
    // é‡ç½®æ¨¡å—状态
    resetModuleStatus() {
      this.$confirm('确定要重置该模块状态吗?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        this.$axios.post(`/api/plc/operation/reset/${this.activeStatusTab}`)
          .then(() => {
            this.$message.success('模块状态已重置');
            this.refreshModuleStatus();
          })
          .catch(error => {
            this.$message.error('重置模块状态失败: ' + error.message);
          });
      }).catch(() => {});
    },
    // èŽ·å–å­—æ®µæ ‡ç­¾
    getFieldLabel(fieldValue) {
      const field = this.allFields.find(item => item.value === fieldValue);
      return field ? field.label : null;
    async resetModuleStatus() {
      try {
        const response = await axios.post(`/api/plcSend/test/reset/${this.selectedModule}`);
        if (response.data && response.data.code === 200) {
          ElMessage.success('模块状态已重置');
        } else {
          ElMessage.error('重置模块状态失败');
        }
      } catch (error) {
        console.error('重置模块状态失败:', error);
        ElMessage.error('重置模块状态失败');
      }
    },
    
    // æŸ¥çœ‹ä»»åŠ¡è¯¦æƒ…
@@ -731,207 +1054,635 @@
    },
    
    // é‡è¯•任务
    retryTask(task) {
      // å¦‚果任务有moduleKey字段,使用它,否则根据模块名称推断
      const moduleMap = {
        '龙门仓储': 'gantryStorage',
        '上片模块': 'upperModule',
        '穿梭仓储': 'storageModule'
    async retryTask(task) {
      try {
        const response = await axios.post(`/api/plcSend/test/retry/${task.module}`, {
          taskId: task.id,
          projectId: task.project
        });
        if (response.data && response.data.code === 200) {
          ElMessage.success('任务重试已提交');
          // æ·»åŠ åˆ°è¿è¡Œä»»åŠ¡åˆ—è¡¨
          this.runningTasks.push({
            id: task.id,
            module: task.module,
            project: task.project,
            status: 'running',
            startTime: new Date().toLocaleTimeString(),
            timeline: [
              { time: new Date().toLocaleTimeString(), desc: '任务重试已提交', status: 'primary' }
            ]
          });
          // ç›‘控任务状态
          this.monitorTask(task.id);
        } else {
          ElMessage.error('任务重试失败');
        }
      } catch (error) {
        console.error('任务重试失败:', error);
        ElMessage.error('任务重试失败');
      }
    },
    // æ›´æ–°ä»»åŠ¡è®¡æ•°
    updateTaskCount() {
      this.taskCount.total = this.testResults.length;
      this.taskCount.pass = this.testResults.filter(r => r.status === '通过').length;
      this.taskCount.fail = this.testResults.filter(r => r.status === '失败').length;
    },
    // è®¡ç®—通过率
    calculatePassRate() {
      if (this.taskCount.total === 0) return 0;
      return Math.round((this.taskCount.pass / this.taskCount.total) * 100);
    },
    // èŽ·å–çŠ¶æ€é¢œè‰²
    getStatusColor(status) {
      const colorMap = {
        'primary': '#409EFF',
        'success': '#67C23A',
        'warning': '#E6A23C',
        'danger': '#F56C6C',
        'info': '#909399'
      };
      this.selectedModule = task.moduleKey || moduleMap[task.module] || 'gantryStorage';
      // é‡ç½®å­—段选择
      this.setDefaultFieldsByModule(this.selectedModule);
      // å¯åŠ¨æµ‹è¯•
      this.startTest();
      return colorMap[status] || '#409EFF';
    },
    // èŽ·å–äº‹ä»¶å›¾æ ‡
    getEventIcon(status) {
      const iconMap = {
        'primary': 'el-icon-loading',
        'success': 'el-icon-circle-check',
        'warning': 'el-icon-warning',
        'danger': 'el-icon-circle-close',
        'info': 'el-icon-info'
      };
      return iconMap[status] || 'el-icon-info';
    },
    // å¯åŠ¨çŠ¶æ€ç›‘æŽ§
    startStatusMonitoring() {
      // æ¯30秒刷新一次状态
      this.statusTimer = setInterval(() => {
        this.refreshTasks();
        this.refreshModuleStatus();
      }, 30000);
    },
    // åˆ·æ–°ä»»åŠ¡åˆ—è¡¨
    async refreshTasks() {
      try {
        // åŽç«¯æ²¡æœ‰ç›´æŽ¥æä¾›èŽ·å–æ‰€æœ‰ä»»åŠ¡çš„æŽ¥å£
        // è¿™é‡Œä½¿ç”¨æœ¬åœ°æ•°æ®æ¨¡æ‹Ÿï¼Œå®žé™…应用中可能需要调整实现逻辑
        // æˆ–者后端需要新增相应接口
        // const response = await axios.get('/api/plc/test/tasks');
        // ä½¿ç”¨æ¨¡æ‹Ÿæ•°æ®
        this.currentTasks = this.runningTasks;
        // æ›´æ–°ä»»åŠ¡ç»Ÿè®¡
        this.testStats.total = this.testResults.length;
        this.testStats.passed = this.testResults.filter(r => r.status === '通过').length;
        this.testStats.failed = this.testResults.filter(r => r.status === '失败').length;
        this.testStats.running = this.currentTasks.length;
      } catch (error) {
        console.error('刷新任务列表失败:', error);
      }
    },
    // åˆ·æ–°æ¨¡å—状态
    async refreshModuleStatus() {
      try {
        // åŽç«¯æ²¡æœ‰ç›´æŽ¥æä¾›èŽ·å–æ‰€æœ‰æ¨¡å—çŠ¶æ€çš„æŽ¥å£
        // è¿™é‡Œä½¿ç”¨æœ¬åœ°æ•°æ®æ¨¡æ‹Ÿï¼Œå®žé™…应用中可能需要调整实现逻辑
        // æˆ–者后端需要新增相应接口
        // const response = await axios.get('/api/plc/test/modules/status');
        // ä½¿ç”¨æ¨¡æ‹Ÿæ•°æ®ä¿æŒç•Œé¢æ­£å¸¸å·¥ä½œ
        if (!this.moduleStatusData || this.moduleStatusData.length === 0) {
          // å¦‚果没有数据,初始化一些模拟模块
          this.moduleStatusData = [
            { module: 'gantryStorage', status: 'idle', lastUpdate: new Date().toLocaleTimeString() },
            { module: 'upperModule', status: 'idle', lastUpdate: new Date().toLocaleTimeString() },
            { module: 'storageModule', status: 'idle', lastUpdate: new Date().toLocaleTimeString() }
          ];
        } else {
          // æ›´æ–°çŽ°æœ‰æ¨¡å—çš„æ—¶é—´æˆ³
          this.moduleStatusData.forEach(module => {
            module.lastUpdate = new Date().toLocaleTimeString();
          });
        }
      } catch (error) {
        console.error('刷新模块状态失败:', error);
      }
    },
    // æ£€æŸ¥æ¨¡å—状态
    async checkModuleStatus(module) {
      try {
        // ä¿®æ”¹ä¸ºä½¿ç”¨åŽç«¯æä¾›çš„readPlcStatus接口
        const response = await axios.get(`/api/plcSend/test/status?projectId=${module.module}`);
        // ç”±äºŽæŽ¥å£è¿”回的是PlcBaseData对象而非直接的状态信息,需要进行适配
        const index = this.moduleStatusData.findIndex(m => m.module === module.module);
        if (index !== -1) {
          // å‡è®¾onlineState字段表示模块是否在线
          const status = response.data ? 'online' : 'offline';
          this.moduleStatusData[index] = {
            ...this.moduleStatusData[index],
            status: status,
            lastUpdate: new Date().toLocaleTimeString(),
            details: response.data || {}
          };
          ElMessage.success('模块状态更新成功');
        }
      } catch (error) {
        console.error('检查模块状态失败:', error);
        ElMessage.error('检查模块状态失败');
      }
    },
    // èŽ·å–çŠ¶æ€ç±»åž‹
    getStatusType(status) {
      const statusMap = {
        'running': 'warning',
        'success': 'success',
        '通过': 'success',
        'failed': 'danger',
        '失败': 'danger',
        'online': 'success',
        'offline': 'danger',
        'idle': 'info'
      };
      return statusMap[status] || 'primary';
    },
    // é‡ç½®é…ç½®
    resetConfig() {
      ElMessageBox.confirm('确定要重置所有配置吗?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        this.resetAll();
      }).catch(() => {
        // ç”¨æˆ·å–消
      });
    }
  }
};
</script>
<style scoped>
.auto-test-dashboard {
.dashboard-container {
  height: 100vh;
  display: flex;
  flex-direction: column;
  background-color: #f5f7fa;
  overflow: hidden;
}
.header {
.dashboard-header {
  background-color: #2c3e50;
  color: white;
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 0 20px;
  background-color: #fff;
  border-bottom: 1px solid #eaecef;
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08);
  height: 60px;
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
  flex-shrink: 0;
}
.header h1 {
  font-size: 20px;
  font-weight: 600;
  color: #303133;
}
.header-actions {
.header-left h2 {
  margin: 0;
  font-size: 1.4rem;
  font-weight: 500;
  display: flex;
  gap: 10px;
  align-items: center;
}
.aside {
  background-color: #f5f7fa;
  border-right: 1px solid #eaecef;
  padding: 15px;
  overflow-y: auto;
.header-left h2::before {
  content: "⚙️";
  margin-right: 10px;
}
.main {
  padding: 20px;
  overflow: auto;
  flex: 1;
}
.mt-20 {
  margin-top: 20px;
}
.config-card, .batch-test-card, .timeline-section, .result-section {
  background-color: #fff;
  border-radius: 4px;
  padding: 20px;
  box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.08);
  margin-bottom: 20px;
}
.section-title {
  font-size: 16px;
  font-weight: 600;
  color: #303133;
  margin-bottom: 15px;
  padding-bottom: 10px;
  border-bottom: 1px solid #ebeef5;
}
.field-checkbox-group {
  max-height: 200px;
  overflow-y: auto;
  padding: 5px 0;
}
.field-checkbox-group .el-checkbox {
  margin-bottom: 8px;
  display: block;
}
.parameter-form {
  margin-top: 15px;
}
.parameter-form .el-form-item {
  margin-bottom: 15px;
}
.test-actions, .batch-actions {
.header-right {
  display: flex;
  gap: 10px;
  margin-top: 20px;
  gap: 12px;
}
.batch-actions {
  justify-content: flex-end;
.header-right .el-button {
  transition: all 0.2s ease;
}
.timeline-container {
  max-height: 400px;
  overflow-y: auto;
}
.task-timeline {
  margin-bottom: 20px;
  padding-bottom: 20px;
  border-bottom: 1px dashed #ebeef5;
}
.task-timeline:last-child {
  border-bottom: none;
  margin-bottom: 0;
  padding-bottom: 0;
}
.result-card {
  text-align: center;
  transition: all 0.3s;
}
.result-card:hover {
.header-right .el-button:hover {
  transform: translateY(-2px);
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
.result-item {
.dashboard-content {
  display: flex;
  flex: 1;
  overflow: hidden;
  padding: 15px;
  gap: 15px;
}
.config-aside {
  background-color: white;
  border-radius: 8px;
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
  padding: 15px;
  width: 400px;
  flex-shrink: 0;
  overflow-y: auto;
}
.monitor-main {
  background-color: white;
  border-radius: 8px;
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
  padding: 20px;
  flex: 1;
  overflow-y: auto;
}
.config-section {
  margin-bottom: 20px;
  border-radius: 6px;
  border: none;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
  transition: all 0.2s ease;
}
.config-section:hover {
  box-shadow: 0 3px 10px rgba(0, 0, 0, 0.08);
}
.config-section h3 {
  margin-top: 0;
  margin-bottom: 15px;
  font-size: 16px;
  color: #303133;
  border-bottom: 1px solid #f0f0f0;
  padding-bottom: 10px;
  display: flex;
  align-items: center;
}
.config-section h3 i {
  margin-right: 8px;
  color: #409EFF;
}
.full-width {
  width: 100%;
  margin-bottom: 10px;
}
.monitor-section {
  height: 100%;
}
.section-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 10px 0;
  margin-bottom: 20px;
  padding-bottom: 10px;
  border-bottom: 1px solid #f0f0f0;
}
.label {
.section-header h3 {
  margin: 0;
  font-size: 18px;
  color: #303133;
  display: flex;
  align-items: center;
}
.section-header h3 i {
  margin-right: 8px;
  color: #409EFF;
}
.section-actions {
  display: flex;
  gap: 10px;
}
.section-actions .el-button {
  transition: all 0.2s ease;
}
.section-actions .el-button:hover {
  transform: translateY(-2px);
}
.task-container, .result-container, .result-list {
  margin-bottom: 25px;
}
.task-container h4, .result-container h4, .result-list h4 {
  margin-bottom: 15px;
  font-size: 16px;
  color: #606266;
  font-weight: 500;
  display: flex;
  align-items: center;
}
.task-container h4::before,
.result-container h4::before,
.result-list h4::before {
  content: "";
  display: inline-block;
  width: 4px;
  height: 16px;
  background-color: #409EFF;
  margin-right: 8px;
  border-radius: 2px;
}
.task-list {
  display: flex;
  flex-wrap: wrap;
  gap: 15px;
}
.task-item {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 12px 15px;
  background-color: #f9fafc;
  border-radius: 6px;
  border-left: 4px solid #409EFF;
  width: calc(50% - 7.5px);
  box-sizing: border-box;
  cursor: pointer;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
  transition: all 0.2s ease;
}
.task-item:hover {
  background-color: #ecf5ff;
  transform: translateY(-2px);
  box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1);
}
.task-info {
  display: flex;
  align-items: center;
  gap: 15px;
  flex-wrap: wrap;
}
.task-id {
  font-weight: 500;
  color: #303133;
  min-width: 60px;
}
.task-module, .task-project {
  color: #606266;
  font-size: 14px;
  background-color: rgba(144, 147, 153, 0.1);
  padding: 2px 8px;
  border-radius: 4px;
}
.value {
.result-stats {
  display: flex;
  justify-content: space-between;
  margin-bottom: 15px;
  gap: 15px;
}
.stat-item {
  text-align: center;
  padding: 20px 15px;
  background-color: #f9fafc;
  border-radius: 6px;
  flex: 1;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
  transition: all 0.2s ease;
}
.stat-item:hover {
  transform: translateY(-3px);
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
.stat-number {
  font-size: 28px;
  font-weight: 600;
  font-size: 18px;
  margin-bottom: 8px;
  transition: all 0.3s ease;
}
.success {
  color: #67c23a;
.stat-item:hover .stat-number {
  transform: scale(1.05);
}
.error {
  color: #f56c6c;
.stat-number.pass {
  color: #67C23A;
}
.result-table-container {
  margin-top: 20px;
.stat-number.fail {
  color: #F56C6C;
}
.stat-label {
  font-size: 14px;
  color: #909399;
  text-transform: uppercase;
  letter-spacing: 0.5px;
}
.empty-state {
  padding: 40px 0;
  text-align: center;
  padding: 40px 20px;
  color: #909399;
  background-color: #f9fafc;
  border-radius: 6px;
}
.status-container {
.empty-icon {
  font-size: 48px;
  margin-bottom: 15px;
  color: #dcdfe6;
}
.empty-text {
  font-size: 16px;
}
/* å­—段管理样式 */
.field-container {
  max-height: 300px;
  overflow-y: auto;
  border: 1px solid #f0f0f0;
  border-radius: 6px;
}
.field-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 10px 15px;
  background-color: #f5f7fa;
  border-bottom: 1px solid #f0f0f0;
  font-weight: 500;
}
.add-btn {
  color: #409EFF;
  transition: all 0.2s;
}
.add-btn:hover {
  color: #66b1ff;
  background-color: rgba(64, 158, 255, 0.1);
}
.field-list {
  padding: 10px;
}
.field-item {
  display: flex;
  align-items: center;
  padding: 10px 8px;
  border-bottom: 1px solid #f5f5f5;
  transition: background-color 0.2s;
}
.field-item:last-child {
  border-bottom: none;
}
.field-item:hover {
  background-color: #f9fafc;
}
.field-address {
  display: flex;
  align-items: center;
  margin-left: auto;
  margin-right: 10px;
}
.field-address-label {
  width: 70px;
  text-align: right;
  margin-right: 8px;
  font-size: 12px;
  color: #909399;
}
.remove-btn {
  color: #ff4949;
  opacity: 0.7;
  transition: all 0.2s;
}
.remove-btn:hover {
  color: #ff4949;
  opacity: 1;
  background-color: rgba(255, 73, 73, 0.1);
}
/* æ‰¹é‡æµ‹è¯•弹窗样式 */
.batch-test-container {
  max-height: 500px;
  overflow-y: auto;
}
.status-actions {
  display: flex;
  gap: 10px;
.batch-actions {
  margin-bottom: 15px;
}
.batch-footer {
  margin-top: 20px;
  justify-content: flex-end;
  text-align: right;
}
.task-detail {
  max-height: 500px;
/* ä»»åŠ¡å¯¼å…¥å¼¹çª—æ ·å¼ */
.import-footer {
  margin-top: 20px;
  text-align: right;
}
/* ä»»åŠ¡è¯¦æƒ…å¼¹çª—æ ·å¼ */
.task-detail-container {
  max-height: 600px;
  overflow-y: auto;
  padding: 10px 0;
}
.detail-section {
  margin-bottom: 20px;
.task-timeline {
  margin-top: 20px;
  border-top: 1px solid #f0f0f0;
  padding-top: 15px;
}
.detail-section h4 {
  margin-bottom: 10px;
  color: #303133;
.task-timeline h4 {
  margin-bottom: 15px;
  font-size: 16px;
  color: #606266;
}
.dialog-footer {
  display: flex;
  justify-content: flex-end;
/* çŠ¶æ€å¼¹çª—æ ·å¼ */
.status-container {
  min-height: 200px;
}
/* è¡¨æ ¼æ ·å¼ä¼˜åŒ– */
.el-table {
  border-radius: 6px;
  overflow: hidden;
}
.el-table th {
  background-color: #f5f7fa;
  font-weight: 500;
}
.el-table--border th,
.el-table--border td {
  border-right: 1px solid #f0f0f0;
}
.el-table--border::after,
.el-table--group::after,
.el-table::before {
  background-color: #f0f0f0;
}
/* æ»šåŠ¨æ¡ç¾ŽåŒ– */
::-webkit-scrollbar {
  width: 8px;
  height: 8px;
}
::-webkit-scrollbar-track {
  background: #f1f1f1;
  border-radius: 4px;
}
::-webkit-scrollbar-thumb {
  background: #dcdfe6;
  border-radius: 4px;
}
::-webkit-scrollbar-thumb:hover {
  background: #c0c4cc;
}
</style>