夏文涛 před 2 roky
rodič
revize
a6f64e46d0
100 změnil soubory, kde provedl 10452 přidání a 1 odebrání
  1. 1 0
      .idea/.name
  2. 23 0
      .idea/compiler.xml
  3. 14 0
      .idea/encodings.xml
  4. 452 0
      .idea/misc.xml
  5. 124 0
      .idea/uiDesigner.xml
  6. 6 0
      .idea/vcs.xml
  7. 1159 0
      .idea/workspace.xml
  8. 1 1
      README.md
  9. 218 0
      pom.xml
  10. 163 0
      share_video.iml
  11. 110 0
      share_videos.iml
  12. 93 0
      src/main/java/com/repair/AutoCode.java
  13. 17 0
      src/main/java/com/repair/MybatisPlusApplication.java
  14. 12 0
      src/main/java/com/repair/annotation/ControllerIsShow.java
  15. 28 0
      src/main/java/com/repair/annotation/PassToken.java
  16. 14 0
      src/main/java/com/repair/annotation/UserLoginCheck.java
  17. 45 0
      src/main/java/com/repair/aop/LoginCheckAspect.java
  18. 39 0
      src/main/java/com/repair/api/LoginControllerAPI.java
  19. 45 0
      src/main/java/com/repair/api/RepairAdminControllerAPI.java
  20. 43 0
      src/main/java/com/repair/api/RepairAreaControllerAPI.java
  21. 39 0
      src/main/java/com/repair/api/RepairArticleTypeControllerAPI.java
  22. 44 0
      src/main/java/com/repair/api/RepairClassesSettingsControllerAPI.java
  23. 30 0
      src/main/java/com/repair/api/RepairCollaborateRecordControllerAPI.java
  24. 32 0
      src/main/java/com/repair/api/RepairConsumablesControllerAPI.java
  25. 48 0
      src/main/java/com/repair/api/RepairConsumeControllerAPI.java
  26. 30 0
      src/main/java/com/repair/api/RepairDispatchRecordControllerAPI.java
  27. 33 0
      src/main/java/com/repair/api/RepairEvaluateControllerAPI.java
  28. 30 0
      src/main/java/com/repair/api/RepairLeaveMessageControllerAPI.java
  29. 40 0
      src/main/java/com/repair/api/RepairNoticeSettingControllerAPI.java
  30. 30 0
      src/main/java/com/repair/api/RepairPayRecordControllerAPI.java
  31. 30 0
      src/main/java/com/repair/api/RepairReceivingControllerAPI.java
  32. 45 0
      src/main/java/com/repair/api/RepairRecordControllerAPI.java
  33. 30 0
      src/main/java/com/repair/api/RepairRefundRecordControllerAPI.java
  34. 30 0
      src/main/java/com/repair/api/RepairSchoolControllerAPI.java
  35. 34 0
      src/main/java/com/repair/api/RepairShiftSettingsControllerAPI.java
  36. 30 0
      src/main/java/com/repair/api/RepairSystemMessagesControllerAPI.java
  37. 26 0
      src/main/java/com/repair/api/RepairSystemSettingControllerAPI.java
  38. 30 0
      src/main/java/com/repair/api/RepairTrackRecordControllerAPI.java
  39. 30 0
      src/main/java/com/repair/api/RepairTransferRecordControllerAPI.java
  40. 39 0
      src/main/java/com/repair/api/RepairUserControllerAPI.java
  41. 38 0
      src/main/java/com/repair/api/RepairWorkTypeControllerAPI.java
  42. 14 0
      src/main/java/com/repair/common/exception/EmsException.java
  43. 200 0
      src/main/java/com/repair/common/exception/EmsExceptionHandler.java
  44. 29 0
      src/main/java/com/repair/common/exception/MyCustomException.java
  45. 7 0
      src/main/java/com/repair/common/result/Code.java
  46. 82 0
      src/main/java/com/repair/common/result/ResponseStatusEnum.java
  47. 199 0
      src/main/java/com/repair/common/utils/AesUtils.java
  48. 173 0
      src/main/java/com/repair/common/utils/CommonUtil.java
  49. 41 0
      src/main/java/com/repair/common/utils/EncryptionUtil.java
  50. 173 0
      src/main/java/com/repair/common/utils/ExcelExportUtil.java
  51. 65 0
      src/main/java/com/repair/common/utils/ExcelUtils.java
  52. 479 0
      src/main/java/com/repair/common/utils/HttpsClient.java
  53. 105 0
      src/main/java/com/repair/common/utils/JWTUtil.java
  54. 61 0
      src/main/java/com/repair/common/utils/MimeTypeUtils.java
  55. 23 0
      src/main/java/com/repair/common/utils/MyX509TrustManager.java
  56. 195 0
      src/main/java/com/repair/common/utils/RSAUtils.java
  57. 42 0
      src/main/java/com/repair/common/utils/SHA1.java
  58. 178 0
      src/main/java/com/repair/common/utils/SendSms.java
  59. 84 0
      src/main/java/com/repair/common/utils/SeqUtils.java
  60. 103 0
      src/main/java/com/repair/common/utils/StrUtils.java
  61. 575 0
      src/main/java/com/repair/common/utils/TimeExchange.java
  62. 25 0
      src/main/java/com/repair/common/utils/ValidateCode.java
  63. 53 0
      src/main/java/com/repair/common/utils/WxConstants.java
  64. 379 0
      src/main/java/com/repair/common/utils/WxUtil.java
  65. 27 0
      src/main/java/com/repair/common/utils/paramUtils.java
  66. 25 0
      src/main/java/com/repair/common/utils/smsUtil.java
  67. 52 0
      src/main/java/com/repair/config/MyBatisPlusConfig.java
  68. 37 0
      src/main/java/com/repair/config/MySecurity.java
  69. 36 0
      src/main/java/com/repair/config/SmsConfig.java
  70. 27 0
      src/main/java/com/repair/config/WxOpenidConfig.java
  71. 356 0
      src/main/java/com/repair/controller/LoginController.java
  72. 175 0
      src/main/java/com/repair/controller/RepairAdminController.java
  73. 156 0
      src/main/java/com/repair/controller/RepairAreaController.java
  74. 138 0
      src/main/java/com/repair/controller/RepairArticleTypeController.java
  75. 421 0
      src/main/java/com/repair/controller/RepairClassesSettingsController.java
  76. 75 0
      src/main/java/com/repair/controller/RepairCollaborateRecordController.java
  77. 75 0
      src/main/java/com/repair/controller/RepairConsumablesController.java
  78. 396 0
      src/main/java/com/repair/controller/RepairConsumeController.java
  79. 75 0
      src/main/java/com/repair/controller/RepairDispatchRecordController.java
  80. 89 0
      src/main/java/com/repair/controller/RepairEvaluateController.java
  81. 72 0
      src/main/java/com/repair/controller/RepairLeaveMessageController.java
  82. 148 0
      src/main/java/com/repair/controller/RepairNoticeSettingController.java
  83. 72 0
      src/main/java/com/repair/controller/RepairPayRecordController.java
  84. 74 0
      src/main/java/com/repair/controller/RepairReceivingController.java
  85. 207 0
      src/main/java/com/repair/controller/RepairRecordController.java
  86. 72 0
      src/main/java/com/repair/controller/RepairRefundRecordController.java
  87. 76 0
      src/main/java/com/repair/controller/RepairSchoolController.java
  88. 104 0
      src/main/java/com/repair/controller/RepairShiftSettingsController.java
  89. 72 0
      src/main/java/com/repair/controller/RepairSystemMessagesController.java
  90. 73 0
      src/main/java/com/repair/controller/RepairSystemSettingController.java
  91. 74 0
      src/main/java/com/repair/controller/RepairTrackRecordController.java
  92. 74 0
      src/main/java/com/repair/controller/RepairTransferRecordController.java
  93. 185 0
      src/main/java/com/repair/controller/RepairUserController.java
  94. 114 0
      src/main/java/com/repair/controller/RepairWorkTypeController.java
  95. 27 0
      src/main/java/com/repair/core/CORSConfiguration.java
  96. 113 0
      src/main/java/com/repair/core/JwtAuthenticationInterceptor.java
  97. 25 0
      src/main/java/com/repair/core/JwtlnterceptorConfig.java
  98. 74 0
      src/main/java/com/repair/core/SwaggerConfiguration.java
  99. 26 0
      src/main/java/com/repair/handle/NonStaticResourceHttpRequestHandler.java
  100. 0 0
      src/main/java/com/repair/handler/MyMetaObjectHandler.java

+ 1 - 0
.idea/.name

@@ -0,0 +1 @@
+repair_report

+ 23 - 0
.idea/compiler.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="CompilerConfiguration">
+    <annotationProcessing>
+      <profile default="true" name="Default" enabled="true" />
+      <profile name="Maven default annotation processors profile" enabled="true">
+        <sourceOutputDir name="target/generated-sources/annotations" />
+        <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
+        <outputRelativeToContentRoot value="true" />
+        <module name="repair_backend" />
+        <module name="template_code" />
+        <module name="Back-endDevelopmentFramework" />
+      </profile>
+    </annotationProcessing>
+  </component>
+  <component name="JavacSettings">
+    <option name="ADDITIONAL_OPTIONS_OVERRIDE">
+      <module name="Back-endDevelopmentFramework" options="-parameters" />
+      <module name="repair_backend" options="-parameters" />
+      <module name="template_code" options="-parameters" />
+    </option>
+  </component>
+</project>

+ 14 - 0
.idea/encodings.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Encoding" native2AsciiForPropertiesFiles="true" defaultCharsetForPropertiesFiles="UTF-8">
+    <file url="file://$PROJECT_DIR$" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/src/main/java/com/repair/common/utils/HttpsClient.java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/src/main/java/com/repair/common/utils/MyX509TrustManager.java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/src/main/java/com/repair/common/utils/SHA1.java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/src/main/java/com/repair/common/utils/TimeExchange.java" charset="GBK" />
+    <file url="file://$PROJECT_DIR$/src/main/java/com/repair/common/utils/WxConstants.java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/src/main/java/com/repair/common/utils/WxUtil.java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/src/main/java/com/repair/model/result/Wx_user.java" charset="UTF-8" />
+    <file url="PROJECT" charset="UTF-8" />
+  </component>
+</project>

+ 452 - 0
.idea/misc.xml

@@ -0,0 +1,452 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ExternalStorageConfigurationManager" enabled="true" />
+  <component name="MavenProjectsManager">
+    <option name="originalFiles">
+      <list>
+        <option value="$PROJECT_DIR$/pom.xml" />
+      </list>
+    </option>
+  </component>
+  <component name="ProjectInspectionProfilesVisibleTreeState">
+    <entry key="Project Default">
+      <profile-state>
+        <expanded-state>
+          <State />
+          <State>
+            <id>Abstraction issuesJava</id>
+          </State>
+          <State>
+            <id>AccessibilityHTML</id>
+          </State>
+          <State>
+            <id>AccessibilityLintAndroid</id>
+          </State>
+          <State>
+            <id>Android</id>
+          </State>
+          <State>
+            <id>Angular</id>
+          </State>
+          <State>
+            <id>Application Servers</id>
+          </State>
+          <State>
+            <id>Application SizePerformanceLintAndroid</id>
+          </State>
+          <State>
+            <id>Assignment issuesJava</id>
+          </State>
+          <State>
+            <id>Bean Validation</id>
+          </State>
+          <State>
+            <id>Bidirectional TextInternationalizationLintAndroid</id>
+          </State>
+          <State>
+            <id>Bitwise operation issuesJava</id>
+          </State>
+          <State>
+            <id>Bitwise operation issuesJavaScript</id>
+          </State>
+          <State>
+            <id>CDI (Contexts and Dependency Injection)</id>
+          </State>
+          <State>
+            <id>CSS</id>
+          </State>
+          <State>
+            <id>Chrome OSCorrectnessLintAndroid</id>
+          </State>
+          <State>
+            <id>Class metricsJava</id>
+          </State>
+          <State>
+            <id>Class structureJava</id>
+          </State>
+          <State>
+            <id>Cloning issuesJava</id>
+          </State>
+          <State>
+            <id>Code maturityJava</id>
+          </State>
+          <State>
+            <id>Code style issuesJava</id>
+          </State>
+          <State>
+            <id>Code style issuesJavaScript</id>
+          </State>
+          <State>
+            <id>CodeSpring CoreSpring</id>
+          </State>
+          <State>
+            <id>CoffeeScript</id>
+          </State>
+          <State>
+            <id>Compiler issuesJava</id>
+          </State>
+          <State>
+            <id>Control flow issuesGroovy</id>
+          </State>
+          <State>
+            <id>Control flow issuesJava</id>
+          </State>
+          <State>
+            <id>Control flow issuesJavaScript</id>
+          </State>
+          <State>
+            <id>CorrectnessLintAndroid</id>
+          </State>
+          <State>
+            <id>Cucumber</id>
+          </State>
+          <State>
+            <id>Declaration redundancyJava</id>
+          </State>
+          <State>
+            <id>DeclarationGroovy</id>
+          </State>
+          <State>
+            <id>Dependency issuesJava</id>
+          </State>
+          <State>
+            <id>Dockerfile</id>
+          </State>
+          <State>
+            <id>ECMAScript 6 migration aidsJavaScript</id>
+          </State>
+          <State>
+            <id>EditorConfig</id>
+          </State>
+          <State>
+            <id>EncapsulationJava</id>
+          </State>
+          <State>
+            <id>Error handlingGroovy</id>
+          </State>
+          <State>
+            <id>Error handlingJava</id>
+          </State>
+          <State>
+            <id>Error handlingJavaScript</id>
+          </State>
+          <State>
+            <id>Faces Model</id>
+          </State>
+          <State>
+            <id>FreeMarker</id>
+          </State>
+          <State>
+            <id>GPathGroovy</id>
+          </State>
+          <State>
+            <id>GSPGrailsGroovy</id>
+          </State>
+          <State>
+            <id>General</id>
+          </State>
+          <State>
+            <id>GeneralCoffeeScript</id>
+          </State>
+          <State>
+            <id>GeneralJavaScript</id>
+          </State>
+          <State>
+            <id>Google Web Toolkit</id>
+          </State>
+          <State>
+            <id>Gradle</id>
+          </State>
+          <State>
+            <id>GrailsGroovy</id>
+          </State>
+          <State>
+            <id>Groovy</id>
+          </State>
+          <State>
+            <id>Guice</id>
+          </State>
+          <State>
+            <id>HTML</id>
+          </State>
+          <State>
+            <id>Hibernate</id>
+          </State>
+          <State>
+            <id>IconsUsabilityLintAndroid</id>
+          </State>
+          <State>
+            <id>Inheritance issuesJava</id>
+          </State>
+          <State>
+            <id>InitializationJava</id>
+          </State>
+          <State>
+            <id>InternationalizationJava</id>
+          </State>
+          <State>
+            <id>InternationalizationLintAndroid</id>
+          </State>
+          <State>
+            <id>J2ME issuesJava</id>
+          </State>
+          <State>
+            <id>JBoss Seam</id>
+          </State>
+          <State>
+            <id>JPA</id>
+          </State>
+          <State>
+            <id>JSON and JSON5</id>
+          </State>
+          <State>
+            <id>JSP</id>
+          </State>
+          <State>
+            <id>JUnitJava</id>
+          </State>
+          <State>
+            <id>Java</id>
+          </State>
+          <State>
+            <id>Java 11Java language level migration aidsJava</id>
+          </State>
+          <State>
+            <id>Java 5Java language level migration aidsJava</id>
+          </State>
+          <State>
+            <id>Java 7Java language level migration aidsJava</id>
+          </State>
+          <State>
+            <id>Java 8Java language level migration aidsJava</id>
+          </State>
+          <State>
+            <id>Java 9Java language level migration aidsJava</id>
+          </State>
+          <State>
+            <id>Java EE</id>
+          </State>
+          <State>
+            <id>Java interop issuesKotlin</id>
+          </State>
+          <State>
+            <id>Java language level migration aidsJava</id>
+          </State>
+          <State>
+            <id>JavaBeans issuesJava</id>
+          </State>
+          <State>
+            <id>JavaFX</id>
+          </State>
+          <State>
+            <id>JavaScript</id>
+          </State>
+          <State>
+            <id>JavaScript function metricsJavaScript</id>
+          </State>
+          <State>
+            <id>JavadocJava</id>
+          </State>
+          <State>
+            <id>Kotlin</id>
+          </State>
+          <State>
+            <id>Language Injection</id>
+          </State>
+          <State>
+            <id>LintAndroid</id>
+          </State>
+          <State>
+            <id>LoggingJava</id>
+          </State>
+          <State>
+            <id>Lombok</id>
+          </State>
+          <State>
+            <id>Manifest</id>
+          </State>
+          <State>
+            <id>Markdown</id>
+          </State>
+          <State>
+            <id>Maven</id>
+          </State>
+          <State>
+            <id>MavenMigrationKotlin</id>
+          </State>
+          <State>
+            <id>MemoryJava</id>
+          </State>
+          <State>
+            <id>MessagesCorrectnessLintAndroid</id>
+          </State>
+          <State>
+            <id>Method metricsGroovy</id>
+          </State>
+          <State>
+            <id>Method metricsJava</id>
+          </State>
+          <State>
+            <id>MigrationKotlin</id>
+          </State>
+          <State>
+            <id>Modularization issuesJava</id>
+          </State>
+          <State>
+            <id>Naming conventionsGroovy</id>
+          </State>
+          <State>
+            <id>Naming conventionsJava</id>
+          </State>
+          <State>
+            <id>Naming conventionsJavaScript</id>
+          </State>
+          <State>
+            <id>Numeric issuesJava</id>
+          </State>
+          <State>
+            <id>OSGi</id>
+          </State>
+          <State>
+            <id>Packaging issuesJava</id>
+          </State>
+          <State>
+            <id>Pattern Validation</id>
+          </State>
+          <State>
+            <id>PerformanceJava</id>
+          </State>
+          <State>
+            <id>PerformanceLintAndroid</id>
+          </State>
+          <State>
+            <id>Plugin DevKit</id>
+          </State>
+          <State>
+            <id>PortabilityJava</id>
+          </State>
+          <State>
+            <id>Potentially confusing code constructsGroovy</id>
+          </State>
+          <State>
+            <id>Potentially confusing code constructsJavaScript</id>
+          </State>
+          <State>
+            <id>Probable bugsCSS</id>
+          </State>
+          <State>
+            <id>Probable bugsGradle</id>
+          </State>
+          <State>
+            <id>Probable bugsJava</id>
+          </State>
+          <State>
+            <id>Probable bugsJavaScript</id>
+          </State>
+          <State>
+            <id>Probable bugsKotlin</id>
+          </State>
+          <State>
+            <id>Properties Files</id>
+          </State>
+          <State>
+            <id>RELAX NG</id>
+          </State>
+          <State>
+            <id>Reactor</id>
+          </State>
+          <State>
+            <id>Redundant constructsKotlin</id>
+          </State>
+          <State>
+            <id>Reflective accessJava</id>
+          </State>
+          <State>
+            <id>RegExp</id>
+          </State>
+          <State>
+            <id>Resource managementJava</id>
+          </State>
+          <State>
+            <id>SQL</id>
+          </State>
+          <State>
+            <id>SecurityJava</id>
+          </State>
+          <State>
+            <id>SecurityLintAndroid</id>
+          </State>
+          <State>
+            <id>Serialization issuesJava</id>
+          </State>
+          <State>
+            <id>SetupSpring CoreSpring</id>
+          </State>
+          <State>
+            <id>Spring</id>
+          </State>
+          <State>
+            <id>Spring AOPSpring</id>
+          </State>
+          <State>
+            <id>Spring CoreSpring</id>
+          </State>
+          <State>
+            <id>Struts</id>
+          </State>
+          <State>
+            <id>Struts 1Struts</id>
+          </State>
+          <State>
+            <id>Style issuesKotlin</id>
+          </State>
+          <State>
+            <id>TestNGJava</id>
+          </State>
+          <State>
+            <id>Threading issuesGroovy</id>
+          </State>
+          <State>
+            <id>Threading issuesJava</id>
+          </State>
+          <State>
+            <id>TypeScript</id>
+          </State>
+          <State>
+            <id>TypographyUsabilityLintAndroid</id>
+          </State>
+          <State>
+            <id>UI Form</id>
+          </State>
+          <State>
+            <id>UsabilityLintAndroid</id>
+          </State>
+          <State>
+            <id>Velocity</id>
+          </State>
+          <State>
+            <id>Verbose or redundant code constructsJava</id>
+          </State>
+          <State>
+            <id>WebSocket</id>
+          </State>
+          <State>
+            <id>XML</id>
+          </State>
+          <State>
+            <id>XMLSpring CoreSpring</id>
+          </State>
+          <State>
+            <id>XPath</id>
+          </State>
+          <State>
+            <id>YAML</id>
+          </State>
+        </expanded-state>
+      </profile-state>
+    </entry>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="false" project-jdk-name="1.8" project-jdk-type="JavaSDK">
+    <output url="file://$PROJECT_DIR$/out" />
+  </component>
+</project>

+ 124 - 0
.idea/uiDesigner.xml

@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Palette2">
+    <group name="Swing">
+      <item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
+      </item>
+      <item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
+      </item>
+      <item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true">
+        <default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
+        <initial-values>
+          <property name="text" value="Button" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="RadioButton" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="CheckBox" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="Label" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+          <preferred-size width="200" height="200" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+          <preferred-size width="200" height="200" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
+      </item>
+      <item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
+          <preferred-size width="-1" height="20" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
+      </item>
+      <item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
+      </item>
+    </group>
+  </component>
+</project>

+ 6 - 0
.idea/vcs.xml

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

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 1159 - 0
.idea/workspace.xml


+ 1 - 1
README.md

@@ -1 +1 @@
-#repair_backend
+#Back-endDevelopmentFramework

+ 218 - 0
pom.xml

@@ -0,0 +1,218 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.4.2</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+    <groupId>com.repair</groupId>
+    <artifactId>repair_system</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>repair_system</name>
+    <description>Demo project for Spring Boot</description>
+
+    <properties>
+        <java.version>1.8</java.version>
+        <tencent.qcloudsms.version>1.0.6</tencent.qcloudsms.version>
+    </properties>
+
+    <dependencies>
+
+<!--        <dependency>-->
+<!--            <groupId>org.json</groupId>-->
+<!--            <artifactId>json</artifactId>-->
+<!--            <version>20230227</version>-->
+<!--        </dependency>-->
+
+        <dependency>
+            <groupId>javax.validation</groupId>
+            <artifactId>validation-api</artifactId>
+            <version>2.0.1.Final</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.hibernate</groupId>
+            <artifactId>hibernate-validator</artifactId>
+            <version>6.1.5.Final</version>
+        </dependency>
+
+        <!--   读取excel数据     -->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>4.1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>4.1.0</version>
+        </dependency>
+
+        <!-- excel操作 -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+            <version>2.2.10</version>
+        </dependency>
+
+        <!-- fastjson -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>2.0.12</version>
+        </dependency>
+
+        <!--引入JWT-->
+        <dependency>
+            <groupId>com.auth0</groupId>
+            <artifactId>java-jwt</artifactId>
+            <version>3.10.0</version>
+        </dependency>
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt</artifactId>
+            <version>0.9.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.qcloudsms</groupId>
+            <artifactId>qcloudsms</artifactId>
+            <version>${tencent.qcloudsms.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.tencentcloudapi</groupId>
+            <artifactId>tencentcloud-sdk-java</artifactId>
+            <version>3.1.742</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.5.10</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+            <version>2.8.7</version>
+        </dependency>
+        <!-- 数据库驱动 -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+        <!-- lombok -->
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+        <!-- mybatis-plus -->
+        <!-- mybatis-plus 是自己开发,并非官方的! -->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.0.5</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.junit.vintage</groupId>
+                    <artifactId>junit-vintage-engine</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-web</artifactId>
+            <version>5.3.22</version>
+        </dependency>
+
+        <!-- https://mvnrepository.com/artifact/org.eclipse.jgit/org.eclipse.jgit -->
+        <dependency>
+            <groupId>org.eclipse.jgit</groupId>
+            <artifactId>org.eclipse.jgit</artifactId>
+            <version>5.4.3.201909031940-r</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <optional>true</optional>
+        </dependency>
+
+        <!-- redis -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>io.lettuce</groupId>
+                    <artifactId>lettuce-core</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>redis.clients</groupId>
+            <artifactId>jedis</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+            <version>2.9.2</version>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+            <version>2.9.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.velocity</groupId>
+            <artifactId>velocity-engine-core</artifactId>
+            <version>2.0</version>
+        </dependency>
+        <dependency>
+            <groupId>jakarta.validation</groupId>
+            <artifactId>jakarta.validation-api</artifactId>
+            <version>2.0.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.12.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.jcraft</groupId>
+            <artifactId>jsch</artifactId>
+            <version>0.1.49</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 163 - 0
share_video.iml

@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="FacetManager">
+    <facet type="Spring" name="Spring">
+      <configuration>
+        <fileset id="spring_boot_com.video.MybatisPlusApplication" profiles="dev" autodetected="true" />
+      </configuration>
+    </facet>
+    <facet type="web" name="Web">
+      <configuration>
+        <webroots />
+        <sourceRoots>
+          <root url="file://$MODULE_DIR$/src/main/java" />
+          <root url="file://$MODULE_DIR$/src/main/resources" />
+        </sourceRoots>
+      </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: com.alibaba:fastjson:2.0.12" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba.fastjson2:fastjson2-extension:2.0.12" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba.fastjson2:fastjson2:2.0.12" level="project" />
+    <orderEntry type="library" name="Maven: com.auth0:java-jwt:3.10.0" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.11.3" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.11.3" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.11.3" level="project" />
+    <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.15" level="project" />
+    <orderEntry type="library" name="Maven: io.jsonwebtoken:jjwt:0.9.1" level="project" />
+    <orderEntry type="library" name="Maven: com.github.qcloudsms:qcloudsms:1.0.6" level="project" />
+    <orderEntry type="library" name="Maven: org.json:json:20170516" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpmime:4.5.13" level="project" />
+    <orderEntry type="library" name="Maven: com.tencentcloudapi:tencentcloud-sdk-java:3.1.742" level="project" />
+    <orderEntry type="library" name="Maven: commons-logging:commons-logging:1.2" level="project" />
+    <orderEntry type="library" name="Maven: com.squareup.okio:okio:2.10.0" level="project" />
+    <orderEntry type="library" name="Maven: org.jetbrains.kotlin:kotlin-stdlib:1.4.10" level="project" />
+    <orderEntry type="library" name="Maven: org.jetbrains:annotations:13.0" level="project" />
+    <orderEntry type="library" name="Maven: org.jetbrains.kotlin:kotlin-stdlib-common:1.4.10" level="project" />
+    <orderEntry type="library" name="Maven: com.squareup.okhttp3:okhttp:3.14.9" 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: com.squareup.okhttp3:logging-interceptor:3.14.9" level="project" />
+    <orderEntry type="library" name="Maven: org.ini4j:ini4j:0.5.4" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-aop:2.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.4.0" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.13.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.13.3" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.30" 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.27" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.3.1" level="project" />
+    <orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.6" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.10" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.13" level="project" />
+    <orderEntry type="library" name="Maven: com.google.code.gson:gson:2.8.7" level="project" />
+    <orderEntry type="library" name="Maven: mysql:mysql-connector-java:8.0.22" level="project" />
+    <orderEntry type="library" name="Maven: org.projectlombok:lombok:1.18.16" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-boot-starter:3.0.5" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus:3.0.5" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-extension:3.0.5" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-core:3.0.5" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-annotation:3.0.5" level="project" />
+    <orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:1.2" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:1.3.2" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis:3.4.6" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-generator:3.0.5" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.4.0" level="project" />
+    <orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.4.5" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.3.1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.4.0" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.11.3" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.11.3" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.11.3" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.39" level="project" />
+    <orderEntry type="library" name="Maven: org.glassfish:jakarta.el:3.0.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.39" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.3.1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context:5.3.1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.3.1" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-starter-test:2.4.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test:2.4.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.4.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: com.jayway.jsonpath:json-path:2.4.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: net.minidev:json-smart:2.3" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: net.minidev:accessors-smart:1.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.ow2.asm:asm:5.0.4" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: jakarta.xml.bind:jakarta.xml.bind-api:2.3.3" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: jakarta.activation:jakarta.activation-api:1.2.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.18.1" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest:2.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter:5.7.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-api:5.7.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.apiguardian:apiguardian-api:1.1.0" 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.7.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-params:5.7.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-engine:5.7.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-engine:1.7.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:3.6.0" level="project" />
+    <orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy:1.10.18" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy-agent:1.10.18" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.objenesis:objenesis:3.1" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-junit-jupiter:3.6.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.skyscreamer:jsonassert:1.5.0" 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.1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.3.1" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:5.3.1" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.xmlunit:xmlunit-core:2.7.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-web:5.3.22" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.3.1" level="project" />
+    <orderEntry type="library" name="Maven: org.eclipse.jgit:org.eclipse.jgit:5.4.3.201909031940-r" level="project" />
+    <orderEntry type="library" name="Maven: com.jcraft:jsch:0.1.55" level="project" />
+    <orderEntry type="library" name="Maven: com.jcraft:jzlib:1.1.1" level="project" />
+    <orderEntry type="library" name="Maven: com.googlecode.javaewah:JavaEWAH:1.1.6" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.30" level="project" />
+    <orderEntry type="library" name="Maven: org.bouncycastle:bcpg-jdk15on:1.61" level="project" />
+    <orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.61" level="project" />
+    <orderEntry type="library" name="Maven: org.bouncycastle:bcpkix-jdk15on:1.61" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-configuration-processor:2.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-redis:2.4.1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-keyvalue:2.4.1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.4.1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-tx:5.3.1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-oxm:5.3.1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.3.1" level="project" />
+    <orderEntry type="library" name="Maven: redis.clients:jedis:3.3.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-pool2:2.9.0" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger2:2.9.2" 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-spi:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-core:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-schema:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-common:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spring-web:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: com.google.guava:guava:20.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:1.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-metadata:1.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.mapstruct:mapstruct:1.2.0.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-ui:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.velocity:velocity-engine-core:2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.11" level="project" />
+  </component>
+</module>

+ 110 - 0
share_videos.iml

@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="FacetManager">
+    <facet type="Spring" name="Spring">
+      <configuration />
+    </facet>
+    <facet type="web" name="Web">
+      <configuration>
+        <webroots />
+        <sourceRoots>
+          <root url="file://$MODULE_DIR$/src/main/java" />
+          <root url="file://$MODULE_DIR$/src/main/resources" />
+        </sourceRoots>
+      </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="jdk" jdkName="1.8" jdkType="JavaSDK" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" name="Maven: mysql:mysql-connector-java:8.0.19" level="project" />
+    <orderEntry type="library" name="Maven: org.projectlombok:lombok:1.18.12" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-boot-starter:3.0.5" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus:3.0.5" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-extension:3.0.5" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-core:3.0.5" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-annotation:3.0.5" level="project" />
+    <orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:1.2" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:1.3.2" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis:3.4.6" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-generator:3.0.5" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.2.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.2.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.2.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.4.2" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.2.4.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-tx:5.2.4.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-configuration-processor:2.2.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.2.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.2.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.2.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.12.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.12.1" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.30" level="project" />
+    <orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:1.3.5" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.25" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.2.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.10.2" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.10.2" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.10.2" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.2" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.10.2" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.10.2" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.2.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.31" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.31" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.31" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-validation:2.2.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: jakarta.validation:jakarta.validation-api:2.0.2" level="project" />
+    <orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.0.18.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.4.1.Final" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml:classmate:1.5.1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.2.4.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.2.4.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context:5.2.4.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.2.4.RELEASE" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-starter-test:2.2.5.RELEASE" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test:2.2.5.RELEASE" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.2.5.RELEASE" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: com.jayway.jsonpath:json-path:2.4.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: net.minidev:json-smart:2.3" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: net.minidev:accessors-smart:1.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.ow2.asm:asm:5.0.4" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.30" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: jakarta.xml.bind:jakarta.xml.bind-api:2.3.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: jakarta.activation:jakarta.activation-api:1.2.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter:5.5.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-api:5.5.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.apiguardian:apiguardian-api:1.1.0" 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.5.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-params:5.5.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-engine:5.5.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-engine:1.5.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-junit-jupiter:3.1.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.13.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest:2.1" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:3.1.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy:1.10.8" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy-agent:1.10.8" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.objenesis:objenesis:2.6" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.skyscreamer:jsonassert:1.5.0" 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.2.4.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.2.4.RELEASE" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:5.2.4.RELEASE" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.xmlunit:xmlunit-core:2.6.3" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-web:5.3.22" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.2.4.RELEASE" level="project" />
+  </component>
+</module>

+ 93 - 0
src/main/java/com/repair/AutoCode.java

@@ -0,0 +1,93 @@
+package com.repair;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.generator.AutoGenerator;
+import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
+import com.baomidou.mybatisplus.generator.config.GlobalConfig;
+import com.baomidou.mybatisplus.generator.config.PackageConfig;
+import com.baomidou.mybatisplus.generator.config.StrategyConfig;
+import com.baomidou.mybatisplus.generator.config.po.TableFill;
+import com.baomidou.mybatisplus.generator.config.rules.DateType;
+import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
+
+import java.util.ArrayList;
+
+/**
+ * @Author: binguo
+ * @Date: 2023/3/30 星期四 15:46
+ * @Description: com.video
+ * @Version: 1.0
+ */
+public class AutoCode {
+    public static void main(String[] args) {
+// 需要构建一个 代码自动生成器 对象
+        AutoGenerator mpg = new AutoGenerator();
+// 配置策略
+// 1、全局配置
+        GlobalConfig gc = new GlobalConfig();
+        String projectPath = System.getProperty("user.dir");
+        gc.setOutputDir(projectPath + "/src/main/java");
+        gc.setAuthor("ceshi");
+        gc.setOpen(false);
+        gc.setFileOverride(false); // 是否覆盖
+        gc.setServiceName("%sService"); // 去Service的I前缀
+        /**
+         * 主键ID 数据量少可以用UUID 管理端用UUID 移动端用int 便于区分并且在数据量大的情况下int查询效率高 其他情况用AUTO
+         * AUTO 数据库ID自增
+         * INPUT 用户输入ID
+         * ID_WORKER 全局唯一ID,Long类型的主键
+         * ID_WORKER_STR 字符串全局唯一ID
+         * UUID 全局唯一ID,UUID类型的主键
+         * NONE 该类型为未设置主键类型
+         */
+        gc.setIdType(IdType.AUTO);
+        gc.setDateType(DateType.ONLY_DATE);
+        gc.setSwagger2(true);
+        mpg.setGlobalConfig(gc);
+//2、设置数据源
+        DataSourceConfig dsc = new DataSourceConfig();
+        dsc.setUrl("jdbc:mysql://192.168.161.220:3306/repair_report?useUnicode=tru&characterEncoding=UTF-8&useSSL=false&useAffectedRows=true&allowPublicKeyRetrieval=true&allowMultiQueries=true&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai");
+        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
+        dsc.setUsername("root");
+        dsc.setPassword("root");
+        dsc.setDbType(DbType.MYSQL);
+        mpg.setDataSource(dsc);
+        //3、包的配置
+        PackageConfig pc = new PackageConfig();
+        pc.setModuleName("auto");
+        pc.setParent("com.repair");
+        pc.setEntity("model");
+        pc.setMapper("mapper");
+        pc.setService("services");
+        pc.setController("controller");
+        mpg.setPackageInfo(pc);
+        //4、策略配置
+        StrategyConfig strategy = new StrategyConfig();
+        strategy.setInclude("repair_record"); // 设置要映射的表名
+        strategy.setNaming(NamingStrategy.underline_to_camel);//下划线转驼峰
+        strategy.setColumnNaming(NamingStrategy.underline_to_camel);//下划线转驼峰
+        strategy.setEntityLombokModel(true); // 自动lombok;
+        strategy.setLogicDeleteFieldName("deleted");//逻辑删除 调用service的删除方法不会真删除 会把deleted字段的值改为1 (未删除="0",删除="1")
+        // 自动填充配置
+        TableFill deletedCreate = new TableFill("deleted", FieldFill.INSERT);
+        TableFill timeCreate = new TableFill("create_time", FieldFill.INSERT);
+        TableFill userCreate = new TableFill("create_user", FieldFill.INSERT);
+        TableFill timeModified = new TableFill("update_time", FieldFill.INSERT_UPDATE);
+        TableFill userModified = new TableFill("update_user", FieldFill.INSERT_UPDATE);
+        ArrayList<TableFill> tableFills = new ArrayList<>();
+        tableFills.add(deletedCreate);
+        tableFills.add(timeCreate);
+        tableFills.add(userCreate);
+        tableFills.add(timeModified);
+        tableFills.add(userModified);
+        strategy.setTableFillList(tableFills);
+        // 乐观锁
+        strategy.setVersionFieldName("version");
+        strategy.setRestControllerStyle(true);
+        strategy.setControllerMappingHyphenStyle(true); //localhost:8080/hello_id_2
+        mpg.setStrategy(strategy);
+        mpg.execute(); //执行
+    }
+}

+ 17 - 0
src/main/java/com/repair/MybatisPlusApplication.java

@@ -0,0 +1,17 @@
+package com.repair;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+@EnableCaching//开启缓存
+@SpringBootApplication
+@EnableTransactionManagement //开启事务回滚
+public class MybatisPlusApplication {
+
+    public static void main(String[] args) {
+
+        SpringApplication.run(MybatisPlusApplication.class, args);
+    }
+}

+ 12 - 0
src/main/java/com/repair/annotation/ControllerIsShow.java

@@ -0,0 +1,12 @@
+package com.repair.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(value = {ElementType.METHOD, ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ControllerIsShow {
+    String value() default "";
+}

+ 28 - 0
src/main/java/com/repair/annotation/PassToken.java

@@ -0,0 +1,28 @@
+package com.repair.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/** 说明
+ * 在方法上加入本注解 即可接口拦截
+ * @interface:代表当前类是注解
+ * @Target:描述当前的注解可以定义在扫描资源上。
+ * 属性value:
+ *     定义具体的资源。包括:
+ *     ElementType.METHOD:可以定义在方法上
+ *     ElementType.TYPE:可以定义在类上
+ *     ElementType.FIELD:可以定义在属性上
+ *     ElementType.PARAMETER:可以定义在方法参数上
+ * @Retention:当前注解在什么时候有效
+ *     定义具体的生效标记
+ *     RetentionPolicy.RUNTIME:运行时有效
+ *     RetentionPolicy.SOURCE:源码中有效
+ *     RetentionPolicy.CLASS:字节码有效
+ *///说明 该注解要加在控制器中的方法上才会生效 加在api中无法生效
+@Target(value = {ElementType.METHOD, ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface PassToken {
+    boolean requeired() default true;
+}

+ 14 - 0
src/main/java/com/repair/annotation/UserLoginCheck.java

@@ -0,0 +1,14 @@
+package com.repair.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Target;
+
+/**
+ * @Author: binguo
+ * @Date: 2023/4/10 星期一 14:04
+ * @Description: com.video.services.annotation
+ * @Version: 1.0
+ */
+@Target(ElementType.METHOD)
+public @interface UserLoginCheck {
+}

+ 45 - 0
src/main/java/com/repair/aop/LoginCheckAspect.java

@@ -0,0 +1,45 @@
+package com.repair.aop;
+
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.After;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Author: binguo
+ * @Date: 2023/4/10 星期一 14:10
+ * @Description: com.video.aop
+ * @Version: 1.0
+ */
+@Aspect//把当前类标识作为一个切面供容器读取
+@Component//将此类标记为Spring容器中的一个Bean
+@Order(0)//order的值越小,优先级越高 order如果不标注数字,默认最低优先级,因为其默认值是int最大值
+public class LoginCheckAspect {
+
+    @Around("@annotation(com.repair.annotation.UserLoginCheck)")
+    public Object userLoginCheck(ProceedingJoinPoint process) throws Throwable {
+        System.out.println("用户登录检测机制");
+        if(1 == 1){
+           //通过抛异常方式拦截
+           // throw new Exception("非法登录");
+        }
+
+        Object proceed;
+        proceed = process.proceed();//执行目标方法
+        return proceed;//将执行目标方法后的返回值返回出去
+    }
+
+    @After("@annotation(com.repair.annotation.UserLoginCheck)")
+    public void test(){
+        System.out.println("测试After");
+    }
+
+    @Before("@annotation(com.repair.annotation.UserLoginCheck)")
+    public void test1(){
+        System.out.println("测试Before");
+    }
+
+}

+ 39 - 0
src/main/java/com/repair/api/LoginControllerAPI.java

@@ -0,0 +1,39 @@
+package com.repair.api;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.repair.model.pojo.RepairAdmin;
+import com.repair.model.request.changePasswordRequest;
+import com.repair.model.request.loginRequest;
+import com.repair.model.result.CommonResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+
+@RequestMapping("/api/login")
+@Api(tags = {"LoginController"}, value = "登录")
+public interface LoginControllerAPI {
+
+    @GetMapping(value = "/queryReduce")
+    @ApiOperation(value = "查看系统版本", notes = "查看系统版本", httpMethod = "GET")
+    CommonResult queryReduce();
+
+    @PostMapping(value = "/Register")
+    @ApiOperation(value = "注册", notes = "注册", httpMethod = "POST")
+    CommonResult Register(@Validated @RequestBody RepairAdmin loginRequest, BindingResult bindingResult);
+
+    @PostMapping(value = "/Login")
+    @ApiOperation(value = "登录", notes = "登录", httpMethod = "POST")
+    CommonResult Login(@Validated @RequestBody loginRequest lr, BindingResult bindingResult);
+
+    @PostMapping(value = "/ChangePassword")
+    @ApiOperation(value = "修改密码", notes = "修改密码", httpMethod = "POST")
+    CommonResult ChangePassword(@Validated @RequestBody changePasswordRequest cpr, @RequestHeader("user_head") String userhead, BindingResult bindingResult);
+
+    @GetMapping(value = "/Openid")
+    @ApiOperation(value = "登录", notes = "登录", httpMethod = "POST")
+    CommonResult Openid(@RequestParam String wxcode) throws JsonProcessingException;
+
+}

+ 45 - 0
src/main/java/com/repair/api/RepairAdminControllerAPI.java

@@ -0,0 +1,45 @@
+package com.repair.api;
+
+import com.repair.model.pojo.RepairAdmin;
+import com.repair.model.request.freezeRepairAdminRequest;
+import com.repair.model.request.queryAccountPageRequest;
+import com.repair.model.request.updateRepairAdminRequest;
+import com.repair.model.result.CommonResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.lang.reflect.InvocationTargetException;
+
+@RequestMapping("/api/repairAdmin")
+@Api(tags = {"RepairAdminController"}, value = "账号")
+public interface RepairAdminControllerAPI {
+
+    @PostMapping(value = "/insertRepairAdmin")
+    @ApiOperation(value = "添加账号", notes = "添加账号数据", httpMethod = "POST")
+    CommonResult InsertRepairAdmin(@Validated @RequestBody RepairAdmin repairAdmin, BindingResult bindingResult);
+
+    @GetMapping(value = "/queryPageRepairAdmin")
+    @ApiOperation(value = "账号分页数据", notes = "账号分页数据", httpMethod = "GET")
+    CommonResult queryPageRepairAdmins(@RequestParam int currentPage, @RequestParam int pageCount, String account, String phone, String userName);
+
+    @PostMapping(value = "/freezeRepairAdminById")
+    @ApiOperation(value = "根据ID冻结指定账号", notes = "根据ID冻结指定账户", httpMethod = "POST")
+    CommonResult freezeRepairAdminById(@Validated @RequestBody freezeRepairAdminRequest frar, BindingResult bindingResult);
+
+    @GetMapping(value = "/deleteRepairAdminById")
+    @ApiOperation(value = "根据ID删除指定账号", notes = "根据ID删除指定账号", httpMethod = "POST")
+    CommonResult deleteRepairAdminById(@RequestParam String id);
+
+    @PostMapping(value = "/updateRepairAdminById")
+    @ApiOperation(value = "编辑账号数据", notes = "编辑账号数据", httpMethod = "POST")
+    CommonResult updateRepairAdminById(@Validated @RequestBody updateRepairAdminRequest ra, @RequestHeader("user_head") String userhead, BindingResult bindingResult);
+
+    @GetMapping(value = "/downloadRepairAdminExcel")
+    @ApiOperation(value = "导出账号数据", notes = "导出账号数据", httpMethod = "GET")
+    void downloadRepairAdminExcel(String account, HttpServletResponse response) throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException;
+}

+ 43 - 0
src/main/java/com/repair/api/RepairAreaControllerAPI.java

@@ -0,0 +1,43 @@
+package com.repair.api;
+
+import com.repair.model.pojo.RepairArea;
+import com.repair.model.request.updateRepairAreaRequest;
+import com.repair.model.result.CommonResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@RequestMapping("/api/repairArea")
+@Api(tags = {"RepairAreaController"}, value = "区域")
+public interface RepairAreaControllerAPI {
+
+    @PostMapping(value = "/insertRepairArea")
+    @ApiOperation(value = "添加区域", notes = "添加区域数据", httpMethod = "POST")
+    CommonResult InsertRepairArea(@Validated @RequestBody RepairArea repairArea, BindingResult bindingResult);
+
+    @PostMapping(value = "/updateRepairAreaById")
+    @ApiOperation(value = "编辑区域数据", notes = "编辑区域数据", httpMethod = "POST")
+    CommonResult updateRepairAreaById(@Validated @RequestBody updateRepairAreaRequest ra, BindingResult bindingResult);
+
+    @GetMapping(value = "/queryPageRepairArea")
+    @ApiOperation(value = "区域分页数据", notes = "区域分页数据", httpMethod = "GET")
+    CommonResult queryPageRepairAreas(@RequestParam int currentPage, @RequestParam int pageCount, String name);
+
+    @GetMapping(value = "/deleteRepairAreaById")
+    @ApiOperation(value = "根据ID删除指定区域", notes = "根据ID删除指定区域", httpMethod = "GET")
+    CommonResult deleteRepairAreaById(@RequestParam int id);
+
+    @GetMapping(value = "/queryRepairSchools")
+    @ApiOperation(value = "查询校区数据", notes = "查询校区数据", httpMethod = "GET")
+    CommonResult queryRepairSchools();
+
+    @GetMapping(value = "/queryRepairAreaTree")
+    @ApiOperation(value = "获取区域树形结构数据", notes = "获取区域树形结构数据", httpMethod = "GET")
+    CommonResult queryRepairAreaTree(@RequestParam int schoolId);
+
+    @GetMapping(value = "/queryRepairAreaSecond")
+    @ApiOperation(value = "获取区域二级树形结构", notes = "获取区域二级树形结构", httpMethod = "GET")
+    CommonResult queryRepairAreaSecond(int schoolId);
+}

+ 39 - 0
src/main/java/com/repair/api/RepairArticleTypeControllerAPI.java

@@ -0,0 +1,39 @@
+package com.repair.api;
+
+import com.repair.model.pojo.RepairArticleType;
+import com.repair.model.request.updateRepairArticleTypeRequest;
+import com.repair.model.result.CommonResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@RequestMapping("/api/repairArticleType")
+@Api(tags = {"RepairArticleTypeController"}, value = "报修故障类型")
+public interface RepairArticleTypeControllerAPI {
+
+    @PostMapping(value = "/insertRepairArticleType")
+    @ApiOperation(value = "添加报修故障类型", notes = "添加报修故障类型数据", httpMethod = "POST")
+    CommonResult InsertRepairArticleType(@Validated @RequestBody RepairArticleType rwt, BindingResult bindingResult);
+
+    @PostMapping(value = "/updateRepairArticleTypeById")
+    @ApiOperation(value = "编辑报修故障类型数据", notes = "编辑报修故障类型数据", httpMethod = "POST")
+    CommonResult updateRepairArticleTypeById(@Validated @RequestBody updateRepairArticleTypeRequest uratr, BindingResult bindingResult);
+
+    @GetMapping(value = "/queryPageRepairArticleType")
+    @ApiOperation(value = "报修故障类型分页数据", notes = "报修故障类型分页数据", httpMethod = "GET")
+    CommonResult queryPageRepairArticleTypes(@RequestParam int currentPage, @RequestParam int pageCount, String name);
+
+    @GetMapping(value = "/deleteRepairArticleTypeById")
+    @ApiOperation(value = "根据ID删除指定报修故障类型", notes = "根据ID删除指定报修故障类型", httpMethod = "GET")
+    CommonResult deleteRepairArticleTypeById(@RequestParam int id);
+
+    @GetMapping(value = "/queryRepairArticleTypeTree")
+    @ApiOperation(value = "获取故障类型树形结构数据", notes = "获取故障类型树形结构数据", httpMethod = "GET")
+    CommonResult queryRepairArticleTypeTree(@RequestParam int schoolId);
+
+    @GetMapping(value = "/queryRepairArticleType")
+    @ApiOperation(value = "物品类型关联", notes = "物品类型关联", httpMethod = "GET")
+    CommonResult queryRepairArticleType(@RequestParam int schoolId);
+}

+ 44 - 0
src/main/java/com/repair/api/RepairClassesSettingsControllerAPI.java

@@ -0,0 +1,44 @@
+package com.repair.api;
+
+import com.repair.model.request.insertRepairClassesRequest;
+import com.repair.model.request.updateRepairClassesRequest;
+import com.repair.model.result.CommonResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.text.ParseException;
+
+@RequestMapping("/api/repairClassesSettings")
+@Api(tags = {"RepairClassesSettingsController"}, value = "排班")
+public interface RepairClassesSettingsControllerAPI {
+
+    @PostMapping(value = "/insertRepairClassesSettings")
+    @ApiOperation(value = "添加排班", notes = "添加排班数据", httpMethod = "POST")
+    CommonResult InsertRepairClassesSettings(@Validated @RequestBody insertRepairClassesRequest ircr, BindingResult bindingResult) throws ParseException;
+
+    @PostMapping(value = "/updateRepairClassesSettingsById")
+    @ApiOperation(value = "编辑排班数据", notes = "编辑排班数据", httpMethod = "POST")
+    CommonResult updateRepairClassesSettingsById(@Validated @RequestBody updateRepairClassesRequest ra, BindingResult bindingResult);
+
+    @GetMapping(value = "/queryPageRepairClassesSettings")
+    @ApiOperation(value = "排班分页数据", notes = "排班分页数据", httpMethod = "GET")
+    CommonResult queryPageRepairClassesSettingss(@RequestParam int currentPage, @RequestParam int pageCount, String startTime, String endTime);
+
+    @GetMapping(value = "/deleteRepairClassesSettingsById")
+    @ApiOperation(value = "根据ID删除指定排班", notes = "根据ID删除指定排班", httpMethod = "GET")
+    CommonResult deleteRepairClassesSettingsById(@RequestParam int id);
+
+    @PostMapping(value = "/importRepairClassesSettingExcel")
+    @ApiOperation(value = "导入排班数据", notes = "导入排班数据", httpMethod = "POST")
+    CommonResult importRepairClassesSettingExcel(@RequestParam("file") MultipartFile file) throws IOException;
+
+    @GetMapping(value = "/downloadRepairClassesSettingExcel")
+    @ApiOperation(value = "导出排班模板", notes = "导出排班模板", httpMethod = "GET")
+    void downloadRepairClassesSettingExcel(HttpServletResponse response);
+}

+ 30 - 0
src/main/java/com/repair/api/RepairCollaborateRecordControllerAPI.java

@@ -0,0 +1,30 @@
+package com.repair.api;
+
+import com.repair.model.pojo.RepairCollaborateRecord;
+import com.repair.model.result.CommonResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@RequestMapping("/api/repairCollaborateRecord")
+@Api(tags = {"repairCollaborateRecordController"}, value = "协作记录")
+public interface RepairCollaborateRecordControllerAPI {
+
+    @PostMapping(value = "/insertrepairCollaborateRecord")
+    @ApiOperation(value = "添加协作记录", notes = "添加协作记录数据", httpMethod = "POST")
+    CommonResult InsertrepairCollaborateRecord(@Validated @RequestBody RepairCollaborateRecord rc, BindingResult bindingResult);
+
+    @PostMapping(value = "/updaterepairCollaborateRecordById")
+    @ApiOperation(value = "编辑协作记录数据", notes = "编辑协作记录数据", httpMethod = "POST")
+    CommonResult updaterepairCollaborateRecordById(@Validated @RequestBody RepairCollaborateRecord rc, BindingResult bindingResult);
+
+    @GetMapping(value = "/queryPagerepairCollaborateRecord")
+    @ApiOperation(value = "协作记录分页数据", notes = "协作记录分页数据", httpMethod = "GET")
+    CommonResult queryPagerepairCollaborateRecords(@RequestParam int currentPage, @RequestParam int pageCount, String name);
+
+    @GetMapping(value = "/deleterepairCollaborateRecordById")
+    @ApiOperation(value = "根据ID删除指定协作记录", notes = "根据ID删除指定协作记录", httpMethod = "GET")
+    CommonResult deleterepairCollaborateRecordById(@RequestParam int id);
+}

+ 32 - 0
src/main/java/com/repair/api/RepairConsumablesControllerAPI.java

@@ -0,0 +1,32 @@
+package com.repair.api;
+
+import com.repair.model.pojo.RepairConsumables;
+import com.repair.model.result.CommonResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.text.ParseException;
+
+@RequestMapping("/api/repairConsumables")
+@Api(tags = {"repairConsumablesController"}, value = "耗材记录")
+public interface RepairConsumablesControllerAPI {
+
+    @PostMapping(value = "/insertrepairConsumables")
+    @ApiOperation(value = "添加耗材记录", notes = "添加耗材记录数据", httpMethod = "POST")
+    CommonResult InsertrepairConsumables(@Validated @RequestBody RepairConsumables rc, BindingResult bindingResult);
+
+    @PostMapping(value = "/updaterepairConsumablesById")
+    @ApiOperation(value = "编辑耗材记录数据", notes = "编辑耗材记录数据", httpMethod = "POST")
+    CommonResult updaterepairConsumablesById(@Validated @RequestBody RepairConsumables rc, BindingResult bindingResult);
+
+    @GetMapping(value = "/queryPagerepairConsumables")
+    @ApiOperation(value = "耗材记录分页数据", notes = "耗材记录分页数据", httpMethod = "GET")
+    CommonResult queryPagerepairConsumabless(@RequestParam int currentPage, @RequestParam int pageCount, String name);
+
+    @GetMapping(value = "/deleterepairConsumablesById")
+    @ApiOperation(value = "根据ID删除指定耗材记录", notes = "根据ID删除指定耗材记录", httpMethod = "GET")
+    CommonResult deleterepairConsumablesById(@RequestParam int id);
+}

+ 48 - 0
src/main/java/com/repair/api/RepairConsumeControllerAPI.java

@@ -0,0 +1,48 @@
+package com.repair.api;
+
+import com.repair.model.request.insertRepairConsumeRequest;
+import com.repair.model.request.updateRepairConsumeRequest;
+import com.repair.model.result.CommonResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+
+@RequestMapping("/api/repairConsume")
+@Api(tags = {"RepairConsumeController"}, value = "耗材管理")
+public interface RepairConsumeControllerAPI {
+
+    @PostMapping(value = "/insertRepairConsume")
+    @ApiOperation(value = "添加耗材管理", notes = "添加耗材管理数据", httpMethod = "POST")
+    CommonResult InsertRepairConsume(@Validated @RequestBody insertRepairConsumeRequest rc, BindingResult bindingResult);
+
+    @PostMapping(value = "/updateRepairConsumeById")
+    @ApiOperation(value = "编辑耗材管理数据", notes = "编辑耗材管理数据", httpMethod = "POST")
+    CommonResult updateRepairConsumeById(@Validated @RequestBody updateRepairConsumeRequest rc, BindingResult bindingResult);
+
+    @GetMapping(value = "/queryPageRepairConsume")
+    @ApiOperation(value = "耗材管理分页数据", notes = "耗材管理分页数据", httpMethod = "GET")
+    CommonResult queryPageRepairConsumes(@RequestParam int currentPage, @RequestParam int pageCount, String name,String startTime, String endTime);
+
+    @GetMapping(value = "/deleteRepairConsumeById")
+    @ApiOperation(value = "根据ID删除指定耗材管理", notes = "根据ID删除指定耗材管理", httpMethod = "GET")
+    CommonResult deleteRepairConsumeById(@RequestParam int id);
+
+    @GetMapping(value = "/downloadRepairConsumeExcel")
+    @ApiOperation(value = "导出耗材数据", notes = "导出耗材数据", httpMethod = "GET")
+    void downloadRepairConsumeExcel(String name,String startTime, String endTime, HttpServletResponse response) throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException;
+
+    @GetMapping(value = "/downloadRepairConsumeModelExcel")
+    @ApiOperation(value = "导出耗材模板", notes = "导出耗材模板", httpMethod = "GET")
+    void downloadRepairConsumeModelExcel(HttpServletResponse response);
+
+    @PostMapping(value = "/importRepairConsumeExcel")
+    @ApiOperation(value = "导入耗材数据", notes = "导入耗材数据", httpMethod = "POST")
+    CommonResult importRepairConsumeExcel(MultipartFile file) throws IOException;
+}

+ 30 - 0
src/main/java/com/repair/api/RepairDispatchRecordControllerAPI.java

@@ -0,0 +1,30 @@
+package com.repair.api;
+
+import com.repair.model.pojo.RepairDispatchRecord;
+import com.repair.model.result.CommonResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@RequestMapping("/api/repairDispatchRecord")
+@Api(tags = {"repairDispatchRecordController"}, value = "派单记录")
+public interface RepairDispatchRecordControllerAPI {
+
+    @PostMapping(value = "/insertrepairDispatchRecord")
+    @ApiOperation(value = "添加派单记录", notes = "添加派单记录数据", httpMethod = "POST")
+    CommonResult InsertrepairDispatchRecord(@Validated @RequestBody RepairDispatchRecord rc, BindingResult bindingResult);
+
+    @PostMapping(value = "/updaterepairDispatchRecordById")
+    @ApiOperation(value = "编辑派单记录数据", notes = "编辑派单记录数据", httpMethod = "POST")
+    CommonResult updaterepairDispatchRecordById(@Validated @RequestBody RepairDispatchRecord rc, BindingResult bindingResult);
+
+    @GetMapping(value = "/queryPagerepairDispatchRecord")
+    @ApiOperation(value = "派单记录分页数据", notes = "派单记录分页数据", httpMethod = "GET")
+    CommonResult queryPagerepairDispatchRecords(@RequestParam int currentPage, @RequestParam int pageCount, String name);
+
+    @GetMapping(value = "/deleterepairDispatchRecordById")
+    @ApiOperation(value = "根据ID删除指定派单记录", notes = "根据ID删除指定派单记录", httpMethod = "GET")
+    CommonResult deleterepairDispatchRecordById(@RequestParam int id);
+}

+ 33 - 0
src/main/java/com/repair/api/RepairEvaluateControllerAPI.java

@@ -0,0 +1,33 @@
+package com.repair.api;
+
+import com.repair.model.pojo.RepairEvaluate;
+import com.repair.model.result.CommonResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.Date;
+
+@RequestMapping("/api/repairEvaluate")
+@Api(tags = {"RepairEvaluateController"}, value = "评价")
+public interface RepairEvaluateControllerAPI {
+
+    @PostMapping(value = "/insertRepairEvaluate")
+    @ApiOperation(value = "添加评价", notes = "添加评价数据", httpMethod = "POST")
+    CommonResult InsertRepairEvaluate(@Validated @RequestBody RepairEvaluate repairEvaluate, BindingResult bindingResult);
+
+    @GetMapping(value = "/queryPageRepairEvaluate")
+    @ApiOperation(value = "评价分页数据", notes = "评价分页数据", httpMethod = "GET")
+    CommonResult queryPageRepairEvaluates(@RequestParam int currentPage, @RequestParam int pageCount, String keyWord, String startTime, String endTime);
+
+    @GetMapping(value = "/deleteRepairEvaluateById")
+    @ApiOperation(value = "根据ID删除指定评价", notes = "根据ID删除指定评价", httpMethod = "GET")
+    CommonResult deleteRepairEvaluateById(@RequestParam int id);
+
+    @GetMapping(value = "/toRepairEvaluateExcel")
+    @ApiOperation(value = "导出评价表单", notes = "导出评价表单", httpMethod = "GET")
+    void toRepairEvaluateExcel(HttpServletResponse response, String keyWord, String startTime, String endTime);
+}

+ 30 - 0
src/main/java/com/repair/api/RepairLeaveMessageControllerAPI.java

@@ -0,0 +1,30 @@
+package com.repair.api;
+
+import com.repair.model.pojo.RepairLeaveMessage;
+import com.repair.model.result.CommonResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@RequestMapping("/api/repairLeaveMessage")
+@Api(tags = {"repairLeaveMessageController"}, value = "消息留言")
+public interface RepairLeaveMessageControllerAPI {
+
+    @PostMapping(value = "/insertrepairLeaveMessage")
+    @ApiOperation(value = "添加消息留言", notes = "添加消息留言数据", httpMethod = "POST")
+    CommonResult InsertrepairLeaveMessage(@Validated @RequestBody RepairLeaveMessage rc, BindingResult bindingResult);
+
+    @PostMapping(value = "/updaterepairLeaveMessageById")
+    @ApiOperation(value = "编辑消息留言数据", notes = "编辑消息留言数据", httpMethod = "POST")
+    CommonResult updaterepairLeaveMessageById(@Validated @RequestBody RepairLeaveMessage rc, BindingResult bindingResult);
+
+    @GetMapping(value = "/queryPagerepairLeaveMessage")
+    @ApiOperation(value = "消息留言分页数据", notes = "消息留言分页数据", httpMethod = "GET")
+    CommonResult queryPagerepairLeaveMessages(@RequestParam int currentPage, @RequestParam int pageCount, String name);
+
+    @GetMapping(value = "/deleterepairLeaveMessageById")
+    @ApiOperation(value = "根据ID删除指定消息留言", notes = "根据ID删除指定消息留言", httpMethod = "GET")
+    CommonResult deleterepairLeaveMessageById(@RequestParam int id);
+}

+ 40 - 0
src/main/java/com/repair/api/RepairNoticeSettingControllerAPI.java

@@ -0,0 +1,40 @@
+package com.repair.api;
+
+import com.repair.model.pojo.RepairNoticeSetting;
+import com.repair.model.result.CommonResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.text.ParseException;
+
+@RequestMapping("/api/repairNoticeSetting")
+@Api(tags = {"RepairNoticeSettingController"}, value = "公告")
+public interface RepairNoticeSettingControllerAPI {
+
+    @PostMapping(value = "/insertRepairNoticeSetting")
+    @ApiOperation(value = "添加公告", notes = "添加公告数据", httpMethod = "POST")
+    CommonResult InsertRepairNoticeSetting(@Validated @RequestBody RepairNoticeSetting repairNoticeSetting, BindingResult bindingResult);
+
+    @PostMapping(value = "/updateRepairNoticeSettingById")
+    @ApiOperation(value = "编辑公告数据", notes = "编辑公告数据", httpMethod = "POST")
+    CommonResult updateRepairNoticeSettingById(@Validated @RequestBody RepairNoticeSetting ra, BindingResult bindingResult);
+
+    @GetMapping(value = "/queryPageRepairNoticeSetting")
+    @ApiOperation(value = "公告分页数据", notes = "公告分页数据", httpMethod = "GET")
+    CommonResult queryPageRepairNoticeSettings(@RequestParam int currentPage, @RequestParam int pageCount, String createTime) throws ParseException;
+
+    @GetMapping(value = "/cancelOrTopNoticeById")
+    @ApiOperation(value = "取消/置顶公告", notes = "取消/置顶公告置顶", httpMethod = "GET")
+    CommonResult cancelOrTopNoticeById(@RequestParam int id, @RequestParam int is_top);
+
+    @GetMapping(value = "/deleteRepairNoticeSettingById")
+    @ApiOperation(value = "根据ID删除指定公告", notes = "根据ID删除指定公告", httpMethod = "GET")
+    CommonResult deleteRepairNoticeSettingById(@RequestParam int id);
+
+    @GetMapping(value = "/queryRepairNoticeSettingByTop")
+    @ApiOperation(value = "公告置顶数据", notes = "公告置顶数据", httpMethod = "GET")
+    CommonResult queryRepairNoticeSettingByTop();
+}

+ 30 - 0
src/main/java/com/repair/api/RepairPayRecordControllerAPI.java

@@ -0,0 +1,30 @@
+package com.repair.api;
+
+import com.repair.model.pojo.RepairPayRecord;
+import com.repair.model.result.CommonResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@RequestMapping("/api/repairPayRecord")
+@Api(tags = {"repairPayRecordController"}, value = "支付记录")
+public interface RepairPayRecordControllerAPI {
+
+    @PostMapping(value = "/insertrepairPayRecord")
+    @ApiOperation(value = "添加支付记录", notes = "添加支付记录数据", httpMethod = "POST")
+    CommonResult InsertrepairPayRecord(@Validated @RequestBody RepairPayRecord rc, BindingResult bindingResult);
+
+    @PostMapping(value = "/updaterepairPayRecordById")
+    @ApiOperation(value = "编辑支付记录数据", notes = "编辑支付记录数据", httpMethod = "POST")
+    CommonResult updaterepairPayRecordById(@Validated @RequestBody RepairPayRecord rc, BindingResult bindingResult);
+
+    @GetMapping(value = "/queryPagerepairPayRecord")
+    @ApiOperation(value = "支付记录分页数据", notes = "支付记录分页数据", httpMethod = "GET")
+    CommonResult queryPagerepairPayRecords(@RequestParam int currentPage, @RequestParam int pageCount, String name);
+
+    @GetMapping(value = "/deleterepairPayRecordById")
+    @ApiOperation(value = "根据ID删除指定支付记录", notes = "根据ID删除指定支付记录", httpMethod = "GET")
+    CommonResult deleterepairPayRecordById(@RequestParam int id);
+}

+ 30 - 0
src/main/java/com/repair/api/RepairReceivingControllerAPI.java

@@ -0,0 +1,30 @@
+package com.repair.api;
+
+import com.repair.model.pojo.RepairReceiving;
+import com.repair.model.result.CommonResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@RequestMapping("/api/repairReceiving")
+@Api(tags = {"repairReceivingController"}, value = "接单记录")
+public interface RepairReceivingControllerAPI {
+
+    @PostMapping(value = "/insertrepairReceiving")
+    @ApiOperation(value = "添加接单记录", notes = "添加接单记录数据", httpMethod = "POST")
+    CommonResult InsertrepairReceiving(@Validated @RequestBody RepairReceiving rc, BindingResult bindingResult);
+
+    @PostMapping(value = "/updaterepairReceivingById")
+    @ApiOperation(value = "编辑接单记录数据", notes = "编辑接单记录数据", httpMethod = "POST")
+    CommonResult updaterepairReceivingById(@Validated @RequestBody RepairReceiving rc, BindingResult bindingResult);
+
+    @GetMapping(value = "/queryPagerepairReceiving")
+    @ApiOperation(value = "接单记录分页数据", notes = "接单记录分页数据", httpMethod = "GET")
+    CommonResult queryPagerepairReceivings(@RequestParam int currentPage, @RequestParam int pageCount, String name);
+
+    @GetMapping(value = "/deleterepairReceivingById")
+    @ApiOperation(value = "根据ID删除指定接单记录", notes = "根据ID删除指定接单记录", httpMethod = "GET")
+    CommonResult deleterepairReceivingById(@RequestParam int id);
+}

+ 45 - 0
src/main/java/com/repair/api/RepairRecordControllerAPI.java

@@ -0,0 +1,45 @@
+package com.repair.api;
+
+import com.repair.model.pojo.RepairRecord;
+import com.repair.model.request.repairRecordRequest;
+import com.repair.model.result.CommonResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+
+@RequestMapping("/api/repairRecord")
+@Api(tags = {"RepairRecordController"}, value = "报修记录")
+public interface RepairRecordControllerAPI {
+
+    @PostMapping(value = "/insertRepairRecord")
+    @ApiOperation(value = "提交报修订单", notes = "提交报修订单", httpMethod = "POST")
+    CommonResult InsertRepairRecord(@Validated @RequestBody repairRecordRequest rrr, BindingResult bindingResult);
+
+    @PostMapping(value = "/updateRepairRecordById")
+    @ApiOperation(value = "编辑报修记录数据", notes = "编辑报修记录数据", httpMethod = "POST")
+    CommonResult updateRepairRecordById(@Validated @RequestBody RepairRecord ra, BindingResult bindingResult);
+
+    @GetMapping(value = "/queryPageRepairRecord")
+    @ApiOperation(value = "报修记录分页数据", notes = "报修记录分页数据", httpMethod = "GET")
+    CommonResult queryPageRepairRecords(@RequestParam int currentPage, @RequestParam int pageCount, String name);
+
+    @GetMapping(value = "/deleteRepairRecordById")
+    @ApiOperation(value = "根据ID删除指定报修记录", notes = "根据ID删除指定报修记录", httpMethod = "GET")
+    CommonResult deleteRepairRecordById(@RequestParam int id);
+
+    @PostMapping(value = "/uploadFile")
+    @ApiOperation(value = "文件上传", notes = "文件上传", httpMethod = "POST")
+    CommonResult uploadFile(@RequestParam("file") MultipartFile file) throws Exception;
+
+    @GetMapping(value = "/getRepairRecordsByUserId")
+    @ApiOperation(value = "根据用户ID获取报修记录", notes = "根据用户ID获取报修记录", httpMethod = "GET")
+    CommonResult getRepairRecordsByUserId(@RequestParam int currentPage, @RequestParam int pageCount, @RequestParam int userId, @RequestParam int state);
+
+    @GetMapping(value = "/getRepairRecordCountByUserId")
+    @ApiOperation(value = "根据用户ID获取报修报修数量", notes = "根据用户ID获取报修报修数量", httpMethod = "GET")
+    CommonResult getRepairRecordCountByUserId(@RequestParam int userId);
+}

+ 30 - 0
src/main/java/com/repair/api/RepairRefundRecordControllerAPI.java

@@ -0,0 +1,30 @@
+package com.repair.api;
+
+import com.repair.model.pojo.RepairRefundRecord;
+import com.repair.model.result.CommonResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@RequestMapping("/api/repairRefundRecord")
+@Api(tags = {"repairRefundRecordController"}, value = "退款记录")
+public interface RepairRefundRecordControllerAPI {
+
+    @PostMapping(value = "/insertrepairRefundRecord")
+    @ApiOperation(value = "添加退款记录", notes = "添加退款记录数据", httpMethod = "POST")
+    CommonResult InsertrepairRefundRecord(@Validated @RequestBody RepairRefundRecord rc, BindingResult bindingResult);
+
+    @PostMapping(value = "/updaterepairRefundRecordById")
+    @ApiOperation(value = "编辑退款记录数据", notes = "编辑退款记录数据", httpMethod = "POST")
+    CommonResult updaterepairRefundRecordById(@Validated @RequestBody RepairRefundRecord rc, BindingResult bindingResult);
+
+    @GetMapping(value = "/queryPagerepairRefundRecord")
+    @ApiOperation(value = "退款记录分页数据", notes = "退款记录分页数据", httpMethod = "GET")
+    CommonResult queryPagerepairRefundRecords(@RequestParam int currentPage, @RequestParam int pageCount, String name);
+
+    @GetMapping(value = "/deleterepairRefundRecordById")
+    @ApiOperation(value = "根据ID删除指定退款记录", notes = "根据ID删除指定退款记录", httpMethod = "GET")
+    CommonResult deleterepairRefundRecordById(@RequestParam int id);
+}

+ 30 - 0
src/main/java/com/repair/api/RepairSchoolControllerAPI.java

@@ -0,0 +1,30 @@
+package com.repair.api;
+
+import com.repair.model.pojo.RepairSchool;
+import com.repair.model.result.CommonResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@RequestMapping("/api/repairSchool")
+@Api(tags = {"RepairSchoolController"}, value = "校区")
+public interface RepairSchoolControllerAPI {
+
+    @PostMapping(value = "/insertRepairSchool")
+    @ApiOperation(value = "添加校区", notes = "添加校区数据", httpMethod = "POST")
+    CommonResult InsertRepairSchool(@Validated @RequestBody RepairSchool repairSchool, BindingResult bindingResult);
+
+    @PostMapping(value = "/updateRepairSchoolById")
+    @ApiOperation(value = "编辑校区数据", notes = "编辑校区数据", httpMethod = "POST")
+    CommonResult updateRepairSchoolById(@Validated @RequestBody RepairSchool ra, BindingResult bindingResult);
+
+    @GetMapping(value = "/queryPageRepairSchool")
+    @ApiOperation(value = "校区分页数据", notes = "校区分页数据", httpMethod = "GET")
+    CommonResult queryPageRepairSchools(@RequestParam int currentPage, @RequestParam int pageCount, String name);
+
+    @GetMapping(value = "/deleteRepairSchoolById")
+    @ApiOperation(value = "根据ID删除指定校区", notes = "根据ID删除指定校区", httpMethod = "GET")
+    CommonResult deleteRepairSchoolById(@RequestParam int id);
+}

+ 34 - 0
src/main/java/com/repair/api/RepairShiftSettingsControllerAPI.java

@@ -0,0 +1,34 @@
+package com.repair.api;
+
+import com.repair.model.pojo.RepairShiftSettings;
+import com.repair.model.request.insertRepairShiftSettingRequest;
+import com.repair.model.request.updateRepairShiftRequest;
+import com.repair.model.result.CommonResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.text.ParseException;
+
+@RequestMapping("/api/repairShiftSettings")
+@Api(tags = {"RepairShiftSettingsController"}, value = "班次")
+public interface RepairShiftSettingsControllerAPI {
+
+    @PostMapping(value = "/insertRepairShiftSettings")
+    @ApiOperation(value = "添加班次", notes = "添加班次数据", httpMethod = "POST")
+    CommonResult InsertRepairShiftSettings(@Validated @RequestBody insertRepairShiftSettingRequest irssr, BindingResult bindingResult) throws ParseException;
+
+    @PostMapping(value = "/updateRepairShiftSettingsById")
+    @ApiOperation(value = "编辑班次数据", notes = "编辑班次数据", httpMethod = "POST")
+    CommonResult updateRepairShiftSettingsById(@Validated @RequestBody updateRepairShiftRequest ra, BindingResult bindingResult) throws ParseException;
+
+    @GetMapping(value = "/queryPageRepairShiftSettings")
+    @ApiOperation(value = "班次分页数据", notes = "班次分页数据", httpMethod = "GET")
+    CommonResult queryPageRepairShiftSettingss(@RequestParam int currentPage, @RequestParam int pageCount, String name);
+
+    @GetMapping(value = "/deleteRepairShiftSettingsById")
+    @ApiOperation(value = "根据ID删除指定班次", notes = "根据ID删除指定班次", httpMethod = "GET")
+    CommonResult deleteRepairShiftSettingsById(@RequestParam int id);
+}

+ 30 - 0
src/main/java/com/repair/api/RepairSystemMessagesControllerAPI.java

@@ -0,0 +1,30 @@
+package com.repair.api;
+
+import com.repair.model.pojo.RepairSystemMessages;
+import com.repair.model.result.CommonResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@RequestMapping("/api/repairSystemMessages")
+@Api(tags = {"repairSystemMessagesController"}, value = "系统信息")
+public interface RepairSystemMessagesControllerAPI {
+
+    @PostMapping(value = "/insertrepairSystemMessages")
+    @ApiOperation(value = "添加系统信息", notes = "添加系统信息数据", httpMethod = "POST")
+    CommonResult InsertrepairSystemMessages(@Validated @RequestBody RepairSystemMessages rc, BindingResult bindingResult);
+
+    @PostMapping(value = "/updaterepairSystemMessagesById")
+    @ApiOperation(value = "编辑系统信息数据", notes = "编辑系统信息数据", httpMethod = "POST")
+    CommonResult updaterepairSystemMessagesById(@Validated @RequestBody RepairSystemMessages rc, BindingResult bindingResult);
+
+    @GetMapping(value = "/queryPagerepairSystemMessages")
+    @ApiOperation(value = "系统信息分页数据", notes = "系统信息分页数据", httpMethod = "GET")
+    CommonResult queryPagerepairSystemMessagess(@RequestParam int currentPage, @RequestParam int pageCount, String name);
+
+    @GetMapping(value = "/deleterepairSystemMessagesById")
+    @ApiOperation(value = "根据ID删除指定系统信息", notes = "根据ID删除指定系统信息", httpMethod = "GET")
+    CommonResult deleterepairSystemMessagesById(@RequestParam int id);
+}

+ 26 - 0
src/main/java/com/repair/api/RepairSystemSettingControllerAPI.java

@@ -0,0 +1,26 @@
+package com.repair.api;
+
+import com.repair.model.pojo.RepairSystemSetting;
+import com.repair.model.result.CommonResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@RequestMapping("/api/repairSystemSetting")
+@Api(tags = {"RepairSystemSettingController"}, value = "系统设置")
+public interface RepairSystemSettingControllerAPI {
+
+    @GetMapping(value = "/queryRepairSystemSetting")
+    @ApiOperation(value = "获取系统设置", notes = "获取系统设置数据", httpMethod = "GET")
+    CommonResult QueryRepairSystemSetting();
+
+    @PostMapping(value = "/insertRepairSystemSetting")
+    @ApiOperation(value = "添加系统设置", notes = "添加系统设置数据", httpMethod = "POST")
+    CommonResult InsertRepairSystemSetting(@Validated @RequestBody RepairSystemSetting repairSystemSetting, BindingResult bindingResult);
+
+    @PostMapping(value = "/updateRepairSystemSettingById")
+    @ApiOperation(value = "编辑系统设置数据", notes = "编辑系统设置数据", httpMethod = "POST")
+    CommonResult updateRepairSystemSettingById(@Validated @RequestBody RepairSystemSetting ra, BindingResult bindingResult);
+}

+ 30 - 0
src/main/java/com/repair/api/RepairTrackRecordControllerAPI.java

@@ -0,0 +1,30 @@
+package com.repair.api;
+
+import com.repair.model.pojo.RepairTrackRecord;
+import com.repair.model.result.CommonResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@RequestMapping("/api/repairTrackRecord")
+@Api(tags = {"repairTrackRecordController"}, value = "跟踪记录")
+public interface RepairTrackRecordControllerAPI {
+
+    @PostMapping(value = "/insertrepairTrackRecord")
+    @ApiOperation(value = "添加跟踪记录", notes = "添加跟踪记录数据", httpMethod = "POST")
+    CommonResult InsertrepairTrackRecord(@Validated @RequestBody RepairTrackRecord rc, BindingResult bindingResult);
+
+    @PostMapping(value = "/updaterepairTrackRecordById")
+    @ApiOperation(value = "编辑跟踪记录数据", notes = "编辑跟踪记录数据", httpMethod = "POST")
+    CommonResult updaterepairTrackRecordById(@Validated @RequestBody RepairTrackRecord rc, BindingResult bindingResult);
+
+    @GetMapping(value = "/queryPagerepairTrackRecord")
+    @ApiOperation(value = "跟踪记录分页数据", notes = "跟踪记录分页数据", httpMethod = "GET")
+    CommonResult queryPagerepairTrackRecords(@RequestParam int currentPage, @RequestParam int pageCount, String name);
+
+    @GetMapping(value = "/deleterepairTrackRecordById")
+    @ApiOperation(value = "根据ID删除指定跟踪记录", notes = "根据ID删除指定跟踪记录", httpMethod = "GET")
+    CommonResult deleterepairTrackRecordById(@RequestParam int id);
+}

+ 30 - 0
src/main/java/com/repair/api/RepairTransferRecordControllerAPI.java

@@ -0,0 +1,30 @@
+package com.repair.api;
+
+import com.repair.model.pojo.RepairTransferRecord;
+import com.repair.model.result.CommonResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@RequestMapping("/api/repairTransferRecord")
+@Api(tags = {"repairTransferRecordController"}, value = "转单记录")
+public interface RepairTransferRecordControllerAPI {
+
+    @PostMapping(value = "/insertrepairTransferRecord")
+    @ApiOperation(value = "添加转单记录", notes = "添加转单记录数据", httpMethod = "POST")
+    CommonResult InsertrepairTransferRecord(@Validated @RequestBody RepairTransferRecord rc, BindingResult bindingResult);
+
+    @PostMapping(value = "/updaterepairTransferRecordById")
+    @ApiOperation(value = "编辑转单记录数据", notes = "编辑转单记录数据", httpMethod = "POST")
+    CommonResult updaterepairTransferRecordById(@Validated @RequestBody RepairTransferRecord rc, BindingResult bindingResult);
+
+    @GetMapping(value = "/queryPagerepairTransferRecord")
+    @ApiOperation(value = "转单记录分页数据", notes = "转单记录分页数据", httpMethod = "GET")
+    CommonResult queryPagerepairTransferRecords(@RequestParam int currentPage, @RequestParam int pageCount, String name);
+
+    @GetMapping(value = "/deleterepairTransferRecordById")
+    @ApiOperation(value = "根据ID删除指定转单记录", notes = "根据ID删除指定转单记录", httpMethod = "GET")
+    CommonResult deleterepairTransferRecordById(@RequestParam int id);
+}

+ 39 - 0
src/main/java/com/repair/api/RepairUserControllerAPI.java

@@ -0,0 +1,39 @@
+package com.repair.api;
+
+import com.repair.model.request.insertRepairUserRequest;
+import com.repair.model.request.updateUserDataRequest;
+import com.repair.model.result.CommonResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@RequestMapping("/api/repairUser")
+@Api(tags = {"RepairUserController"}, value = "用户")
+public interface RepairUserControllerAPI {
+
+    @PostMapping(value = "/insertRepairUserSetting")
+    @ApiOperation(value = "添加用户", notes = "添加用户数据", httpMethod = "POST")
+    CommonResult InsertRepairUser(@Validated @RequestBody insertRepairUserRequest irur, BindingResult bindingResult);
+
+    @PostMapping(value = "/updateRepairUserSettingById")
+    @ApiOperation(value = "编辑用户数据", notes = "编辑用户数据", httpMethod = "POST")
+    CommonResult updateRepairUserById(@Validated @RequestBody updateUserDataRequest ra, BindingResult bindingResult);
+
+    @GetMapping(value = "/queryPageRepairUser")
+    @ApiOperation(value = "用户分页数据", notes = "用户分页数据", httpMethod = "GET")
+    CommonResult queryPageRepairUser(@RequestParam int currentPage, @RequestParam int pageCount, String keyWord, Integer teamId, Integer schoolId);
+
+    @GetMapping(value = "/deleteRepairUserSettingById")
+    @ApiOperation(value = "根据ID删除指定用户", notes = "根据ID删除指定用户", httpMethod = "GET")
+    CommonResult deleteRepairUserById(@RequestParam int id);
+
+    @GetMapping(value = "/queryRepairUserByCardNumber")
+    @ApiOperation(value = "根据ID删除指定用户", notes = "根据ID删除指定用户", httpMethod = "GET")
+    CommonResult queryRepairUserByCardNumber(@RequestParam String cardNumber);
+
+    @GetMapping(value = "/queryPageRepairUsers")
+    @ApiOperation(value = "获取添加人员分页数据", notes = "获取添加人员分页数据", httpMethod = "GET")
+    CommonResult queryPageRepairUsers(@RequestParam int currentPage, @RequestParam int pageCount, Integer schoolId, String phone, Integer workTypId);
+}

+ 38 - 0
src/main/java/com/repair/api/RepairWorkTypeControllerAPI.java

@@ -0,0 +1,38 @@
+package com.repair.api;
+
+import com.repair.model.pojo.RepairWorkType;
+import com.repair.model.result.CommonResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@RequestMapping("/api/repairWorkType")
+@Api(tags = {"RepairWorkTypeController"}, value = "工种")
+public interface RepairWorkTypeControllerAPI {
+
+    @PostMapping(value = "/insertRepairWorkType")
+    @ApiOperation(value = "添加工种", notes = "添加工种数据", httpMethod = "POST")
+    CommonResult InsertRepairWorkType(@Validated @RequestBody RepairWorkType rwt, BindingResult bindingResult);
+
+    @PostMapping(value = "/updateRepairWorkTypeById")
+    @ApiOperation(value = "编辑工种数据", notes = "编辑工种数据", httpMethod = "POST")
+    CommonResult updateRepairWorkTypeById(@Validated @RequestBody RepairWorkType rwt, BindingResult bindingResult);
+
+    @GetMapping(value = "/queryPageRepairWorkType")
+    @ApiOperation(value = "工种分页数据", notes = "工种分页数据", httpMethod = "GET")
+    CommonResult queryPageRepairWorkTypes(@RequestParam int currentPage, @RequestParam int pageCount, String name);
+
+    @GetMapping(value = "/deleteRepairWorkTypeById")
+    @ApiOperation(value = "根据ID删除指定工种", notes = "根据ID删除指定工种", httpMethod = "GET")
+    CommonResult deleteRepairWorkTypeById(@RequestParam int id);
+
+    @GetMapping(value = "/getRepairWorkTypes")
+    @ApiOperation(value = "查询工种列表", notes = "查询工种列表", httpMethod = "GET")
+    CommonResult getRepairWorkTypes();
+
+    @GetMapping(value = "/getRepaairIdentitys")
+    @ApiOperation(value = "查询身份列表", notes = "查询身份列表", httpMethod = "GET")
+    CommonResult getRepairIdentitys();
+}

+ 14 - 0
src/main/java/com/repair/common/exception/EmsException.java

@@ -0,0 +1,14 @@
+package com.repair.common.exception;
+
+import com.repair.common.result.ResponseStatusEnum;
+
+/**
+ * 处理异常,统一封装
+ */
+public class EmsException {
+
+    public static void display(ResponseStatusEnum responseStatusEnum) {
+        throw new MyCustomException(responseStatusEnum);
+    }
+
+}

+ 200 - 0
src/main/java/com/repair/common/exception/EmsExceptionHandler.java

@@ -0,0 +1,200 @@
+package com.repair.common.exception;
+
+import com.fasterxml.jackson.core.JsonParseException;
+import com.repair.common.result.ResponseStatusEnum;
+import com.repair.model.result.CommonResult;
+import org.mybatis.spring.MyBatisSystemException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.support.DefaultMessageSourceResolvable;
+import org.springframework.http.converter.HttpMessageNotReadableException;
+import org.springframework.validation.BindException;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.FieldError;
+import org.springframework.web.HttpRequestMethodNotSupportedException;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.MissingServletRequestParameterException;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.fasterxml.jackson.databind.exc.InvalidFormatException;
+import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
+
+import javax.validation.ConstraintViolation;
+import javax.validation.ConstraintViolationException;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 统一异常拦截处理
+ * 可以针对异常的类型进行捕获,然后返回json信息到前端
+ */
+@ControllerAdvice
+public class EmsExceptionHandler {
+
+    //org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET' not supported
+    final static Logger logger=LoggerFactory.getLogger(EmsExceptionHandler.class);
+
+    //处理Get请求中 使用@Valid 验证路径中请求实体校验失败后抛出的异常
+    @ExceptionHandler(BindException.class)
+    @ResponseBody
+    public CommonResult BindExceptionHandler(BindException e) {
+        String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining());
+        logger.error("错误信息",message);
+        return CommonResult.resultValue(ResponseStatusEnum.SYSTEM_NULL_POINTER);
+    }
+
+    //处理请求参数格式错误 @RequestParam上validate失败后抛出的异常是javax.validation.ConstraintViolationException
+    @ExceptionHandler(ConstraintViolationException.class)
+    @ResponseBody
+    public CommonResult ConstraintViolationExceptionHandler(ConstraintViolationException e) {
+        String message = e.getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.joining());
+        logger.error("错误信息",message);
+        return CommonResult.resultValue(ResponseStatusEnum.SYSTEM_NULL_POINTER);
+    }
+
+    @ResponseBody
+    @ExceptionHandler(NullPointerException.class)
+    public CommonResult exception(NullPointerException e) {
+        e.printStackTrace();
+        //String error=e.getFieldError().getDefaultMessage();
+        logger.error("错误信息",e.fillInStackTrace());
+        return CommonResult.resultValue(ResponseStatusEnum.SYSTEM_NULL_POINTER);
+    }
+
+    @ExceptionHandler(Exception.class)
+    @ResponseBody
+    public CommonResult exception(Exception e) {
+        e.printStackTrace();
+        //String error=e.getFieldError().getDefaultMessage();
+        logger.error("错误信息",e.fillInStackTrace());
+        return CommonResult.fail(e.getMessage());
+    }
+
+    //mysql连接超时
+    @ExceptionHandler(MyBatisSystemException.class)
+    @ResponseBody
+    public CommonResult exception(MyBatisSystemException e) {
+        e.printStackTrace();
+        //String error=e.getFieldError().getDefaultMessage();
+        logger.error("错误信息",e.fillInStackTrace());
+        return CommonResult.resultValue(ResponseStatusEnum.SYSTEM_MYSQL_TIMEOUT_ERROR);
+    }
+
+    //请求方式错误
+    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
+    @ResponseBody
+    public CommonResult httpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) {
+        e.printStackTrace();
+        logger.error("错误信息",e.fillInStackTrace());
+        //String error=e.getFieldError().getDefaultMessage();
+        return CommonResult.resultValue(ResponseStatusEnum.SYSTEM_REQUEST_METHOD_ERROR);
+    }
+
+    //传参空异常
+    @ExceptionHandler(MissingServletRequestParameterException.class)
+    @ResponseBody
+    public CommonResult missingServletRequestParameterException(MissingServletRequestParameterException e) {
+        String name=  e.getParameterName();
+        logger.error("错误信息",e.fillInStackTrace());
+
+        //String error=e.getFieldError().getDefaultMessage();
+        return CommonResult.fail(name+"不能为空");
+    }
+
+    @ExceptionHandler(MyCustomException.class)
+    @ResponseBody
+    public CommonResult returnMyException(MyCustomException e) {
+        e.printStackTrace();
+        logger.error("错误信息",e.fillInStackTrace());
+        return CommonResult.resultValue(e.getResponseStatusEnum());
+    }
+
+    /**
+     * 传入JSON数据格式错误
+     * @param e
+     * @return
+     */
+    @ExceptionHandler(JsonParseException.class)
+    @ResponseBody
+    public CommonResult returnMyException(JsonParseException e) {
+        logger.error("错误信息",e.fillInStackTrace());
+        e.printStackTrace();
+        return CommonResult.resultValue(ResponseStatusEnum.SEND_PARAMS);
+    }
+
+
+    /**
+     * 传入JSON数据格式转换错误
+     * @param e
+     * @return
+     */
+    @ExceptionHandler(HttpMessageNotReadableException.class)
+    @ResponseBody
+    public CommonResult httpMessageNotReadableException(HttpMessageNotReadableException e) {
+        logger.error("错误信息",e.fillInStackTrace());
+        e.printStackTrace();//
+        if(e.getCause() instanceof  InvalidFormatException){
+            InvalidFormatException e1=   (InvalidFormatException)e.getCause();
+            Object erro1= e1.getValue();
+            Object erro2=e1.getTargetType().getSimpleName();
+            System.out.print(erro1);
+            System.out.print(erro2);
+        }
+
+        String error=e.getMessage();
+        return CommonResult.resultValue(ResponseStatusEnum.SEND_PARAMS_TYPE);
+    }
+
+
+
+
+
+
+
+    /**
+     * 参数验证错误
+     * @param e
+     * @return
+     */
+    @ExceptionHandler(MethodArgumentNotValidException.class)
+    @ResponseBody
+    public CommonResult returnException(MethodArgumentNotValidException e) {
+        logger.error("错误信息",e.fillInStackTrace());
+        BindingResult result = e.getBindingResult();
+        Map<String, String> map = getErrors(result);
+        return CommonResult.fail(map.values().toString().replace("[","").replace("]",""));
+    }
+
+    /**
+     * 参数验证错误
+     * @param e
+     * @return
+     */
+    @ExceptionHandler(MethodArgumentTypeMismatchException.class)
+    @ResponseBody
+    public CommonResult returnException(MethodArgumentTypeMismatchException e) {
+        logger.error("错误信息",e.fillInStackTrace());
+        String value=e.getValue().toString();
+        String paraType=e.getRequiredType().getName().toString();
+
+        return CommonResult.errorMsg(e.getName()+"数据格式转换错误");
+    }
+
+
+    public Map<String, String> getErrors(BindingResult result) {
+        Map<String, String> map = new HashMap<>();
+        List<FieldError> errorList = result.getFieldErrors();
+        for (FieldError error : errorList) {
+            // 发送验证错误的时候所对应的某个属性
+            String field = error.getField();
+            // 验证的错误消息
+            String msg = error.getDefaultMessage();
+            map.put(field, msg);
+        }
+        return map;
+    }
+
+
+}

+ 29 - 0
src/main/java/com/repair/common/exception/MyCustomException.java

@@ -0,0 +1,29 @@
+package com.repair.common.exception;
+
+import com.repair.common.result.ResponseStatusEnum;
+
+/**
+ * 自定义异常
+ * 目的:统一处理异常信息
+ *      便于解耦,service与controller错误的解耦,不会被service返回的类型而限制
+ */
+public class MyCustomException extends RuntimeException {
+
+    private ResponseStatusEnum responseStatusEnum;
+
+    public MyCustomException(ResponseStatusEnum responseStatusEnum) {
+        super("异常状态码为:" + responseStatusEnum.status()
+                + ";具体异常信息为:" + responseStatusEnum.msg());
+        this.responseStatusEnum = responseStatusEnum;
+    }
+
+    public ResponseStatusEnum getResponseStatusEnum() {
+        return responseStatusEnum;
+    }
+
+    public void setResponseStatusEnum(ResponseStatusEnum responseStatusEnum) {
+        this.responseStatusEnum = responseStatusEnum;
+    }
+
+
+}

+ 7 - 0
src/main/java/com/repair/common/result/Code.java

@@ -0,0 +1,7 @@
+package com.repair.common.result;
+
+public interface Code {
+    Integer getStatus();
+    Boolean getSuccess();
+    String getMsg();
+}

+ 82 - 0
src/main/java/com/repair/common/result/ResponseStatusEnum.java

@@ -0,0 +1,82 @@
+package com.repair.common.result;
+
+/**
+ * 响应结果枚举,用于提供给GraceJSONResult返回给前端的
+ * 本枚举类中包含了很多的不同的状态码供使用,可以自定义
+ * 便于更优雅的对状态码进行管理,一目了然
+ */
+public enum ResponseStatusEnum implements Code{
+
+
+    SUCCESS(200, true, "操作成功!"),
+    NO_PERMISSION(401,false,"没有权限"),
+    MISSING_REQUEST_HEADER(499,false,"缺少请求头"),
+    FAILED(500, false, "操作失败!"),
+    SEND_PARAMS(501,false,"传入参数数据结构错误"),
+    SEND_PARAMS_TYPE(502,false,"传入参数数据类型错误"),
+    UN_SERVICES_ERROR(505,false,"操作失败,请联系管理员"),
+
+    // 自定义系统级别异常 54x
+    SYSTEM_ERROR(540, false, "系统错误,错误未知!"),
+    SYSTEM_INDEX_OUT_OF_BOUNDS(541, false, "系统错误,数组越界!"),
+    SYSTEM_ARITHMETIC_BY_ZERO(542, false, "系统错误,无法除零!"),
+    SYSTEM_NULL_POINTER(543, false, "系统错误,空指针!"),
+    SYSTEM_NUMBER_FORMAT(544, false, "系统错误,数字转换异常!"),
+    SYSTEM_PARSE(545, false, "系统错误,解析异常!"),
+    SYSTEM_IO(546, false, "系统错误,IO输入输出异常!"),
+    SYSTEM_FILE_NOT_FOUND(547, false, "系统错误,文件未找到!"),
+    SYSTEM_CLASS_CAST(548, false, "系统错误,类型强制转换错误!"),
+    SYSTEM_PARSER_ERROR(549, false, "系统错误,解析出错!"),
+    SYSTEM_DATE_PARSER_ERROR(550, false, "系统错误,日期解析出错!"),
+    SYSTEM_ERROR_GLOBAL(551, false, "系统繁忙,请稍后再试!"),
+    SYSTEM_ERROR_ZUUL(552, false, "请求系统过于繁忙,请稍后再试!"),
+    SYSTEM_REQUEST_METHOD_ERROR(553, false, "请求类型错误"),
+    SYSTEM_MYSQL_TIMEOUT_ERROR(554, false, "Mysql连接超时"),
+    SYSTEM_MONGO_TIMEOUT_ERROR(555, false, "Mongo连接超时"),
+    SYSTEM_PHONE_ERROR(556,false,"手机号格式错误"),
+    SYSTEM_SEND_PHONE_ERROR(557,false,"发送验证码失败"),
+    SYSTEM_TOKEN_ERROR(558,false,"token为空"),
+    SYSTEM_LOGIN_ERROR(559,false,"无效token"),
+    PARAM_ERROR(560, false, "参数不能为空!"),
+    EXISTS(999,false,"已存在");
+
+    // 响应业务状态
+    private Integer status;
+    // 调用是否成功
+    private Boolean success;
+    // 响应消息,可以为成功或者失败的消息
+    private String msg;
+
+    ResponseStatusEnum(Integer status, Boolean success, String msg) {
+        this.status = status;
+        this.success = success;
+        this.msg = msg;
+    }
+
+    public Integer status() {
+        return status;
+    }
+    public Boolean success() {
+        return success;
+    }
+    public String msg() {
+        return msg;
+    }
+
+    @Override
+    public Integer getStatus() {
+        return status;
+    }
+
+    @Override
+    public Boolean getSuccess() {
+        return success;
+    }
+
+    @Override
+    public String getMsg() {
+        return msg;
+    }
+
+
+}

+ 199 - 0
src/main/java/com/repair/common/utils/AesUtils.java

@@ -0,0 +1,199 @@
+package com.repair.common.utils;
+
+import lombok.extern.slf4j.Slf4j;
+import org.bouncycastle.util.encoders.Base64;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.spec.SecretKeySpec;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * @Author: liujun
+ * @Description: Aes 加解密算法
+ * @Date Create in 上午 9:38$ 2017/12/26 0026$
+ * @Modify By:
+ */
+@Slf4j
+public class AesUtils {
+    private static String password = "52D04DC20036DBD8";
+    /**
+     * @Author liujun
+     * @Description:
+     * @params: * @param content 需要加密的内容
+     * @param password  加密密码
+     * @Date 上午 9:41 2017/12/26 0026
+     */
+    public static String encrypt(String content) {
+
+        if(password.length()<16) {
+            password = password + "0000000000000000".substring(0, 16-password.length());
+        }
+        else if(password.length()>16) {
+            password = password.substring(0, 16);
+        }
+
+        return bytes2HexString(encryptAES(content.getBytes(), password.getBytes()));
+    }
+
+
+    /**
+     * @Author liujun
+     * @Description:
+     * @params: * @param content 待解密内容
+     * @param password 解密密钥
+     * @Date 上午 9:40 2017/12/26 0026
+     */
+    public static String decrypt(String content) {
+        if(password.length()<16) {
+            password = password + "0000000000000000".substring(0, 16-password.length());
+        }
+        else if(password.length()>16) {
+            password = password.substring(0, 16);
+        }
+
+        return new String(decryptAES(hexString2Bytes(content), password.getBytes()));
+    }
+
+    /**
+     * AES 加密
+     *
+     * @param data 明文
+     * @param key  16、24、32 字节秘钥
+     * @return 密文
+     */
+    public static byte[] encryptAES(final byte[] data, final byte[] key) {
+
+        try {
+            SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
+            Cipher cipher = Cipher.getInstance("AES");// 创建密码器
+            byte[] byteContent = data;
+            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);// 初始化
+            byte[] result = cipher.doFinal(byteContent);
+            return result; // 加密
+        } catch (NoSuchAlgorithmException e) {
+            log.error(e.getMessage(),e);
+        } catch (NoSuchPaddingException e) {
+            log.error(e.getMessage(),e);
+        } catch (InvalidKeyException e) {
+            log.error(e.getMessage(),e);
+        } catch (IllegalBlockSizeException e) {
+            log.error(e.getMessage(),e);
+        } catch (BadPaddingException e) {
+            log.error(e.getMessage(),e);
+        } catch (Exception e) {
+            log.error(e.getMessage(),e);
+        }
+        return null;
+    }
+
+    /**
+     * AES 解密
+     *
+     * @param data 密文
+     * @param key  16、24、32 字节秘钥
+     * @return 明文
+     */
+    public static byte[] decryptAES(final byte[] data, final byte[] key) {
+
+        try {
+            SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
+            Cipher cipher = Cipher.getInstance("AES");// 创建密码器
+            cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);// 初始化
+            byte[] result = cipher.doFinal(data);
+            return result; // 加密
+        } catch (NoSuchAlgorithmException e) {
+            log.error(e.getMessage(),e);
+        } catch (NoSuchPaddingException e) {
+            log.error(e.getMessage(),e);
+        } catch (InvalidKeyException e) {
+            log.error(e.getMessage(),e);
+        } catch (IllegalBlockSizeException e) {
+            log.error(e.getMessage(),e);
+        } catch (BadPaddingException e) {
+            log.error(e.getMessage(),e);
+        } catch (Exception e) {
+            log.error(e.getMessage(),e);
+        }
+        return null;
+    }
+
+    public static String bytes2HexString(final byte[] bytes) {
+        if (bytes == null) return null;
+        int len = bytes.length;
+        if (len <= 0) return null;
+        char[] ret = new char[len << 1];
+        for (int i = 0, j = 0; i < len; i++) {
+            ret[j++] = hexDigits[bytes[i] >>> 4 & 0x0f];
+            ret[j++] = hexDigits[bytes[i] & 0x0f];
+        }
+        return new String(ret);
+    }
+
+    private static final char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
+
+    public static byte[] hexString2Bytes(String hexString) {
+        if (isSpace(hexString)) return null;
+        int len = hexString.length();
+        if (len % 2 != 0) {
+            hexString = "0" + hexString;
+            len = len + 1;
+        }
+        char[] hexBytes = hexString.toUpperCase().toCharArray();
+        byte[] ret = new byte[len >> 1];
+        for (int i = 0; i < len; i += 2) {
+            ret[i >> 1] = (byte) (hex2Dec(hexBytes[i]) << 4 | hex2Dec(hexBytes[i + 1]));
+        }
+        return ret;
+    }
+
+    private static int hex2Dec(final char hexChar) {
+        if (hexChar >= '0' && hexChar <= '9') {
+            return hexChar - '0';
+        } else if (hexChar >= 'A' && hexChar <= 'F') {
+            return hexChar - 'A' + 10;
+        } else {
+            throw new IllegalArgumentException();
+        }
+    }
+
+    public static byte[] base64Encode(final byte[] input) {
+        return Base64.encode(input);
+    }
+
+    public static byte[] base64Decode(final byte[] input) {
+
+        return Base64.decode(input);
+    }
+
+    private static boolean isSpace(final String s) {
+        if (s == null) return true;
+        for (int i = 0, len = s.length(); i < len; ++i) {
+            if (!Character.isWhitespace(s.charAt(i))) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    public static void main(String[] args) {
+        String s="{\n" +
+                "  \"categoryId\": \"72cf28a8789643bbbbb62d08ee91f17e\",\n" +
+                "     \"luid\": \"80A036D93CFB\",\n" +
+                "     \"type\":\"4\",\n" +
+                "     \"userName\":\"13097286670\",\n" +
+                "     \"startTime\":\"1682389484000\",\n" +
+                "     \"endTime\":\"1684981484000\",\n" +
+                "     \"password\":\"A08E87B5E777EBEE2C6EF3262F069D5A\"\n" +
+                "}";
+        //加密
+        String encryptString = AesUtils.encrypt("548903");
+        System.out.println("加密后字符串:"+encryptString);
+        //解密
+        String decryptString = AesUtils.decrypt(encryptString);
+        System.out.println("解密后字符串:"+decryptString);
+    }
+}

+ 173 - 0
src/main/java/com/repair/common/utils/CommonUtil.java

@@ -0,0 +1,173 @@
+package com.repair.common.utils;
+
+import lombok.extern.slf4j.Slf4j;
+
+import javax.servlet.http.HttpServletRequest;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.security.MessageDigest;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.util.*;
+
+/**
+ * 公共工具类
+ **/
+@Slf4j
+public class CommonUtil {
+    /**
+     * 获取ip
+     *
+     * @param request
+     * @return
+     */
+    public static String getIpAddr(HttpServletRequest request) {
+        String ipAddress = null;
+        try {
+            ipAddress = request.getHeader("x-forwarded-for");
+            System.out.println("x-forwarded-for="+ipAddress);
+            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
+                ipAddress = request.getHeader("Proxy-Client-IP");
+                System.out.println("Proxy-Client-IP="+ipAddress);
+            }
+            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
+                ipAddress = request.getHeader("WL-Proxy-Client-IP");
+                System.out.println("WL-Proxy-Client-IP="+ipAddress);
+            }
+            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
+                ipAddress = request.getRemoteAddr();
+                System.out.println("getRemoteAddr="+ipAddress);
+                if (ipAddress.equals("127.0.0.1")) {
+                    // 根据网卡取本机配置的IP
+                    InetAddress inet = null;
+                    try {
+                        inet = InetAddress.getLocalHost();
+                    } catch (UnknownHostException e) {
+                        e.printStackTrace();
+                    }
+                    ipAddress = inet.getHostAddress();
+                    System.out.println("getHostAddress="+ipAddress);
+                }
+            }
+            // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
+            if (ipAddress != null && ipAddress.length() > 15) {
+                // "***.***.***.***".length()
+                // = 15
+                if (ipAddress.indexOf(",") > 0) {
+                    ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
+                }
+            }
+        } catch (Exception e) {
+            ipAddress = "";
+        }
+        return ipAddress;
+    }
+
+
+    /**
+     * 获取全部请求头
+     *
+     * @param request
+     * @return
+     */
+    public static Map<String, String> getAllRequestHeader(HttpServletRequest request) {
+        Enumeration<String> headerNames = request.getHeaderNames();
+        Map<String, String> map = new HashMap<>();
+        while (headerNames.hasMoreElements()) {
+            String key = headerNames.nextElement();
+            //根据名称获取请求头的值
+            String value = request.getHeader(key);
+            map.put(key, value);
+        }
+
+        return map;
+    }
+
+
+    /**
+     * MD5加密
+     *
+     * @param data
+     * @return
+     */
+    public static String MD5(String data) {
+        try {
+            MessageDigest md = MessageDigest.getInstance("MD5");
+            byte[] array = md.digest(data.getBytes("UTF-8"));
+            StringBuilder sb = new StringBuilder();
+            for (byte item : array) {
+                sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
+            }
+
+            return sb.toString().toUpperCase();
+        } catch (Exception exception) {
+        }
+        return null;
+    }
+
+
+    /**
+     * 获取验证码随机数
+     *
+     * @param length
+     * @return
+     */
+    public static String getRandomCode(int length) {
+        String sources = "0123456789";
+        Random random = new Random();
+        StringBuilder sb = new StringBuilder();
+        for (int j = 0; j < length; j++) {
+            sb.append(sources.charAt(random.nextInt(9)));
+        }
+        return sb.toString();
+    }
+
+    /**
+     * 获取当前时间戳
+     *
+     * @return
+     */
+    public static long getCurrentTimestamp() {
+        return System.currentTimeMillis();
+    }
+
+    /**
+     * 生成uuid
+     *
+     * @return
+     */
+    public static String generateUUID() {
+        return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 32);
+    }
+
+    /**
+     * 获取随机长度的串
+     *
+     * @param length
+     * @return
+     */
+    private static final String ALL_CHAR_NUM = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+
+    public static String getStringNumRandom(int length) {
+        //生成随机数字和字母,
+        Random random = new Random();
+        StringBuilder saltString = new StringBuilder(length);
+        for (int i = 1; i <= length; ++i) {
+            saltString.append(ALL_CHAR_NUM.charAt(random.nextInt(ALL_CHAR_NUM.length())));
+        }
+        return saltString.toString();
+    }
+
+    /**
+     * LocalDate 拼接时间转成 LocalDateTime
+     * @param localDate
+     * @param timeStr HH:mm:ss
+     * @return
+     */
+    public static LocalDateTime localDateToTime(LocalDate localDate, String timeStr) {
+        LocalTime time = LocalTime.parse(timeStr);
+        return LocalDateTime.of(localDate.getYear(), localDate.getMonth(), localDate.getDayOfMonth(),
+                time.getHour(), time.getMinute(), time.getSecond());
+    }
+}

+ 41 - 0
src/main/java/com/repair/common/utils/EncryptionUtil.java

@@ -0,0 +1,41 @@
+package com.repair.common.utils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class EncryptionUtil {
+
+
+    private static final int MAX_JSON_STRING = 40;
+
+    /**
+     * 将需要加密的字段分批加密
+     *
+     * @param jsonString
+     * @param publicKey
+     * @return
+     * @throws Exception
+     */
+    public Map<Object, Object> encryption(String jsonString, String publicKey) throws Exception {
+        int length = jsonString.length();
+        int offset = 0;
+        int i = 0;
+        HashMap<Object, Object> map = new HashMap<>();
+//        判断字符串长度是否大于40,大于就截取前40位,分批加密
+        while (length - offset > 0) {
+            if (length - offset > MAX_JSON_STRING) {
+                String substring = jsonString.substring(offset, offset + MAX_JSON_STRING);
+                String encrypt = RSAUtils.encrypt(substring, RSAUtils.getPublicKey(publicKey));
+                map.put(i, encrypt);
+            } else {
+                String substring = jsonString.substring(offset,length);
+                String encrypt = RSAUtils.encrypt(substring, RSAUtils.getPublicKey(publicKey));
+                map.put(i, encrypt);
+            }
+            i++;
+            offset = i * MAX_JSON_STRING;
+        }
+        return map;
+    }
+}

+ 173 - 0
src/main/java/com/repair/common/utils/ExcelExportUtil.java

@@ -0,0 +1,173 @@
+package com.repair.common.utils;
+
+import org.apache.poi.hpsf.Decimal;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.*;
+
+/**
+ * @Author: binguo
+ * @Date: 2023/7/19 星期三 9:38
+ * @Description: com.chuanghai.attendance.utils.excel
+ * @Version: 1.0
+ */
+public class ExcelExportUtil {
+    /**
+     * @description 考虑到下载方式的不同 这里细化成只获取一个workBook 格式为默认 无格式
+     * @param list 需要存储为excel的对象集合
+     * @param map 键值对映射 属性 - 表头字段  类似于: name - 姓名
+     * @param type 生成workbook的类型
+     * @param tableName 生成Sheet的名称
+     * @param orderList 表头顺序对应的属性list
+     * @return org.apache.poi.ss.usermodel.Workbook
+     **/
+    public static <T> Workbook createWorkbook(
+            List<T> list , //数据库查询的返回List
+            Map<String , String> map , //表头映射
+            Integer type , //生成workbook的类型 0 - xls 其他-xlsx
+            String tableName , //表名
+            List<String> orderList //排序的List 为空 则使用默认的顺序
+    ) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException {
+        //工作簿
+        Workbook workbook = getWorkbookByType(type);
+        //单个表
+        Sheet sheet = workbook.createSheet(tableName);
+
+        //orderList 表头顺序,可以为空
+        if(orderList == null || orderList.size() == 0) {
+            orderList = new ArrayList<>();
+            //获取map映射的顺序
+            for (Map.Entry<String, String> mapEntry : map.entrySet()) {
+                orderList.add(mapEntry.getKey());
+            }
+        }
+        //每列对应的属性参数
+        List<Class> typeClassList = getParamsType(list.get(0).getClass(), orderList);
+
+        //设置表头的值
+        Row headRow = sheet.createRow(0);
+        for (int i = 0; i < orderList.size(); i++) {
+            Cell cell = headRow.createCell(i);
+            //设置单元格的属性
+            cell.setCellValue(map.get(orderList.get(i)));
+        }
+
+        int index = 1;
+        //单元行
+        Row dataRow = null;
+        //单元格
+        Cell dataCell = null;
+        //遍历List
+        for (T t : list) {
+            //获取一行
+            dataRow = sheet.createRow(index);
+            //遍历表头对应属性,给一行数据设置值
+            for (int j = 0; j < orderList.size(); j++) {
+                //获取一个单元格
+                dataCell = dataRow.createCell(j);
+                //根据对应列的属性 设置对应的值类型及值
+                setCellValueTypeAndValue(dataCell , typeClassList.get(j) ,
+                        t.getClass().getMethod(getGetterMethodName(orderList.get(j)) , new Class[]{})
+                                .invoke(t , new Class[]{}));
+            }
+            //行下标后移
+            index++;
+        }
+        //设置值
+        return workbook;
+    }
+
+    /**
+     * @description 根据所给的type获取对应的工作簿 0-HSSFWorkbook 其他-XSSFWorkbook
+     * @author 三文鱼先生
+     * @date 10:41 2022/8/26
+     * @param type 类型
+     * @return org.apache.poi.ss.usermodel.Workbook
+     **/
+    public static Workbook getWorkbookByType(Integer type) {
+        if(type == null || type == 0)
+            return new HSSFWorkbook();
+        else
+            return new XSSFWorkbook();
+    }
+
+    /**
+     * @description 根据属性的List获取对应的类型List
+     * @author 三文鱼先生
+     * @date 10:37 2022/8/26
+     * @param cs 对应的类
+     * @param paramsList 对应的属性list
+     * @return java.util.List<java.lang.Class>
+     **/
+    public static List<Class> getParamsType(Class cs , List<String> paramsList) {
+        List<Class> typeClass = new ArrayList<>();
+        //对象的所有属性
+        Field[] fields = cs.getDeclaredFields();
+        //临时的属性 - 类型映射
+        Map<String , Class> map = new HashMap();
+        //获取属性名称及类型
+        for (Field field : fields) {
+            map.put(field.getName(), field.getType());
+        }
+        //遍历属性List获取对应的类型List
+        for (String s : paramsList) {
+            typeClass.add(map.get(s));
+        }
+        return typeClass;
+    }
+
+    /**
+     * @description 根据对应的类型 给单元格设置类型和值
+     * @author 三文鱼先生
+     * @date 10:32 2022/8/26
+     * @param cell 单元格
+     * @param cs 属性的类型
+     * @param o get方法获取到的对象
+     * @return void
+     **/
+    public static  void setCellValueTypeAndValue(Cell cell , Class cs , Object o) {
+
+        if(Boolean.class.equals(cs) || boolean.class.equals(cs)) {
+            //boolean类型
+            cell.setCellValue((Boolean) o);
+        } else if (int.class.equals(cs) || Integer.class.equals(cs)) {
+            //int类型
+            cell.setCellValue((Integer) o);
+        } else if(double.class.equals(cs) || Double.class.equals(cs)) {
+            //浮点数类型 也可以是float类型什么的
+            cell.setCellValue((Double) o);
+        }else if(BigDecimal.class.equals(cs) || Decimal.class.equals(cs)){
+            //金钱类型
+            cell.setCellValue(((BigDecimal) o).toString());
+        } else if(LocalDate.class.equals(cs) || Date.class.equals(cs)){
+            //日期类型
+            cell.setCellValue(((LocalDate) o).toString());
+        } else {
+            //默认为字符串类型
+            cell.setCellValue((String) o);
+        }
+    }
+
+    /**
+     * @description 根据属性名称获取对应的get方法
+     * @author 三文鱼先生
+     * @date 10:38 2022/8/26
+     * @param param 属性名称
+     * @return java.lang.String
+     **/
+    public static String getGetterMethodName(String param) {
+        char[] chars = param.toCharArray();
+        //首字母大写
+        if(Character.isLowerCase(chars[0])) {
+            chars[0] -= 32;
+        }
+        //拼接get方法
+        return "get" + new String(chars);
+    }
+}

+ 65 - 0
src/main/java/com/repair/common/utils/ExcelUtils.java

@@ -0,0 +1,65 @@
+package com.repair.common.utils;
+
+import com.repair.model.result.CommonResult;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.springframework.boot.system.ApplicationHome;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+
+/**
+ * @Author: binguo
+ * @Date: 2023/7/10 星期一 14:21
+ * @Description: com.repair.common.utils
+ * @Version: 1.0
+ */
+@Slf4j
+public class ExcelUtils {
+    public static void fileDownload(String fileName, HttpServletResponse response) {
+        try {
+            ApplicationHome applicationHome = new ApplicationHome(ExcelUtils.class);
+            String pathResouce = applicationHome.getDir().getParentFile().getParentFile().getAbsolutePath();
+            String decode = URLDecoder.decode(pathResouce, "utf-8");
+            File readPath = new File(decode + "\\src\\main\\resources\\excelFile" + File.separator);
+            File file = new File(readPath.getAbsolutePath() + fileName);
+            // 获取文件名
+            String filename = file.getName();
+            // 获取文件后缀名
+            String ext = filename.substring(filename.lastIndexOf(".") + 1).toLowerCase();
+            InputStream inputStream = new FileInputStream(file);//根据路径获取要下载的文件输入流
+            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+            response.setCharacterEncoding("utf-8");
+            response.setHeader("Content-disposition", "attachment;fileName=" + URLEncoder.encode(filename, "UTF-8"));
+            OutputStream out = response.getOutputStream();
+            byte[] b = new byte[1024];  //创建数据缓冲区
+            int length;
+            while ((length = inputStream.read(b)) > 0) {  //把文件流写到缓冲区里
+                out.write(b, 0, length);
+            }
+            out.flush();
+            out.close();
+            inputStream.close();
+        } catch (IOException ex) {
+            System.out.println("模板导出失败:" + ex.getMessage());
+            ex.printStackTrace();
+        }
+    }
+
+    public static void excelDownload(Workbook workbook, String fileName, HttpServletResponse response) {
+        try {
+            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+            response.setCharacterEncoding("utf-8");
+            response.setHeader("Content-disposition", "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8"));
+            OutputStream out = response.getOutputStream();
+            workbook.write(out);
+            out.flush();
+            out.close();
+        } catch (IOException ex) {
+            System.out.println("模板导出失败:" + ex.getMessage());
+            ex.printStackTrace();
+        }
+    }
+}

+ 479 - 0
src/main/java/com/repair/common/utils/HttpsClient.java

@@ -0,0 +1,479 @@
+package com.repair.common.utils;
+
+import com.alibaba.fastjson.JSONObject;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpEntity;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLConnection;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * HttpsClient类
+ * @author lujunjie
+ * @date   2018/03/01
+ */
+public class HttpsClient {
+
+    /**
+     * GET请求方式
+     */
+    public static final String METHOD_GET = "GET";
+    /**
+     * POST请求方式
+     */
+    public static final String METHOD_POST = "POST";
+    /**
+     * 连接超时时间
+     */
+    private static Integer CONNECTION_TIMEOUT = 15000;
+    /**
+     * 请求超时时间
+     */
+    private static Integer READ_TIMEOUT = 15000;
+
+    /**
+     * 发起https请求
+     * @param requestUrl 请求地址
+     * @param requestMethod 请求方式(Get或者post)
+     * @param postData 提交数据
+     * @return JSONObject
+     */
+    public static JSONObject httpsRequestReturnJSONObject(String requestUrl, String requestMethod, String postData) throws Exception{
+        JSONObject jsonObject = JSONObject.parseObject(HttpsClient.httpsRequestReturnString(requestUrl,requestMethod,postData));
+        System.out.println("jsonObjectDate:  " + jsonObject);
+        return jsonObject;
+    }
+
+
+    /**
+     * 发起https请求
+     * @param requestUrl 请求地址
+     * @param requestMethod 请求方式(Get或者post)
+     * @param postData 提交数据
+     * @return String
+     */
+    public static String httpsRequestReturnString(String requestUrl, String requestMethod, String postData) throws Exception{
+        String response;
+        HttpsURLConnection httpsUrlConnection = null;
+        try{
+            //创建https请求证书
+            TrustManager[] tm={new MyX509TrustManager()};
+            //创建SSLContext管理器对像,使用我们指定的信任管理器初始化
+            SSLContext sslContext=SSLContext.getInstance("SSL","SunJSSE");
+            sslContext.init(null, tm, new java.security.SecureRandom());
+            SSLSocketFactory ssf=sslContext.getSocketFactory();
+
+            // 创建URL对象
+            URL url= new URL(requestUrl);
+            // 创建HttpsURLConnection对象,并设置其SSLSocketFactory对象
+            httpsUrlConnection=(HttpsURLConnection)url.openConnection();
+            //设置ssl证书
+            httpsUrlConnection.setSSLSocketFactory(ssf);
+
+            //设置header信息
+            httpsUrlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
+            //设置User-Agent信息
+            httpsUrlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36");
+            //设置可接受信息
+            httpsUrlConnection.setDoOutput(true);
+            //设置可输入信息
+            httpsUrlConnection.setDoInput(true);
+            //不使用缓存
+            httpsUrlConnection.setUseCaches(false);
+            //设置请求方式(GET/POST)
+            httpsUrlConnection.setRequestMethod(requestMethod);
+            //设置连接超时时间
+            if (CONNECTION_TIMEOUT > 0) {
+                httpsUrlConnection.setConnectTimeout(CONNECTION_TIMEOUT);
+            } else {
+                //默认10秒超时
+                httpsUrlConnection.setConnectTimeout(10000);
+            }
+            //设置请求超时
+            if (READ_TIMEOUT > 0) {
+                httpsUrlConnection.setReadTimeout(READ_TIMEOUT);
+            } else {
+                //默认10秒超时
+                httpsUrlConnection.setReadTimeout(10000);
+            }
+            //设置编码
+            httpsUrlConnection.setRequestProperty("Charsert", WxConstants.DEFAULT_CHARSET);
+
+            //判断是否需要提交数据
+            if(StringUtils.equals(requestMethod,HttpsClient.METHOD_POST) && StringUtils.isNotBlank(postData)){
+                //讲参数转换为字节提交
+                byte[] bytes = postData.getBytes(WxConstants.DEFAULT_CHARSET);
+                //设置头信息
+                httpsUrlConnection.setRequestProperty("Content-Length", Integer.toString(bytes.length));
+                //开始连接
+                httpsUrlConnection.connect();
+                //防止中文乱码
+                OutputStream outputStream=httpsUrlConnection.getOutputStream();
+                outputStream.write(postData.getBytes(WxConstants.DEFAULT_CHARSET));
+                outputStream.flush();
+                outputStream.close();
+            }else{
+                //开始连接
+                httpsUrlConnection.connect();
+            }
+            response = WxUtil.getStreamString(httpsUrlConnection.getInputStream());
+        }catch (Exception e){
+            throw new Exception();
+        }finally {
+            if (httpsUrlConnection != null) {
+                // 关闭连接
+                httpsUrlConnection.disconnect();
+            }
+        }
+        return response;
+    }
+
+
+    public static String get(String url, Map<String, String> params){
+        CloseableHttpClient httpClient = null;
+        HttpGet httpGet = null;
+        StringBuffer str = new StringBuffer("");
+        try {
+            httpClient = HttpClients.createDefault();
+            RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(20000).setConnectTimeout(20000).build();
+            String ps = "";
+            for (String pKey : params.keySet()) {
+                if(!"".equals(ps)){
+                    ps = ps + "&";
+                }
+                ps = pKey+"="+params.get(pKey);
+            }
+            if(!"".equals(ps)){
+                url = url + "?" + ps;
+            }
+            httpGet = new HttpGet(url);
+            httpGet.setConfig(requestConfig);
+            CloseableHttpResponse response = httpClient.execute(httpGet);
+            HttpEntity httpEntity = response.getEntity();
+            str.append(EntityUtils.toString(httpEntity,"utf-8"));
+        } catch (ClientProtocolException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }finally{
+            try {
+                if(httpGet!=null){
+                    httpGet.releaseConnection();
+                }
+                if(httpClient!=null){
+                    httpClient.close();
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return str.toString();
+    }
+
+    public static String get(String strURL) throws Exception{
+
+        URL url = new URL(strURL);
+        HttpURLConnection httpConn = (HttpURLConnection)
+                url.openConnection();
+        httpConn.setRequestMethod("GET");
+        httpConn.connect();
+        System.out.println("bbb: "+httpConn.getResponseCode());
+        BufferedReader reader = new BufferedReader(new InputStreamReader(
+                httpConn.getInputStream(),"utf-8"));
+        String line;
+        StringBuffer buffer = new StringBuffer();
+        while ((line = reader.readLine()) != null) {
+            buffer.append(line);
+        }
+        reader.close();
+        httpConn.disconnect();
+
+        return buffer.toString();
+    }
+
+    /**
+     * 发送 post请求
+     * @param
+     * @param
+     */
+    public static String post(String url, Map<String, String> params){
+        CloseableHttpClient httpClient = null;
+        HttpPost httpPost = null;
+        StringBuilder sb = new StringBuilder("");
+        try {
+            httpClient = HttpClients.createDefault();
+            RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(20000).setConnectTimeout(20000).build();
+            httpPost = new HttpPost(url);
+            httpPost.setConfig(requestConfig);
+            List<NameValuePair> ps = new ArrayList<NameValuePair>();
+            for (String pKey : params.keySet()) {
+                ps.add(new BasicNameValuePair(pKey, params.get(pKey)));
+            }
+            httpPost.setEntity(new UrlEncodedFormEntity(ps));
+            CloseableHttpResponse response = httpClient.execute(httpPost);
+            HttpEntity httpEntity = response.getEntity();
+            sb.append(EntityUtils.toString(httpEntity,"utf-8"));
+        } catch (ClientProtocolException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }finally{
+            try {
+                if(httpPost!=null){
+                    httpPost.releaseConnection();
+                }
+                if(httpClient!=null){
+                    httpClient.close();
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return sb.toString();
+    }
+
+    //url表示请求链接,param表示json格式的请求参数		//自定义菜单创建访问方式
+    public static String sendPost(String url, String param) {
+        PrintWriter out = null;
+        BufferedReader in = null;
+        String result = "";
+        try {
+            URL realUrl = new URL(url);
+            // 打开和URL之间的连接
+            URLConnection conn = realUrl.openConnection();
+            // 设置通用的请求属性 注意Authorization生成
+            // conn.setRequestProperty("Content-Type",
+            // "application/x-www-form-urlencoded");
+            // 发送POST请求必须设置如下两行
+            conn.setDoOutput(true);
+            conn.setDoInput(true);
+            // 获取URLConnection对象对应的输出流
+            out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(),"utf-8"));
+            // 发送请求参数
+            out.print("&"+param);
+            // flush输出流的缓冲
+            out.flush();
+            // 定义BufferedReader输入流来读取URL的响应
+            in = new BufferedReader(
+                    new InputStreamReader(conn.getInputStream(),"utf-8"));
+            String line;
+            while ((line = in.readLine()) != null) {
+                result += line;
+            }
+        } catch (Exception e) {
+            System.out.println("发送 请求出现异常!" + e);
+            e.printStackTrace();
+        }
+        // 使用finally块来关闭输出流、输入流
+        finally {
+            try {
+                if (out != null) {
+                    out.close();
+                }
+                if (in != null) {
+                    in.close();
+                }
+            } catch (IOException ex) {
+                ex.printStackTrace();
+            }
+        }
+        return result;
+    }
+
+
+    //url表示请求链接,param表示json格式的请求参数		//自定义菜单创建访问方式
+    public static String sendPost2(String url, String param) {
+        PrintWriter out = null;
+        BufferedReader in = null;
+        String result = "";
+        try {
+            HttpsURLConnection httpsUrlConnection = null;
+            //创建https请求证书
+            TrustManager[] tm={new MyX509TrustManager()};
+            //创建SSLContext管理器对像,使用我们指定的信任管理器初始化
+            SSLContext sslContext=SSLContext.getInstance("SSL","SunJSSE");
+            sslContext.init(null, tm, new java.security.SecureRandom());
+            SSLSocketFactory ssf=sslContext.getSocketFactory();
+            // 创建URL对象
+            URL realUrl= new URL(url);
+            // 创建HttpsURLConnection对象,并设置其SSLSocketFactory对象,
+            // 打开和URL之间的连接
+            httpsUrlConnection=(HttpsURLConnection)realUrl.openConnection();
+            //设置ssl证书
+            httpsUrlConnection.setSSLSocketFactory(ssf);
+            // 设置通用的请求属性 注意Authorization生成
+            // conn.setRequestProperty("Content-Type",
+            // "application/x-www-form-urlencoded");
+            // 发送POST请求必须设置如下两行
+            httpsUrlConnection.setRequestMethod("POST");
+            httpsUrlConnection.setDoOutput(true);
+            httpsUrlConnection.setDoInput(true);
+            // 获取URLConnection对象对应的输出流
+            out = new PrintWriter(new OutputStreamWriter(httpsUrlConnection.getOutputStream(),"utf-8"));
+            // 发送请求参数
+            out.print("&"+param);
+            // flush输出流的缓冲
+            out.flush();
+            if (httpsUrlConnection.getResponseCode()==200) {
+                // 定义BufferedReader输入流来读取URL的响应
+                in = new BufferedReader(
+                        new InputStreamReader(httpsUrlConnection.getInputStream(), "utf-8"));
+                String line;
+                while ((line = in.readLine()) != null) {
+                    result += line;
+                }
+            }else {
+                result = "获取输入流异常!";
+            }
+        } catch (Exception e) {
+            System.out.println("发送 请求出现异常!" + e);
+            e.printStackTrace();
+        }
+        // 使用finally块来关闭输出流、输入流
+        finally {
+            try {
+                if (out != null) {
+                    out.close();
+                }
+                if (in != null) {
+                    in.close();
+                }
+            } catch (IOException ex) {
+                ex.printStackTrace();
+            }
+        }
+        return result;
+    }
+
+    public static String dateToStamp(String s) throws Exception {
+        String res = "";
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date date = simpleDateFormat.parse(s);
+        long time = date.getTime();
+        res = String.valueOf(time);
+        return res;
+    }
+
+    /*
+     * 将时间戳转换为时间
+     */
+    public static String stampToDate(String s){
+        String res;
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        long lt = new Long(s);
+        Date date = new Date(lt);
+        res = simpleDateFormat.format(date);
+        return res;
+    }
+
+    public static String sendJson(String request_url, JSONObject json) {
+        OutputStreamWriter out = null;
+        InputStream is = null;
+        String result = "";
+        try {
+            URL url = new URL(request_url);// 创建连接
+            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+            connection.setDoOutput(true);
+            connection.setDoInput(true);
+            connection.setUseCaches(false);
+            connection.setInstanceFollowRedirects(true);
+            connection.setRequestMethod("POST"); // 设置请求方式
+            // 设置接收数据的格式
+            connection.setRequestProperty("Accept", "application/json");
+            // 设置发送数据的格式
+            connection.setRequestProperty("Content-Type", "application/json");
+            connection.connect();
+            out = new OutputStreamWriter(connection.getOutputStream(), "UTF-8");
+            out.append(json.toString());
+            out.flush();
+            out.close();
+            // 读取响应
+            is = connection.getInputStream();
+            int length = (int) connection.getContentLength();// 获取字节长度
+            System.out.println(length);
+            if (length != -1) {
+                byte[] data = new byte[length];
+                byte[] temp = new byte[512];
+                int readLen = 0;
+                int destPos = 0;
+                while ((readLen = is.read(temp)) > 0) {
+                    System.arraycopy(temp, 0, data, destPos, readLen);
+                    destPos += readLen;
+                }
+                result = new String(data, "UTF-8"); // utf-8编码
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                is.close();
+                out.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return result;
+    }
+
+    public static String sendJson2(String request_url, JSONObject json) {
+        OutputStreamWriter out = null;
+        InputStream is = null;
+        String result = "";
+        try {
+            URL url = new URL(request_url);// 创建连接
+            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+            connection.setDoOutput(true);
+            connection.setDoInput(true);
+            connection.setUseCaches(false);
+            connection.setInstanceFollowRedirects(true);
+            connection.setRequestMethod("POST"); // 设置请求方式
+            // 设置接收数据的格式
+            connection.setRequestProperty("Accept", "application/json");
+            // 设置发送数据的格式
+            connection.setRequestProperty("Content-Type", "application/json");
+            connection.connect();
+            out = new OutputStreamWriter(connection.getOutputStream(), "UTF-8");
+            out.append(json.toString());
+            out.flush();
+            out.close();
+            // 读取响应
+            is = connection.getInputStream();
+            BufferedReader in = new BufferedReader(new InputStreamReader(is));
+            result = in.readLine();
+            System.out.println("aaa: "+result);
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                is.close();
+                out.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return result;
+    }
+
+}

+ 105 - 0
src/main/java/com/repair/common/utils/JWTUtil.java

@@ -0,0 +1,105 @@
+package com.repair.common.utils;
+
+
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.JWTVerifier;
+import com.auth0.jwt.algorithms.Algorithm;
+import com.auth0.jwt.interfaces.Claim;
+import com.auth0.jwt.interfaces.DecodedJWT;
+import com.repair.model.pojo.RepairAdmin;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * jwt 工具
+ **/
+@Slf4j
+public class JWTUtil {
+
+    private static String SIGNATURE = "token!@#$%^7890";
+
+    /**
+     * token过期时间,7天
+     */
+//    private static final long EXPIRED = 1000 * 60 * 60 * 24 * 7;
+    private static final long EXPIRED = 1000 * 60 * 60 * 24;
+
+    /**
+     * 生成token 有过期时间
+     * @return 返回token
+     */
+    public static String getToken(RepairAdmin ra,Long expired){
+
+        // 签发时间
+        Date iatDate = new Date();
+
+//        // 过期时间
+//        Calendar nowTime = Calendar.getInstance();
+//        nowTime.add(Calendar.DAY_OF_WEEK, 3);
+//        Date expiresDate = nowTime.getTime();
+
+        Map<String, Object> map = new HashMap<>();
+        map.put("alg", "HMAC256");
+        map.put("typ", "JWT");
+        String token = JWT.create()
+                .withHeader(map) // header
+                .withClaim("account", ra.getAccount()) // 账号
+                .withClaim("password", ra.getPassword()) // 密码
+                .withExpiresAt(new Date(CommonUtil.getCurrentTimestamp() + (expired == null ? EXPIRED : expired))) // 设置过期时间。过期时间要大于签发时间
+                .withIssuedAt(iatDate) // 设置签发时间
+                .sign(Algorithm.HMAC256(SIGNATURE)); // 加密
+        return token;
+
+//
+//        JWTCreator.Builder builder = JWT.create();
+//        map.forEach((k,v)->{
+//            builder.withClaim(k,v);
+//        });
+//        Calendar instance = Calendar.getInstance();
+//        instance.add(Calendar.SECOND,7);
+//        builder.withExpiresAt(instance.getTime());
+//        return builder.sign(Algorithm.HMAC256(SIGNATURE)).toString();
+    }
+
+    public static long getExpired() {
+        return EXPIRED;
+    }
+
+
+    /**
+     * 验证token
+     * @param token
+     */
+    public static void verify(String token){
+        JWT.require(Algorithm.HMAC256(SIGNATURE)).build().verify(token);
+    }
+
+    /**
+     * 获取token中payload
+     * @param token
+     * @return
+     */
+    public static DecodedJWT getToken(String token){
+        return JWT.require(Algorithm.HMAC256(SIGNATURE)).build().verify(token);
+    }
+
+
+
+    /*
+     * 解密Token
+     * */
+    public static Map<String, Claim> verifyToken(String token)  {
+        JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SIGNATURE)).build();
+        DecodedJWT jwt = null;
+        try {
+            jwt = verifier.verify(token);
+        } catch (Exception e) {
+            throw new RuntimeException("登录凭证已过去,请重新登录");
+        }
+
+        return jwt.getClaims();
+    }
+}

+ 61 - 0
src/main/java/com/repair/common/utils/MimeTypeUtils.java

@@ -0,0 +1,61 @@
+package com.repair.common.utils;
+
+/**
+ * @Author: binguo
+ * @Date: 2023/7/24 星期一 17:53
+ * @Description: com.repair.common.utils
+ * @Version: 1.0
+ */
+public class MimeTypeUtils {
+    public static final String IMAGE_PNG = "image/png";
+
+    public static final String IMAGE_JPG = "image/jpg";
+
+    public static final String IMAGE_JPEG = "image/jpeg";
+
+    public static final String IMAGE_BMP = "image/bmp";
+
+    public static final String IMAGE_GIF = "image/gif";
+
+    public static final String[] IMAGE_EXTENSION = { "bmp", "gif", "jpg", "jpeg", "png" };
+
+    public static final String[] FLASH_EXTENSION = { "swf", "flv" };
+
+    public static final String[] MEDIA_EXTENSION = { "swf", "flv", "mp3", "wav", "wma", "wmv", "mid", "avi", "mpg",
+            "asf", "rm", "rmvb" };
+
+    public static final String[] VIDEO_EXTENSION = { "mp4", "avi", "rmvb" };
+
+    public static final String[] DEFAULT_ALLOWED_EXTENSION = {
+            // 图片
+//            "bmp", "gif", "jpg", "jpeg", "png",
+//            // word excel powerpoint
+//            "doc", "docx", "xls", "xlsx", "ppt", "pptx", "html", "htm", "txt",
+//            // 压缩文件
+//            "rar", "zip", "gz", "bz2",
+//            // 视频格式
+//            "mp4", "avi", "rmvb",
+//            // pdf
+//            "pdf"
+            "pdf", "bmp", "jpg", "JPEG", "png", "zip", "rar"
+    };
+
+    public static String getExtension(String prefix)
+    {
+        switch (prefix)
+        {
+            case IMAGE_PNG:
+                return "png";
+            case IMAGE_JPG:
+                return "jpg";
+            case IMAGE_JPEG:
+                return "jpeg";
+            case IMAGE_BMP:
+                return "bmp";
+            case IMAGE_GIF:
+                return "gif";
+            default:
+                return "";
+        }
+    }
+}

+ 23 - 0
src/main/java/com/repair/common/utils/MyX509TrustManager.java

@@ -0,0 +1,23 @@
+package com.repair.common.utils;
+
+import javax.net.ssl.X509TrustManager;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+
+/**
+ * X509TrustManager用于实现SSL证书的安全校验
+ * @author lujunjie
+ * @date   2018/03/01
+ */
+public class MyX509TrustManager implements X509TrustManager {
+    @Override
+    public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}
+
+    @Override
+    public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}
+
+    @Override
+    public X509Certificate[] getAcceptedIssuers() {
+        return null;
+    }
+}

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 195 - 0
src/main/java/com/repair/common/utils/RSAUtils.java


+ 42 - 0
src/main/java/com/repair/common/utils/SHA1.java

@@ -0,0 +1,42 @@
+package com.repair.common.utils;
+import java.security.MessageDigest;
+
+/**
+ * 微信SHA1算法
+ * @author lujunjie
+ * @date   2018/03/01
+ */
+public final class SHA1 {
+
+    private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
+
+    /**
+     *  将字节并格式化
+     * @param bytes 原始字节
+     * @return 格式化字节
+     */
+    private static String getFormattedText(byte[] bytes) {
+        int len = bytes.length;
+        StringBuilder buf = new StringBuilder(len * 2);
+        // 把密文转换成十六进制的字符串形式
+        for (int j = 0; j < len; j++) {
+            buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);
+            buf.append(HEX_DIGITS[bytes[j] & 0x0f]);
+        }
+        return buf.toString();
+    }
+
+    public static String encode(String str) {
+        if (str == null) {
+            return null;
+        }
+        try {
+            MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
+            messageDigest.update(str.getBytes());
+            return getFormattedText(messageDigest.digest());
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+}

+ 178 - 0
src/main/java/com/repair/common/utils/SendSms.java

@@ -0,0 +1,178 @@
+package com.repair.common.utils;
+
+import com.tencentcloudapi.common.Credential;
+import com.tencentcloudapi.common.exception.TencentCloudSDKException;
+
+//导入可选配置类
+import com.tencentcloudapi.common.profile.ClientProfile;
+import com.tencentcloudapi.common.profile.HttpProfile;
+
+// 导入对应SMS模块的client
+import com.tencentcloudapi.sms.v20210111.SmsClient;
+
+// 导入要请求接口对应的request response类
+import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest;
+import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse;
+import com.tencentcloudapi.sms.v20210111.models.SendStatus;
+import com.repair.config.SmsConfig;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * Tencent Cloud Sms Sendsms
+ */
+public class SendSms {
+
+    @Autowired
+    private static SmsConfig smsConfig;
+
+    //腾讯云上的签名
+
+    private static String secretID = "AKIDDPo13qZCZqtgJsGQL7AyYu1wc7QVMyLl";
+    //腾讯云上的密钥
+
+    private static String secretKey = "JPGrELFySiv0pOrKOPEwSnulOq9IPPDr";
+    //短信应用id
+
+    private static String sdkAppid = "1400813506";
+    //短信签名内容
+
+    private static String signName = "华仁享学教育";
+    //模板Id
+
+    private static String templateId = "1770016";
+    //验证码有效时长
+
+    private static String smsMin = "1";
+
+
+    public static SendStatus[] sendSms(String phoneNumber, String code) {
+        SendStatus[] returString = {};
+        try {
+            /* 必要步骤:
+             * 实例化一个认证对象,入参需要传入腾讯云账户密钥对secretId,secretKey。
+             * 这里采用的是从环境变量读取的方式,需要在环境变量中先设置这两个值。
+             * 你也可以直接在代码中写死密钥对,但是小心不要将代码复制、上传或者分享给他人,
+             * 以免泄露密钥对危及你的财产安全。
+             * SecretId、SecretKey 查询: https://console.cloud.tencent.com/cam/capi */
+//            Credential cred = new Credential(smsConfig.getSecretID(), smsConfig.getSecretKey());
+            Credential cred = new Credential(secretID, secretKey);
+
+            // 实例化一个http选项,可选,没有特殊需求可以跳过
+            HttpProfile httpProfile = new HttpProfile();
+            // 设置代理(无需要直接忽略)
+            // httpProfile.setProxyHost("真实代理ip");
+            // httpProfile.setProxyPort(真实代理端口);
+            /* SDK默认使用POST方法。
+             * 如果你一定要使用GET方法,可以在这里设置。GET方法无法处理一些较大的请求 */
+            httpProfile.setReqMethod("POST");
+            /* SDK有默认的超时时间,非必要请不要进行调整
+             * 如有需要请在代码中查阅以获取最新的默认值 */
+            httpProfile.setConnTimeout(60);
+            /* 指定接入地域域名,默认就近地域接入域名为 sms.tencentcloudapi.com ,也支持指定地域域名访问,例如广州地域的域名为 sms.ap-guangzhou.tencentcloudapi.com */
+            httpProfile.setEndpoint("sms.tencentcloudapi.com");
+
+            /* 非必要步骤:
+             * 实例化一个客户端配置对象,可以指定超时时间等配置 */
+            ClientProfile clientProfile = new ClientProfile();
+            /* SDK默认用TC3-HMAC-SHA256进行签名
+             * 非必要请不要修改这个字段 */
+            clientProfile.setSignMethod("HmacSHA256");
+            clientProfile.setHttpProfile(httpProfile);
+            /* 实例化要请求产品(以sms为例)的client对象
+             * 第二个参数是地域信息,可以直接填写字符串ap-guangzhou,支持的地域列表参考 https://cloud.tencent.com/document/api/382/52071#.E5.9C.B0.E5.9F.9F.E5.88.97.E8.A1.A8 */
+            SmsClient client = new SmsClient(cred, "ap-guangzhou", clientProfile);
+            /* 实例化一个请求对象,根据调用的接口和实际情况,可以进一步设置请求参数
+             * 你可以直接查询SDK源码确定接口有哪些属性可以设置
+             * 属性可能是基本类型,也可能引用了另一个数据结构
+             * 推荐使用IDE进行开发,可以方便的跳转查阅各个接口和数据结构的文档说明 */
+            SendSmsRequest req = new SendSmsRequest();
+
+            /* 填充请求参数,这里request对象的成员变量即对应接口的入参
+             * 你可以通过官网接口文档或跳转到request对象的定义处查看请求参数的定义
+             * 基本类型的设置:
+             * 帮助链接:
+             * 短信控制台: https://console.cloud.tencent.com/smsv2
+             * 腾讯云短信小助手: https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81 */
+
+            /* 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId,示例如1400006666 */
+            // 应用 ID 可前往 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 查看
+//            String sdkAppId = "1400009099";
+//            req.setSmsSdkAppId(smsConfig.getSdkAppid());
+            req.setSmsSdkAppId(sdkAppid);
+
+            /* 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名 */
+            // 签名信息可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-sign) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-sign) 的签名管理查看
+//            String signName = "腾讯云";
+//            req.setSignName(smsConfig.getSignName());
+            req.setSignName(signName);
+
+            /* 模板 ID: 必须填写已审核通过的模板 ID */
+            // 模板 ID 可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-template) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-template) 的正文模板管理查看
+//            String templateId = "449739";
+//            req.setTemplateId(smsConfig.getTemplateId());
+            req.setTemplateId(templateId);
+
+
+            /* 模板参数: 模板参数的个数需要与 TemplateId 对应模板的变量个数保持一致,若无模板参数,则设置为空 */
+//           第一个为验证码,第二个为有效时间
+//            String[] templateParamSet = {code,smsConfig.getSmsMin()};
+            String[] templateParamSet = {code, "1"};
+            req.setTemplateParamSet(templateParamSet);
+
+            /* 下发手机号码,采用 E.164 标准,+[国家或地区码][手机号]
+             * 示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号,最多不要超过200个手机号 */
+//            String[] phoneNumberSet = {"+8621212313123", "+8612345678902", "+8612345678903"};
+            String[] phoneNumbers = {phoneNumber};
+            req.setPhoneNumberSet(phoneNumbers);
+
+            /* 用户的 session 内容(无需要可忽略): 可以携带用户侧 ID 等上下文信息,server 会原样返回 */
+//            String sessionContext = "";
+//            req.setSessionContext(sessionContext);
+
+            /* 短信码号扩展号(无需要可忽略): 默认未开通,如需开通请联系 [腾讯云短信小助手] */
+//            String extendCode = "";
+//            req.setExtendCode(extendCode);
+
+            /* 国际/港澳台短信 SenderId(无需要可忽略): 国内短信填空,默认未开通,如需开通请联系 [腾讯云短信小助手] */
+//            String senderid = "";
+//            req.setSenderId(senderid);
+
+            /* 通过 client 对象调用 SendSms 方法发起请求。注意请求方法名与请求对象是对应的
+             * 返回的 res 是一个 SendSmsResponse 类的实例,与请求对象对应 */
+            SendSmsResponse res = client.SendSms(req);
+
+            // 输出json格式的字符串回包
+//            System.out.println(SendSmsResponse.toJsonString(res));
+
+            // 也可以取出单个值,你可以通过官网接口文档或跳转到response对象的定义处查看返回字段的定义
+            // System.out.println(res.getRequestId());
+
+            /* 当出现以下错误码时,快速解决方案参考
+             * [FailedOperation.SignatureIncorrectOrUnapproved](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Afailedoperation.signatureincorrectorunapproved-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F)
+             * [FailedOperation.TemplateIncorrectOrUnapproved](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Afailedoperation.templateincorrectorunapproved-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F)
+             * [UnauthorizedOperation.SmsSdkAppIdVerifyFail](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Aunauthorizedoperation.smssdkappidverifyfail-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F)
+             * [UnsupportedOperation.ContainDomesticAndInternationalPhoneNumber](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Aunsupportedoperation.containdomesticandinternationalphonenumber-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F)
+             * 更多错误,可咨询[腾讯云助手](https://tccc.qcloud.com/web/im/index.html#/chat?webAppId=8fa15978f85cb41f7e2ea36920cb3ae1&title=Sms)
+             */
+            SendStatus sendStatus = res.getSendStatusSet()[0];
+//            System.out.println("sendStatus = " + sendStatus);
+
+
+            returString = res.getSendStatusSet();
+
+        } catch (TencentCloudSDKException e) {
+            e.printStackTrace();
+        }
+        return returString;
+    }
+
+
+    public static void main(String[] args) throws TencentCloudSDKException {
+        //这里定义一个存储电话号码的数组
+
+        String tels = "+8615779633758"; // 手机号前面记得带上国家区域编码
+//        SendStatus[] test = sendSms(tels);
+
+    }
+
+}

+ 84 - 0
src/main/java/com/repair/common/utils/SeqUtils.java

@@ -0,0 +1,84 @@
+package com.repair.common.utils;
+
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * @Author: binguo
+ * @Date: 2023/7/24 星期一 17:39
+ * @Description: com.repair.common.utils
+ * @Version: 1.0
+ */
+public class SeqUtils {
+    // 通用序列类型
+    public static final String commSeqType = "COMMON";
+
+    // 上传序列类型
+    public static final String uploadSeqType = "UPLOAD";
+
+    // 通用接口序列数
+    private static AtomicInteger commSeq = new AtomicInteger(1);
+
+    // 上传接口序列数
+    private static AtomicInteger uploadSeq = new AtomicInteger(1);
+
+    // 机器标识
+    private static String machineCode = "A";
+
+    /**
+     * 获取通用序列号
+     *
+     * @return 序列值
+     */
+    public static String getId() {
+        return getId(commSeqType);
+    }
+
+    /**
+     * 默认16位序列号 yyMMddHHmmss + 一位机器标识 + 3长度循环递增字符串
+     *
+     * @return 序列值
+     */
+    public static String getId(String type) {
+        AtomicInteger atomicInt = commSeq;
+        if (uploadSeqType.equals(type)) {
+            atomicInt = uploadSeq;
+        }
+        return getId(atomicInt, 3);
+    }
+
+    /**
+     * 通用接口序列号 yyMMddHHmmss + 一位机器标识 + length长度循环递增字符串
+     *
+     * @param atomicInt 序列数
+     * @param length    数值长度
+     * @return 序列值
+     */
+    public static String getId(AtomicInteger atomicInt, int length) {
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyMMddHHmmss");
+        String result = simpleDateFormat.format(new Date());
+        result += machineCode;
+        result += getSeq(atomicInt, length);
+        return result;
+    }
+
+    /**
+     * 序列循环递增字符串[1, 10 的 (length)幂次方), 用0左补齐length位数
+     *
+     * @return 序列值
+     */
+    private synchronized static String getSeq(AtomicInteger atomicInt, int length) {
+        // 先取值再+1
+        int value = atomicInt.getAndIncrement();
+
+        // 如果更新后值>=10 的 (length)幂次方则重置为1
+        int maxSeq = (int) Math.pow(10, length);
+        if (atomicInt.get() >= maxSeq) {
+            atomicInt.set(1);
+        }
+        // 转字符串,用0左补齐
+        return String.format("%0"+length+"d", value);
+    }
+}

+ 103 - 0
src/main/java/com/repair/common/utils/StrUtils.java

@@ -0,0 +1,103 @@
+package com.repair.common.utils;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * @Author: binguo
+ * @Date: 2023/7/25 星期二 14:20
+ * @Description: com.repair.common.utils
+ * @Version: 1.0
+ */
+public class StrUtils {
+
+    public static String getRandomName(String fileName){
+        int index=fileName.lastIndexOf(".");
+        String houzhui=fileName.substring(index);//获取后缀名
+        String uuidFileName=UUID.randomUUID().toString().replace("-","")+houzhui;
+        return uuidFileName;
+    }
+
+    /**
+     * 采用URL Base64字符,即把“+/”换成“-_”
+     */
+    static private char[] alphabet = "01234567899876543210012345678998765432100123456789987654321001234".toCharArray();//"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789xyz".toCharArray();
+    /**
+     * 获取指定位数的UUID
+     * @param bits 指定位数
+     * @return
+     */
+
+    public static String getUUIDBits(int bits) {
+        UUID uuid = UUID.randomUUID();
+        long msb = uuid.getMostSignificantBits();
+        long lsb = uuid.getLeastSignificantBits();
+        char[] out = new char[24];
+        int tmp = 0, idx = 0;
+
+        // 循环写法
+        int bit = 0, bt1 = 8, bt2 = 8;
+        int mask = 0x00, offsetm = 0, offsetl = 0;
+
+        for(; bit < 16; bit += 3, idx += 4) {
+            offsetm = 64 - (bit + 3) * 8;
+            offsetl = 0;
+            tmp = 0;
+
+            if(bt1 > 3) {
+                mask = (1 << 8 * 3) - 1;
+            } else if(bt1 >= 0) {
+                mask = (1 << 8 * bt1) - 1;
+                bt2 -= 3 - bt1;
+            } else {
+                mask = (1 << 8 * ((bt2 > 3) ? 3 : bt2)) - 1;
+                bt2 -= 3;
+            }
+            if(bt1 > 0) {
+                bt1 -= 3;
+                tmp = (int) ((offsetm < 0) ? msb : (msb >>> offsetm) & mask);
+                if(bt1 < 0) {
+                    tmp <<= Math.abs(offsetm);
+                    mask = (1 << 8 * Math.abs(bt1)) - 1;
+                }
+            }
+            if(offsetm < 0) {
+                offsetl = 64 + offsetm;
+                tmp |= ((offsetl < 0) ? lsb : (lsb >>> offsetl)) & mask;
+            }
+
+            if(bit == 15) {
+                out[idx + 3] = alphabet[64];
+                out[idx + 2] = alphabet[64];
+                tmp <<= 4;
+            } else {
+                out[idx + 3] = alphabet[tmp & 0x3f];
+                tmp >>= 6;
+                out[idx + 2] = alphabet[tmp & 0x3f];
+                tmp >>= 6;
+            }
+            out[idx + 1] = alphabet[tmp & 0x3f];
+            tmp >>= 6;
+            out[idx] = alphabet[tmp & 0x3f];
+        }
+
+        return new String(out, 0, bits);
+    }
+
+    public static void main(String[] args) throws ParseException
+    {
+        List<String> data = new ArrayList<>();
+        for (int i = 0;i<10000000;i++){
+            String sss = getUUIDBits(15);
+            data.add(sss);
+        }
+
+        long allCount = data.size();
+        long disCount = data.stream().distinct().count();
+
+        Collections.sort(data);
+        String sss ="";
+
+    }
+}

+ 575 - 0
src/main/java/com/repair/common/utils/TimeExchange.java

@@ -0,0 +1,575 @@
+package com.repair.common.utils;
+
+import com.repair.model.enumModel.eWeekStatu;
+import com.repair.model.pojo.UnitTimeHelpModel;
+import com.repair.model.vo.ClassSettingDateVo;
+import org.apache.commons.lang3.time.DateFormatUtils;
+import org.apache.commons.lang3.time.DateUtils;
+
+import java.sql.Timestamp;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
+import java.util.*;
+
+/**
+ * 时间转化工具 date转为时间戳 时间戳转date 互相与String的转换
+ * 所有出现的String time 格式都必须为(yyyy-MM-dd HH:mm:ss),否则出错
+ *
+ * @author 赵仁杰
+ */
+public class TimeExchange {
+
+    /**
+     * String(yyyy-MM-dd HH:mm:ss) 转 Date
+     *
+     * @param time
+     * @return
+     * @throws ParseException
+     */
+    // String date = "2010/05/04 12:34:23";
+    public static Date StringToDate(String time, String formatDate) throws ParseException {
+
+        Date date = new Date();
+        // 注意format的格式要与日期String的格式相匹配
+        DateFormat dateFormat = new SimpleDateFormat(formatDate);
+        try {
+            date = dateFormat.parse(time);
+            System.out.println(date.toString());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return date;
+    }
+
+    /**
+     * Date转为String(yyyy-MM-dd HH:mm:ss)
+     *
+     * @param time
+     * @return
+     */
+    public static String DateToString(Date time) {
+        String dateStr = "";
+        Date date = new Date();
+        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH/mm/ss");
+        try {
+            dateStr = dateFormat.format(time);
+            System.out.println(dateStr);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return dateStr;
+    }
+
+    /**
+     * String(yyyy-MM-dd HH:mm:ss)转10位时间戳
+     *
+     * @param time
+     * @return
+     */
+    public static Integer StringToTimestamp(String time) {
+
+        int times = 0;
+        try {
+            times = (int) ((Timestamp.valueOf(time).getTime()) / 1000);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        if (times == 0) {
+            System.out.println("String转10位时间戳失败");
+        }
+        return times;
+
+    }
+
+    /**
+     * 10位int型的时间戳转换为String(yyyy-MM-dd HH:mm:ss)
+     *
+     * @param time
+     * @return
+     */
+    public static String timestampToString(Integer time) {
+        //int转long时,先进行转型再进行计算,否则会是计算结束后在转型
+        long temp = (long) time * 1000;
+        Timestamp ts = new Timestamp(temp);
+        String tsStr = "";
+        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        try {
+            //方法一
+            tsStr = dateFormat.format(ts);
+            System.out.println(tsStr);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return tsStr;
+    }
+
+    /**
+     * 10位时间戳转Date
+     *
+     * @param time
+     * @return
+     */
+    public static Date TimestampToDate(Integer time) {
+        long temp = (long) time * 1000;
+        Timestamp ts = new Timestamp(temp);
+        Date date = new Date();
+        try {
+            date = ts;
+            //System.out.println(date);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return date;
+    }
+
+    /**
+     * Date类型转换为10位时间戳
+     *
+     * @param time
+     * @return
+     */
+    public static Integer DateToTimestamp(Date time) {
+        Timestamp ts = new Timestamp(time.getTime());
+
+        return (int) ((ts.getTime()) / 1000);
+    }
+
+    // 当前时间减1小时
+    public static String TimeDesH(String time) throws ParseException {
+        Calendar nowTime2 = Calendar.getInstance();
+        nowTime2.setTime(StringToDate(time, "yyyy-MM-dd HH:mm:ss"));
+        nowTime2.add(Calendar.HOUR, -1);
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        return simpleDateFormat.format(nowTime2.getTime());
+    }
+
+
+    // 当前时间加5分钟
+    public static String TimeRangeI(String time) throws ParseException {
+        // 当前时间+5分钟
+        Date endTime = DateUtils.addMinutes(StringToDate(time, "yyyy-MM-dd HH:mm:ss"), 300);
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        return simpleDateFormat.format(endTime);
+    }
+
+    // 当前时间加2分钟
+    public static String TimeRangeI10(String time, int m) throws ParseException {
+        Calendar nowTime2 = Calendar.getInstance();
+        nowTime2.setTime(StringToDate(time, "yyyy-MM-dd HH:mm:ss"));
+        nowTime2.add(Calendar.SECOND, m);//10分钟前的时间
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        return simpleDateFormat.format(nowTime2.getTime());
+    }
+
+    // 当前时间减5分钟
+    public static String TimeRangeD(String time) throws ParseException {
+        Calendar nowTime2 = Calendar.getInstance();
+        nowTime2.setTime(StringToDate(time, "yyyy-MM-dd HH:mm:ss"));
+        nowTime2.add(Calendar.MINUTE, -300);//5分钟前的时间
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        return simpleDateFormat.format(nowTime2.getTime());
+    }
+
+    // 获取当前日期
+    public static String getDate() {
+        SimpleDateFormat sp = new SimpleDateFormat("yyyy-MM-dd");
+        return sp.format(new Date());
+    }
+
+    // 获取当前日期的年月
+    public static String getDateMonth() {
+        SimpleDateFormat sp = new SimpleDateFormat("yyyy-MM-");
+        return sp.format(new Date());
+    }
+
+
+    // 获取前天
+    public static String getQianDay() throws ParseException {
+        Calendar nowTime2 = Calendar.getInstance();
+        nowTime2.setTime(StringToDate(getTime(), "yyyy-MM-dd HH:mm:ss"));
+        nowTime2.add(Calendar.DATE, -5);//5分钟前的时间
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        return simpleDateFormat.format(nowTime2.getTime());
+    }
+
+    // 获取当前时间
+    public static String getTime() {
+        SimpleDateFormat sp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        return sp.format(new Date());
+    }
+
+    public static String getOnlyMM() {
+        SimpleDateFormat sp = new SimpleDateFormat("HH:mm");
+        return sp.format(new Date());
+    }
+
+    public static String getOnlyDesMM() throws ParseException {
+        Calendar nowTime2 = Calendar.getInstance();
+        nowTime2.setTime(StringToDate(getTime(), "yyyy-MM-dd HH:mm:ss"));
+        nowTime2.add(Calendar.MINUTE, -5);//5分钟前的时间
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm");
+        return simpleDateFormat.format(nowTime2.getTime());
+    }
+
+    public static String getYear() {
+        SimpleDateFormat sp = new SimpleDateFormat("yyyy");
+        return sp.format(new Date());
+    }
+
+    public static String getMonth() {
+        SimpleDateFormat sp = new SimpleDateFormat("yyyy-MM");
+        return sp.format(new Date());
+    }
+
+    // 获取当前时间
+    public static String getOnlyTime() {
+        SimpleDateFormat sp = new SimpleDateFormat("HH:mm:ss");
+        return sp.format(new Date());
+    }
+
+    /**
+     * 计算两个日期的时间差
+     *
+     * @param time1
+     * @param time2
+     * @return
+     */
+    public static double getTimeDifference(String time1, String time2) {
+        SimpleDateFormat timeformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        long t1 = 0L;
+        long t2 = 0L;
+        try {
+            t1 = timeformat.parse(time1).getTime();
+        } catch (ParseException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        try {
+            t2 = timeformat.parse(time2).getTime();
+        } catch (ParseException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        //因为t1-t2得到的是毫秒级,所以要初3600000得出小时.算天数或秒同理
+        double hours = (double) ((t2 - t1) / 3600000);
+        double minutes = (double) (((t2 - t1) / 1000 - hours * 3600) / 60 / 60);
+        return hours + minutes;
+    }
+
+    public static double getOnlyTimeDifference(String time1, String time2) {
+        SimpleDateFormat timeformat = new SimpleDateFormat("HH:mm:ss");
+        long t1 = 0L;
+        long t2 = 0L;
+        try {
+            t1 = timeformat.parse(time1).getTime();
+        } catch (ParseException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        try {
+            t2 = timeformat.parse(time2).getTime();
+        } catch (ParseException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        //因为t1-t2得到的是毫秒级,所以要初3600000得出小时.算天数或秒同理
+        double hours = (double) ((t2 - t1) / 3600000);
+        double minutes = (double) (((t2 - t1) / 1000 - hours * 3600) / 60 / 60);
+        return hours + minutes;
+    }
+
+    public static double getDiff(String str1, String str2) {
+        return str2.compareTo(str1);
+    }
+
+    /**
+     * 时间减去分钟数
+     *
+     * @param time      时间
+     * @param FormatStr 时间格式
+     * @param amount    要加减的时间(单位为分钟)
+     * @return
+     * @throws ParseException
+     */
+    public static String TimeRangeI(String time, int amount, String FormatStr) throws ParseException {
+        Date endTime = DateUtils.addMinutes(ShortStringToDate(time, FormatStr), amount);
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(FormatStr);
+        return simpleDateFormat.format(endTime);
+    }
+
+    /**
+     * String 转 Date
+     *
+     * @param time      时间
+     * @param formatStr 自定义时间格式
+     * @return
+     * @throws ParseException
+     */
+    public static Date ShortStringToDate(String time, String formatStr) throws ParseException {
+
+        Date date = new Date();
+        // 注意format的格式要与日期String的格式相匹配
+        DateFormat dateFormat = new SimpleDateFormat(formatStr);
+        try {
+            date = dateFormat.parse(time);
+            System.out.println(date.toString());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return date;
+    }
+
+    /**
+     * Date转为String
+     *
+     * @param time      时间
+     * @param FormatStr 自定义时间格式
+     * @return
+     */
+    public static String DateToString(Date time, String FormatStr) {
+        String dateStr = "";
+        DateFormat dateFormat = new SimpleDateFormat(FormatStr);
+        try {
+            dateStr = dateFormat.format(time);
+            System.out.println(dateStr);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return dateStr;
+    }
+
+    /**
+     * 日期路径 即年/月/日 如2018/08/08
+     */
+    public static final String datePath() {
+        Date now = new Date();
+        return DateFormatUtils.format(now, "yyyy/MM/dd");
+    }
+
+    /**
+     * 比较时间1是否小于时间2
+     * 如果时间1小于时间2,接口返回true
+     * 如果时间1大于时间2,接口返回false
+     *
+     * @param dateOne 时间1
+     * @param dateTwo 时间2
+     * @param Forma   时间格式
+     * @return
+     * @throws ParseException
+     */
+    public static boolean CompareDate(String dateOne, String dateTwo, String Forma) throws ParseException {
+        SimpleDateFormat df = new SimpleDateFormat(Forma);
+        Date sd1 = df.parse(dateOne);
+        Date sd2 = df.parse(dateTwo);
+        return sd1.before(sd2);
+    }
+
+    /**
+     * 获取一周的开始时间和结束时间
+     * 获取本周星期一作为一周的第一天的起始时间和结束时间
+     *
+     * @return 返回的数据中第一个是开始时间 第二个是结束时间
+     */
+    public static String[] getCurrentWeekTimeFrame() {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTimeZone(TimeZone.getTimeZone("GMT+8"));
+        //start of the week
+        if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
+            calendar.add(Calendar.DAY_OF_YEAR, -1);
+        }
+        calendar.add(Calendar.DAY_OF_WEEK, -(calendar.get(Calendar.DAY_OF_WEEK) - 2));
+        //给0的时候查不出数据
+//        calendar.set(Calendar.HOUR_OF_DAY, 0);
+//        calendar.set(Calendar.MINUTE, 0);
+//        calendar.set(Calendar.SECOND, 0);
+//        calendar.set(Calendar.MILLISECOND, 0);
+
+        String startTime = DateToString(calendar.getTime(), "yyyy-MM-dd");
+        //end of the week
+        calendar.add(Calendar.DAY_OF_WEEK, 6);
+        calendar.set(Calendar.HOUR_OF_DAY, 23);
+        calendar.set(Calendar.MINUTE, 59);
+        calendar.set(Calendar.SECOND, 59);
+        calendar.set(Calendar.MILLISECOND, 999);
+        String endTime = DateToString(calendar.getTime(), "yyyy-MM-dd");
+        return new String[]{startTime, endTime};
+    }
+
+    /**
+     * 获取指定月份有多少天
+     *
+     * @param month
+     * @return
+     */
+    public static int getMonthDays(String date, int month) {
+        int year = Integer.valueOf(date.substring(0, 3));
+        int[] arr = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
+        int day = arr[month - 1];//天数对应=数组-1
+        if (month == 2 && year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
+            day = 29;
+        }
+
+        return day;
+
+    }
+
+    /**
+     * 获取指定月份的第一天和最后一天
+     *
+     * @param DateStr 指定月份
+     * @return 返回的数据中第一个是开始时间 第二个是结束时间
+     */
+    public static String[] getCurrentMonthTimeFrame(String DateStr) {
+        Calendar c = Calendar.getInstance();//获取Calendar实例
+        c.set(Calendar.YEAR, Integer.parseInt(DateStr.substring(0, 4)));
+        c.set(Calendar.MONTH, Integer.parseInt(DateStr.substring(5, 7).replace("-", "")) - 1);
+
+        c.set(Calendar.DAY_OF_MONTH, 1);
+
+        String startDate = new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());
+
+        int lastDay = c.getActualMaximum(Calendar.DAY_OF_MONTH);
+        c.set(Calendar.DAY_OF_MONTH, lastDay);
+        String endDate = new SimpleDateFormat("yyyy-MM-dd").format(c.getTime()) + " 23:59:59";
+
+        return new String[]{startDate, endDate};
+    }
+
+    //region 获取某一天的开始时间
+    public static String getStartOfDayStr(Date date) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        int year = calendar.get(Calendar.YEAR);
+        int month = calendar.get(Calendar.MONTH);
+        int day = calendar.get(Calendar.DATE);
+        calendar.setTimeInMillis(0);
+        calendar.set(year, month, day, 0, 0, 0);
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime());
+    }
+    //endregion
+
+    //region 获取某一天的结束时间
+    public static String getEndOfDayStr(Date date) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        int year = calendar.get(Calendar.YEAR);
+        int month = calendar.get(Calendar.MONTH);
+        int day = calendar.get(Calendar.DATE);
+        calendar.setTimeInMillis(0);
+        calendar.set(year, month, day, 23, 59, 59);
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime());
+    }
+    //endregion
+
+    //region 获取指定月份的最后一天
+    public static Date getToMonthEndDate(String DateStr) {
+        Calendar c = Calendar.getInstance();
+        c.clear();
+        c.set(Calendar.YEAR, Integer.parseInt(DateStr.substring(0, 4)));
+        c.set(Calendar.MONTH, Integer.parseInt(DateStr.substring(5, 7).replace("-", "")) - 1);
+        c.roll(Calendar.DAY_OF_MONTH, -1);
+        c.set(Calendar.HOUR_OF_DAY, 23);
+        c.set(Calendar.MINUTE, 59);
+        c.set(Calendar.SECOND, 59);
+        c.set(Calendar.MILLISECOND, 999);
+
+        return c.getTime();
+    }
+    //endregion
+
+    //region 获取指定月份的第一天
+    public static Date getToMonthBeginDate(String DateStr) {
+        Calendar c = Calendar.getInstance();
+        c.clear();
+        c.set(Calendar.YEAR, Integer.parseInt(DateStr.substring(0, 4)));
+        c.set(Calendar.MONTH, Integer.parseInt(DateStr.substring(5, 7).replace("-", "")) - 1);
+        c.set(Calendar.HOUR_OF_DAY, 0);
+        c.set(Calendar.MINUTE, 0);
+        c.set(Calendar.SECOND, 0);
+        c.set(Calendar.MILLISECOND, 000);
+        return c.getTime();
+    }
+    //endregion
+
+    //region 获取某一天的开始时间
+    public static Date getStartOfDay(Date date) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        int year = calendar.get(Calendar.YEAR);
+        int month = calendar.get(Calendar.MONTH);
+        int day = calendar.get(Calendar.DATE);
+        calendar.set(year, month, day, 0, 0, 0);
+        calendar.set(Calendar.MILLISECOND, 000);
+        return calendar.getTime();
+    }
+    //endregion
+
+    //region 获取某一天的结束时间
+    public static Date getEndOfDay(Date date) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        int year = calendar.get(Calendar.YEAR);
+        int month = calendar.get(Calendar.MONTH);
+        int day = calendar.get(Calendar.DATE);
+        calendar.setTimeInMillis(0);
+        calendar.set(year, month, day, 23, 59, 59);
+        return calendar.getTime();
+    }
+    //endregion
+
+    public static List<UnitTimeHelpModel> MonthArrayTime(Date StartDate, Date EndDate) {
+
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//格式化为年月
+        Calendar StartTime = Calendar.getInstance();
+        StartTime.setTime(StartDate);
+        StartTime.set(StartTime.get(Calendar.YEAR), StartTime.get(Calendar.MONTH), StartTime.get(Calendar.DATE));
+        Calendar EndTime = Calendar.getInstance();
+        EndTime.setTime(EndDate);
+        EndTime.set(EndTime.get(Calendar.YEAR), EndTime.get(Calendar.MONTH), EndTime.get(Calendar.DATE));
+        int total = (EndTime.get(Calendar.YEAR) - StartTime.get(Calendar.YEAR)) * 12 + (EndTime.get(Calendar.MONTH) - StartTime.get(Calendar.MONTH));
+        List<UnitTimeHelpModel> result = new ArrayList() {
+        };
+        for (int i = 0; i <= total; i++) {
+            StartTime.add(Calendar.MONTH, i == 0 ? 0 : 1);
+            Date MonthLastDay = getToMonthEndDate(sdf.format(StartTime.getTime()));
+            UnitTimeHelpModel data = new UnitTimeHelpModel();
+            data.setStartDate(i == 0 ? StartTime.getTime() : getStartOfDay(getToMonthBeginDate(sdf.format(StartTime.getTime()))));
+            data.setEndDate(EndTime.getTime().before(MonthLastDay) ? getEndOfDay(EndTime.getTime()) : MonthLastDay);
+            result.add(data);
+        }
+
+        return result;
+    }
+
+    public static List<ClassSettingDateVo> getDatesBetween(LocalDate startDate, LocalDate endDate) {
+        List<ClassSettingDateVo> datas = new ArrayList<>();
+        long numOfDaysBetween = ChronoUnit.DAYS.between(startDate, endDate);
+        for (int i = 0; i <= numOfDaysBetween; i++) {
+            ClassSettingDateVo data = new ClassSettingDateVo();
+            LocalDate date = startDate.plusDays(i);
+            // 获取当前日期对应的星期几
+            DayOfWeek dow = date.getDayOfWeek();
+            int dayOfWeek = dow.getValue(); // 获取星期几的数字表示,1表示周一,7表示周日
+            data.setWeekStr(eWeekStatu.stringOf(dayOfWeek));
+            data.setWeek(dayOfWeek);
+            data.setDateStr(date.toString());
+            datas.add(data);
+        }
+        return datas;
+    }
+
+    public static void main(String[] args) throws ParseException {
+        LocalDate StartDate = LocalDate.parse("2023-07-02", DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        LocalDate EndDate = LocalDate.parse("2023-08-02", DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        List<ClassSettingDateVo> datas = getDatesBetween(StartDate, EndDate);
+        String sss = "";
+    }
+}
+

+ 25 - 0
src/main/java/com/repair/common/utils/ValidateCode.java

@@ -0,0 +1,25 @@
+package com.repair.common.utils;
+
+import java.util.Random;
+
+//验证码随机数
+public  class  ValidateCode {
+
+   public static Integer generateValidateCode(int length){
+       Integer code =null;
+       if(length == 4){
+           code = new Random().nextInt(9999);//生成随机数,最大为9999
+           if(code < 1000){
+               code = code + 1000;//保证随机数为4位数字
+           }
+       }else if(length == 6){
+           code = new Random().nextInt(999999);//生成随机数,最大为999999
+           if(code < 100000){
+               code = code + 100000;//保证随机数为6位数字
+           }
+       }else{
+           throw new RuntimeException("只能生成4位或6位数字验证码");
+       }
+       return code;
+   }
+}

+ 53 - 0
src/main/java/com/repair/common/utils/WxConstants.java

@@ -0,0 +1,53 @@
+package com.repair.common.utils;
+
+/**
+ * 微信公众号常量类
+ * @author lujunjie
+ * @date   2018/06/28
+ */
+public class WxConstants {
+
+    /**
+     * 默认编码
+     */
+    public static final String DEFAULT_CHARSET = "UTF-8";
+
+    /**
+     * 统一下单-扫描支付
+     */
+    public static String PAY_UNIFIEDORDER = "https://app.dev.9kbs.com/shopOpenApi/services/deviceAntiScode/getStartCode";
+
+    public static String Test = "http://localhost:8088/HotWaters/userget_stu.action";
+
+    public static String Test2 = "http://localhost:8088/HotWaters/userstu_info.action";
+
+    /**
+     * 请求成功返回码
+     */
+    public final static String ERRCODE_OK_CODE = "0";
+    /**
+     * 错误的返回码的Key
+     */
+    public final static String ERRCODE = "errcode";
+
+    /**
+     * 返回状态码
+     */
+    public final static String RETURN_CODE= "return_code";
+
+    /**
+     * access_token 字符串
+     */
+    public final static String ACCESS_TOKEN = "access_token";
+
+    /**
+     * 签名类型 MD5
+     */
+    public final static String SING_MD5 = "MD5";
+
+    /**
+     * 签名类型 HMAC-SHA256
+     */
+    public final static String SING_HMACSHA256 = "HMAC-SHA256";
+
+}

+ 379 - 0
src/main/java/com/repair/common/utils/WxUtil.java

@@ -0,0 +1,379 @@
+package com.repair.common.utils;
+
+import com.repair.config.WxOpenidConfig;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import java.io.*;
+import java.security.MessageDigest;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 微信公众号接口工具类
+ * @author lujunjie
+ * @date   2018/03/01
+ */
+public class WxUtil {
+
+	@Autowired
+	private static WxOpenidConfig wxOpenidConfig;
+
+	/**
+	 * 加密/校验流程如下:
+	 * 1. 将token、timestamp、nonce三个参数进行字典序排序<br>
+	 * 2. 将三个参数字符串拼接成一个字符串进行sha1加密<br>
+	 * 3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信<br>
+	 *
+	 * @param token Token验证密钥
+	 * @param signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数,nonce参数
+	 * @param timestamp 时间戳
+	 * @param nonce 随机数
+	 * @return 验证成功返回:true,失败返回:false
+	 */
+	public static boolean checkSignature(String token, String signature, String timestamp, String nonce) {
+		List<String> params = new ArrayList<String>();
+		params.add(token);
+		params.add(timestamp);
+		params.add(nonce);
+		//1. 将token、timestamp、nonce三个参数进行字典序排序
+		Collections.sort(params, new Comparator<String>() {
+			@Override
+			public int compare(String o1, String o2) {
+				return o1.compareTo(o2);
+			}
+		});
+		//2. 将三个参数字符串拼接成一个字符串进行sha1加密
+		String temp = SHA1.encode(params.get(0) + params.get(1) + params.get(2));
+		//3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
+		return temp.equals(signature);
+	}
+
+	/**
+	 * 输入流转化为字符串
+	 * @param inputStream 流
+	 * @return String 字符串
+	 * @throws Exception
+	 */
+	public static String getStreamString(InputStream inputStream) throws Exception{
+		StringBuffer buffer=new StringBuffer();
+		InputStreamReader inputStreamReader = null;
+		BufferedReader bufferedReader = null;
+		try{
+			inputStreamReader=new InputStreamReader(inputStream, WxConstants.DEFAULT_CHARSET);
+			bufferedReader=new BufferedReader(inputStreamReader);
+			String line;
+			while((line=bufferedReader.readLine())!=null){
+				buffer.append(line);
+			}
+		}catch(Exception e){
+			throw new Exception();
+		}finally {
+			if(bufferedReader != null){
+				bufferedReader.close();
+			}
+			if(inputStreamReader != null){
+				inputStreamReader.close();
+			}
+			if(inputStream != null){
+				inputStream.close();
+			}
+		}
+		return buffer.toString();
+	}
+
+	/**
+	 * 获取随机字符串 Nonce Str
+	 * @return String 随机字符串
+	 */
+	public static String getNonceStr() {
+		return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 32);
+	}
+
+	/**
+	 * 生成签名. 注意,若含有sign_type字段,必须和signType参数保持一致。
+	 * @param data 待签名数据
+	 * @param apikey API密钥
+	 * @return 签名
+	 */
+	public static String getSignature(final Map<String, String> data, String apikey,
+				String signType) throws Exception {
+		Set<String> keySet = data.keySet();
+		String[] keyArray = keySet.toArray(new String[keySet.size()]);
+		Arrays.sort(keyArray);
+		StringBuilder sb = new StringBuilder();
+		sb.append(apikey);
+		sb.append("amount10apicodeCS0001collect_code");
+		sb.append(data.get("collect_code").trim());
+		sb.append("order_no");
+		sb.append(data.get("order_no").trim());
+        sb.append("timestamp");
+        sb.append(data.get("timestamp").trim());
+        sb.append(apikey);
+		System.out.println(sb);
+		if (signType.equals(WxConstants.SING_MD5)) {
+			System.out.println(MD5(sb.toString()).toUpperCase());
+			return MD5(sb.toString()).toLowerCase();
+		}
+		else if (signType.equals(WxConstants.SING_HMACSHA256)) {
+			return HMACSHA256(sb.toString(), apikey);
+		}
+		else {
+			throw new Exception(String.format("Invalid sign_type: %s", signType));
+		}
+	}
+
+	/**
+	 * 生成 MD5
+	 * @param data 待处理数据
+	 * @return MD5结果
+	 */
+	public static String MD5(String data) throws Exception {
+		MessageDigest md = MessageDigest.getInstance("MD5");
+		byte[] array = md.digest(data.getBytes("UTF-8"));
+		StringBuilder sb = new StringBuilder();
+		for (byte item : array) {
+			sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
+		}
+		return sb.toString().toUpperCase();
+	}
+
+	/**
+	 * 生成 HMACSHA256
+	 * @param data 待处理数据
+	 * @param key 密钥
+	 * @return 加密结果
+	 * @throws Exception
+	 */
+	public static String HMACSHA256(String data, String key) throws Exception {
+		Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
+		SecretKeySpec secret_key = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256");
+		sha256_HMAC.init(secret_key);
+		byte[] array = sha256_HMAC.doFinal(data.getBytes("UTF-8"));
+		StringBuilder sb = new StringBuilder();
+		for (byte item : array) {
+			sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
+		}
+		return sb.toString().toUpperCase();
+	}
+
+	/**
+	 * @param data Map类型数据
+	 * @return XML格式的字符串
+	 * @throws Exception
+	 */
+	public static String mapToXml(Map<String, String> data) throws Exception {
+		DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
+		DocumentBuilder documentBuilder= documentBuilderFactory.newDocumentBuilder();
+		org.w3c.dom.Document document = documentBuilder.newDocument();
+		org.w3c.dom.Element root = document.createElement("xml");
+		document.appendChild(root);
+		for (String key: data.keySet()) {
+			String value = data.get(key);
+			if (value == null) {
+				value = "";
+			}
+			value = value.trim();
+			org.w3c.dom.Element filed = document.createElement(key);
+			filed.appendChild(document.createTextNode(value));
+			root.appendChild(filed);
+		}
+		TransformerFactory tf = TransformerFactory.newInstance();
+		Transformer transformer = tf.newTransformer();
+		DOMSource source = new DOMSource(document);
+		transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
+		transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+		StringWriter writer = new StringWriter();
+		StreamResult result = new StreamResult(writer);
+		transformer.transform(source, result);
+		String output = writer.getBuffer().toString(); //.replaceAll("\n|\r", "");
+		try {
+			writer.close();
+		}
+		catch (Exception ex) {
+		}
+		return output;
+	}
+
+	/**
+	 * 处理 HTTPS API返回数据,转换成Map对象。return_code为SUCCESS时,验证签名。
+	 * @param xmlStr API返回的XML格式数据
+	 * @return Map类型数据
+	 * @throws Exception
+	 */
+	public static Map<String, String> processResponseXml(String xmlStr,String signType) throws Exception {
+		String RETURN_CODE = WxConstants.RETURN_CODE;
+		String return_code;
+		Map<String, String> respData = xmlToMap(xmlStr);
+		if (respData.containsKey(RETURN_CODE)) {
+			return_code = respData.get(RETURN_CODE);
+		}
+		else {
+			throw new Exception(String.format("No `return_code` in XML: %s", xmlStr));
+		}
+
+		if (return_code.equals("FAIL")) {
+			return respData;
+		}
+		else if (return_code.equals("SUCCESS")) {
+			if (isResponseSignatureValid(respData,signType)) {
+				return respData;
+			}
+			else {
+				throw new Exception(String.format("Invalid sign value in XML: %s", xmlStr));
+			}
+		}
+		else {
+			throw new Exception(String.format("return_code value %s is invalid in XML: %s", return_code, xmlStr));
+		}
+	}
+
+
+	/**
+	 * XML格式字符串转换为Map
+	 * @param strXML XML字符串
+	 * @return XML数据转换后的Map
+	 * @throws Exception
+	 */
+	public static Map<String, String> xmlToMap(String strXML) throws Exception {
+		try {
+			Map<String, String> data = new HashMap<String, String>();
+			DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
+
+			String FEATURE = "http://apache.org/xml/features/disallow-doctype-decl";
+			documentBuilderFactory.setFeature(FEATURE, true);
+
+			FEATURE = "http://xml.org/sax/features/external-general-entities";
+			documentBuilderFactory.setFeature(FEATURE, false);
+
+			FEATURE = "http://xml.org/sax/features/external-parameter-entities";
+			documentBuilderFactory.setFeature(FEATURE, false);
+
+			FEATURE = "http://apache.org/xml/features/nonvalidating/load-external-dtd";
+			documentBuilderFactory.setFeature(FEATURE, false);
+
+			documentBuilderFactory.setXIncludeAware(false);
+			documentBuilderFactory.setExpandEntityReferences(false);
+			DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
+			InputStream stream = new ByteArrayInputStream(strXML.getBytes("UTF-8"));
+			org.w3c.dom.Document doc = documentBuilder.parse(stream);
+			doc.getDocumentElement().normalize();
+			NodeList nodeList = doc.getDocumentElement().getChildNodes();
+			for (int idx = 0; idx < nodeList.getLength(); ++idx) {
+				Node node = nodeList.item(idx);
+				if (node.getNodeType() == Node.ELEMENT_NODE) {
+					org.w3c.dom.Element element = (org.w3c.dom.Element) node;
+					data.put(element.getNodeName(), element.getTextContent());
+				}
+			}
+			try {
+				stream.close();
+			} catch (Exception ex) {
+				// do nothing
+			}
+			return data;
+		} catch (Exception ex) {
+			throw ex;
+		}
+	}
+
+	/**
+	 * 判断xml数据的sign是否有效,必须包含sign字段,否则返回false。
+	 * @param reqData 向wxpay post的请求数据
+	 * @return 签名是否有效
+	 * @throws Exception
+	 */
+	private static boolean isResponseSignatureValid(final Map<String, String> reqData,String signType) throws Exception {
+		// 返回数据的签名方式和请求中给定的签名方式是一致的
+		return isSignatureValid(reqData,wxOpenidConfig.getAppkey(),signType);
+	}
+
+	/**
+	 * 判断签名是否正确,必须包含sign字段,否则返回false。
+	 * @param data Map类型数据
+	 * @param key API密钥
+	 * @param signType 签名方式
+	 * @return 签名是否正确
+	 * @throws Exception
+	 */
+	public static boolean isSignatureValid(Map<String, String> data, String key, String signType) throws Exception {
+		if (!data.containsKey("sign")) {
+			return false;
+		}
+		String sign = data.get("sign");
+		return getSignature(data, key, signType).equals(sign);
+	}
+
+//	/**
+//	 * 生成支付二维码
+//	 * @param response 响应
+//	 * @param contents url链接
+//	 * @throws Exception
+//	 */
+//	public static void writerPayImage(HttpServletResponse response, String contents) throws Exception{
+//		ServletOutputStream out = response.getOutputStream();
+//		try {
+//			Map<EncodeHintType,Object> hints = new HashMap<EncodeHintType,Object>();
+//			hints.put(EncodeHintType.CHARACTER_SET,"UTF-8");
+//			hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
+//			hints.put(EncodeHintType.MARGIN, 0);
+//			BitMatrix bitMatrix = new MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE,300,300,hints);
+//			MatrixToImageWriter.writeToStream(bitMatrix,"jpg",out);
+//		}catch (Exception e){
+//			throw new Exception("生成二维码失败!");
+//		}finally {
+//			if(out != null){
+//				out.flush();
+//				out.close();
+//			}
+//		}
+//	}
+
+	/**
+	 * 生成商户订单号
+	 * @return String
+	 */
+	public static String mchOrderNo(){
+		SimpleDateFormat sdf = new SimpleDateFormat("yyMMddHHmmss");
+		String date = sdf.format(new Date());
+
+		Random random = new Random();
+		String fourRandom = String.valueOf(random.nextInt(10000));
+		int randLength = fourRandom.length();
+		//不足4位继续补充
+		if(randLength<4){
+			for(int remain = 1; remain <= 4 - randLength; remain ++ ){
+				fourRandom += random.nextInt(10)  ;
+			}
+		}
+		return date+fourRandom;
+	}
+
+	/**
+	 * 返回信息给微信
+	 * @param response
+	 * @param content 内容
+	 * @throws Exception
+	 */
+	public static void responsePrint(HttpServletResponse response, String content) throws Exception{
+		response.setCharacterEncoding("UTF-8");
+		response.setContentType("text/xml");
+		response.getWriter().print(content);
+		response.getWriter().flush();
+		response.getWriter().close();
+	}
+
+
+}

+ 27 - 0
src/main/java/com/repair/common/utils/paramUtils.java

@@ -0,0 +1,27 @@
+package com.repair.common.utils;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.ObjectError;
+
+import java.util.List;
+
+/**
+ * @Author: binguo
+ * @Date: 2023/7/5 星期三 16:11
+ * @Description: com.template.utils
+ * @Version: 1.0
+ */
+@Slf4j
+public class paramUtils {
+    public static String getParamError(BindingResult bindingResult) {
+        //有校验没通过
+        List<ObjectError> errorList = bindingResult.getAllErrors();
+        StringBuilder st = new StringBuilder();
+        for (ObjectError error : errorList) {
+            st.append(error.getDefaultMessage() + "! ");//输出具体的错误信息
+        }
+
+        return st.toString();
+    }
+}

+ 25 - 0
src/main/java/com/repair/common/utils/smsUtil.java

@@ -0,0 +1,25 @@
+package com.repair.common.utils;
+
+/**
+ * @Author: binguo
+ * @Date: 2023/4/20 星期四 8:26
+ * @Description: common
+ * @Version: 1.0
+ */
+public class smsUtil {
+//    @Autowired
+//    private static smsConfig smsConfig;
+//
+//    /**
+//     * 发送单条短信验证码
+//     * @param smmCode 短信验证码
+//     * @param phoneNumber 手机号
+//     * @return
+//     */
+//    public static void sendSingleMessage(String smmCode, String phoneNumber) throws HTTPException, IOException {
+//        String[] params = {smmCode,Integer.toString(smsConfig.getSmsMin())};
+//        SmsSingleSender ssender = new SmsSingleSender(smsConfig.getSdkAppid(), smsConfig.getAppKey());
+//        SmsSingleSenderResult result = ssender.sendWithParam("86", phoneNumber, smsConfig.getTemplateId(), params, smsConfig.getSmsSign(), "", "");
+//        System.out.println(result);
+//    };
+}

+ 52 - 0
src/main/java/com/repair/config/MyBatisPlusConfig.java

@@ -0,0 +1,52 @@
+package com.repair.config;
+
+import com.baomidou.mybatisplus.core.injector.ISqlInjector;
+import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
+import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+// 扫描我们的 mapper 文件夹
+@MapperScan("com.repair.mapper")
+@EnableTransactionManagement
+@Configuration // 配置类
+public class MyBatisPlusConfig {
+
+    // 注册乐观锁插件
+    @Bean
+    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
+        return new OptimisticLockerInterceptor();
+    }
+
+    // 分页插件
+    @Bean
+    public PaginationInterceptor paginationInterceptor() {
+        return  new PaginationInterceptor();
+    }
+
+    // 逻辑删除组件!
+    @Bean
+    public ISqlInjector sqlInjector() {
+        return new LogicSqlInjector();
+    }
+
+
+    /**
+     * SQL执行效率插件
+     * 在控制台显示sql语句
+     */
+    @Bean
+    @Profile({"dev","test"})// 设置 dev test 环境开启,保证我们的效率
+    public PerformanceInterceptor performanceInterceptor() {
+        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
+        performanceInterceptor.setMaxTime(3000); //ms 设置sql执行的最大时间,如果超过了则不执行
+        performanceInterceptor.setFormat(true);
+        return performanceInterceptor;
+    }
+
+}

+ 37 - 0
src/main/java/com/repair/config/MySecurity.java

@@ -0,0 +1,37 @@
+package com.repair.config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+@Component
+//@ConfigurationProperties(prefix = "my-security")
+public class MySecurity {
+    @Value("${my-security.privateKey}")
+    public String privateKey;
+    @Value("${my-security.publicKey}")
+    public String publicKey;
+
+    public String getPrivateKey() {
+        return privateKey;
+    }
+
+    public String getPublicKey() {
+        return publicKey;
+    }
+
+    @Override
+    public String toString() {
+        return "MySecurity{" +
+                "privateKey='" + privateKey + '\'' +
+                ", publicKey='" + publicKey + '\'' +
+                '}';
+    }
+
+    public void setPrivateKey(String privateKey) {
+        this.privateKey = privateKey;
+    }
+
+    public void setPublicKey(String publicKey) {
+        this.publicKey = publicKey;
+    }
+}

+ 36 - 0
src/main/java/com/repair/config/SmsConfig.java

@@ -0,0 +1,36 @@
+package com.repair.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Author: binguo
+ * @Date: 2023/4/20 星期四 8:29
+ * @Description: com.video.config
+ * @Version: 1.0
+ */
+
+@Component
+@ConfigurationProperties(prefix = "tencentcloud")
+@Data
+public class SmsConfig {
+    //腾讯云上的签名
+
+    private String secretID;
+    //腾讯云上的密钥
+
+    private String secretKey;
+    //短信应用id
+
+    private String sdkAppid;
+    //短信签名内容
+
+    private String signName;
+    //模板Id
+
+    private String templateId;
+    //验证码有效时长
+
+    private String smsMin;
+}

+ 27 - 0
src/main/java/com/repair/config/WxOpenidConfig.java

@@ -0,0 +1,27 @@
+package com.repair.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Author: binguo
+ * @Date: 2023/7/11 星期二 11:36
+ * @Description: com.repair.config
+ * @Version: 1.0
+ */
+@Component
+@ConfigurationProperties(prefix = "openid")
+@Data
+public class WxOpenidConfig {
+    //appid
+    private String appid;
+
+    //appkey
+    private String appkey;
+
+    //granttype
+    private String granttype;
+
+    private String ipconfig;
+}

+ 356 - 0
src/main/java/com/repair/controller/LoginController.java

@@ -0,0 +1,356 @@
+package com.repair.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+import com.repair.annotation.PassToken;
+import com.repair.api.LoginControllerAPI;
+import com.repair.common.utils.HttpsClient;
+import com.repair.config.WxOpenidConfig;
+import com.repair.model.enumModel.eSchool;
+import com.repair.model.enumModel.eStatu;
+import com.repair.model.enumModel.eUserZZ;
+import com.repair.model.pojo.RepairAdmin;
+import com.repair.model.pojo.RepairUser;
+import com.repair.model.request.changePasswordRequest;
+import com.repair.model.request.loginRequest;
+import com.repair.model.result.CommonResult;
+import com.repair.model.result.Wx_user;
+import com.repair.model.vo.LoginVo;
+import com.repair.model.vo.routeDataVo;
+import com.repair.model.vo.wxLoginVo;
+import com.repair.services.RepairAdminService;
+import com.repair.common.utils.AesUtils;
+import com.repair.common.utils.paramUtils;
+import com.repair.common.utils.JWTUtil;
+import com.repair.services.RepairUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.client.RestTemplate;
+
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Author: binguo
+ * @Date: 2023/7/5 星期三 9:28
+ * @Description: com.template.controller
+ * @Version: 1.0
+ */
+@RestController
+public class LoginController implements LoginControllerAPI {
+
+    @Autowired
+    private RepairAdminService repairAdminService;
+    @Autowired
+    private RepairUserService repairUserService;
+    @Autowired
+    private WxOpenidConfig wxOpenidConfig;
+
+
+    /**
+     * 查看系统版本号
+     *
+     * @return
+     */
+    @Override
+    @PassToken
+    public CommonResult queryReduce() {
+        return CommonResult.ok("ip地址为"+wxOpenidConfig.getIpconfig()+"的系统版本为:1V");
+    }
+
+    /**
+     * 注册接口
+     *
+     * @param registerdo account 账号
+     *                   password 密码
+     *                   username 昵称
+     *                   phone 手机号
+     * @return
+     */
+    @Override
+    @PassToken
+    public CommonResult Register(@RequestBody RepairAdmin registerdo, BindingResult bindingResult) {
+
+        if (registerdo == null) {
+            return CommonResult.fail("请传递参数");
+        }
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        RepairAdmin data = repairAdminService.getRepairByAccount(registerdo.getAccount());
+        if (data != null) {
+            return CommonResult.fail("该账号已存在!");
+        }
+
+        int result = repairAdminService.insertRepairAdmin(registerdo);
+
+        if (result > 0) {
+            return CommonResult.ok("注册成功!");
+        }
+        return CommonResult.fail("注册失败!");
+    }
+
+    /**
+     * 登录接口
+     *
+     * @param loginRequest account 账号
+     *                     password 密码
+     * @return
+     */
+    @Override
+    @PassToken
+    public CommonResult Login(@RequestBody loginRequest loginRequest, BindingResult bindingResult) {
+        if (loginRequest == null) {
+            return CommonResult.fail("请传递参数");
+        }
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        RepairAdmin result = repairAdminService.getRepairByAccount(loginRequest.getAccount());
+        if (result == null) {
+            return CommonResult.fail("账号或密码错误");
+        }
+
+        if (result.getStatu().equals(eStatu.Freeze.getValue())) {
+            return CommonResult.fail("该账号已被冻结");
+        }
+
+        String encPassword = AesUtils.encrypt(loginRequest.getPassword());
+        if (!encPassword.equals(result.getPassword())) {
+            return CommonResult.fail("密码错误");
+        }
+
+        String token = JWTUtil.getToken(result, null);
+        LoginVo login = new LoginVo();
+        login.setToken(token);
+        login.setTokenTtl(JWTUtil.getExpired());
+        login.setUserName(result.getUsername());
+        login.setUserhead(AesUtils.encrypt(result.getId()));
+
+        //要在账户表中添加一条对应的数据
+
+        return CommonResult.ok("登录成功", login);
+    }
+
+    /**
+     * 修改密码
+     *
+     * @param cpr           oldPassword 旧密码
+     *                      newPassword 新密码
+     *                      confirmPassword 确认密码
+     * @param userhead
+     * @param bindingResult
+     * @return
+     */
+    @Override
+    public CommonResult ChangePassword(changePasswordRequest cpr, @RequestHeader("user_head") String userhead, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        if (!cpr.getNewPassword().equals(cpr.getConfirmPassword())) {
+            return CommonResult.fail("确认密码和新密码不一致!");
+        }
+
+        String userID = AesUtils.decrypt(userhead);
+        RepairAdmin operateData = repairAdminService.getRepairById(userID);
+        if (operateData == null) {
+            return CommonResult.fail("当前账号不合法!");
+        }
+
+        if (operateData.getStatu() == eStatu.Freeze.getValue()) {
+            return CommonResult.fail("该账号已被冻结");
+        }
+
+        if (!AesUtils.encrypt(cpr.getOldPassword()).equals(operateData.getPassword())) {
+            return CommonResult.fail("原密码错误!");
+        }
+
+        RepairAdmin ra = new RepairAdmin();
+        ra.setId(userID);
+        ra.setPassword(AesUtils.encrypt(cpr.getNewPassword()));
+        int result = repairAdminService.updateRepairAdmin(ra);
+
+        return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
+    }
+
+    @Override
+    @PassToken
+    public CommonResult Openid(String wxcode) throws JsonProcessingException {
+        Gson gson = new Gson();
+        String tokenUrl = "https://open.wecard.qq.com/connect/oauth2/token";
+        Map<String, String> tokenParams = new HashMap<>();
+        String url = "mnp://wxd6f090391d410534";
+        tokenParams.put("wxcode", wxcode);
+        tokenParams.put("app_key", wxOpenidConfig.getAppid());
+        tokenParams.put("app_secret", wxOpenidConfig.getAppkey());
+        tokenParams.put("grant_type", wxOpenidConfig.getGranttype());
+        tokenParams.put("redirect_uri", url); // 小程序为 mnp:// + 小程序app id
+
+        // wecode换取token
+        String respon = HttpsClient.post(tokenUrl, tokenParams);
+        HashMap<String, Object> tokenMap = gson.fromJson(respon, new TypeToken<HashMap<String, Object>>() {
+        }.getType());
+        String accessToken = (String) tokenMap.get("access_token");
+        // token换取用户信息
+        String userInfoUrl = "https://open.wecard.qq.com/connect/oauth/get-user-info";
+        Map<String, String> userInfoParam = new HashMap<>();
+        userInfoParam.put("access_token", accessToken);
+        String userinfo = HttpsClient.post(userInfoUrl, userInfoParam);
+        String card_number = null;
+        String user_name = null;
+        String phone = null;
+        int identity_type = 0;
+        String campus = null;
+        Wx_user userinfos = gson.fromJson(userinfo, new TypeToken<Wx_user>() {
+        }.getType());
+        System.out.println(userinfo);
+        System.out.println(userinfos.getIdentity_type());
+        try {
+            card_number = userinfos.getCard_number();
+            user_name = userinfos.getName();
+            phone = userinfos.getTelephone();
+            identity_type = userinfos.getIdentity_type();
+            campus = userinfos.getCampus();
+
+        } catch (Exception e) {
+            return CommonResult.fail(e.getMessage());
+        }
+
+        if(card_number == null || card_number.equals("")){
+            return CommonResult.fail("卡号为空,授权失败");
+        }
+        //根据卡号查询repair_user表中的用户信息
+        RepairUser user = repairUserService.getRepairByCardNumber(card_number);
+        if(identity_type != 4 && user == null){
+            return CommonResult.fail("非法权限,授权失败");
+        }
+
+        if(user == null){
+            user = new RepairUser();
+            user.setCardNumber(card_number);
+            user.setUserName(user_name);
+            user.setUserPhone(phone);
+            user.setUserZzid(eUserZZ.User.getValue());
+            user.setIdentityType(identity_type);
+            user.setSchoolId(eSchool.integerOf(campus));//校区ID
+            user.setIsChange(0);
+            int num = repairUserService.insertRepairUser(user);
+            if(num <= 0){
+                return CommonResult.fail("无法记录用户信息,授权失败");
+            }
+            RepairAdmin admin = new RepairAdmin();
+            admin.setAccount(card_number);
+            admin.setPassword("974264710");
+            admin.setUsername(user_name);
+            admin.setPhone(phone);
+            admin.setIsSuper(0);
+            admin.setStatu(1);
+            admin.setIsMobile(1);
+            int adminNum = repairAdminService.insertRepairAdmin(admin);
+            if(adminNum <= 0){
+                return CommonResult.fail("无法记录账号信息,授权失败");
+            }
+        }
+
+        RepairAdmin adminData = repairAdminService.getRepairByAccount(card_number);
+
+        wxLoginVo wlv = new wxLoginVo();
+        routeDataVo data = getRoutes(user.getUserZzid());
+        wlv.setUserId(user.getId());
+        wlv.setRoutes(data == null ? new ArrayList<>() :data.getRoutes());
+        wlv.setBtns(data == null ? new ArrayList<>() :data.getBtns());
+        wlv.setUserName(user.getUserName());
+        wlv.setUserZZid(user.getUserZzid());
+        wlv.setUserZZName(eUserZZ.stringOf(user.getUserZzid()));
+        wlv.setSchoolId(user.getSchoolId());
+        wlv.setSchoolName(eSchool.stringOf(user.getSchoolId()));
+        long expired = 1000 * 60 * 60 * 24 * 365 * 10;
+        String token = JWTUtil.getToken(adminData, expired);
+        wlv.setToken(token);
+        wlv.setUserhead(AesUtils.encrypt(adminData.getId()));
+
+        return CommonResult.ok(wlv);
+    }
+
+    public routeDataVo getRoutes(Integer userZZid){
+        routeDataVo result = new routeDataVo();
+        List<String> routes = new ArrayList<>();
+        List<String> btns = new ArrayList<>();
+        switch (userZZid){
+            //维修师傅
+            //eUserZZ.Maintenance.getValue():1
+            case 1:
+                routes.add("首页");
+                routes.add("工单管理");
+                routes.add("待处理池");
+
+                btns.add("协作");
+                btns.add("接单");
+                btns.add("转单");
+                btns.add("报价");
+                btns.add("维修完成");
+                break;
+            //管理者(郭班长)
+            //eUserZZ.Monitor.getValue():2
+            case 2:
+                routes.add("首页");
+                routes.add("工单管理");
+                routes.add("待处理池");
+                routes.add("通讯录");
+
+                btns.add("首页分段器");
+                btns.add("表格编辑");
+                btns.add("工单管理分段器");
+                btns.add("延时");
+                btns.add("审核");
+                btns.add("接单");
+                btns.add("报价");
+                btns.add("维修完成");
+                break;
+            //后勤
+            //eUserZZ.Logistics.getValue():3
+            case 3:
+                routes.add("首页");
+                routes.add("工单管理");
+                routes.add("待处理池");
+                routes.add("通讯录");
+
+                btns.add("表格编辑");
+                btns.add("延时");
+                btns.add("派单");
+                btns.add("审核");
+                btns.add("分段器按钮");
+                break;
+            //用户(默认都是用户)
+            //eUserZZ.User.getValue():0
+            default:
+                routes.add("报修");
+                routes.add("我的报修");
+                break;
+        }
+        result.setRoutes(routes);
+        result.setBtns(btns);
+
+        return result;
+    }
+}

+ 175 - 0
src/main/java/com/repair/controller/RepairAdminController.java

@@ -0,0 +1,175 @@
+package com.repair.controller;
+
+import com.repair.api.RepairAdminControllerAPI;
+import com.repair.common.utils.AesUtils;
+import com.repair.common.utils.paramUtils;
+import com.repair.model.enumModel.eIsSuper;
+import com.repair.model.enumModel.eStatu;
+import com.repair.model.pojo.RepairAdmin;
+import com.repair.model.request.freezeRepairAdminRequest;
+import com.repair.model.request.updateRepairAdminRequest;
+import com.repair.model.result.CommonResult;
+import com.repair.model.result.PageUtils;
+import com.repair.services.RepairAdminService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+import java.lang.reflect.InvocationTargetException;
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-07-05
+ */
+@RestController
+public class RepairAdminController implements RepairAdminControllerAPI {
+
+    @Autowired
+    private RepairAdminService repairAdminService;
+
+    /**
+     * 添加账号数据
+     *
+     * @param ra account 账号
+     *           password 密码
+     *           username 用户名称
+     *           phone 手机号
+     * @return
+     */
+    @Override
+    public CommonResult InsertRepairAdmin(@RequestBody RepairAdmin ra, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        RepairAdmin data = repairAdminService.getRepairByAccount(ra.getAccount());
+        if (data != null) {
+            return CommonResult.fail("该账号已存在!");
+        }
+
+        int result = repairAdminService.insertRepairAdmin(ra); // 帮我们自动生成id
+
+        return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败");
+    }
+
+    /**
+     * 查询账户列表数据
+     *
+     * @param currentPage 当前页
+     * @param pageCount   一页数据条数
+     * @param account     账号
+     * @param phone       手机号
+     * @param userName    账号名称
+     * @return
+     */
+    @Override
+    public CommonResult queryPageRepairAdmins(@RequestParam int currentPage, @RequestParam int pageCount, String account, String phone, String userName) {
+        PageUtils<RepairAdmin> result = repairAdminService.queryPageList(currentPage, pageCount, account, phone, userName);
+
+        return CommonResult.ok(result);
+    }
+
+    /**
+     * 根据ID冻结账号账号数据
+     *
+     * @param frar id 数据ID
+     *             statu 状态
+     *             正常:0;冻结:1
+     * @return
+     */
+    @Override
+    public CommonResult freezeRepairAdminById(@RequestBody freezeRepairAdminRequest frar, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+        RepairAdmin data = repairAdminService.getRepairById(frar.getId());
+        if (data == null) {
+            return CommonResult.fail("当前数据不存在,解冻失败!");
+        }
+        if (data.getStatu().equals(frar.getStatu())) {
+            String Message = frar.getStatu().equals(eStatu.Freeze.getValue()) ? "当前处于冻结状态,请勿重复操作!" : "当前处于未冻结状态,请勿重复操作!";
+            return CommonResult.fail(Message);
+        }
+
+        String success = frar.getStatu().equals(eStatu.Freeze.getValue()) ? "冻结成功!" : "解冻成功";
+        String fail = frar.getStatu().equals(eStatu.Freeze.getValue()) ? "冻结失败!" : "解冻失败";
+        RepairAdmin ra = new RepairAdmin();
+        ra.setId(frar.getId());
+        ra.setStatu(frar.getStatu());
+        int result = repairAdminService.updateRepairAdmin(ra);
+        System.out.println(result);
+        return result > 0 ? CommonResult.ok(success) : CommonResult.fail(fail);
+    }
+
+    /**
+     * 根据ID删除账号数据
+     *
+     * @param id id 数据ID
+     * @return
+     */
+    @Override
+    public CommonResult deleteRepairAdminById(@RequestParam String id) {
+        RepairAdmin data = repairAdminService.getRepairById(id);
+        if (data == null) {
+            return CommonResult.fail("当前数据不存在,删除失败!");
+        }
+
+        int result = repairAdminService.deleteRepairAdminById(id);
+
+        return result > 0 ? CommonResult.ok() : CommonResult.fail();
+    }
+
+    /**
+     * 编辑账号
+     *
+     * @param ra id 数据ID
+     *           username 账号名称
+     *           phone 手机号
+     *           password 密码
+     * @return
+     */
+    @Override
+    public CommonResult updateRepairAdminById(updateRepairAdminRequest ra, @RequestHeader("user_head") String userhead, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        RepairAdmin data = repairAdminService.getRepairById(ra.getId());
+        if (data == null) {
+            return CommonResult.fail("当前数据不存在,编辑失败!");
+        }
+
+        //只有操作管理员才能编辑他人的密码
+        String userID = AesUtils.decrypt(userhead);
+        if (ra.getPassword() != null && !userID.equals(ra.getId())) {
+            RepairAdmin operateData = repairAdminService.getRepairById(userID);
+            if (operateData == null) {
+                return CommonResult.fail("操作身份不合法,编辑失败!");
+            }
+            if (!data.getPassword().equals(AesUtils.encrypt(ra.getPassword())) && !operateData.getIsSuper().equals(eIsSuper.Super.getValue())) {
+                return CommonResult.fail("只有超级管理员才能更改密码!");
+            }
+        }
+
+        int result = repairAdminService.updateRepaiRadmin(ra);
+        return result > 0 ? CommonResult.ok("编辑成功") : CommonResult.fail("编辑失败");
+    }
+
+    @Override
+    public void downloadRepairAdminExcel(String account, HttpServletResponse response) throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
+
+    }
+}
+

+ 156 - 0
src/main/java/com/repair/controller/RepairAreaController.java

@@ -0,0 +1,156 @@
+package com.repair.controller;
+
+
+import com.repair.api.RepairAreaControllerAPI;
+import com.repair.common.utils.paramUtils;
+import com.repair.model.pojo.RepairArea;
+import com.repair.model.request.updateRepairAreaRequest;
+import com.repair.model.result.CommonResult;
+import com.repair.model.result.PageUtils;
+import com.repair.model.vo.RepairAreaTreeVo;
+import com.repair.model.vo.RepairSchoolVo;
+import com.repair.services.RepairAreaService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-07-12
+ */
+@RestController
+public class RepairAreaController implements RepairAreaControllerAPI {
+
+    @Autowired
+    private RepairAreaService repairAreaService;
+
+    @Override
+    public CommonResult InsertRepairArea(RepairArea repairArea, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+        int result = repairAreaService.insertRepairArea(repairArea);
+
+        return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败");
+    }
+
+    @Override
+    public CommonResult updateRepairAreaById(updateRepairAreaRequest urar, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+        RepairArea ra = new RepairArea();
+        ra.setId(urar.getId());
+        ra.setName(urar.getName());
+        int result = repairAreaService.updateRepairArea(ra);
+
+        return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
+    }
+
+    @Override
+    public CommonResult queryPageRepairAreas(int currentPage, int pageCount, String name) {
+        PageUtils<RepairArea> result = repairAreaService.queryPageRepairAreas(currentPage, pageCount, name);
+        return CommonResult.ok(result);
+    }
+
+    @Override
+    public CommonResult queryRepairSchools() {
+        List<RepairSchoolVo> result = repairAreaService.queryRepairSchools();
+        return CommonResult.ok(result);
+    }
+
+    @Override
+    public CommonResult deleteRepairAreaById(int id) {
+        RepairArea data = repairAreaService.getRepairById(id);
+        if (data == null) {
+            return CommonResult.fail("当前数据不存在,删除失败!");
+        }
+
+        int result = repairAreaService.deleteRepairAreaById(id);
+
+        return result > 0 ? CommonResult.ok("删除成功") : CommonResult.fail("删除失败");
+    }
+
+    @Override
+    public CommonResult queryRepairAreaTree(int schoolId) {
+        List<RepairArea> result = repairAreaService.getRepairAreas();
+        List<RepairAreaTreeVo> datas = QueryAreaTreeRecords(schoolId, result);
+        return CommonResult.ok(datas);
+    }
+
+    /*
+    根据父类ID获取树形菜单数据
+     */
+    private List<RepairAreaTreeVo> QueryAreaTreeRecords(Integer parentID, List<RepairArea> lists) {
+        List<RepairAreaTreeVo> newTrees = new ArrayList<>();
+
+        List<RepairArea> datas = lists.stream().filter(e -> e.getParentId() == parentID).collect(Collectors.toList());
+
+        for (RepairArea data : datas) {
+            RepairAreaTreeVo item = RepairAreaTreeVo.builder()
+                    .id(data.getId())
+                    .parentId(data.getParentId())
+                    .name(data.getName())
+                    .build();
+            List<RepairAreaTreeVo> news = QueryAreaTreeRecords(item.getId(), lists);
+            if (news == null || news.size() == 0) {
+                newTrees.add(item);
+                continue;
+            } else {
+                item.setChildren(news);
+                newTrees.add(item);
+            }
+        }
+
+        return newTrees;
+    }
+
+    @Override
+    public CommonResult queryRepairAreaSecond(int schoolId) {
+        List<RepairArea> result = repairAreaService.getRepairAreas();
+        List<RepairAreaTreeVo> datas = QueryAreaTreeRecords(schoolId, result, 2);
+        return CommonResult.ok(datas);
+    }
+
+    /*
+    查询二层楼栋
+     */
+    private List<RepairAreaTreeVo> QueryAreaTreeRecords(Integer parentID, List<RepairArea> lists, int i) {
+        i--;
+        List<RepairAreaTreeVo> newTrees = new ArrayList<>();
+
+        List<RepairArea> datas = lists.stream().filter(e -> e.getParentId() == parentID).collect(Collectors.toList());
+        if(i < 0){
+            datas = new ArrayList<>();
+        }
+        for (RepairArea data : datas) {
+            RepairAreaTreeVo item = RepairAreaTreeVo.builder()
+                    .id(data.getId())
+                    .parentId(data.getParentId())
+                    .name(data.getName())
+                    .build();
+            List<RepairAreaTreeVo> news = QueryAreaTreeRecords(item.getId(), lists, i);
+            if (news == null || news.size() == 0) {
+                newTrees.add(item);
+                continue;
+            } else {
+                item.setChildren(news);
+                newTrees.add(item);
+            }
+        }
+
+        return newTrees;
+    }
+
+}
+

+ 138 - 0
src/main/java/com/repair/controller/RepairArticleTypeController.java

@@ -0,0 +1,138 @@
+package com.repair.controller;
+
+
+import com.repair.api.RepairArticleTypeControllerAPI;
+import com.repair.common.utils.paramUtils;
+import com.repair.model.pojo.RepairArea;
+import com.repair.model.pojo.RepairArticleType;
+import com.repair.model.request.updateRepairArticleTypeRequest;
+import com.repair.model.result.CommonResult;
+import com.repair.model.result.PageUtils;
+import com.repair.model.vo.*;
+import com.repair.model.vo.RepairArticleTypeTreeVo;
+import com.repair.services.RepairAreaService;
+import com.repair.services.RepairArticleTypeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.BindingResult;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-07-18
+ */
+@RestController
+public class RepairArticleTypeController implements RepairArticleTypeControllerAPI {
+
+    @Autowired
+    private RepairArticleTypeService repairArticleTypeService;
+    @Autowired
+    private RepairAreaService repairAreaService;
+
+    @Override
+    public CommonResult InsertRepairArticleType(RepairArticleType rat, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        RepairArticleType data = repairArticleTypeService.getRepairArticleTypeByName(rat.getName());
+        if (data != null) {
+            return CommonResult.fail("该物品已存在!");
+        }
+
+        int result = repairArticleTypeService.insertRepairArticleType(rat);
+
+        return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败");
+    }
+
+    @Override
+    public CommonResult updateRepairArticleTypeById(updateRepairArticleTypeRequest uratr, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        RepairArticleType data = repairArticleTypeService.getRepairArticleTypeByName(uratr.getName());
+        if (data != null && !data.getId().equals(uratr.getId())) {
+            return CommonResult.fail("该物品已存在!");
+        }
+
+        RepairArticleType rat = new RepairArticleType();
+        rat.setId(uratr.getId());
+        rat.setName(uratr.getName());
+
+        int result = repairArticleTypeService.updateRepairArticleType(rat);
+
+        return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
+    }
+
+    @Override
+    public CommonResult queryPageRepairArticleTypes(int currentPage, int pageCount, String name) {
+        PageUtils<RepairArticleType> result = repairArticleTypeService.queryPageRepairArticleTypes(currentPage, pageCount, name);
+        return CommonResult.ok(result);
+    }
+
+    @Override
+    public CommonResult deleteRepairArticleTypeById(int id) {
+        RepairArticleType data = repairArticleTypeService.getRepairById(id);
+        if (data == null) {
+            return CommonResult.fail("当前数据不存在,删除失败!");
+        }
+
+        int result = repairArticleTypeService.deleteRepairArticleTypeById(id);
+
+        return result > 0 ? CommonResult.ok("删除成功") : CommonResult.fail("删除失败");
+    }
+
+    @Override
+    public CommonResult queryRepairArticleTypeTree(int schoolId) {
+        List<RepairArticleType> result = repairArticleTypeService.getRepairArticleTypesBySchoolId(schoolId);
+        List<RepairArticleTypeTreeVo> datas = QueryArticleTypeTreeRecords(0, result);
+
+        return CommonResult.ok(datas);
+    }
+
+    @Override
+    public CommonResult queryRepairArticleType(int schoolId) {
+        List<RepairWorkTypeVo> result = repairArticleTypeService.getRepairArticleTypes(schoolId);
+        return CommonResult.ok(result);
+    }
+
+    /*
+    根据父类ID获取树形菜单数据
+     */
+    private List<RepairArticleTypeTreeVo> QueryArticleTypeTreeRecords(Integer parentID, List<RepairArticleType> lists) {
+        List<RepairArticleTypeTreeVo> newTrees = new ArrayList<>();
+
+        List<RepairArticleType> datas = lists.stream().filter(e -> e.getParentId() == parentID).collect(Collectors.toList());
+
+        for (RepairArticleType data : datas) {
+            RepairArticleTypeTreeVo item = RepairArticleTypeTreeVo.builder()
+                    .id(data.getId())
+                    .schoolId(data.getSchoolId())
+                    .parentId(data.getParentId())
+                    .name(data.getName())
+                    .build();
+            List<RepairArticleTypeTreeVo> news = QueryArticleTypeTreeRecords(item.getId(), lists);
+            if (news == null || news.size() == 0) {
+                newTrees.add(item);
+                continue;
+            } else {
+                item.setChildren(news);
+                newTrees.add(item);
+            }
+        }
+
+        return newTrees;
+    }
+}
+

+ 421 - 0
src/main/java/com/repair/controller/RepairClassesSettingsController.java

@@ -0,0 +1,421 @@
+package com.repair.controller;
+
+import com.repair.annotation.PassToken;
+import com.repair.api.RepairClassesSettingsControllerAPI;
+import com.repair.common.utils.ExcelUtils;
+import com.repair.common.utils.TimeExchange;
+import com.repair.common.utils.paramUtils;
+import com.repair.model.enumModel.eFileType;
+import com.repair.model.enumModel.eSchool;
+import com.repair.model.pojo.RepairClassesSettings;
+import com.repair.model.pojo.RepairShiftSettings;
+import com.repair.model.pojo.RepairUser;
+import com.repair.model.request.insertRepairClassesRequest;
+import com.repair.model.request.updateRepairClassesRequest;
+import com.repair.model.result.CommonResult;
+import com.repair.model.result.PageUtils;
+import com.repair.model.vo.*;
+import com.repair.services.RepairClassesSettingsService;
+import com.repair.services.RepairShiftSettingsService;
+import com.repair.services.RepairUserService;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.hssf.usermodel.HSSFRow;
+import org.apache.poi.hssf.usermodel.HSSFSheet;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.CellType;
+import org.apache.poi.xssf.usermodel.XSSFRow;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.BindingResult;
+
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.InputStream;
+import java.text.ParseException;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-07-13
+ */
+@RestController
+public class RepairClassesSettingsController implements RepairClassesSettingsControllerAPI {
+
+    @Autowired
+    private RepairClassesSettingsService repairClassesSettingsService;
+    @Autowired
+    private RepairShiftSettingsService repairShiftSettingsService;
+    @Autowired
+    private RepairUserService repairUserService;
+
+    public CommonResult InsertRepairClassesSettings(insertRepairClassesRequest ircr, BindingResult bindingResult) throws ParseException {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        if (ircr.getStartDate() == null) {
+            return CommonResult.fail("开始日期不能为空");
+        }
+
+        RepairClassesSettings rcs = new RepairClassesSettings();
+
+        rcs.setUserId(ircr.getUserId());
+        rcs.setShiftId(StringUtils.join(ircr.getShiftIds(), ','));
+        rcs.setStartDate(ircr.getStartDate());
+
+        int result = repairClassesSettingsService.insertRepairClassesSettings(rcs);
+
+        return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败");
+    }
+
+    @Override
+    public CommonResult updateRepairClassesSettingsById(updateRepairClassesRequest urcr, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        if (urcr.getStartDate() == null) {
+            return CommonResult.fail("开始日期不能为空");
+        }
+
+        RepairClassesSettings rcs = new RepairClassesSettings();
+        rcs.setId(urcr.getId());
+        rcs.setUserId(urcr.getUserId());
+        rcs.setShiftId(StringUtils.join(urcr.getShiftIds(), ','));
+        rcs.setStartDate(urcr.getStartDate());
+
+        int result = repairClassesSettingsService.updateRepairClassesSettings(rcs);
+
+        return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
+    }
+
+    @Override
+    public CommonResult queryPageRepairClassesSettingss(int currentPage, int pageCount, String startTime, String endTime) {
+        PageUtils<RepairUser> result = repairUserService.queryPageRepairUser(currentPage, pageCount);
+        List<Integer> userIds = result.getList().stream().map(RepairUser::getId).collect(Collectors.toList());
+
+        if (startTime == null || endTime == null) {
+            String[] weeks = TimeExchange.getCurrentWeekTimeFrame();
+            startTime = weeks[0];
+            endTime = weeks[1];
+        }
+
+        LocalDate StartDate = LocalDate.parse(startTime, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        LocalDate EndDate = LocalDate.parse(endTime, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        List<ClassSettingDateVo> dates = TimeExchange.getDatesBetween(StartDate, EndDate);
+
+        try {
+            startTime = startTime == null ? startTime : TimeExchange.getStartOfDayStr(TimeExchange.StringToDate(startTime, "yyyy-MM-dd"));
+            endTime = endTime == null ? endTime : TimeExchange.getEndOfDayStr(TimeExchange.StringToDate(endTime, "yyyy-MM-dd"));
+        } catch (Exception e) {
+
+        }
+
+        List<ClassesSettingVo> datas = repairClassesSettingsService.getRepairByUserIds(userIds, startTime, endTime);
+        List<ClassesSettingPageDataVo> cspds = new ArrayList<>();
+        for (RepairUser ru:result.getList()) {
+            ClassesSettingPageDataVo cspd = new ClassesSettingPageDataVo();
+            cspd.setSchoolId(ru.getSchoolId());
+            cspd.setSchoolName(eSchool.stringOf(ru.getSchoolId()));
+            cspd.setUserId(ru.getId());
+            cspd.setUserName(ru.getUserName());
+            List<ClassesSettingVo> classDatas = datas.stream().filter(e -> e.getUserId() == ru.getId()).collect(Collectors.toList());
+
+            for (ClassSettingDateVo d:dates) {
+                Optional<ClassesSettingVo> o = classDatas.stream().filter(e -> e.getStartDate().equals(d.getDateStr())).findFirst();
+                if (!(o != null && o.isPresent())) {
+                    ClassesSettingVo newData = new ClassesSettingVo();
+                    newData.setStartDate(d.getDateStr());
+                    newData.setUserId(ru.getId());
+                    classDatas.add(newData);
+                }
+            }
+            classDatas.sort(Comparator.comparing(ClassesSettingVo::getStartDate));
+            cspd.setClassSettings(classDatas);
+            cspds.add(cspd);
+        }
+
+        ClassesSettingPageVo data = new ClassesSettingPageVo();
+        data.setDates(dates);
+        PageUtils ssss = new PageUtils(cspds, result.getTotalCount(), result.getTotalPage(), result.getCurrPage());
+        data.setPageDatas(ssss);
+        return CommonResult.ok(data);
+    }
+
+//    @Override
+//    public CommonResult queryPageRepairClassesSettingss(int currentPage, int pageCount, String name) {
+//        PageUtils<RepairClassesSettings> result = repairClassesSettingsService.queryPageRepairClassesSettingss(currentPage, pageCount, name);
+//
+//        List<Integer> userIDs = result.getList().stream().map(RepairClassesSettings::getUserId).distinct().collect(Collectors.toList());
+//
+//        List<RepairUser> users = repairUserService.getRepairs(userIDs);
+//        List<RepairShiftSettings> shifs = repairShiftSettingsService.getRepairs();
+//
+//        List<RepairClassesVo> datas = new ArrayList<>();
+//        for (RepairClassesSettings data : result.getList()) {
+//            Optional<RepairUser> userdata = users.stream().filter(e -> e.getId() == data.getUserId()).findFirst();
+//
+//            RepairUser user = null;
+//            if (userdata != null && userdata.isPresent()) {
+//                user = userdata.get();
+//            }
+//            RepairClassesVo vo = new RepairClassesVo();
+//            vo.setId(data.getId());
+//            vo.setUserId(data.getUserId());
+//            vo.setStartDate(data.getStartDate());
+//            vo.setUserName(user == null ? "" : user.getUserName());
+//            vo.setShiftIds(Arrays.asList(data.getShiftId().split(",")));
+//            List<String> shiftNames = new ArrayList<>();
+//            for (String ssi : vo.getShiftIds()) {
+//                Optional<RepairShiftSettings> shif = shifs.stream().filter(e -> e.getId() == Integer.valueOf(ssi)).findFirst();
+//                if (shif != null && shif.isPresent()) {
+//                    shiftNames.add(shif.get().getName());
+//                }
+//            }
+//            vo.setShiftNames(shiftNames);
+//            datas.add(vo);
+//        }
+//
+//        return CommonResult.ok(new PageUtils(datas, result.getTotalCount(), result.getTotalPage(), result.getCurrPage()));
+//    }
+
+    @Override
+    public CommonResult deleteRepairClassesSettingsById(int id) {
+        RepairClassesSettings data = repairClassesSettingsService.getRepairById(id);
+        if (data == null) {
+            return CommonResult.fail("当前数据不存在,删除失败!");
+        }
+
+        int result = repairClassesSettingsService.deleteRepairClassesSettingsById(id);
+
+        return result > 0 ? CommonResult.ok("删除成功") : CommonResult.fail("删除失败");
+    }
+
+    @Override
+    public void downloadRepairClassesSettingExcel(HttpServletResponse response) {
+        ExcelUtils.fileDownload("\\自定义排班模板.xlsx", response);
+    }
+
+    @Override
+    public CommonResult importRepairClassesSettingExcel(MultipartFile file) throws IOException {
+        String ContentType = file.getContentType();
+        InputStream inputStream = file.getInputStream();
+        List<RepairClassesSettings> result = new ArrayList<>();
+
+        //xls格式文件
+        if (ContentType.equals(eFileType.Xls.getValue())) {
+
+            CommonResult<List<RepairClassesSettings>> resultData = readXls(inputStream);
+            if (!resultData.isSuccess()) {
+                return resultData;
+            }
+            result = resultData.getData();
+
+        } else if (ContentType.equals(eFileType.Xlsx.getValue())) {
+            CommonResult<List<RepairClassesSettings>> resultData = readXlsx(inputStream);
+            if (!resultData.isSuccess()) {
+                return resultData;
+            }
+            result = resultData.getData();
+
+        } else {
+            return CommonResult.fail("排班数据导入只支持Xls、Xlsx");
+        }
+
+        boolean resultBool = repairClassesSettingsService.saveBatch(result);
+
+        return resultBool ? CommonResult.ok("导入成功") : CommonResult.fail("导入失败");
+    }
+
+
+    private CommonResult<List<RepairClassesSettings>> readXls(InputStream inputStream) throws IOException {
+        int days = 0;
+        int month = 0;
+        List<String> datas = new ArrayList<>();
+        HSSFWorkbook sheets = new HSSFWorkbook(inputStream);
+        List<RepairClassesSettings> result = new ArrayList<>();
+        //读取第一张sheet
+        HSSFSheet sheetAt = sheets.getSheetAt(0);
+
+        List<String> UserNames = new ArrayList<>();
+        List<Integer> userZZs = new ArrayList<>();
+        userZZs.add(1);
+        userZZs.add(2);
+        List<RepairUser> users = repairUserService.getRepairByUserZZ(userZZs);
+        List<RepairShiftSettings> shifts = repairShiftSettingsService.getRepairs();
+        //rowNum = 3 从第三行开始获取值
+        //sheetAt.getLastRowNum():从0开始统计数量 所以得+1
+        for (int rowNum = 0; rowNum < sheetAt.getLastRowNum() + 1; rowNum++) {
+
+            HSSFRow row = sheetAt.getRow(rowNum);
+
+
+            if (row != null) {
+                //使用了getStringCellValue()方法来获取值,POI会判断单元格的类型,如果非字符串类型就会抛出上面的异常。
+                //所以先使用setCellType()方法先将该单元格的类型设置为STRING
+                //然后poi会根据字符串读取它
+                //第一行数据获取月份
+                if (rowNum == 0) {
+                    row.getCell(0).setCellType(CellType.STRING);
+                    month = Integer.valueOf(row.getCell(0).getStringCellValue().substring(4, 6));
+                } else if (rowNum == 3) {//日期
+
+                    days = TimeExchange.getMonthDays(TimeExchange.getDate(), month);
+                    for (int d = 1; d <= days; d++) {
+                        row.getCell(d).setCellType(CellType.STRING);
+                        String stringCellValue = TimeExchange.getDateMonth() + String.format("%02d", Integer.valueOf(row.getCell(d).getStringCellValue()));
+                        datas.add(stringCellValue);
+                    }
+                } else if (rowNum >= 4) {
+
+                    row.getCell(0).setCellType(CellType.STRING);
+                    String UserName = row.getCell(0).getStringCellValue();
+                    int userId = 0;
+                    Optional<RepairUser> userData = users.stream().filter(e -> e.getUserName().equals(UserName)).findFirst();
+                    if (userData != null && userData.isPresent()) {
+                        userId = userData.get().getId();
+                    }
+                    if (userId == 0) {
+                        return CommonResult.fail(UserName + "用户数据不存在");
+                    }
+                    UserNames.add(UserName);
+                    if (UserNames.stream().distinct().count() != UserNames.size()) {
+                        return CommonResult.fail("导入的Excel中" + UserName + "存在重复数据");
+                    }
+
+                    for (int d = 1; d <= days; d++) {
+                        //用户ID
+                        RepairClassesSettings classData = new RepairClassesSettings();
+                        classData.setUserId(userId);
+                        //日期
+                        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+                        LocalDate dateParam = LocalDate.parse(datas.get(d - 1), df);
+                        classData.setStartDate(dateParam);
+                        //班次ID
+                        row.getCell(d).setCellType(CellType.STRING);
+                        String stringCellValue = row.getCell(d).getStringCellValue();
+                        String[] shiftStrs = stringCellValue.split("、");
+                        List<String> shiftIds = new ArrayList<>();
+                        for (String shiftStr : shiftStrs) {
+                            if (!shiftStr.equals("")) {
+                                Optional<RepairShiftSettings> shiftData = shifts.stream().filter(e -> e.getName().equals(shiftStr)).findFirst();
+                                if (shiftData != null && shiftData.isPresent()) {
+                                    shiftIds.add(shiftData.get().getId().toString());
+                                } else {
+                                    return CommonResult.fail(UserName + "的" + datas.get(d - 1) + "的" + shiftStr + "数据不存在");
+                                }
+                            }
+
+                        }
+                        classData.setShiftId(StringUtils.join(shiftIds, ','));
+                        result.add(classData);
+                    }
+                }
+            }
+        }
+        return CommonResult.ok(result);
+    }
+
+    private CommonResult<List<RepairClassesSettings>> readXlsx(InputStream inputStream) throws IOException {
+        int days = 0;
+        int month = 0;
+        List<String> datas = new ArrayList<>();
+        XSSFWorkbook sheets = new XSSFWorkbook(inputStream);
+        List<RepairClassesSettings> result = new ArrayList<>();
+        //读取第一张sheet
+        XSSFSheet sheetAt = sheets.getSheetAt(0);
+
+        List<String> UserNames = new ArrayList<>();
+        List<Integer> userZZs = new ArrayList<>();
+        userZZs.add(1);
+        userZZs.add(2);
+        List<RepairUser> users = repairUserService.getRepairByUserZZ(userZZs);
+        List<RepairShiftSettings> shifts = repairShiftSettingsService.getRepairs();
+        //rowNum = 3 从第三行开始获取值
+        //sheetAt.getLastRowNum():从0开始统计数量 所以得+1
+        for (int rowNum = 0; rowNum < sheetAt.getLastRowNum() + 1; rowNum++) {
+
+            XSSFRow row = sheetAt.getRow(rowNum);
+
+
+            if (row != null) {
+                //使用了getStringCellValue()方法来获取值,POI会判断单元格的类型,如果非字符串类型就会抛出上面的异常。
+                //所以先使用setCellType()方法先将该单元格的类型设置为STRING
+                //然后poi会根据字符串读取它
+                //第一行数据获取月份
+                if (rowNum == 0) {
+                    row.getCell(0).setCellType(CellType.STRING);
+                    month = Integer.valueOf(row.getCell(0).getStringCellValue().substring(4, 6));
+                } else if (rowNum == 3) {//日期
+
+                    days = TimeExchange.getMonthDays(TimeExchange.getDate(), month);
+                    for (int d = 1; d <= days; d++) {
+                        row.getCell(d).setCellType(CellType.STRING);
+                        String stringCellValue = TimeExchange.getDateMonth() + String.format("%02d", Integer.valueOf(row.getCell(d).getStringCellValue()));
+                        datas.add(stringCellValue);
+                    }
+                } else if (rowNum >= 4) {
+
+                    row.getCell(0).setCellType(CellType.STRING);
+                    String UserName = row.getCell(0).getStringCellValue();
+                    int userId = 0;
+                    Optional<RepairUser> userData = users.stream().filter(e -> e.getUserName().equals(UserName)).findFirst();
+                    if (userData != null && userData.isPresent()) {
+                        userId = userData.get().getId();
+                    }
+                    if (userId == 0) {
+                        return CommonResult.fail(UserName + "用户数据不存在");
+                    }
+                    UserNames.add(UserName);
+                    if (UserNames.stream().distinct().count() != UserNames.size()) {
+                        return CommonResult.fail("导入的Excel中" + UserName + "存在重复数据");
+                    }
+
+                    for (int d = 1; d <= days; d++) {
+                        //用户ID
+                        RepairClassesSettings classData = new RepairClassesSettings();
+                        classData.setUserId(userId);
+                        //日期
+                        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+                        LocalDate dateParam = LocalDate.parse(datas.get(d - 1), df);
+                        classData.setStartDate(dateParam);
+                        //班次ID
+                        row.getCell(d).setCellType(CellType.STRING);
+                        String stringCellValue = row.getCell(d).getStringCellValue();
+                        String[] shiftStrs = stringCellValue.split("、");
+                        List<String> shiftIds = new ArrayList<>();
+                        for (String shiftStr : shiftStrs) {
+                            if (!shiftStr.equals("")) {
+                                Optional<RepairShiftSettings> shiftData = shifts.stream().filter(e -> e.getName().equals(shiftStr)).findFirst();
+                                if (shiftData != null && shiftData.isPresent()) {
+                                    shiftIds.add(shiftData.get().getId().toString());
+                                } else {
+                                    return CommonResult.fail(UserName + "的" + datas.get(d - 1) + "的" + shiftStr + "数据不存在");
+                                }
+                            }
+                        }
+                        classData.setShiftId(StringUtils.join(shiftIds, ','));
+                        result.add(classData);
+                    }
+                }
+            }
+        }
+        return CommonResult.ok(result);
+    }
+
+}
+

+ 75 - 0
src/main/java/com/repair/controller/RepairCollaborateRecordController.java

@@ -0,0 +1,75 @@
+package com.repair.controller;
+
+
+import com.repair.api.RepairCollaborateRecordControllerAPI;
+import com.repair.common.utils.paramUtils;
+import com.repair.model.pojo.RepairCollaborateRecord;
+import com.repair.model.pojo.RepairCollaborateRecord;
+import com.repair.model.pojo.RepairCollaborateRecord;
+import com.repair.model.result.CommonResult;
+import com.repair.model.result.PageUtils;
+import com.repair.services.RepairCollaborateRecordService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-07-20
+ */
+@RestController
+public class RepairCollaborateRecordController implements RepairCollaborateRecordControllerAPI {
+
+    @Autowired
+    private RepairCollaborateRecordService repairCollaborateRecordService;
+
+    @Override
+    public CommonResult InsertrepairCollaborateRecord(RepairCollaborateRecord rc, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        int result = repairCollaborateRecordService.insertRepairCollaborateRecord(rc);
+
+        return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败");
+    }
+
+    @Override
+    public CommonResult updaterepairCollaborateRecordById(RepairCollaborateRecord rc, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        int result = repairCollaborateRecordService.updateRepairCollaborateRecord(rc);
+
+        return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
+    }
+
+    @Override
+    public CommonResult queryPagerepairCollaborateRecords(int currentPage, int pageCount, String name) {
+        PageUtils<RepairCollaborateRecord> result = repairCollaborateRecordService.queryPageRepairCollaborateRecords(currentPage, pageCount, name);
+
+        return CommonResult.ok(result);
+    }
+
+    @Override
+    public CommonResult deleterepairCollaborateRecordById(int id) {
+        RepairCollaborateRecord data = repairCollaborateRecordService.getRepairById(id);
+        if (data == null) {
+            return CommonResult.fail("当前数据不存在,删除失败!");
+        }
+
+        int result = repairCollaborateRecordService.deleteRepairCollaborateRecordById(id);
+
+        return result > 0 ? CommonResult.ok("删除成功") : CommonResult.fail("删除失败");
+    }
+}
+

+ 75 - 0
src/main/java/com/repair/controller/RepairConsumablesController.java

@@ -0,0 +1,75 @@
+package com.repair.controller;
+
+
+import com.repair.api.RepairConsumablesControllerAPI;
+import com.repair.common.utils.paramUtils;
+import com.repair.model.pojo.RepairConsumables;
+import com.repair.model.pojo.RepairShiftSettings;
+import com.repair.model.result.CommonResult;
+import com.repair.model.result.PageUtils;
+import com.repair.services.RepairConsumablesService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.BindingResult;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import java.text.ParseException;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-07-20
+ */
+@RestController
+public class RepairConsumablesController implements RepairConsumablesControllerAPI {
+
+    @Autowired
+    private RepairConsumablesService repairConsumablesService;
+
+    @Override
+    public CommonResult InsertrepairConsumables(RepairConsumables rc, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        int result = repairConsumablesService.insertRepairConsumables(rc);
+
+        return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败");
+    }
+
+    @Override
+    public CommonResult updaterepairConsumablesById(RepairConsumables rc, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        int result = repairConsumablesService.updateRepairConsumables(rc);
+
+        return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
+    }
+
+    @Override
+    public CommonResult queryPagerepairConsumabless(int currentPage, int pageCount, String name) {
+        PageUtils<RepairConsumables> result = repairConsumablesService.queryPageRepairConsumabless(currentPage, pageCount, name);
+
+        return CommonResult.ok(result);
+    }
+
+    @Override
+    public CommonResult deleterepairConsumablesById(int id) {
+        RepairConsumables data = repairConsumablesService.getRepairById(id);
+        if (data == null) {
+            return CommonResult.fail("当前数据不存在,删除失败!");
+        }
+
+        int result = repairConsumablesService.deleteRepairConsumablesById(id);
+
+        return result > 0 ? CommonResult.ok("删除成功") : CommonResult.fail("删除失败");
+    }
+}
+

+ 396 - 0
src/main/java/com/repair/controller/RepairConsumeController.java

@@ -0,0 +1,396 @@
+package com.repair.controller;
+
+
+import com.repair.api.RepairConsumeControllerAPI;
+import com.repair.common.utils.ExcelExportUtil;
+import com.repair.common.utils.ExcelUtils;
+import com.repair.common.utils.TimeExchange;
+import com.repair.common.utils.paramUtils;
+import com.repair.model.enumModel.eFileType;
+import com.repair.model.pojo.*;
+import com.repair.model.request.insertRepairConsumeRequest;
+import com.repair.model.request.updateRepairConsumeRequest;
+import com.repair.model.result.CommonResult;
+import com.repair.model.result.PageUtils;
+import com.repair.model.vo.ConsumeVo;
+import com.repair.model.vo.RepairConsumeVo;
+import com.repair.model.vo.RepairSchoolVo;
+import com.repair.services.RepairAreaService;
+import com.repair.services.RepairArticleTypeService;
+import com.repair.services.RepairConsumeService;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.hpsf.Decimal;
+import org.apache.poi.hssf.usermodel.HSSFRow;
+import org.apache.poi.hssf.usermodel.HSSFSheet;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.CellType;
+import org.apache.poi.ss.usermodel.DataFormatter;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.usermodel.XSSFRow;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.BindingResult;
+
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.InvocationTargetException;
+import java.math.BigDecimal;
+import java.util.*;
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-07-18
+ */
+@RestController
+public class RepairConsumeController implements RepairConsumeControllerAPI {
+
+    @Autowired
+    private RepairAreaService repairAreaService;
+    @Autowired
+    private RepairConsumeService repairConsumeService;
+    @Autowired
+    private RepairArticleTypeService repairArticleTypeService;
+
+    @Override
+    public CommonResult InsertRepairConsume(insertRepairConsumeRequest ircr, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        RepairConsume data = repairConsumeService.queryConsumeByName(ircr.getName());
+        if (data != null) {
+            return CommonResult.fail("该报修耗材已存在!");
+        }
+
+        RepairConsume rc = new RepairConsume()
+                .setName(ircr.getName())
+                .setSchoolId(ircr.getSchoolId())
+                .setArticleId(StringUtils.join(ircr.getArticleIds(), ','))
+                .setPrice(ircr.getPrice())
+                .setContent(ircr.getContent());
+
+        int result = repairConsumeService.insertRepairConsume(rc);
+
+        return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败");
+    }
+
+    @Override
+    public CommonResult updateRepairConsumeById(updateRepairConsumeRequest urcr, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        RepairConsume data = repairConsumeService.queryConsumeByName(urcr.getName());
+        if (data != null && !data.getId().equals(urcr.getId())) {
+            return CommonResult.fail("该报修耗材已存在!");
+        }
+
+        RepairConsume rc = new RepairConsume()
+                .setId(urcr.getId())
+                .setSchoolId(urcr.getSchoolId())
+                .setName(urcr.getName())
+                .setArticleId(StringUtils.join(urcr.getArticleIds(), ','))
+                .setPrice(urcr.getPrice())
+                .setContent(urcr.getContent());
+
+        int result = repairConsumeService.updateRepairConsume(rc);
+
+        return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
+    }
+
+    @Override
+    public CommonResult queryPageRepairConsumes(int currentPage, int pageCount, String name, String startTime, String endTime) {
+
+        if(startTime != null && endTime != null){
+            try {
+                startTime = TimeExchange.getStartOfDayStr(TimeExchange.StringToDate(startTime, "yyyy-MM-dd"));
+                endTime = TimeExchange.getEndOfDayStr(TimeExchange.StringToDate(endTime, "yyyy-MM-dd"));
+            } catch (Exception e) {
+            }
+        }
+
+        PageUtils<RepairConsumeVo> result = repairConsumeService.queryPageRepairConsumes(currentPage, pageCount, name, startTime, endTime);
+
+        for (RepairConsumeVo r : result.getList()) {
+            if (r.getArticleId() != null) {
+                r.setArticleIds(Arrays.asList(r.getArticleId().split(",")));
+            }
+            if (r.getArticleName() != null) {
+                r.setArticleNames(Arrays.asList(r.getArticleName().split(",")));
+            }
+        }
+
+        return CommonResult.ok(result);
+
+    }
+
+    @Override
+    public CommonResult deleteRepairConsumeById(int id) {
+        RepairConsume data = repairConsumeService.getRepairById(id);
+        if (data == null) {
+            return CommonResult.fail("当前数据不存在,删除失败!");
+        }
+
+        int result = repairConsumeService.deleteRepairConsumeById(id);
+
+        return result > 0 ? CommonResult.ok("删除成功") : CommonResult.fail("删除失败");
+    }
+
+    @Override
+    public void downloadRepairConsumeExcel(String name, String startTime, String endTime, HttpServletResponse response) throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
+        Map<String, String> map = new HashMap<>();
+        //表头与键值对的映射关系
+        map.put("id", "数据ID");
+        map.put("name", "耗材名称");
+        map.put("schoolName", "校区名称");
+        map.put("price", "耗材单价");
+        map.put("artileName", "物品类型");
+        map.put("entryName", "录入人员");
+        map.put("updateTime", "录入时间");
+
+        if(startTime != null && endTime != null){
+            try {
+                startTime = TimeExchange.getStartOfDayStr(TimeExchange.StringToDate(startTime, "yyyy-MM-dd"));
+                endTime = TimeExchange.getEndOfDayStr(TimeExchange.StringToDate(endTime, "yyyy-MM-dd"));
+            } catch (Exception e) {
+            }
+        }
+        List<ConsumeVo> datas = repairConsumeService.queryConsumeList(name, startTime, endTime);
+
+        List<String> orderList = new ArrayList<>();
+        orderList.add("id");
+        orderList.add("name");
+        orderList.add("schoolName");
+        orderList.add("price");
+        orderList.add("artileName");
+        orderList.add("entryName");
+        orderList.add("updateTime");
+
+        //导出逻辑 这里的list是从导入里面哪来的 map1与map不一样 orderList这里为空
+        Workbook workbook = ExcelExportUtil.createWorkbook(datas, map, 1, "耗材管理表", orderList);
+
+        ExcelUtils.excelDownload(workbook, "耗材管理.xlsx", response);
+    }
+
+    @Override
+    public void downloadRepairConsumeModelExcel(HttpServletResponse response) {
+        ExcelUtils.fileDownload("\\耗材管理模板.xlsx", response);
+    }
+
+    @Override
+    public CommonResult importRepairConsumeExcel(MultipartFile file) throws IOException {
+        String ContentType = file.getContentType();
+        InputStream inputStream = file.getInputStream();
+        List<RepairConsume> result = new ArrayList<>();
+
+        //xls格式文件
+        if (ContentType.equals(eFileType.Xls.getValue())) {
+
+            CommonResult<List<RepairConsume>> resultData = readXls(inputStream);
+            if (!resultData.isSuccess()) {
+                return resultData;
+            }
+            result = resultData.getData();
+
+        } else if (ContentType.equals(eFileType.Xlsx.getValue())) {
+            CommonResult<List<RepairConsume>> resultData = readXlsx(inputStream);
+            if (!resultData.isSuccess()) {
+                return resultData;
+            }
+            result = resultData.getData();
+
+        } else {
+            return CommonResult.fail("耗材数据导入只支持Xls、Xlsx");
+        }
+
+        boolean resultBool = repairConsumeService.saveBatch(result);
+
+        return resultBool ? CommonResult.ok("导入成功") : CommonResult.fail("导入失败");
+    }
+
+    private CommonResult<List<RepairConsume>> readXls(InputStream inputStream) throws IOException {
+        HSSFWorkbook sheets = new HSSFWorkbook(inputStream);
+        List<RepairConsume> result = new ArrayList<>();
+        List<String> ConsumeNames = new ArrayList<>();
+        //读取第一张sheet
+        HSSFSheet sheetAt = sheets.getSheetAt(0);
+
+        //获取校区数据
+        List<RepairSchoolVo> schools = repairAreaService.queryRepairSchools();
+        //报修物品
+        List<RepairArticleType> articles = repairArticleTypeService.getRepairArticleTypes();
+
+        DataFormatter dataFormatter = new DataFormatter();
+        //sheetAt.getLastRowNum():从0开始统计数量 所以得+1
+        for (int rowNum = 1; rowNum < sheetAt.getLastRowNum() + 1; rowNum++) {
+
+            HSSFRow row = sheetAt.getRow(rowNum);
+
+            if (rowNum == 1) {
+                String name = dataFormatter.formatCellValue(row.getCell(0));//耗材名称
+                if (!name.equals("名称")) {
+                    return CommonResult.fail("导入数据第一列为名称");
+                }
+                String schoolName = dataFormatter.formatCellValue(row.getCell(1));//校区名称
+                if (!schoolName.equals("校区")) {
+                    return CommonResult.fail("导入数据第二列为校区");
+                }
+                String ArticleName = dataFormatter.formatCellValue(row.getCell(2));//报修物品类别
+                if (!ArticleName.equals("类别")) {
+                    return CommonResult.fail("导入数据第三列为类别");
+                }
+                String price = dataFormatter.formatCellValue(row.getCell(3));//耗材单价
+                if (!price.equals("价格(元)")) {
+                    return CommonResult.fail("导入数据第四列为价格");
+                }
+
+            } else {
+                RepairConsume data = new RepairConsume();
+                //耗材名称
+                String name = dataFormatter.formatCellValue(row.getCell(0));
+                ConsumeNames.add(name);
+                if (ConsumeNames.stream().distinct().count() != ConsumeNames.size()) {
+                    return CommonResult.fail("导入的Excel中" + name + "存在重复数据");
+                }
+                data.setName(name);
+                //校区
+                String schoolName = dataFormatter.formatCellValue(row.getCell(1));
+                Optional<RepairSchoolVo> school = schools.stream().filter(e -> e.getName().equals(schoolName)).findFirst();
+                if (school != null && school.isPresent()) {
+                    data.setSchoolId(school.get().getId());
+                } else {
+                    return CommonResult.fail(name + "的" + schoolName + "校区数据在数据库中不存在");
+                }
+                //报修物品(类别)
+                String article = dataFormatter.formatCellValue(row.getCell(2));
+                String[] articleStrs = null;
+                if (article.contains("、")) {
+                    articleStrs = article.split("、");
+                } else if (article.contains(",")) {
+                    articleStrs = article.split(",");
+                } else {
+                    articleStrs = new String[1];
+                    articleStrs[0] = article;
+                }
+                List<String> ass = new ArrayList<>();
+                for (String as : articleStrs) {
+                    if (!as.equals("")) {
+                        Optional<RepairArticleType> shiftData = articles.stream().filter(e -> e.getName().equals(as)).findFirst();
+                        if (shiftData != null && shiftData.isPresent()) {
+                            ass.add(shiftData.get().getId().toString());
+                        } else {
+                            return CommonResult.fail(name + "的" + as + "数据不存在");
+                        }
+                    }
+                    data.setArticleId(StringUtils.join(ass, ','));
+                    result.add(data);
+                }
+
+                //价格
+                BigDecimal price = new BigDecimal(String.valueOf(row.getCell(3))).stripTrailingZeros();
+                data.setPrice(price);
+            }
+        }
+
+        return CommonResult.ok(result);
+    }
+
+    private CommonResult<List<RepairConsume>> readXlsx(InputStream inputStream) throws IOException {
+        XSSFWorkbook sheets = new XSSFWorkbook(inputStream);
+        List<RepairConsume> result = new ArrayList<>();
+        List<String> ConsumeNames = new ArrayList<>();
+        //读取第一张sheet
+        XSSFSheet sheetAt = sheets.getSheetAt(0);
+
+        //获取校区数据
+        List<RepairSchoolVo> schools = repairAreaService.queryRepairSchools();
+        //报修物品
+        List<RepairArticleType> articles = repairArticleTypeService.getRepairArticleTypes();
+
+        DataFormatter dataFormatter = new DataFormatter();
+        //sheetAt.getLastRowNum():从0开始统计数量 所以得+1
+        for (int rowNum = 1; rowNum < sheetAt.getLastRowNum() + 1; rowNum++) {
+
+            XSSFRow row = sheetAt.getRow(rowNum);
+
+            if (rowNum == 1) {
+                String name = dataFormatter.formatCellValue(row.getCell(0));//耗材名称
+                if (!name.equals("名称")) {
+                    return CommonResult.fail("导入数据第一列为名称");
+                }
+                String schoolName = dataFormatter.formatCellValue(row.getCell(1));//校区名称
+                if (!schoolName.equals("校区")) {
+                    return CommonResult.fail("导入数据第二列为校区");
+                }
+                String ArticleName = dataFormatter.formatCellValue(row.getCell(2));//报修物品类别
+                if (!ArticleName.equals("类别")) {
+                    return CommonResult.fail("导入数据第三列为类别");
+                }
+                String price = dataFormatter.formatCellValue(row.getCell(3));//耗材单价
+                if (!price.equals("价格(元)")) {
+                    return CommonResult.fail("导入数据第四列为价格");
+                }
+
+            } else {
+                RepairConsume data = new RepairConsume();
+                //耗材名称
+                String name = dataFormatter.formatCellValue(row.getCell(0));
+                ConsumeNames.add(name);
+                if (ConsumeNames.stream().distinct().count() != ConsumeNames.size()) {
+                    return CommonResult.fail("导入的Excel中" + name + "存在重复数据");
+                }
+                data.setName(name);
+                //校区
+                String schoolName = dataFormatter.formatCellValue(row.getCell(1));
+                Optional<RepairSchoolVo> school = schools.stream().filter(e -> e.getName().equals(schoolName)).findFirst();
+                if (school != null && school.isPresent()) {
+                    data.setSchoolId(school.get().getId());
+                } else {
+                    return CommonResult.fail(name + "的" + schoolName + "校区数据在数据库中不存在");
+                }
+                //报修物品(类别)
+                String article = dataFormatter.formatCellValue(row.getCell(2));
+                String[] articleStrs = null;
+                if (article.contains("、")) {
+                    articleStrs = article.split("、");
+                } else if (article.contains(",")) {
+                    articleStrs = article.split(",");
+                } else {
+                    articleStrs = new String[1];
+                    articleStrs[0] = article;
+                }
+                List<String> ass = new ArrayList<>();
+                for (String as : articleStrs) {
+                    if (!as.equals("")) {
+                        Optional<RepairArticleType> shiftData = articles.stream().filter(e -> e.getName().equals(as)).findFirst();
+                        if (shiftData != null && shiftData.isPresent()) {
+                            ass.add(shiftData.get().getId().toString());
+                        } else {
+                            return CommonResult.fail(name + "的" + as + "数据不存在");
+                        }
+                    }
+                    data.setArticleId(StringUtils.join(ass, ','));
+                    result.add(data);
+                }
+
+                //价格
+                BigDecimal price = new BigDecimal(dataFormatter.formatCellValue(row.getCell(3)));
+                data.setPrice(price);
+            }
+        }
+
+        return CommonResult.ok(result);
+    }
+}
+

+ 75 - 0
src/main/java/com/repair/controller/RepairDispatchRecordController.java

@@ -0,0 +1,75 @@
+package com.repair.controller;
+
+
+import com.repair.api.RepairDispatchRecordControllerAPI;
+import com.repair.common.utils.paramUtils;
+import com.repair.model.pojo.RepairDispatchRecord;
+import com.repair.model.pojo.RepairDispatchRecord;
+import com.repair.model.pojo.RepairDispatchRecord;
+import com.repair.model.result.CommonResult;
+import com.repair.model.result.PageUtils;
+import com.repair.services.RepairDispatchRecordService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-07-20
+ */
+@RestController
+public class RepairDispatchRecordController implements RepairDispatchRecordControllerAPI {
+
+    @Autowired
+    private RepairDispatchRecordService repairDispatchRecordService;
+
+    @Override
+    public CommonResult InsertrepairDispatchRecord(RepairDispatchRecord rc, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        int result = repairDispatchRecordService.insertRepairDispatchRecord(rc);
+
+        return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败");
+    }
+
+    @Override
+    public CommonResult updaterepairDispatchRecordById(RepairDispatchRecord rc, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        int result = repairDispatchRecordService.updateRepairDispatchRecord(rc);
+
+        return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
+    }
+
+    @Override
+    public CommonResult queryPagerepairDispatchRecords(int currentPage, int pageCount, String name) {
+        PageUtils<RepairDispatchRecord> result = repairDispatchRecordService.queryPageRepairDispatchRecords(currentPage, pageCount, name);
+
+        return CommonResult.ok(result);
+    }
+
+    @Override
+    public CommonResult deleterepairDispatchRecordById(int id) {
+        RepairDispatchRecord data = repairDispatchRecordService.getRepairById(id);
+        if (data == null) {
+            return CommonResult.fail("当前数据不存在,删除失败!");
+        }
+
+        int result = repairDispatchRecordService.deleteRepairDispatchRecordById(id);
+
+        return result > 0 ? CommonResult.ok("删除成功") : CommonResult.fail("删除失败");
+    }
+}
+

+ 89 - 0
src/main/java/com/repair/controller/RepairEvaluateController.java

@@ -0,0 +1,89 @@
+package com.repair.controller;
+
+
+import com.alibaba.excel.EasyExcel;
+import com.repair.api.RepairEvaluateControllerAPI;
+import com.repair.common.utils.ExcelUtils;
+import com.repair.common.utils.paramUtils;
+import com.repair.model.pojo.RepairEvaluate;
+import com.repair.model.result.CommonResult;
+import com.repair.model.result.PageUtils;
+import com.repair.model.vo.EvaluateVo;
+import com.repair.services.RepairEvaluateService;
+import org.apache.poi.ss.formula.functions.T;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+import java.net.URLEncoder;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-07-10
+ */
+@RestController
+public class RepairEvaluateController implements RepairEvaluateControllerAPI {
+
+    @Autowired
+    private RepairEvaluateService repairEvaluateService;
+
+    @Override
+    public CommonResult InsertRepairEvaluate(@RequestBody RepairEvaluate repairEvaluate, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+        int result = repairEvaluateService.insertRepairEvaluate(repairEvaluate);// 帮我们自动生成id
+
+        return result > 0 ? CommonResult.ok() : CommonResult.fail();
+    }
+
+    @Override
+    public CommonResult queryPageRepairEvaluates(@RequestParam int currentPage, @RequestParam int pageCount, String keyWord, String startTime, String endTime) {
+        PageUtils<RepairEvaluate> result = repairEvaluateService.queryPageList(currentPage, pageCount, keyWord, startTime, endTime);
+
+        return CommonResult.ok(result);
+    }
+
+    @Override
+    public CommonResult deleteRepairEvaluateById(int id) {
+        RepairEvaluate data = repairEvaluateService.getRepairById(String.valueOf(id));
+        if (data == null) {
+            return CommonResult.fail("当前数据不存在,删除失败!");
+        }
+
+        int result = repairEvaluateService.deleteRepairEvaluateById(id);
+
+        return result > 0 ? CommonResult.ok() : CommonResult.fail();
+    }
+
+    @Override
+    public void toRepairEvaluateExcel(HttpServletResponse response,String keyWord, String startTime, String endTime) {
+        List<EvaluateVo> result = repairEvaluateService.queryEvaluateList(keyWord, startTime, endTime);
+
+        String sheelName = "评价信息";
+        try {
+            String fileName = URLEncoder.encode(sheelName + new Date().getTime(), "UTF-8");
+            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+            response.setCharacterEncoding("utf-8");
+            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+
+            EasyExcel.write(response.getOutputStream(), EvaluateVo.class).sheet(sheelName).doWrite(result);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}
+

+ 72 - 0
src/main/java/com/repair/controller/RepairLeaveMessageController.java

@@ -0,0 +1,72 @@
+package com.repair.controller;
+
+
+import com.repair.api.RepairLeaveMessageControllerAPI;
+import com.repair.common.utils.paramUtils;
+import com.repair.model.pojo.RepairLeaveMessage;
+import com.repair.model.result.CommonResult;
+import com.repair.model.result.PageUtils;
+import com.repair.services.RepairLeaveMessageService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.BindingResult;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-07-20
+ */
+@RestController
+public class RepairLeaveMessageController implements RepairLeaveMessageControllerAPI {
+
+    @Autowired
+    private RepairLeaveMessageService repairLeaveMessageService;
+
+    @Override
+    public CommonResult InsertrepairLeaveMessage(RepairLeaveMessage rc, BindingResult bindingResult){
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        int result = repairLeaveMessageService.insertRepairLeaveMessage(rc);
+
+        return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败");
+    }
+
+    @Override
+    public CommonResult updaterepairLeaveMessageById(RepairLeaveMessage rc, BindingResult bindingResult){
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        int result = repairLeaveMessageService.updateRepairLeaveMessage(rc);
+
+        return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
+    }
+
+    @Override
+    public CommonResult queryPagerepairLeaveMessages(int currentPage, int pageCount, String name) {
+        PageUtils<RepairLeaveMessage> result = repairLeaveMessageService.queryPageRepairLeaveMessages(currentPage, pageCount, name);
+
+        return CommonResult.ok(result);
+    }
+
+    @Override
+    public CommonResult deleterepairLeaveMessageById(int id) {
+        RepairLeaveMessage data = repairLeaveMessageService.getRepairById(id);
+        if (data == null) {
+            return CommonResult.fail("当前数据不存在,删除失败!");
+        }
+
+        int result = repairLeaveMessageService.deleteRepairLeaveMessageById(id);
+
+        return result > 0 ? CommonResult.ok("删除成功") : CommonResult.fail("删除失败");
+    }
+}
+

+ 148 - 0
src/main/java/com/repair/controller/RepairNoticeSettingController.java

@@ -0,0 +1,148 @@
+package com.repair.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.repair.api.RepairNoticeSettingControllerAPI;
+import com.repair.common.utils.paramUtils;
+import com.repair.model.enumModel.eIsTop;
+import com.repair.model.enumModel.eStatu;
+import com.repair.model.pojo.RepairAdmin;
+import com.repair.model.pojo.RepairNoticeSetting;
+import com.repair.model.result.CommonResult;
+import com.repair.model.result.PageUtils;
+import com.repair.model.vo.NoticePageVo;
+import com.repair.model.vo.NoticeVo;
+import com.repair.services.RepairNoticeSettingService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import java.text.ParseException;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-07-11
+ */
+@RestController
+public class RepairNoticeSettingController implements RepairNoticeSettingControllerAPI {
+
+    @Autowired
+    private RepairNoticeSettingService repairNoticeSettingService;
+
+    /**
+     * 新增公告数据
+     * @param repairNoticeSetting
+     * @param bindingResult
+     * @return
+     */
+    @Override
+    public CommonResult InsertRepairNoticeSetting(RepairNoticeSetting repairNoticeSetting, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+        int result = repairNoticeSettingService.insertRepairNoticeSetting(repairNoticeSetting);
+
+        return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败");
+    }
+
+    /**
+     * 编辑公告数据
+     * @param ra
+     * @param bindingResult
+     * @return
+     */
+    @Override
+    public CommonResult updateRepairNoticeSettingById(RepairNoticeSetting ra, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+        int result = repairNoticeSettingService.updateRepairNoticeSetting(ra);
+
+        return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
+    }
+
+    /**
+     * 查询公告分页数据
+     * @param currentPage 当前页
+     * @param pageCount 一页数据条数
+     * @param createTime 创建时间
+     * @return
+     */
+    @Override
+    public CommonResult queryPageRepairNoticeSettings(int currentPage, int pageCount, String createTime) throws ParseException {
+        PageUtils<NoticePageVo> result = repairNoticeSettingService.queryPageRepairNoticeSettings(currentPage, pageCount, createTime);
+
+        return CommonResult.ok(result);
+    }
+
+    /**
+     * 取消或置顶公告数据
+     * @param id 数据ID
+     * @param isTop 是否置顶
+     *               未置顶:0
+     *               置顶:1
+     * @return
+     */
+    @Override
+    public CommonResult cancelOrTopNoticeById(int id, int isTop) {
+        RepairNoticeSetting data = repairNoticeSettingService.getRepairById(id);
+        if (data == null) {
+            return CommonResult.fail("当前数据不存在,操作失败!");
+        }
+        if (data.getIsTop() == isTop) {
+            String Message = isTop == eIsTop.Top.getValue() ? "当前处于置顶状态,请勿重复操作!" : "当前处于未置顶状态,请勿重复操作!";
+            return CommonResult.fail(Message);
+        }
+
+        String success = isTop == eIsTop.Top.getValue() ? "置顶成功!" : "取消置顶成功";
+        String fail = isTop == eIsTop.Top.getValue() ? "置顶失败!" : "取消置顶失败";
+        RepairNoticeSetting ra = new RepairNoticeSetting();
+        ra.setId(id);
+        ra.setIsTop(isTop);
+        int result = repairNoticeSettingService.updateRepairNoticeSetting(ra);
+        System.out.println(result);
+        return result > 0 ? CommonResult.ok(success) : CommonResult.fail(fail);
+    }
+
+    /**
+     * 删除公告数据
+     * @param id 数据ID
+     * @return
+     */
+    @Override
+    public CommonResult deleteRepairNoticeSettingById(int id) {
+        RepairNoticeSetting data = repairNoticeSettingService.getRepairById(id);
+        if (data == null) {
+            return CommonResult.fail("当前数据不存在,删除失败!");
+        }
+
+        int result = repairNoticeSettingService.deleteRepairNoticeSettingById(id);
+
+        return result > 0 ? CommonResult.ok("删除成功") : CommonResult.fail("删除失败");
+    }
+
+    @Override
+    public CommonResult queryRepairNoticeSettingByTop() {
+        List<RepairNoticeSetting> result = repairNoticeSettingService.getRepairNotices();
+
+        NoticeVo data = new NoticeVo();
+
+        List<String> NotriceStr = result.stream().map(RepairNoticeSetting::getContent).collect(Collectors.toList());
+
+        data.setNoticeStr(StringUtils.join(NotriceStr, "    "));
+
+        return CommonResult.ok(data);
+    }
+}
+

+ 72 - 0
src/main/java/com/repair/controller/RepairPayRecordController.java

@@ -0,0 +1,72 @@
+package com.repair.controller;
+
+
+import com.repair.api.RepairPayRecordControllerAPI;
+import com.repair.common.utils.paramUtils;
+import com.repair.model.pojo.RepairPayRecord;
+import com.repair.model.result.CommonResult;
+import com.repair.model.result.PageUtils;
+import com.repair.services.RepairPayRecordService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.BindingResult;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-07-20
+ */
+@RestController
+public class RepairPayRecordController implements RepairPayRecordControllerAPI {
+
+    @Autowired
+    private RepairPayRecordService repairPayRecordService;
+
+    @Override
+    public CommonResult InsertrepairPayRecord(RepairPayRecord rc, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        int result = repairPayRecordService.insertRepairPayRecord(rc);
+
+        return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败");
+    }
+
+    @Override
+    public CommonResult updaterepairPayRecordById(RepairPayRecord rc, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        int result = repairPayRecordService.updateRepairPayRecord(rc);
+
+        return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
+    }
+
+    @Override
+    public CommonResult queryPagerepairPayRecords(int currentPage, int pageCount, String name) {
+        PageUtils<RepairPayRecord> result = repairPayRecordService.queryPageRepairPayRecords(currentPage, pageCount, name);
+
+        return CommonResult.ok(result);
+    }
+
+    @Override
+    public CommonResult deleterepairPayRecordById(int id) {
+        RepairPayRecord data = repairPayRecordService.getRepairById(id);
+        if (data == null) {
+            return CommonResult.fail("当前数据不存在,删除失败!");
+        }
+
+        int result = repairPayRecordService.deleteRepairPayRecordById(id);
+
+        return result > 0 ? CommonResult.ok("删除成功") : CommonResult.fail("删除失败");
+    }
+}
+

+ 74 - 0
src/main/java/com/repair/controller/RepairReceivingController.java

@@ -0,0 +1,74 @@
+package com.repair.controller;
+
+
+import com.repair.api.RepairReceivingControllerAPI;
+import com.repair.common.utils.paramUtils;
+import com.repair.model.pojo.RepairReceiving;
+import com.repair.model.pojo.RepairReceiving;
+import com.repair.model.result.CommonResult;
+import com.repair.model.result.PageUtils;
+import com.repair.services.RepairReceivingService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-07-20
+ */
+@RestController
+public class RepairReceivingController implements RepairReceivingControllerAPI {
+
+    @Autowired
+    private RepairReceivingService repairReceivingService;
+
+    @Override
+    public CommonResult InsertrepairReceiving(RepairReceiving rc, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        int result = repairReceivingService.insertRepairReceiving(rc);
+
+        return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败");
+    }
+
+    @Override
+    public CommonResult updaterepairReceivingById(RepairReceiving rc, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        int result = repairReceivingService.updateRepairReceiving(rc);
+
+        return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
+    }
+
+    @Override
+    public CommonResult queryPagerepairReceivings(int currentPage, int pageCount, String name) {
+        PageUtils<RepairReceiving> result = repairReceivingService.queryPageRepairReceivings(currentPage, pageCount, name);
+
+        return CommonResult.ok(result);
+    }
+
+    @Override
+    public CommonResult deleterepairReceivingById(int id) {
+        RepairReceiving data = repairReceivingService.getRepairById(id);
+        if (data == null) {
+            return CommonResult.fail("当前数据不存在,删除失败!");
+        }
+
+        int result = repairReceivingService.deleteRepairReceivingById(id);
+
+        return result > 0 ? CommonResult.ok("删除成功") : CommonResult.fail("删除失败");
+    }
+}
+

+ 207 - 0
src/main/java/com/repair/controller/RepairRecordController.java

@@ -0,0 +1,207 @@
+package com.repair.controller;
+
+
+import com.jcraft.jsch.*;
+import com.repair.api.RepairRecordControllerAPI;
+import com.repair.common.utils.StrUtils;
+import com.repair.common.utils.TimeExchange;
+import com.repair.common.utils.paramUtils;
+import com.repair.model.enumModel.eRecordStatu;
+import com.repair.model.pojo.RepairConsumables;
+import com.repair.model.pojo.RepairRecord;
+import com.repair.model.request.repairRecordRequest;
+import com.repair.model.result.CommonResult;
+import com.repair.model.result.PageUtils;
+import com.repair.model.vo.MyRepairRecordVo;
+import com.repair.model.vo.RepairRecordCountVo;
+import com.repair.model.vo.UploadFileVo;
+import com.repair.services.RepairConsumablesService;
+import com.repair.services.RepairRecordService;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.time.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.BindingResult;
+
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.InputStream;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.repair.common.utils.StrUtils.getUUIDBits;
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-07-24
+ */
+@RestController
+public class RepairRecordController implements RepairRecordControllerAPI {
+
+    @Autowired
+    private RepairRecordService repairRecordService;
+    @Autowired
+    private RepairConsumablesService repairConsumablesService;
+
+    @Override
+    public CommonResult InsertRepairRecord(repairRecordRequest rrr, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+        RepairRecord rr = new RepairRecord();
+        rr.setAreaId(rrr.getAreaId());
+        rr.setArticleId(rrr.getArticleId());
+        rr.setRecordNo(getUUIDBits(15));
+        rr.setAddress(rrr.getAddress());
+        rr.setDescription(rrr.getDescription());
+        rr.setImage(StringUtils.join(rrr.getImages(), ','));
+        rr.setVoice(rrr.getVoice());
+        rr.setUserId(rrr.getUserId());
+        rr.setUserName(rrr.getUserName());
+        rr.setUserPhone(rrr.getUserPhone());
+        rr.setReportTime(new Date());
+        rr.setMaintenanceState(eRecordStatu.Dispatch.getValue());
+        int result = repairRecordService.insertRepairRecord(rr);
+
+        return result > 0 ? CommonResult.ok("提交成功") : CommonResult.fail("提交失败");
+    }
+
+    @Override
+    public CommonResult updateRepairRecordById(RepairRecord rr, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        int result = repairRecordService.updateRepairRecord(rr);
+
+        return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
+    }
+
+    @Override
+    public CommonResult queryPageRepairRecords(int currentPage, int pageCount, String name) {
+        PageUtils<RepairRecord> result = repairRecordService.queryPageRepairRecords(currentPage, pageCount, name);
+
+        return CommonResult.ok(result);
+    }
+
+    @Override
+    public CommonResult deleteRepairRecordById(int id) {
+        RepairRecord data = repairRecordService.getRepairById(id);
+        if (data == null) {
+            return CommonResult.fail("当前数据不存在,删除失败!");
+        }
+
+        int result = repairRecordService.deleteRepairRecordById(id);
+
+        return result > 0 ? CommonResult.ok("删除成功") : CommonResult.fail("删除失败");
+    }
+
+    @Override
+    public CommonResult uploadFile(MultipartFile file) throws Exception {
+
+        UploadFileVo result = new UploadFileVo();
+
+        String name = StrUtils.getRandomName(file.getOriginalFilename());
+
+        String user = "root"; //SFTP服务器用户名
+        String password = "Best@123!@#"; // SFTP服务器密码
+        String host = "172.16.20.92";  //  SFTP服务器地址
+        int port = 22; // SFTP 服务器端口
+        String remoteDirPath = "/usr/local/nginx/image"; // 远程目录路径
+        //从MultipartFile对象中获取流
+        InputStream inputStream = null;
+        inputStream = file.getInputStream();
+//        String downpath="/book/《Python爬虫开发与项目实战》.pdf";
+//        String spath="C:/Users/F1339769/Desktop";
+        JSch jsch = new JSch();
+        Session session = null;
+        ChannelSftp channelSftp = null;
+        try {
+            session = jsch.getSession(user, host, port);
+            session.setPassword(password);
+            session.setConfig("StrictHostKeyChecking", "no");
+            session.connect(30000);
+            System.out.println("连接成功");
+            channelSftp = (ChannelSftp) session.openChannel("sftp");
+            channelSftp.connect();
+            // 创建远程目录
+            String[] dirArr = remoteDirPath.split("/");
+            String path = "";
+            for (int i = 0; i < dirArr.length; i++) {
+                path = path + "/" + dirArr[i];
+                try {
+                    channelSftp.cd(path);
+                } catch (SftpException e) {
+                    channelSftp.mkdir(path);
+                    channelSftp.cd(path);
+                }
+            }
+            //  文件上传到远程服务器上
+            channelSftp.put(inputStream, name);
+            //  从远程服务器上下载文件
+            //channelSftp.get(downpath, spath);
+        } catch (JSchException e) {
+            e.printStackTrace();
+        } finally {
+            if (channelSftp != null) {
+                channelSftp.disconnect();
+            }
+            if (session != null) {
+                session.disconnect();
+            }
+            result.setResultUrl("https://chtech.ncjti.edu.cn/campusMaintenance/image/" + name);
+        }
+        return CommonResult.ok(result);
+    }
+
+    @Override//还要处理一下订单超时状态
+    public CommonResult getRepairRecordsByUserId(int currentPage, int pageCount, int userId, int state) {
+        PageUtils<MyRepairRecordVo> result = repairRecordService.queryMyRepairRecordList(currentPage, pageCount, state, userId);
+
+        List<Integer> recordIds = result.getList().stream().map(MyRepairRecordVo::getId).collect(Collectors.toList());
+
+        List<RepairConsumables> rcs = repairConsumablesService.getRepairsByRecordIds(recordIds);
+
+        for (MyRepairRecordVo r : result.getList()) {
+            r.setState(eRecordStatu.stringOf(r.getStateId()));
+            r.setImages(Arrays.asList(r.getImage().split(",")));
+            List<RepairConsumables> datas = rcs.stream().filter(e -> e.getRecordId() == r.getId()).collect(Collectors.toList());
+            r.setConsumables(datas);
+
+            //状态为待接单 判断是否是超时未接
+            if (r.getStateId() == eRecordStatu.Dispatch.getValue()) {
+                //超时未接判断标准:派单时间 < (当前时间 - 接单考核时间)
+                if (r.getDispatchTime() != null) {
+                    Date dateTime = DateUtils.addMinutes(new Date(), -r.getAcceptanceAssessTime());
+
+                    if(r.getDispatchTime().before(dateTime)){
+                        r.setTimeoutStr("超时未接");
+                    }
+                }
+            }
+            //维修超时 报修时间 < (当前时间 - 维修考核时间)
+            if(r.getMaintenanceAssessTime() != null){
+                Date dateTime = DateUtils.addMinutes(new Date(), -r.getMaintenanceAssessTime());
+
+                if(r.getReportTime().before(dateTime)){
+                    r.setTimeoutStr("维修超时");
+                }
+            }
+        }
+        return CommonResult.ok(result);
+    }
+
+
+    @Override
+    public CommonResult getRepairRecordCountByUserId(int userId) {
+        RepairRecordCountVo result = repairRecordService.getRepairRecordCount(userId);
+        return CommonResult.ok(result);
+    }
+}
+

+ 72 - 0
src/main/java/com/repair/controller/RepairRefundRecordController.java

@@ -0,0 +1,72 @@
+package com.repair.controller;
+
+
+import com.repair.api.RepairRefundRecordControllerAPI;
+import com.repair.common.utils.paramUtils;
+import com.repair.model.pojo.RepairRefundRecord;
+import com.repair.model.result.CommonResult;
+import com.repair.model.result.PageUtils;
+import com.repair.services.RepairRefundRecordService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.BindingResult;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-07-20
+ */
+@RestController
+public class RepairRefundRecordController implements RepairRefundRecordControllerAPI {
+
+    @Autowired
+    private RepairRefundRecordService repairRefundRecordService;
+
+    @Override
+    public CommonResult InsertrepairRefundRecord(RepairRefundRecord rc, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        int result = repairRefundRecordService.insertRepairRefundRecord(rc);
+
+        return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败");
+    }
+
+    @Override
+    public CommonResult updaterepairRefundRecordById(RepairRefundRecord rc, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        int result = repairRefundRecordService.updateRepairRefundRecord(rc);
+
+        return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
+    }
+
+    @Override
+    public CommonResult queryPagerepairRefundRecords(int currentPage, int pageCount, String name) {
+        PageUtils<RepairRefundRecord> result = repairRefundRecordService.queryPageRepairRefundRecords(currentPage, pageCount, name);
+
+        return CommonResult.ok(result);
+    }
+
+    @Override
+    public CommonResult deleterepairRefundRecordById(int id) {
+        RepairRefundRecord data = repairRefundRecordService.getRepairById(id);
+        if (data == null) {
+            return CommonResult.fail("当前数据不存在,删除失败!");
+        }
+
+        int result = repairRefundRecordService.deleteRepairRefundRecordById(id);
+
+        return result > 0 ? CommonResult.ok("删除成功") : CommonResult.fail("删除失败");
+    }
+}
+

+ 76 - 0
src/main/java/com/repair/controller/RepairSchoolController.java

@@ -0,0 +1,76 @@
+package com.repair.controller;
+
+
+import com.repair.api.RepairSchoolControllerAPI;
+import com.repair.common.utils.paramUtils;
+import com.repair.model.pojo.RepairSchool;
+import com.repair.model.result.CommonResult;
+import com.repair.model.result.PageUtils;
+import com.repair.services.RepairSchoolService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-07-12
+ */
+@RestController
+public class RepairSchoolController implements RepairSchoolControllerAPI {
+
+    @Autowired
+    private RepairSchoolService repairSchoolService;
+
+    @Override
+    public CommonResult InsertRepairSchool(RepairSchool repairSchool, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+        int result = 0;
+        try {
+            result = repairSchoolService.insertRepairSchool(repairSchool);
+        } catch (Exception e) {
+            if (e.getCause().getMessage().contains("'repair_school.name_unique'")) {
+                return CommonResult.fail("该校区名称已存在!");
+            }
+            return CommonResult.fail("系统异常,用户数据添加失败!");
+        }
+
+        return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败");
+    }
+
+    @Override
+    public CommonResult updateRepairSchoolById(RepairSchool ra, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+        int result = repairSchoolService.updateRepairSchool(ra);
+
+        return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
+    }
+
+    @Override
+    public CommonResult queryPageRepairSchools(int currentPage, int pageCount, String name) {
+        PageUtils<RepairSchool> result = repairSchoolService.queryPageRepairSchools(currentPage, pageCount, name);
+        return CommonResult.ok(result);
+    }
+
+    @Override
+    public CommonResult deleteRepairSchoolById(int id) {
+        RepairSchool data = repairSchoolService.getRepairById(id);
+        if (data == null) {
+            return CommonResult.fail("当前数据不存在,删除失败!");
+        }
+
+        int result = repairSchoolService.deleteRepairSchoolById(id);
+
+        return result > 0 ? CommonResult.ok("删除成功") : CommonResult.fail("删除失败");
+    }
+}
+

+ 104 - 0
src/main/java/com/repair/controller/RepairShiftSettingsController.java

@@ -0,0 +1,104 @@
+package com.repair.controller;
+
+
+import com.repair.api.RepairShiftSettingsControllerAPI;
+import com.repair.common.utils.TimeExchange;
+import com.repair.common.utils.paramUtils;
+import com.repair.model.pojo.RepairShiftSettings;
+import com.repair.model.request.insertRepairShiftSettingRequest;
+import com.repair.model.request.updateRepairShiftRequest;
+import com.repair.model.result.CommonResult;
+import com.repair.model.result.PageUtils;
+import com.repair.services.RepairShiftSettingsService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import java.text.ParseException;
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-07-13
+ */
+@RestController
+public class RepairShiftSettingsController implements RepairShiftSettingsControllerAPI {
+
+    @Autowired
+    private RepairShiftSettingsService repairShiftSettingsService;
+
+    @Override
+    public CommonResult InsertRepairShiftSettings(insertRepairShiftSettingRequest irssr, BindingResult bindingResult) throws ParseException {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        if (!TimeExchange.CompareDate(irssr.getStartTime(), irssr.getEndTime(), "HH:mm")) {
+            return CommonResult.fail("开始时间不能大于结束时间");
+        }
+
+        RepairShiftSettings rss = new RepairShiftSettings();
+        rss.setName(irssr.getName());
+        rss.setStartTime(irssr.getStartTime());
+        rss.setEndTime(irssr.getEndTime());
+        rss.setNotWorkTime(StringUtils.join(irssr.getNotWorkTime(), ','));
+        rss.setIsDuty(irssr.getIsDuty());
+        rss.setColor(irssr.getColor());
+
+        int result = repairShiftSettingsService.insertRepairShiftSettings(rss);
+
+        return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败");
+    }
+
+    @Override
+    public CommonResult updateRepairShiftSettingsById(updateRepairShiftRequest ursr, BindingResult bindingResult) throws ParseException {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        if (!TimeExchange.CompareDate(ursr.getStartTime(), ursr.getEndTime(), "HH:mm")) {
+            return CommonResult.fail("开始时间不能大于结束时间");
+        }
+
+        RepairShiftSettings ra = new RepairShiftSettings();
+        ra.setId(ursr.getId());
+        ra.setName(ursr.getName());
+        ra.setStartTime(ursr.getStartTime());
+        ra.setEndTime(ursr.getEndTime());
+        ra.setNotWorkTime(StringUtils.join(ursr.getNotWorkTime(), ','));
+        ra.setColor(ursr.getColor());
+        ra.setIsDuty(ursr.getIsDuty());
+
+        int result = repairShiftSettingsService.updateRepairShiftSettings(ra);
+
+        return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
+    }
+
+    @Override
+    public CommonResult queryPageRepairShiftSettingss(int currentPage, int pageCount, String name) {
+        PageUtils<RepairShiftSettings> result = repairShiftSettingsService.queryPageRepairShiftSettingss(currentPage, pageCount, name);
+
+        return CommonResult.ok(result);
+    }
+
+    @Override
+    public CommonResult deleteRepairShiftSettingsById(int id) {
+        RepairShiftSettings data = repairShiftSettingsService.getRepairById(id);
+        if (data == null) {
+            return CommonResult.fail("当前数据不存在,删除失败!");
+        }
+
+        int result = repairShiftSettingsService.deleteRepairShiftSettingsById(id);
+
+        return result > 0 ? CommonResult.ok("删除成功") : CommonResult.fail("删除失败");
+    }
+}
+

+ 72 - 0
src/main/java/com/repair/controller/RepairSystemMessagesController.java

@@ -0,0 +1,72 @@
+package com.repair.controller;
+
+
+import com.repair.api.RepairSystemMessagesControllerAPI;
+import com.repair.common.utils.paramUtils;
+import com.repair.model.pojo.RepairSystemMessages;
+import com.repair.model.result.CommonResult;
+import com.repair.model.result.PageUtils;
+import com.repair.services.RepairSystemMessagesService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.BindingResult;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-07-20
+ */
+@RestController
+public class RepairSystemMessagesController implements RepairSystemMessagesControllerAPI {
+
+    @Autowired
+    private RepairSystemMessagesService repairSystemMessagesService;
+
+    @Override
+    public CommonResult InsertrepairSystemMessages(RepairSystemMessages rc, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        int result = repairSystemMessagesService.insertRepairSystemMessages(rc);
+
+        return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败");
+    }
+
+    @Override
+    public CommonResult updaterepairSystemMessagesById(RepairSystemMessages rc, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        int result = repairSystemMessagesService.updateRepairSystemMessages(rc);
+
+        return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
+    }
+
+    @Override
+    public CommonResult queryPagerepairSystemMessagess(int currentPage, int pageCount, String name) {
+        PageUtils<RepairSystemMessages> result = repairSystemMessagesService.queryPageRepairSystemMessagess(currentPage, pageCount, name);
+
+        return CommonResult.ok(result);
+    }
+
+    @Override
+    public CommonResult deleterepairSystemMessagesById(int id) {
+        RepairSystemMessages data = repairSystemMessagesService.getRepairById(id);
+        if (data == null) {
+            return CommonResult.fail("当前数据不存在,删除失败!");
+        }
+
+        int result = repairSystemMessagesService.deleteRepairSystemMessagesById(id);
+
+        return result > 0 ? CommonResult.ok("删除成功") : CommonResult.fail("删除失败");
+    }
+}
+

+ 73 - 0
src/main/java/com/repair/controller/RepairSystemSettingController.java

@@ -0,0 +1,73 @@
+package com.repair.controller;
+
+
+import com.repair.api.RepairSystemSettingControllerAPI;
+import com.repair.common.utils.paramUtils;
+import com.repair.model.pojo.RepairAdmin;
+import com.repair.model.pojo.RepairSystemSetting;
+import com.repair.model.result.CommonResult;
+import com.repair.services.RepairSystemSettingService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-07-11
+ */
+@RestController
+public class RepairSystemSettingController implements RepairSystemSettingControllerAPI {
+    @Autowired
+    private RepairSystemSettingService repairSystemSettingService;
+
+    /**
+     * 查询系统设置数据
+     * @return
+     */
+    @Override
+    public CommonResult QueryRepairSystemSetting() {
+        RepairSystemSetting result = repairSystemSettingService.queryRepairSystemSetting();
+        return CommonResult.ok(result);
+    }
+
+    /**
+     * 新增系统设置数据
+     * @param repairSystemSetting
+     * @param bindingResult
+     * @return
+     */
+    @Override
+    public CommonResult InsertRepairSystemSetting(RepairSystemSetting repairSystemSetting, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+        int result = repairSystemSettingService.insertRepairSystemSetting(repairSystemSetting);
+
+        return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败");
+    }
+
+    /**
+     * 修改系统设置数据
+     * @param ra
+     * @param bindingResult
+     * @return
+     */
+    @Override
+    public CommonResult updateRepairSystemSettingById(RepairSystemSetting ra, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+        int result = repairSystemSettingService.updateRepaiSystemSetting(ra);
+
+        return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
+    }
+}
+

+ 74 - 0
src/main/java/com/repair/controller/RepairTrackRecordController.java

@@ -0,0 +1,74 @@
+package com.repair.controller;
+
+
+import com.repair.api.RepairTrackRecordControllerAPI;
+import com.repair.common.utils.paramUtils;
+import com.repair.model.pojo.RepairTrackRecord;
+import com.repair.model.pojo.RepairTrackRecord;
+import com.repair.model.result.CommonResult;
+import com.repair.model.result.PageUtils;
+import com.repair.services.RepairTrackRecordService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-07-20
+ */
+@RestController
+public class RepairTrackRecordController implements RepairTrackRecordControllerAPI {
+
+    @Autowired
+    private RepairTrackRecordService repairTrackRecordService;
+
+    @Override
+    public CommonResult InsertrepairTrackRecord(RepairTrackRecord rc, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        int result = repairTrackRecordService.insertRepairTrackRecord(rc);
+
+        return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败");
+    }
+
+    @Override
+    public CommonResult updaterepairTrackRecordById(RepairTrackRecord rc, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        int result = repairTrackRecordService.updateRepairTrackRecord(rc);
+
+        return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
+    }
+
+    @Override
+    public CommonResult queryPagerepairTrackRecords(int currentPage, int pageCount, String name) {
+        PageUtils<RepairTrackRecord> result = repairTrackRecordService.queryPageRepairTrackRecords(currentPage, pageCount, name);
+
+        return CommonResult.ok(result);
+    }
+
+    @Override
+    public CommonResult deleterepairTrackRecordById(int id) {
+        RepairTrackRecord data = repairTrackRecordService.getRepairById(id);
+        if (data == null) {
+            return CommonResult.fail("当前数据不存在,删除失败!");
+        }
+
+        int result = repairTrackRecordService.deleteRepairTrackRecordById(id);
+
+        return result > 0 ? CommonResult.ok("删除成功") : CommonResult.fail("删除失败");
+    }
+}
+

+ 74 - 0
src/main/java/com/repair/controller/RepairTransferRecordController.java

@@ -0,0 +1,74 @@
+package com.repair.controller;
+
+
+import com.repair.api.RepairTransferRecordControllerAPI;
+import com.repair.common.utils.paramUtils;
+import com.repair.model.pojo.RepairTransferRecord;
+import com.repair.model.pojo.RepairTransferRecord;
+import com.repair.model.result.CommonResult;
+import com.repair.model.result.PageUtils;
+import com.repair.services.RepairTransferRecordService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-07-20
+ */
+@RestController
+public class RepairTransferRecordController implements RepairTransferRecordControllerAPI {
+
+    @Autowired
+    private RepairTransferRecordService repairTransferRecordService;
+
+    @Override
+    public CommonResult InsertrepairTransferRecord(RepairTransferRecord rc, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        int result = repairTransferRecordService.insertRepairTransferRecord(rc);
+
+        return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败");
+    }
+
+    @Override
+    public CommonResult updaterepairTransferRecordById(RepairTransferRecord rc, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        int result = repairTransferRecordService.updateRepairTransferRecord(rc);
+
+        return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
+    }
+
+    @Override
+    public CommonResult queryPagerepairTransferRecords(int currentPage, int pageCount, String name) {
+        PageUtils<RepairTransferRecord> result = repairTransferRecordService.queryPageRepairTransferRecords(currentPage, pageCount, name);
+
+        return CommonResult.ok(result);
+    }
+
+    @Override
+    public CommonResult deleterepairTransferRecordById(int id) {
+        RepairTransferRecord data = repairTransferRecordService.getRepairById(id);
+        if (data == null) {
+            return CommonResult.fail("当前数据不存在,删除失败!");
+        }
+
+        int result = repairTransferRecordService.deleteRepairTransferRecordById(id);
+
+        return result > 0 ? CommonResult.ok("删除成功") : CommonResult.fail("删除失败");
+    }
+}
+

+ 185 - 0
src/main/java/com/repair/controller/RepairUserController.java

@@ -0,0 +1,185 @@
+package com.repair.controller;
+
+import com.repair.api.RepairUserControllerAPI;
+import com.repair.common.utils.paramUtils;
+import com.repair.model.enumModel.eUserZZ;
+import com.repair.model.pojo.RepairUser;
+import com.repair.model.request.insertRepairUserRequest;
+import com.repair.model.request.updateUserDataRequest;
+import com.repair.model.result.CommonResult;
+import com.repair.model.result.PageUtils;
+import com.repair.model.vo.RepairUserVo;
+import com.repair.services.RepairUserService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.BindingResult;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Arrays;
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-07-11
+ */
+@RestController
+public class RepairUserController implements RepairUserControllerAPI {
+
+    @Autowired
+    private RepairUserService repairUserService;
+
+    /**
+     * 添加员工数据接口
+     *
+     * @param irur
+     * @param bindingResult
+     * @return
+     */
+    @Override
+    public CommonResult InsertRepairUser(insertRepairUserRequest irur, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        RepairUser data = repairUserService.getRepairByCardNumber(irur.getCardNumber());
+        RepairUser ru = new RepairUser();
+        if (data != null && !data.getUserZzid().equals(eUserZZ.User.getValue())) {
+            return CommonResult.fail("该卡号已存在!");
+        }
+        else if(data != null){
+            ru.setId(data.getId());
+        }
+        ru.setUserName(irur.getUserName());
+        ru.setCardNumber(irur.getCardNumber());
+        ru.setUserZzid(irur.getUserzzId());
+        ru.setTeamId(irur.getTeamId());
+        ru.setUserPhone(irur.getUserPhone());
+        ru.setSchoolId(irur.getSchoolId());
+        ru.setWorkType(irur.getWorkType());
+        ru.setArticle_id(StringUtils.join(irur.getArticleIds(), ','));
+        ru.setBuildId(StringUtils.join(irur.getBuildIds(), ','));
+        ru.setAcceptanceAssessTime(irur.getAcceptanceAssessTime());
+        ru.setMaintenanceAssessTime(irur.getMaintenanceAssessTime());
+
+        int result =0;
+        if(data != null){
+            result = repairUserService.updateRepairUser(ru);
+        }
+        else{
+            result = repairUserService.insertRepairUser(ru);
+        }
+
+        return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败");
+    }
+
+    /**
+     * 根据ID编辑用户数据的名称、手机号、身份、工种、维修班、楼栋关联ID、是否能转换、接单考核时间、维修考核时间
+     *
+     * @param ra
+     * @param bindingResult
+     * @return
+     */
+    @Override
+    public CommonResult updateRepairUserById(updateUserDataRequest ra, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+        RepairUser data = new RepairUser();
+        data.setId(ra.getId());
+        data.setUserName(ra.getUserName());
+        data.setUserPhone(ra.getUserPhone());
+        data.setUserZzid(ra.getUserZzid());
+        data.setWorkType(ra.getWorkType());
+        data.setTeamId(ra.getTeamId());
+        data.setArticle_id(StringUtils.join(ra.getArticleIds(), ','));
+        data.setBuildId(StringUtils.join(ra.getBuildIds(), ','));
+        data.setIsChange(ra.getIsChange());
+        data.setAcceptanceAssessTime(ra.getAcceptanceAssessTime());
+        data.setMaintenanceAssessTime(ra.getMaintenanceAssessTime());
+
+        int result = repairUserService.updateRepairUser(data);
+
+        return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
+    }
+
+    /**
+     * 用户分页数据查询
+     *
+     * @param currentPage 当前页
+     * @param pageCount   一页数据条数
+     * @param keyWord     关键字
+     * @param teamId      维修班
+     *                    校方人员:0
+     *                    第三方人员:1
+     * @param schoolId    校区ID
+     *                    黄家湖校区:1
+     *                    墨轩湖校区:2
+     * @return
+     * @Param schoolId   校区ID
+     */
+    @Override
+    public CommonResult queryPageRepairUser(int currentPage, int pageCount, String keyWord, Integer teamId, Integer schoolId) {
+        PageUtils<RepairUserVo> result = repairUserService.queryPageRepairUser(currentPage, pageCount, keyWord, teamId, schoolId);
+
+        for (RepairUserVo r :result.getList()) {
+            if(r.getBuildId() != null){
+                r.setBuildIds(Arrays.asList(r.getBuildId().split(",")));
+            }
+            if(r.getBuildName() != null){
+                r.setBuildNames(Arrays.asList(r.getBuildName().split(",")));
+            }
+            if(r.getArticleId() != null){
+                r.setArticleIds(Arrays.asList(r.getArticleId().split(",")));
+            }
+            if(r.getArticleName() != null){
+                r.setArticleNames(Arrays.asList(r.getArticleName().split(",")));
+            }
+        }
+
+        return CommonResult.ok(result);
+    }
+
+    /**
+     * 根据ID删除用户数据
+     *
+     * @param id
+     * @return
+     */
+    @Override
+    public CommonResult deleteRepairUserById(int id) {
+
+        RepairUser data = repairUserService.getRepairById(id);
+        if (data == null) {
+            return CommonResult.fail("当前数据不存在,删除失败!");
+        }
+
+        int result = repairUserService.deleteRepairUserById(id);
+
+        return result > 0 ? CommonResult.ok("删除成功") : CommonResult.fail("删除失败");
+    }
+
+    /**
+     * 根据卡号查找用户信息
+     *
+     * @param cardNumber 卡号
+     * @return
+     */
+    @Override
+    public CommonResult queryRepairUserByCardNumber(String cardNumber) {
+        RepairUser result = repairUserService.getRepairByCardNumber(cardNumber);
+        return result == null ? CommonResult.fail("数据不存在") : CommonResult.ok(result);
+    }
+
+    @Override
+    public CommonResult queryPageRepairUsers(int currentPage, int pageCount, Integer schoolId, String phone, Integer workTypId) {
+
+        return null;
+    }
+}
+

+ 114 - 0
src/main/java/com/repair/controller/RepairWorkTypeController.java

@@ -0,0 +1,114 @@
+package com.repair.controller;
+
+
+import com.repair.api.RepairWorkTypeControllerAPI;
+import com.repair.common.utils.paramUtils;
+import com.repair.model.enumModel.eUserZZ;
+import com.repair.model.pojo.RepairWorkType;
+import com.repair.model.result.CommonResult;
+import com.repair.model.result.PageUtils;
+import com.repair.model.vo.RepairWorkTypeVo;
+import com.repair.services.RepairWorkTypeService;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author ceshi
+ * @since 2023-07-18
+ */
+@RestController
+public class RepairWorkTypeController implements RepairWorkTypeControllerAPI {
+
+    @Autowired
+    private RepairWorkTypeService repairWorkTypeService;
+
+    @Override
+    public CommonResult InsertRepairWorkType(RepairWorkType rwt, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+
+        int result = 0;
+        try {
+            result = repairWorkTypeService.insertRepairWorkType(rwt);
+        } catch (Exception e) {
+            if (e.getCause().getMessage().contains("'repair_work_type.name_unique'")) {
+                return CommonResult.fail("该工种类型已存在!");
+            }
+            return CommonResult.fail("系统异常,添加失败!");
+        }
+
+        return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败");
+    }
+
+    @Override
+    public CommonResult updateRepairWorkTypeById(RepairWorkType rwt, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            String st = paramUtils.getParamError(bindingResult);
+            return CommonResult.fail(st);
+        }
+        if (rwt.getId() == null) {
+            return CommonResult.fail("数据ID不能为空");
+        }
+        int result = 0;
+        try {
+            result = repairWorkTypeService.updateRepairWorkType(rwt);
+        } catch (Exception e) {
+            if (e.getCause().getMessage().contains("'repair_work_type.name_unique'")) {
+                return CommonResult.fail("该工种类型已存在!");
+            }
+            return CommonResult.fail("系统异常,添加失败!");
+        }
+
+        return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
+    }
+
+    @Override
+    public CommonResult queryPageRepairWorkTypes(int currentPage, int pageCount, String name) {
+        PageUtils<RepairWorkType> result = repairWorkTypeService.queryPageRepairWorkTypes(currentPage, pageCount, name);
+        return CommonResult.ok(result);
+    }
+
+    @Override
+    public CommonResult deleteRepairWorkTypeById(int id) {
+        RepairWorkType data = repairWorkTypeService.getRepairById(id);
+        if (data == null) {
+            return CommonResult.fail("当前数据不存在,删除失败!");
+        }
+
+        int result = repairWorkTypeService.deleteRepairWorkTypeById(id);
+
+        return result > 0 ? CommonResult.ok("删除成功") : CommonResult.fail("删除失败");
+    }
+
+    @Override
+    public CommonResult getRepairWorkTypes() {
+        List<RepairWorkTypeVo> result = repairWorkTypeService.getRepairWorkTypes();
+
+        return CommonResult.ok(result);
+    }
+
+    @Override
+    public CommonResult getRepairIdentitys() {
+        List<RepairWorkTypeVo> result = new ArrayList<>();
+        for(int i = 0;i<4;i++){
+            RepairWorkTypeVo data = new RepairWorkTypeVo();
+            data.setId(i);
+            data.setName(eUserZZ.stringOf(i));
+            result.add(data);
+        }
+        return CommonResult.ok(result);
+    }
+
+}
+

+ 27 - 0
src/main/java/com/repair/core/CORSConfiguration.java

@@ -0,0 +1,27 @@
+package com.repair.core;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+public class CORSConfiguration{
+    @Bean
+    public WebMvcConfigurer corsConfigurer() {
+        return new WebMvcConfigurer() {
+            @Override
+            public void addCorsMappings(CorsRegistry registry) {
+                registry.addMapping("/**")
+                        //放行哪些原始域
+                        .allowedOrigins("*")
+                        //是否发送Cookie信息
+                        .allowCredentials(false)
+                        //放行哪些原始域(请求方式)
+                        .allowedMethods("GET", "POST", "DELETE", "PUT", "OPTIONS")
+                        //放行哪些原始域(头部信息)
+                        .allowedHeaders("*");
+            }
+        };
+    }
+}

+ 113 - 0
src/main/java/com/repair/core/JwtAuthenticationInterceptor.java

@@ -0,0 +1,113 @@
+package com.repair.core;
+
+import com.auth0.jwt.interfaces.Claim;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.repair.annotation.PassToken;
+import com.repair.common.exception.MyCustomException;
+import com.repair.common.result.ResponseStatusEnum;
+import com.repair.common.utils.JWTUtil;
+import org.json.JSONObject;
+import org.springframework.util.StringUtils;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.PrintWriter;
+import java.lang.reflect.Method;
+import java.util.Map;
+
+public class JwtAuthenticationInterceptor implements HandlerInterceptor {
+
+    /**
+     * preHandle:进入到控制器方法之前执行的内容
+     *     boolean:
+     *         true:可以继续执行控制器方法
+     *         false:拦截
+     * posthandler:执行控制器方法之后执行的内容
+     * afterCompletion:响应结束之前执行的内容
+     *///说明
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+
+        //region 检查是否有passtoken注释,有则跳过认证
+        //PassToken注解用在方法上面
+        HandlerMethod handlerMethod = (HandlerMethod) handler;
+        Method method = handlerMethod.getMethod();
+        if (method.isAnnotationPresent(PassToken.class)) {
+            PassToken passToken = method.getAnnotation(PassToken.class);
+            if (passToken.requeired()) {
+                return true;
+            }
+        }
+        //endregion
+
+        //除了登录和注册接口不需要user_head和token请求头外其他时候基本都要请求头
+        if(request.getHeader("user_head") == null){
+            //region 自定义返回响应的json格式
+            //加上这个可以让浏览器那里得到浏览器的401:response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+            response.setCharacterEncoding("UTF-8");
+            response.setContentType("application/json; charset=utf-8");
+            JSONObject res = new JSONObject();
+            res.put("code", ResponseStatusEnum.MISSING_REQUEST_HEADER.getStatus());
+            res.put("message",  ResponseStatusEnum.MISSING_REQUEST_HEADER.getMsg());
+            res.put("success", false);
+            PrintWriter out = null;
+            out = response.getWriter();
+            out.write(res.toString());
+            out.flush();
+            out.close();
+            //endregion
+            return false;
+        }
+
+        //region 获取url传递的参数 Query string传递的参数
+        //获取url参数 getParameter方法里的参数名和定义的参数名一致
+        String token = request.getHeader("token");
+        // 验证userToken
+        if (!StringUtils.hasText(token)) {
+            throw new MyCustomException(ResponseStatusEnum.SYSTEM_TOKEN_ERROR);
+        }
+
+        // 解析token
+        Map<String, Claim> stringClaimMap = JWTUtil.verifyToken(token);
+        if (ObjectUtils.isNotEmpty(stringClaimMap)) { // 登录
+            return true;
+        }
+        //endregion
+
+        //region 自定义返回响应的json格式
+        //加上这个可以让浏览器那里得到浏览器的401:response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+        response.setCharacterEncoding("UTF-8");
+        response.setContentType("application/json; charset=utf-8");
+        JSONObject res = new JSONObject();
+        res.put("code", ResponseStatusEnum.NO_PERMISSION.getStatus());
+        res.put("message", ResponseStatusEnum.NO_PERMISSION.getMsg());
+        res.put("success", false);
+        PrintWriter out = null;
+        out = response.getWriter();
+        out.write(res.toString());
+        out.flush();
+        out.close();
+        //endregion
+
+        //region 默认的响应提示信息
+        //上面的提示信息返回格式和下面的只能开启一个,否则应用日志系统会导致Idean抛出异常:
+        //java.lang.IllegalStateException: getWriter() has already been called for this response
+        //response.sendError(401, "无权限");
+        //endregion
+
+        return false;
+    }
+
+    @Override
+    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
+
+    }
+
+    @Override
+    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
+
+    }
+}

+ 25 - 0
src/main/java/com/repair/core/JwtlnterceptorConfig.java

@@ -0,0 +1,25 @@
+package com.repair.core;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+public class JwtlnterceptorConfig implements WebMvcConfigurer {
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        //region
+        //目前测试下来 使用 /**所有的话,response.sendError浏览器获取不到响应的信息
+        //默认拦截所有路径
+        registry.addInterceptor(authenticationInterceptor())
+                .addPathPatterns("/api/**");
+        //endregion
+    }
+
+    @Bean
+    public HandlerInterceptor authenticationInterceptor() {
+        return new JwtAuthenticationInterceptor();
+    }
+}

+ 74 - 0
src/main/java/com/repair/core/SwaggerConfiguration.java

@@ -0,0 +1,74 @@
+package com.repair.core;
+
+import com.google.common.base.Predicates;
+import com.repair.annotation.ControllerIsShow;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.Contact;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+@Configuration//配置对象
+@EnableSwagger2//声明启动Swagger2
+/*
+* 两种方式控制生产环境是否显示swagger
+* */
+//@Profile("!prod")
+@Profile({"dev","test"})
+public class SwaggerConfiguration {
+    /**
+     * 创建Docket类型的对象。并使用spring容器管理。
+     * Docket是Swagger中的全局配置对象。
+     * 请求方式:http://ip地址:端口/项目名/swagger-ui.html#/
+     */
+    @Bean
+    public Docket createRestApi() {
+        ApiInfo apiInfo = new ApiInfoBuilder()
+                .version("1.1.0") //版本
+                .title("视频系统接口文档") //网站标题
+                .description("提供测试接口或前端查看对应参数以及返回参数使用") //网站描述
+                .contact(new Contact("创海", "https://www.baidu.com/", "a974264710@163.com"))
+                //region 在swagger中显示作用不是很大
+                /*
+                .license("The Apache License") //协议
+                .licenseUrl("http://www.baidu.com") //许可证链接地址
+                */
+                //endregion
+                .build();
+
+        return new Docket(DocumentationType.SWAGGER_2)
+                .apiInfo(apiInfo)//参数为类对象,并且这个类对象是swagger版本
+                .select()//获取Docket中的选择器。返回ApiSelctorBuilder。构建选择器的。如:扫描什么包的注解。
+                .apis(
+                        //region 是否在swagger中进行展示对应控制器
+                        /*
+                         Predicates.not:取反 例如,false -> true
+                         withMethodAnnotation:当方法上有注解的时候返回true
+                         整体作用:启用该段代码之后如果在方法上使用的自定义的注解:ControllerIsShow
+                         则在swagger中不会显示该方法
+                        */
+                        Predicates.not(
+                                RequestHandlerSelectors.withMethodAnnotation(
+                                        ControllerIsShow.class
+                                )
+                        )
+                        //endregion
+                )
+                .apis(RequestHandlerSelectors.basePackage("com.video"))//设定扫描哪个包(包含子包)中的注解。 如果要匹配多个不同包下的控制器可以精确到多个包的统一父级
+                //region 匹配路由地址
+                /*
+                //用正则匹配显示路由地址为swagger开头的链接 即:范围匹配器 以此来控制在swagger中描述哪些控制器
+                .paths(
+                        PathSelectors.regex("/swagger/.*")
+                )
+                */
+                //endregion
+                .build();//重新构建Docket对象
+
+    }
+}

+ 26 - 0
src/main/java/com/repair/handle/NonStaticResourceHttpRequestHandler.java

@@ -0,0 +1,26 @@
+package com.repair.handle;
+
+import org.springframework.core.io.FileSystemResource;
+import org.springframework.core.io.Resource;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.resource.ResourceHttpRequestHandler;
+
+import javax.servlet.http.HttpServletRequest;
+import java.nio.file.Path;
+
+/**
+ * @Author: binguo
+ * @Date: 2023/3/27 星期一 8:49
+ * @Description: com.video.handle
+ * @Version: 1.0
+ */
+@Component
+public class NonStaticResourceHttpRequestHandler extends ResourceHttpRequestHandler {
+    public final static String ATTR_FILE = "NON-STATIC-FILE";
+
+    @Override
+    protected Resource getResource(HttpServletRequest request) {
+        final Path filePath = (Path) request.getAttribute(ATTR_FILE);
+        return new FileSystemResource(filePath);
+    }
+}

+ 0 - 0
src/main/java/com/repair/handler/MyMetaObjectHandler.java


Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů