Pārlūkot izejas kodu

1、完成按要求提取前一天审核数据中权限最高的审核数据接口。
2、根据需求修改获取次一天(指最近的工作日(或加班)的时间)的审核结果中权限最高的一条数据。
3、修改提取小票审核结果的接口,添加判断输入不合法的userId的情况。
4、添加保存小票截图脱敏url和未脱敏url需求。

pc147123 2 gadi atpakaļ
vecāks
revīzija
751d789257
44 mainītis faili ar 1416 papildinājumiem un 318 dzēšanām
  1. 1 268
      .idea/ctr_audit.iml
  2. 1 1
      .idea/vcs.xml
  3. 0 1
      src/main/java/com/pavis/ctr/audit/common/utils/Base64Utils.java
  4. 58 0
      src/main/java/com/pavis/ctr/audit/common/utils/ConvertObjUtils.java
  5. 76 0
      src/main/java/com/pavis/ctr/audit/common/utils/DateUtils.java
  6. 76 12
      src/main/java/com/pavis/ctr/audit/common/utils/ImageUtils.java
  7. 1 1
      src/main/java/com/pavis/ctr/audit/framework/config/SecurityConfig.java
  8. 7 0
      src/main/java/com/pavis/ctr/audit/framework/config/SimpleScheduleConfig.java
  9. 46 7
      src/main/java/com/pavis/ctr/audit/project/controller/InitAuditTripController.java
  10. 32 0
      src/main/java/com/pavis/ctr/audit/project/controller/SubmitResultController.java
  11. 1 1
      src/main/java/com/pavis/ctr/audit/project/controller/TripImgUploadController.java
  12. 81 0
      src/main/java/com/pavis/ctr/audit/project/domain/AuditResultUser.java
  13. 7 7
      src/main/java/com/pavis/ctr/audit/project/domain/AuditTripResult.java
  14. 54 0
      src/main/java/com/pavis/ctr/audit/project/domain/RecordOcrTime.java
  15. 53 0
      src/main/java/com/pavis/ctr/audit/project/domain/RecordWorkDate.java
  16. 93 0
      src/main/java/com/pavis/ctr/audit/project/domain/TripImgInfo.java
  17. 21 0
      src/main/java/com/pavis/ctr/audit/project/domain/UpTrip.java
  18. 8 0
      src/main/java/com/pavis/ctr/audit/project/mapper/AuditTripMainMapper.java
  19. 10 0
      src/main/java/com/pavis/ctr/audit/project/mapper/AuditTripResultMapper.java
  20. 2 0
      src/main/java/com/pavis/ctr/audit/project/mapper/OcrTripMapper.java
  21. 13 0
      src/main/java/com/pavis/ctr/audit/project/mapper/RecordOcrTimeMapper.java
  22. 15 0
      src/main/java/com/pavis/ctr/audit/project/mapper/RecordWorkDateMapper.java
  23. 18 0
      src/main/java/com/pavis/ctr/audit/project/mapper/TripImgInfoMapper.java
  24. 9 0
      src/main/java/com/pavis/ctr/audit/project/service/IAuditTripMainService.java
  25. 21 0
      src/main/java/com/pavis/ctr/audit/project/service/IAuditTripResultService.java
  26. 15 0
      src/main/java/com/pavis/ctr/audit/project/service/IOcrTripService.java
  27. 15 0
      src/main/java/com/pavis/ctr/audit/project/service/IRecordOcrTimeService.java
  28. 14 0
      src/main/java/com/pavis/ctr/audit/project/service/IRecordWorkDateService.java
  29. 25 0
      src/main/java/com/pavis/ctr/audit/project/service/ITripImgInfoService.java
  30. 14 1
      src/main/java/com/pavis/ctr/audit/project/service/impl/AuditTripMainServiceImpl.java
  31. 158 8
      src/main/java/com/pavis/ctr/audit/project/service/impl/AuditTripResultServiceImpl.java
  32. 48 0
      src/main/java/com/pavis/ctr/audit/project/service/impl/OcrTripServiceImpl.java
  33. 25 0
      src/main/java/com/pavis/ctr/audit/project/service/impl/RecordOcrTimeSeriveImpl.java
  34. 25 0
      src/main/java/com/pavis/ctr/audit/project/service/impl/RecordWorkDateServiceImpl.java
  35. 85 0
      src/main/java/com/pavis/ctr/audit/project/service/impl/TripImgInfoServiceImpl.java
  36. 6 5
      src/main/resources/application-dev.yml
  37. 1 0
      src/main/resources/application.yml
  38. 2 1
      src/main/resources/logback.xml
  39. 5 0
      src/main/resources/mybatis/mapper/AuditTripMainMapper.xml
  40. 10 0
      src/main/resources/mybatis/mapper/AuditTripResultMapper.xml
  41. 20 0
      src/main/resources/mybatis/mapper/RecordOcrTimeMapper.xml
  42. 17 0
      src/main/resources/mybatis/mapper/RecordWorkDateMapper.xml
  43. 23 0
      src/main/resources/mybatis/mapper/TripImgInfoMapper.xml
  44. 204 5
      src/test/java/com/pavis/ctr/audit/CtrAuditApplicationTests.java

+ 1 - 268
.idea/ctr_audit.iml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+<module version="4">
   <component name="CheckStyle-IDEA-Module" serialisationVersion="2">
     <option name="activeLocationsIds" />
   </component>
@@ -17,271 +17,4 @@
       <configuration />
     </facet>
   </component>
-  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
-    <output url="file://$MODULE_DIR$/target/classes" />
-    <output-test url="file://$MODULE_DIR$/target/test-classes" />
-    <content url="file://$MODULE_DIR$">
-      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
-      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
-      <excludeFolder url="file://$MODULE_DIR$/target" />
-    </content>
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.7.10" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.7.10" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.7.10" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.7.10" level="project" />
-    <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.11" level="project" />
-    <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.11" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.17.2" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.17.2" level="project" />
-    <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.36" level="project" />
-    <orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:1.3.5" level="project" />
-    <orderEntry type="library" name="Maven: org.yaml:snakeyaml:1.30" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.7.10" level="project" />
-    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.13.5" level="project" />
-    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.13.5" level="project" />
-    <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.13.5" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.7.10" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.73" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.73" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-web:5.3.26" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.3.26" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.3.26" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-context:5.3.26" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.3.26" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-security:2.7.10" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.3.26" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.security:spring-security-config:5.7.7" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.security:spring-security-core:5.7.7" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.security:spring-security-crypto:5.7.7" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.security:spring-security-web:5.7.7" level="project" />
-    <orderEntry type="library" name="Maven: io.jsonwebtoken:jjwt:0.9.1" level="project" />
-    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.13.5" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-validation:2.7.10" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.73" level="project" />
-    <orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.2.5.Final" level="project" />
-    <orderEntry type="library" name="Maven: jakarta.validation:jakarta.validation-api:2.0.2" level="project" />
-    <orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.4.3.Final" level="project" />
-    <orderEntry type="library" scope="RUNTIME" name="Maven: mysql:mysql-connector-java:8.0.29" level="project" />
-    <orderEntry type="library" name="Maven: com.google.protobuf:protobuf-java:3.19.4" level="project" />
-    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-boot-starter:3.5.3" level="project" />
-    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus:3.5.3" level="project" />
-    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-extension:3.5.3" level="project" />
-    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-core:3.5.3" level="project" />
-    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-annotation:3.5.3" level="project" />
-    <orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:4.4" level="project" />
-    <orderEntry type="library" name="Maven: org.mybatis:mybatis:3.5.10" level="project" />
-    <orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:2.0.7" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.7.10" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.7.10" level="project" />
-    <orderEntry type="library" name="Maven: com.zaxxer:HikariCP:4.0.3" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.3.26" level="project" />
-    <orderEntry type="library" name="Maven: com.alibaba:druid-spring-boot-starter:1.2.16" level="project" />
-    <orderEntry type="library" name="Maven: com.alibaba:druid:1.2.16" level="project" />
-    <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.36" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.7.10" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-redis:2.7.10" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-keyvalue:2.7.10" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.7.10" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-tx:5.3.26" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-oxm:5.3.26" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.3.26" level="project" />
-    <orderEntry type="library" name="Maven: io.lettuce:lettuce-core:6.1.10.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: io.netty:netty-common:4.1.90.Final" level="project" />
-    <orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.90.Final" level="project" />
-    <orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.90.Final" level="project" />
-    <orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.90.Final" level="project" />
-    <orderEntry type="library" name="Maven: io.netty:netty-transport-native-unix-common:4.1.90.Final" level="project" />
-    <orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.90.Final" level="project" />
-    <orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.90.Final" level="project" />
-    <orderEntry type="library" name="Maven: io.projectreactor:reactor-core:3.4.28" level="project" />
-    <orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.4" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-aop:2.7.10" level="project" />
-    <orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.7" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-starter-test:2.7.10" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test:2.7.10" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.7.10" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: com.jayway.jsonpath:json-path:2.7.0" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: net.minidev:json-smart:2.4.10" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: net.minidev:accessors-smart:2.4.9" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.ow2.asm:asm:9.3" level="project" />
-    <orderEntry type="library" name="Maven: jakarta.xml.bind:jakarta.xml.bind-api:2.3.3" level="project" />
-    <orderEntry type="library" name="Maven: jakarta.activation:jakarta.activation-api:1.2.2" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.22.0" level="project" />
-    <orderEntry type="library" name="Maven: org.hamcrest:hamcrest:2.2" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter:5.8.2" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-api:5.8.2" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.opentest4j:opentest4j:1.2.0" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-commons:1.8.2" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.apiguardian:apiguardian-api:1.1.2" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-params:5.8.2" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-engine:5.8.2" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-engine:1.8.2" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:4.5.1" level="project" />
-    <orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy:1.12.23" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy-agent:1.12.23" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.objenesis:objenesis:3.2" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-junit-jupiter:4.5.1" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.skyscreamer:jsonassert:1.5.1" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-core:5.3.26" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.3.26" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:5.3.26" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.xmlunit:xmlunit-core:2.9.1" level="project" />
-    <orderEntry type="library" name="Maven: com.alibaba:easyexcel:3.2.1" level="project" />
-    <orderEntry type="library" name="Maven: com.alibaba:easyexcel-core:3.2.1" level="project" />
-    <orderEntry type="library" name="Maven: com.alibaba:easyexcel-support:3.2.1" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.poi:poi:4.1.2" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.commons:commons-collections4:4.4" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.commons:commons-math3:3.6.1" level="project" />
-    <orderEntry type="library" name="Maven: com.zaxxer:SparseBitSet:1.2" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml:4.1.2" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.commons:commons-compress:1.19" level="project" />
-    <orderEntry type="library" name="Maven: com.github.virtuald:curvesapi:1.06" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml-schemas:4.1.2" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.xmlbeans:xmlbeans:3.1.0" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.commons:commons-csv:1.8" level="project" />
-    <orderEntry type="library" name="Maven: org.ehcache:ehcache:3.10.8" level="project" />
-    <orderEntry type="library" name="Maven: javax.cache:cache-api:1.1.1" level="project" />
-    <orderEntry type="library" scope="RUNTIME" name="Maven: org.glassfish.jaxb:jaxb-runtime:2.3.8" level="project" />
-    <orderEntry type="library" scope="RUNTIME" name="Maven: org.glassfish.jaxb:txw2:2.3.8" level="project" />
-    <orderEntry type="library" scope="RUNTIME" name="Maven: com.sun.istack:istack-commons-runtime:3.0.12" level="project" />
-    <orderEntry type="library" scope="RUNTIME" name="Maven: com.sun.activation:jakarta.activation:1.2.2" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.12.0" level="project" />
-    <orderEntry type="library" name="Maven: com.alibaba.fastjson2:fastjson2:2.0.23" level="project" />
-    <orderEntry type="library" name="Maven: io.springfox:springfox-boot-starter:3.0.0" level="project" />
-    <orderEntry type="library" name="Maven: io.springfox:springfox-oas:3.0.0" level="project" />
-    <orderEntry type="library" name="Maven: io.swagger.core.v3:swagger-annotations:2.1.2" level="project" />
-    <orderEntry type="library" name="Maven: io.swagger.core.v3:swagger-models:2.1.2" level="project" />
-    <orderEntry type="library" name="Maven: io.springfox:springfox-spi:3.0.0" level="project" />
-    <orderEntry type="library" name="Maven: io.springfox:springfox-schema:3.0.0" level="project" />
-    <orderEntry type="library" name="Maven: io.springfox:springfox-core:3.0.0" level="project" />
-    <orderEntry type="library" name="Maven: io.springfox:springfox-spring-web:3.0.0" level="project" />
-    <orderEntry type="library" name="Maven: io.github.classgraph:classgraph:4.8.83" level="project" />
-    <orderEntry type="library" name="Maven: io.springfox:springfox-spring-webmvc:3.0.0" level="project" />
-    <orderEntry type="library" name="Maven: io.springfox:springfox-spring-webflux:3.0.0" level="project" />
-    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-common:3.0.0" level="project" />
-    <orderEntry type="library" scope="RUNTIME" name="Maven: org.mapstruct:mapstruct:1.3.1.Final" level="project" />
-    <orderEntry type="library" name="Maven: io.springfox:springfox-data-rest:3.0.0" level="project" />
-    <orderEntry type="library" name="Maven: io.springfox:springfox-bean-validators:3.0.0" level="project" />
-    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger2:3.0.0" level="project" />
-    <orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.20" level="project" />
-    <orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.20" level="project" />
-    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-ui:3.0.0" level="project" />
-    <orderEntry type="library" name="Maven: com.fasterxml:classmate:1.5.1" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-core:2.0.0.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-metadata:2.0.0.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: commons-io:commons-io:2.6" level="project" />
-    <orderEntry type="library" name="Maven: com.baidubce:bce-java-sdk:0.10.254" level="project" />
-    <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.15" level="project" />
-    <orderEntry type="library" name="Maven: com.google.guava:guava:17.0" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpasyncclient:4.1.5" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.16" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore-nio:4.4.16" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.14" level="project" />
-    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.13.5" level="project" />
-    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.13.5" level="project" />
-    <orderEntry type="library" name="Maven: joda-time:joda-time:2.3" level="project" />
-    <orderEntry type="library" name="Maven: org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.1" level="project" />
-    <orderEntry type="library" name="Maven: javax.validation:validation-api:2.0.1.Final" level="project" />
-    <orderEntry type="library" name="Maven: org.glassfish.jersey.media:jersey-media-multipart:2.35" level="project" />
-    <orderEntry type="library" name="Maven: org.jvnet.mimepull:mimepull:1.9.13" level="project" />
-    <orderEntry type="library" name="Maven: org.glassfish.jersey.connectors:jersey-apache-connector:2.35" level="project" />
-    <orderEntry type="library" name="Maven: org.glassfish.jersey.core:jersey-client:2.35" level="project" />
-    <orderEntry type="library" name="Maven: jakarta.ws.rs:jakarta.ws.rs-api:2.1.6" level="project" />
-    <orderEntry type="library" name="Maven: org.glassfish.jersey.core:jersey-server:2.35" level="project" />
-    <orderEntry type="library" name="Maven: org.glassfish.hk2.external:jakarta.inject:2.6.1" level="project" />
-    <orderEntry type="library" name="Maven: org.glassfish.jersey.core:jersey-common:2.35" level="project" />
-    <orderEntry type="library" name="Maven: org.glassfish.hk2:osgi-resource-locator:1.0.3" level="project" />
-    <orderEntry type="library" name="Maven: org.glassfish.jersey.media:jersey-media-json-jackson:2.35" level="project" />
-    <orderEntry type="library" name="Maven: org.glassfish.jersey.ext:jersey-entity-filtering:2.35" level="project" />
-    <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-jaxb-annotations:2.13.5" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.hbase:hbase-client:1.2.0" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.hbase:hbase-annotations:1.2.0" level="project" />
-    <orderEntry type="library" name="Maven: log4j:log4j:1.2.17" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.hbase:hbase-common:1.2.0" level="project" />
-    <orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2.2" level="project" />
-    <orderEntry type="library" name="Maven: org.mortbay.jetty:jetty-util:6.1.26" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.hbase:hbase-protocol:1.2.0" level="project" />
-    <orderEntry type="library" name="Maven: commons-lang:commons-lang:2.6" level="project" />
-    <orderEntry type="library" name="Maven: commons-logging:commons-logging:1.2" level="project" />
-    <orderEntry type="library" name="Maven: io.netty:netty-all:4.1.90.Final" level="project" />
-    <orderEntry type="library" name="Maven: io.netty:netty-codec-dns:4.1.90.Final" level="project" />
-    <orderEntry type="library" name="Maven: io.netty:netty-codec-haproxy:4.1.90.Final" level="project" />
-    <orderEntry type="library" name="Maven: io.netty:netty-codec-http:4.1.90.Final" level="project" />
-    <orderEntry type="library" name="Maven: io.netty:netty-codec-http2:4.1.90.Final" level="project" />
-    <orderEntry type="library" name="Maven: io.netty:netty-codec-memcache:4.1.90.Final" level="project" />
-    <orderEntry type="library" name="Maven: io.netty:netty-codec-mqtt:4.1.90.Final" level="project" />
-    <orderEntry type="library" name="Maven: io.netty:netty-codec-redis:4.1.90.Final" level="project" />
-    <orderEntry type="library" name="Maven: io.netty:netty-codec-smtp:4.1.90.Final" level="project" />
-    <orderEntry type="library" name="Maven: io.netty:netty-codec-socks:4.1.90.Final" level="project" />
-    <orderEntry type="library" name="Maven: io.netty:netty-codec-stomp:4.1.90.Final" level="project" />
-    <orderEntry type="library" name="Maven: io.netty:netty-codec-xml:4.1.90.Final" level="project" />
-    <orderEntry type="library" name="Maven: io.netty:netty-handler-proxy:4.1.90.Final" level="project" />
-    <orderEntry type="library" name="Maven: io.netty:netty-handler-ssl-ocsp:4.1.90.Final" level="project" />
-    <orderEntry type="library" name="Maven: io.netty:netty-resolver-dns:4.1.90.Final" level="project" />
-    <orderEntry type="library" name="Maven: io.netty:netty-transport-rxtx:4.1.90.Final" level="project" />
-    <orderEntry type="library" name="Maven: io.netty:netty-transport-sctp:4.1.90.Final" level="project" />
-    <orderEntry type="library" name="Maven: io.netty:netty-transport-udt:4.1.90.Final" level="project" />
-    <orderEntry type="library" name="Maven: io.netty:netty-transport-classes-epoll:4.1.90.Final" level="project" />
-    <orderEntry type="library" name="Maven: io.netty:netty-transport-classes-kqueue:4.1.90.Final" level="project" />
-    <orderEntry type="library" name="Maven: io.netty:netty-resolver-dns-classes-macos:4.1.90.Final" level="project" />
-    <orderEntry type="library" scope="RUNTIME" name="Maven: io.netty:netty-transport-native-epoll:linux-x86_64:4.1.90.Final" level="project" />
-    <orderEntry type="library" scope="RUNTIME" name="Maven: io.netty:netty-transport-native-epoll:linux-aarch_64:4.1.90.Final" level="project" />
-    <orderEntry type="library" scope="RUNTIME" name="Maven: io.netty:netty-transport-native-kqueue:osx-x86_64:4.1.90.Final" level="project" />
-    <orderEntry type="library" scope="RUNTIME" name="Maven: io.netty:netty-transport-native-kqueue:osx-aarch_64:4.1.90.Final" level="project" />
-    <orderEntry type="library" scope="RUNTIME" name="Maven: io.netty:netty-resolver-dns-native-macos:osx-x86_64:4.1.90.Final" level="project" />
-    <orderEntry type="library" scope="RUNTIME" name="Maven: io.netty:netty-resolver-dns-native-macos:osx-aarch_64:4.1.90.Final" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.zookeeper:zookeeper:3.4.6" level="project" />
-    <orderEntry type="library" name="Maven: org.slf4j:slf4j-reload4j:1.7.36" level="project" />
-    <orderEntry type="library" name="Maven: ch.qos.reload4j:reload4j:1.2.19" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.htrace:htrace-core:3.1.0-incubating" level="project" />
-    <orderEntry type="library" name="Maven: org.codehaus.jackson:jackson-mapper-asl:1.9.13" level="project" />
-    <orderEntry type="library" name="Maven: org.codehaus.jackson:jackson-core-asl:1.9.13" level="project" />
-    <orderEntry type="library" name="Maven: org.jruby.jcodings:jcodings:1.0.8" level="project" />
-    <orderEntry type="library" name="Maven: org.jruby.joni:joni:2.1.2" level="project" />
-    <orderEntry type="library" name="Maven: com.yammer.metrics:metrics-core:2.2.0" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.hadoop:hadoop-auth:2.5.1" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.directory.server:apacheds-kerberos-codec:2.0.0-M15" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.directory.server:apacheds-i18n:2.0.0-M15" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.directory.api:api-asn1-api:1.0.0-M20" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.directory.api:api-util:1.0.0-M20" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.hadoop:hadoop-common:2.5.1" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.hadoop:hadoop-annotations:2.5.1" level="project" />
-    <orderEntry type="module-library">
-      <library name="Maven: jdk.tools:jdk.tools:1.6">
-        <CLASSES>
-          <root url="jar://$MODULE_DIR$/../../../AppStore/Java/jdk1.8.0_131/jre/../lib/tools.jar!/" />
-        </CLASSES>
-        <JAVADOC />
-        <SOURCES />
-      </library>
-    </orderEntry>
-    <orderEntry type="library" name="Maven: commons-cli:commons-cli:1.2" level="project" />
-    <orderEntry type="library" name="Maven: xmlenc:xmlenc:0.52" level="project" />
-    <orderEntry type="library" name="Maven: commons-httpclient:commons-httpclient:3.1" level="project" />
-    <orderEntry type="library" name="Maven: commons-net:commons-net:3.1" level="project" />
-    <orderEntry type="library" scope="RUNTIME" name="Maven: commons-el:commons-el:1.0" level="project" />
-    <orderEntry type="library" name="Maven: commons-configuration:commons-configuration:1.6" level="project" />
-    <orderEntry type="library" name="Maven: commons-digester:commons-digester:1.8" level="project" />
-    <orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.7.0" level="project" />
-    <orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils-core:1.8.0" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.avro:avro:1.7.4" level="project" />
-    <orderEntry type="library" name="Maven: com.thoughtworks.paranamer:paranamer:2.3" level="project" />
-    <orderEntry type="library" name="Maven: org.xerial.snappy:snappy-java:1.0.4.1" level="project" />
-    <orderEntry type="library" name="Maven: com.jcraft:jsch:0.1.42" level="project" />
-    <orderEntry type="library" name="Maven: com.google.code.findbugs:jsr305:1.3.9" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.hadoop:hadoop-mapreduce-client-core:2.5.1" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.hadoop:hadoop-yarn-common:2.5.1" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.hadoop:hadoop-yarn-api:2.5.1" level="project" />
-    <orderEntry type="library" name="Maven: javax.xml.bind:jaxb-api:2.3.1" level="project" />
-    <orderEntry type="library" name="Maven: javax.activation:javax.activation-api:1.2.0" level="project" />
-    <orderEntry type="library" name="Maven: io.netty:netty:3.6.2.Final" level="project" />
-    <orderEntry type="library" name="Maven: com.github.stephenc.findbugs:findbugs-annotations:1.3.9-1" level="project" />
-    <orderEntry type="library" name="Maven: junit:junit:4.13.2" level="project" />
-    <orderEntry type="library" name="Maven: org.hamcrest:hamcrest-core:2.2" level="project" />
-    <orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.59" level="project" />
-  </component>
 </module>

+ 1 - 1
.idea/vcs.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
   <component name="VcsDirectoryMappings">
-    <mapping directory="" vcs="Git" />
+    <mapping directory="$PROJECT_DIR$" vcs="Git" />
   </component>
 </project>

+ 0 - 1
src/main/java/com/pavis/ctr/audit/common/utils/Base64Utils.java

@@ -16,7 +16,6 @@ public class Base64Utils {
      *
      * @return
      */
-    //windows下
     public static File base64ToImage(String base64File) throws FileNotFoundException {
         String tmpFilename = path + UUID.fastUUID() + ".jpg";
         String file = base64File.substring(base64File.indexOf(",") + 1);

+ 58 - 0
src/main/java/com/pavis/ctr/audit/common/utils/ConvertObjUtils.java

@@ -4,6 +4,7 @@ import com.pavis.ctr.audit.project.domain.*;
 import com.pavis.ctr.audit.project.domain.vo.AuditTripResultVo;
 import com.pavis.ctr.audit.project.domain.vo.SysUserVo;
 
+import java.util.ArrayList;
 import java.util.List;
 
 
@@ -107,4 +108,61 @@ public class ConvertObjUtils {
         return sysUserVo;
     }
 
+    /**
+     *
+     * 把uditTripResult对象转成AuditResultUser
+     * @param auditTripResults
+     * @return
+     */
+    public static List<AuditResultUser> convertTripResult(String userId,List<AuditTripResult> auditTripResults) {
+        List<AuditResultUser> auditResultUsers = new ArrayList<>();
+
+        for (int i = 0; i < auditTripResults.size(); i++) {
+            AuditResultUser auditResultUser = new AuditResultUser();
+            auditResultUser.setUserId(userId);
+            auditResultUser.setMerge_img_url(auditTripResults.get(i).getMergeImgUrl());
+            auditResultUser.setMerge_html_url(auditTripResults.get(i).getMergeHtmlUrl());
+            switch (auditTripResults.get(i).getAuditConclusion().split(",")[1]){
+                case "1":
+                    auditResultUser.setAuditConclusion("缺少商品信息(未展开)");
+                    auditResultUser.setTipText("您上传的这单截图,缺少商品名称。" +
+                            "下次回传时,如果遇到这种情况,商品被折叠的部分也需要展开截取哦~多张截图可一起上传。谢谢支持!");
+                    break;
+                case "2":
+                    auditResultUser.setAuditConclusion("缺少商品信息(未截取)");
+                    auditResultUser.setTipText("您上传的这单截图,缺少商品名称,下次回传时辛苦您多加留意哦~" +
+                            "店名、商品名、付款金额、付款时间是关键的订单信息,需要全部包含进来。1张无法截取完这些信息,可截取多张哦~谢谢支持!");
+                    break;
+                case "3":
+                    auditResultUser.setAuditConclusion("一次上传多个订单");
+                    auditResultUser.setTipText("您上传的这单截图,包含了多个订单的购物,下次回传时注意需要分别上传哦~谢谢支持!");
+                    break;
+                case "4":
+                    auditResultUser.setAuditConclusion("缺少总金额(未截取)");
+                    auditResultUser.setTipText("您上传的这单截图,缺少付款金额,下次回传时辛苦您多加留意哦~" +
+                            "店名、商品名、付款金额、付款时间是关键的订单信息,需要全部包含进来。1张无法截取完这些信息,可截取多张哦~谢谢支持!");
+                    break;
+                case "5":
+                    auditResultUser.setAuditConclusion("缺少付款时间(未展开)");
+                    auditResultUser.setTipText("您上传的这单截图,缺少付款时间。" +
+                            "下次回传时,如果遇到这种情况,请您先点击展开折叠的部分再截图哦~1张无法截取完这些信息,可截取多张。谢谢支持!");
+                    break;
+                case "6":
+                    auditResultUser.setAuditConclusion("缺少付款时间(未截取)");
+                    auditResultUser.setTipText("您上传的这单截图,缺少付款时间,下次回传时辛苦您多加留意哦~" +
+                            "店名、商品名、付款金额、付款时间是关键的订单信息,需要全部包含进来。1张无法截取完这些信息,可截取多张哦~谢谢支持!");
+                    break;
+                case "7":
+                    auditResultUser.setAuditConclusion("缺少关键信息(遮挡)");
+                    auditResultUser.setTipText("您上传的这单截图,有关键信息被遮挡啦~" +
+                            "下次回传时,如果遇到这种情况,需要请您取消遮挡或滑动页面将店名、商品名、付款金额、付款时间等关键信息完全显示出来再截图哦~谢谢支持!");
+                    break;
+
+            }
+            auditResultUsers.add(auditResultUser);
+        }
+        return auditResultUsers;
+    }
+
+
 }

+ 76 - 0
src/main/java/com/pavis/ctr/audit/common/utils/DateUtils.java

@@ -6,6 +6,7 @@ import java.lang.management.ManagementFactory;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.*;
+import java.util.Calendar;
 import java.util.Date;
 
 /**
@@ -161,4 +162,79 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
         ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault());
         return Date.from(zdt.toInstant());
     }
+
+    /**
+     * 当前时间往后减一天   接受时间类型:yyyy-mm-dd的字符串
+     *
+     * @return
+     */
+    public static String minusOneDay(String time) throws ParseException {
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd");
+        //将接收的time中的年月日截取成String数组
+        String[] timeStr = time.split("-");
+        Calendar calendar = Calendar.getInstance();
+        int year = Integer.valueOf(timeStr[0]);
+        int month = Integer.valueOf(timeStr[1]);
+        int day = Integer.valueOf(timeStr[2]);
+        //判断time中的日期是否是该年该月的一号,如果不是就往前减一天;如果是就看情况减月份和年份
+        if (day <= 1) {
+            String date = null;
+            //如果月份不是1月,就对月份减一;如果月份是1月,就对年份减一;
+            if (month > 1) {
+                month--;
+                Calendar c = Calendar.getInstance();
+                c.set(year, month, 0);
+                Date parse = dateFormat.parse(year + "-" + month + "-" + c.get(c.DAY_OF_MONTH));
+                date = dateFormat.format(parse);
+            } else if (month == 1) {
+                year--;
+                date = year + "-12-31";
+            }
+            return date;
+        }
+        //time中的日期不是该年该月的一号,直接往前减一天
+        Date date = dateFormat.parse(time);
+        calendar.setTime(date);
+        calendar.add(calendar.DATE, -1);
+        return dateFormat.format(calendar.getTime());
+    }
+
+    /**
+     * 当前时间往前加一天  接受时间类型:yyyy-mm-dd的字符串
+     *
+     * @return
+     */
+    public static String addOneDay(String time) throws ParseException {
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd");
+        //将接收的time中的年月日截取成String数组
+        String[] timeStr = time.split("-");
+        //确定time中的那一年的那个月份有多少天
+        Calendar calendar = Calendar.getInstance();
+        int year = Integer.valueOf(timeStr[0]);
+        int month = Integer.valueOf(timeStr[1]);
+        int day = Integer.valueOf(timeStr[2]);
+        calendar.set(year, month, 0);
+        int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
+        //判断time中的日期是否超过了该年该月的最后一天,如果超过就进行以下处理
+        if (day >= dayOfMonth) {
+            String date = null;
+            //判断月份是否是12月,不是就往后加一个月;是的话就把年份加一年
+            if (month < 12) {
+                month++;
+                Date parse = dateFormat.parse(year + "-" + month + "-01");
+                date = dateFormat.format(parse);
+            } else if (month == 12) {
+                year++;
+                date = year + "-01-01";
+            }
+            return date;
+        }
+        //time中的日期没有超过该年该月的最后一天,则天数往后加一天
+        calendar.setTime(dateFormat.parse(time));
+        calendar.add(calendar.DATE, 1);
+        return dateFormat.format(calendar.getTime());
+    }
+
+
+
 }

+ 76 - 12
src/main/java/com/pavis/ctr/audit/common/utils/ImageUtils.java

@@ -12,7 +12,10 @@ import org.apache.commons.lang3.StringUtils;
 
 import javax.imageio.ImageIO;
 import java.awt.*;
+import java.awt.geom.AffineTransform;
 import java.awt.image.BufferedImage;
+import java.awt.image.ColorModel;
+import java.awt.image.WritableRaster;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
@@ -62,7 +65,8 @@ public class ImageUtils {
         }
         // 为图片设置背景色
         Graphics graphics = destImage.getGraphics();
-        graphics.setColor(Color.YELLOW);
+//        graphics.setColor(Color.YELLOW);
+        graphics.setColor(new Color(128,128,128));
         graphics.fillRect(0, 0, destImage.getWidth(), destImage.getHeight());
         // 合并所有子图片到新图片
         int wx = 0, wy = 0;
@@ -138,21 +142,38 @@ public class ImageUtils {
             // 加载图片并计算总宽度和高度
             int maxWidth = 0;
             int totalHeight = 0;
-            BufferedImage[] images = new BufferedImage[pics.length];
-            System.out.println(DateUtils.getNowDate().toString());
-            for (int i = 0; i < pics.length; i++) {
-                URL url = new URL(pics[i]);
-                BufferedImage image = ImageIO.read(url);
-                images[i] = image;
-                maxWidth = Math.max(maxWidth, image.getWidth());
-                totalHeight += image.getHeight() + Constants.SPACE_HEIGHT;
+            //多线程下载图片
+            System.out.println("多线程开始时间---->"+DateUtils.getNowDate().toString());
+            BufferedImage[] images = ImageUtils.imageDownloader(pics);
+            System.out.println("多线程结束时间,(尺寸获取开始时间)---->"+DateUtils.getNowDate().toString());
+            //获取maxwidth,totalHeight
+            for (BufferedImage image : images) {
+                maxWidth=Math.max(maxWidth,image.getWidth());
+                totalHeight+=image.getHeight()+Constants.SPACE_HEIGHT;
             }
+            System.out.println("尺寸获取结束时间(调整图片尺寸宽度)---->"+DateUtils.getNowDate().toString());
+            //调整图片宽度
+            for (int i = 0; i < images.length; i++) {
+                //添加宽度判断
+                if(images[i].getWidth()<maxWidth){
+                    System.out.println("当前图片的宽度"+images[i].getWidth());
+                    System.out.println("图片的最大宽度"+maxWidth);
+                    BufferedImage bufferedImage = ImageUtils.formatImageWidth(images[i], maxWidth, images[i].getHeight(), false);
+                    System.out.println("修改后图片的宽度"+bufferedImage.getWidth());
+                    images[i]=bufferedImage;
+                }
+            }
+            System.out.println("调整图片宽度结束时间---->"+DateUtils.getNowDate().toString());
+
+
             System.out.println(DateUtils.getNowDate().toString());
             // 创建拼接后的图片
             BufferedImage joinedImage = new BufferedImage(maxWidth, totalHeight, BufferedImage.TYPE_INT_RGB);
             // 设置背景颜色
             Graphics2D g = joinedImage.createGraphics();
-            g.setColor(Color.YELLOW);
+//            g.setColor(Color.YELLOW);
+            g.setColor(new Color(128,128,128));
+
             g.fillRect(0, 0, joinedImage.getWidth(), joinedImage.getHeight());
             // 拼接图片
             int y = 0;
@@ -164,11 +185,15 @@ public class ImageUtils {
             File file = new File(dstPic);
             // 保存拼接后的图片
             ImageIO.write(joinedImage, type, file);
+            //增添判断是否有重名的图片
+            BosUtils.deleteByKey(client, StringUtils.substringAfterLast(dstPic, "/"));
             // 上传至bos
             mergeImgUrl = BosUtils.putByName(client, StringUtils.substringAfterLast(dstPic, "/"), file);
-            System.out.println(DateUtils.getNowDate().toString());
-            System.out.println(DateUtils.getNowDate().toString());
             System.out.println("merge img url:" + mergeImgUrl);
+            //删除保存在本地的图片
+//            boolean delete = file.delete();
+//            System.out.println("已删除保存在本地截图。");
+
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -190,6 +215,7 @@ public class ImageUtils {
                 URL url = new URL(imageUrl);
                 InputStream in = url.openStream();
                 BufferedImage image = ImageIO.read(in);
+
                 in.close();
                 System.out.println(imageUrl + " downloaded successfully.");
                 return image;
@@ -248,4 +274,42 @@ public class ImageUtils {
         System.out.println("merge url:" + mergeUrl);
         return mergeUrl;
     }
+
+    /**
+     * 格式化图片修改图片的宽度
+     * @param source 原图片
+     * @param targetW 目标宽度
+     * @param targetH 目标高度
+     * @param flag  是否进行等比例放大缩小
+     * @return
+     */
+    public static BufferedImage formatImageWidth(BufferedImage source,int targetW,int targetH,boolean flag){
+        BufferedImage target=null;
+        int type = source.getType();
+        double sx = (double) targetW / source.getWidth();
+        double sy = (double) targetH / source.getHeight();
+        System.out.println("传入的数据尺寸:"+targetW+","+targetH);
+        if(flag && sx>sy){
+            sx=sy;
+            targetW=(int)(sx*source.getWidth());
+        }else if (flag && sx<=sy){
+            sy=sx;
+            targetH=(int) (sy*source.getHeight());
+        }
+        if(type==BufferedImage.TYPE_CUSTOM){
+            ColorModel colorModel = source.getColorModel();
+            WritableRaster rester = colorModel.createCompatibleWritableRaster(targetW, targetH);
+            boolean alphaPremultiplied = colorModel.isAlphaPremultiplied();
+            target = new BufferedImage(colorModel, rester, alphaPremultiplied, null);
+        }else {
+            target = new BufferedImage(targetW,targetH,type);
+        }
+        Graphics2D graphics = target.createGraphics();
+        graphics.setRenderingHint(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY);
+        graphics.drawRenderedImage(source, AffineTransform.getScaleInstance(sx,sy));
+        graphics.dispose();
+        return target;
+    }
+
+
 }

+ 1 - 1
src/main/java/com/pavis/ctr/audit/framework/config/SecurityConfig.java

@@ -114,7 +114,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
                 // 静态资源,可匿名访问
                 .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
                 .antMatchers("/swagger-ui/**", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
-                .antMatchers("/init/auditTrip/**", "/update/auditTrip/**","/init/shopname").permitAll()
+                .antMatchers("/init/auditTrip/**", "/update/auditTrip/**","/init/shopname","/recordTime/OCRTime","/resultTrip/userId").permitAll()
                 // 除上面外的所有请求全部需要鉴权认证
                 .anyRequest().authenticated()
                 .and()

+ 7 - 0
src/main/java/com/pavis/ctr/audit/framework/config/SimpleScheduleConfig.java

@@ -1,5 +1,6 @@
 package com.pavis.ctr.audit.framework.config;
 
+import com.pavis.ctr.audit.project.controller.SubmitResultController;
 import com.pavis.ctr.audit.project.service.IAuditTripMainService;
 import com.pavis.ctr.audit.project.service.IOcrTripService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -47,5 +48,11 @@ public class SimpleScheduleConfig {
         System.out.println("启动定时任务,开始获取待审核数据");
     }
 
+    @Scheduled(cron = "${cron-expression.everDay}")
+    private void resetFlag() {
+
+        SubmitResultController.setIsFlag(1);
+
+    }
 
 }

+ 46 - 7
src/main/java/com/pavis/ctr/audit/project/controller/InitAuditTripController.java

@@ -3,6 +3,7 @@ package com.pavis.ctr.audit.project.controller;
 import com.pavis.ctr.audit.project.domain.OcrTrip;
 import com.pavis.ctr.audit.project.service.IAuditTripMainService;
 import com.pavis.ctr.audit.project.service.IOcrTripService;
+import com.pavis.ctr.audit.project.service.ITripImgInfoService;
 import com.pavis.ctr.audit.web.domain.AjaxResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -27,6 +28,9 @@ public class InitAuditTripController {
     @Autowired
     private IAuditTripMainService auditTripMainService;
 
+    @Autowired
+    private ITripImgInfoService tripImgInfoService;
+
     @ApiOperation("初始化审核小票数据")
     @GetMapping("/init/auditTrip")
     public AjaxResult initAuditTrip() {
@@ -43,14 +47,30 @@ public class InitAuditTripController {
     @ApiOperation("根据datedir初始化审核小票数据")
     @GetMapping("/init/auditTrip/{datedir}")
     public AjaxResult initAuditTripByDateDir(@PathVariable("datedir") String dateDir) {
+        AjaxResult ajaxResult = new AjaxResult();
         // 获取需要初始化的小票数据
         List<OcrTrip> ocrTrips = ocrTripService.getAuditTripByDateDir(dateDir);
+        //获取当天所有新增的小票数据
+        List<OcrTrip> todayOcrTrips = ocrTripService.getTodayTripByDateDir(dateDir);
+
         if (ocrTrips != null && ocrTrips.size() > 0) {
             int auditTripSize = auditTripMainService.adaptAuditTrip(ocrTrips);
-            return AjaxResult.success(String.format("初始化成功,待审核小票数量为:%d", auditTripSize));
-        } else {
-            return AjaxResult.success("没有需要初始化的审核数据!");
+            ajaxResult.put("code",200);
+            ajaxResult.put("audit_msg","初始化成功,待审核小票数量为:"+auditTripSize+"条");
+        }else {
+            ajaxResult.put("audit_msg","当前无审核数据!");
+        }
+        //保存小票原图URL和脱敏图片URL
+        if(todayOcrTrips!=null && todayOcrTrips.size()>0){
+            //保存小票原图URL和脱敏图片URL
+            int tripImgSize = tripImgInfoService.adaptTripImg(todayOcrTrips);
+
+            ajaxResult.put("img_msg","保存图片信息为:"+tripImgSize+"条");
+        }else {
+            ajaxResult.put("img_msg","当前无图片数据!");
         }
+
+        return ajaxResult;
     }
 
     @ApiOperation("初始化网上购买类型的小票到待审核库")
@@ -66,16 +86,35 @@ public class InitAuditTripController {
         }
     }
 
-    @ApiOperation("更新某个datedir的数据")
+    @ApiOperation("更新某个datedir的数据(预防初始化未完成的情况)")
     @GetMapping("/update/auditTrip/{datedir}")
     public AjaxResult updateAuditTripByDateDir(@PathVariable("datedir") String dateDir) {
+
+        AjaxResult ajaxResult = new AjaxResult();
+
         // 获取需要初始化的小票数据
         List<OcrTrip> ocrTrips = ocrTripService.updateAuditTripByDateDir(dateDir);
+
+        //获取当天所有新增的小票数据和当天已插入的数据做差,将未插入的数据进行重新插入
+        List<OcrTrip> todayOcrTrips = ocrTripService.getTodaySurplusTripByDateDir(dateDir);
+
         if (ocrTrips != null && ocrTrips.size() > 0) {
             int auditTripSize = auditTripMainService.adaptAuditTrip(ocrTrips);
-            return AjaxResult.success(String.format("更新成功,更新的待审核小票数量为:%d", auditTripSize));
-        } else {
-            return AjaxResult.success("没有需要更新的审核数据!");
+            ajaxResult.put("code",200);
+            ajaxResult.put("audit_msg","初始化成功,待审核小票数量为:"+auditTripSize+"条");
+        }else {
+            ajaxResult.put("audit_msg","当前无审核数据!");
+        }
+
+        //保存小票原图URL和脱敏图片URL
+        if(todayOcrTrips!=null && todayOcrTrips.size()>0){
+            //保存小票原图URL和脱敏图片URL
+            int tripImgSize = tripImgInfoService.adaptTripImg(todayOcrTrips);
+            ajaxResult.put("img_msg","保存图片信息为:"+tripImgSize+"条");
+        }else {
+            ajaxResult.put("img_msg","当前无图片数据!");
         }
+        return ajaxResult;
+
     }
 }

+ 32 - 0
src/main/java/com/pavis/ctr/audit/project/controller/SubmitResultController.java

@@ -1,9 +1,12 @@
 package com.pavis.ctr.audit.project.controller;
 
+import com.pavis.ctr.audit.common.utils.DateUtils;
 import com.pavis.ctr.audit.framework.annotation.Log;
 import com.pavis.ctr.audit.framework.enums.BusinessType;
+import com.pavis.ctr.audit.project.domain.RecordWorkDate;
 import com.pavis.ctr.audit.project.domain.vo.AuditTripResultVo;
 import com.pavis.ctr.audit.project.service.IAuditTripResultService;
+import com.pavis.ctr.audit.project.service.IRecordWorkDateService;
 import com.pavis.ctr.audit.web.domain.AjaxResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -19,10 +22,39 @@ public class SubmitResultController {
     private IAuditTripResultService auditTripResultService;
 
 
+    @Autowired
+    private IRecordWorkDateService iRecordWorkDateService;
+
+    //用于控制插入工作日时间的标注,每天第一次提交审核时触发
+    private static int isFlag=1;
+
+
+    //把初始化的isFlag复制到这里
+    public static void setIsFlag(int isFlag) {
+        SubmitResultController.isFlag = isFlag;
+    }
+
+    public static int getIsFlag() {
+        return isFlag;
+    }
+
+
     @ApiOperation("提交审核完成的小票")
     @Log(title = "审核管理,提交小票", businessType = BusinessType.UPDATE)
     @PostMapping("/submitTripRes")
     public AjaxResult submitTripRes(@RequestBody AuditTripResultVo auditTripResultVo) {
+
+        //小票平台当天第一次成功提交审核数据时会向被记录在表中,表示当天是工作日
+        if(isFlag==1){
+            //执行插入操作
+            RecordWorkDate recordWorkDate = new RecordWorkDate();
+            recordWorkDate.setWorkDate(DateUtils.getDate());
+            recordWorkDate.setWorkUser(auditTripResultVo.getUpdateBy());
+            recordWorkDate.setWorkTime(DateUtils.getNowDate());
+            int insert = iRecordWorkDateService.getBaseMapper().insert(recordWorkDate);
+            isFlag=0;
+        }
+
         // 更新状态
         boolean updateSubmitTripRes = auditTripResultService.updateSubmitTripRes(auditTripResultVo);
         // 返回剩余审核数(只要是没被审核的都会被返回)

+ 1 - 1
src/main/java/com/pavis/ctr/audit/project/controller/TripImgUploadController.java

@@ -43,7 +43,7 @@ public class TripImgUploadController {
 
             //上传到bos
             String url = BosUtils.put(bosClient, imgUploader.getFilename(), tmpFile);
-            //删除掉本地的文件
+            //删除掉存储在本地的文件
             boolean delete = tmpFile.delete();
 
             return AjaxResult.success(url);

+ 81 - 0
src/main/java/com/pavis/ctr/audit/project/domain/AuditResultUser.java

@@ -0,0 +1,81 @@
+package com.pavis.ctr.audit.project.domain;
+
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 审核小票返回给用户
+ */
+public class AuditResultUser {
+    private String userId;
+
+    /**
+     * 1:缺少商品信息(未展开) (权重:1)
+     * 2:缺少商品信息(未截取) (权重:1)
+     * 3:一次上传多个订单 (权重:2)
+     * 4:缺少总金额(未截取) (权重:3)
+     * 5:缺少付款时间(未展开) (权重:4)
+     * 6:缺少付款时间(未截取) (权重:4)
+     * 7:缺少关键信息(遮挡) (权重:5)
+     */
+    private String auditConclusion;
+
+    /**
+     *每个错误类型都对应一个错误提示文本
+     */
+    private String tipText;
+    private String merge_img_url;
+    private String merge_html_url;
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+    public String getAuditConclusion() {
+        return auditConclusion;
+    }
+
+    public void setAuditConclusion(String auditConclusion) {
+        this.auditConclusion = auditConclusion;
+    }
+
+    public String getTipText() {
+        return tipText;
+    }
+
+    public void setTipText(String tipText) {
+        this.tipText = tipText;
+    }
+
+    public String getMerge_img_url() {
+        return merge_img_url;
+    }
+
+    public void setMerge_img_url(String merge_img_url) {
+        this.merge_img_url = merge_img_url;
+    }
+
+    public String getMerge_html_url() {
+        return merge_html_url;
+    }
+
+    public void setMerge_html_url(String merge_html_url) {
+        this.merge_html_url = merge_html_url;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+                .append("userId",userId)
+                .append("auditConclusion",auditConclusion)
+                .append("tipText",tipText)
+                .append("merge_img_url",merge_img_url)
+                .append("merge_html_url",merge_html_url)
+                .toString();
+    }
+}

+ 7 - 7
src/main/java/com/pavis/ctr/audit/project/domain/AuditTripResult.java

@@ -35,13 +35,13 @@ public class AuditTripResult extends BaseEntity {
      * 03:小票原因
      * 二级菜单:
      * 01:操作错误
-     * 1:缺少商品信息(未展开)
-     * 2:缺少商品信息(未截取)
-     * 3:一次上传多个订单
-     * 4:缺少总金额(未截取)
-     * 5:缺少付款时间(未展开)
-     * 6:缺少付款时间(未截取)
-     * 7:缺少关键信息(遮挡)
+     * 1:缺少商品信息(未展开) (权重:1)
+     * 2:缺少商品信息(未截取) (权重:1)
+     * 3:一次上传多个订单 (权重:2)
+     * 4:缺少总金额(未截取) (权重:3)
+     * 5:缺少付款时间(未展开) (权重:4)
+     * 6:缺少付款时间(未截取) (权重:4)
+     * 7:缺少关键信息(遮挡) (权重:5)
      * 8:订单中未包含快消品
      * 9:截图包含非订单详情图片
      */

+ 54 - 0
src/main/java/com/pavis/ctr/audit/project/domain/RecordOcrTime.java

@@ -0,0 +1,54 @@
+package com.pavis.ctr.audit.project.domain;
+
+/**
+ * 记录OCR时间
+ */
+
+public class RecordOcrTime {
+    private String dateDir;
+    private String beginTime;
+    private String endTime;
+    private Integer workStatus;
+
+    public String getDateDir() {
+        return dateDir;
+    }
+
+    public void setDateDir(String dateDir) {
+        this.dateDir = dateDir;
+    }
+
+    public String getBeginTime() {
+        return beginTime;
+    }
+
+    public void setBeginTime(String beginTime) {
+        this.beginTime = beginTime;
+    }
+
+    public String getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(String endTime) {
+        this.endTime = endTime;
+    }
+
+    public Integer getWorkStatus() {
+        return workStatus;
+    }
+
+    public void setWorkStatus(Integer workStatus) {
+        this.workStatus = workStatus;
+    }
+
+    @Override
+    public String toString() {
+        return "RecordOcrTime{" +
+                "dateDir='" + dateDir + '\'' +
+                ", beginTime='" + beginTime + '\'' +
+                ", endTime='" + endTime + '\'' +
+                ", workStatus=" + workStatus +
+                '}';
+    }
+}

+ 53 - 0
src/main/java/com/pavis/ctr/audit/project/domain/RecordWorkDate.java

@@ -0,0 +1,53 @@
+package com.pavis.ctr.audit.project.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.util.Date;
+
+/**
+ * 记录审核小票时的日期
+ */
+public class RecordWorkDate {
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+    private String workDate;
+
+    private Date workTime;
+
+    private String workUser;
+
+    public Date getWorkTime() {
+        return workTime;
+    }
+
+    public void setWorkTime(Date workTime) {
+        this.workTime = workTime;
+    }
+
+    public String getWorkUser() {
+        return workUser;
+    }
+
+    public void setWorkUser(String workUser) {
+        this.workUser = workUser;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getWorkDate() {
+        return workDate;
+    }
+
+    public void setWorkDate(String workDate) {
+        this.workDate = workDate;
+    }
+
+
+}

+ 93 - 0
src/main/java/com/pavis/ctr/audit/project/domain/TripImgInfo.java

@@ -0,0 +1,93 @@
+package com.pavis.ctr.audit.project.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.pavis.ctr.audit.web.domain.BaseEntity;
+
+/**
+ * 存储小票原图和脱敏后的图片
+ * @TableName trip_img_info
+ */
+@TableName(value ="trip_img_info")
+public class TripImgInfo extends BaseEntity {
+    /**
+     * id号
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 文件名
+     */
+    private String fileName;
+
+    /**
+     * 小票唯一上传id
+     */
+    private String uploadId;
+
+    /**
+     * 脱敏后截图URL
+     */
+    private String ocrImg;
+
+    /**
+     * 未脱敏源截图URL
+     */
+    private String orgOcrImg;
+
+    /**
+     * 日期文件夹
+     */
+    private String dateDir;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getFileName() {
+        return fileName;
+    }
+
+    public void setFileName(String fileName) {
+        this.fileName = fileName;
+    }
+
+    public String getUploadId() {
+        return uploadId;
+    }
+
+    public void setUploadId(String uploadId) {
+        this.uploadId = uploadId;
+    }
+
+    public String getOcrImg() {
+        return ocrImg;
+    }
+
+    public void setOcrImg(String ocrImg) {
+        this.ocrImg = ocrImg;
+    }
+
+    public String getOrgOcrImg() {
+        return orgOcrImg;
+    }
+
+    public void setOrgOcrImg(String orgOcrImg) {
+        this.orgOcrImg = orgOcrImg;
+    }
+
+
+    public String getDateDir() {
+        return dateDir;
+    }
+
+    public void setDateDir(String dateDir) {
+        this.dateDir = dateDir;
+    }
+}

+ 21 - 0
src/main/java/com/pavis/ctr/audit/project/domain/UpTrip.java

@@ -9,6 +9,8 @@ public class UpTrip {
 
     private String sTripPhotoId;
 
+    private String orgTripImg;
+
     private Integer photoNo;
 
     private String dateDir;
@@ -44,4 +46,23 @@ public class UpTrip {
     public void setDateDir(String dateDir) {
         this.dateDir = dateDir;
     }
+
+    public String getOrgTripImg() {
+        return orgTripImg;
+    }
+
+    public void setOrgTripImg(String orgTripImg) {
+        this.orgTripImg = orgTripImg;
+    }
+
+    @Override
+    public String toString() {
+        return "UpTrip{" +
+                "tripImg='" + tripImg + '\'' +
+                ", sTripPhotoId='" + sTripPhotoId + '\'' +
+                ", orgTripImg='" + orgTripImg + '\'' +
+                ", photoNo=" + photoNo +
+                ", dateDir='" + dateDir + '\'' +
+                '}';
+    }
 }

+ 8 - 0
src/main/java/com/pavis/ctr/audit/project/mapper/AuditTripMainMapper.java

@@ -77,4 +77,12 @@ public interface AuditTripMainMapper extends BaseMapper<AuditTripMain> {
      */
     String selectLastDateDir();
 
+
+    /**
+     * 根据userId获取当前时间和后一天时间的UploadId
+     * @param userId
+     * @return
+     */
+    List<String> selectErrorTripByuserId(String userId,String todayDate,String beforDate);
+
 }

+ 10 - 0
src/main/java/com/pavis/ctr/audit/project/mapper/AuditTripResultMapper.java

@@ -148,4 +148,14 @@ public interface AuditTripResultMapper extends BaseMapper<AuditTripResult> {
      * @return AuditTripResult
      */
     AuditTripResult getResultByUploadId(String uploadId);
+
+    /**
+     * 根据user_id和date_dir获取的uploadId获取auditTripResult
+     * 且要满足1.审核完成(1) 2.操作结论为操作错误(01)
+     * @param uploadId
+     * @return
+     */
+    List<AuditTripResult> getResultByUserIdUploadId(List<String> uploadId);
+
+
 }

+ 2 - 0
src/main/java/com/pavis/ctr/audit/project/mapper/OcrTripMapper.java

@@ -8,4 +8,6 @@ import com.pavis.ctr.audit.project.domain.OcrTrip;
  * @create 2023-05-05 15:25
  */
 public interface OcrTripMapper extends BaseMapper<OcrTrip> {
+
+
 }

+ 13 - 0
src/main/java/com/pavis/ctr/audit/project/mapper/RecordOcrTimeMapper.java

@@ -0,0 +1,13 @@
+package com.pavis.ctr.audit.project.mapper;
+
+import com.pavis.ctr.audit.project.domain.RecordOcrTime;
+
+public interface RecordOcrTimeMapper {
+
+    /**
+     * 插入ocr运行的时间
+     * @param recordOcrTime
+     * @return
+     */
+    boolean insertOcrTimeAndStatus(RecordOcrTime recordOcrTime);
+}

+ 15 - 0
src/main/java/com/pavis/ctr/audit/project/mapper/RecordWorkDateMapper.java

@@ -0,0 +1,15 @@
+package com.pavis.ctr.audit.project.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.pavis.ctr.audit.project.domain.RecordWorkDate;
+
+public interface RecordWorkDateMapper extends BaseMapper<RecordWorkDate> {
+
+
+    /**
+     * 获取最大的Id号
+     * @return
+     */
+    public Integer getMaxId();
+
+}

+ 18 - 0
src/main/java/com/pavis/ctr/audit/project/mapper/TripImgInfoMapper.java

@@ -0,0 +1,18 @@
+package com.pavis.ctr.audit.project.mapper;
+
+import com.pavis.ctr.audit.project.domain.TripImgInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author pengc
+* @description 针对表【trip_img_info(存储小票原图和脱敏后的图片)】的数据库操作Mapper
+* @createDate 2023-07-24 10:01:40
+* @Entity com.pavis.ctr.audit.project.domain.TripImgInfo
+*/
+public interface TripImgInfoMapper extends BaseMapper<TripImgInfo> {
+
+}
+
+
+
+

+ 9 - 0
src/main/java/com/pavis/ctr/audit/project/service/IAuditTripMainService.java

@@ -74,4 +74,13 @@ public interface IAuditTripMainService extends IService<AuditTripMain> {
      * @return 初始化待审核小票的数量
      */
     public int adaptAuditTrip(List<OcrTrip> ocrTrips);
+
+    /**
+     * 根据userId获取当前时间和后一天时间的UploadId
+     * @param userId
+     * @param todayDate
+     * @param beforDate
+     * @return
+     */
+    public List<String> selectErrorTripByuserId(String userId,String todayDate,String beforDate);
 }

+ 21 - 0
src/main/java/com/pavis/ctr/audit/project/service/IAuditTripResultService.java

@@ -180,4 +180,25 @@ public interface IAuditTripResultService extends IService<AuditTripResult> {
      * 封装提取待审核逻辑
      */
     public AjaxResult getAuditTrip(Integer getAuditNum, Long userId);
+
+    /**
+     * 根据user_id和date_dir获取的uploadId获取auditTripResult
+     * 且要满足1.审核完成(1) 2.操作结论为操作错误(01)
+     * @param tripResultList
+     * @return
+     */
+    public List<AuditTripResult> getResultByUserIdUploadId(List<AuditTripResult> tripResultList);
+
+    /**
+     * 1:每次审核第一次提交时,记录日期用于表示该日上班,一天只记录一次。
+     * 2:获取上班日志表中id最大的一个,如果该条记录的时间和当天一致,则id-1获取次日的工作时间。
+     * 2.1:根据user_id查询所有审核完成的记录,给这些记录按日期进行排序,第一条称为最新审核记录;
+     * 2.2:如果工作日期小于等于最新审核记录则表示有可能存在审核数据
+     * 2.2.1:根据工作日期[零点,59]在user_id查询所有审核完成的记录中取对应的数据。
+     * 2.3:如果工作日期大于最新审核记录则表示一定没有审核记录,返回空。
+     * @param userId
+     * @return
+     */
+    public List<AuditTripResult> getTripResult(String userId);
+
 }

+ 15 - 0
src/main/java/com/pavis/ctr/audit/project/service/IOcrTripService.java

@@ -42,4 +42,19 @@ public interface IOcrTripService extends IService<OcrTrip> {
      * @return 需要审核的小票数据
      */
     List<OcrTrip> getAuditTripByShopName();
+
+    /**
+     * 根据dateDir获取小票数据
+     * @param dateDir
+     * @return 返回当天所有的小票数据
+     */
+    List<OcrTrip> getTodayTripByDateDir(String dateDir);
+
+    /**
+     * 获取当天所有新增的小票数据和当天已插入的数据做差,
+     * 将未插入的数据进行重新插入
+     * @param dateDir
+     * @return
+     */
+    List<OcrTrip> getTodaySurplusTripByDateDir(String dateDir);
 }

+ 15 - 0
src/main/java/com/pavis/ctr/audit/project/service/IRecordOcrTimeService.java

@@ -0,0 +1,15 @@
+package com.pavis.ctr.audit.project.service;
+
+import com.pavis.ctr.audit.project.domain.RecordOcrTime;
+
+public interface IRecordOcrTimeService {
+
+
+    /**
+     * 插入ocr运行的时间
+     * @param recordOcrTime
+     * @return
+     */
+    boolean insertOcrTimeAndStatus(RecordOcrTime recordOcrTime);
+
+}

+ 14 - 0
src/main/java/com/pavis/ctr/audit/project/service/IRecordWorkDateService.java

@@ -0,0 +1,14 @@
+package com.pavis.ctr.audit.project.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.pavis.ctr.audit.project.domain.RecordWorkDate;
+
+public interface IRecordWorkDateService extends IService<RecordWorkDate> {
+
+    /**
+     * 获取最大的Id号
+     * @return
+     */
+    public Integer getMaxId();
+
+}

+ 25 - 0
src/main/java/com/pavis/ctr/audit/project/service/ITripImgInfoService.java

@@ -0,0 +1,25 @@
+package com.pavis.ctr.audit.project.service;
+
+import com.pavis.ctr.audit.project.domain.OcrTrip;
+import com.pavis.ctr.audit.project.domain.TripImgInfo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+* @author pengc
+* @description 针对表【trip_img_info(存储小票原图和脱敏后的图片)】的数据库操作Service
+* @createDate 2023-07-24 10:01:40
+*/
+public interface ITripImgInfoService extends IService<TripImgInfo> {
+
+    /**
+     * 记录当天所有小票的原图和已脱敏的图片信息
+     * @param ocrTrips
+     * @return
+     */
+    int adaptTripImg(List<OcrTrip> ocrTrips);
+
+
+
+}

+ 14 - 1
src/main/java/com/pavis/ctr/audit/project/service/impl/AuditTripMainServiceImpl.java

@@ -145,7 +145,8 @@ public class AuditTripMainServiceImpl extends ServiceImpl<AuditTripMainMapper, A
                     // 生成小票主表信息
                     AuditTripMain main = new AuditTripMain();
                     main.setUploadId(ocrTrip.getUploadId());
-                    main.setUserId(null);
+//                    main.setUserId(null);
+                    main.setUserId(ocrTrip.getUserId());
                     main.setShopName(ocrTrip.getShopName());
                     main.setPurchaseDate(ocrTrip.getPurchaseDate());
                     main.setTotalSpend(ocrTrip.getTotalSpend());
@@ -199,6 +200,18 @@ public class AuditTripMainServiceImpl extends ServiceImpl<AuditTripMainMapper, A
         return 0;
     }
 
+    /**
+     * 按userid、date查询uploadId
+     * @param userId
+     * @param todayDate
+     * @param beforDate
+     * @return
+     */
+    @Override
+    public List<String> selectErrorTripByuserId(String userId, String todayDate, String beforDate) {
+        return baseMapper.selectErrorTripByuserId(userId,todayDate,beforDate);
+    }
+
     /**
      * 批量存储数据
      *

+ 158 - 8
src/main/java/com/pavis/ctr/audit/project/service/impl/AuditTripResultServiceImpl.java

@@ -3,32 +3,31 @@ package com.pavis.ctr.audit.project.service.impl;
 
 import com.aliyun.oss.OSS;
 import com.baidubce.services.bos.BosClient;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.pavis.ctr.audit.common.utils.ConvertObjUtils;
 import com.pavis.ctr.audit.common.utils.DateUtils;
 import com.pavis.ctr.audit.common.utils.ImageUtils;
-import com.pavis.ctr.audit.project.domain.AuditTripDet;
-import com.pavis.ctr.audit.project.domain.AuditTripImg;
-import com.pavis.ctr.audit.project.domain.AuditTripMain;
-import com.pavis.ctr.audit.project.domain.AuditTripResult;
+import com.pavis.ctr.audit.project.domain.*;
 import com.pavis.ctr.audit.project.domain.vo.AuditTripResultVo;
 import com.pavis.ctr.audit.project.mapper.AuditTripDetMapper;
 import com.pavis.ctr.audit.project.mapper.AuditTripImgMapper;
 import com.pavis.ctr.audit.project.mapper.AuditTripMainMapper;
 import com.pavis.ctr.audit.project.mapper.AuditTripResultMapper;
 import com.pavis.ctr.audit.project.service.IAuditTripResultService;
+import com.pavis.ctr.audit.project.service.IRecordWorkDateService;
 import com.pavis.ctr.audit.web.domain.AjaxResult;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.List;
-import java.util.UUID;
+import java.util.*;
 import java.util.stream.Collectors;
 
+import static java.util.stream.Collectors.toList;
+
 /**
  * 审核表 服务处理
  */
@@ -44,6 +43,12 @@ public class AuditTripResultServiceImpl extends ServiceImpl<AuditTripResultMappe
     @Autowired
     AuditTripImgMapper auditTripImgMapper;
 
+    @Autowired
+    AuditTripResultMapper auditTripResultMapper;
+
+    @Autowired
+    IRecordWorkDateService iRecordWorkDateService;
+
     @Value("${upload.path}")
     String basePath;
 
@@ -325,16 +330,19 @@ public class AuditTripResultServiceImpl extends ServiceImpl<AuditTripResultMappe
     @Override
     public boolean updateSubmitTripRes(AuditTripResultVo auditTripResultVo) {
         List<AuditTripImg> imgList = auditTripResultVo.getImgList();
+        //获取待拼接的图片列表
         List<String> imgs = imgList.stream()
                 .sorted(Comparator.comparing(AuditTripImg::getTripOrder))
                 .map(img -> {
                     if (StringUtils.isNotBlank(img.getTripNewImg())) {
+
                         return img.getTripNewImg();
                     } else {
                         return img.getTripImg();
                     }
                 })
                 .collect(Collectors.toList());
+
         List<AuditTripDet> detList = auditTripResultVo.getDetList();
         // 调用sql语句更新det 和 img,调用更新resultSQL
         // 暂时不需要更新提交的img信息,标注信息会在img标注完成后就提交了
@@ -349,6 +357,7 @@ public class AuditTripResultServiceImpl extends ServiceImpl<AuditTripResultMappe
         auditTripResultVo.setDetList(null);
         AuditTripResult auditTripResult = ConvertObjUtils.converResult(auditTripResultVo);
         AuditTripMain auditTripMain = ConvertObjUtils.converMain(auditTripResultVo);
+        //进行图片拼接
         if (imgs.size() > 0) {
             String[] imgArr = new String[imgs.size()];
             String dstPic = basePath + auditTripResultVo.getUploadId() + ".jpg";
@@ -442,6 +451,147 @@ public class AuditTripResultServiceImpl extends ServiceImpl<AuditTripResultMappe
         }
     }
 
+    /**
+     * 根据user_id和date_dir获取的uploadId获取auditTripResult
+     * 且要满足1.审核完成(1) 2.操作结论为操作错误(01)
+     * @param tripResultList
+     * @return
+     */
+    @Override
+    public List<AuditTripResult> getResultByUserIdUploadId(List<AuditTripResult> tripResultList) {
+
+
+        //对已审核完成的数据进行操作结论为01开头的错误结论进行筛选(这里存在删除元素和下标变化问题)
+        Iterator<AuditTripResult> iterator = tripResultList.iterator();
+        while (iterator.hasNext()){
+            AuditTripResult result = iterator.next();
+            if(result.getAuditConclusion().equals("02") || result.getAuditConclusion().equals("03")){
+                iterator.remove();
+            }else {
+                String auditConclusion = result.getAuditConclusion().split(",")[0];
+                String auditConclusionInfo = result.getAuditConclusion().split(",")[1];
+                if (auditConclusion.equals("01")) {
+                    if (Integer.valueOf(auditConclusionInfo) > 7) {
+                        //上面不需要判断auditConclusionInfo是否为空,如果审核结论不是01,就不会进入判断二级菜单的情况。
+                        //如果不是01则进行删除该对象元素。
+                        iterator.remove();
+                    }
+                }
+            }
+        }
+
+        if(tripResultList==null){
+            return tripResultList;
+        }
+
+        //对操作错误的二级子菜单进行权重排序。
+        tripResultList=tripResultList.stream().sorted(Comparator.comparing(
+                num ->Integer.parseInt(num.getAuditConclusion().split(",")[1].toString())))
+                .collect(Collectors.toList());
+
+        return tripResultList;
+    }
+
+    /**
+     * /**
+     * 1:每次审核第一次提交时,记录日期用于表示该日上班,一天只记录一次。
+     * 2:获取上班日志表中id最大的一个,如果该条记录的时间和当天一致,则id-1获取次日的工作时间。
+     * 2.1:根据user_id查询所有审核完成的记录,给这些记录按日期进行排序,第一条称为最新审核记录;
+     * 2.2:如果工作日期小于等于最新审核记录则表示有可能存在审核数据
+     * 2.2.1:根据工作日期[零点,59]在user_id查询所有审核完成的记录中取对应的数据。
+     * 2.3:如果工作日期大于最新审核记录则表示一定没有审核记录,返回空。
+     *
+     * @param userId
+     * @return
+     */
+    @Override
+    public List<AuditTripResult> getTripResult(String userId) {
+
+        QueryWrapper<AuditTripMain> mainQuery = Wrappers.query();
+        mainQuery.select("upload_id").eq("user_id", userId);
+        List<Object> auditTripMainList = auditTripMainMapper.selectObjs(mainQuery);
+
+        //判断该user_id下是否存在数据,不存在即时返回
+        if(auditTripMainList.size()<0||auditTripMainList.isEmpty()){
+            System.out.println("auditTripMainList没数据");
+            return null;
+        }
+
+        auditTripMainList.forEach(System.out::println);
+
+        //把object类型通过strem转为string,和数据库属性值类型对应
+        List<String> collect = auditTripMainList.stream().map(obj -> (String) obj).collect(toList());
+
+        QueryWrapper<AuditTripResult> resultQuery = Wrappers.query();
+        resultQuery.select("*").in("upload_id", collect).eq("audit_status", 1);
+        List<AuditTripResult> auditTripResults = auditTripResultMapper.selectList(resultQuery);
+
+        //判断该user_id下是否存在已审核数据,不存在即时返回
+        if(auditTripResults.size()<0||auditTripResults.isEmpty()||auditTripResults==null){
+            System.out.println("auditTripResults没有数据");
+            return null;
+        }
+
+        System.out.println("查询该用户的小票是否被审批");
+        auditTripResults.forEach(System.out::println);
+
+        //对获取的审核记录进行排序
+        List<AuditTripResult> collect1 = auditTripResults.stream().sorted(Comparator.comparing(AuditTripResult::getUpdateTime).reversed()).collect(Collectors.toList());
+        System.out.println("排序后");
+        collect1.forEach(System.out::println);
+        //格式化日期 2023-07-08 14:02:03---> 2023-07-08
+        Date updateTime = collect1.get(0).getUpdateTime();
+        String newResultTime = DateUtils.dateTime(updateTime);
+        System.out.println("第一条数据的时间" + newResultTime);
+        String todayDate = DateUtils.getDate();
+        System.out.println("当前时间" + todayDate);
+
+
+        //获取上班日期
+        Integer maxId = iRecordWorkDateService.getMaxId();
+
+        if(maxId==null){
+            //此时工作记录表中无数据
+            return null;
+
+        }
+
+        RecordWorkDate recordWorkDate = iRecordWorkDateService.getBaseMapper().selectById(maxId);
+        String onDutyDate = recordWorkDate.getWorkDate();
+        System.out.println("最新的上班时间" + onDutyDate);
+
+        //表示今天上班了,需要获取次天的日期
+        //如果存在id号断层的情况 1,2,3,7
+        //可以在建表时设置表的自增ID从1开始(ALTER TABLE record_work_date auto_increment=1;),或则对id进行排序
+        if ((todayDate.compareTo(onDutyDate) == 0)) {
+
+            recordWorkDate = iRecordWorkDateService.getBaseMapper().selectById(maxId - 1);
+
+            onDutyDate = recordWorkDate.getWorkDate();
+            System.out.println("次日上班时间" + onDutyDate);
+
+        }
+
+        List<AuditTripResult> auditTripResults1=null;
+        //如果上班日期小于等于最新记录日期,即在时间上是包含关系,但需要判断数据是否为null,
+        //如果上班日期大于最新记录日期,在时间上不是包含关系,就一定没有审核数据。
+        if (onDutyDate.compareTo(newResultTime) <= 0) {
+            //
+
+            String startTime = onDutyDate + " 00:00:00";
+            String endTime = onDutyDate + " 23:59:59";
+
+            auditTripResults1 = collect1.stream().filter(result -> result.getUpdateTime().getTime() >= DateUtils.dateTime("yyyy-MM-dd HH:mm:ss", startTime).getTime() && result.getUpdateTime().getTime() <= DateUtils.dateTime("yyyy-MM-dd HH:mm:ss", endTime).getTime()).collect(toList());
+            System.out.println("符合条件的数据");
+            auditTripResults1.forEach(System.out::println);
+
+            return auditTripResults1;
+        } else {
+            return auditTripResults1;
+        }
+
+    }
+
     /**
      * 根据uploadId提取审核完成的数据
      *

+ 48 - 0
src/main/java/com/pavis/ctr/audit/project/service/impl/OcrTripServiceImpl.java

@@ -1,15 +1,18 @@
 package com.pavis.ctr.audit.project.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.pavis.ctr.audit.common.constant.Constants;
 import com.pavis.ctr.audit.project.domain.AuditTripMain;
 import com.pavis.ctr.audit.project.domain.OcrTrip;
 import com.pavis.ctr.audit.project.domain.OcrTripDet;
+import com.pavis.ctr.audit.project.domain.TripImgInfo;
 import com.pavis.ctr.audit.project.mapper.OcrTripMapper;
 import com.pavis.ctr.audit.project.service.IAuditTripMainService;
 import com.pavis.ctr.audit.project.service.IOcrTripDetService;
 import com.pavis.ctr.audit.project.service.IOcrTripService;
+import com.pavis.ctr.audit.project.service.ITripImgInfoService;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -32,6 +35,9 @@ public class OcrTripServiceImpl extends ServiceImpl<OcrTripMapper, OcrTrip> impl
     @Autowired
     private IAuditTripMainService auditTripMainService;
 
+    @Autowired
+    private ITripImgInfoService tripImgInfoService;
+
     @Override
     public List<OcrTrip> getAuditTrip() {
         return getAuditTripByDateDir(null);
@@ -134,4 +140,46 @@ public class OcrTripServiceImpl extends ServiceImpl<OcrTripMapper, OcrTrip> impl
         }
         return null;
     }
+
+    @Override
+    public List<OcrTrip> getTodayTripByDateDir(String dateDir) {
+
+
+        QueryWrapper<OcrTrip> query = Wrappers.query();
+        query.select("*").eq("date_dir",dateDir);
+
+        List<OcrTrip> todayTrip = baseMapper.selectList(query);
+
+        if (todayTrip == null || todayTrip.size() == 0) {
+            return null;
+        }
+
+        return todayTrip;
+    }
+
+    @Override
+    public List<OcrTrip> getTodaySurplusTripByDateDir(String dateDir) {
+        List<String> todayUploadId = getTodayTripByDateDir(dateDir)
+                .stream().map(OcrTrip::getUploadId).
+                collect(Collectors.toList());
+
+
+        QueryWrapper<TripImgInfo> query = Wrappers.query();
+        query.select("upload_id").eq("date_dir",dateDir);
+        List<String> tripImgInfos = tripImgInfoService.getBaseMapper().selectList(query)
+                .stream().map(TripImgInfo::getUploadId).
+                collect(Collectors.toList());
+        //对比两个list<>,取tripImgInfos 对于 todayTripByDateDir 的差集
+        if (CollectionUtils.isNotEmpty(todayUploadId) && CollectionUtils.isNotEmpty(tripImgInfos)) {
+
+            Collection<String> subtract = CollectionUtils.subtract(todayUploadId, tripImgInfos);
+            if(CollectionUtils.isNotEmpty(subtract)){
+                List<OcrTrip> ocrTrips = query().in("upload_id", subtract).list();
+                return ocrTrips;
+            }
+
+        }
+
+        return null;
+    }
 }

+ 25 - 0
src/main/java/com/pavis/ctr/audit/project/service/impl/RecordOcrTimeSeriveImpl.java

@@ -0,0 +1,25 @@
+package com.pavis.ctr.audit.project.service.impl;
+
+import com.pavis.ctr.audit.project.domain.RecordOcrTime;
+import com.pavis.ctr.audit.project.mapper.RecordOcrTimeMapper;
+import com.pavis.ctr.audit.project.service.IRecordOcrTimeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class RecordOcrTimeSeriveImpl implements IRecordOcrTimeService {
+
+    @Autowired
+    private RecordOcrTimeMapper recordOcrTimeMapper;
+
+    /**
+     * 插入OCR的运行时间和运行状态
+     * @param recordOcrTime
+     * @return
+     */
+    @Override
+    public boolean insertOcrTimeAndStatus(RecordOcrTime recordOcrTime) {
+
+        return recordOcrTimeMapper.insertOcrTimeAndStatus(recordOcrTime);
+    }
+}

+ 25 - 0
src/main/java/com/pavis/ctr/audit/project/service/impl/RecordWorkDateServiceImpl.java

@@ -0,0 +1,25 @@
+package com.pavis.ctr.audit.project.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.pavis.ctr.audit.project.domain.RecordWorkDate;
+import com.pavis.ctr.audit.project.mapper.RecordWorkDateMapper;
+import com.pavis.ctr.audit.project.service.IRecordWorkDateService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+
+@Service
+public class RecordWorkDateServiceImpl extends ServiceImpl<RecordWorkDateMapper, RecordWorkDate> implements IRecordWorkDateService {
+
+
+
+    @Autowired
+    private RecordWorkDateMapper recordWorkDateMapper;
+
+    @Override
+    public Integer getMaxId() {
+        return recordWorkDateMapper.getMaxId();
+    }
+
+
+}

+ 85 - 0
src/main/java/com/pavis/ctr/audit/project/service/impl/TripImgInfoServiceImpl.java

@@ -0,0 +1,85 @@
+package com.pavis.ctr.audit.project.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.pavis.ctr.audit.project.domain.OcrTrip;
+import com.pavis.ctr.audit.project.domain.TripImgInfo;
+import com.pavis.ctr.audit.project.domain.UpTrip;
+import com.pavis.ctr.audit.project.mapper.TripImgInfoMapper;
+import com.pavis.ctr.audit.project.service.ITripImgInfoService;
+import com.pavis.ctr.audit.project.service.IUpTripService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+* @author pengc
+* @description 针对表【trip_img_info(存储小票原图和脱敏后的图片)】的数据库操作Service实现
+* @createDate 2023-07-24 10:01:40
+*/
+@Service
+public class TripImgInfoServiceImpl extends ServiceImpl<TripImgInfoMapper, TripImgInfo>
+    implements ITripImgInfoService {
+
+    @Autowired
+    private IUpTripService upTripService;
+
+    @Override
+    public int adaptTripImg(List<OcrTrip> ocrTrips) {
+
+        if(ocrTrips.size()>0 || ocrTrips!=null){
+
+            List<TripImgInfo> tripImgInfos = new ArrayList<>();
+            List<UpTrip> upTrips = new ArrayList<>();
+            List<String> sTripPhotoId = new ArrayList<>();
+
+            Map<String, OcrTrip> ocrTripHashMap = new HashMap<>();
+            //把list转为map
+            for (OcrTrip ocrTrip : ocrTrips) {
+                sTripPhotoId.add(ocrTrip.getsTripPhotoId());
+                ocrTripHashMap.put(ocrTrip.getsTripPhotoId(),ocrTrip);
+            }
+
+            //获取uptrip对象
+            QueryWrapper<UpTrip> query = Wrappers.query();
+            query.select("*").in("s_trip_photo_id",sTripPhotoId);
+            upTrips = upTripService.getBaseMapper().selectList(query);
+
+            //根据uptrip获取ocrtripHashMap中的文件信息
+            for (UpTrip upTrip : upTrips) {
+                TripImgInfo tripImgInfo = new TripImgInfo();
+                tripImgInfo.setOcrImg(upTrip.getTripImg());
+                tripImgInfo.setOrgOcrImg(upTrip.getOrgTripImg());
+                OcrTrip ocrTrip = ocrTripHashMap.get(upTrip.getsTripPhotoId());
+
+                //文件名需要进一步处理,当前的ocr_trip只是保存了图片的首个文件名
+                String s = upTrip.getTripImg();
+                String[] split = s.split("/");
+                //第五个元素是文件名
+                tripImgInfo.setFileName(split[split.length-1]);
+                tripImgInfo.setUploadId(ocrTrip.getUploadId());
+                tripImgInfo.setDateDir(upTrip.getDateDir());
+                tripImgInfos.add(tripImgInfo);
+            }
+
+            //存储小票信息
+            boolean saveBatch = saveBatch(tripImgInfos);
+
+            if (saveBatch) {
+                return tripImgInfos.size();
+            }
+
+        }
+
+        return 0;
+    }
+}
+
+
+
+

+ 6 - 5
src/main/resources/application-dev.yml

@@ -3,9 +3,9 @@ spring:
   datasource:
     type: com.alibaba.druid.pool.DruidDataSource
     driverClassName: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://localhost:3306/ctr?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true
+    url: jdbc:mysql://localhost:33064/ctr?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true
     username: root
-    password: password
+    password: root
 
   # redis 配置
   redis:
@@ -14,9 +14,9 @@ spring:
     # 端口,默认为6379
     port: 6379
     # 数据库索引
-    # database: 1
+#    database: 1
     # 密码
-    # password: 123456
+    password: 123456
     # 连接超时时间
     timeout: 10s
     lettuce:
@@ -31,7 +31,8 @@ spring:
         max-wait: -1ms
 #截图暂存地址
 upload:
-  path: /Users/alibct/Downloads/project/ctr2/upload/
+#  path: /Users/alibct/Downloads/project/ctr2/upload/
+  path: D:/tmp/files/
 
 #定时任务日期
 cron-expression:

+ 1 - 0
src/main/resources/application.yml

@@ -12,6 +12,7 @@ spring:
   profiles:
     #这里用来区分使用哪个application
     active: prod
+#    active: dev
   # 文件上传
   servlet:
     multipart:

+ 2 - 1
src/main/resources/logback.xml

@@ -1,7 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration>
     <!-- 日志存放路径 -->
-    <property name="log.path" value="/Users/alibct/Downloads/project/ctr2/logs"/>
+<!--    <property name="log.path" value="D:\Users\ctr_audit\logs"/>-->
+    <property name="log.path" value="D:\Users\ctr_audit\logs"/>
     <!-- 日志输出格式 -->
     <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>
 

+ 5 - 0
src/main/resources/mybatis/mapper/AuditTripMainMapper.xml

@@ -84,5 +84,10 @@
         from audit_trip_main
         order by date_dir desc limit 1;
     </select>
+    <select id="selectErrorTripByuserId" resultType="java.lang.String">
+        select upload_id
+        from audit_trip_main
+        where user_id=#{userId} and date_dir &lt;= #{todayDate} and date_dir &gt;= #{beforDate}
+    </select>
 
 </mapper>

+ 10 - 0
src/main/resources/mybatis/mapper/AuditTripResultMapper.xml

@@ -135,4 +135,14 @@
         select count(*) from audit_trip_result where user_id is null or user_id=0
     </select>
 
+    <select id="getResultByUserIdUploadId" resultMap="AuditTripResult">
+        select * from audit_trip_result
+        where upload_id in
+        <foreach collection="uploadId" item = "item" open="(" close=")" separator=",">
+            #{item}
+        </foreach>
+        and audit_status=1;
+
+    </select>
+
 </mapper>

+ 20 - 0
src/main/resources/mybatis/mapper/RecordOcrTimeMapper.xml

@@ -0,0 +1,20 @@
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.pavis.ctr.audit.project.mapper.RecordOcrTimeMapper">
+    <resultMap id="RecordOcrTime" type="RecordOcrTime">
+        <id property="dateDir" column="date_dir"/>
+        <result property="beginTime" column="begin_time"/>
+        <result property="endTime" column="end_time"/>
+        <result property="workStatus" column="work_status"/>
+    </resultMap>
+    <insert id="insertOcrTimeAndStatus" parameterType="RecordOcrTime">
+    insert into record_ocr_time(date_dir,begin_time,end_time,work_status)
+    values (#{dateDir},#{beginTime},#{endTime},#{workStatus})
+    </insert>
+    <!-- -->
+
+
+
+
+</mapper>

+ 17 - 0
src/main/resources/mybatis/mapper/RecordWorkDateMapper.xml

@@ -0,0 +1,17 @@
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.pavis.ctr.audit.project.mapper.RecordWorkDateMapper">
+
+    <resultMap id="baseRecordWorkDate" type="RecordWorkDate">
+        <id property="id" column="id"/>
+        <result property="workDate" column="work_date"/>
+        <result property="workTime" column="work_time"/>
+        <result property="workUser" column="work_user"/>
+    </resultMap>
+    <select id="getMaxId" resultType="java.lang.Integer">
+        select max(id) from record_work_date
+    </select>
+
+
+</mapper>

+ 23 - 0
src/main/resources/mybatis/mapper/TripImgInfoMapper.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.pavis.ctr.audit.project.mapper.TripImgInfoMapper">
+
+    <resultMap id="BaseResultMap" type="com.pavis.ctr.audit.project.domain.TripImgInfo">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="fileName" column="file_name" jdbcType="VARCHAR"/>
+            <result property="uploadId" column="upload_id" jdbcType="VARCHAR"/>
+            <result property="ocrImg" column="ocr_img" jdbcType="VARCHAR"/>
+            <result property="orgOcrImg" column="org_ocr_img" jdbcType="VARCHAR"/>
+            <result property="dateDir" column="date_dir" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,file_name,upload_id,
+        ocr_img,org_ocr_img
+    </sql>
+
+
+
+</mapper>

+ 204 - 5
src/test/java/com/pavis/ctr/audit/CtrAuditApplicationTests.java

@@ -1,6 +1,8 @@
 package com.pavis.ctr.audit;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.pavis.ctr.audit.common.utils.DateUtils;
 import com.pavis.ctr.audit.common.utils.SecurityUtils;
@@ -15,10 +17,10 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.UUID;
+import java.text.ParseException;
+import java.util.*;
+
+import static java.util.stream.Collectors.toList;
 
 @SpringBootTest
 
@@ -327,8 +329,205 @@ class CtrAuditApplicationTests {
 
     }
 
+    @Autowired
+    IAuditTripMainService iAuditTripMainService;
+
+    @Autowired
+    IAuditTripResultService iAuditTripResultService;
+    @Test
+    public void testByUserIdAndDateGetUpload() {
+        String todayDate = DateUtils.getDate();
+        System.out.println(todayDate);
+        String beforDate = null;
+        try {
+            beforDate= DateUtils.minusOneDay(todayDate);
+            System.out.println("减一天的时间"+beforDate);
+        } catch (ParseException e) {
+            throw new RuntimeException(e);
+        }
+
+        List<String> cn45099870 = iAuditTripMainService.selectErrorTripByuserId("cn45099870", todayDate.replace("-",""), beforDate.replace("-",""));
+
+
+
+
+    }
+
+    @Test
+    public void testSocrt() {
+
+        List<Integer> strings = new ArrayList<>();
+        strings.add(3);
+        strings.add(5);
+        strings.add(8);
+        strings.add(1);
+        strings = strings.stream().sorted(Integer::compareTo).collect(toList());
+
+        strings.forEach(
+                p->{
+                    System.out.println(p);
+                }
+        );
+
+    }
+
+
+
+
+
+    @Test
+    public void createPassword(){
+
+//        BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
+//        System.out.println(bCryptPasswordEncoder.encode("admin123"));
+
+//        Date date = DateUtils.dateTime("yyyy-MM-dd HH:mm:ss", "2023-07-07 00:00:00");
+//        System.out.println(date);
+
+    }
+
+    /**
+     * 测试获取两个list交集部分
+     */
+    @Test
+    public void testCommonList(){
+
+        List<String> arrayList1 = new ArrayList<>();
+        arrayList1.add("1");
+        arrayList1.add("9");
+        arrayList1.add("2");
+        arrayList1.add("8");
+
+        List<String> arrayList2= new ArrayList<>();
+        arrayList2.add("1");
+        arrayList2.add("3");
+        arrayList2.add("7");
+        arrayList2.add("8");
+
+        List<String> collect = arrayList1.stream().filter(
+                item -> arrayList2.contains(item)
+        ).collect(toList());
+
+        collect.forEach(
+                System.out::println
+        );
+
+    }
+
+    /**
+     * 测试获取upload_id
+     */
+    @Test
+    public void testUpload(){
+
+        QueryWrapper<AuditTripMain> mainQuery = Wrappers.query();
+        mainQuery.select("upload_id").eq("user_id","cn45099870");
+        List<Object> auditTripMainList = iAuditTripMainService.getBaseMapper().selectObjs(mainQuery);
+        auditTripMainList.forEach(
+                System.out::println
+        );
+
+        //把object类型通过strem转为string,和数据库属性值类型对应
+        List<String> collect = auditTripMainList.stream().map(obj -> (String) obj).collect(toList());
+
+        QueryWrapper<AuditTripResult> resultQuery = Wrappers.query();
+        resultQuery.select("*")
+                .in("upload_id",collect)
+                .eq("audit_status",1);
+        List<AuditTripResult> auditTripResults = iAuditTripResultService.getBaseMapper().selectList(resultQuery);
+        System.out.println("查询该用户的小票是否被审批");
+        auditTripResults.forEach(
+                System.out::println
+        );
+
+        //对获取的审核记录进行排序
+        auditTripResults.sort(
+                (res1,res2)->
+                        res2.getUpdateTime().compareTo(res1.getUpdateTime())
+        );
+        System.out.println("排序后");
+        auditTripResults.forEach(
+                System.out::println
+        );
+
+        //格式化日期
+        Date updateTime = auditTripResults.get(0).getUpdateTime();
+        String newResultTime = DateUtils.dateTime(updateTime);
+        System.out.println("第一条数据的时间"+newResultTime);
+        String todayDate = DateUtils.getDate();
+        System.out.println("当前时间"+todayDate);
+        String beforDate = null;
+        try {
+            beforDate = DateUtils.minusOneDay(todayDate);
+        } catch (ParseException e) {
+            throw new RuntimeException(e);
+        }
+        System.out.println("前一天时间"+beforDate);
+        System.out.println("2023-07-06".compareTo(beforDate));
+
+
+        //最新数据在当天
+        if((newResultTime.compareTo(beforDate)>0)){
+            //
+
+        }else if(newResultTime.compareTo(beforDate)==0) {
+            //最新数据在第二天
+            String startTime = beforDate + " 59:59:59";
+            String endTime = beforDate + " 00:00:00";
+
+            List<AuditTripResult> auditTripResults1 = auditTripResults.stream()
+                    .filter(
+                            result -> result.getUpdateTime().getTime() >= DateUtils.dateTime("yyyy-MM-dd HH:mm:ss", endTime).getTime()
+                                    && result.getUpdateTime().getTime() <= DateUtils.dateTime("yyyy-MM-dd HH:mm:ss", startTime).getTime()
+                    ).collect(toList());
+            auditTripResults1.forEach(
+                    System.out::println
+            );
+
+        }
+
+
+    }
+
+    /**
+     * 测试获取当天的数据
+     */
+
+    @Autowired
+    ITripImgInfoService iTripImgInfoService;
+
+    @Autowired
+    IOcrTripService ocrTripService;
+
+    @Autowired
+    IUpTripService upTripService;
+
+    @Test
+    public  void testtoDayInfo(){
+
+//        List<OcrTrip> todayTripByDateDir = ocrTripService.getTodayTripByDateDir("20230606");
+
+        QueryWrapper<OcrTrip> query = Wrappers.query();
+        query.select("*");
+        System.out.println("这里正常!");
+        List<OcrTrip> ocrTrips = ocrTripService.getBaseMapper().selectList(query);
+        System.out.println("数据总计:"+ocrTrips.size()+"条");
+
+        int i = iTripImgInfoService.adaptTripImg(ocrTrips);
+
+        System.out.println(String.format("当前总计插入图片数据为:%d,总计:%d", i,i+1));
+
+    }
+
+
+    /**
+     *切分url获取文件名称
+     */
     @Test
-    public void testJoinImageListVertical() {
+    public void  testSplitFileName(){
+//        String s = "https://ctrimgs.bj.bcebos.com/20210616/16-471802237.jpg";
+//        String[] split = s.split("/");
+//        System.out.println(split[split.length-1]);
 
     }