Procházet zdrojové kódy

客户端功能及接口

huangjn před 3 roky
rodič
revize
5c8a717c11
100 změnil soubory, kde provedl 4648 přidání a 102 odebrání
  1. 124 0
      .idea/uiDesigner.xml
  2. 25 0
      blade-common/src/main/java/org/springblade/common/utils/CommonUtil.java
  3. 16 0
      blade-common/src/main/java/org/springblade/common/utils/IDUtils.java
  4. 34 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/ImageClassificationFileDTO.java
  5. 34 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/UserOpinionCommentsDTO.java
  6. 34 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/UserOpinionDTO.java
  7. 34 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/UserOpinionFileDTO.java
  8. 34 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/UserOpinionFlowDTO.java
  9. 63 46
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/ConstructionLedger.java
  10. 119 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/ImageClassificationFile.java
  11. 42 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/ImageClassificationShow.java
  12. 77 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/UserOpinion.java
  13. 66 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/UserOpinionComments.java
  14. 52 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/UserOpinionFile.java
  15. 113 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/UserOpinionFlow.java
  16. 6 3
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/ConstructionLedgerVO.java
  17. 68 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/ImageClassificationFileVO.java
  18. 13 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/ImageClassificationShowVO.java
  19. 85 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/NeiYeLedgerVO.java
  20. 36 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/NeiYeQueryVO.java
  21. 26 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TreeVo.java
  22. 34 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/UserOpinionCommentsVO.java
  23. 34 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/UserOpinionFileVO.java
  24. 38 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/UserOpinionFlowVO.java
  25. 71 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/UserOpinionVO.java
  26. 4 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/WeatherInfoVo.java
  27. 24 22
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ImageClassificationConfig.java
  28. 28 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ContractClient.java
  29. 35 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ImageClassificationConfigClient.java
  30. 26 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ProjectClient.java
  31. 26 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ProjectContractAreaClient.java
  32. 31 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsTreeContractClient.java
  33. 5 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ContractInfoVO.java
  34. 9 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ProjectInfoVO.java
  35. 34 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractTreeVOS.java
  36. 14 0
      blade-service/blade-business/pom.xml
  37. 61 19
      blade-service/blade-business/src/main/java/org/springblade/business/controller/ConstructionLedgerController.java
  38. 346 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/ImageClassificationFileController.java
  39. 216 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/NeiYeController.java
  40. 86 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/UserOpinionCommentsController.java
  41. 225 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/UserOpinionController.java
  42. 127 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/UserOpinionFileController.java
  43. 177 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/UserOpinionFlowController.java
  44. 79 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/UserViewProjectContractController.java
  45. 18 6
      blade-service/blade-business/src/main/java/org/springblade/business/controller/WeatherController.java
  46. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ConstructionLedgerMapper.java
  47. 8 1
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ConstructionLedgerMapper.xml
  48. 52 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ImageClassificationFileMapper.java
  49. 68 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ImageClassificationFileMapper.xml
  50. 12 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ImageClassificationShowMapper.java
  51. 32 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ImageClassificationShowMapper.xml
  52. 56 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/UserOpinionCommentsMapper.java
  53. 39 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/UserOpinionCommentsMapper.xml
  54. 42 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/UserOpinionFileMapper.java
  55. 19 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/UserOpinionFileMapper.xml
  56. 43 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/UserOpinionFlowMapper.java
  57. 52 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/UserOpinionFlowMapper.xml
  58. 41 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/UserOpinionMapper.java
  59. 32 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/UserOpinionMapper.xml
  60. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/IConstructionLedgerService.java
  61. 53 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/IImageClassificationFileService.java
  62. 44 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/IUserOpinionCommentsService.java
  63. 46 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/IUserOpinionFileService.java
  64. 48 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/IUserOpinionFlowService.java
  65. 47 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/IUserOpinionService.java
  66. 14 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/ImageClassificationShowService.java
  67. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ConstructionLedgerServiceImpl.java
  68. 116 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ImageClassificationFileServiceImpl.java
  69. 43 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ImageClassificationShowServiceImpl.java
  70. 58 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/UserOpinionCommentsServiceImpl.java
  71. 52 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/UserOpinionFileServiceImpl.java
  72. 61 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/UserOpinionFlowServiceImpl.java
  73. 142 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/UserOpinionServiceImpl.java
  74. 10 0
      blade-service/blade-business/src/main/java/sql/imageclassificationfile.menu.sql
  75. 1 0
      blade-service/blade-business/src/main/java/sql/u_construction_ledger.sql
  76. 76 0
      blade-service/blade-business/src/main/java/sql/u_image_classification_file.sql
  77. 48 0
      blade-service/blade-business/src/main/java/sql/u_image_classification_show.sql
  78. 48 0
      blade-service/blade-business/src/main/java/sql/u_user_opinion.sql
  79. 46 0
      blade-service/blade-business/src/main/java/sql/u_user_opinion_comments.sql
  80. 42 0
      blade-service/blade-business/src/main/java/sql/u_user_opinion_file.sql
  81. 55 0
      blade-service/blade-business/src/main/java/sql/u_user_opinion_flow.sql
  82. 10 0
      blade-service/blade-business/src/main/java/sql/useropinion.menu.sql
  83. 10 0
      blade-service/blade-business/src/main/java/sql/useropinioncomments.menu.sql
  84. 10 0
      blade-service/blade-business/src/main/java/sql/useropinionfile.menu.sql
  85. 10 0
      blade-service/blade-business/src/main/java/sql/useropinionflow.menu.sql
  86. 19 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ContractClientImpl.java
  87. 25 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ImageClassificationConfigClientImpl.java
  88. 20 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ProjectClientImpl.java
  89. 18 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ProjectContractAreaClientImpl.java
  90. 33 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreeContractClientImpl.java
  91. 5 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ContractInfoMapper.java
  92. 12 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ContractInfoMapper.xml
  93. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ProjectInfoMapper.java
  94. 4 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ProjectInfoMapper.xml
  95. 6 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IContractInfoService.java
  96. 6 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IProjectInfoService.java
  97. 9 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/ProjectContractAreaService.java
  98. 23 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java
  99. 23 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ProjectContractAreaServiceImpl.java
  100. 5 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ProjectInfoServiceImpl.java

+ 124 - 0
.idea/uiDesigner.xml

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

+ 25 - 0
blade-common/src/main/java/org/springblade/common/utils/CommonUtil.java

@@ -16,6 +16,9 @@
  */
 package org.springblade.common.utils;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * 通用工具类
  *
@@ -23,4 +26,26 @@ package org.springblade.common.utils;
  */
 public class CommonUtil {
 
+    /**
+     * 根据每页信息分组
+     */
+    public static <T> List<List<T>> getBatchSize(List<T> allIds, int size) {
+        List<List<T>> batchIds = new ArrayList<>();
+        if (allIds == null || allIds.size() == 0 ||  size <= 0) {
+            return batchIds;
+        }
+
+        int i = 0;
+        List<T> tmp = new ArrayList<>();
+        for (T map : allIds) {
+            tmp.add(map);
+            i++;
+            if (i % size == 0 || i ==  allIds.size()) {
+                batchIds.add(tmp);
+                tmp =  new ArrayList<>();
+            }
+        }
+        return batchIds;
+    }
+
 }

+ 16 - 0
blade-common/src/main/java/org/springblade/common/utils/IDUtils.java

@@ -0,0 +1,16 @@
+package org.springblade.common.utils;
+
+import java.util.Random;
+
+public class IDUtils {
+
+    public static Long generateId19(){
+        Random random = new Random();
+        long randomLong = random.nextLong();
+        if(randomLong < 0){
+            randomLong = randomLong * -1L;
+        }
+        return Long.parseLong(String.valueOf(randomLong).substring(0, 19));
+    }
+
+}

+ 34 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/ImageClassificationFileDTO.java

@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.business.dto;
+
+import org.springblade.business.entity.ImageClassificationFile;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2022-05-24
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ImageClassificationFileDTO extends ImageClassificationFile {
+	private static final long serialVersionUID = 1L;
+
+}

+ 34 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/UserOpinionCommentsDTO.java

@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.business.dto;
+
+import org.springblade.business.entity.UserOpinionComments;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 用户意见评论表数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2022-05-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class UserOpinionCommentsDTO extends UserOpinionComments {
+	private static final long serialVersionUID = 1L;
+
+}

+ 34 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/UserOpinionDTO.java

@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.business.dto;
+
+import org.springblade.business.entity.UserOpinion;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 用户意见表数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2022-05-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class UserOpinionDTO extends UserOpinion {
+	private static final long serialVersionUID = 1L;
+
+}

+ 34 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/UserOpinionFileDTO.java

@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.business.dto;
+
+import org.springblade.business.entity.UserOpinionFile;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 用户意见附件表数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2022-05-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class UserOpinionFileDTO extends UserOpinionFile {
+	private static final long serialVersionUID = 1L;
+
+}

+ 34 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/UserOpinionFlowDTO.java

@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.business.dto;
+
+import org.springblade.business.entity.UserOpinionFlow;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 用户意见处理流程表数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2022-05-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class UserOpinionFlowDTO extends UserOpinionFlow {
+	private static final long serialVersionUID = 1L;
+
+}

+ 63 - 46
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/ConstructionLedger.java

@@ -17,8 +17,11 @@
 package org.springblade.business.entity;
 
 import com.baomidou.mybatisplus.annotation.TableName;
+
 import java.io.Serializable;
 import java.time.LocalDateTime;
+
+import io.swagger.annotations.ApiModelProperty;
 import org.springblade.core.mp.base.BaseEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -34,52 +37,66 @@ import lombok.EqualsAndHashCode;
 @EqualsAndHashCode(callSuper = true)
 public class ConstructionLedger extends BaseEntity {
 
-	private static final long serialVersionUID = 1L;
-
-	/**
-	* 施工桩号
-	*/
-		private String station;
-	/**
-	* 施工部位
-	*/
-		private String site;
-	/**
-	* 施工开始时间
-	*/
-		private LocalDateTime siteStartTime;
-	/**
-	* 施工结束时间
-	*/
-		private LocalDateTime siteEndTime;
-	/**
-	* 检测开始时间
-	*/
-		private LocalDateTime detectionStartTime;
-	/**
-	* 检测结束时间
-	*/
-		private LocalDateTime detectionEndTime;
-	/**
-	* 设计方量
-	*/
-		private String designVolume;
-	/**
-	* 实际方量
-	*/
-		private String actualVolume;
-	/**
-	* 是否含混凝土
-	*/
-		private Integer isBeton;
-	/**
-	* wbs节点ID
-	*/
-		private Long wbsId;
-	/**
-	* 合同段ID
-	*/
-		private Long contractId;
+    private static final long serialVersionUID = 1L;
 
+    /**
+     * 施工桩号
+     */
+	@ApiModelProperty("施工桩号")
+    private String station;
+    /**
+     * 施工部位
+     */
+	@ApiModelProperty("施工部位")
+    private String site;
+    /**
+     * 施工开始时间
+     */
+	@ApiModelProperty("施工开始时间")
+    private LocalDateTime siteStartTime;
+    /**
+     * 施工结束时间
+     */
+	@ApiModelProperty("施工结束时间")
+    private LocalDateTime siteEndTime;
+    /**
+     * 检测开始时间
+     */
+	@ApiModelProperty("检测开始时间")
+    private LocalDateTime detectionStartTime;
+    /**
+     * 检测结束时间
+     */
+	@ApiModelProperty("检测结束时间")
+    private LocalDateTime detectionEndTime;
+    /**
+     * 设计方量
+     */
+	@ApiModelProperty("设计方量")
+    private String designVolume;
+    /**
+     * 实际方量
+     */
+	@ApiModelProperty("实际方量")
+    private String actualVolume;
+    /**
+     * 是否含混凝土
+     */
+	@ApiModelProperty("是否含混凝土")
+    private Integer isBeton;
+    /**
+     * wbs节点ID
+     */
+    private Long wbsId;
+    /**
+     * 合同段ID
+     */
+    @ApiModelProperty("合同段ID")
+    private Long contractId;
+    /**
+     * 项目ID
+     */
+    @ApiModelProperty("项目ID")
+    private Long projectId;
 
 }

+ 119 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/ImageClassificationFile.java

@@ -0,0 +1,119 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.business.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+import io.swagger.annotations.ApiModelProperty;
+import org.springblade.core.mp.base.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 实体类
+ *
+ * @author BladeX
+ * @since 2022-05-24
+ */
+@Data
+@TableName("u_image_classification_file")
+@EqualsAndHashCode(callSuper = true)
+public class ImageClassificationFile extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 分类ID,m_image_classification_config表主键
+     */
+    @ApiModelProperty("分类ID")
+    private Long classifyId;
+    /**
+     * 项目ID
+     */
+    @ApiModelProperty("项目ID")
+    private Long projectId;
+    /**
+     * 合同段ID
+     */
+    @ApiModelProperty("合同段ID")
+    private Long contractId;
+	/**
+	 * 工程节点ID,可为空
+	 */
+    @ApiModelProperty("划分节点ID")
+	private Long wbsId;
+    /**
+     * 文件大小
+     */
+    @ApiModelProperty("文件大小")
+    private String fileSize;
+    /**
+     * 文件名称
+     */
+    @ApiModelProperty("文件名称")
+    private String fileName;
+    /**
+     * 题名
+     */
+    @ApiModelProperty("题名")
+    private String title;
+    /**
+     * 文件类型,视频格式1,图片格式2
+     */
+    @ApiModelProperty("文件类型,视频格式1,图片格式2")
+    private Integer type;
+    /**
+     * 文件所在路径
+     */
+    @ApiModelProperty("文件所在路径")
+    private String imageUrl;
+    /**
+     * 拍摄者
+     */
+    @ApiModelProperty("拍摄者")
+    private String shootingUser;
+    /**
+     * 拍摄时间
+     */
+    @ApiModelProperty("拍摄时间")
+    private LocalDateTime shootingTime;
+    /**
+     * 照片号,视频格式不填
+     */
+    @ApiModelProperty("照片号,视频格式不填")
+    private String photoCode;
+    /**
+     * 底片号,视频格式不填
+     */
+    @ApiModelProperty("底片号,视频格式不填")
+    private String filmCode;
+    /**
+     * 参见号,视频格式不填
+     */
+    @ApiModelProperty("参见号,视频格式不填")
+    private String seeAlsoCode;
+    /**
+     * 文字说明
+     */
+    @ApiModelProperty("文字说明")
+    private String textContent;
+
+
+}

+ 42 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/ImageClassificationShow.java

@@ -0,0 +1,42 @@
+package org.springblade.business.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+@Data
+@TableName("u_image_classification_show")
+@EqualsAndHashCode(callSuper = true)
+public class ImageClassificationShow extends BaseEntity {
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 项目ID
+     */
+    @ApiModelProperty("项目ID")
+    private Long projectId;
+
+    /**
+     * 合同段ID
+     */
+    @ApiModelProperty("合同段ID")
+    private Long contractId;
+
+    /**
+     * 分类ID
+     */
+    @ApiModelProperty("分类ID")
+    private Long classifyId;
+
+    /**
+     * 是否显示该分类
+     */
+    @ApiModelProperty("是否显示该分类, 1显示")
+    private Integer isShow;
+
+}

+ 77 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/UserOpinion.java

@@ -0,0 +1,77 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.business.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+
+import io.swagger.annotations.ApiModelProperty;
+import org.springblade.core.mp.base.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 用户意见表实体类
+ *
+ * @author BladeX
+ * @since 2022-05-25
+ */
+@Data
+@TableName("u_user_opinion")
+@EqualsAndHashCode(callSuper = true)
+public class UserOpinion extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 项目ID
+     */
+    @ApiModelProperty(value = "项目ID")
+    private Long projectId;
+    /**
+     * 合同段ID
+     */
+    @ApiModelProperty(value = "合同段ID")
+    private Long contractId;
+    /**
+     * 内容
+     */
+    @ApiModelProperty(value = "内容")
+    private String opinionContent;
+    /**
+     * 第几次流程,初始为1,触发“不满意并再次提交解决”时在当前基础上递增
+     */
+    @ApiModelProperty(value = "第几次流程")
+    private Integer number;
+	/**
+	 * 创建人姓名
+	 */
+    @ApiModelProperty(value = "创建人姓名")
+	private String createUserName;
+    /**
+     * 问题类型
+     */
+    @ApiModelProperty(value = "问题类型")
+    private String problemType;
+    /**
+     * 点赞数
+     */
+    @ApiModelProperty(value = "工单点赞总数")
+    private Integer goodNumber;
+
+}

+ 66 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/UserOpinionComments.java

@@ -0,0 +1,66 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.business.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+
+import org.springblade.core.mp.base.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 用户意见评论表实体类
+ *
+ * @author BladeX
+ * @since 2022-05-25
+ */
+@Data
+@TableName("u_user_opinion_comments")
+@EqualsAndHashCode(callSuper = true)
+public class UserOpinionComments extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * u_user_opinion表主键
+     */
+    private Long userOpinionId;
+    /**
+     * 回复ID,当前表主键,目前只做一级回复,所以当前字段预留
+     */
+    private Long replyId;
+    /**
+     * 回复内容
+     */
+    private String replyContent;
+    /**
+     * 点赞量
+     */
+    private Integer goodCount;
+    /**
+     * 项目ID,创建人所在项目
+     */
+    private Long projectId;
+    /**
+     * 合同段ID,创建人所在合同段
+     */
+    private Long contractId;
+
+
+}

+ 52 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/UserOpinionFile.java

@@ -0,0 +1,52 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.business.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+
+import io.swagger.annotations.ApiModelProperty;
+import org.springblade.core.mp.base.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 用户意见附件表实体类
+ *
+ * @author BladeX
+ * @since 2022-05-25
+ */
+@Data
+@TableName("u_user_opinion_file")
+@EqualsAndHashCode(callSuper = true)
+public class UserOpinionFile extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * u_user_opinion表主键
+     */
+    private Long userOpinionId;
+    /**
+     * 上传附件的文件地址
+     */
+	@ApiModelProperty(value = "文件地址")
+    private String fileUrl;
+
+
+}

+ 113 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/UserOpinionFlow.java

@@ -0,0 +1,113 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.business.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import io.swagger.annotations.ApiModelProperty;
+import org.springblade.core.mp.base.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 用户意见处理流程表实体类
+ *
+ * @author BladeX
+ * @since 2022-05-25
+ */
+@Data
+@TableName("u_user_opinion_flow")
+@EqualsAndHashCode(callSuper = true)
+public class UserOpinionFlow extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * u_user_opinion表主键
+     */
+	@ApiModelProperty(value = "工单主键")
+    private Long userOpinionId;
+    /**
+     * 是否执行到当前环节,0未执行,1正在执行,2环节结束
+     */
+	@ApiModelProperty(value = "是否执行到当前环节,0未执行,1正在执行,2环节结束")
+    private Integer isCurrent;
+    /**
+     * 第几次流程,初始为1,触发“不满意并再次提交解决”时在新流程上递增
+     */
+    private Integer number;
+    /**
+     * 流程顺序
+     */
+	@ApiModelProperty(value = "流程顺序")
+    private Integer sort;
+    /**
+     * 分配的处理人
+     */
+	@ApiModelProperty(value = "分配的处理人")
+    private Long manageUser;
+    /**
+     * 分配的处理人姓名
+     */
+	@ApiModelProperty(value = "分配的处理人姓名")
+    private String manageUserName;
+    /**
+     * 分配的处理人电话
+     */
+	@ApiModelProperty(value = "分配的处理人电话")
+    private String manageUserPhone;
+    /**
+     * 评价类型,默认null :	1满意,2不满意并再次提交,3不满意并投诉
+     */
+	@ApiModelProperty(value = "评价类型:1满意,2不满意并再次提交,3不满意并投诉")
+    private Integer evaluation;
+	/**
+	 * 环节名称
+	 */
+	@ApiModelProperty(value = "环节名称")
+	private String replyName;
+	/**
+	 * 环节内容
+	 */
+	@ApiModelProperty(value = "环节内容")
+	private String replyContent;
+
+	/**
+	 * 环节预计结束时间
+	 */
+	private String manageTime;
+
+	public UserOpinionFlow(Long userOpinionId, Integer isCurrent, Integer number, Integer sort, String replyName, String replyContent, String manageTime, Long manageUser, String manageUserName, String manageUserPhone){
+		this.userOpinionId = userOpinionId;
+		this.isCurrent = isCurrent;
+		this.number = number;
+		this.sort = sort;
+		this.manageUser = manageUser;
+		this.manageUserName = manageUserName;
+		this.manageUserPhone = manageUserPhone;
+		this.replyName = replyName;
+		this.replyContent = replyContent;
+		this.manageTime = manageTime;
+		this.setCreateTime(new Date());
+	}
+
+    public UserOpinionFlow(){}
+
+}

+ 6 - 3
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/ConstructionLedgerVO.java

@@ -3,7 +3,6 @@ package org.springblade.business.vo;
 import org.springblade.business.entity.ConstructionLedger;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
-
 import java.util.List;
 
 /**
@@ -20,15 +19,19 @@ public class ConstructionLedgerVO extends ConstructionLedger {
 	/**
 	 * 施工开始时间
 	 */
-	private String siteStartTimeStr;
+	private String siteTimeStr;
 	/**
 	 * 施工结束时间
 	 */
-	private String siteEndTimeStr;
+	private String detectionTimeStr;
 
 	/**
 	 * 节点ID集合,多用于点击上级节点时查询其下级节点
 	 */
 	private List<String> wbsIds;
 
+	private Integer current;
+
+	private Integer size;
+
 }

+ 68 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/ImageClassificationFileVO.java

@@ -0,0 +1,68 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.business.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import org.springblade.business.entity.ImageClassificationFile;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * 视图实体类
+ *
+ * @author BladeX
+ * @since 2022-05-24
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ImageClassificationFileVO extends ImageClassificationFile {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 附件
+	 */
+	private MultipartFile file;
+
+	/**
+	 * 是否修改
+	 */
+	private String update;
+
+	/**
+	 * 节点ID集合,多用于点击上级节点时查询其下级节点
+	 */
+	private List<String> wbsIds;
+
+	@ApiModelProperty("父级节点查询")
+	private String wbsIdsStr;
+
+	/**
+	 * 共用查询条件
+	 */
+	@ApiModelProperty("共用查询条件")
+	private String queryStr;
+
+	/**
+	 * 时间查询(年、年-月、年-月-日)
+	 */
+	@ApiModelProperty("时间查询(年、年-月、年-月-日)")
+	private String queryDate;
+
+}

+ 13 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/ImageClassificationShowVO.java

@@ -0,0 +1,13 @@
+package org.springblade.business.vo;
+
+import lombok.Data;
+import org.springblade.business.entity.ImageClassificationShow;
+
+import java.util.List;
+
+@Data
+public class ImageClassificationShowVO {
+
+    private List<ImageClassificationShow> showList;
+
+}

+ 85 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/NeiYeLedgerVO.java

@@ -0,0 +1,85 @@
+package org.springblade.business.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class NeiYeLedgerVO {
+
+    /**
+     * 单位工程
+     */
+    @ApiModelProperty(value = "单位工程")
+    private String unitProject;
+
+    /**
+     * 分部工程
+     */
+    @ApiModelProperty(value = "分部工程")
+    private String partProject;
+
+    /**
+     * 分项工程
+     */
+    @ApiModelProperty(value = "分项工程")
+    private String subentryProject;
+
+    /**
+     * 工序
+     */
+    @ApiModelProperty(value = "工序")
+    private String process;
+
+    //施工台账信息 start ==================================
+    /**
+     * 施工起止时间
+     */
+    @ApiModelProperty(value = "施工起止时间")
+    private String siteStartToEndTime;
+
+    /**
+     * 检测起止时间
+     */
+    @ApiModelProperty(value = "检测起止时间")
+    private String detectionStartToEndTime;
+    //施工台账信息 end ==================================
+
+    /**
+     * 上报批次
+     */
+    @ApiModelProperty(value = "上报批次")
+    private String reportNumber;
+
+    /**
+     * 审批状态
+     */
+    @ApiModelProperty(value = "审批状态,1未上报,2待审批,3已审批")
+    private String taskStatus;
+
+    /**
+     * 是否评定
+     */
+    @ApiModelProperty(value = "是否评定 true为已评定")
+    private Boolean isEvaluate;
+
+    /**
+     * 是否关联试验
+     */
+    @ApiModelProperty(value = "是否关联试验 true为已关联")
+    private Boolean isExperiment;
+
+    public NeiYeLedgerVO(String... values){
+        this.unitProject = values[0];
+        this.partProject = values[1];
+        this.subentryProject = values[2];
+        this.process = values[3];
+        this.siteStartToEndTime = values[4];
+        this.detectionStartToEndTime = values[5];
+        this.taskStatus = values[6];
+        this.isEvaluate = Boolean.parseBoolean(values[7]);
+        this.isExperiment = Boolean.parseBoolean(values[8]);
+    }
+
+    public NeiYeLedgerVO(){}
+
+}

+ 36 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/NeiYeQueryVO.java

@@ -0,0 +1,36 @@
+package org.springblade.business.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class NeiYeQueryVO {
+
+    @ApiModelProperty(value = "父节点ID")
+    private String parentId;
+
+    @ApiModelProperty(value = "当前页")
+    private Integer current;
+
+    @ApiModelProperty(value = "每页数量")
+    private Integer size;
+
+    @ApiModelProperty(value = "文字查询")
+    private String queryStr;
+
+    @ApiModelProperty(value = "是否关联试验 true为已关联")
+    private Boolean isExperiment;
+
+    @ApiModelProperty(value = "审批状态,1未上报,2待审批,3已审批")
+    private String taskStatus;
+
+    @ApiModelProperty(value = "是否评定 true为已评定")
+    private Boolean isEvaluate;
+
+    @ApiModelProperty(value = "上报批次")
+    private String reportNumber;
+
+    @ApiModelProperty(value = "项目ID")
+    private String contractId;
+
+}

+ 26 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TreeVo.java

@@ -0,0 +1,26 @@
+package org.springblade.business.vo;
+
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class TreeVo {
+
+    private String name;
+
+    private List<TreeVo> treeList = new ArrayList<>();
+
+    public TreeVo(String name, List<TreeVo> treeList){
+        this.name = name;
+        this.treeList = treeList;
+    }
+
+    public TreeVo(String name){
+        this.name = name;
+    }
+
+    public TreeVo(){}
+
+}

+ 34 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/UserOpinionCommentsVO.java

@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.business.vo;
+
+import org.springblade.business.entity.UserOpinionComments;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 用户意见评论表视图实体类
+ *
+ * @author BladeX
+ * @since 2022-05-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class UserOpinionCommentsVO extends UserOpinionComments {
+	private static final long serialVersionUID = 1L;
+
+}

+ 34 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/UserOpinionFileVO.java

@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.business.vo;
+
+import org.springblade.business.entity.UserOpinionFile;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 用户意见附件表视图实体类
+ *
+ * @author BladeX
+ * @since 2022-05-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class UserOpinionFileVO extends UserOpinionFile {
+	private static final long serialVersionUID = 1L;
+
+}

+ 38 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/UserOpinionFlowVO.java

@@ -0,0 +1,38 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.business.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import org.springblade.business.entity.UserOpinionFlow;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 用户意见处理流程表视图实体类
+ *
+ * @author BladeX
+ * @since 2022-05-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class UserOpinionFlowVO extends UserOpinionFlow {
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty(value = "是否执行到当前环节,false(0未执行,1正在执行),true(2环节结束)")
+	private Boolean currentBol;
+
+}

+ 71 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/UserOpinionVO.java

@@ -0,0 +1,71 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.business.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import org.springblade.business.entity.UserOpinion;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.business.entity.UserOpinionFile;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * 用户意见表视图实体类
+ *
+ * @author BladeX
+ * @since 2022-05-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class UserOpinionVO extends UserOpinion {
+	private static final long serialVersionUID = 1L;
+
+	private String title;
+
+	/**
+	 * 回复量,目前只有一级回复,统计u_user_opinion_comments
+	 */
+	@ApiModelProperty(value = "回复量")
+	private Integer commentsNumber;
+
+	/**
+	 * 回显附件URL
+	 */
+	@ApiModelProperty(value = "回显附件URL")
+	private List<String> returnFiles;
+
+	/**
+	 * 是否已解决,判断流程第四步是否已经结束,如果最后环节的isCurrent为2则isSolve的值为1,说明已解决
+	 */
+	@ApiModelProperty(value = "是否已解决, 1为已解决")
+	private Integer isSolve = 0;
+
+	/**
+	 * 文件,图片,最多3张
+	 */
+	@ApiModelProperty(value = "上传附件集合")
+	private List<MultipartFile> files;
+
+	/**
+	 * 用户头像
+	 */
+	@ApiModelProperty(value = "用户头像")
+	private String avatar;
+
+}

+ 4 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/WeatherInfoVo.java

@@ -1,5 +1,6 @@
 package org.springblade.business.vo;
 
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -24,4 +25,7 @@ public class WeatherInfoVo {
 
     private String windLevel;
 
+    @ApiModelProperty("合同段ID")
+    private String contractId;
+
 }

+ 24 - 22
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ImageClassificationConfig.java

@@ -17,7 +17,9 @@
 package org.springblade.manager.entity;
 
 import com.baomidou.mybatisplus.annotation.TableName;
+
 import java.io.Serializable;
+
 import org.springblade.core.mp.base.BaseEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -33,28 +35,28 @@ import lombok.EqualsAndHashCode;
 @EqualsAndHashCode(callSuper = true)
 public class ImageClassificationConfig extends BaseEntity {
 
-	private static final long serialVersionUID = 1L;
-
-	/**
-	* 分类名称
-	*/
-		private String classfName;
-	/**
-	* 所属项目阶段
-	*/
-		private String projectStage;
-	/**
-	* 所属方
-	*/
-		private String affiliatedParty;
-	/**
-	* 文件类型
-	*/
-		private Integer fileType;
-	/**
-	* 存储目录格式
-	*/
-		private Integer storageDirectoryFormat;
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 分类名称
+     */
+    private String classfName;
+    /**
+     * 所属项目阶段
+     */
+    private String projectStage;
+    /**
+     * 所属方
+     */
+    private String affiliatedParty;
+    /**
+     * 文件类型
+     */
+    private Integer fileType;
+    /**
+     * 存储目录格式
+     */
+    private Integer storageDirectoryFormat;
 
 
 }

+ 28 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ContractClient.java

@@ -0,0 +1,28 @@
+package org.springblade.manager.feign;
+
+import org.springblade.manager.entity.ContractInfo;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+
+import static org.springblade.core.launch.constant.AppConstant.APPLICATION_NAME_PREFIX;
+
+@FeignClient(value = APPLICATION_NAME_PREFIX +  "manager")
+public interface ContractClient {
+
+    /**
+     * 接口前缀
+     */
+    String API_PREFIX = "/api/manager/contract";
+
+    /**
+     * 根据项目ID获取合同段
+     * @param ids ID集合
+     * @return 结果集
+     */
+    @GetMapping(API_PREFIX + "/queryContractListByIds")
+    List<ContractInfo> queryContractListByIds(@RequestParam List<Long> ids);
+
+}

+ 35 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ImageClassificationConfigClient.java

@@ -0,0 +1,35 @@
+package org.springblade.manager.feign;
+
+import org.springblade.manager.entity.ImageClassificationConfig;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+
+import static org.springblade.core.launch.constant.AppConstant.APPLICATION_NAME_PREFIX;
+
+@FeignClient(value = APPLICATION_NAME_PREFIX +  "manager")
+public interface ImageClassificationConfigClient {
+
+    /**
+     * 接口前缀
+     */
+    String API_PREFIX = "/api/manager/imageClassificationConfig";
+
+    /**
+     * 获取系统定义的所有有效分类
+     * @return 结果集
+     */
+    @GetMapping(API_PREFIX + "/queryClassificationConfigList")
+    List<ImageClassificationConfig> queryClassificationConfigList();
+
+    /**
+     * 根据ID集获取分类
+     * @param ids ID集合
+     * @return 结果集
+     */
+    @GetMapping(API_PREFIX + "/queryClassificationConfigListByIds")
+    List<ImageClassificationConfig> queryClassificationConfigListByIds(@RequestParam List<Long> ids);
+
+}

+ 26 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ProjectClient.java

@@ -0,0 +1,26 @@
+package org.springblade.manager.feign;
+
+import org.springblade.manager.entity.ProjectInfo;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+
+import java.util.List;
+
+import static org.springblade.core.launch.constant.AppConstant.APPLICATION_NAME_PREFIX;
+
+@FeignClient(value = APPLICATION_NAME_PREFIX +  "manager")
+public interface ProjectClient {
+
+    /**
+     * 接口前缀
+     */
+    String API_PREFIX = "/api/manager/project";
+
+    /**
+     * 根据项目ID获取合同段
+     * @return 结果集
+     */
+    @GetMapping(API_PREFIX + "/queryProjectList")
+    List<ProjectInfo> queryProjectList();
+
+}

+ 26 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ProjectContractAreaClient.java

@@ -0,0 +1,26 @@
+package org.springblade.manager.feign;
+
+import org.springblade.manager.entity.ProjectContractArea;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import static org.springblade.core.launch.constant.AppConstant.APPLICATION_NAME_PREFIX;
+
+@FeignClient(value = APPLICATION_NAME_PREFIX +  "manager")
+public interface ProjectContractAreaClient {
+
+    /**
+     * 接口前缀
+     */
+    String API_PREFIX = "/api/manager/projectContractArea";
+
+    /**
+     * 根据合同段获取
+     * @param contractId 合同段ID
+     * @return 结果
+     */
+    @GetMapping(API_PREFIX + "/queryContractAreaByContractId")
+    ProjectContractArea queryContractAreaByContractId(@RequestParam String contractId);
+
+}

+ 31 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsTreeContractClient.java

@@ -0,0 +1,31 @@
+package org.springblade.manager.feign;
+
+import org.springblade.manager.vo.WbsTreeContractTreeVOS;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+
+import static org.springblade.core.launch.constant.AppConstant.APPLICATION_NAME_PREFIX;
+
+@FeignClient(value = APPLICATION_NAME_PREFIX +  "manager")
+public interface WbsTreeContractClient {
+
+    /**
+     * 接口前缀
+     */
+    String API_PREFIX = "/api/manager/WbsTreeContract";
+
+    @PostMapping(API_PREFIX + "/queryContractWbsTreeAll")
+    List<WbsTreeContractTreeVOS> queryContractWbsTreeAll(@RequestParam String contractId, @RequestParam Integer wbsType, @RequestParam String parentId);
+
+    /**
+     * 根据项目ID获取合同段
+     * @return 结果集
+     */
+    @GetMapping(API_PREFIX + "/queryContractWbsTreeByContractIdAndType")
+    List<WbsTreeContractTreeVOS> queryContractWbsTreeByContractIdAndType(@RequestParam String contractId, @RequestParam Integer wbsType, @RequestParam String parentId);
+
+}

+ 5 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ContractInfoVO.java

@@ -36,4 +36,9 @@ public class ContractInfoVO extends ContractInfo {
 	 */
 	private String projectName;
 
+	/**
+	 * 合同段名称,用于同一返回格式
+	 */
+	private String name;
+
 }

+ 9 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ProjectInfoVO.java

@@ -20,6 +20,9 @@ import org.springblade.manager.entity.ProjectInfo;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * 客户级项目表视图实体类
  *
@@ -31,5 +34,11 @@ import lombok.EqualsAndHashCode;
 public class ProjectInfoVO extends ProjectInfo {
 	private static final long serialVersionUID = 1L;
 
+	private List<ContractInfoVO> contractInfoList = new ArrayList<>();
+
+	/**
+	 * 项目名称,用于同一返回格式
+	 */
+	private String name;
 
 }

+ 34 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractTreeVOS.java

@@ -0,0 +1,34 @@
+package org.springblade.manager.vo;
+
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 不知道为什么通过远程调用时实体字段不是想要的,所以中间转换一次
+ */
+@Data
+public class WbsTreeContractTreeVOS {
+
+    private String value;
+
+    private String key;
+
+    private Integer type;
+
+    private String title;
+
+    private String parentId;
+
+    private String id;
+
+    private Integer wbsType;
+
+    private String primaryKeyId;
+
+    private Boolean leaf;
+
+    private List<WbsTreeContractTreeVOS> children = new ArrayList<>();
+
+}

+ 14 - 0
blade-service/blade-business/pom.xml

@@ -28,6 +28,20 @@
             <artifactId>blade-business-api</artifactId>
             <version>${bladex.project.version}</version>
         </dependency>
+
+        <!--调用后台管理的API-->
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-manager-api</artifactId>
+            <version>${bladex.project.version}</version>
+        </dependency>
+        <!--调用用户管理的API-->
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-user-api</artifactId>
+            <version>${bladex.project.version}</version>
+        </dependency>
+
         <dependency>
             <groupId>org.springblade</groupId>
             <artifactId>blade-core-cloud</artifactId>

+ 61 - 19
blade-service/blade-business/src/main/java/org/springblade/business/controller/ConstructionLedgerController.java

@@ -1,17 +1,21 @@
 package org.springblade.business.controller;
 
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
+import cn.hutool.core.date.DateUtil;
+import io.swagger.annotations.*;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
 import javax.validation.Valid;
+
+import org.apache.commons.lang.StringUtils;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.manager.feign.WbsTreeContractClient;
+import org.springblade.manager.vo.WbsTreeContractTreeVOS;
+import org.springframework.beans.BeanUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -22,6 +26,7 @@ import org.springblade.business.service.IConstructionLedgerService;
 import org.springblade.core.boot.ctrl.BladeController;
 
 import java.util.Date;
+import java.util.List;
 
 /**
  *  施工台账控制器
@@ -37,6 +42,28 @@ public class ConstructionLedgerController extends BladeController {
 
 	private final IConstructionLedgerService constructionLedgerService;
 
+	private final WbsTreeContractClient wbsTreeContractClient;
+
+	/**
+	 * 获取当前合同段的划分树
+	 * @param wbsType 查询类型,1为质检类型划分
+	 * @return 结果
+	 */
+	@GetMapping("/queryContractWbsTreeByContractIdAndType")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "获取当前合同段的划分树")
+	@ApiImplicitParams(value = {
+			@ApiImplicitParam(name = "wbsType", value = "数据类型,目前质检为1", required = true),
+			@ApiImplicitParam(name = "parentId", value = "父节点,为空则查询第一级节点"),
+			@ApiImplicitParam(name = "contractId", value = "合同段ID", required = true)
+	})
+	public R<List<WbsTreeContractTreeVOS>> queryContractWbsTreeByContractIdAndType(@RequestParam Integer wbsType, @RequestParam String parentId, @RequestParam String contractId){
+		return StringUtils.isEmpty(parentId) ?
+				R.data(this.wbsTreeContractClient.queryContractWbsTreeByContractIdAndType(contractId, wbsType, "0"))
+				:
+				R.data(this.wbsTreeContractClient.queryContractWbsTreeByContractIdAndType(contractId, wbsType, parentId));
+	}
+
 	/**
 	 * 详情
 	 */
@@ -51,23 +78,24 @@ public class ConstructionLedgerController extends BladeController {
 	/**
 	 * 分页 
 	 */
-	@GetMapping("/list")
+	@PostMapping("/list")
 	@ApiOperationSupport(order = 2)
-	@ApiOperation(value = "分页(不建议)", notes = "传入constructionLedger")
-	public R<IPage<ConstructionLedgerVO>> list(ConstructionLedger constructionLedger, Query query) {
-		IPage<ConstructionLedger> pages = this.constructionLedgerService.page(Condition.getPage(query), Condition.getQueryWrapper(constructionLedger));
-		return R.data(ConstructionLedgerWrapper.build().pageVO(pages));
-	}
-
-	/**
-	 * 自定义分页 
-	 */
-	@GetMapping("/page")
-	@ApiOperationSupport(order = 3)
 	@ApiOperation(value = "分页(建议)", notes = "传入constructionLedger")
-	public R<IPage<ConstructionLedgerVO>> page(ConstructionLedgerVO constructionLedger, Query query) {
-		IPage<ConstructionLedgerVO> pages = this.constructionLedgerService.selectConstructionLedgerPage(Condition.getPage(query), constructionLedger);
-		return R.data(pages);
+	public R<IPage<ConstructionLedgerVO>> list(@Valid @RequestBody ConstructionLedgerVO vo) {
+		ConstructionLedger ledger = new ConstructionLedger();
+		BeanUtils.copyProperties(vo, ledger);
+
+		Query query = new Query();
+		query.setCurrent(vo.getCurrent());
+		query.setSize(vo.getSize());
+
+		IPage<ConstructionLedger> pages;
+		if(vo.getSiteStartTime() != null && vo.getSiteEndTime() != null){
+			pages = this.constructionLedgerService.page(Condition.getPage(query), Condition.getQueryWrapper(ledger).lambda().in(ConstructionLedger::getWbsId, vo.getWbsIds()).between(ConstructionLedger::getSiteStartTime, ledger.getSiteStartTime(), ledger.getSiteEndTime()));
+		} else {
+			pages = this.constructionLedgerService.page(Condition.getPage(query), Condition.getQueryWrapper(ledger).lambda().in(ConstructionLedger::getWbsId, vo.getWbsIds()));
+		}
+		return R.data(ConstructionLedgerWrapper.build().pageVO(pages));
 	}
 
 	/**
@@ -87,7 +115,21 @@ public class ConstructionLedgerController extends BladeController {
 	@PostMapping("/update")
 	@ApiOperationSupport(order = 5)
 	@ApiOperation(value = "修改", notes = "传入constructionLedger")
-	public R<Boolean> update(@Valid @RequestBody ConstructionLedger constructionLedger) {
+	public R<Boolean> update(@Valid @RequestBody ConstructionLedgerVO constructionLedger) {
+		//施工起止时间
+		if(StringUtils.isNotEmpty(constructionLedger.getSiteTimeStr()) && constructionLedger.getSiteTimeStr().contains("~")){
+			String[] time = constructionLedger.getSiteTimeStr().split("~");
+			constructionLedger.setSiteStartTime(DateUtil.toLocalDateTime(org.springblade.core.tool.utils.DateUtil.parse(time[0], "yyyy-MM-dd")));
+			constructionLedger.setSiteEndTime(DateUtil.toLocalDateTime(org.springblade.core.tool.utils.DateUtil.parse(time[1], "yyyy-MM-dd")));
+		}
+
+		//检测起止时间
+		if(StringUtils.isNotEmpty(constructionLedger.getDetectionTimeStr()) && constructionLedger.getDetectionTimeStr().contains("~")){
+			String[] time = constructionLedger.getDetectionTimeStr().split("~");
+			constructionLedger.setDetectionStartTime(DateUtil.toLocalDateTime(org.springblade.core.tool.utils.DateUtil.parse(time[0], "yyyy-MM-dd")));
+			constructionLedger.setDetectionEndTime(DateUtil.toLocalDateTime(org.springblade.core.tool.utils.DateUtil.parse(time[1], "yyyy-MM-dd")));
+		}
+
 		setUserData(constructionLedger, false);
 		return R.status(this.constructionLedgerService.updateById(constructionLedger));
 	}

+ 346 - 0
blade-service/blade-business/src/main/java/org/springblade/business/controller/ImageClassificationFileController.java

@@ -0,0 +1,346 @@
+package org.springblade.business.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.nacos.common.utils.StringUtils;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.annotations.*;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import org.springblade.business.entity.ImageClassificationShow;
+import org.springblade.business.service.ImageClassificationShowService;
+import org.springblade.business.vo.ImageClassificationShowVO;
+import org.springblade.business.vo.TreeVo;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.manager.entity.ImageClassificationConfig;
+import org.springblade.manager.feign.ImageClassificationConfigClient;
+import org.springblade.manager.feign.WbsTreeContractClient;
+import org.springblade.manager.vo.ImageClassificationConfigVO;
+import org.springblade.manager.vo.WbsTreeContractTreeVOS;
+import org.springframework.beans.BeanUtils;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springblade.business.entity.ImageClassificationFile;
+import org.springblade.business.vo.ImageClassificationFileVO;
+import org.springblade.business.service.IImageClassificationFileService;
+import org.springblade.core.boot.ctrl.BladeController;
+import java.io.IOException;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ *  影音资料控制器(客户端)
+ *
+ * @author BladeX
+ * @since 2022-05-24
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/imageClassificationFile")
+@Api(tags = "影音资料接口(客户端)")
+public class ImageClassificationFileController extends BladeController {
+
+	private final IImageClassificationFileService imageClassificationFileService;
+
+	private final ImageClassificationShowService imageClassificationShowService;
+
+	/**
+	 * 调用blade-manager的api
+	 */
+	private final ImageClassificationConfigClient imageClassificationConfigClient;
+
+	private final WbsTreeContractClient wbsTreeContractClient;
+
+	/**
+	 * 获取当前合同段的工程划分
+	 * @param parentId 父节点,为空则查询第一级节点
+	 * @return tree
+	 */
+	@GetMapping("/queryContractWbsTreeByContractIdAndType")
+	@ApiOperationSupport(order = 11)
+	@ApiOperation(value = "获取当前合同段的工程划分")
+	@ApiImplicitParams(value = {
+			@ApiImplicitParam(name = "parentId", value = "父节点,为空则查询第一级节点")
+	})
+	public R<List<WbsTreeContractTreeVOS>> queryContractWbsTreeByContractIdAndType(@RequestParam String parentId, @RequestParam String contractId){
+		List<WbsTreeContractTreeVOS> rootTreeNode;
+		if(StringUtils.isEmpty(parentId)){
+			//为空,说明初始化
+			//获取根节点
+			rootTreeNode = this.wbsTreeContractClient.queryContractWbsTreeByContractIdAndType(contractId, 1, "0");
+			if(rootTreeNode != null && rootTreeNode.size() != 0){
+				rootTreeNode.forEach(vo -> {
+					//获取一级子节点
+					List<WbsTreeContractTreeVOS> treeNodes = this.wbsTreeContractClient.queryContractWbsTreeByContractIdAndType(contractId, 1, vo.getId());
+					if(treeNodes != null && treeNodes.size() != 0){
+						vo.setChildren(treeNodes);
+					}
+				});
+			}
+		} else {
+			// todo 先写死项目ID
+			//不为空,获取其下子节点
+			rootTreeNode = this.wbsTreeContractClient.queryContractWbsTreeByContractIdAndType("1", 1, parentId);
+		}
+		return R.data(rootTreeNode);
+	}
+
+	/**
+	 * 保存或修改客户端显隐记录
+	 * @param showsVo 需要保存或修改的数据集合
+	 * @return 操作结果
+	 */
+	@PostMapping("/saveClassifyShowConfig")
+	@ApiOperationSupport(order = 10)
+	@ApiOperation(value = "保存客户端分类显隐记录")
+	public R<Boolean> saveOrUpdateClassifyShowConfig(@RequestBody ImageClassificationShowVO showsVo){
+		if(showsVo == null || showsVo.getShowList() == null || showsVo.getShowList().size() == 0){
+			return R.data(-1, false, "提交数据异常");
+		}
+		//获取集合
+		List<ImageClassificationShow> shows = showsVo.getShowList();
+		//判断提交的数据哪些是新增哪些是修改
+		List<ImageClassificationShow> saveShow = new ArrayList<>(), updateShow = new ArrayList<>();
+		shows.forEach(show -> {
+			if(show.getId() == null){
+				setUserData(show, true);
+				ImageClassificationShow newShow = new ImageClassificationShow();
+				BeanUtils.copyProperties(show, newShow);
+				saveShow.add(newShow);
+			} else {
+				setUserData(show, false);
+				updateShow.add(show);
+			}
+		});
+
+		boolean result = this.imageClassificationShowService.saveOrUpdateClassifyShowConfig(saveShow, updateShow);
+		if(!result){
+			return R.data(-1, false, "新增或修改失败");
+		}
+		return R.data(true);
+	}
+
+	/**
+	 * 获取当前项目类型的显隐配置列表
+	 * @return 结果数据集合
+	 */
+	@GetMapping("/getClassifyShowConfigList")
+	@ApiOperationSupport(order = 9)
+	@ApiOperation(value = "获取当前项目类型的显隐配置列表")
+	@ApiImplicitParams({
+			@ApiImplicitParam(name = "projectId", value = "项目ID", required = true),
+			@ApiImplicitParam(name = "contractId", value = "合同段ID", required = true)
+	})
+	public R<List<ImageClassificationConfigVO>> getClassifyShowConfigList(@RequestParam String projectId, @RequestParam String contractId){
+		//首先获取显隐
+		List<ImageClassificationShow> showClassifyIdList = this.imageClassificationShowService.queryShowClassify(projectId, contractId, null);
+		//获取当前系统配置的所有有效分类
+		List<ImageClassificationConfig> sysClassifyConfigList = this.imageClassificationConfigClient.queryClassificationConfigList();
+
+		if(sysClassifyConfigList == null || sysClassifyConfigList.size() == 0){
+			return R.data(-1, null, "不存在数据,请联系管理员或维护人员");
+		}
+		//返回的数据
+		List<ImageClassificationConfigVO> sysClassifyConfigVoList = JSONArray.parseArray(JSONObject.toJSONString(sysClassifyConfigList), ImageClassificationConfigVO.class);
+		if(showClassifyIdList != null && showClassifyIdList.size() != 0){
+			//存在显隐记录,只要存在一条记录其它的就默认不显示
+			showClassifyIdList.forEach(show -> {
+				for(ImageClassificationConfigVO vo : sysClassifyConfigVoList){
+					if(show.getClassifyId().equals(vo.getId())){
+						vo.setIsShow(show.getIsShow());
+						vo.setShowId(show.getId());
+						break;
+					}
+				}
+			});
+			//处理没有显隐的数据
+			sysClassifyConfigVoList.forEach(vo -> {
+				if(StringUtils.isEmpty(String.valueOf(vo.getShowId()))){
+					//默认为不显示
+					vo.setIsShow(0);
+				}
+			});
+		} else {
+			//不存在显隐记录,全部默认为显示
+			sysClassifyConfigVoList.forEach(vo -> vo.setIsShow(1));
+		}
+
+		return R.data(sysClassifyConfigVoList);
+	}
+
+	/**
+	 * 获取类型列表(类型主页)
+	 * @return 结果列表集合
+	 */
+	@GetMapping("/getClassIfyList")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "获取类型列表(类型主页)")
+	public R<List<ImageClassificationConfig>> getClassIfyList(@RequestParam String projectId, @RequestParam String contractId){
+		//获取当前项目下的类型显隐情况
+		List<ImageClassificationShow> showClassifyIdList = this.imageClassificationShowService.queryShowClassify(projectId, contractId, "valid");
+
+		//根据当前项目显示的类型ID获取系统默认的分类
+		List<ImageClassificationConfig> configList;
+		if(showClassifyIdList != null && showClassifyIdList.size() != 0){
+			//获取分类ID集合
+			List<Long> classifyIds = showClassifyIdList.stream().map(ImageClassificationShow::getClassifyId).distinct().collect(Collectors.toList());
+			configList = this.imageClassificationConfigClient.queryClassificationConfigListByIds(classifyIds);
+		} else {
+			configList = this.imageClassificationConfigClient.queryClassificationConfigList();
+		}
+
+		return R.data(configList);
+	}
+
+	/**
+	 * 下载
+	 * @param id 要下载的数据ID
+	 */
+	@PostMapping("/downloadFileByUrl")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "下载", notes = "传入id主键")
+	public void downloadFileByUrl(@RequestParam String id, HttpServletResponse response) throws IOException {
+
+	}
+
+	/**
+	 * 获取时间结构树
+	 * @param classifyId 分类ID
+	 * @return 树结构
+	 */
+	@GetMapping("/getYearDateTree")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "获取时间结构")
+	@ApiImplicitParams({
+			@ApiImplicitParam(name = "classifyId", value = "分类ID"),
+			@ApiImplicitParam(name = "projectId", value = "项目ID"),
+			@ApiImplicitParam(name = "contractId", value = "合同段ID")
+	})
+	public R<List<TreeVo>> getYearDateTree(@RequestParam String classifyId, @RequestParam String projectId, @RequestParam String contractId){
+		//获取当前分类下当前项目的拍摄时间并形成tree结构
+		return R.data(this.imageClassificationFileService.getYearDateTree(classifyId, projectId, contractId));
+	}
+
+	/**
+	 * 自定义分页
+	 * @param fileVO 查询条件
+	 * @param query 分页信息
+	 * @return 列表集合
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "分页")
+	@ApiImplicitParams({
+			@ApiImplicitParam(name = "classifyId", value = "分类ID"),
+			@ApiImplicitParam(name = "projectId", value = "项目ID"),
+			@ApiImplicitParam(name = "queryStr", value = "输入框查询"),
+			@ApiImplicitParam(name = "queryDate", value = "时间查询"),
+			@ApiImplicitParam(name = "wbsIdsStr", value = "节点查询"),
+	})
+	public R<IPage<ImageClassificationFileVO>> page(ImageClassificationFileVO fileVO, Query query){
+		IPage<ImageClassificationFileVO> page = this.imageClassificationFileService.selectImageClassificationFilePage(Condition.getPage(query), fileVO);
+		return R.data(page);
+	}
+
+	/**
+	 * 详情页
+	 * @param id 主键
+	 * @return 详情信息
+	 */
+	@PostMapping("/queryById")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "详情", notes = "传入主键")
+	public R<ImageClassificationFile> queryById(@RequestParam String id){
+		return R.data(this.imageClassificationFileService.getById(id));
+	}
+
+	/**
+	 * 修改数据
+	 * @param fileVO 表单数据
+	 * @return 修改结果
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "修改影音资料信息", notes = "传入表单数据")
+	public R<Boolean> update(@Valid @RequestBody ImageClassificationFileVO fileVO){
+		ImageClassificationFile newData = this.copyBeanData(fileVO, false);
+		return R.data(this.imageClassificationFileService.updateById(newData));
+	}
+
+	/**
+	 * 新增数据
+	 * @param fileVO 表单参数
+	 * @return 新增结果
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "新增影音资料信息", notes = "传入表单数据")
+	public R<Boolean> save(@Valid @RequestBody ImageClassificationFileVO fileVO){
+		try{
+			ImageClassificationFile newFile = this.copyBeanData(fileVO, true);
+			this.setUserData(newFile, false);
+			//落库数据
+			return R.status(this.imageClassificationFileService.save(newFile));
+		}catch (Exception e){
+			e.printStackTrace();
+		}
+		return R.data(-1, false, "数据操作失败");
+	}
+
+	//处理参数
+	private ImageClassificationFile copyBeanData(ImageClassificationFileVO fileVO, boolean isCreate){
+		ImageClassificationFile newFile = new ImageClassificationFile();
+		//复制数据
+		BeanUtils.copyProperties(fileVO, newFile);
+		//设置用户信息
+		setUserData(newFile, isCreate);
+		return new ImageClassificationFile();
+	}
+
+	/**
+	 * 删除 
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "影音资料信息逻辑删除", notes = "传入ids")
+	public R<Boolean> remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(imageClassificationFileService.deleteLogic(Func.toLongList(ids)));
+	}
+
+	//设置登录用户信息
+	private void setUserData(ImageClassificationShow imageClassificationShow, boolean isCreate){
+		//获取当前登录人
+		BladeUser user = AuthUtil.getUser();
+		//记录操作人信息
+		if(isCreate){
+			imageClassificationShow.setCreateUser(user.getUserId());
+			imageClassificationShow.setCreateDept(Long.parseLong(user.getDeptId()));
+		} else {
+			imageClassificationShow.setUpdateUser(user.getUserId());
+			imageClassificationShow.setUpdateTime(new Date());
+		}
+	}
+
+	//设置登录用户信息
+	private void setUserData(ImageClassificationFile imageClassificationFile, boolean isCreate){
+		//获取当前登录人
+		BladeUser user = AuthUtil.getUser();
+		//记录操作人信息
+		if(isCreate){
+			imageClassificationFile.setCreateUser(user.getUserId());
+			imageClassificationFile.setCreateDept(Long.parseLong(user.getDeptId()));
+		} else {
+			imageClassificationFile.setUpdateUser(user.getUserId());
+			imageClassificationFile.setUpdateTime(new Date());
+		}
+	}
+
+}

+ 216 - 0
blade-service/blade-business/src/main/java/org/springblade/business/controller/NeiYeController.java

@@ -0,0 +1,216 @@
+package org.springblade.business.controller;
+
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.nacos.common.utils.StringUtils;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.business.entity.ConstructionLedger;
+import org.springblade.business.service.IConstructionLedgerService;
+import org.springblade.business.vo.NeiYeLedgerVO;
+import org.springblade.business.vo.NeiYeQueryVO;
+import org.springblade.common.utils.CommonUtil;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.tool.api.R;
+import org.springblade.manager.feign.WbsTreeContractClient;
+import org.springblade.manager.vo.WbsTreeContractTreeVOS;
+import org.springframework.web.bind.annotation.*;
+import org.springblade.core.mp.support.Query;
+
+import java.util.*;
+
+@RestController
+@AllArgsConstructor
+@RequestMapping("/neiYeController")
+@Api(tags = "内业台账")
+public class NeiYeController {
+
+    private final WbsTreeContractClient wbsTreeContractClient;
+
+    private final IConstructionLedgerService constructionLedgerService;
+
+    /**
+     * 获取内业台账列表
+     * @return 内业台账列表
+     */
+    @PostMapping("/queryCurrentNodeNeiYeLedger")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation(value = "获取内业台账列表")
+    public R<IPage<NeiYeLedgerVO>> queryCurrentNodeNeiYeLedger(@RequestBody NeiYeQueryVO queryVO){
+        //获取当前合同段所有划分情况
+        List<WbsTreeContractTreeVOS> contractNodeLIst = this.wbsTreeContractClient.queryContractWbsTreeAll(queryVO.getContractId(), 1, "");
+        //形成Map
+        Map<String,WbsTreeContractTreeVOS> vosMap = new HashMap<>();
+        Map<String,String> vosParentMap = new HashMap<>();
+        contractNodeLIst.forEach(vo -> {
+            vosMap.put(vo.getId(), vo);
+            if(vosParentMap.containsKey(vo.getParentId())){
+                //存在,获取拼接
+                vosParentMap.put(vo.getParentId(), vosParentMap.get(vo.getParentId()) + "," + vo.getId());
+            } else {
+                //不存在,新建
+                vosParentMap.put(vo.getParentId(), vo.getId());
+            }
+        });
+
+        //根据parentId获取其下所有子节点
+        String clientId = queryVO.getParentId();
+        clientId = this.getAllClientId(queryVO.getParentId(), clientId, vosParentMap);
+
+        //结果数据
+        List<NeiYeLedgerVO> result = new ArrayList<>();
+        //循环节点集合,找到工序节点
+        for(WbsTreeContractTreeVOS vos : contractNodeLIst){
+            if(new Integer("6").equals(vos.getType())){
+                if(clientId != null && !clientId.contains(vos.getId())){
+                    continue;
+                }
+
+                //工序节点,递归获取父节点信息
+                Map<String,String> map = new HashMap<>();
+                this.foreachGetParent(map, vosMap, vos.getParentId());
+
+                //目前先查询名称(暂时这么处理)
+                if(StringUtils.isNotEmpty(queryVO.getQueryStr()) && !(map.get("unitProject").contains(queryVO.getQueryStr()) || map.get("partProject").contains(queryVO.getQueryStr()) || map.get("subentryProject").contains(queryVO.getQueryStr()) || vos.getTitle().contains(queryVO.getQueryStr()))){
+                    //不符合查询条件,跳过
+                    continue;
+                }
+
+                //获取当前工序的施工台账信息
+                Map<String,Object> queryMap = new HashMap<>();
+                queryMap.put("wbs_id",vos.getPrimaryKeyId());
+                List<ConstructionLedger> ledgers = this.constructionLedgerService.listByMap(queryMap);
+                if(ledgers != null && ledgers.size() > 0){
+                    ConstructionLedger ledger = ledgers.get(0);
+                    if(ledger.getSiteStartTime() != null && ledger.getSiteEndTime() != null){
+                        //获取施工起止时间
+                        map.put("siteStartToEndTime", DateUtil.format(ledger.getSiteStartTime(), "yyyy-MM-dd") + " ~ " + DateUtil.format(ledger.getSiteEndTime(), "yyyy-MM-dd"));
+                    }
+                    if(ledger.getDetectionStartTime() != null && ledger.getDetectionEndTime() != null){
+                        //获取检测起止时间
+                        map.put("detectionStartToEndTime", DateUtil.format(ledger.getDetectionStartTime(), "yyyy-MM-dd") + " ~ " + DateUtil.format(ledger.getDetectionEndTime(), "yyyy-MM-dd"));
+                    }
+                }
+                //todo 当前缺少流程状态、是否关联评定、是否关联试验 =================================
+                //新增列表数据
+                result.add(new NeiYeLedgerVO(map.get("unitProject"), map.get("partProject"), map.get("subentryProject"), vos.getTitle(), map.get("siteStartToEndTime"), map.get("detectionStartToEndTime"), "1", "false", "false"));
+            }
+        }
+        //根据query的分页信息分组
+        if(result.size() != 0){
+            List<List<NeiYeLedgerVO>> groupList = CommonUtil.getBatchSize(result, queryVO.getSize());
+
+            //转换为page信息
+            Query query = new Query();
+            query.setCurrent(queryVO.getCurrent());
+            query.setSize(queryVO.getSize());
+            IPage<NeiYeLedgerVO> page = Condition.getPage(query);
+            page.setTotal(result.size());
+            page.setRecords(groupList.get(queryVO.getCurrent() == 0 ? 0 : queryVO.getCurrent() - 1));
+            return R.data(page);
+        }
+
+        return R.data(null);
+    }
+
+
+
+    /**
+     * 获取指定节点下的所有子节点
+     * @param parentId 父节点
+     * @param clientId 子节点ID串
+     * @param vosParentMap 数据map
+     * @return clientId
+     */
+    private String getAllClientId(String parentId, String clientId, Map<String,String> vosParentMap){
+        if(vosParentMap.containsKey(parentId)){
+            //获取其下所有子节点
+            String clientIds = vosParentMap.get(parentId);
+            if(StringUtils.isNotEmpty(clientIds)){
+                String[] clientIdArray = clientIds.split(",");
+                for(String id : clientIdArray){
+                    clientId = this.getAllClientId(id, clientId, vosParentMap);
+                }
+                clientId += "," + clientIds;
+            }
+        }
+        return clientId;
+    }
+
+    /**
+     * 递归获取父节点信息
+     * @param resultMap 结果集合
+     * @param vosMap 所有节点信息
+     * @param parentId 父节点
+     */
+    private void foreachGetParent(Map<String,String> resultMap, Map<String,WbsTreeContractTreeVOS> vosMap, String parentId){
+        if(vosMap.containsKey(parentId) || !"0".equals(parentId.trim())){
+            //存在父节点信息,获取
+            WbsTreeContractTreeVOS vos = vosMap.get(parentId);
+            if(new Integer("1").equals(vos.getType())){
+                //类型属于1则为单位工程
+                resultMap.put("unitProject", vos.getTitle());
+            } else if(Arrays.asList("2,3".split(",")).contains(String.valueOf(vos.getType()))){
+                //类型属于2和3则为分部工程和子分部工程
+                if(resultMap.containsKey("partProject")){
+                    //存在
+                    resultMap.put("partProject", vos.getTitle() + "/" + resultMap.get("partProject"));
+                } else {
+                    //不存在
+                    resultMap.put("partProject", vos.getTitle());
+                }
+            } else if(Arrays.asList("4,5".split(",")).contains(String.valueOf(vos.getType()))){
+                //类型属于2和3则为分项工程和子分项工程
+                if(resultMap.containsKey("subentryProject")){
+                    //存在
+                    resultMap.put("subentryProject", vos.getTitle() + "/" + resultMap.get("subentryProject"));
+                } else {
+                    //不存在
+                    resultMap.put("subentryProject", vos.getTitle());
+                }
+            }
+            this.foreachGetParent(resultMap, vosMap, vos.getParentId());
+        }
+    }
+
+    /**
+     * 获取当前合同段的划分树
+     * @param wbsType 查询类型,1为质检类型划分
+     * @return 结果
+     */
+    @GetMapping("/queryContractWbsTreeByContractIdAndType")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "获取当前合同段的划分树")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "wbsType", value = "数据类型,目前质检为1"),
+            @ApiImplicitParam(name = "parentId", value = "父节点,为空则查询第一级节点"),
+            @ApiImplicitParam(name = "contractId", value = "合同段ID", required = true)
+    })
+    public R<List<WbsTreeContractTreeVOS>> queryContractWbsTreeByContractIdAndType(@RequestParam Integer wbsType, @RequestParam String parentId, @RequestParam String contractId){
+        List<WbsTreeContractTreeVOS> rootTreeNode;
+        if(StringUtils.isEmpty(parentId)){
+            //为空,说明初始化
+            //获取根节点
+            rootTreeNode = this.wbsTreeContractClient.queryContractWbsTreeByContractIdAndType(contractId, 1, "0");
+            if(rootTreeNode != null && rootTreeNode.size() != 0){
+                rootTreeNode.forEach(vo -> {
+                    //获取一级子节点
+                    List<WbsTreeContractTreeVOS> treeNodes = this.wbsTreeContractClient.queryContractWbsTreeByContractIdAndType(contractId, 1, vo.getId());
+                    if(treeNodes != null && treeNodes.size() != 0){
+                        vo.setChildren(treeNodes);
+                    }
+                });
+            }
+        } else {
+            // todo 先写死项目ID
+            //不为空,获取其下子节点
+            rootTreeNode = this.wbsTreeContractClient.queryContractWbsTreeByContractIdAndType(contractId, 1, parentId);
+        }
+        return R.data(rootTreeNode);
+    }
+
+}

+ 86 - 0
blade-service/blade-business/src/main/java/org/springblade/business/controller/UserOpinionCommentsController.java

@@ -0,0 +1,86 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.business.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springblade.business.entity.UserOpinionComments;
+import org.springblade.business.service.IUserOpinionCommentsService;
+import org.springblade.core.boot.ctrl.BladeController;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 用户意见评论表 控制器
+ *
+ * @author BladeX
+ * @since 2022-05-25
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/userOpinionComments")
+@Api(value = "用户意见评论表", tags = "用户意见评论表接口")
+public class UserOpinionCommentsController extends BladeController {
+
+	private final IUserOpinionCommentsService userOpinionCommentsService;
+
+	/**
+	 * 获取当前工单下的所有评论
+	 * @param userOpinionId 工单ID
+	 * @return 结果集(一级评论)
+	 */
+	@GetMapping("/queryUserOpinionCommentsByUserOpinionId")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "获取当前工单下的所有评论")
+	public R<List<UserOpinionComments>> queryUserOpinionCommentsByUserOpinionId(@RequestParam String userOpinionId){
+		return R.data(this.userOpinionCommentsService.queryUserOpinionCommentsByUserOpinionId(userOpinionId));
+	}
+
+	/**
+	 * 新增用户工单评论
+	 * @param comments 数据
+	 * @return 新增结果
+	 */
+	@PostMapping("/saveUserOpinionComments")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "新增评论")
+	public R<Boolean> saveUserOpinionComments(@RequestBody UserOpinionComments comments){
+		return R.data(this.userOpinionCommentsService.save(this.setUserData(comments)));
+	}
+
+	//设置登录用户信息
+	private UserOpinionComments setUserData(UserOpinionComments userOpinionComments){
+		//获取当前登录人
+		BladeUser user = AuthUtil.getUser();
+		//记录操作人信息
+		userOpinionComments.setCreateUser(user.getUserId());
+		userOpinionComments.setCreateDept(user.getDeptId().contains(",") ? Long.parseLong(user.getDeptId().split(",")[0]) : Long.parseLong(user.getDeptId()));
+		userOpinionComments.setCreateTime(new Date());
+		return userOpinionComments;
+	}
+
+}

+ 225 - 0
blade-service/blade-business/src/main/java/org/springblade/business/controller/UserOpinionController.java

@@ -0,0 +1,225 @@
+package org.springblade.business.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.time.DateUtils;
+import org.springblade.business.entity.UserOpinionFile;
+import org.springblade.business.entity.UserOpinionFlow;
+import org.springblade.business.service.IUserOpinionFileService;
+import org.springblade.business.service.IUserOpinionFlowService;
+import org.springblade.common.utils.IDUtils;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.DateUtil;
+import org.springblade.system.entity.DictBiz;
+import org.springblade.system.feign.IDictBizClient;
+import org.springblade.system.vo.DictBizVO;
+import org.springframework.beans.BeanUtils;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.business.entity.UserOpinion;
+import org.springblade.business.vo.UserOpinionVO;
+import org.springblade.business.service.IUserOpinionService;
+import org.springblade.core.boot.ctrl.BladeController;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * 用户意见表 控制器
+ *
+ * @author BladeX
+ * @since 2022-05-25
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/userOpinion")
+@Api(value = "用户意见表", tags = "用户意见表接口")
+public class UserOpinionController extends BladeController {
+
+	private final IUserOpinionService userOpinionService;
+
+	private final IUserOpinionFileService userOpinionFileService;
+
+	private final IUserOpinionFlowService userOpinionFlowService;
+
+	private final IDictBizClient dictBizClient;
+
+	/**
+	 * 获取工单服务相关数据字典
+	 * @return 结果
+	 */
+	@GetMapping("/queryDictBizList")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "获取字典信息")
+	public R<List<DictBizVO>> queryDictBizList(){
+		//获取字典
+		List<DictBiz> dictList = this.dictBizClient.getList("opinion_type", "").getData();
+		//首先找到父节点为0的
+		List<DictBizVO> result = new ArrayList<>();
+		Iterator<DictBiz> iterator = dictList.iterator();
+		while (iterator.hasNext()){
+			DictBiz biz = iterator.next();
+			if(new Long("0").equals(biz.getParentId())){
+				DictBizVO vo = new DictBizVO();
+				BeanUtils.copyProperties(biz, vo);
+				result.add(vo);
+				iterator.remove();
+			}
+		}
+		//组成相关结构树
+		result.forEach(vo -> {
+			List<DictBizVO> clientList = new ArrayList<>();
+			Iterator<DictBiz> iterators = dictList.iterator();
+			while (iterators.hasNext()){
+				DictBiz biz = iterators.next();
+				if(biz.getParentId().equals(vo.getId())){
+					//找到子节点
+					DictBizVO voClient = new DictBizVO();
+					BeanUtils.copyProperties(biz, voClient);
+					clientList.add(voClient);
+					iterators.remove();
+				}
+			}
+			vo.setChildren(clientList);
+		});
+
+		return R.data(result);
+	}
+
+	/**
+	 * 获取当前用户提交的工单服务
+	 */
+	@PostMapping("/queryCurrentUserOpinionList")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "获取当前用户提交的工单服务")
+	public R<List<UserOpinionVO>> queryCurrentUserOpinionList(){
+		return R.data(this.userOpinionService.queryCurrentUserOpinionList(AuthUtil.getUser()));
+	}
+
+	/**
+	 * 新增点赞
+	 * @param good 点赞数
+	 * @param userOpinionId 点赞的用户工单ID
+	 * @return 新增结果
+	 */
+	@PostMapping("/addGoodNumber")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "点赞")
+	@ApiImplicitParams(value = {
+			@ApiImplicitParam(name = "good", value = "点赞量", required = true),
+			@ApiImplicitParam(name = "userOpinionId", value = "工单ID", required = true)
+	})
+	public R<Boolean> addGoodNumber(@RequestParam Integer good,@RequestParam String userOpinionId){
+		if(StringUtils.isNotEmpty(userOpinionId)){
+			UserOpinion opinion = this.userOpinionService.getById(userOpinionId);
+			//获取原本的点赞数
+			Integer oldGood = opinion.getGoodNumber();
+			opinion.setGoodNumber(oldGood == null || oldGood < 0 ? good : oldGood + good);
+			return R.data(this.userOpinionService.updateById(opinion));
+		}
+		return R.data(-1, false, "数据操作失败");
+	}
+
+	/**
+	 * 工单主页列表
+	 * @param query 分页信息
+	 * @return 列表数据
+	 */
+	@GetMapping("/queryUserOpinionPage")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "获取工单服务列表")
+	public R<IPage<UserOpinionVO>> queryUserOpinionPage(Query query){
+		return R.data(this.userOpinionService.selectUserOpinionPage(Condition.getPage(query), new UserOpinionVO(), AuthUtil.getUser()));
+	}
+
+	/**
+	 * 新增 用户意见表
+	 */
+	@PostMapping("/saveUserOpinion")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "新增工单服务信息", notes = "传入userOpinion")
+	public R<Boolean> saveUserOpinion(@Valid @RequestBody UserOpinionVO userOpinionVo) {
+		//设置用户信息
+		this.setUserData(userOpinionVo);
+		//生成主表ID
+		long idKey = IDUtils.generateId19();
+		userOpinionVo.setId(idKey);
+
+		//获取附件信息
+		List<String> files = userOpinionVo.getReturnFiles();
+		if(files != null && files.size() != 0){
+			List<UserOpinionFile> saveFileList = new ArrayList<>();
+			//存在附件,执行上传后依次新增记录
+			for(String ossUrl : files){
+				try{
+					//上传附件
+					if(StringUtils.isNotEmpty(ossUrl)){
+						//新增附件信息
+						UserOpinionFile userOpinionFile = new UserOpinionFile();
+						//设置主表ID
+						userOpinionFile.setUserOpinionId(idKey);
+						//设置文件路径
+						userOpinionFile.setFileUrl(ossUrl);
+						saveFileList.add(userOpinionFile);
+					}
+				}catch (Exception e){
+					e.printStackTrace();
+				}
+			}
+			//新增附件信息
+			this.userOpinionFileService.saveBatch(saveFileList);
+		}
+
+		//生成第一次流程
+		List<UserOpinionFlow> saveFlowList = new ArrayList<>();
+		//提交成功环节
+		saveFlowList.add(setUserData(new UserOpinionFlow(idKey, 2, 1, 1, "已提交", "已成功提交您的工单信息", null, 123654L, "马自达", "123456789")));
+		//分配维护人员环节
+		saveFlowList.add(setUserData(new UserOpinionFlow(idKey, 1, 1, 2, "已分配专属客服", "客服:马自达<br>电话:123456789", null, 123654L, "马自达", "123456789")));
+		//进入人工预处理环节
+		String manageTime = DateUtil.format(DateUtils.addDays(new Date(), 5), "yyyy-MM-dd");
+		saveFlowList.add(setUserData(new UserOpinionFlow(idKey, 0, 1, 3, "进入人工预处理环节", "预计" + manageTime + "之前完成", manageTime, 123654L, "马自达", "123456789")));
+		//问题已解决
+		saveFlowList.add(setUserData(new UserOpinionFlow(idKey, 0, 1, 4, "问题已解决", null, null, 123654L, "马自达", "123456789")));
+		//新增处理环节
+		this.userOpinionFlowService.saveBatch(saveFlowList);
+		//最后新增主表数据
+		UserOpinion newUserOpinion = new UserOpinion();
+		BeanUtils.copyProperties(userOpinionVo, newUserOpinion);
+		newUserOpinion.setCreateTime(new Date());
+		return R.status(this.userOpinionService.save(newUserOpinion));
+	}
+
+	//设置登录用户信息
+	private UserOpinionFlow setUserData(UserOpinionFlow userOpinionFlow){
+		//获取当前登录人
+		BladeUser user = AuthUtil.getUser();
+		//记录操作人信息
+		userOpinionFlow.setCreateUser(user.getUserId());
+		userOpinionFlow.setCreateDept(user.getDeptId().contains(",") ? Long.parseLong(user.getDeptId().split(",")[0]) : Long.parseLong(user.getDeptId()));
+		return userOpinionFlow;
+	}
+
+	//设置登录用户信息
+	private void setUserData(UserOpinion userOpinion){
+		//获取当前登录人
+		BladeUser user = AuthUtil.getUser();
+		userOpinion.setCreateUser(user.getUserId());
+		userOpinion.setCreateUserName(user.getUserName());
+		userOpinion.setCreateDept(user.getDeptId().contains(",") ? Long.parseLong(user.getDeptId().split(",")[0]) : Long.parseLong(user.getDeptId()));
+	}
+}

+ 127 - 0
blade-service/blade-business/src/main/java/org/springblade/business/controller/UserOpinionFileController.java

@@ -0,0 +1,127 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.business.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.business.entity.UserOpinionFile;
+import org.springblade.business.vo.UserOpinionFileVO;
+import org.springblade.business.service.IUserOpinionFileService;
+import org.springblade.core.boot.ctrl.BladeController;
+
+/**
+ * 用户意见附件表 控制器
+ *
+ * @author BladeX
+ * @since 2022-05-25
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/userOpinionFile")
+@Api(value = "用户意见附件表", tags = "用户意见附件表接口")
+public class UserOpinionFileController extends BladeController {
+
+	private final IUserOpinionFileService userOpinionFileService;
+
+	/**
+	 * 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入userOpinionFile")
+	public R<UserOpinionFile> detail(UserOpinionFile userOpinionFile) {
+		UserOpinionFile detail = userOpinionFileService.getOne(Condition.getQueryWrapper(userOpinionFile));
+		return R.data(detail);
+	}
+
+	/**
+	 * 分页 用户意见附件表
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入userOpinionFile")
+	public R<IPage<UserOpinionFile>> list(UserOpinionFile userOpinionFile, Query query) {
+		IPage<UserOpinionFile> pages = userOpinionFileService.page(Condition.getPage(query), Condition.getQueryWrapper(userOpinionFile));
+		return R.data(pages);
+	}
+
+	/**
+	 * 自定义分页 用户意见附件表
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入userOpinionFile")
+	public R<IPage<UserOpinionFileVO>> page(UserOpinionFileVO userOpinionFile, Query query) {
+		IPage<UserOpinionFileVO> pages = userOpinionFileService.selectUserOpinionFilePage(Condition.getPage(query), userOpinionFile);
+		return R.data(pages);
+	}
+
+	/**
+	 * 新增 用户意见附件表
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入userOpinionFile")
+	public R save(@Valid @RequestBody UserOpinionFile userOpinionFile) {
+		return R.status(userOpinionFileService.save(userOpinionFile));
+	}
+
+	/**
+	 * 修改 用户意见附件表
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入userOpinionFile")
+	public R update(@Valid @RequestBody UserOpinionFile userOpinionFile) {
+		return R.status(userOpinionFileService.updateById(userOpinionFile));
+	}
+
+	/**
+	 * 新增或修改 用户意见附件表
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入userOpinionFile")
+	public R submit(@Valid @RequestBody UserOpinionFile userOpinionFile) {
+		return R.status(userOpinionFileService.saveOrUpdate(userOpinionFile));
+	}
+
+	
+	/**
+	 * 删除 用户意见附件表
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "逻辑删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(userOpinionFileService.deleteLogic(Func.toLongList(ids)));
+	}
+
+	
+}

+ 177 - 0
blade-service/blade-business/src/main/java/org/springblade/business/controller/UserOpinionFlowController.java

@@ -0,0 +1,177 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.business.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.time.DateUtils;
+import org.springblade.business.entity.UserOpinion;
+import org.springblade.business.service.IUserOpinionService;
+import org.springblade.business.vo.UserOpinionFlowVO;
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.DateUtil;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springblade.business.entity.UserOpinionFlow;
+import org.springblade.business.service.IUserOpinionFlowService;
+import org.springblade.core.boot.ctrl.BladeController;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 用户意见处理流程表 控制器
+ *
+ * @author BladeX
+ * @since 2022-05-25
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/userOpinionFlow")
+@Api(value = "用户意见处理流程表", tags = "用户意见处理流程表接口")
+public class UserOpinionFlowController extends BladeController {
+
+	private final IUserOpinionFlowService userOpinionFlowService;
+
+	private final IUserOpinionService userOpinionService;
+
+	/**
+	 * 统合接口
+	 * @param oldEndFlow 流程图的最后一个节点ID
+	 * @param userOpinionId 工单的最后一个节点ID
+	 * @param type 所选类型,1满意,2不满意并再次提交,3不满意并投诉
+	 */
+	@PostMapping("/disposeUserOpinionFeedback")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "统合处理意见接口")
+	@ApiImplicitParams(value = {
+			@ApiImplicitParam(name = "oldEndFlow", value = "流程图的最后一个节点ID", required = true),
+			@ApiImplicitParam(name = "userOpinionId", value = "工单的ID", required = true),
+			@ApiImplicitParam(name = "type", value = "所选类型,1满意,2不满意并再次提交,3不满意并投诉", required = true)
+	})
+	public R<Boolean> disposeUserOpinionFeedback(@RequestParam String oldEndFlow, @RequestParam String userOpinionId, @RequestParam Integer type){
+		switch (type){
+			case 1:
+				//满意
+				return this.updateCurrentUserOpinionFlow(oldEndFlow, 1);
+			case 2:
+				//不满意并再次提交
+				return this.saveNewCurrentUserOpinionFlow(userOpinionId, oldEndFlow);
+			case 3:
+				return this.updateCurrentUserOpinionFlow(oldEndFlow, 3);
+			default:
+				break;
+		}
+		return R.data(false);
+	}
+
+	/**
+	 * 处理满意或不满意并投诉
+	 * @param oldEndFlow 当前流程的最后一个节点ID
+	 * @return 修改结果
+	 */
+	private R<Boolean> updateCurrentUserOpinionFlow(String oldEndFlow, Integer type){
+		UserOpinionFlow oldFlow = this.userOpinionFlowService.getById(oldEndFlow);
+		oldFlow.setEvaluation(type);
+		return R.data(this.userOpinionFlowService.updateById(this.setUserData(oldFlow, false)));
+	}
+
+	/**
+	 * 新增当前工单的新处理流程(即触发不满意并再次提交解决)
+	 * @param userOpinionId 工单ID
+	 * @param oldEndFlow 当前流程的最后一个节点ID
+	 * @return 新增结果
+	 */
+	private R<Boolean> saveNewCurrentUserOpinionFlow(String userOpinionId, String oldEndFlow){
+
+		if(StringUtils.isNotEmpty(userOpinionId)){
+			//修改上一环节的evaluation,更改为2(不满意并再次提交)
+			UserOpinionFlow oldFlow = this.userOpinionFlowService.getById(oldEndFlow);
+			oldFlow.setEvaluation(2);
+			this.setUserData(oldFlow, false);
+
+			//获取工单信息,增加处理流程次数
+			UserOpinion userOpinion = this.userOpinionService.getById(userOpinionId);
+			Integer newNumber = userOpinion.getNumber() + 1;
+			userOpinion.setNumber(newNumber);
+
+			//生成新流程
+			List<UserOpinionFlow> saveFlowList = new ArrayList<>();
+			//提交成功环节
+			saveFlowList.add(this.setUserData(new UserOpinionFlow(Long.parseLong(userOpinionId), 2, newNumber, 1, "已提交", "已成功提交您的工单信息", null, 123654L, "马自达", "123456789"), true));
+			//分配维护人员环节
+			saveFlowList.add(this.setUserData(new UserOpinionFlow(Long.parseLong(userOpinionId), 1, newNumber, 2, "已分配专属客服", "客服:马自达<br>电话:123456789", null, 123654L, "马自达", "123456789"), true));
+			//进入人工预处理环节
+			String manageTime = DateUtil.format(DateUtils.addDays(new Date(), 5), "yyyy-MM-dd");
+			saveFlowList.add(this.setUserData(new UserOpinionFlow(Long.parseLong(userOpinionId), 0, newNumber, 3, "进入人工预处理环节", "预计" + manageTime + "之前完成", manageTime, 123654L, "马自达", "123456789"), true));
+			//问题已解决
+			saveFlowList.add(this.setUserData(new UserOpinionFlow(Long.parseLong(userOpinionId), 0, newNumber, 4, "问题已解决", null, null, 123654L, "马自达", "123456789"), true));
+
+			//修改流程
+			this.userOpinionFlowService.updateById(oldFlow);
+			//新增流程
+			this.userOpinionFlowService.saveBatch(saveFlowList);
+			//修改主表数据
+			return R.data(this.userOpinionService.updateById(userOpinion));
+		}
+
+		return R.data(false);
+	}
+
+	/**
+	 * 获取当前工单的最新流程
+	 * @param userOpinionId 用户工单ID
+	 * @return 最新流程集合
+	 */
+	@GetMapping("/queryCurrentUserOpinionFlowByUserOpinionId")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "获取当前工单的最新流程")
+	public R<List<UserOpinionFlowVO>> queryCurrentUserOpinionFlowByUserOpinionId(@RequestParam String userOpinionId){
+		if(StringUtils.isNotEmpty(userOpinionId)){
+			//获取当前工单的最新流程次数
+			UserOpinion userOpinion = this.userOpinionService.getById(userOpinionId);
+
+			return R.data(this.userOpinionFlowService.queryCurrentUserOpinionFlowByUserOpinionId(userOpinionId, userOpinion.getNumber()));
+		}
+		return R.data(null);
+	}
+
+	//设置登录用户信息
+	private UserOpinionFlow setUserData(UserOpinionFlow userOpinionFlow, boolean isCreate){
+		//获取当前登录人
+		BladeUser user = AuthUtil.getUser();
+		//记录操作人信息
+		if(isCreate){
+			userOpinionFlow.setCreateUser(user.getUserId());
+			userOpinionFlow.setCreateDept(user.getDeptId().contains(",") ? Long.parseLong(user.getDeptId().split(",")[0]) : Long.parseLong(user.getDeptId()));
+		} else {
+			userOpinionFlow.setUpdateUser(user.getUserId());
+			userOpinionFlow.setUpdateTime(new Date());
+		}
+		return userOpinionFlow;
+	}
+
+}

+ 79 - 0
blade-service/blade-business/src/main/java/org/springblade/business/controller/UserViewProjectContractController.java

@@ -0,0 +1,79 @@
+package org.springblade.business.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.core.tool.api.R;
+import org.springblade.manager.entity.ContractInfo;
+import org.springblade.manager.entity.ProjectInfo;
+import org.springblade.manager.feign.ContractClient;
+import org.springblade.manager.feign.ProjectClient;
+import org.springblade.manager.vo.ContractInfoVO;
+import org.springblade.manager.vo.ProjectInfoVO;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@RestController
+@AllArgsConstructor
+@RequestMapping("/userViewProjectContract")
+@Api(tags = "客户端首页")
+public class UserViewProjectContractController {
+
+    private final ProjectClient projectClient;
+
+    private final ContractClient contractClient;
+
+    /**
+     * 获取客户端首页当前用户关联的项目及合同段信息
+     * @return 项目及合同段结果集
+     */
+    @GetMapping("/queryUserViewProjectAndContract")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "获取客户端首页当前用户关联的项目及合同段信息")
+    public R<List<ProjectInfoVO>> queryUserViewProjectAndContract(){
+        //获取项目列表
+        List<ProjectInfo> projectInfos =this.projectClient.queryProjectList();
+        if(projectInfos != null && projectInfos.size() != 0){
+            //获取所有项目ID
+            List<Long> projectIds = projectInfos.stream().map(ProjectInfo::getId).distinct().collect(Collectors.toList());
+            //获取当前所有合同段
+            List<ContractInfo> contractInfos = this.contractClient.queryContractListByIds(projectIds);
+
+            //转换VO
+            List<ProjectInfoVO> projectInfoVOS = JSONArray.parseArray(JSONObject.toJSONString(projectInfos), ProjectInfoVO.class);
+            if(contractInfos != null && contractInfos.size() != 0){
+                //转换VO
+                List<ContractInfoVO> contractInfoVOS = JSONArray.parseArray(JSONObject.toJSONString(contractInfos), ContractInfoVO.class);
+
+                projectInfoVOS.forEach(vo -> {
+                    //统一返回格式
+                    vo.setName(vo.getProjectName());
+
+                    Iterator<ContractInfoVO> iterator = contractInfoVOS.iterator();
+                    while (iterator.hasNext()){
+                        ContractInfoVO next = iterator.next();
+                        //统一返回格式
+                        next.setName(next.getContractName());
+
+                        //找到对应的合同段
+                        if(String.valueOf(vo.getId()).equals(String.valueOf(next.getPId()))){
+                            vo.getContractInfoList().add(next);
+                            iterator.remove();
+                        }
+                    }
+                });
+            }
+            return R.data(projectInfoVOS);
+        }
+        return R.data(-1, null, "数据查询失败");
+    }
+
+}

+ 18 - 6
blade-service/blade-business/src/main/java/org/springblade/business/controller/WeatherController.java

@@ -16,6 +16,8 @@ import org.springblade.core.tool.utils.Func;
 import org.springblade.business.entity.WeatherInfo;
 import org.springblade.business.vo.WeatherInfoVo;
 import org.springblade.business.service.WeatherInfoService;
+import org.springblade.manager.entity.ProjectContractArea;
+import org.springblade.manager.feign.ProjectContractAreaClient;
 import org.springframework.beans.BeanUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springblade.core.mp.support.Condition;
@@ -37,6 +39,8 @@ public class WeatherController {
 
     private final WeatherInfoService weatherInfoService;
 
+    private final ProjectContractAreaClient projectContractAreaClient;
+
     /**
      * 单个或批量删除天气台账
      * @param ids 数据id集合
@@ -83,9 +87,12 @@ public class WeatherController {
     public R<IPage<WeatherInfo>> queryWeatherPage(WeatherInfoVo vo,Query query){
         Map<String,Object> weatherMap = new HashMap<>();
 
-        //todo 目前缺少合同段所在区域的地图编号及ID,所以暂时写死区域数据ID,之后修改为接口获取
-        weatherMap.put("contractAreaId", "12332112345678");
-        //todo ==================================================
+        //通过合同段获取区域编码
+        ProjectContractArea area = this.projectContractAreaClient.queryContractAreaByContractId(vo.getContractId());
+        if(area == null){
+            return R.data(-1, null, "数据操作失败");
+        }
+        weatherMap.put("contractAreaId", area.getId());
 
         if(StringUtils.isNotEmpty(vo.getRecordTime())){
             weatherMap.put("recordTime", vo.getRecordTime());
@@ -135,9 +142,14 @@ public class WeatherController {
     @ApiOperation(value = "新增", notes = "传入WeatherInfo")
     public R<Boolean> saveWeatherInfo(@RequestBody WeatherInfoVo weatherInfoVo){
         try{
-            //todo 目前缺少合同段所在区域的地图编号及ID,所以暂时写死区域数据ID,之后修改为接口获取
-            weatherInfoVo.setContractAreaId("12332112345678");
-            //todo ==================================================
+
+            //通过合同段获取区域编码
+            ProjectContractArea area = this.projectContractAreaClient.queryContractAreaByContractId(weatherInfoVo.getContractId());
+            if(area == null){
+                return R.data(-1, null, "数据操作失败");
+            }
+            //设置信息
+            weatherInfoVo.setContractAreaId(String.valueOf(area.getId()));
 
             WeatherInfo weatherInfo = new WeatherInfo();
             BeanUtils.copyProperties(weatherInfoVo, weatherInfo);

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ConstructionLedgerMapper.java

@@ -39,7 +39,7 @@ public interface ConstructionLedgerMapper extends BaseMapper<ConstructionLedger>
 	 * @param constructionLedger 参数
 	 * @return 结果
 	 */
-	List<ConstructionLedgerVO> selectConstructionLedgerPage(@Param("current") long current,@Param("size") long size, @Param("param") ConstructionLedgerVO constructionLedger);
+	List<ConstructionLedger> selectConstructionLedgerPage(@Param("current") long current,@Param("size") long size, @Param("param") ConstructionLedgerVO constructionLedger);
 
 	/**
 	 * 根据ID修改部分信息

+ 8 - 1
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ConstructionLedgerMapper.xml

@@ -23,6 +23,7 @@
         <result column="is_beton" property="isBeton"/>
         <result column="wbs_id" property="wbsId"/>
         <result column="contract_id" property="contractId"/>
+        <result column="project_id" property="projectId"/>
     </resultMap>
 
 
@@ -48,7 +49,7 @@
         <if test="param.siteStartTimeStr != null and param.siteEndTimeStr">
             and site_start_time between #{param.siteStartTimeStr} and #{param.siteEndTimeStr}
         </if>
-        limit ${current},${size}
+        limit ${size}
     </select>
 
     <update id="updateByIdNotAll">
@@ -74,6 +75,12 @@
         <if test="param.updateUser != null and param.updateUser != null">
             ,update_user = #{param.updateUser},update_time = #{param.updateTime}
         </if>
+        <if test="param.projectId != null and param.projectId != null">
+            ,project_id = #{param.projectId}
+        </if>
+        <if test="param.contractId != null and param.contractId != null">
+            ,contract_id = #{param.contractId}
+        </if>
         where id = #{param.id}
     </update>
 

+ 52 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ImageClassificationFileMapper.java

@@ -0,0 +1,52 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.business.mapper;
+
+import org.springblade.business.entity.ImageClassificationFile;
+import org.springblade.business.vo.ImageClassificationFileVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import java.util.Date;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ *  Mapper 接口
+ *
+ * @author BladeX
+ * @since 2022-05-24
+ */
+public interface ImageClassificationFileMapper extends BaseMapper<ImageClassificationFile> {
+
+	/**
+	 * 获取当前分类下当前项目的拍摄时间
+	 * @param classifyId 分类ID
+	 * @param projectId 项目ID
+	 * @return 拍摄时间集合
+	 */
+	List<Date> selectShootingTimeByClassifyAndProjectId(@Param("classifyId") String classifyId, @Param("projectId") String projectId, @Param("contractId") String contractId);
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param current 分页信息
+	 * @param size 分页信息
+	 * @param imageClassificationFile 参数
+	 * @return 结果
+	 */
+	List<ImageClassificationFileVO> selectImageClassificationFilePage(@Param("current")long current, @Param("size")long size, @Param("param") ImageClassificationFileVO imageClassificationFile);
+
+}

+ 68 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ImageClassificationFileMapper.xml

@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.business.mapper.ImageClassificationFileMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="imageClassificationFileResultMap" type="org.springblade.business.entity.ImageClassificationFile">
+        <result column="id" property="id"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_dept" property="createDept"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="status" property="status"/>
+        <result column="is_deleted" property="isDeleted"/>
+        <result column="classify_id" property="classifyId"/>
+        <result column="project_id" property="projectId"/>
+        <result column="contract_id" property="contractId"/>
+        <result column="wbs_id" property="wbsId"/>
+        <result column="title" property="title"/>
+        <result column="type" property="type"/>
+        <result column="image_url" property="imageUrl"/>
+        <result column="file_size" property="fileSize"/>
+        <result column="file_name" property="fileName"/>
+        <result column="shooting_user" property="shootingUser"/>
+        <result column="shooting_time" property="shootingTime"/>
+        <result column="photo_code" property="photoCode"/>
+        <result column="film_code" property="filmCode"/>
+        <result column="see_also_code" property="seeAlsoCode"/>
+        <result column="text_content" property="textContent"/>
+    </resultMap>
+
+    <select id="selectShootingTimeByClassifyAndProjectId" resultType="java.util.Date">
+        select shooting_time from u_image_classification_file where is_deleted = 0 and classify_id = #{classifyId} and project_id = #{projectId}
+        <if test="contractId != null and contractId != ''">
+            and contract_id = #{contractId}
+        </if>
+        group by shooting_time
+    </select>
+
+    <select id="selectImageClassificationFilePage" resultMap="imageClassificationFileResultMap">
+        select
+            id,
+            title,
+            text_content,
+            shooting_user,
+            shooting_time,
+            file_size,
+            image_url
+        from u_image_classification_file where is_deleted = 0
+        and project_id = #{param.projectId} and classify_id = #{param.classifyId}
+        <if test="param.contractId != null and param.contractId != ''">
+            and contract_id = #{param.contractId}
+        </if>
+        <if test="param.queryStr != null and param.queryStr != ''">
+            and (title like CONCAT('%',#{param.queryStr},'%') OR shooting_user like CONCAT('%',#{param.queryStr},'%'))
+        </if>
+        <if test="param.queryDate != null and param.queryDate != ''">
+            and shooting_time like COUNCAT('%',#{param.queryDate},'%')
+        </if>
+        <if test="param.wbsIds != null and param.wbsIds.size != 0">
+            and wbs_id in
+            <foreach collection="param.wbsIds" item="webId" open="(" separator="," close=")">#{webId}</foreach>
+        </if>
+        order by shooting_time desc
+        limit ${current},${size}
+    </select>
+
+</mapper>

+ 12 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ImageClassificationShowMapper.java

@@ -0,0 +1,12 @@
+package org.springblade.business.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springblade.business.entity.ImageClassificationShow;
+import org.apache.ibatis.annotations.Param;
+import java.util.List;
+
+public interface ImageClassificationShowMapper extends BaseMapper<ImageClassificationShow> {
+
+    List<ImageClassificationShow> queryShowClassify(@Param("projectId")String projectId, @Param("contractId")String contractId, @Param("allQuery")String allQuery);
+
+}

+ 32 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ImageClassificationShowMapper.xml

@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.business.mapper.ImageClassificationShowMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="imageClassificationShowResultMap" type="org.springblade.business.entity.ImageClassificationShow">
+        <result column="id" property="id"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_dept" property="createDept"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="status" property="status"/>
+        <result column="is_deleted" property="isDeleted"/>
+        <result column="classify_id" property="classifyId"/>
+        <result column="project_id" property="projectId"/>
+        <result column="contract_id" property="contractId"/>
+        <result column="is_show" property="isShow"/>
+    </resultMap>
+
+    <select id="queryShowClassify" resultMap="imageClassificationShowResultMap">
+        select id,classify_id,is_show from u_image_classification_show where project_id = #{projectId}
+        <if test="contractId != null and contractId != ''">
+            and contract_id = #{contractId}
+        </if>
+        <if test="allQuery != null">
+            and is_show = 1
+        </if>
+        and is_deleted = 0;
+    </select>
+
+</mapper>

+ 56 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/UserOpinionCommentsMapper.java

@@ -0,0 +1,56 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.business.mapper;
+
+import org.apache.ibatis.annotations.Param;
+import org.springblade.business.entity.UserOpinionComments;
+import org.springblade.business.vo.UserOpinionCommentsVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import java.util.List;
+
+/**
+ * 用户意见评论表 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2022-05-25
+ */
+public interface UserOpinionCommentsMapper extends BaseMapper<UserOpinionComments> {
+
+	/**
+	 * 获取当前工单下的所有评论
+	 * @param userOpinionId 工单ID
+	 * @return 结果集
+	 */
+	List<UserOpinionComments> queryUserOpinionCommentsByUserOpinionId(@Param("key")String userOpinionId);
+
+	/**
+	 * 统计点赞数
+	 */
+	Integer countGoodByUserOpinionKey(@Param("key") Long userOpinionKey);
+
+	/**
+	 * 统计评论数
+	 */
+	Integer countCommentsByUserOpinionKey(@Param("key") Long userOpinionKey);
+
+	/**
+	 * 自定义分页
+	 */
+	List<UserOpinionCommentsVO> selectUserOpinionCommentsPage(IPage page, UserOpinionCommentsVO userOpinionComments);
+
+}

+ 39 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/UserOpinionCommentsMapper.xml

@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.business.mapper.UserOpinionCommentsMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="userOpinionCommentsResultMap" type="org.springblade.business.entity.UserOpinionComments">
+        <result column="id" property="id"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_dept" property="createDept"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="status" property="status"/>
+        <result column="is_deleted" property="isDeleted"/>
+        <result column="user_opinion_id" property="userOpinionId"/>
+        <result column="reply_id" property="replyId"/>
+        <result column="reply_content" property="replyContent"/>
+        <result column="good_count" property="goodCount"/>
+        <result column="project_id" property="projectId"/>
+        <result column="contract_id" property="contractId"/>
+    </resultMap>
+
+    <select id="queryUserOpinionCommentsByUserOpinionId" resultMap="userOpinionCommentsResultMap">
+        select id,user_opinion_id,reply_id,reply_content,good_count,project_id,contract_id from u_user_opinion_comments where user_opinion_id = #{key} and is_deleted = 0
+    </select>
+
+    <select id="countCommentsByUserOpinionKey" resultType="java.lang.Integer">
+        select count(id) from u_user_opinion_comments where user_opinion_id = #{key} and is_deleted = 0
+    </select>
+
+    <select id="countGoodByUserOpinionKey" resultType="java.lang.Integer">
+        select count(good_count) from u_user_opinion_comments where user_opinion_id = #{key} and is_deleted = 0
+    </select>
+
+    <select id="selectUserOpinionCommentsPage" resultMap="userOpinionCommentsResultMap">
+        select * from u_user_opinion_comments where is_deleted = 0
+    </select>
+
+</mapper>

+ 42 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/UserOpinionFileMapper.java

@@ -0,0 +1,42 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.business.mapper;
+
+import org.springblade.business.entity.UserOpinionFile;
+import org.springblade.business.vo.UserOpinionFileVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import java.util.List;
+
+/**
+ * 用户意见附件表 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2022-05-25
+ */
+public interface UserOpinionFileMapper extends BaseMapper<UserOpinionFile> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param userOpinionFile
+	 * @return
+	 */
+	List<UserOpinionFileVO> selectUserOpinionFilePage(IPage page, UserOpinionFileVO userOpinionFile);
+
+}

+ 19 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/UserOpinionFileMapper.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.business.mapper.UserOpinionFileMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="userOpinionFileResultMap" type="org.springblade.business.entity.UserOpinionFile">
+        <result column="id" property="id"/>
+        <result column="status" property="status"/>
+        <result column="is_deleted" property="isDeleted"/>
+        <result column="user_opinion_id" property="userOpinionId"/>
+        <result column="file_url" property="fileUrl"/>
+    </resultMap>
+
+
+    <select id="selectUserOpinionFilePage" resultMap="userOpinionFileResultMap">
+        select * from u_user_opinion_file where is_deleted = 0
+    </select>
+
+</mapper>

+ 43 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/UserOpinionFlowMapper.java

@@ -0,0 +1,43 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.business.mapper;
+
+import org.apache.ibatis.annotations.Param;
+import org.springblade.business.entity.UserOpinionFlow;
+import org.springblade.business.vo.UserOpinionFlowVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import java.util.List;
+
+/**
+ * 用户意见处理流程表 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2022-05-25
+ */
+public interface UserOpinionFlowMapper extends BaseMapper<UserOpinionFlow> {
+
+	List<UserOpinionFlow> queryCurrentUserOpinionFlowByUserOpinionId(@Param("key")String userOpinionId, @Param("number")Integer number);
+
+	Integer selectIsSolveByUserOpinionKey(@Param("key") Long userOpinionKey);
+
+	/**
+	 * 自定义分页
+	 */
+	List<UserOpinionFlowVO> selectUserOpinionFlowPage(IPage page, UserOpinionFlowVO userOpinionFlow);
+
+}

+ 52 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/UserOpinionFlowMapper.xml

@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.business.mapper.UserOpinionFlowMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="userOpinionFlowResultMap" type="org.springblade.business.entity.UserOpinionFlow">
+        <result column="id" property="id"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_dept" property="createDept"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="status" property="status"/>
+        <result column="is_deleted" property="isDeleted"/>
+        <result column="user_opinion_id" property="userOpinionId"/>
+        <result column="is_current" property="isCurrent"/>
+        <result column="number" property="number"/>
+        <result column="sort" property="sort"/>
+        <result column="manage_user" property="manageUser"/>
+        <result column="manage_user_name" property="manageUserName"/>
+        <result column="manage_user_phone" property="manageUserPhone"/>
+        <result column="evaluation" property="evaluation"/>
+        <result column="reply_name" property="replyName"/>
+        <result column="reply_content" property="replyContent"/>
+        <result column="manage_time" property="manageTime"/>
+    </resultMap>
+
+    <select id="queryCurrentUserOpinionFlowByUserOpinionId" resultMap="userOpinionFlowResultMap">
+        select
+            id,
+            user_opinion_id,
+            evaluation,
+            manage_user,
+            manage_user_name,
+            manage_user_phone,
+            sort,
+            manage_time,
+            reply_name,
+            reply_content,
+            is_current
+        from u_user_opinion_flow where is_deleted = 0 and user_opinion_id = #{key} and number = #{number} order by sort ASC
+    </select>
+
+    <select id="selectIsSolveByUserOpinionKey" resultType="java.lang.Integer">
+        select is_current from u_user_opinion_flow where is_deleted = 0 and user_opinion_id = #{key} order by number DESC,sort DESC limit 1
+    </select>
+
+    <select id="selectUserOpinionFlowPage" resultMap="userOpinionFlowResultMap">
+        select * from u_user_opinion_flow where is_deleted = 0
+    </select>
+
+</mapper>

+ 41 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/UserOpinionMapper.java

@@ -0,0 +1,41 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.business.mapper;
+
+import org.apache.ibatis.annotations.Param;
+import org.springblade.business.entity.UserOpinion;
+import org.springblade.business.vo.UserOpinionVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import java.util.List;
+
+/**
+ * 用户意见表 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2022-05-25
+ */
+public interface UserOpinionMapper extends BaseMapper<UserOpinion> {
+
+	List<UserOpinion> queryCurrentUserOpinionList(@Param("userId")Long userId);
+
+	/**
+	 * 自定义分页
+	 */
+	List<UserOpinion> selectUserOpinionPage(@Param("current")Long current, @Param("size")Long size, @Param("param") UserOpinionVO userOpinion, @Param("param") String currentUser);
+
+}

+ 32 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/UserOpinionMapper.xml

@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.business.mapper.UserOpinionMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="userOpinionResultMap" type="org.springblade.business.entity.UserOpinion">
+        <result column="id" property="id"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_user_name" property="createUserName"/>
+        <result column="create_time" property="createTime"/>
+        <result column="create_dept" property="createDept"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="status" property="status"/>
+        <result column="is_deleted" property="isDeleted"/>
+        <result column="project_id" property="projectId"/>
+        <result column="contract_id" property="contractId"/>
+        <result column="opinion_content" property="opinionContent"/>
+        <result column="number" property="number"/>
+        <result column="problem_type" property="problemType"/>
+        <result column="good_number" property="goodNumber"/>
+    </resultMap>
+
+    <select id="queryCurrentUserOpinionList" resultMap="userOpinionResultMap">
+        select id, problem_type, create_time, number from u_user_opinion where create_user = #{userId} and is_deleted = 0 order by create_time DESC
+    </select>
+
+    <select id="selectUserOpinionPage" resultMap="userOpinionResultMap">
+        select id,project_id,contract_id,opinion_content,problem_type,good_number, create_user from u_user_opinion where is_deleted = 0 and create_user != #{currentUser} order by create_time DESC limit ${current},${size}
+    </select>
+
+</mapper>

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/service/IConstructionLedgerService.java

@@ -20,7 +20,7 @@ public interface IConstructionLedgerService extends BaseService<ConstructionLedg
 	 * @param constructionLedger 查询参数
 	 * @return 结果集合
 	 */
-	IPage<ConstructionLedgerVO> selectConstructionLedgerPage(IPage<ConstructionLedgerVO> page, ConstructionLedgerVO constructionLedger);
+	IPage<ConstructionLedger> selectConstructionLedgerPage(IPage<ConstructionLedger> page, ConstructionLedgerVO constructionLedger);
 
 	/**
 	 * 根据ID修改信息

+ 53 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/IImageClassificationFileService.java

@@ -0,0 +1,53 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.business.service;
+
+import org.springblade.business.entity.ImageClassificationFile;
+import org.springblade.business.vo.ImageClassificationFileVO;
+import org.springblade.business.vo.TreeVo;
+import org.springblade.core.mp.base.BaseService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ *  服务类
+ *
+ * @author BladeX
+ * @since 2022-05-24
+ */
+public interface IImageClassificationFileService extends BaseService<ImageClassificationFile> {
+
+	/**
+	 * 获取当前分类下当前项目的拍摄时间
+	 * @param classifyId 分类ID
+	 * @param projectId 项目ID
+	 * @return 拍摄时间集合
+	 */
+	List<TreeVo> getYearDateTree(String classifyId, String projectId, String contractId);
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page 分页信息
+	 * @param imageClassificationFile 查询条件
+	 * @return 列表集合
+	 */
+	IPage<ImageClassificationFileVO> selectImageClassificationFilePage(IPage<ImageClassificationFileVO> page, ImageClassificationFileVO imageClassificationFile);
+
+}

+ 44 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/IUserOpinionCommentsService.java

@@ -0,0 +1,44 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.business.service;
+
+import org.springblade.business.entity.UserOpinionComments;
+import org.springblade.business.vo.UserOpinionCommentsVO;
+import org.springblade.core.mp.base.BaseService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 用户意见评论表 服务类
+ *
+ * @author BladeX
+ * @since 2022-05-25
+ */
+public interface IUserOpinionCommentsService extends BaseService<UserOpinionComments> {
+
+	List<UserOpinionComments> queryUserOpinionCommentsByUserOpinionId(String userOpinionId);
+
+	Map<String,Integer> selectCommentsAndGoodCountByUserOpinionKey(Long userOpinionKey);
+
+	/**
+	 * 自定义分页
+	 */
+	IPage<UserOpinionCommentsVO> selectUserOpinionCommentsPage(IPage<UserOpinionCommentsVO> page, UserOpinionCommentsVO userOpinionComments);
+
+}

+ 46 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/IUserOpinionFileService.java

@@ -0,0 +1,46 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.business.service;
+
+import org.springblade.business.entity.UserOpinionFile;
+import org.springblade.business.vo.UserOpinionFileVO;
+import org.springblade.core.mp.base.BaseService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.util.List;
+
+/**
+ * 用户意见附件表 服务类
+ *
+ * @author BladeX
+ * @since 2022-05-25
+ */
+public interface IUserOpinionFileService extends BaseService<UserOpinionFile> {
+
+	/**
+	 * 获取具体工单相关附件
+	 * @param userOpinionKey 主表u_user_opinion主键
+	 * @return 结果
+	 */
+	List<UserOpinionFile> selectUserOpinionFileByUserOpinionKey(Long userOpinionKey);
+
+	/**
+	 * 自定义分页
+	 */
+	IPage<UserOpinionFileVO> selectUserOpinionFilePage(IPage<UserOpinionFileVO> page, UserOpinionFileVO userOpinionFile);
+
+}

+ 48 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/IUserOpinionFlowService.java

@@ -0,0 +1,48 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.business.service;
+
+import org.springblade.business.entity.UserOpinionFlow;
+import org.springblade.business.vo.UserOpinionFlowVO;
+import org.springblade.core.mp.base.BaseService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.util.List;
+
+/**
+ * 用户意见处理流程表 服务类
+ *
+ * @author BladeX
+ * @since 2022-05-25
+ */
+public interface IUserOpinionFlowService extends BaseService<UserOpinionFlow> {
+
+	/**
+	 * 获取当前工单的最新流程
+	 * @param userOpinionId 当前工单ID
+	 * @return 最新流程集合
+	 */
+	List<UserOpinionFlowVO> queryCurrentUserOpinionFlowByUserOpinionId(String userOpinionId, Integer number);
+
+	Integer selectIsSolveByUserOpinionKey(Long userOpinionKey);
+
+	/**
+	 * 自定义分页
+	 */
+	IPage<UserOpinionFlowVO> selectUserOpinionFlowPage(IPage<UserOpinionFlowVO> page, UserOpinionFlowVO userOpinionFlow);
+
+}

+ 47 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/IUserOpinionService.java

@@ -0,0 +1,47 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.business.service;
+
+import org.springblade.business.entity.UserOpinion;
+import org.springblade.business.vo.UserOpinionVO;
+import org.springblade.core.mp.base.BaseService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.core.secure.BladeUser;
+
+import java.util.List;
+
+/**
+ * 用户意见表 服务类
+ *
+ * @author BladeX
+ * @since 2022-05-25
+ */
+public interface IUserOpinionService extends BaseService<UserOpinion> {
+
+	/**
+	 * 获取当前用户提交的工单信息
+	 * @param user 用户
+	 * @return 结果集
+	 */
+	List<UserOpinionVO> queryCurrentUserOpinionList(BladeUser user);
+
+	/**
+	 * 自定义分页
+	 */
+	IPage<UserOpinionVO> selectUserOpinionPage(IPage<UserOpinionVO> page, UserOpinionVO userOpinion, BladeUser user);
+
+}

+ 14 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/ImageClassificationShowService.java

@@ -0,0 +1,14 @@
+package org.springblade.business.service;
+
+import org.springblade.business.entity.ImageClassificationShow;
+import org.springblade.core.mp.base.BaseService;
+
+import java.util.List;
+
+public interface ImageClassificationShowService extends BaseService<ImageClassificationShow> {
+
+    boolean saveOrUpdateClassifyShowConfig(List<ImageClassificationShow> saveShows, List<ImageClassificationShow> updateShows);
+
+    List<ImageClassificationShow> queryShowClassify(String projectId, String contractId, String allQuery);
+
+}

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ConstructionLedgerServiceImpl.java

@@ -18,7 +18,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 public class ConstructionLedgerServiceImpl extends BaseServiceImpl<ConstructionLedgerMapper, ConstructionLedger> implements IConstructionLedgerService {
 
 	@Override
-	public IPage<ConstructionLedgerVO> selectConstructionLedgerPage(IPage<ConstructionLedgerVO> page, ConstructionLedgerVO constructionLedger) {
+	public IPage<ConstructionLedger> selectConstructionLedgerPage(IPage<ConstructionLedger> page, ConstructionLedgerVO constructionLedger) {
 		//当前页面数据
 		long current = (page.getCurrent() - 1L) * page.getSize();
 		return page.setRecords(this.baseMapper.selectConstructionLedgerPage(current, page.getSize(), constructionLedger));

+ 116 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ImageClassificationFileServiceImpl.java

@@ -0,0 +1,116 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.business.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.nacos.common.utils.DateFormatUtils;
+import org.apache.commons.lang.StringUtils;
+import org.springblade.business.entity.ImageClassificationFile;
+import org.springblade.business.vo.ImageClassificationFileVO;
+import org.springblade.business.mapper.ImageClassificationFileMapper;
+import org.springblade.business.service.IImageClassificationFileService;
+import org.springblade.business.vo.TreeVo;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.util.*;
+
+/**
+ *  服务实现类
+ *
+ * @author BladeX
+ * @since 2022-05-24
+ */
+@Service
+public class ImageClassificationFileServiceImpl extends BaseServiceImpl<ImageClassificationFileMapper, ImageClassificationFile> implements IImageClassificationFileService {
+
+	@Override
+	public List<TreeVo> getYearDateTree(String classifyId, String projectId, String contractId) {
+		//获取时间
+		List<Date> shootingTimes = this.baseMapper.selectShootingTimeByClassifyAndProjectId(classifyId, projectId, contractId);
+
+		//最终集合
+		List<TreeVo> result = new ArrayList<>();
+		//年
+		Map<String,List<String>> yearMap = new HashMap<>();
+		for(Date date : shootingTimes){
+			//转换为字符串后拆分获取年月日
+			String dateStr = DateFormatUtils.format(date, "yyyy-MM-dd");
+			String[] dateArray = dateStr.split("-");
+			List<String> monthList;
+			if(yearMap.containsKey(dateArray[0] + "年")){
+				//存在,获取集合
+				monthList = yearMap.get(dateArray[0] + "年");
+			} else {
+				//不存在,创建
+				monthList = new ArrayList<>();
+			}
+			monthList.add(dateArray[1] + "-" + dateArray[2]);
+			yearMap.put(dateArray[0] + "年", monthList);
+		}
+
+		//循环年
+		for(Map.Entry<String,List<String>> yearMaps : yearMap.entrySet()){
+			String year = yearMaps.getKey();
+			List<String> monthList = yearMaps.getValue();
+
+			//月集合
+			List<TreeVo> monthResult = new ArrayList<>();
+
+			//月
+			TreeVo monthMap = new TreeVo();
+
+			//循环月份
+			String month = monthList.get(0).split("-")[0];
+			int index = 0;
+			for(String monthDay : monthList){
+				//拆分
+				String[] monthDays = monthDay.split("-");
+
+				if(!month.equals(monthDays[0])){
+					month = monthDays[0];
+					monthResult.add(monthMap);
+					monthMap = new TreeVo();
+				}
+				monthMap.setName(month + "月");
+				monthMap.getTreeList().add(new TreeVo(monthDays[1] + "日"));
+				index ++;
+				if(index == monthList.size()){
+					monthResult.add(monthMap);
+				}
+			}
+			//年
+			TreeVo yearResult = new TreeVo(year, monthResult);
+			result.add(yearResult);
+		}
+
+		return result;
+	}
+
+	@Override
+	public IPage<ImageClassificationFileVO> selectImageClassificationFilePage(IPage<ImageClassificationFileVO> page, ImageClassificationFileVO imageClassificationFile) {
+		long current = (page.getCurrent() - 1L) * page.getSize();
+		if(StringUtils.isNotEmpty(imageClassificationFile.getWbsIdsStr())){
+			//查询下级节点信息
+			imageClassificationFile.setWbsIds(JSONArray.parseArray(JSONObject.toJSONString(imageClassificationFile.getWbsIdsStr().split(",")), String.class));
+		}
+		return page.setRecords(this.baseMapper.selectImageClassificationFilePage(current, page.getSize(), imageClassificationFile));
+	}
+
+}

+ 43 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ImageClassificationShowServiceImpl.java

@@ -0,0 +1,43 @@
+package org.springblade.business.service.impl;
+
+import org.springblade.business.entity.ImageClassificationShow;
+import org.springblade.business.mapper.ImageClassificationShowMapper;
+import org.springblade.business.service.ImageClassificationShowService;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class ImageClassificationShowServiceImpl extends BaseServiceImpl<ImageClassificationShowMapper, ImageClassificationShow> implements ImageClassificationShowService {
+
+    @Override
+    public boolean saveOrUpdateClassifyShowConfig(List<ImageClassificationShow> saveShows, List<ImageClassificationShow> updateShows) {
+        try{
+            //处理新增
+            if(saveShows.size() != 0){
+                saveShows.forEach(saveShow -> this.baseMapper.insert(saveShow));
+            }
+            //处理修改
+            if(updateShows.size() != 0){
+                updateShows.forEach(show -> {
+                    //查询原本数据
+                    ImageClassificationShow oldShow = this.baseMapper.selectById(show);
+                    //修改is_show
+                    oldShow.setIsShow(show.getIsShow());
+                    this.baseMapper.updateById(oldShow);
+                });
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+            return false;
+        }
+
+        return true;
+    }
+
+    public List<ImageClassificationShow> queryShowClassify(String projectId, String contractId, String allQuery){
+        return this.baseMapper.queryShowClassify(projectId, contractId, allQuery);
+    }
+
+}

+ 58 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/UserOpinionCommentsServiceImpl.java

@@ -0,0 +1,58 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.business.service.impl;
+
+import org.springblade.business.entity.UserOpinionComments;
+import org.springblade.business.vo.UserOpinionCommentsVO;
+import org.springblade.business.mapper.UserOpinionCommentsMapper;
+import org.springblade.business.service.IUserOpinionCommentsService;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 用户意见评论表 服务实现类
+ *
+ * @author BladeX
+ * @since 2022-05-25
+ */
+@Service
+public class UserOpinionCommentsServiceImpl extends BaseServiceImpl<UserOpinionCommentsMapper, UserOpinionComments> implements IUserOpinionCommentsService {
+
+	@Override
+	public List<UserOpinionComments> queryUserOpinionCommentsByUserOpinionId(String userOpinionId) {
+		return this.baseMapper.queryUserOpinionCommentsByUserOpinionId(userOpinionId);
+	}
+
+	@Override
+	public Map<String, Integer> selectCommentsAndGoodCountByUserOpinionKey(Long userOpinionKey) {
+		Map<String,Integer> result = new HashMap<>();
+		result.put("comments", this.baseMapper.countCommentsByUserOpinionKey(userOpinionKey));
+		result.put("good", this.baseMapper.countGoodByUserOpinionKey(userOpinionKey));
+		return result;
+	}
+
+	@Override
+	public IPage<UserOpinionCommentsVO> selectUserOpinionCommentsPage(IPage<UserOpinionCommentsVO> page, UserOpinionCommentsVO userOpinionComments) {
+		return page.setRecords(this.baseMapper.selectUserOpinionCommentsPage(page, userOpinionComments));
+	}
+
+}

+ 52 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/UserOpinionFileServiceImpl.java

@@ -0,0 +1,52 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.business.service.impl;
+
+import org.springblade.business.entity.UserOpinionFile;
+import org.springblade.business.vo.UserOpinionFileVO;
+import org.springblade.business.mapper.UserOpinionFileMapper;
+import org.springblade.business.service.IUserOpinionFileService;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 用户意见附件表 服务实现类
+ *
+ * @author BladeX
+ * @since 2022-05-25
+ */
+@Service
+public class UserOpinionFileServiceImpl extends BaseServiceImpl<UserOpinionFileMapper, UserOpinionFile> implements IUserOpinionFileService {
+
+	@Override
+	public List<UserOpinionFile> selectUserOpinionFileByUserOpinionKey(Long userOpinionKey) {
+		Map<String,Object> queryMap = new HashMap<>();
+		queryMap.put("user_opinion_id", userOpinionKey);
+		return this.baseMapper.selectByMap(queryMap);
+	}
+
+	@Override
+	public IPage<UserOpinionFileVO> selectUserOpinionFilePage(IPage<UserOpinionFileVO> page, UserOpinionFileVO userOpinionFile) {
+		return page.setRecords(this.baseMapper.selectUserOpinionFilePage(page, userOpinionFile));
+	}
+
+}

+ 61 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/UserOpinionFlowServiceImpl.java

@@ -0,0 +1,61 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.business.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import org.springblade.business.entity.UserOpinionFlow;
+import org.springblade.business.vo.UserOpinionFlowVO;
+import org.springblade.business.mapper.UserOpinionFlowMapper;
+import org.springblade.business.service.IUserOpinionFlowService;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.util.List;
+
+/**
+ * 用户意见处理流程表 服务实现类
+ *
+ * @author BladeX
+ * @since 2022-05-25
+ */
+@Service
+public class UserOpinionFlowServiceImpl extends BaseServiceImpl<UserOpinionFlowMapper, UserOpinionFlow> implements IUserOpinionFlowService {
+
+	@Override
+	public List<UserOpinionFlowVO> queryCurrentUserOpinionFlowByUserOpinionId(String userOpinionId, Integer number) {
+		List<UserOpinionFlow> result = this.baseMapper.queryCurrentUserOpinionFlowByUserOpinionId(userOpinionId, number);
+		List<UserOpinionFlowVO> resultVo = JSONArray.parseArray(JSONObject.toJSONString(result), UserOpinionFlowVO.class);
+		resultVo.forEach(vo -> {
+			vo.setCurrentBol(new Integer("2").equals(vo.getIsCurrent()));
+		});
+		return resultVo;
+	}
+
+	@Override
+	public Integer selectIsSolveByUserOpinionKey(Long userOpinionKey) {
+		return this.baseMapper.selectIsSolveByUserOpinionKey(userOpinionKey);
+	}
+
+	@Override
+	public IPage<UserOpinionFlowVO> selectUserOpinionFlowPage(IPage<UserOpinionFlowVO> page, UserOpinionFlowVO userOpinionFlow) {
+		return page.setRecords(this.baseMapper.selectUserOpinionFlowPage(page, userOpinionFlow));
+	}
+
+}

+ 142 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/UserOpinionServiceImpl.java

@@ -0,0 +1,142 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.business.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
+import org.apache.http.client.utils.DateUtils;
+import org.springblade.business.entity.UserOpinion;
+import org.springblade.business.entity.UserOpinionFile;
+import org.springblade.business.entity.UserOpinionFlow;
+import org.springblade.business.service.IUserOpinionCommentsService;
+import org.springblade.business.service.IUserOpinionFileService;
+import org.springblade.business.service.IUserOpinionFlowService;
+import org.springblade.business.vo.UserOpinionFlowVO;
+import org.springblade.business.vo.UserOpinionVO;
+import org.springblade.business.mapper.UserOpinionMapper;
+import org.springblade.business.service.IUserOpinionService;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.core.secure.BladeUser;
+import org.springblade.system.user.entity.User;
+import org.springblade.system.user.feign.IUserClient;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 用户意见表 服务实现类
+ *
+ * @author BladeX
+ * @since 2022-05-25
+ */
+@Service
+@AllArgsConstructor
+public class UserOpinionServiceImpl extends BaseServiceImpl<UserOpinionMapper, UserOpinion> implements IUserOpinionService {
+
+	private final IUserOpinionFileService userOpinionFileService;
+
+	private final IUserOpinionCommentsService userOpinionCommentsService;
+
+	private final IUserOpinionFlowService userOpinionFlowService;
+
+	private final IUserClient userClient;
+
+	/**
+	 * 获取当前用户提交的工单信息
+	 * @param user 用户
+	 * @return 结果集
+	 */
+	@Override
+	public List<UserOpinionVO> queryCurrentUserOpinionList(BladeUser user) {
+		List<UserOpinion> result = this.baseMapper.queryCurrentUserOpinionList(user.getUserId());
+
+		if(result != null && result.size() != 0){
+			List<UserOpinionVO> resultVo = JSONArray.parseArray(JSONObject.toJSONString(result), UserOpinionVO.class);
+			resultVo.forEach(vo -> {
+				//获取当前工单最新情况
+				List<UserOpinionFlowVO> flowList = this.userOpinionFlowService.queryCurrentUserOpinionFlowByUserOpinionId(String.valueOf(vo.getId()), vo.getNumber());
+				String newFlow = "";
+				if(flowList != null && flowList.size() != 0){
+					Integer isCurrent = flowList.get(flowList.size() - 1).getIsCurrent();
+					newFlow = new Integer("2").equals(isCurrent) ? "已解决" : "正在处理";
+				}
+				String title = vo.getProblemType();
+				if(vo.getCreateTime() != null){
+					//如果有创建时间则拼接创建时间
+					title = DateUtils.formatDate(vo.getCreateTime(), "yyyy-MM-dd") + " " + vo.getProblemType();
+					if(StringUtils.isNotEmpty(newFlow)){
+						title = title + "(" + newFlow + ")";
+					}
+				}
+				vo.setTitle(title);
+			});
+			return resultVo;
+		}
+
+		return null;
+	}
+
+	@Override
+	public IPage<UserOpinionVO> selectUserOpinionPage(IPage<UserOpinionVO> page, UserOpinionVO userOpinion, BladeUser users) {
+		//当前页面数据
+		long current = (page.getCurrent() - 1L) * page.getSize();
+		//获取当前用户的提交记录
+		List<UserOpinion> currentUserResult = this.baseMapper.queryCurrentUserOpinionList(users.getUserId());
+		//获取非当前用户提交记录
+		List<UserOpinion> notCurrentUserResult = this.baseMapper.selectUserOpinionPage(current, page.getSize(), userOpinion, String.valueOf(users.getUserId()));
+
+		if(currentUserResult != null && notCurrentUserResult != null){
+			//将当前用户提交的记录排在前面
+			currentUserResult.addAll(notCurrentUserResult);
+		}
+
+		if(currentUserResult != null && currentUserResult.size() != 0){
+			//有数据,查询相关信息
+			List<UserOpinionVO> resultVo = JSONArray.parseArray(JSONObject.toJSONString(currentUserResult), UserOpinionVO.class);
+			resultVo.forEach(vo -> {
+				//查询相关附件
+				List<UserOpinionFile> files = this.userOpinionFileService.selectUserOpinionFileByUserOpinionKey(vo.getId());
+				if(files != null && files.size() != 0){
+					vo.setReturnFiles(files.stream().map(UserOpinionFile::getFileUrl).distinct().collect(Collectors.toList()));
+				}
+				//统计评论数和点赞数
+				Map<String,Integer> resultMap = this.userOpinionCommentsService.selectCommentsAndGoodCountByUserOpinionKey(vo.getId());
+				vo.setCommentsNumber(resultMap.get("comments"));
+				//获取处理结果
+				Integer isSolve = this.userOpinionFlowService.selectIsSolveByUserOpinionKey(vo.getId());
+				if(isSolve == 2){
+					vo.setIsSolve(1);
+				}
+				if(StringUtils.isNotEmpty(String.valueOf(vo.getCreateUser()))){
+					//获取用户信息
+					User user = this.userClient.userInfoById(vo.getCreateUser()).getData();
+					if(user != null){
+						vo.setAvatar(user.getAvatar());
+					}
+				}
+			});
+			return page.setRecords(resultVo);
+		}
+		return null;
+	}
+
+}

+ 10 - 0
blade-service/blade-business/src/main/java/sql/imageclassificationfile.menu.sql

@@ -0,0 +1,10 @@
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1528927339651215361', 1123598815738675201, 'imageClassificationFile', '影像资料', 'menu', '/UserImage/imageClassificationFile', NULL, 1, 1, 0, 1, NULL, 0);
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1528927339651215362', '1528927339651215361', 'imageClassificationFile_add', '新增', 'add', '/UserImage/imageClassificationFile/add', 'plus', 1, 2, 1, 1, NULL, 0);
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1528927339651215363', '1528927339651215361', 'imageClassificationFile_edit', '修改', 'edit', '/UserImage/imageClassificationFile/edit', 'form', 2, 2, 2, 1, NULL, 0);
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1528927339651215364', '1528927339651215361', 'imageClassificationFile_delete', '删除', 'delete', '/api/UserImage/imageClassificationFile/remove', 'delete', 3, 2, 3, 1, NULL, 0);
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1528927339651215365', '1528927339651215361', 'imageClassificationFile_view', '查看', 'view', '/UserImage/imageClassificationFile/view', 'file-text', 4, 2, 2, 1, NULL, 0);

+ 1 - 0
blade-service/blade-business/src/main/java/sql/u_construction_ledger.sql

@@ -34,6 +34,7 @@ CREATE TABLE `u_construction_ledger`  (
   `is_beton` int(2) NULL DEFAULT NULL COMMENT '是否含混凝土',
   `wbs_id` bigint(64) NULL DEFAULT NULL COMMENT 'wbs节点ID',
   `contract_id` bigint(64) NULL DEFAULT NULL COMMENT '合同段ID',
+  `project_id` bigint(64) NULL DEFAULT NULL COMMENT '项目ID',
   `create_user` bigint(64) NULL DEFAULT NULL COMMENT '创建人',
   `create_dept` bigint(64) NULL DEFAULT NULL COMMENT '创建人所在部门',
   `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

+ 76 - 0
blade-service/blade-business/src/main/java/sql/u_image_classification_file.sql

@@ -0,0 +1,76 @@
+/*
+ Navicat Premium Data Transfer
+
+ Source Server         : localhost
+ Source Server Type    : MySQL
+ Source Server Version : 50651
+ Source Host           : localhost:3306
+ Source Schema         : bladex
+
+ Target Server Type    : MySQL
+ Target Server Version : 50651
+ File Encoding         : 65001
+
+ Date: 24/05/2022 18:08:36
+*/
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for u_image_classification_file
+-- ----------------------------
+DROP TABLE IF EXISTS `u_image_classification_file`;
+CREATE TABLE `u_image_classification_file`  (
+  `id` bigint(64) NOT NULL COMMENT '主键',
+  `classify_id` bigint(64) NOT NULL COMMENT '分类ID,m_image_classification_config表主键',
+  `project_id` bigint(64) NOT NULL COMMENT '项目ID',
+  `contract_id` bigint(64) NULL DEFAULT NULL COMMENT '合同段ID,预留字段',
+  `wbs_id` bigint(64) NULL DEFAULT NULL COMMENT '工程节点ID,可为空',
+  `title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '题名',
+  `type` int(10) NULL DEFAULT NULL COMMENT '文件类型,视频格式1,图片格式2',
+  `image_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件所在路径',
+  `file_size` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件大小',
+  `file_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件名称',
+  `shooting_user` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '拍摄者',
+  `shooting_time` datetime NULL DEFAULT NULL COMMENT '拍摄时间',
+  `photo_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '照片号,视频格式不填',
+  `film_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '底片号,视频格式不填',
+  `see_also_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '参见号,视频格式不填',
+  `text_content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '文字说明',
+  `create_user` bigint(64) NOT NULL COMMENT '创建人',
+  `create_dept` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人所在部门',
+  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+  `update_user` bigint(64) NULL DEFAULT NULL COMMENT '修改人',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',
+  `status` int(10) NULL DEFAULT NULL COMMENT '状态',
+  `is_deleted` int(10) NULL DEFAULT NULL COMMENT '是否已删除',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Compact;
+
+-- ----------------------------
+-- Records of u_image_classification_file
+-- ----------------------------
+INSERT INTO `u_image_classification_file` VALUES (123456789, 987654321, 123, 456, 789, '哇哈哈哈', 2, NULL, NULL, NULL, NULL, '2022-05-24 15:21:25', NULL, NULL, NULL, NULL, 123322154345, '21354345345', '2022-05-24 15:12:10', NULL, NULL, 0, 0);
+INSERT INTO `u_image_classification_file` VALUES (1234567891, 987654321, 123, 456, 789, '哇哈哈哈1', 2, NULL, NULL, NULL, NULL, '2022-05-25 15:21:25', NULL, NULL, NULL, NULL, 123322154345, '21354345345', '2022-05-25 15:12:10', NULL, NULL, 0, 0);
+INSERT INTO `u_image_classification_file` VALUES (1234567892, 987654321, 123, 456, 789, '哇哈哈哈2', 2, NULL, NULL, NULL, NULL, '2022-05-26 15:21:25', NULL, NULL, NULL, NULL, 123322154345, '21354345345', '2022-05-26 15:12:10', NULL, NULL, 0, 0);
+INSERT INTO `u_image_classification_file` VALUES (1234567893, 987654321, 123, 456, 789, '哇哈哈哈3', 2, NULL, NULL, NULL, NULL, '2022-05-27 15:21:25', NULL, NULL, NULL, NULL, 123322154345, '21354345345', '2022-05-27 15:12:10', NULL, NULL, 0, 0);
+INSERT INTO `u_image_classification_file` VALUES (1234567894, 987654321, 123, 456, 789, '哇哈哈哈4', 2, NULL, NULL, NULL, NULL, '2022-05-28 15:21:25', NULL, NULL, NULL, NULL, 123322154345, '21354345345', '2022-05-28 15:12:10', NULL, NULL, 0, 0);
+INSERT INTO `u_image_classification_file` VALUES (1234567895, 987654321, 123, 456, 789, '哇哈哈哈5', 2, NULL, NULL, NULL, NULL, '2022-05-29 15:21:25', NULL, NULL, NULL, NULL, 123322154345, '21354345345', '2022-05-29 15:12:10', NULL, NULL, 0, 0);
+INSERT INTO `u_image_classification_file` VALUES (1234567896, 987654321, 123, 456, 789, '哇哈哈哈6', 2, NULL, NULL, NULL, NULL, '2022-05-30 15:21:25', NULL, NULL, NULL, NULL, 123322154345, '21354345345', '2022-05-30 15:12:10', NULL, NULL, 0, 0);
+INSERT INTO `u_image_classification_file` VALUES (1234567897, 987654321, 123, 456, 789, '哇哈哈哈7', 2, NULL, NULL, NULL, NULL, '2022-05-31 15:21:25', NULL, NULL, NULL, NULL, 123322154345, '21354345345', '2022-05-31 15:12:10', NULL, NULL, 0, 0);
+INSERT INTO `u_image_classification_file` VALUES (1234567898, 987654321, 123, 456, 789, '哇哈哈哈8', 2, NULL, NULL, NULL, NULL, '2022-06-01 15:21:25', NULL, NULL, NULL, NULL, 123322154345, '21354345345', '2022-06-01 15:12:10', NULL, NULL, 0, 0);
+INSERT INTO `u_image_classification_file` VALUES (1234567899, 987654321, 123, 456, 789, '哇哈哈哈9', 2, NULL, NULL, NULL, NULL, '2022-06-02 15:21:25', NULL, NULL, NULL, NULL, 123322154345, '21354345345', '2022-06-02 15:12:10', NULL, NULL, 0, 0);
+INSERT INTO `u_image_classification_file` VALUES (12345678910, 987654321, 123, 456, 789, '哇哈哈哈10', 2, NULL, NULL, NULL, NULL, '2022-06-03 15:21:25', NULL, NULL, NULL, NULL, 123322154345, '21354345345', '2022-06-03 15:12:10', NULL, NULL, 0, 0);
+INSERT INTO `u_image_classification_file` VALUES (12345678920, 987654321, 123, 456, 789, '嘿嘿嘿嘿2', 2, NULL, NULL, NULL, NULL, '2021-05-26 15:21:25', NULL, NULL, NULL, NULL, 123322154345, '21354345345', '2021-05-26 15:12:10', NULL, NULL, 0, 0);
+INSERT INTO `u_image_classification_file` VALUES (12345678930, 987654321, 123, 456, 789, '嘿嘿嘿嘿3', 2, NULL, NULL, NULL, NULL, '2021-05-27 15:21:25', NULL, NULL, NULL, NULL, 123322154345, '21354345345', '2021-05-27 15:12:10', NULL, NULL, 0, 0);
+INSERT INTO `u_image_classification_file` VALUES (12345678940, 987654321, 123, 456, 789, '嘿嘿嘿嘿4', 2, NULL, NULL, NULL, NULL, '2021-05-28 15:21:25', NULL, NULL, NULL, NULL, 123322154345, '21354345345', '2021-05-28 15:12:10', NULL, NULL, 0, 0);
+INSERT INTO `u_image_classification_file` VALUES (12345678950, 987654321, 123, 456, 789, '嘿嘿嘿嘿5', 2, NULL, NULL, NULL, NULL, '2021-05-29 15:21:25', NULL, NULL, NULL, NULL, 123322154345, '21354345345', '2021-05-29 15:12:10', NULL, NULL, 0, 0);
+INSERT INTO `u_image_classification_file` VALUES (12345678960, 987654321, 123, 456, 789, '嘿嘿嘿嘿6', 2, NULL, NULL, NULL, NULL, '2021-05-30 15:21:25', NULL, NULL, NULL, NULL, 123322154345, '21354345345', '2021-05-30 15:12:10', NULL, NULL, 0, 0);
+INSERT INTO `u_image_classification_file` VALUES (12345678970, 987654321, 123, 456, 789, '嘿嘿嘿嘿7', 2, NULL, NULL, NULL, NULL, '2021-05-31 15:21:25', NULL, NULL, NULL, NULL, 123322154345, '21354345345', '2021-05-31 15:12:10', NULL, NULL, 0, 0);
+INSERT INTO `u_image_classification_file` VALUES (12345678980, 987654321, 123, 456, 789, '嘿嘿嘿嘿8', 2, NULL, NULL, NULL, NULL, '2021-06-01 15:21:25', NULL, NULL, NULL, NULL, 123322154345, '21354345345', '2021-06-01 15:12:10', NULL, NULL, 0, 0);
+INSERT INTO `u_image_classification_file` VALUES (12345678990, 987654321, 123, 456, 789, '嘿嘿嘿嘿9', 2, NULL, NULL, NULL, NULL, '2021-06-02 15:21:25', NULL, NULL, NULL, NULL, 123322154345, '21354345345', '2021-06-02 15:12:10', NULL, NULL, 0, 0);
+INSERT INTO `u_image_classification_file` VALUES (123456789100, 987654321, 123, 456, 789, '嘿嘿嘿嘿10', 2, NULL, NULL, NULL, NULL, '2021-06-03 15:21:25', NULL, NULL, NULL, NULL, 123322154345, '21354345345', '2021-06-03 15:12:10', NULL, NULL, 0, 0);
+INSERT INTO `u_image_classification_file` VALUES (1234567891000, 987654321, 123, 456, 789, '嘿嘿嘿嘿1', 2, NULL, NULL, NULL, NULL, '2021-05-25 15:21:25', NULL, NULL, NULL, NULL, 123322154345, '21354345345', '2021-05-25 15:12:10', NULL, NULL, 0, 0);
+
+SET FOREIGN_KEY_CHECKS = 1;

+ 48 - 0
blade-service/blade-business/src/main/java/sql/u_image_classification_show.sql

@@ -0,0 +1,48 @@
+/*
+ Navicat Premium Data Transfer
+
+ Source Server         : localhost
+ Source Server Type    : MySQL
+ Source Server Version : 50651
+ Source Host           : localhost:3306
+ Source Schema         : bladex
+
+ Target Server Type    : MySQL
+ Target Server Version : 50651
+ File Encoding         : 65001
+
+ Date: 26/05/2022 11:32:33
+*/
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for u_image_classification_show
+-- ----------------------------
+DROP TABLE IF EXISTS `u_image_classification_show`;
+CREATE TABLE `u_image_classification_show`  (
+  `id` bigint(64) NOT NULL COMMENT '主键',
+  `project_id` bigint(64) NOT NULL COMMENT '项目ID',
+  `contract_id` bigint(64) NOT NULL COMMENT '合同段ID',
+  `classify_id` bigint(64) NOT NULL COMMENT '分类ID',
+  `is_show` int(2) NOT NULL DEFAULT 1 COMMENT '是否显示,1显示,0隐藏,默认1',
+  `create_user` bigint(64) NULL DEFAULT NULL COMMENT '创建人ID',
+  `create_dept` bigint(64) NULL DEFAULT NULL COMMENT '创建人所在部门',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_user` bigint(64) NULL DEFAULT NULL COMMENT '修改人ID',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',
+  `status` int(10) NULL DEFAULT NULL COMMENT '状态',
+  `is_deleted` int(10) NOT NULL DEFAULT 0 COMMENT '是否已删除,默认0',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Compact;
+
+-- ----------------------------
+-- Records of u_image_classification_show
+-- ----------------------------
+INSERT INTO `u_image_classification_show` VALUES (1529351251455336449, 123, 1526084137503068161, 0, 1123598821738675201, 1123598813738675201, NULL, NULL, NULL, NULL, 0);
+INSERT INTO `u_image_classification_show` VALUES (1529351251505668097, 123, 1526084314477531137, 0, 1123598821738675201, 1123598813738675201, NULL, NULL, NULL, NULL, 0);
+INSERT INTO `u_image_classification_show` VALUES (1529351251505668098, 123, 1526085256795033601, 1, 1123598821738675201, 1123598813738675201, NULL, NULL, NULL, NULL, 0);
+INSERT INTO `u_image_classification_show` VALUES (1529351251572776962, 123, 1526085356632051714, 1, 1123598821738675201, 1123598813738675201, NULL, NULL, NULL, NULL, 0);
+
+SET FOREIGN_KEY_CHECKS = 1;

+ 48 - 0
blade-service/blade-business/src/main/java/sql/u_user_opinion.sql

@@ -0,0 +1,48 @@
+/*
+ Navicat Premium Data Transfer
+
+ Source Server         : localhost
+ Source Server Type    : MySQL
+ Source Server Version : 50651
+ Source Host           : localhost:3306
+ Source Schema         : bladex
+
+ Target Server Type    : MySQL
+ Target Server Version : 50651
+ File Encoding         : 65001
+
+ Date: 26/05/2022 11:32:42
+*/
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for u_user_opinion
+-- ----------------------------
+DROP TABLE IF EXISTS `u_user_opinion`;
+CREATE TABLE `u_user_opinion`  (
+  `id` bigint(64) NOT NULL COMMENT '主键',
+  `project_id` bigint(64) NULL DEFAULT NULL COMMENT '项目ID',
+  `contract_id` bigint(64) NULL DEFAULT NULL COMMENT '合同段ID',
+  `opinion_content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '内容',
+  `number` int(10) NULL DEFAULT 1 COMMENT '第几次流程,初始为1,触发“不满意并再次提交解决”时在当前基础上递增',
+  `problem_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '问题类型',
+  `good_number` int(10) NULL DEFAULT 0 COMMENT '点赞数',
+  `create_user` bigint(64) NULL DEFAULT NULL COMMENT '创建人',
+  `create_user_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人姓名',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `create_dept` bigint(64) NULL DEFAULT NULL COMMENT '创建人所在部门',
+  `update_user` bigint(64) NULL DEFAULT NULL COMMENT '修改人',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',
+  `status` int(10) NULL DEFAULT NULL COMMENT '状态',
+  `is_deleted` int(10) NULL DEFAULT 0 COMMENT '是否已删除,默认0',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户意见表' ROW_FORMAT = Compact;
+
+-- ----------------------------
+-- Records of u_user_opinion
+-- ----------------------------
+INSERT INTO `u_user_opinion` VALUES (9014360401891442191, NULL, NULL, '测试,我也不知道测试什么,瞎鸡儿测呗', 1, '页面卡顿', 70, 1123598821738675201, 'admin', '2022-05-26 10:25:03', 1123598813738675201, 1123598821738675201, '2022-05-26 10:18:24', NULL, 0);
+
+SET FOREIGN_KEY_CHECKS = 1;

+ 46 - 0
blade-service/blade-business/src/main/java/sql/u_user_opinion_comments.sql

@@ -0,0 +1,46 @@
+/*
+ Navicat Premium Data Transfer
+
+ Source Server         : localhost
+ Source Server Type    : MySQL
+ Source Server Version : 50651
+ Source Host           : localhost:3306
+ Source Schema         : bladex
+
+ Target Server Type    : MySQL
+ Target Server Version : 50651
+ File Encoding         : 65001
+
+ Date: 26/05/2022 11:32:48
+*/
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for u_user_opinion_comments
+-- ----------------------------
+DROP TABLE IF EXISTS `u_user_opinion_comments`;
+CREATE TABLE `u_user_opinion_comments`  (
+  `id` bigint(64) NOT NULL COMMENT '主键',
+  `user_opinion_id` bigint(64) NOT NULL COMMENT 'u_user_opinion表主键',
+  `reply_id` bigint(64) NULL DEFAULT NULL COMMENT '回复ID,当前表主键,目前只做一级回复,所以当前字段预留',
+  `reply_content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '回复内容',
+  `good_count` int(10) NULL DEFAULT NULL COMMENT '点赞量',
+  `project_id` bigint(64) NULL DEFAULT NULL COMMENT '项目ID,创建人所在项目',
+  `contract_id` bigint(64) NULL DEFAULT NULL COMMENT '合同段ID,创建人所在合同段',
+  `create_user` bigint(64) NULL DEFAULT NULL COMMENT '创建人',
+  `create_dept` bigint(64) NULL DEFAULT NULL COMMENT '创建人所在部门',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_user` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',
+  `status` int(10) NULL DEFAULT NULL COMMENT '状态',
+  `is_deleted` int(10) NULL DEFAULT 0 COMMENT '是否已删除,默认0',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户意见评论表' ROW_FORMAT = Compact;
+
+-- ----------------------------
+-- Records of u_user_opinion_comments
+-- ----------------------------
+
+SET FOREIGN_KEY_CHECKS = 1;

+ 42 - 0
blade-service/blade-business/src/main/java/sql/u_user_opinion_file.sql

@@ -0,0 +1,42 @@
+/*
+ Navicat Premium Data Transfer
+
+ Source Server         : localhost
+ Source Server Type    : MySQL
+ Source Server Version : 50651
+ Source Host           : localhost:3306
+ Source Schema         : bladex
+
+ Target Server Type    : MySQL
+ Target Server Version : 50651
+ File Encoding         : 65001
+
+ Date: 26/05/2022 11:32:55
+*/
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for u_user_opinion_file
+-- ----------------------------
+DROP TABLE IF EXISTS `u_user_opinion_file`;
+CREATE TABLE `u_user_opinion_file`  (
+  `id` bigint(64) NOT NULL COMMENT '主键',
+  `user_opinion_id` bigint(64) NOT NULL COMMENT 'u_user_opinion表主键',
+  `file_url` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '上传附件的文件地址',
+  `create_user` bigint(64) NULL DEFAULT NULL COMMENT '创建人',
+  `create_dept` bigint(64) NULL DEFAULT NULL COMMENT '创建人所在部门',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_user` bigint(64) NULL DEFAULT NULL COMMENT '修改人',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',
+  `status` int(10) NULL DEFAULT NULL COMMENT '状态',
+  `is_deleted` int(10) NULL DEFAULT 0 COMMENT '是否已删除,默认0',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户意见附件表' ROW_FORMAT = Compact;
+
+-- ----------------------------
+-- Records of u_user_opinion_file
+-- ----------------------------
+
+SET FOREIGN_KEY_CHECKS = 1;

+ 55 - 0
blade-service/blade-business/src/main/java/sql/u_user_opinion_flow.sql

@@ -0,0 +1,55 @@
+/*
+ Navicat Premium Data Transfer
+
+ Source Server         : localhost
+ Source Server Type    : MySQL
+ Source Server Version : 50651
+ Source Host           : localhost:3306
+ Source Schema         : bladex
+
+ Target Server Type    : MySQL
+ Target Server Version : 50651
+ File Encoding         : 65001
+
+ Date: 26/05/2022 11:33:01
+*/
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for u_user_opinion_flow
+-- ----------------------------
+DROP TABLE IF EXISTS `u_user_opinion_flow`;
+CREATE TABLE `u_user_opinion_flow`  (
+  `id` bigint(64) NOT NULL COMMENT '主键',
+  `user_opinion_id` bigint(64) NOT NULL COMMENT 'u_user_opinion表主键',
+  `is_current` int(10) NULL DEFAULT NULL COMMENT '是否执行到当前环节,0未执行,1正在执行,2环节结束',
+  `reply_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '环节名称',
+  `reply_content` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '环节内容',
+  `manage_time` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '预计处理结束时间',
+  `number` int(10) NULL DEFAULT NULL COMMENT '第几次流程,初始为1,触发“不满意并再次提交解决”时在新流程上递增',
+  `sort` int(10) NULL DEFAULT NULL COMMENT '流程顺序',
+  `manage_user` bigint(64) NULL DEFAULT NULL COMMENT '分配的处理人',
+  `manage_user_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '分配的处理人姓名',
+  `manage_user_phone` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '分配的处理人电话',
+  `evaluation` int(10) NULL DEFAULT NULL COMMENT '评价类型,默认null :\r\n1满意,2不满意并再次提交,3不满意并投诉',
+  `create_user` bigint(64) NULL DEFAULT NULL COMMENT '创建人',
+  `create_dept` bigint(64) NULL DEFAULT NULL COMMENT '创建人所在部门',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_user` bigint(64) NULL DEFAULT NULL COMMENT '修改时间',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',
+  `status` int(10) NULL DEFAULT NULL COMMENT '状态',
+  `is_deleted` int(10) NULL DEFAULT NULL COMMENT '是否已删除,默认为0',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户意见处理流程表' ROW_FORMAT = Compact;
+
+-- ----------------------------
+-- Records of u_user_opinion_flow
+-- ----------------------------
+INSERT INTO `u_user_opinion_flow` VALUES (1529648062724288513, 9014360401891442191, 2, '已提交', '已成功提交您的工单信息', NULL, 1, 1, NULL, NULL, NULL, NULL, 1123598821738675201, 1123598813738675201, '2022-05-26 10:18:12', 1123598821738675201, '2022-05-26 10:18:12', 1, 0);
+INSERT INTO `u_user_opinion_flow` VALUES (1529648062875283458, 9014360401891442191, 1, '已分配专属客服', '客服:马自达<br>电话:123456789', NULL, 1, 2, 123654, '马自达', '123456789', NULL, 1123598821738675201, 1123598813738675201, '2022-05-26 10:18:12', 1123598821738675201, '2022-05-26 10:18:12', 1, 0);
+INSERT INTO `u_user_opinion_flow` VALUES (1529648062942392321, 9014360401891442191, 0, '进入人工预处理环节', '预计2022-05-31之前完成', '2022-05-31', 1, 3, NULL, NULL, NULL, NULL, 1123598821738675201, 1123598813738675201, '2022-05-26 10:18:12', 1123598821738675201, '2022-05-26 10:18:12', 1, 0);
+INSERT INTO `u_user_opinion_flow` VALUES (1529648062942392322, 9014360401891442191, 0, '问题已解决', NULL, NULL, 1, 4, NULL, NULL, NULL, NULL, 1123598821738675201, 1123598813738675201, '2022-05-26 10:18:12', 1123598821738675201, '2022-05-26 10:18:12', 1, 0);
+
+SET FOREIGN_KEY_CHECKS = 1;

+ 10 - 0
blade-service/blade-business/src/main/java/sql/useropinion.menu.sql

@@ -0,0 +1,10 @@
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1529375552871067650', 1123598815738675201, 'useropinion', '工单服务', 'menu', '/UserOpinion/useropinion', NULL, 1, 1, 0, 1, NULL, 0);
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1529375552871067651', '1529375552871067650', 'useropinion_add', '新增', 'add', '/UserOpinion/useropinion/add', 'plus', 1, 2, 1, 1, NULL, 0);
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1529375552871067652', '1529375552871067650', 'useropinion_edit', '修改', 'edit', '/UserOpinion/useropinion/edit', 'form', 2, 2, 2, 1, NULL, 0);
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1529375552871067653', '1529375552871067650', 'useropinion_delete', '删除', 'delete', '/api/UserOpinion/useropinion/remove', 'delete', 3, 2, 3, 1, NULL, 0);
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1529375552871067654', '1529375552871067650', 'useropinion_view', '查看', 'view', '/UserOpinion/useropinion/view', 'file-text', 4, 2, 2, 1, NULL, 0);

+ 10 - 0
blade-service/blade-business/src/main/java/sql/useropinioncomments.menu.sql

@@ -0,0 +1,10 @@
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1529375553261137921', 1123598815738675201, 'useropinioncomments', '工单服务', 'menu', '/UserOpinionComments/useropinioncomments', NULL, 1, 1, 0, 1, NULL, 0);
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1529375553261137922', '1529375553261137921', 'useropinioncomments_add', '新增', 'add', '/UserOpinionComments/useropinioncomments/add', 'plus', 1, 2, 1, 1, NULL, 0);
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1529375553261137923', '1529375553261137921', 'useropinioncomments_edit', '修改', 'edit', '/UserOpinionComments/useropinioncomments/edit', 'form', 2, 2, 2, 1, NULL, 0);
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1529375553261137924', '1529375553261137921', 'useropinioncomments_delete', '删除', 'delete', '/api/UserOpinionComments/useropinioncomments/remove', 'delete', 3, 2, 3, 1, NULL, 0);
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1529375553261137925', '1529375553261137921', 'useropinioncomments_view', '查看', 'view', '/UserOpinionComments/useropinioncomments/view', 'file-text', 4, 2, 2, 1, NULL, 0);

+ 10 - 0
blade-service/blade-business/src/main/java/sql/useropinionfile.menu.sql

@@ -0,0 +1,10 @@
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1529375553521184770', 1123598815738675201, 'useropinionfile', '工单服务', 'menu', '/UserOpinionFile/useropinionfile', NULL, 1, 1, 0, 1, NULL, 0);
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1529375553521184771', '1529375553521184770', 'useropinionfile_add', '新增', 'add', '/UserOpinionFile/useropinionfile/add', 'plus', 1, 2, 1, 1, NULL, 0);
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1529375553521184772', '1529375553521184770', 'useropinionfile_edit', '修改', 'edit', '/UserOpinionFile/useropinionfile/edit', 'form', 2, 2, 2, 1, NULL, 0);
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1529375553521184773', '1529375553521184770', 'useropinionfile_delete', '删除', 'delete', '/api/UserOpinionFile/useropinionfile/remove', 'delete', 3, 2, 3, 1, NULL, 0);
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1529375553521184774', '1529375553521184770', 'useropinionfile_view', '查看', 'view', '/UserOpinionFile/useropinionfile/view', 'file-text', 4, 2, 2, 1, NULL, 0);

+ 10 - 0
blade-service/blade-business/src/main/java/sql/useropinionflow.menu.sql

@@ -0,0 +1,10 @@
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1529375553709928449', 1123598815738675201, 'useropinionflow', '工单服务', 'menu', '/UserOpinionFlow/useropinionflow', NULL, 1, 1, 0, 1, NULL, 0);
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1529375553709928450', '1529375553709928449', 'useropinionflow_add', '新增', 'add', '/UserOpinionFlow/useropinionflow/add', 'plus', 1, 2, 1, 1, NULL, 0);
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1529375553709928451', '1529375553709928449', 'useropinionflow_edit', '修改', 'edit', '/UserOpinionFlow/useropinionflow/edit', 'form', 2, 2, 2, 1, NULL, 0);
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1529375553709928452', '1529375553709928449', 'useropinionflow_delete', '删除', 'delete', '/api/UserOpinionFlow/useropinionflow/remove', 'delete', 3, 2, 3, 1, NULL, 0);
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1529375553709928453', '1529375553709928449', 'useropinionflow_view', '查看', 'view', '/UserOpinionFlow/useropinionflow/view', 'file-text', 4, 2, 2, 1, NULL, 0);

+ 19 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ContractClientImpl.java

@@ -0,0 +1,19 @@
+package org.springblade.manager.feign;
+
+import lombok.AllArgsConstructor;
+import org.springblade.manager.entity.ContractInfo;
+import org.springblade.manager.service.IContractInfoService;
+import org.springframework.web.bind.annotation.RestController;
+import java.util.List;
+
+@RestController
+@AllArgsConstructor
+public class ContractClientImpl implements ContractClient {
+
+    private final IContractInfoService contractInfoService;
+
+    @Override
+    public List<ContractInfo> queryContractListByIds(List<Long> ids) {
+        return this.contractInfoService.selectContractByProjectIds(ids);
+    }
+}

+ 25 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ImageClassificationConfigClientImpl.java

@@ -0,0 +1,25 @@
+package org.springblade.manager.feign;
+
+import lombok.AllArgsConstructor;
+import org.springblade.manager.entity.ImageClassificationConfig;
+import org.springblade.manager.service.IImageClassificationConfigService;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@AllArgsConstructor
+public class ImageClassificationConfigClientImpl implements ImageClassificationConfigClient {
+
+    private final IImageClassificationConfigService imageClassificationConfigService;
+
+    @Override
+    public List<ImageClassificationConfig> queryClassificationConfigListByIds(List<Long> ids) {
+        return this.imageClassificationConfigService.listByIds(ids);
+    }
+
+    @Override
+    public List<ImageClassificationConfig> queryClassificationConfigList() {
+        return this.imageClassificationConfigService.list();
+    }
+}

+ 20 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ProjectClientImpl.java

@@ -0,0 +1,20 @@
+package org.springblade.manager.feign;
+
+import lombok.AllArgsConstructor;
+import org.springblade.manager.entity.ProjectInfo;
+import org.springblade.manager.service.IProjectInfoService;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@AllArgsConstructor
+public class ProjectClientImpl implements ProjectClient {
+
+    private final IProjectInfoService projectInfoService;
+
+    @Override
+    public List<ProjectInfo> queryProjectList() {
+        return projectInfoService.selectProjectList();
+    }
+}

+ 18 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ProjectContractAreaClientImpl.java

@@ -0,0 +1,18 @@
+package org.springblade.manager.feign;
+
+import lombok.AllArgsConstructor;
+import org.springblade.manager.entity.ProjectContractArea;
+import org.springblade.manager.service.ProjectContractAreaService;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@AllArgsConstructor
+public class ProjectContractAreaClientImpl implements ProjectContractAreaClient {
+
+    private final ProjectContractAreaService projectContractAreaService;
+
+    @Override
+    public ProjectContractArea queryContractAreaByContractId(String contractId) {
+        return this.projectContractAreaService.queryContractAreaByContractId(contractId);
+    }
+}

+ 33 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreeContractClientImpl.java

@@ -0,0 +1,33 @@
+package org.springblade.manager.feign;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.AllArgsConstructor;
+import org.springblade.manager.service.IContractInfoService;
+import org.springblade.manager.vo.WbsTreeContractTreeVO;
+import org.springblade.manager.vo.WbsTreeContractTreeVOS;
+import org.springframework.web.bind.annotation.RestController;
+import java.util.List;
+
+@RestController
+@AllArgsConstructor
+public class WbsTreeContractClientImpl implements WbsTreeContractClient {
+
+    private final IContractInfoService contractInfoService;
+
+    @Override
+    public List<WbsTreeContractTreeVOS> queryContractWbsTreeAll(String contractId, Integer wbsType, String parentId) {
+        return JSONArray.parseArray(JSONObject.toJSONString(this.contractInfoService.queryContractWbsTreeAll(contractId, wbsType, parentId)), WbsTreeContractTreeVOS.class);
+    }
+
+    @Override
+    public List<WbsTreeContractTreeVOS> queryContractWbsTreeByContractIdAndType(String contractId, Integer wbsType, String parentId) {
+        List<WbsTreeContractTreeVO> vo = this.contractInfoService.queryContractWbsTreeByContractIdAndType(contractId, wbsType, parentId);
+        //不知道为什么通过远程调用时实体字段不是想要的,所以中间用字段相同且不继承其它实体的类转换一次
+        List<WbsTreeContractTreeVOS> vos = JSONArray.parseArray(JSONObject.toJSONString(vo), WbsTreeContractTreeVOS.class);
+        vos.forEach(voData -> {
+            voData.setLeaf(new Integer("6").equals(voData.getType()));
+        });
+        return vos;
+    }
+}

+ 5 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ContractInfoMapper.java

@@ -35,6 +35,8 @@ import java.util.List;
  */
 public interface ContractInfoMapper extends BaseMapper<ContractInfo> {
 
+    List<ContractInfo> selectContractByProjectIds(@Param("ids")List<Long> ids);
+
     /**
      * 自定义分页
      *
@@ -66,7 +68,9 @@ public interface ContractInfoMapper extends BaseMapper<ContractInfo> {
 
     List<WbsTreeContractTreeVO> tree(@Param("wbsId") String wbsId,
                                      @Param("projectId") String projectId,
-                                     @Param("contractId") String contractId);
+                                     @Param("contractId") String contractId,
+                                     @Param("wbsType") Integer wbsType,
+                                     @Param("parentId") String parentId);
 
 //    String selectStartFileId(@Param("id") String id);
 

+ 12 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ContractInfoMapper.xml

@@ -52,6 +52,12 @@
         <result column="wbsType" property="wbsType"/>
     </resultMap>
 
+    <select id="selectContractByProjectIds" resultMap="contractInfoResultMap">
+        select id, p_id, contract_name, contract_number from m_contract_info where is_deleted = 0 and p_id in
+        <foreach collection="ids" item="pId" open="(" separator="," close=")">
+            #{pId}
+        </foreach>
+    </select>
 
     <update id="updatePasswordByUserId">
         update blade_user set password = #{password} where id = #{userId}
@@ -164,6 +170,12 @@
         <if test="contractId!=null and contractId!=''">
             and contract_id = #{contractId}
         </if>
+        <if test="wbsType != null and wbsType != ''">
+            and wbs_type = #{wbsType}
+        </if>
+        <if test="parentId != null and parentId != ''">
+            and parent_id = #{parentId}
+        </if>
         ORDER BY sort
     </select>
 

+ 2 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ProjectInfoMapper.java

@@ -30,6 +30,8 @@ import java.util.List;
  */
 public interface ProjectInfoMapper extends BaseMapper<ProjectInfo> {
 
+	List<ProjectInfo> selectProjectList();
+
 	/**
 	 * 自定义分页
 	 *

+ 4 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ProjectInfoMapper.xml

@@ -32,6 +32,10 @@
         <result column="reference_wbs_template_id" property="referenceWbsTemplateId"/>
     </resultMap>
 
+    <select id="selectProjectList" resultMap="projectInfoResultMap">
+        select id, project_name, project_alias, project_number from m_project_info where is_deleted = 0;
+    </select>
+
     <update id="updateTemplateIdById">
         UPDATE  m_project_info SET reference_wbs_template_id = #{wbsId} WHERE
         id = #{projectId}

+ 6 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IContractInfoService.java

@@ -37,6 +37,8 @@ import java.util.List;
  */
 public interface IContractInfoService extends BaseService<ContractInfo> {
 
+	List<ContractInfo> selectContractByProjectIds(List<Long> ids);
+
 	IPage<ContractInfoVO> selectContractInfoPage(IPage<ContractInfoVO> page, ContractInfoVO contractInfo);
 
 	List<ContractInfo> selectContractInfoPageByPid(String pid);
@@ -59,6 +61,10 @@ public interface IContractInfoService extends BaseService<ContractInfo> {
 
     List<WbsTreeContractTreeVO> tree(String wbsId, String projectId, String contractId);
 
+    List<WbsTreeContractTreeVO> queryContractWbsTreeByContractIdAndType(String contractId, Integer wbsType, String parentId);
+
+    List<WbsTreeContractTreeVO> queryContractWbsTreeAll(String contractId, Integer wbsType, String parentId);
+
     boolean saveAndUpdateContract(ContractInfoVO contractInfo);
 
 }

+ 6 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IProjectInfoService.java

@@ -32,6 +32,12 @@ import java.util.List;
  */
 public interface IProjectInfoService extends BaseService<ProjectInfo> {
 
+	/**
+	 * 客户端首页获取项目列表
+	 * @return 结果集
+	 */
+	List<ProjectInfo> selectProjectList();
+
 	/**
 	 * 自定义分页
 	 *

+ 9 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/ProjectContractAreaService.java

@@ -0,0 +1,9 @@
+package org.springblade.manager.service;
+
+import org.springblade.manager.entity.ProjectContractArea;
+
+public interface ProjectContractAreaService {
+
+    ProjectContractArea queryContractAreaByContractId(String contractId);
+
+}

+ 23 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java

@@ -57,6 +57,11 @@ public class ContractInfoServiceImpl
     private final ContractInfoMapper contractInfoMapper;
     private final ProjectContractAreaMapper projectContractAreaMapper;
 
+    @Override
+    public List<ContractInfo> selectContractByProjectIds(List<Long> ids) {
+        return this.baseMapper.selectContractByProjectIds(ids);
+    }
+
     @Override
     public IPage<ContractInfoVO> selectContractInfoPage(IPage<ContractInfoVO> page, ContractInfoVO contractInfo) {
         List<ContractInfoVO> dat = baseMapper.selectContractInfoPage(page, contractInfo);
@@ -120,7 +125,24 @@ public class ContractInfoServiceImpl
 
     @Override
     public List<WbsTreeContractTreeVO> tree(String wbsId, String projectId, String contractId) {
-        return ForestNodeMerger.merge(baseMapper.tree(wbsId, projectId, contractId));
+        return ForestNodeMerger.merge(baseMapper.tree(wbsId, projectId, contractId, null, null));
+    }
+
+    /**
+     * 对客户端接口
+     * @param contractId 合同段ID
+     * @param wbsType 需要查询的节点类型
+     * @return 合同段自身的划分树
+     */
+    @Override
+    public List<WbsTreeContractTreeVO> queryContractWbsTreeByContractIdAndType(String contractId, Integer wbsType, String parentId) {
+        List<WbsTreeContractTreeVO> vo = this.baseMapper.tree(null, null, contractId, wbsType, parentId);
+        return ForestNodeMerger.merge(vo);
+    }
+
+    @Override
+    public List<WbsTreeContractTreeVO> queryContractWbsTreeAll(String contractId, Integer wbsType, String parentId) {
+        return this.baseMapper.tree(null, null, contractId, wbsType, parentId);
     }
 
     @Override

+ 23 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ProjectContractAreaServiceImpl.java

@@ -0,0 +1,23 @@
+package org.springblade.manager.service.impl;
+
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.manager.entity.ProjectContractArea;
+import org.springblade.manager.mapper.ProjectContractAreaMapper;
+import org.springblade.manager.service.ProjectContractAreaService;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class ProjectContractAreaServiceImpl extends BaseServiceImpl<ProjectContractAreaMapper, ProjectContractArea> implements ProjectContractAreaService {
+
+    @Override
+    public ProjectContractArea queryContractAreaByContractId(String contractId) {
+        Map<String,Object> queryMap = new HashMap<>();
+        queryMap.put("contract_id", contractId);
+        List<ProjectContractArea> result = this.baseMapper.selectByMap(queryMap);
+        return result != null && result.size() != 0 ? result.get(0) : new ProjectContractArea();
+    }
+}

+ 5 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ProjectInfoServiceImpl.java

@@ -41,6 +41,11 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, P
 	@Resource
 	private ContractInfoMapper contractInfoMapper;
 
+	@Override
+	public List<ProjectInfo> selectProjectList() {
+		return this.baseMapper.selectProjectList();
+	}
+
 	@Override
 	public IPage<ProjectInfoVO> selectProjectInfoPage(IPage<ProjectInfoVO> page, ProjectInfoVO projectInfo) {
 		return page.setRecords(baseMapper.selectProjectInfoPage(page, projectInfo));