From b28714d4189dcc5091aac9d20480d72cdff0d25c Mon Sep 17 00:00:00 2001 From: wangfukang <15630117759@163.com> Date: Wed, 23 Sep 2026 13:43:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=97=B6=E9=97=B4=E8=8C=83?= =?UTF-8?q?=E5=9B=B4=E5=86=85=E5=BD=93=E5=89=8D=E5=BA=97=E9=93=BA=E7=9A=84?= =?UTF-8?q?=E4=BA=A4=E6=98=93=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cp.txt | 1 + .../src/main/resources/application.yml | 13 +- hiver-modules/hiver-mall/pom.xml | 28 ++- .../cc/hiver/mall/dao/mapper/SaleMapper.java | 2 + .../SalesCalculateServiceImpl.java | 66 ++--- .../serviceimpl/mybatis/SaleServiceImpl.java | 217 +++++++++------- .../java/cc/hiver/mall/utils/AliOcrUtil.java | 234 ++++++++---------- .../resources/mapper/PurchaseDetailMapper.xml | 1 + .../resources/mapper/ReturnDetailMapper.xml | 9 +- .../resources/mapper/SaleDetailMapper.xml | 15 +- .../src/main/resources/mapper/SaleMapper.xml | 10 + pom.xml | 21 ++ 12 files changed, 325 insertions(+), 292 deletions(-) create mode 100644 cp.txt diff --git a/cp.txt b/cp.txt new file mode 100644 index 0000000..0c7adca --- /dev/null +++ b/cp.txt @@ -0,0 +1 @@ +E:\repository\org\slf4j\jcl-over-slf4j\1.7.36\jcl-over-slf4j-1.7.36.jar;E:\repository\org\elasticsearch\plugin\lang-mustache-client\7.12.1\lang-mustache-client-7.12.1.jar;E:\repository\javax\xml\bind\jaxb-api\2.3.1\jaxb-api-2.3.1.jar;E:\repository\com\google\inject\guice\4.1.0\guice-4.1.0-no_aop.jar;E:\repository\com\github\jsqlparser\jsqlparser\4.3\jsqlparser-4.3.jar;E:\repository\org\bouncycastle\bcpkix-jdk15on\1.67\bcpkix-jdk15on-1.67.jar;E:\repository\com\github\ulisesbocchio\jasypt-spring-boot\3.0.4\jasypt-spring-boot-3.0.4.jar;E:\repository\com\github\ulisesbocchio\jasypt-spring-boot-starter\3.0.4\jasypt-spring-boot-starter-3.0.4.jar;E:\repository\com\google\auto\auto-common\1.2\auto-common-1.2.jar;E:\repository\com\google\j2objc\j2objc-annotations\1.3\j2objc-annotations-1.3.jar;E:\repository\com\fasterxml\jackson\dataformat\jackson-dataformat-yaml\2.12.6\jackson-dataformat-yaml-2.12.6.jar;E:\repository\org\javassist\javassist\3.27.0-GA\javassist-3.27.0-GA.jar;E:\repository\cn\dev33\sa-token-servlet\1.26.0\sa-token-servlet-1.26.0.jar;E:\repository\commons-codec\commons-codec\1.15\commons-codec-1.15.jar;E:\repository\org\jetbrains\kotlin\kotlin-stdlib-jdk8\1.5.32\kotlin-stdlib-jdk8-1.5.32.jar;E:\repository\org\springframework\boot\spring-boot-actuator\2.5.14\spring-boot-actuator-2.5.14.jar;E:\repository\org\testng\testng\7.1.0\testng-7.1.0.jar;E:\repository\org\springframework\data\spring-data-elasticsearch\4.2.11\spring-data-elasticsearch-4.2.11.jar;E:\repository\javax\cache\cache-api\1.1.1\cache-api-1.1.1.jar;E:\repository\com\carrotsearch\hppc\0.8.1\hppc-0.8.1.jar;E:\repository\javax\activation\javax.activation-api\1.2.0\javax.activation-api-1.2.0.jar;E:\repository\io\netty\netty-transport-rxtx\4.1.77.Final\netty-transport-rxtx-4.1.77.Final.jar;E:\repository\com\tencentcloudapi\tencentcloud-sdk-java-kms\3.1.213\tencentcloud-sdk-java-kms-3.1.213.jar;E:\repository\org\elasticsearch\plugin\parent-join-client\7.12.1\parent-join-client-7.12.1.jar;E:\repository\org\springframework\boot\spring-boot-starter-actuator\2.5.14\spring-boot-starter-actuator-2.5.14.jar;E:\repository\io\netty\netty-handler\4.1.77.Final\netty-handler-4.1.77.Final.jar;E:\repository\org\seleniumhq\selenium\selenium-java\4.1.4\selenium-java-4.1.4.jar;E:\repository\com\alibaba\druid-spring-boot-starter\1.2.9\druid-spring-boot-starter-1.2.9.jar;E:\repository\jakarta\xml\bind\jakarta.xml.bind-api\2.3.3\jakarta.xml.bind-api-2.3.3.jar;E:\repository\dom4j\dom4j\1.6.1\dom4j-1.6.1.jar;E:\repository\io\netty\netty-codec-memcache\4.1.77.Final\netty-codec-memcache-4.1.77.Final.jar;E:\repository\com\baomidou\mybatis-plus-extension\3.5.1\mybatis-plus-extension-3.5.1.jar;E:\repository\com\alipay\sdk\alipay-sdk-java\4.31.7.ALL\alipay-sdk-java-4.31.7.ALL.jar;E:\repository\org\springframework\boot\spring-boot-starter-data-redis\2.5.14\spring-boot-starter-data-redis-2.5.14.jar;E:\repository\com\sun\mail\jakarta.mail\1.6.7\jakarta.mail-1.6.7.jar;E:\repository\org\springframework\boot\spring-boot-starter-websocket\2.5.14\spring-boot-starter-websocket-2.5.14.jar;E:\repository\com\jcraft\jsch\0.1.55\jsch-0.1.55.jar;E:\repository\org\apache\httpcomponents\httpclient\4.5.13\httpclient-4.5.13.jar;E:\repository\org\elasticsearch\jna\5.7.0-1\jna-5.7.0-1.jar;E:\repository\io\github\classgraph\classgraph\4.1.7\classgraph-4.1.7.jar;E:\repository\org\springframework\boot\spring-boot-autoconfigure\2.5.14\spring-boot-autoconfigure-2.5.14.jar;E:\repository\org\jetbrains\kotlin\kotlin-stdlib-common\1.5.32\kotlin-stdlib-common-1.5.32.jar;E:\repository\org\seleniumhq\selenium\selenium-devtools-v85\4.1.4\selenium-devtools-v85-4.1.4.jar;E:\repository\org\seleniumhq\selenium\selenium-edge-driver\3.141.59\selenium-edge-driver-3.141.59.jar;E:\repository\org\apache\commons\commons-exec\1.3\commons-exec-1.3.jar;E:\repository\org\aspectj\aspectjweaver\1.9.7\aspectjweaver-1.9.7.jar;E:\repository\org\springframework\security\spring-security-web\5.5.8\spring-security-web-5.5.8.jar;E:\repository\io\netty\netty-transport-classes-kqueue\4.1.77.Final\netty-transport-classes-kqueue-4.1.77.Final.jar;E:\repository\org\springframework\spring-webmvc\5.3.20\spring-webmvc-5.3.20.jar;E:\repository\org\springframework\boot\spring-boot-starter-data-elasticsearch\2.5.14\spring-boot-starter-data-elasticsearch-2.5.14.jar;E:\repository\joda-time\joda-time\2.9.9\joda-time-2.9.9.jar;E:\repository\net\bytebuddy\byte-buddy\1.10.22\byte-buddy-1.10.22.jar;E:\repository\io\netty\netty-codec-dns\4.1.77.Final\netty-codec-dns-4.1.77.Final.jar;E:\repository\org\springframework\data\spring-data-commons\2.5.11\spring-data-commons-2.5.11.jar;E:\repository\cn\jpush\api\jpush-client\3.2.17\jpush-client-3.2.17.jar;E:\repository\com\google\guava\guava\30.1.1-jre\guava-30.1.1-jre.jar;E:\repository\org\elasticsearch\elasticsearch\7.12.1\elasticsearch-7.12.1.jar;E:\repository\com\google\auto\service\auto-service-annotations\1.0.1\auto-service-annotations-1.0.1.jar;E:\repository\jakarta\validation\jakarta.validation-api\2.0.2\jakarta.validation-api-2.0.2.jar;E:\repository\org\springframework\boot\spring-boot-starter-data-jpa\2.5.14\spring-boot-starter-data-jpa-2.5.14.jar;E:\repository\org\freemarker\freemarker\2.3.31\freemarker-2.3.31.jar;E:\repository\com\aliyun\oss\aliyun-sdk-oss\3.14.0\aliyun-sdk-oss-3.14.0.jar;E:\repository\io\springfox\springfox-spring-web\2.10.5\springfox-spring-web-2.10.5.jar;E:\repository\io\reactivex\rxjava2\rxjava\2.2.21\rxjava-2.2.21.jar;E:\repository\io\netty\netty-transport-native-unix-common\4.1.77.Final\netty-transport-native-unix-common-4.1.77.Final.jar;E:\repository\org\apache\poi\poi-ooxml-schemas\4.1.1\poi-ooxml-schemas-4.1.1.jar;E:\repository\com\tencentcloudapi\tencentcloud-sdk-java-common\3.1.213\tencentcloud-sdk-java-common-3.1.213.jar;E:\repository\com\qiniu\qiniu-java-sdk\7.9.3\qiniu-java-sdk-7.9.3.jar;E:\repository\org\apache\lucene\lucene-memory\8.8.0\lucene-memory-8.8.0.jar;E:\repository\org\jasypt\jasypt\1.9.3\jasypt-1.9.3.jar;E:\repository\org\seleniumhq\selenium\selenium-json\4.1.4\selenium-json-4.1.4.jar;E:\repository\com\google\guava\listenablefuture\9999.0-empty-to-avoid-conflict-with-guava\listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar;E:\repository\org\springframework\security\spring-security-core\5.5.8\spring-security-core-5.5.8.jar;E:\repository\org\springframework\boot\spring-boot-starter-web\2.5.14\spring-boot-starter-web-2.5.14.jar;E:\repository\org\apache\lucene\lucene-suggest\8.8.0\lucene-suggest-8.8.0.jar;E:\repository\com\carrotsearch\thirdparty\simple-xml-safe\2.7.1\simple-xml-safe-2.7.1.jar;E:\repository\cn\afterturn\easypoi-annotation\4.2.0\easypoi-annotation-4.2.0.jar;E:\repository\org\xerial\snappy\snappy-java\1.1.8.4\snappy-java-1.1.8.4.jar;E:\repository\org\springframework\security\spring-security-config\5.5.8\spring-security-config-5.5.8.jar;E:\repository\org\reactivestreams\reactive-streams\1.0.3\reactive-streams-1.0.3.jar;E:\repository\org\springframework\boot\spring-boot-starter-mail\2.5.14\spring-boot-starter-mail-2.5.14.jar;E:\repository\xml-apis\xml-apis\1.0.b2\xml-apis-1.0.b2.jar;E:\repository\javax\validation\validation-api\2.0.1.Final\validation-api-2.0.1.Final.jar;E:\repository\com\beust\jcommander\1.72\jcommander-1.72.jar;E:\repository\org\hibernate\validator\hibernate-validator\6.2.3.Final\hibernate-validator-6.2.3.Final.jar;E:\repository\antlr\antlr\2.7.7\antlr-2.7.7.jar;E:\repository\io\netty\netty-codec-haproxy\4.1.77.Final\netty-codec-haproxy-4.1.77.Final.jar;E:\repository\org\apache\lucene\lucene-highlighter\8.8.0\lucene-highlighter-8.8.0.jar;E:\repository\org\apache\lucene\lucene-queryparser\8.8.0\lucene-queryparser-8.8.0.jar;E:\repository\org\apache\poi\poi\4.1.1\poi-4.1.1.jar;E:\repository\com\sun\istack\istack-commons-runtime\3.0.12\istack-commons-runtime-3.0.12.jar;E:\repository\com\fasterxml\jackson\core\jackson-databind\2.12.6.1\jackson-databind-2.12.6.1.jar;E:\repository\org\elasticsearch\elasticsearch-secure-sm\7.12.1\elasticsearch-secure-sm-7.12.1.jar;E:\repository\com\github\xiaoymin\knife4j-spring-boot-autoconfigure\2.0.9\knife4j-spring-boot-autoconfigure-2.0.9.jar;E:\repository\org\springframework\spring-context-support\5.3.20\spring-context-support-5.3.20.jar;E:\repository\org\springframework\plugin\spring-plugin-core\2.0.0.RELEASE\spring-plugin-core-2.0.0.RELEASE.jar;E:\repository\com\google\guava\failureaccess\1.0.1\failureaccess-1.0.1.jar;E:\repository\org\springframework\spring-context\5.3.20\spring-context-5.3.20.jar;E:\repository\org\apache\lucene\lucene-misc\8.8.0\lucene-misc-8.8.0.jar;E:\repository\com\aventstack\extentreports\5.0.1\extentreports-5.0.1.jar;E:\repository\org\dom4j\dom4j\2.1.3\dom4j-2.1.3.jar;E:\repository\io\springfox\springfox-schema\2.10.5\springfox-schema-2.10.5.jar;E:\repository\io\springfox\springfox-core\2.10.5\springfox-core-2.10.5.jar;E:\repository\org\springframework\spring-expression\5.3.20\spring-expression-5.3.20.jar;E:\repository\org\springframework\spring-jdbc\5.3.20\spring-jdbc-5.3.20.jar;E:\repository\com\aliyun\aliyun-java-sdk-ram\3.1.0\aliyun-java-sdk-ram-3.1.0.jar;E:\repository\io\minio\minio\8.3.6\minio-8.3.6.jar;E:\repository\com\github\xiaoymin\knife4j-spring\2.0.9\knife4j-spring-2.0.9.jar;E:\repository\org\mongodb\mongodb-driver\3.3.0\mongodb-driver-3.3.0.jar;E:\repository\com\aventstack\extentreports-testng-adapter\1.2.2\extentreports-testng-adapter-1.2.2.jar;E:\repository\com\fasterxml\jackson\core\jackson-core\2.12.6\jackson-core-2.12.6.jar;E:\repository\org\springframework\spring-messaging\5.3.20\spring-messaging-5.3.20.jar;E:\repository\de\schlichtherle\truelicense\truelicense-core\1.33\truelicense-core-1.33.jar;E:\repository\io\netty\netty-transport-udt\4.1.77.Final\netty-transport-udt-4.1.77.Final.jar;E:\repository\org\apache\httpcomponents\httpmime\4.5.13\httpmime-4.5.13.jar;E:\repository\org\seleniumhq\selenium\selenium-remote-driver\3.141.59\selenium-remote-driver-3.141.59.jar;E:\repository\io\opentracing\opentracing-api\0.33.0\opentracing-api-0.33.0.jar;E:\repository\com\google\code\findbugs\jsr305\3.0.2\jsr305-3.0.2.jar;E:\repository\org\springframework\spring-jcl\5.3.20\spring-jcl-5.3.20.jar;E:\repository\org\apache\lucene\lucene-join\8.8.0\lucene-join-8.8.0.jar;E:\repository\io\springfox\springfox-spring-webmvc\2.10.5\springfox-spring-webmvc-2.10.5.jar;E:\repository\io\netty\netty-buffer\4.1.77.Final\netty-buffer-4.1.77.Final.jar;E:\repository\io\opentracing\opentracing-noop\0.33.0\opentracing-noop-0.33.0.jar;E:\repository\org\apache\commons\commons-compress\1.21\commons-compress-1.21.jar;E:\repository\io\micrometer\micrometer-core\1.7.12\micrometer-core-1.7.12.jar;E:\repository\org\attoparser\attoparser\2.0.5.RELEASE\attoparser-2.0.5.RELEASE.jar;E:\repository\io\opentracing\opentracing-util\0.33.0\opentracing-util-0.33.0.jar;E:\repository\org\springframework\spring-aop\5.3.20\spring-aop-5.3.20.jar;E:\repository\org\apache\lucene\lucene-spatial-extras\8.8.0\lucene-spatial-extras-8.8.0.jar;E:\repository\org\springframework\spring-oxm\5.3.20\spring-oxm-5.3.20.jar;E:\repository\io\springfox\springfox-spi\2.10.5\springfox-spi-2.10.5.jar;E:\repository\ch\ethz\ganymed\ganymed-ssh2\build210\ganymed-ssh2-build210.jar;E:\repository\io\netty\netty-codec-http2\4.1.77.Final\netty-codec-http2-4.1.77.Final.jar;E:\repository\org\unbescape\unbescape\1.1.6.RELEASE\unbescape-1.1.6.RELEASE.jar;E:\repository\cn\dev33\sa-token-core\1.26.0\sa-token-core-1.26.0.jar;E:\repository\io\springfox\springfox-swagger2\2.10.5\springfox-swagger2-2.10.5.jar;E:\repository\net\sf\jopt-simple\jopt-simple\5.0.2\jopt-simple-5.0.2.jar;E:\repository\com\aliyun\aliyun-java-sdk-kms\2.11.0\aliyun-java-sdk-kms-2.11.0.jar;E:\repository\org\projectlombok\lombok\1.18.24\lombok-1.18.24.jar;E:\repository\io\github\x-stream\mxparser\1.2.2\mxparser-1.2.2.jar;E:\repository\cc\hiver\hiver-app\1.0-SNAPSHOT\hiver-app-1.0-SNAPSHOT.jar;E:\repository\org\springframework\security\spring-security-crypto\5.5.8\spring-security-crypto-5.5.8.jar;E:\repository\com\fasterxml\jackson\dataformat\jackson-dataformat-smile\2.12.6\jackson-dataformat-smile-2.12.6.jar;E:\repository\org\jodd\jodd-core\5.1.6\jodd-core-5.1.6.jar;E:\repository\ognl\ognl\3.2.6\ognl-3.2.6.jar;E:\repository\io\netty\netty-codec-redis\4.1.77.Final\netty-codec-redis-4.1.77.Final.jar;E:\repository\com\zaxxer\HikariCP\4.0.3\HikariCP-4.0.3.jar;E:\repository\org\hibernate\hibernate-core\5.4.33\hibernate-core-5.4.33.jar;E:\repository\org\hdrhistogram\HdrHistogram\2.1.12\HdrHistogram-2.1.12.jar;E:\repository\com\github\binarywang\weixin-java-common\4.6.0\weixin-java-common-4.6.0.jar;E:\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.12.6\jackson-datatype-jsr310-2.12.6.jar;E:\repository\org\springframework\plugin\spring-plugin-metadata\2.0.0.RELEASE\spring-plugin-metadata-2.0.0.RELEASE.jar;E:\repository\org\springframework\boot\spring-boot-starter-thymeleaf\2.5.14\spring-boot-starter-thymeleaf-2.5.14.jar;E:\repository\org\apache\httpcomponents\httpasyncclient\4.1.5\httpasyncclient-4.1.5.jar;E:\repository\org\apache\lucene\lucene-grouping\8.8.0\lucene-grouping-8.8.0.jar;E:\repository\com\github\victools\jsonschema-generator\4.31.1\jsonschema-generator-4.31.1.jar;E:\repository\io\netty\netty-transport\4.1.77.Final\netty-transport-4.1.77.Final.jar;E:\repository\com\aventstack\klov-reporter\5.0.1\klov-reporter-5.0.1.jar;E:\repository\io\netty\netty-codec-socks\4.1.77.Final\netty-codec-socks-4.1.77.Final.jar;E:\repository\com\aliyun\aliyun-java-sdk-dysmsapi\1.0.0\aliyun-java-sdk-dysmsapi-1.0.0.jar;E:\repository\aopalliance\aopalliance\1.0\aopalliance-1.0.jar;E:\repository\org\apache\lucene\lucene-analyzers-common\8.8.0\lucene-analyzers-common-8.8.0.jar;E:\repository\com\alibaba\fastjson\1.2.62\fastjson-1.2.62.jar;E:\repository\io\springfox\springfox-bean-validators\2.10.5\springfox-bean-validators-2.10.5.jar;E:\repository\io\netty\netty-handler-proxy\4.1.77.Final\netty-handler-proxy-4.1.77.Final.jar;E:\repository\org\jetbrains\kotlin\kotlin-stdlib\1.5.32\kotlin-stdlib-1.5.32.jar;E:\repository\org\springframework\boot\spring-boot-starter-logging\2.5.14\spring-boot-starter-logging-2.5.14.jar;E:\repository\org\springframework\spring-websocket\5.3.20\spring-websocket-5.3.20.jar;E:\repository\org\elasticsearch\client\elasticsearch-rest-client\7.12.1\elasticsearch-rest-client-7.12.1.jar;E:\repository\org\seleniumhq\selenium\selenium-devtools-v99\4.1.4\selenium-devtools-v99-4.1.4.jar;E:\repository\jakarta\persistence\jakarta.persistence-api\2.2.3\jakarta.persistence-api-2.2.3.jar;E:\repository\org\springframework\data\spring-data-redis\2.5.11\spring-data-redis-2.5.11.jar;E:\repository\org\apache\commons\commons-lang3\3.12.0\commons-lang3-3.12.0.jar;E:\repository\org\springframework\boot\spring-boot-starter-json\2.5.14\spring-boot-starter-json-2.5.14.jar;E:\repository\io\netty\netty-codec-smtp\4.1.77.Final\netty-codec-smtp-4.1.77.Final.jar;E:\repository\io\swagger\swagger-models\1.5.22\swagger-models-1.5.22.jar;E:\repository\org\apache\lucene\lucene-core\8.8.0\lucene-core-8.8.0.jar;E:\repository\io\netty\netty-all\4.1.77.Final\netty-all-4.1.77.Final.jar;E:\repository\org\elasticsearch\elasticsearch-cli\7.12.1\elasticsearch-cli-7.12.1.jar;E:\repository\com\alibaba\druid\1.2.9\druid-1.2.9.jar;E:\repository\org\apache\commons\commons-math3\3.6.1\commons-math3-3.6.1.jar;E:\repository\javax\annotation\javax.annotation-api\1.3.2\javax.annotation-api-1.3.2.jar;E:\repository\io\projectreactor\reactor-core\3.4.18\reactor-core-3.4.18.jar;E:\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.12.6\jackson-module-parameter-names-2.12.6.jar;E:\repository\io\jsonwebtoken\jjwt\0.9.1\jjwt-0.9.1.jar;E:\repository\org\apache\lucene\lucene-sandbox\8.8.0\lucene-sandbox-8.8.0.jar;E:\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.63\tomcat-embed-core-9.0.63.jar;E:\repository\org\springframework\spring-aspects\5.3.20\spring-aspects-5.3.20.jar;E:\repository\io\netty\netty-codec-xml\4.1.77.Final\netty-codec-xml-4.1.77.Final.jar;E:\repository\cn\dev33\sa-token-spring-boot-starter\1.26.0\sa-token-spring-boot-starter-1.26.0.jar;E:\repository\org\checkerframework\checker-qual\3.8.0\checker-qual-3.8.0.jar;E:\repository\org\glassfish\jaxb\jaxb-runtime\2.3.6\jaxb-runtime-2.3.6.jar;E:\repository\com\squareup\okio\okio-jvm\3.6.0\okio-jvm-3.6.0.jar;E:\repository\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;E:\repository\org\mybatis\mybatis\3.5.9\mybatis-3.5.9.jar;E:\repository\org\springframework\data\spring-data-keyvalue\2.5.11\spring-data-keyvalue-2.5.11.jar;E:\repository\io\netty\netty-resolver-dns\4.1.77.Final\netty-resolver-dns-4.1.77.Final.jar;E:\repository\org\springframework\boot\spring-boot-starter-jdbc\2.5.14\spring-boot-starter-jdbc-2.5.14.jar;E:\repository\org\mapstruct\mapstruct\1.5.2.Final\mapstruct-1.5.2.Final.jar;E:\repository\com\google\auto\service\auto-service\1.0.1\auto-service-1.0.1.jar;E:\repository\org\apache\httpcomponents\httpcore-nio\4.4.15\httpcore-nio-4.4.15.jar;E:\repository\io\reactivex\rxjava3\rxjava\3.0.12\rxjava-3.0.12.jar;E:\repository\io\netty\netty-resolver-dns-classes-macos\4.1.77.Final\netty-resolver-dns-classes-macos-4.1.77.Final.jar;E:\repository\io\springfox\springfox-swagger-common\2.10.5\springfox-swagger-common-2.10.5.jar;E:\repository\com\squareup\okhttp3\okhttp\3.14.9\okhttp-3.14.9.jar;E:\repository\org\yaml\snakeyaml\1.28\snakeyaml-1.28.jar;E:\repository\org\thymeleaf\extras\thymeleaf-extras-java8time\3.0.4.RELEASE\thymeleaf-extras-java8time-3.0.4.RELEASE.jar;E:\repository\org\elasticsearch\elasticsearch-core\7.12.1\elasticsearch-core-7.12.1.jar;E:\repository\io\netty\netty-codec-http\4.1.77.Final\netty-codec-http-4.1.77.Final.jar;E:\repository\org\redisson\redisson\3.17.2\redisson-3.17.2.jar;E:\repository\org\apache\poi\poi-ooxml\4.1.1\poi-ooxml-4.1.1.jar;E:\repository\cn\jpush\api\jiguang-common\1.1.12\jiguang-common-1.1.12.jar;E:\repository\org\seleniumhq\selenium\selenium-ie-driver\3.141.59\selenium-ie-driver-3.141.59.jar;E:\repository\org\springframework\boot\spring-boot-actuator-autoconfigure\2.5.14\spring-boot-actuator-autoconfigure-2.5.14.jar;E:\repository\cn\hutool\hutool-all\5.8.1\hutool-all-5.8.1.jar;E:\repository\org\springframework\boot\spring-boot-starter-tomcat\2.5.14\spring-boot-starter-tomcat-2.5.14.jar;E:\repository\org\apache\lucene\lucene-backward-codecs\8.8.0\lucene-backward-codecs-8.8.0.jar;E:\repository\com\github\xiaoymin\knife4j-annotations\2.0.9\knife4j-annotations-2.0.9.jar;E:\repository\com\tdunning\t-digest\3.2\t-digest-3.2.jar;E:\repository\com\squareup\okio\okio\3.6.0\okio-3.6.0.jar;E:\repository\cn\afterturn\easypoi-base\4.2.0\easypoi-base-4.2.0.jar;E:\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.12.6\jackson-datatype-jdk8-2.12.6.jar;E:\repository\org\elasticsearch\elasticsearch-geo\7.12.1\elasticsearch-geo-7.12.1.jar;E:\repository\org\elasticsearch\plugin\aggs-matrix-stats-client\7.12.1\aggs-matrix-stats-client-7.12.1.jar;E:\repository\org\jboss\jandex\2.2.3.Final\jandex-2.2.3.Final.jar;E:\repository\com\github\xiaoymin\knife4j-core\2.0.9\knife4j-core-2.0.9.jar;E:\repository\org\hibernate\common\hibernate-commons-annotations\5.1.2.Final\hibernate-commons-annotations-5.1.2.Final.jar;E:\repository\org\elasticsearch\elasticsearch-x-content\7.12.1\elasticsearch-x-content-7.12.1.jar;E:\repository\org\mybatis\mybatis-spring\2.0.6\mybatis-spring-2.0.6.jar;E:\repository\javax\inject\javax.inject\1\javax.inject-1.jar;E:\repository\com\google\errorprone\error_prone_annotations\2.5.1\error_prone_annotations-2.5.1.jar;E:\repository\io\netty\netty-codec-mqtt\4.1.77.Final\netty-codec-mqtt-4.1.77.Final.jar;E:\repository\com\aliyun\aliyun-java-sdk-core\4.5.3\aliyun-java-sdk-core-4.5.3.jar;E:\repository\io\netty\netty-resolver\4.1.77.Final\netty-resolver-4.1.77.Final.jar;E:\repository\org\mongodb\mongodb-driver-core\4.2.3\mongodb-driver-core-4.2.3.jar;E:\repository\org\apache\logging\log4j\log4j-to-slf4j\2.17.2\log4j-to-slf4j-2.17.2.jar;E:\repository\org\jboss\marshalling\jboss-marshalling-river\2.0.11.Final\jboss-marshalling-river-2.0.11.Final.jar;E:\repository\org\springframework\spring-tx\5.3.20\spring-tx-5.3.20.jar;E:\repository\org\mongodb\bson\4.2.3\bson-4.2.3.jar;E:\repository\de\schlichtherle\truelicense\truelicense-xml\1.33\truelicense-xml-1.33.jar;E:\repository\com\google\code\gson\gson\2.9.0\gson-2.9.0.jar;E:\repository\org\elasticsearch\client\elasticsearch-rest-high-level-client\7.12.1\elasticsearch-rest-high-level-client-7.12.1.jar;E:\repository\org\glassfish\jaxb\txw2\2.3.6\txw2-2.3.6.jar;E:\repository\io\netty\netty-codec-stomp\4.1.77.Final\netty-codec-stomp-4.1.77.Final.jar;E:\repository\com\fasterxml\classmate\1.5.1\classmate-1.5.1.jar;E:\repository\org\springframework\spring-web\5.3.20\spring-web-5.3.20.jar;E:\repository\org\jetbrains\annotations\13.0\annotations-13.0.jar;E:\repository\stax\stax-api\1.0.1\stax-api-1.0.1.jar;E:\repository\org\jacoco\org.jacoco.agent\0.8.5\org.jacoco.agent-0.8.5-runtime.jar;E:\repository\io\lettuce\lettuce-core\6.1.8.RELEASE\lettuce-core-6.1.8.RELEASE.jar;E:\repository\org\bouncycastle\bcprov-jdk15on\1.67\bcprov-jdk15on-1.67.jar;E:\repository\org\springframework\boot\spring-boot-starter-security\2.5.14\spring-boot-starter-security-2.5.14.jar;E:\repository\org\jboss\logging\jboss-logging\3.4.3.Final\jboss-logging-3.4.3.Final.jar;E:\repository\org\elasticsearch\plugin\rank-eval-client\7.12.1\rank-eval-client-7.12.1.jar;E:\repository\io\swagger\swagger-annotations\1.5.22\swagger-annotations-1.5.22.jar;E:\repository\org\slf4j\slf4j-api\1.7.36\slf4j-api-1.7.36.jar;E:\repository\cc\hiver\hiver-file\1.0-SNAPSHOT\hiver-file-1.0-SNAPSHOT.jar;E:\repository\org\seleniumhq\selenium\selenium-chrome-driver\3.141.59\selenium-chrome-driver-3.141.59.jar;E:\repository\org\seleniumhq\selenium\selenium-opera-driver\3.141.59\selenium-opera-driver-3.141.59.jar;E:\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;E:\repository\org\springframework\data\spring-data-jpa\2.5.11\spring-data-jpa-2.5.11.jar;E:\repository\org\seleniumhq\selenium\selenium-devtools-v101\4.1.4\selenium-devtools-v101-4.1.4.jar;E:\repository\com\squareup\okhttp3\okhttp-sse\3.14.9\okhttp-sse-3.14.9.jar;E:\repository\com\tencentcloudapi\tencentcloud-sdk-java\3.1.445\tencentcloud-sdk-java-3.1.445.jar;E:\repository\org\springframework\boot\spring-boot-starter\2.5.14\spring-boot-starter-2.5.14.jar;E:\repository\xmlpull\xmlpull\1.1.3.1\xmlpull-1.1.3.1.jar;E:\repository\cc\hiver\hiver-core\1.0-SNAPSHOT\hiver-core-1.0-SNAPSHOT.jar;E:\repository\io\netty\netty-codec\4.1.77.Final\netty-codec-4.1.77.Final.jar;E:\repository\ch\qos\logback\logback-core\1.2.11\logback-core-1.2.11.jar;E:\repository\com\baomidou\mybatis-plus-core\3.5.1\mybatis-plus-core-3.5.1.jar;E:\repository\org\seleniumhq\selenium\selenium-support\3.141.59\selenium-support-3.141.59.jar;E:\repository\org\jdom\jdom2\2.0.6.1\jdom2-2.0.6.1.jar;E:\repository\com\baomidou\mybatis-plus-boot-starter\3.5.1\mybatis-plus-boot-starter-3.5.1.jar;E:\repository\com\github\xiaoymin\knife4j-spring-boot-starter\2.0.9\knife4j-spring-boot-starter-2.0.9.jar;E:\repository\com\baomidou\mybatis-plus-annotation\3.5.1\mybatis-plus-annotation-3.5.1.jar;E:\repository\commons-io\commons-io\2.7\commons-io-2.7.jar;E:\repository\com\squareup\okhttp3\logging-interceptor\3.14.9\logging-interceptor-3.14.9.jar;E:\repository\ch\qos\logback\logback-classic\1.2.11\logback-classic-1.2.11.jar;E:\repository\org\springframework\boot\spring-boot-starter-aop\2.5.14\spring-boot-starter-aop-2.5.14.jar;E:\repository\com\thoughtworks\xstream\xstream\1.4.20\xstream-1.4.20.jar;E:\repository\org\apache\logging\log4j\log4j-api\2.17.2\log4j-api-2.17.2.jar;E:\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.63\tomcat-embed-websocket-9.0.63.jar;E:\repository\org\redisson\redisson-spring-boot-starter\3.17.2\redisson-spring-boot-starter-3.17.2.jar;E:\repository\org\redisson\redisson-spring-data-27\3.17.2\redisson-spring-data-27-3.17.2.jar;E:\repository\org\jetbrains\kotlin\kotlin-stdlib-jdk7\1.5.32\kotlin-stdlib-jdk7-1.5.32.jar;E:\repository\com\sun\activation\jakarta.activation\1.2.2\jakarta.activation-1.2.2.jar;E:\repository\jakarta\transaction\jakarta.transaction-api\1.3.3\jakarta.transaction-api-1.3.3.jar;E:\repository\com\alibaba\dashscope-sdk-java\2.21.12\dashscope-sdk-java-2.21.12.jar;E:\repository\org\apache\xmlbeans\xmlbeans\3.1.0\xmlbeans-3.1.0.jar;E:\repository\org\jboss\marshalling\jboss-marshalling\2.0.11.Final\jboss-marshalling-2.0.11.Final.jar;E:\repository\org\jodd\jodd-bean\5.1.6\jodd-bean-5.1.6.jar;E:\repository\com\github\virtuald\curvesapi\1.06\curvesapi-1.06.jar;E:\repository\com\qcloud\cos_api\5.6.68\cos_api-5.6.68.jar;E:\repository\org\seleniumhq\selenium\selenium-api\3.141.59\selenium-api-3.141.59.jar;E:\repository\org\apache\tomcat\embed\tomcat-embed-el\9.0.63\tomcat-embed-el-9.0.63.jar;E:\repository\org\thymeleaf\thymeleaf\3.0.15.RELEASE\thymeleaf-3.0.15.RELEASE.jar;E:\repository\org\apache\lucene\lucene-queries\8.8.0\lucene-queries-8.8.0.jar;E:\repository\com\github\spullara\mustache\java\compiler\0.9.6\compiler-0.9.6.jar;E:\repository\org\slf4j\jul-to-slf4j\1.7.36\jul-to-slf4j-1.7.36.jar;E:\repository\com\belerweb\pinyin4j\2.5.0\pinyin4j-2.5.0.jar;E:\repository\org\springframework\spring-beans\5.3.20\spring-beans-5.3.20.jar;E:\repository\com\github\xiaoymin\knife4j-spring-ui\2.0.9\knife4j-spring-ui-2.0.9.jar;E:\repository\org\apache\commons\commons-collections4\4.4\commons-collections4-4.4.jar;E:\repository\org\springframework\spring-core\5.3.20\spring-core-5.3.20.jar;E:\repository\com\squareup\okhttp\logging-interceptor\2.7.5\logging-interceptor-2.7.5.jar;E:\repository\org\codehaus\jettison\jettison\1.1\jettison-1.1.jar;E:\repository\com\github\binarywang\weixin-java-mp\4.6.0\weixin-java-mp-4.6.0.jar;E:\repository\io\netty\netty-transport-classes-epoll\4.1.77.Final\netty-transport-classes-epoll-4.1.77.Final.jar;E:\repository\org\ini4j\ini4j\0.5.4\ini4j-0.5.4.jar;E:\repository\org\springframework\spring-orm\5.3.20\spring-orm-5.3.20.jar;E:\repository\com\squareup\okhttp\okhttp\2.7.5\okhttp-2.7.5.jar;E:\repository\org\seleniumhq\selenium\selenium-firefox-driver\3.141.59\selenium-firefox-driver-3.141.59.jar;E:\repository\org\elasticsearch\plugin\mapper-extras-client\7.12.1\mapper-extras-client-7.12.1.jar;E:\repository\org\apache\httpcomponents\httpcore\4.4.15\httpcore-4.4.15.jar;E:\repository\com\fasterxml\jackson\dataformat\jackson-dataformat-cbor\2.12.6\jackson-dataformat-cbor-2.12.6.jar;E:\repository\org\elasticsearch\plugin\transport-netty4-client\7.12.1\transport-netty4-client-7.12.1.jar;E:\repository\org\seleniumhq\selenium\selenium-safari-driver\3.141.59\selenium-safari-driver-3.141.59.jar;E:\repository\org\springframework\boot\spring-boot-starter-validation\2.5.14\spring-boot-starter-validation-2.5.14.jar;E:\repository\org\thymeleaf\thymeleaf-spring5\3.0.15.RELEASE\thymeleaf-spring5-3.0.15.RELEASE.jar;E:\repository\io\netty\netty-transport-sctp\4.1.77.Final\netty-transport-sctp-4.1.77.Final.jar;E:\repository\org\seleniumhq\selenium\selenium-devtools-v100\4.1.4\selenium-devtools-v100-4.1.4.jar;E:\repository\com\fasterxml\jackson\core\jackson-annotations\2.12.6\jackson-annotations-2.12.6.jar;E:\repository\org\springframework\boot\spring-boot\2.5.14\spring-boot-2.5.14.jar;E:\repository\org\apache\lucene\lucene-spatial3d\8.8.0\lucene-spatial3d-8.8.0.jar;E:\repository\com\baomidou\mybatis-plus\3.5.1\mybatis-plus-3.5.1.jar;E:\repository\io\netty\netty-common\4.1.77.Final\netty-common-4.1.77.Final.jar \ No newline at end of file diff --git a/hiver-admin/src/main/resources/application.yml b/hiver-admin/src/main/resources/application.yml index 020f544..5aeeeb5 100644 --- a/hiver-admin/src/main/resources/application.yml +++ b/hiver-admin/src/main/resources/application.yml @@ -18,6 +18,13 @@ server: max-swallow-size: -1 # 优雅停机 关闭容器后默认等待30秒继续执行没处理完的任务 避免数据不一致 shutdown: graceful + # Gzip 响应压缩 + compression: + enabled: true + # 需要压缩的 MIME 类型 + mime-types: application/json,application/xml,text/html,text/xml,text/plain,text/css,application/javascript,application/x-javascript + # 超过该大小才压缩(单位:字节) + min-response-size: 2048 spring: lifecycle: @@ -26,7 +33,7 @@ spring: # 数据源 datasource: # url: jdbc:mysql://154.8.162.157:3306/hiver_shop?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true&allowMultiQueries=true - url: jdbc:mysql://8.140.198.243:3306/hiver_shop?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true&allowMultiQueries=true + url: jdbc:mysql://127.0.0.1:3306/hiver_shop?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true&allowMultiQueries=true username: reddoor # Jasypt加密 可到common-utils中找到JasyptUtil加解密工具类生成加密结果 格式为ENC(加密结果) 以下解密结果为123456 password: ENC(Zla4U4+yRLPhicvuX2TmiEgxEpzP4dk8BHzFDEtiEhwLQIIaftZrrEUJZce6efoe) @@ -68,7 +75,7 @@ spring: # Redis 若设有密码自行添加配置password redis: # host: 154.8.162.157 - host: 8.140.198.243 + host: 127.0.0.1 password: reddoor168 # 数据库索引 默认0 database: 1 @@ -266,7 +273,7 @@ wx: key-prefix: wx redis: # host: 154.8.162.157 - host: 8.140.198.243 + host: 127.0.0.1 password: reddoor168 # 数据库索引 默认0 database: 1 diff --git a/hiver-modules/hiver-mall/pom.xml b/hiver-modules/hiver-mall/pom.xml index 0e00968..674c874 100644 --- a/hiver-modules/hiver-mall/pom.xml +++ b/hiver-modules/hiver-mall/pom.xml @@ -20,14 +20,40 @@ com.alibaba dashscope-sdk-java - 2.14.1 + 2.21.12 org.slf4j slf4j-simple + + + org.projectlombok + lombok + + + + com.squareup.okhttp3 + okhttp + 4.12.0 + + + com.squareup.okhttp3 + okhttp-sse + 4.12.0 + + + com.squareup.okhttp3 + logging-interceptor + 4.12.0 + + + com.squareup.okio + okio + 3.6.0 + cc.hiver hiver-file diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/SaleMapper.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/SaleMapper.java index 07ee95b..869c255 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/SaleMapper.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/SaleMapper.java @@ -48,6 +48,8 @@ public interface SaleMapper extends BaseMapper { List getShopRevenue(QueryShopRevenueVO queryShopRevenueVO); + List getShopWeekRevenue(@Param("shopId") String shopId, @Param("startTime") String startTime, @Param("endTime") String endTime); + Page getSaleListByProductId(Page page, @Param("productId") String productId); /** diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/SalesCalculateServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/SalesCalculateServiceImpl.java index e5f8349..452b43a 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/SalesCalculateServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/SalesCalculateServiceImpl.java @@ -10,6 +10,7 @@ import cc.hiver.mall.dao.mapper.SaleMapper; import cc.hiver.mall.entity.ReturnSaleExample; import cc.hiver.mall.entity.Sale; import cc.hiver.mall.entity.SaleExample; +import cc.hiver.mall.pojo.dto.ShopRevenue; import cc.hiver.mall.pojo.vo.CategoryNumberVo; import cc.hiver.mall.pojo.vo.SaleAllVO; import cc.hiver.mall.pojo.vo.TotalAlreadyEarnDetailVo; @@ -20,15 +21,12 @@ import cc.hiver.mall.service.mybatis.SaleService; import cc.hiver.mall.utils.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.extern.slf4j.Slf4j; -import org.apache.http.client.utils.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.ObjectUtils; import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; +import java.util.*; @Slf4j @Service @@ -159,17 +157,16 @@ public class SalesCalculateServiceImpl implements SalesCalculateService { //获取当日门店下单客户数 final QueryWrapper querySaleWrapper = new QueryWrapper<>(); - querySaleWrapper.select("user_id") + querySaleWrapper.select("count(distinct user_id)") .eq("shop_id", shopId) .ne("status",SaleConstant.SALE_STATUS[2]) .ne("status",SaleConstant.SALE_STATUS[8]) .ne("status",SaleConstant.SALE_STATUS[11]) .ne("status",SaleConstant.SALE_STATUS[12]) - .between("create_time", startDate, endDate) - .groupBy("user_id"); + .between("create_time", startDate, endDate); final List countCus = saleService.listObjs(querySaleWrapper); if (!ObjectUtils.isEmpty(countCus) && !countCus.isEmpty()) { - final int countCustomer = countCus.size(); + final int countCustomer = Integer.parseInt(countCus.get(0).toString()); saleAllVO.setTotalCCount(countCustomer); } else { saleAllVO.setTotalCCount(0); @@ -233,49 +230,20 @@ public class SalesCalculateServiceImpl implements SalesCalculateService { final List thisWeekSale = new ArrayList<>(); try{ // 今天 - final String todayDateStr = DateUtils.formatDate(new Date(), "yyyy-MM-dd"); - String searchDate; + final String todayDateStr = DateUtil.COMMON.getDateText(new Date()); + final String startTime = DateUtil.addDay(todayDateStr, -6); + final String endTime = DateUtil.addDay(todayDateStr, 1); + // 店铺id从缓存中获取,并放到数据中去 + final String shopId = securityUtil.getShopId(); + final List shopWeekRevenue = saleMapper.getShopWeekRevenue(shopId, startTime, endTime); + final Map weekSaleMap = new HashMap<>(); + for (ShopRevenue shopRevenue : shopWeekRevenue) { + weekSaleMap.put(DateUtil.COMMON.getDateText(shopRevenue.getDt()), shopRevenue.getRealAmount()); + } for (int i = -6; i < 1; i++) { // 查询的日期加一天 - searchDate = DateUtil.addDay(todayDateStr, i); - // 店铺id从缓存中获取,并放到数据中去 - final String shopId = securityUtil.getShopId(); - // 查询日期范围内数据 - final Date startDate = DateUtil.COMMON_FULL.getTextDate(searchDate + " 00:00:00"); - final Date endDate = DateUtil.COMMON_FULL.getTextDate(searchDate + " 23:59:59"); - - BigDecimal totalAmount1 = new BigDecimal(0); - //获取当日门店销售总额 - final SaleExample saleExample = new SaleExample(); - saleExample.createCriteria() - .andCreateTimeBetween(startDate, endDate) - .andStatusNotEqualTo(SaleConstant.SALE_STATUS[2]) - .andStatusNotEqualTo(SaleConstant.SALE_STATUS[8]) - .andStatusNotEqualTo(SaleConstant.SALE_STATUS[11]) - .andStatusNotEqualTo(SaleConstant.SALE_STATUS[12]) - .andShopIdEqualTo(shopId); - final SaleAllVO saleAllVO1 = saleMapper.saleSumAndCount(saleExample); - if (!ObjectUtils.isEmpty(saleAllVO1)) { - totalAmount1 = saleAllVO1.getTotalAmount(); - } - - //获取当日门店利润(当日总营收-当日总成本+(退货总营收-退货总成本)) - /*final QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("shop_id", shopId) - .between("create_time", startDate, endDate); - BigDecimal totalPurchasePrice = new BigDecimal("0.0"); - final List list = saleDetailService.list(queryWrapper); - for (SaleDetail saleDetail : list) { - final BigDecimal purchasePrice = saleDetail.getPurchasePrice(); - final int productCount = saleDetail.getProductCount(); - totalPurchasePrice = totalPurchasePrice.add(purchasePrice.multiply(new BigDecimal(productCount))); - } - // 利润= 销售总金额-成本 - final BigDecimal subtract = totalAmount1.subtract(totalPurchasePrice);*/ - - thisWeekSale.add(totalAmount1); - - + final String searchDate = DateUtil.addDay(todayDateStr, i); + thisWeekSale.add(weekSaleMap.getOrDefault(searchDate, BigDecimal.ZERO)); } }catch (Exception e){ log.error("获取本周日期错误!",e); diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/SaleServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/SaleServiceImpl.java index 1f78839..171019b 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/SaleServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/SaleServiceImpl.java @@ -179,96 +179,11 @@ public class SaleServiceImpl extends ServiceImpl implements Sa page = new Page<>(saleVO.getPageVo().getPageNumber(), saleVO.getPageVo().getPageSize()); } final Page saleList = saleMapper.queryPage(page, saleVO); - // 获取订单详情信息 - for (Sale sale : saleList.getRecords()) { - final QueryWrapper querySaleDetailWrapper = new QueryWrapper<>(); - querySaleDetailWrapper.select("product_id") - .eq("sale_id", sale.getId()) - .groupBy("product_id"); - final List list = saleDetailService.selectByCondition1(querySaleDetailWrapper); - if (!list.isEmpty()) { - final List saleDetailDTOS = new ArrayList<>(); - final Map productMap = new HashMap<>(); - // 获取商品信息 - final List productList = productService.getProductList(list); - for (Product product : productList) { - productMap.putIfAbsent(product.getId(), product); - } - for (String productId : list) { - final QueryWrapper queryPWrapper = new QueryWrapper<>(); - queryPWrapper.eq("sale_id", sale.getId()).eq("product_id", productId); - final List saleDetailList = saleDetailService.list(queryPWrapper); - final List saleDetailQueryDTOS = new ArrayList<>(); - final SaleDetailDTO saleDetailDTO = new SaleDetailDTO(); - - // 获取库存信息 - final QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("product_id", productId); - // 供应商名称 - final List stockList = stockService.list(queryWrapper); - final Map attributeMap = new HashMap<>(); - for (Stock stock : stockList) { - attributeMap.put(stock.getAttributeList(), stock.getStockCount()); - } - for (SaleDetail saleDetail : saleDetailList) { - saleDetailDTO.setProductId(productId); - saleDetailDTO.setProductName(saleDetail.getProductName()); - saleDetailDTO.setUnit(saleDetail.getUnit()); - saleDetailDTO.setShopId(sale.getShopId()); - saleDetailDTO.setCategoryId(saleDetail.getCategoryId()); - saleDetailDTO.setSaleId(saleDetail.getSaleId()); - saleDetailDTO.setPrice(saleDetail.getPrice()); - saleDetailDTO.setWholesalePrice(saleDetail.getWholesalePrice()); - - saleDetailDTO.setDiscount(saleDetail.getDiscount()); - saleDetailDTO.setDiscountAmount(saleDetail.getDiscountAmount()); - saleDetailDTO.setRealPrice(saleDetail.getRealPrice()); - // 回填商品的的图片及货号 - if (productMap.containsKey(productId)) { - final BigDecimal purchasePrice = productMap.get(productId).getPurchasePrice() == null ? BigDecimal.ZERO : productMap.get(productId).getPurchasePrice(); - saleDetailDTO.setPurchasePrice(purchasePrice); - saleDetailDTO.setProductPicture(productMap.get(productId).getProductPicture()); - saleDetailDTO.setProductSn(productMap.get(productId).getProductSn()); - saleDetailDTO.setAttrId(productMap.get(productId).getAttrId()); - saleDetailDTO.setCustomerCategoryRule(productMap.get(productId).getCustomerCategoryRule()); - } else { - saleDetailDTO.setPurchasePrice(saleDetail.getPurchasePrice()); - } - - final SaleDetailQueryDTO saleDetailQueryDTO = new SaleDetailQueryDTO(); - saleDetailQueryDTO.setAttributeList(saleDetail.getAttributeList()); - saleDetailQueryDTO.setProductCount(saleDetail.getProductCount()); - if (attributeMap.containsKey(saleDetail.getAttributeList())) { - final Integer stockCount = attributeMap.get(saleDetail.getAttributeList()); - saleDetailQueryDTO.setStockCount(stockCount); - } else { - saleDetailQueryDTO.setStockCount(null); - } - saleDetailQueryDTOS.add(saleDetailQueryDTO); - } - saleDetailDTO.setStockLogList1(saleDetailQueryDTOS); - saleDetailDTOS.add(saleDetailDTO); - } - sale.setSaleDetailDTOList(saleDetailDTOS); - } - final List buyCount = saleService.buyCount(sale.getUserId(), list); - // 封装为Map - final Map buyCountMap = new HashMap<>(); - for (BuyCountVo buyCountVo : buyCount) { - buyCountMap.put(buyCountVo.getProductId(), buyCountVo.getBuyCount()); - } - if (sale != null && sale.getSaleDetailDTOList() != null) { - for (SaleDetailDTO saleDetailDTO : sale.getSaleDetailDTOList()) { - final String productId = saleDetailDTO.getProductId(); - saleDetailDTO.setBuyCount(buyCountMap.getOrDefault(productId, 0)); - } - } - } - // 获取saleId final List saleIdList = new ArrayList<>(); for (Sale sale : saleList.getRecords()) { saleIdList.add(sale.getId()); } + fillSaleDetailDTOList(saleList.getRecords(), saleIdList); // 根据saleId获取标签信息 if (!saleIdList.isEmpty()) { final List lableList = lableService.getLableListBySaleIdList(saleIdList); @@ -294,6 +209,136 @@ public class SaleServiceImpl extends ServiceImpl implements Sa return saleList; } + private void fillSaleDetailDTOList(List sales, List saleIdList) { + if (sales == null || sales.isEmpty() || saleIdList.isEmpty()) { + return; + } + final List saleDetails = saleDetailService.getSaleDetails(saleIdList); + if (saleDetails == null || saleDetails.isEmpty()) { + return; + } + final Map> saleDetailMap = new LinkedHashMap<>(); + final Set productIdSet = new LinkedHashSet<>(); + for (SaleDetail saleDetail : saleDetails) { + saleDetailMap.computeIfAbsent(saleDetail.getSaleId(), key -> new ArrayList<>()).add(saleDetail); + if (org.apache.commons.lang3.StringUtils.isNotEmpty(saleDetail.getProductId())) { + productIdSet.add(saleDetail.getProductId()); + } + } + final List productIds = new ArrayList<>(productIdSet); + final Map productMap = buildProductMap(productIds); + final Map> stockMap = buildStockMap(productIds); + final Map> buyCountMap = buildBuyCountMap(sales, productIds); + + for (Sale sale : sales) { + final List details = saleDetailMap.get(sale.getId()); + if (details == null || details.isEmpty()) { + continue; + } + final Map> productDetailMap = new LinkedHashMap<>(); + for (SaleDetail saleDetail : details) { + productDetailMap.computeIfAbsent(saleDetail.getProductId(), key -> new ArrayList<>()).add(saleDetail); + } + final List saleDetailDTOS = new ArrayList<>(); + final Map customerBuyCountMap = buyCountMap.getOrDefault(sale.getUserId(), Collections.emptyMap()); + for (Map.Entry> entry : productDetailMap.entrySet()) { + final String productId = entry.getKey(); + final SaleDetailDTO saleDetailDTO = buildSaleDetailDTO(sale, productId, entry.getValue(), productMap, stockMap); + saleDetailDTO.setBuyCount(customerBuyCountMap.getOrDefault(productId, 0)); + saleDetailDTOS.add(saleDetailDTO); + } + sale.setSaleDetailDTOList(saleDetailDTOS); + } + } + + private Map buildProductMap(List productIds) { + final Map productMap = new HashMap<>(); + if (productIds.isEmpty()) { + return productMap; + } + final List productList = productService.getProductList(productIds); + for (Product product : productList) { + productMap.putIfAbsent(product.getId(), product); + } + return productMap; + } + + private Map> buildStockMap(List productIds) { + final Map> stockMap = new HashMap<>(); + if (productIds.isEmpty()) { + return stockMap; + } + final QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("product_id", productIds); + final List stockList = stockService.list(queryWrapper); + for (Stock stock : stockList) { + stockMap.computeIfAbsent(stock.getProductId(), key -> new HashMap<>()) + .put(stock.getAttributeList(), stock.getStockCount()); + } + return stockMap; + } + + private Map> buildBuyCountMap(List sales, List productIds) { + final Map> buyCountMap = new HashMap<>(); + if (productIds.isEmpty()) { + return buyCountMap; + } + final Set customerIdSet = new LinkedHashSet<>(); + for (Sale sale : sales) { + if (org.apache.commons.lang3.StringUtils.isNotEmpty(sale.getUserId())) { + customerIdSet.add(sale.getUserId()); + } + } + for (String customerId : customerIdSet) { + final List buyCount = saleService.buyCount(customerId, productIds); + final Map customerBuyCountMap = new HashMap<>(); + for (BuyCountVo buyCountVo : buyCount) { + customerBuyCountMap.put(buyCountVo.getProductId(), buyCountVo.getBuyCount()); + } + buyCountMap.put(customerId, customerBuyCountMap); + } + return buyCountMap; + } + + private SaleDetailDTO buildSaleDetailDTO(Sale sale, String productId, List saleDetailList, + Map productMap, Map> stockMap) { + final SaleDetailDTO saleDetailDTO = new SaleDetailDTO(); + final List saleDetailQueryDTOS = new ArrayList<>(); + final Map attributeMap = stockMap.getOrDefault(productId, Collections.emptyMap()); + for (SaleDetail saleDetail : saleDetailList) { + saleDetailDTO.setProductId(productId); + saleDetailDTO.setProductName(saleDetail.getProductName()); + saleDetailDTO.setUnit(saleDetail.getUnit()); + saleDetailDTO.setShopId(sale.getShopId()); + saleDetailDTO.setCategoryId(saleDetail.getCategoryId()); + saleDetailDTO.setSaleId(saleDetail.getSaleId()); + saleDetailDTO.setPrice(saleDetail.getPrice()); + saleDetailDTO.setWholesalePrice(saleDetail.getWholesalePrice()); + saleDetailDTO.setDiscount(saleDetail.getDiscount()); + saleDetailDTO.setDiscountAmount(saleDetail.getDiscountAmount()); + saleDetailDTO.setRealPrice(saleDetail.getRealPrice()); + if (productMap.containsKey(productId)) { + final Product product = productMap.get(productId); + final BigDecimal purchasePrice = product.getPurchasePrice() == null ? BigDecimal.ZERO : product.getPurchasePrice(); + saleDetailDTO.setPurchasePrice(purchasePrice); + saleDetailDTO.setProductPicture(product.getProductPicture()); + saleDetailDTO.setProductSn(product.getProductSn()); + saleDetailDTO.setAttrId(product.getAttrId()); + saleDetailDTO.setCustomerCategoryRule(product.getCustomerCategoryRule()); + } else { + saleDetailDTO.setPurchasePrice(saleDetail.getPurchasePrice()); + } + + final SaleDetailQueryDTO saleDetailQueryDTO = new SaleDetailQueryDTO(); + saleDetailQueryDTO.setAttributeList(saleDetail.getAttributeList()); + saleDetailQueryDTO.setProductCount(saleDetail.getProductCount()); + saleDetailQueryDTO.setStockCount(attributeMap.get(saleDetail.getAttributeList())); + saleDetailQueryDTOS.add(saleDetailQueryDTO); + } + saleDetailDTO.setStockLogList1(saleDetailQueryDTOS); + return saleDetailDTO; + } + @Override public Map getWaitCount(String shopId) { final QueryWrapper querySaleWrapper = new QueryWrapper<>(); diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/AliOcrUtil.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/AliOcrUtil.java index 3fc9f96..3cac431 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/AliOcrUtil.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/AliOcrUtil.java @@ -11,11 +11,12 @@ import cc.hiver.mall.purchaseocr.vo.PurchaseOcrExample; import cc.hiver.mall.service.mybatis.*; import cn.hutool.core.date.StopWatch; import com.alibaba.dashscope.aigc.generation.Generation; +import com.alibaba.dashscope.aigc.generation.GenerationParam; import com.alibaba.dashscope.aigc.generation.GenerationResult; -import com.alibaba.dashscope.aigc.generation.models.QwenParam; -import com.alibaba.dashscope.aigc.multimodalconversation.*; +import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversation; +import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationParam; +import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult; import com.alibaba.dashscope.common.Message; -import com.alibaba.dashscope.common.MessageManager; import com.alibaba.dashscope.common.MultiModalMessage; import com.alibaba.dashscope.common.Role; import com.alibaba.dashscope.exception.ApiException; @@ -50,6 +51,61 @@ public class AliOcrUtil { private static final Pattern COMPILE = Pattern.compile("\\D+"); private static final Pattern SYYS = Pattern.compile("所有颜色", Pattern.LITERAL); private static final Pattern SYCM = Pattern.compile("所有尺码", Pattern.LITERAL); + /** 图像识别:效果优先 */ + private static final String MODEL_VISION = "qwen3.5-plus"; + /** 语音/文本开单:速度优先(纯文本走 Generation,通常可压到 1s 左右) */ + private static final String MODEL_TEXT = "qwen-flash"; + + private static Map mmText(String text) { + final Map content = new HashMap<>(); + content.put("text", text); + return content; + } + + private static Map mmImage(String image) { + final Map content = new HashMap<>(); + content.put("image", image); + return content; + } + + private static MultiModalMessage mmMessage(String role, List> content) { + return MultiModalMessage.builder().role(role).content(content).build(); + } + + private static String extractMultiModalText(MultiModalConversationResult result) { + final List> content = result.getOutput().getChoices().get(0).getMessage().getContent(); + if (content == null || content.isEmpty() || content.get(0).get("text") == null) { + return ""; + } + return content.get(0).get("text").toString(); + } + + /** + * 文本开单走 Generation + 轻量模型,比 qwen3.5-plus 多模态快很多。 + */ + private static String callTextFast(String systemPrompt, String userPrompt) + throws ApiException, NoApiKeyException, InputRequiredException { + final Generation gen = new Generation(); + final List messages = new ArrayList<>(); + messages.add(Message.builder().role(Role.SYSTEM.getValue()).content(systemPrompt).build()); + messages.add(Message.builder().role(Role.USER.getValue()).content(userPrompt).build()); + final GenerationParam param = GenerationParam.builder() + .model(MODEL_TEXT) + .messages(messages) + .resultFormat(GenerationParam.ResultFormat.MESSAGE) + .temperature(0.2F) + .topP(0.8) + .maxTokens(1024) + .enableThinking(false) + .build(); + log.info("DashScope 文本调用开始, model={}", MODEL_TEXT); + final long start = System.currentTimeMillis(); + final GenerationResult result = gen.call(param); + final String text = result.getOutput().getChoices().get(0).getMessage().getContent(); + log.info("DashScope 文本调用结束, cost={}ms, textLength={}", System.currentTimeMillis() - start, + text == null ? 0 : text.length()); + return text == null ? "" : text; + } /** * AI入库图像识别-多轮对话 @@ -83,11 +139,9 @@ public class AliOcrUtil { Constants.apiKey = "sk-bcfa4865b89548acb8225f910f13d682"; final CopyOnWriteArrayList multiModalConversationResults = new CopyOnWriteArrayList<>(); final MultiModalConversation conv = new MultiModalConversation(); - final MultiModalMessageItemText systemText = new MultiModalMessageItemText("You are a helpful assistant."); - final MultiModalConversationMessage systemMessage = MultiModalConversationMessage.builder() - .role(Role.SYSTEM.getValue()).content(Collections.singletonList(systemText)).build(); + final MultiModalMessage systemMessage = mmMessage(Role.SYSTEM.getValue(), + Collections.singletonList(mmText("You are a helpful assistant."))); - final MultiModalMessageItemImage userImage = new MultiModalMessageItemImage(picturePath); final String firstQuestionMsg = "请把图片中的内容按照商品的不同规格拆分,返回" + count + "条JSON数据。\n" + " JSON示例:[{ \"productSn\": \"" + productSnExample + "\", \"productName\":\"" + productNameExample + "\", \"attributeList\": \"{'color':'" + purchaseOcrExample.getColor() + "','size':'" + purchaseOcrExample.getSize() + "'}\", \"productCount\": \"" + purchaseOcrExample.getProductCount() + "\", \"price\": \"" + purchaseOcrExample.getPrice() + "\" }]。" + "以下是几点要求: " + @@ -99,23 +153,23 @@ public class AliOcrUtil { "6.请注意返回JSON符号解析格式正确 ,确保java程序能够正确解析。" + "7.严格返回" + count + "条JSON数据,如果数量有偏差按照实际条数返回,不能自动省略!"; log.info("AI提问内容:" + firstQuestionMsg); - MultiModalMessageItemText userText = new MultiModalMessageItemText(firstQuestionMsg); - final MultiModalConversationMessage userMessage = - MultiModalConversationMessage.builder().role(Role.USER.getValue()) - .content(Arrays.asList(userImage, userText)).build(); - final CopyOnWriteArrayList messages = new CopyOnWriteArrayList<>(); + final MultiModalMessage userMessage = mmMessage(Role.USER.getValue(), + Arrays.asList(mmImage(picturePath), mmText(firstQuestionMsg))); + final CopyOnWriteArrayList messages = new CopyOnWriteArrayList<>(); messages.add(systemMessage); messages.add(userMessage); final MultiModalConversationParam param = MultiModalConversationParam.builder() - .model("qwen-vl-max") + .model(MODEL_VISION) .messages(messages) + .enableThinking(false) .build(); stopWatch.start("一轮会话"); + log.info("DashScope 图像识别开始, model={}, picture={}", MODEL_VISION, picturePath); MultiModalConversationResult result = conv.call(param); stopWatch.stop(); multiModalConversationResults.add(result); // 解析结果 - String text = result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text").toString(); + String text = extractMultiModalText(result); log.info("一轮对话-的json======" + text); // 根据{}截取数据 final int startIndex = text.indexOf('{'); @@ -170,21 +224,15 @@ public class AliOcrUtil { log.error(Thread.currentThread().getName() + "-一轮对话--->json识别报错喽,没关系,我来重新识别一下!"); //尝试重新识别一次 final String errorJsonQuestionMsg = "返回的json格式有误,请重新返回。"; - final MultiModalMessageItemText assistentText = new MultiModalMessageItemText( - text); - final MultiModalConversationMessage assistentMessage = MultiModalConversationMessage.builder() - .role(Role.ASSISTANT.getValue()).content(Collections.singletonList(assistentText)).build(); - messages.add(assistentMessage); - userText = new MultiModalMessageItemText(errorJsonQuestionMsg); - messages.add(MultiModalConversationMessage.builder().role(Role.USER.getValue()) - .content(Collections.singletonList(userText)).build()); - param.setMessages(new CopyOnWriteArrayList(messages)); + messages.add(mmMessage(Role.ASSISTANT.getValue(), Collections.singletonList(mmText(text)))); + messages.add(mmMessage(Role.USER.getValue(), Collections.singletonList(mmText(errorJsonQuestionMsg)))); + param.setMessages(new CopyOnWriteArrayList<>(messages)); stopWatch.start("一轮对话json格式错误重新识别!"); result = conv.call(param); multiModalConversationResults.add(result); stopWatch.stop(); // 解析结果 - text = result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text").toString(); + text = extractMultiModalText(result); log.info("一轮对话--json格式错误,重新识别的结果======" + text); // 根据{}截取数据 final int secondStartIndex = text.indexOf('{'); @@ -242,21 +290,15 @@ public class AliOcrUtil { final int missingCount = count - fristResultCount; if (missingCount > 0) { final String secondQuestionMsg = "缺少了" + missingCount + "条,请完整返回。"; - final MultiModalMessageItemText assistentText = new MultiModalMessageItemText( - text); - final MultiModalConversationMessage assistentMessage = MultiModalConversationMessage.builder() - .role(Role.ASSISTANT.getValue()).content(Collections.singletonList(assistentText)).build(); - messages.add(assistentMessage); - userText = new MultiModalMessageItemText(secondQuestionMsg); - messages.add(MultiModalConversationMessage.builder().role(Role.USER.getValue()) - .content(Collections.singletonList(userText)).build()); - param.setMessages(new CopyOnWriteArrayList(messages)); + messages.add(mmMessage(Role.ASSISTANT.getValue(), Collections.singletonList(mmText(text)))); + messages.add(mmMessage(Role.USER.getValue(), Collections.singletonList(mmText(secondQuestionMsg)))); + param.setMessages(new CopyOnWriteArrayList<>(messages)); stopWatch.start("二轮会话"); result = conv.call(param); multiModalConversationResults.add(result); stopWatch.stop(); // 解析结果 - String secondText = result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text").toString(); + String secondText = extractMultiModalText(result); log.info("二轮对话识别结果:" + secondText); // 根据{}截取数据 final int secondStartIndex = secondText.indexOf('{'); @@ -322,21 +364,15 @@ public class AliOcrUtil { log.error(Thread.currentThread().getName() + "-二轮对话--->json识别报错喽,没关系,我来重新识别一下!"); //尝试重新识别一次 final String errorJsonQuestionMsg = "返回的json格式有误,请重新返回。"; - final MultiModalMessageItemText secondJsonErrorAssistentText = new MultiModalMessageItemText( - secondText); - final MultiModalConversationMessage secondJsonErrorAssistentMessage = MultiModalConversationMessage.builder() - .role(Role.ASSISTANT.getValue()).content(Collections.singletonList(secondJsonErrorAssistentText)).build(); - messages.add(secondJsonErrorAssistentMessage); - userText = new MultiModalMessageItemText(errorJsonQuestionMsg); - messages.add(MultiModalConversationMessage.builder().role(Role.USER.getValue()) - .content(Collections.singletonList(userText)).build()); - param.setMessages(new CopyOnWriteArrayList(messages)); + messages.add(mmMessage(Role.ASSISTANT.getValue(), Collections.singletonList(mmText(secondText)))); + messages.add(mmMessage(Role.USER.getValue(), Collections.singletonList(mmText(errorJsonQuestionMsg)))); + param.setMessages(new CopyOnWriteArrayList<>(messages)); stopWatch.start("二轮会话json格式错误,重新识别!"); result = conv.call(param); multiModalConversationResults.add(result); stopWatch.stop(); // 解析结果 - secondText = result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text").toString(); + secondText = extractMultiModalText(result); log.info("二轮对话-json格式错误,重新识别的结果======" + secondText); // 根据{}截取数据 final int errorSsecondStartIndex = secondText.indexOf('{'); @@ -531,7 +567,7 @@ public class AliOcrUtil { } })).build(); final MultiModalConversationParam param = MultiModalConversationParam.builder() - .model("qwen-vl-max") + .model(MODEL_VISION) .message(userMessage) /*.stream(true) .temperature(1F) @@ -543,6 +579,7 @@ public class AliOcrUtil { .seed(500)*/ // 是否使用增量输出。当使用增量输出时每次流式返回的序列仅包含最新生成的增量内容,默认值为false,即输出完整的全量内容 .incrementalOutput(true) + .enableThinking(false) .build(); stopWatch.start("开始识别!"); final Flowable result = conv.streamCall(param); @@ -833,10 +870,6 @@ public class AliOcrUtil { final JSONObject jsonObject = new JSONObject(); Constants.apiKey = "sk-bcfa4865b89548acb8225f910f13d682"; final StopWatch stopWatch = new StopWatch("Ai回答计时"); - final Generation gen = new Generation(); - final MessageManager msgManager = new MessageManager(10); - final Message systemMsg = - Message.builder().role(Role.SYSTEM.getValue()).content("You are a helpful assistant.").build(); //questionMsg += "请帮我把所有内容封装为JSON,json格式为:[{ \"productSn\": \"货号\", \"attributeList\": [{\"color\":\"颜色\",\"size\":\"尺码\",\"productCount\": \"数量\"}] }]。以下是几点要求: 1.“货号”两个字和颜色中间的内容代表productSn,productSn可能包含\"新\"、\"退\"、\"旧\"、\"换\"、\"补\"。 2.\"SYYS色\"代表“所有颜色”,\"color\"字段返回“SYYS色”。 3.\"SYCM码\"代表“所有尺码”,\"size\"字段返回“SYCM码”。 4.只输出JSON数据即可,不用返回字段描述和解析过程。"; questionMsg += "你是一个服装行业库管专家,请帮我把所有内容封装为JSON,json格式为:[{ \"productSn\": \"货号\", \"attributeList\": [{\"color\":\"颜色\",\"size\":\"尺码\",\"productCount\": \"数量\"}] , \"wholesalePrice\":\"价格\"}],\n" + "1.productSn的返回值中去掉颜色,尺码等信息,\n" + @@ -848,22 +881,9 @@ public class AliOcrUtil { "7.如果没有识别到\"wholesalePrice\"的内容,则\"wholesalePrice\"赋值\"0\"。\n" + "8.只输出JSON数据即可,禁止返回除JSON数据外的任何内容!" + "9.返回的JSON数据不用换行,以最快的速度返回!"; - final Message userMsg = Message.builder().role(Role.USER.getValue()).content(questionMsg).build(); - msgManager.add(systemMsg); - msgManager.add(userMsg); stopWatch.start("开始回答"); - final QwenParam param = - QwenParam.builder().model("qwen-turbo").messages(msgManager.get()) - .resultFormat(QwenParam.ResultFormat.MESSAGE) - .seed(1234) - .temperature(0.7F) - .topP(0.8) - .repetitionPenalty(1.0F) - .build(); - final GenerationResult result = gen.call(param); - log.info(result.toString()); - // 解析结果 - final String text = result.getOutput().getChoices().get(0).getMessage().getContent(); + final String text = callTextFast("You are a helpful assistant.", questionMsg); + log.info(text); // 根据{}截取数据 final int startIndex = text.indexOf('{'); final int endIndex = text.lastIndexOf('}'); @@ -871,7 +891,7 @@ public class AliOcrUtil { stopWatch.stop(); log.info(stopWatch.prettyPrint()); jsonObject.put("resultContent", jsonStr); - jsonObject.put("msg", result.getOutput().getChoices().get(0).getMessage().getContent()); + jsonObject.put("msg", text); return jsonObject; } @@ -887,10 +907,6 @@ public class AliOcrUtil { throws NoApiKeyException, ApiException, InputRequiredException { final JSONObject jsonObject = new JSONObject(); Constants.apiKey = "sk-bcfa4865b89548acb8225f910f13d682"; - final Generation gen = new Generation(); - final MessageManager msgManager = new MessageManager(10); - final Message systemMsg = - Message.builder().role(Role.SYSTEM.getValue()).content("You are a helpful assistant.").build(); // questionMsg += "请帮我把所有内容封装为JSON,json格式为:[{ \"productSn\": \"货号\", \"productName\": \"名称\" , \"price\":\"单价\",\"attributeList\": [{\"color\":\"颜色\",\"size\":\"尺码\",\"productCount\": \"数量\"}] }]。以下是几点要求: 1.“货号”两个字和\"名称\"两个字中间的内容代表productSn的值,如果没有名称则“货号”两个字和颜色中间的内容代表productSn的值,productSn可能包含\"新\"、\"退\"、\"旧\"、\"换\"、\"补\"。2.\"SYYS色\"代表“所有颜色”,\"color\"字段返回“SYYS色”。 3.\"SYCM码\"代表“所有尺码”,\"size\"字段返回“SYCM码”。4.如果没有名称,productName字段返回\"\"。5.只输出JSON数据即可,不用返回字段描述和解析过程。"; questionMsg += "你是一个服装行业库管专家,请帮我把所有内容封装为JSON,json格式为:[{ \"productSn\": \"货号\", \"productName\": \"名称\" , \"attributeList\": [{\"color\":\"颜色\",\"size\":\"尺码\",\"productCount\": \"数量\"}], \"purchasePrice\":\"单价\" , \"price\":\"零售价\" , \"wholesalePrice\":\"批发价\" }]\n" + "1.如果没有识别到\"purchasePrice\"的内容,则\"purchasePrice\"赋值\"0\",purchasePrice为单价!" + @@ -903,27 +919,14 @@ public class AliOcrUtil { "8.如果指令中尺码是?码到?码,请完整返回跨度内所有尺码JSON、不要省略中间的尺码。(常见的尺码顺序:S码-M码-L码-XL码-2XL码-3XL码-4XL码-5XL码-6XL码-7XL码......)。\n" + "9.返回的JSON数据不用换行,以最快的速度返回!\n" + "10.只输出JSON数据即可,禁止返回除JSON数据外的任何内容!"; - final Message userMsg = Message.builder().role(Role.USER.getValue()).content(questionMsg).build(); - msgManager.add(systemMsg); - msgManager.add(userMsg); - final QwenParam param = - QwenParam.builder().model("qwen-turbo").messages(msgManager.get()) - .resultFormat(QwenParam.ResultFormat.MESSAGE) - .seed(1234) - .temperature(0.7F) - .topP(0.8) - .repetitionPenalty(1.0F) - .build(); - final GenerationResult result = gen.call(param); - log.info(result.toString()); - // 解析结果 - final String text = result.getOutput().getChoices().get(0).getMessage().getContent(); + final String text = callTextFast("You are a helpful assistant.", questionMsg); + log.info(text); // 根据{}截取数据 final int startIndex = text.indexOf('{'); final int endIndex = text.lastIndexOf('}'); final String jsonStr = '[' + text.substring(startIndex, endIndex + 1) + ']'; jsonObject.put("resultContent", jsonStr); - jsonObject.put("msg", result.getOutput().getChoices().get(0).getMessage().getContent()); + jsonObject.put("msg", text); return jsonObject; } @@ -932,10 +935,6 @@ public class AliOcrUtil { final JSONObject jsonObject = new JSONObject(); Constants.apiKey = "sk-bcfa4865b89548acb8225f910f13d682"; final StopWatch stopWatch = new StopWatch("Ai回答计时"); - final Generation gen = new Generation(); - final MessageManager msgManager = new MessageManager(10); - final Message systemMsg = - Message.builder().role(Role.SYSTEM.getValue()).content("You are a helpful assistant.").build(); // questionMsg += "请帮我把所有内容封装为JSON,json格式为:[{ \"productSn\": \"货号\", \"attributeList\": [{\"color\":\"颜色\",\"size\":\"尺码\",\"productCount\": \"数量\"}] }],只输出JSON数据即可,不用返回字段描述"; questionMsg += "你是一个服装行业库管专家,请帮我把所有内容封装为JSON,json格式为:[{ \"productSn\": \"货号\", \"attributeList\": [{\"color\":\"颜色\",\"size\":\"尺码\",\"productCount\": \"数量\"}] }],\n" + "1.productSn的返回值中去掉颜色,尺码等信息,\n" + @@ -944,22 +943,9 @@ public class AliOcrUtil { "4.如果指令中有“各N件”,则每个尺码数量返回N。\n" + "5.如果指令中尺码是?码到?码,请完整返回跨度内所有尺码JSON、不要省略中间的尺码。(常见的尺码顺序:S码-M码-L码-XL码-2XL码-3XL码-4XL码-5XL码-6XL码-7XL码......)。\n" + "6.只输出JSON数据即可,禁止返回除JSON数据外的任何内容!"; - final Message userMsg = Message.builder().role(Role.USER.getValue()).content(questionMsg).build(); - msgManager.add(systemMsg); - msgManager.add(userMsg); stopWatch.start("开始回答"); - final QwenParam param = - QwenParam.builder().model("qwen-turbo").messages(msgManager.get()) - .resultFormat(QwenParam.ResultFormat.MESSAGE) - .seed(1234) - .temperature(0.85F) - .topP(0.8) - .repetitionPenalty(1.0F) - .build(); - final GenerationResult result = gen.call(param); - log.info(result.toString()); - // 解析结果 - final String text = result.getOutput().getChoices().get(0).getMessage().getContent(); + final String text = callTextFast("You are a helpful assistant.", questionMsg); + log.info(text); // 根据{}截取数据 final int startIndex = text.indexOf('{'); final int endIndex = text.lastIndexOf('}'); @@ -968,7 +954,7 @@ public class AliOcrUtil { stopWatch.stop(); log.info(stopWatch.prettyPrint()); jsonObject.put("resultContent", jsonStr); - jsonObject.put("msg", result.getOutput().getChoices().get(0).getMessage().getContent()); + jsonObject.put("msg", text); return jsonObject; } @@ -1218,23 +1204,10 @@ public class AliOcrUtil { final JSONObject jsonObject = new JSONObject(); Constants.apiKey = "sk-bcfa4865b89548acb8225f910f13d682"; final StopWatch stopWatch = new StopWatch("Ai回答计时"); - final Generation gen = new Generation(); - final MessageManager msgManager = new MessageManager(10); - final Message systemMsg = - Message.builder().role(Role.SYSTEM.getValue()).content("You are a helpful assistant.").build(); questionMsg += "请帮我把所有内容封装为JSON,json格式为:[{ \"senderName\": \"发货人\", \"senderPhone\": \"发货人电话\" , \"receiverName\": \"收货人\", \"receiverPhone\": \"收货人电话\" , \"arrivalStation\":\"\"到达站,\"weight\":\"重量\",\"count\":\"件数\",\"methodOfSettlement\":\"结算方式\",\"tips\":\"小费\" }]。没有识别到的信息JSON字段返回\"\"。"; - final Message userMsg = Message.builder().role(Role.USER.getValue()).content(questionMsg).build(); - msgManager.add(systemMsg); - msgManager.add(userMsg); stopWatch.start("开始回答"); - final QwenParam param = - QwenParam.builder().model("qwen-max").messages(msgManager.get()) - .resultFormat(QwenParam.ResultFormat.MESSAGE) - .build(); - final GenerationResult result = gen.call(param); - log.info(result.toString()); - // 解析结果 - final String text = result.getOutput().getChoices().get(0).getMessage().getContent(); + final String text = callTextFast("You are a helpful assistant.", questionMsg); + log.info(text); // 根据{}截取数据 final int startIndex = text.indexOf('{'); final int endIndex = text.lastIndexOf('}'); @@ -1242,7 +1215,7 @@ public class AliOcrUtil { stopWatch.stop(); log.info(stopWatch.prettyPrint()); jsonObject.put("resultContent", jsonStr); - jsonObject.put("msg", result.getOutput().getChoices().get(0).getMessage().getContent()); + jsonObject.put("msg", text); return jsonObject; } @@ -1258,10 +1231,6 @@ public class AliOcrUtil { final JSONObject jsonObject = new JSONObject(); Constants.apiKey = "sk-bcfa4865b89548acb8225f910f13d682"; final StopWatch stopWatch = new StopWatch("Ai回答计时"); - final Generation gen = new Generation(); - final MessageManager msgManager = new MessageManager(10); - final Message systemMsg = - Message.builder().role(Role.SYSTEM.getValue()).content("你是一个物流开票员(这句话是给你的角色设定,不要在json信息中返回)").build(); final List shipperLogisticsAddressBooks = logisticsAddressBooks.get("shipper"); final List receiverLogisticsAddressBooks = logisticsAddressBooks.get("receiver"); final StringBuilder endQuestionMsg = new StringBuilder(); @@ -1295,18 +1264,9 @@ public class AliOcrUtil { .append("4.weight、count、tips、premium这几个字段只返回数字; ") .append("5.不要返回推理过程,只输出1条JSON数据即可,禁止返回除JSON数据外的任何内容!返回的JSON数据不用换行,以最快的速度返回!"); log.info("AI物流最终指令==="+endQuestionMsg); - final Message userMsg = Message.builder().role(Role.USER.getValue()).content(endQuestionMsg.toString()).build(); - msgManager.add(systemMsg); - msgManager.add(userMsg); stopWatch.start("开始回答"); - final QwenParam param = - QwenParam.builder().model("qwen-max").messages(msgManager.get()) - .resultFormat(QwenParam.ResultFormat.MESSAGE) - .build(); - final GenerationResult result = gen.call(param); - log.info(result.toString()); - // 解析结果 - final String text = result.getOutput().getChoices().get(0).getMessage().getContent(); + final String text = callTextFast("你是一个物流开票员(这句话是给你的角色设定,不要在json信息中返回)", endQuestionMsg.toString()); + log.info(text); // 根据{}截取数据 final int startIndex = text.indexOf('{'); final int endIndex = text.lastIndexOf('}'); @@ -1314,7 +1274,7 @@ public class AliOcrUtil { stopWatch.stop(); log.info(stopWatch.prettyPrint()); jsonObject.put("resultContent", jsonStr); - jsonObject.put("msg", result.getOutput().getChoices().get(0).getMessage().getContent()); + jsonObject.put("msg", text); return jsonObject; } } \ No newline at end of file diff --git a/hiver-modules/hiver-mall/src/main/resources/mapper/PurchaseDetailMapper.xml b/hiver-modules/hiver-mall/src/main/resources/mapper/PurchaseDetailMapper.xml index b055f69..6e5483a 100644 --- a/hiver-modules/hiver-mall/src/main/resources/mapper/PurchaseDetailMapper.xml +++ b/hiver-modules/hiver-mall/src/main/resources/mapper/PurchaseDetailMapper.xml @@ -700,6 +700,7 @@ t_purchase tp WHERE tp.in_storage_status = '1' + and tp.shop_id = #{supplierBillQueryVo.shopId} AND tp.create_time BETWEEN #{supplierBillQueryVo.startDate} AND #{supplierBillQueryVo.endDate} diff --git a/hiver-modules/hiver-mall/src/main/resources/mapper/ReturnDetailMapper.xml b/hiver-modules/hiver-mall/src/main/resources/mapper/ReturnDetailMapper.xml index f70bcdc..27f8aee 100644 --- a/hiver-modules/hiver-mall/src/main/resources/mapper/ReturnDetailMapper.xml +++ b/hiver-modules/hiver-mall/src/main/resources/mapper/ReturnDetailMapper.xml @@ -554,13 +554,16 @@ \ No newline at end of file diff --git a/hiver-modules/hiver-mall/src/main/resources/mapper/SaleDetailMapper.xml b/hiver-modules/hiver-mall/src/main/resources/mapper/SaleDetailMapper.xml index 08a962e..e126b5c 100644 --- a/hiver-modules/hiver-mall/src/main/resources/mapper/SaleDetailMapper.xml +++ b/hiver-modules/hiver-mall/src/main/resources/mapper/SaleDetailMapper.xml @@ -559,30 +559,19 @@ SELECT IFNULL(SUM( COALESCE(pd.purchase_price, 0) * sd.product_count),0.00) AS profit FROM t_sale_detail sd + JOIN t_sale ts ON sd.sale_id = ts.id JOIN t_product pd ON sd.product_id = pd.id WHERE sd.shop_id = #{shopId} and sd.create_time BETWEEN #{startDate} AND #{endDate} - AND sale_id IN ( - SELECT - id - FROM - t_sale ts - WHERE - ts.del_flag = '0' - AND ts.id IN ( SELECT sale_id FROM t_sale_detail tsd WHERE tsd.shop_id = #{shopId} - - AND tsd.create_time BETWEEN #{startDate} AND #{endDate} - - ) + AND ts.del_flag = '0' AND ts.shop_id = #{shopId} AND ts.STATUS NOT IN ( '2', '6', '7' ) AND ts.create_time BETWEEN #{startDate} AND #{endDate} - ) diff --git a/hiver-modules/hiver-mall/src/main/resources/mapper/SaleMapper.xml b/hiver-modules/hiver-mall/src/main/resources/mapper/SaleMapper.xml index 0bfc928..f3543c2 100644 --- a/hiver-modules/hiver-mall/src/main/resources/mapper/SaleMapper.xml +++ b/hiver-modules/hiver-mall/src/main/resources/mapper/SaleMapper.xml @@ -770,6 +770,16 @@ trans_company, company_name, product_count, remark, sale_name, company_phone, cr group by DATE_FORMAT(create_time, '%Y-%m-%d') + +