classpath.txt
¶Ô±ÈÐÂÎļþ @@ -0,0 +1 @@ D:\Maven3.6.3\myRepository\com\github\xiaoymin\knife4j-openapi3-jakarta-spring-boot-starter\4.5.0\knife4j-openapi3-jakarta-spring-boot-starter-4.5.0.jar;D:\Maven3.6.3\myRepository\com\github\xiaoymin\knife4j-core\4.5.0\knife4j-core-4.5.0.jar;D:\Maven3.6.3\myRepository\com\github\xiaoymin\knife4j-openapi3-ui\4.5.0\knife4j-openapi3-ui-4.5.0.jar;D:\Maven3.6.3\myRepository\org\springdoc\springdoc-openapi-starter-webmvc-ui\2.8.17\springdoc-openapi-starter-webmvc-ui-2.8.17.jar;D:\Maven3.6.3\myRepository\org\springdoc\springdoc-openapi-starter-webmvc-api\2.8.17\springdoc-openapi-starter-webmvc-api-2.8.17.jar;D:\Maven3.6.3\myRepository\org\springdoc\springdoc-openapi-starter-common\2.8.17\springdoc-openapi-starter-common-2.8.17.jar;D:\Maven3.6.3\myRepository\io\swagger\core\v3\swagger-core-jakarta\2.2.47\swagger-core-jakarta-2.2.47.jar;D:\Maven3.6.3\myRepository\io\swagger\core\v3\swagger-annotations-jakarta\2.2.47\swagger-annotations-jakarta-2.2.47.jar;D:\Maven3.6.3\myRepository\io\swagger\core\v3\swagger-models-jakarta\2.2.47\swagger-models-jakarta-2.2.47.jar;D:\Maven3.6.3\myRepository\com\fasterxml\jackson\dataformat\jackson-dataformat-yaml\2.18.3\jackson-dataformat-yaml-2.18.3.jar;D:\Maven3.6.3\myRepository\org\webjars\swagger-ui\5.32.2\swagger-ui-5.32.2.jar;D:\Maven3.6.3\myRepository\org\webjars\webjars-locator-lite\1.1.3\webjars-locator-lite-1.1.3.jar;D:\Maven3.6.3\myRepository\org\jspecify\jspecify\1.0.0\jspecify-1.0.0.jar;D:\Maven3.6.3\myRepository\org\springframework\boot\spring-boot-starter\3.5.13\spring-boot-starter-3.5.13.jar;D:\Maven3.6.3\myRepository\org\springframework\boot\spring-boot\3.5.13\spring-boot-3.5.13.jar;D:\Maven3.6.3\myRepository\org\springframework\boot\spring-boot-autoconfigure\3.5.13\spring-boot-autoconfigure-3.5.13.jar;D:\Maven3.6.3\myRepository\org\springframework\boot\spring-boot-starter-logging\3.5.13\spring-boot-starter-logging-3.5.13.jar;D:\Maven3.6.3\myRepository\org\apache\logging\log4j\log4j-to-slf4j\2.24.3\log4j-to-slf4j-2.24.3.jar;D:\Maven3.6.3\myRepository\org\slf4j\jul-to-slf4j\2.0.17\jul-to-slf4j-2.0.17.jar;D:\Maven3.6.3\myRepository\jakarta\annotation\jakarta.annotation-api\2.1.1\jakarta.annotation-api-2.1.1.jar;D:\Maven3.6.3\myRepository\org\springframework\spring-core\6.2.17\spring-core-6.2.17.jar;D:\Maven3.6.3\myRepository\org\springframework\spring-jcl\6.2.17\spring-jcl-6.2.17.jar;D:\Maven3.6.3\myRepository\org\yaml\snakeyaml\2.4\snakeyaml-2.4.jar;D:\Maven3.6.3\myRepository\org\springframework\boot\spring-boot-starter-aop\3.5.13\spring-boot-starter-aop-3.5.13.jar;D:\Maven3.6.3\myRepository\org\springframework\spring-aop\6.2.17\spring-aop-6.2.17.jar;D:\Maven3.6.3\myRepository\org\aspectj\aspectjweaver\1.9.25.1\aspectjweaver-1.9.25.1.jar;D:\Maven3.6.3\myRepository\org\springframework\boot\spring-boot-starter-web\3.5.13\spring-boot-starter-web-3.5.13.jar;D:\Maven3.6.3\myRepository\org\springframework\boot\spring-boot-starter-json\3.5.13\spring-boot-starter-json-3.5.13.jar;D:\Maven3.6.3\myRepository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.18.3\jackson-datatype-jdk8-2.18.3.jar;D:\Maven3.6.3\myRepository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.18.3\jackson-module-parameter-names-2.18.3.jar;D:\Maven3.6.3\myRepository\org\springframework\boot\spring-boot-starter-tomcat\3.5.13\spring-boot-starter-tomcat-3.5.13.jar;D:\Maven3.6.3\myRepository\org\apache\tomcat\embed\tomcat-embed-core\10.1.53\tomcat-embed-core-10.1.53.jar;D:\Maven3.6.3\myRepository\org\apache\tomcat\embed\tomcat-embed-websocket\10.1.53\tomcat-embed-websocket-10.1.53.jar;D:\Maven3.6.3\myRepository\org\springframework\spring-web\6.2.17\spring-web-6.2.17.jar;D:\Maven3.6.3\myRepository\io\micrometer\micrometer-observation\1.15.10\micrometer-observation-1.15.10.jar;D:\Maven3.6.3\myRepository\io\micrometer\micrometer-commons\1.15.10\micrometer-commons-1.15.10.jar;D:\Maven3.6.3\myRepository\org\springframework\spring-webmvc\6.2.17\spring-webmvc-6.2.17.jar;D:\Maven3.6.3\myRepository\org\springframework\spring-expression\6.2.17\spring-expression-6.2.17.jar;D:\Maven3.6.3\myRepository\org\springframework\boot\spring-boot-devtools\3.5.13\spring-boot-devtools-3.5.13.jar;D:\Maven3.6.3\myRepository\org\springframework\boot\spring-boot-starter-security\3.5.13\spring-boot-starter-security-3.5.13.jar;D:\Maven3.6.3\myRepository\org\springframework\security\spring-security-config\6.5.9\spring-security-config-6.5.9.jar;D:\Maven3.6.3\myRepository\org\springframework\security\spring-security-core\6.5.9\spring-security-core-6.5.9.jar;D:\Maven3.6.3\myRepository\org\springframework\security\spring-security-crypto\6.5.9\spring-security-crypto-6.5.9.jar;D:\Maven3.6.3\myRepository\org\springframework\security\spring-security-web\6.5.9\spring-security-web-6.5.9.jar;D:\Maven3.6.3\myRepository\org\springframework\boot\spring-boot-starter-data-redis\3.5.13\spring-boot-starter-data-redis-3.5.13.jar;D:\Maven3.6.3\myRepository\io\lettuce\lettuce-core\6.6.0.RELEASE\lettuce-core-6.6.0.RELEASE.jar;D:\Maven3.6.3\myRepository\redis\clients\authentication\redis-authx-core\0.1.1-beta2\redis-authx-core-0.1.1-beta2.jar;D:\Maven3.6.3\myRepository\io\netty\netty-common\4.1.119.Final\netty-common-4.1.119.Final.jar;D:\Maven3.6.3\myRepository\io\netty\netty-handler\4.1.119.Final\netty-handler-4.1.119.Final.jar;D:\Maven3.6.3\myRepository\io\netty\netty-resolver\4.1.119.Final\netty-resolver-4.1.119.Final.jar;D:\Maven3.6.3\myRepository\io\netty\netty-buffer\4.1.119.Final\netty-buffer-4.1.119.Final.jar;D:\Maven3.6.3\myRepository\io\netty\netty-transport-native-unix-common\4.1.119.Final\netty-transport-native-unix-common-4.1.119.Final.jar;D:\Maven3.6.3\myRepository\io\netty\netty-codec\4.1.119.Final\netty-codec-4.1.119.Final.jar;D:\Maven3.6.3\myRepository\io\netty\netty-transport\4.1.119.Final\netty-transport-4.1.119.Final.jar;D:\Maven3.6.3\myRepository\org\springframework\data\spring-data-redis\3.5.10\spring-data-redis-3.5.10.jar;D:\Maven3.6.3\myRepository\org\springframework\data\spring-data-keyvalue\3.5.10\spring-data-keyvalue-3.5.10.jar;D:\Maven3.6.3\myRepository\org\springframework\spring-tx\6.2.17\spring-tx-6.2.17.jar;D:\Maven3.6.3\myRepository\org\springframework\spring-oxm\6.2.17\spring-oxm-6.2.17.jar;D:\Maven3.6.3\myRepository\org\springframework\boot\spring-boot-starter-data-mongodb\3.5.13\spring-boot-starter-data-mongodb-3.5.13.jar;D:\Maven3.6.3\myRepository\org\mongodb\mongodb-driver-sync\5.5.2\mongodb-driver-sync-5.5.2.jar;D:\Maven3.6.3\myRepository\org\mongodb\bson\5.5.2\bson-5.5.2.jar;D:\Maven3.6.3\myRepository\org\mongodb\mongodb-driver-core\5.5.2\mongodb-driver-core-5.5.2.jar;D:\Maven3.6.3\myRepository\org\springframework\data\spring-data-mongodb\4.5.10\spring-data-mongodb-4.5.10.jar;D:\Maven3.6.3\myRepository\org\springframework\data\spring-data-commons\3.5.10\spring-data-commons-3.5.10.jar;D:\Maven3.6.3\myRepository\org\apache\commons\commons-pool2\2.12.1\commons-pool2-2.12.1.jar;D:\Maven3.6.3\myRepository\dev\langchain4j\langchain4j-spring-boot-starter\1.0.0-beta3\langchain4j-spring-boot-starter-1.0.0-beta3.jar;D:\Maven3.6.3\myRepository\dev\langchain4j\langchain4j\1.0.0-beta3\langchain4j-1.0.0-beta3.jar;D:\Maven3.6.3\myRepository\org\apache\opennlp\opennlp-tools\1.9.4\opennlp-tools-1.9.4.jar;D:\Maven3.6.3\myRepository\dev\langchain4j\langchain4j-pinecone\1.0.0-beta3\langchain4j-pinecone-1.0.0-beta3.jar;D:\Maven3.6.3\myRepository\dev\langchain4j\langchain4j-core\1.0.0-beta3\langchain4j-core-1.0.0-beta3.jar;D:\Maven3.6.3\myRepository\io\pinecone\pinecone-client\3.1.0\pinecone-client-3.1.0.jar;D:\Maven3.6.3\myRepository\io\grpc\grpc-protobuf\1.60.2\grpc-protobuf-1.60.2.jar;D:\Maven3.6.3\myRepository\io\grpc\grpc-api\1.60.2\grpc-api-1.60.2.jar;D:\Maven3.6.3\myRepository\io\grpc\grpc-protobuf-lite\1.60.2\grpc-protobuf-lite-1.60.2.jar;D:\Maven3.6.3\myRepository\io\grpc\grpc-stub\1.60.2\grpc-stub-1.60.2.jar;D:\Maven3.6.3\myRepository\io\grpc\grpc-netty\1.60.2\grpc-netty-1.60.2.jar;D:\Maven3.6.3\myRepository\io\grpc\grpc-core\1.60.2\grpc-core-1.60.2.jar;D:\Maven3.6.3\myRepository\io\netty\netty-codec-http2\4.1.119.Final\netty-codec-http2-4.1.119.Final.jar;D:\Maven3.6.3\myRepository\io\netty\netty-codec-http\4.1.119.Final\netty-codec-http-4.1.119.Final.jar;D:\Maven3.6.3\myRepository\com\google\api\grpc\proto-google-common-protos\2.14.3\proto-google-common-protos-2.14.3.jar;D:\Maven3.6.3\myRepository\com\squareup\okhttp3\logging-interceptor\4.12.0\logging-interceptor-4.12.0.jar;D:\Maven3.6.3\myRepository\com\google\protobuf\protobuf-java\3.25.2\protobuf-java-3.25.2.jar;D:\Maven3.6.3\myRepository\dev\langchain4j\langchain4j-open-ai-spring-boot-starter\1.0.0-beta3\langchain4j-open-ai-spring-boot-starter-1.0.0-beta3.jar;D:\Maven3.6.3\myRepository\dev\langchain4j\langchain4j-open-ai\1.0.0-beta3\langchain4j-open-ai-1.0.0-beta3.jar;D:\Maven3.6.3\myRepository\com\knuddels\jtokkit\1.1.0\jtokkit-1.1.0.jar;D:\Maven3.6.3\myRepository\dev\langchain4j\langchain4j-http-client-spring-restclient\1.0.0-beta3\langchain4j-http-client-spring-restclient-1.0.0-beta3.jar;D:\Maven3.6.3\myRepository\dev\langchain4j\langchain4j-http-client\1.0.0-beta3\langchain4j-http-client-1.0.0-beta3.jar;D:\Maven3.6.3\myRepository\dev\langchain4j\langchain4j-reactor\1.0.0-beta3\langchain4j-reactor-1.0.0-beta3.jar;D:\Maven3.6.3\myRepository\io\projectreactor\reactor-core\3.7.3\reactor-core-3.7.3.jar;D:\Maven3.6.3\myRepository\org\reactivestreams\reactive-streams\1.0.4\reactive-streams-1.0.4.jar;D:\Maven3.6.3\myRepository\dev\langchain4j\langchain4j-ollama-spring-boot-starter\1.0.0-beta3\langchain4j-ollama-spring-boot-starter-1.0.0-beta3.jar;D:\Maven3.6.3\myRepository\dev\langchain4j\langchain4j-ollama\1.0.0-beta3\langchain4j-ollama-1.0.0-beta3.jar;D:\Maven3.6.3\myRepository\dev\langchain4j\langchain4j-community-dashscope-spring-boot-starter\1.0.0-beta3\langchain4j-community-dashscope-spring-boot-starter-1.0.0-beta3.jar;D:\Maven3.6.3\myRepository\dev\langchain4j\langchain4j-community-dashscope\1.0.0-beta3\langchain4j-community-dashscope-1.0.0-beta3.jar;D:\Maven3.6.3\myRepository\com\alibaba\dashscope-sdk-java\2.18.5\dashscope-sdk-java-2.18.5.jar;D:\Maven3.6.3\myRepository\io\reactivex\rxjava2\rxjava\2.2.21\rxjava-2.2.21.jar;D:\Maven3.6.3\myRepository\com\github\victools\jsonschema-generator\4.31.1\jsonschema-generator-4.31.1.jar;D:\Maven3.6.3\myRepository\ch\qos\logback\logback-classic\1.5.32\logback-classic-1.5.32.jar;D:\Maven3.6.3\myRepository\ch\qos\logback\logback-core\1.5.32\logback-core-1.5.32.jar;D:\Maven3.6.3\myRepository\dev\langchain4j\langchain4j-mcp\1.0.0-beta3\langchain4j-mcp-1.0.0-beta3.jar;D:\Maven3.6.3\myRepository\com\fasterxml\jackson\core\jackson-databind\2.18.3\jackson-databind-2.18.3.jar;D:\Maven3.6.3\myRepository\com\squareup\okhttp3\okhttp-sse\4.12.0\okhttp-sse-4.12.0.jar;D:\Maven3.6.3\myRepository\org\jetbrains\kotlin\kotlin-stdlib-jdk8\1.9.25\kotlin-stdlib-jdk8-1.9.25.jar;D:\Maven3.6.3\myRepository\org\jetbrains\kotlin\kotlin-stdlib-jdk7\1.9.25\kotlin-stdlib-jdk7-1.9.25.jar;D:\Maven3.6.3\myRepository\org\freemarker\freemarker\2.3.33\freemarker-2.3.33.jar;D:\Maven3.6.3\myRepository\com\github\pagehelper\pagehelper-spring-boot-starter\2.1.1\pagehelper-spring-boot-starter-2.1.1.jar;D:\Maven3.6.3\myRepository\org\mybatis\spring\boot\mybatis-spring-boot-starter\2.3.2\mybatis-spring-boot-starter-2.3.2.jar;D:\Maven3.6.3\myRepository\org\mybatis\spring\boot\mybatis-spring-boot-autoconfigure\2.3.2\mybatis-spring-boot-autoconfigure-2.3.2.jar;D:\Maven3.6.3\myRepository\com\github\pagehelper\pagehelper-spring-boot-autoconfigure\2.1.1\pagehelper-spring-boot-autoconfigure-2.1.1.jar;D:\Maven3.6.3\myRepository\com\github\pagehelper\pagehelper\6.1.1\pagehelper-6.1.1.jar;D:\Maven3.6.3\myRepository\com\alibaba\druid-spring-boot-3-starter\1.2.23\druid-spring-boot-3-starter-1.2.23.jar;D:\Maven3.6.3\myRepository\com\alibaba\druid\1.2.23\druid-1.2.23.jar;D:\Maven3.6.3\myRepository\org\slf4j\slf4j-api\2.0.17\slf4j-api-2.0.17.jar;D:\Maven3.6.3\myRepository\org\mybatis\mybatis\3.5.16\mybatis-3.5.16.jar;D:\Maven3.6.3\myRepository\com\baomidou\mybatis-plus-spring-boot3-starter\3.5.16\mybatis-plus-spring-boot3-starter-3.5.16.jar;D:\Maven3.6.3\myRepository\com\baomidou\mybatis-plus\3.5.16\mybatis-plus-3.5.16.jar;D:\Maven3.6.3\myRepository\com\baomidou\mybatis-plus-core\3.5.16\mybatis-plus-core-3.5.16.jar;D:\Maven3.6.3\myRepository\com\baomidou\mybatis-plus-annotation\3.5.16\mybatis-plus-annotation-3.5.16.jar;D:\Maven3.6.3\myRepository\com\baomidou\mybatis-plus-spring\3.5.16\mybatis-plus-spring-3.5.16.jar;D:\Maven3.6.3\myRepository\org\mybatis\mybatis-spring\3.0.5\mybatis-spring-3.0.5.jar;D:\Maven3.6.3\myRepository\com\baomidou\mybatis-plus-spring-boot-autoconfigure\3.5.16\mybatis-plus-spring-boot-autoconfigure-3.5.16.jar;D:\Maven3.6.3\myRepository\org\springframework\boot\spring-boot-starter-jdbc\3.5.13\spring-boot-starter-jdbc-3.5.13.jar;D:\Maven3.6.3\myRepository\com\zaxxer\HikariCP\6.3.3\HikariCP-6.3.3.jar;D:\Maven3.6.3\myRepository\org\springframework\spring-jdbc\6.2.17\spring-jdbc-6.2.17.jar;D:\Maven3.6.3\myRepository\com\baomidou\mybatis-plus-jsqlparser\3.5.16\mybatis-plus-jsqlparser-3.5.16.jar;D:\Maven3.6.3\myRepository\com\baomidou\mybatis-plus-jsqlparser-common\3.5.16\mybatis-plus-jsqlparser-common-3.5.16.jar;D:\Maven3.6.3\myRepository\com\baomidou\mybatis-plus-extension\3.5.16\mybatis-plus-extension-3.5.16.jar;D:\Maven3.6.3\myRepository\com\baomidou\mybatis-plus-generator\3.5.16\mybatis-plus-generator-3.5.16.jar;D:\Maven3.6.3\myRepository\com\github\jsqlparser\jsqlparser\4.9\jsqlparser-4.9.jar;D:\Maven3.6.3\myRepository\org\springframework\boot\spring-boot-starter-validation\3.5.13\spring-boot-starter-validation-3.5.13.jar;D:\Maven3.6.3\myRepository\org\apache\tomcat\embed\tomcat-embed-el\10.1.53\tomcat-embed-el-10.1.53.jar;D:\Maven3.6.3\myRepository\org\hibernate\validator\hibernate-validator\8.0.3.Final\hibernate-validator-8.0.3.Final.jar;D:\Maven3.6.3\myRepository\jakarta\validation\jakarta.validation-api\3.0.2\jakarta.validation-api-3.0.2.jar;D:\Maven3.6.3\myRepository\org\jboss\logging\jboss-logging\3.6.3.Final\jboss-logging-3.6.3.Final.jar;D:\Maven3.6.3\myRepository\com\fasterxml\classmate\1.7.3\classmate-1.7.3.jar;D:\Maven3.6.3\myRepository\org\apache\commons\commons-lang3\3.17.0\commons-lang3-3.17.0.jar;D:\Maven3.6.3\myRepository\commons-io\commons-io\2.13.0\commons-io-2.13.0.jar;D:\Maven3.6.3\myRepository\eu\bitwalker\UserAgentUtils\1.21\UserAgentUtils-1.21.jar;D:\Maven3.6.3\myRepository\com\alibaba\fastjson2\fastjson2\2.0.53\fastjson2-2.0.53.jar;D:\Maven3.6.3\myRepository\org\springframework\spring-context-support\6.2.17\spring-context-support-6.2.17.jar;D:\Maven3.6.3\myRepository\org\springframework\spring-beans\6.2.17\spring-beans-6.2.17.jar;D:\Maven3.6.3\myRepository\org\springframework\spring-context\6.2.17\spring-context-6.2.17.jar;D:\Maven3.6.3\myRepository\io\jsonwebtoken\jjwt-api\0.13.0\jjwt-api-0.13.0.jar;D:\Maven3.6.3\myRepository\jakarta\xml\bind\jakarta.xml.bind-api\4.0.4\jakarta.xml.bind-api-4.0.4.jar;D:\Maven3.6.3\myRepository\jakarta\activation\jakarta.activation-api\2.1.4\jakarta.activation-api-2.1.4.jar;D:\Maven3.6.3\myRepository\io\swagger\swagger-annotations\1.6.15\swagger-annotations-1.6.15.jar;D:\Maven3.6.3\myRepository\com\github\oshi\oshi-core\6.6.5\oshi-core-6.6.5.jar;D:\Maven3.6.3\myRepository\net\java\dev\jna\jna\5.15.0\jna-5.15.0.jar;D:\Maven3.6.3\myRepository\net\java\dev\jna\jna-platform\5.15.0\jna-platform-5.15.0.jar;D:\Maven3.6.3\myRepository\org\apache\poi\poi-ooxml\5.2.3\poi-ooxml-5.2.3.jar;D:\Maven3.6.3\myRepository\org\apache\poi\poi\5.2.3\poi-5.2.3.jar;D:\Maven3.6.3\myRepository\commons-codec\commons-codec\1.18.0\commons-codec-1.18.0.jar;D:\Maven3.6.3\myRepository\org\apache\commons\commons-math3\3.6.1\commons-math3-3.6.1.jar;D:\Maven3.6.3\myRepository\com\zaxxer\SparseBitSet\1.2\SparseBitSet-1.2.jar;D:\Maven3.6.3\myRepository\org\apache\poi\poi-ooxml-lite\5.2.3\poi-ooxml-lite-5.2.3.jar;D:\Maven3.6.3\myRepository\org\apache\xmlbeans\xmlbeans\5.1.1\xmlbeans-5.1.1.jar;D:\Maven3.6.3\myRepository\org\apache\commons\commons-compress\1.21\commons-compress-1.21.jar;D:\Maven3.6.3\myRepository\com\github\virtuald\curvesapi\1.07\curvesapi-1.07.jar;D:\Maven3.6.3\myRepository\org\apache\logging\log4j\log4j-api\2.24.3\log4j-api-2.24.3.jar;D:\Maven3.6.3\myRepository\org\apache\commons\commons-collections4\4.4\commons-collections4-4.4.jar;D:\Maven3.6.3\myRepository\org\apache\velocity\velocity-engine-core\2.3\velocity-engine-core-2.3.jar;D:\Maven3.6.3\myRepository\org\quartz-scheduler\quartz\2.5.2\quartz-2.5.2.jar;D:\Maven3.6.3\myRepository\pro\fessional\kaptcha\2.3.3\kaptcha-2.3.3.jar;D:\Maven3.6.3\myRepository\com\jhlabs\filters\2.0.235-1\filters-2.0.235-1.jar;D:\Maven3.6.3\myRepository\org\projectlombok\lombok\1.18.44\lombok-1.18.44.jar;D:\Maven3.6.3\myRepository\io\minio\minio\8.4.3\minio-8.4.3.jar;D:\Maven3.6.3\myRepository\com\carrotsearch\thirdparty\simple-xml-safe\2.7.1\simple-xml-safe-2.7.1.jar;D:\Maven3.6.3\myRepository\com\google\guava\guava\30.1.1-jre\guava-30.1.1-jre.jar;D:\Maven3.6.3\myRepository\com\google\guava\failureaccess\1.0.1\failureaccess-1.0.1.jar;D:\Maven3.6.3\myRepository\com\google\guava\listenablefuture\9999.0-empty-to-avoid-conflict-with-guava\listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar;D:\Maven3.6.3\myRepository\com\google\code\findbugs\jsr305\3.0.2\jsr305-3.0.2.jar;D:\Maven3.6.3\myRepository\org\checkerframework\checker-qual\3.8.0\checker-qual-3.8.0.jar;D:\Maven3.6.3\myRepository\com\google\errorprone\error_prone_annotations\2.5.1\error_prone_annotations-2.5.1.jar;D:\Maven3.6.3\myRepository\com\google\j2objc\j2objc-annotations\1.3\j2objc-annotations-1.3.jar;D:\Maven3.6.3\myRepository\com\fasterxml\jackson\core\jackson-annotations\2.18.3\jackson-annotations-2.18.3.jar;D:\Maven3.6.3\myRepository\com\fasterxml\jackson\core\jackson-core\2.18.3\jackson-core-2.18.3.jar;D:\Maven3.6.3\myRepository\org\bouncycastle\bcprov-jdk15on\1.69\bcprov-jdk15on-1.69.jar;D:\Maven3.6.3\myRepository\org\xerial\snappy\snappy-java\1.1.8.4\snappy-java-1.1.8.4.jar;D:\Maven3.6.3\myRepository\com\squareup\okhttp3\okhttp\4.9.0\okhttp-4.9.0.jar;D:\Maven3.6.3\myRepository\com\squareup\okio\okio\2.8.0\okio-2.8.0.jar;D:\Maven3.6.3\myRepository\org\jetbrains\kotlin\kotlin-stdlib-common\1.9.25\kotlin-stdlib-common-1.9.25.jar;D:\Maven3.6.3\myRepository\org\jetbrains\kotlin\kotlin-stdlib\1.9.25\kotlin-stdlib-1.9.25.jar;D:\Maven3.6.3\myRepository\org\jetbrains\annotations\13.0\annotations-13.0.jar;D:\Maven3.6.3\myRepository\com\deepoove\poi-tl\1.12.2\poi-tl-1.12.2.jar;D:\Maven3.6.3\myRepository\org\apache\xmlgraphics\batik-transcoder\1.17\batik-transcoder-1.17.jar;D:\Maven3.6.3\myRepository\org\apache\xmlgraphics\batik-anim\1.17\batik-anim-1.17.jar;D:\Maven3.6.3\myRepository\org\apache\xmlgraphics\batik-css\1.17\batik-css-1.17.jar;D:\Maven3.6.3\myRepository\org\apache\xmlgraphics\batik-ext\1.17\batik-ext-1.17.jar;D:\Maven3.6.3\myRepository\org\apache\xmlgraphics\batik-parser\1.17\batik-parser-1.17.jar;D:\Maven3.6.3\myRepository\org\apache\xmlgraphics\batik-svg-dom\1.17\batik-svg-dom-1.17.jar;D:\Maven3.6.3\myRepository\org\apache\xmlgraphics\batik-awt-util\1.17\batik-awt-util-1.17.jar;D:\Maven3.6.3\myRepository\org\apache\xmlgraphics\xmlgraphics-commons\2.9\xmlgraphics-commons-2.9.jar;D:\Maven3.6.3\myRepository\org\apache\xmlgraphics\batik-bridge\1.17\batik-bridge-1.17.jar;D:\Maven3.6.3\myRepository\org\apache\xmlgraphics\batik-script\1.17\batik-script-1.17.jar;D:\Maven3.6.3\myRepository\org\apache\xmlgraphics\batik-dom\1.17\batik-dom-1.17.jar;D:\Maven3.6.3\myRepository\xml-apis\xml-apis\1.4.01\xml-apis-1.4.01.jar;D:\Maven3.6.3\myRepository\org\apache\xmlgraphics\batik-gvt\1.17\batik-gvt-1.17.jar;D:\Maven3.6.3\myRepository\org\apache\xmlgraphics\batik-shared-resources\1.17\batik-shared-resources-1.17.jar;D:\Maven3.6.3\myRepository\org\apache\xmlgraphics\batik-svggen\1.17\batik-svggen-1.17.jar;D:\Maven3.6.3\myRepository\org\apache\xmlgraphics\batik-util\1.17\batik-util-1.17.jar;D:\Maven3.6.3\myRepository\org\apache\xmlgraphics\batik-constants\1.17\batik-constants-1.17.jar;D:\Maven3.6.3\myRepository\org\apache\xmlgraphics\batik-i18n\1.17\batik-i18n-1.17.jar;D:\Maven3.6.3\myRepository\org\apache\xmlgraphics\batik-xml\1.17\batik-xml-1.17.jar;D:\Maven3.6.3\myRepository\xml-apis\xml-apis-ext\1.3.04\xml-apis-ext-1.3.04.jar;D:\Maven3.6.3\myRepository\org\apache\xmlgraphics\batik-codec\1.17\batik-codec-1.17.jar;D:\Maven3.6.3\myRepository\com\alibaba\easyexcel\4.0.3\easyexcel-4.0.3.jar;D:\Maven3.6.3\myRepository\com\alibaba\easyexcel-core\4.0.3\easyexcel-core-4.0.3.jar;D:\Maven3.6.3\myRepository\com\alibaba\easyexcel-support\3.3.4\easyexcel-support-3.3.4.jar;D:\Maven3.6.3\myRepository\org\apache\commons\commons-csv\1.11.0\commons-csv-1.11.0.jar;D:\Maven3.6.3\myRepository\org\ehcache\ehcache\3.10.9\ehcache-3.10.9.jar;D:\Maven3.6.3\myRepository\javax\cache\cache-api\1.1.1\cache-api-1.1.1.jar;D:\Maven3.6.3\myRepository\com\google\zxing\core\3.3.3\core-3.3.3.jar;D:\Maven3.6.3\myRepository\com\getui\push\restful-sdk\1.0.7.0\restful-sdk-1.0.7.0.jar;D:\Maven3.6.3\myRepository\org\apache\httpcomponents\httpclient\4.5.13\httpclient-4.5.13.jar;D:\Maven3.6.3\myRepository\org\apache\httpcomponents\httpcore\4.4.16\httpcore-4.4.16.jar;D:\Maven3.6.3\myRepository\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;D:\Maven3.6.3\myRepository\com\google\code\gson\gson\2.13.2\gson-2.13.2.jar;D:\Maven3.6.3\myRepository\cn\hutool\hutool-all\5.8.43\hutool-all-5.8.43.jar;D:\Maven3.6.3\myRepository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.18.3\jackson-datatype-jsr310-2.18.3.jar;D:\Maven3.6.3\myRepository\net\coobird\thumbnailator\0.4.20\thumbnailator-0.4.20.jar doc/20260602_device_maintenance_acceptance.sql
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,9 @@ -- 设å¤ä¿å »è¡¨æ°å¢éªæ¶äººç¸å ³å段 ALTER TABLE `device_maintenance` ADD COLUMN `acceptance_name` VARCHAR(100) NULL COMMENT 'éªæ¶äºº' AFTER `spare_parts_ids`, ADD COLUMN `acceptance_time` DATETIME NULL COMMENT 'éªæ¶æ¶é´' AFTER `acceptance_name`, ADD COLUMN `acceptance_remark` VARCHAR(500) NULL COMMENT 'éªæ¶å¤æ³¨' AFTER `acceptance_time`; -- 设å¤ä¿å »å®æ¶ä»»å¡è¡¨æ°å¢æ¯å¦å¯ç¨å段 ALTER TABLE `maintenance_task` ADD COLUMN `is_enabled` TINYINT(1) NULL DEFAULT 1 COMMENT 'æ¯å¦å¯ç¨ 0-ç¦ç¨ 1-å¯ç¨' AFTER `is_active`; doc/ǰ¶ËÁªµ÷Îĵµ-É豸±£ÑøÑéÊÕÈ˹¦ÄÜ.md
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,232 @@ # å端èè°ææ¡£ - 设å¤ä¿å »éªæ¶äººåè½ ## 1. åæ´æ¦è¿° æ¬æ¬¡åæ´æ¶å设å¤ä¿å »æ¨¡åæ°å¢éªæ¶å®¡æ¹æµç¨ï¼ä¸è®¾å¤æ¥ä¿®éªæ¶æµç¨ä¿æä¸è´ï¼ - 设å¤ä¿å »ç¡®è®¤åæ°å¢éªæ¶å®¡æ¹ç¯è - éªæ¶éè¿åæç®å®ç» - æ°å¢éªæ¶äººãéªæ¶æ¶é´ãéªæ¶å¤æ³¨å段 --- ## 2. æ¥å£æ¸ å ### 2.1 设å¤ä¿å » åºç¡è·¯å¾ï¼`/device/maintenance` #### ç¶æå®ä¹ | ç¶æå¼ | å«ä¹ | |---|---| | `0` | å¾ ä¿å » | | `3` | å¾ éªæ¶ | | `1` | å®ç» | | `2` | 失败 | --- ### 2.2 确认ä¿å »ï¼æ°å¢ï¼ - **POST** `/device/maintenance/maintenance` - 说æï¼æäº¤åç¶æä» `å¾ ä¿å »(0)` è¿å ¥ `å¾ éªæ¶(3)`ï¼ä¸åç´æ¥å®ç»ã #### 请æ±åæ°ï¼Bodyï¼ | åæ®µ | ç±»å | å¿ å¡« | 说æ | |---|---|---|---| | `id` | long | æ¯ | ä¿å »è®°å½ID | | `maintenanceActuallyName` | string | å¦ | å®é ä¿å »äºº | | `maintenanceActuallyTime` | string | å¦ | å®é ä¿å »æ¶é´ï¼æ ¼å¼ `yyyy-MM-dd HH:mm:ss` | | `maintenanceResult` | string | å¦ | ä¿å »ç»æ 0-ç»´ä¿® 1-å®å¥½ | | `sparePartsUseList` | array | å¦ | 使ç¨å¤ä»¶å表 | #### 请æ±ç¤ºä¾ ```json { "id": 10001, "maintenanceActuallyName": "å¼ ä¸", "maintenanceActuallyTime": "2026-06-02 10:30:00", "maintenanceResult": "1", "sparePartsUseList": [ { "id": 501, "quantity": 2 } ] } ``` #### 常è§å¤±è´¥æç¤º - `ä¿å »è®°å½ä¸åå¨` - `该ä¿å »å·²å®ç»ï¼ä¸è½éå¤ç¡®è®¤ä¿å »` - `该ä¿å »å·²æäº¤éªæ¶å®¡æ¹` - `å¤ä»¶ xxx æ°éä¸è¶³` --- ### 2.3 éªæ¶å®¡æ¹ï¼æ°å¢ï¼ - **POST** `/device/maintenance/acceptance` - 说æï¼ä» `å¾ éªæ¶(3)` å¯å®¡æ¹ï¼å®¡æ¹éè¿åç¶ææ¹ä¸º `å®ç»(1)`ã #### 请æ±åæ°ï¼Bodyï¼ | åæ®µ | ç±»å | å¿ å¡« | 说æ | |---|---|---|---| | `id` | long | æ¯ | ä¿å »è®°å½ID | | `acceptanceName` | string | æ¯ | éªæ¶äºº | | `acceptanceTime` | string | æ¯ | éªæ¶æ¶é´ï¼æ ¼å¼ `yyyy-MM-dd HH:mm:ss` | | `acceptanceRemark` | string | æ¯ | éªæ¶å¤æ³¨ | #### 请æ±ç¤ºä¾ ```json { "id": 10001, "acceptanceName": "æå", "acceptanceTime": "2026-06-02 11:00:00", "acceptanceRemark": "ä¿å »é¡¹æ ¸éªéè¿ï¼è®¾å¤è¿è¡æ£å¸¸" } ``` #### 常è§å¤±è´¥æç¤º - `ä¿å »è®°å½idä¸è½ä¸ºç©º` - `ä¿å »è®°å½ä¸åå¨` - `该ä¿å »æªè¿å ¥å¾ éªæ¶ç¶æï¼ä¸è½å®¡æ¹` - `éªæ¶äººä¸è½ä¸ºç©º` - `éªæ¶æ¶é´ä¸è½ä¸ºç©º` - `éªæ¶å¤æ³¨ä¸è½ä¸ºç©º` --- ### 2.4 æ®éæ´æ°æ¥å£éå¶ - **PUT** `/device/maintenance` - éå¶ï¼ä¸è½éè¿æ®éæ´æ°ç´æ¥æç¶ææ¹æ `å®ç»(1)`ï¼å¿ é¡»èµ°éªæ¶å®¡æ¹æ¥å£ï¼ã - 失败æç¤ºï¼`è¯·å æäº¤éªæ¶å®¡æ¹ï¼éªæ¶éè¿åæå¯å®ç»` --- ## 3. è¿ååæ®µåæ´ ä»¥ä¸æ¥å£è¿åå·²æ°å¢éªæ¶åæ®µï¼ - **GET** `/device/maintenance/page` - **GET** `/device/maintenance/{id}` ### æ°å¢è¿ååæ®µ | åæ®µ | ç±»å | 说æ | |---|---|---| | `acceptanceName` | string | éªæ¶äºº | | `acceptanceTime` | string | éªæ¶æ¶é´ï¼æ ¼å¼ `yyyy-MM-dd HH:mm:ss` | | `acceptanceRemark` | string | éªæ¶å¤æ³¨ | --- ## 4. è®¾å¤æ¥ä¿®éªæ¶æµç¨ï¼åèï¼ è®¾å¤æ¥ä¿®æ¨¡åå·²æç¸åé»è¾ï¼å¯åèå®ç°ï¼ | ç¶æå¼ | å«ä¹ | |---|---| | `0` | å¾ ç»´ä¿® | | `3` | å¾ éªæ¶ | | `1` | å®ç» | | `2` | 失败 | ### æ¥ä¿®ç¸å ³æ¥å£ | æ¥å£ | 说æ | |---|---| | **POST** `/device/repair/repair` | 确认维修ï¼ç¶æ 0â3 | | **POST** `/device/repair/acceptance` | éªæ¶å®¡æ¹ï¼ç¶æ 3â1 | ### æ¥ä¿®éªæ¶è¯·æ±ç¤ºä¾ ```json { "id": 10001, "acceptanceName": "çäº", "acceptanceTime": "2026-05-14 11:00:00", "acceptanceRemark": "ç»´ä¿®é¡¹æ ¸éªéè¿ï¼è®¾å¤è¿è¡æ£å¸¸" } ``` --- ## 5. å端æ¹é 建议 ### 5.1 设å¤ä¿å »é¡µé¢ 1. å表å¢å ç¶æå¼ `3=å¾ éªæ¶` çå±ç¤ºææ¡ä¸çé项ã 2. "确认ä¿å »"æé®è°ç¨ `/device/maintenance/maintenance`ï¼æååå·æ°ä¸ºå¾ éªæ¶ç¶æã 3. æ°å¢"éªæ¶å®¡æ¹"å¼¹çªï¼å¿ å¡«ï¼ - éªæ¶äºº - éªæ¶æ¶é´ - éªæ¶å¤æ³¨ 4. ç¦æ¢å¨æ®éç¼è¾é¡µç´æ¥å°ç¶æç½®ä¸ºå®ç»ã ### 5.2 è®¾å¤æ¥ä¿®é¡µé¢ å·²æéªæ¶æµç¨ï¼ç¡®è®¤é»è¾ä¸ä¿å »ä¸è´ï¼ - ç¶ææµè½¬ï¼`0å¾ ç»´ä¿® -> 3å¾ éªæ¶ -> 1å®ç»` - éªæ¶æ¥å£ï¼`/device/repair/acceptance` --- ## 6. èè°æ£æ¥æ¸ å ### 设å¤ä¿å » 1. ä¿å »åæµç¨ï¼`0å¾ ä¿å » -> 3å¾ éªæ¶ -> 1å®ç»`ã 2. å¾ éªæ¶åæ®æªå¡«éªæ¶äºº/éªæ¶æ¶é´/éªæ¶å¤æ³¨æ¶ï¼å端è¿å对åºé误æç¤ºã 3. å°è¯éè¿ `PUT /device/maintenance` ç´æ¥è®¾ä¸ºå®ç»æ¶ï¼å端è¿åæ¦æªæç¤ºã 4. å表/è¯¦æ æ¥å£è½æ£ç¡®è¿å `acceptanceName`ã`acceptanceTime`ã`acceptanceRemark`ã ### è®¾å¤æ¥ä¿® 1. æ¥ä¿®åæµç¨ï¼`0å¾ ç»´ä¿® -> 3å¾ éªæ¶ -> 1å®ç»`ã 2. å¾ éªæ¶åæ®æªå¡«éªæ¶äºº/éªæ¶æ¶é´/éªæ¶å¤æ³¨æ¶ï¼å端è¿å对åºé误æç¤ºã 3. å°è¯éè¿ `PUT /device/repair` ç´æ¥è®¾ä¸ºå®ç»æ¶ï¼å端è¿åæ¦æªæç¤ºã --- ## 7. æ°æ®åºåæ´ æ§è¡ä»¥ä¸SQLå请å¤ä»½æ°æ®ï¼ ```sql -- 设å¤ä¿å »è¡¨æ°å¢éªæ¶äººç¸å ³å段 ALTER TABLE `device_maintenance` ADD COLUMN `acceptance_name` VARCHAR(100) NULL COMMENT 'éªæ¶äºº' AFTER `spare_parts_ids`, ADD COLUMN `acceptance_time` DATETIME NULL COMMENT 'éªæ¶æ¶é´' AFTER `acceptance_name`, ADD COLUMN `acceptance_remark` VARCHAR(500) NULL COMMENT 'éªæ¶å¤æ³¨' AFTER `acceptance_time`; ``` > è¥æªæ§è¡ä»¥ä¸SQLï¼ç¸å ³æ¥å£ä¼åºç°å段ä¸åå¨å¼å¸¸ã --- ## 8. åæ®µå¯¹ç §è¡¨ ### 设å¤ä¿å »ï¼device_maintenanceï¼ | æ°æ®åºå段 | Javaåæ®µ | ç±»å | 说æ | |---|---|---|---| | `acceptance_name` | `acceptanceName` | String | éªæ¶äºº | | `acceptance_time` | `acceptanceTime` | LocalDateTime | éªæ¶æ¶é´ | | `acceptance_remark` | `acceptanceRemark` | String | éªæ¶å¤æ³¨ | ### è®¾å¤æ¥ä¿®ï¼device_repairï¼ | æ°æ®åºå段 | Javaåæ®µ | ç±»å | 说æ | |---|---|---|---| | `acceptance_name` | `acceptanceName` | String | éªæ¶äºº | | `acceptance_time` | `acceptanceTime` | LocalDateTime | éªæ¶æ¶é´ | | `acceptance_remark` | `acceptanceRemark` | String | éªæ¶å¤æ³¨ | doc/ǰ¶ËÁªµ÷Îĵµ-É豸±¨ÐÞÑéÊÕÉóÅú¹¦ÄÜ.md
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,361 @@ # å端èè°ææ¡£ - è®¾å¤æ¥ä¿®éªæ¶å®¡æ¹åè½ ## 1. åè½æ¦è¿° è®¾å¤æ¥ä¿®æ¨¡åå®ç°äºå®æ´çéªæ¶å®¡æ¹æµç¨ï¼ - 维修确认åè¿å ¥å¾ éªæ¶ç¶æ - éªæ¶å®¡æ¹éè¿åæç®å®ç» - è®°å½éªæ¶äººãéªæ¶æ¶é´ãéªæ¶å¤æ³¨ --- ## 2. ç¶æå®ä¹ | ç¶æå¼ | å«ä¹ | 说æ | |---|---|---| | `0` | å¾ ç»´ä¿® | æ¥ä¿®ååå§ç¶æ | | `3` | å¾ éªæ¶ | 维修确认åçå¾ éªæ¶ | | `1` | å®ç» | éªæ¶éè¿ | | `2` | 失败 | 维修失败 | ### ç¶ææµè½¬å¾ ``` å¾ ç»´ä¿®(0) --> å¾ éªæ¶(3) --> å®ç»(1) | +--> 失败(2) ``` --- ## 3. æ¥å£æ¸ å ### 3.1 维修确认 - **POST** `/device/repair/repair` - 说æï¼ç»´ä¿®äººåå®æç»´ä¿®åæäº¤ï¼ç¶æä» `å¾ ç»´ä¿®(0)` è¿å ¥ `å¾ éªæ¶(3)` #### 请æ±åæ°ï¼Bodyï¼ | åæ®µ | ç±»å | å¿ å¡« | 说æ | |---|---|---|---| | `id` | Long | æ¯ | æ¥ä¿®è®°å½ID | | `maintenanceName` | String | å¦ | 维修人 | | `maintenanceTime` | String | å¦ | ç»´ä¿®æ¶é´ï¼æ ¼å¼ `yyyy-MM-dd HH:mm:ss` | | `maintenanceResult` | String | å¦ | ç»´ä¿®ç»ææè¿° | | `sparePartsUseList` | Array | å¦ | 使ç¨å¤ä»¶å表 | | `sparePartsUseList[].id` | Long | æ¯ | å¤ä»¶ID | | `sparePartsUseList[].quantity` | Integer | æ¯ | ä½¿ç¨æ°é | #### 请æ±ç¤ºä¾ ```json { "id": 10001, "maintenanceName": "æå", "maintenanceTime": "2026-06-02 10:30:00", "maintenanceResult": "æ´æ¢è½´æ¿å¹¶è¯è¿è¡æ£å¸¸", "sparePartsUseList": [ { "id": 501, "quantity": 2 }, { "id": 502, "quantity": 1 } ] } ``` #### è¿åç¤ºä¾ ```json { "code": 200, "msg": "æä½æå" } ``` #### é误æç¤º | éè¯¯ä¿¡æ¯ | åºæ¯ | |---|---| | `æ¥ä¿®è®°å½ä¸åå¨` | ä¼ å ¥çIDæ æ | | `该æ¥ä¿®å·²å®ç»ï¼ä¸è½éå¤ç¡®è®¤ç»´ä¿®` | ç¶æå·²ä¸ºå®ç»(1) | | `该æ¥ä¿®å·²æäº¤éªæ¶å®¡æ¹` | ç¶æå·²ä¸ºå¾ éªæ¶(3) | | `å¤ä»¶ xxx æ°éä¸è¶³` | å¤ä»¶åºåä¸è¶³ | --- ### 3.2 éªæ¶å®¡æ¹ - **POST** `/device/repair/acceptance` - 说æï¼éªæ¶äººåå¯¹å¾ éªæ¶åæ®è¿è¡å®¡æ¹ï¼å®¡æ¹éè¿åç¶ææ¹ä¸º `å®ç»(1)` #### 请æ±åæ°ï¼Bodyï¼ | åæ®µ | ç±»å | å¿ å¡« | 说æ | |---|---|---|---| | `id` | Long | æ¯ | æ¥ä¿®è®°å½ID | | `acceptanceName` | String | æ¯ | éªæ¶äººå§å | | `acceptanceTime` | String | æ¯ | éªæ¶æ¶é´ï¼æ ¼å¼ `yyyy-MM-dd HH:mm:ss` | | `acceptanceRemark` | String | æ¯ | éªæ¶å¤æ³¨ | #### 请æ±ç¤ºä¾ ```json { "id": 10001, "acceptanceName": "çäº", "acceptanceTime": "2026-06-02 11:00:00", "acceptanceRemark": "ç»´ä¿®é¡¹æ ¸éªéè¿ï¼è®¾å¤è¿è¡æ£å¸¸" } ``` #### è¿åç¤ºä¾ ```json { "code": 200, "msg": "æä½æå" } ``` #### é误æç¤º | éè¯¯ä¿¡æ¯ | åºæ¯ | |---|---| | `æ¥ä¿®è®°å½idä¸è½ä¸ºç©º` | æªä¼ å ¥idåæ° | | `æ¥ä¿®è®°å½ä¸åå¨` | ä¼ å ¥çIDæ æ | | `该æ¥ä¿®æªè¿å ¥å¾ éªæ¶ç¶æï¼ä¸è½å®¡æ¹` | ç¶æä¸æ¯å¾ éªæ¶(3) | | `éªæ¶äººä¸è½ä¸ºç©º` | acceptanceName为空 | | `éªæ¶æ¶é´ä¸è½ä¸ºç©º` | acceptanceTime为空 | | `éªæ¶å¤æ³¨ä¸è½ä¸ºç©º` | acceptanceRemark为空 | | `éªæ¶å®¡æ¹å¤±è´¥` | æ°æ®åºæ´æ°å¤±è´¥ | --- ### 3.3 æ®éæ´æ°æ¥å£éå¶ - **PUT** `/device/repair` - 说æï¼æ®éçæ´æ°æ¥å£ï¼ç¨äºä¿®æ¹æ¥ä¿®åºæ¬ä¿¡æ¯ #### éå¶è§å - ä¸è½éè¿æ¤æ¥å£ç´æ¥å°ç¶ææ¹ä¸º `å®ç»(1)` - å¿ é¡»èµ° `POST /device/repair/repair` -> `POST /device/repair/acceptance` æµç¨ #### é误æç¤º | éè¯¯ä¿¡æ¯ | åºæ¯ | |---|---| | `è¯·å æäº¤éªæ¶å®¡æ¹ï¼éªæ¶éè¿åæå¯å®ç»` | å°è¯ç´æ¥è®¾ç½®status=1 | --- ### 3.4 æ¥è¯¢æ¥å£è¿ååæ®µ 以䏿¥å£è¿åæ°æ®ä¸å å«éªæ¶ç¸å ³åæ®µï¼ - **GET** `/device/repair/page` - å页å表 - **GET** `/device/repair/{id}` - 详æ #### éªæ¶ç¸å ³è¿ååæ®µ | åæ®µ | ç±»å | 说æ | |---|---|---| | `acceptanceName` | String | éªæ¶äºº | | `acceptanceTime` | String | éªæ¶æ¶é´ï¼æ ¼å¼ `yyyy-MM-dd HH:mm:ss` | | `acceptanceRemark` | String | éªæ¶å¤æ³¨ | #### å表è¿åç¤ºä¾ ```json { "code": 200, "msg": "æä½æå", "data": { "records": [ { "id": 10001, "deviceLedgerId": 100, "deviceName": "ç©ºåæºA", "deviceModel": "KR-500", "areaId": 1, "areaName": "ç产车é´", "repairTime": "2026-06-01 09:00:00", "repairName": "å¼ ä¸", "remark": "设å¤è¿è¡å¼å", "machineryCategory": "å¨å设å¤", "maintenanceName": "æå", "maintenanceTime": "2026-06-02 10:30:00", "maintenanceResult": "æ´æ¢è½´æ¿å¹¶è¯è¿è¡æ£å¸¸", "acceptanceName": "çäº", "acceptanceTime": "2026-06-02 11:00:00", "acceptanceRemark": "ç»´ä¿®é¡¹æ ¸éªéè¿ï¼è®¾å¤è¿è¡æ£å¸¸", "status": 1, "createTime": "2026-06-01 08:30:00", "updateTime": "2026-06-02 11:00:00" } ], "total": 1, "size": 10, "current": 1 } } ``` --- ## 4. å端å®ç°å»ºè®® ### 4.1 åè¡¨é¡µé¢ 1. **ç¶æçé**ï¼å¢å `å¾ éªæ¶(3)` ç¶æççé项 2. **ç¶æå±ç¤º**ï¼æ ¹æ®status弿¾ç¤ºå¯¹åºææ¡åé¢è² | ç¶æå¼ | ææ¡ | 建议é¢è² | |---|---|---| | 0 | å¾ ç»´ä¿® | æ©è²/è¦å | | 3 | å¾ éªæ¶ | èè²/ä¿¡æ¯ | | 1 | å®ç» | 绿è²/æå | | 2 | 失败 | 红è²/é误 | ### 4.2 详æ é¡µé¢ 1. **å¾ ç»´ä¿®ç¶æ(0)**ï¼ - æ¾ç¤º"确认维修"æé® - å¯ç¼è¾ç»´ä¿®äººãç»´ä¿®æ¶é´ãç»´ä¿®ç»æ - å¯éæ©ä½¿ç¨çå¤ä»¶ 2. **å¾ éªæ¶ç¶æ(3)**ï¼ - æ¾ç¤º"éªæ¶å®¡æ¹"æé® - å¼¹çªå¡«åï¼éªæ¶äººãéªæ¶æ¶é´ãéªæ¶å¤æ³¨ 3. **å®ç»ç¶æ(1)**ï¼ - æ¾ç¤ºéªæ¶ä¿¡æ¯ï¼éªæ¶äººãéªæ¶æ¶é´ãéªæ¶å¤æ³¨ï¼ - åªè¯»å±ç¤º ### 4.3 éªæ¶å®¡æ¹å¼¹çª ```html <!-- 示ä¾è¡¨å --> <el-form :model="acceptanceForm" :rules="rules"> <el-form-item label="éªæ¶äºº" prop="acceptanceName"> <el-input v-model="acceptanceForm.acceptanceName" placeholder="请è¾å ¥éªæ¶äºº" /> </el-form-item> <el-form-item label="éªæ¶æ¶é´" prop="acceptanceTime"> <el-date-picker v-model="acceptanceForm.acceptanceTime" type="datetime" placeholder="éæ©éªæ¶æ¶é´" format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss" /> </el-form-item> <el-form-item label="éªæ¶å¤æ³¨" prop="acceptanceRemark"> <el-input v-model="acceptanceForm.acceptanceRemark" type="textarea" placeholder="请è¾å ¥éªæ¶å¤æ³¨" :rows="3" /> </el-form-item> </el-form> ``` ### 4.4 表åéªè¯è§å ```javascript const rules = { acceptanceName: [ { required: true, message: 'éªæ¶äººä¸è½ä¸ºç©º', trigger: 'blur' } ], acceptanceTime: [ { required: true, message: 'éªæ¶æ¶é´ä¸è½ä¸ºç©º', trigger: 'change' } ], acceptanceRemark: [ { required: true, message: 'éªæ¶å¤æ³¨ä¸è½ä¸ºç©º', trigger: 'blur' } ] } ``` --- ## 5. æä½æé®æ§å¶ ### 5.1 æé®æ¾ç¤ºé»è¾ | ç¶æ | 确认维修 | éªæ¶å®¡æ¹ | ç¼è¾ | å é¤ | |---|---|---|---|---| | å¾ ç»´ä¿®(0) | â æ¾ç¤º | â éè | â æ¾ç¤º | â æ¾ç¤º | | å¾ éªæ¶(3) | â éè | â æ¾ç¤º | â æ¾ç¤º | â æ¾ç¤º | | å®ç»(1) | â éè | â éè | â ç¦ç¨ | â ç¦ç¨ | | 失败(2) | â éè | â éè | â æ¾ç¤º | â æ¾ç¤º | ### 5.2 ç¶ææµè½¬æ§å¶ ```javascript // 确认维修 async function handleRepair(row) { const res = await post('/device/repair/repair', { id: row.id, maintenanceName: form.maintenanceName, maintenanceTime: form.maintenanceTime, maintenanceResult: form.maintenanceResult, sparePartsUseList: form.sparePartsUseList }) if (res.code === 200) { // ç¶æåä¸ºå¾ éªæ¶(3)ï¼å·æ°å表 refreshList() } } // éªæ¶å®¡æ¹ async function handleAcceptance(row) { const res = await post('/device/repair/acceptance', { id: row.id, acceptanceName: form.acceptanceName, acceptanceTime: form.acceptanceTime, acceptanceRemark: form.acceptanceRemark }) if (res.code === 200) { // ç¶æå为å®ç»(1)ï¼å·æ°å表 refreshList() } } ``` --- ## 6. æ°æ®åºå段 ### device_repair 表 | åæ®µå | ç±»å | 说æ | |---|---|---| | `acceptance_name` | VARCHAR(100) | éªæ¶äºº | | `acceptance_time` | DATETIME | éªæ¶æ¶é´ | | `acceptance_remark` | VARCHAR(500) | éªæ¶å¤æ³¨ | ### SQLï¼å·²æ§è¡ï¼ ```sql ALTER TABLE device_repair ADD COLUMN acceptance_name VARCHAR(100) NULL COMMENT 'éªæ¶äºº', ADD COLUMN acceptance_time DATETIME NULL COMMENT 'éªæ¶æ¶é´', ADD COLUMN acceptance_remark VARCHAR(500) NULL COMMENT 'éªæ¶å¤æ³¨'; ``` --- ## 7. èè°æ£æ¥æ¸ å - [ ] å¾ ç»´ä¿®ç¶æçæ¥ä¿®åï¼ç¹å»"确认维修"åç¶æåä¸ºå¾ éªæ¶(3) - [ ] å¾ éªæ¶ç¶æçæ¥ä¿®åï¼ç¹å»"éªæ¶å®¡æ¹"åç¶æå为å®ç»(1) - [ ] éªæ¶å®¡æ¹æ¶ï¼éªæ¶äºº/éªæ¶æ¶é´/éªæ¶å¤æ³¨ä¸ºç©ºï¼å端è¿å对åºé误æç¤º - [ ] å°è¯éè¿æ®éç¼è¾æ¥å£ç´æ¥å°ç¶ææ¹ä¸ºå®ç»ï¼å端è¿åæ¦æªæç¤º - [ ] å表/è¯¦æ æ¥å£æ£ç¡®è¿åéªæ¶ç¸å ³å段 - [ ] å®ç»ç¶æçæ¥ä¿®åï¼è¯¦æ 页å±ç¤ºéªæ¶ä¿¡æ¯ doc/ǰ¶ËÁªµ÷Îĵµ-¹ý³Ì¼ìÑéÄ£°åµ¼³ö¹¦ÄÜ.md
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,275 @@ # å端èè°ææ¡£ - è¿ç¨æ£éªæ¨¡æ¿å¯¼åºåè½ ## 1. åè½æ¦è¿° è¿ç¨æ£éªæ¨¡åæ¯æä¸ç§å®¢æ·æ¨¡æ¿çæ£éªç»æå¯¼åºï¼ - **ä¼é¾æ¨¡æ¿** - ä¼é¾å®¢æ·ä¸ç¨æ£éªæ¥åæ ¼å¼ - **ç¾äºæ¨¡æ¿** - ç¾äºå®¢æ·ä¸ç¨æ£éªæ¥åæ ¼å¼ - **è¾¾å©æ¨¡æ¿** - è¾¾å©å®¢æ·ä¸ç¨æ£éªæ¥åæ ¼å¼ å¯¼åºåè½ä¼èªå¨å¡«å 模æ¿ä¸ç"ç»æ"åï¼æ ¹æ®æ£éªåæ°ä¸ç"项ç®å"è¿è¡å¹é ã --- ## 2. æ¥å£æ¸ å ### 2.1 导åºä¼é¾æ¨¡æ¿æ£éªç»æ - **GET** `/quality/qualityInspect/export/weilong/{id}` - 说æï¼å¯¼åºæå®è¿ç¨æ£éªåçä¼é¾æ ¼å¼æ£éªæ¥å #### 请æ±åæ° | åæ°å | ç±»å | ä½ç½® | å¿ å¡« | 说æ | |--------|------|------|------|------| | `id` | Long | Path | æ¯ | è¿ç¨æ£éªåID | #### 请æ±ç¤ºä¾ ``` GET /quality/qualityInspect/export/weilong/123 ``` #### è¿åç»æ è¿åWordææ¡£æä»¶æµï¼æä»¶åï¼`ä¼é¾æ¨¡çæ£éªç»æ.doc` --- ### 2.2 导åºç¾äºæ¨¡æ¿æ£éªç»æ - **GET** `/quality/qualityInspect/export/baishi/{id}` - 说æï¼å¯¼åºæå®è¿ç¨æ£éªåçç¾äºæ ¼å¼æ£éªæ¥å #### 请æ±åæ° | åæ°å | ç±»å | ä½ç½® | å¿ å¡« | 说æ | |--------|------|------|------|------| | `id` | Long | Path | æ¯ | è¿ç¨æ£éªåID | #### 请æ±ç¤ºä¾ ``` GET /quality/qualityInspect/export/baishi/123 ``` #### è¿åç»æ è¿åWordææ¡£æä»¶æµï¼æä»¶åï¼`ç¾äºæ¨¡çæ£éªç»æ.doc` --- ### 2.3 导åºè¾¾å©æ¨¡æ¿æ£éªç»æ - **GET** `/quality/qualityInspect/export/dali/{id}` - 说æï¼å¯¼åºæå®è¿ç¨æ£éªåçè¾¾å©æ ¼å¼æ£éªæ¥å #### 请æ±åæ° | åæ°å | ç±»å | ä½ç½® | å¿ å¡« | 说æ | |--------|------|------|------|------| | `id` | Long | Path | æ¯ | è¿ç¨æ£éªåID | #### 请æ±ç¤ºä¾ ``` GET /quality/qualityInspect/export/dali/123 ``` #### è¿åç»æ è¿åWordææ¡£æä»¶æµï¼æä»¶åï¼`è¾¾å©æ¨¡çæ£éªç»æ.doc` --- ## 3. æ°æ®å¹é è§å ### 3.1 模æ¿å¡«å é»è¾ å¯¼åºæ¶ç³»ç»ä¼èªå¨å¹é æ£éªåæ°ä¸æ¨¡æ¿ä¸çæ£éªé¡¹ç®ï¼ 1. **项ç®å¹é **ï¼æ ¹æ®æ£éªåæ°è¡¨ï¼`quality_inspect_param`ï¼ä¸ç`parameterItem`ï¼æ£éªé¡¹ç®ï¼åæ®µä¸æ¨¡æ¿è¡¨æ ¼å·¦ä¾§ç项ç®åè¿è¡å¹é 2. **ç»æå¡«å **ï¼å¹é æååï¼å°`testValue`ï¼æ£éªå¼ï¼å¡«å å°æ¨¡æ¿å¯¹åºè¡ç"ç»æ"å 3. **æ£éªç»è®º**ï¼ç¹æ®è¡ï¼å¦"è´¨éè¯å®"ã"æ£éªç»æ"ã"æ£éªç»è®º"ï¼ä¼å¡«å æ£éªåç`checkResult`åæ®µ ### 3.2 å¹é ä¼å 级 | ä¼å 级 | å¹é è§å | 说æ | |--------|----------|------| | 1 | å®å ¨å¹é | 项ç®åç§°å®å ¨ä¸è´ | | 2 | å å«å¹é | 项ç®åç§°å å«å ³ç³» | | 3 | ç»åå¹é | 第ä¸å+第äºåç»åå¹é | | 4 | åç»å¹é | åç»æ ç¾+项ç®åç§°ç»åå¹é | ### 3.3 ç¹æ®å¤ç 以ä¸è¡ä¼èªå¨å¡«å æ£éªç»è®ºï¼`checkResult`ï¼ï¼ - è´¨éè¯å® - æ£éªç»æ - æ£éªç»è®º - Grade estimation - Test Results --- ## 4. å端å®ç°ç¤ºä¾ ### 4.1 Vue + Axios 导åºç¤ºä¾ ```javascript // 导åºä¼é¾æ¨¡æ¿ exportWeiLong(row) { const id = row.id; axios({ method: 'get', url: `/quality/qualityInspect/export/weilong/${id}`, responseType: 'blob' }).then(response => { const blob = new Blob([response.data], { type: 'application/msword' }); const link = document.createElement('a'); link.href = URL.createObjectURL(blob); link.download = 'ä¼é¾æ¨¡çæ£éªç»æ.doc'; link.click(); URL.revokeObjectURL(link.href); }).catch(error => { console.error('导åºå¤±è´¥', error); }); } // 导åºç¾äºæ¨¡æ¿ exportBaiShi(row) { const id = row.id; axios({ method: 'get', url: `/quality/qualityInspect/export/baishi/${id}`, responseType: 'blob' }).then(response => { const blob = new Blob([response.data], { type: 'application/msword' }); const link = document.createElement('a'); link.href = URL.createObjectURL(blob); link.download = 'ç¾äºæ¨¡çæ£éªç»æ.doc'; link.click(); URL.revokeObjectURL(link.href); }).catch(error => { console.error('导åºå¤±è´¥', error); }); } // 导åºè¾¾å©æ¨¡æ¿ exportDaLi(row) { const id = row.id; axios({ method: 'get', url: `/quality/qualityInspect/export/dali/${id}`, responseType: 'blob' }).then(response => { const blob = new Blob([response.data], { type: 'application/msword' }); const link = document.createElement('a'); link.href = URL.createObjectURL(blob); link.download = 'è¾¾å©æ¨¡çæ£éªç»æ.doc'; link.click(); URL.revokeObjectURL(link.href); }).catch(error => { console.error('导åºå¤±è´¥', error); }); } ``` ### 4.2 æé®é ç½®ç¤ºä¾ ```html <el-table-column label="æä½" width="200"> <template #default="{ row }"> <!-- åªæè¿ç¨æ£éª(inspectType=1)ææ¾ç¤ºæ¨¡æ¿å¯¼åºæé® --> <el-button v-if="row.inspectType === 1" size="small" @click="exportWeiLong(row)"> ä¼é¾æ¨¡æ¿ </el-button> <el-button v-if="row.inspectType === 1" size="small" @click="exportBaiShi(row)"> ç¾äºæ¨¡æ¿ </el-button> <el-button v-if="row.inspectType === 1" size="small" @click="exportDaLi(row)"> è¾¾å©æ¨¡æ¿ </el-button> </template> </el-table-column> ``` --- ## 5. é误å¤ç ### 5.1 é误ååº | éè¯¯ä¿¡æ¯ | åºæ¯ | |----------|------| | `æ£éªåIDä¸è½ä¸ºç©º` | æªä¼ å ¥idåæ° | | `æ£éªåä¸åå¨` | ä¼ å ¥çIDæ æ | | `æ¨¡æ¿æä»¶ä¸åå¨` | æ¨¡æ¿æä»¶ç¼ºå¤± | | `导åºå¤±è´¥` | æä»¶å¤çå¼å¸¸ | ### 5.2 å端é误å¤ç ```javascript .catch(error => { if (error.response) { // 读åéè¯¯ä¿¡æ¯ const reader = new FileReader(); reader.onload = () => { const message = JSON.parse(reader.result).msg || '导åºå¤±è´¥'; this.$message.error(message); }; reader.readAsText(error.response.data); } else { this.$message.error('导åºå¤±è´¥ï¼è¯·ç¨åéè¯'); } }); ``` --- ## 6. ä¸å¡è¯´æ ### 6.1 æ£éªç±»ååºå | inspectType | ç±»å | 说æ | |-------------|------|------| | 0 | åæææ£éª | è¿ææ£éª | | 1 | è¿ç¨æ£éª | ç产è¿ç¨æ£éªï¼æ¯ææ¨¡æ¿å¯¼åºï¼ | | 2 | åºåæ£éª | æååºåæ£éª | ### 6.2 模æ¿å¯¼åºéç¨èå´ æ¨¡æ¿å¯¼åºåè½ä¸»è¦ç¨äº**è¿ç¨æ£éª**ï¼`inspectType=1`ï¼ï¼åç«¯åºæ ¹æ®æ£éªç±»å夿æ¯å¦æ¾ç¤ºæ¨¡æ¿å¯¼åºæé®ã ### 6.3 æ£éªåæ°æ°æ®ç»æ | åæ®µ | ç±»å | 说æ | |------|------|------| | `parameterItem` | String | æ£éªé¡¹ç®åç§°ï¼ç¨äºå¹é 模æ¿ï¼ | | `testValue` | String | æ£éªå¼ï¼å¡«å å°ç»æåï¼ | | `standardValue` | String | æ åå¼ | | `controlValue` | String | å æ§å¼ | | `unit` | String | åä½ | --- ## 7. èè°æ£æ¥æ¸ å - [ ] è¿ç¨æ£éªå导åºä¼é¾æ¨¡æ¿æåï¼æä»¶å¯æ£å¸¸æå¼ - [ ] è¿ç¨æ£éªå导åºç¾äºæ¨¡æ¿æåï¼æä»¶å¯æ£å¸¸æå¼ - [ ] è¿ç¨æ£éªå导åºè¾¾å©æ¨¡æ¿æåï¼æä»¶å¯æ£å¸¸æå¼ - [ ] å¯¼åºæä»¶ä¸æ£éªç»æåæ£ç¡®å¡«å - [ ] æ£éªç»è®ºè¡æ£ç¡®æ¾ç¤º`checkResult`å¼ - [ ] ä¼ å ¥ä¸åå¨çIDæ¶è¿åé误æç¤º - [ ] åæææ£éª/åºåæ£éªä¸æ¾ç¤ºæ¨¡æ¿å¯¼åºæé® - [ ] æä»¶åç¼ç æ£ç¡®ï¼ä¸ææ ä¹±ç --- ## 8. æ¨¡æ¿æä»¶ä½ç½® | æ¨¡æ¿ | è·¯å¾ | |------|------| | ä¼é¾æ¨¡ç.doc | `/static/ä¼é¾æ¨¡ç.doc` | | ç¾äºæ¨¡ç.doc | `/static/ç¾äºæ¨¡ç.doc` | | è¾¾å©æ¨¡ç.doc | `/static/è¾¾å©æ¨¡ç.doc` | docs/maintenance_task_api.md
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,317 @@ # 设å¤ä¿å »ä»»å¡æ¥å£ææ¡£ ## æ¦è¿° 设å¤ä¿å »ä»»å¡æ¨¡åç¨äºç®¡ç设å¤ç宿¶ä¿å »è®¡åï¼æ¯æå¤ç§é¢çç±»åï¼æ¯æ¥ãæ¯å¨ãæ¯æãæ¯å£åº¦ãæ¯å¹´ï¼ï¼å¹¶å¯å¯ç¨æç¦ç¨ä»»å¡ã --- ## æ¥å£å表 ### 1. å页æ¥è¯¢ä¿å »ä»»å¡å表 **请æ±å°å**: `GET /deviceMaintenanceTask/listPage` **请æ±åæ°**: | åæ°å | ç±»å | å¿ å¡« | 说æ | |--------|------|------|------| | current | Long | å¦ | å½å页ç ï¼é»è®¤1 | | size | Long | å¦ | æ¯é¡µæ¡æ°ï¼é»è®¤10 | | taskName | String | å¦ | ä»»å¡åç§°ï¼æ¨¡ç³æ¥è¯¢ï¼ | | areaId | Long | å¦ | 设å¤åºåID | | isEnabled | Integer | å¦ | æ¯å¦å¯ç¨ï¼1=å¯ç¨ï¼0=ç¦ç¨ï¼ | **ååºç¤ºä¾**: ```json { "code": 200, "msg": "æä½æå", "data": { "records": [ { "id": 1, "taskName": "设å¤A,设å¤B", "taskId": 100, "areaId": 10, "areaName": "ç产车é´", "deviceModel": "åå·A,åå·B", "deviceLedgerIdsStr": "100,101", "frequencyType": "WEEKLY", "frequencyDetail": "MON,14:30", "nextExecutionTime": "2026-06-08T14:30:00", "lastExecutionTime": "2026-06-01T14:30:00", "isEnabled": 1, "remarks": "夿³¨ä¿¡æ¯", "registrantId": 1, "registrant": "å¼ ä¸", "registrationDate": "2026-06-01", "createTime": "2026-06-01T10:00:00", "updateTime": "2026-06-01T10:00:00" } ], "total": 100, "current": 1, "size": 10 } } ``` --- ### 2. æ°å¢ä¿å »ä»»å¡ **请æ±å°å**: `POST /deviceMaintenanceTask/add` **请æ±å¤´**: `Content-Type: application/json` **请æ±åæ°**: | åæ°å | ç±»å | å¿ å¡« | 说æ | |--------|------|------|------| | taskName | String | å¦ | ä»»å¡åç§°ï¼å¦ä¸ä¼ åæ ¹æ®è®¾å¤åç§°èªå¨çæï¼ | | taskId | Long | å¦ | 设å¤IDï¼åä¸ªè®¾å¤æ¶ä½¿ç¨ï¼ | | deviceLedgerIds | Long[] | å¦ | 设å¤IDæ°ç»ï¼å¤ä¸ªè®¾å¤æ¶ä½¿ç¨ï¼ | | deviceLedgerIdsStr | String | å¦ | 设å¤IDå符串ï¼éå·åé | | areaId | Long | å¦ | 设å¤åºåID | | frequencyType | String | æ¯ | 颿¬¡ç±»åï¼è§ä¸æ¹è¯´æ | | frequencyDetail | String | æ¯ | 颿¬¡è¯¦æ ï¼æ ¼å¼è§ä¸æ¹è¯´æ | | isEnabled | Integer | å¦ | æ¯å¦å¯ç¨ï¼1=å¯ç¨ï¼0=ç¦ç¨ï¼ï¼é»è®¤1 | | remarks | String | å¦ | 夿³¨ | **ååºç¤ºä¾**: ```json { "code": 200, "msg": "æ·»å æå" } ``` --- ### 3. æ´æ°ä¿å »ä»»å¡ **请æ±å°å**: `POST /deviceMaintenanceTask/update` **请æ±å¤´**: `Content-Type: application/json` **请æ±åæ°**: 忰墿¥å£ï¼éé¢å¤ä¼ å ¥ `id` åæ®µ | åæ°å | ç±»å | å¿ å¡« | 说æ | |--------|------|------|------| | id | Long | æ¯ | ä»»å¡ID | | ... | ... | ... | å ¶ä»åæ®µåæ°å¢æ¥å£ | **ååºç¤ºä¾**: ```json { "code": 200, "msg": "æ´æ°æå" } ``` --- ### 4. å¯ç¨/ç¦ç¨ä¿å »ä»»å¡ **请æ±å°å**: `POST /deviceMaintenanceTask/changeEnable` **请æ±å¤´**: `Content-Type: application/json` **请æ±åæ°**: | åæ°å | ç±»å | å¿ å¡« | 说æ | |--------|------|------|------| | id | Long | æ¯ | ä»»å¡ID | | isEnabled | Integer | æ¯ | æ¯å¦å¯ç¨ï¼1=å¯ç¨ï¼0=ç¦ç¨ï¼ | **ååºç¤ºä¾**: ```json { "code": 200, "msg": "æ´æ°æå" } ``` **ä¸å¡é»è¾è¯´æ**: - å¯ç¨ä»»å¡æ¶ä¼èªå¨æ¢å¤å®æ¶è°åº¦ - ç¦ç¨ä»»å¡æ¶ä¼æå宿¶è°åº¦ - 妿任塿²¡æä¸æ¬¡æ§è¡æ¶é´ï¼ä¼èªå¨è®¡ç® --- ### 5. å é¤ä¿å »ä»»å¡ **请æ±å°å**: `DELETE /deviceMaintenanceTask/delete` **请æ±å¤´**: `Content-Type: application/json` **请æ±åæ°**: | åæ°å | ç±»å | å¿ å¡« | 说æ | |--------|------|------|------| | - | Long[] | æ¯ | ä»»å¡IDæ°ç»ï¼è¯·æ±ä½ç´æ¥ä¼ æ°ç»ï¼ | **请æ±ç¤ºä¾**: ```json [1, 2, 3] ``` **ååºç¤ºä¾**: ```json { "code": 200, "msg": "å 餿å" } ``` --- ## é¢çç±»å说æ ### frequencyType å¯éå¼ | å¼ | 说æ | frequencyDetail æ ¼å¼ | |----|------|---------------------| | DAILY | æ¯æ¥ | `HH:mm` | | WEEKLY | æ¯å¨ | `ææ,HH:mm` | | MONTHLY | æ¯æ | `æ¥,HH:mm` | | QUARTERLY | æ¯å£åº¦ | `èµ·å§æä»½,æ¥,HH:mm` | | YEARLY | æ¯å¹´ | `æä»½,æ¥,HH:mm` | ### frequencyDetail æ ¼å¼è¯¦è§£ #### 1. æ¯æ¥ï¼DAILYï¼ æ ¼å¼ï¼`HH:mm` 示ä¾ï¼ - `14:30` - æ¯å¤© 14:30 æ§è¡ #### 2. æ¯å¨ï¼WEEKLYï¼ æ ¼å¼ï¼`ææ,HH:mm` ææå¯éå¼ï¼`MON`, `TUE`, `WED`, `THU`, `FRI`, `SAT`, `SUN` 示ä¾ï¼ - `MON,14:30` - æ¯å¨ä¸ 14:30 æ§è¡ - `FRI,09:00` - æ¯å¨äº 09:00 æ§è¡ #### 3. æ¯æï¼MONTHLYï¼ æ ¼å¼ï¼`æ¥,HH:mm` 示ä¾ï¼ - `15,14:30` - æ¯æ15æ¥ 14:30 æ§è¡ - `01,09:00` - æ¯æ1æ¥ 09:00 æ§è¡ - `31,18:00` - æ¯ææåä¸å¤©ï¼å¦æä»½ä¸è¶³31天ååæåä¸å¤©ï¼ #### 4. æ¯å£åº¦ï¼QUARTERLYï¼ æ ¼å¼ï¼`èµ·å§æä»½,æ¥,HH:mm` 说æï¼ä»æå®æä»½å¼å§ï¼æ¯é3ä¸ªææ§è¡ä¸æ¬¡ 示ä¾ï¼ - `1,15,14:30` - 1æã4æã7æã10æç15æ¥ 14:30 æ§è¡ - `3,10,09:00` - 3æã6æã9æã12æç10æ¥ 09:00 æ§è¡ #### 5. æ¯å¹´ï¼YEARLYï¼ æ ¼å¼ï¼`æä»½,æ¥,HH:mm` 示ä¾ï¼ - `6,15,14:30` - æ¯å¹´6æ15æ¥ 14:30 æ§è¡ - `12,31,23:59` - æ¯å¹´12æ31æ¥ 23:59 æ§è¡ --- ## å端使ç¨ç¤ºä¾ ### æ°å¢æ¯å¨ä¿å »ä»»å¡ ```javascript const task = { deviceLedgerIds: [100, 101], // 设å¤IDæ°ç» areaId: 10, // åºåID frequencyType: 'WEEKLY', // æ¯å¨ frequencyDetail: 'MON,14:30', // æ¯å¨ä¸14:30 isEnabled: 1, // å¯ç¨ remarks: 'æ¯å¨ä¾è¡ä¿å »' }; fetch('/deviceMaintenanceTask/add', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(task) }); ``` ### å¯ç¨/ç¦ç¨ä»»å¡ ```javascript // å¯ç¨ä»»å¡ fetch('/deviceMaintenanceTask/changeEnable', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ id: 1, isEnabled: 1 }) }); // ç¦ç¨ä»»å¡ fetch('/deviceMaintenanceTask/changeEnable', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ id: 1, isEnabled: 0 }) }); ``` --- ## æ°æ®åå ¸ ### isEnabled åæ®µ | å¼ | 说æ | |----|------| | 0 | ç¦ç¨ | | 1 | å¯ç¨ | ### è¿ååæ®µè¯´æ | åæ®µå | ç±»å | 说æ | |--------|------|------| | id | Long | ä»»å¡ID | | taskName | String | ä»»å¡åç§°ï¼å¤ä¸ªè®¾å¤ç¨éå·åéï¼ | | taskId | Long | 主设å¤ID | | areaId | Long | 设å¤åºåID | | areaName | String | 设å¤åºååç§° | | deviceModel | String | 设å¤åå·ï¼å¤ä¸ªç¨éå·åéï¼ | | deviceLedgerIdsStr | String | 设å¤IDå符串ï¼éå·åéï¼ | | frequencyType | String | 颿¬¡ç±»å | | frequencyDetail | String | 颿¬¡è¯¦æ | | nextExecutionTime | DateTime | 䏿¬¡æ§è¡æ¶é´ | | lastExecutionTime | DateTime | æåæ§è¡æ¶é´ | | isEnabled | Integer | æ¯å¦å¯ç¨ | | remarks | String | 夿³¨ | | registrantId | Long | å½å ¥äººID | | registrant | String | å½å ¥äººå§å | | registrationDate | Date | å½å ¥æ¥æ | | createTime | DateTime | å建æ¶é´ | | updateTime | DateTime | æ´æ°æ¶é´ | --- ## 注æäºé¡¹ 1. **设å¤éæ©**ï¼å¯ä»¥ä¼ å ¥ `deviceLedgerIds` æ°ç»æ `deviceLedgerIdsStr` å符串æå®å¤ä¸ªè®¾å¤ 2. **ä»»å¡åç§°**ï¼å¦ä¸ä¼ `taskName`ï¼ç³»ç»ä¼æ ¹æ®è®¾å¤åç§°èªå¨çæ 3. **䏿¬¡æ§è¡æ¶é´**ï¼æ°å¢ææ´æ°æ¶ä¼èªå¨è®¡ç®ä¸æ¬¡æ§è¡æ¶é´ 4. **å¯ç¨/ç¦ç¨**ï¼ç¦ç¨ä»»å¡ä¸ä¼å é¤å®æ¶å¨ï¼åªæ¯æåæ§è¡ï¼å¯ç¨å伿¢å¤ 5. **å é¤ä»»å¡**ï¼å é¤ä»»å¡ä¼åæ¶ç§»é¤ç¸å ³ç宿¶è°åº¦ pom.xml
@@ -326,6 +326,13 @@ <version>${poi.version}</version> </dependency> <!-- word docæ ¼å¼å¤ç(HWPF) --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-scratchpad</artifactId> <version>${poi.version}</version> </dependency> <!-- velocity代ç çæä½¿ç¨æ¨¡æ¿ --> <dependency> src/main/java/com/ruoyi/device/controller/DeviceMaintenanceController.java
@@ -57,9 +57,15 @@ } @PostMapping ("maintenance") @Operation(summary = "ä¿®æ¹è®¾å¤ä¿å »") @Operation(summary = "确认设å¤ä¿å »") public AjaxResult maintenance(@RequestBody DeviceMaintenanceDto deviceMaintenance) { return deviceMaintenanceService.updateDeviceDeviceMaintenance(deviceMaintenance); return deviceMaintenanceService.confirmMaintenance(deviceMaintenance); } @PostMapping ("/acceptance") @Operation(summary = "设å¤ä¿å »éªæ¶å®¡æ¹") public AjaxResult acceptance(@RequestBody DeviceMaintenanceDto deviceMaintenance) { return deviceMaintenanceService.approveMaintenanceAcceptance(deviceMaintenance); } src/main/java/com/ruoyi/device/controller/MaintenanceTaskController.java
@@ -57,5 +57,12 @@ return maintenanceTaskService.delete(ids); } @PostMapping("/changeEnable") @Operation(summary = "å¯ç¨/ç¦ç¨è®¾å¤ä¿å »å®æ¶ä»»å¡") @Log(title = "设å¤ä¿å »å®æ¶ä»»å¡", businessType = BusinessType.UPDATE) public AjaxResult changeEnable(@RequestBody MaintenanceTask maintenanceTask) { return maintenanceTaskService.changeEnable(maintenanceTask.getId(), maintenanceTask.getIsEnabled()); } } src/main/java/com/ruoyi/device/dto/DeviceMaintenanceDto.java
@@ -54,7 +54,7 @@ private String createUserName; @Schema(description = "ä¿å »å¾ç") private List<StorageBlobDTO> storageBlobDTOs; private List<StorageBlobDTO> storageBlobDTOs = new java.util.ArrayList<>(); } src/main/java/com/ruoyi/device/dto/DeviceRepairDto.java
@@ -5,6 +5,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.util.ArrayList; import java.util.List; @Data @@ -16,5 +17,5 @@ @Schema(description = "ç»´ä¿®æ¶é´å符串") private String maintenanceTimeStr; private List<StorageBlobDTO> storageBlobDTOs; private List<StorageBlobDTO> storageBlobDTOs = new ArrayList<>(); } src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java
@@ -64,9 +64,20 @@ @Schema(description = "ä¿å »ç»æ 0 ç»´ä¿® 1 å®å¥½") private String maintenanceResult; @Schema(description = "ç¶æ 0 å¾ ä¿å » 1 å®ç» 2 失败") @Schema(description = "ç¶æ 0 å¾ ä¿å » 1 å®ç» 2 失败 3 å¾ éªæ¶") private Integer status; @Schema(description = "éªæ¶äºº") private String acceptanceName; @Schema(description = "éªæ¶æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime acceptanceTime; @Schema(description = "éªæ¶å¤æ³¨") private String acceptanceRemark; @Schema(description = "å建æ¶é´") @TableField(fill = FieldFill.INSERT) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java
@@ -68,6 +68,9 @@ @Schema(description = "æ¯å¦æ¿æ´»") private boolean isActive; @Schema(description = "æ¯å¦å¯ç¨ 0-ç¦ç¨ 1-å¯ç¨") private Integer isEnabled; @Schema(description = "夿³¨") @Excel(name = "夿³¨") private String remarks; src/main/java/com/ruoyi/device/service/IDeviceMaintenanceService.java
@@ -18,6 +18,10 @@ AjaxResult updateDeviceDeviceMaintenance(DeviceMaintenanceDto deviceMaintenance); AjaxResult confirmMaintenance(DeviceMaintenanceDto deviceMaintenanceDto); AjaxResult approveMaintenanceAcceptance(DeviceMaintenanceDto deviceMaintenanceDto); void export(HttpServletResponse response, Long[] ids); DeviceMaintenanceVo detailById(Long id); src/main/java/com/ruoyi/device/service/MaintenanceTaskService.java
@@ -19,4 +19,6 @@ AjaxResult updateByMaintenanceTaskId(MaintenanceTask maintenanceTask); AjaxResult delete(List<Long> ids); AjaxResult changeEnable(Long id, Integer isEnabled); } src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceServiceImpl.java
@@ -45,6 +45,11 @@ private final FileUtil fileUtil; private final ISysNoticeService sysNoticeService; private static final int STATUS_PENDING_MAINTENANCE = 0; private static final int STATUS_COMPLETED = 1; private static final int STATUS_FAILED = 2; private static final int STATUS_PENDING_ACCEPTANCE = 3; @Override public IPage<DeviceMaintenanceDto> queryPage(Page page, DeviceMaintenanceDto deviceMaintenanceDto) { @@ -81,6 +86,12 @@ deviceMaintenance.setDeviceName(byId.getDeviceName()); deviceMaintenance.setDeviceModel(byId.getDeviceModel()); deviceMaintenance.setAreaId(byId.getAreaId()); } if (deviceMaintenance.getStatus() != null && deviceMaintenance.getStatus() == STATUS_COMPLETED && (oldDeviceMaintenance.getStatus() == null || oldDeviceMaintenance.getStatus() != STATUS_COMPLETED)) { return AjaxResult.error("è¯·å æäº¤éªæ¶å®¡æ¹ï¼éªæ¶éè¿åæå¯å®ç»"); } // å¤çå¤ä»¶ä½¿ç¨æ åµ if (com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(deviceMaintenance.getSparePartsUseList())) { @@ -156,4 +167,56 @@ vo.setStorageBlobVOs(fileUtil.getStorageBlobVOsByRecordTypeAndRecordId(RecordTypeEnum.DEVICE_MAINTENANCE, id)); return vo; } @Override @Transactional(rollbackFor = Exception.class) public AjaxResult confirmMaintenance(DeviceMaintenanceDto deviceMaintenanceDto) { DeviceMaintenance oldDeviceMaintenance = this.getById(deviceMaintenanceDto.getId()); if (oldDeviceMaintenance == null) { return AjaxResult.error("ä¿å »è®°å½ä¸åå¨"); } if (oldDeviceMaintenance.getStatus() != null && oldDeviceMaintenance.getStatus() == STATUS_COMPLETED) { return AjaxResult.error("该ä¿å »å·²å®ç»ï¼ä¸è½éå¤ç¡®è®¤ä¿å »"); } if (oldDeviceMaintenance.getStatus() != null && oldDeviceMaintenance.getStatus() == STATUS_PENDING_ACCEPTANCE) { return AjaxResult.error("该ä¿å »å·²æäº¤éªæ¶å®¡æ¹"); } deviceMaintenanceDto.setStatus(STATUS_PENDING_ACCEPTANCE); return updateDeviceDeviceMaintenance(deviceMaintenanceDto); } @Override @Transactional(rollbackFor = Exception.class) public AjaxResult approveMaintenanceAcceptance(DeviceMaintenanceDto deviceMaintenanceDto) { if (deviceMaintenanceDto.getId() == null) { return AjaxResult.error("ä¿å »è®°å½idä¸è½ä¸ºç©º"); } DeviceMaintenance oldDeviceMaintenance = this.getById(deviceMaintenanceDto.getId()); if (oldDeviceMaintenance == null) { return AjaxResult.error("ä¿å »è®°å½ä¸åå¨"); } if (oldDeviceMaintenance.getStatus() == null || oldDeviceMaintenance.getStatus() != STATUS_PENDING_ACCEPTANCE) { return AjaxResult.error("该ä¿å »æªè¿å ¥å¾ éªæ¶ç¶æï¼ä¸è½å®¡æ¹"); } if (StringUtils.isBlank(deviceMaintenanceDto.getAcceptanceName())) { return AjaxResult.error("éªæ¶äººä¸è½ä¸ºç©º"); } if (deviceMaintenanceDto.getAcceptanceTime() == null) { return AjaxResult.error("éªæ¶æ¶é´ä¸è½ä¸ºç©º"); } if (StringUtils.isBlank(deviceMaintenanceDto.getAcceptanceRemark())) { return AjaxResult.error("éªæ¶å¤æ³¨ä¸è½ä¸ºç©º"); } DeviceMaintenance update = new DeviceMaintenance(); update.setId(deviceMaintenanceDto.getId()); update.setAcceptanceName(deviceMaintenanceDto.getAcceptanceName()); update.setAcceptanceTime(deviceMaintenanceDto.getAcceptanceTime()); update.setAcceptanceRemark(deviceMaintenanceDto.getAcceptanceRemark()); update.setStatus(STATUS_COMPLETED); if (this.updateById(update)) { return AjaxResult.success(); } return AjaxResult.error("éªæ¶å®¡æ¹å¤±è´¥"); } } src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java
@@ -160,6 +160,8 @@ return convertMonthlyToCron(task.getFrequencyDetail()); case "QUARTERLY": return convertQuarterlyToCron(task.getFrequencyDetail()); case "YEARLY": return convertYearlyToCron(task.getFrequencyDetail()); default: throw new IllegalArgumentException("䏿¯æçé¢çç±»å: " + task.getFrequencyType()); } @@ -204,6 +206,22 @@ quarterStartMonth); } // æ¯å¹´ä»»å¡è½¬æ¢ private String convertYearlyToCron(String frequencyDetail) { String[] parts = validateAndSplit(frequencyDetail, ",", 3); int month = validateMonth(parts[0]); // éªè¯æä»½(1-12) int day = validateDayOfMonth(parts[1]); // éªè¯æ¥æ LocalTime time = parseTime(parts[2]); // è§£ææ¶é´ // Cron表达å¼: ç§ å æ¶ æ¥ æ å¨ // æ¯å¹´æå®æä»½çæå®æ¥æ§è¡ return String.format("0 %d %d %d %d ?", time.getMinute(), time.getHour(), day, month); } // æ°å¢éªè¯æä»½çæ¹æ³(1-12) private int validateMonth(String monthStr) { try { src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java
@@ -147,4 +147,47 @@ } return AjaxResult.success("å 餿å"); } @Override public AjaxResult changeEnable(Long id, Integer isEnabled) { MaintenanceTask oldTask = maintenanceTaskMapper.selectById(id); if (oldTask == null) { return AjaxResult.error("ä¿å »ä»»å¡ä¸åå¨"); } MaintenanceTask update = new MaintenanceTask(); update.setId(id); update.setIsEnabled(isEnabled); update.setActive(isEnabled != null && isEnabled == 1); int result = maintenanceTaskMapper.updateById(update); if (result > 0) { try { if (isEnabled != null && isEnabled == 1) { // å¯ç¨ï¼æ¢å¤æéæ°è°åº¦ if (oldTask.getIsEnabled() != null && oldTask.getIsEnabled() == 0) { // ä»ç¦ç¨æ¹ä¸ºå¯ç¨ï¼éæ°è®¡ç®ä¸æ¬¡æ§è¡æ¶é´ï¼å¦ææ²¡æï¼ if (oldTask.getNextExecutionTime() == null || oldTask.getNextExecutionTime().isBefore(LocalDateTime.now())) { TimingTask tempTask = new TimingTask(); tempTask.setFrequencyType(oldTask.getFrequencyType()); tempTask.setFrequencyDetail(oldTask.getFrequencyDetail()); LocalDateTime nextTime = timingTaskService.calculateFirstExecutionTime(tempTask); update.setNextExecutionTime(nextTime); maintenanceTaskMapper.updateById(update); } maintenanceTaskScheduler.scheduleMaintenanceTask(oldTask); } else { maintenanceTaskScheduler.resumeMaintenanceTask(id); } } else { // ç¦ç¨ï¼æåè°åº¦ maintenanceTaskScheduler.pauseMaintenanceTask(id); } } catch (Exception e) { log.error("è°æ´ä¿å »ä»»å¡è°åº¦ç¶æå¤±è´¥", e); } return AjaxResult.success("æ´æ°æå"); } return AjaxResult.error("æ´æ°å¤±è´¥"); } } src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduleUtils.java
@@ -33,6 +33,8 @@ return calculateMonthlyNextTime(frequencyDetail, currentTime); case "QUARTERLY": return calculateQuarterlyNextTime(frequencyDetail, currentTime); case "YEARLY": return calculateYearlyNextTime(frequencyDetail, currentTime); default: throw new IllegalArgumentException("䏿¯æçé¢çç±»å: " + frequencyType); } @@ -105,6 +107,30 @@ throw new IllegalArgumentException("æ æ³æ¾å°ä¸ä¸æ¬¡æ§è¡æ¶é´"); } private static LocalDateTime calculateYearlyNextTime(String detail, LocalDateTime current) { String[] parts = validateAndSplit(detail, ",", 3); int month = validateMonth(parts[0]); int dayOfMonth = validateDayOfMonth(parts[1]); LocalTime time = parseTime(parts[2]); for (int i = 0; i < 5; i++) { int year = current.getYear() + i; YearMonth targetYearMonth = YearMonth.of(year, month); int adjustedDay = Math.min(dayOfMonth, targetYearMonth.lengthOfMonth()); LocalDateTime target = LocalDateTime.of( year, month, adjustedDay, time.getHour(), time.getMinute() ); if (target.isAfter(current)) { return target; } } throw new IllegalArgumentException("æ æ³æ¾å°ä¸ä¸æ¬¡æ§è¡æ¶é´"); } private static LocalTime parseTime(String timeStr) { try { return LocalTime.parse(timeStr, TIME_FORMATTER); src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java
@@ -247,8 +247,11 @@ // å¦ææ¯æ¯ææ§è¡ï¼è®¡ç®ä¸ä¸ªæçå ·ä½æ¥æ return calculateMonthlyFirstExecution(task.getFrequencyDetail()); } else if ("QUARTERLY".equals(frequencyType)) { // èªå®ä¹é¢çï¼å¦æ¯å°æ¶ãæ¯30åéç return calculateCustomFirstExecution(task.getFrequencyDetail()); // æ¯å£åº¦æ§è¡ return TimingTaskScheduleUtils.calculateFirstExecutionTime("QUARTERLY", task.getFrequencyDetail()); } else if ("YEARLY".equals(frequencyType)) { // æ¯å¹´æ§è¡ return TimingTaskScheduleUtils.calculateFirstExecutionTime("YEARLY", task.getFrequencyDetail()); } else { throw new IllegalArgumentException("䏿¯æçé¢çç±»å: " + task.getFrequencyType()); } @@ -409,7 +412,9 @@ case "MONTHLY": return calculateMonthlyNextTime(frequencyDetail, currentTime); case "QUARTERLY": return calculateQuarterlyNextTime(frequencyDetail, currentTime); return TimingTaskScheduleUtils.calculateNextExecutionTime("QUARTERLY", frequencyDetail, currentTime); case "YEARLY": return TimingTaskScheduleUtils.calculateNextExecutionTime("YEARLY", frequencyDetail, currentTime); default: throw new IllegalArgumentException("䏿¯æçé¢çç±»å: " + frequencyType); } src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
@@ -130,12 +130,33 @@ qualityInspectService.qualityInspectExport(response, qualityInspect); } @GetMapping("/export/weilong/{id}") @Operation(summary = "导åºä¼é¾æ¨¡çæ£éªç»æ") @Log(title = "导åºä¼é¾æ¨¡çæ£éªç»æ", businessType = BusinessType.EXPORT) public void exportWeiLong(HttpServletResponse response, @PathVariable("id") Long id) { qualityInspectService.exportWeiLong(response, id); } /** * æäº¤ * * @param qualityInspect * @return */ @GetMapping("/export/baishi/{id}") @Operation(summary = "导åºç¾äºæ¨¡çæ£éªç»æ") @Log(title = "导åºç¾äºæ¨¡çæ£éªç»æ", businessType = BusinessType.EXPORT) public void exportBaiShi(HttpServletResponse response, @PathVariable("id") Long id) { qualityInspectService.exportBaiShi(response, id); } @GetMapping("/export/dali/{id}") @Operation(summary = "导åºè¾¾å©æ¨¡çæ£éªç»æ") @Log(title = "导åºè¾¾å©æ¨¡çæ£éªç»æ", businessType = BusinessType.EXPORT) public void exportDaLi(HttpServletResponse response, @PathVariable("id") Long id) { qualityInspectService.exportDaLi(response, id); } @PostMapping("/submit") @Operation(summary = "æäº¤æ£éª") @Log(title = "æäº¤æ£éª", businessType = BusinessType.OTHER) @@ -165,4 +186,14 @@ public void down(HttpServletResponse response, @RequestBody QualityInspect qualityInspect) { qualityInspectService.down(response, qualityInspect); } /** * è°è¯æ¥å£ï¼åææ¨¡æ¿ç»æ */ @GetMapping("/analyzeTemplate") @Operation(summary = "åææ¨¡æ¿ç»æ(è°è¯)") public R<?> analyzeTemplate(@RequestParam String template) { String templatePath = "/static/" + template + ".doc"; return R.ok(qualityInspectService.analyzeTemplate(templatePath)); } } src/main/java/com/ruoyi/quality/service/IQualityInspectService.java
@@ -21,6 +21,12 @@ void qualityInspectExport(HttpServletResponse response, QualityInspect qualityInspect); void exportWeiLong(HttpServletResponse response, Long id); void exportBaiShi(HttpServletResponse response, Long id); void exportDaLi(HttpServletResponse response, Long id); QualityInspectDto getDetailById(Integer id); int submit(QualityInspect qualityInspect); @@ -33,4 +39,9 @@ R batchQuickInspect(BatchQuickInspectRequest request); void down(HttpServletResponse response, QualityInspect qualityInspect); /** * åææ¨¡æ¿ç»æ */ String analyzeTemplate(String templatePath); } src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -25,6 +25,7 @@ import com.ruoyi.quality.pojo.QualityInspect; import com.ruoyi.quality.pojo.QualityInspectParam; import com.ruoyi.quality.pojo.QualityUnqualified; import com.ruoyi.quality.utils.QualityInspectTemplateExportHelper; import com.ruoyi.stock.pojo.StockInRecord; import com.ruoyi.stock.service.StockInRecordService; import com.ruoyi.quality.service.IQualityInspectParamService; @@ -71,6 +72,8 @@ private SalesLedgerProductMapper salesLedgerProductMapper; private ProcurementRecordService procurementRecordService; private final QualityInspectTemplateExportHelper qualityInspectTemplateExportHelper; @Override public int add(QualityInspectDto qualityInspectDto) { @@ -444,5 +447,24 @@ } @Override public void exportWeiLong(HttpServletResponse response, Long id) { qualityInspectTemplateExportHelper.exportWeiLong(response, id); } @Override public void exportBaiShi(HttpServletResponse response, Long id) { qualityInspectTemplateExportHelper.exportBaiShi(response, id); } @Override public void exportDaLi(HttpServletResponse response, Long id) { qualityInspectTemplateExportHelper.exportDaLi(response, id); } @Override public String analyzeTemplate(String templatePath) { return qualityInspectTemplateExportHelper.analyzeTemplate(templatePath); } } src/main/java/com/ruoyi/quality/utils/QualityInspectTemplateExportHelper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,489 @@ package com.ruoyi.quality.utils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.quality.mapper.QualityInspectMapper; import com.ruoyi.quality.pojo.QualityInspect; import com.ruoyi.quality.pojo.QualityInspectParam; import com.ruoyi.quality.service.IQualityInspectParamService; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.apache.poi.hwpf.HWPFDocument; import org.apache.poi.hwpf.usermodel.Range; import org.apache.poi.hwpf.usermodel.Table; import org.apache.poi.hwpf.usermodel.TableCell; import org.apache.poi.hwpf.usermodel.TableIterator; import org.apache.poi.hwpf.usermodel.TableRow; import org.springframework.stereotype.Component; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; /** * Word template export helper for process inspection. */ @Component @RequiredArgsConstructor public class QualityInspectTemplateExportHelper { private static final String WEILONG_TEMPLATE = "/static/ä¼é¾æ¨¡ç.doc"; private static final String BAISHI_TEMPLATE = "/static/ç¾äºæ¨¡ç.doc"; private static final String DALI_TEMPLATE = "/static/è¾¾å©æ¨¡ç.doc"; private final QualityInspectMapper qualityInspectMapper; private final IQualityInspectParamService qualityInspectParamService; public void exportWeiLong(HttpServletResponse response, Long inspectId) { export(response, inspectId, WEILONG_TEMPLATE, "ä¼é¾æ¨¡çæ£éªç»æ"); } public void exportBaiShi(HttpServletResponse response, Long inspectId) { export(response, inspectId, BAISHI_TEMPLATE, "ç¾äºæ¨¡çæ£éªç»æ"); } public void exportDaLi(HttpServletResponse response, Long inspectId) { export(response, inspectId, DALI_TEMPLATE, "è¾¾å©æ¨¡çæ£éªç»æ"); } private void export(HttpServletResponse response, Long inspectId, String templatePath, String fileName) { if (inspectId == null) { throw new ServiceException("æ£éªåIDä¸è½ä¸ºç©º"); } QualityInspect inspect = qualityInspectMapper.selectById(inspectId); if (inspect == null) { throw new ServiceException("æ£éªåä¸åå¨"); } List<QualityInspectParam> paramList = qualityInspectParamService.list( Wrappers.<QualityInspectParam>lambdaQuery() .eq(QualityInspectParam::getInspectId, inspectId) .orderByAsc(QualityInspectParam::getId)); Map<String, String> valueMap = buildValueMap(paramList, inspect); try (InputStream inputStream = getClass().getResourceAsStream(templatePath)) { if (inputStream == null) { throw new ServiceException("æ¨¡æ¿æä»¶ä¸åå¨ï¼" + templatePath); } HWPFDocument document = new HWPFDocument(inputStream); fillDocument(document, valueMap); response.reset(); response.setContentType("application/msword"); response.setCharacterEncoding("UTF-8"); String encodedName = URLEncoder.encode(fileName, StandardCharsets.UTF_8).replace("+", "%20"); response.setHeader("Access-Control-Expose-Headers", "Content-Disposition"); response.setHeader("Content-Disposition", "attachment;filename=" + encodedName + ".doc"); try (OutputStream outputStream = response.getOutputStream()) { document.write(outputStream); outputStream.flush(); } } catch (IOException e) { throw new RuntimeException("导åºå¤±è´¥", e); } } private void fillDocument(HWPFDocument document, Map<String, String> valueMap) { Range range = document.getRange(); TableIterator iterator = new TableIterator(range); while (iterator.hasNext()) { Table table = iterator.next(); fillTable(table, valueMap); } } private void fillTable(Table table, Map<String, String> valueMap) { String currentGroupLabel = ""; // è®°å½ç»è®ºåçä½ç½®ï¼é¿å å¨ç»è®ºåä¸é¢ç»§ç»å¡«å int conclusionCellIndex = -1; for (int rowIndex = 0; rowIndex < table.numRows(); rowIndex++) { TableRow row = table.getRow(rowIndex); String firstCellText = getCellText(row, 0); String secondCellText = getCellText(row, 1); if (StringUtils.isNotBlank(firstCellText)) { currentGroupLabel = firstCellText; } // å 夿æ¯å¦ä¸ºç»è®ºè¡ String normalizedFirstCell = normalizeKey(firstCellText); boolean isConclusionRow = matchesSummaryRow(normalizedFirstCell); // 妿æ¯ç»è®ºè¡ï¼ç»è®ºåå§ç»æ¯æåä¸å if (isConclusionRow) { conclusionCellIndex = row.numCells() - 1; } String value = resolveValue(valueMap, currentGroupLabel, firstCellText, secondCellText, isConclusionRow); if (StringUtils.isBlank(value)) { continue; } // æ¥æ¾ç»æåä½ç½® int resultCellIndex; if (isConclusionRow) { resultCellIndex = conclusionCellIndex; } else { // æ®éè¡ï¼æ¾ç¬¬ä¸ä¸ªç©ºç½åå æ ¼ä½ä¸ºç»æåï¼ä½è¦æé¤ç»è®ºå resultCellIndex = findResultCellIndex(row, conclusionCellIndex); if (resultCellIndex < 0) { // ä¸ä½¿ç¨æåä¸åï¼é¿å ä¸ç»è®ºåå²çª int lastCellIndex = row.numCells() - 1; if (lastCellIndex > 1 && lastCellIndex != conclusionCellIndex) { resultCellIndex = lastCellIndex - 1; } } } if (resultCellIndex < 0 || resultCellIndex == conclusionCellIndex && !isConclusionRow) { continue; } TableCell resultCell = row.getCell(resultCellIndex); String cellText = cleanCellText(resultCell.text()); // ä¸¥æ ¼æ£æ¥ï¼åªæç©ºç½æå ä½ç¬¦æå¡«å if (!isBlankLike(cellText) && !isPlaceholder(cellText)) { continue; } // ä½¿ç¨æ´å®å ¨çå¡«å æ¹å¼ safeWriteCellText(resultCell, value); } } /** * æ¥æ¾ç»æåï¼æé¤ç»è®ºå */ private int findResultCellIndex(TableRow row, int excludeIndex) { for (int i = 1; i < row.numCells(); i++) { if (i == excludeIndex) { continue; } String cellText = cleanCellText(row.getCell(i).text()); if (isBlankLike(cellText) || isPlaceholder(cellText)) { return i; } } return -1; } /** * å®å ¨åå ¥åå æ ¼ææ¬ï¼é¿å å½±åå ¶ä»è¡ */ private void safeWriteCellText(TableCell cell, String value) { if (StringUtils.isBlank(value)) { return; } String originalText = cell.text(); String cleanedOriginal = cleanCellText(originalText); // 妿åå æ ¼å·²æå 容ä¸ä¸æ¯å ä½ç¬¦ï¼ä¸åå ¥ if (StringUtils.isNotBlank(cleanedOriginal) && !isPlaceholder(cleanedOriginal)) { return; } // åªä½¿ç¨replaceTextï¼ä¸ä½¿ç¨insertBefore try { if (StringUtils.isNotBlank(originalText)) { cell.replaceText(originalText, value); } else { // 空åå æ ¼ç´æ¥è®¾ç½®ææ¬ cell.insertBefore(value); } } catch (Exception e) { // å¤ç¨æ¹æ¡ï¼ä½¿ç¨getRangeæ¹å¼ try { // cell.getRange().insertAfter(value); } catch (Exception ignored) {} } } /** * 夿æ¯å¦ä¸ºå ä½ç¬¦ */ private boolean isPlaceholder(String text) { if (StringUtils.isBlank(text)) { return false; } String cleaned = text.trim(); // 常è§å ä½ç¬¦æ¨¡å¼ return cleaned.equals("â") || cleaned.equals("-") || cleaned.equals("_") || cleaned.equals("/") || cleaned.equals("\\") || cleaned.equals("â¡") || cleaned.equals("â ") || cleaned.equals("â") || cleaned.equals("â") || cleaned.equals("â»") || cleaned.equals("*") || cleaned.matches("^\\.{2,}$") || // å¤ä¸ªç¹ cleaned.matches("^{2,}$") || // å¤ä¸ªå¤§æ¬å· cleaned.equalsIgnoreCase("N/A") || cleaned.equalsIgnoreCase("NA") || cleaned.equals("å¾ æ£") || cleaned.equals("å¾ å¡«") || cleaned.equals("空ç½"); } private int findResultCellIndex(TableRow row) { for (int i = 1; i < row.numCells(); i++) { if (isBlankLike(row.getCell(i).text())) { return i; } } return -1; } private String resolveValue(Map<String, String> valueMap, String currentGroupLabel, String firstCellText, String secondCellText, boolean isConclusionRow) { LinkedHashSet<String> candidates = new LinkedHashSet<>(); addCandidate(candidates, firstCellText); addCandidate(candidates, secondCellText); addCandidate(candidates, firstCellText + secondCellText); if (StringUtils.isNotBlank(currentGroupLabel) && StringUtils.isNotBlank(secondCellText)) { addCandidate(candidates, currentGroupLabel + secondCellText); } if (StringUtils.isNotBlank(currentGroupLabel) && StringUtils.isNotBlank(firstCellText) && StringUtils.isBlank(secondCellText)) { addCandidate(candidates, currentGroupLabel); } // ç»è®ºè¡ä¸å¡«å ï¼ä¿ç模æ¿åå§æ°æ® if (isConclusionRow) { return null; } // æ®éè¡ï¼å æ¥æ£éªåæ°å¼ï¼æåæå¹é ç»è®ºè¡å ³é®è¯ for (String candidate : candidates) { String normalized = normalizeKey(candidate); // æ®éè¡è·³è¿ç»è®ºå ³é®è¯å¹é if (matchesSummaryRow(normalized)) { continue; } String value = lookupValue(valueMap, normalized); if (StringUtils.isNotBlank(value)) { return value; } } return null; } private boolean matchesSummaryRow(String normalizedText) { if (StringUtils.isBlank(normalizedText)) { return false; } return normalizedText.contains("è´¨éè¯å®") || normalizedText.contains("æ£éªç»è®º") || normalizedText.contains("Gradeestimation") || normalizedText.contains("Conclusion") || normalizedText.contains("Evaluation") || normalizedText.contains("è¯å®") || normalizedText.contains("ç»è®º"); } private String lookupValue(Map<String, String> valueMap, String normalizedCandidate) { if (StringUtils.isBlank(normalizedCandidate)) { return null; } String value = valueMap.get(normalizedCandidate); if (StringUtils.isNotBlank(value)) { return value; } String chineseCandidate = stripEnglishLetters(normalizedCandidate); value = valueMap.get(chineseCandidate); if (StringUtils.isNotBlank(value)) { return value; } for (Map.Entry<String, String> entry : valueMap.entrySet()) { String key = entry.getKey(); if (StringUtils.contains(key, normalizedCandidate) || StringUtils.contains(normalizedCandidate, key) || StringUtils.contains(key, chineseCandidate) || StringUtils.contains(chineseCandidate, key)) { return entry.getValue(); } } return null; } private Map<String, String> buildValueMap(List<QualityInspectParam> paramList, QualityInspect inspect) { Map<String, String> valueMap = new LinkedHashMap<>(); for (QualityInspectParam param : paramList) { String value = StringUtils.trimToNull(param.getTestValue()); if (StringUtils.isBlank(value)) { continue; } putValue(valueMap, param.getParameterItem(), value); } String checkResult = StringUtils.trimToNull(inspect.getCheckResult()); if (StringUtils.isNotBlank(checkResult)) { putValue(valueMap, "è´¨éè¯å®", checkResult); putValue(valueMap, "æ£éªç»æ", checkResult); putValue(valueMap, "æ£éªç»è®º", checkResult); putValue(valueMap, "Grade estimation", checkResult); putValue(valueMap, "Test Results", checkResult); } return valueMap; } private void putValue(Map<String, String> valueMap, String key, String value) { String normalizedKey = normalizeKey(key); if (StringUtils.isBlank(normalizedKey)) { return; } valueMap.put(normalizedKey, value); String chineseKey = stripEnglishLetters(normalizedKey); if (StringUtils.isNotBlank(chineseKey)) { valueMap.putIfAbsent(chineseKey, value); } } private void writeCellText(TableCell cell, String value) { if (StringUtils.isBlank(value)) { return; } String originalText = cell.text(); try { cell.replaceText(originalText, value); } catch (Exception ignored) { // Fallback below. } String cleanedText = cleanCellText(cell.text()); if (!cleanedText.contains(value)) { cell.insertBefore(value); } } private String getCellText(TableRow row, int index) { if (row.numCells() <= index) { return ""; } return cleanCellText(row.getCell(index).text()); } private String cleanCellText(String text) { if (text == null) { return ""; } return text.replace("\u0007", "") .replace("\r", "") .replace("\n", "") .trim(); } private boolean isBlankLike(String text) { String cleaned = cleanCellText(text); return StringUtils.isBlank(cleaned) || "-".equals(cleaned) || "_".equals(cleaned) || "â".equals(cleaned) || "·".equals(cleaned); } private void addCandidate(LinkedHashSet<String> candidates, String text) { if (StringUtils.isBlank(text)) { return; } candidates.add(text); } private String normalizeKey(String text) { String value = cleanCellText(text); if (StringUtils.isBlank(value)) { return ""; } value = value.replace("\u00A0", ""); value = value.replaceAll("\\s+", ""); value = value.replace("ï¼", ""); value = value.replace("ï¼", ""); value = value.replace("(", ""); value = value.replace(")", ""); value = value.replace("ï¼", ""); value = value.replace(",", ""); value = value.replace("ã", ""); value = value.replace("ï¼", ""); value = value.replace(":", ""); value = value.replace("ï¼", ""); value = value.replace(";", ""); value = value.replace("ã", ""); value = value.replace("â", ""); value = value.replace("â", ""); value = value.replace("ã", ""); value = value.replace("ã", ""); value = value.replace("%", ""); return value; } private String stripEnglishLetters(String text) { if (StringUtils.isBlank(text)) { return ""; } return text.replaceAll("[A-Za-z]", ""); } /** * è°è¯æ¹æ³ï¼åææ¨¡æ¿è¡¨æ ¼ç»æ */ public String analyzeTemplate(String templatePath) { StringBuilder sb = new StringBuilder(); try (InputStream inputStream = getClass().getResourceAsStream(templatePath)) { if (inputStream == null) { return "æ¨¡æ¿æä»¶ä¸åå¨ï¼" + templatePath; } HWPFDocument document = new HWPFDocument(inputStream); Range range = document.getRange(); TableIterator iterator = new TableIterator(range); int tableIndex = 0; while (iterator.hasNext()) { Table table = iterator.next(); sb.append("=== è¡¨æ ¼ ").append(tableIndex++).append(" ===\n"); sb.append("è¡æ°: ").append(table.numRows()).append("\n"); for (int rowIndex = 0; rowIndex < table.numRows(); rowIndex++) { TableRow row = table.getRow(rowIndex); sb.append("è¡").append(rowIndex).append(": "); for (int cellIndex = 0; cellIndex < row.numCells(); cellIndex++) { String cellText = cleanCellText(row.getCell(cellIndex).text()); sb.append("[å").append(cellIndex).append(": ").append(cellText).append("] "); } sb.append("\n"); } sb.append("\n"); } } catch (Exception e) { sb.append("åæå¤±è´¥: ").append(e.getMessage()); } return sb.toString(); } } src/main/resources/mapper/device/DeviceMaintenanceMapper.xml
@@ -13,6 +13,9 @@ dm.maintenance_actually_time, dm.maintenance_result, dm.status, dm.acceptance_name, dm.acceptance_time, dm.acceptance_remark, dm.create_time, dm.update_time, dm.create_user, @@ -65,6 +68,9 @@ dm.maintenance_actually_time, dm.maintenance_result, dm.status, dm.acceptance_name, dm.acceptance_time, dm.acceptance_remark, dm.create_time, dm.update_time, dm.create_user, src/main/resources/static/ΰÁúÄ£°æ.docBinary files differ
src/main/resources/static/°ÙÊÂÄ£°æ.docBinary files differ
src/main/resources/static/´ïÀûÄ£°æ.docBinary files differ