zhaoyun 6 mesiacov pred
commit
382c24ac36
100 zmenil súbory, kde vykonal 12514 pridanie a 0 odobranie
  1. 19 0
      .idea/compiler.xml
  2. 19 0
      .idea/encodings.xml
  3. 8 0
      .idea/inspectionProfiles/Project_Default.xml
  4. 45 0
      .idea/jarRepositories.xml
  5. 25 0
      .idea/misc.xml
  6. 124 0
      .idea/uiDesigner.xml
  7. 6 0
      .idea/vcs.xml
  8. 554 0
      .idea/workspace.xml
  9. 20 0
      LICENSE
  10. 96 0
      README.md
  11. 12 0
      bin/clean.bat
  12. 12 0
      bin/package.bat
  13. 14 0
      bin/run.bat
  14. BIN
      doc/若依环境使用手册.docx
  15. 0 0
      doc/郴州专业仓储备定额数据库设计文档.doc
  16. 0 0
      doc/郴州专业仓储备定额数据库设计文档.html
  17. 226 0
      pom.xml
  18. 247 0
      ruoyi-admin/pom.xml
  19. 52 0
      ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/config/SdkConfig.java
  20. 77 0
      ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/constant/OcrMethod.java
  21. 19 0
      ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/constant/SdkConstant.java
  22. 217 0
      ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/esgccenum/ExceptionEnum.java
  23. 28 0
      ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/exception/BaseException.java
  24. 29 0
      ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/exception/ServiceException.java
  25. 176 0
      ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/request/NewQueryData.java
  26. 43 0
      ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/request/PDFtoWord.java
  27. 79 0
      ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/request/QueryData.java
  28. 364 0
      ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/request/RequestClient.java
  29. 53 0
      ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/response/SdkResponse.java
  30. 44 0
      ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/response/SdkTokenResponse.java
  31. 297 0
      ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/util/ParamsUtils.java
  32. 16 0
      ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/util/encrypt/StringUtil.java
  33. 623 0
      ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/util/encrypt/Util.java
  34. 126 0
      ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/util/encrypt/base64/Base64Util.java
  35. 38 0
      ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/util/encrypt/base64/FileUtils.java
  36. 41 0
      ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/util/encrypt/sm2/Sm2KeyVO.java
  37. 202 0
      ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/util/encrypt/sm2/Sm2Utils.java
  38. 288 0
      ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/util/encrypt/sm3/SM3.java
  39. 24 0
      ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/util/encrypt/sm3/Sm3Util.java
  40. 364 0
      ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/util/encrypt/sm4/SM4.java
  41. 187 0
      ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/util/encrypt/sm4/SM4Utils.java
  42. 22 0
      ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/util/encrypt/sm4/SM4_Context.java
  43. 671 0
      ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/util/encrypt/sm4/Util.java
  44. 37 0
      ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
  45. 18 0
      ruoyi-admin/src/main/java/com/ruoyi/RuoYiServletInitializer.java
  46. 81 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/common/constants/StampWarningCheckRule.java
  47. 29 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/common/enums/ApplyTypeEnum.java
  48. 74 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/common/enums/InvoiceNodeEnum.java
  49. 36 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/common/enums/MsgTemplateEnum.java
  50. 94 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/common/enums/StampBusinessTypeEnum.java
  51. 147 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/common/enums/StampWarningTypeEnum.java
  52. 53 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/AdsMatHyxtFileUploadDController.java
  53. 1142 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/AdsMatHyxtInvoiceDController.java
  54. 100 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/AdsMatHyxtInvoiceFileDController.java
  55. 91 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/AdsMatHyxtTaskDController.java
  56. 59 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/HomeController.java
  57. 94 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/OCRController.java
  58. 98 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/UserApplyPermissionDController.java
  59. 311 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/stamp/tax/AdsMatHyxtStampTaxComputeDController.java
  60. 75 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/stamp/tax/AdsMatHyxtStampTaxComputeVoucherDController.java
  61. 214 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/stamp/tax/AdsMatHyxtStampTaxContractDController.java
  62. 21 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/stamp/tax/AdsMatHyxtStampTaxContractInvoiceDController.java
  63. 226 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/stamp/tax/AdsMatHyxtStampTaxInvoiceDController.java
  64. 37 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/stamp/tax/AdsMatHyxtStampTaxItemDController.java
  65. 195 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/stamp/tax/AdsMatHyxtStampTaxWarningDController.java
  66. 104 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/stamp/tax/AdsMatHyxtStampTaxZhptInvoiceDController.java
  67. 201 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtInvoiceApplyD.java
  68. 249 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtInvoiceD.java
  69. 94 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtInvoiceFileD.java
  70. 63 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtInvoiceUserApplyPermissionD.java
  71. 74 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtMoneyVoucherD.java
  72. 144 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxComputeD.java
  73. 124 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxComputeItemD.java
  74. 288 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxComputeVoucherD.java
  75. 240 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxContractD.java
  76. 80 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxContractInvoiceD.java
  77. 302 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxInvoiceD.java
  78. 127 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxItemD.java
  79. 183 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxWarningD.java
  80. 68 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxWarningRuleD.java
  81. 218 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxZhptInvoiceD.java
  82. 155 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxZhptInvoiceItemD.java
  83. 169 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtTaskHistoryD.java
  84. 144 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtTaskRunD.java
  85. 99 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtTaskSendMsgD.java
  86. 92 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtTaskSendMsgLogD.java
  87. 152 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsPrjHywzqlcPrjFunInfoDf.java
  88. 25 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/po/DateQueryPO.java
  89. 35 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/po/HomeStampTaxCountPO.java
  90. 18 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/po/IdsPO.java
  91. 37 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/po/InvoiceApplyAuditPO.java
  92. 29 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/po/InvoiceApplyDetailPO.java
  93. 27 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/po/InvoiceApplyPO.java
  94. 26 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/po/InvoiceApplyQueryPO.java
  95. 86 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/po/InvoiceImportPO.java
  96. 20 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/po/StampTaxAuditPO.java
  97. 20 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/po/StampTaxBatchUpdateBusinessTypePO.java
  98. 22 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/po/StampTaxBatchUpdateTaxItemPO.java
  99. 34 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/po/StampTaxComputeSavePO.java
  100. 26 0
      ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/po/TaskQueryPO.java

+ 19 - 0
.idea/compiler.xml

@@ -0,0 +1,19 @@
+<?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="ruoyi-common" />
+        <module name="ruoyi-framework" />
+        <module name="ruoyi-generator" />
+        <module name="ruoyi-system" />
+        <module name="ruoyi-quartz" />
+        <module name="ruoyi-admin" />
+      </profile>
+    </annotationProcessing>
+  </component>
+</project>

+ 19 - 0
.idea/encodings.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Encoding">
+    <file url="file://$PROJECT_DIR$/ruoyi-admin/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-admin/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-common/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-common/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-framework/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-framework/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-generator/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-generator/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-quartz/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-quartz/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-system/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ruoyi-system/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
+  </component>
+</project>

+ 8 - 0
.idea/inspectionProfiles/Project_Default.xml

@@ -0,0 +1,8 @@
+<component name="InspectionProjectProfileManager">
+  <profile version="1.0">
+    <option name="myName" value="Project Default" />
+    <inspection_tool class="JavadocDeclaration" enabled="true" level="WARNING" enabled_by_default="true">
+      <option name="ADDITIONAL_TAGS" value="description:,author:,create:,date" />
+    </inspection_tool>
+  </profile>
+</component>

+ 45 - 0
.idea/jarRepositories.xml

@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="RemoteRepositoriesConfiguration">
+    <remote-repository>
+      <option name="id" value="public" />
+      <option name="name" value="aliyun nexus" />
+      <option name="url" value="https://maven.aliyun.com/repository/public" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Central Repository" />
+      <option name="url" value="http://maven.aliyun.com/nexus/content/groups/public/" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Central Repository" />
+      <option name="url" value="https://repo.maven.apache.org/maven2" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Central Repository" />
+      <option name="url" value="https://maven.aliyun.com/repository/central/" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Maven Central repository" />
+      <option name="url" value="https://repo1.maven.org/maven2" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="public" />
+      <option name="name" value="aliyun nexus" />
+      <option name="url" value="https://maven.aliyun.com/repository/public/" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="jboss.community" />
+      <option name="name" value="JBoss Community repository" />
+      <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Central Repository" />
+      <option name="url" value="https://maven.aliyun.com/repository/central" />
+    </remote-repository>
+  </component>
+</project>

+ 25 - 0
.idea/misc.xml

@@ -0,0 +1,25 @@
+<?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="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK" />
+  <component name="SvnBranchConfigurationManager">
+    <option name="myConfigurationMap">
+      <map>
+        <entry key="$PROJECT_DIR$">
+          <value>
+            <SvnBranchConfiguration>
+              <option name="trunkUrl" value="https://180.76.101.146/svn/projects/财务资金管控/后端" />
+            </SvnBranchConfiguration>
+          </value>
+        </entry>
+      </map>
+    </option>
+  </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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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="svn" />
+  </component>
+</project>

+ 554 - 0
.idea/workspace.xml

@@ -0,0 +1,554 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="AutoImportSettings">
+    <option name="autoReloadType" value="SELECTIVE" />
+  </component>
+  <component name="ChangeListManager">
+    <list default="true" id="9facbf72-701c-4047-ae32-5db472826bac" name="更改" comment="配置">
+      <change afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/common/enums/StampWarningTypeEnum.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/HomeController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/stamp/tax/AdsMatHyxtStampTaxContractInvoiceDController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/stamp/tax/AdsMatHyxtStampTaxZhptInvoiceDController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxContractInvoiceD.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxZhptInvoiceD.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxZhptInvoiceItemD.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/po/HomeStampTaxCountPO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/vo/stamp/tax/HomeStampTaxCountVO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/vo/stamp/tax/WarningDataVo.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/mapper/AdsMatHyxtStampTaxContractInvoiceDMapper.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/mapper/AdsMatHyxtStampTaxZhptInvoiceDMapper.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/mapper/AdsMatHyxtStampTaxZhptInvoiceItemDMapper.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/service/IAdsMatHyxtStampTaxContractInvoiceDService.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/service/IAdsMatHyxtStampTaxZhptInvoiceDService.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/service/IAdsMatHyxtStampTaxZhptInvoiceItemDService.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/service/impl/AdsMatHyxtStampTaxContractInvoiceDServiceImpl.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/service/impl/AdsMatHyxtStampTaxZhptInvoiceDServiceImpl.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/service/impl/AdsMatHyxtStampTaxZhptInvoiceItemDServiceImpl.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/resources/excelTemplate/stampTax/stampTaxWarningExport.xlsx" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/resources/excelTemplate/stampTax/stampTaxZhptInvoiceImport.xlsx" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/resources/excelTemplate/stampTax/stampTaxZhptInvoiceItemImport.xlsx" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/resources/mapper/hywz/AdsMatHyxtStampTaxContractInvoiceDMapper.xml" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/resources/mapper/hywz/AdsMatHyxtStampTaxZhptInvoiceDMapper.xml" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/resources/mapper/hywz/AdsMatHyxtStampTaxZhptInvoiceItemDMapper.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/common/constants/StampWarningCheckRule.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/common/constants/StampWarningCheckRule.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/common/enums/StampBusinessTypeEnum.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/common/enums/StampBusinessTypeEnum.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/stamp/tax/AdsMatHyxtStampTaxComputeDController.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/stamp/tax/AdsMatHyxtStampTaxComputeDController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/stamp/tax/AdsMatHyxtStampTaxContractDController.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/stamp/tax/AdsMatHyxtStampTaxContractDController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/stamp/tax/AdsMatHyxtStampTaxInvoiceDController.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/stamp/tax/AdsMatHyxtStampTaxInvoiceDController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/stamp/tax/AdsMatHyxtStampTaxItemDController.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/stamp/tax/AdsMatHyxtStampTaxItemDController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/stamp/tax/AdsMatHyxtStampTaxWarningDController.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/stamp/tax/AdsMatHyxtStampTaxWarningDController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxComputeD.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxComputeD.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxContractD.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxContractD.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxInvoiceD.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxInvoiceD.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxItemD.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxItemD.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxWarningD.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxWarningD.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxWarningRuleD.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxWarningRuleD.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/po/DateQueryPO.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/po/DateQueryPO.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/po/StampTaxComputeSavePO.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/po/StampTaxComputeSavePO.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/service/IAdsMatHyxtStampTaxComputeDService.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/service/IAdsMatHyxtStampTaxComputeDService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/service/IAdsMatHyxtStampTaxContractDService.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/service/IAdsMatHyxtStampTaxContractDService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/service/IAdsMatHyxtStampTaxInvoiceDService.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/service/IAdsMatHyxtStampTaxInvoiceDService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/service/IAdsMatHyxtStampTaxItemDService.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/service/IAdsMatHyxtStampTaxItemDService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/service/IAdsMatHyxtStampTaxWarningDService.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/service/IAdsMatHyxtStampTaxWarningDService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/service/IAdsMatHyxtStampTaxWarningRuleDService.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/service/IAdsMatHyxtStampTaxWarningRuleDService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/service/impl/AdsMatHyxtInvoiceApplyDServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/service/impl/AdsMatHyxtInvoiceApplyDServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/service/impl/AdsMatHyxtStampTaxComputeDServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/service/impl/AdsMatHyxtStampTaxComputeDServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/service/impl/AdsMatHyxtStampTaxContractDServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/service/impl/AdsMatHyxtStampTaxContractDServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/service/impl/AdsMatHyxtStampTaxInvoiceDServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/service/impl/AdsMatHyxtStampTaxInvoiceDServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/service/impl/AdsMatHyxtStampTaxItemDServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/service/impl/AdsMatHyxtStampTaxItemDServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/service/impl/AdsMatHyxtStampTaxWarningDServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/service/impl/AdsMatHyxtStampTaxWarningDServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/service/impl/AdsMatHyxtStampTaxWarningRuleDServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/service/impl/AdsMatHyxtStampTaxWarningRuleDServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/utils/DateUtil.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/utils/DateUtil.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/utils/ScheduleTaskUtils.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/utils/ScheduleTaskUtils.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/resources/application-dev.yml" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/resources/application-dev.yml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/ruoyi-admin/src/main/resources/excelTemplate/stampTax/stampTaxInvoiceExport.xlsx" beforeDir="false" afterPath="$PROJECT_DIR$/ruoyi-admin/src/main/resources/excelTemplate/stampTax/stampTaxInvoiceExport.xlsx" afterDir="false" />
+    </list>
+    <list id="772f3166-c3ce-4d8f-9e2a-cca9497c312f" name="Changes" comment="" />
+    <option name="SHOW_DIALOG" value="false" />
+    <option name="HIGHLIGHT_CONFLICTS" value="true" />
+    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
+    <option name="LAST_RESOLUTION" value="IGNORE" />
+  </component>
+  <component name="FileTemplateManagerImpl">
+    <option name="RECENT_TEMPLATES">
+      <list>
+        <option value="FxmlFile" />
+        <option value="Enum" />
+        <option value="Class" />
+      </list>
+    </option>
+  </component>
+  <component name="HighlightingSettingsPerFile">
+    <setting file="file://$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/utils/ScheduleTaskUtils.java" root0="FORCE_HIGHLIGHTING" />
+  </component>
+  <component name="MarkdownSettingsMigration">
+    <option name="stateVersion" value="1" />
+  </component>
+  <component name="MavenImportPreferences">
+    <option name="generalSettings">
+      <MavenGeneralSettings>
+        <option name="localRepository" value="D:\maven\maven_cwzjgk" />
+        <option name="mavenHome" value="$PROJECT_DIR$/../../../apache-maven-3.8.6-bin/apache-maven-3.8.6-bin" />
+        <option name="userSettingsFile" value="D:\apache-maven-3.8.6-bin\apache-maven-3.8.6-bin\conf\settings_cwzjgk.xml" />
+        <option name="workOffline" value="true" />
+      </MavenGeneralSettings>
+    </option>
+  </component>
+  <component name="MavenRunner">
+    <option name="skipTests" value="true" />
+  </component>
+  <component name="ProjectId" id="2enVrb5xHmHXra7KLoXC5VNJ2kQ" />
+  <component name="ProjectViewState">
+    <option name="hideEmptyMiddlePackages" value="true" />
+    <option name="showLibraryContents" value="true" />
+  </component>
+  <component name="PropertiesComponent">{
+  &quot;keyToString&quot;: {
+    &quot;MyBatisLogPluginindexNum&quot;: &quot;540&quot;,
+    &quot;RequestMappingsPanelOrder0&quot;: &quot;0&quot;,
+    &quot;RequestMappingsPanelOrder1&quot;: &quot;1&quot;,
+    &quot;RequestMappingsPanelWidth0&quot;: &quot;75&quot;,
+    &quot;RequestMappingsPanelWidth1&quot;: &quot;75&quot;,
+    &quot;RunOnceActivity.OpenProjectViewOnStart&quot;: &quot;true&quot;,
+    &quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
+    &quot;WebServerToolWindowFactoryState&quot;: &quot;false&quot;,
+    &quot;last_opened_file_path&quot;: &quot;D:/work/电商平台/后端&quot;,
+    &quot;node.js.detected.package.eslint&quot;: &quot;true&quot;,
+    &quot;node.js.detected.package.tslint&quot;: &quot;true&quot;,
+    &quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;,
+    &quot;node.js.selected.package.tslint&quot;: &quot;(autodetect)&quot;,
+    &quot;nodejs_package_manager_path&quot;: &quot;npm&quot;,
+    &quot;project.structure.last.edited&quot;: &quot;项目&quot;,
+    &quot;project.structure.proportion&quot;: &quot;0.15&quot;,
+    &quot;project.structure.side.proportion&quot;: &quot;0.2&quot;,
+    &quot;settings.editor.selected.configurable&quot;: &quot;MavenSettings&quot;,
+    &quot;spring.configuration.checksum&quot;: &quot;79d6ce39730bcb0bc093948bea475e34&quot;,
+    &quot;vue.rearranger.settings.migration&quot;: &quot;true&quot;
+  }
+}</component>
+  <component name="ReactorSettings">
+    <option name="notificationShown" value="true" />
+  </component>
+  <component name="RecentsManager">
+    <key name="CopyFile.RECENT_KEYS">
+      <recent name="D:\Projects\fuze\财务资金管控\财务资金管控-后端\ruoyi-admin\src\main\java\com\ruoyi\hywz\service" />
+      <recent name="D:\Projects\fuze\财务资金管控\财务资金管控-后端\ruoyi-admin\src\main\java\com\ruoyi\hywz\service\impl" />
+      <recent name="D:\Projects\fuze\财务资金管控\财务资金管控-后端\ruoyi-admin\src\main\resources\mapper\hywz" />
+      <recent name="D:\Projects\fuze\财务资金管控\财务资金管控-后端\ruoyi-admin\src\main\java\com\ruoyi\hywz\mapper" />
+      <recent name="D:\Projects\fuze\财务资金管控\财务资金管控-后端\ruoyi-admin\src\main\java\com\ruoyi\hywz\entity" />
+    </key>
+    <key name="MoveFile.RECENT_KEYS">
+      <recent name="D:\Projects\fuze\财务资金管控\财务资金管控后端\ruoyi-admin\src\main\resources\mapper\hywz" />
+      <recent name="D:\Projects\fuze\财务资金管控\财务资金管控后端\ruoyi-admin\src\main\resources\mybatis" />
+    </key>
+    <key name="CopyClassDialog.RECENTS_KEY">
+      <recent name="com.ruoyi.hywz.common.enums" />
+      <recent name="com.ruoyi.common.utils.http" />
+      <recent name="com.ruoyi.hywz.entity.po" />
+      <recent name="com.ruoyi.hywz.service.impl" />
+      <recent name="com.ruoyi.hywz.service" />
+    </key>
+  </component>
+  <component name="RunDashboard">
+    <option name="configurationTypes">
+      <set>
+        <option value="SpringBootApplicationConfigurationType" />
+      </set>
+    </option>
+  </component>
+  <component name="RunManager" selected="Spring Boot.RuoYiApplication">
+    <configuration name="AdsMatHyxtInvoiceDController" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
+      <option name="MAIN_CLASS_NAME" value="com.ruoyi.hywz.controller.AdsMatHyxtInvoiceDController" />
+      <module name="ruoyi-admin" />
+      <extension name="coverage">
+        <pattern>
+          <option name="PATTERN" value="com.ruoyi.hywz.controller.*" />
+          <option name="ENABLED" value="true" />
+        </pattern>
+      </extension>
+      <method v="2">
+        <option name="Make" enabled="true" />
+      </method>
+    </configuration>
+    <configuration name="AdsPrjHywzqlcPrjFunInfoDfServiceImpl" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
+      <option name="MAIN_CLASS_NAME" value="com.ruoyi.hywz.service.impl.AdsPrjHywzqlcPrjFunInfoDfServiceImpl" />
+      <module name="ruoyi-admin" />
+      <extension name="coverage">
+        <pattern>
+          <option name="PATTERN" value="com.ruoyi.hywz.service.impl.*" />
+          <option name="ENABLED" value="true" />
+        </pattern>
+      </extension>
+      <method v="2">
+        <option name="Make" enabled="true" />
+      </method>
+    </configuration>
+    <configuration name="MsgTemplateEnum" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
+      <option name="MAIN_CLASS_NAME" value="com.ruoyi.hywz.common.enums.MsgTemplateEnum" />
+      <module name="ruoyi-admin" />
+      <extension name="coverage">
+        <pattern>
+          <option name="PATTERN" value="com.ruoyi.hywz.common.enums.*" />
+          <option name="ENABLED" value="true" />
+        </pattern>
+      </extension>
+      <method v="2">
+        <option name="Make" enabled="true" />
+      </method>
+    </configuration>
+    <configuration name="RuoYiApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot" nameIsGenerated="true">
+      <option name="ACTIVE_PROFILES" value="dev" />
+      <module name="ruoyi-admin" />
+      <option name="SPRING_BOOT_MAIN_CLASS" value="com.ruoyi.RuoYiApplication" />
+      <method v="2">
+        <option name="Make" enabled="true" />
+      </method>
+    </configuration>
+    <list>
+      <item itemvalue="Application.AdsMatHyxtInvoiceDController" />
+      <item itemvalue="Application.AdsPrjHywzqlcPrjFunInfoDfServiceImpl" />
+      <item itemvalue="Application.MsgTemplateEnum" />
+      <item itemvalue="Spring Boot.RuoYiApplication" />
+    </list>
+  </component>
+  <component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="应用程序级" UseSingleDictionary="true" transferred="true" />
+  <component name="SvnConfiguration" cleanupOnStartRun="true">
+    <configuration>C:\Users\10055\AppData\Roaming\Subversion</configuration>
+    <supportedVersion>125</supportedVersion>
+  </component>
+  <component name="TaskManager">
+    <task active="true" id="Default" summary="默认任务">
+      <changelist id="9facbf72-701c-4047-ae32-5db472826bac" name="更改" comment="" />
+      <changelist id="772f3166-c3ce-4d8f-9e2a-cca9497c312f" name="Changes" comment="" />
+      <created>1712540533631</created>
+      <option name="number" value="Default" />
+      <option name="presentableId" value="Default" />
+      <updated>1712540533631</updated>
+      <workItem from="1712540534691" duration="2761000" />
+      <workItem from="1712556399191" duration="7000" />
+      <workItem from="1712557012389" duration="16286000" />
+      <workItem from="1712574579276" duration="9000" />
+      <workItem from="1712622598435" duration="13238000" />
+      <workItem from="1712642427189" duration="18593000" />
+      <workItem from="1712709278288" duration="6621000" />
+      <workItem from="1712728793664" duration="16284000" />
+      <workItem from="1712795514337" duration="11777000" />
+      <workItem from="1712815688817" duration="11803000" />
+      <workItem from="1712882163055" duration="14574000" />
+      <workItem from="1712915512238" duration="1892000" />
+      <workItem from="1713140914242" duration="28279000" />
+      <workItem from="1713227260279" duration="25500000" />
+      <workItem from="1713313680407" duration="29000" />
+      <workItem from="1713314226920" duration="22466000" />
+      <workItem from="1713401039202" duration="7634000" />
+      <workItem from="1713420108695" duration="13059000" />
+      <workItem from="1713486710273" duration="25057000" />
+      <workItem from="1713745846692" duration="15572000" />
+      <workItem from="1713867765696" duration="2320000" />
+      <workItem from="1714005767953" duration="11710000" />
+      <workItem from="1714035556520" duration="1169000" />
+      <workItem from="1714092146117" duration="1300000" />
+      <workItem from="1715333877579" duration="1510000" />
+      <workItem from="1715336489621" duration="1015000" />
+      <workItem from="1715391382540" duration="251000" />
+      <workItem from="1715654402746" duration="711000" />
+      <workItem from="1715734854264" duration="1878000" />
+      <workItem from="1717031313506" duration="24580000" />
+      <workItem from="1717118047628" duration="22000" />
+      <workItem from="1717118350627" duration="389000" />
+      <workItem from="1717123787991" duration="19000" />
+      <workItem from="1717484586081" duration="409000" />
+      <workItem from="1717485444712" duration="154000" />
+      <workItem from="1717491290272" duration="811000" />
+      <workItem from="1717558762657" duration="1045000" />
+      <workItem from="1717571191560" duration="547000" />
+      <workItem from="1718153601074" duration="7332000" />
+      <workItem from="1718186462619" duration="640000" />
+      <workItem from="1718240560028" duration="406000" />
+      <workItem from="1718243086286" duration="3735000" />
+      <workItem from="1718328311848" duration="93000" />
+      <workItem from="1718332014149" duration="2177000" />
+      <workItem from="1718336303518" duration="1367000" />
+      <workItem from="1718338325832" duration="11205000" />
+      <workItem from="1718420690375" duration="33000" />
+      <workItem from="1719201550779" duration="64000" />
+      <workItem from="1719885197480" duration="8565000" />
+      <workItem from="1720061621678" duration="652000" />
+      <workItem from="1720081045739" duration="1283000" />
+      <workItem from="1720082341417" duration="14133000" />
+      <workItem from="1720140385856" duration="937000" />
+      <workItem from="1720402083790" duration="788000" />
+      <workItem from="1720773251958" duration="1303000" />
+      <workItem from="1720919648422" duration="14909000" />
+      <workItem from="1721005582837" duration="35000" />
+      <workItem from="1721025418544" duration="13707000" />
+      <workItem from="1721098437952" duration="22684000" />
+      <workItem from="1721351072477" duration="34421000" />
+      <workItem from="1721524003280" duration="5024000" />
+      <workItem from="1721871520014" duration="6882000" />
+      <workItem from="1721958926373" duration="11637000" />
+      <workItem from="1722044551062" duration="130000" />
+      <workItem from="1722214216307" duration="18065000" />
+      <workItem from="1722300288848" duration="15866000" />
+      <workItem from="1722387313330" duration="712000" />
+      <workItem from="1722388492141" duration="3744000" />
+      <workItem from="1722474857167" duration="2083000" />
+      <workItem from="1722496720578" duration="1000" />
+      <workItem from="1722566236426" duration="10343000" />
+      <workItem from="1722654410331" duration="32000" />
+      <workItem from="1722819238905" duration="25065000" />
+      <workItem from="1722861420654" duration="175000" />
+      <workItem from="1722861688229" duration="22000" />
+      <workItem from="1722904373460" duration="20093000" />
+      <workItem from="1722991088991" duration="17932000" />
+      <workItem from="1723078197394" duration="21543000" />
+      <workItem from="1723164891966" duration="14716000" />
+      <workItem from="1723346429018" duration="649000" />
+      <workItem from="1723599512589" duration="216000" />
+      <workItem from="1723710827667" duration="2701000" />
+      <workItem from="1723769233012" duration="30416000" />
+      <workItem from="1724027932919" duration="18502000" />
+      <workItem from="1724114248294" duration="3502000" />
+      <workItem from="1724120203229" duration="10697000" />
+      <workItem from="1724148849463" duration="862000" />
+      <workItem from="1724200661243" duration="1927000" />
+      <workItem from="1724205500689" duration="15685000" />
+      <workItem from="1724290494983" duration="4636000" />
+      <workItem from="1724376546073" duration="19989000" />
+      <workItem from="1724636078082" duration="21386000" />
+      <workItem from="1724719944381" duration="652000" />
+      <workItem from="1724727310264" duration="12700000" />
+      <workItem from="1724759070353" duration="4759000" />
+      <workItem from="1724848702889" duration="23000" />
+      <workItem from="1725151823032" duration="20851000" />
+      <workItem from="1725191437394" duration="16562000" />
+      <workItem from="1725237153093" duration="22414000" />
+      <workItem from="1725282494419" duration="26000" />
+      <workItem from="1725325172200" duration="3484000" />
+      <workItem from="1725431782493" duration="2171000" />
+      <workItem from="1725518606401" duration="602000" />
+      <workItem from="1725526966911" duration="601000" />
+      <workItem from="1725782065062" duration="17000" />
+      <workItem from="1725862731524" duration="3538000" />
+      <workItem from="1725885089570" duration="103000" />
+      <workItem from="1726102318959" duration="2366000" />
+      <workItem from="1726104724513" duration="19789000" />
+      <workItem from="1726142534644" duration="560000" />
+      <workItem from="1726186548089" duration="23131000" />
+      <workItem from="1726279003971" duration="388000" />
+      <workItem from="1726298522928" duration="18000" />
+      <workItem from="1726298793237" duration="898000" />
+      <workItem from="1726626823323" duration="2372000" />
+      <workItem from="1726705748560" duration="20024000" />
+      <workItem from="1726745439198" duration="314000" />
+      <workItem from="1726813284082" duration="12770000" />
+      <workItem from="1726883731976" duration="111000" />
+      <workItem from="1726888727562" duration="2282000" />
+      <workItem from="1726895140891" duration="221000" />
+      <workItem from="1726967993727" duration="5298000" />
+      <workItem from="1727081772878" duration="1548000" />
+      <workItem from="1727226313137" duration="318000" />
+      <workItem from="1729499998907" duration="737000" />
+      <workItem from="1729558206502" duration="540000" />
+      <workItem from="1729643843615" duration="77000" />
+      <workItem from="1730281371113" duration="1835000" />
+      <workItem from="1730338734054" duration="767000" />
+      <workItem from="1730448354478" duration="316000" />
+      <workItem from="1730448686923" duration="678000" />
+      <workItem from="1730449395532" duration="4057000" />
+      <workItem from="1731041405146" duration="1016000" />
+      <workItem from="1731050095225" duration="643000" />
+      <workItem from="1731162016448" duration="1243000" />
+      <workItem from="1731163911004" duration="4000" />
+    </task>
+    <task id="LOCAL-00001" summary="开票申请相关接口">
+      <created>1712657818906</created>
+      <option name="number" value="00001" />
+      <option name="presentableId" value="LOCAL-00001" />
+      <option name="project" value="LOCAL" />
+      <updated>1712657818906</updated>
+    </task>
+    <task id="LOCAL-00002" summary="审核人员">
+      <created>1712658100180</created>
+      <option name="number" value="00002" />
+      <option name="presentableId" value="LOCAL-00002" />
+      <option name="project" value="LOCAL" />
+      <updated>1712658100180</updated>
+    </task>
+    <task id="LOCAL-00003" summary="审核相关">
+      <created>1712732754418</created>
+      <option name="number" value="00003" />
+      <option name="presentableId" value="LOCAL-00003" />
+      <option name="project" value="LOCAL" />
+      <updated>1712732754418</updated>
+    </task>
+    <task id="LOCAL-00004" summary="审核相关">
+      <created>1712827233573</created>
+      <option name="number" value="00004" />
+      <option name="presentableId" value="LOCAL-00004" />
+      <option name="project" value="LOCAL" />
+      <updated>1712827233573</updated>
+    </task>
+    <task id="LOCAL-00005" summary="流程完善">
+      <created>1712912916076</created>
+      <option name="number" value="00005" />
+      <option name="presentableId" value="LOCAL-00005" />
+      <option name="project" value="LOCAL" />
+      <updated>1712912916076</updated>
+    </task>
+    <task id="LOCAL-00006" summary="i国网通知、定时任务通知">
+      <created>1713232175493</created>
+      <option name="number" value="00006" />
+      <option name="presentableId" value="LOCAL-00006" />
+      <option name="project" value="LOCAL" />
+      <updated>1713232175493</updated>
+    </task>
+    <task id="LOCAL-00007" summary="提交权限控制,权限配置页面相关接口">
+      <created>1713252785309</created>
+      <option name="number" value="00007" />
+      <option name="presentableId" value="LOCAL-00007" />
+      <option name="project" value="LOCAL" />
+      <updated>1713252785309</updated>
+    </task>
+    <task id="LOCAL-00008" summary="1.预算稽核校验逻辑、&#10;2.ocr识别发票编号、日期&#10;3.配置文件优化">
+      <created>1713345253710</created>
+      <option name="number" value="00008" />
+      <option name="presentableId" value="LOCAL-00008" />
+      <option name="project" value="LOCAL" />
+      <updated>1713345253710</updated>
+    </task>
+    <task id="LOCAL-00009" summary="业务流程调整">
+      <created>1713431518783</created>
+      <option name="number" value="00009" />
+      <option name="presentableId" value="LOCAL-00009" />
+      <option name="project" value="LOCAL" />
+      <updated>1713431518783</updated>
+    </task>
+    <task id="LOCAL-00010" summary="流程节点颜色">
+      <created>1713432460989</created>
+      <option name="number" value="00010" />
+      <option name="presentableId" value="LOCAL-00010" />
+      <option name="project" value="LOCAL" />
+      <updated>1713432460989</updated>
+    </task>
+    <task id="LOCAL-00011" summary="发送邮件逻辑">
+      <created>1713494842511</created>
+      <option name="number" value="00011" />
+      <option name="presentableId" value="LOCAL-00011" />
+      <option name="project" value="LOCAL" />
+      <updated>1713494842511</updated>
+    </task>
+    <task id="LOCAL-00012" summary="调整">
+      <created>1713757618273</created>
+      <option name="number" value="00012" />
+      <option name="presentableId" value="LOCAL-00012" />
+      <option name="project" value="LOCAL" />
+      <updated>1713757618273</updated>
+    </task>
+    <task id="LOCAL-00013" summary="发票只限制上传图片格式">
+      <created>1713773403319</created>
+      <option name="number" value="00013" />
+      <option name="presentableId" value="LOCAL-00013" />
+      <option name="project" value="LOCAL" />
+      <updated>1713773403319</updated>
+    </task>
+    <task id="LOCAL-00014" summary="服务通知改成调用175三流合一通知接口">
+      <created>1714012444628</created>
+      <option name="number" value="00014" />
+      <option name="presentableId" value="LOCAL-00014" />
+      <option name="project" value="LOCAL" />
+      <updated>1714012444628</updated>
+    </task>
+    <task id="LOCAL-00015" summary="流转详情增加手机号字段展示">
+      <created>1714016803310</created>
+      <option name="number" value="00015" />
+      <option name="presentableId" value="LOCAL-00015" />
+      <option name="project" value="LOCAL" />
+      <updated>1714016803310</updated>
+    </task>
+    <task id="LOCAL-00016" summary="修改">
+      <created>1717066450397</created>
+      <option name="number" value="00016" />
+      <option name="presentableId" value="LOCAL-00016" />
+      <option name="project" value="LOCAL" />
+      <updated>1717066450397</updated>
+    </task>
+    <task id="LOCAL-00017" summary="发票接收环节改成发起报账,批量生成凭证号">
+      <created>1718157717778</created>
+      <option name="number" value="00017" />
+      <option name="presentableId" value="LOCAL-00017" />
+      <option name="project" value="LOCAL" />
+      <updated>1718157717778</updated>
+    </task>
+    <task id="LOCAL-00018" summary="orc识别调整、预算稽核">
+      <created>1718360339036</created>
+      <option name="number" value="00018" />
+      <option name="presentableId" value="LOCAL-00018" />
+      <option name="project" value="LOCAL" />
+      <updated>1718360339036</updated>
+    </task>
+    <task id="LOCAL-00019" summary="发票多个删除,支持上传pdf发票">
+      <created>1720142792560</created>
+      <option name="number" value="00019" />
+      <option name="presentableId" value="LOCAL-00019" />
+      <option name="project" value="LOCAL" />
+      <updated>1720142792560</updated>
+    </task>
+    <option name="localTasksCounter" value="20" />
+    <servers />
+  </component>
+  <component name="TypeScriptGeneratedFilesManager">
+    <option name="version" value="3" />
+  </component>
+  <component name="VcsManagerConfiguration">
+    <MESSAGE value="配置" />
+    <MESSAGE value="开票申请相关接口" />
+    <MESSAGE value="审核人员" />
+    <MESSAGE value="审核相关" />
+    <MESSAGE value="流程完善" />
+    <MESSAGE value="i国网通知、定时任务通知" />
+    <MESSAGE value="提交权限控制,权限配置页面相关接口" />
+    <MESSAGE value="1.预算稽核校验逻辑、&#10;2.ocr识别发票编号、日期&#10;3.配置文件优化" />
+    <MESSAGE value="业务流程调整" />
+    <MESSAGE value="流程节点颜色" />
+    <MESSAGE value="发送邮件逻辑" />
+    <MESSAGE value="调整" />
+    <MESSAGE value="发票只限制上传图片格式" />
+    <MESSAGE value="服务通知改成调用175三流合一通知接口" />
+    <MESSAGE value="流转详情增加手机号字段展示" />
+    <MESSAGE value="修改" />
+    <MESSAGE value="发票接收环节改成发起报账,批量生成凭证号" />
+    <MESSAGE value="orc识别调整、预算稽核" />
+    <MESSAGE value="发票多个删除,支持上传pdf发票" />
+    <MESSAGE value="init" />
+    <option name="LAST_COMMIT_MESSAGE" value="init" />
+  </component>
+  <component name="XDebuggerManager">
+    <breakpoint-manager>
+      <breakpoints>
+        <line-breakpoint enabled="true" type="java-line">
+          <url>file://$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/hywz/service/impl/AdsMatHyxtStampTaxContractDServiceImpl.java</url>
+          <line>318</line>
+          <option name="timeStamp" value="3" />
+        </line-breakpoint>
+      </breakpoints>
+    </breakpoint-manager>
+    <watches-manager>
+      <configuration name="SpringBootApplicationConfigurationType">
+        <watch expression="param.getStartDate()" />
+        <watch expression="totalNum.multiply(taxRate)" />
+        <watch expression="contractAmount.multiply(taxRate).setScale(2, RoundingMode.HALF_UP)" />
+        <watch expression="taxNum.compareTo(new BigDecimal(&quot;0&quot;))" />
+        <watch expression="IpUtils.getIpAddr(request)" />
+        <watch expression="adsMatHyxtStampTaxContractDService.countWarningNum(orgNo, date)" />
+        <watch expression="IpUtils.getIpAddr(request)" />
+      </configuration>
+    </watches-manager>
+  </component>
+  <component name="XSLT-Support.FileAssociations.UIState">
+    <expand />
+    <select />
+  </component>
+</project>

+ 20 - 0
LICENSE

@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2018 RuoYi
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ 96 - 0
README.md

@@ -0,0 +1,96 @@
+<p align="center">
+	<img alt="logo" src="https://oscimg.oschina.net/oscnet/up-d3d0a9303e11d522a06cd263f3079027715.png">
+</p>
+<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">RuoYi v3.8.6</h1>
+<h4 align="center">基于SpringBoot+Vue前后端分离的Java快速开发框架</h4>
+<p align="center">
+	<a href="https://gitee.com/y_project/RuoYi-Vue/stargazers"><img src="https://gitee.com/y_project/RuoYi-Vue/badge/star.svg?theme=dark"></a>
+	<a href="https://gitee.com/y_project/RuoYi-Vue"><img src="https://img.shields.io/badge/RuoYi-v3.8.6-brightgreen.svg"></a>
+	<a href="https://gitee.com/y_project/RuoYi-Vue/blob/master/LICENSE"><img src="https://img.shields.io/github/license/mashape/apistatus.svg"></a>
+</p>
+
+## 平台简介
+
+若依是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。
+
+* 前端采用Vue、Element UI。
+* 后端采用Spring Boot、Spring Security、Redis & Jwt。
+* 权限认证使用Jwt,支持多终端认证系统。
+* 支持加载动态权限菜单,多方式轻松权限控制。
+* 高效率开发,使用代码生成器可以一键生成前后端代码。
+* 提供了技术栈([Vue3](https://v3.cn.vuejs.org) [Element Plus](https://element-plus.org/zh-CN) [Vite](https://cn.vitejs.dev))版本[RuoYi-Vue3](https://github.com/yangzongzhuan/RuoYi-Vue3),保持同步更新。
+* 提供了单应用版本[RuoYi-Vue-fast](https://github.com/yangzongzhuan/RuoYi-Vue-fast),Oracle版本[RuoYi-Vue-Oracle](https://github.com/yangzongzhuan/RuoYi-Vue-Oracle),保持同步更新。
+* 不分离版本,请移步[RuoYi](https://gitee.com/y_project/RuoYi),微服务版本,请移步[RuoYi-Cloud](https://gitee.com/y_project/RuoYi-Cloud)
+* 阿里云折扣场:[点我进入](http://aly.ruoyi.vip),腾讯云秒杀场:[点我进入](http://txy.ruoyi.vip)&nbsp;&nbsp;
+* 阿里云优惠券:[点我领取](https://www.aliyun.com/minisite/goods?userCode=brki8iof&share_source=copy_link),腾讯云优惠券:[点我领取](https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console)&nbsp;&nbsp;
+
+## 内置功能
+
+1.  用户管理:用户是系统操作者,该功能主要完成系统用户配置。
+2.  部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。
+3.  岗位管理:配置系统用户所属担任职务。
+4.  菜单管理:配置系统菜单,操作权限,按钮权限标识等。
+5.  角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。
+6.  字典管理:对系统中经常使用的一些较为固定的数据进行维护。
+7.  参数管理:对系统动态配置常用参数。
+8.  通知公告:系统通知公告信息发布维护。
+9.  操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。
+10. 登录日志:系统登录日志记录查询包含登录异常。
+11. 在线用户:当前系统中活跃用户状态监控。
+12. 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。
+13. 代码生成:前后端代码的生成(java、html、xml、sql)支持CRUD下载 。
+14. 系统接口:根据业务代码自动生成相关的api接口文档。
+15. 服务监控:监视当前系统CPU、内存、磁盘、堆栈等相关信息。
+16. 缓存监控:对系统的缓存信息查询,命令统计等。
+17. 在线构建器:拖动表单元素生成相应的HTML代码。
+18. 连接池监视:监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。
+
+## 在线体验
+
+- admin/admin123  
+- 陆陆续续收到一些打赏,为了更好的体验已用于演示服务器升级。谢谢各位小伙伴。
+
+演示地址:http://vue.ruoyi.vip  
+文档地址:http://doc.ruoyi.vip
+
+## 演示图
+
+<table>
+    <tr>
+        <td><img src="https://oscimg.oschina.net/oscnet/cd1f90be5f2684f4560c9519c0f2a232ee8.jpg"/></td>
+        <td><img src="https://oscimg.oschina.net/oscnet/1cbcf0e6f257c7d3a063c0e3f2ff989e4b3.jpg"/></td>
+    </tr>
+    <tr>
+        <td><img src="https://oscimg.oschina.net/oscnet/up-8074972883b5ba0622e13246738ebba237a.png"/></td>
+        <td><img src="https://oscimg.oschina.net/oscnet/up-9f88719cdfca9af2e58b352a20e23d43b12.png"/></td>
+    </tr>
+    <tr>
+        <td><img src="https://oscimg.oschina.net/oscnet/up-39bf2584ec3a529b0d5a3b70d15c9b37646.png"/></td>
+        <td><img src="https://oscimg.oschina.net/oscnet/up-936ec82d1f4872e1bc980927654b6007307.png"/></td>
+    </tr>
+	<tr>
+        <td><img src="https://oscimg.oschina.net/oscnet/up-b2d62ceb95d2dd9b3fbe157bb70d26001e9.png"/></td>
+        <td><img src="https://oscimg.oschina.net/oscnet/up-d67451d308b7a79ad6819723396f7c3d77a.png"/></td>
+    </tr>	 
+    <tr>
+        <td><img src="https://oscimg.oschina.net/oscnet/5e8c387724954459291aafd5eb52b456f53.jpg"/></td>
+        <td><img src="https://oscimg.oschina.net/oscnet/644e78da53c2e92a95dfda4f76e6d117c4b.jpg"/></td>
+    </tr>
+	<tr>
+        <td><img src="https://oscimg.oschina.net/oscnet/up-8370a0d02977eebf6dbf854c8450293c937.png"/></td>
+        <td><img src="https://oscimg.oschina.net/oscnet/up-49003ed83f60f633e7153609a53a2b644f7.png"/></td>
+    </tr>
+	<tr>
+        <td><img src="https://oscimg.oschina.net/oscnet/up-d4fe726319ece268d4746602c39cffc0621.png"/></td>
+        <td><img src="https://oscimg.oschina.net/oscnet/up-c195234bbcd30be6927f037a6755e6ab69c.png"/></td>
+    </tr>
+    <tr>
+        <td><img src="https://oscimg.oschina.net/oscnet/b6115bc8c31de52951982e509930b20684a.jpg"/></td>
+        <td><img src="https://oscimg.oschina.net/oscnet/up-5e4daac0bb59612c5038448acbcef235e3a.png"/></td>
+    </tr>
+</table>
+
+
+## 若依前后端分离交流群
+
+QQ群: [![加入QQ群](https://img.shields.io/badge/已满-937441-blue.svg)](https://jq.qq.com/?_wv=1027&k=5bVB1og) [![加入QQ群](https://img.shields.io/badge/已满-887144332-blue.svg)](https://jq.qq.com/?_wv=1027&k=5eiA4DH) [![加入QQ群](https://img.shields.io/badge/已满-180251782-blue.svg)](https://jq.qq.com/?_wv=1027&k=5AxMKlC) [![加入QQ群](https://img.shields.io/badge/已满-104180207-blue.svg)](https://jq.qq.com/?_wv=1027&k=51G72yr) [![加入QQ群](https://img.shields.io/badge/已满-186866453-blue.svg)](https://jq.qq.com/?_wv=1027&k=VvjN2nvu) [![加入QQ群](https://img.shields.io/badge/已满-201396349-blue.svg)](https://jq.qq.com/?_wv=1027&k=5vYAqA05) [![加入QQ群](https://img.shields.io/badge/已满-101456076-blue.svg)](https://jq.qq.com/?_wv=1027&k=kOIINEb5) [![加入QQ群](https://img.shields.io/badge/已满-101539465-blue.svg)](https://jq.qq.com/?_wv=1027&k=UKtX5jhs) [![加入QQ群](https://img.shields.io/badge/已满-264312783-blue.svg)](https://jq.qq.com/?_wv=1027&k=EI9an8lJ) [![加入QQ群](https://img.shields.io/badge/已满-167385320-blue.svg)](https://jq.qq.com/?_wv=1027&k=SWCtLnMz) [![加入QQ群](https://img.shields.io/badge/已满-104748341-blue.svg)](https://jq.qq.com/?_wv=1027&k=96Dkdq0k) [![加入QQ群](https://img.shields.io/badge/已满-160110482-blue.svg)](https://jq.qq.com/?_wv=1027&k=0fsNiYZt) [![加入QQ群](https://img.shields.io/badge/已满-170801498-blue.svg)](https://jq.qq.com/?_wv=1027&k=7xw4xUG1) [![加入QQ群](https://img.shields.io/badge/已满-108482800-blue.svg)](https://jq.qq.com/?_wv=1027&k=eCx8eyoJ) [![加入QQ群](https://img.shields.io/badge/已满-101046199-blue.svg)](https://jq.qq.com/?_wv=1027&k=SpyH2875) [![加入QQ群](https://img.shields.io/badge/136919097-blue.svg)](https://jq.qq.com/?_wv=1027&k=tKEt51dz) 点击按钮入群。

+ 12 - 0
bin/clean.bat

@@ -0,0 +1,12 @@
+@echo off
+echo.
+echo [信息] 清理工程target生成路径。
+echo.
+
+%~d0
+cd %~dp0
+
+cd ..
+call mvn clean
+
+pause

+ 12 - 0
bin/package.bat

@@ -0,0 +1,12 @@
+@echo off
+echo.
+echo [信息] 打包Web工程,生成war/jar包文件。
+echo.
+
+%~d0
+cd %~dp0
+
+cd ..
+call mvn clean package -Dmaven.test.skip=true
+
+pause

+ 14 - 0
bin/run.bat

@@ -0,0 +1,14 @@
+@echo off
+echo.
+echo [信息] 使用Jar命令运行Web工程。
+echo.
+
+cd %~dp0
+cd ../ruoyi-admin/target
+
+set JAVA_OPTS=-Xms256m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m
+
+java -jar %JAVA_OPTS% ruoyi-admin.jar
+
+cd bin
+pause

BIN
doc/若依环境使用手册.docx


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
doc/郴州专业仓储备定额数据库设计文档.doc


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
doc/郴州专业仓储备定额数据库设计文档.html


+ 226 - 0
pom.xml

@@ -0,0 +1,226 @@
+<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	
+    <groupId>com.ruoyi</groupId>
+    <artifactId>ruoyi</artifactId>
+    <version>3.8.6</version>
+
+    <name>ruoyi</name>
+    <description>储备定额系统</description>
+    
+    <properties>
+        <ruoyi.version>3.8.6</ruoyi.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <java.version>1.8</java.version>
+        <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
+        <druid.version>1.2.16</druid.version>
+        <bitwalker.version>1.21</bitwalker.version>
+        <swagger.version>3.0.0</swagger.version>
+        <kaptcha.version>2.3.3</kaptcha.version>
+        <pagehelper.boot.version>1.4.6</pagehelper.boot.version>
+        <fastjson.version>2.0.34</fastjson.version>
+        <oshi.version>6.4.3</oshi.version>
+        <commons.io.version>2.11.0</commons.io.version>
+        <commons.collections.version>3.2.2</commons.collections.version>
+        <poi.version>4.1.2</poi.version>
+        <velocity.version>2.3</velocity.version>
+        <jwt.version>0.9.1</jwt.version>
+    </properties>
+	
+    <!-- 依赖声明 -->
+    <dependencyManagement>
+        <dependencies>
+
+            <!-- SpringBoot的依赖配置-->
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>2.5.15</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+
+            <!-- 阿里数据库连接池 -->
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>druid-spring-boot-starter</artifactId>
+                <version>${druid.version}</version>
+            </dependency>
+
+            <!-- 解析客户端操作系统、浏览器等 -->
+            <dependency>
+                <groupId>eu.bitwalker</groupId>
+                <artifactId>UserAgentUtils</artifactId>
+                <version>${bitwalker.version}</version>
+            </dependency>
+
+            <!-- pagehelper 分页插件 -->
+            <dependency>
+                <groupId>com.github.pagehelper</groupId>
+                <artifactId>pagehelper-spring-boot-starter</artifactId>
+                <version>${pagehelper.boot.version}</version>
+            </dependency>
+
+            <!-- 获取系统信息 -->
+            <dependency>
+                <groupId>com.github.oshi</groupId>
+                <artifactId>oshi-core</artifactId>
+                <version>${oshi.version}</version>
+            </dependency>
+
+            <!-- Swagger3依赖 -->
+            <dependency>
+                <groupId>io.springfox</groupId>
+                <artifactId>springfox-boot-starter</artifactId>
+                <version>${swagger.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>io.swagger</groupId>
+                        <artifactId>swagger-models</artifactId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+
+            <!-- io常用工具类 -->
+            <dependency>
+                <groupId>commons-io</groupId>
+                <artifactId>commons-io</artifactId>
+                <version>${commons.io.version}</version>
+            </dependency>
+
+            <!-- excel工具 -->
+            <dependency>
+                <groupId>org.apache.poi</groupId>
+                <artifactId>poi-ooxml</artifactId>
+                <version>${poi.version}</version>
+            </dependency>
+
+            <!-- velocity代码生成使用模板 -->
+            <dependency>
+                <groupId>org.apache.velocity</groupId>
+                <artifactId>velocity-engine-core</artifactId>
+                <version>${velocity.version}</version>
+            </dependency>
+
+            <!-- collections工具类 -->
+            <dependency>
+                <groupId>commons-collections</groupId>
+                <artifactId>commons-collections</artifactId>
+                <version>${commons.collections.version}</version>
+            </dependency>
+
+            <!-- 阿里JSON解析器 -->
+            <dependency>
+                <groupId>com.alibaba.fastjson2</groupId>
+                <artifactId>fastjson2</artifactId>
+                <version>${fastjson.version}</version>
+            </dependency>
+
+            <!-- Token生成与解析-->
+            <dependency>
+                <groupId>io.jsonwebtoken</groupId>
+                <artifactId>jjwt</artifactId>
+                <version>${jwt.version}</version>
+            </dependency>
+
+            <!-- 验证码 -->
+            <dependency>
+                <groupId>pro.fessional</groupId>
+                <artifactId>kaptcha</artifactId>
+                <version>${kaptcha.version}</version>
+            </dependency>
+
+            <!-- 定时任务-->
+            <dependency>
+                <groupId>com.ruoyi</groupId>
+                <artifactId>ruoyi-quartz</artifactId>
+                <version>${ruoyi.version}</version>
+            </dependency>
+
+            <!-- 代码生成-->
+            <dependency>
+                <groupId>com.ruoyi</groupId>
+                <artifactId>ruoyi-generator</artifactId>
+                <version>${ruoyi.version}</version>
+            </dependency>
+
+            <!-- 核心模块-->
+            <dependency>
+                <groupId>com.ruoyi</groupId>
+                <artifactId>ruoyi-framework</artifactId>
+                <version>${ruoyi.version}</version>
+            </dependency>
+
+            <!-- 系统模块-->
+            <dependency>
+                <groupId>com.ruoyi</groupId>
+                <artifactId>ruoyi-system</artifactId>
+                <version>${ruoyi.version}</version>
+            </dependency>
+
+            <!-- 通用工具-->
+            <dependency>
+                <groupId>com.ruoyi</groupId>
+                <artifactId>ruoyi-common</artifactId>
+                <version>${ruoyi.version}</version>
+            </dependency>
+
+        </dependencies>
+    </dependencyManagement>
+
+    <modules>
+        <module>ruoyi-admin</module>
+        <module>ruoyi-framework</module>
+        <module>ruoyi-system</module>
+        <module>ruoyi-quartz</module>
+        <module>ruoyi-generator</module>
+        <module>ruoyi-common</module>
+
+    </modules>
+    <packaging>pom</packaging>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.1</version>
+                <configuration>
+                    <source>${java.version}</source>
+                    <target>${java.version}</target>
+                    <encoding>${project.build.sourceEncoding}</encoding>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+    <repositories>
+        <repository>
+            <id>public</id>
+            <name>aliyun nexus</name>
+            <url>https://maven.aliyun.com/repository/public</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+        </repository>
+    </repositories>
+
+    <pluginRepositories>
+        <pluginRepository>
+            <id>public</id>
+            <name>aliyun nexus</name>
+            <url>https://maven.aliyun.com/repository/public</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </pluginRepository>
+    </pluginRepositories>
+
+</project>

+ 247 - 0
ruoyi-admin/pom.xml

@@ -0,0 +1,247 @@
+<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>ruoyi</artifactId>
+        <groupId>com.ruoyi</groupId>
+        <version>3.8.6</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <packaging>jar</packaging>
+    <artifactId>ruoyi-admin</artifactId>
+
+    <description>
+        web服务入口
+    </description>
+
+    <dependencies>
+
+        <!-- spring-boot-devtools -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <optional>true</optional> <!-- 表示依赖不会传递 -->
+        </dependency>
+        <dependency>
+            <groupId>com.sgcc.isc</groupId>
+            <artifactId>ualogin</artifactId>
+            <version>2.1.14</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-httpclient</groupId>
+            <artifactId>commons-httpclient</artifactId>
+            <version>3.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcprov-jdk15on</artifactId>
+            <version>1.68</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.sun.mail</groupId>
+            <artifactId>javax.mail</artifactId>
+            <version>1.5.2</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.7.16</version>
+        </dependency>
+        <!-- swagger3-->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-boot-starter</artifactId>
+        </dependency>
+
+        <!-- 防止进入swagger页面报类型转换错误,排除3.0.0中的引用,手动增加1.6.2版本 -->
+        <dependency>
+            <groupId>io.swagger</groupId>
+            <artifactId>swagger-models</artifactId>
+            <version>1.6.2</version>
+        </dependency>
+
+         <!-- Mysql驱动包 -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+
+        <!-- 核心模块-->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-framework</artifactId>
+        </dependency>
+
+        <!-- 定时任务-->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-quartz</artifactId>
+        </dependency>
+
+        <!-- 代码生成-->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-generator</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.5.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.83</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.5.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-extension</artifactId>
+            <version>3.5.2</version>
+            <scope>compile</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.pagehelper</groupId>
+            <artifactId>pagehelper-spring-boot-starter</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>mybatis-spring</artifactId>
+                    <groupId>org.mybatis</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>mybatis</artifactId>
+                    <groupId>org.mybatis</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+
+
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+            <version>2.2.10</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.apache.poi</groupId>
+                    <artifactId>poi</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.apache.poi</groupId>
+                    <artifactId>poi-ooxml</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.apache.poi</groupId>
+                    <artifactId>poi-ooxml-schemas</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>com.aspose</groupId>
+            <artifactId>aspose-cells</artifactId>
+            <version>8.5.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-test</artifactId>
+        </dependency>
+
+
+        <dependency>
+            <groupId>cn.smallbun.screw</groupId>
+            <artifactId>screw-core</artifactId>
+            <version>1.0.5</version>
+        </dependency>
+        <dependency>
+            <groupId>com.zaxxer</groupId>
+            <artifactId>HikariCP</artifactId>
+            <version>3.4.5</version>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>8.0.26</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.aliyun.oss</groupId>
+            <artifactId>aliyun-sdk-oss</artifactId>
+            <version>3.12.0</version>
+        </dependency>
+
+        <!-- api 文档 swagger封装-->
+        <dependency>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>knife4j-spring-boot-starter</artifactId>
+            <version>2.0.5</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.pdfbox</groupId>
+            <artifactId>pdfbox</artifactId>
+            <version>2.0.24</version>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.1.1.RELEASE</version>
+                <configuration>
+                    <fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-war-plugin</artifactId>
+                <version>3.1.0</version>
+                <configuration>
+                    <failOnMissingWebXml>false</failOnMissingWebXml>
+                    <warName>${project.artifactId}</warName>
+                </configuration>
+           </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>8</source>
+                    <target>8</target>
+                </configuration>
+            </plugin>
+
+        </plugins>
+        <finalName>${project.artifactId}</finalName>
+    </build>
+
+
+
+</project>

+ 52 - 0
ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/config/SdkConfig.java

@@ -0,0 +1,52 @@
+/*    */ package cn.com.esgcc.ai.matrix.sdk.config;
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ public class SdkConfig
+/*    */ {
+/* 10 */   private int connectionTimeout = 10000;
+/* 11 */   private int requestTimeout = 10000;
+/* 12 */   private int socketTimeout = 10000;
+/* 13 */   private int connectLostTimeout = 60;
+/*    */   
+/*    */   public int getConnectionTimeout() {
+/* 16 */     return this.connectionTimeout;
+/*    */   }
+/*    */   
+/*    */   public void setConnectionTimeout(int connectionTimeout) {
+/* 20 */     this.connectionTimeout = connectionTimeout;
+/*    */   }
+/*    */   
+/*    */   public int getRequestTimeout() {
+/* 24 */     return this.requestTimeout;
+/*    */   }
+/*    */   
+/*    */   public void setRequestTimeout(int requestTimeout) {
+/* 28 */     this.requestTimeout = requestTimeout;
+/*    */   }
+/*    */   
+/*    */   public int getSocketTimeout() {
+/* 32 */     return this.socketTimeout;
+/*    */   }
+/*    */   
+/*    */   public void setSocketTimeout(int socketTimeout) {
+/* 36 */     this.socketTimeout = socketTimeout;
+/*    */   }
+/*    */   
+/*    */   public int getConnectLostTimeout() {
+/* 40 */     return this.connectLostTimeout;
+/*    */   }
+/*    */   
+/*    */   public void setConnectLostTimeout(int connectLostTimeout) {
+/* 44 */     this.connectLostTimeout = connectLostTimeout;
+/*    */   }
+/*    */ }
+
+
+/* Location:              C:\Users\ningj\Desktop\java-sdk-1.0.0-SNAPSHOT\!\cn\com\esgcc\ai\matrix\sdk\config\SdkConfig.class
+ * Java compiler version: 8 (52.0)
+ * JD-Core Version:       1.1.3
+ */

+ 77 - 0
ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/constant/OcrMethod.java

@@ -0,0 +1,77 @@
+package cn.com.esgcc.ai.matrix.sdk.constant;
+
+public class OcrMethod {
+  public static final String USER_AUTH = "/api-auth/oauth/user/token";
+  
+  public static final String PDF_2_WORD = "/api-ocr/v1/pdfToWord/default/default/biz-pzw";
+  
+  public static final String NEW_PDF_2_WORD = "/api-ocr/v1/file/ocrPDFToWordService/default/default/biz-pdfTword";
+  
+  public static final String BIZ_PDFTOWORD = "/api-ocr/v1/getPDFToWordResult/default/default/biz-pdfToWord";
+  
+  public static final String BIZ_TY = "/api-ocr/v1/ocrservice/default/default/biz-ty";
+  
+  public static final String BIZ_SFZ = "/api-ocr/v1/ocrstructuredservice/idcard/default/biz-sfz";
+  
+  public static final String BIZ_SX = "/api-ocr/v1/ocrservice/shouxie/default/language-sx";
+  
+  public static final String BIZ_YYZZ = "/api-ocr/v1/ocrstructuredservice/blicense/default/biz-yyzz";
+  
+  public static final String BIZ_YHK = "/api-ocr/v1/ocrstructuredservice/bank_card/default/biz-yhk";
+  
+  public static final String BIZ_JSZ = "/api-ocr/v1/ocrstructuredservice/driving_license/default/biz-jsz";
+  
+  public static final String BIZ_XSZ = "/api-ocr/v1/ocrstructuredservice/vehicle_license/default/biz-xsz";
+  
+  public static final String BIZ_HZ = "/api-ocr/v1/ocrstructuredservice/passport/default/biz-hz";
+  
+  public static final String BIZ_HCP = "/api-ocr/v1/ocrstructuredservice/train_ticket/default/biz-hcp";
+  
+  public static final String BIZ_SPJY = "/api-ocr/v1/ocrstructuredservice/food_blicense/default/biz-jy";
+  
+  public static final String BIZ_KHH = "/api-ocr/v1/ocrstructuredservice/bank_account_permit/default/biz-khh";
+  
+  public static final String BIZ_CZC = "/api-ocr/v1/ocrstructuredservice/taxi_ticket/default/biz-taxi";
+  
+  public static final String BIZ_DYWZ = "/api-ocr/v1/ocrservice/default/default/language-chn";
+  
+  public static final String BIZ_TB = "/api-ocr/v1/ocrservice/default/default/table-true";
+  
+  public static final String BIZ_ZP = "/api-ocr/v1/ocrstructuredservice/invoice/default/biz-zp";
+  
+  public static final String BIZ_PP = "/api-ocr/v1/ocrstructuredservice/invoice/default/biz-pp";
+  
+  public static final String BIZ_DYWJ = "/api-ocr/v1/ocrservice/default/default/language-chn_biz_wj";
+  
+  public static final String BIZ_PJFG = "/api-ocr/v1/ocrmixedservice/multi_invoice/default/biz-pjfg";
+  
+  public static final String BIZ_PJFL = "/api-ocr/v1/ocrmixedservice/multi_invoice/default/biz-pjfl";
+  
+  public static final String BIZ_PJSB = "/api-ocr/v1/ocrmixedservice/multi_invoice/default/biz-pjsb";
+  
+  public static final String BIZ_TPHG = "/api-ocr/v1/ocrservice/basic/default/biz-tphgsb";
+  
+  public static final String BIZ_GZP = "/api-ocr/v1/ocrservice/default/default/biz-gzp";
+  
+  public static final String BIZ_CZP = "/api-ocr/v1/ocrservice/default/default/biz-czp";
+  
+  public static final String BIZ_HK = "/api-ocr/v1/ocrstructuredservice/air_itinerary/default/biz-hkxcd";
+  
+  public static final String BIZ_YZ = "/api-ocr/v1/ocrservice/advanced/default/noStamp-false_figure-true";
+  
+  public static final String BIZ_DEFP = "/api-ocr/v1/ocrstructuredservice/quota_invoice/default/biz-defpsb";
+  
+  public static final String BIZ_TPFL = "/api-ocr/v1/ocrstructuredservice/doctype/default/biz-tpzdfl";
+  
+  public static final String BIZ_CNSZY = "/api-ocr/capture/ocrservice/getCoordinateField/biz_wb";
+  
+  public static final String BIZ_FXJY = "/api-ocr/capture/ocrservice/getCoordinateField/biz_zy";
+  
+  public static final String BIZ_DZH_YYZZ = "/api-ocr/capture/ocrstructuredservice/blicense/default/biz_yyzz";
+}
+
+
+/* Location:              C:\Users\ningj\Desktop\java-sdk-1.0.0-SNAPSHOT\!\cn\com\esgcc\ai\matrix\sdk\constant\OcrMethod.class
+ * Java compiler version: 8 (52.0)
+ * JD-Core Version:       1.1.3
+ */

+ 19 - 0
ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/constant/SdkConstant.java

@@ -0,0 +1,19 @@
+/*    */ package cn.com.esgcc.ai.matrix.sdk.constant;
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ public class SdkConstant
+/*    */ {
+/*    */   public static final String ADMIN_PK = "04e7a67be95ca3efe0fe970d407af7688ea08cdf0d484b89d7720ea836d2baeea11ada72fbe9fc799251141009ef438d62434f8473e6191b7a3e09a1795c8ca5c7";
+/* 12 */   public static int DEFAULT_CONNECTION_TIMEOUT = 10000;
+/*    */ }
+
+
+/* Location:              C:\Users\ningj\Desktop\java-sdk-1.0.0-SNAPSHOT\!\cn\com\esgcc\ai\matrix\sdk\constant\SdkConstant.class
+ * Java compiler version: 8 (52.0)
+ * JD-Core Version:       1.1.3
+ */

+ 217 - 0
ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/esgccenum/ExceptionEnum.java

@@ -0,0 +1,217 @@
+/*     */ package cn.com.esgcc.ai.matrix.sdk.esgccenum;
+/*     */ 
+/*     */
+
+import java.util.ArrayList;
+import java.util.List;
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ public enum ExceptionEnum
+/*     */ {
+/*  14 */   COMMON_ERROR_1B("1b", "00001b000", "系统错误"),
+/*     */ 
+/*     */   
+/*  17 */   COMMON_SUCCESS_1B("1b", "00001b001", "成功"),
+/*     */ 
+/*     */   
+/*  20 */   TASK_PARAMETER_ERROR_400("1b", "00001b400", "taskId参数错误"),
+/*  21 */   URL_PARAMETER_ERROR_401("1b", "00001b401", "url参数错误"),
+/*  22 */   PARAMS_PARAMETER_ERROR_402("1b", "00001b402", "params参数错误"),
+/*  23 */   IMG_ERROR_403("1b", "00001b403", "图像内容错误或图像格式、编码不支持或图像最短边小于15px、最长边大于4096px"),
+/*  24 */   URL_LENGTH_ERROR_404("1b", "00001b404", "URL长度不能超过1024个字节"),
+/*  25 */   IMG_LENGTH_ERROR_405("1b", "00001b405", "图像内容大小不能超过4M"),
+/*  26 */   IMG_URL_ERROR_406("1b", "00001b406", "img和url参数不能同时为空"),
+/*  27 */   IMG_URL_ERROR_407("1b", "00001b407", "img和url参数不能同时存在"),
+/*  28 */   SOURCE_ERROR_408("1b", "00001b408", "sourcePath参数为空或者对应的文件不存在,请检查"),
+/*  29 */   SOURCE_ERROR_409("1b", "00001b409", "sourcePath对应的不是一个文件,请检查"),
+/*  30 */   URL_ERROR_410("1b", "00001b410", "url不可用或者无法获取图像,请检查"),
+/*  31 */   REQUEST_ERROR_411("1b", "00001b411", "请求速度超过了服务的处理能力,请降低qps或者稍后再试"),
+/*  32 */   PDF_ERROR_412("1b", "00001b412", "PDF文件不能超过10M"),
+/*  33 */   PDF_LENGTH_ERROR_413("1b", "00001b413", "PDF文件页数不能超过100"),
+/*  34 */   INVALID_SERVICE_ERROR_501("1b", "00001b501", "无效的服务类型"),
+/*  35 */   INVALID_ERROR_502("1b", "00001b502", "无效或者未授权的识别能力,如需开通更多识别能力请联系读光购买"),
+/*  36 */   LICENSE_ERROR_503("1b", "00001b503", "当前license额度已经用完"),
+/*  37 */   LICENSE_ERROR_504("1b", "00001b504", "无法获取license信息,请确认加密锁是否安装正确或者联系读光团队技术同学"),
+/*  38 */   LICENSE_ERROR_505("1b", "00001b505", "license信息错误,请确认加密锁是否安装正确或者联系读光团队技术同学"),
+/*  39 */   LICENSE_ERROR_508("1b", "00001b508", "获取license信息持续失败,请确认加密锁安装正确后并重启应用或者联系读光团队"),
+/*  40 */   ACCESS_ERROR_509("1b", "00001b509", "签名未授权,请通过正确的url访问"),
+/*  41 */   IMG_ERROR_513("1b", "00001b513", "获取图像内容错误:"),
+/*  42 */   REQUEST_ERROR_515("1b", "00001b515", "ocr请求失败,respondCode:"),
+/*  43 */   RESPONSE_ERROR_515("1b", "00001b515", "ocr服务返回结果为空"),
+/*  44 */   OCR_SERVICE_ERROR_517("1b", "00001b517", "ocr服务错误"),
+/*  45 */   REPETITION_ERROR_519("1b", "00001b519", "不允许在一台物理机上启动多个读光服务"),
+/*  46 */   IMG_ERROR_520("1b", "00001b520", "混贴切图失败,请稍后重试"),
+/*  47 */   TIME_EXPIRE_ERROR_523("1b", "00001b523", "测试license时间到期"),
+/*  48 */   IMG_SERVICE_ERROR_525("1b", "00001b525", "图像和服务类型不匹配"),
+/*     */ 
+/*     */   
+/*  51 */   PARAMS_NULL_1B("1b", "00101b001", "参数为空"),
+/*  52 */   PARAMS_INCOMPLETE_1B("1b", "00101b002", "参数不全"),
+/*  53 */   PARAMS_TYPE_1B("1b", "00101b003", "参数类型错误"),
+/*  54 */   PARAMS_INVALID_1B("1b", "00101b004", "参数无效"),
+/*  55 */   PARAMS_LENGTH_1B("1b", "00101b005", "参数长度错误"),
+/*  56 */   PARAMS_ANALYSIS_1B("1b", "00101b006", "参数解析失败错误"),
+/*  57 */   PARAMS_SIGN_1B("1b", "00101b006", "参数验签错误"),
+/*     */ 
+/*     */   
+/*  60 */   USER_NOT_EXIST_1B("1b", "00201b001", "用户不存在"),
+/*  61 */   USER_NOT_LOGIN_1B("1b", "00201b002", "用户未登录"),
+/*  62 */   USER_SESSION_TIMEOUT_1B("1b", "00201b007", "会话过期,请重新登录"),
+/*  63 */   USER_PASSWORD_1B("1b", "00201b003", "用户名或密码错误"),
+/*  64 */   USER_ACCOUNT_DISABLE_1B("1b", "00201b004", "用户账户被禁用"),
+/*  65 */   USER_HAVE_EXIST_1B("1b", "00201b005", "用户已存在"),
+/*  66 */   USER_VERIFITION_CODE_1B("1b", "00201b006", "验证码信息错误"),
+/*  67 */   USER_ROLE_IN_USE_1B("1b", "00201b008", "角色删除失败,尚有用户属于此角色"),
+/*     */ 
+/*     */ 
+/*     */   
+/*  71 */   BIZ_TOKEN_ERROR_1B("1b", "00301b001", "token验证失败"),
+/*  72 */   BIZ_TOKEN_INVALID_1B("1b", "00301b002", "token失效"),
+/*  73 */   BIZ_IP_SEND_SMS_TOO_MUCH_1B("1b", "00301b003", "当前ip发送短信过多"),
+/*  74 */   BIZ_MOBILE_SEND_SMS_TOO_MUCH_1B("1b", "00301b004", "当前手机号发送短信过多"),
+/*  75 */   BIZ_USER_NEW_OLD_SAME_1B("1b", "00301b005", "旧密码和新密码一样"),
+/*  76 */   BIZ_USER_OLD_PED_ERROR_1B("1b", "00301b006", "旧密码输入错误"),
+/*  77 */   BIZ_USER_REFUSE_SETTLED_PROTOCOL_1B("1b", "00301b007", "商户不同意商户入驻协议条款"),
+/*  78 */   BIZ_DROOLS_RELOAD_ERROR_1B("1b", "00301b008", "drools规则规则重新加载错误"),
+/*  79 */   BIZ_NO_FACE_IMAGE_ERROR_1B("1b", "00301b009", "未检测到人脸信息"),
+/*  80 */   BIZ_NO_RESULT_ERROR_1B("1b", "00301b010", "未审核完成"),
+/*  81 */   BIZ_AUDIT_ERROR_1B("1b", "00301b011", "审核失败"),
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*  88 */   SYSTEM_ARRAY_1B("1b", "00401b001", "数组下标越界"),
+/*  89 */   SYSTEM_ARITHMETIC_1B("1b", "00401b002", "数学计算异常"),
+/*  90 */   SYSTEM_NULLPOINTER_1B("1b", "00401b003", "空指针异常"),
+/*  91 */   SYSTEM_CLASS_CAST_1B("1b", "00401b004", "类型转换异常"),
+/*  92 */   SYSTEM_NEGATIVE_ARRAY_1B("1b", "00401b005", "数组负下标异常"),
+/*  93 */   SYSTEM_SECTURITY_1B("1b", "00401b006", "违背安全原则"),
+/*  94 */   SYSTEM_EOF_FILE_1B("1b", "00401b007", "文件已结束"),
+/*  95 */   SYSTEM_FILE_NOT_FOUND_1B("1b", "00401b008", "文件未找到"),
+/*  96 */   SYSTEM_NUMBER_FORMAT_1B("1b", "00401b009", "字符串转换为数字错误"),
+/*  97 */   SYSTEM_SQL_1B("1b", "00401b00a", "SQL错误"),
+/*  98 */   SYSTEM_IO_1B("1b", "00401b00b", "输入输出错误"),
+/*  99 */   SYSTEM_NO_SUCH_METHOD_1B("1b", "00401b00c", "找不到方法"),
+/* 100 */   SYSTEM_ARRYA_STORE_1B("1b", "00401b00d", "数组存储异常"),
+/* 101 */   SYSTEM_CLASS_NOT_FOUND_1B("1b", "00401b00e", "找不到类"),
+/* 102 */   SYSTEM_CLONE_NOT_SUPPORT_1B("1b", "00401b00f", "不支持克隆"),
+/* 103 */   SYSTEM_ENUM_CONSTANT_1B("1b", "00401b010", "枚举常量不存在"),
+/* 104 */   SYSTEM_ILLEGALACCESS_1B("1b", "00401b011", "违法的访问"),
+/* 105 */   SYSTEM_INTERRUPTED_1B("1b", "00401b012", "线程打断"),
+/* 106 */   SYSTEM_NO_SUCH_FIELD_1B("1b", "00401b013", "找不到字段"),
+/* 107 */   RPC_1B("1b", "00401b014", "RPC调用异常"),
+/* 108 */   SQL_TRANSACTION_1B("1b", "00401b015", "事务异常"),
+/*     */ 
+/*     */ 
+/*     */   
+/* 112 */   DATA_NOT_FOUND_1B("1b", "00501b001", "数据未找到"),
+/* 113 */   DATA_WRONG_1B("1b", "00501b002", "数据有误"),
+/* 114 */   DATA_HAVE_EXIST_1B("1b", "00501b003", "数据已存在"),
+/* 115 */   DATA_REPETE_INSERT_1B("1b", "00501b004", "数据重复插入"),
+/* 116 */   DATA_REPETE_CODE_1B("1b", "00501b005", "编码重复"),
+/*     */ 
+/*     */   
+/* 119 */   INTERFACE_INNER_SYSTEM_1B("1b", "00601b001", "系统内部接口调用异常"),
+/* 120 */   INTERFACE_OUTER_SYSTEM_1B("1b", "00601b002", "系统外部接口调用异常"),
+/* 121 */   INTERFACE_BLOCKING_ACCESS_1B("1b", "00601b003", "接口禁止访问"),
+/* 122 */   INTERFACE_INVALID_ADDRESS_1B("1b", "00601b004", "接口地址无效"),
+/* 123 */   INTERFACE_TIMEOUT_1B("1b", "00601b005", "接口请求超时"),
+/* 124 */   INTERFACE_TOO_BUSY_1B("1b", "00601b006", "接口负载过高"),
+/* 125 */   PARAMS_PROCESSING_1B("1b", "00601b007", "业务处理中"),
+/* 126 */   FLOW_EXCEPTION_1B("1b", "00601b008", "接口限流"),
+/* 127 */   DEGRADE_EXCEPTION_1B("1b", "00601b009", "服务降级"),
+/* 128 */   PARAM_FLOW_EXCEPTION_1B("1b", "00601b010", "热点参数限流"),
+/* 129 */   SYSTEM_BLOCK_EXCEPTION_1B("1b", "00601b011", "系统规则(负载/...不满足要求"),
+/* 130 */   AUTHORITY_EXCEPTION_1B("1b", "00601b012", "授权规则不通过"),
+/*     */   
+/* 132 */   NOT_AUTHORITY_1B("1b", "00701b001", "没有访问权限,请联系管理员"),
+/* 133 */   DATA_UNAUTHORIZED_1B("1b", "00701b002", "数据越权"),
+/* 134 */   AUTHORITY_CSRF_1B("1b", "00701b003", "csrf"),
+/* 135 */   AUTHORITY_XSS_1B("1b", "00701b004", "非法字符"),
+/* 136 */   DATA_REPETITION_1B("1b", "00701b005", "已通过审核,请勿修改数据"),
+/* 137 */   DATA_STOP_1B("1b", "00701b006", "已停用,请勿重复操作"),
+/* 138 */   DATA_AUDIT_1B("1b", "00701b007", "审核状态非通过,请勿进行关停操作"),
+/*     */   
+/* 140 */   SERVICE_UNAVAILABLE("1b", "00701b999", "服务暂时不可用");
+/*     */   
+/*     */   public static final String note = "九位十六进制错误码:第一位、第二位、第三位:错误类型;第四位、第五位、第六位:产品线;第七位、第八位、第九位:具体异常错误  第一二三位编码为000,则表示通用错误类型";
+/*     */   
+/*     */   public static final String readMe = "错误类型:000最大错误类型,001参数错误,002用户错误,003业务错误 自定义异常,004系统错误 运行时异常,005数据错误,006接口错误,007权限错误 ";
+/*     */   
+/*     */   public static final String tip = "第四位、第五位、第六位:产品线:001前置机,002供应商全息多维评价,003内容中心,004电商中心,005订单中心,006网上国网,007物流中心,008电E连,009国网商城 ,00a 零星物资,00b 集体企业 , 00c 工程中心,00d 招投标,00e 央企联盟 , 00f 国际站 , 010 结算中心 , 011 电动汽车 , 012 综合能源 ,013 商品中心 , 014 网关 , 015 数据中台 , 016 星河设计开放平台 , 017 光伏云 , 018 跨境电商 , 019 双创平台 , 030 供应商中心 , 01b AI中心 ";
+/*     */   private String project;
+/*     */   private String resultCode;
+/*     */   private String resultMsg;
+/*     */   
+/*     */   ExceptionEnum(String project, String resultCode, String resultMsg) {
+/* 152 */     this.project = project;
+/* 153 */     this.resultCode = resultCode;
+/* 154 */     this.resultMsg = resultMsg;
+/*     */   }
+/*     */   public String getProject() {
+/* 157 */     return this.project;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public String getResultCode() {
+/* 163 */     return this.resultCode;
+/*     */   }
+/*     */   public String getResultMsg() {
+/* 166 */     return this.resultMsg;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String getMsg(String resultCode) {
+/* 175 */     for (ExceptionEnum c : values()) {
+/* 176 */       if (resultCode.equals(c.getResultCode())) {
+/* 177 */         return c.resultMsg;
+/*     */       }
+/*     */     } 
+/* 180 */     return null;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static ExceptionEnum getExceptionEnumByCode(String resultCode) {
+/* 188 */     for (ExceptionEnum eEnum : values()) {
+/* 189 */       if (resultCode.equals(eEnum.getResultCode())) {
+/* 190 */         return eEnum;
+/*     */       }
+/*     */     } 
+/* 193 */     return null;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static List<ExceptionEnum> getExceptionEnums(String project) {
+/* 201 */     List<ExceptionEnum> ees = new ArrayList<>();
+/* 202 */     for (ExceptionEnum eEnum : values()) {
+/* 203 */       if (project.equals(eEnum.getProject())) {
+/* 204 */         ees.add(eEnum);
+/*     */       }
+/*     */     } 
+/* 207 */     return ees;
+/*     */   }
+/*     */ }
+
+
+/* Location:              C:\Users\ningj\Desktop\java-sdk-1.0.0-SNAPSHOT\!\cn\com\esgcc\ai\matrix\sdk\esgccenum\ExceptionEnum.class
+ * Java compiler version: 8 (52.0)
+ * JD-Core Version:       1.1.3
+ */

+ 28 - 0
ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/exception/BaseException.java

@@ -0,0 +1,28 @@
+/*    */ package cn.com.esgcc.ai.matrix.sdk.exception;
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ public class BaseException
+/*    */   extends RuntimeException
+/*    */ {
+/*    */   private static final long serialVersionUID = 7859712770754900356L;
+/*    */   
+/*    */   public BaseException(String msg) {
+/* 16 */     super(msg);
+/*    */   }
+/*    */   
+/*    */   public BaseException(Exception e) {
+/* 20 */     this(e.getMessage());
+/*    */   }
+/*    */ }
+
+
+/* Location:              C:\Users\ningj\Desktop\java-sdk-1.0.0-SNAPSHOT\!\cn\com\esgcc\ai\matrix\sdk\exception\BaseException.class
+ * Java compiler version: 8 (52.0)
+ * JD-Core Version:       1.1.3
+ */

+ 29 - 0
ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/exception/ServiceException.java

@@ -0,0 +1,29 @@
+/*    */ package cn.com.esgcc.ai.matrix.sdk.exception;
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ public class ServiceException
+/*    */   extends BaseException
+/*    */ {
+/*    */   private static final long serialVersionUID = -2437160791033393978L;
+/*    */   
+/*    */   public ServiceException(String msg) {
+/* 17 */     super(msg);
+/*    */   }
+/*    */   
+/*    */   public ServiceException(Exception e) {
+/* 21 */     this(e.getMessage());
+/*    */   }
+/*    */ }
+
+
+/* Location:              C:\Users\ningj\Desktop\java-sdk-1.0.0-SNAPSHOT\!\cn\com\esgcc\ai\matrix\sdk\exception\ServiceException.class
+ * Java compiler version: 8 (52.0)
+ * JD-Core Version:       1.1.3
+ */

+ 176 - 0
ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/request/NewQueryData.java

@@ -0,0 +1,176 @@
+/*     */ package cn.com.esgcc.ai.matrix.sdk.request;
+/*     */ 
+/*     */
+
+import java.io.Serializable;
+import java.util.UUID;
+/*     */ 
+/*     */ 
+/*     */ public class NewQueryData
+/*     */   implements Serializable
+/*     */ {
+/*  10 */   private Long timestamp = Long.valueOf(System.currentTimeMillis());
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   private String img;
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   private String charInfo;
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   private String row;
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   private String rotate;
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   private String prob;
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   private String table;
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   private String figure;
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   private String recClassify;
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   private String language;
+/*     */ 
+/*     */   
+/*     */   private String noStamp;
+/*     */ 
+/*     */   
+/*     */   private boolean checkFile = true;
+/*     */ 
+/*     */   
+/*  55 */   private String uuid = UUID.randomUUID().toString();
+/*     */   
+/*     */   public String getUuid() {
+/*  58 */     return this.uuid;
+/*     */   }
+/*     */   
+/*     */   public void setUuid(String uuid) {
+/*  62 */     this.uuid = uuid;
+/*     */   }
+/*     */   
+/*     */   public boolean isCheckFile() {
+/*  66 */     return this.checkFile;
+/*     */   }
+/*     */   
+/*     */   public void setCheckFile(boolean checkFile) {
+/*  70 */     this.checkFile = checkFile;
+/*     */   }
+/*     */   
+/*     */   public Long getTimestamp() {
+/*  74 */     return this.timestamp;
+/*     */   }
+/*     */   
+/*     */   public void setTimestamp(Long timestamp) {
+/*  78 */     this.timestamp = timestamp;
+/*     */   }
+/*     */   
+/*     */   public String getImg() {
+/*  82 */     return this.img;
+/*     */   }
+/*     */   
+/*     */   public void setImg(String img) {
+/*  86 */     this.img = img;
+/*     */   }
+/*     */   
+/*     */   public String getCharInfo() {
+/*  90 */     return this.charInfo;
+/*     */   }
+/*     */   
+/*     */   public void setCharInfo(String charInfo) {
+/*  94 */     this.charInfo = charInfo;
+/*     */   }
+/*     */   
+/*     */   public String getRow() {
+/*  98 */     return this.row;
+/*     */   }
+/*     */   
+/*     */   public void setRow(String row) {
+/* 102 */     this.row = row;
+/*     */   }
+/*     */   
+/*     */   public String getRotate() {
+/* 106 */     return this.rotate;
+/*     */   }
+/*     */   
+/*     */   public void setRotate(String rotate) {
+/* 110 */     this.rotate = rotate;
+/*     */   }
+/*     */   
+/*     */   public String getProb() {
+/* 114 */     return this.prob;
+/*     */   }
+/*     */   
+/*     */   public void setProb(String prob) {
+/* 118 */     this.prob = prob;
+/*     */   }
+/*     */   
+/*     */   public String getTable() {
+/* 122 */     return this.table;
+/*     */   }
+/*     */   
+/*     */   public void setTable(String table) {
+/* 126 */     this.table = table;
+/*     */   }
+/*     */   
+/*     */   public String getFigure() {
+/* 130 */     return this.figure;
+/*     */   }
+/*     */   
+/*     */   public void setFigure(String figure) {
+/* 134 */     this.figure = figure;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public String getRecClassify() {
+/* 141 */     return this.recClassify;
+/*     */   }
+/*     */   
+/*     */   public void setRecClassify(String recClassify) {
+/* 145 */     this.recClassify = recClassify;
+/*     */   }
+/*     */   
+/*     */   public String getLanguage() {
+/* 149 */     return this.language;
+/*     */   }
+/*     */   
+/*     */   public void setLanguage(String language) {
+/* 153 */     this.language = language;
+/*     */   }
+/*     */   
+/*     */   public String getNoStamp() {
+/* 157 */     return this.noStamp;
+/*     */   }
+/*     */   
+/*     */   public void setNoStamp(String noStamp) {
+/* 161 */     this.noStamp = noStamp;
+/*     */   }
+/*     */ 
+/*     */   
+/*     */   public String toString() {
+/* 166 */     return "NewQueryData{timestamp=" + this.timestamp + ", img='" + this.img + '\'' + ", charInfo='" + this.charInfo + '\'' + ", row='" + this.row + '\'' + ", rotate='" + this.rotate + '\'' + ", prob=" + this.prob + ", table='" + this.table + '\'' + ", figure='" + this.figure + '\'' + ", recClassify='" + this.recClassify + '\'' + ", language=" + this.language + ", noStamp='" + this.noStamp + '\'' + '}';
+/*     */   }
+/*     */ }
+
+
+/* Location:              C:\Users\ningj\Desktop\java-sdk-1.0.0-SNAPSHOT\!\cn\com\esgcc\ai\matrix\sdk\request\NewQueryData.class
+ * Java compiler version: 8 (52.0)
+ * JD-Core Version:       1.1.3
+ */

+ 43 - 0
ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/request/PDFtoWord.java

@@ -0,0 +1,43 @@
+/*    */ package cn.com.esgcc.ai.matrix.sdk.request;
+/*    */ 
+/*    */ public class PDFtoWord
+/*    */ {
+/*    */   public String toString() {
+/*  6 */     return "PDFtoWord{taskid='" + this.taskid + '\'' + ", timestamp=" + this.timestamp + '}';
+/*    */   }
+/*    */ 
+/*    */   
+/*    */   private String taskid;
+/*    */   
+/*    */   public String getTaskid() {
+/* 13 */     return this.taskid;
+/*    */   }
+/*    */   
+/*    */   public void setTaskid(String taskid) {
+/* 17 */     this.taskid = taskid;
+/*    */   }
+/*    */   
+/*    */   public Long getTimestamp() {
+/* 21 */     return this.timestamp;
+/*    */   }
+/*    */   
+/*    */   public void setTimestamp(Long timestamp) {
+/* 25 */     this.timestamp = timestamp;
+/*    */   }
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */   
+/* 36 */   private Long timestamp = Long.valueOf(System.currentTimeMillis());
+/*    */ }
+
+
+/* Location:              C:\Users\ningj\Desktop\java-sdk-1.0.0-SNAPSHOT\!\cn\com\esgcc\ai\matrix\sdk\request\PDFtoWord.class
+ * Java compiler version: 8 (52.0)
+ * JD-Core Version:       1.1.3
+ */

+ 79 - 0
ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/request/QueryData.java

@@ -0,0 +1,79 @@
+/*    */ package cn.com.esgcc.ai.matrix.sdk.request;
+/*    */ 
+/*    */
+
+import java.io.Serializable;
+import java.util.UUID;
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ public class QueryData
+/*    */   implements Serializable
+/*    */ {
+/* 11 */   private Long timestamp = Long.valueOf(System.currentTimeMillis());
+/*    */ 
+/*    */ 
+/*    */   
+/*    */   private String img;
+/*    */ 
+/*    */   
+/*    */   private boolean checkFile = true;
+/*    */ 
+/*    */   
+/* 21 */   private String uuid = UUID.randomUUID().toString();
+/*    */ 
+/*    */   
+/*    */   private String fileBase64;
+/*    */ 
+/*    */   
+/*    */   public Long getTimestamp() {
+/* 28 */     return this.timestamp;
+/*    */   }
+/*    */   
+/*    */   public void setTimestamp(Long timestamp) {
+/* 32 */     this.timestamp = timestamp;
+/*    */   }
+/*    */   
+/*    */   public String getImg() {
+/* 36 */     return this.img;
+/*    */   }
+/*    */   
+/*    */   public void setImg(String img) {
+/* 40 */     this.img = img;
+/*    */   }
+/*    */   
+/*    */   public String getFileBase64() {
+/* 44 */     return this.fileBase64;
+/*    */   }
+/*    */   
+/*    */   public void setFileBase64(String fileBase64) {
+/* 48 */     this.fileBase64 = fileBase64;
+/*    */   }
+/*    */   
+/*    */   public String getUuid() {
+/* 52 */     return this.uuid;
+/*    */   }
+/*    */   
+/*    */   public void setUuid(String uuid) {
+/* 56 */     this.uuid = uuid;
+/*    */   }
+/*    */   
+/*    */   public boolean isCheckFile() {
+/* 60 */     return this.checkFile;
+/*    */   }
+/*    */   
+/*    */   public void setCheckFile(boolean checkFile) {
+/* 64 */     this.checkFile = checkFile;
+/*    */   }
+/*    */ 
+/*    */   
+/*    */   public String toString() {
+/* 69 */     return "QueryData{timestamp=" + this.timestamp + ", img='" + this.img + '\'' + ", checkFile=" + this.checkFile + ", uuid='" + this.uuid + '\'' + ", fileBase64='" + this.fileBase64 + '\'' + '}';
+/*    */   }
+/*    */ }
+
+
+/* Location:              C:\Users\ningj\Desktop\java-sdk-1.0.0-SNAPSHOT\!\cn\com\esgcc\ai\matrix\sdk\request\QueryData.class
+ * Java compiler version: 8 (52.0)
+ * JD-Core Version:       1.1.3
+ */

+ 364 - 0
ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/request/RequestClient.java

@@ -0,0 +1,364 @@
+/*     */ package cn.com.esgcc.ai.matrix.sdk.request;
+/*     */ 
+/*     */
+
+import cn.com.esgcc.ai.matrix.sdk.constant.SdkConstant;
+import cn.com.esgcc.ai.matrix.sdk.esgccenum.ExceptionEnum;
+import cn.com.esgcc.ai.matrix.sdk.exception.ServiceException;
+import cn.com.esgcc.ai.matrix.sdk.response.SdkResponse;
+import cn.com.esgcc.ai.matrix.sdk.response.SdkTokenResponse;
+import cn.com.esgcc.ai.matrix.sdk.util.ParamsUtils;
+import cn.com.esgcc.ai.matrix.sdk.util.encrypt.StringUtil;
+import cn.com.esgcc.ai.matrix.sdk.util.encrypt.sm2.Sm2KeyVO;
+import cn.com.esgcc.ai.matrix.sdk.util.encrypt.sm2.Sm2Utils;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import cn.hutool.log.Log;
+import cn.hutool.log.LogFactory;
+import org.bouncycastle.crypto.InvalidCipherTextException;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ public class RequestClient
+/*     */ {
+/*  31 */   Log logger = LogFactory.get();
+/*     */   
+/*     */   private String clientId;
+/*     */   
+/*     */   private String clientSecret;
+/*     */   
+/*     */   private String sm2ClientSecret;
+/*     */   
+/*     */   private String username;
+/*     */   private String password;
+/*     */   private String sm2Password;
+/*     */   private String deviceId;
+/*     */   private Sm2KeyVO sm2KeyVO;
+/*     */   private String accessToken;
+/*     */   private String ocrServer;
+/*  46 */   private int timeout = SdkConstant.DEFAULT_CONNECTION_TIMEOUT;
+/*     */ 
+/*     */   
+/*     */   public RequestClient() {}
+/*     */ 
+/*     */   
+/*     */   public RequestClient(String ocrServer, String deviceId, String clientId, String clientSecret, String username, String password, Sm2KeyVO sm2KeyVO) {
+/*  53 */     this.clientId = clientId;
+/*  54 */     this.clientSecret = clientSecret;
+/*  55 */     this.deviceId = deviceId;
+/*  56 */     this.username = username;
+/*  57 */     this.password = password;
+/*  58 */     this.ocrServer = ocrServer;
+/*  59 */     this.sm2KeyVO = sm2KeyVO;
+/*     */     try {
+/*  61 */       this.sm2ClientSecret = Sm2Utils.encrypt(clientSecret, "04e7a67be95ca3efe0fe970d407af7688ea08cdf0d484b89d7720ea836d2baeea11ada72fbe9fc799251141009ef438d62434f8473e6191b7a3e09a1795c8ca5c7");
+/*  62 */       this.sm2Password = Sm2Utils.encrypt(password, "04e7a67be95ca3efe0fe970d407af7688ea08cdf0d484b89d7720ea836d2baeea11ada72fbe9fc799251141009ef438d62434f8473e6191b7a3e09a1795c8ca5c7");
+/*  63 */     } catch (InvalidCipherTextException e) {
+/*  64 */       e.printStackTrace();
+/*  65 */       throw new ServiceException("密码加密失败");
+/*     */     } 
+/*     */   }
+/*     */ 
+/*     */   
+/*     */   public RequestClient(String ocrServer, String deviceId, String clientId, String clientSecret, String username, String password, Sm2KeyVO sm2KeyVO, Boolean sm2Encrypt) {
+/*  71 */     this.clientId = clientId;
+/*  72 */     this.sm2ClientSecret = clientSecret;
+/*  73 */     this.deviceId = deviceId;
+/*  74 */     this.username = username;
+/*  75 */     this.sm2Password = password;
+/*  76 */     this.ocrServer = ocrServer;
+/*  77 */     this.sm2KeyVO = sm2KeyVO;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public SdkResponse esgccOcr(String path, QueryData queryData) {
+/*  87 */     return esgccOcr(path, queryData, true);
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public SdkResponse esgccOcr(String path, File queryData) {
+/*  96 */     return esgccOcr(path, queryData, true);
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public SdkResponse esgccOcr(String path, File queryData, boolean decrypt) {
+/* 106 */     verifyData();
+/* 107 */     String sign = null;
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */     
+/* 116 */     this.logger.debug("sing:" + sign, new Object[0]);
+/* 117 */     Map<String, Object> paramap = new HashMap<>();
+/* 118 */     paramap.put("pdfFile", queryData);
+/* 119 */     String body = ((HttpRequest)((HttpRequest)((HttpRequest)HttpRequest.post(this.ocrServer + path).header("access-token", this.accessToken)).header("encryption", "false")).header("publicKey", this.sm2KeyVO.getPublicKey())).form(paramap).timeout(this.timeout).execute().body();
+/* 120 */     this.logger.debug("body:" + body, new Object[0]);
+/* 121 */     JSONObject data = JSONUtil.parseObj(body);
+/* 122 */     if (!ExceptionEnum.COMMON_SUCCESS_1B.getResultCode().equals(data.getStr("code"))) {
+/* 123 */       this.logger.error("识别失败:" + data.getStr("msg"), new Object[0]);
+/* 124 */       return SdkResponse.fail(data.getStr("code"), data.getStr("msg"));
+/*     */     } 
+/* 126 */     return (SdkResponse)JSONUtil.toBean(data, SdkResponse.class);
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public SdkResponse esgccOcr(String path, QueryData queryData, boolean decrypt) {
+/* 135 */     verifyData();
+/* 136 */     String postData = JSONUtil.toJsonStr(queryData);
+/* 137 */     String sign = null;
+/* 138 */     if (queryData.isCheckFile()) {
+/* 139 */       sign = ParamsUtils.generateReqSign(postData);
+/*     */     } else {
+/*     */       
+/* 142 */       sign = ParamsUtils.generateReqSign(queryData);
+/*     */     } 
+/*     */ 
+/*     */     
+/* 146 */     this.logger.debug("sing:" + sign, new Object[0]);
+/* 147 */     String body = ((HttpRequest)((HttpRequest)((HttpRequest)((HttpRequest)HttpRequest.post(this.ocrServer + path).header("access-token", this.accessToken)).header("appCode", "ocrAdmin")).header("sign", sign)).header("publicKey", this.sm2KeyVO.getPublicKey())).body(postData).timeout(this.timeout).execute().body();
+/* 148 */     this.logger.debug("body:" + body, new Object[0]);
+/* 149 */     JSONObject data = JSONUtil.parseObj(body);
+/* 150 */     if (!ExceptionEnum.COMMON_SUCCESS_1B.getResultCode().equals(data.getStr("code"))) {
+/* 151 */       this.logger.error("识别失败:" + data.getStr("msg"), new Object[0]);
+/* 152 */       return SdkResponse.fail(data.getStr("code"), data.getStr("msg"));
+/* 153 */     }  if (decrypt) {
+/* 154 */       data = ParamsUtils.decrypt(data, getSm2KeyVO().getPrivateKey());
+/*     */     }
+/* 156 */     this.logger.debug("data:" + data, new Object[0]);
+/* 157 */     return (SdkResponse)JSONUtil.toBean(data, SdkResponse.class);
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public <T> SdkResponse<T> newEsgccOcr(String path, T queryData, boolean decrypt) {
+/* 167 */     verifyData();
+/* 168 */     String postData = JSONUtil.toJsonStr(queryData);
+/* 169 */     String sign = null;
+/*     */     
+/* 171 */     sign = ParamsUtils.generateReqSign(postData);
+/*     */ 
+/*     */     
+/* 174 */     this.logger.debug("sing:" + sign, new Object[0]);
+/* 175 */     String body = ((HttpRequest)((HttpRequest)((HttpRequest)((HttpRequest)HttpRequest.post(this.ocrServer + path).header("access-token", this.accessToken)).header("appCode", "ocrAdmin")).header("sign", sign)).header("publicKey", this.sm2KeyVO.getPublicKey())).body(postData).timeout(this.timeout).execute().body();
+/* 176 */     this.logger.debug("body:" + body, new Object[0]);
+/* 177 */     JSONObject data = JSONUtil.parseObj(body);
+/* 178 */     if (!ExceptionEnum.COMMON_SUCCESS_1B.getResultCode().equals(data.getStr("code"))) {
+/* 179 */       this.logger.error("识别失败:" + data.getStr("msg"), new Object[0]);
+/* 180 */       return SdkResponse.fail(data.getStr("code"), data.getStr("msg"));
+/* 181 */     }  if (decrypt) {
+/* 182 */       data = ParamsUtils.decrypt(data, getSm2KeyVO().getPrivateKey());
+/*     */     }
+/* 184 */     this.logger.debug("data:" + data, new Object[0]);
+/* 185 */     return (SdkResponse<T>)JSONUtil.toBean(data, SdkResponse.class);
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public String decrypt(String data) {
+/* 193 */     if (null == this.sm2KeyVO || StringUtil.isEmpty(this.sm2KeyVO.getPrivateKey())) {
+/* 194 */       throw new ServiceException("私钥为空");
+/*     */     }
+/*     */     try {
+/* 197 */       return Sm2Utils.decrypt(data, this.sm2KeyVO.getPrivateKey());
+/* 198 */     } catch (InvalidCipherTextException e) {
+/* 199 */       e.printStackTrace();
+/* 200 */       throw new ServiceException("解密失败");
+/*     */     } 
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public SdkTokenResponse oauthUserToken() {
+/* 210 */     verifyData();
+/* 211 */     Map<String, Object> formMap = new HashMap<>();
+/* 212 */     formMap.put("clientId", this.clientId);
+/* 213 */     formMap.put("clientSecret", this.sm2ClientSecret);
+/* 214 */     formMap.put("username", this.username);
+/* 215 */     formMap.put("password", this.sm2Password);
+/* 216 */     formMap.put("timestamp", System.currentTimeMillis() + "");
+/* 217 */     String sign = ParamsUtils.generateReqSign(formMap);
+/* 218 */     String body = ((HttpRequest)((HttpRequest)((HttpRequest)HttpRequest.post(this.ocrServer + "/api-auth/oauth/user/token").header("sign", sign)).header("appCode", "ocrAdmin")).header("publicKey", this.sm2KeyVO.getPublicKey())).form(formMap).timeout(this.timeout).execute().body();
+/* 219 */     SdkTokenResponse sdkTokenResponse = (SdkTokenResponse)JSONUtil.toBean(body, SdkTokenResponse.class);
+/* 220 */     if (ExceptionEnum.COMMON_SUCCESS_1B.getResultCode().equals(sdkTokenResponse.getCode())) {
+/* 221 */       this.accessToken = sdkTokenResponse.getAccessToken();
+/*     */     } else {
+/* 223 */       this.logger.error("登录认证失败:" + sdkTokenResponse.getMsg(), new Object[0]);
+/* 224 */       throw new ServiceException("登录认证失败:" + sdkTokenResponse.getMsg());
+/*     */     } 
+/* 226 */     System.out.println(sdkTokenResponse.getAccessToken());
+/* 227 */     return sdkTokenResponse;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public void verifyData() {
+/* 233 */     if (StringUtil.isEmpty(this.ocrServer))
+/* 234 */       throw new ServiceException("ocrServer 不能为空"); 
+/* 235 */     if (StringUtil.isEmpty(this.clientId))
+/* 236 */       throw new ServiceException("clientId 不能为空"); 
+/* 237 */     if (StringUtil.isEmpty(this.sm2ClientSecret))
+/* 238 */       throw new ServiceException("sm2ClientSecret 不能为空"); 
+/* 239 */     if (StringUtil.isEmpty(this.deviceId))
+/* 240 */       throw new ServiceException("deviceId 不能为空"); 
+/* 241 */     if (StringUtil.isEmpty(this.username))
+/* 242 */       throw new ServiceException("username 不能为空"); 
+/* 243 */     if (StringUtil.isEmpty(this.sm2Password))
+/* 244 */       throw new ServiceException("sm2Password 不能为空"); 
+/* 245 */     if (null == this.sm2KeyVO) {
+/* 246 */       throw new ServiceException("sm2KeyVO 不能为空");
+/*     */     }
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public String getClientId() {
+/* 265 */     return this.clientId;
+/*     */   }
+/*     */   
+/*     */   public void setClientId(String clientId) {
+/* 269 */     this.clientId = clientId;
+/*     */   }
+/*     */   
+/*     */   public String getClientSecret() {
+/* 273 */     return this.clientSecret;
+/*     */   }
+/*     */   
+/*     */   public void setClientSecret(String clientSecret) {
+/* 277 */     this.clientSecret = clientSecret;
+/*     */   }
+/*     */   
+/*     */   public String getSm2ClientSecret() {
+/* 281 */     return this.sm2ClientSecret;
+/*     */   }
+/*     */   
+/*     */   public void setSm2ClientSecret(String sm2ClientSecret) {
+/* 285 */     this.sm2ClientSecret = sm2ClientSecret;
+/*     */   }
+/*     */   
+/*     */   public String getUsername() {
+/* 289 */     return this.username;
+/*     */   }
+/*     */   
+/*     */   public void setUsername(String username) {
+/* 293 */     this.username = username;
+/*     */   }
+/*     */   
+/*     */   public String getPassword() {
+/* 297 */     return this.password;
+/*     */   }
+/*     */   
+/*     */   public void setPassword(String password) {
+/* 301 */     this.password = password;
+/*     */   }
+/*     */   
+/*     */   public String getSm2Password() {
+/* 305 */     return this.sm2Password;
+/*     */   }
+/*     */   
+/*     */   public void setSm2Password(String sm2Password) {
+/* 309 */     this.sm2Password = sm2Password;
+/*     */   }
+/*     */   
+/*     */   public String getDeviceId() {
+/* 313 */     return this.deviceId;
+/*     */   }
+/*     */   
+/*     */   public void setDeviceId(String deviceId) {
+/* 317 */     this.deviceId = deviceId;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public Sm2KeyVO getSm2KeyVO() {
+/* 325 */     return this.sm2KeyVO;
+/*     */   }
+/*     */   
+/*     */   public void setSm2KeyVO(Sm2KeyVO sm2KeyVO) {
+/* 329 */     this.sm2KeyVO = sm2KeyVO;
+/*     */   }
+/*     */   
+/*     */   public String getAccessToken() {
+/* 333 */     return this.accessToken;
+/*     */   }
+/*     */   
+/*     */   public void setAccessToken(String accessToken) {
+/* 337 */     this.accessToken = accessToken;
+/*     */   }
+/*     */   
+/*     */   public String getOcrServer() {
+/* 341 */     return this.ocrServer;
+/*     */   }
+/*     */   
+/*     */   public void setOcrServer(String ocrServer) {
+/* 345 */     this.ocrServer = ocrServer;
+/*     */   }
+/*     */   
+/*     */   public long getTimeout() {
+/* 349 */     return this.timeout;
+/*     */   }
+/*     */   
+/*     */   public void setTimeout(int timeout) {
+/* 353 */     this.timeout = timeout;
+/*     */   }
+/*     */ }
+
+
+/* Location:              C:\Users\ningj\Desktop\java-sdk-1.0.0-SNAPSHOT\!\cn\com\esgcc\ai\matrix\sdk\request\RequestClient.class
+ * Java compiler version: 8 (52.0)
+ * JD-Core Version:       1.1.3
+ */

+ 53 - 0
ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/response/SdkResponse.java

@@ -0,0 +1,53 @@
+/*    */ package cn.com.esgcc.ai.matrix.sdk.response;
+/*    */ 
+/*    */ import java.io.Serializable;
+/*    */ 
+/*    */ public class SdkResponse<T> implements Serializable {
+/*    */   public static SdkResponse fail(String code, String msg) {
+/*  7 */     SdkResponse sdkResponse = new SdkResponse();
+/*  8 */     sdkResponse.setCode(code);
+/*  9 */     sdkResponse.setMsg(msg);
+/* 10 */     return sdkResponse;
+/*    */   }
+/*    */ 
+/*    */   
+/*    */   private static final long serialVersionUID = -4696008537295855861L;
+/*    */   private T data;
+/*    */   
+/*    */   public T getData() {
+/* 18 */     return this.data;
+/*    */   }
+/*    */   private String code; private String msg;
+/*    */   public void setData(T data) {
+/* 22 */     this.data = data;
+/*    */   }
+/*    */   
+/*    */   public String getCode() {
+/* 26 */     return this.code;
+/*    */   }
+/*    */   
+/*    */   public void setCode(String code) {
+/* 30 */     this.code = code;
+/*    */   }
+/*    */   
+/*    */   public String getMsg() {
+/* 34 */     return this.msg;
+/*    */   }
+/*    */   
+/*    */   public void setMsg(String msg) {
+/* 38 */     this.msg = msg;
+/*    */   }
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */   
+/*    */   public String toString() {
+/* 45 */     return "SdkResponse{data=" + this.data + ", code='" + this.code + '\'' + ", msg='" + this.msg + '\'' + '}';
+/*    */   }
+/*    */ }
+
+
+/* Location:              C:\Users\ningj\Desktop\java-sdk-1.0.0-SNAPSHOT\!\cn\com\esgcc\ai\matrix\sdk\response\SdkResponse.class
+ * Java compiler version: 8 (52.0)
+ * JD-Core Version:       1.1.3
+ */

+ 44 - 0
ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/response/SdkTokenResponse.java

@@ -0,0 +1,44 @@
+/*    */ package cn.com.esgcc.ai.matrix.sdk.response;
+/*    */ 
+/*    */ import cn.hutool.json.JSONObject;
+/*    */ 
+/*    */ public class SdkTokenResponse
+/*    */   extends SdkResponse
+/*    */ {
+/*    */   private String accessToken;
+/*    */   private String refreshToken;
+/*    */   private Integer expiresIn;
+/*    */   
+/*    */   public String getAccessToken() {
+/* 13 */     JSONObject data = (JSONObject)getData();
+/* 14 */     return data.getStr("access_token");
+/*    */   }
+/*    */   
+/*    */   public void setAccessToken(String accessToken) {
+/* 18 */     this.accessToken = accessToken;
+/*    */   }
+/*    */   
+/*    */   public String getRefreshToken() {
+/* 22 */     JSONObject data = (JSONObject)getData();
+/* 23 */     return data.getStr("refresh_token");
+/*    */   }
+/*    */   
+/*    */   public void setRefreshToken(String refreshToken) {
+/* 27 */     this.refreshToken = refreshToken;
+/*    */   }
+/*    */   
+/*    */   public Integer getExpiresIn() {
+/* 31 */     JSONObject data = (JSONObject)getData();
+/* 32 */     return data.getInt("expires_in");
+/*    */   }
+/*    */   
+/*    */   public void setExpiresIn(Integer expiresIn) {
+/* 36 */     this.expiresIn = expiresIn;
+/*    */   }
+/*    */ }
+
+
+/* Location:              C:\Users\ningj\Desktop\java-sdk-1.0.0-SNAPSHOT\!\cn\com\esgcc\ai\matrix\sdk\response\SdkTokenResponse.class
+ * Java compiler version: 8 (52.0)
+ * JD-Core Version:       1.1.3
+ */

+ 297 - 0
ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/util/ParamsUtils.java

@@ -0,0 +1,297 @@
+/*     */ package cn.com.esgcc.ai.matrix.sdk.util;
+/*     */ 
+/*     */
+
+import cn.com.esgcc.ai.matrix.sdk.request.NewQueryData;
+import cn.com.esgcc.ai.matrix.sdk.request.QueryData;
+import cn.com.esgcc.ai.matrix.sdk.util.encrypt.StringUtil;
+import cn.com.esgcc.ai.matrix.sdk.util.encrypt.sm2.Sm2Utils;
+import cn.com.esgcc.ai.matrix.sdk.util.encrypt.sm3.Sm3Util;
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONObject;
+import org.bouncycastle.crypto.InvalidCipherTextException;
+
+import java.util.*;
+import java.util.stream.Collectors;
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ public class ParamsUtils
+/*     */ {
+/*     */   private static final long paramTimeOut = 600000L;
+/*     */   public static final int INDEX_NOT_FOUND = -1;
+/*     */   
+/*     */   static {
+/*  28 */     Locale.setDefault(Locale.ENGLISH);
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String getUrlParamsByMap(Map<String, String> map) {
+/*  46 */     if (map == null) {
+/*  47 */       return "";
+/*     */     }
+/*  49 */     StringBuilder sb = new StringBuilder();
+/*  50 */     for (Map.Entry<String, String> entry : map.entrySet()) {
+/*  51 */       sb.append((String)entry.getKey() + "=" + (String)entry.getValue());
+/*  52 */       sb.append("&");
+/*     */     } 
+/*  54 */     String s = sb.toString();
+/*  55 */     if (s.endsWith("&")) {
+/*  56 */       s = substringBeforeLast(s, "&");
+/*     */     }
+/*  58 */     return s;
+/*     */   }
+/*     */   public static boolean isEmpty(CharSequence cs) {
+/*  61 */     return (cs == null || cs.length() == 0);
+/*     */   }
+/*     */   public static String substringBeforeLast(String str, String separator) {
+/*  64 */     if (isEmpty(str) || isEmpty(separator)) {
+/*  65 */       return str;
+/*     */     }
+/*  67 */     int pos = str.lastIndexOf(separator);
+/*  68 */     if (pos == -1) {
+/*  69 */       return str;
+/*     */     }
+/*  71 */     return str.substring(0, pos);
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String generateReqSign(Map<String, Object> parameters) {
+/*  79 */     String sign = generateSign(parameters);
+/*  80 */     String newSign = Sm3Util.generateSM3HASH(sign);
+/*  81 */     sign = sign + newSign.substring(0, 5);
+/*  82 */     return sign;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String generateReqSign(QueryData queryData) {
+/*  90 */     Map<String, Object> singParam = new HashMap<>();
+/*  91 */     singParam.put("timestamp", queryData.getTimestamp());
+/*  92 */     singParam.put("uuid", queryData.getUuid());
+/*  93 */     singParam.put("checkFile", Boolean.valueOf(queryData.isCheckFile()));
+/*  94 */     String sign = generateReqSign(singParam);
+/*  95 */     return sign;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String generateReqSign(NewQueryData queryData) {
+/* 103 */     Map<String, Object> singParam = new HashMap<>();
+/* 104 */     singParam.put("timestamp", queryData.getTimestamp());
+/* 105 */     singParam.put("uuid", queryData.getUuid());
+/* 106 */     singParam.put("checkFile", Boolean.valueOf(queryData.isCheckFile()));
+/* 107 */     String sign = generateReqSign(singParam);
+/* 108 */     return sign;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String generateReqSign(String json) {
+/* 117 */     String sign = Sm3Util.generateSM3HASH(json);
+/* 118 */     String newSign = Sm3Util.generateSM3HASH(sign);
+/* 119 */     sign = sign + newSign.substring(0, 5);
+/* 120 */     return sign;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String generateSign(Map<String, Object> parameters) {
+/*     */     try {
+/* 129 */       List<String> names = new ArrayList<>();
+/* 130 */       parameters.forEach((k, v) -> {
+/*     */             if (v != null && !Objects.equals(v, "") && !Objects.equals(k, "sign")) {
+/*     */               names.add(k);
+/*     */             }
+/*     */           });
+/*     */ 
+/*     */ 
+/*     */       
+/* 138 */       List sortedNames = (List)names.stream().sorted().collect(Collectors.toList());
+/* 139 */       StringBuilder sb = new StringBuilder();
+/* 140 */       sortedNames.forEach(n -> sb.append(String.format("%s=%s", new Object[] { n, parameters.get(n) })));
+/*     */       
+/* 142 */       String sign = Sm3Util.generateSM3HASH(sb.toString().trim());
+/* 143 */       return sign;
+/* 144 */     } catch (Exception e) {
+/* 145 */       return "";
+/*     */     } 
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String generateSignArr(Map<String, String[]> parameters) {
+/*     */     try {
+/* 157 */       List<String> names = new ArrayList<>();
+/* 158 */       parameters.forEach((k, varr) -> {
+/*     */             if (null != parameters && parameters.size() > 0) {
+/*     */               String v = varr[0];
+/*     */ 
+/*     */               
+/*     */               if (v != null && !Objects.equals(v, "") && !Objects.equals(k, "sign")) {
+/*     */                 names.add(k);
+/*     */               }
+/*     */             } 
+/*     */           });
+/*     */ 
+/*     */       
+/* 170 */       List sortedNames = (List)names.stream().sorted().collect(Collectors.toList());
+/* 171 */       StringBuilder sb = new StringBuilder();
+/* 172 */       sortedNames.forEach(n -> sb.append(String.format("%s=%s", new Object[] { n, ((String[])parameters.get(n))[0] })));
+/*     */       
+/* 174 */       System.out.println(sb);
+/* 175 */       String sign = Sm3Util.generateSM3HASH(sb.toString());
+/* 176 */       return sign;
+/* 177 */     } catch (Exception e) {
+/* 178 */       return "";
+/*     */     } 
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static boolean verifySignMap(String sign, Map<String, Object> parameter) {
+/* 190 */     if (StringUtil.isEmpty(sign) || sign.length() < 5) {
+/* 191 */       return false;
+/*     */     }
+/*     */     
+/* 194 */     sign = sign.substring(0, sign.length() - 5);
+/* 195 */     String paramSign = generateSign(parameter);
+/* 196 */     if (StringUtil.isEmpty(sign) || StringUtil.isEmpty(paramSign)) {
+/* 197 */       return false;
+/*     */     }
+/* 199 */     return sign.equals(paramSign);
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static boolean verifySignArr(String sign, Map<String, String[]> parameter) {
+/* 211 */     if (StringUtil.isEmpty(sign) || sign.length() < 5) {
+/* 212 */       return false;
+/*     */     }
+/* 214 */     String paramSign = generateSignArr(parameter);
+/* 215 */     sign = sign.substring(0, sign.length() - 5);
+/* 216 */     if (StringUtil.isEmpty(sign) || StringUtil.isEmpty(paramSign)) {
+/* 217 */       return false;
+/*     */     }
+/* 219 */     return sign.equals(paramSign);
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static boolean verifySignJson(String sign, String json) {
+/* 230 */     if (StringUtil.isEmpty(sign) || sign.length() < 5) {
+/* 231 */       return false;
+/*     */     }
+/* 233 */     String paramSign = Sm3Util.generateSM3HASH(json);
+/* 234 */     sign = sign.substring(0, sign.length() - 5);
+/* 235 */     if (StringUtil.isEmpty(sign) || StringUtil.isEmpty(paramSign)) {
+/* 236 */       return false;
+/*     */     }
+/* 238 */     return sign.equals(paramSign);
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static boolean verifySign(String sign) {
+/* 249 */     if (StringUtil.isEmpty(sign) || sign.length() < 5) {
+/* 250 */       return false;
+/*     */     }
+/* 252 */     String s1 = sign.substring(0, sign.length() - 5);
+/* 253 */     String s2 = sign.substring(sign.length() - 5, sign.length());
+/* 254 */     String newSign = Sm3Util.generateSM3HASH(s1);
+/* 255 */     String subSign = newSign.substring(0, 5);
+/* 256 */     return subSign.equals(s2);
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static boolean verifyTime(long timestamp) {
+/* 265 */     long now = System.currentTimeMillis();
+/* 266 */     return (now - 600000L < timestamp);
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static JSONObject decrypt(JSONObject jsonObject, String privateKey) {
+/* 277 */     List<Object> decryptArr = (List<Object>)jsonObject.getByPath("data.decryptArr", JSONArray.class);
+/*     */     
+/* 279 */     if (decryptArr != null || decryptArr.size() != 0) {
+/* 280 */       decryptArr.stream().distinct().forEach(key -> {
+/*     */             try {
+/*     */               if (null != jsonObject.getByPath(key.toString())) {
+/*     */                 jsonObject.putByPath(key.toString(), Sm2Utils.decrypt(jsonObject.getByPath(String.valueOf(key)).toString(), privateKey));
+/*     */               }
+/* 285 */             } catch (InvalidCipherTextException e) {
+/*     */               e.printStackTrace();
+/*     */             } 
+/*     */           });
+/*     */     }
+/*     */     
+/* 291 */     return jsonObject;
+/*     */   }
+/*     */ }
+
+
+/* Location:              C:\Users\ningj\Desktop\java-sdk-1.0.0-SNAPSHOT\!\cn\com\esgcc\ai\matrix\sd\\util\ParamsUtils.class
+ * Java compiler version: 8 (52.0)
+ * JD-Core Version:       1.1.3
+ */

+ 16 - 0
ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/util/encrypt/StringUtil.java

@@ -0,0 +1,16 @@
+/*   */ package cn.com.esgcc.ai.matrix.sdk.util.encrypt;
+/*   */ 
+/*   */ public class StringUtil {
+/*   */   public static boolean isEmpty(String sign) {
+/* 5 */     if (null == sign || "".equals(sign.trim())) {
+/* 6 */       return true;
+/*   */     }
+/* 8 */     return false;
+/*   */   }
+/*   */ }
+
+
+/* Location:              C:\Users\ningj\Desktop\java-sdk-1.0.0-SNAPSHOT\!\cn\com\esgcc\ai\matrix\sd\\util\encrypt\StringUtil.class
+ * Java compiler version: 8 (52.0)
+ * JD-Core Version:       1.1.3
+ */

+ 623 - 0
ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/util/encrypt/Util.java

@@ -0,0 +1,623 @@
+/*     */ package cn.com.esgcc.ai.matrix.sdk.util.encrypt;
+/*     */ 
+/*     */ import java.math.BigInteger;
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ public class Util
+/*     */ {
+/*     */   public static byte[] intToBytes(int num) {
+/*  13 */     byte[] bytes = new byte[4];
+/*  14 */     bytes[0] = (byte)(0xFF & num >> 0);
+/*  15 */     bytes[1] = (byte)(0xFF & num >> 8);
+/*  16 */     bytes[2] = (byte)(0xFF & num >> 16);
+/*  17 */     bytes[3] = (byte)(0xFF & num >> 24);
+/*  18 */     return bytes;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static int byteToInt(byte[] bytes) {
+/*  28 */     int num = 0;
+/*     */     
+/*  30 */     int temp = (0xFF & bytes[0]) << 0;
+/*  31 */     num |= temp;
+/*  32 */     temp = (0xFF & bytes[1]) << 8;
+/*  33 */     num |= temp;
+/*  34 */     temp = (0xFF & bytes[2]) << 16;
+/*  35 */     num |= temp;
+/*  36 */     temp = (0xFF & bytes[3]) << 24;
+/*  37 */     num |= temp;
+/*  38 */     return num;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static byte[] longToBytes(long num) {
+/*  48 */     byte[] bytes = new byte[8];
+/*  49 */     for (int i = 0; i < 8; i++) {
+/*  50 */       bytes[i] = (byte)(int)(0xFFL & num >> i * 8);
+/*     */     }
+/*     */     
+/*  53 */     return bytes;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static byte[] byteConvert32Bytes(BigInteger n) {
+/*  63 */     byte[] tmpd = (byte[])null;
+/*  64 */     if (n == null) {
+/*  65 */       return null;
+/*     */     }
+/*     */     
+/*  68 */     if ((n.toByteArray()).length == 33) {
+/*  69 */       tmpd = new byte[32];
+/*  70 */       System.arraycopy(n.toByteArray(), 1, tmpd, 0, 32);
+/*  71 */     } else if ((n.toByteArray()).length == 32) {
+/*  72 */       tmpd = n.toByteArray();
+/*     */     } else {
+/*  74 */       tmpd = new byte[32];
+/*  75 */       for (int i = 0; i < 32 - (n.toByteArray()).length; i++) {
+/*  76 */         tmpd[i] = 0;
+/*     */       }
+/*  78 */       System.arraycopy(n.toByteArray(), 0, tmpd, 32 - (n.toByteArray()).length, (n.toByteArray()).length);
+/*     */     } 
+/*  80 */     return tmpd;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static BigInteger byteConvertInteger(byte[] b) {
+/*  90 */     if (b[0] < 0) {
+/*  91 */       byte[] temp = new byte[b.length + 1];
+/*  92 */       temp[0] = 0;
+/*  93 */       System.arraycopy(b, 0, temp, 1, b.length);
+/*  94 */       return new BigInteger(temp);
+/*     */     } 
+/*  96 */     return new BigInteger(b);
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String getHexString(byte[] bytes) {
+/* 106 */     return getHexString(bytes, true);
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String getHexString(byte[] bytes, boolean upperCase) {
+/* 117 */     String ret = "";
+/* 118 */     for (int i = 0; i < bytes.length; i++) {
+/* 119 */       ret = ret + Integer.toString((bytes[i] & 0xFF) + 256, 16).substring(1);
+/*     */     }
+/* 121 */     return upperCase ? ret.toUpperCase() : ret;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static void printHexString(byte[] bytes) {
+/* 130 */     for (int i = 0; i < bytes.length; i++) {
+/* 131 */       String hex = Integer.toHexString(bytes[i] & 0xFF);
+/* 132 */       if (hex.length() == 1) {
+/* 133 */         hex = '0' + hex;
+/*     */       }
+/* 135 */       System.out.print("0x" + hex.toUpperCase() + ",");
+/*     */     } 
+/* 137 */     System.out.println("");
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static byte[] hexStringToBytes(String hexString) {
+/* 147 */     if (hexString == null || hexString.equals("")) {
+/* 148 */       return null;
+/*     */     }
+/*     */     
+/* 151 */     hexString = hexString.toUpperCase();
+/* 152 */     int length = hexString.length() / 2;
+/* 153 */     char[] hexChars = hexString.toCharArray();
+/* 154 */     byte[] d = new byte[length];
+/* 155 */     for (int i = 0; i < length; i++) {
+/* 156 */       int pos = i * 2;
+/* 157 */       d[i] = (byte)(charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
+/*     */     } 
+/* 159 */     return d;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static byte charToByte(char c) {
+/* 169 */     return (byte)"0123456789ABCDEF".indexOf(c);
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/* 175 */   private static final char[] DIGITS_LOWER = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/* 181 */   private static final char[] DIGITS_UPPER = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static char[] encodeHex(byte[] data) {
+/* 191 */     return encodeHex(data, true);
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static char[] encodeHex(byte[] data, boolean toLowerCase) {
+/* 202 */     return encodeHex(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER);
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   protected static char[] encodeHex(byte[] data, char[] toDigits) {
+/* 213 */     int l = data.length;
+/* 214 */     char[] out = new char[l << 1];
+/*     */     
+/* 216 */     for (int i = 0, j = 0; i < l; i++) {
+/* 217 */       out[j++] = toDigits[(0xF0 & data[i]) >>> 4];
+/* 218 */       out[j++] = toDigits[0xF & data[i]];
+/*     */     } 
+/* 220 */     return out;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String encodeHexString(byte[] data) {
+/* 230 */     return encodeHexString(data, true);
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String encodeHexString(byte[] data, boolean toLowerCase) {
+/* 241 */     return encodeHexString(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER);
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   protected static String encodeHexString(byte[] data, char[] toDigits) {
+/* 252 */     return new String(encodeHex(data, toDigits));
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static byte[] decodeHex(char[] data) {
+/* 263 */     int len = data.length;
+/*     */     
+/* 265 */     if ((len & 0x1) != 0) {
+/* 266 */       throw new RuntimeException("Odd number of characters.");
+/*     */     }
+/*     */     
+/* 269 */     byte[] out = new byte[len >> 1];
+/*     */ 
+/*     */     
+/* 272 */     for (int i = 0, j = 0; j < len; i++) {
+/* 273 */       int f = toDigit(data[j], j) << 4;
+/* 274 */       j++;
+/* 275 */       f |= toDigit(data[j], j);
+/* 276 */       j++;
+/* 277 */       out[i] = (byte)(f & 0xFF);
+/*     */     } 
+/*     */     
+/* 280 */     return out;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   protected static int toDigit(char ch, int index) {
+/* 292 */     int digit = Character.digit(ch, 16);
+/* 293 */     if (digit == -1) {
+/* 294 */       throw new RuntimeException("Illegal hexadecimal character " + ch + " at index " + index);
+/*     */     }
+/*     */     
+/* 297 */     return digit;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String StringToAsciiString(String content) {
+/* 307 */     String result = "";
+/* 308 */     int max = content.length();
+/* 309 */     for (int i = 0; i < max; i++) {
+/* 310 */       char c = content.charAt(i);
+/* 311 */       String b = Integer.toHexString(c);
+/* 312 */       result = result + b;
+/*     */     } 
+/* 314 */     return result;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String hexStringToString(String hexString, int encodeType) {
+/* 325 */     String result = "";
+/* 326 */     int max = hexString.length() / encodeType;
+/* 327 */     for (int i = 0; i < max; i++) {
+/* 328 */       char c = (char)hexStringToAlgorism(hexString
+/* 329 */           .substring(i * encodeType, (i + 1) * encodeType));
+/* 330 */       result = result + c;
+/*     */     } 
+/* 332 */     return result;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static int hexStringToAlgorism(String hex) {
+/* 342 */     hex = hex.toUpperCase();
+/* 343 */     int max = hex.length();
+/* 344 */     int result = 0;
+/* 345 */     for (int i = max; i > 0; i--) {
+/* 346 */       char c = hex.charAt(i - 1);
+/* 347 */       int algorism = 0;
+/* 348 */       if (c >= '0' && c <= '9') {
+/* 349 */         algorism = c - 48;
+/*     */       } else {
+/* 351 */         algorism = c - 55;
+/*     */       } 
+/* 353 */       result = (int)(result + Math.pow(16.0D, (max - i)) * algorism);
+/*     */     } 
+/* 355 */     return result;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String hexStringToBinary(String hex) {
+/* 365 */     hex = hex.toUpperCase();
+/* 366 */     String result = "";
+/* 367 */     int max = hex.length();
+/* 368 */     for (int i = 0; i < max; i++) {
+/* 369 */       char c = hex.charAt(i);
+/* 370 */       switch (c) {
+/*     */         case '0':
+/* 372 */           result = result + "0000";
+/*     */           break;
+/*     */         case '1':
+/* 375 */           result = result + "0001";
+/*     */           break;
+/*     */         case '2':
+/* 378 */           result = result + "0010";
+/*     */           break;
+/*     */         case '3':
+/* 381 */           result = result + "0011";
+/*     */           break;
+/*     */         case '4':
+/* 384 */           result = result + "0100";
+/*     */           break;
+/*     */         case '5':
+/* 387 */           result = result + "0101";
+/*     */           break;
+/*     */         case '6':
+/* 390 */           result = result + "0110";
+/*     */           break;
+/*     */         case '7':
+/* 393 */           result = result + "0111";
+/*     */           break;
+/*     */         case '8':
+/* 396 */           result = result + "1000";
+/*     */           break;
+/*     */         case '9':
+/* 399 */           result = result + "1001";
+/*     */           break;
+/*     */         case 'A':
+/* 402 */           result = result + "1010";
+/*     */           break;
+/*     */         case 'B':
+/* 405 */           result = result + "1011";
+/*     */           break;
+/*     */         case 'C':
+/* 408 */           result = result + "1100";
+/*     */           break;
+/*     */         case 'D':
+/* 411 */           result = result + "1101";
+/*     */           break;
+/*     */         case 'E':
+/* 414 */           result = result + "1110";
+/*     */           break;
+/*     */         case 'F':
+/* 417 */           result = result + "1111";
+/*     */           break;
+/*     */       } 
+/*     */     } 
+/* 421 */     return result;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String AsciiStringToString(String content) {
+/* 431 */     String result = "";
+/* 432 */     int length = content.length() / 2;
+/* 433 */     for (int i = 0; i < length; i++) {
+/* 434 */       String c = content.substring(i * 2, i * 2 + 2);
+/* 435 */       int a = hexStringToAlgorism(c);
+/* 436 */       char b = (char)a;
+/* 437 */       String d = String.valueOf(b);
+/* 438 */       result = result + d;
+/*     */     } 
+/* 440 */     return result;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String algorismToHexString(int algorism, int maxLength) {
+/* 451 */     String result = "";
+/* 452 */     result = Integer.toHexString(algorism);
+/*     */     
+/* 454 */     if (result.length() % 2 == 1) {
+/* 455 */       result = "0" + result;
+/*     */     }
+/* 457 */     return patchHexString(result.toUpperCase(), maxLength);
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String byteToString(byte[] bytearray) {
+/* 467 */     String result = "";
+/*     */ 
+/*     */     
+/* 470 */     int length = bytearray.length;
+/* 471 */     for (int i = 0; i < length; i++) {
+/* 472 */       char temp = (char)bytearray[i];
+/* 473 */       result = result + temp;
+/*     */     } 
+/* 475 */     return result;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static int binaryToAlgorism(String binary) {
+/* 485 */     int max = binary.length();
+/* 486 */     int result = 0;
+/* 487 */     for (int i = max; i > 0; i--) {
+/* 488 */       char c = binary.charAt(i - 1);
+/* 489 */       int algorism = c - 48;
+/* 490 */       result = (int)(result + Math.pow(2.0D, (max - i)) * algorism);
+/*     */     } 
+/* 492 */     return result;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String algorismToHEXString(int algorism) {
+/* 502 */     String result = "";
+/* 503 */     result = Integer.toHexString(algorism);
+/*     */     
+/* 505 */     if (result.length() % 2 == 1) {
+/* 506 */       result = "0" + result;
+/*     */     }
+/*     */     
+/* 509 */     result = result.toUpperCase();
+/*     */     
+/* 511 */     return result;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String patchHexString(String str, int maxLength) {
+/* 522 */     String temp = "";
+/* 523 */     for (int i = 0; i < maxLength - str.length(); i++) {
+/* 524 */       temp = "0" + temp;
+/*     */     }
+/* 526 */     str = (temp + str).substring(0, maxLength);
+/* 527 */     return str;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static int parseToInt(String s, int defaultInt, int radix) {
+/* 539 */     int i = 0;
+/*     */     try {
+/* 541 */       i = Integer.parseInt(s, radix);
+/* 542 */     } catch (NumberFormatException ex) {
+/* 543 */       i = defaultInt;
+/*     */     } 
+/* 545 */     return i;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static int parseToInt(String s, int defaultInt) {
+/* 556 */     int i = 0;
+/*     */     try {
+/* 558 */       i = Integer.parseInt(s);
+/* 559 */     } catch (NumberFormatException ex) {
+/* 560 */       i = defaultInt;
+/*     */     } 
+/* 562 */     return i;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static byte[] hexToByte(String hex) throws IllegalArgumentException {
+/* 572 */     if (hex.length() % 2 != 0) {
+/* 573 */       throw new IllegalArgumentException();
+/*     */     }
+/* 575 */     char[] arr = hex.toCharArray();
+/* 576 */     byte[] b = new byte[hex.length() / 2];
+/* 577 */     for (int i = 0, j = 0, l = hex.length(); i < l; i++, j++) {
+/* 578 */       String swap = "" + arr[i++] + arr[i];
+/* 579 */       int byteint = Integer.parseInt(swap, 16) & 0xFF;
+/* 580 */       b[j] = (new Integer(byteint)).byteValue();
+/*     */     } 
+/* 582 */     return b;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String byteToHex(byte[] b) {
+/* 592 */     if (b == null) {
+/* 593 */       throw new IllegalArgumentException("Argument b ( byte array ) is null! ");
+/*     */     }
+/*     */     
+/* 596 */     String hs = "";
+/* 597 */     String stmp = "";
+/* 598 */     for (int n = 0; n < b.length; n++) {
+/* 599 */       stmp = Integer.toHexString(b[n] & 0xFF);
+/* 600 */       if (stmp.length() == 1) {
+/* 601 */         hs = hs + "0" + stmp;
+/*     */       } else {
+/* 603 */         hs = hs + stmp;
+/*     */       } 
+/*     */     } 
+/* 606 */     return hs.toLowerCase();
+/*     */   }
+/*     */ 
+/*     */   
+/*     */   public static byte[] subByte(byte[] input, int startIndex, int length) {
+/* 611 */     byte[] bt = new byte[length];
+/* 612 */     for (int i = 0; i < length; i++) {
+/* 613 */       bt[i] = input[i + startIndex];
+/*     */     }
+/* 615 */     return bt;
+/*     */   }
+/*     */ }
+
+
+/* Location:              C:\Users\ningj\Desktop\java-sdk-1.0.0-SNAPSHOT\!\cn\com\esgcc\ai\matrix\sd\\util\encrypt\Util.class
+ * Java compiler version: 8 (52.0)
+ * JD-Core Version:       1.1.3
+ */

+ 126 - 0
ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/util/encrypt/base64/Base64Util.java

@@ -0,0 +1,126 @@
+/*     */ package cn.com.esgcc.ai.matrix.sdk.util.encrypt.base64;
+/*     */ 
+/*     */
+
+import cn.hutool.core.codec.Base64;
+import sun.misc.BASE64Decoder;
+import sun.misc.BASE64Encoder;
+
+import java.io.*;
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ public class Base64Util
+/*     */ {
+/*     */   public static String encryptionBase64(String str) {
+/*  20 */     byte[] b = null;
+/*  21 */     String s = null;
+/*     */     try {
+/*  23 */       b = str.getBytes("utf-8");
+/*  24 */     } catch (UnsupportedEncodingException e) {
+/*  25 */       e.printStackTrace();
+/*     */     } 
+/*  27 */     if (b != null) {
+/*  28 */       s = (new BASE64Encoder()).encode(b);
+/*     */     }
+/*  30 */     return s;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String decryptBase64(String s) {
+/*  39 */     byte[] b = null;
+/*  40 */     String result = null;
+/*  41 */     if (s != null) {
+/*  42 */       BASE64Decoder decoder = new BASE64Decoder();
+/*     */       try {
+/*  44 */         s = s.replace(" ", "+");
+/*  45 */         s = s.replace("\n", "");
+/*  46 */         b = decoder.decodeBuffer(s);
+/*  47 */         result = new String(b, "utf-8");
+/*  48 */       } catch (Exception e) {
+/*  49 */         e.printStackTrace();
+/*     */       } 
+/*     */     } 
+/*  52 */     return result;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String file2Base64(File file) {
+/*  61 */     if (file == null) {
+/*  62 */       return null;
+/*     */     }
+/*  64 */     String base64 = null;
+/*  65 */     FileInputStream fin = null;
+/*     */     try {
+/*  67 */       fin = new FileInputStream(file);
+/*  68 */       byte[] buff = new byte[fin.available()];
+/*  69 */       int i = fin.read(buff);
+/*  70 */       base64 = Base64.encode(buff);
+/*  71 */     } catch (FileNotFoundException e) {
+/*  72 */       e.printStackTrace();
+/*  73 */     } catch (IOException e) {
+/*  74 */       e.printStackTrace();
+/*     */     } finally {
+/*  76 */       if (fin != null) {
+/*     */         try {
+/*  78 */           fin.close();
+/*  79 */         } catch (IOException e) {
+/*  80 */           e.printStackTrace();
+/*     */         } 
+/*     */       }
+/*     */     } 
+/*  84 */     return base64;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static File base64ToFile(String base64) {
+/*  93 */     if (base64 == null || "".equals(base64)) {
+/*  94 */       return null;
+/*     */     }
+/*  96 */     byte[] buff = Base64.decode(base64);
+/*  97 */     File file = null;
+/*  98 */     FileOutputStream fout = null;
+/*     */     try {
+/* 100 */       file = File.createTempFile("tmp", null);
+/* 101 */       fout = new FileOutputStream(file);
+/* 102 */       fout.write(buff);
+/* 103 */     } catch (IOException e) {
+/* 104 */       e.printStackTrace();
+/*     */     } finally {
+/* 106 */       if (fout != null) {
+/*     */         try {
+/* 108 */           fout.close();
+/* 109 */         } catch (IOException e) {
+/* 110 */           e.printStackTrace();
+/*     */         } 
+/*     */       }
+/*     */     } 
+/* 114 */     return file;
+/*     */   }
+/*     */   public static void main(String[] args) throws IOException {
+/* 117 */     StringBuffer sb = new StringBuffer();
+/* 118 */     FileUtils.readToBuffer(sb, "C:\\Users\\crli\\Desktop\\a.txt");
+/* 119 */     File file = base64ToFile(sb.toString());
+/* 120 */     System.out.println(file);
+/*     */   }
+/*     */ }
+
+
+/* Location:              C:\Users\ningj\Desktop\java-sdk-1.0.0-SNAPSHOT\!\cn\com\esgcc\ai\matrix\sd\\util\encrypt\base64\Base64Util.class
+ * Java compiler version: 8 (52.0)
+ * JD-Core Version:       1.1.3
+ */

+ 38 - 0
ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/util/encrypt/base64/FileUtils.java

@@ -0,0 +1,38 @@
+/*    */ package cn.com.esgcc.ai.matrix.sdk.util.encrypt.base64;
+/*    */ 
+/*    */
+
+import java.io.*;
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ public class FileUtils
+/*    */ {
+/*    */   public static void readToBuffer(StringBuffer buffer, String filePath) throws IOException {
+/* 22 */     InputStream is = new FileInputStream(filePath);
+/*    */     
+/* 24 */     BufferedReader reader = new BufferedReader(new InputStreamReader(is));
+/* 25 */     String line = reader.readLine();
+/* 26 */     while (line != null) {
+/* 27 */       buffer.append(line);
+/* 28 */       buffer.append("\n");
+/* 29 */       line = reader.readLine();
+/*    */     } 
+/* 31 */     reader.close();
+/* 32 */     is.close();
+/*    */   }
+/*    */ }
+
+
+/* Location:              C:\Users\ningj\Desktop\java-sdk-1.0.0-SNAPSHOT\!\cn\com\esgcc\ai\matrix\sd\\util\encrypt\base64\FileUtils.class
+ * Java compiler version: 8 (52.0)
+ * JD-Core Version:       1.1.3
+ */

+ 41 - 0
ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/util/encrypt/sm2/Sm2KeyVO.java

@@ -0,0 +1,41 @@
+/*    */ package cn.com.esgcc.ai.matrix.sdk.util.encrypt.sm2;
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ public class Sm2KeyVO
+/*    */ {
+/*    */   private String publicKey;
+/*    */   private String privateKey;
+/*    */   
+/*    */   public String getPublicKey() {
+/* 11 */     return this.publicKey;
+/*    */   }
+/*    */   
+/*    */   public void setPublicKey(String publicKey) {
+/* 15 */     this.publicKey = publicKey;
+/*    */   }
+/*    */   
+/*    */   public String getPrivateKey() {
+/* 19 */     return this.privateKey;
+/*    */   }
+/*    */   
+/*    */   public void setPrivateKey(String privateKey) {
+/* 23 */     this.privateKey = privateKey;
+/*    */   }
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */   
+/*    */   public String toString() {
+/* 33 */     return "Sm2KeyVO{publicKey='" + this.publicKey + '\'' + ", privateKey='" + this.privateKey + '\'' + '}';
+/*    */   }
+/*    */ }
+
+
+/* Location:              C:\Users\ningj\Desktop\java-sdk-1.0.0-SNAPSHOT\!\cn\com\esgcc\ai\matrix\sd\\util\encrypt\sm2\Sm2KeyVO.class
+ * Java compiler version: 8 (52.0)
+ * JD-Core Version:       1.1.3
+ */

+ 202 - 0
ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/util/encrypt/sm2/Sm2Utils.java

@@ -0,0 +1,202 @@
+/*     */ package cn.com.esgcc.ai.matrix.sdk.util.encrypt.sm2;
+/*     */ 
+/*     */
+
+import org.bouncycastle.asn1.gm.GMNamedCurves;
+import org.bouncycastle.asn1.x9.X9ECParameters;
+import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
+import org.bouncycastle.crypto.CipherParameters;
+import org.bouncycastle.crypto.InvalidCipherTextException;
+import org.bouncycastle.crypto.KeyGenerationParameters;
+import org.bouncycastle.crypto.engines.SM2Engine;
+import org.bouncycastle.crypto.generators.ECKeyPairGenerator;
+import org.bouncycastle.crypto.params.*;
+import org.bouncycastle.math.ec.ECCurve;
+import org.bouncycastle.math.ec.ECPoint;
+import org.bouncycastle.util.BigIntegers;
+import org.bouncycastle.util.encoders.Hex;
+
+import java.math.BigInteger;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.util.HashMap;
+import java.util.Map;
+
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ public class Sm2Utils
+/*     */ {
+/*  42 */   private static ECDomainParameters domainParameters = null;
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   static {
+/*  49 */     X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1");
+/*  50 */     domainParameters = new ECDomainParameters(sm2ECParameters.getCurve(), sm2ECParameters.getG(), sm2ECParameters.getN());
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static void main(String[] args) throws NoSuchAlgorithmException, InvalidCipherTextException {}
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static Sm2KeyVO genPUPRkey() throws NoSuchAlgorithmException {
+/*  74 */     Sm2KeyVO sm2Key = new Sm2KeyVO();
+/*     */     
+/*  76 */     ECKeyPairGenerator keyPairGenerator = new ECKeyPairGenerator();
+/*  77 */     keyPairGenerator.init((KeyGenerationParameters)new ECKeyGenerationParameters(domainParameters, SecureRandom.getInstance("SHA1PRNG")));
+/*  78 */     AsymmetricCipherKeyPair asymmetricCipherKeyPair = keyPairGenerator.generateKeyPair();
+/*     */ 
+/*     */     
+/*  81 */     BigInteger privatekey = ((ECPrivateKeyParameters)asymmetricCipherKeyPair.getPrivate()).getD();
+/*  82 */     String privateKeyHex = privatekey.toString(16);
+/*  83 */     sm2Key.setPrivateKey(privateKeyHex);
+/*     */ 
+/*     */     
+/*  86 */     ECPoint ecPoint = ((ECPublicKeyParameters)asymmetricCipherKeyPair.getPublic()).getQ();
+/*  87 */     String publicKeyHex = Hex.toHexString(ecPoint.getEncoded(false));
+/*  88 */     sm2Key.setPublicKey(publicKeyHex);
+/*  89 */     return sm2Key;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String decrypt(String ciphertext, String privatekey) throws InvalidCipherTextException {
+/* 103 */     String cipherData = ciphertext;
+/* 104 */     byte[] cipherDataByte = Hex.decode(cipherData);
+/*     */     
+/* 106 */     BigInteger privateKeyD = new BigInteger(privatekey, 16);
+/* 107 */     ECPrivateKeyParameters privateKeyParameters = new ECPrivateKeyParameters(privateKeyD, domainParameters);
+/*     */ 
+/*     */     
+/* 110 */     SM2Engine sm2Engine = new SM2Engine();
+/* 111 */     sm2Engine.init(false, (CipherParameters)privateKeyParameters);
+/*     */ 
+/*     */     
+/* 114 */     byte[] arrayOfBytes = sm2Engine.processBlock(cipherDataByte, 0, cipherDataByte.length);
+/*     */ 
+/*     */     
+/* 117 */     String mtext = new String(arrayOfBytes);
+/* 118 */     return mtext;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String encrypt(String text, String publickey) throws InvalidCipherTextException {
+/* 131 */     Map<String, String> pubilcKeys = createPubilcKey(publickey);
+/* 132 */     String cipherData = text;
+/* 133 */     byte[] cipherDataByte = text.getBytes();
+/*     */     
+/* 135 */     SM2Engine sm2Engine = new SM2Engine();
+/* 136 */     CipherParameters pubKeyParameters = getPubKey(pubilcKeys.get("x"), pubilcKeys.get("y"), domainParameters);
+/*     */     
+/* 138 */     sm2Engine.init(true, pubKeyParameters);
+/*     */ 
+/*     */     
+/* 141 */     byte[] arrayOfBytes = sm2Engine.processBlock(cipherDataByte, 0, cipherDataByte.length);
+/*     */ 
+/*     */     
+/* 144 */     String mtext = Hex.toHexString(arrayOfBytes);
+/* 145 */     return mtext;
+/*     */   }
+/*     */   
+/*     */   private static Map<String, String> createPubilcKey(String pubKeyHex) {
+/* 149 */     Map<String, String> keys = new HashMap<>();
+/* 150 */     if (pubKeyHex.length() > 128) {
+/* 151 */       pubKeyHex = pubKeyHex.substring(pubKeyHex.length() - 128);
+/*     */     }
+/*     */     
+/* 154 */     String stringX = pubKeyHex.substring(0, 64);
+/* 155 */     String stringY = pubKeyHex.substring(stringX.length());
+/* 156 */     keys.put("x", stringX);
+/* 157 */     keys.put("y", stringY);
+/* 158 */     return keys;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static CipherParameters getPubKey(String x, String y, ECDomainParameters domain) {
+/* 170 */     ECCurve curve = domain.getCurve();
+/* 171 */     ECPoint point = curve.createPoint(BigIntegers.fromUnsignedByteArray(Hex.decode(x)), BigIntegers.fromUnsignedByteArray(Hex.decode(y)));
+/* 172 */     ECPublicKeyParameters PublicKey = new ECPublicKeyParameters(point, domain);
+/* 173 */     return (CipherParameters)new ParametersWithRandom((CipherParameters)PublicKey);
+/*     */   }
+/*     */ }
+
+
+/* Location:              C:\Users\ningj\Desktop\java-sdk-1.0.0-SNAPSHOT\!\cn\com\esgcc\ai\matrix\sd\\util\encrypt\sm2\Sm2Utils.class
+ * Java compiler version: 8 (52.0)
+ * JD-Core Version:       1.1.3
+ */

+ 288 - 0
ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/util/encrypt/sm3/SM3.java

@@ -0,0 +1,288 @@
+/*     */ package cn.com.esgcc.ai.matrix.sdk.util.encrypt.sm3;
+/*     */ 
+/*     */
+
+import java.io.*;
+import java.math.BigInteger;
+import java.util.Arrays;
+import java.util.Locale;
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ public class SM3
+/*     */ {
+/*  16 */   private static char[] hexDigits = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
+/*     */   
+/*     */   private static final String ivHexStr = "7380166f 4914b2b9 172442d7 da8a0600 a96f30bc 163138aa e38dee4d b0fb0e4e";
+/*  19 */   private static final BigInteger IV = new BigInteger("7380166f 4914b2b9 172442d7 da8a0600 a96f30bc 163138aa e38dee4d b0fb0e4e".replaceAll(" ", ""), 16);
+/*     */   
+/*  21 */   private static final Integer Tj15 = Integer.valueOf("79cc4519", 16);
+/*  22 */   private static final Integer Tj63 = Integer.valueOf("7a879d8a", 16);
+/*  23 */   private static final byte[] FirstPadding = new byte[] { Byte.MIN_VALUE };
+/*  24 */   private static final byte[] ZeroPadding = new byte[] { 0 };
+/*     */   
+/*     */   private static int T(int j) {
+/*  27 */     if (j >= 0 && j <= 15)
+/*  28 */       return Tj15.intValue(); 
+/*  29 */     if (j >= 16 && j <= 63) {
+/*  30 */       return Tj63.intValue();
+/*     */     }
+/*  32 */     throw new RuntimeException("data invalid");
+/*     */   }
+/*     */ 
+/*     */   
+/*     */   private static Integer FF(Integer x, Integer y, Integer z, int j) {
+/*  37 */     if (j >= 0 && j <= 15)
+/*  38 */       return Integer.valueOf(x.intValue() ^ y.intValue() ^ z.intValue()); 
+/*  39 */     if (j >= 16 && j <= 63) {
+/*  40 */       return Integer.valueOf(x.intValue() & y.intValue() | x
+/*  41 */           .intValue() & z.intValue() | y
+/*  42 */           .intValue() & z.intValue());
+/*     */     }
+/*  44 */     throw new RuntimeException("data invalid");
+/*     */   }
+/*     */ 
+/*     */   
+/*     */   private static Integer GG(Integer x, Integer y, Integer z, int j) {
+/*  49 */     if (j >= 0 && j <= 15)
+/*  50 */       return Integer.valueOf(x.intValue() ^ y.intValue() ^ z.intValue()); 
+/*  51 */     if (j >= 16 && j <= 63) {
+/*  52 */       return Integer.valueOf(x.intValue() & y.intValue() | (x
+/*  53 */           .intValue() ^ 0xFFFFFFFF) & z.intValue());
+/*     */     }
+/*  55 */     throw new RuntimeException("data invalid");
+/*     */   }
+/*     */ 
+/*     */   
+/*     */   private static Integer P0(Integer x) {
+/*  60 */     return Integer.valueOf(x.intValue() ^ 
+/*  61 */         Integer.rotateLeft(x.intValue(), 9) ^ 
+/*  62 */         Integer.rotateLeft(x.intValue(), 17));
+/*     */   }
+/*     */   
+/*     */   private static Integer P1(Integer x) {
+/*  66 */     return Integer.valueOf(x.intValue() ^ 
+/*  67 */         Integer.rotateLeft(x.intValue(), 15) ^ 
+/*  68 */         Integer.rotateLeft(x.intValue(), 23));
+/*     */   }
+/*     */   
+/*     */   private static byte[] padding(byte[] source) throws IOException {
+/*  72 */     if (source.length >= 2305843009213693952L) {
+/*  73 */       throw new RuntimeException("src data invalid.");
+/*     */     }
+/*  75 */     long l = (source.length * 8);
+/*  76 */     long k = 448L - (l + 1L) % 512L;
+/*  77 */     if (k < 0L) {
+/*  78 */       k += 512L;
+/*     */     }
+/*  80 */     ByteArrayOutputStream baos = new ByteArrayOutputStream();
+/*  81 */     baos.write(source);
+/*  82 */     baos.write(FirstPadding);
+/*  83 */     long i = k - 7L;
+/*  84 */     while (i > 0L) {
+/*  85 */       baos.write(ZeroPadding);
+/*  86 */       i -= 8L;
+/*     */     } 
+/*  88 */     baos.write(long2bytes(l));
+/*  89 */     return baos.toByteArray();
+/*     */   }
+/*     */   
+/*     */   private static byte[] long2bytes(long l) {
+/*  93 */     byte[] bytes = new byte[8];
+/*  94 */     for (int i = 0; i < 8; i++) {
+/*  95 */       bytes[i] = (byte)(int)(l >>> (7 - i) * 8);
+/*     */     }
+/*  97 */     return bytes;
+/*     */   }
+/*     */   
+/*     */   public static byte[] hash(byte[] source) throws IOException {
+/* 101 */     byte[] m1 = padding(source);
+/* 102 */     int n = m1.length / 64;
+/*     */     
+/* 104 */     byte[] vi = IV.toByteArray();
+/* 105 */     byte[] vi1 = null;
+/* 106 */     for (int i = 0; i < n; i++) {
+/* 107 */       byte[] b = Arrays.copyOfRange(m1, i * 64, (i + 1) * 64);
+/* 108 */       vi1 = CF(vi, b);
+/* 109 */       vi = vi1;
+/*     */     } 
+/* 111 */     return vi1;
+/*     */   }
+/*     */ 
+/*     */   
+/*     */   private static byte[] CF(byte[] vi, byte[] bi) throws IOException {
+/* 116 */     int a = toInteger(vi, 0);
+/* 117 */     int b = toInteger(vi, 1);
+/* 118 */     int c = toInteger(vi, 2);
+/* 119 */     int d = toInteger(vi, 3);
+/* 120 */     int e = toInteger(vi, 4);
+/* 121 */     int f = toInteger(vi, 5);
+/* 122 */     int g = toInteger(vi, 6);
+/* 123 */     int h = toInteger(vi, 7);
+/*     */     
+/* 125 */     int[] w = new int[68];
+/* 126 */     int[] w1 = new int[64];
+/* 127 */     for (int i = 0; i < 16; i++)
+/* 128 */       w[i] = toInteger(bi, i); 
+/*     */     int j;
+/* 130 */     for (j = 16; j < 68; j++) {
+/* 131 */       w[j] = P1(Integer.valueOf(w[j - 16] ^ w[j - 9] ^ Integer.rotateLeft(w[j - 3], 15))).intValue() ^ 
+/* 132 */         Integer.rotateLeft(w[j - 13], 7) ^ w[j - 6];
+/*     */     }
+/* 134 */     for (j = 0; j < 64; j++) {
+/* 135 */       w1[j] = w[j] ^ w[j + 4];
+/*     */     }
+/*     */     
+/* 138 */     for (int k = 0; k < 64; k++) {
+/*     */       
+/* 140 */       int ss1 = Integer.rotateLeft(
+/* 141 */           Integer.rotateLeft(a, 12) + e + 
+/* 142 */           Integer.rotateLeft(T(k), k), 7);
+/* 143 */       int ss2 = ss1 ^ Integer.rotateLeft(a, 12);
+/* 144 */       int tt1 = FF(Integer.valueOf(a), Integer.valueOf(b), Integer.valueOf(c), k).intValue() + d + ss2 + w1[k];
+/* 145 */       int tt2 = GG(Integer.valueOf(e), Integer.valueOf(f), Integer.valueOf(g), k).intValue() + h + ss1 + w[k];
+/* 146 */       d = c;
+/* 147 */       c = Integer.rotateLeft(b, 9);
+/* 148 */       b = a;
+/* 149 */       a = tt1;
+/* 150 */       h = g;
+/* 151 */       g = Integer.rotateLeft(f, 19);
+/* 152 */       f = e;
+/* 153 */       e = P0(Integer.valueOf(tt2)).intValue();
+/*     */     } 
+/* 155 */     byte[] v = toByteArray(a, b, c, d, e, f, g, h);
+/* 156 */     for (int m = 0; m < v.length; m++) {
+/* 157 */       v[m] = (byte)(v[m] ^ vi[m]);
+/*     */     }
+/* 159 */     return v;
+/*     */   }
+/*     */   
+/*     */   private static int toInteger(byte[] source, int index) {
+/* 163 */     StringBuilder valueStr = new StringBuilder("");
+/* 164 */     for (int i = 0; i < 4; i++) {
+/* 165 */       valueStr.append(hexDigits[(byte)((source[index * 4 + i] & 0xF0) >> 4)]);
+/* 166 */       valueStr.append(hexDigits[(byte)(source[index * 4 + i] & 0xF)]);
+/*     */     } 
+/* 168 */     return Long.valueOf(valueStr.toString(), 16).intValue();
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   private static byte[] toByteArray(int a, int b, int c, int d, int e, int f, int g, int h) throws IOException {
+/* 174 */     ByteArrayOutputStream baos = new ByteArrayOutputStream(32);
+/* 175 */     baos.write(toByteArray(a));
+/* 176 */     baos.write(toByteArray(b));
+/* 177 */     baos.write(toByteArray(c));
+/* 178 */     baos.write(toByteArray(d));
+/* 179 */     baos.write(toByteArray(e));
+/* 180 */     baos.write(toByteArray(f));
+/* 181 */     baos.write(toByteArray(g));
+/* 182 */     baos.write(toByteArray(h));
+/* 183 */     return baos.toByteArray();
+/*     */   }
+/*     */   
+/*     */   public static byte[] toByteArray(int i) {
+/* 187 */     byte[] byteArray = new byte[4];
+/* 188 */     byteArray[0] = (byte)(i >>> 24);
+/* 189 */     byteArray[1] = (byte)((i & 0xFFFFFF) >>> 16);
+/* 190 */     byteArray[2] = (byte)((i & 0xFFFF) >>> 8);
+/* 191 */     byteArray[3] = (byte)(i & 0xFF);
+/* 192 */     return byteArray;
+/*     */   }
+/*     */   private static String byteToHexString(byte b) {
+/* 195 */     int n = b;
+/* 196 */     if (n < 0)
+/* 197 */       n = 256 + n; 
+/* 198 */     int d1 = n / 16;
+/* 199 */     int d2 = n % 16;
+/* 200 */     return "" + hexDigits[d1] + hexDigits[d2];
+/*     */   }
+/*     */   
+/*     */   public static String byteArrayToHexString(byte[] b) {
+/* 204 */     StringBuffer resultSb = new StringBuffer();
+/* 205 */     for (int i = 0; i < b.length; i++) {
+/* 206 */       resultSb.append(byteToHexString(b[i]));
+/*     */     }
+/* 208 */     return resultSb.toString();
+/*     */   }
+/*     */   public static byte[] hash(InputStream inputStream) throws IOException {
+/* 211 */     byte[] vi = IV.toByteArray();
+/* 212 */     byte[] vi1 = null;
+/*     */     
+/* 214 */     byte[] bytes = new byte[64];
+/* 215 */     int length = -1;
+/* 216 */     int totalLength = 0;
+/* 217 */     while ((length = inputStream.read(bytes)) != -1) {
+/* 218 */       totalLength += length;
+/* 219 */       if (inputStream.available() == 0) {
+/* 220 */         bytes = padding(Arrays.copyOfRange(bytes, 0, length), Integer.valueOf(totalLength));
+/*     */       }
+/* 222 */       vi1 = CF(vi, bytes);
+/* 223 */       vi = vi1;
+/*     */     } 
+/* 225 */     return vi1;
+/*     */   }
+/*     */   private static byte[] padding(byte[] source, Integer length) throws IOException {
+/* 228 */     if (source.length >= 2305843009213693952L) {
+/* 229 */       throw new RuntimeException("src data invalid.");
+/*     */     }
+/* 231 */     long l = (source.length * 8);
+/* 232 */     long k = 448L - (l + 1L) % 512L;
+/* 233 */     if (k < 0L) {
+/* 234 */       k += 512L;
+/*     */     }
+/* 236 */     ByteArrayOutputStream baos = new ByteArrayOutputStream();
+/* 237 */     baos.write(source);
+/* 238 */     baos.write(FirstPadding);
+/* 239 */     long i = k - 7L;
+/* 240 */     while (i > 0L) {
+/* 241 */       baos.write(ZeroPadding);
+/* 242 */       i -= 8L;
+/*     */     } 
+/* 244 */     baos.write(long2bytes((length == null) ? l : (length.intValue() * 8)));
+/* 245 */     return baos.toByteArray();
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String hash(String data) {
+/*     */     try {
+/* 256 */       return byteArrayToHexString(hash(data.getBytes())).toLowerCase(Locale.ENGLISH);
+/* 257 */     } catch (IOException e) {
+/* 258 */       e.printStackTrace();
+/* 259 */       return null;
+/*     */     } 
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String hashInputStream(InputStream inputStream) {
+/*     */     try {
+/* 270 */       return byteArrayToHexString(hash(inputStream)).toLowerCase(Locale.ENGLISH);
+/* 271 */     } catch (IOException e) {
+/* 272 */       e.printStackTrace();
+/* 273 */       return null;
+/*     */     } 
+/*     */   }
+/*     */   public static void main(String[] args) throws IOException {
+/* 277 */     System.out.println(byteArrayToHexString(hash("test sm3 hash".getBytes())));
+/*     */     
+/* 279 */     File file = new File("C:\\Users\\34840\\Desktop\\test.txt");
+/* 280 */     FileInputStream fileInputStream = new FileInputStream(file);
+/*     */     
+/* 282 */     System.out.println(byteArrayToHexString(hash(fileInputStream)));
+/*     */   }
+/*     */ }
+
+
+/* Location:              C:\Users\ningj\Desktop\java-sdk-1.0.0-SNAPSHOT\!\cn\com\esgcc\ai\matrix\sd\\util\encrypt\sm3\SM3.class
+ * Java compiler version: 8 (52.0)
+ * JD-Core Version:       1.1.3
+ */

+ 24 - 0
ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/util/encrypt/sm3/Sm3Util.java

@@ -0,0 +1,24 @@
+/*    */ package cn.com.esgcc.ai.matrix.sdk.util.encrypt.sm3;
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ public class Sm3Util
+/*    */ {
+/*    */   public static String generateSM3HASH(String src) {
+/* 16 */     return SM3.hash(src);
+/*    */   }
+/*    */ }
+
+
+/* Location:              C:\Users\ningj\Desktop\java-sdk-1.0.0-SNAPSHOT\!\cn\com\esgcc\ai\matrix\sd\\util\encrypt\sm3\Sm3Util.class
+ * Java compiler version: 8 (52.0)
+ * JD-Core Version:       1.1.3
+ */

+ 364 - 0
ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/util/encrypt/sm4/SM4.java

@@ -0,0 +1,364 @@
+/*     */ package cn.com.esgcc.ai.matrix.sdk.util.encrypt.sm4;
+/*     */ 
+/*     */
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ public class SM4
+/*     */ {
+/*     */   public static final int SM4_ENCRYPT = 1;
+/*     */   public static final int SM4_DECRYPT = 0;
+/*     */   public static final int ZERO_INDEX = 0;
+/*     */   public static final int ONE_INDEX = 1;
+/*     */   public static final int TWO_INDEX = 2;
+/*     */   public static final int THREE_INDEX = 3;
+/*     */   
+/*     */   private int GET_ULONG_BE(byte[] b, int i) {
+/*  19 */     int n = (b[i] & 0xFF) << 24 | (b[i + 1] & 0xFF) << 16 | (b[i + 2] & 0xFF) << 8 | b[i + 3] & 0xFF & 0xFFFFFFFF;
+/*  20 */     return n;
+/*     */   }
+/*     */ 
+/*     */   
+/*     */   private void PUT_ULONG_BE(int n, byte[] b, int i) {
+/*  25 */     b[i] = (byte)(0xFF & n >> 24);
+/*  26 */     b[i + 1] = (byte)(0xFF & n >> 16);
+/*  27 */     b[i + 2] = (byte)(0xFF & n >> 8);
+/*  28 */     b[i + 3] = (byte)(0xFF & n);
+/*     */   }
+/*     */ 
+/*     */   
+/*     */   private int SHL(int x, int n) {
+/*  33 */     return (x & 0xFFFFFFFF) << n;
+/*     */   }
+/*     */ 
+/*     */   
+/*     */   private int ROTL(int x, int n) {
+/*  38 */     return SHL(x, n) | x >> 32 - n;
+/*     */   }
+/*     */   
+/*  41 */   public static final byte[] SboxTable = new byte[] { -42, -112, -23, -2, -52, -31, 61, -73, 22, -74, 20, -62, 40, -5, 44, 5, 43, 103, -102, 118, 42, -66, 4, -61, -86, 68, 19, 38, 73, -122, 6, -103, -100, 66, 80, -12, -111, -17, -104, 122, 51, 84, 11, 67, -19, -49, -84, 98, -28, -77, 28, -87, -55, 8, -24, -107, Byte.MIN_VALUE, -33, -108, -6, 117, -113, 63, -90, 71, 7, -89, -4, -13, 115, 23, -70, -125, 89, 60, 25, -26, -123, 79, -88, 104, 107, -127, -78, 113, 100, -38, -117, -8, -21, 15, 75, 112, 86, -99, 53, 30, 36, 14, 94, 99, 88, -47, -94, 37, 34, 124, 59, 1, 33, 120, -121, -44, 0, 70, 87, -97, -45, 39, 82, 76, 54, 2, -25, -96, -60, -56, -98, -22, -65, -118, -46, 64, -57, 56, -75, -93, -9, -14, -50, -7, 97, 21, -95, -32, -82, 93, -92, -101, 52, 26, 85, -83, -109, 50, 48, -11, -116, -79, -29, 29, -10, -30, 46, -126, 102, -54, 96, -64, 41, 35, -85, 13, 83, 78, 111, -43, -37, 55, 69, -34, -3, -114, 47, 3, -1, 106, 114, 109, 108, 91, 81, -115, 27, -81, -110, -69, -35, -68, Byte.MAX_VALUE, 17, -39, 92, 65, 31, 16, 90, -40, 10, -63, 49, -120, -91, -51, 123, -67, 45, 116, -48, 18, -72, -27, -76, -80, -119, 105, -105, 74, 12, -106, 119, 126, 101, -71, -15, 9, -59, 110, -58, -124, 24, -16, 125, -20, 58, -36, 77, 32, 121, -18, 95, 62, -41, -53, 57, 72 };
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*  81 */   public static final int[] FK = new int[] { -1548633402, 1453994832, 1736282519, -1301273892 };
+/*     */   
+/*  83 */   public static final int[] CK = new int[] { 462357, 472066609, 943670861, 1415275113, 1886879365, -1936483679, -1464879427, -993275175, -521670923, -66909679, 404694573, 876298825, 1347903077, 1819507329, -2003855715, -1532251463, -1060647211, -589042959, -117504499, 337322537, 808926789, 1280531041, 1752135293, -2071227751, -1599623499, -1128019247, -656414995, -184876535, 269950501, 741554753, 1213159005, 1684763257 };
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   private byte sm4Sbox(byte inch) {
+/*  94 */     int i = inch & 0xFF;
+/*  95 */     byte retVal = SboxTable[i];
+/*  96 */     return retVal;
+/*     */   }
+/*     */ 
+/*     */   
+/*     */   private int sm4Lt(int ka) {
+/* 101 */     int bb = 0;
+/* 102 */     int c = 0;
+/* 103 */     byte[] a = new byte[4];
+/* 104 */     byte[] b = new byte[4];
+/* 105 */     PUT_ULONG_BE(ka, a, 0);
+/* 106 */     b[0] = sm4Sbox(a[0]);
+/* 107 */     b[1] = sm4Sbox(a[1]);
+/* 108 */     b[2] = sm4Sbox(a[2]);
+/* 109 */     b[3] = sm4Sbox(a[3]);
+/* 110 */     bb = GET_ULONG_BE(b, 0);
+/* 111 */     c = bb ^ ROTL(bb, 2) ^ ROTL(bb, 10) ^ ROTL(bb, 18) ^ ROTL(bb, 24);
+/* 112 */     return c;
+/*     */   }
+/*     */ 
+/*     */   
+/*     */   private int sm4F(int x0, int x1, int x2, int x3, int rk) {
+/* 117 */     return x0 ^ sm4Lt(x1 ^ x2 ^ x3 ^ rk);
+/*     */   }
+/*     */ 
+/*     */   
+/*     */   private int sm4CalciRK(int ka) {
+/* 122 */     int bb = 0;
+/* 123 */     int rk = 0;
+/* 124 */     byte[] a = new byte[4];
+/* 125 */     byte[] b = new byte[4];
+/* 126 */     PUT_ULONG_BE(ka, a, 0);
+/* 127 */     b[0] = sm4Sbox(a[0]);
+/* 128 */     b[1] = sm4Sbox(a[1]);
+/* 129 */     b[2] = sm4Sbox(a[2]);
+/* 130 */     b[3] = sm4Sbox(a[3]);
+/* 131 */     bb = GET_ULONG_BE(b, 0);
+/* 132 */     rk = bb ^ ROTL(bb, 13) ^ ROTL(bb, 23);
+/* 133 */     return rk;
+/*     */   }
+/*     */ 
+/*     */   
+/*     */   private void sm4_setkey(int[] SK, byte[] key) {
+/* 138 */     int[] MK = new int[4];
+/* 139 */     int[] k = new int[36];
+/* 140 */     int i = 0;
+/* 141 */     MK[0] = GET_ULONG_BE(key, 0);
+/* 142 */     MK[1] = GET_ULONG_BE(key, 4);
+/* 143 */     MK[2] = GET_ULONG_BE(key, 8);
+/* 144 */     MK[3] = GET_ULONG_BE(key, 12);
+/* 145 */     k[0] = MK[0] ^ FK[0];
+/* 146 */     k[1] = MK[1] ^ FK[1];
+/* 147 */     k[2] = MK[2] ^ FK[2];
+/* 148 */     k[3] = MK[3] ^ FK[3];
+/* 149 */     for (; i < 32; i++) {
+/*     */       
+/* 151 */       k[i + 4] = k[i] ^ sm4CalciRK(k[i + 1] ^ k[i + 2] ^ k[i + 3] ^ CK[i]);
+/* 152 */       SK[i] = k[i + 4];
+/*     */     } 
+/*     */   }
+/*     */ 
+/*     */   
+/*     */   private void sm4_one_round(int[] sk, byte[] input, byte[] output) {
+/* 158 */     int i = 0;
+/* 159 */     int[] ulbuf = new int[36];
+/* 160 */     ulbuf[0] = GET_ULONG_BE(input, 0);
+/* 161 */     ulbuf[1] = GET_ULONG_BE(input, 4);
+/* 162 */     ulbuf[2] = GET_ULONG_BE(input, 8);
+/* 163 */     ulbuf[3] = GET_ULONG_BE(input, 12);
+/* 164 */     while (i < 32) {
+/*     */       
+/* 166 */       ulbuf[i + 4] = sm4F(ulbuf[i], ulbuf[i + 1], ulbuf[i + 2], ulbuf[i + 3], sk[i]);
+/* 167 */       i++;
+/*     */     } 
+/* 169 */     PUT_ULONG_BE(ulbuf[35], output, 0);
+/* 170 */     PUT_ULONG_BE(ulbuf[34], output, 4);
+/* 171 */     PUT_ULONG_BE(ulbuf[33], output, 8);
+/* 172 */     PUT_ULONG_BE(ulbuf[32], output, 12);
+/*     */   }
+/*     */ 
+/*     */   
+/*     */   private byte[] padding(byte[] input, int mode) {
+/* 177 */     if (input == null)
+/*     */     {
+/* 179 */       return null;
+/*     */     }
+/*     */     
+/* 182 */     byte[] ret = (byte[])null;
+/* 183 */     if (mode == 1) {
+/*     */       
+/* 185 */       int p = 16 - input.length % 16;
+/* 186 */       ret = new byte[input.length + p];
+/* 187 */       System.arraycopy(input, 0, ret, 0, input.length);
+/* 188 */       for (int i = 0; i < p; i++)
+/*     */       {
+/* 190 */         ret[input.length + i] = (byte)p;
+/*     */       }
+/*     */     }
+/*     */     else {
+/*     */       
+/* 195 */       int p = input[input.length - 1];
+/* 196 */       ret = new byte[input.length - p];
+/* 197 */       System.arraycopy(input, 0, ret, 0, input.length - p);
+/*     */     } 
+/* 199 */     return ret;
+/*     */   }
+/*     */ 
+/*     */   
+/*     */   public void sm4_setkey_enc(SM4_Context ctx, byte[] key) throws Exception {
+/* 204 */     if (ctx == null)
+/*     */     {
+/* 206 */       throw new Exception("ctx is null!");
+/*     */     }
+/*     */     
+/* 209 */     if (key == null || key.length != 16)
+/*     */     {
+/* 211 */       throw new Exception("key error!");
+/*     */     }
+/*     */     
+/* 214 */     ctx.mode = 1;
+/* 215 */     sm4_setkey(ctx.sk, key);
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public byte[] sm4_crypt_ecb(SM4_Context ctx, byte[] input) throws Exception {
+/* 221 */     if (input == null)
+/*     */     {
+/* 223 */       throw new Exception("input is null!");
+/*     */     }
+/*     */     
+/* 226 */     if (ctx.isPadding && ctx.mode == 1)
+/*     */     {
+/* 228 */       input = padding(input, 1);
+/*     */     }
+/*     */     
+/* 231 */     int length = input.length;
+/* 232 */     ByteArrayInputStream bins = new ByteArrayInputStream(input);
+/* 233 */     ByteArrayOutputStream bous = new ByteArrayOutputStream();
+/* 234 */     for (; length > 0; length -= 16) {
+/*     */       
+/* 236 */       byte[] in = new byte[16];
+/* 237 */       byte[] out = new byte[16];
+/* 238 */       int i = bins.read(in);
+/* 239 */       sm4_one_round(ctx.sk, in, out);
+/* 240 */       bous.write(out);
+/*     */     } 
+/*     */     
+/* 243 */     byte[] output = bous.toByteArray();
+/* 244 */     if (ctx.isPadding && ctx.mode == 0)
+/*     */     {
+/* 246 */       output = padding(output, 0);
+/*     */     }
+/* 248 */     bins.close();
+/* 249 */     bous.close();
+/* 250 */     return output;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public void sm4_setkey_dec(SM4_Context ctx, byte[] key) throws Exception {
+/* 256 */     if (ctx == null)
+/*     */     {
+/* 258 */       throw new Exception("ctx is null!");
+/*     */     }
+/*     */     
+/* 261 */     if (key == null || key.length != 16)
+/*     */     {
+/* 263 */       throw new Exception("key error!");
+/*     */     }
+/*     */     
+/* 266 */     int i = 0;
+/* 267 */     ctx.mode = 0;
+/* 268 */     sm4_setkey(ctx.sk, key);
+/* 269 */     for (i = 0; i < 16; i++)
+/*     */     {
+/* 271 */       SWAP(ctx.sk, i);
+/*     */     }
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   private void SWAP(int[] sk, int i) {
+/* 279 */     int t = sk[i];
+/* 280 */     sk[i] = sk[31 - i];
+/* 281 */     sk[31 - i] = t;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public byte[] sm4_crypt_cbc(SM4_Context ctx, byte[] iv, byte[] input) throws Exception {
+/* 289 */     if (iv == null || iv.length != 16)
+/*     */     {
+/* 291 */       throw new Exception("iv error!");
+/*     */     }
+/*     */     
+/* 294 */     if (input == null)
+/*     */     {
+/* 296 */       throw new Exception("input is null!");
+/*     */     }
+/*     */     
+/* 299 */     if (ctx.isPadding && ctx.mode == 1)
+/*     */     {
+/* 301 */       input = padding(input, 1);
+/*     */     }
+/*     */     
+/* 304 */     int i = 0;
+/* 305 */     int length = input.length;
+/* 306 */     ByteArrayInputStream bins = new ByteArrayInputStream(input);
+/* 307 */     ByteArrayOutputStream bous = new ByteArrayOutputStream();
+/* 308 */     if (ctx.mode == 1) {
+/*     */       
+/* 310 */       for (; length > 0; length -= 16)
+/*     */       {
+/* 312 */         byte[] in = new byte[16];
+/* 313 */         byte[] out = new byte[16];
+/* 314 */         byte[] out1 = new byte[16];
+/*     */         
+/* 316 */         int i1 = bins.read(in);
+/* 317 */         for (i = 0; i < 16; i++)
+/*     */         {
+/* 319 */           out[i] = (byte)(in[i] ^ iv[i]);
+/*     */         }
+/* 321 */         sm4_one_round(ctx.sk, out, out1);
+/* 322 */         System.arraycopy(out1, 0, iv, 0, 16);
+/* 323 */         bous.write(out1);
+/*     */       }
+/*     */     
+/*     */     } else {
+/*     */       
+/* 328 */       byte[] temp = new byte[16];
+/* 329 */       for (; length > 0; length -= 16) {
+/*     */         
+/* 331 */         byte[] in = new byte[16];
+/* 332 */         byte[] out = new byte[16];
+/* 333 */         byte[] out1 = new byte[16];
+/*     */         
+/* 335 */         int i1 = bins.read(in);
+/* 336 */         System.arraycopy(in, 0, temp, 0, 16);
+/* 337 */         sm4_one_round(ctx.sk, in, out);
+/* 338 */         for (i = 0; i < 16; i++)
+/*     */         {
+/* 340 */           out1[i] = (byte)(out[i] ^ iv[i]);
+/*     */         }
+/* 342 */         System.arraycopy(temp, 0, iv, 0, 16);
+/* 343 */         bous.write(out1);
+/*     */       } 
+/*     */     } 
+/*     */     
+/* 347 */     byte[] output = bous.toByteArray();
+/* 348 */     if (ctx.isPadding && ctx.mode == 0)
+/*     */     {
+/* 350 */       output = padding(output, 0);
+/*     */     }
+/* 352 */     bins.close();
+/* 353 */     bous.close();
+/* 354 */     return output;
+/*     */   }
+/*     */ }
+
+
+/* Location:              C:\Users\ningj\Desktop\java-sdk-1.0.0-SNAPSHOT\!\cn\com\esgcc\ai\matrix\sd\\util\encrypt\sm4\SM4.class
+ * Java compiler version: 8 (52.0)
+ * JD-Core Version:       1.1.3
+ */

+ 187 - 0
ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/util/encrypt/sm4/SM4Utils.java

@@ -0,0 +1,187 @@
+/*     */ package cn.com.esgcc.ai.matrix.sdk.util.encrypt.sm4;
+/*     */ 
+/*     */
+
+import cn.hutool.core.lang.TypeReference;
+import cn.hutool.json.JSONUtil;
+import sun.misc.BASE64Decoder;
+import sun.misc.BASE64Encoder;
+
+import java.io.UnsupportedEncodingException;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ public class SM4Utils
+/*     */ {
+/*  21 */   private String iv = "isjngyfhxbfoldnu";
+/*     */ 
+/*     */   
+/*     */   private boolean hexString = false;
+/*     */ 
+/*     */   
+/*     */   public static String encryptData_ECB(String plainText, String secretKey) {
+/*     */     try {
+/*  29 */       SM4_Context ctx = new SM4_Context();
+/*  30 */       ctx.isPadding = true;
+/*  31 */       ctx.mode = 1;
+/*     */ 
+/*     */       
+/*  34 */       byte[] keyBytes = secretKey.getBytes(StandardCharsets.UTF_8);
+/*  35 */       SM4 sm4 = new SM4();
+/*  36 */       sm4.sm4_setkey_enc(ctx, keyBytes);
+/*  37 */       byte[] encrypted = sm4.sm4_crypt_ecb(ctx, plainText.getBytes(StandardCharsets.UTF_8));
+/*  38 */       String cipherText = (new BASE64Encoder()).encode(encrypted);
+/*  39 */       if (cipherText != null && cipherText.trim().length() > 0) {
+/*  40 */         Pattern p = Pattern.compile("\\s*|\t|\r|\n");
+/*  41 */         Matcher m = p.matcher(cipherText);
+/*  42 */         cipherText = m.replaceAll("");
+/*     */       } 
+/*  44 */       return cipherText;
+/*  45 */     } catch (Exception e) {
+/*  46 */       e.printStackTrace();
+/*  47 */       return null;
+/*     */     } 
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String decryptData_ECB(String cipherText, String secretKey) {
+/*     */     try {
+/*  55 */       SM4_Context ctx = new SM4_Context();
+/*  56 */       ctx.isPadding = true;
+/*  57 */       ctx.mode = 0;
+/*     */ 
+/*     */       
+/*  60 */       byte[] keyBytes = secretKey.getBytes();
+/*  61 */       SM4 sm4 = new SM4();
+/*  62 */       sm4.sm4_setkey_dec(ctx, keyBytes);
+/*  63 */       byte[] decrypted = sm4.sm4_crypt_ecb(ctx, (new BASE64Decoder()).decodeBuffer(cipherText));
+/*  64 */       return new String(decrypted, StandardCharsets.UTF_8.name());
+/*  65 */     } catch (Exception e) {
+/*  66 */       e.printStackTrace();
+/*  67 */       return null;
+/*     */     } 
+/*     */   }
+/*     */   
+/*     */   public String encryptData_CBC(String plainText, String secretKey) {
+/*     */     try {
+/*  73 */       SM4_Context ctx = new SM4_Context();
+/*  74 */       ctx.isPadding = true;
+/*  75 */       ctx.mode = 1;
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */       
+/*  80 */       byte[] keyBytes = secretKey.getBytes(StandardCharsets.UTF_8.name());
+/*  81 */       byte[] ivBytes = this.iv.getBytes(StandardCharsets.UTF_8.name());
+/*     */       
+/*  83 */       SM4 sm4 = new SM4();
+/*  84 */       sm4.sm4_setkey_enc(ctx, keyBytes);
+/*  85 */       byte[] encrypted = sm4.sm4_crypt_cbc(ctx, ivBytes, plainText.getBytes(StandardCharsets.UTF_8.name()));
+/*  86 */       String cipherText = (new BASE64Encoder()).encode(encrypted);
+/*  87 */       if (cipherText != null && cipherText.trim().length() > 0) {
+/*  88 */         Pattern p = Pattern.compile("\\s*|\t|\r|\n");
+/*  89 */         Matcher m = p.matcher(cipherText);
+/*  90 */         cipherText = m.replaceAll("");
+/*     */       } 
+/*  92 */       return cipherText;
+/*  93 */     } catch (Exception e) {
+/*  94 */       e.printStackTrace();
+/*  95 */       return null;
+/*     */     } 
+/*     */   }
+/*     */   public String decryptData_CBC(String cipherText, String secretKey) {
+/*     */     try {
+/*     */       byte[] keyBytes, ivBytes;
+/* 101 */       SM4_Context ctx = new SM4_Context();
+/* 102 */       ctx.isPadding = true;
+/* 103 */       ctx.mode = 0;
+/*     */ 
+/*     */ 
+/*     */       
+/* 107 */       if (this.hexString) {
+/* 108 */         keyBytes = Util.hexStringToBytes(secretKey);
+/* 109 */         ivBytes = Util.hexStringToBytes(this.iv);
+/*     */       } else {
+/* 111 */         keyBytes = secretKey.getBytes(StandardCharsets.UTF_8.name());
+/* 112 */         ivBytes = this.iv.getBytes(StandardCharsets.UTF_8.name());
+/*     */       } 
+/*     */       
+/* 115 */       SM4 sm4 = new SM4();
+/* 116 */       sm4.sm4_setkey_dec(ctx, keyBytes);
+/* 117 */       byte[] decrypted = sm4.sm4_crypt_cbc(ctx, ivBytes, (new BASE64Decoder()).decodeBuffer(cipherText));
+/* 118 */       return new String(decrypted, StandardCharsets.UTF_8.name());
+/* 119 */     } catch (Exception e) {
+/* 120 */       e.printStackTrace();
+/* 121 */       return null;
+/*     */     } 
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public String getIv() {
+/* 130 */     return this.iv;
+/*     */   }
+/*     */   
+/*     */   public void setIv(String iv) {
+/* 134 */     this.iv = iv;
+/*     */   }
+/*     */   
+/*     */   public static String robotEncryption(String appkey, String robotCode, String secretKey) {
+/* 138 */     SM4Utils sm4 = new SM4Utils();
+/* 139 */     sm4.iv = "OISwW9fW7cFhrSNS";
+/* 140 */     Map<String, Object> map = new HashMap<>();
+/* 141 */     map.put("appKey", appkey);
+/* 142 */     map.put("robotCode", robotCode);
+/* 143 */     String jiami = sm4.encryptData_CBC(JSONUtil.toJsonStr(map), secretKey);
+/* 144 */     return jiami;
+/*     */   }
+/*     */   
+/*     */   public static Map<String, String> decryptionRootCode(String robotCode, String secretKey) {
+/* 148 */     SM4Utils sm4 = new SM4Utils();
+/*     */     
+/* 150 */     sm4.iv = "OISwW9fW7cFhrSNS";
+/* 151 */     robotCode = sm4.decryptData_CBC(robotCode, secretKey);
+/* 152 */     if (robotCode == null) {
+/* 153 */       Map<String, String> map1 = new HashMap<>();
+/* 154 */       map1.put("appKey", "0");
+/* 155 */       return map1;
+/*     */     } 
+/* 157 */     TypeReference<Map<String, String>> typeReference = new TypeReference<Map<String, String>>() {  };
+/* 158 */     Map<String, String> map = (Map<String, String>)JSONUtil.toBean(robotCode, typeReference, false);
+/* 159 */     return map;
+/*     */   }
+/*     */ 
+/*     */   
+/*     */   public static String passwordResolve(String password, String secretKey) {
+/* 164 */     SM4Utils sm4 = new SM4Utils();
+/*     */     
+/* 166 */     password = decryptData_ECB(password, secretKey);
+/* 167 */     if (password == null) {
+/* 168 */       return null;
+/*     */     }
+/* 170 */     return password;
+/*     */   }
+/*     */   
+/*     */   public static void main(String[] args) throws UnsupportedEncodingException {
+/* 174 */     String admin = encryptData_ECB("webAPP", "1234567887654321");
+/* 175 */     System.out.println(admin);
+/* 176 */     System.out.println(decryptData_ECB(admin, "1234567887654321"));
+/*     */   }
+/*     */ }
+
+
+/* Location:              C:\Users\ningj\Desktop\java-sdk-1.0.0-SNAPSHOT\!\cn\com\esgcc\ai\matrix\sd\\util\encrypt\sm4\SM4Utils.class
+ * Java compiler version: 8 (52.0)
+ * JD-Core Version:       1.1.3
+ */

+ 22 - 0
ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/util/encrypt/sm4/SM4_Context.java

@@ -0,0 +1,22 @@
+/*    */ package cn.com.esgcc.ai.matrix.sdk.util.encrypt.sm4;
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ 
+/*    */ public class SM4_Context
+/*    */ {
+/* 13 */   public int mode = 1;
+/*    */   public boolean isPadding = true;
+/* 15 */   public int[] sk = new int[32];
+/*    */ }
+
+
+/* Location:              C:\Users\ningj\Desktop\java-sdk-1.0.0-SNAPSHOT\!\cn\com\esgcc\ai\matrix\sd\\util\encrypt\sm4\SM4_Context.class
+ * Java compiler version: 8 (52.0)
+ * JD-Core Version:       1.1.3
+ */

+ 671 - 0
ruoyi-admin/src/main/java/cn/com/esgcc/ai/matrix/sdk/util/encrypt/sm4/Util.java

@@ -0,0 +1,671 @@
+/*     */ package cn.com.esgcc.ai.matrix.sdk.util.encrypt.sm4;
+/*     */ 
+/*     */ import java.math.BigInteger;
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ public class Util
+/*     */ {
+/*     */   public static byte[] intToBytes(int num) {
+/*  15 */     byte[] bytes = new byte[4];
+/*  16 */     bytes[0] = (byte)(0xFF & num >> 0);
+/*  17 */     bytes[1] = (byte)(0xFF & num >> 8);
+/*  18 */     bytes[2] = (byte)(0xFF & num >> 16);
+/*  19 */     bytes[3] = (byte)(0xFF & num >> 24);
+/*  20 */     return bytes;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static int byteToInt(byte[] bytes) {
+/*  31 */     int num = 0;
+/*     */     
+/*  33 */     int temp = (0xFF & bytes[0]) << 0;
+/*  34 */     num |= temp;
+/*  35 */     temp = (0xFF & bytes[1]) << 8;
+/*  36 */     num |= temp;
+/*  37 */     temp = (0xFF & bytes[2]) << 16;
+/*  38 */     num |= temp;
+/*  39 */     temp = (0xFF & bytes[3]) << 24;
+/*  40 */     num |= temp;
+/*  41 */     return num;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static byte[] longToBytes(long num) {
+/*  52 */     byte[] bytes = new byte[8];
+/*  53 */     for (int i = 0; i < 8; i++)
+/*     */     {
+/*  55 */       bytes[i] = (byte)(int)(0xFFL & num >> i * 8);
+/*     */     }
+/*     */     
+/*  58 */     return bytes;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static byte[] byteConvert32Bytes(BigInteger n) {
+/*  69 */     byte[] tmpd = (byte[])null;
+/*     */     
+/*  71 */     if (n == null)
+/*     */     {
+/*  73 */       return null;
+/*     */     }
+/*  75 */     byte[] nByte = n.toByteArray();
+/*  76 */     int len = nByte.length;
+/*  77 */     if (len == 33) {
+/*     */       
+/*  79 */       tmpd = new byte[32];
+/*  80 */       System.arraycopy(nByte, 1, tmpd, 0, 32);
+/*     */     }
+/*  82 */     else if (len == 32) {
+/*     */       
+/*  84 */       tmpd = nByte;
+/*     */     }
+/*     */     else {
+/*     */       
+/*  88 */       tmpd = new byte[32];
+/*  89 */       for (int i = 0; i < 32 - len; i++)
+/*     */       {
+/*  91 */         tmpd[i] = 0;
+/*     */       }
+/*  93 */       System.arraycopy(nByte, 0, tmpd, 32 - len, len);
+/*     */     } 
+/*  95 */     return tmpd;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static BigInteger byteConvertInteger(byte[] b) {
+/* 106 */     if (b[0] < 0) {
+/*     */       
+/* 108 */       byte[] temp = new byte[b.length + 1];
+/* 109 */       temp[0] = 0;
+/* 110 */       System.arraycopy(b, 0, temp, 1, b.length);
+/* 111 */       return new BigInteger(temp);
+/*     */     } 
+/* 113 */     return new BigInteger(b);
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String getHexString(byte[] bytes) {
+/* 124 */     return getHexString(bytes, true);
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String getHexString(byte[] bytes, boolean upperCase) {
+/* 136 */     StringBuilder ret = new StringBuilder();
+/* 137 */     for (int i = 0; i < bytes.length; i++)
+/*     */     {
+/* 139 */       ret.append(Integer.toString((bytes[i] & 0xFF) + 256, 16).substring(1));
+/*     */     }
+/* 141 */     return upperCase ? ret.toString().toUpperCase() : ret.toString();
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static void printHexString(byte[] bytes) {
+/* 151 */     for (int i = 0; i < bytes.length; i++) {
+/*     */       
+/* 153 */       String hex = Integer.toHexString(bytes[i] & 0xFF);
+/* 154 */       if (hex.length() == 1)
+/*     */       {
+/* 156 */         hex = '0' + hex;
+/*     */       }
+/* 158 */       System.out.print("0x" + hex.toUpperCase() + ",");
+/*     */     } 
+/* 160 */     System.out.println("");
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static byte[] hexStringToBytes(String hexString) {
+/* 172 */     if (hexString == null || hexString.equals(""))
+/*     */     {
+/* 174 */       return null;
+/*     */     }
+/*     */     
+/* 177 */     hexString = hexString.toUpperCase();
+/* 178 */     int length = hexString.length() / 2;
+/* 179 */     char[] hexChars = hexString.toCharArray();
+/* 180 */     byte[] d = new byte[length];
+/* 181 */     for (int i = 0; i < length; i++) {
+/*     */       
+/* 183 */       int pos = i * 2;
+/* 184 */       d[i] = (byte)(charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
+/*     */     } 
+/* 186 */     return d;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static byte charToByte(char c) {
+/* 198 */     return (byte)"0123456789ABCDEF".indexOf(c);
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/* 204 */   private static final char[] DIGITS_LOWER = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/* 210 */   private static final char[] DIGITS_UPPER = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static char[] encodeHex(byte[] data) {
+/* 220 */     return encodeHex(data, true);
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static char[] encodeHex(byte[] data, boolean toLowerCase) {
+/* 231 */     return encodeHex(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER);
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   protected static char[] encodeHex(byte[] data, char[] toDigits) {
+/* 242 */     int l = data.length;
+/* 243 */     char[] out = new char[l << 1];
+/*     */     
+/* 245 */     for (int i = 0, j = 0; i < l; i++) {
+/* 246 */       out[j++] = toDigits[(0xF0 & data[i]) >>> 4];
+/* 247 */       out[j++] = toDigits[0xF & data[i]];
+/*     */     } 
+/* 249 */     return out;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String encodeHexString(byte[] data) {
+/* 259 */     return encodeHexString(data, true);
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String encodeHexString(byte[] data, boolean toLowerCase) {
+/* 270 */     return encodeHexString(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER);
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   protected static String encodeHexString(byte[] data, char[] toDigits) {
+/* 281 */     return new String(encodeHex(data, toDigits));
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static byte[] decodeHex(char[] data) {
+/* 292 */     int len = data.length;
+/*     */     
+/* 294 */     if ((len & 0x1) != 0) {
+/* 295 */       throw new RuntimeException("Odd number of characters.");
+/*     */     }
+/*     */     
+/* 298 */     byte[] out = new byte[len >> 1];
+/*     */ 
+/*     */     
+/* 301 */     for (int i = 0, j = 0; j < len; i++) {
+/* 302 */       int f = toDigit(data[j], j) << 4;
+/* 303 */       j++;
+/* 304 */       f |= toDigit(data[j], j);
+/* 305 */       j++;
+/* 306 */       out[i] = (byte)(f & 0xFF);
+/*     */     } 
+/*     */     
+/* 309 */     return out;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   protected static int toDigit(char ch, int index) {
+/* 321 */     int digit = Character.digit(ch, 16);
+/* 322 */     if (digit == -1) {
+/* 323 */       throw new RuntimeException("Illegal hexadecimal character " + ch + " at index " + index);
+/*     */     }
+/*     */     
+/* 326 */     return digit;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String StringToAsciiString(String content) {
+/* 337 */     StringBuilder result = new StringBuilder();
+/* 338 */     int max = content.length();
+/* 339 */     for (int i = 0; i < max; i++) {
+/* 340 */       char c = content.charAt(i);
+/* 341 */       String b = Integer.toHexString(c);
+/* 342 */       result.append(b);
+/*     */     } 
+/* 344 */     return result.toString();
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String hexStringToString(String hexString, int encodeType) {
+/* 357 */     StringBuilder result = new StringBuilder();
+/* 358 */     int max = hexString.length() / encodeType;
+/* 359 */     for (int i = 0; i < max; i++) {
+/* 360 */       char c = (char)hexStringToAlgorism(hexString
+/* 361 */           .substring(i * encodeType, (i + 1) * encodeType));
+/* 362 */       result.append(c);
+/*     */     } 
+/* 364 */     return result.toString();
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static int hexStringToAlgorism(String hex) {
+/* 375 */     hex = hex.toUpperCase();
+/* 376 */     int max = hex.length();
+/* 377 */     int result = 0;
+/* 378 */     for (int i = max; i > 0; i--) {
+/* 379 */       char c = hex.charAt(i - 1);
+/* 380 */       int algorism = 0;
+/* 381 */       if (c >= '0' && c <= '9') {
+/* 382 */         algorism = c - 48;
+/*     */       } else {
+/* 384 */         algorism = c - 55;
+/*     */       } 
+/* 386 */       result = (int)(result + Math.pow(16.0D, (max - i)) * algorism);
+/*     */     } 
+/* 388 */     return result;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String hexStringToBinary(String hex) {
+/* 399 */     hex = hex.toUpperCase();
+/* 400 */     String result = "";
+/* 401 */     int max = hex.length();
+/* 402 */     for (int i = 0; i < max; i++) {
+/* 403 */       char c = hex.charAt(i);
+/* 404 */       switch (c) {
+/*     */         case '0':
+/* 406 */           result = result + "0000";
+/*     */           break;
+/*     */         case '1':
+/* 409 */           result = result + "0001";
+/*     */           break;
+/*     */         case '2':
+/* 412 */           result = result + "0010";
+/*     */           break;
+/*     */         case '3':
+/* 415 */           result = result + "0011";
+/*     */           break;
+/*     */         case '4':
+/* 418 */           result = result + "0100";
+/*     */           break;
+/*     */         case '5':
+/* 421 */           result = result + "0101";
+/*     */           break;
+/*     */         case '6':
+/* 424 */           result = result + "0110";
+/*     */           break;
+/*     */         case '7':
+/* 427 */           result = result + "0111";
+/*     */           break;
+/*     */         case '8':
+/* 430 */           result = result + "1000";
+/*     */           break;
+/*     */         case '9':
+/* 433 */           result = result + "1001";
+/*     */           break;
+/*     */         case 'A':
+/* 436 */           result = result + "1010";
+/*     */           break;
+/*     */         case 'B':
+/* 439 */           result = result + "1011";
+/*     */           break;
+/*     */         case 'C':
+/* 442 */           result = result + "1100";
+/*     */           break;
+/*     */         case 'D':
+/* 445 */           result = result + "1101";
+/*     */           break;
+/*     */         case 'E':
+/* 448 */           result = result + "1110";
+/*     */           break;
+/*     */         case 'F':
+/* 451 */           result = result + "1111";
+/*     */           break;
+/*     */       } 
+/*     */     } 
+/* 455 */     return result;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String AsciiStringToString(String content) {
+/* 466 */     StringBuilder result = new StringBuilder();
+/* 467 */     int length = content.length() / 2;
+/* 468 */     for (int i = 0; i < length; i++) {
+/* 469 */       String c = content.substring(i * 2, i * 2 + 2);
+/* 470 */       int a = hexStringToAlgorism(c);
+/* 471 */       char b = (char)a;
+/* 472 */       String d = String.valueOf(b);
+/* 473 */       result.append(d);
+/*     */     } 
+/* 475 */     return result.toString();
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String algorismToHexString(int algorism, int maxLength) {
+/* 488 */     String result = "";
+/* 489 */     result = Integer.toHexString(algorism);
+/*     */     
+/* 491 */     if (result.length() % 2 == 1) {
+/* 492 */       result = "0" + result;
+/*     */     }
+/* 494 */     return patchHexString(result.toUpperCase(), maxLength);
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String byteToString(byte[] bytearray) {
+/* 505 */     StringBuilder result = new StringBuilder();
+/*     */ 
+/*     */     
+/* 508 */     int length = bytearray.length;
+/* 509 */     for (int i = 0; i < length; i++) {
+/* 510 */       char temp = (char)bytearray[i];
+/* 511 */       result.append(temp);
+/*     */     } 
+/* 513 */     return result.toString();
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static int binaryToAlgorism(String binary) {
+/* 524 */     int max = binary.length();
+/* 525 */     int result = 0;
+/* 526 */     for (int i = max; i > 0; i--) {
+/* 527 */       char c = binary.charAt(i - 1);
+/* 528 */       int algorism = c - 48;
+/* 529 */       result = (int)(result + Math.pow(2.0D, (max - i)) * algorism);
+/*     */     } 
+/* 531 */     return result;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String algorismToHEXString(int algorism) {
+/* 542 */     String result = "";
+/* 543 */     result = Integer.toHexString(algorism);
+/*     */     
+/* 545 */     if (result.length() % 2 == 1) {
+/* 546 */       result = "0" + result;
+/*     */     }
+/*     */     
+/* 549 */     result = result.toUpperCase();
+/*     */     
+/* 551 */     return result;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String patchHexString(String str, int maxLength) {
+/* 564 */     String temp = "";
+/* 565 */     for (int i = 0; i < maxLength - str.length(); i++) {
+/* 566 */       temp = "0" + temp;
+/*     */     }
+/* 568 */     str = (temp + str).substring(0, maxLength);
+/* 569 */     return str;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static int parseToInt(String s, int defaultInt, int radix) {
+/* 584 */     int i = 0;
+/*     */     try {
+/* 586 */       i = Integer.parseInt(s, radix);
+/* 587 */     } catch (NumberFormatException ex) {
+/* 588 */       i = defaultInt;
+/*     */     } 
+/* 590 */     return i;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static int parseToInt(String s, int defaultInt) {
+/* 603 */     int i = 0;
+/*     */     try {
+/* 605 */       i = Integer.parseInt(s);
+/* 606 */     } catch (NumberFormatException ex) {
+/* 607 */       i = defaultInt;
+/*     */     } 
+/* 609 */     return i;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static byte[] hexToByte(String hex) throws IllegalArgumentException {
+/* 619 */     if (hex.length() % 2 != 0) {
+/* 620 */       throw new IllegalArgumentException();
+/*     */     }
+/* 622 */     char[] arr = hex.toCharArray();
+/* 623 */     byte[] b = new byte[hex.length() / 2];
+/* 624 */     for (int i = 0, j = 0, l = hex.length(); i < l; i++, j++) {
+/* 625 */       String swap = "" + arr[i++] + arr[i];
+/* 626 */       int byteint = Integer.parseInt(swap, 16) & 0xFF;
+/* 627 */       b[j] = Integer.valueOf(byteint).byteValue();
+/*     */     } 
+/* 629 */     return b;
+/*     */   }
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */ 
+/*     */   
+/*     */   public static String byteToHex(byte[] b) {
+/* 640 */     if (b == null) {
+/* 641 */       throw new IllegalArgumentException("Argument b ( byte array ) is null! ");
+/*     */     }
+/*     */     
+/* 644 */     StringBuilder hs = new StringBuilder();
+/* 645 */     String stmp = "";
+/* 646 */     for (int n = 0; n < b.length; n++) {
+/* 647 */       stmp = Integer.toHexString(b[n] & 0xFF);
+/* 648 */       if (stmp.length() == 1) {
+/* 649 */         hs.append('0');
+/* 650 */         hs.append(stmp);
+/*     */       } else {
+/* 652 */         hs.append(stmp);
+/*     */       } 
+/*     */     } 
+/* 655 */     return hs.toString().toUpperCase();
+/*     */   }
+/*     */   
+/*     */   public static byte[] subByte(byte[] input, int startIndex, int length) {
+/* 659 */     byte[] bt = new byte[length];
+/* 660 */     for (int i = 0; i < length; i++) {
+/* 661 */       bt[i] = input[i + startIndex];
+/*     */     }
+/* 663 */     return bt;
+/*     */   }
+/*     */ }
+
+
+/* Location:              C:\Users\ningj\Desktop\java-sdk-1.0.0-SNAPSHOT\!\cn\com\esgcc\ai\matrix\sd\\util\encrypt\sm4\Util.class
+ * Java compiler version: 8 (52.0)
+ * JD-Core Version:       1.1.3
+ */

+ 37 - 0
ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java

@@ -0,0 +1,37 @@
+package com.ruoyi;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.web.client.RestTemplate;
+
+/**
+ * 启动程序
+ *
+ * @author ruoyi
+ */
+@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class ,})
+public class RuoYiApplication
+{
+    public static void main(String[] args)
+    {
+        // System.setProperty("spring.devtools.restart.enabled", "false");
+        SpringApplication.run(RuoYiApplication.class, args);
+        System.out.println("(♥◠‿◠)ノ゙  若依启动成功   ლ(´ڡ`ლ)゙  \n" +
+                " .-------.       ____     __        \n" +
+                " |  _ _   \\      \\   \\   /  /    \n" +
+                " | ( ' )  |       \\  _. /  '       \n" +
+                " |(_ o _) /        _( )_ .'         \n" +
+                " | (_,_).' __  ___(_ o _)'          \n" +
+                " |  |\\ \\  |  ||   |(_,_)'         \n" +
+                " |  | \\ `'   /|   `-'  /           \n" +
+                " |  |  \\    /  \\      /           \n" +
+                " ''-'   `'-'    `-..-'              ");
+    }
+
+    @Bean
+    public RestTemplate restTemplate() {
+        return new RestTemplate();
+    }
+}

+ 18 - 0
ruoyi-admin/src/main/java/com/ruoyi/RuoYiServletInitializer.java

@@ -0,0 +1,18 @@
+package com.ruoyi;
+
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+
+/**
+ * web容器中进行部署
+ * 
+ * @author ruoyi
+ */
+public class RuoYiServletInitializer extends SpringBootServletInitializer
+{
+    @Override
+    protected SpringApplicationBuilder configure(SpringApplicationBuilder application)
+    {
+        return application.sources(RuoYiApplication.class);
+    }
+}

+ 81 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/common/constants/StampWarningCheckRule.java

@@ -0,0 +1,81 @@
+package com.ruoyi.hywz.common.constants;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author: jxh
+ * @description:
+ * @create: 2024/7/19
+ */
+public class StampWarningCheckRule {
+
+    public static final String rule1 = "“合同信息表”“合同名称”含有(融资)(回购)字段,“印花税税基计算表”税目为“融资租赁合同”的“合同取数”金额为0";
+    public static final String content1 = "存在签订了融资租赁合同,但未计税的情况!";
+
+    public static final String rule2 = "“合同信息表”“合同类型”为(租赁服务)的合同,已计税标识为“N”";
+    public static final String content2 = "存在签订了租赁合同,但未计税的情况!";
+
+    public static final String rule3 = "“合同信息表”“合同类型”为(仓储运输)的合同,已计税标识为“N”";
+    public static final String content3 = "存在签订了仓储运输赁合同,但未计税的情况!";
+
+    public static final String rule4 = "“合同信息表”“合同类型”为(物资买卖类合同),已计税标识为“N”";
+    public static final String content4 = "存在签订了物资买卖合同,但未计税的情况!";
+
+    public static final String rule5 = "“合同信息表”“合同类型”为(物资买卖类合同)字段且金额为0,“印花税税基计算表”“增值税发票取数”为0";
+    public static final String content5 = "存在签订了买卖合同(框架协议或定点采购协议),但未计税的情况!";
+
+    public static final String rule6 = "“合同信息表”“税率”为(0.09)已计税标识为“N”";
+    public static final String content6 = "存在签订了工程建设施工合同,但未计税的情况!";
+
+    public static final String rule7 = "“合同信息表”“合同名称”含有(勘察)(设计)字样,已计税标识为“N”";
+    public static final String content7 = "可能存在签订了设计勘察合同,但未计税的情况!";
+
+    public static final String rule8 = "“合同信息表”“合同名称”含有(检测)(测试)(检验)(修理)(维修)字样,已计税标识为“N”";
+    public static final String content8 = "存在签订了承揽合同,但未计税的情况!";
+
+    public static final String rule9 = "“合同信息表”“合同类型”为(技术服务类合同_研发)、(技术服务类合同_实施服务)、(技术服务类合同_其他),已计税标识为“N”";
+    public static final String content9 = "存在签订了技术合同,但未计税的情况!";
+
+    public static final String rule10 = "“发票信息表”“货物或应税劳务名称”为(发电)或(购电)字段的发票金额不为0,“印花税税基计算表”“买卖合同(购电)”“增值税发票取数”为0";
+    public static final String content10 = "存在发生了购电业务,但未计税的情况!";
+
+    public static final String rule11 = "“发票信息表”“备注”含有(电商采购)字段的发票金额合计不为0,“印花税税基计算表”“买卖合同(电商)”“增值税发票取数”为0";
+    public static final String content11 = "存在发生了电商业务,但未计税的情况!";
+
+    public static final String rule12 = "“发票信息表”“特定业务类型”为(成品油发票),“印花税税基计算表”“买卖合同(物资)”“增值税发票取数”为0";
+    public static final String content12 = "存在发生了物资采购业务,但未计税的情况!";
+
+    public static final String rule13 = "“发票信息表”“货物或应税劳务名称”含有(设计服务),“增值税发票取数”为0";
+    public static final String content13 = "存在发生了勘察设计业务,但未计税的情况!";
+
+    public static final String rule14 = "“发票信息表”“货物或应税劳务名称”含有(印刷品),“增值税发票取数”为0";
+    public static final String content14 = "存在发生了印刷业务,但未计税的情况!";
+
+    public static final String rule15 = "“合同信息表”“合同类型”为(后勤服务类合同_物业服务)、(公共关系与宣传类合同)、(并网调度类合同)、(咨询委托类合同),已计税标识为Y";
+    public static final String content15 = "存在发生了广告宣传业务,计税的情况!";
+
+    public static final String rule16 = "““发票信息表”“发票票种”含有“专用发票”且“货物或应税劳务名称”含有(米、面、油、护肤品、洗发水、沐浴露、餐椅、餐桌、衣柜、微波炉、洗衣机、冰箱)或“备注”含有(食堂、宿舍),通过“数电票号码”、“发票号码”查询“财务智慧平台”“发票管理”“进项管理”“账票关联”若有显示“凭证编号”若无显示“未记账”";
+    public static final String content16 = "发票号码存在未作进项税额转出的风险!";
+
+    public static final String rule17 = "“发票信息表”“货物或应税劳务名称”含有(劳务报酬),通过“数电票号码”、“发票号码”查询“财务智慧平台”→“发票管理”→“进项管理”→“账票关联”→“企业发票池”→“凭证编号”→“凭证查看”→“科目”含有“应交税费”“个人所得税”,若查询不到数据";
+    public static final String content17 = "发票号码存在未代扣代缴个人所得税的风险";
+
+    public static Map<String,String> fpMapType = null;
+
+    public static Map<String, String> getFpMapType() {
+        Map<String,String> fpMapType = new HashMap<>();
+        fpMapType.put("电商","买卖合同");
+        fpMapType.put("汽油","买卖合同");
+        fpMapType.put("购电","买卖合同");
+        fpMapType.put("勘察设计","建设工程合同");
+        fpMapType.put("广告宣传","承揽合同");
+        fpMapType.put("印刷","承揽合同");
+        fpMapType.put("技术服务","技术合同");
+        return fpMapType;
+    }
+
+    public static void setFpMapType(Map<String, String> fpMapType) {
+        StampWarningCheckRule.fpMapType = fpMapType;
+    }
+}

+ 29 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/common/enums/ApplyTypeEnum.java

@@ -0,0 +1,29 @@
+package com.ruoyi.hywz.common.enums;
+
+/**
+ * @author: jxh
+ * @description:
+ * @create: 2024/4/15
+ */
+public enum ApplyTypeEnum {
+
+    XM(1, "项目类"),
+    FXM(2, "非项目类");
+
+    private final int idx;
+    private final String type;
+
+    ApplyTypeEnum(int idx, String type) {
+        this.idx = idx;
+        this.type = type;
+    }
+
+    public int getIdx() {
+        return idx;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+}

+ 74 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/common/enums/InvoiceNodeEnum.java

@@ -0,0 +1,74 @@
+package com.ruoyi.hywz.common.enums;
+
+import com.ruoyi.hywz.entity.vo.NodeVo;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @author: jxh
+ * @description: 开票申请流程节点
+ * @create: 2023/10/24
+ */
+public enum InvoiceNodeEnum {
+
+    /**开票申请流程节点*/
+    NODE_0(0, 0,0,"开票申请"),
+    NODE_2(2, 1,1,"业务审核"),
+    NODE_4(4, 2,1,"财务审批"),
+    NODE_6(6, 3,1,"财务开票"),
+    NODE_8(8, 4,2,"发票上传"),
+    NODE_10(10, 5,3,"发起报账"),
+    NODE_12(12, 6,3,"财务入账及凭证生成"),
+    END(14, 7,4,"已完成");
+
+    private final int node;
+    private final int index;
+    private final int status;
+    private final String desc;
+
+    InvoiceNodeEnum(int node, int index, int status, String desc) {
+        this.node = node;
+        this.index = index;
+        this.status = status;
+        this.desc = desc;
+    }
+
+    public int getNode() {
+        return node;
+    }
+
+    public int getIndex() {
+        return index;
+    }
+
+    public int getStatus() {
+        return status;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public static String getDesc(int node){
+        return Arrays.stream(InvoiceNodeEnum.values()).filter(o -> o.getNode() == node).findFirst().get().getDesc();
+    }
+
+    public static int getIndex(int node) {
+        return Arrays.stream(InvoiceNodeEnum.values()).filter(o -> o.getNode() == node).findFirst().get().getIndex();
+    }
+
+    public static List<NodeVo> getNodeList() {
+        List<NodeVo> nodeList = new ArrayList<>();
+        nodeList.add(new NodeVo(InvoiceNodeEnum.NODE_0.getDesc()));
+        nodeList.add(new NodeVo(InvoiceNodeEnum.NODE_2.getDesc()));
+        nodeList.add(new NodeVo(InvoiceNodeEnum.NODE_4.getDesc()));
+        nodeList.add(new NodeVo(InvoiceNodeEnum.NODE_6.getDesc()));
+        nodeList.add(new NodeVo(InvoiceNodeEnum.NODE_8.getDesc()));
+        nodeList.add(new NodeVo(InvoiceNodeEnum.NODE_10.getDesc()));
+        nodeList.add(new NodeVo(InvoiceNodeEnum.NODE_12.getDesc()));
+        return nodeList;
+    }
+
+}

+ 36 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/common/enums/MsgTemplateEnum.java

@@ -0,0 +1,36 @@
+package com.ruoyi.hywz.common.enums;
+
+/**
+ * @author: jxh
+ * @description:
+ * @create: 2024/4/15
+ */
+public enum MsgTemplateEnum {
+
+    TMP_1(1, "%s,您有一个开票申请单待审核,请及时审批!【财务资金管控应用】"),
+    TMP_2(2, "%s,您有一个开票申请单被退回,请及时处理!【财务资金管控应用】"),
+    TMP_3(3, "%s,您有一个开票申请单已开票,请及时上传发票!【财务资金管控应用】"),
+    TMP_4(4, "%s,您有一个开票申请单已上传发票,请及时接收确认!【财务资金管控应用】"),
+    TMP_5(5, "%s,您有一个开票申请单已确认报账,请及时入账!【财务资金管控应用】");
+
+    private final int idx;
+    private final String msg;
+
+    MsgTemplateEnum(int idx, String msg) {
+        this.idx = idx;
+        this.msg = msg;
+    }
+
+    public int getIdx() {
+        return idx;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public String getMsg(String username) {
+        return String.format(this.msg, username);
+    }
+
+}

+ 94 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/common/enums/StampBusinessTypeEnum.java

@@ -0,0 +1,94 @@
+package com.ruoyi.hywz.common.enums;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author: jxh
+ * @description:
+ * @create: 2024/8/5
+ */
+public enum StampBusinessTypeEnum {
+
+    TYPE_0("type_0", "未匹配"),
+    TYPE_1("type_1", "电商"),
+    TYPE_2("type_2", "框架"),
+    TYPE_3("type_3", "汽油"),
+    TYPE_4("type_4", "购电"),
+    TYPE_5("type_5", "勘察设计"),
+    TYPE_6("type_6", "广告宣传"),
+    TYPE_7("type_7", "印刷"),
+
+    TYPE_8("type_8", "技术服务");
+
+    private final String code;
+    private final String desc;
+
+    StampBusinessTypeEnum(String code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public static List<Map<String,Object>> getList() {
+        List<Map<String,Object>> result = new ArrayList<>();
+
+        result.add(
+                new HashMap<String, Object>(){{
+                    put("code",StampBusinessTypeEnum.TYPE_0.getCode());
+                    put("desc",StampBusinessTypeEnum.TYPE_0.getDesc());
+                }});
+        result.add(
+                new HashMap<String, Object>(){{
+                    put("code",StampBusinessTypeEnum.TYPE_1.getCode());
+                    put("desc",StampBusinessTypeEnum.TYPE_1.getDesc());
+                }});
+        result.add(
+                new HashMap<String, Object>(){{
+                    put("code",StampBusinessTypeEnum.TYPE_2.getCode());
+                    put("desc",StampBusinessTypeEnum.TYPE_2.getDesc());
+                }});
+        result.add(
+                new HashMap<String, Object>(){{
+                    put("code",StampBusinessTypeEnum.TYPE_3.getCode());
+                    put("desc",StampBusinessTypeEnum.TYPE_3.getDesc());
+                }});
+        result.add(
+                new HashMap<String, Object>(){{
+                    put("code",StampBusinessTypeEnum.TYPE_4.getCode());
+                    put("desc",StampBusinessTypeEnum.TYPE_4.getDesc());
+                }});
+        result.add(
+                new HashMap<String, Object>(){{
+                    put("code",StampBusinessTypeEnum.TYPE_5.getCode());
+                    put("desc",StampBusinessTypeEnum.TYPE_5.getDesc());
+                }});
+        result.add(
+                new HashMap<String, Object>(){{
+                    put("code",StampBusinessTypeEnum.TYPE_6.getCode());
+                    put("desc",StampBusinessTypeEnum.TYPE_6.getDesc());
+                }});
+        result.add(
+                new HashMap<String, Object>(){{
+                    put("code",StampBusinessTypeEnum.TYPE_7.getCode());
+                    put("desc",StampBusinessTypeEnum.TYPE_7.getDesc());
+                }});
+        result.add(
+                new HashMap<String, Object>(){{
+                    put("code",StampBusinessTypeEnum.TYPE_8.getCode());
+                    put("desc",StampBusinessTypeEnum.TYPE_8.getDesc());
+                }});
+
+        return result;
+    }
+
+}

+ 147 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/common/enums/StampWarningTypeEnum.java

@@ -0,0 +1,147 @@
+package com.ruoyi.hywz.common.enums;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author: jxh
+ * @description:
+ * @create: 2024/8/5
+ */
+public enum StampWarningTypeEnum {
+
+    RULE_1("rule_1", "存在签订了融资租赁合同,但未计税的情况!"),
+    RULE_2("rule_2", "存在签订了租赁合同,但未计税的情况!"),
+    RULE_3("rule_3", "存在签订了仓储运输赁合同,但未计税的情况!"),
+    RULE_4("rule_4", "存在签订了物资买卖合同,但未计税的情况!"),
+    RULE_5("rule_5", "存在签订了买卖合同(框架协议或定点采购协议),但未计税的情况!"),
+    RULE_6("rule_6", "存在签订了工程建设施工合同,但未计税的情况!"),
+    RULE_7("rule_7", "可能存在签订了设计勘察合同,但未计税的情况!"),
+    RULE_8("rule_8", "存在签订了承揽合同,但未计税的情况!"),
+    RULE_9("rule_9", "存在签订了技术合同,但未计税的情况!"),
+    RULE_10("rule_10", "存在发生了购电业务,但未计税的情况!"),
+    RULE_11("rule_11", "存在发生了电商业务,但未计税的情况!"),
+    RULE_12("rule_12", "存在发生了物资采购业务,但未计税的情况!"),
+    RULE_13("rule_13", "存在发生了勘察设计业务,但未计税的情况!"),
+    RULE_14("rule_14", "存在发生了印刷业务,但未计税的情况!"),
+    RULE_15("rule_15", "存在发生了广告宣传业务,计税的情况!"),
+    RULE_16("rule_16", "发票号码存在未作进项税额转出的风险!"),
+    RULE_17("rule_17", "发票号码存在未代扣代缴个人所得税的风险"),
+    RULE_18("rule_18", "则需要手工检查是否出现重付计算印花税的情况");
+
+    private final String code;
+    private final String desc;
+
+    StampWarningTypeEnum(String code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public static List<Map<String,Object>> getList1() {
+        List<Map<String,Object>> result = new ArrayList<>();
+
+        result.add(
+                new HashMap<String, Object>(){{
+                    put("value", StampWarningTypeEnum.RULE_1.getCode());
+                    put("label", StampWarningTypeEnum.RULE_1.getDesc());
+                }});
+        result.add(
+                new HashMap<String, Object>(){{
+                    put("value", StampWarningTypeEnum.RULE_2.getCode());
+                    put("label", StampWarningTypeEnum.RULE_2.getDesc());
+                }});
+        result.add(
+                new HashMap<String, Object>(){{
+                    put("value", StampWarningTypeEnum.RULE_3.getCode());
+                    put("label", StampWarningTypeEnum.RULE_3.getDesc());
+                }});
+        result.add(
+                new HashMap<String, Object>(){{
+                    put("value", StampWarningTypeEnum.RULE_4.getCode());
+                    put("label", StampWarningTypeEnum.RULE_4.getDesc());
+                }});
+        result.add(
+                new HashMap<String, Object>(){{
+                    put("value", StampWarningTypeEnum.RULE_5.getCode());
+                    put("label", StampWarningTypeEnum.RULE_5.getDesc());
+                }});
+        result.add(
+                new HashMap<String, Object>(){{
+                    put("value", StampWarningTypeEnum.RULE_6.getCode());
+                    put("label", StampWarningTypeEnum.RULE_6.getDesc());
+                }});
+        result.add(
+                new HashMap<String, Object>(){{
+                    put("value", StampWarningTypeEnum.RULE_7.getCode());
+                    put("label", StampWarningTypeEnum.RULE_7.getDesc());
+                }});
+        result.add(
+                new HashMap<String, Object>(){{
+                    put("value", StampWarningTypeEnum.RULE_8.getCode());
+                    put("label", StampWarningTypeEnum.RULE_8.getDesc());
+                }});
+        result.add(
+                new HashMap<String, Object>(){{
+                    put("value", StampWarningTypeEnum.RULE_9.getCode());
+                    put("label", StampWarningTypeEnum.RULE_9.getDesc());
+                }});
+        result.add(
+                new HashMap<String, Object>(){{
+                    put("value", StampWarningTypeEnum.RULE_10.getCode());
+                    put("label", StampWarningTypeEnum.RULE_10.getDesc());
+                }});
+        result.add(
+                new HashMap<String, Object>(){{
+                    put("value", StampWarningTypeEnum.RULE_11.getCode());
+                    put("label", StampWarningTypeEnum.RULE_11.getDesc());
+                }});
+        result.add(
+                new HashMap<String, Object>(){{
+                    put("value", StampWarningTypeEnum.RULE_12.getCode());
+                    put("label", StampWarningTypeEnum.RULE_12.getDesc());
+                }});
+        result.add(
+                new HashMap<String, Object>(){{
+                    put("value", StampWarningTypeEnum.RULE_13.getCode());
+                    put("label", StampWarningTypeEnum.RULE_13.getDesc());
+                }});
+        result.add(
+                new HashMap<String, Object>(){{
+                    put("value", StampWarningTypeEnum.RULE_14.getCode());
+                    put("label", StampWarningTypeEnum.RULE_14.getDesc());
+                }});
+        result.add(
+                new HashMap<String, Object>(){{
+                    put("value", StampWarningTypeEnum.RULE_15.getCode());
+                    put("label", StampWarningTypeEnum.RULE_15.getDesc());
+                }});
+        return result;
+    }
+
+    public static List<Map<String,Object>> getList2() {
+        List<Map<String,Object>> result = new ArrayList<>();
+
+        result.add(
+                new HashMap<String, Object>(){{
+                    put("value", StampWarningTypeEnum.RULE_16.getCode());
+                    put("label", StampWarningTypeEnum.RULE_16.getDesc());
+                }});
+        result.add(
+                new HashMap<String, Object>(){{
+                    put("value", StampWarningTypeEnum.RULE_17.getCode());
+                    put("label", StampWarningTypeEnum.RULE_17.getDesc());
+                }});
+        return result;
+    }
+
+}

+ 53 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/AdsMatHyxtFileUploadDController.java

@@ -0,0 +1,53 @@
+package com.ruoyi.hywz.controller;
+
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.hywz.utils.BaseFile;
+import com.ruoyi.hywz.utils.OssUploadService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+/**
+ * @author: jxh
+ * @description:
+ * @create: 2024/4/8
+ */
+@RestController
+@RequestMapping("adsMatHyxtFileUploadD")
+@Api(value = "adsMatHyxtFileUploadD", tags = "文件上传")
+public class AdsMatHyxtFileUploadDController {
+
+    @ApiOperation(value = "文件上传(支持多文件、多格式上传)", notes = "文件上传")
+    @PostMapping("/uploadFile")
+    public AjaxResult uploadFile(HttpServletRequest request) {
+        List<MultipartFile> files = ((MultipartHttpServletRequest) request).getFiles("file");
+        List<BaseFile> fileVoList = new ArrayList<>();
+        try {
+            MultipartFile file = files.get(0);
+            String originalFilename = file.getOriginalFilename();
+            String suffer = null;
+            if (originalFilename != null) {
+                suffer = originalFilename.substring(originalFilename.lastIndexOf("."));
+            }
+            Random random = new Random();
+            int randomNumber = random.nextInt(89999) + 10000;
+            String fileName = "cwzjgk"+ System.currentTimeMillis() + randomNumber + suffer;
+            BaseFile baseFile = OssUploadService.ossUpload(file, fileName);
+            fileVoList.add(baseFile);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return AjaxResult.error("上传异常");
+        }
+        return AjaxResult.success(fileVoList);
+    }
+
+}

+ 1142 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/AdsMatHyxtInvoiceDController.java

@@ -0,0 +1,1142 @@
+package com.ruoyi.hywz.controller;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.metadata.fill.FillConfig;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.uuid.UUID;
+import com.ruoyi.hywz.common.enums.ApplyTypeEnum;
+import com.ruoyi.hywz.common.enums.InvoiceNodeEnum;
+import com.ruoyi.hywz.common.enums.MsgTemplateEnum;
+import com.ruoyi.hywz.entity.*;
+import com.ruoyi.hywz.entity.po.*;
+import com.ruoyi.hywz.entity.vo.InvoiceAuditDetailVo;
+import com.ruoyi.hywz.listener.ImportExcelHelper;
+import com.ruoyi.hywz.service.*;
+import com.ruoyi.hywz.utils.IdGen;
+import com.ruoyi.hywz.utils.PDFUtil;
+import com.ruoyi.system.service.ISysUserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.math.BigDecimal;
+import java.net.URLEncoder;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author: jxh
+ * @description:
+ * @create: 2024/4/8
+ */
+@RestController
+@RequestMapping("adsMatHyxtInvoiceD")
+@AllArgsConstructor
+@Api(value = "adsMatHyxtInvoiceD", tags = "开票申请流程管控")
+public class AdsMatHyxtInvoiceDController {
+
+    private final IAdsMatHyxtInvoiceApplyDService adsMatHyxtInvoiceApplyDService;
+    private final IAdsMatHyxtTaskHistoryDService adsMatHyxtTaskHistoryDService;
+    private final IAdsMatHyxtTaskRunDService adsMatHyxtTaskRunDService;
+    private final IAdsMatHyxtInvoiceDService adsMatHyxtInvoiceDService;
+    private final IAdsMatHyxtInvoiceFileDService adsMatHyxtInvoiceFileDService;
+    private final ISysUserService sysUserService;
+    private final IAdsMatHyxtIAppService adsMatHyxtIAppService;
+    private final IAdsMatHyxtTaskSendMsgDService adsMatHyxtTaskSendMsgDService;
+    private final IAdsMatHyxtInvoiceUserApplyPermissionDService adsMatHyxtInvoiceUserApplyPermissionDService;
+    private final IAdsPrjHywzqlcPrjFunInfoDfService adsPrjHywzqlcPrjFunInfoDfService;
+    private final IAdsMatHyxtOcrService adsMatHyxtOcrService;
+
+    @ApiOperation(value = "【申请单】分页查询", notes = "【申请单】分页查询")
+    @PostMapping("/applyPage")
+    public R<Page<AdsMatHyxtInvoiceApplyD>> applyPage(@RequestParam(defaultValue = "10") Long pageSize,
+                                                      @RequestParam(defaultValue = "1") Long pageNo,
+                                                      @RequestBody(required = false) InvoiceApplyQueryPO param) {
+        Page<AdsMatHyxtInvoiceApplyD> page = new Page<>();
+        page.setSize(pageSize);
+        page.setCurrent(pageNo);
+
+        LambdaQueryWrapper<AdsMatHyxtInvoiceApplyD> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(AdsMatHyxtInvoiceApplyD::getIsDeleted, 0);
+        if (null != param) {
+            queryWrapper.like(StringUtils.isNotBlank(param.getAppNo()), AdsMatHyxtInvoiceApplyD::getAppNo, param.getAppNo());
+            queryWrapper.like(StringUtils.isNotBlank(param.getCreateUserOrgNo()), AdsMatHyxtInvoiceApplyD::getCreateUserOrgNo, param.getCreateUserOrgNo());
+            queryWrapper.eq(ObjectUtils.isNotEmpty(param.getCurrentNode()), AdsMatHyxtInvoiceApplyD::getCurrentNode, param.getCurrentNode());
+            if (ObjectUtils.isNotEmpty(param.getStatus())) {
+                if (param.getStatus() == 5) {
+                    queryWrapper.notIn(AdsMatHyxtInvoiceApplyD::getStatus, 4);
+                } else {
+                    queryWrapper.eq(ObjectUtils.isNotEmpty(param.getStatus()), AdsMatHyxtInvoiceApplyD::getStatus, param.getStatus());
+                }
+            }
+        }
+
+        queryWrapper.orderByDesc(AdsMatHyxtInvoiceApplyD::getStatus);
+        queryWrapper.orderByDesc(AdsMatHyxtInvoiceApplyD::getCreateTime);
+        Page<AdsMatHyxtInvoiceApplyD> pageResult = adsMatHyxtInvoiceApplyDService.page(page, queryWrapper);
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        Integer permission = adsMatHyxtInvoiceUserApplyPermissionDService.checkHaveCommitPermission(loginUser.getUserId());
+        for (AdsMatHyxtInvoiceApplyD record : pageResult.getRecords()) {
+            record.setHaveCommitPermission(permission);
+        }
+        return R.ok(pageResult);
+    }
+
+    @ApiOperation(value = "【申请单】保存", notes = "【申请单】保存")
+    @PostMapping("/applySave")
+    public R applySave(@RequestBody InvoiceApplyPO param) {
+        List<AdsMatHyxtInvoiceD> list = param.getList();
+        if (list.isEmpty()) {
+            return R.fail("请填写开票信息!");
+        }
+        int index = 0;
+        for (AdsMatHyxtInvoiceD invoiceD : list) {
+            index++;
+//            if (StringUtils.isEmpty(invoiceD.getApplyDate())) {
+//                R.fail("申请日期不能为空,");
+//            }
+            if (StringUtils.isEmpty(invoiceD.getApplyType())) {
+                return R.fail("第" + index + "行, 必填项【申请单分类】不能为空,");
+            }
+            String applyType = invoiceD.getApplyType();
+            if (!applyType.equals(ApplyTypeEnum.XM.getType()) && !applyType.equals(ApplyTypeEnum.FXM.getType())) {
+                return R.fail("申请单分类只支持填写项目类与非项目类!请检查第" + index + "行数据!");
+            }
+
+            if (StringUtils.isEmpty(invoiceD.getSeller())) {
+                return R.fail("第" + index + "行, 必填项【销售方】不能为空,");
+            }
+            if (StringUtils.isEmpty(invoiceD.getBuyer())) {
+                return R.fail("第" + index + "行, 必填项【购买方】不能为空,");
+            }
+            if (applyType.equals(ApplyTypeEnum.XM.getType())) {
+                if (StringUtils.isEmpty(invoiceD.getProjectNo())) {
+                    return R.fail("【项目类】第" + index + "行, 必填项【主业WBS编码】不能为空,");
+                }
+                if (StringUtils.isEmpty(invoiceD.getProjectName())) {
+                    return R.fail("【项目类】第" + index + "行, 必填项【主业项目名称】不能为空,");
+                }
+//                if (StringUtils.isEmpty(invoiceD.getYnProjectNo())) {
+//                    return R.fail("【项目类】第" + index + "行, 必填项【产业项目编码】不能为空,");
+//                }
+//                if (StringUtils.isEmpty(invoiceD.getYnProjectName())) {
+//                    return R.fail("【项目类】第" + index + "行, 必填项【产业项目名称】不能为空,");
+//                }
+            }
+            if (StringUtils.isEmpty(invoiceD.getContractAmount())) {
+                return R.fail("第" + index + "行, 必填项【合同金额】不能为空,");
+            }
+//            if (StringUtils.isEmpty(invoiceD.getValidBudgetAmount())) {
+//                return R.fail("第" + index + "行, 必填项【可用预算】不能为空,");
+//            }
+            if (StringUtils.isEmpty(invoiceD.getCostType())) {
+                return R.fail("第" + index + "行, 必填项【费用类型】不能为空,");
+            }
+            if (StringUtils.isEmpty(invoiceD.getTaxAmount())) {
+                return R.fail("第" + index + "行, 必填项【本次开票金额(含税)】不能为空,");
+            }
+            if (StringUtils.isEmpty(invoiceD.getTaxRate())) {
+                return R.fail("第" + index + "行, 必填项【税率】不能为空,");
+            }
+            if (StringUtils.isEmpty(invoiceD.getTaker())) {
+                return R.fail("第" + index + "行, 必填项【收票人(业务人员)】不能为空,");
+            }
+            if (StringUtils.isEmpty(invoiceD.getTakerUnit())) {
+                return R.fail("第" + index + "行, 必填项【收票单位(部门)】不能为空,");
+            }
+            if (StringUtils.isEmpty(invoiceD.getTelephone())) {
+                return R.fail("第" + index + "行, 必填项【联系电话】不能为空,");
+            }
+        }
+
+        // 预算稽核
+//        int idx = 0;
+//        for (AdsMatHyxtInvoiceD invoiceD : param.getList()) {
+//            LocalDate now = LocalDate.now();
+//            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+//            invoiceD.setApplyDate(now.format(formatter));
+//            idx++;
+//            // 项目类:可用预算(年度投资预算-累计已入账金额)-本次入账成本(本次开票金额含税/(1+税率))>0
+//            if (invoiceD.getApplyType().equals(ApplyTypeEnum.XM.getType())) {
+//                AdsPrjHywzqlcPrjFunInfoDf infoDf = adsPrjHywzqlcPrjFunInfoDfService.getByWbsNo(invoiceD.getProjectNo());
+//                if (null != infoDf) {
+//                    // 金额换算成元进行校验
+//                    BigDecimal investPlanAmt = new BigDecimal(infoDf.getInvestPlanAmt()).multiply(new BigDecimal(10000));   // 年度投资预算
+//                    BigDecimal engineCost = new BigDecimal(infoDf.getEngineCost()).multiply(new BigDecimal(10000)); // 累计已入账金额
+//                    BigDecimal taxAmount = new BigDecimal(invoiceD.getTaxAmount()); // 本次开票金额含税
+//                    BigDecimal taxRate = new BigDecimal(invoiceD.getTaxRate().replace(" ", "").replace("%", "")); // 税率
+//
+//                    // 入账成本
+//                    BigDecimal cost = taxAmount.divide(BigDecimal.ONE.add(taxRate.divide(new BigDecimal(100))), 2, RoundingMode.HALF_UP);
+//
+//                    BigDecimal subtract = investPlanAmt.subtract(engineCost).subtract(cost);
+//                    if (subtract.compareTo(BigDecimal.ZERO) < 0) {
+//                        return R.fail("第" + idx + "行数据,本次入账成本大于可用预算,不能保存!");
+//                    }
+//                }
+//
+//            }
+//
+//            // 非项目类: 可用预算 - 本次入账成本(本次开票金额含税/(1+税率))>0
+//            if (invoiceD.getApplyType().equals(ApplyTypeEnum.FXM.getType())) {
+//                BigDecimal validBudgetAmount = new BigDecimal(invoiceD.getValidBudgetAmount()); // 可用预算
+//                BigDecimal taxAmount = new BigDecimal(invoiceD.getTaxAmount()); // 本次开票金额含税
+//                BigDecimal taxRate = new BigDecimal(invoiceD.getTaxRate().replace(" ", "").replace("%", "")); // 税率
+//
+//                // 入账成本
+//                BigDecimal cost = taxAmount.divide(BigDecimal.ONE.add(taxRate.divide(new BigDecimal(100))), 2, RoundingMode.HALF_UP);
+//
+//                BigDecimal subtract = validBudgetAmount.subtract(cost);
+//                if (subtract.compareTo(BigDecimal.ZERO) < 0) {
+//                    return R.fail("第" + idx + "行数据,本次入账成本大于可用预算,不能保存!");
+//                }
+//            }
+//        }
+
+        adsMatHyxtInvoiceApplyDService.applySave(param);
+        return R.ok();
+    }
+
+    @ApiOperation(value = "【申请单】更新", notes = "【申请单】更新")
+    @PostMapping("/applyUpdate")
+    @Transactional(rollbackFor = Exception.class)
+    public R applyUpdate(@RequestBody AdsMatHyxtInvoiceApplyD param) {
+        if (StringUtils.isBlank(param.getId())) {
+            return R.fail("参数id不能为空");
+        }
+        AdsMatHyxtInvoiceApplyD applyD = adsMatHyxtInvoiceApplyDService.getById(param.getId());
+        if (null == applyD) {
+            return R.fail("申请单不存在!");
+        }
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        int updateNum = 0;
+        Date date = new Date();
+        LambdaUpdateWrapper<AdsMatHyxtInvoiceApplyD> updateWrapper = Wrappers.lambdaUpdate();
+        updateWrapper.eq(AdsMatHyxtInvoiceApplyD::getId, param.getId());
+        // 是否接收发票
+        if (ObjectUtils.isNotEmpty(param.getIsReceiptInvoice())) {
+            updateWrapper.set(AdsMatHyxtInvoiceApplyD::getIsReceiptInvoice, param.getIsReceiptInvoice());
+            updateNum++;
+            AdsMatHyxtTaskRunD fpjs = new AdsMatHyxtTaskRunD();
+            fpjs.setNodeLabel("接收发票");
+            fpjs.setBusinessId(applyD.getId());
+            fpjs.setOwnerUserId(loginUser.getUserId());
+            fpjs.setOwnerUser(loginUser.getUsername());
+            fpjs.setOwnerUserName(loginUser.getUser().getNickName());
+            fpjs.setOwnerUserPhone(loginUser.getUser().getPhonenumber());
+            fpjs.setCreateTime(new Date());
+            adsMatHyxtTaskHistoryDService.auditOkSave(fpjs);
+        }
+        // 是否接收报账
+        if (ObjectUtils.isNotEmpty(param.getIsReceiptBz())) {
+            updateWrapper.set(AdsMatHyxtInvoiceApplyD::getIsReceiptBz, param.getIsReceiptBz());
+            updateNum++;
+            AdsMatHyxtTaskRunD jsbz = new AdsMatHyxtTaskRunD();
+            jsbz.setNodeLabel("接收报账");
+            jsbz.setBusinessId(applyD.getId());
+            jsbz.setOwnerUserId(loginUser.getUserId());
+            jsbz.setOwnerUser(loginUser.getUsername());
+            jsbz.setOwnerUserName(loginUser.getUser().getNickName());
+            jsbz.setOwnerUserPhone(loginUser.getUser().getPhonenumber());
+            jsbz.setCreateTime(new Date());
+            adsMatHyxtTaskHistoryDService.auditOkSave(jsbz);
+        }
+        if (updateNum > 0) {
+            updateWrapper.set(AdsMatHyxtInvoiceApplyD::getUpdateTime, date);
+            adsMatHyxtInvoiceApplyDService.update(updateWrapper);
+        }
+        return R.ok();
+    }
+
+    @PostMapping("/downloadTemplate")
+    @ApiOperation(value = "【申请单】下载模板")
+    public void downloadTemplate(HttpServletResponse response) {
+        String filePath = "excelTemplate/invoiceImport.xlsx";
+        byte[] buffer = new byte[1024];
+        InputStream fis = Thread.currentThread().getContextClassLoader().getResourceAsStream(filePath);
+        BufferedInputStream bis = null;
+        try {
+            response.setHeader("Content-Disposition", "attachment;filename*=UTF-8''" + URLEncoder.encode(UUID.fastUUID().toString(), "UTF-8"));
+            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
+            response.setCharacterEncoding("UTF-8");
+            bis = new BufferedInputStream(fis);
+            OutputStream os = response.getOutputStream();
+            int i = bis.read(buffer);
+            while (i != -1) {
+                os.write(buffer, 0, i);
+                i = bis.read(buffer);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                bis.close();
+                fis.close();
+            } catch (Exception e1) {
+                e1.printStackTrace();
+            }
+        }
+    }
+
+    @PostMapping("/invoiceImport")
+    @ApiOperation(value = "【申请单】开票导入", notes = "【申请单】开票导入")
+    public R invoiceImport(@RequestParam("file") MultipartFile file) throws IOException {
+        ImportExcelHelper<InvoiceImportPO> helper = new ImportExcelHelper<>();
+        List<InvoiceImportPO> list = helper.getList(file.getInputStream(), InvoiceImportPO.class, 0, 1);
+        if (list.size() == 0) {
+            return R.fail("导入失败,未解析到正确数据!");
+        } else {
+            String rMsg = "";
+            for (int i = 0; i < list.size(); i++) {
+                StringBuffer sbf = new StringBuffer("第" + (1 + i) + "行");
+                Boolean flag = true;
+                InvoiceImportPO importPO = list.get(i);
+                importPO.setNumberPar(1 + i);
+                String applyType = importPO.getApplyType();
+                if (StringUtils.isEmpty(applyType)) {
+                    sbf.append("申请单分类不能为空,");
+                    flag = false;
+                    rMsg = sbf.substring(0, sbf.length() - 1);
+                    break;
+                }
+                if (!applyType.equals(ApplyTypeEnum.XM.getType()) && !applyType.equals(ApplyTypeEnum.FXM.getType())) {
+                    sbf.append("申请单分类只支持填写项目类与非项目类!");
+                    flag = false;
+                }
+//                if (StringUtils.isEmpty(importPO.getApplyDate())) {
+//                    sbf.append("申请日期不能为空,");
+//                    flag = false;
+//                }
+                if (StringUtils.isEmpty(importPO.getSeller())) {
+                    sbf.append("销售方不能为空,");
+                    flag = false;
+                }
+                if (StringUtils.isEmpty(importPO.getBuyer())) {
+                    sbf.append("购买方不能为空,");
+                    flag = false;
+                }
+                if (applyType.equals("项目类")) {
+                    if (StringUtils.isEmpty(importPO.getProjectNo())) {
+                        sbf.append("主业WBS编码不能为空,");
+                        flag = false;
+                    }
+                    if (StringUtils.isEmpty(importPO.getProjectName())) {
+                        sbf.append("主业项目名称不能为空,");
+                        flag = false;
+                    }
+//                    if (StringUtils.isEmpty(importPO.getYnProjectNo())) {
+//                        sbf.append("产业项目编码不能为空,");
+//                        flag = false;
+//                    }
+//                    if (StringUtils.isEmpty(importPO.getYnProjectName())) {
+//                        sbf.append("产业项目名称不能为空,");
+//                        flag = false;
+//                    }
+                }
+                if (StringUtils.isEmpty(importPO.getContractAmount())) {
+                    sbf.append("合同金额不能为空,");
+                    flag = false;
+                }
+//                if (StringUtils.isEmpty(importPO.getValidBudgetAmount())) {
+//                    sbf.append("可用预算不能为空,");
+//                    flag = false;
+//                }
+                if (StringUtils.isEmpty(importPO.getCostType())) {
+                    sbf.append("费用类型不能为空,");
+                    flag = false;
+                }
+                if (StringUtils.isEmpty(importPO.getTaxAmount())) {
+                    sbf.append("本次开票金额(含税)不能为空,");
+                    flag = false;
+                }
+                if (StringUtils.isEmpty(importPO.getTaxRate())) {
+                    sbf.append("税率不能为空,");
+                    flag = false;
+                }
+                if (StringUtils.isEmpty(importPO.getTaker())) {
+                    sbf.append("收票人(业务人员)不能为空,");
+                    flag = false;
+                }
+                if (StringUtils.isEmpty(importPO.getTakerUnit())) {
+                    sbf.append("收票单位(部门)不能为空,");
+                    flag = false;
+                }
+                if (StringUtils.isEmpty(importPO.getTelephone())) {
+                    sbf.append("联系电话不能为空,");
+                    flag = false;
+                }
+                if (!flag) {
+                    rMsg = sbf.substring(0, sbf.length() - 1);
+                    break;
+                }
+            }
+            if (StringUtils.isNotEmpty(rMsg)) {
+                return R.fail(rMsg);
+            }
+        }
+        return R.ok(list);
+    }
+
+    @ApiOperation(value = "【申请单】详情", notes = "【申请单】详情")
+    @PostMapping("/applyDetail")
+    public R applyDetail(@RequestBody InvoiceApplyDetailPO param) {
+        AdsMatHyxtInvoiceApplyD applyD = adsMatHyxtInvoiceApplyDService.getById(param.getId());
+        if (null == applyD) {
+            return R.fail("申请单不存在!请刷新后再试!");
+        }
+        InvoiceAuditDetailVo result = new InvoiceAuditDetailVo();
+        result.setCurrentNodeIndex(InvoiceNodeEnum.getIndex(applyD.getCurrentNode()));
+        result.setCurrentNode(applyD.getCurrentNode());
+        result.setNodeList(InvoiceNodeEnum.getNodeList());
+        result.setAuditLog(adsMatHyxtTaskHistoryDService.getLogList(param.getId()));
+        result.setInvoiceList(adsMatHyxtInvoiceDService.getListByApplyId(param.getId()));
+        return R.ok(result);
+    }
+
+    @ApiOperation(value = "【申请单】提交审核", notes = "【申请单】提交审核")
+    @PostMapping("/commitAudit")
+    public R commitAudit(@RequestBody InvoiceApplyDetailPO param) {
+//        if (StringUtils.isBlank(param.getId())) {
+//            return R.fail("id不能为空");
+//        }
+        if (ObjectUtils.isEmpty(param.getIds()) || param.getIds().isEmpty()) {
+            return R.fail("ids参数不能为空");
+        }
+        if (StringUtils.isBlank(param.getAuditUser1())) {
+            return R.fail("财务审核人员不能为空!");
+        }
+        return adsMatHyxtInvoiceApplyDService.commitAudit(param);
+    }
+
+    @ApiOperation(value = "【申请单】撤回", notes = "【申请单】撤回")
+    @PostMapping("/withdraw")
+    public R withdraw(@RequestBody InvoiceApplyDetailPO param) {
+        if (StringUtils.isBlank(param.getId())) {
+            return R.fail("id不能为空");
+        }
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        AdsMatHyxtInvoiceApplyD applyD = adsMatHyxtInvoiceApplyDService.getById(param.getId());
+        if (null == applyD) {
+            return R.fail("单据不存在,请刷新页面后再试!");
+        }
+        if (!loginUser.getUsername().equals("admin")) {
+            if (!loginUser.getUsername().equals(applyD.getCreateUser())) {
+                return R.fail("申请编号【" + applyD.getAppNo() + "】不是您账号创建的,无权限撤回!");
+            }
+        }
+        adsMatHyxtInvoiceApplyDService.withdraw(param);
+
+        // 关闭定时任务
+        adsMatHyxtTaskSendMsgDService.closeTask(param.getId());
+        return R.ok();
+    }
+
+    @ApiOperation(value = "【申请单】删除", notes = "【申请单】删除")
+    @PostMapping("/deleteApply")
+    @Transactional(rollbackFor = Exception.class)
+    public R deleteApply(@RequestBody InvoiceApplyDetailPO param) {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        if (ObjectUtils.isEmpty(param.getIds()) || param.getIds().isEmpty()) {
+            return R.fail("ids参数不能为空");
+        }
+        LambdaQueryWrapper<AdsMatHyxtInvoiceApplyD> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.in(AdsMatHyxtInvoiceApplyD::getId, param.getIds());
+        List<AdsMatHyxtInvoiceApplyD> list = adsMatHyxtInvoiceApplyDService.list(queryWrapper);
+        if (list.isEmpty()) {
+            return R.fail("没有可删除的数据,请刷新页面后再试!");
+        }
+
+        for (AdsMatHyxtInvoiceApplyD applyD : list) {
+            if (!loginUser.getUsername().equals("admin")) {
+                if (!loginUser.getUsername().equals(applyD.getCreateUser())) {
+                    return R.fail("申请编号【" + applyD.getAppNo() + "】不是您账号创建的,无权限删除!");
+                }
+            }
+        }
+
+        for (AdsMatHyxtInvoiceApplyD applyD : list) {
+            adsMatHyxtInvoiceApplyDService.removeById(applyD.getId());
+            adsMatHyxtInvoiceDService.logicDelete(applyD.getId());
+            // 关闭定时任务
+            adsMatHyxtTaskSendMsgDService.closeTask(applyD.getId());
+        }
+
+        return R.ok();
+    }
+
+    @ApiOperation(value = "【申请单】审核详情", notes = "【申请单】审核详情")
+    @PostMapping("/applyAuditDetail")
+    public R<InvoiceAuditDetailVo> applyAuditDetail(@RequestBody InvoiceApplyDetailPO param) {
+        if (StringUtils.isBlank(param.getId())) {
+            return R.fail("任务id不能为空!");
+        }
+        if (StringUtils.isBlank(param.getId())) {
+            return R.fail("businessId不能为空!");
+        }
+        InvoiceAuditDetailVo result = new InvoiceAuditDetailVo();
+        AdsMatHyxtTaskRunD one = adsMatHyxtTaskRunDService.getOneByBusinessId(param.getBusinessId());
+        if (null == one) {
+            // 判断申请单表是否为空
+            AdsMatHyxtInvoiceApplyD applyD = adsMatHyxtInvoiceApplyDService.getById(param.getBusinessId());
+            if (null != applyD) {
+                result.setCurrentNodeIndex(InvoiceNodeEnum.getIndex(applyD.getCurrentNode()));
+                result.setCurrentNode(applyD.getCurrentNode());
+            } else {
+                result.setCurrentNodeIndex(InvoiceNodeEnum.END.getIndex());
+                result.setCurrentNode(InvoiceNodeEnum.END.getNode());
+            }
+        } else {
+            result.setCurrentNodeIndex(InvoiceNodeEnum.getIndex(one.getCurrentNode()));
+            result.setCurrentNode(one.getCurrentNode());
+            result.setBranchType(one.getBranchType());
+        }
+
+        result.setTaskId(param.getId());
+        result.setBusinessId(param.getBusinessId());
+        result.setNodeList(InvoiceNodeEnum.getNodeList());
+        result.setAuditLog(adsMatHyxtTaskHistoryDService.getLogList(param.getBusinessId()));
+        result.setInvoiceList(adsMatHyxtInvoiceDService.getListByApplyId(param.getBusinessId()));
+        return R.ok(result);
+    }
+
+    @ApiOperation(value = "【申请单】审核", notes = "【申请单】审核")
+    @PostMapping("/audit")
+    @Transactional(rollbackFor = Exception.class)
+    public R audit(@RequestBody InvoiceApplyAuditPO param) {
+        String taskId = param.getTaskId();
+        String businessId = param.getBusinessId();
+        Integer auditState = param.getAuditState();
+        if (StringUtils.isBlank(taskId)) {
+            return R.fail("taskId参数不能为空!");
+        }
+        if (StringUtils.isBlank(businessId)) {
+            return R.fail("businessId参数不能为空");
+        }
+        if (ObjectUtils.isEmpty(auditState)) {
+            return R.fail("auditState参数不能为空");
+        }
+
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        SysUser user = loginUser.getUser();
+        AdsMatHyxtTaskRunD taskRunD = adsMatHyxtTaskRunDService.getById(param.getTaskId());
+        if (null == taskRunD) {
+            return R.fail("当前任务不存在,请刷新页面!");
+        }
+        // 判断是否有权限(当前任务拥有者与当前登录用户是否匹配)
+        if (!user.getUserName().equals(taskRunD.getOwnerUser())) {
+            return R.fail("没有权限操作当前任务,或任务已被审核,请刷新页面!");
+        }
+
+        // 当前节点
+        Integer currentNode = taskRunD.getCurrentNode();
+        SysUser nextUser = null;
+        SysUser nextUser2 = null;
+        if (auditState == 1) {
+            if (currentNode != InvoiceNodeEnum.NODE_12.getNode()) {
+                if (StringUtils.isBlank(param.getNextAuditUser())) {
+                    return R.fail("请选择下一岗审核人!");
+                }
+                nextUser = sysUserService.selectUserByUserName(param.getNextAuditUser());
+                if (ObjectUtils.isEmpty(nextUser)) {
+                    return R.fail("下一岗审核不存在!");
+                }
+                if (currentNode == InvoiceNodeEnum.NODE_10.getNode()) {
+                    nextUser2 = sysUserService.selectUserByUserName(param.getNextAuditUser2());
+                    if (ObjectUtils.isEmpty(nextUser2)) {
+                        return R.fail("销售方财务人员不存在!");
+                    }
+                }
+            }
+        }
+        return this.audit(currentNode, auditState, businessId, taskRunD, param, taskId, user, nextUser, nextUser2);
+    }
+
+    @ApiOperation(value = "【申请单】批量审核", notes = "【申请单】批量审核")
+    @PostMapping("/batchAudit")
+    @Transactional(rollbackFor = Exception.class)
+    public R batchAudit(@RequestBody InvoiceApplyAuditPO param) {
+        List<String> taskIds = param.getTaskIds();
+        if (ObjectUtils.isEmpty(taskIds) || taskIds.isEmpty()) {
+            return R.fail("taskIds参数不能为空!");
+        }
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        SysUser user = loginUser.getUser();
+        for (String taskId : param.getTaskIds()) {
+            AdsMatHyxtTaskRunD taskRunD = adsMatHyxtTaskRunDService.getById(taskId);
+            if (null == taskRunD) {
+                continue;
+            }
+            // 判断是否有权限(当前任务拥有者与当前登录用户是否匹配)
+            if (!user.getUserName().equals(taskRunD.getOwnerUser())) {
+                continue;
+            }
+            // 当前节点
+            Integer currentNode = taskRunD.getCurrentNode();
+            SysUser nextUser = null;
+            SysUser nextUser2 = null;
+            if (currentNode != InvoiceNodeEnum.NODE_12.getNode()) {
+                if (StringUtils.isBlank(param.getNextAuditUser())) {
+                    return R.fail("请选择下一岗审核人!");
+                }
+                nextUser = sysUserService.selectUserByUserName(param.getNextAuditUser());
+                if (ObjectUtils.isEmpty(nextUser)) {
+                    return R.fail("下一岗审核不存在!");
+                }
+                if (currentNode == InvoiceNodeEnum.NODE_10.getNode()) {
+                    nextUser2 = sysUserService.selectUserByUserName(param.getNextAuditUser2());
+                    if (ObjectUtils.isEmpty(nextUser2)) {
+                        return R.fail("销售方财务人员不存在!");
+                    }
+                }
+            }
+
+            R audit = this.audit(currentNode, 1, taskRunD.getBusinessId(), taskRunD, param, taskId, user, nextUser, nextUser2);
+            if (R.ok().getCode() != audit.getCode()) {
+                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                return audit;
+            }
+        }
+
+        return R.ok();
+    }
+
+    private R audit(Integer currentNode, Integer auditState, String businessId, AdsMatHyxtTaskRunD taskRunD, InvoiceApplyAuditPO param,
+                    String taskId, SysUser user, SysUser nextUser, SysUser nextUser2) {
+        // TODO 代码优化
+        // 业务审核
+        if (currentNode == InvoiceNodeEnum.NODE_2.getNode()) {
+            if (auditState != 1) {
+                // 【退回】开票申请
+                adsMatHyxtTaskRunDService.delete(businessId);
+                adsMatHyxtTaskHistoryDService.auditFailSave(taskRunD, param.getAuditMsg());
+                adsMatHyxtInvoiceApplyDService.updateNode(businessId, InvoiceNodeEnum.NODE_0, "", "","");
+                // i国网短信提醒
+                AdsMatHyxtInvoiceApplyD applyD = adsMatHyxtInvoiceApplyDService.getById(businessId);
+                if (null != applyD) {
+                    SysUser sysUser = sysUserService.selectUserByUserName(applyD.getCreateUser());
+                    if (null != sysUser) {
+                        adsMatHyxtIAppService.sendApp(businessId, MsgTemplateEnum.TMP_2.getMsg(taskRunD.getOwnerUserName()), InvoiceNodeEnum.NODE_0.getDesc(), sysUser, true, true);
+                    }
+                }
+            } else {
+                // 【通过】财务审核
+                adsMatHyxtTaskRunDService.updateTask(taskId, InvoiceNodeEnum.NODE_4.getNode(), InvoiceNodeEnum.NODE_4.getDesc(), user, nextUser);
+                adsMatHyxtTaskHistoryDService.auditOkSave(taskRunD);
+                adsMatHyxtInvoiceApplyDService.updateAuditUser(businessId, null, nextUser.getUserName(), null, null, null, null);
+                adsMatHyxtInvoiceApplyDService.updateNode(businessId, InvoiceNodeEnum.NODE_4, nextUser.getUserName(), nextUser.getNickName(), nextUser.getPhonenumber());
+                adsMatHyxtIAppService.sendApp(businessId, MsgTemplateEnum.TMP_1.getMsg(nextUser.getNickName()), InvoiceNodeEnum.NODE_4.getDesc(), nextUser, true, true);
+            }
+        } else if (currentNode == InvoiceNodeEnum.NODE_4.getNode()) {
+            if (auditState != 1) {
+                // 【退回】node2 业务审核
+                // i国网短信提醒
+                adsMatHyxtTaskHistoryDService.auditFailSave(taskRunD, param.getAuditMsg());
+                AdsMatHyxtTaskHistoryD prevNode = adsMatHyxtTaskHistoryDService.getOneNode(businessId, InvoiceNodeEnum.NODE_2.getNode());
+                adsMatHyxtTaskRunDService.auditRollback(prevNode, taskRunD);
+                adsMatHyxtInvoiceApplyDService.updateNode(businessId, InvoiceNodeEnum.NODE_2, prevNode.getOwnerUser(), prevNode.getOwnerUserName(), prevNode.getOwnerUserPhone());
+                SysUser sysUser = sysUserService.selectUserByUserName(prevNode.getOwnerUser());
+                if (null != sysUser) {
+                    adsMatHyxtIAppService.sendApp(businessId, MsgTemplateEnum.TMP_2.getMsg(taskRunD.getOwnerUserName()), InvoiceNodeEnum.NODE_2.getDesc(), sysUser, true, true);
+                }
+            } else {
+                List<AdsMatHyxtInvoiceD> invoiceList = adsMatHyxtInvoiceDService.getListByApplyId(businessId);
+                int index = 0;
+                for (AdsMatHyxtInvoiceD item : invoiceList) {
+                    index++;
+                    // 检查是否填写可用预算
+                    if (StringUtils.isEmpty(item.getValidBudgetAmount())) {
+                        return R.fail("第 "+ index + " 行数据未填写可用预算金额,请填写可用预算金额!");
+                    }
+                    BigDecimal v1 = revert(item.getValidBudgetAmount());// 可用预算金额
+                    BigDecimal v2 = revert(item.getTaxAmount());// 本次开票金额
+                    if (null == v1) {
+                        return R.fail("第 "+ index + " 行数据可用预算金额未填写或填写了错误类型的金额,请重新填写!");
+                    }
+                    if (null == v2) {
+                        return R.fail("第 "+ index + " 行数据本次开票金额未填写或填写了错误类型的金额,请重新填写!");
+                    }
+                    // 预算稽核
+                    if (v2.compareTo(v1) > 0) {
+                        return R.fail("第 "+ index + " 行数据【可用预算金额 大于 本次开票金额】,不允许进行确认!");
+                    }
+                }
+
+
+
+                // 【通过】node6 财务确认
+                adsMatHyxtTaskRunDService.updateTask(taskId, InvoiceNodeEnum.NODE_6.getNode(), InvoiceNodeEnum.NODE_6.getDesc(), user, nextUser);
+                adsMatHyxtTaskHistoryDService.auditOkSave(taskRunD);
+                adsMatHyxtInvoiceApplyDService.updateAuditUser(businessId, null, null, nextUser.getUserName(), null, null, null);
+                adsMatHyxtInvoiceApplyDService.updateNode(businessId, InvoiceNodeEnum.NODE_6, nextUser.getUserName(), nextUser.getNickName(), nextUser.getPhonenumber());
+                adsMatHyxtIAppService.sendApp(businessId, MsgTemplateEnum.TMP_1.getMsg(nextUser.getNickName()), InvoiceNodeEnum.NODE_6.getDesc(), nextUser, true, true);
+            }
+        } else if (currentNode == InvoiceNodeEnum.NODE_6.getNode()) {
+            if (auditState != 1) {
+                // 【退回】node4 财务审核
+                // i国网短信提醒
+                adsMatHyxtTaskHistoryDService.auditFailSave(taskRunD, param.getAuditMsg());
+                AdsMatHyxtTaskHistoryD prevNode = adsMatHyxtTaskHistoryDService.getOneNode(businessId, InvoiceNodeEnum.NODE_4.getNode());
+                adsMatHyxtTaskRunDService.auditRollback(prevNode, taskRunD);
+                adsMatHyxtInvoiceApplyDService.updateNode(businessId, InvoiceNodeEnum.NODE_4, prevNode.getOwnerUser(), prevNode.getOwnerUserName(), prevNode.getOwnerUserPhone());
+                SysUser sysUser = sysUserService.selectUserByUserName(prevNode.getOwnerUser());
+                if (null != sysUser) {
+                    adsMatHyxtIAppService.sendApp(businessId, MsgTemplateEnum.TMP_2.getMsg(taskRunD.getOwnerUserName()), InvoiceNodeEnum.NODE_4.getDesc(), sysUser, true, true);
+                }
+            } else {
+                // 【通过】node8 开票上传
+                adsMatHyxtTaskRunDService.updateTask(taskId, InvoiceNodeEnum.NODE_8.getNode(), InvoiceNodeEnum.NODE_8.getDesc(), user, nextUser);
+                adsMatHyxtTaskHistoryDService.auditOkSave(taskRunD);
+                adsMatHyxtInvoiceApplyDService.updateAuditUser(businessId, null, null, null, nextUser.getUserName(), null, null);
+                adsMatHyxtInvoiceApplyDService.updateNode(businessId, InvoiceNodeEnum.NODE_8, nextUser.getUserName(), nextUser.getNickName(), nextUser.getPhonenumber());
+                adsMatHyxtIAppService.sendApp(businessId, MsgTemplateEnum.TMP_3.getMsg(nextUser.getNickName()), InvoiceNodeEnum.NODE_8.getDesc(), nextUser, true, true);
+            }
+        } else if (currentNode == InvoiceNodeEnum.NODE_8.getNode()) {
+            if (auditState != 1) {
+                // 【退回】node8 财务确认
+                // i国网短信提醒
+                adsMatHyxtTaskHistoryDService.auditFailSave(taskRunD, param.getAuditMsg());
+                AdsMatHyxtTaskHistoryD prevNode = adsMatHyxtTaskHistoryDService.getOneNode(businessId, InvoiceNodeEnum.NODE_6.getNode());
+                adsMatHyxtTaskRunDService.auditRollback(prevNode, taskRunD);
+                adsMatHyxtInvoiceApplyDService.updateNode(businessId, InvoiceNodeEnum.NODE_6, prevNode.getOwnerUser(), prevNode.getOwnerUserName(), prevNode.getOwnerUserPhone());
+                SysUser sysUser = sysUserService.selectUserByUserName(prevNode.getOwnerUser());
+                if (null != sysUser) {
+                    adsMatHyxtIAppService.sendApp(businessId, MsgTemplateEnum.TMP_2.getMsg(taskRunD.getOwnerUserName()), InvoiceNodeEnum.NODE_6.getDesc(), sysUser, false, true);
+                }
+            } else {
+                // 发票都上传后才能确认
+                List<AdsMatHyxtInvoiceD> invoiceList = adsMatHyxtInvoiceDService.getListByApplyId(businessId);
+                int index = 0;
+                for (AdsMatHyxtInvoiceD invoiceD : invoiceList) {
+                    index++;
+                    if (invoiceD.getIsUploadInvoice() == 0) {
+//                        return R.fail("【"+taskRunD.getTaskName()+"】发票还未全部上传,不能进行确认!请检查第 " + index + "行数据!");
+                        return R.fail("【"+taskRunD.getTaskName()+"】发票还未全部上传,不能进行确认!请先上传发票信息!");
+                    }
+                }
+
+                // 【通过】node10 业务部门接收
+                adsMatHyxtTaskRunDService.updateTask(taskId, InvoiceNodeEnum.NODE_10.getNode(), InvoiceNodeEnum.NODE_10.getDesc(), user, nextUser);
+                adsMatHyxtTaskHistoryDService.auditOkSave(taskRunD);
+                adsMatHyxtInvoiceApplyDService.updateAuditUser(businessId, null, null, null, null, nextUser.getUserName(), null);
+                adsMatHyxtInvoiceApplyDService.updateNode(businessId, InvoiceNodeEnum.NODE_10, nextUser.getUserName(), nextUser.getNickName(), nextUser.getPhonenumber());
+                adsMatHyxtIAppService.sendApp(businessId, MsgTemplateEnum.TMP_4.getMsg(nextUser.getNickName()), InvoiceNodeEnum.NODE_10.getDesc(), nextUser, true, true);
+            }
+        } else if (currentNode == InvoiceNodeEnum.NODE_10.getNode()) {
+//            if (auditState == -1) {
+//                // 开票申请
+//                adsMatHyxtTaskRunDService.delete(businessId);
+//                adsMatHyxtTaskHistoryDService.auditFailSave(taskRunD, param.getAuditMsg());
+//                adsMatHyxtInvoiceApplyDService.updateNode(businessId, InvoiceNodeEnum.NODE_0,"","");
+//            } else if (auditState == 0) {
+            if (auditState == 0) {
+                // 开票上传
+                // i国网短信提醒
+                adsMatHyxtTaskHistoryDService.auditFailSave(taskRunD, param.getAuditMsg());
+                AdsMatHyxtTaskHistoryD prevNode = adsMatHyxtTaskHistoryDService.getOneNode(businessId, InvoiceNodeEnum.NODE_8.getNode());
+                adsMatHyxtTaskRunDService.auditRollback(prevNode, taskRunD);
+                adsMatHyxtInvoiceApplyDService.updateNode(businessId, InvoiceNodeEnum.NODE_8, prevNode.getOwnerUser(), prevNode.getOwnerUserName(), prevNode.getOwnerUserPhone());
+                SysUser sysUser = sysUserService.selectUserByUserName(prevNode.getOwnerUser());
+                if (null != sysUser) {
+                    adsMatHyxtIAppService.sendApp(businessId, MsgTemplateEnum.TMP_2.getMsg(taskRunD.getOwnerUserName()), InvoiceNodeEnum.NODE_8.getDesc(), sysUser, true, true);
+                }
+            } else {
+                // 请先确认发票是否接收
+                AdsMatHyxtInvoiceApplyD applyD = adsMatHyxtInvoiceApplyDService.getById(businessId);
+                Integer isReceiptInvoice = applyD.getIsReceiptInvoice();
+                if (isReceiptInvoice != 1) {
+                    return R.fail("【"+taskRunD.getTaskName()+"】请先确认发票是否接收!");
+                }
+
+                // 财务入账及凭证生成
+                adsMatHyxtTaskRunDService.updateTask(taskId, InvoiceNodeEnum.NODE_12.getNode(), InvoiceNodeEnum.NODE_12.getDesc(), user, nextUser);
+                adsMatHyxtTaskHistoryDService.auditOkSave(taskRunD);
+                adsMatHyxtInvoiceApplyDService.updateAuditUser(businessId, null, null, null, null, nextUser.getUserName(), null);
+                adsMatHyxtInvoiceApplyDService.updateNode(businessId, InvoiceNodeEnum.NODE_12, nextUser.getUserName(), nextUser.getNickName(), nextUser.getPhonenumber());
+                adsMatHyxtIAppService.sendApp(businessId, MsgTemplateEnum.TMP_5.getMsg(nextUser.getNickName()), InvoiceNodeEnum.NODE_12.getDesc(), nextUser, true, true);
+
+                // 【任务】销售方财务人员
+                adsMatHyxtTaskRunDService.createTask(taskId, nextUser2);
+            }
+        } else if (currentNode == InvoiceNodeEnum.NODE_12.getNode()) {
+            if (auditState != 1) {
+                // 发票接收
+                // i国网短信提醒
+                adsMatHyxtTaskHistoryDService.auditFailSave(taskRunD, param.getAuditMsg());
+                AdsMatHyxtTaskHistoryD prevNode = adsMatHyxtTaskHistoryDService.getOneNode(businessId, InvoiceNodeEnum.NODE_10.getNode());
+                adsMatHyxtTaskRunDService.auditRollback(prevNode, taskRunD);
+                adsMatHyxtInvoiceApplyDService.updateNode(businessId, InvoiceNodeEnum.NODE_10, prevNode.getOwnerUser(), prevNode.getOwnerUserName(), prevNode.getOwnerUserPhone());
+                SysUser sysUser = sysUserService.selectUserByUserName(prevNode.getOwnerUser());
+                if (null != sysUser) {
+                    adsMatHyxtIAppService.sendApp(businessId, MsgTemplateEnum.TMP_2.getMsg(taskRunD.getOwnerUserName()), InvoiceNodeEnum.NODE_10.getDesc(), sysUser, true, true);
+                }
+                adsMatHyxtTaskRunDService.delete(businessId, InvoiceNodeEnum.NODE_12);
+            } else {
+                // 请先确认是否接收报账
+                AdsMatHyxtInvoiceApplyD applyD = adsMatHyxtInvoiceApplyDService.getById(businessId);
+                Integer isReceiptBz = applyD.getIsReceiptBz();
+                if (isReceiptBz != 1) {
+                    return R.fail("【"+taskRunD.getTaskName()+"】请先确认是否收到报销资料!已收到请先点击【接收报账】按钮!");
+                }
+
+                // 入账凭证号都上传后才能确认
+                List<AdsMatHyxtInvoiceD> invoiceList = adsMatHyxtInvoiceDService.getListByApplyId(businessId);
+                int index = 0;
+                for (AdsMatHyxtInvoiceD invoiceD : invoiceList) {
+                    index++;
+                    if (invoiceD.getIsGenerateCode() == 0) {
+//                        return R.fail("【"+taskRunD.getTaskName()+"入账凭证号还未上传,不能进行确认!请检查第 " + index + "行数据!");
+                        return R.fail("【"+taskRunD.getTaskName()+"】入账凭证号还未上传,不能进行确认!");
+                    }
+                }
+
+                // 流程结束
+                adsMatHyxtTaskRunDService.delete(businessId);
+                adsMatHyxtTaskHistoryDService.auditOkSave(taskRunD);
+                adsMatHyxtInvoiceApplyDService.updateNode(businessId, InvoiceNodeEnum.END, "/", "/", "/");
+
+                // 关闭定时任务
+                adsMatHyxtTaskSendMsgDService.closeTask(businessId);
+            }
+        } else {
+            return R.fail("审核节点错误,请刷新后再试!");
+        }
+        return R.ok();
+    }
+
+    @PostMapping("/applyInvoiceExport")
+    @ApiOperation(value = "【申请单】发票导出")
+    public void applyInvoiceExport(@RequestBody InvoiceApplyDetailPO param, HttpServletResponse response) throws IOException {
+        InputStream fis = null;
+        OutputStream ops = null;
+
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("utf-8");
+        String fileName = java.util.UUID.randomUUID() + ".xlsx";
+        response.setHeader("Content-disposition", "attachment;filename=" + fileName);
+        String templateFileName = "excelTemplate/invoiceExport.xlsx";
+        fis = Thread.currentThread().getContextClassLoader().getResourceAsStream(templateFileName);
+        ops = response.getOutputStream();
+
+        LambdaQueryWrapper<AdsMatHyxtInvoiceD> queryWrapper = Wrappers.lambdaQuery();
+        if (StringUtils.isNotBlank(param.getApplyId())) {
+            queryWrapper.eq(AdsMatHyxtInvoiceD::getApplyId, param.getApplyId());
+        }
+        queryWrapper.orderByDesc(AdsMatHyxtInvoiceD::getCreateTime);
+        List<AdsMatHyxtInvoiceD> list = adsMatHyxtInvoiceDService.list(queryWrapper);
+        int idx = 1;
+        for (AdsMatHyxtInvoiceD invoiceD : list) {
+            invoiceD.setIdx(idx++);
+        }
+
+        //填充导出信息
+        ExcelWriter excelWriter = EasyExcel.write(ops, AdsMatHyxtInvoiceD.class).withTemplate(fis).build();
+        WriteSheet writeSheet = EasyExcel.writerSheet().build();
+        FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
+        excelWriter.fill(list, fillConfig, writeSheet);
+        excelWriter.finish();
+    }
+
+    @PostMapping("/applyInvoiceExportDetail")
+    @ApiOperation(value = "【申请单】发票导出")
+    public void applyInvoiceExportDetail(HttpServletResponse response) throws IOException {
+        InputStream fis = null;
+        OutputStream ops = null;
+
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("utf-8");
+        String fileName = java.util.UUID.randomUUID() + ".xlsx";
+        response.setHeader("Content-disposition", "attachment;filename=" + fileName);
+        String templateFileName = "excelTemplate/invoiceExport.xlsx";
+        fis = Thread.currentThread().getContextClassLoader().getResourceAsStream(templateFileName);
+        ops = response.getOutputStream();
+
+        LambdaQueryWrapper<AdsMatHyxtInvoiceD> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.orderByDesc(AdsMatHyxtInvoiceD::getCreateTime);
+        List<AdsMatHyxtInvoiceD> list = adsMatHyxtInvoiceDService.list(queryWrapper);
+        int idx = 1;
+        for (AdsMatHyxtInvoiceD invoiceD : list) {
+            invoiceD.setIdx(idx++);
+        }
+
+        //填充导出信息
+        ExcelWriter excelWriter = EasyExcel.write(ops, AdsMatHyxtInvoiceD.class).withTemplate(fis).build();
+        WriteSheet writeSheet = EasyExcel.writerSheet().build();
+        FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
+        excelWriter.fill(list, fillConfig, writeSheet);
+        excelWriter.finish();
+    }
+
+    @ApiOperation(value = "2【发票】详情", notes = "【发票】详情")
+    @PostMapping("/invoiceDetail")
+    public R<AdsMatHyxtInvoiceD> invoiceDetail(@RequestBody InvoiceApplyDetailPO param) {
+        if (StringUtils.isBlank(param.getId())) {
+            return R.fail("参数id不能为空");
+        }
+        AdsMatHyxtInvoiceD invoiceD = adsMatHyxtInvoiceDService.getById(param.getId());
+        if (null != invoiceD) {
+            invoiceD.setFileList(adsMatHyxtInvoiceFileDService.getListByInvoiceId(invoiceD.getId()));
+        }
+        return R.ok(invoiceD);
+    }
+
+    @ApiOperation(value = "【发票上传环节】【发票上传】详情,回显发票信息", notes = "【发票上传环节】【发票上传】详情")
+    @PostMapping("/invoiceUploadDetail")
+    @Deprecated
+    public R<AdsMatHyxtInvoiceD> invoiceUploadDetail(@RequestBody InvoiceApplyDetailPO param) {
+        if (StringUtils.isBlank(param.getBusinessId())) {
+            return R.fail("参数businessId不能为空");
+        }
+        LambdaQueryWrapper<AdsMatHyxtInvoiceD> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(AdsMatHyxtInvoiceD::getApplyId, param.getBusinessId());
+        queryWrapper.eq(AdsMatHyxtInvoiceD::getIsDeleted, 0);
+        List<AdsMatHyxtInvoiceD> list = adsMatHyxtInvoiceDService.list(queryWrapper);
+        if (!list.isEmpty()) {
+            AdsMatHyxtInvoiceD invoiceD = list.get(0);
+            if (null != invoiceD) {
+                invoiceD.setFileList(adsMatHyxtInvoiceFileDService.getListByInvoiceId(invoiceD.getId()));
+            }
+            return R.ok(invoiceD);
+        }
+
+        return R.ok(null);
+    }
+
+    @ApiOperation(value = "【发票上传环节】保存发票", notes = "【发票上传环节】保存发票")
+    @PostMapping("/invoiceUploadSave")
+    @Deprecated
+    public R invoiceUploadSave(@RequestBody AdsMatHyxtInvoiceD param) {
+        if (StringUtils.isBlank(param.getBusinessId())) {
+            return R.fail("参数businessId不能为空");
+        }
+        if (StringUtils.isBlank(param.getInvoiceCode())) {
+            return R.fail("请填写发票代码!");
+        }
+        if (ObjectUtils.isEmpty(param.getMakeInvoiceDate())) {
+            return R.fail("请填写开票日期!");
+        }
+        LambdaUpdateWrapper<AdsMatHyxtInvoiceD> updateWrapper = Wrappers.lambdaUpdate();
+        updateWrapper.eq(AdsMatHyxtInvoiceD::getApplyId, param.getBusinessId());
+        updateWrapper.set(AdsMatHyxtInvoiceD::getMakeInvoiceDate, param.getMakeInvoiceDate());
+        updateWrapper.set(AdsMatHyxtInvoiceD::getInvoiceCode, param.getInvoiceCode());
+        if (ObjectUtils.isNotEmpty(param.getMakeInvoiceDate()) && StringUtils.isNotBlank(param.getInvoiceCode())) {
+            updateWrapper.set(AdsMatHyxtInvoiceD::getIsUploadInvoice, 1);
+        }
+        adsMatHyxtInvoiceDService.update(updateWrapper);
+
+        LambdaQueryWrapper<AdsMatHyxtInvoiceD> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(AdsMatHyxtInvoiceD::getApplyId, param.getBusinessId());
+        queryWrapper.eq(AdsMatHyxtInvoiceD::getIsDeleted, 0);
+        List<AdsMatHyxtInvoiceD> list = adsMatHyxtInvoiceDService.list(queryWrapper);
+
+        Date date = new Date();
+        for (AdsMatHyxtInvoiceD invoiceD : list) {
+            List<AdsMatHyxtInvoiceFileD> fileList = param.getFileList();
+            if (null != fileList && !fileList.isEmpty()) {
+                for (AdsMatHyxtInvoiceFileD invoiceFileD : fileList) {
+                    invoiceFileD.setId(IdGen.get32UUID());
+                    invoiceFileD.setInvoiceId(invoiceD.getId());
+                    invoiceFileD.setApplyId(param.getBusinessId());
+                    invoiceFileD.setCreateTime(date);
+                }
+                adsMatHyxtInvoiceFileDService.logicDeleteByInvoiceId(invoiceD.getId());
+                adsMatHyxtInvoiceFileDService.saveBatch(fileList);
+            }
+        }
+        return R.ok();
+    }
+
+    @ApiOperation(value = "2【发票】保存", notes = "【发票】保存")
+    @PostMapping("/invoiceSave")
+    public R invoiceDetail(@RequestBody AdsMatHyxtInvoiceD param) {
+        if (StringUtils.isBlank(param.getId())) {
+            return R.fail("参数id不能为空");
+        }
+//        if (StringUtils.isBlank(param.getInvoiceCode())) {
+//            return R.fail("请填写发票代码!");
+//        }
+//        if (ObjectUtils.isEmpty(param.getMakeInvoiceDate())) {
+//            return R.fail("请填写开票日期!");
+//        }
+        Date date = new Date();
+        AdsMatHyxtInvoiceD invoiceD = adsMatHyxtInvoiceDService.getById(param.getId());
+        if (null == invoiceD) {
+            return R.fail("开票信息不存在!");
+        }
+        int updateNum = 0;
+        LambdaUpdateWrapper<AdsMatHyxtInvoiceD> updateWrapper = Wrappers.lambdaUpdate();
+        updateWrapper.eq(AdsMatHyxtInvoiceD::getId, param.getId());
+        if (ObjectUtils.isNotEmpty(param.getMakeInvoiceDate())) {
+            updateWrapper.set(AdsMatHyxtInvoiceD::getMakeInvoiceDate, param.getMakeInvoiceDate());
+            updateNum++;
+        }
+        if (StringUtils.isNotBlank(param.getInvoiceCode())) {
+            updateWrapper.set(AdsMatHyxtInvoiceD::getInvoiceCode, param.getInvoiceCode());
+            updateNum++;
+        }
+        if (StringUtils.isNotBlank(param.getVoucherCode())) {
+            updateWrapper.set(AdsMatHyxtInvoiceD::getVoucherCode, param.getVoucherCode());
+            updateNum++;
+        }
+        if (StringUtils.isNotBlank(param.getYnVoucherCode())) {
+            updateWrapper.set(AdsMatHyxtInvoiceD::getYnVoucherCode, param.getYnVoucherCode());
+            updateNum++;
+        }
+        if (updateNum > 0) {
+            updateWrapper.set(AdsMatHyxtInvoiceD::getUpdateTime, date);
+            if (ObjectUtils.isNotEmpty(param.getMakeInvoiceDate()) && StringUtils.isNotBlank(param.getInvoiceCode())) {
+                updateWrapper.set(AdsMatHyxtInvoiceD::getIsUploadInvoice, 1);
+            }
+            if (StringUtils.isNotBlank(param.getVoucherCode()) && StringUtils.isNotBlank(param.getYnVoucherCode())) {
+                updateWrapper.set(AdsMatHyxtInvoiceD::getIsGenerateCode, 1);
+            }
+            adsMatHyxtInvoiceDService.update(updateWrapper);
+        }
+        AdsMatHyxtInvoiceD invoiceD2 = adsMatHyxtInvoiceDService.getById(param.getId());
+        if (StringUtils.isNotBlank(invoiceD2.getVoucherCode()) && StringUtils.isNotBlank(invoiceD2.getYnVoucherCode())) {
+            LambdaUpdateWrapper<AdsMatHyxtInvoiceD> updateWrapper1 = Wrappers.lambdaUpdate();
+            updateWrapper1.eq(AdsMatHyxtInvoiceD::getId, invoiceD2.getId());
+            updateWrapper1.set(AdsMatHyxtInvoiceD::getIsGenerateCode, 1);
+            adsMatHyxtInvoiceDService.update(updateWrapper1);
+        }
+
+        List<AdsMatHyxtInvoiceFileD> fileList = param.getFileList();
+        if (null != fileList && !fileList.isEmpty()) {
+            for (AdsMatHyxtInvoiceFileD invoiceFileD : fileList) {
+                invoiceFileD.setId(IdGen.get32UUID());
+                invoiceFileD.setInvoiceId(invoiceD.getId());
+                invoiceFileD.setApplyId(invoiceD.getApplyId());
+                invoiceFileD.setCreateTime(date);
+            }
+            adsMatHyxtInvoiceFileDService.logicDeleteByInvoiceId(invoiceD.getId());
+            adsMatHyxtInvoiceFileDService.saveBatch(fileList);
+        }
+        return R.ok();
+    }
+
+    @ApiOperation(value = "可用预算金额保存", notes = "可用预算金额保存")
+    @PostMapping("/validBudgetAmountSave")
+    public R validBudgetAmountSave(@RequestBody AdsMatHyxtInvoiceD param) {
+        if (StringUtils.isEmpty(param.getId())) {
+            return R.fail("id不能为空!");
+        }
+        if (StringUtils.isEmpty(param.getValidBudgetAmount())) {
+            return R.fail("可用预算金额不能为空!");
+        }
+        if (StringUtils.isEmpty(param.getTaxAmount())) {
+            return R.fail("本次开票金额不能为空!");
+        }
+        if (!checkIsDouble(param.getValidBudgetAmount())) {
+            return R.fail("可用预算金额请填写正确的金额!");
+        }
+        if (!checkIsDouble(param.getTaxAmount())) {
+            return R.fail("本次开票金额填写正确的金额!");
+        }
+        LambdaUpdateWrapper<AdsMatHyxtInvoiceD> updateWrapper = Wrappers.lambdaUpdate();
+        updateWrapper.eq(AdsMatHyxtInvoiceD::getId, param.getId());
+        updateWrapper.set(AdsMatHyxtInvoiceD::getValidBudgetAmount, param.getValidBudgetAmount());
+        updateWrapper.set(AdsMatHyxtInvoiceD::getTaxAmount, param.getTaxAmount());
+        adsMatHyxtInvoiceDService.update(updateWrapper);
+        return R.ok();
+    }
+
+    @ApiOperation(value = "可用预算金额保存", notes = "可用预算金额保存")
+    @PostMapping("/validBudgetAmountBatchSave")
+    public R validBudgetAmountBatchSave(@RequestBody AdsMatHyxtInvoiceD param) {
+        if (StringUtils.isEmpty(param.getBusinessId())) {
+            return R.fail("businessId不能为空!");
+        }
+        if (StringUtils.isEmpty(param.getValidBudgetAmount())) {
+            return R.fail("可用预算金额不能为空!");
+        }
+        if (!checkIsDouble(param.getValidBudgetAmount())) {
+            return R.fail("可用预算金额请填写正确的金额!");
+        }
+        LambdaUpdateWrapper<AdsMatHyxtInvoiceD> updateWrapper = Wrappers.lambdaUpdate();
+        updateWrapper.eq(AdsMatHyxtInvoiceD::getApplyId, param.getBusinessId());
+        updateWrapper.set(AdsMatHyxtInvoiceD::getValidBudgetAmount, param.getValidBudgetAmount());
+        adsMatHyxtInvoiceDService.update(updateWrapper);
+        return R.ok();
+    }
+
+    private boolean checkIsDouble(String str) {
+        try {
+            BigDecimal decimal = new BigDecimal(str);
+            return true;
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
+    private BigDecimal revert(String str) {
+        try {
+            return new BigDecimal(str);
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    @ApiOperation(value = "入账凭证号保存", notes = "入账凭证号保存")
+    @PostMapping("/codeSave")
+    public R codeSave(@RequestBody AdsMatHyxtInvoiceD param) {
+        List<AdsMatHyxtInvoiceD> ids = param.getIds();
+        if (ids.isEmpty()) {
+            return R.fail("请选择数据!");
+        }
+        for (AdsMatHyxtInvoiceD item : param.getIds()) {
+            AdsMatHyxtInvoiceD invoiceD = adsMatHyxtInvoiceDService.getById(item.getId());
+            if (null != invoiceD) {
+                LambdaUpdateWrapper<AdsMatHyxtInvoiceD> updateWrapper = Wrappers.lambdaUpdate();
+                if (StringUtils.isNotBlank(param.getVoucherCode())) {
+                    updateWrapper.set(AdsMatHyxtInvoiceD::getVoucherCode, param.getVoucherCode());
+                    invoiceD.setVoucherCode(param.getVoucherCode());
+                }
+                if (StringUtils.isNotBlank(param.getYnVoucherCode())) {
+                    updateWrapper.set(AdsMatHyxtInvoiceD::getYnVoucherCode, param.getYnVoucherCode());
+                    invoiceD.setYnVoucherCode(param.getYnVoucherCode());
+                }
+                if (StringUtils.isNotBlank(param.getVoucherCode()) && StringUtils.isNotBlank(param.getYnVoucherCode())) {
+                    updateWrapper.set(AdsMatHyxtInvoiceD::getIsGenerateCode, 1);
+                }
+                if (StringUtils.isNotBlank(invoiceD.getVoucherCode()) && StringUtils.isNotBlank(invoiceD.getYnVoucherCode())) {
+                    updateWrapper.set(AdsMatHyxtInvoiceD::getIsGenerateCode, 1);
+                }
+                adsMatHyxtInvoiceDService.update(updateWrapper);
+            }
+        }
+        return R.ok();
+    }
+
+    @ApiOperation("【发票】orc识别")
+    @PostMapping("/invoiceOcrScan")
+    public R invoiceOcrScan(@RequestParam("file") MultipartFile file) {
+        if (null == file || file.isEmpty()) {
+            return R.fail("上传的文件不能为空!");
+        }
+        if (PDFUtil.isImageFile(file) || PDFUtil.isPdfFile(file)) {
+            return adsMatHyxtOcrService.invoiceOcrScan(file);
+        } else {
+            return R.fail("文件类型暂不支持上传!");
+        }
+    }
+
+}

+ 100 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/AdsMatHyxtInvoiceFileDController.java

@@ -0,0 +1,100 @@
+package com.ruoyi.hywz.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.hywz.entity.AdsMatHyxtInvoiceD;
+import com.ruoyi.hywz.entity.AdsMatHyxtInvoiceFileD;
+import com.ruoyi.hywz.service.IAdsMatHyxtInvoiceDService;
+import com.ruoyi.hywz.service.IAdsMatHyxtInvoiceFileDService;
+import com.ruoyi.hywz.utils.IdGen;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+
+/**
+ * @author: jxh
+ * @description:
+ * @create: 2024/7/4
+ */
+@RestController
+@RequestMapping("adsMatHyxtInvoiceFileD")
+@AllArgsConstructor
+@Api(value = "adsMatHyxtInvoiceFileD", tags = "开票申请流程管控")
+public class AdsMatHyxtInvoiceFileDController {
+
+    private final IAdsMatHyxtInvoiceFileDService adsMatHyxtInvoiceFileDService;
+    private final IAdsMatHyxtInvoiceDService adsMatHyxtInvoiceDService;
+
+    @ApiOperation("发票分页")
+    @PostMapping("/invoicePage")
+    public R invoicePage(@RequestParam(defaultValue = "10") Long pageSize,
+                         @RequestParam(defaultValue = "1") Long pageNo,
+                         @RequestBody AdsMatHyxtInvoiceD param) {
+        if (StringUtils.isBlank(param.getBusinessId())) {
+            return R.fail("参数businessId不能为空");
+        }
+        Page<AdsMatHyxtInvoiceFileD> page = new Page<>();
+        page.setSize(pageSize);
+        page.setCurrent(pageNo);
+
+        LambdaQueryWrapper<AdsMatHyxtInvoiceFileD> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(AdsMatHyxtInvoiceFileD::getApplyId, param.getBusinessId());
+        queryWrapper.eq(AdsMatHyxtInvoiceFileD::getIsDeleted, 0);
+        queryWrapper.orderByDesc(AdsMatHyxtInvoiceFileD::getCreateTime);
+        return R.ok(adsMatHyxtInvoiceFileDService.page(page, queryWrapper));
+    }
+
+    @ApiOperation("发票删除")
+    @PostMapping("/invoiceDelete")
+    public R invoiceDelete(@RequestBody AdsMatHyxtInvoiceFileD param) {
+        if (StringUtils.isBlank(param.getId())) {
+            return R.fail("参数id不能为空");
+        }
+        LambdaUpdateWrapper<AdsMatHyxtInvoiceFileD> updateWrapper = Wrappers.lambdaUpdate();
+        updateWrapper.eq(AdsMatHyxtInvoiceFileD::getId, param.getId());
+        updateWrapper.set(AdsMatHyxtInvoiceFileD::getIsDeleted, 1);
+        adsMatHyxtInvoiceFileDService.update(updateWrapper);
+        return R.ok();
+    }
+
+    @ApiOperation("发票上传")
+    @PostMapping("/invoiceSave")
+    public R invoiceSave(@RequestBody AdsMatHyxtInvoiceFileD param) {
+        if (StringUtils.isBlank(param.getBusinessId())) {
+            return R.fail("参数businessId不能为空");
+        }
+        if (StringUtils.isBlank(param.getInvoiceCode())) {
+            return R.fail("请填写发票代码!");
+        }
+        if (ObjectUtils.isEmpty(param.getMakeInvoiceDate())) {
+            return R.fail("请填写开票日期!");
+        }
+
+        LambdaUpdateWrapper<AdsMatHyxtInvoiceD> updateWrapper = Wrappers.lambdaUpdate();
+        updateWrapper.eq(AdsMatHyxtInvoiceD::getApplyId, param.getBusinessId());
+        updateWrapper.set(AdsMatHyxtInvoiceD::getMakeInvoiceDate, param.getMakeInvoiceDate());
+        updateWrapper.set(AdsMatHyxtInvoiceD::getInvoiceCode, param.getInvoiceCode());
+        if (ObjectUtils.isNotEmpty(param.getMakeInvoiceDate()) || StringUtils.isNotBlank(param.getInvoiceCode())) {
+            updateWrapper.set(AdsMatHyxtInvoiceD::getIsUploadInvoice, 1);
+        }
+        adsMatHyxtInvoiceDService.update(updateWrapper);
+
+        param.setId(IdGen.get32UUID());
+        param.setApplyId(param.getBusinessId());
+        param.setCreateTime(new Date());
+        param.setIsDeleted(0);
+        adsMatHyxtInvoiceFileDService.save(param);
+
+        return R.ok();
+    }
+
+
+}

+ 91 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/AdsMatHyxtTaskDController.java

@@ -0,0 +1,91 @@
+package com.ruoyi.hywz.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.hywz.entity.AdsMatHyxtTaskHistoryD;
+import com.ruoyi.hywz.entity.AdsMatHyxtTaskRunD;
+import com.ruoyi.hywz.entity.po.TaskQueryPO;
+import com.ruoyi.hywz.service.IAdsMatHyxtTaskHistoryDService;
+import com.ruoyi.hywz.service.IAdsMatHyxtTaskRunDService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author: jxh
+ * @description:
+ * @create: 2024/4/8
+ */
+@Api(value = "adsMatHyxtTaskD", tags = "任务相关接口")
+@RestController
+@AllArgsConstructor
+@RequestMapping("adsMatHyxtTaskD")
+public class AdsMatHyxtTaskDController {
+
+    private final IAdsMatHyxtTaskRunDService adsMatHyxtTaskRunDService;
+    private final IAdsMatHyxtTaskHistoryDService adsMatHyxtTaskHistoryDService;
+
+    @ApiOperation(value = "任务数量", notes = "任务数量")
+    @GetMapping("/taskNum")
+    public AjaxResult taskNum() {
+        return AjaxResult.success(adsMatHyxtTaskRunDService.getTaskNum());
+    }
+
+    @ApiOperation(value = "【待办任务】分页查询", notes = "【待办任务】分页查询")
+    @PostMapping("/todoPage")
+    public R<Page<AdsMatHyxtTaskRunD>> todoPage(@RequestParam(defaultValue = "10") Long pageSize,
+                                          @RequestParam(defaultValue = "1") Long pageNo,
+                                          @RequestBody(required = false) TaskQueryPO param) {
+        Page<AdsMatHyxtTaskRunD> page = new Page<>();
+        page.setSize(pageSize);
+        page.setCurrent(pageNo);
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+
+        QueryWrapper<AdsMatHyxtTaskRunD> queryWrapper = Wrappers.query();
+        queryWrapper.eq("owner_user", loginUser.getUsername());
+        if (param != null) {
+            queryWrapper.like(StringUtils.isNotEmpty(param.getTaskName()), "task_name", param.getTaskName());
+            queryWrapper.like(StringUtils.isNotEmpty(param.getApplyUserName()), "apply_user_name", param.getApplyUserName());
+            if (StringUtils.isNotEmpty(param.getStartDate()) && StringUtils.isNotEmpty(param.getEndDate())) {
+                queryWrapper.ge("DATE_FORMAT(create_time,'%Y-%m-%d')", param.getStartDate());
+                queryWrapper.le("DATE_FORMAT(create_time,'%Y-%m-%d')", param.getEndDate());
+            }
+        }
+        queryWrapper.eq("is_deleted", 0);
+        queryWrapper.orderByDesc("create_time");
+        return R.ok(adsMatHyxtTaskRunDService.page(page, queryWrapper));
+    }
+
+    @ApiOperation(value = "【已办任务】分页查询", notes = "【已办任务】分页查询")
+    @PostMapping("/finishPage")
+    public R<Page<AdsMatHyxtTaskHistoryD>> finishPage(@RequestParam(defaultValue = "10") Long pageSize,
+                                 @RequestParam(defaultValue = "1") Long pageNo,
+                                 @RequestBody(required = false) TaskQueryPO param) {
+        Page<AdsMatHyxtTaskHistoryD> page = new Page<>();
+        page.setSize(pageSize);
+        page.setCurrent(pageNo);
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+
+        QueryWrapper<AdsMatHyxtTaskHistoryD> queryWrapper = Wrappers.query();
+        queryWrapper.eq("owner_user", loginUser.getUsername());
+        if (param != null) {
+            queryWrapper.like(StringUtils.isNotEmpty(param.getTaskName()), "task_name", param.getTaskName());
+            queryWrapper.like(StringUtils.isNotEmpty(param.getApplyUserName()), "apply_user_name", param.getApplyUserName());
+            if (StringUtils.isNotEmpty(param.getStartDate()) && StringUtils.isNotEmpty(param.getEndDate())) {
+                queryWrapper.ge("DATE_FORMAT(create_time,'%Y-%m-%d')", param.getStartDate());
+                queryWrapper.le("DATE_FORMAT(create_time,'%Y-%m-%d')", param.getEndDate());
+            }
+        }
+        queryWrapper.eq("is_deleted", 0);
+        queryWrapper.orderByDesc("create_time");
+        return R.ok(adsMatHyxtTaskHistoryDService.page(page, queryWrapper));
+    }
+
+}

+ 59 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/HomeController.java

@@ -0,0 +1,59 @@
+package com.ruoyi.hywz.controller;
+
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.hywz.entity.AdsMatHyxtStampTaxComputeD;
+import com.ruoyi.hywz.entity.po.HomeStampTaxCountPO;
+import com.ruoyi.hywz.entity.vo.stamp.tax.HomeStampTaxCountVO;
+import com.ruoyi.hywz.service.IAdsMatHyxtStampTaxComputeDService;
+import com.ruoyi.hywz.service.IAdsMatHyxtStampTaxContractDService;
+import com.ruoyi.hywz.service.IAdsMatHyxtStampTaxInvoiceDService;
+import com.ruoyi.hywz.service.IAdsMatHyxtStampTaxZhptInvoiceDService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.math.BigDecimal;
+
+/**
+ * @author: jxh
+ * @description:
+ * @create: 2024/9/1
+ */
+@RestController
+@RequestMapping("home")
+@AllArgsConstructor
+@Api(value = "home", tags = "首页接口")
+public class HomeController {
+
+    private final IAdsMatHyxtStampTaxContractDService adsMatHyxtStampTaxContractDService;
+    private final IAdsMatHyxtStampTaxInvoiceDService adsMatHyxtStampTaxInvoiceDService;
+    private final IAdsMatHyxtStampTaxComputeDService adsMatHyxtStampTaxComputeDService;
+    private final IAdsMatHyxtStampTaxZhptInvoiceDService adsMatHyxtStampTaxZhptInvoiceDService;
+
+
+    @ApiOperation(value = "【印花税模块】统计", notes = "【印花税模块】统计")
+    @PostMapping("/stampTax/count")
+    public R stampTaxCount(@RequestBody HomeStampTaxCountPO param) {
+        String orgNo = param.getHomeOrgNo();
+        String date = param.getHomeDate();
+
+        int contractNum = adsMatHyxtStampTaxContractDService.countNum(orgNo, date);
+        int invoiceNum = adsMatHyxtStampTaxInvoiceDService.countNum(orgNo, date);
+        int warningNum = adsMatHyxtStampTaxContractDService.countWarningNum(orgNo, date) + adsMatHyxtStampTaxInvoiceDService.countWarningNum(orgNo, date);
+        int zhptInvoiceNum = adsMatHyxtStampTaxZhptInvoiceDService.countNum(orgNo, date);
+        BigDecimal taxAmount = BigDecimal.ZERO;
+        BigDecimal payTaxAmount = BigDecimal.ZERO;
+        AdsMatHyxtStampTaxComputeD one = adsMatHyxtStampTaxComputeDService.getOne(orgNo, date);
+        if (null != one) {
+            taxAmount = new BigDecimal(one.getTaxAmount());
+            payTaxAmount = new BigDecimal(one.getAmount());
+        }
+        HomeStampTaxCountVO vo = new HomeStampTaxCountVO(contractNum,invoiceNum,warningNum,zhptInvoiceNum,taxAmount, payTaxAmount);
+        return R.ok(vo);
+    }
+
+}

+ 94 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/OCRController.java

@@ -0,0 +1,94 @@
+package com.ruoyi.hywz.controller;
+
+import cn.com.esgcc.ai.matrix.sdk.constant.OcrMethod;
+import cn.com.esgcc.ai.matrix.sdk.esgccenum.ExceptionEnum;
+import cn.com.esgcc.ai.matrix.sdk.request.QueryData;
+import cn.com.esgcc.ai.matrix.sdk.request.RequestClient;
+import cn.com.esgcc.ai.matrix.sdk.response.SdkResponse;
+import cn.com.esgcc.ai.matrix.sdk.response.SdkTokenResponse;
+import cn.com.esgcc.ai.matrix.sdk.util.encrypt.base64.Base64Util;
+import cn.com.esgcc.ai.matrix.sdk.util.encrypt.sm2.Sm2KeyVO;
+import cn.hutool.json.JSONObject;
+import com.ruoyi.common.core.domain.R;
+import io.swagger.annotations.Api;
+import org.apache.commons.io.FileUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/ai/ocr")
+@Api(value = "/ai/ocr", tags = "AI ocr识别")
+public class OCRController {
+
+	@Value("${ai.ocr.clientId}")
+	private String clientId;
+	@Value("${ai.ocr.clientSecret}")
+	private String clientSecret;
+	@Value("${ai.ocr.username}")
+	private String username;
+	@Value("${ai.ocr.password}")
+	private String password;
+	@Value("${ai.ocr.ocrServer}")
+	private String ocrServer;
+	@Value("${ai.ocr.deviceId}")
+	private String deviceId;
+	@Value("${ai.ocr.sm2PublicKey}")
+	private String sm2PublicKey;
+	@Value("${ai.ocr.sm2PrivateKey}")
+	private String sm2PrivateKey;
+	@Value("${ai.ocr.tempPath}")
+	private String tempPath;
+	private final static Logger logger = LoggerFactory.getLogger(OCRController. class);
+
+	@PostMapping("/fp")
+	public R fp(@RequestParam("file") MultipartFile file) {
+		Map<String, String> map = new HashMap<>();
+		try {
+			QueryData queryData = new QueryData();
+			File tempFolder = new File(tempPath);
+			if(!tempFolder.exists()){
+				tempFolder.mkdirs();
+			}
+			File tempFile = new File(tempPath+"\\"+file.getOriginalFilename());
+			FileUtils.copyInputStreamToFile(file.getInputStream(), tempFile);
+			String base64String = Base64Util.file2Base64(tempFile);
+			queryData.setImg(base64String);
+			SdkResponse sdkResponse = getClient().esgccOcr(OcrMethod.BIZ_ZP, queryData);
+			if (ExceptionEnum.COMMON_SUCCESS_1B.getResultCode().equals(sdkResponse.getCode())) {
+				JSONObject jsonObject1 = (JSONObject) sdkResponse.getData();
+				if (jsonObject1 != null) {
+					JSONObject resultStr = jsonObject1.getJSONObject("result");
+					map.put("vDate",resultStr.getStr("开票日期"));
+					map.put("vNo",resultStr.getStr("发票号码"));
+					return R.ok(map);
+				}
+			}
+		} catch (Exception e) {
+			return R.fail(e.getMessage());
+		}
+		return R.ok(map);
+	}
+
+	private RequestClient getClient() {
+		Sm2KeyVO sm2KeyVO = new Sm2KeyVO();
+		sm2KeyVO.setPrivateKey(sm2PrivateKey);
+		sm2KeyVO.setPublicKey(sm2PublicKey);
+		RequestClient client = new RequestClient(ocrServer, deviceId, clientId, clientSecret, username, password, sm2KeyVO);
+		SdkTokenResponse sdkResponse = client.oauthUserToken();
+		if (ExceptionEnum.COMMON_SUCCESS_1B.getResultCode().equals(sdkResponse.getCode())) {
+			logger.debug(sdkResponse.getAccessToken());
+		}
+		return client;
+	}
+
+}

+ 98 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/UserApplyPermissionDController.java

@@ -0,0 +1,98 @@
+package com.ruoyi.hywz.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.hywz.entity.AdsMatHyxtInvoiceUserApplyPermissionD;
+import com.ruoyi.hywz.entity.vo.UserPermissionVo;
+import com.ruoyi.hywz.service.IAdsMatHyxtInvoiceUserApplyPermissionDService;
+import com.ruoyi.hywz.utils.IdGen;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.Date;
+
+/**
+ * @author: jxh
+ * @description:
+ * @create: 2024/4/16
+ */
+@Api(value = "userApplyPermissionD", tags = "用户申请权限")
+@RestController
+@AllArgsConstructor
+@RequestMapping("userApplyPermissionD")
+public class UserApplyPermissionDController extends BaseController {
+
+    private final IAdsMatHyxtInvoiceUserApplyPermissionDService adsMatHyxtInvoiceUserApplyPermissionDService;
+
+    @ApiOperation("分页查询")
+    @PostMapping("/page")
+    public R<IPage<UserPermissionVo>> page(@RequestParam(defaultValue = "10") Long pageSize,
+                                           @RequestParam(defaultValue = "1") Long pageNo,
+                                           @RequestBody(required = false) UserPermissionVo param) {
+        Page<UserPermissionVo> page = new Page<>();
+        page.setSize(pageSize);
+        page.setCurrent(pageNo);
+
+        QueryWrapper<UserPermissionVo> queryWrapper = Wrappers.query();
+        if (ObjectUtils.isNotEmpty(param)) {
+            queryWrapper.like(StringUtils.isNotEmpty(param.getUserName()), "a.user_name", param.getUserName());
+            queryWrapper.like(StringUtils.isNotEmpty(param.getNickName()), "a.nick_name", param.getNickName());
+            queryWrapper.like(StringUtils.isNotEmpty(param.getPhonenumber()), "a.phonenumber", param.getPhonenumber());
+            if (ObjectUtils.isNotEmpty(param.getApplyPermission())) {
+                if (param.getApplyPermission() == 0) {
+                    queryWrapper.isNull("b.apply_permission");
+                }
+                if (param.getApplyPermission() == 1) {
+                    queryWrapper.eq("b.apply_permission", 1);
+                }
+            }
+        }
+
+        queryWrapper.orderByDesc("b.apply_permission");
+        return R.ok(adsMatHyxtInvoiceUserApplyPermissionDService.queryPage(page, queryWrapper));
+    }
+
+    @ApiOperation("修改权限")
+    @PostMapping("/updateApplyPermission")
+    public R updateApplyPermission(@RequestBody UserPermissionVo param) {
+        if (ObjectUtils.isEmpty(param.getUserId())) {
+            return R.fail("参数:userId不能为空!");
+        }
+        if (ObjectUtils.isEmpty(param.getApplyPermission())) {
+            return R.fail("参数:applyPermission不能为空!");
+        }
+        Integer applyPermission = param.getApplyPermission();
+        if (!Arrays.asList(0,1).contains(applyPermission)) {
+            return R.fail("参数:applyPermission的值只能是0和1");
+        }
+
+        // 1.先删除
+        LambdaQueryWrapper<AdsMatHyxtInvoiceUserApplyPermissionD> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(AdsMatHyxtInvoiceUserApplyPermissionD::getUserId, param.getUserId());
+        adsMatHyxtInvoiceUserApplyPermissionDService.remove(queryWrapper);
+
+        // 2.如果开启则新增
+        if (applyPermission == 1) {
+            Date date = new Date();
+            AdsMatHyxtInvoiceUserApplyPermissionD model = new AdsMatHyxtInvoiceUserApplyPermissionD();
+            model.setId(IdGen.get32UUID());
+            model.setUserId(param.getUserId());
+            model.setCreateTime(date);
+            model.setIsDeleted(0);
+            adsMatHyxtInvoiceUserApplyPermissionDService.save(model);
+        }
+        return R.ok();
+    }
+
+
+}

+ 311 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/stamp/tax/AdsMatHyxtStampTaxComputeDController.java

@@ -0,0 +1,311 @@
+package com.ruoyi.hywz.controller.stamp.tax;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.metadata.fill.FillConfig;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.hywz.entity.*;
+import com.ruoyi.hywz.entity.po.DateQueryPO;
+import com.ruoyi.hywz.entity.po.IdsPO;
+import com.ruoyi.hywz.entity.po.StampTaxAuditPO;
+import com.ruoyi.hywz.entity.po.StampTaxComputeSavePO;
+import com.ruoyi.hywz.entity.vo.stamp.tax.StampTaxBaseVo;
+import com.ruoyi.hywz.service.*;
+import com.ruoyi.hywz.utils.DateUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.math.BigDecimal;
+import java.util.*;
+
+/**
+ * <p>
+ * 印花税计算 前端控制器
+ * </p>
+ *
+ * @author mybatisplus-generator
+ * @date 2024-07-14 10:07:56
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("adsMatHyxtStampTaxComputeD")
+@Api(value = "adsMatHyxtStampTaxInvoiceD", tags = "印花税项目")
+public class AdsMatHyxtStampTaxComputeDController {
+
+    private final IAdsMatHyxtStampTaxComputeDService adsMatHyxtStampTaxComputeDService;
+    private final IAdsMatHyxtStampTaxComputeItemDService adsMatHyxtStampTaxComputeItemDService;
+    private final IAdsMatHyxtStampTaxComputeVoucherDService adsMatHyxtStampTaxComputeVoucherDService;
+    private final IAdsMatHyxtStampTaxWarningDService adsMatHyxtStampTaxWarningDService;
+    private final IAdsMatHyxtStampTaxInvoiceDService adsMatHyxtStampTaxInvoiceDService;
+    private final IAdsMatHyxtStampTaxContractDService adsMatHyxtStampTaxContractDService;
+
+    @ApiOperation(value = "分页查询", notes = "分页查询")
+    @PostMapping("/queryPage")
+    public R queryPage(@RequestParam(defaultValue = "10") Long pageSize,
+                       @RequestParam(defaultValue = "1") Long pageNo,
+                       @RequestBody(required = false) AdsMatHyxtStampTaxComputeD param) {
+        return adsMatHyxtStampTaxComputeDService.queryPage(pageSize, pageNo, param);
+    }
+
+    @ApiOperation(value = "查询明细", notes = "查询明细")
+    @PostMapping("/getDetail")
+    public R getDetail(@RequestBody AdsMatHyxtStampTaxComputeD param) {
+        return R.ok(adsMatHyxtStampTaxComputeItemDService.getList(param.getId()));
+    }
+
+    @ApiOperation(value = "计算单作废", notes = "计算单作废")
+    @PostMapping("/change")
+    public R change(@RequestBody AdsMatHyxtStampTaxComputeD param) {
+        LambdaUpdateWrapper<AdsMatHyxtStampTaxComputeD> updateWrapper = Wrappers.lambdaUpdate();
+        updateWrapper.eq(AdsMatHyxtStampTaxComputeD::getId, param.getId());
+        updateWrapper.set(AdsMatHyxtStampTaxComputeD::getStatus, 1);
+        adsMatHyxtStampTaxComputeDService.update(updateWrapper);
+        return R.ok();
+    }
+
+    @ApiOperation(value = "印花税计算单-提交审核", notes = "印花税计算单-提交审核")
+    @PostMapping("/commitAudit")
+    public R commitAudit(@RequestBody AdsMatHyxtStampTaxComputeD param) {
+        LambdaUpdateWrapper<AdsMatHyxtStampTaxComputeD> updateWrapper = Wrappers.lambdaUpdate();
+        updateWrapper.eq(AdsMatHyxtStampTaxComputeD::getId, param.getId());
+        updateWrapper.set(AdsMatHyxtStampTaxComputeD::getAuditUser, param.getAuditUser());
+        updateWrapper.set(AdsMatHyxtStampTaxComputeD::getAuditStatus, 1);
+        adsMatHyxtStampTaxComputeDService.update(updateWrapper);
+        return R.ok();
+    }
+
+    @ApiOperation(value = "印花税计算单-审核", notes = "印花税计算单-审核")
+    @PostMapping("/audit")
+    @Transactional(rollbackFor = Exception.class)
+    public R audit(@RequestBody StampTaxAuditPO param) {
+        LambdaUpdateWrapper<AdsMatHyxtStampTaxComputeD> updateWrapper = Wrappers.lambdaUpdate();
+        updateWrapper.eq(AdsMatHyxtStampTaxComputeD::getId, param.getId());
+        updateWrapper.set(AdsMatHyxtStampTaxComputeD::getAuditStatus, param.getAuditState());
+        adsMatHyxtStampTaxComputeDService.update(updateWrapper);
+        // 生成凭证
+        adsMatHyxtStampTaxComputeVoucherDService.generateVoucher(param.getId());
+        return R.ok();
+    }
+
+    @ApiOperation(value = "印花税计算单-撤回", notes = "印花税计算单-撤回")
+    @PostMapping("/recall")
+    @Transactional(rollbackFor = Exception.class)
+    public R recall(@RequestBody StampTaxAuditPO param) {
+        // 已审核通过无法撤回
+        AdsMatHyxtStampTaxComputeD computeD = adsMatHyxtStampTaxComputeDService.getById(param.getId());
+        if (ObjectUtils.isNotEmpty(computeD) && ObjectUtils.isNotEmpty(computeD.getAuditStatus())) {
+            if (computeD.getAuditStatus() == 2) {
+                return R.fail("已经审核通过,无法再撤回!");
+            }
+        }
+        LambdaUpdateWrapper<AdsMatHyxtStampTaxComputeD> updateWrapper = Wrappers.lambdaUpdate();
+        updateWrapper.eq(AdsMatHyxtStampTaxComputeD::getId, param.getId());
+        updateWrapper.set(AdsMatHyxtStampTaxComputeD::getAuditStatus, -1);
+        adsMatHyxtStampTaxComputeDService.update(updateWrapper);
+        return R.ok();
+    }
+
+    @ApiOperation(value = "印花税计算单-记账凭证", notes = "印花税计算单-记账凭证")
+    @PostMapping("/voucherList")
+    @Transactional(rollbackFor = Exception.class)
+    public R voucherList(@RequestBody StampTaxAuditPO param) {
+        LambdaQueryWrapper<AdsMatHyxtStampTaxComputeVoucherD> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(AdsMatHyxtStampTaxComputeVoucherD::getComputeId, param.getId());
+        queryWrapper.orderByAsc(AdsMatHyxtStampTaxComputeVoucherD::getSort);
+        return R.ok(adsMatHyxtStampTaxComputeVoucherDService.list(queryWrapper));
+    }
+
+    @ApiOperation(value = "印花税税基计算表", notes = "印花税税基计算表")
+    @PostMapping("/stampTaxBase")
+    public R stampTaxBase(@RequestBody DateQueryPO param) {
+        String startDate = "null";
+        String endDate = "null";
+        String orgNo = param.getHomeOrgNo();
+        String[] startAndEnd = DateUtil.getMonthStartAndEnd(param.getHomeDate());
+        if (null != startAndEnd) {
+            startDate = startAndEnd[0];
+            endDate = startAndEnd[1];
+        }
+        List<StampTaxBaseVo> list = adsMatHyxtStampTaxComputeDService.getStampTaxBaseTable(startDate, endDate, orgNo);
+
+        Map<String, Object> result = new HashMap<>();
+        result.put("Mont", new String[] {startDate, endDate});
+        result.put("list", list);
+        return R.ok(result);
+    }
+    @ApiOperation(value = "印花税统计表", notes = "印花税统计表")
+    @PostMapping("/stampTaxStatiss")
+    public R stampTaxStatiss(@RequestBody DateQueryPO param) {
+        String startDate = "null";
+        String endDate = "null";
+        String orgNo = param.getHomeOrgNo();
+        String year = param.getYear();
+        List<AdsMatHyxtStampTaxItemD> list = adsMatHyxtStampTaxComputeDService.getStampTaxStatiss(year, orgNo);
+        sortList(list);
+        List<Map<String,Object>> peps = new ArrayList<>();
+
+        for(AdsMatHyxtStampTaxItemD adsMatHyxtStampTaxItemD : list){
+            BigDecimal concatTotalNum = BigDecimal.ZERO;
+            if(adsMatHyxtStampTaxItemD.getItemName().indexOf("合同")!=-1){
+                concatTotalNum = concatTotalNum.add(new BigDecimal(adsMatHyxtStampTaxItemD.getTax1Fee()))
+                        .add(new BigDecimal(adsMatHyxtStampTaxItemD.getTax2Fee()))
+                        .add(new BigDecimal(adsMatHyxtStampTaxItemD.getTax3Fee()))
+                        .add(new BigDecimal(adsMatHyxtStampTaxItemD.getTax4Fee()));
+                Map<String,Object> pep = new HashMap<>();
+                pep.put("value",concatTotalNum);
+                pep.put("name",adsMatHyxtStampTaxItemD.getItemName());
+                peps.add(pep);
+            }
+        }
+        List<Map<String,String>> ms = new ArrayList<>();
+        Map<String,String> m1 = new HashMap<>();
+        Map<String,String> m2 = new HashMap<>();
+        Map<String,String> m3 = new HashMap<>();
+        Map<String,String> m4 = new HashMap<>();
+        AdsMatHyxtStampTaxItemD adsMatHyxtStampTaxItemD1 = list.get(list.size()-1);
+        m1.put("year","1季度");
+        m1.put("taxFee",adsMatHyxtStampTaxItemD1.getTax1Fee());
+        m1.put("tax",adsMatHyxtStampTaxItemD1.getTax1());
+        m2.put("year","2季度");
+        m2.put("taxFee",adsMatHyxtStampTaxItemD1.getTax2Fee());
+        m2.put("tax",adsMatHyxtStampTaxItemD1.getTax2());
+        m3.put("year","3季度");
+        m3.put("taxFee",adsMatHyxtStampTaxItemD1.getTax3Fee());
+        m3.put("tax",adsMatHyxtStampTaxItemD1.getTax3());
+        m4.put("year","4季度");
+        m4.put("taxFee",adsMatHyxtStampTaxItemD1.getTax4Fee());
+        m4.put("tax",adsMatHyxtStampTaxItemD1.getTax4());
+        ms.add(m1);
+        ms.add(m2);
+        ms.add(m3);
+        ms.add(m4);
+        Map<String, Object> result = new HashMap<>();
+        result.put("Mont", new String[] {startDate, endDate});
+        result.put("list", list);
+        result.put("bar", ms);
+        result.put("peps", peps);
+        return R.ok(result);
+    }
+    @ApiOperation(value = "印花税计算单", notes = "印花税计算单")
+    @PostMapping("/stampTaxComputeBill")
+    public R stampTaxComputeBill(@RequestBody DateQueryPO param) {
+        String startDate = "null";
+        String endDate = "null";
+        String orgNo = param.getHomeOrgNo();
+        String[] startAndEnd = DateUtil.getMonthStartAndEnd(param.getHomeDate());
+        if (null != startAndEnd) {
+            startDate = startAndEnd[0];
+            endDate = startAndEnd[1];
+        }
+        List<StampTaxBaseVo> list = adsMatHyxtStampTaxComputeDService.getStampTaxComputeBill(startDate, endDate, orgNo);
+        Map<String, Object> result = new HashMap<>();
+
+        result.put("Mont", new String[] {startDate, endDate});
+        result.put("list", list);
+        result.put("totalTaxNum", list.get(list.size()-1).getTaxNum());
+        return R.ok(result);
+    }
+
+    @ApiOperation(value = "印花税计算单-导出")
+    @PostMapping("/way1/stampTaxComputeBillExport")
+    public void stampTaxComputeBillExport(@RequestBody StampTaxComputeSavePO param, HttpServletResponse response) throws IOException {
+        InputStream fis = null;
+        OutputStream ops = null;
+
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("utf-8");
+        String fileName = java.util.UUID.randomUUID() + ".xlsx";
+        response.setHeader("Content-disposition", "attachment;filename=" + fileName);
+        String templateFileName = "excelTemplate/stampTax/stampTaxComputeBillExport.xlsx";
+        fis = Thread.currentThread().getContextClassLoader().getResourceAsStream(templateFileName);
+        ops = response.getOutputStream();
+
+        List<AdsMatHyxtStampTaxComputeItemD> itemList = param.getItemList();
+        int i = 0;
+        for (AdsMatHyxtStampTaxComputeItemD itemD : itemList) {
+            i++;
+            itemD.setNo(i);
+        }
+
+        Map<String, String> map = new HashMap<>();
+        map.put("taxPayer", param.getTaxPayer());
+        map.put("startDate", param.getStartDate());
+        map.put("endDate", param.getEndDate());
+        map.put("amount", param.getAmount());
+
+        //填充导出信息
+        ExcelWriter excelWriter = EasyExcel.write(ops, StampTaxComputeSavePO.class).withTemplate(fis).build();
+        WriteSheet writeSheet = EasyExcel.writerSheet().build();
+        FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
+        excelWriter.fill(itemList, fillConfig, writeSheet);
+        excelWriter.fill(map, fillConfig, writeSheet);
+        excelWriter.finish();
+    }
+
+    @ApiOperation(value = "印花税计算表保存", notes = "印花税计算表保存")
+    @PostMapping("/stampTaxComputeSave")
+    public R stampTaxComputeSave(@RequestBody StampTaxComputeSavePO param) {
+        // 存在预警数据,请先处理预警信息后再保存
+        List<AdsMatHyxtStampTaxContractD> warnigList = adsMatHyxtStampTaxContractDService.getWarnigList(param.getHomeOrgNo());
+        if (!warnigList.isEmpty()) {
+            return R.fail("合同表存在预警数据,请先处理预警信息后再保存!");
+        }
+        return adsMatHyxtStampTaxComputeDService.stampTaxComputeSave(param);
+    }
+
+    @ApiOperation(value = "删除", notes = "删除")
+    @PostMapping("/delete")
+    @Transactional(rollbackFor = Exception.class)
+    public R delete(@RequestBody IdsPO param) {
+        LambdaQueryWrapper<AdsMatHyxtStampTaxComputeD> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(AdsMatHyxtStampTaxComputeD::getId, param.getId());
+        adsMatHyxtStampTaxComputeDService.remove(queryWrapper);
+
+        LambdaQueryWrapper<AdsMatHyxtStampTaxComputeItemD> queryWrapper2 = Wrappers.lambdaQuery();
+        queryWrapper2.eq(AdsMatHyxtStampTaxComputeItemD::getComputeId, param.getId());
+        adsMatHyxtStampTaxComputeItemDService.remove(queryWrapper2);
+        return R.ok();
+    }
+
+    public void sortList(List<AdsMatHyxtStampTaxItemD> list) {
+        Collections.sort(list, new Comparator<AdsMatHyxtStampTaxItemD>() {
+            @Override
+            public int compare(AdsMatHyxtStampTaxItemD o1, AdsMatHyxtStampTaxItemD o2) {
+                // 检查 itemName 是否为 "合计"
+                boolean isO1Total = "合计".equals(o1.getItemName());
+                boolean isO2Total = "合计".equals(o2.getItemName());
+
+                if (isO1Total && !isO2Total) {
+                    return 1; // o1 是 "合计",排在后面
+                } else if (!isO1Total && isO2Total) {
+                    return -1; // o2 是 "合计",排在后面
+                }
+
+                // 否则按照 tax1Fee 排序
+                Double fee1 = parseTax1Fee(o1.getTax1Fee());
+                Double fee2 = parseTax1Fee(o2.getTax1Fee());
+                return fee2.compareTo(fee1); // 从高到低
+            }
+
+            private Double parseTax1Fee(String fee) {
+                try {
+                    return fee != null && !fee.isEmpty() ? Double.parseDouble(fee) : 0.0;
+                } catch (NumberFormatException e) {
+                    return 0.0; // 如果无法解析,返回0
+                }
+            }
+        });
+    }
+}

+ 75 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/stamp/tax/AdsMatHyxtStampTaxComputeVoucherDController.java

@@ -0,0 +1,75 @@
+package com.ruoyi.hywz.controller.stamp.tax;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.metadata.fill.FillConfig;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.hywz.entity.AdsMatHyxtStampTaxComputeVoucherD;
+import com.ruoyi.hywz.service.IAdsMatHyxtStampTaxComputeVoucherDService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.List;
+
+/**
+ * <p>
+ * 【印花税】印花税计算单记账凭证 前端控制器
+ * </p>
+ *
+ * @author mybatisplus-generator
+ * @date 2024-07-29 15:59:04
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("adsMatHyxtStampTaxComputeVoucherD")
+@Api(value = "adsMatHyxtStampTaxComputeVoucherD", tags = "【印花税】印花税计算单记账凭证")
+public class AdsMatHyxtStampTaxComputeVoucherDController {
+
+    private final IAdsMatHyxtStampTaxComputeVoucherDService adsMatHyxtStampTaxComputeVoucherDService;
+
+    @ApiOperation(value = "分页查询", notes = "分页查询")
+    @PostMapping("/queryPage")
+    public R queryPage(@RequestParam(defaultValue = "10") Long pageSize,
+                       @RequestParam(defaultValue = "1") Long pageNo,
+                       @RequestBody(required = false) AdsMatHyxtStampTaxComputeVoucherD param) {
+        return R.ok(adsMatHyxtStampTaxComputeVoucherDService.queryPage(pageSize, pageNo, param));
+    }
+
+    @ApiOperation(value = "凭证导出")
+    @PostMapping("/dataExport")
+    public void dataExport(@RequestBody(required = false) AdsMatHyxtStampTaxComputeVoucherD param, HttpServletResponse response) throws IOException {
+        InputStream fis = null;
+        OutputStream ops = null;
+
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("utf-8");
+        String fileName = java.util.UUID.randomUUID() + ".xlsx";
+        response.setHeader("Content-disposition", "attachment;filename=" + fileName);
+        String templateFileName = "excelTemplate/stampTax/stampTaxComputeVoucherExport.xlsx";
+        fis = Thread.currentThread().getContextClassLoader().getResourceAsStream(templateFileName);
+        ops = response.getOutputStream();
+        Page<AdsMatHyxtStampTaxComputeVoucherD> pageResult = adsMatHyxtStampTaxComputeVoucherDService.queryPage(100000L, 1L, param);
+        List<AdsMatHyxtStampTaxComputeVoucherD> itemList = pageResult.getRecords();
+        int i = 0;
+        for (AdsMatHyxtStampTaxComputeVoucherD itemD : itemList) {
+            i++;
+            itemD.setNo(i);
+        }
+
+        //填充导出信息
+        ExcelWriter excelWriter = EasyExcel.write(ops, AdsMatHyxtStampTaxComputeVoucherD.class).withTemplate(fis).build();
+        WriteSheet writeSheet = EasyExcel.writerSheet().build();
+        FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
+        excelWriter.fill(itemList, fillConfig, writeSheet);
+        excelWriter.finish();
+    }
+
+}

+ 214 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/stamp/tax/AdsMatHyxtStampTaxContractDController.java

@@ -0,0 +1,214 @@
+package com.ruoyi.hywz.controller.stamp.tax;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.metadata.fill.FillConfig;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.hywz.entity.AdsMatHyxtStampTaxComputeItemD;
+import com.ruoyi.hywz.entity.AdsMatHyxtStampTaxContractD;
+import com.ruoyi.hywz.entity.AdsMatHyxtStampTaxContractInvoiceD;
+import com.ruoyi.hywz.entity.AdsMatHyxtStampTaxInvoiceD;
+import com.ruoyi.hywz.entity.po.HomeStampTaxCountPO;
+import com.ruoyi.hywz.entity.po.StampTaxBatchUpdateTaxItemPO;
+import com.ruoyi.hywz.entity.po.IdsPO;
+import com.ruoyi.hywz.entity.po.StampTaxComputeSavePO;
+import com.ruoyi.hywz.entity.vo.stamp.tax.WarningDataVo;
+import com.ruoyi.hywz.listener.ImportExcelHelper;
+import com.ruoyi.hywz.service.IAdsMatHyxtStampTaxContractDService;
+import com.ruoyi.hywz.service.IAdsMatHyxtStampTaxContractInvoiceDService;
+import com.ruoyi.hywz.service.IAdsMatHyxtStampTaxInvoiceDService;
+import com.ruoyi.hywz.utils.DateUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.time.LocalDate;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 合同信息表 前端控制器
+ * </p>
+ *
+ * @author mybatisplus-generator
+ * @date 2024-07-14 10:07:56
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("adsMatHyxtStampTaxContractD")
+@Api(value = "adsMatHyxtStampTaxContractD", tags = "印花税项目")
+public class AdsMatHyxtStampTaxContractDController {
+
+    private final IAdsMatHyxtStampTaxContractDService adsMatHyxtStampTaxContractDService;
+    private final IAdsMatHyxtStampTaxInvoiceDService adsMatHyxtStampTaxInvoiceDService;
+
+    @Resource
+    private IAdsMatHyxtStampTaxContractInvoiceDService iAdsMatHyxtStampTaxContractInvoiceDService;
+
+    @ApiOperation(value = "1【合同信息表】分页查询", notes = "分页查询")
+    @PostMapping("/queryPage")
+    public R queryPage(@RequestParam(defaultValue = "10") Long pageSize,
+                       @RequestParam(defaultValue = "1") Long pageNo,
+                       @RequestBody(required = false) AdsMatHyxtStampTaxContractD param) {
+        return R.ok(adsMatHyxtStampTaxContractDService.queryPage(pageSize, pageNo, param));
+    }
+
+    @ApiOperation(value = "导出")
+    @PostMapping("/dataExport")
+    public void dataExport(@RequestBody(required = false) AdsMatHyxtStampTaxContractD param, HttpServletResponse response) throws IOException {
+        InputStream fis = null;
+        OutputStream ops = null;
+
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("utf-8");
+        String fileName = java.util.UUID.randomUUID() + ".xlsx";
+        response.setHeader("Content-disposition", "attachment;filename=" + fileName);
+        String templateFileName = "excelTemplate/stampTax/stampTaxContractExport.xlsx";
+        fis = Thread.currentThread().getContextClassLoader().getResourceAsStream(templateFileName);
+        ops = response.getOutputStream();
+        Page<AdsMatHyxtStampTaxContractD> pageResult = adsMatHyxtStampTaxContractDService.queryPage(100000L, 1L, param);
+        List<AdsMatHyxtStampTaxContractD> itemList = pageResult.getRecords();
+        int i = 0;
+        for (AdsMatHyxtStampTaxContractD itemD : itemList) {
+            i++;
+            itemD.setNo(i);
+        }
+
+        //填充导出信息
+        ExcelWriter excelWriter = EasyExcel.write(ops, AdsMatHyxtStampTaxContractD.class).withTemplate(fis).build();
+        WriteSheet writeSheet = EasyExcel.writerSheet().build();
+        FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
+        excelWriter.fill(itemList, fillConfig, writeSheet);
+        excelWriter.finish();
+    }
+
+    @ApiOperation(value = "1【合同信息表】列表查询", notes = "列表查询")
+    @PostMapping("/queryList")
+    public R queryList(@RequestBody(required = false) AdsMatHyxtStampTaxContractD param) {
+        return adsMatHyxtStampTaxContractDService.queryList(param);
+    }
+
+    @ApiOperation(value = "1【合同信息表】下载导入模板")
+    @PostMapping("/downloadTemplate")
+    public void downloadTemplate(HttpServletResponse response) {
+        adsMatHyxtStampTaxContractDService.downloadTemplate(response);
+    }
+
+    @ApiOperation(value = "合同数据导入前检查", notes = "合同数据导入前检查")
+    @PostMapping("/contractImportCheck")
+    public R contractImportCheck(@RequestParam("file") MultipartFile file, HomeStampTaxCountPO param) throws IOException {
+        Map<String, Object> result = new HashMap<>(4);
+
+        ImportExcelHelper<AdsMatHyxtStampTaxContractD> helper = new ImportExcelHelper<>();
+        List<AdsMatHyxtStampTaxContractD> list = helper.getList(file.getInputStream(), AdsMatHyxtStampTaxContractD.class, 0, 1);
+        if (list.size() == 0) {
+            result.put("isOk", 1);
+            result.put("tips", "未解析到正确数据!");
+            return R.ok(result);
+        }
+
+        String[] startAndEnd = DateUtil.getMonthStartAndEnd(param.getHomeDate());
+        LocalDate startDate = LocalDate.parse(startAndEnd[0], DateUtil.f2_2);
+        LocalDate endDate = LocalDate.parse(startAndEnd[1], DateUtil.f2_2);
+        int size = 0;
+        int totalSize = 0;
+        for (AdsMatHyxtStampTaxContractD contractD : list) {
+            totalSize++;
+            String effectiveDate = DateUtil.getDate(contractD.getEffectiveDate());
+            if (null != effectiveDate) {
+                // 判断 effectiveDate 日期是否在 startDate - endDate日期之间,如果不在size+1
+                LocalDate effective = LocalDate.parse(effectiveDate, DateUtil.f2_2);
+                if (effective.isBefore(startDate) || effective.isAfter(endDate)) {
+                    size++;
+                }
+            } else {
+                size++;
+            }
+        }
+
+        if (size > 0) {
+            result.put("isOk", 0);
+            result.put("tips", "共解析出"+totalSize+"条数据,存在"+size+"条数据,合同生效时间不在"+param.getHomeDate()+"月份中,是否确认导入?");
+        } else {
+            result.put("isOk", 0);
+            result.put("tips", "共解析出"+totalSize+"条数据,本次导入将会把"+param.getHomeDate()+"月份数据清除,是否确认导入?");
+        }
+        return R.ok(result);
+    }
+
+    @ApiOperation(value = "1【合同信息表】合同数据导入", notes = "合同数据导入")
+    @PostMapping("/contractImport")
+    public R contractImport(@RequestParam("file") MultipartFile file, HomeStampTaxCountPO param) throws IOException {
+        return adsMatHyxtStampTaxContractDService.contractImport(file, param);
+    }
+
+    @ApiOperation(value = "1【合同信息表】更新", notes = "更新")
+    @PostMapping("/update")
+    public R update(@RequestBody AdsMatHyxtStampTaxContractD contractD) {
+        return adsMatHyxtStampTaxContractDService.updateTax(contractD);
+    }
+
+    @ApiOperation(value = "1【合同信息表】删除", notes = "删除")
+    @PostMapping("/delete")
+    public R delete(@RequestBody IdsPO param) {
+        return adsMatHyxtStampTaxContractDService.deleteOne(param);
+    }
+
+    @ApiOperation(value = "1【合同信息表】批量删除", notes = "批量删除")
+    @PostMapping("/batchDelete")
+    public R batchDelete(@RequestBody IdsPO param) {
+        return adsMatHyxtStampTaxContractDService.batchDelete(param);
+    }
+
+    @ApiOperation(value = "1【合同信息表】批量更新印花税税目", notes = "批量更新印花税税目")
+    @PostMapping("/batchUpdateStampTaxItem")
+    public R batchUpdateStampTaxItem(@RequestBody StampTaxBatchUpdateTaxItemPO param) {
+        List<String> ids = param.getIds();
+        if (ObjectUtils.isEmpty(ids) || ids.isEmpty()) {
+            return R.fail("请选择要操作的数据!");
+        }
+        return adsMatHyxtStampTaxContractDService.batchUpdateTax(param);
+    }
+
+    @ApiOperation(value = "消除预警", notes = "消除预警")
+    @PostMapping("/clearWarning")
+    public R clearWarning(@RequestBody WarningDataVo param) {
+//        adsMatHyxtStampTaxContractDService.updateIsWarning(param.getId(), 0, param.getRemark());
+        LambdaUpdateWrapper<AdsMatHyxtStampTaxContractInvoiceD> updateWrapper = Wrappers.lambdaUpdate();
+        updateWrapper.eq(AdsMatHyxtStampTaxContractInvoiceD::getId, param.getId());
+        updateWrapper.set(AdsMatHyxtStampTaxContractInvoiceD::getWarningStatusDesc, "已处理");
+        updateWrapper.set(AdsMatHyxtStampTaxContractInvoiceD::getWarningRemark, param.getRemark());
+        Boolean updateFlag = iAdsMatHyxtStampTaxContractInvoiceDService.update(updateWrapper);
+        if(!updateFlag){
+            return R.fail("操作失败请刷新重试");
+        }else {
+            List<String> ids = iAdsMatHyxtStampTaxContractInvoiceDService.findContractIdByStatu();
+            if(ids!=null && ids.size()>0){
+                UpdateWrapper<AdsMatHyxtStampTaxContractD> uWrapper = new UpdateWrapper<>();
+                uWrapper.notIn("id",ids);
+                uWrapper.set("is_warning",0);
+                uWrapper.set("warning_status_desc","已处理");
+                adsMatHyxtStampTaxContractDService.update(uWrapper);
+
+            }
+        }
+        return R.ok();
+    }
+
+}

+ 21 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/stamp/tax/AdsMatHyxtStampTaxContractInvoiceDController.java

@@ -0,0 +1,21 @@
+package com.ruoyi.hywz.controller.stamp.tax;
+
+import io.swagger.annotations.Api;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 合同/发票预警信息表 前端控制器
+ * </p>
+ *
+ * @author mybatisplus-generator
+ * @date 2024-09-12 18:01:36
+ */
+@RestController
+@RequestMapping("adsMatHyxtStampTaxContractInvoiceD")
+@Api(value = "adsMatHyxtStampTaxContractInvoiceD", tags = "合同/发票预警信息表")
+public class AdsMatHyxtStampTaxContractInvoiceDController {
+
+
+}

+ 226 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/stamp/tax/AdsMatHyxtStampTaxInvoiceDController.java

@@ -0,0 +1,226 @@
+package com.ruoyi.hywz.controller.stamp.tax;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.metadata.fill.FillConfig;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.hywz.common.constants.StampWarningCheckRule;
+import com.ruoyi.hywz.common.enums.StampBusinessTypeEnum;
+import com.ruoyi.hywz.entity.AdsMatHyxtStampTaxContractD;
+import com.ruoyi.hywz.entity.AdsMatHyxtStampTaxContractInvoiceD;
+import com.ruoyi.hywz.entity.AdsMatHyxtStampTaxInvoiceD;
+import com.ruoyi.hywz.entity.po.HomeStampTaxCountPO;
+import com.ruoyi.hywz.entity.po.IdsPO;
+import com.ruoyi.hywz.entity.po.StampTaxBatchUpdateBusinessTypePO;
+import com.ruoyi.hywz.entity.vo.stamp.tax.WarningDataVo;
+import com.ruoyi.hywz.listener.ImportExcelHelper;
+import com.ruoyi.hywz.service.IAdsMatHyxtStampTaxContractInvoiceDService;
+import com.ruoyi.hywz.service.IAdsMatHyxtStampTaxInvoiceDService;
+import com.ruoyi.hywz.utils.DateUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.time.LocalDate;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 发票信息表 前端控制器
+ * </p>
+ *
+ * @author mybatisplus-generator
+ * @date 2024-07-14 10:07:56
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("adsMatHyxtStampTaxInvoiceD")
+@Api(value = "adsMatHyxtStampTaxInvoiceD", tags = "印花税项目")
+public class AdsMatHyxtStampTaxInvoiceDController {
+
+    private final IAdsMatHyxtStampTaxInvoiceDService adsMatHyxtStampTaxInvoiceDService;
+    private final IAdsMatHyxtStampTaxContractInvoiceDService iAdsMatHyxtStampTaxContractInvoiceDService;
+
+    @ApiOperation(value = "2【发票信息表】分页查询", notes = "分页查询")
+    @PostMapping("/queryPage")
+    public R queryPage(@RequestParam(defaultValue = "10") Long pageSize,
+                       @RequestParam(defaultValue = "1") Long pageNo,
+                       @RequestBody(required = false) AdsMatHyxtStampTaxInvoiceD param) {
+        return R.ok(adsMatHyxtStampTaxInvoiceDService.queryPage(pageSize, pageNo, param));
+    }
+
+    @ApiOperation(value = "导出")
+    @PostMapping("/dataExport")
+    public void dataExport(@RequestBody(required = false) AdsMatHyxtStampTaxInvoiceD param, HttpServletResponse response) throws IOException {
+        InputStream fis = null;
+        OutputStream ops = null;
+
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("utf-8");
+        String fileName = java.util.UUID.randomUUID() + ".xlsx";
+        response.setHeader("Content-disposition", "attachment;filename=" + fileName);
+        String templateFileName = "excelTemplate/stampTax/stampTaxInvoiceExport.xlsx";
+        fis = Thread.currentThread().getContextClassLoader().getResourceAsStream(templateFileName);
+        ops = response.getOutputStream();
+        Page<AdsMatHyxtStampTaxInvoiceD> pageResult = adsMatHyxtStampTaxInvoiceDService.queryPage(100000L, 1L, param);
+        List<AdsMatHyxtStampTaxInvoiceD> itemList = pageResult.getRecords();
+        int i = 0;
+        for (AdsMatHyxtStampTaxInvoiceD itemD : itemList) {
+            i++;
+            itemD.setNo(i);
+            if(StringUtils.isNotEmpty(itemD.getBusinessType())){
+                itemD.setYhssm(StampWarningCheckRule.getFpMapType().get(itemD.getBusinessType()));
+            }
+        }
+
+        //填充导出信息
+        ExcelWriter excelWriter = EasyExcel.write(ops, AdsMatHyxtStampTaxInvoiceD.class).withTemplate(fis).build();
+        WriteSheet writeSheet = EasyExcel.writerSheet().build();
+        FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
+        excelWriter.fill(itemList, fillConfig, writeSheet);
+        excelWriter.finish();
+    }
+
+    @ApiOperation(value = "2【发票信息表】分页查询", notes = "分页查询")
+    @PostMapping("/queryList")
+    public R queryList(@RequestBody(required = false) AdsMatHyxtStampTaxInvoiceD param) {
+        return adsMatHyxtStampTaxInvoiceDService.queryList(param);
+    }
+
+    @ApiOperation(value = "2【发票信息表】下载导入模板")
+    @PostMapping("/downloadTemplate")
+    public void downloadTemplate(HttpServletResponse response) {
+        adsMatHyxtStampTaxInvoiceDService.downloadTemplate(response);
+    }
+
+    @ApiOperation(value = "发票数据导入前检查", notes = "发票数据导入前检查")
+    @PostMapping("/invoiceImportCheck")
+    public R invoiceImport(@RequestParam("file") MultipartFile file, HomeStampTaxCountPO param) throws IOException {
+        Map<String, Object> result = new HashMap<>(4);
+
+        ImportExcelHelper<AdsMatHyxtStampTaxInvoiceD> helper = new ImportExcelHelper<>();
+        List<AdsMatHyxtStampTaxInvoiceD> list = helper.getList(file.getInputStream(), AdsMatHyxtStampTaxInvoiceD.class, 0, 1);
+        if (list.size() == 0) {
+            result.put("isOk", 1);
+            result.put("tips", "未解析到正确数据!");
+            return R.ok(result);
+        }
+
+        String[] startAndEnd = DateUtil.getMonthStartAndEnd(param.getHomeDate());
+        LocalDate startDate = LocalDate.parse(startAndEnd[0], DateUtil.f2_2);
+        LocalDate endDate = LocalDate.parse(startAndEnd[1], DateUtil.f2_2);
+        int size = 0;
+        int totalSize = 0;
+        for (AdsMatHyxtStampTaxInvoiceD contractD : list) {
+            totalSize++;
+            String makeDate = DateUtil.getFormat(contractD.getMakeDate(), DateUtil.f2);
+            if (null != makeDate) {
+                // 判断 mkDate 日期是否在 startDate - endDate日期之间,如果不在size+1
+                LocalDate mkDate = LocalDate.parse(makeDate, DateUtil.f2_2);
+                if (mkDate.isBefore(startDate) || mkDate.isAfter(endDate)) {
+                    size++;
+                }
+            } else {
+                size++;
+            }
+        }
+
+        if (size > 0) {
+            result.put("isOk", 0);
+            result.put("tips", "共解析出"+totalSize+"条数据,存在"+size+"条数据,开票日期不在"+param.getHomeDate()+"月份中,是否确认导入?");
+        } else {
+            result.put("isOk", 0);
+            result.put("tips", "共解析出"+totalSize+"条数据,本次导入将会把"+param.getHomeDate()+"月份数据清除,是否确认导入?");
+        }
+        return R.ok(result);
+    }
+
+    @ApiOperation(value = "2【发票信息表】发票数据导入", notes = "发票数据导入")
+    @PostMapping("/invoiceImport")
+    public R contractImport(@RequestParam("file") MultipartFile file, HomeStampTaxCountPO param) throws IOException {
+        return adsMatHyxtStampTaxInvoiceDService.invoiceImport(file, param);
+    }
+
+    @ApiOperation(value = "2【发票信息表】更新", notes = "更新")
+    @PostMapping("/update")
+    public R update(@RequestBody AdsMatHyxtStampTaxInvoiceD contractD) {
+        contractD.setUpdateTime(new Date());
+        adsMatHyxtStampTaxInvoiceDService.updateById(contractD);
+        return R.ok();
+    }
+
+    @ApiOperation(value = "2【发票信息表】删除", notes = "删除")
+    @PostMapping("/delete")
+    public R delete(@RequestBody IdsPO param) {
+        return adsMatHyxtStampTaxInvoiceDService.deleteOne(param);
+    }
+
+    @ApiOperation(value = "2【发票信息表】批量删除", notes = "批量删除")
+    @PostMapping("/batchDelete")
+    public R batchDelete(@RequestBody IdsPO param) {
+        return adsMatHyxtStampTaxInvoiceDService.batchDelete(param);
+    }
+
+    @ApiOperation(value = "2【发票信息表】业务类型列表", notes = "业务类型列表")
+    @PostMapping("/businessTypeList")
+    public R businessTypeList() {
+        return R.ok(StampBusinessTypeEnum.getList());
+    }
+
+    @ApiOperation(value = "1【发票信息表】更新", notes = "更新")
+    @PostMapping("/updateBusinessType")
+    public R updateBusinessType(@RequestBody AdsMatHyxtStampTaxInvoiceD invoiceD) {
+        return adsMatHyxtStampTaxInvoiceDService.updateBusinessType(invoiceD);
+    }
+
+    @ApiOperation(value = "2【发票信息表】批量更新业务类型", notes = "批量更新业务类型")
+    @PostMapping("/batchUpdateBusinessType")
+    public R batchUpdateBusinessType(@RequestBody StampTaxBatchUpdateBusinessTypePO param) {
+        List<String> ids = param.getIds();
+        if (ObjectUtils.isEmpty(ids) || ids.isEmpty()) {
+            return R.fail("请选择要操作的数据!");
+        }
+        return adsMatHyxtStampTaxInvoiceDService.batchUpdateBusinessType(param);
+    }
+
+    @ApiOperation(value = "消除预警", notes = "消除预警")
+    @PostMapping("/clearWarning")
+    public R clearWarning(@RequestBody WarningDataVo param) {
+//        adsMatHyxtStampTaxInvoiceDService.updateIsWarning(param.getId(), 0, param.getRemark());
+        LambdaUpdateWrapper<AdsMatHyxtStampTaxContractInvoiceD> updateWrapper = Wrappers.lambdaUpdate();
+        updateWrapper.eq(AdsMatHyxtStampTaxContractInvoiceD::getId, param.getId());
+        updateWrapper.set(AdsMatHyxtStampTaxContractInvoiceD::getWarningStatusDesc, "已处理");
+        updateWrapper.set(AdsMatHyxtStampTaxContractInvoiceD::getWarningRemark, param.getRemark());
+        Boolean updateFlag = iAdsMatHyxtStampTaxContractInvoiceDService.update(updateWrapper);
+        if(!updateFlag){
+            return R.fail("请勿重复操作,请刷新页面后再试!");
+        }else {
+            List<String> ids2 = iAdsMatHyxtStampTaxContractInvoiceDService.findInvoiceIdByStatu();
+            if(ids2!=null && ids2.size()>0){
+                UpdateWrapper<AdsMatHyxtStampTaxInvoiceD> uWrapper2 = new UpdateWrapper<>();
+                uWrapper2.notIn("id",ids2);
+                uWrapper2.set("is_warning",0);
+                uWrapper2.set("warning_status_desc","已处理");
+                adsMatHyxtStampTaxInvoiceDService.update(uWrapper2);
+            }
+        }
+        return R.ok();
+    }
+
+}

+ 37 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/stamp/tax/AdsMatHyxtStampTaxItemDController.java

@@ -0,0 +1,37 @@
+package com.ruoyi.hywz.controller.stamp.tax;
+
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.hywz.entity.AdsMatHyxtStampTaxItemD;
+import com.ruoyi.hywz.service.IAdsMatHyxtStampTaxItemDService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 印花税类目表 前端控制器
+ * </p>
+ *
+ * @author mybatisplus-generator
+ * @date 2024-07-15 15:29:08
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("adsMatHyxtStampTaxItemD")
+@Api(value = "adsMatHyxtStampTaxItemD", tags = "印花税项目")
+public class AdsMatHyxtStampTaxItemDController {
+
+    private final IAdsMatHyxtStampTaxItemDService adsMatHyxtStampTaxItemDService;
+
+    @ApiOperation(value = "印花税类目", notes = "印花税类目")
+    @PostMapping("/queryList")
+    public R<List<AdsMatHyxtStampTaxItemD>> queryList() {
+        return R.ok(adsMatHyxtStampTaxItemDService.getList(true));
+    }
+
+}

+ 195 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/stamp/tax/AdsMatHyxtStampTaxWarningDController.java

@@ -0,0 +1,195 @@
+package com.ruoyi.hywz.controller.stamp.tax;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.metadata.fill.FillConfig;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.hywz.common.enums.StampBusinessTypeEnum;
+import com.ruoyi.hywz.common.enums.StampWarningTypeEnum;
+import com.ruoyi.hywz.entity.*;
+import com.ruoyi.hywz.entity.vo.stamp.tax.WarningDataVo;
+import com.ruoyi.hywz.entity.vo.stamp.tax.WarningRule1Vo;
+import com.ruoyi.hywz.entity.vo.stamp.tax.WarningRule2Vo;
+import com.ruoyi.hywz.service.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * 【印花税】预警表 前端控制器
+ * </p>
+ *
+ * @author mybatisplus-generator
+ * @date 2024-07-17 16:58:32
+ */
+@RestController
+@RequestMapping("adsMatHyxtStampTaxWarningD")
+@AllArgsConstructor
+@Api(value = "adsMatHyxtStampTaxWarningD", tags = "印花税项目")
+public class AdsMatHyxtStampTaxWarningDController {
+
+    private final IAdsMatHyxtStampTaxWarningDService adsMatHyxtStampTaxWarningDService;
+    private final IAdsMatHyxtStampTaxWarningRuleDService adsMatHyxtStampTaxWarningRuleDService;
+    private final IAdsMatHyxtStampTaxContractDService adsMatHyxtStampTaxContractDService;
+    private final IAdsMatHyxtStampTaxInvoiceDService adsMatHyxtStampTaxInvoiceDService;
+
+
+    /**
+     * 合同/发票预警
+     */
+    private final IAdsMatHyxtStampTaxContractInvoiceDService adsMatHyxtStampTaxContractInvoiceDService;
+
+//    @ApiOperation(value = "3【预警表】分页查询", notes = "分页查询")
+//    @Deprecated
+//    @PostMapping("/queryPage")
+//    public R queryPage(@RequestParam(defaultValue = "10") Long pageSize,
+//                       @RequestParam(defaultValue = "1") Long pageNo,
+//                       @RequestBody(required = false) AdsMatHyxtStampTaxWarningD param) {
+//        return R.ok(adsMatHyxtStampTaxWarningDService.queryPage(pageSize, pageNo, param));
+//    }
+
+//    @ApiOperation(value = "3【预警表】消除预警", notes = "消除预警")
+//    @PostMapping("/delWarning")
+//    public R delWarning(@RequestBody AdsMatHyxtStampTaxWarningD param) {
+//        AdsMatHyxtStampTaxWarningD warningD = adsMatHyxtStampTaxWarningDService.getById(param.getId());
+//        if (ObjectUtils.isNotEmpty(warningD) && StringUtils.isNotBlank(warningD.getId())) {
+//            warningD.setRemark(param.getRemark());
+//            warningD.setUpdateTime(new Date());
+//            warningD.setWarningType("");
+//            warningD.setStatus(1);
+//            adsMatHyxtStampTaxWarningDService.updateById(warningD);
+//
+//            adsMatHyxtStampTaxWarningDService.clearWarningByData(warningD);
+//        }
+//        return R.ok();
+//    }
+
+    @ApiOperation(value = "预警列表", notes = "预警列表")
+    @PostMapping("/queryWarningList")
+    public R queryWarningList(@RequestBody(required = false) AdsMatHyxtStampTaxWarningD param) {
+        Integer sourceType = param.getSourceType();
+        List<WarningDataVo> result = new ArrayList<>();
+        WarningDataVo vo = new WarningDataVo();
+        if (sourceType == 0) {
+            AdsMatHyxtStampTaxContractD contractD = adsMatHyxtStampTaxContractDService.getById(param.getId());
+            if (ObjectUtils.isNotEmpty(contractD)) {
+                vo.setId(contractD.getId());
+                vo.setSourceType(sourceType);
+                vo.setWarningLevel(contractD.getWarningLevel());
+                AdsMatHyxtStampTaxWarningRuleD ruleD = adsMatHyxtStampTaxWarningRuleDService.getByWarningType(contractD.getWarningType());
+                if (null != ruleD) {
+                    vo.setCheckGist(ruleD.getRule());
+                    vo.setContent(ruleD.getDescription());
+                }
+                vo.setRemark(contractD.getWarningRemark());
+                vo.setStatusDesc(contractD.getWarningStatusDesc());
+                vo.setCreateTime(contractD.getWarningTime());
+            }
+            result.add(vo);
+        } else {
+            AdsMatHyxtStampTaxInvoiceD invoiceD = adsMatHyxtStampTaxInvoiceDService.getById(param.getId());
+            vo.setId(invoiceD.getId());
+            vo.setSourceType(sourceType);
+            vo.setWarningLevel(invoiceD.getWarningLevel());
+            AdsMatHyxtStampTaxWarningRuleD ruleD = adsMatHyxtStampTaxWarningRuleDService.getByWarningType(invoiceD.getWarningType());
+            if (null != ruleD) {
+                vo.setCheckGist(ruleD.getRule());
+                vo.setContent(ruleD.getDescription());
+            }
+            vo.setRemark(invoiceD.getWarningRemark());
+            vo.setStatusDesc(invoiceD.getWarningStatusDesc());
+            vo.setCreateTime(invoiceD.getWarningTime());
+            result.add(vo);
+        }
+        return R.ok(result);
+    }
+
+
+    @ApiOperation(value = "合同/发票信息", notes = "合同/发票信息")
+    @PostMapping("/queryWarningListNew")
+    public R queryWarningListNew(@RequestBody(required = false) AdsMatHyxtStampTaxContractInvoiceD param) {
+
+
+        List<AdsMatHyxtStampTaxContractInvoiceD> contractInvoiceDS = adsMatHyxtStampTaxContractInvoiceDService.queryWarningListNew(param);
+
+
+        return R.ok(contractInvoiceDS);
+    }
+
+    @ApiOperation(value = "3【预警表】风险规则清单", notes = "风险规则清单")
+    @PostMapping("/warningList")
+    public R warningList() {
+        return R.ok(adsMatHyxtStampTaxWarningRuleDService.getList());
+    }
+
+    @ApiOperation(value = "3【预警表】风险规则清单", notes = "风险规则清单")
+    @PostMapping("/warningRule")
+    public R warningRule() {
+        return R.ok(adsMatHyxtStampTaxWarningRuleDService.getList());
+    }
+
+    @ApiOperation(value = "3【预警表】风险规则清单2", notes = "风险规则清单2")
+    @PostMapping("/warningRule1")
+    public R warningRule1() {
+        List<WarningRule1Vo> result = new ArrayList<>();
+        result.add(new WarningRule1Vo("印花税应税合同税目选择不准确,少缴错缴印花税风险", "印花税"));
+        result.add(new WarningRule1Vo("印花税计税依据不准确,少缴多缴印花税风险", "印花税"));
+        result.add(new WarningRule1Vo("福利支出进项税额未足额转出风险", "增值税"));
+        result.add(new WarningRule1Vo("劳务报酬个人所得税未足额代扣代缴风险", "个人所得税"));
+        return R.ok(result);
+    }
+
+    @ApiOperation(value = "3【预警表】风险规则清单2", notes = "风险规则清单2")
+    @PostMapping("/warningRule2")
+    public R warningRule2() {
+        List<WarningRule2Vo> result = new ArrayList<>();
+        result.add(new WarningRule2Vo("强控","阻断","红色高亮,流程无法继续"));
+        result.add(new WarningRule2Vo("弱控","预警","黄色高亮,需人工核实反馈"));
+        return R.ok(result);
+    }
+
+    @ApiOperation(value = "导出")
+    @PostMapping("/dataExport")
+    public void dataExport(@RequestBody(required = false) AdsMatHyxtStampTaxWarningRuleD param, HttpServletResponse response) throws IOException {
+        // id字段必传
+        String id = param.getId();
+        AdsMatHyxtStampTaxWarningRuleD ruleD = adsMatHyxtStampTaxWarningRuleDService.getById(id);
+        if (null != ruleD) {
+            Integer type = ruleD.getSourceType();
+            if (type == 0) {
+                // 导合同数据
+                adsMatHyxtStampTaxContractDService.exportData(ruleD.getWarningType(), response);
+            } else {
+                // 导发票数据
+                adsMatHyxtStampTaxInvoiceDService.exportData(ruleD.getWarningType(), response);
+            }
+        }
+    }
+
+    @ApiOperation(value = "", notes = "")
+    @PostMapping("/warningType1")
+    public R warningType1() {
+        return R.ok(StampWarningTypeEnum.getList1());
+    }
+
+    @ApiOperation(value = "", notes = "")
+    @PostMapping("/warningType2")
+    public R warningType2() {
+        return R.ok(StampWarningTypeEnum.getList2());
+    }
+}

+ 104 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/controller/stamp/tax/AdsMatHyxtStampTaxZhptInvoiceDController.java

@@ -0,0 +1,104 @@
+package com.ruoyi.hywz.controller.stamp.tax;
+
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.hywz.entity.AdsMatHyxtStampTaxZhptInvoiceD;
+import com.ruoyi.hywz.entity.AdsMatHyxtStampTaxZhptInvoiceItemD;
+import com.ruoyi.hywz.entity.po.IdsPO;
+import com.ruoyi.hywz.service.IAdsMatHyxtStampTaxZhptInvoiceDService;
+import com.ruoyi.hywz.service.IAdsMatHyxtStampTaxZhptInvoiceItemDService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * <p>
+ * 【印花税】【智慧平台】发票信息表 前端控制器
+ * </p>
+ *
+ * @author mybatisplus-generator
+ * @date 2024-08-23 11:15:50
+ */
+@RestController
+@RequestMapping("adsMatHyxtStampTaxZhptInvoiceD")
+@AllArgsConstructor
+@Api(value = "adsMatHyxtStampTaxZhptInvoiceD", tags = "【印花税】【智慧平台】发票信息表")
+public class AdsMatHyxtStampTaxZhptInvoiceDController {
+
+    private final IAdsMatHyxtStampTaxZhptInvoiceDService adsMatHyxtStampTaxZhptInvoiceDService;
+    private final IAdsMatHyxtStampTaxZhptInvoiceItemDService adsMatHyxtStampTaxZhptInvoiceItemDService;
+
+
+    @ApiOperation(value = "分页查询", notes = "分页查询")
+    @PostMapping("/queryPage")
+    public R queryPage(@RequestParam(defaultValue = "10") Long pageSize,
+                       @RequestParam(defaultValue = "1") Long pageNo,
+                       @RequestBody(required = false) AdsMatHyxtStampTaxZhptInvoiceD param) {
+        return R.ok(adsMatHyxtStampTaxZhptInvoiceDService.queryPage(pageSize, pageNo, param));
+    }
+
+    @ApiOperation(value = "下载导入模板")
+    @PostMapping("/downloadTemplate")
+    public void downloadTemplate(HttpServletResponse response) {
+        adsMatHyxtStampTaxZhptInvoiceDService.downloadTemplate(response);
+    }
+
+    @ApiOperation(value = "数据导入")
+    @PostMapping("/importData")
+    public R importData(@RequestParam("file") MultipartFile file) throws IOException {
+        return adsMatHyxtStampTaxZhptInvoiceDService.importData(file);
+    }
+
+    @ApiOperation(value = "删除")
+    @PostMapping("/delete")
+    public R delete(@RequestBody IdsPO param) {
+        adsMatHyxtStampTaxZhptInvoiceDService.deleteOne(param);
+        return R.ok();
+    }
+
+    @ApiOperation(value = "批量删除")
+    @PostMapping("/batchDelete")
+    public R batchDelete(@RequestBody IdsPO param) {
+        List<String> ids = param.getIds();
+        if (ObjectUtils.isEmpty(ids) || ids.isEmpty()) {
+            return R.fail("请选择要删除的数据!");
+        }
+        adsMatHyxtStampTaxZhptInvoiceDService.batchDelete(param);
+        return R.ok();
+    }
+
+    @ApiOperation(value = "明细查询", notes = "明细查询")
+    @PostMapping("/item/list")
+    public R itemList(@RequestBody(required = false) AdsMatHyxtStampTaxZhptInvoiceItemD param) {
+        return R.ok(adsMatHyxtStampTaxZhptInvoiceItemDService.queryList(param));
+    }
+
+    @ApiOperation(value = "下载导入模板")
+    @PostMapping("/item/downloadTemplate")
+    public void itemDownloadTemplate(HttpServletResponse response) {
+        adsMatHyxtStampTaxZhptInvoiceItemDService.downloadTemplate(response);
+    }
+
+    @ApiOperation(value = "数据导入")
+    @PostMapping("/item/importData")
+    public R itemImportData(@RequestParam("file") MultipartFile file, @RequestParam("invoiceId") String invoiceId) throws IOException {
+        return adsMatHyxtStampTaxZhptInvoiceItemDService.importData(file, invoiceId);
+    }
+
+    @ApiOperation(value = "批量删除")
+    @PostMapping("/item/batchDelete")
+    public R itemBatchDelete(@RequestBody IdsPO param) {
+        List<String> ids = param.getIds();
+        if (ObjectUtils.isEmpty(ids) || ids.isEmpty()) {
+            return R.fail("请选择要删除的数据!");
+        }
+        adsMatHyxtStampTaxZhptInvoiceItemDService.batchDelete(param);
+        return R.ok();
+    }
+}

+ 201 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtInvoiceApplyD.java

@@ -0,0 +1,201 @@
+package com.ruoyi.hywz.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * <p>
+ * 发票申请单据表
+ * </p>
+ *
+ * @author mybatisplus-generator
+ * @date 2024-04-08 17:32:06
+ */
+@Data
+public class AdsMatHyxtInvoiceApplyD implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.ASSIGN_UUID)
+    @ApiModelProperty(value = "主键ID")
+    private String id;
+
+    /**
+     * 申请编号
+     */
+    @ApiModelProperty(value = "申请编号")
+    private String appNo;
+
+    /**
+     * 发票数量
+     */
+    @ApiModelProperty(value = "发票数量")
+    private Integer invoiceNum;
+
+    /**
+     * 创建用户id
+     */
+    @ApiModelProperty(value = "创建用户id")
+    private Long createUserId;
+
+    /**
+     * 创建用户账号
+     */
+    @ApiModelProperty(value = "创建用户账号")
+    private String createUser;
+
+    /**
+     * 创建用户昵称
+     */
+    @ApiModelProperty(value = "创建用户昵称")
+    private String createUserName;
+
+    /**
+     * 创建用户手机号
+     */
+    @ApiModelProperty(value = "创建用户手机号")
+    private String createUserPhone;
+
+    /**
+     * 创建用户单位
+     */
+    @ApiModelProperty(value = "创建用户单位")
+    private String createUserOrgNo;
+
+    /**
+     * 创建用户单位
+     */
+    @ApiModelProperty(value = "创建用户单位")
+    private String createUserOrgName;
+
+    /**
+     * 流程状态【-1驳回 0未提交 1已申请 2已审核 3已开票 4已报销】
+     */
+    @ApiModelProperty(value = "流程状态【-1驳回 0未提交 1已申请 2已审核 3已开票 4已报销】")
+    private Integer status;
+
+    /**
+     * 当前节点
+     */
+    @ApiModelProperty(value = "当前节点")
+    private Integer currentNode;
+
+    /**
+     * 节点标签
+     */
+    @ApiModelProperty(value = "节点标签")
+    private String nodeLabel;
+
+    /**
+     * 当前审核人
+     */
+    @ApiModelProperty(value = "当前审核人")
+    private String currentAuditUser;
+
+    /**
+     * 当前审核人
+     */
+    @ApiModelProperty(value = "当前审核人")
+    private String currentAuditUserName;
+
+    /**
+     * 当前审核人
+     */
+    @ApiModelProperty(value = "当前审核人")
+    private String currentAuditUserPhone;
+
+    /**
+     * 业务审核人员
+     */
+    @ApiModelProperty(value = "业务审核人员")
+    private String auditUser1;
+
+    /**
+     * 财务审核人员
+     */
+    @ApiModelProperty(value = "财务审核人员")
+    private String auditUser2;
+
+    /**
+     * 财务确认人员
+     */
+    @ApiModelProperty(value = "财务确认人员")
+    private String auditUser3;
+
+    /**
+     * 开票上传人员
+     */
+    @ApiModelProperty(value = "开票上传人员")
+    private String auditUser4;
+
+    /**
+     * 接收发票人员
+     */
+    @ApiModelProperty(value = "接收发票人员")
+    private String auditUser5;
+
+    /**
+     * 财务入账人员
+     */
+    @ApiModelProperty(value = "财务入账人员")
+    private String auditUser6;
+
+    /**
+     * 是否接收发票【0未接收 1已接收】
+     */
+    @ApiModelProperty(value = "是否接收发票【0未接收 1已接收】")
+    private Integer isReceiptInvoice;
+
+    /**
+     * 是否接收报账【0未接收 1已接收】
+     */
+    @ApiModelProperty(value = "是否接收报账【0未接收 1已接收】")
+    private Integer isReceiptBz;
+
+    /**
+     * 提交审核时间
+     */
+    @ApiModelProperty(value = "提交审核时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date commitAuditTime;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty(value = "更新时间",hidden = true)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updateTime;
+
+    /**
+     * 是否删除【0未删除 1已删除】
+     */
+    @ApiModelProperty(value = "是否删除【0未删除 1已删除】",hidden = true)
+    private Integer isDeleted;
+
+    /**
+     * 每月20号之后是否拥有提交权限【0无 1有】
+     */
+    @ApiModelProperty(value = "每月20号之后是否拥有提交权限【0无 1有】")
+    @TableField(exist = false)
+    private Integer haveCommitPermission;
+
+
+}

+ 249 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtInvoiceD.java

@@ -0,0 +1,249 @@
+package com.ruoyi.hywz.entity;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * <p>
+ * 发票表
+ * </p>
+ *
+ * @author mybatisplus-generator
+ * @date 2024-04-08 14:25:45
+ */
+@Data
+public class AdsMatHyxtInvoiceD implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableField(exist = false)
+    private List<AdsMatHyxtInvoiceD> ids;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.ASSIGN_UUID)
+    @ApiModelProperty(value = "主键ID")
+    private String id;
+
+    /**
+     * 批次号
+     */
+    @ApiModelProperty(value = "批次号", hidden = true)
+    private String batchNo;
+
+    /**
+     * 单据id
+     */
+    @ApiModelProperty(value = "单据id", hidden = true)
+    private String applyId;
+
+    /**
+     * 项目编号
+     */
+    @ApiModelProperty(value = "项目编号")
+    private String projectNo;
+
+    /**
+     * 项目名称
+     */
+    @ApiModelProperty(value = "项目名称")
+    private String projectName;
+
+    /**
+     * 产业项目编码
+     */
+    @ApiModelProperty(value = "产业项目编码")
+    private String ynProjectNo;
+
+    /**
+     * 产业项目名称
+     */
+    @ApiModelProperty(value = "产业项目名称")
+    private String ynProjectName;
+
+    /**
+     * 销售方
+     */
+    @ApiModelProperty(value = "销售方")
+    private String seller;
+
+    /**
+     * 购买方
+     */
+    @ApiModelProperty(value = "购买方")
+    private String buyer;
+
+    /**
+     * 费用类型
+     */
+    @ApiModelProperty(value = "费用类型")
+    private String costType;
+
+    /**
+     * 合同金额
+     */
+    @ApiModelProperty(value = "合同金额")
+    private String contractAmount;
+
+    /**
+     * 可用预算金额
+     */
+    @ApiModelProperty(value = "可用预算金额")
+    private String validBudgetAmount;
+
+    /**
+     * 申请单分类【项目类 非项目类】
+     */
+    @ApiModelProperty(value = "申请单分类【项目类 非项目类】")
+    private String applyType;
+
+    /**
+     * 金额(含税)
+     */
+    @ApiModelProperty(value = "本次开票金额(含税)")
+    private String taxAmount;
+
+    /**
+     * 税率
+     */
+    @ApiModelProperty(value = "税率")
+    private String taxRate;
+
+    /**
+     * 收票人(业务人员)
+     */
+    @ApiModelProperty(value = "收票人(业务人员)")
+    private String taker;
+
+    /**
+     * 收票单位(部门)
+     */
+    @ApiModelProperty(value = "收票单位(部门)")
+    private String takerUnit;
+
+    /**
+     * 联系电话
+     */
+    @ApiModelProperty(value = "联系电话")
+    private String telephone;
+
+    /**
+     * 申请日期
+     */
+    @ApiModelProperty(value = "申请日期")
+//    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private String applyDate;
+
+    /**
+     * 发票代码
+     */
+    @ApiModelProperty(value = "发票代码")
+    private String invoiceCode;
+
+    /**
+     * 开票日期
+     */
+    @ApiModelProperty(value = "开票日期")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date makeInvoiceDate;
+
+    /**
+     * 主业入账凭证号
+     */
+    @ApiModelProperty(value = "主业入账凭证号")
+    private String voucherCode;
+
+    /**
+     * 产业入账凭证号
+     */
+    @ApiModelProperty(value = "产业入账凭证号")
+    private String ynVoucherCode;
+
+    /**
+     * 是否生成入账凭证号【0未生成 1已生成】
+     */
+    @ApiModelProperty(value = "是否生成入账凭证号【0未生成 1已生成】")
+    private Integer isGenerateCode;
+
+    /**
+     * 流程状态【0未提交 1已申请 2已审核 3已开票 4已报销】
+     */
+    @ApiModelProperty(value = "流程状态【0未提交 1已申请 2已审核 3已开票 4已报销】", hidden = true)
+    private Integer status;
+
+    /**
+     * 稽核结果【0默认值 1通过 2不通过】
+     */
+    @ApiModelProperty(value = "稽核结果【0默认值 1通过 2不通过】", hidden = true)
+    private Integer budgetCheckStatus;
+
+    /**
+     * 是否上传发票【0未上传 1已上传】
+     */
+    @ApiModelProperty(value = "是否上传发票【0未上传 1已上传】")
+    private Integer isUploadInvoice;
+
+    /**
+     * 创建用户id
+     */
+    @ApiModelProperty(value = "创建用户id", hidden = true)
+    private Long createUserId;
+
+    /**
+     * 创建用户账号
+     */
+    @ApiModelProperty(value = "创建用户账号", hidden = true)
+    private String createUser;
+
+    /**
+     * 创建用户昵称
+     */
+    @ApiModelProperty(value = "创建用户昵称", hidden = true)
+    private String createUserName;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间", hidden = true)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty(value = "更新时间", hidden = true)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updateTime;
+
+    /**
+     * 是否删除【0未删除 1已删除】
+     */
+    @ApiModelProperty(value = "是否删除【0未删除 1已删除】", hidden = true)
+    private Integer isDeleted;
+
+    @ApiModelProperty("附件")
+    @TableField(exist = false)
+    private List<AdsMatHyxtInvoiceFileD> fileList;
+
+    /**
+     * 序号
+     */
+    @ApiModelProperty("序号")
+    @TableField(exist = false)
+    private Integer idx;
+
+    @TableField(exist = false)
+    private String businessId;
+
+}

+ 94 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtInvoiceFileD.java

@@ -0,0 +1,94 @@
+package com.ruoyi.hywz.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * <p>
+ * 发票附件表
+ * </p>
+ *
+ * @author mybatisplus-generator
+ * @date 2024-04-08 14:25:45
+ */
+@Data
+public class AdsMatHyxtInvoiceFileD implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.ASSIGN_UUID)
+    @ApiModelProperty(value = "主键ID")
+    private String id;
+
+    /**
+     * 发票id
+     */
+    @ApiModelProperty(value = "发票id", hidden = true)
+    private String invoiceId;
+
+    /**
+     * 单据id
+     */
+    @ApiModelProperty(value = "单据id", hidden = true)
+    private String applyId;
+
+    /**
+     * 文件名称
+     */
+    @ApiModelProperty(value = "文件名称")
+    private String fileName;
+
+    /**
+     * 文件路径
+     */
+    @ApiModelProperty(value = "文件路径")
+    private String filePath;
+
+    /**
+     * 发票代码
+     */
+    @ApiModelProperty(value = "发票代码")
+    private String invoiceCode;
+
+    /**
+     * 开票日期
+     */
+    @ApiModelProperty(value = "开票日期")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date makeInvoiceDate;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty(value = "更新时间")
+    private Date updateTime;
+
+    /**
+     * 是否删除【0未删除 1已删除】
+     */
+    @ApiModelProperty(value = "是否删除【0未删除 1已删除】")
+    private Integer isDeleted;
+
+
+    @TableField(exist = false)
+    private String businessId;
+
+}

+ 63 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtInvoiceUserApplyPermissionD.java

@@ -0,0 +1,63 @@
+package com.ruoyi.hywz.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * <p>
+ * 用户申请权限表
+ * </p>
+ *
+ * @author mybatisplus-generator
+ * @date 2024-04-08 14:25:45
+ */
+@Data
+public class AdsMatHyxtInvoiceUserApplyPermissionD implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.ASSIGN_UUID)
+    @ApiModelProperty(value = "主键ID")
+    private String id;
+
+    /**
+     * 用户id
+     */
+    @ApiModelProperty(value = "用户id")
+    private Long userId;
+
+    /**
+     * 申请权限【0关闭 1开启】
+     */
+    @ApiModelProperty("申请权限【0关闭 1开启】")
+    private Integer applyPermission;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty(value = "更新时间")
+    private Date updateTime;
+
+    /**
+     * 是否删除【0未删除 1已删除】
+     */
+    @ApiModelProperty(value = "是否删除【0未删除 1已删除】")
+    private Integer isDeleted;
+
+
+}

+ 74 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtMoneyVoucherD.java

@@ -0,0 +1,74 @@
+package com.ruoyi.hywz.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+/**
+ * <p>
+ * 财务入账凭证信息
+ * </p>
+ *
+ * @author mybatisplus-generator
+ * @date 2024-04-19 17:21:23
+ */
+@Data
+public class AdsMatHyxtMoneyVoucherD implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.ASSIGN_UUID)
+    @ApiModelProperty(value = "主键")
+    private String id;
+
+    /**
+     * 单位
+     */
+    @ApiModelProperty(value = "单位")
+    private String unit;
+
+    /**
+     * 凭证编号
+     */
+    @ApiModelProperty(value = "凭证编号")
+    private String voucherCode;
+
+    /**
+     * 科目名称
+     */
+    @ApiModelProperty(value = "科目名称")
+    private String subjectName;
+
+    /**
+     * 借方发生额
+     */
+    @ApiModelProperty(value = "借方发生额")
+    private String jieMoney;
+
+    /**
+     * 贷方发生额
+     */
+    @ApiModelProperty(value = "贷方发生额")
+    private String daiMoney;
+
+    /**
+     * 单项工程
+     */
+    @ApiModelProperty(value = "单项工程")
+    private String singleProject;
+
+    /**
+     * 往来单位
+     */
+    @ApiModelProperty(value = "往来单位")
+    private String dealingsUnit;
+
+
+}

+ 144 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxComputeD.java

@@ -0,0 +1,144 @@
+package com.ruoyi.hywz.entity;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * <p>
+ * 【印花税】印花税计算单批次表
+ * </p>
+ *
+ * @author mybatisplus-generator
+ * @date 2024-07-29 10:21:44
+ */
+@Data
+public class AdsMatHyxtStampTaxComputeD implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.ASSIGN_UUID)
+    @ApiModelProperty(value = "主键ID")
+    private String id;
+
+    /**
+     * 纳税人名称
+     */
+    @ApiModelProperty(value = "纳税人名称")
+    private String taxPayer;
+
+    /**
+     * 所属开始日期
+     */
+    @ApiModelProperty(value = "所属开始日期")
+    private String startDate;
+
+    /**
+     * 所属结束日期
+     */
+    @ApiModelProperty(value = "所属结束日期")
+    private String endDate;
+
+    /**
+     * 金额
+     */
+    @ApiModelProperty(value = "金额")
+    private String amount;
+
+    /**
+     * 取数金额
+     */
+    @ApiModelProperty(value = "取数金额")
+    private String taxAmount;
+
+    /**
+     * 审核状态【-1驳回 0未提交 1审核中 2审核通过】
+     */
+    @ApiModelProperty(value = "审核状态【-1驳回 0未提交 1审核中 2审核通过】")
+    private Integer auditStatus;
+
+    /**
+     * 状态【0正常 1作废】
+     */
+    @ApiModelProperty(value = "状态【0正常 1作废】")
+    private Integer status;
+
+    /**
+     * 年月(2024-06)
+     */
+    @ApiModelProperty(value = "年月(2024-06)")
+    private String ym;
+
+    /**
+     * 财务主管审核
+     */
+    @ApiModelProperty(value = "财务主管审核")
+    private String auditUser;
+
+    /**
+     * 创建用户id
+     */
+    @ApiModelProperty(value = "创建用户id")
+    private Long createUserId;
+
+    /**
+     * 创建用户账号
+     */
+    @ApiModelProperty(value = "创建用户账号")
+    private String createUser;
+
+    /**
+     * 创建用户昵称
+     */
+    @ApiModelProperty(value = "创建用户昵称")
+    private String createUserName;
+
+    /**
+     * 创建用户所在单位编号
+     */
+    @ApiModelProperty(value = "创建用户所在单位编号")
+    @ExcelIgnore
+    private String createUserOrgNo;
+
+    /**
+     * 创建用户所在单位名称
+     */
+    @ApiModelProperty(value = "创建用户所在单位名称")
+    @ExcelIgnore
+    private String createUserOrgName;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty(value = "更新时间")
+    private Date updateTime;
+
+    /**
+     * 是否删除【0未删除 1已删除】
+     */
+    @ApiModelProperty(value = "是否删除【0未删除 1已删除】")
+    private Integer isDeleted;
+
+    @TableField(exist = false)
+    private Integer isAuditPage;
+
+
+}

+ 124 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxComputeItemD.java

@@ -0,0 +1,124 @@
+package com.ruoyi.hywz.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * <p>
+ * 【印花税】印花税计算单明细表
+ * </p>
+ *
+ * @author mybatisplus-generator
+ * @date 2024-07-29 10:21:44
+ */
+@Data
+public class AdsMatHyxtStampTaxComputeItemD implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.ASSIGN_UUID)
+    @ApiModelProperty(value = "主键ID")
+    private String id;
+
+    /**
+     * 计算单批次id
+     */
+    @ApiModelProperty(value = "计算单批次id")
+    private String computeId;
+
+    /**
+     * 税目
+     */
+    @ApiModelProperty(value = "税目")
+    private String taxName;
+
+    /**
+     * 税率
+     */
+    @ApiModelProperty(value = "税率")
+    private String taxRate;
+
+    /**
+     * 排序
+     */
+    @ApiModelProperty(value = "排序")
+    private Integer sort;
+
+    /**
+     * 合同取数
+     */
+    @ApiModelProperty(value = "合同取数")
+    private String contractNum;
+
+    /**
+     * 发票取数
+     */
+    @ApiModelProperty(value = "发票取数")
+    private String invoiceNum;
+
+    /**
+     * 计税金额合计
+     */
+    @ApiModelProperty(value = "计税金额合计")
+    private String totalNum;
+
+    /**
+     * 应纳税额
+     */
+    @ApiModelProperty(value = "应纳税额")
+    private String taxNum;
+
+    /**
+     * 创建用户id
+     */
+    @ApiModelProperty(value = "创建用户id")
+    private String createUserId;
+
+    /**
+     * 创建用户账号
+     */
+    @ApiModelProperty(value = "创建用户账号")
+    private String createUser;
+
+    /**
+     * 创建用户昵称
+     */
+    @ApiModelProperty(value = "创建用户昵称")
+    private String createUserName;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty(value = "更新时间")
+    private Date updateTime;
+
+    /**
+     * 是否删除【0未删除 1已删除】
+     */
+    @ApiModelProperty(value = "是否删除【0未删除 1已删除】")
+    private Integer isDeleted;
+
+    /**
+     * 序号
+     */
+    @TableField(exist = false)
+    private Integer no;
+
+
+}

+ 288 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxComputeVoucherD.java

@@ -0,0 +1,288 @@
+package com.ruoyi.hywz.entity;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * <p>
+ * 【印花税】印花税计算单记账凭证
+ * </p>
+ *
+ * @author mybatisplus-generator
+ * @date 2024-07-29 15:59:04
+ */
+@Data
+public class AdsMatHyxtStampTaxComputeVoucherD implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 序号
+     */
+    @TableField(exist = false)
+    @ExcelIgnore
+    private Integer no;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.ASSIGN_UUID)
+    @ApiModelProperty(value = "主键ID")
+    private String id;
+
+    /**
+     * 计算单批次id
+     */
+    @ApiModelProperty(value = "计算单批次id")
+    private String computeId;
+
+    /**
+     * 单位
+     */
+    @ApiModelProperty(value = "单位")
+    private String dw;
+
+    /**
+     * 单位
+     */
+    @ApiModelProperty(value = "单位")
+    private String dwOrg;
+
+    /**
+     * 会计账期
+     */
+    @ApiModelProperty(value = "会计账期")
+    private String kjzq;
+
+    /**
+     * 制证日期
+     */
+    @ApiModelProperty(value = "制证日期")
+    private String zzrq;
+
+    /**
+     * 业务日期
+     */
+    @ApiModelProperty(value = "业务日期")
+    private String ywrq;
+
+    /**
+     * 凭证编号
+     */
+    @ApiModelProperty(value = "凭证编号")
+    private String pzbh;
+
+    /**
+     * 集团编号
+     */
+    @ApiModelProperty(value = "集团编号")
+    private String jtbh;
+
+    /**
+     * 凭证申请编号
+     */
+    @ApiModelProperty(value = "凭证申请编号")
+    private String pzsqbh;
+
+    /**
+     * 单据申请编号
+     */
+    @ApiModelProperty(value = "单据申请编号")
+    private String djsqbh;
+
+    /**
+     * 创建用户id
+     */
+    @ApiModelProperty(value = "创建用户id")
+    private Long createUserId;
+
+    /**
+     * 创建用户账号
+     */
+    @ApiModelProperty(value = "创建用户账号")
+    private String createUser;
+
+    /**
+     * 创建用户昵称
+     */
+    @ApiModelProperty(value = "创建用户昵称")
+    private String createUserName;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty(value = "更新时间")
+    private Date updateTime;
+
+    /**
+     * 是否删除【0未删除 1已删除】
+     */
+    @ApiModelProperty(value = "是否删除【0未删除 1已删除】")
+    private Integer isDeleted;
+
+    /**
+     * 总摘要
+     */
+    @ApiModelProperty(value = "总摘要")
+    private String zzy;
+
+    /**
+     * 分录摘要
+     */
+    @ApiModelProperty(value = "分录摘要")
+    private String flzy;
+
+    /**
+     * 科目编码
+     */
+    @ApiModelProperty(value = "科目编码")
+    private String kmbm;
+
+    /**
+     * 科目名称
+     */
+    @ApiModelProperty(value = "科目名称")
+    private String kmmc;
+
+    /**
+     * 管理对象
+     */
+    @ApiModelProperty(value = "管理对象")
+    private String gldx;
+
+    /**
+     * 主辅标志
+     */
+    @ApiModelProperty(value = "主辅标志")
+    private String zfbz;
+
+    /**
+     * 借方金额
+     */
+    @ApiModelProperty(value = "借方金额")
+    private String jfje;
+
+    /**
+     * 贷方金额
+     */
+    @ApiModelProperty(value = "贷方金额")
+    private String dfje;
+
+    /**
+     * 借方数量
+     */
+    @ApiModelProperty(value = "借方数量")
+    private String jfsl;
+
+    /**
+     * 贷方数量
+     */
+    @ApiModelProperty(value = "贷方数量")
+    private String dfsl;
+
+    /**
+     * 调整期
+     */
+    @ApiModelProperty(value = "调整期")
+    private String tzq;
+
+    /**
+     * 制证人
+     */
+    @ApiModelProperty(value = "制证人")
+    private String zzr;
+
+    /**
+     * 冲销
+     */
+    @ApiModelProperty(value = "冲销")
+    private String cx;
+
+    /**
+     * 记账状态
+     */
+    @ApiModelProperty(value = "记账状态")
+    private String jzzt;
+
+    /**
+     * 最后处理日期
+     */
+    @ApiModelProperty(value = "最后处理日期")
+    private String zhclrq;
+
+    /**
+     * 本位币币种
+     */
+    @ApiModelProperty(value = "本位币币种")
+    private String bwbbz;
+
+    /**
+     * 外币币种
+     */
+    @ApiModelProperty(value = "外币币种")
+    private String wbbz;
+
+    /**
+     * 对账标志
+     */
+    @ApiModelProperty(value = "对账标志")
+    private String dzbz;
+
+    /**
+     * 是否抵销
+     */
+    @ApiModelProperty(value = "是否抵销")
+    private String sfdx;
+
+    /**
+     * 辅助维度
+     */
+    @ApiModelProperty(value = "辅助维度")
+    private String fzwd;
+
+    /**
+     * 辅助借方金额
+     */
+    @ApiModelProperty(value = "辅助借方金额")
+    private String fzjfje;
+
+    /**
+     * 辅助贷方金额
+     */
+    @ApiModelProperty(value = "辅助贷方金额")
+    private String fzdfje;
+
+    /**
+     * 辅助借方数量
+     */
+    @ApiModelProperty(value = "辅助借方数量")
+    private String fzjfsl;
+
+    /**
+     * 辅助贷方数量
+     */
+    @ApiModelProperty(value = "辅助贷方数量")
+    private String fzdfsl;
+
+    /**
+     * 排序分
+     */
+    @ApiModelProperty(value = "排序分")
+    private Integer sort;
+
+
+}

+ 240 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxContractD.java

@@ -0,0 +1,240 @@
+package com.ruoyi.hywz.entity;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.hywz.entity.po.HomeStampTaxCountPO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * <p>
+ * 合同信息表
+ * </p>
+ *
+ * @author mybatisplus-generator
+ * @date 2024-07-14 10:07:56
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class AdsMatHyxtStampTaxContractD extends HomeStampTaxCountPO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 序号
+     */
+    @TableField(exist = false)
+    @ExcelIgnore
+    private Integer no;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.ASSIGN_UUID)
+    @ApiModelProperty(value = "主键ID")
+    @ExcelIgnore
+    private String id;
+
+    /**
+     * 合同名称
+     */
+    @ApiModelProperty(value = "合同名称")
+    @ExcelProperty(value = "合同名称")
+    private String contractName;
+
+    /**
+     * 合同编号
+     */
+    @ApiModelProperty(value = "合同编号")
+    @ExcelProperty(value = "合同编号")
+    private String contractCode;
+
+    /**
+     * 合同类型
+     */
+    @ApiModelProperty(value = "合同类型")
+    @ExcelProperty(value = "合同类型")
+    private String contractType;
+
+    /**
+     * 合同对方
+     */
+    @ApiModelProperty(value = "合同对方")
+    @ExcelProperty(value = "合同对方")
+    private String counterparty;
+
+    /**
+     * 合同金额
+     */
+    @ApiModelProperty(value = "合同金额")
+    @ExcelProperty(value = "合同金额")
+    private String contractAmount;
+
+    /**
+     * 税率
+     */
+    @ApiModelProperty(value = "税率")
+    @ExcelProperty(value = "税率")
+    private String taxRate;
+
+    /**
+     * 不含税金额
+     */
+    @ApiModelProperty(value = "不含税金额")
+    @ExcelProperty(value = "不含税金额")
+    private String preTaxAmount;
+
+    /**
+     * 生效日期
+     */
+    @ApiModelProperty(value = "生效日期")
+    @ExcelProperty(value = "生效日期")
+    private String effectiveDate;
+
+    /**
+     * 印花税税目ID
+     */
+    @ApiModelProperty(value = "印花税税目ID")
+    @ExcelIgnore
+    private String stampTaxItemId;
+
+    /**
+     * 印花税税目
+     */
+    @ApiModelProperty(value = "印花税税目")
+    @ExcelIgnore
+    private String stampTaxItem;
+
+    /**
+     * 印花税税率
+     */
+    @ApiModelProperty(value = "印花税税率")
+    @ExcelIgnore
+    private String stampTaxRate;
+
+    /**
+     * 应税金额
+     */
+    @ApiModelProperty(value = "应税金额")
+    @ExcelProperty(value = "应税金额")
+    private String taxableAmount;
+
+    /**
+     * 计税标识【Y或N】
+     */
+    @ApiModelProperty(value = "计税标识【Y或N】")
+    @ExcelProperty(value = "计税标识")
+    private String taxationFlag;
+
+    /**
+     * 是否预警【0否 1是】
+     */
+    @ApiModelProperty(value = "是否预警【0否 1是】")
+    @ExcelIgnore
+    private Integer isWarning;
+
+    /**
+     * 预警类型
+     */
+    @ApiModelProperty(value = "预警类型")
+    @ExcelIgnore
+    private String warningType;
+
+    @ApiModelProperty(value = "风险状态")
+    @ExcelIgnore
+    private String warningStatusDesc;
+
+    @ApiModelProperty(value = "风险等级")
+    @ExcelIgnore
+    private String warningLevel;
+
+    @ApiModelProperty(value = "预警时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ExcelIgnore
+    private Date warningTime;
+
+    @ApiModelProperty(value = "反馈内容")
+    @ExcelIgnore
+    private String warningRemark;
+
+    @ExcelIgnore
+    @TableField(exist = false)
+    private Integer isWarningSelect;
+
+    /**
+     * 创建用户id
+     */
+    @ApiModelProperty(value = "创建用户id")
+    @ExcelIgnore
+    private String createUserId;
+
+    /**
+     * 创建用户账号
+     */
+    @ApiModelProperty(value = "创建用户账号")
+    @ExcelIgnore
+    private String createUser;
+
+    /**
+     * 创建用户昵称
+     */
+    @ApiModelProperty(value = "创建用户昵称")
+    @ExcelIgnore
+    private String createUserName;
+
+    /**
+     * 创建用户所在单位编号
+     */
+    @ApiModelProperty(value = "创建用户所在单位编号")
+    @ExcelIgnore
+    private String createUserOrgNo;
+
+    /**
+     * 创建用户所在单位名称
+     */
+    @ApiModelProperty(value = "创建用户所在单位名称")
+    @ExcelIgnore
+    private String createUserOrgName;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ExcelIgnore
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty(value = "更新时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ExcelIgnore
+    private Date updateTime;
+
+    /**
+     * 是否删除【0未删除 1已删除】
+     */
+    @ApiModelProperty(value = "是否删除【0未删除 1已删除】")
+    @ExcelIgnore
+    private Integer isDeleted;
+
+    @TableField(exist = false)
+    @ExcelIgnore
+    private String startDate;
+
+    @TableField(exist = false)
+    @ExcelIgnore
+    private String endDate;
+
+
+}

+ 80 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxContractInvoiceD.java

@@ -0,0 +1,80 @@
+package com.ruoyi.hywz.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.*;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * <p>
+ * 合同/发票预警信息表
+ * </p>
+ *
+ * @author mybatisplus-generator
+ * @date 2024-09-12 18:01:36
+ */
+@Data
+public class AdsMatHyxtStampTaxContractInvoiceD implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.ASSIGN_UUID)
+    @ApiModelProperty(value = "主键")
+    private String id;
+
+    /**
+     * 业务id
+     */
+    @ApiModelProperty(value = "业务id")
+    private String businessId;
+
+    /**
+     * 预警类型
+     */
+    @ApiModelProperty(value = "预警类型")
+    private String warningType;
+
+
+    /**
+     * 风险状态
+     */
+    @ApiModelProperty(value = "风险状态")
+    private String warningStatusDesc;
+
+    /**
+     * 风险等级
+     */
+    @ApiModelProperty(value = "风险等级")
+    private String warningLevel;
+
+    /**
+     * 预警时间
+     */
+    @ApiModelProperty(value = "预警时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date warningTime;
+
+    /**
+     * 反馈内容
+     */
+    @ApiModelProperty(value = "反馈内容")
+    private String warningRemark;
+
+    @TableField(exist = false)
+    private String rule;
+    @TableField(exist = false)
+    private String level;
+    @TableField(exist = false)
+    private String description;
+
+
+}

+ 302 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxInvoiceD.java

@@ -0,0 +1,302 @@
+package com.ruoyi.hywz.entity;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.hywz.entity.po.HomeStampTaxCountPO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * <p>
+ * 发票信息表
+ * </p>
+ *
+ * @author mybatisplus-generator
+ * @date 2024-07-14 10:07:56
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class AdsMatHyxtStampTaxInvoiceD extends HomeStampTaxCountPO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 序号
+     */
+    @TableField(exist = false)
+    @ExcelIgnore
+    private Integer no;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.ASSIGN_UUID)
+    @ApiModelProperty(value = "主键ID")
+    @ExcelIgnore
+    private String id;
+
+    /**
+     * 发票代码
+     */
+    @ApiModelProperty(value = "发票代码")
+    @ExcelProperty(value = "发票代码")
+    private String invoiceCode;
+
+    /**
+     * 发票号码
+     */
+    @ApiModelProperty(value = "发票号码")
+    @ExcelProperty(value = "发票号码")
+    private String invoiceNumber;
+
+    /**
+     * 数电票号码
+     */
+    @ApiModelProperty(value = "数电票号码")
+    @ExcelProperty(value = "数电票号码")
+    private String invoiceTelexNumber;
+
+    /**
+     * 销方识别号
+     */
+    @ApiModelProperty(value = "销方识别号")
+    @ExcelProperty(value = "销方识别号")
+    private String sellerId;
+
+    /**
+     * 销方名称
+     */
+    @ApiModelProperty(value = "销方名称")
+    @ExcelProperty(value = "销方名称")
+    private String sellerName;
+
+    /**
+     * 开票日期
+     */
+    @ApiModelProperty(value = "开票日期")
+    @ExcelProperty(value = "开票日期")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date makeDate;
+
+    /**
+     * 特定业务类型
+     */
+    @ApiModelProperty(value = "特定业务类型")
+    @ExcelProperty(value = "特定业务类型")
+    private String spBusinessType;
+
+    /**
+     * 货物或应税劳务名称
+     */
+    @ApiModelProperty(value = "货物或应税劳务名称")
+    @ExcelProperty(value = "货物或应税劳务名称")
+    private String itemDesc;
+
+    /**
+     * 金额
+     */
+    @ApiModelProperty(value = "金额")
+    @ExcelProperty(value = "金额")
+    private String amount;
+
+    /**
+     * 税率
+     */
+    @ApiModelProperty(value = "税率")
+    @ExcelProperty(value = "税率")
+    private String taxRate;
+
+    /**
+     * 税额
+     */
+    @ApiModelProperty(value = "税额")
+    @ExcelProperty(value = "税额")
+    private String taxAmt;
+
+    /**
+     * 价税合计
+     */
+    @ApiModelProperty(value = "价税合计")
+    @ExcelProperty(value = "价税合计")
+    private String totalAmount;
+
+    /**
+     * 备注
+     */
+    @ApiModelProperty(value = "备注")
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    /**
+     * 业务分类
+     */
+    @ApiModelProperty(value = "业务分类")
+    @ExcelProperty(value = "业务分类")
+    private String businessTypeCode;
+
+    /**
+     * 业务分类
+     */
+    @ApiModelProperty(value = "业务分类")
+    @ExcelProperty(value = "业务分类")
+    private String businessType;
+
+    /**
+     * 预警标识【0正常 1强控 2弱控】
+     */
+    @ApiModelProperty(value = "预警标识【0正常 1强控 2弱控】")
+    @ExcelIgnore
+    private Integer isWarning;
+
+    /**
+     * 发票来源
+     */
+    @ApiModelProperty(value = "发票来源")
+    @ExcelProperty(value = "发票来源")
+    private String invoiceSource;
+
+    /**
+     * 发票票种
+     */
+    @ApiModelProperty(value = "发票票种")
+    @ExcelProperty(value = "发票票种")
+    private String invoiceType;
+
+    /**
+     * 发票状态
+     */
+    @ApiModelProperty(value = "发票状态")
+    @ExcelProperty(value = "发票状态")
+    private String invoiceStatus;
+
+    /**
+     * 是否正数发票
+     */
+    @ApiModelProperty(value = "是否正数发票")
+    @ExcelProperty(value = "是否正数发票")
+    private String isZsfp;
+
+    /**
+     * 发票风险等级
+     */
+    @ApiModelProperty(value = "发票风险等级")
+    @ExcelProperty(value = "发票风险等级")
+    private String invoiceWarningLevel;
+
+    /**
+     * 开票人
+     */
+    @ApiModelProperty(value = "开票人")
+    @ExcelProperty(value = "开票人")
+    private String kpr;
+
+    /**
+     * 预警类型
+     */
+    @ApiModelProperty(value = "预警类型")
+    @ExcelProperty(value = "预警类型")
+    private String warningType;
+
+    @ApiModelProperty(value = "风险状态")
+    @ExcelIgnore
+    private String warningStatusDesc;
+
+    @ApiModelProperty(value = "风险等级")
+    @ExcelIgnore
+    private String warningLevel;
+
+    @ApiModelProperty(value = "预警时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ExcelIgnore
+    private Date warningTime;
+
+    @ApiModelProperty(value = "反馈内容")
+    @ExcelIgnore
+    private String warningRemark;
+
+    @ExcelIgnore
+    @TableField(exist = false)
+    private Integer isWarningSelect;
+
+    /**
+     * 创建用户id
+     */
+    @ApiModelProperty(value = "创建用户id")
+    @ExcelIgnore
+    private String createUserId;
+
+    /**
+     * 创建用户账号
+     */
+    @ApiModelProperty(value = "创建用户账号")
+    @ExcelIgnore
+    private String createUser;
+
+    /**
+     * 创建用户昵称
+     */
+    @ApiModelProperty(value = "创建用户昵称")
+    @ExcelIgnore
+    private String createUserName;
+
+    /**
+     * 创建用户所在单位编号
+     */
+    @ApiModelProperty(value = "创建用户所在单位编号")
+    @ExcelIgnore
+    private String createUserOrgNo;
+
+    /**
+     * 创建用户所在单位名称
+     */
+    @ApiModelProperty(value = "创建用户所在单位名称")
+    @ExcelIgnore
+    private String createUserOrgName;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间")
+    @ExcelIgnore
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty(value = "更新时间")
+    @ExcelIgnore
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updateTime;
+
+    /**
+     * 是否删除【0未删除 1已删除】
+     */
+    @ApiModelProperty(value = "是否删除【0未删除 1已删除】")
+    @ExcelIgnore
+    private Integer isDeleted;
+
+    @TableField(exist = false)
+    @ExcelIgnore
+    private String startDate;
+
+    @TableField(exist = false)
+    @ExcelIgnore
+    private String endDate;
+
+
+    @TableField(exist = false)
+    @ExcelIgnore
+    private String yhssm;//印花税税目
+
+
+}

+ 127 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxItemD.java

@@ -0,0 +1,127 @@
+package com.ruoyi.hywz.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * <p>
+ * 印花税类目表
+ * </p>
+ *
+ * @author mybatisplus-generator
+ * @date 2024-07-15 15:29:08
+ */
+@Data
+public class AdsMatHyxtStampTaxItemD implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.ASSIGN_UUID)
+    @ApiModelProperty(value = "主键ID")
+    private String id;
+
+    /**
+     * 分组名称
+     */
+    @ApiModelProperty(value = "分组名称")
+    private String groupName;
+
+    /**
+     * 税目
+     */
+    @ApiModelProperty(value = "税目")
+    private String itemName;
+
+    /**
+     * 内容
+     */
+    @ApiModelProperty(value = "内容")
+    private String content;
+
+    /**
+     * 计税依据
+     */
+    @ApiModelProperty(value = "计税依据")
+    private String taxRateGist;
+
+    /**
+     * 税率
+     */
+    @ApiModelProperty(value = "税率")
+    private String taxRate;
+
+    /**
+     * 排序分
+     */
+    @ApiModelProperty(value = "排序分")
+    private Integer sort;
+
+    /**
+     * code
+     */
+    @ApiModelProperty(value = "code")
+    private String code;
+
+    /**
+     * 创建用户id
+     */
+    @ApiModelProperty(value = "创建用户id")
+    private String createUserId;
+
+    /**
+     * 创建用户账号
+     */
+    @ApiModelProperty(value = "创建用户账号")
+    private String createUser;
+
+    /**
+     * 创建用户昵称
+     */
+    @ApiModelProperty(value = "创建用户昵称")
+    private String createUserName;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty(value = "更新时间")
+    private Date updateTime;
+
+    /**
+     * 是否删除【0未删除 1已删除】
+     */
+    @ApiModelProperty(value = "是否删除【0未删除 1已删除】")
+    private Integer isDeleted;
+
+    @TableField(exist = false)
+    private String tax1Fee;//一季度税额
+    @TableField(exist = false)
+    private String tax2Fee;//二季度税额
+    @TableField(exist = false)
+    private String tax3Fee;//三季度税额
+    @TableField(exist = false)
+    private String tax4Fee;//四季度税额
+    @TableField(exist = false)
+    private String tax1;//一季度纳税额
+    @TableField(exist = false)
+    private String tax2;//二季度纳税额
+    @TableField(exist = false)
+    private String tax3;//三季度纳税额
+    @TableField(exist = false)
+    private String tax4;//四季度纳税额
+}

+ 183 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxWarningD.java

@@ -0,0 +1,183 @@
+package com.ruoyi.hywz.entity;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.hywz.utils.IdGen;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * <p>
+ * 【印花税】预警表
+ * </p>
+ *
+ * @author mybatisplus-generator
+ * @date 2024-07-17 16:58:32
+ */
+@Data
+public class AdsMatHyxtStampTaxWarningD implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 序号
+     */
+    @TableField(exist = false)
+    @ExcelIgnore
+    private Integer no;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.ASSIGN_UUID)
+    @ApiModelProperty(value = "主键ID")
+    private String id;
+
+    /**
+     * 数据来源【0合同信息表 1发票信息表】
+     */
+    @ApiModelProperty(value = "数据来源【0合同信息表 1发票信息表】")
+    private Integer sourceType;
+
+    /**
+     * 数据来源ID
+     */
+    @ApiModelProperty(value = "数据来源ID")
+    private String sourceId;
+
+    /**
+     * 稽核公式
+     */
+    @ApiModelProperty(value = "稽核公式")
+    private String checkGist;
+
+    /**
+     * 稽核类型
+     */
+    @ApiModelProperty(value = "稽核类型")
+    private String checkType;
+
+    /**
+     * 潜在风险预警(内容描述)
+     */
+    @ApiModelProperty(value = "潜在风险预警(内容描述)")
+    private String content;
+
+    /**
+     * 状态【0未处理 1已处理】
+     */
+    @ApiModelProperty(value = "状态【0未处理 1已处理】")
+    private Integer status;
+
+    /**
+     * 风险等级【强控 弱控】
+     */
+    @ApiModelProperty(value = "风险等级【强控 弱控】")
+    private String warningLevel;
+
+    /**
+     * 备注
+     */
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+    /**
+     * 预警情况
+     */
+    private String warningType;
+
+    @ApiModelProperty(value = "所属单位")
+    private String orgNo;
+    @ApiModelProperty(value = "所属单位")
+    private String orgName;
+
+    @ApiModelProperty(value = "数据来源【0合同信息表 1发票信息表】")
+    @TableField(exist = false)
+    private String sourceTypeDesc;
+
+    @ApiModelProperty(value = "状态【0未处理 1已处理】")
+    @TableField(exist = false)
+    private String statusDesc;
+
+    /**
+     * 创建用户id
+     */
+    @ApiModelProperty(value = "创建用户id")
+    private String createUserId;
+
+    /**
+     * 创建用户账号
+     */
+    @ApiModelProperty(value = "创建用户账号")
+    private String createUser;
+
+    /**
+     * 创建用户昵称
+     */
+    @ApiModelProperty(value = "创建用户昵称")
+    private String createUserName;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty(value = "更新时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updateTime;
+
+    /**
+     * 是否删除【0未删除 1已删除】
+     */
+    @ApiModelProperty(value = "是否删除【0未删除 1已删除】")
+    private Integer isDeleted;
+
+    public static AdsMatHyxtStampTaxWarningD build(Integer sourceType, String sourceId, String checkGist, String content, String warningType, String orgNo, String orgName) {
+        AdsMatHyxtStampTaxWarningD warningD = new AdsMatHyxtStampTaxWarningD();
+        warningD.setId(IdGen.get32UUID());
+        warningD.setSourceType(sourceType);
+        warningD.setSourceId(sourceId);
+        warningD.setCheckGist(checkGist);
+        warningD.setCheckType("控制性稽核");
+        warningD.setWarningLevel("强控");
+        warningD.setContent(content);
+        warningD.setWarningType(warningType);
+        warningD.setOrgNo(orgNo);
+        warningD.setOrgName(orgName);
+        warningD.setStatus(0);
+        warningD.setCreateTime(new Date());
+        warningD.setIsDeleted(0);
+        return warningD;
+    }
+
+    public static AdsMatHyxtStampTaxWarningD build2(Integer sourceType, String sourceId, String checkGist, String content, String warningType, String orgNo, String orgName) {
+        AdsMatHyxtStampTaxWarningD warningD = new AdsMatHyxtStampTaxWarningD();
+        warningD.setId(IdGen.get32UUID());
+        warningD.setSourceType(sourceType);
+        warningD.setSourceId(sourceId);
+        warningD.setCheckGist(checkGist);
+        warningD.setCheckType("控制性稽核");
+        warningD.setWarningLevel("弱控");
+        warningD.setContent(content);
+        warningD.setWarningType(warningType);
+        warningD.setOrgNo(orgNo);
+        warningD.setOrgName(orgName);
+        warningD.setStatus(0);
+        warningD.setCreateTime(new Date());
+        warningD.setIsDeleted(0);
+        return warningD;
+    }
+
+}

+ 68 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxWarningRuleD.java

@@ -0,0 +1,68 @@
+package com.ruoyi.hywz.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+/**
+ * <p>
+ * 【印花税】预警规则表
+ * </p>
+ *
+ * @author mybatisplus-generator
+ * @date 2024-08-20 09:35:44
+ */
+@Data
+public class AdsMatHyxtStampTaxWarningRuleD implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.ASSIGN_UUID)
+    @ApiModelProperty(value = "主键ID")
+    private String id;
+
+    /**
+     * 风险描述
+     */
+    @ApiModelProperty(value = "风险描述")
+    private String description;
+
+    /**
+     * 风险规则
+     */
+    @ApiModelProperty(value = "风险规则")
+    private String rule;
+
+    /**
+     * 风险等级
+     */
+    @ApiModelProperty(value = "风险等级")
+    private String level;
+
+    /**
+     * 数据来源【0合同信息表 1发票信息表】
+     */
+    @ApiModelProperty(value = "数据来源【0合同信息表 1发票信息表】")
+    private Integer sourceType;
+
+    /**
+     * 预警类型
+     */
+    @ApiModelProperty(value = "预警类型")
+    private String warningType;
+
+    /**
+     * 排序
+     */
+    @ApiModelProperty(value = "排序")
+    private Integer sort;
+
+
+}

+ 218 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxZhptInvoiceD.java

@@ -0,0 +1,218 @@
+package com.ruoyi.hywz.entity;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * <p>
+ * 【印花税】【智慧平台】发票信息表
+ * </p>
+ *
+ * @author mybatisplus-generator
+ * @date 2024-08-23 11:15:50
+ */
+@Data
+public class AdsMatHyxtStampTaxZhptInvoiceD implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.ASSIGN_UUID)
+    @ApiModelProperty(value = "主键ID")
+    @ExcelIgnore
+    private String id;
+
+    /**
+     * 发票类型
+     */
+    @ApiModelProperty(value = "发票类型")
+    @ExcelProperty(value = "发票类型")
+    private String invoiceType;
+
+    /**
+     * 发票状态
+     */
+    @ApiModelProperty(value = "发票状态")
+    @ExcelProperty(value = "发票状态")
+    private String invoiceStatus;
+
+    /**
+     * 发票代码
+     */
+    @ApiModelProperty(value = "发票代码")
+    @ExcelProperty(value = "发票代码")
+    private String invoiceCode;
+
+    /**
+     * 发票号码
+     */
+    @ApiModelProperty(value = "发票号码")
+    @ExcelProperty(value = "发票号码")
+    private String invoiceNumber;
+
+    /**
+     * 开票日期
+     */
+    @ApiModelProperty(value = "开票日期")
+    @ExcelProperty(value = "开票日期")
+    private String makeDate;
+
+    /**
+     * 合计金额
+     */
+    @ApiModelProperty(value = "合计金额")
+    @ExcelProperty(value = "合计金额")
+    private String totalAmt;
+
+    /**
+     * 发票税额
+     */
+    @ApiModelProperty(value = "发票税额")
+    @ExcelProperty(value = "发票税额")
+    private String invoiceTaxAmt;
+
+    /**
+     * 入账税额
+     */
+    @ApiModelProperty(value = "入账税额")
+    @ExcelProperty(value = "入账税额")
+    private String entryTaxAmt;
+
+    /**
+     * 价税合计
+     */
+    @ApiModelProperty(value = "价税合计")
+    @ExcelProperty(value = "价税合计")
+    private String amtTaxTotal;
+
+    /**
+     * 销方名称
+     */
+    @ApiModelProperty(value = "销方名称")
+    @ExcelProperty(value = "销方名称")
+    private String sellerName;
+
+    /**
+     * 经办部门
+     */
+    @ApiModelProperty(value = "经办部门")
+    @ExcelProperty(value = "经办部门")
+    private String handleDept;
+
+    /**
+     * 业务状态
+     */
+    @ApiModelProperty(value = "业务状态")
+    @ExcelProperty(value = "业务状态")
+    private String businessStatus;
+
+    /**
+     * 单据编号
+     */
+    @ApiModelProperty(value = "单据编号")
+    @ExcelProperty(value = "单据编号")
+    private String orderNo;
+
+    /**
+     * 凭证编号
+     */
+    @ApiModelProperty(value = "凭证编号")
+    @ExcelProperty(value = "凭证编号")
+    private String voucherNo;
+
+    /**
+     * 制证日期
+     */
+    @ApiModelProperty(value = "制证日期")
+    @ExcelProperty(value = "制证日期")
+    private String makeVoucherDate;
+
+    /**
+     * 制证人
+     */
+    @ApiModelProperty(value = "制证人")
+    @ExcelProperty(value = "制证人")
+    private String makeVoucherUser;
+
+    /**
+     * 用票单位
+     */
+    @ApiModelProperty(value = "用票单位")
+    @ExcelProperty(value = "用票单位")
+    private String useInvoiceOrgName;
+
+    /**
+     * 发票归属单位
+     */
+    @ApiModelProperty(value = "发票归属单位")
+    @ExcelProperty(value = "发票归属单位")
+    private String invoiceOwnerOrgName;
+
+    /**
+     * 创建用户id
+     */
+    @ApiModelProperty(value = "创建用户id")
+    @ExcelIgnore
+    private String createUserId;
+
+    /**
+     * 创建用户账号
+     */
+    @ApiModelProperty(value = "创建用户账号")
+    @ExcelIgnore
+    private String createUser;
+
+    /**
+     * 创建用户昵称
+     */
+    @ApiModelProperty(value = "创建用户昵称")
+    @ExcelIgnore
+    private String createUserName;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间")
+    @ExcelIgnore
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty(value = "更新时间")
+    @ExcelIgnore
+    private Date updateTime;
+
+    /**
+     * 是否删除【0未删除 1已删除】
+     */
+    @ApiModelProperty(value = "是否删除【0未删除 1已删除】")
+    @ExcelIgnore
+    private Integer isDeleted;
+
+    /**
+     * 创建用户单位
+     */
+    @ApiModelProperty(value = "创建用户单位")
+    @ExcelIgnore
+    private String createUserOrgNo;
+
+    /**
+     * 创建用户单位
+     */
+    @ApiModelProperty(value = "创建用户单位")
+    @ExcelIgnore
+    private String createUserOrgName;
+
+
+}

+ 155 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtStampTaxZhptInvoiceItemD.java

@@ -0,0 +1,155 @@
+package com.ruoyi.hywz.entity;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * <p>
+ * 【印花税】【智慧平台】科目明细表
+ * </p>
+ *
+ * @author mybatisplus-generator
+ * @date 2024-08-23 11:15:50
+ */
+@Data
+public class AdsMatHyxtStampTaxZhptInvoiceItemD implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.ASSIGN_UUID)
+    @ApiModelProperty(value = "主键ID")
+    @ExcelIgnore
+    private String id;
+
+    /**
+     * 发票id
+     */
+    @ApiModelProperty(value = "发票id")
+    @ExcelIgnore
+    private String invoiceId;
+
+    /**
+     * 发票代码
+     */
+    @ApiModelProperty(value = "发票代码")
+    @ExcelIgnore
+    private String invoiceCode;
+
+    /**
+     * 发票号码
+     */
+    @ApiModelProperty(value = "发票号码")
+    @ExcelIgnore
+    private String invoiceNumber;
+
+    /**
+     * 摘要
+     */
+    @ApiModelProperty(value = "摘要")
+    @ExcelProperty(value = "摘要")
+    private String zy;
+
+    /**
+     * 科目
+     */
+    @ApiModelProperty(value = "科目")
+    @ExcelProperty(value = "科目")
+    private String km;
+
+    /**
+     * 对象
+     */
+    @ApiModelProperty(value = "对象")
+    @ExcelProperty(value = "对象")
+    private String dx;
+
+    /**
+     * 业务日期
+     */
+    @ApiModelProperty(value = "业务日期")
+    @ExcelProperty(value = "业务日期")
+    private String ywrq;
+
+    /**
+     * 借方金额
+     */
+    @ApiModelProperty(value = "借方金额")
+    @ExcelProperty(value = "借方金额")
+    private String jfje;
+
+    /**
+     * 贷方金额
+     */
+    @ApiModelProperty(value = "贷方金额")
+    @ExcelProperty(value = "贷方金额")
+    private String dfje;
+
+    /**
+     * 创建用户id
+     */
+    @ApiModelProperty(value = "创建用户id")
+    @ExcelIgnore
+    private String createUserId;
+
+    /**
+     * 创建用户账号
+     */
+    @ApiModelProperty(value = "创建用户账号")
+    @ExcelIgnore
+    private String createUser;
+
+    /**
+     * 创建用户昵称
+     */
+    @ApiModelProperty(value = "创建用户昵称")
+    @ExcelIgnore
+    private String createUserName;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间")
+    @ExcelIgnore
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty(value = "更新时间")
+    @ExcelIgnore
+    private Date updateTime;
+
+    /**
+     * 是否删除【0未删除 1已删除】
+     */
+    @ApiModelProperty(value = "是否删除【0未删除 1已删除】")
+    @ExcelIgnore
+    private Integer isDeleted;
+
+    /**
+     * 创建用户单位
+     */
+    @ApiModelProperty(value = "创建用户单位")
+    @ExcelIgnore
+    private String createUserOrgNo;
+
+    /**
+     * 创建用户单位
+     */
+    @ApiModelProperty(value = "创建用户单位")
+    @ExcelIgnore
+    private String createUserOrgName;
+
+
+}

+ 169 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtTaskHistoryD.java

@@ -0,0 +1,169 @@
+package com.ruoyi.hywz.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * <p>
+ * 已办任务表
+ * </p>
+ *
+ * @author mybatisplus-generator
+ * @date 2024-04-08 14:25:45
+ */
+@Data
+public class AdsMatHyxtTaskHistoryD implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.ASSIGN_UUID)
+    @ApiModelProperty(value = "主键ID")
+    private String id;
+
+    /**
+     * 业务id
+     */
+    @ApiModelProperty(value = "业务id")
+    private String businessId;
+
+    /**
+     * 任务名称
+     */
+    @ApiModelProperty(value = "任务名称")
+    private String taskName;
+
+    /**
+     * 任务类型【0开票申请流程】
+     */
+    @ApiModelProperty(value = "任务类型【0开票申请流程】")
+    private Integer taskType;
+
+    /**
+     * 申请用户id
+     */
+    @ApiModelProperty(value = "申请用户id")
+    private Long applyUserId;
+
+    /**
+     * 申请用户账号
+     */
+    @ApiModelProperty(value = "申请用户账号")
+    private String applyUser;
+
+    /**
+     * 申请用户昵称
+     */
+    @ApiModelProperty(value = "申请用户昵称")
+    private String applyUserName;
+
+    /**
+     * 申请用户手机号
+     */
+    @ApiModelProperty(value = "申请用户手机号")
+    private String applyUserPhone;
+
+    /**
+     * 当前节点
+     */
+    @ApiModelProperty(value = "当前节点")
+    private Integer currentNode;
+
+    /**
+     * 节点标签
+     */
+    @ApiModelProperty(value = "节点标签")
+    private String nodeLabel;
+
+    /**
+     * 任务用户id
+     */
+    @ApiModelProperty(value = "任务用户id")
+    private Long ownerUserId;
+
+    /**
+     * 任务用户账号
+     */
+    @ApiModelProperty(value = "任务用户账号")
+    private String ownerUser;
+
+    /**
+     * 任务用户昵称
+     */
+    @ApiModelProperty(value = "任务用户昵称")
+    private String ownerUserName;
+
+    /**
+     * 任务用户手机号
+     */
+    @ApiModelProperty(value = "任务用户手机号")
+    private String ownerUserPhone;
+
+    /**
+     * 审核时间
+     */
+    @ApiModelProperty(value = "审核时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date auditTime;
+
+    /**
+     * 审核结果
+     */
+    @ApiModelProperty(value = "审核结果")
+    private String auditResult;
+
+    /**
+     * 审核意见
+     */
+    @ApiModelProperty(value = "审核意见")
+    private String auditMsg;
+
+    /**
+     * 是否驳回【0否 1是】
+     */
+    @ApiModelProperty(value = "是否驳回【0否 1是】")
+    private Integer isReject;
+
+    /**
+     * 驳回节点
+     */
+    @ApiModelProperty(value = "驳回节点")
+    private Integer rejectNode;
+
+    /**
+     * 状态【1已办】
+     */
+    @ApiModelProperty(value = "状态【1已办】")
+    private Integer status;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty(value = "更新时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updateTime;
+
+    /**
+     * 是否删除【0未删除 1已删除】
+     */
+    @ApiModelProperty(value = "是否删除【0未删除 1已删除】")
+    private Integer isDeleted;
+
+
+}

+ 144 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtTaskRunD.java

@@ -0,0 +1,144 @@
+package com.ruoyi.hywz.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * <p>
+ * 待办任务表
+ * </p>
+ *
+ * @author mybatisplus-generator
+ * @date 2024-04-08 14:25:45
+ */
+@Data
+public class AdsMatHyxtTaskRunD implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.ASSIGN_UUID)
+    @ApiModelProperty(value = "主键ID")
+    private String id;
+
+    /**
+     * 业务id
+     */
+    @ApiModelProperty(value = "业务id")
+    private String businessId;
+
+    /**
+     * 任务名称
+     */
+    @ApiModelProperty(value = "任务名称")
+    private String taskName;
+
+    /**
+     * 任务类型【0开票申请流程】
+     */
+    @ApiModelProperty(value = "任务类型【0开票申请流程】")
+    private Integer taskType;
+
+    /**
+     * 申请用户id
+     */
+    @ApiModelProperty(value = "申请用户id")
+    private Long applyUserId;
+
+    /**
+     * 申请用户账号
+     */
+    @ApiModelProperty(value = "申请用户账号")
+    private String applyUser;
+
+    /**
+     * 申请用户昵称
+     */
+    @ApiModelProperty(value = "申请用户昵称")
+    private String applyUserName;
+
+    /**
+     * 申请用户手机号
+     */
+    @ApiModelProperty(value = "申请用户手机号")
+    private String applyUserPhone;
+
+    /**
+     * 当前节点
+     */
+    @ApiModelProperty(value = "当前节点")
+    private Integer currentNode;
+
+    /**
+     * 节点标签
+     */
+    @ApiModelProperty(value = "节点标签")
+    private String nodeLabel;
+
+    /**
+     * 任务用户id
+     */
+    @ApiModelProperty(value = "任务用户id")
+    private Long ownerUserId;
+
+    /**
+     * 任务用户账号
+     */
+    @ApiModelProperty(value = "任务用户账号")
+    private String ownerUser;
+
+    /**
+     * 任务用户昵称
+     */
+    @ApiModelProperty(value = "任务用户昵称")
+    private String ownerUserName;
+
+    /**
+     * 任务用户手机号
+     */
+    @ApiModelProperty(value = "任务用户手机号")
+    private String ownerUserPhone;
+
+    /**
+     * 状态【0待办】
+     */
+    @ApiModelProperty(value = "状态【0待办】")
+    private Integer status;
+
+    /**
+     * 分支业务类型【0购买方财务人员 1销售方财务人员】
+     */
+    @ApiModelProperty(value = "分支业务类型【0购买方财务人员 1销售方财务人员】")
+    private Integer branchType;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty(value = "更新时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updateTime;
+
+    /**
+     * 是否删除【0未删除 1已删除】
+     */
+    @ApiModelProperty(value = "是否删除【0未删除 1已删除】")
+    private Integer isDeleted;
+
+
+}

+ 99 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtTaskSendMsgD.java

@@ -0,0 +1,99 @@
+package com.ruoyi.hywz.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * <p>
+ * 定时提醒任务表
+ * </p>
+ *
+ * @author mybatisplus-generator
+ * @date 2024-04-15 11:23:49
+ */
+@Data
+public class AdsMatHyxtTaskSendMsgD implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.ASSIGN_UUID)
+    @ApiModelProperty(value = "主键ID")
+    private String id;
+
+    /**
+     * 单据id
+     */
+    @ApiModelProperty(value = "单据id")
+    private String applyId;
+
+    /**
+     * 流程标识
+     */
+    @ApiModelProperty(value = "流程标识")
+    private String nodeLabel;
+
+    /**
+     * 消息内容
+     */
+    @ApiModelProperty(value = "消息内容")
+    private String msgContent;
+
+    /**
+     * 用户id
+     */
+    @ApiModelProperty(value = "用户id")
+    private Long ownerUserId;
+
+    /**
+     * 用户账号
+     */
+    @ApiModelProperty(value = "用户账号")
+    private String ownerUser;
+
+    /**
+     * 用户昵称
+     */
+    @ApiModelProperty(value = "用户昵称")
+    private String ownerUserName;
+
+    /**
+     * 用户手机号码
+     */
+    @ApiModelProperty(value = "用户手机号码")
+    private String ownerUserPhone;
+
+    /**
+     * 状态【0关闭任务 1开启任务】
+     */
+    @ApiModelProperty(value = "状态【0关闭任务 1开启任务】")
+    private Integer status;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty(value = "更新时间")
+    private Date updateTime;
+
+    /**
+     * 是否删除【0未删除 1已删除】
+     */
+    @ApiModelProperty(value = "是否删除【0未删除 1已删除】")
+    private Integer isDeleted;
+
+
+}

+ 92 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsMatHyxtTaskSendMsgLogD.java

@@ -0,0 +1,92 @@
+package com.ruoyi.hywz.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * <p>
+ * 定时任务提醒记录表
+ * </p>
+ *
+ * @author mybatisplus-generator
+ * @date 2024-04-15 11:23:49
+ */
+@Data
+public class AdsMatHyxtTaskSendMsgLogD implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.ASSIGN_UUID)
+    @ApiModelProperty(value = "主键ID")
+    private String id;
+
+    /**
+     * 单据id
+     */
+    @ApiModelProperty(value = "单据id")
+    private String applyId;
+
+    /**
+     * 流程标识
+     */
+    @ApiModelProperty(value = "流程标识")
+    private String nodeLabel;
+
+    /**
+     * 消息内容
+     */
+    @ApiModelProperty(value = "消息内容")
+    private String msgContent;
+
+    /**
+     * 用户id
+     */
+    @ApiModelProperty(value = "用户id")
+    private Long ownerUserId;
+
+    /**
+     * 用户账号
+     */
+    @ApiModelProperty(value = "用户账号")
+    private String ownerUser;
+
+    /**
+     * 用户昵称
+     */
+    @ApiModelProperty(value = "用户昵称")
+    private String ownerUserName;
+
+    /**
+     * 用户手机号码
+     */
+    @ApiModelProperty(value = "用户手机号码")
+    private String ownerUserPhone;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty(value = "更新时间")
+    private Date updateTime;
+
+    /**
+     * 是否删除【0未删除 1已删除】
+     */
+    @ApiModelProperty(value = "是否删除【0未删除 1已删除】")
+    private Integer isDeleted;
+
+}

+ 152 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/AdsPrjHywzqlcPrjFunInfoDf.java

@@ -0,0 +1,152 @@
+package com.ruoyi.hywz.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+/**
+ * <p>
+ * 应用表_项目域_物资全流程_项目财务基本信息_按日全量更新
+ * </p>
+ *
+ * @author mybatisplus-generator
+ * @date 2024-04-17 09:40:18
+ */
+@Data
+public class AdsPrjHywzqlcPrjFunInfoDf implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.ASSIGN_UUID)
+    @ApiModelProperty(value = "主键")
+    private String id;
+
+    /**
+     * 项目编码
+     */
+    @ApiModelProperty(value = "项目编码")
+    private String projectNo;
+
+    /**
+     * wbs编码
+     */
+    @ApiModelProperty(value = "wbs编码")
+    private String wbsNo;
+
+    /**
+     * 项目名称
+     */
+    @ApiModelProperty(value = "项目名称")
+    private String projectName;
+
+    /**
+     * 计划年份
+     */
+    @ApiModelProperty(value = "计划年份")
+    private String planYear;
+
+    /**
+     * 概算金额
+     */
+    @ApiModelProperty(value = "概算金额")
+    private String budgetary;
+
+    /**
+     * 概算批复文号
+     */
+    @ApiModelProperty(value = "概算批复文号")
+    private String emApprovalNo;
+
+    /**
+     * 概算批复日期
+     */
+    @ApiModelProperty(value = "概算批复日期")
+    private String budgetApvDt;
+
+    /**
+     * 结算金额
+     */
+    @ApiModelProperty(value = "结算金额")
+    private String settlement;
+
+    /**
+     * 结算批复文号
+     */
+    @ApiModelProperty(value = "结算批复文号")
+    private String smApprovalNo;
+
+    /**
+     * 结算完成日期
+     */
+    @ApiModelProperty(value = "结算完成日期")
+    private String settlCmpltDt;
+
+    /**
+     * 投资计划文号
+     */
+    @ApiModelProperty(value = "投资计划文号")
+    private String investPlanNum;
+
+    /**
+     * 投资计划下达日期
+     */
+    @ApiModelProperty(value = "投资计划下达日期")
+    private String investPlanAssignDt;
+
+    /**
+     * 投资计划金额
+     */
+    @ApiModelProperty(value = "投资计划金额")
+    private String investPlanAmt;
+
+    /**
+     * 决算批复文号
+     */
+    @ApiModelProperty(value = "决算批复文号")
+    private String auditApvNum;
+
+    /**
+     * 决算完成日期
+     */
+    @ApiModelProperty(value = "决算完成日期")
+    private String auditCmpltDt;
+
+    /**
+     * 决算金额(含税)
+     */
+    @ApiModelProperty(value = "决算金额(含税)")
+    private String auditTaxAmt;
+
+    /**
+     * 决算金额(不含税)
+     */
+    @ApiModelProperty(value = "决算金额(不含税)")
+    private String auditFreeTaxAmt;
+
+    /**
+     * 工程成本
+     */
+    @ApiModelProperty(value = "工程成本")
+    private String engineCost;
+
+    /**
+     * 数据年月
+     */
+    @ApiModelProperty(value = "数据年月")
+    private String dataYm;
+
+    /**
+     * 数据时间
+     */
+    @ApiModelProperty(value = "数据时间")
+    private String etlTm;
+
+
+}

+ 25 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/po/DateQueryPO.java

@@ -0,0 +1,25 @@
+package com.ruoyi.hywz.entity.po;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author: jxh
+ * @description:
+ * @create: 2024/7/16
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class DateQueryPO extends HomeStampTaxCountPO {
+
+//    @ApiModelProperty("开始日期")
+//    private String startDate;
+//
+//    @ApiModelProperty("结束日期")
+//    private String endDate;
+//
+//    @ApiModelProperty("单位")
+//    private String orgNo;
+
+}

+ 35 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/po/HomeStampTaxCountPO.java

@@ -0,0 +1,35 @@
+package com.ruoyi.hywz.entity.po;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author: jxh
+ * @description:
+ * @create: 2024/9/1
+ */
+@Data
+public class HomeStampTaxCountPO {
+
+    @ApiModelProperty("单位编码")
+    @TableField(exist = false)
+    private String homeOrgNo;
+
+    @ApiModelProperty("单位名称")
+    @TableField(exist = false)
+    private String homeOrgName;
+
+    @ApiModelProperty("单位名称")
+    @TableField(exist = false)
+    private String selectName;
+
+    @ApiModelProperty("年月")
+    @TableField(exist = false)
+    private String homeDate;
+
+    @ApiModelProperty("年月")
+    @TableField(exist = false)
+    private String year;
+
+}

+ 18 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/po/IdsPO.java

@@ -0,0 +1,18 @@
+package com.ruoyi.hywz.entity.po;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author: jxh
+ * @description:
+ * @create: 2024/7/14
+ */
+@Data
+public class IdsPO {
+
+    private String id;
+    private List<String> ids;
+
+}

+ 37 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/po/InvoiceApplyAuditPO.java

@@ -0,0 +1,37 @@
+package com.ruoyi.hywz.entity.po;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author: jxh
+ * @description:
+ * @create: 2024/4/10
+ */
+@Data
+public class InvoiceApplyAuditPO {
+
+    @ApiModelProperty("任务id")
+    private String taskId;
+
+    @ApiModelProperty("任务ids")
+    private List<String> taskIds;
+
+    @ApiModelProperty("单据id")
+    private String businessId;
+
+    @ApiModelProperty("审核状态【-1退回首岗 0退回 1通过】")
+    private Integer auditState;
+
+    @ApiModelProperty("审核意见")
+    private String auditMsg;
+
+    @ApiModelProperty("下一级审核人【购买方财务人员】")
+    private String nextAuditUser;
+
+    @ApiModelProperty("下一级审核人【销售方财务人员】")
+    private String nextAuditUser2;
+
+}

+ 29 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/po/InvoiceApplyDetailPO.java

@@ -0,0 +1,29 @@
+package com.ruoyi.hywz.entity.po;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author: jxh
+ * @description:
+ * @create: 2024/4/9
+ */
+@Data
+public class InvoiceApplyDetailPO {
+
+    @ApiModelProperty(value = "单据表id【必传】", required = true)
+    private String id;
+
+    @ApiModelProperty(value = "单据表id【必传】", required = true)
+    private List<String> ids;
+
+    private String businessId;
+
+    @ApiModelProperty(value = "财务审核人员")
+    private String auditUser1;
+
+    private String applyId;
+
+}

+ 27 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/po/InvoiceApplyPO.java

@@ -0,0 +1,27 @@
+package com.ruoyi.hywz.entity.po;
+
+import com.ruoyi.hywz.entity.AdsMatHyxtInvoiceD;
+import com.ruoyi.hywz.entity.AdsMatHyxtInvoiceFileD;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author: jxh
+ * @description:
+ * @create: 2024/4/9
+ */
+@Data
+public class InvoiceApplyPO {
+
+    @ApiModelProperty(value = "单据表id【新增传空,修改传值】")
+    private String id;
+
+    @ApiModelProperty(value = "发票列表")
+    private List<AdsMatHyxtInvoiceD> list;
+
+//    @ApiModelProperty(value = "附件列表")
+//    private List<AdsMatHyxtInvoiceFileD> fileList;
+
+}

+ 26 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/po/InvoiceApplyQueryPO.java

@@ -0,0 +1,26 @@
+package com.ruoyi.hywz.entity.po;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author: jxh
+ * @description:
+ * @create: 2024/4/9
+ */
+@Data
+public class InvoiceApplyQueryPO {
+
+    @ApiModelProperty(value = "申请编号")
+    private String appNo;
+
+    @ApiModelProperty(value = "单位")
+    private String createUserOrgNo;
+
+    @ApiModelProperty(value = "流程状态【null全部 -1驳回 0未提交 1已申请 2已审核 3已开票 4已报销(已完成) 5未完成】")
+    private Integer status;
+
+    @ApiModelProperty(value = "当前节点")
+    private Integer currentNode;
+
+}

+ 86 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/po/InvoiceImportPO.java

@@ -0,0 +1,86 @@
+package com.ruoyi.hywz.entity.po;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author: jxh
+ * @description:
+ * @create: 2024/4/9
+ */
+@Data
+public class InvoiceImportPO {
+
+    @ApiModelProperty(value = "批次号")
+    @ExcelProperty(index = 1)
+    private String batchNo;
+
+//    @ApiModelProperty(value = "申请日期")
+//    @ExcelProperty(index = 2)
+//    private String applyDate;
+
+    @ApiModelProperty(value = "销售方")
+    @ExcelProperty(index = 2)
+    private String seller;
+
+    @ApiModelProperty(value = "购买方")
+    @ExcelProperty(index = 3)
+    private String buyer;
+
+    @ApiModelProperty(value = "主业WBS编码")
+    @ExcelProperty(index = 4)
+    private String projectNo;
+
+    @ApiModelProperty(value = "主业项目名称")
+    @ExcelProperty(index = 5)
+    private String projectName;
+
+    @ApiModelProperty(value = "产业项目编码")
+    @ExcelProperty(index = 6)
+    private String ynProjectNo;
+
+    @ApiModelProperty(value = "产业项目名称")
+    @ExcelProperty(index = 7)
+    private String ynProjectName;
+
+    @ApiModelProperty(value = "申请单分类")
+    @ExcelProperty(index = 8)
+    private String applyType;
+
+    @ApiModelProperty(value = "费用类型")
+    @ExcelProperty(index = 9)
+    private String costType;
+
+    @ApiModelProperty(value = "合同金额")
+    @ExcelProperty(index = 10)
+    private String contractAmount;
+
+//    @ApiModelProperty(value = "可用预算")
+//    @ExcelProperty(index = 11)
+//    private String validBudgetAmount;
+
+    @ApiModelProperty(value = "本次开票金额(含税)")
+    @ExcelProperty(index = 11)
+    private String taxAmount;
+
+    @ApiModelProperty(value = "税率")
+    @ExcelProperty(index = 12)
+    private String taxRate;
+
+    @ApiModelProperty(value = "收票人(购买方业务人员)")
+    @ExcelProperty(index = 13)
+    private String taker;
+
+    @ApiModelProperty(value = "收票单位(部门)")
+    @ExcelProperty(index = 14)
+    private String takerUnit;
+
+    @ApiModelProperty(value = "联系电话")
+    @ExcelProperty(index = 15)
+    private String telephone;
+
+    @ApiModelProperty(value = "返回唯一标识")
+    private Integer numberPar;
+
+}

+ 20 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/po/StampTaxAuditPO.java

@@ -0,0 +1,20 @@
+package com.ruoyi.hywz.entity.po;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author: jxh
+ * @description:
+ * @create: 2024/7/29
+ */
+@Data
+public class StampTaxAuditPO {
+
+    @ApiModelProperty("id")
+    private String id;
+
+    @ApiModelProperty("审核状态【-1驳回 0未提交 1审核中 2审核通过】")
+    private Integer auditState;
+
+}

+ 20 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/po/StampTaxBatchUpdateBusinessTypePO.java

@@ -0,0 +1,20 @@
+package com.ruoyi.hywz.entity.po;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author: jxh
+ * @description:
+ * @create: 2024/8/5
+ */
+@Data
+public class StampTaxBatchUpdateBusinessTypePO {
+
+    private List<String> ids;
+
+    private String businessTypeCode;
+    private String businessType;
+
+}

+ 22 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/po/StampTaxBatchUpdateTaxItemPO.java

@@ -0,0 +1,22 @@
+package com.ruoyi.hywz.entity.po;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author: jxh
+ * @description:
+ * @create: 2024/8/5
+ */
+@Data
+public class StampTaxBatchUpdateTaxItemPO {
+
+    private List<String> ids;
+
+    private String stampTaxItem;
+
+    private String stampTaxItemId;
+
+    private String stampTaxRate;
+}

+ 34 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/po/StampTaxComputeSavePO.java

@@ -0,0 +1,34 @@
+package com.ruoyi.hywz.entity.po;
+
+import com.ruoyi.hywz.entity.AdsMatHyxtStampTaxComputeItemD;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+/**
+ * @author: jxh
+ * @description:
+ * @create: 2024/7/29
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class StampTaxComputeSavePO extends HomeStampTaxCountPO {
+
+    @ApiModelProperty(value = "纳税人名称")
+    private String taxPayer;
+
+    @ApiModelProperty(value = "所属开始日期")
+    private String startDate;
+
+    @ApiModelProperty(value = "所属结束日期")
+    private String endDate;
+
+    @ApiModelProperty(value = "金额")
+    private String amount;
+
+    @ApiModelProperty(value = "明细")
+    private List<AdsMatHyxtStampTaxComputeItemD> itemList;
+
+}

+ 26 - 0
ruoyi-admin/src/main/java/com/ruoyi/hywz/entity/po/TaskQueryPO.java

@@ -0,0 +1,26 @@
+package com.ruoyi.hywz.entity.po;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author: jxh
+ * @description:
+ * @create: 2024/4/8
+ */
+@Data
+public class TaskQueryPO {
+
+    @ApiModelProperty(value = "任务名称")
+    private String taskName;
+
+    @ApiModelProperty(value = "申请用户昵称")
+    private String applyUserName;
+
+    @ApiModelProperty(value = "开始日期")
+    private String startDate;
+
+    @ApiModelProperty(value = "结束日期")
+    private String endDate;
+
+}

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov