Эх сурвалжийг харах

Merge branch 'qianshan_data_bureau'

# Conflicts:
#	ruoyi-ui/src/api/system/config.js
#	ruoyi-ui/src/components/DynamicForms/index.vue
#	ruoyi-ui/src/components/DynamicFormsteo/index.vue
#	ruoyi-ui/src/settings.js
#	ruoyi-ui/src/utils/currencyFn.js
#	ruoyi-ui/src/views/index.vue
#	ruoyi-ui/src/views/system/table/index.vue
#	ruoyi-ui/src/views/tool/gen/editTable.vue
Administrator 3 жил өмнө
parent
commit
0c29110c0f
100 өөрчлөгдсөн 3414 нэмэгдсэн , 502 устгасан
  1. 4 4
      boman-api/boman-api-gen/pom.xml
  2. 2 2
      boman-api/boman-api-gen/src/main/java/com/boman/gen/api/RemoteGenTableColumnService.java
  3. 1 6
      boman-api/boman-api-gen/src/main/java/com/boman/gen/api/RemoteGenTableService.java
  4. 22 0
      boman-api/boman-api-jflow/src/main/java/com/boman/jflow/api/RemoteJflowProcessService.java
  5. 0 15
      boman-api/boman-api-jflow/src/main/java/com/boman/jflow/api/RemoteJflowService.java
  6. 56 0
      boman-api/boman-api-jflow/src/main/java/com/boman/jflow/api/RemoteJflowTaskService.java
  7. 4 4
      boman-api/boman-api-system/src/main/java/com/boman/system/api/RemoteDeptService.java
  8. 1 1
      boman-api/boman-api-system/src/main/java/com/boman/system/api/RemoteDictDataService.java
  9. 10 2
      boman-api/boman-api-system/src/main/java/com/boman/system/api/RemoteFileService.java
  10. 3 3
      boman-api/boman-api-system/src/main/java/com/boman/system/api/RemoteLogService.java
  11. 3 3
      boman-api/boman-api-system/src/main/java/com/boman/system/api/RemoteMenuService.java
  12. 2 2
      boman-api/boman-api-system/src/main/java/com/boman/system/api/RemoteRoleDataService.java
  13. 3 3
      boman-api/boman-api-system/src/main/java/com/boman/system/api/RemoteSysMenuService.java
  14. 3 3
      boman-api/boman-api-system/src/main/java/com/boman/system/api/RemoteUserService.java
  15. 12 1
      boman-api/boman-api-system/src/main/java/com/boman/system/api/factory/RemoteFileFallbackFactory.java
  16. 2 2
      boman-api/boman-api-system/src/main/java/com/boman/system/api/factory/RemoteLogFallbackFactory.java
  17. 1 1
      boman-api/boman-api-system/src/main/java/com/boman/system/api/factory/RemoteUserFallbackFactory.java
  18. 1 1
      boman-api/boman-api-system/src/main/java/com/boman/system/api/model/LoginUser.java
  19. 26 0
      boman-api/boman-api-web-core/src/main/java/com/boman/web/core/api/RemoteAttendanceService.java
  20. 25 2
      boman-api/boman-api-web-core/src/main/java/com/boman/web/core/api/RemoteObjService.java
  21. 30 1
      boman-api/boman-domain/pom.xml
  22. 1 1
      boman-api/boman-domain/src/main/java/com.boman.domain/GenTableColumn.java
  23. 2 2
      boman-api/boman-domain/src/main/java/com.boman.domain/SysDept.java
  24. 5 6
      boman-api/boman-domain/src/main/java/com.boman.domain/SysDictData.java
  25. 2 3
      boman-api/boman-domain/src/main/java/com.boman.domain/SysMenu.java
  26. 4 4
      boman-api/boman-domain/src/main/java/com.boman.domain/SysOperLog.java
  27. 5 6
      boman-api/boman-domain/src/main/java/com.boman.domain/SysRole.java
  28. 6 6
      boman-api/boman-domain/src/main/java/com.boman.domain/SysUser.java
  29. 1 1
      boman-api/boman-domain/src/main/java/com.boman.domain/annotation/Excel.java
  30. 1 1
      boman-api/boman-domain/src/main/java/com.boman.domain/annotation/Excels.java
  31. 58 0
      boman-api/boman-domain/src/main/java/com.boman.domain/constant/AttendanceConst.java
  32. 28 0
      boman-api/boman-domain/src/main/java/com.boman.domain/constant/AttendanceRulesConst.java
  33. 1 1
      boman-api/boman-domain/src/main/java/com.boman.domain/constant/CacheConstants.java
  34. 6 1
      boman-api/boman-domain/src/main/java/com.boman.domain/constant/Constants.java
  35. 2 1
      boman-api/boman-domain/src/main/java/com.boman.domain/constant/FormDataConstant.java
  36. 1 1
      boman-api/boman-domain/src/main/java/com.boman.domain/constant/GenConstants.java
  37. 6 1
      boman-api/boman-domain/src/main/java/com.boman.domain/constant/HttpStatus.java
  38. 40 0
      boman-api/boman-domain/src/main/java/com.boman.domain/constant/LeaveConst.java
  39. 1 1
      boman-api/boman-domain/src/main/java/com.boman.domain/constant/ScheduleConstants.java
  40. 1 1
      boman-api/boman-domain/src/main/java/com.boman.domain/constant/ServiceNameConstants.java
  41. 1 1
      boman-api/boman-domain/src/main/java/com.boman.domain/constant/UserConstants.java
  42. 28 7
      boman-api/boman-domain/src/main/java/com.boman.domain/dto/AjaxResult.java
  43. 219 0
      boman-api/boman-domain/src/main/java/com.boman.domain/dto/BaseDto.java
  44. 28 0
      boman-api/boman-domain/src/main/java/com.boman.domain/dto/ClockOnDto.java
  45. 38 0
      boman-api/boman-domain/src/main/java/com.boman.domain/dto/ExportExcelDto.java
  46. 112 3
      boman-api/boman-domain/src/main/java/com.boman.domain/dto/FormDataDto.java
  47. 33 0
      boman-api/boman-domain/src/main/java/com.boman.domain/dto/ImportExcelDto.java
  48. 165 3
      boman-api/boman-domain/src/main/java/com.boman.domain/dto/ProcessDto.java
  49. 11 2
      boman-api/boman-domain/src/main/java/com.boman.domain/dto/R.java
  50. 239 0
      boman-api/boman-domain/src/main/java/com.boman.domain/dto/TaskDto.java
  51. 3 1
      boman-api/boman-domain/src/main/java/com.boman.domain/dto/TreeEntity.java
  52. 21 0
      boman-api/boman-domain/src/main/java/com.boman.domain/dto/UpdateDto.java
  53. 63 0
      boman-api/boman-domain/src/main/java/com/boman/domain/jflow/ProcessNodeCandidator.java
  54. 4 5
      boman-auth/src/main/java/com/boman/auth/controller/TokenController.java
  55. 4 4
      boman-auth/src/main/java/com/boman/auth/service/SysLoginService.java
  56. 2 0
      boman-auth/src/main/resources/bootstrap.yml
  57. 13 0
      boman-common/boman-common-core/pom.xml
  58. 143 0
      boman-common/boman-common-core/src/main/java/com/boman/common/core/utils/DateUtils.java
  59. 13 0
      boman-common/boman-common-core/src/main/java/com/boman/common/core/utils/JSONArrayUtils.java
  60. 29 0
      boman-common/boman-common-core/src/main/java/com/boman/common/core/utils/LatLgtUtil.java
  61. 1 1
      boman-common/boman-common-core/src/main/java/com/boman/common/core/utils/SecurityUtils.java
  62. 1 1
      boman-common/boman-common-core/src/main/java/com/boman/common/core/utils/ServletUtils.java
  63. 173 0
      boman-common/boman-common-core/src/main/java/com/boman/common/core/utils/fieldTranslator/IdCardUtils.java
  64. 28 0
      boman-common/boman-common-core/src/main/java/com/boman/common/core/utils/number/NumberUtils.java
  65. 608 102
      boman-common/boman-common-core/src/main/java/com/boman/common/core/utils/poi/ExcelUtil.java
  66. 2 2
      boman-common/boman-common-core/src/main/java/com/boman/common/core/web/controller/BaseController.java
  67. 114 114
      boman-common/boman-common-core/src/main/java/com/boman/common/core/web/domain/BaseEntity.java
  68. 25 7
      boman-common/boman-common-datascope/src/main/java/com/boman/common/datascope/aspect/DataScopeAspect.java
  69. 1 1
      boman-common/boman-common-log/src/main/java/com/boman/common/log/aspect/LogAspect.java
  70. 1 1
      boman-common/boman-common-log/src/main/java/com/boman/common/log/service/AsyncLogService.java
  71. 9 1
      boman-common/boman-common-security/src/main/java/com/boman/common/security/feign/FeignRequestInterceptor.java
  72. 1 1
      boman-common/boman-common-security/src/main/java/com/boman/common/security/handler/GlobalExceptionHandler.java
  73. 0 0
      boman-common/boman-common-security/src/main/java/com/boman/common/security/service/TokenService.java
  74. 125 0
      boman-gateway/src/main/java/com/boman/gateway/config/CrosConfig.java
  75. 4 4
      boman-gateway/src/main/java/com/boman/gateway/filter/AuthFilter.java
  76. 1 1
      boman-gateway/src/main/java/com/boman/gateway/filter/BlackListUrlFilter.java
  77. 44 0
      boman-gateway/src/main/java/com/boman/gateway/filter/CorsResponseHeaderFilter.java
  78. 1 1
      boman-gateway/src/main/java/com/boman/gateway/filter/ValidateCodeFilter.java
  79. 1 1
      boman-gateway/src/main/java/com/boman/gateway/handler/GatewayExceptionHandler.java
  80. 1 1
      boman-gateway/src/main/java/com/boman/gateway/handler/ValidateCodeHandler.java
  81. 1 1
      boman-gateway/src/main/java/com/boman/gateway/service/ValidateCodeService.java
  82. 2 2
      boman-gateway/src/main/java/com/boman/gateway/service/impl/ValidateCodeServiceImpl.java
  83. 2 0
      boman-gateway/src/main/resources/bootstrap.yml
  84. 14 1
      boman-modules/boman-file/pom.xml
  85. 2 0
      boman-modules/boman-file/src/main/java/com/boman/file/RuoYFileApplication.java
  86. 85 0
      boman-modules/boman-file/src/main/java/com/boman/file/controller/ExcelController.java
  87. 21 1
      boman-modules/boman-file/src/main/java/com/boman/file/controller/SysFileController.java
  88. 95 42
      boman-modules/boman-file/src/main/java/com/boman/file/service/FastDfsSysFileServiceImpl.java
  89. 55 0
      boman-modules/boman-file/src/main/java/com/boman/file/service/ISysFileService.java
  90. 209 1
      boman-modules/boman-file/src/main/java/com/boman/file/service/LocalSysFileServiceImpl.java
  91. 98 45
      boman-modules/boman-file/src/main/java/com/boman/file/service/MinioSysFileServiceImpl.java
  92. 62 0
      boman-modules/boman-file/src/main/java/com/boman/file/utils/Base64DecodedMultipartFile.java
  93. 64 1
      boman-modules/boman-file/src/main/java/com/boman/file/utils/FileUploadUtils.java
  94. 2 0
      boman-modules/boman-file/src/main/resources/bootstrap.yml
  95. 2 3
      boman-modules/boman-gen/src/main/java/com/boman/gen/controller/GenController.java
  96. 2 2
      boman-modules/boman-gen/src/main/java/com/boman/gen/controller/GenTableColumnController.java
  97. 1 1
      boman-modules/boman-gen/src/main/java/com/boman/gen/controller/GenTableRelationController.java
  98. 1 20
      boman-modules/boman-gen/src/main/java/com/boman/gen/controller/LoadTableController.java
  99. 1 1
      boman-modules/boman-gen/src/main/java/com/boman/gen/controller/TableSqlController.java
  100. 3 23
      boman-modules/boman-gen/src/main/java/com/boman/gen/service/GenTableColumnServiceImpl.java

+ 4 - 4
boman-api/boman-api-gen/pom.xml

@@ -18,10 +18,10 @@
     <dependencies>
 
         <!-- RuoYi Common Core-->
-        <dependency>
-            <groupId>com.boman</groupId>
-            <artifactId>boman-common-core</artifactId>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>com.boman</groupId>-->
+<!--            <artifactId>boman-common-core</artifactId>-->
+<!--        </dependency>-->
 
         <dependency>
             <groupId>com.boman</groupId>

+ 2 - 2
boman-api/boman-api-gen/src/main/java/com/boman/gen/api/RemoteGenTableColumnService.java

@@ -1,7 +1,7 @@
 package com.boman.gen.api;
 
-import com.boman.common.core.constant.ServiceNameConstants;
-import com.boman.common.core.web.domain.AjaxResult;
+import com.boman.domain.constant.ServiceNameConstants;
+import com.boman.domain.dto.AjaxResult;
 import com.boman.domain.GenTableColumn;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;

+ 1 - 6
boman-api/boman-api-gen/src/main/java/com/boman/gen/api/RemoteGenTableService.java

@@ -1,15 +1,10 @@
 package com.boman.gen.api;
 
-import com.boman.common.core.constant.ServiceNameConstants;
-import com.boman.common.core.web.domain.AjaxResult;
+import com.boman.domain.constant.ServiceNameConstants;
 import com.boman.domain.GenTable;
-import com.boman.domain.TableSql;
 import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
 
 /**
  * 生成代码模块,远程调用入口,如需其他接口,在此添加

+ 22 - 0
boman-api/boman-api-jflow/src/main/java/com/boman/jflow/api/RemoteJflowProcessService.java

@@ -0,0 +1,22 @@
+package com.boman.jflow.api;
+
+import com.alibaba.fastjson.JSONObject;
+import com.boman.domain.constant.ServiceNameConstants;
+import com.boman.domain.dto.AjaxResult;
+import com.boman.domain.dto.ProcessDto;
+import com.boman.domain.dto.TaskDto;
+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.RequestBody;
+
+/**
+ * @author zhong.h
+ * @date 2021年05月26日 15:09
+ **/
+@FeignClient(contextId = "remoteJflowProcessService", name = ServiceNameConstants.JFLOW_SERVICE)
+public interface RemoteJflowProcessService {
+
+    @PostMapping("/jflow/p/c/process/launch")
+    AjaxResult launch(@RequestBody ProcessDto processDto);
+}

+ 0 - 15
boman-api/boman-api-jflow/src/main/java/com/boman/jflow/api/RemoteJflowService.java

@@ -1,15 +0,0 @@
-package com.boman.jflow.api;
-
-import com.boman.common.core.constant.ServiceNameConstants;
-import org.springframework.cloud.openfeign.FeignClient;
-
-/**
- * @author shiqian
- * @date 2021年05月26日 15:09
- **/
-@FeignClient(contextId = "remoteJflowService", name = ServiceNameConstants.JFLOW_SERVICE)
-public interface RemoteJflowService {
-
-//    @PostMapping(name = "/jflow/p/cs/process/launch")
-//    JSONObject createProcess(@RequestBody ProcessDto dto);
-}

+ 56 - 0
boman-api/boman-api-jflow/src/main/java/com/boman/jflow/api/RemoteJflowTaskService.java

@@ -0,0 +1,56 @@
+package com.boman.jflow.api;
+
+import com.alibaba.fastjson.JSONObject;
+import com.boman.domain.constant.ServiceNameConstants;
+import com.boman.domain.dto.AjaxResult;
+import com.boman.domain.dto.TaskDto;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author zhong.hui
+ * @date 2021年05月26日 15:09
+ **/
+@FeignClient(contextId = "remoteJflowTaskService", name = ServiceNameConstants.JFLOW_SERVICE)
+public interface RemoteJflowTaskService {
+
+    /**
+     * 历史审批接口调用
+     *
+     * @param taskDto
+     * @return
+     */
+    @PostMapping("/jflow/p/cs/task/history/list")
+    AjaxResult historySearchInPage(@RequestBody(required = false) TaskDto taskDto);
+
+    /**
+     * 代办审批接口调用
+     *
+     * @param taskDto
+     * @return
+     */
+    @PostMapping("/jflow/p/cs/task/backlog/list")
+    AjaxResult pendingTaskSearch(@RequestBody TaskDto taskDto);
+
+    /**
+     * 同意申请
+     * @param taskDto
+     * @return
+     */
+    @PostMapping("/jflow/p/c/task/page/pass")
+    AjaxResult pagePass(@RequestBody TaskDto taskDto);
+
+    /**
+     * 驳回
+     * @param taskDto
+     * @return
+     */
+    @PostMapping("/jflow/p/c/task/page/deny")
+    AjaxResult pageDeny(@RequestBody TaskDto taskDto);
+
+    @GetMapping("/jflow/p/cs/task/count")
+    JSONObject approvalStatistics(@RequestBody TaskDto taskDto);
+
+    @PostMapping("/jflow/p/c/task/backlog/detail")
+    AjaxResult pageDetail(@RequestBody TaskDto taskDto);
+}

+ 4 - 4
boman-api/boman-api-system/src/main/java/com/boman/system/api/RemoteDeptService.java

@@ -1,7 +1,7 @@
 package com.boman.system.api;
 
-import com.boman.common.core.constant.ServiceNameConstants;
-import com.boman.system.api.domain.SysDept;
+import com.boman.domain.constant.ServiceNameConstants;
+import com.boman.domain.SysDept;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -19,7 +19,7 @@ public interface RemoteDeptService {
      * 功能描述: 根据id查找
      *
      * @param id deptId
-     * @return com.boman.common.core.web.domain.AjaxResult
+     * @return com.boman.domain.dto.AjaxResult
      */
     @GetMapping(value = "/dept/getById/{id}")
     SysDept getById(@PathVariable("id") Long id);
@@ -28,7 +28,7 @@ public interface RemoteDeptService {
      * 功能描述: 拿到部门下所有的部门, 包含传过来的deptId
      *
      * @param deptId deptId
-     * @return com.boman.common.core.web.domain.AjaxResult
+     * @return com.boman.domain.dto.AjaxResult
      */
     @GetMapping("/dept/list/children/depts/{deptId}")
     List<SysDept> listChildrenDepts(@PathVariable(value = "deptId") Long deptId);

+ 1 - 1
boman-api/boman-api-system/src/main/java/com/boman/system/api/RemoteDictDataService.java

@@ -1,6 +1,6 @@
 package com.boman.system.api;
 
-import com.boman.common.core.constant.ServiceNameConstants;
+import com.boman.domain.constant.ServiceNameConstants;
 import com.boman.domain.SysDictData;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;

+ 10 - 2
boman-api/boman-api-system/src/main/java/com/boman/system/api/RemoteFileService.java

@@ -1,12 +1,14 @@
 package com.boman.system.api;
 
+import com.boman.domain.dto.AjaxResult;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestPart;
 import org.springframework.web.multipart.MultipartFile;
-import com.boman.common.core.constant.ServiceNameConstants;
-import com.boman.common.core.domain.R;
+import com.boman.domain.constant.ServiceNameConstants;
+import com.boman.domain.dto.R;
 import com.boman.domain.SysFile;
 import com.boman.system.api.factory.RemoteFileFallbackFactory;
 
@@ -26,4 +28,10 @@ public interface RemoteFileService
      */
     @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
     public R<SysFile> upload(@RequestPart(value = "file") MultipartFile file);
+
+    /**
+     * 通用上传请求
+     */
+    @PostMapping("/upload/base64")
+    AjaxResult uploadFileBase64(@RequestBody String base64);
 }

+ 3 - 3
boman-api/boman-api-system/src/main/java/com/boman/system/api/RemoteLogService.java

@@ -4,9 +4,9 @@ import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
-import com.boman.common.core.constant.ServiceNameConstants;
-import com.boman.common.core.domain.R;
-import com.boman.system.api.domain.SysOperLog;
+import com.boman.domain.constant.ServiceNameConstants;
+import com.boman.domain.dto.R;
+import com.boman.domain.SysOperLog;
 import com.boman.system.api.factory.RemoteLogFallbackFactory;
 
 /**

+ 3 - 3
boman-api/boman-api-system/src/main/java/com/boman/system/api/RemoteMenuService.java

@@ -1,7 +1,7 @@
 package com.boman.system.api;
 
-import com.boman.common.core.constant.ServiceNameConstants;
-import com.boman.system.api.domain.SysMenu;
+import com.boman.domain.constant.ServiceNameConstants;
+import com.boman.domain.SysMenu;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -19,7 +19,7 @@ public interface RemoteMenuService {
      * 功能描述: 根据userId查找此人的所有菜单
      *
      * @param userId userId
-     * @return java.util.List<com.boman.system.api.domain.SysMenu>
+     * @return java.util.List<com.boman.domain.SysMenu>
      */
     @GetMapping("/menu/listMenusByUserId/{userId}")
     List<SysMenu> listMenusByUserId(@PathVariable("userId") Long userId);

+ 2 - 2
boman-api/boman-api-system/src/main/java/com/boman/system/api/RemoteRoleDataService.java

@@ -1,6 +1,6 @@
 package com.boman.system.api;
 
-import com.boman.common.core.constant.ServiceNameConstants;
+import com.boman.domain.constant.ServiceNameConstants;
 import com.boman.domain.SysRoleData;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -21,7 +21,7 @@ public interface RemoteRoleDataService {
      * 功能描述: 根据userId查找此人的所有roleData
      *
      * @param idList idList
-     * @return java.util.List<com.boman.system.api.domain.SysMenu>
+     * @return java.util.List<com.boman.domain.SysMenu>
      */
     @PostMapping(value = "/roleData/listByRoleIdList")
     List<SysRoleData> listByRoleIdList(@RequestBody List<Long> idList);

+ 3 - 3
boman-api/boman-api-system/src/main/java/com/boman/system/api/RemoteSysMenuService.java

@@ -1,8 +1,8 @@
 package com.boman.system.api;
 
-import com.boman.common.core.constant.ServiceNameConstants;
-import com.boman.common.core.web.domain.AjaxResult;
-import com.boman.system.api.domain.SysMenu;
+import com.boman.domain.constant.ServiceNameConstants;
+import com.boman.domain.dto.AjaxResult;
+import com.boman.domain.SysMenu;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;

+ 3 - 3
boman-api/boman-api-system/src/main/java/com/boman/system/api/RemoteUserService.java

@@ -1,11 +1,11 @@
 package com.boman.system.api;
 
-import com.boman.system.api.domain.SysUser;
+import com.boman.domain.SysUser;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
-import com.boman.common.core.constant.ServiceNameConstants;
-import com.boman.common.core.domain.R;
+import com.boman.domain.constant.ServiceNameConstants;
+import com.boman.domain.dto.R;
 import com.boman.system.api.factory.RemoteUserFallbackFactory;
 import com.boman.system.api.model.LoginUser;
 import org.springframework.web.bind.annotation.PostMapping;

+ 12 - 1
boman-api/boman-api-system/src/main/java/com/boman/system/api/factory/RemoteFileFallbackFactory.java

@@ -1,10 +1,11 @@
 package com.boman.system.api.factory;
 
+import com.boman.domain.dto.AjaxResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
 import org.springframework.web.multipart.MultipartFile;
-import com.boman.common.core.domain.R;
+import com.boman.domain.dto.R;
 import com.boman.system.api.RemoteFileService;
 import com.boman.domain.SysFile;
 import feign.hystrix.FallbackFactory;
@@ -30,6 +31,16 @@ public class RemoteFileFallbackFactory implements FallbackFactory<RemoteFileServ
             {
                 return R.fail("上传文件失败:" + throwable.getMessage());
             }
+
+            /**
+             * 通用上传请求
+             *
+             * @param base64
+             */
+            @Override
+            public AjaxResult uploadFileBase64(String base64) {
+                return AjaxResult.error("上传文件失败:" + throwable.getMessage());
+            }
         };
     }
 }

+ 2 - 2
boman-api/boman-api-system/src/main/java/com/boman/system/api/factory/RemoteLogFallbackFactory.java

@@ -3,9 +3,9 @@ package com.boman.system.api.factory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
-import com.boman.common.core.domain.R;
+import com.boman.domain.dto.R;
 import com.boman.system.api.RemoteLogService;
-import com.boman.system.api.domain.SysOperLog;
+import com.boman.domain.SysOperLog;
 import feign.hystrix.FallbackFactory;
 
 /**

+ 1 - 1
boman-api/boman-api-system/src/main/java/com/boman/system/api/factory/RemoteUserFallbackFactory.java

@@ -3,7 +3,7 @@ package com.boman.system.api.factory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
-import com.boman.common.core.domain.R;
+import com.boman.domain.dto.R;
 import com.boman.system.api.RemoteUserService;
 import com.boman.system.api.model.LoginUser;
 import feign.hystrix.FallbackFactory;

+ 1 - 1
boman-api/boman-api-system/src/main/java/com/boman/system/api/model/LoginUser.java

@@ -5,7 +5,7 @@ import java.util.List;
 import java.util.Set;
 
 import com.alibaba.fastjson.JSONObject;
-import com.boman.system.api.domain.SysUser;
+import com.boman.domain.SysUser;
 
 /**
  * 用户信息

+ 26 - 0
boman-api/boman-api-web-core/src/main/java/com/boman/web/core/api/RemoteAttendanceService.java

@@ -0,0 +1,26 @@
+package com.boman.web.core.api;
+
+import com.boman.domain.constant.ServiceNameConstants;
+import com.boman.domain.dto.AjaxResult;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.Map;
+
+/**
+ * @author shiqian
+ * @date 2021年07月27日 15:50
+ **/
+@FeignClient(contextId = "remoteAttendanceService", value = ServiceNameConstants.WEB_CORE_SERVICE)
+public interface RemoteAttendanceService {
+
+    /**
+     * 按月统计人员考勤信息
+     *
+     * @param map 传入时间 年-月
+     * @return AjaxResult
+     */
+    @PostMapping("/attendance/statistics")
+    AjaxResult statisticsByMonth(@RequestBody Map<String, Object> map);
+}

+ 25 - 2
boman-api/boman-api-web-core/src/main/java/com/boman/web/core/api/RemoteObjService.java

@@ -1,9 +1,14 @@
 package com.boman.web.core.api;
 
-import com.boman.common.core.constant.ServiceNameConstants;
+import com.boman.domain.constant.ServiceNameConstants;
+import com.boman.domain.dto.AjaxResult;
+import com.boman.domain.dto.FormDataDto;
+import com.boman.domain.dto.ImportExcelDto;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 
 /**
  * @author shiqian
@@ -17,9 +22,27 @@ public interface RemoteObjService {
      *
      * @param tableName tableName
      * @param pkName    pkName
-     * @return com.boman.common.core.web.domain.AjaxResult
+     * @return com.boman.domain.dto.AjaxResult
      */
     @GetMapping("common/tableName/{tableName}/pkName/{pkName}")
     Long getMaxId(@PathVariable("tableName") String tableName, @PathVariable("pkName") String pkName);
+
+    /**
+     * 功能描述: 批量导入数据
+     *
+     * @param dto dto
+     * @return com.boman.domain.dto.AjaxResult
+     */
+    @PostMapping("web-core/file/common/import")
+    AjaxResult importCommonData(@RequestBody ImportExcelDto dto);
+
+    /**
+     * 功能描述: 根据表名和自定义字段查找
+     *
+     * @param dto dto
+     * @return com.boman.domain.dto.AjaxResult
+     */
+    @PostMapping("common/")
+    AjaxResult getByMap(@RequestBody FormDataDto dto);
 }
 

+ 30 - 1
boman-api/boman-domain/pom.xml

@@ -16,10 +16,39 @@
     </description>
 
     <dependencies>
-        <dependency>
+<!--        <dependency>
             <groupId>com.boman</groupId>
             <artifactId>boman-common-core</artifactId>
             <version>2.5.0-SNAPSHOT</version>
+        </dependency>-->
+
+        <!-- Jackson -->
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+        </dependency>
+
+        <!-- Apache Lang3 -->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
+
+        <!-- Hibernate Validator -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+        </dependency>
+
+        <!-- SpringCloud Openfeign -->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
         </dependency>
 
         <dependency>

+ 1 - 1
boman-api/boman-domain/src/main/java/com.boman.domain/GenTableColumn.java

@@ -126,7 +126,7 @@ public class GenTableColumn extends BaseEntity
     private String fieldTranslator;
 
     /**
-     * 扩展属性
+     * 扩展属性 eg:{"col":["start_time","end_time"],"comp":"end_time-start_time"}
      */
     private String extendedAttributes;
 

+ 2 - 2
boman-api/boman-api-system/src/main/java/com/boman/system/api/domain/SysDept.java → boman-api/boman-domain/src/main/java/com.boman.domain/SysDept.java

@@ -1,4 +1,4 @@
-package com.boman.system.api.domain;
+package com.boman.domain;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -7,7 +7,7 @@ import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.Size;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
-import com.boman.common.core.web.domain.BaseEntity;
+import com.boman.domain.BaseEntity;
 
 /**
  * 部门表 sys_dept

+ 5 - 6
boman-api/boman-domain/src/main/java/com.boman.domain/SysDictData.java

@@ -1,8 +1,7 @@
 package com.boman.domain;
 
-//import com.boman.common.core.constant.UserConstants;
-//import org.apache.commons.lang3.builder.ToStringBuilder;
-//import org.apache.commons.lang3.builder.ToStringStyle;
+import com.boman.domain.annotation.Excel;
+import com.boman.domain.constant.UserConstants;
 
 /**
  * 字典数据表 sys_dict_data
@@ -18,15 +17,15 @@ public class SysDictData extends BaseEntity
     private Long id;
 
     /** 字典排序 */
-//    @Excel(name = "字典排序", cellType = ColumnType.NUMERIC)
+    @Excel(name = "字典排序", cellType = Excel.ColumnType.NUMERIC)
     private Long dictSort;
 
     /** 字典标签 */
-//    @Excel(name = "字典标签")
+    @Excel(name = "字典标签")
     private String dictLabel;
 
     /** 字典键值 */
-//    @Excel(name = "字典键值")
+    @Excel(name = "字典键值")
     private String dictValue;
 
     /** 字典类型 */

+ 2 - 3
boman-api/boman-api-system/src/main/java/com/boman/system/api/domain/SysMenu.java → boman-api/boman-domain/src/main/java/com.boman.domain/SysMenu.java

@@ -1,7 +1,6 @@
-package com.boman.system.api.domain;
+package com.boman.domain;
 
-import com.alibaba.fastjson.JSONObject;
-import com.boman.common.core.web.domain.BaseEntity;
+import com.boman.domain.BaseEntity;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 

+ 4 - 4
boman-api/boman-api-system/src/main/java/com/boman/system/api/domain/SysOperLog.java → boman-api/boman-domain/src/main/java/com.boman.domain/SysOperLog.java

@@ -1,10 +1,10 @@
-package com.boman.system.api.domain;
+package com.boman.domain;
 
 import java.util.Date;
 import com.fasterxml.jackson.annotation.JsonFormat;
-import com.boman.common.core.annotation.Excel;
-import com.boman.common.core.annotation.Excel.ColumnType;
-import com.boman.common.core.web.domain.BaseEntity;
+import com.boman.domain.annotation.Excel;
+import com.boman.domain.annotation.Excel.ColumnType;
+import com.boman.domain.BaseEntity;
 
 /**
  * 操作日志记录表 oper_log

+ 5 - 6
boman-api/boman-api-system/src/main/java/com/boman/system/api/domain/SysRole.java → boman-api/boman-domain/src/main/java/com.boman.domain/SysRole.java

@@ -1,12 +1,11 @@
-package com.boman.system.api.domain;
+package com.boman.domain;
 
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.Size;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
-import com.boman.common.core.annotation.Excel;
-import com.boman.common.core.annotation.Excel.ColumnType;
-import com.boman.common.core.web.domain.BaseEntity;
+
+import com.boman.domain.annotation.Excel;
+import com.boman.domain.annotation.Excel.ColumnType;
+import com.boman.domain.BaseEntity;
 
 import java.util.Arrays;
 

+ 6 - 6
boman-api/boman-api-system/src/main/java/com/boman/system/api/domain/SysUser.java → boman-api/boman-domain/src/main/java/com.boman.domain/SysUser.java

@@ -1,4 +1,4 @@
-package com.boman.system.api.domain;
+package com.boman.domain;
 
 import java.util.Date;
 import java.util.List;
@@ -8,11 +8,11 @@ import javax.validation.constraints.Size;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 import com.fasterxml.jackson.annotation.JsonProperty;
-import com.boman.common.core.annotation.Excel;
-import com.boman.common.core.annotation.Excel.ColumnType;
-import com.boman.common.core.annotation.Excel.Type;
-import com.boman.common.core.annotation.Excels;
-import com.boman.common.core.web.domain.BaseEntity;
+import com.boman.domain.annotation.Excel;
+import com.boman.domain.annotation.Excel.ColumnType;
+import com.boman.domain.annotation.Excel.Type;
+import com.boman.domain.annotation.Excels;
+import com.boman.domain.BaseEntity;
 
 /**
  * 用户对象 sys_user

+ 1 - 1
boman-common/boman-common-core/src/main/java/com/boman/common/core/annotation/Excel.java → boman-api/boman-domain/src/main/java/com.boman.domain/annotation/Excel.java

@@ -1,4 +1,4 @@
-package com.boman.common.core.annotation;
+package com.boman.domain.annotation;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;

+ 1 - 1
boman-common/boman-common-core/src/main/java/com/boman/common/core/annotation/Excels.java → boman-api/boman-domain/src/main/java/com.boman.domain/annotation/Excels.java

@@ -1,4 +1,4 @@
-package com.boman.common.core.annotation;
+package com.boman.domain.annotation;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;

+ 58 - 0
boman-api/boman-domain/src/main/java/com.boman.domain/constant/AttendanceConst.java

@@ -0,0 +1,58 @@
+package com.boman.domain.constant;
+
+
+/**
+ * @author shiqian
+ * @date 2021年05月26日 15:29
+ **/
+public class AttendanceConst {
+
+    /** 考勤人员姓名 **/
+    public static final String ATTENDANCE_USER_NAME = "attendance_table_username";
+    /** 考勤人员姓名id **/
+    public static final String ATTENDANCE_USER_ID = "user_id";
+
+    /** 是否考勤异常 **/
+    public static final String ATTENDANCE_ABNORMAL = "attendance_abnormal";
+    /** 是否迟到 **/
+    public static final String ATTENDANCE_TABLE_LATE = "attendance_table_late";
+    /** 是否早退 **/
+    public static final String ATTENDANCE_TABLE_LEAVE_EARLY = "attendance_table_leave";
+
+    /** 当天时间 yyyy-MM-dd 查询的时候是 in **/
+    public static final String ATTENDANCE_TABLE_TODAYTIME = "attendance_table_todaytime";
+
+    /** 上班打卡时间 **/
+    public static final String ATTENDANCE_TABLE_WORK = "attendance_table_work";
+    /** 下午上班打卡时间 **/
+    public static final String ATTENDANCE_TABLE_WORK_PM = "attendance_table_work_pm";
+
+    /** 下班打卡时间 **/
+    public static final String ATTENDANCE_TABLE_OFFWORK = "attendance_table_offwork";
+    /** 下午下班打卡时间 **/
+    public static final String ATTENDANCE_TABLE_OFFWORK_PM  = "attendance_table_offwork_pm";
+
+    /** 创建时间 **/
+    public static final String ATTENDANCE_TABLE_CREATE_TIME = "create_time";
+
+    /** 经度 **/
+    public static final String ATTENDANCE_TABLE_LONGITUDE = "longitude";
+
+    /** 纬度 **/
+    public static final String ATTENDANCE_TABLE_LATITUDE = "latitude";
+
+    public static final String Y = "Y";
+    /**  上午上班打卡 **/
+    public static final int GO_TO_WORK_TYPE = 1;
+    /**  上午下班打卡 **/
+    public static final int GO_OFF_WORK_TYPE = 2;
+    /**  下午上班打卡 **/
+    public static final int GO_TO_WORK_TYPE_PM= 3;
+    /**  下午下班打卡 **/
+    public static final int GO_OFF_WORK_TYPE_PM = 4;
+    public static final String GO_TO_WORK = "上午上班打卡";
+    public static final String GO_TO_WORK_PM = "下午上班打卡";
+    public static final String GO_OFF_WORK = "上午下班打卡";
+    public static final String GO_OFF_WORK_PM = "下午下班打卡";
+
+}

+ 28 - 0
boman-api/boman-domain/src/main/java/com.boman.domain/constant/AttendanceRulesConst.java

@@ -0,0 +1,28 @@
+package com.boman.domain.constant;
+
+
+/**
+ * @author shiqian
+ * @date 2021年05月26日 15:29
+ **/
+public class AttendanceRulesConst {
+
+    /** 规则表名 **/
+    public static final String ATTENDANCE_RULES_TABLE_NAME = "attendance_rules";
+
+    /** 规定上班时间 **/
+    public static final String ATTENDANCE_RULES_START_TIME = "attendance_rules_start_time";
+    /** 规定下午上班时间 **/
+    public static final String ATTENDANCE_RULES_START_TIME_PM = "attendance_rules_start_time_pm";
+
+    /** 规定下班时间 **/
+    public static final String ATTENDANCE_RULES_END_TIME = "attendance_rules_end_time";
+    /** 规定下午下班时间 **/
+    public static final String ATTENDANCE_RULES_END_TIME_PM = "attendance_rules_end_time_pm";
+
+    /**部门id **/
+    public static final String ATTENDANCE_RULES_DEPT_ID = "attendance_rules_dept_id";
+
+
+
+}

+ 1 - 1
boman-common/boman-common-core/src/main/java/com/boman/common/core/constant/CacheConstants.java → boman-api/boman-domain/src/main/java/com.boman.domain/constant/CacheConstants.java

@@ -1,4 +1,4 @@
-package com.boman.common.core.constant;
+package com.boman.domain.constant;
 
 /**
  * 缓存的key 常量

+ 6 - 1
boman-common/boman-common-core/src/main/java/com/boman/common/core/constant/Constants.java → boman-api/boman-domain/src/main/java/com.boman.domain/constant/Constants.java

@@ -1,4 +1,4 @@
-package com.boman.common.core.constant;
+package com.boman.domain.constant;
 
 import java.util.HashMap;
 
@@ -34,6 +34,11 @@ public class Constants
      */
     public static final Integer SUCCESS = 200;
 
+    /**
+     * 登录状态失效
+     */
+    public static final Integer LOGIN_EXPIRE = 401;
+
     /**
      * 失败标记
      */

+ 2 - 1
boman-api/boman-domain/src/main/java/com.boman.domain/constant/FormDataConstant.java

@@ -90,6 +90,7 @@ public class FormDataConstant {
 
     public static final String CHAR = "char";
     public static final String DATETIME = "datetime";
+    public static final String DATE = "date";
     public static final String TIMESTAMP = "timestamp";
 
     /**  根据表名查询表单时,返回给前台的查询字段   */
@@ -150,7 +151,7 @@ public class FormDataConstant {
     public static final List<String> NEED_QUERY_DICT_LIST = Stream.of(RADIO, CHECKBOX, SELECT).collect(Collectors.toList());
 
     /**  需要转换时间类型的 */
-    public static final List<String> NEED_CONVERT_DATE_LIST = Stream.of(DATETIME).collect(Collectors.toList());
+    public static final List<String> NEED_CONVERT_DATE_LIST = Stream.of(DATETIME, DATE).collect(Collectors.toList());
 
     /**  hr 日志、基础信息..... */
     public static final String HR = "HR";

+ 1 - 1
boman-common/boman-common-core/src/main/java/com/boman/common/core/constant/GenConstants.java → boman-api/boman-domain/src/main/java/com.boman.domain/constant/GenConstants.java

@@ -1,4 +1,4 @@
-package com.boman.common.core.constant;
+package com.boman.domain.constant;
 
 /**
  * 代码生成通用常量

+ 6 - 1
boman-common/boman-common-core/src/main/java/com/boman/common/core/constant/HttpStatus.java → boman-api/boman-domain/src/main/java/com.boman.domain/constant/HttpStatus.java

@@ -1,4 +1,4 @@
-package com.boman.common.core.constant;
+package com.boman.domain.constant;
 
 /**
  * 返回状态码
@@ -12,6 +12,11 @@ public class HttpStatus
      */
     public static final int SUCCESS = 200;
 
+
+    /**
+     * 操作成功
+     */
+    public static final int ZEROSUCCESS = 0;
     /**
      * 对象创建成功
      */

+ 40 - 0
boman-api/boman-domain/src/main/java/com.boman.domain/constant/LeaveConst.java

@@ -0,0 +1,40 @@
+package com.boman.domain.constant;
+
+
+/**
+ * @author shiqian
+ * @date 2021年06月17日 17:24
+ **/
+public class LeaveConst {
+
+    public static final String TABLE_NAME = "leavefrom";
+    public static final String LEAVEFROM_START_TIME = "leavefrom_start_time";
+    public static final String LEAVEFROM_END_TIME = "leavefrom_end_time";
+    public static final int DAY = 1;
+    public static final int MONTH = 2;
+    public static final int YEAR = 3;
+
+    public static final String MONTH_LEAVE_COUNT = "month";
+    public static final String YEAR_LEAVE_COUNT = "year";
+
+
+    /************ 销假标准表 ************/
+    public static final String ID = "id";
+    public static final String DEPT_ID = "dept_id";
+    /**
+     * 可销假时长(小时)
+     **/
+    public static final String OFFSET_TIME = "offset_time";
+    public static final String TABLE_NAME_OFFSET_LEAVEFROM_STANDARD = "offset_leavefrom_standard";
+
+
+    /************ 临时请假表 ************/
+    public static final String TABLE_NAME_BOMAN_TEMP_LEAVEFORM = "boman_temp_leaveform";
+    public static final String LEAVEFROM_USER_NAME = "leavefrom_user_name";
+    public static final String LEAVEFROM_TIME = "leavefrom_time";
+    /** 是否销假  Y N **/
+    public static final String LEAVE_STATUS = "leave_status";
+    public static final String Y = "Y";
+    public static final String N = "N";
+
+}

+ 1 - 1
boman-common/boman-common-core/src/main/java/com/boman/common/core/constant/ScheduleConstants.java → boman-api/boman-domain/src/main/java/com.boman.domain/constant/ScheduleConstants.java

@@ -1,4 +1,4 @@
-package com.boman.common.core.constant;
+package com.boman.domain.constant;
 
 /**
  * 任务调度通用常量

+ 1 - 1
boman-common/boman-common-core/src/main/java/com/boman/common/core/constant/ServiceNameConstants.java → boman-api/boman-domain/src/main/java/com.boman.domain/constant/ServiceNameConstants.java

@@ -1,4 +1,4 @@
-package com.boman.common.core.constant;
+package com.boman.domain.constant;
 
 /**
  * 服务名称

+ 1 - 1
boman-common/boman-common-core/src/main/java/com/boman/common/core/constant/UserConstants.java → boman-api/boman-domain/src/main/java/com.boman.domain/constant/UserConstants.java

@@ -1,4 +1,4 @@
-package com.boman.common.core.constant;
+package com.boman.domain.constant;
 
 /**
  * 用户常量信息

+ 28 - 7
boman-common/boman-common-core/src/main/java/com/boman/common/core/web/domain/AjaxResult.java → boman-api/boman-domain/src/main/java/com.boman.domain/dto/AjaxResult.java

@@ -1,8 +1,7 @@
-package com.boman.common.core.web.domain;
+package com.boman.domain.dto;
 
 import java.util.HashMap;
-import com.boman.common.core.constant.HttpStatus;
-import com.boman.common.core.utils.StringUtils;
+import com.boman.domain.constant.HttpStatus;
 
 /**
  * 操作消息提醒
@@ -16,6 +15,9 @@ public class AjaxResult extends HashMap<String, Object>
     /** 状态码 */
     public static final String CODE_TAG = "code";
 
+    /** 兼容流程服务器 */
+    public static final String RESULT_CODE_TAG = "resultCode";
+
     /** 返回内容 */
     public static final String MSG_TAG = "msg";
 
@@ -48,12 +50,19 @@ public class AjaxResult extends HashMap<String, Object>
      * @param msg 返回内容
      * @param data 数据对象
      */
-    public AjaxResult(int code, String msg, Object data)
-    {
+    public AjaxResult(int code, String msg, Object data) {
         super.put(CODE_TAG, code);
         super.put(MSG_TAG, msg);
-        if (StringUtils.isNotNull(data))
-        {
+        if (null != data) {
+            super.put(DATA_TAG, data);
+        }
+    }
+
+    public AjaxResult(int code, int resultCode, String msg, Object data) {
+        super.put(CODE_TAG, code);
+        super.put(RESULT_CODE_TAG, resultCode);
+        super.put(MSG_TAG, msg);
+        if (null != data) {
             super.put(DATA_TAG, data);
         }
     }
@@ -115,6 +124,18 @@ public class AjaxResult extends HashMap<String, Object>
         return new AjaxResult(HttpStatus.SUCCESS, msg, data);
     }
 
+    /**
+     * 返回成功消息
+     *
+     * @param msg 返回内容
+     * @param data 数据对象
+     * @return 成功消息
+     */
+    public static AjaxResult successZero( Object data)
+    {
+        return new AjaxResult(HttpStatus.ZEROSUCCESS, "", data);
+    }
+
     /**
      * 返回错误消息
      * 

+ 219 - 0
boman-api/boman-domain/src/main/java/com.boman.domain/dto/BaseDto.java

@@ -0,0 +1,219 @@
+package com.boman.domain.dto;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import java.io.Serializable;
+
+public class BaseDto implements Serializable {
+    protected static final String PAGE_SIZE = "pageSize";
+    protected static final String PAGE = "page";
+    protected static final String LAST_END_ID = "lastEndId";
+    protected static final String DESCS = "descs";
+    protected static final String ASCS = "ascs";
+    private static final long serialVersionUID = -1L;
+    
+    @JSONField(
+            name = "page"
+    )
+    protected Long page;
+    
+    @JSONField(
+            name = "pageSize"
+    )
+    protected Long pageSize;
+    
+    @JSONField(
+            name = "lastEndId"
+    )
+    protected Long lastEndId;
+   
+    @JSONField(
+            name = "descs"
+    )
+    protected String descs;
+    
+    @JSONField(
+            name = "ascs"
+    )
+    protected String ascs;
+    @JSONField(
+            name = "chain_id",
+            serialize = false
+    )
+    protected String chainId;
+    @JSONField(
+            name = "event_id",
+            serialize = false
+    )
+    protected String eventId;
+
+    public BaseDto() {
+    }
+
+    public Long getPage() {
+        return this.page;
+    }
+
+    public Long getPageSize() {
+        return this.pageSize;
+    }
+
+    public Long getLastEndId() {
+        return this.lastEndId;
+    }
+
+    public String getDescs() {
+        return this.descs;
+    }
+
+    public String getAscs() {
+        return this.ascs;
+    }
+
+    public String getChainId() {
+        return this.chainId;
+    }
+
+    public String getEventId() {
+        return this.eventId;
+    }
+
+    public BaseDto setPage(Long page) {
+        this.page = page;
+        return this;
+    }
+
+    public BaseDto setPageSize(Long pageSize) {
+        this.pageSize = pageSize;
+        return this;
+    }
+
+    public BaseDto setLastEndId(Long lastEndId) {
+        this.lastEndId = lastEndId;
+        return this;
+    }
+
+    public BaseDto setDescs(String descs) {
+        this.descs = descs;
+        return this;
+    }
+
+    public BaseDto setAscs(String ascs) {
+        this.ascs = ascs;
+        return this;
+    }
+
+    public BaseDto setChainId(String chainId) {
+        this.chainId = chainId;
+        return this;
+    }
+
+    public BaseDto setEventId(String eventId) {
+        this.eventId = eventId;
+        return this;
+    }
+
+    public boolean equals(Object o) {
+        if (o == this) {
+            return true;
+        } else if (!(o instanceof BaseDto)) {
+            return false;
+        } else {
+            BaseDto other = (BaseDto)o;
+            if (!other.canEqual(this)) {
+                return false;
+            } else {
+                label95: {
+                    Object this$page = this.getPage();
+                    Object other$page = other.getPage();
+                    if (this$page == null) {
+                        if (other$page == null) {
+                            break label95;
+                        }
+                    } else if (this$page.equals(other$page)) {
+                        break label95;
+                    }
+
+                    return false;
+                }
+
+                Object this$pageSize = this.getPageSize();
+                Object other$pageSize = other.getPageSize();
+                if (this$pageSize == null) {
+                    if (other$pageSize != null) {
+                        return false;
+                    }
+                } else if (!this$pageSize.equals(other$pageSize)) {
+                    return false;
+                }
+
+                Object this$lastEndId = this.getLastEndId();
+                Object other$lastEndId = other.getLastEndId();
+                if (this$lastEndId == null) {
+                    if (other$lastEndId != null) {
+                        return false;
+                    }
+                } else if (!this$lastEndId.equals(other$lastEndId)) {
+                    return false;
+                }
+
+                label74: {
+                    Object this$descs = this.getDescs();
+                    Object other$descs = other.getDescs();
+                    if (this$descs == null) {
+                        if (other$descs == null) {
+                            break label74;
+                        }
+                    } else if (this$descs.equals(other$descs)) {
+                        break label74;
+                    }
+
+                    return false;
+                }
+
+                label67: {
+                    Object this$ascs = this.getAscs();
+                    Object other$ascs = other.getAscs();
+                    if (this$ascs == null) {
+                        if (other$ascs == null) {
+                            break label67;
+                        }
+                    } else if (this$ascs.equals(other$ascs)) {
+                        break label67;
+                    }
+
+                    return false;
+                }
+
+                Object this$chainId = this.getChainId();
+                Object other$chainId = other.getChainId();
+                if (this$chainId == null) {
+                    if (other$chainId != null) {
+                        return false;
+                    }
+                } else if (!this$chainId.equals(other$chainId)) {
+                    return false;
+                }
+
+                Object this$eventId = this.getEventId();
+                Object other$eventId = other.getEventId();
+                if (this$eventId == null) {
+                    if (other$eventId != null) {
+                        return false;
+                    }
+                } else if (!this$eventId.equals(other$eventId)) {
+                    return false;
+                }
+
+                return true;
+            }
+        }
+    }
+
+    protected boolean canEqual(Object other) {
+        return other instanceof BaseDto;
+    }
+
+    public String toString() {
+        return "BaseDto(page=" + this.getPage() + ", pageSize=" + this.getPageSize() + ", lastEndId=" + this.getLastEndId() + ", descs=" + this.getDescs() + ", ascs=" + this.getAscs() + ", chainId=" + this.getChainId() + ", eventId=" + this.getEventId() + ")";
+    }
+}

+ 28 - 0
boman-api/boman-domain/src/main/java/com.boman.domain/dto/ClockOnDto.java

@@ -0,0 +1,28 @@
+package com.boman.domain.dto;
+
+
+import lombok.Data;
+
+/**
+ * @author shiqian
+ * @date 2021年06月16日 10:12
+ **/
+@Data
+public class ClockOnDto {
+
+    /** 1(上班打卡)  2(下班打卡) **/
+    private int type;
+
+    /** attendance_table 考勤表 **/
+    private String tableName;
+
+    /** 经度**/
+    private String longitude;
+
+    /** 纬度 **/
+    private String latitude;
+    /** 用户id **/
+    private Long userId;
+
+
+}

+ 38 - 0
boman-api/boman-domain/src/main/java/com.boman.domain/dto/ExportExcelDto.java

@@ -0,0 +1,38 @@
+package com.boman.domain.dto;
+
+import java.util.Map;
+
+/**
+ * @author shiqian
+ * @date 2021年06月10日 09:24
+ **/
+public class ExportExcelDto {
+
+    private String tableName;
+    private Boolean empty;
+    private Map<String, Object> condition;
+
+    public String getTableName() {
+        return tableName;
+    }
+
+    public void setTableName(String tableName) {
+        this.tableName = tableName;
+    }
+
+    public Boolean getEmpty() {
+        return empty;
+    }
+
+    public void setEmpty(Boolean empty) {
+        this.empty = empty;
+    }
+
+    public Map<String, Object> getCondition() {
+        return condition;
+    }
+
+    public void setCondition(Map<String, Object> condition) {
+        this.condition = condition;
+    }
+}

+ 112 - 3
boman-web-core/src/main/java/com/boman/web/core/domain/FormDataDto.java → boman-api/boman-domain/src/main/java/com.boman.domain/dto/FormDataDto.java

@@ -1,4 +1,4 @@
-package com.boman.web.core.domain;
+package com.boman.domain.dto;
 
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.annotation.JSONField;
@@ -14,6 +14,10 @@ import java.util.List;
 public class FormDataDto implements Serializable {
 
     private static final long serialVersionUID = -8653990707913725671L;
+
+    @JSONField(name = "id")
+    private Long id;
+
     @JSONField(name = "objId")
     private Long objId;
 
@@ -23,6 +27,9 @@ public class FormDataDto implements Serializable {
     @JSONField(name = "table")
     private String table;
 
+    @JSONField(name = "tableName")
+    private String tableName;
+
     /**
      * 逻辑删除,数据库对应的属性名称
      */
@@ -71,19 +78,57 @@ public class FormDataDto implements Serializable {
     @JSONField(name = "status")
     private String status;
 
+    /**
+     * username
+     */
+    private String username;
+
     /**
      * 跳转新增或者编辑页面显示的类型带不带折叠,如果isUi=true, 带折叠
      */
     @JSONField(name = "isUi")
     private Boolean isUi;
 
+    /**
+     * 表单类型
+     */
+    private String other;
+
+    /**
+     * 提交来源
+     * @return
+     */
+    private String submitSource;
+
+    private String candidatorTableName;
+    
+    private Long moduleId;
+    private Long nodeId;
+
+
+    /******************************* 几个常量 **************************************/
+    public static final int MAX_PAGE_SIZE = 200;
+    public static final int DEFAULT_PAGE_SIZE = 10;
+    public static final int DEFAULT_PAGE_NO = 1;
+
 
     public int getLimit() {
-        return pageNo == 0 ? 0 : (pageNo - 1) * pageSize;
+        try {
+            return pageNo == 0 ? 0 : (pageNo - 1) * pageSize;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return DEFAULT_PAGE_NO;
+        }
     }
 
     public int getOffset(){
-        return pageSize == 0 ? 10 : pageSize;
+        try {
+            int pageSize = this.pageSize == 0 ? DEFAULT_PAGE_SIZE : this.pageSize;
+            return Math.min(pageSize, MAX_PAGE_SIZE);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return DEFAULT_PAGE_SIZE;
+        }
     }
 
     public static long getSerialVersionUID() {
@@ -185,6 +230,70 @@ public class FormDataDto implements Serializable {
     public void setIsUi(Boolean ui) {
         isUi = ui;
     }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getOther() {
+        return other;
+    }
+
+    public void setOther(String other) {
+        this.other = other;
+    }
+
+    public String getSubmitSource() {
+        return submitSource;
+    }
+
+    public void setSubmitSource(String submitSource) {
+        this.submitSource = submitSource;
+    }
+
+    public String getTableName() {
+        return tableName;
+    }
+
+    public void setTableName(String tableName) {
+        this.tableName = tableName;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getCandidatorTableName() {
+        return candidatorTableName;
+    }
+
+    public void setCandidatorTableName(String candidatorTableName) {
+        this.candidatorTableName = candidatorTableName;
+    }
+
+    public Long getModuleId() {
+        return moduleId;
+    }
+
+    public void setModuleId(Long moduleId) {
+        this.moduleId = moduleId;
+    }
+
+    public Long getNodeId() {
+        return nodeId;
+    }
+
+    public void setNodeId(Long nodeId) {
+        this.nodeId = nodeId;
+    }
 }
 
 

+ 33 - 0
boman-api/boman-domain/src/main/java/com.boman.domain/dto/ImportExcelDto.java

@@ -0,0 +1,33 @@
+package com.boman.domain.dto;
+
+import com.alibaba.fastjson.JSONObject;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author shiqian
+ * @date 2021年06月08日 09:14
+ **/
+public class ImportExcelDto implements Serializable {
+
+    private List<JSONObject> dataList;
+
+    private String tableName;
+
+    public String getTableName() {
+        return tableName;
+    }
+
+    public void setTableName(String tableName) {
+        this.tableName = tableName;
+    }
+
+    public List<JSONObject> getDataList() {
+        return dataList;
+    }
+
+    public void setDataList(List<JSONObject> dataList) {
+        this.dataList = dataList;
+    }
+}

+ 165 - 3
boman-api/boman-domain/src/main/java/com.boman.domain/dto/ProcessDto.java

@@ -1,16 +1,178 @@
 package com.boman.domain.dto;
 
 
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+import java.util.*;
+
 /**
  * @author shiqian
  * @date 2021年05月26日 15:29
  **/
+@Data
 public class ProcessDto {
 
-    /** 主键 **/
+    /**
+     *
+     */
+    private  String dbname;
+
+    private JSONObject businessObj;
+    /**
+     * 流程实例id
+     */
+    @JSONField
+    private Long instanceId;
+
+    /**
+     * 流程实例id-多个
+     */
+    @JSONField
+    private String instanceIds;
+
+    /**
+     * 流程实例版本
+     */
+    private Integer rev;
+
+    @JSONField
+    private Long initiator;
+
+    /**
+     * 发起人:称谓
+     */
+    @JSONField
+    private String initiatorName;
+
+    /**
+     * 业务数据编号
+     */
+    @JSONField
     private Long businessCode;
 
-    /** 表名 **/
-    private String dbname;
+    /**
+     * 业务数据
+     */
+    @JSONField(serialize = false, deserialize = false)
+    private JSONObject businessBody;
+
+    /**
+     * 业务回调路径
+     */
+    @JSONField
+    private String businessUrl;
+
+    /**
+     * 业务回调路径
+     */
+    @JSONField
+    private String formUrl;
+
+    /**
+     * 业务单据修改明细
+     */
+    @JSONField
+    private JSONObject changeDetail;
+
+    /**
+     * 流程状态
+     */
+    @JSONField
+    private Short status;
+
+    /**
+     * 检索开始时间
+     */
+    @JSONField(format = "yyyy-MM-dd HH:mm")
+    private Date startTime;
+
+    /**
+     * 检索结束时间
+     */
+    @JSONField(format = "yyyy-MM-dd HH:mm")
+    private Date endTime;
+
+    @JSONField
+    private Long moduleId;
+
+    @JSONField(serialize = false, deserialize = false)
+    private Long nodeId;
+
+    @JSONField
+    private Long businessType;
+
+    @JSONField
+    private Long changeUser;
+
+    @JSONField
+    private String userName;
+
+    /**
+     * 业务测单据id的集合
+     */
+    @JSONField(name = "businessCodes")
+    private String businessCodes;
+
+    /**
+     * 业务测英文表名
+     */
+    @JSONField
+    private String businessTypeName;
+
+    /**
+     * 业务系统需要校验的单对象id
+     */
+    @JSONField
+    private List<Long> businessCheckData;
+
+    /**
+     * 异常编号
+     */
+    private String errorCode;
+
+    /**
+     * 索引信息
+     */
+    private String businessNumber;
+
+    /**
+     * 定制页面可能需要提交的业务数据体
+     */
+    @JSONField
+    private JSONObject customizeBody;
+
+    @JSONField(serialize = false, deserialize = false)
+    private Set<Short> statusSets;
+
+    @JSONField(serialize = false, deserialize = false)
+    private List<Long> businessCodeList;
+
+    @JSONField(serialize = false, deserialize = false)
+    private Boolean async;
+
+    /**
+     * 强制终止
+     */
+    private Boolean hardShut;
+
+    /**
+     * 转储业务编号
+     *
+     * @return
+     */
+    public ProcessDto collectBusinessCodes() {
+        Set<Long> businessCodeSet = new HashSet<>(1);
+        if (businessCode != null) {
+            businessCodeSet.add(businessCode);
+        }
+        if (businessCodes != null && businessCodes.trim().length() != 0) {
+            String[] codeArray = businessCodes.trim().split(",");
+            Arrays.stream(codeArray).forEach(code -> businessCodeSet.add(Long.parseLong(code)));
+        }
+        businessCodeList = new ArrayList<>(businessCodeSet);
+        return this;
+    }
 
 }

+ 11 - 2
boman-common/boman-common-core/src/main/java/com/boman/common/core/domain/R.java → boman-api/boman-domain/src/main/java/com.boman.domain/dto/R.java

@@ -1,7 +1,7 @@
-package com.boman.common.core.domain;
+package com.boman.domain.dto;
 
 import java.io.Serializable;
-import com.boman.common.core.constant.Constants;
+import com.boman.domain.constant.Constants;
 
 /**
  * 响应信息主体
@@ -17,6 +17,10 @@ public class R<T> implements Serializable
 
     /** 失败 */
     public static final int FAIL = Constants.FAIL;
+    /**
+     * 登录状态失效
+     */
+    public static final Integer LOGIN_EXPIRE = Constants.LOGIN_EXPIRE;
 
     private int code;
 
@@ -49,6 +53,11 @@ public class R<T> implements Serializable
         return restResult(null, FAIL, msg);
     }
 
+    public static <T> R<T> loginExpire(String msg)
+    {
+        return restResult(null, LOGIN_EXPIRE, msg);
+    }
+
     public static <T> R<T> fail(T data)
     {
         return restResult(data, FAIL, null);

+ 239 - 0
boman-api/boman-domain/src/main/java/com.boman.domain/dto/TaskDto.java

@@ -0,0 +1,239 @@
+package com.boman.domain.dto;
+
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+import lombok.experimental.Accessors;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author zhong.h
+ * createTime: 2021/6/17
+ * description:任务中心的DTO
+ */
+
+@Data
+@Accessors(chain = true)
+public class TaskDto extends BaseDto {
+    private static final long serialVersionUID = -1L;
+
+    /**
+     * 主键id
+     */
+    @JSONField
+    private Long id;
+
+    /**
+     * 上一次的任务id
+     */
+    private Long lastTaskId;
+
+    /**
+     * 批处理数据的id以","分隔
+     */
+    private String ids;
+
+    /**
+     * 任务所属节点id
+     */
+    private Long nodeId;
+
+    /**
+     * 流程实例id
+     */
+    @JSONField
+    private Long instanceId;
+
+    /**
+     * 任务所属动作
+     */
+    private Long actId;
+
+    /**
+     * 任务动作类别:定时任务设置的就算作自动
+     */
+    private Short actType;
+
+    /**
+     * 版本
+     */
+    private Integer rev;
+
+    /**
+     * 任务描述
+     */
+    private String description;
+
+    /**
+     * 任务创建时间
+     */
+    @JSONField(name = "startTime", format = "yyyy-MM-dd HH:mm")
+    private Date createTime;
+
+    /**
+     * 任务修改时间
+     */
+    @JSONField(format = "yyyy-MM-dd HH:mm")
+    private Date updateTime;
+
+    private String approvedTime;
+
+    /**
+     * 上一步任务实例
+     */
+    private Long lastTask;
+
+    /**
+     * 任务执行状态
+     */
+    private Short excuStatus;
+
+    /**
+     * 审批人编号
+     */
+    private Long approver;
+
+    /**
+     * 转派人编号
+     */
+    private Long delegateId;
+
+
+    /**
+     * 详情查询类型:待办为0,历史为1
+     */
+    private Integer loadType;
+
+    /**
+     * 操作类型:同意,驳回,转派
+     */
+    private Short type;
+
+    /**
+     * 业务编号
+     */
+    private Long businessCode;
+
+    /**
+     * 业务类型
+     */
+    private Long businessType;
+
+    /**
+     * 业务单据
+     */
+    private String businessBody;
+
+    /**
+     * 发起人id
+     */
+    private Long initiator;
+
+    /**
+     * 发起人中文名
+     */
+    private String initiatorName;
+
+    /**
+     * 是否是本人
+     */
+    private Boolean isinitiator;
+
+    /**
+     * 当前用户id
+     */
+    private Long userId;
+
+    /**
+     * 列表查询类型
+     */
+    private String searchType;
+
+    /**
+     * 审批人类型
+     */
+    private Short approverType;
+
+    /**
+     * 用于时间段的截至时间
+     */
+    private String endTime;
+
+    /**
+     * 驳回节点
+     */
+    private Long backId;
+
+    /**
+     * 模板id
+     */
+    private Long moduleId;
+
+    /**
+     * 流程状态
+     */
+    private Short processStatus;
+
+    //业务数据编号
+    private String businessNumber;
+
+    /**
+     * 审批人中文名
+     */
+    private String approverName;
+
+    /**
+     * 单据类型中文名
+     */
+    private String businessTypeName;
+
+    /**
+     * 掌云或条件搜索字段
+     */
+    private String searchField;
+
+    /**
+     * 审批人id,和审批人中文名
+     */
+    private List<Map<String,String>> approverInfo;
+
+    /**
+     * 批次号
+     */
+    private Integer batch;
+
+    /**
+     * 人工干预驳回节点id
+     */
+    private Long backNodeId;
+
+    /**
+     * 人工干预同意节点id
+     */
+    private Long passNodeId;
+
+    /**
+     * 是否轮询
+     */
+    private Boolean isPoll;
+
+    /**
+     * 节点名称,代办列表的节点名称筛
+     */
+    private String nodeName;
+
+    /** 表名 */
+    private String tableName;
+
+    /***/
+    private String other;
+
+    /**
+     * 扩展节点审核人
+     */
+    private String candidatorId;
+
+    private String candidatorTableName;
+}

+ 3 - 1
boman-common/boman-common-core/src/main/java/com/boman/common/core/web/domain/TreeEntity.java → boman-api/boman-domain/src/main/java/com.boman.domain/dto/TreeEntity.java

@@ -1,4 +1,6 @@
-package com.boman.common.core.web.domain;
+package com.boman.domain.dto;
+
+import com.boman.domain.BaseEntity;
 
 import java.util.ArrayList;
 import java.util.List;

+ 21 - 0
boman-api/boman-domain/src/main/java/com.boman.domain/dto/UpdateDto.java

@@ -0,0 +1,21 @@
+package com.boman.domain.dto;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.Data;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author shiqian
+ * @date 2021年06月30日 16:42
+ **/
+@Data
+public class UpdateDto {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(UpdateDto.class);
+
+    private String tableName;
+
+    private JSONObject condition;
+    private JSONObject commitData;
+}

+ 63 - 0
boman-api/boman-domain/src/main/java/com/boman/domain/jflow/ProcessNodeCandidator.java

@@ -0,0 +1,63 @@
+package com.boman.domain.jflow;
+
+/**
+ * 节点审核人
+ *
+ * @author zhong.h
+ */
+public class ProcessNodeCandidator {
+
+    /**
+     * id
+     */
+    private Long id;
+
+    /** 业务数据id */
+    private Long businessCode;
+    /** 模板id */
+    private Long moduleId;
+    /** 节点id */
+    private Long nodeId;
+    /** 审核人id */
+    private String candidatorId;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getBusinessCode() {
+        return businessCode;
+    }
+
+    public void setBusinessCode(Long businessCode) {
+        this.businessCode = businessCode;
+    }
+
+    public Long getModuleId() {
+        return moduleId;
+    }
+
+    public void setModuleId(Long moduleId) {
+        this.moduleId = moduleId;
+    }
+
+    public Long getNodeId() {
+        return nodeId;
+    }
+
+    public void setNodeId(Long nodeId) {
+        this.nodeId = nodeId;
+    }
+
+    public String getCandidatorId() {
+        return candidatorId;
+    }
+
+    public void setCandidatorId(String candidatorId) {
+        this.candidatorId = candidatorId;
+    }
+}

+ 4 - 5
boman-auth/src/main/java/com/boman/auth/controller/TokenController.java

@@ -1,14 +1,12 @@
 package com.boman.auth.controller;
 
 import javax.servlet.http.HttpServletRequest;
+
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import com.boman.auth.form.LoginBody;
 import com.boman.auth.service.SysLoginService;
-import com.boman.common.core.domain.R;
+import com.boman.domain.dto.R;
 import com.boman.common.core.utils.StringUtils;
 import com.boman.common.security.service.TokenService;
 import com.boman.system.api.model.LoginUser;
@@ -19,6 +17,7 @@ import com.boman.system.api.model.LoginUser;
  * @author ruoyi
  */
 @RestController
+//@CrossOrigin
 public class TokenController
 {
     @Autowired

+ 4 - 4
boman-auth/src/main/java/com/boman/auth/service/SysLoginService.java

@@ -2,16 +2,16 @@ package com.boman.auth.service;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
-import com.boman.common.core.constant.Constants;
-import com.boman.common.core.constant.UserConstants;
-import com.boman.common.core.domain.R;
+import com.boman.domain.constant.Constants;
+import com.boman.domain.constant.UserConstants;
+import com.boman.domain.dto.R;
 import com.boman.common.core.enums.UserStatus;
 import com.boman.common.core.exception.BaseException;
 import com.boman.common.core.utils.SecurityUtils;
 import com.boman.common.core.utils.StringUtils;
 import com.boman.system.api.RemoteLogService;
 import com.boman.system.api.RemoteUserService;
-import com.boman.system.api.domain.SysUser;
+import com.boman.domain.SysUser;
 import com.boman.system.api.model.LoginUser;
 
 /**

+ 2 - 0
boman-auth/src/main/resources/bootstrap.yml

@@ -15,6 +15,7 @@ spring:
       discovery:
         # 服务注册地址
         server-addr: 192.168.101.10:8848
+        namespace: 0886e975-9ff6-4602-8ed2-f17b4d0ef1bc  #潜山数据局
       config:
         # 配置中心地址
         server-addr: 192.168.101.10:8848
@@ -23,6 +24,7 @@ spring:
         # 共享配置
         shared-configs:
           - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
+        namespace: 0886e975-9ff6-4602-8ed2-f17b4d0ef1bc  #潜山数据局
 justauth:
   enabled: true
   type:

+ 13 - 0
boman-common/boman-common-core/pom.xml

@@ -16,6 +16,13 @@
     </description>
 
     <dependencies>
+
+        <!--计算经纬度-->
+        <dependency>
+            <groupId>org.gavaghan</groupId>
+            <artifactId>geodesy</artifactId>
+            <version>1.1.3</version>
+        </dependency>
     	<!-- SpringCloud Openfeign -->
         <dependency>
             <groupId>org.springframework.cloud</groupId>
@@ -100,6 +107,12 @@
             <artifactId>swagger-annotations</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>com.boman</groupId>
+            <artifactId>boman-domain</artifactId>
+            <version>2.5.0-SNAPSHOT</version>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 143 - 0
boman-common/boman-common-core/src/main/java/com/boman/common/core/utils/DateUtils.java

@@ -1,10 +1,14 @@
 package com.boman.common.core.utils;
 
 import java.lang.management.ManagementFactory;
+import java.text.DateFormat;
 import java.text.ParseException;
+import java.text.ParsePosition;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.temporal.ChronoUnit;
+import java.util.ArrayList;
+import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -29,6 +33,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
     public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
 
     public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
+    public static String YYYY_MM_DD_HH_MM = "yyyy-MM-dd HH:mm";
 
     private static String[] parsePatterns = {
             "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
@@ -44,6 +49,12 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
         return new Date();
     }
 
+    public static Date strToDate(String strDate, String format) {
+        SimpleDateFormat formatter = new SimpleDateFormat(format);
+        ParsePosition pos = new ParsePosition(0);
+        return formatter.parse(strDate, pos);
+    }
+
     /**
      * 获取当前日期, 默认格式为yyyy-MM-dd
      *
@@ -57,10 +68,69 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
         return dateTimeNow(YYYY);
     }
 
+
+    public static String getMonth() {
+        Calendar calendar = Calendar.getInstance();
+        int month = calendar.get(Calendar.MONTH) + 1;
+        return month < 10 ? "0" + month : month + "";
+    }
+
+    public static String getFirstDayOfYearStr() {
+        return getYear() + "-01-01 00:00:00";
+    }
+
+    public static String getFirstDayOfMonthStr() {
+        return getYear() + "-01 00:00:00";
+    }
+
+    public static Date getFirstDayOfMonth() {
+        String str = getFirstDayOfMonthStr();
+        return dateTime(YYYY_MM_DD_HH_MM_SS, str);
+    }
+
+    public static String getLastDayOfMonthStr() {
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(Calendar.DATE, 1);
+        calendar.roll(Calendar.DATE, -1);
+        return dateTime(calendar.getTime()) + " 23:59:59";
+    }
+
+    public static String getLastDayOfMonthStr(String yyyy) {
+        String re = getLastDayOfMonthStr();
+        re = re.substring(4);
+        return yyyy + re;
+    }
+
+    public static void main(String[] args) {
+        String re = getLastDayOfMonthStr();
+        re = re.substring(4);
+        System.out.println(getYear() + re);
+    }
+
+
+    public static Date getLastDayOfMonth() {
+        String str = getLastDayOfMonthStr();
+        return dateTime(YYYY_MM_DD_HH_MM_SS, str);
+    }
+
+
+    public static String getLastDayOfYearStr() {
+        return getYyyy_Mm() + "-12-31 23:59:59";
+    }
+
+    public static int dayOfMonth() {
+        Calendar calendar = Calendar.getInstance();
+        return calendar.get(Calendar.DAY_OF_MONTH);
+    }
+
     public static final String getYyyyMm() {
         return dateTimeNow(YYYYMM);
     }
 
+    public static final String getYyyy_Mm() {
+        return dateTimeNow(YYYY_MM);
+    }
+
 
     public static final String getYyyyMmDd() {
         return dateTimeNow(YYYYMMDD);
@@ -70,6 +140,11 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
         return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
     }
 
+    public static final String getTime1(final Date date) {
+
+        return dateTime1(date);
+    }
+
     public static final String dateTimeNow() {
         return dateTimeNow(YYYYMMDDHHMMSS);
     }
@@ -82,6 +157,10 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
         return parseDateToStr(YYYY_MM_DD, date);
     }
 
+    public static final String dateTime1(final Date date) {
+        return parseDateToStr(YYYY_MM_DD_HH_MM_SS, date);
+    }
+
     public static final String parseDateToStr(final String format, final Date date) {
         return new SimpleDateFormat(format).format(date);
     }
@@ -174,4 +253,68 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
     public static String stampToTime(String stamp) {
         return new SimpleDateFormat("yyyy-MM-dd").format(new Date(Long.parseLong(stamp)));
     }
+
+    /**
+     * 功能描述: 获取当前月份的第一天到当天
+     *
+     * @return java.lang.String
+     */
+    public static List<String> getMonthDays() {
+        List<String> result = new ArrayList<>(31);
+        Calendar cd = Calendar.getInstance();
+        int year = cd.get(Calendar.YEAR);
+        int month = cd.get(Calendar.MONTH);
+        int day;
+
+        String today = getDate();
+        int[] monDays = new int[]{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
+        if (((year) % 4 == 0 && (year) % 100 != 0) || (year) % 400 == 0) {
+            day = monDays[month]++;
+        } else {
+            day = monDays[month];
+        }
+
+        for (int i = 1; i <= day; i++) {
+            String m;
+            if (month < 10) {
+                m = "0" + (month + 1) + "";
+            } else {
+                m = month + 1 + "";
+            }
+
+            String d;
+            if (i < 10) {
+                d = "0" + i + "";
+            } else {
+                d = i + "";
+            }
+
+            String time = year + "-" + m + "-" + d;
+            if (today.equals(time)) {
+                result.add(time);
+                break;
+            }
+
+            result.add(time);
+        }
+
+        return result;
+    }
+
+    public static int getWeekMonthYear(int type) {
+        Calendar calendar = Calendar.getInstance();
+        Date today = new Date();
+        calendar.setTime(today);
+        int typeNo = calendar.get(type);
+        if (type == Calendar.WEEK_OF_MONTH) {
+            if (typeNo == 1) {
+                typeNo = 7;
+            } else {
+                typeNo = typeNo - 1;
+            }
+        }
+
+        return typeNo;
+    }
+
 }

+ 13 - 0
boman-common/boman-common-core/src/main/java/com/boman/common/core/utils/JSONArrayUtils.java

@@ -3,6 +3,9 @@ package com.boman.common.core.utils;
 import com.alibaba.fastjson.JSONArray;
 import com.boman.common.core.utils.obj.ObjectUtils;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * @author shiqian
  * @date 2021年03月26日 11:07
@@ -19,4 +22,14 @@ public class JSONArrayUtils {
         return result;
     }
 
+    public static List<String> toList(JSONArray jsonArray){
+        ObjectUtils.requireNonNull(jsonArray, "toList jsonArray is empty");
+        List<String> result = new ArrayList<>(jsonArray.size());
+        for (Object obj : jsonArray) {
+            String obj1 = (String) obj;
+            result.add(obj1);
+        }
+        return result;
+    }
+
 }

+ 29 - 0
boman-common/boman-common-core/src/main/java/com/boman/common/core/utils/LatLgtUtil.java

@@ -0,0 +1,29 @@
+package com.boman.common.core.utils;
+
+import org.gavaghan.geodesy.Ellipsoid;
+import org.gavaghan.geodesy.GeodeticCalculator;
+import org.gavaghan.geodesy.GeodeticCurve;
+import org.gavaghan.geodesy.GlobalCoordinates;
+
+/**
+ * @author tjf
+ * @Date: 2021/06/04/11:41
+ */
+public class LatLgtUtil {
+
+
+    /**
+     * 传入两组经纬度,计算出距离
+     * @param gpsFrom
+     * @param gpsTo
+     * @param ellipsoid Ellipsoid.Sphere(百度)/Ellipsoid.WGS84
+     * @return
+     */
+    public static double getDistanceMeter(GlobalCoordinates gpsFrom, GlobalCoordinates gpsTo, Ellipsoid ellipsoid){
+
+        //创建GeodeticCalculator,调用计算方法,传入坐标系、经纬度用于计算距离
+        GeodeticCurve geoCurve = new GeodeticCalculator().calculateGeodeticCurve(ellipsoid, gpsFrom, gpsTo);
+
+        return geoCurve.getEllipsoidalDistance();
+    }
+}

+ 1 - 1
boman-common/boman-common-core/src/main/java/com/boman/common/core/utils/SecurityUtils.java

@@ -3,7 +3,7 @@ package com.boman.common.core.utils;
 import javax.servlet.http.HttpServletRequest;
 
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
-import com.boman.common.core.constant.CacheConstants;
+import com.boman.domain.constant.CacheConstants;
 import com.boman.common.core.text.Convert;
 
 /**

+ 1 - 1
boman-common/boman-common-core/src/main/java/com/boman/common/core/utils/ServletUtils.java

@@ -13,7 +13,7 @@ import javax.servlet.http.HttpSession;
 import org.springframework.web.context.request.RequestAttributes;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
-import com.boman.common.core.constant.Constants;
+import com.boman.domain.constant.Constants;
 import com.boman.common.core.text.Convert;
 
 /**

+ 173 - 0
boman-common/boman-common-core/src/main/java/com/boman/common/core/utils/fieldTranslator/IdCardUtils.java

@@ -0,0 +1,173 @@
+package com.boman.common.core.utils.fieldTranslator;
+
+import com.boman.common.core.utils.StringUtils;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * @author tjf
+ * @Date: 2021/06/07/15:02
+ */
+public class IdCardUtils {
+    /**
+     * 15位身份证号
+     */
+    private static final Integer FIFTEEN_ID_CARD=15;
+    /**
+     * 18位身份证号
+     */
+    private static final Integer EIGHTEEN_ID_CARD=18;
+    private static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+
+    /**
+     * 根据身份证号获取性别
+     * @param IDCard
+     * @return
+     */
+    public static String getSex(String IDCard){
+        String sex ="";
+        if (StringUtils.isNotBlank(IDCard)){
+            //15位身份证号
+            if (IDCard.length() == FIFTEEN_ID_CARD){
+                if (Integer.parseInt(IDCard.substring(14, 15)) % 2 == 0) {
+                    sex = "女";
+                } else {
+                    sex = "男";
+                }
+                //18位身份证号
+            }else if(IDCard.length() == EIGHTEEN_ID_CARD){
+                // 判断性别
+                if (Integer.parseInt(IDCard.substring(16).substring(0, 1)) % 2 == 0) {
+                    sex = "女";
+                } else {
+                    sex = "男";
+                }
+            }
+        }
+        return sex;
+    }
+
+    /**
+     * 根据身份证号获取年龄
+     * @param IDCard
+     * @return
+     */
+    public static Integer getAge(String IDCard){
+        Integer age = 0;
+        Date date = new Date();
+        if (StringUtils.isNotBlank(IDCard)&& isValid(IDCard)){
+            //15位身份证号
+            if (IDCard.length() == FIFTEEN_ID_CARD){
+                // 身份证上的年份(15位身份证为1980年前的)
+                String uyear = "19" + IDCard.substring(6, 8);
+                // 身份证上的月份
+                String uyue = IDCard.substring(8, 10);
+                // 当前年份
+                String fyear = format.format(date).substring(0, 4);
+                // 当前月份
+                String fyue = format.format(date).substring(5, 7);
+                if (Integer.parseInt(uyue) <= Integer.parseInt(fyue)) {
+                    age = Integer.parseInt(fyear) - Integer.parseInt(uyear) + 1;
+                    // 当前用户还没过生
+                } else {
+                    age = Integer.parseInt(fyear) - Integer.parseInt(uyear);
+                }
+                //18位身份证号
+            }else if(IDCard.length() == EIGHTEEN_ID_CARD){
+                // 身份证上的年份
+                String year = IDCard.substring(6).substring(0, 4);
+                // 身份证上的月份
+                String yue = IDCard.substring(10).substring(0, 2);
+                // 当前年份
+                String fyear = format.format(date).substring(0, 4);
+                // 当前月份
+                String fyue = format.format(date).substring(5, 7);
+                // 当前月份大于用户出身的月份表示已过生日
+                if (Integer.parseInt(yue) <= Integer.parseInt(fyue)) {
+                    age = Integer.parseInt(fyear) - Integer.parseInt(year) + 1;
+                    // 当前用户还没过生日
+                } else {
+                    age = Integer.parseInt(fyear) - Integer.parseInt(year);
+                }
+            }
+        }
+        return age;
+    }
+
+    /**
+     * 获取出生日期  yyyy年MM月dd日
+     * @param iDCard
+     * @return
+     */
+    public static String getBirthday(String iDCard){
+        String birthday="";
+        String year="";
+        String month="";
+        String day="";
+        if (StringUtils.isNotBlank(iDCard)){
+            //15位身份证号
+            if (iDCard.length() == FIFTEEN_ID_CARD){
+                // 身份证上的年份(15位身份证为1980年前的)
+                year = "19" + iDCard.substring(6, 8);
+                //身份证上的月份
+                month = iDCard.substring(8, 10);
+                //身份证上的日期
+                day= iDCard.substring(10, 12);
+                //18位身份证号
+            }else if(iDCard.length() == EIGHTEEN_ID_CARD){
+                // 身份证上的年份
+                year = iDCard.substring(6).substring(0, 4);
+                // 身份证上的月份
+                month = iDCard.substring(10).substring(0, 2);
+                //身份证上的日期
+                day=iDCard.substring(12).substring(0,2);
+            }
+            birthday=year+"-"+month+"-"+day;
+        }
+        return birthday;
+    }
+
+    /**
+     * 身份证验证
+     * @param id 号码内容
+     * @return 是否有效
+     */
+    public static boolean isValid(String id){
+        Boolean validResult = true;
+        //校验长度只能为15或18
+        int len = id.length();
+        if (len != FIFTEEN_ID_CARD && len != EIGHTEEN_ID_CARD){
+            validResult = false;
+        }
+        //校验生日
+        if (!validDate(id)){
+            validResult = false;
+        }
+        return validResult;
+    }
+
+    /**
+     * 校验生日
+     * @param id
+     * @return
+     */
+    private static boolean validDate(String id)
+    {
+        try
+        {
+            String birth = id.length() == 15 ? "19" + id.substring(6, 12) : id.substring(6, 14);
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+            Date birthDate = sdf.parse(birth);
+            if (!birth.equals(sdf.format(birthDate))){
+                return false;
+            }
+        }
+        catch (ParseException e)
+        {
+            return false;
+        }
+        return true;
+    }
+}

+ 28 - 0
boman-common/boman-common-core/src/main/java/com/boman/common/core/utils/number/NumberUtils.java

@@ -0,0 +1,28 @@
+package com.boman.common.core.utils.number;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static com.boman.common.core.utils.obj.ObjectUtils.*;
+
+/**
+ * @author shiqian
+ * @date 2021年06月11日 10:00
+ **/
+public class NumberUtils {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(NumberUtils.class);
+
+    public static boolean gtZero(int input){
+        return input > 0;
+    }
+
+    public static boolean ltZero(int input){
+        return input < 0;
+    }
+
+    public static boolean eqZero(int input){
+        return input == 0;
+    }
+
+}

+ 608 - 102
boman-common/boman-common-core/src/main/java/com/boman/common/core/utils/poi/ExcelUtil.java

@@ -1,60 +1,49 @@
 package com.boman.common.core.utils.poi;
 
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.util.TypeUtils;
+import com.boman.domain.annotation.Excel;
+import com.boman.domain.annotation.Excel.ColumnType;
+import com.boman.domain.annotation.Excel.Type;
+import com.boman.domain.annotation.Excels;
+import com.boman.common.core.text.Convert;
+import com.boman.common.core.utils.DateUtils;
+import com.boman.common.core.utils.StringUtils;
+import com.boman.common.core.utils.array.ArrayUtils;
+import com.boman.common.core.utils.file.FileTypeUtils;
+import com.boman.common.core.utils.file.ImageUtils;
+import com.boman.common.core.utils.obj.ObjectUtils;
+import com.boman.common.core.utils.reflect.ReflectUtils;
+import com.boman.domain.GenTableColumn;
+import com.boman.domain.SysDictData;
+import com.boman.domain.constant.FormDataConstant;
+import org.apache.commons.lang3.BooleanUtils;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddressList;
+import org.apache.poi.xssf.streaming.SXSSFWorkbook;
+import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
+import org.apache.poi.xssf.usermodel.XSSFDataValidation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.lang.reflect.Field;
 import java.math.BigDecimal;
+import java.nio.charset.StandardCharsets;
 import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
+import java.util.function.Predicate;
 import java.util.stream.Collectors;
-import javax.servlet.http.HttpServletResponse;
-import org.apache.poi.ss.usermodel.BorderStyle;
-import org.apache.poi.ss.usermodel.Cell;
-import org.apache.poi.ss.usermodel.CellStyle;
-import org.apache.poi.ss.usermodel.CellType;
-import org.apache.poi.ss.usermodel.ClientAnchor;
-import org.apache.poi.ss.usermodel.DataValidation;
-import org.apache.poi.ss.usermodel.DataValidationConstraint;
-import org.apache.poi.ss.usermodel.DataValidationHelper;
-import org.apache.poi.ss.usermodel.DateUtil;
-import org.apache.poi.ss.usermodel.Drawing;
-import org.apache.poi.ss.usermodel.FillPatternType;
-import org.apache.poi.ss.usermodel.Font;
-import org.apache.poi.ss.usermodel.HorizontalAlignment;
-import org.apache.poi.ss.usermodel.IndexedColors;
-import org.apache.poi.ss.usermodel.Row;
-import org.apache.poi.ss.usermodel.Sheet;
-import org.apache.poi.ss.usermodel.VerticalAlignment;
-import org.apache.poi.ss.usermodel.Workbook;
-import org.apache.poi.ss.usermodel.WorkbookFactory;
-import org.apache.poi.ss.util.CellRangeAddressList;
-import org.apache.poi.xssf.streaming.SXSSFWorkbook;
-import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
-import org.apache.poi.xssf.usermodel.XSSFDataValidation;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import com.boman.common.core.annotation.Excel;
-import com.boman.common.core.annotation.Excel.ColumnType;
-import com.boman.common.core.annotation.Excel.Type;
-import com.boman.common.core.annotation.Excels;
-import com.boman.common.core.text.Convert;
-import com.boman.common.core.utils.DateUtils;
-import com.boman.common.core.utils.StringUtils;
-import com.boman.common.core.utils.file.FileTypeUtils;
-import com.boman.common.core.utils.file.ImageUtils;
-import com.boman.common.core.utils.reflect.ReflectUtils;
+
+import static com.boman.common.core.utils.obj.ObjectUtils.*;
+import static com.boman.domain.constant.FormDataConstant.*;
 
 /**
  * Excel相关处理
- * 
+ *
  * @author ruoyi
  */
 public class ExcelUtil<T>
@@ -96,6 +85,11 @@ public class ExcelUtil<T>
      */
     private List<T> list;
 
+    /**
+     * 导入导出数据列表
+     */
+    private List<Map<String, Object>> jsonObjectList;
+
     /**
      * 注解列表
      */
@@ -139,9 +133,18 @@ public class ExcelUtil<T>
         createWorkbook();
     }
 
+    public void initJSONObject(List<Map<String, Object>> list, String sheetName, Type type)
+    {
+        this.jsonObjectList = list;
+        this.sheetName = sheetName;
+        this.type = type;
+        createExcelField();
+        createWorkbook();
+    }
+
     /**
      * 对excel表单默认第一个索引名转换成list
-     * 
+     *
      * @param is 输入流
      * @return 转换后集合
      */
@@ -152,7 +155,7 @@ public class ExcelUtil<T>
 
     /**
      * 对excel表单指定表格索引名转换成list
-     * 
+     *
      * @param sheetName 表格索引名
      * @param is 输入流
      * @return 转换后集合
@@ -184,22 +187,7 @@ public class ExcelUtil<T>
         if (rows > 0)
         {
             // 定义一个map用于存放excel列的序号和field.
-            Map<String, Integer> cellMap = new HashMap<String, Integer>();
-            // 获取表头
-            Row heard = sheet.getRow(0);
-            for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++)
-            {
-                Cell cell = heard.getCell(i);
-                if (StringUtils.isNotNull(cell))
-                {
-                    String value = this.getCellValue(heard, i).toString();
-                    cellMap.put(value, i);
-                }
-                else
-                {
-                    cellMap.put(null, i);
-                }
-            }
+            Map<String, Integer> cellMap = getHead(sheet);
             // 有数据时才处理 得到类的所有field.
             Field[] allFields = clazz.getDeclaredFields();
             // 定义一个map用于存放列的序号和field.
@@ -310,9 +298,123 @@ public class ExcelUtil<T>
         return list;
     }
 
+    /**
+     * 对excel表单指定表格索引名转换成list
+     *
+     * @param sheetName 表格索引名
+     * @param is        输入流
+     * @return 转换后集合
+     */
+    public List<JSONObject> importCommonExcel(String sheetName, InputStream is, List<GenTableColumn> columns) throws Exception {
+        List<JSONObject> dataList = new ArrayList<>(16);
+        this.type = Type.IMPORT;
+        this.wb = WorkbookFactory.create(is);
+        Sheet sheet = getSheet(sheetName);
+        int rows = sheet.getPhysicalNumberOfRows();
+        if (rows < 0) {
+            return Collections.emptyList();
+        }
+
+        Map<String, Integer> cellMap = getHead(sheet);
+        Map<Integer, GenTableColumn> fieldsMap = new HashMap<>(16);
+        for (GenTableColumn column : columns) {
+            for (Map.Entry<String, Integer> entry : cellMap.entrySet()) {
+                if (entry.getKey().equals(column.getColumnComment())) {
+                    Integer sort = cellMap.get(entry.getKey());
+                    fieldsMap.put(sort, column);
+                }
+            }
+        }
+
+        // 往data中赋值
+        for (int i = 1; i < rows; i++) {
+            Row row = sheet.getRow(i);
+            JSONObject data = new JSONObject();
+            for (Map.Entry<Integer, GenTableColumn> entry : fieldsMap.entrySet()) {
+                GenTableColumn column = entry.getValue();
+                String columnName = column.getColumnName();
+                Object value = this.getCellValue(row, entry.getKey());
+                value = handleFK(column.getColumnName(), value, columns);
+                data.put(columnName, value);
+            }
+
+            dataList.add(data);
+        }
+
+        return dataList;
+    }
+
+    private Sheet getSheet(String sheetName) throws IOException {
+        Sheet sheet;
+        if (StringUtils.isNotEmpty(sheetName)) {
+            // 如果指定sheet名,则取指定sheet中的内容.
+            sheet = wb.getSheet(sheetName);
+        } else {
+            // 如果传入的sheet名不存在则默认指向第1个sheet.
+            sheet = wb.getSheetAt(0);
+        }
+
+        if (sheet == null) {
+            throw new IOException("文件sheet不存在");
+        }
+        return sheet;
+    }
+
+    private Map<String, Integer> getHead(Sheet sheet) {
+        // 定义一个map用于存放excel列的序号和field.
+        Map<String, Integer> cellMap = new HashMap<>();
+        // 获取表头
+        Row heard = sheet.getRow(0);
+        for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++) {
+            Cell cell = heard.getCell(i);
+            if (StringUtils.isNotNull(cell)) {
+                String value = this.getCellValue(heard, i).toString();
+                cellMap.put(value, i);
+            } else {
+                cellMap.put(null, i);
+            }
+        }
+        return cellMap;
+    }
+
+    private Object handleFK(String columnName, Object value, List<GenTableColumn> columns) {
+        for (GenTableColumn column : columns) {
+            if (columnName.equals(column.getColumnName())) {
+                if (ObjectUtils.isEmpty(column.getDictType())) {
+                    continue;
+                }
+
+                List<SysDictData> dictDataList = column.getSysDictData();
+                SysDictData sysDictData = ObjectUtils.filterOne(dictDataList, dict -> dict.getDictLabel().equals(String.valueOf(value)));
+                return sysDictData.getDictValue();
+            }
+        }
+
+        return value;
+    }
+
+    /**
+     * 功能描述: 通用的导出
+     *
+     * @param response           返回数据
+     * @param list               导出数据集合
+     * @param sheetName          工作表的名称
+     * @param listVisibleColumns 列表可见
+     * @param empty              所有的列
+     * @param result             true直接导出结果 false需要检查列...
+     */
+    public void exportExcelCommon(HttpServletResponse response, List<Map<String, Object>> list
+            , String sheetName, List<GenTableColumn> listVisibleColumns, Boolean empty, Boolean result) throws IOException {
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("utf-8");
+        initJSONObject(list, sheetName, Type.EXPORT);
+        exportExcelCommon(response.getOutputStream(), list, listVisibleColumns, empty, result);
+    }
+
+
     /**
      * 对list数据源将其里面的数据导入到excel表单
-     * 
+     *
      * @param response 返回数据
      * @param list 导出数据集合
      * @param sheetName 工作表的名称
@@ -327,9 +429,98 @@ public class ExcelUtil<T>
         exportExcel(response.getOutputStream());
     }
 
+    /**
+     * 功能描述: 通用导出
+     *
+     * @param outputStream       outputStream
+     * @param listVisibleColumns listVisibleColumns
+     * @param empty              true=>只带表头的excel,不含数据, false=>带数据的excel
+     * @param result             true直接导出结果, false需要检查列...
+     */
+    public void exportExcelCommon(OutputStream outputStream, List<Map<String, Object>> list, List<GenTableColumn> listVisibleColumns
+            , Boolean empty, Boolean result) {
+        try {
+//            list = sortMapByKey(list);
+            // 取出一共有多少个sheet.
+            double sheetNo = Math.ceil(list.size() / sheetSize);
+            for (int index = 0; index <= sheetNo; index++) {
+                createSheet(sheetNo, index);
+
+                // 产生一行
+                Row row = sheet.createRow(0);
+                int columnIndex = 0;
+
+                // 直接导出结果,无需检查列
+                if (BooleanUtils.isTrue(result)) {
+                    Map<String, Object> map = list.get(0);
+                    for (Map.Entry<String, Object> entry : map.entrySet()) {
+                        String columnName = entry.getKey();
+                        columnName = covertHead(columnName);
+                        createCellByMap(columnName, row, columnIndex++);
+                    }
+
+                    if (BooleanUtils.isFalse(empty) && Type.EXPORT.equals(type)) {
+                        fillDataByListMap(index);
+                    }
+                } else {
+                    for (GenTableColumn column : listVisibleColumns) {
+                        createCellByColumn(column, row, columnIndex++);
+                    }
+
+                    if (BooleanUtils.isFalse(empty) && Type.EXPORT.equals(type)) {
+                        fillDataByColumns(index, row, listVisibleColumns);
+//                        addStatisticsRow();
+                    }
+                }
+            }
+
+            wb.write(outputStream);
+        } catch (Exception e) {
+            log.error("导出Excel异常{}", e.getMessage());
+        } finally {
+            close(outputStream);
+        }
+    }
+
+    private String covertHead(String columnName) {
+        switch (columnName){
+            case "userName":
+                return "用户名";
+            case "deptName":
+                return "部门名称";
+            case "date":
+                return "日期";
+            case "attendanceTableLeaveSum":
+                return "早退";
+            case "attendanceTableLeaveOrSum":
+                return "请假";
+            case "attendanceTableLateSum":
+                return "迟到";
+            default:
+                return "";
+        }
+    }
+
+    private void close(OutputStream outputStream) {
+        if (wb != null) {
+            try {
+                wb.close();
+            } catch (IOException e1) {
+                e1.printStackTrace();
+            }
+        }
+        if (outputStream != null) {
+            try {
+                outputStream.close();
+            } catch (IOException e1) {
+                e1.printStackTrace();
+            }
+        }
+    }
+
     /**
      * 对list数据源将其里面的数据导入到excel表单
-     * 
+     *
      * @param sheetName 工作表的名称
      * @return 结果
      */
@@ -343,7 +534,7 @@ public class ExcelUtil<T>
 
     /**
      * 对list数据源将其里面的数据导入到excel表单
-     * 
+     *
      * @return 结果
      */
     public void exportExcel(OutputStream outputStream)
@@ -379,34 +570,13 @@ public class ExcelUtil<T>
         }
         finally
         {
-            if (wb != null)
-            {
-                try
-                {
-                    wb.close();
-                }
-                catch (IOException e1)
-                {
-                    e1.printStackTrace();
-                }
-            }
-            if (outputStream != null)
-            {
-                try
-                {
-                    outputStream.close();
-                }
-                catch (IOException e1)
-                {
-                    e1.printStackTrace();
-                }
-            }
+            close(outputStream);
         }
     }
 
     /**
      * 填充excel数据
-     * 
+     *
      * @param index 序号
      * @param row 单元格行
      */
@@ -431,9 +601,43 @@ public class ExcelUtil<T>
         }
     }
 
+
+    /**
+     * 填充excel数据
+     *
+     * @param index 序号
+     * @param row   单元格行
+     */
+    public void fillDataByColumns(int index, Row row, List<GenTableColumn> listVisibleColumns) {
+        int startNo = index * sheetSize;
+        int endNo = Math.min(startNo + sheetSize, jsonObjectList.size());
+        for (int i = startNo; i < endNo; i++) {
+            row = sheet.createRow(i + 1 - startNo);
+            Map<String, Object> jsonObject = jsonObjectList.get(i);
+
+            addCellByColumns(row, jsonObject, listVisibleColumns);
+        }
+    }
+
+
+    /**
+     * 填充excel数据
+     *  @param index 序号
+     *
+     */
+    public void fillDataByListMap(int index) {
+        int startNo = index * sheetSize;
+        int endNo = Math.min(startNo + sheetSize, jsonObjectList.size());
+        for (int i = startNo; i < endNo; i++) {
+            Row row = sheet.createRow(i + 1 - startNo);
+            Map<String, Object> jsonObject = jsonObjectList.get(i);
+            addCellByMap(row, jsonObject);
+        }
+    }
+
     /**
      * 创建表格样式
-     * 
+     *
      * @param wb 工作薄对象
      * @return 样式列表
      */
@@ -471,7 +675,7 @@ public class ExcelUtil<T>
         headerFont.setColor(IndexedColors.WHITE.getIndex());
         style.setFont(headerFont);
         styles.put("header", style);
-        
+
         style = wb.createCellStyle();
         style.setAlignment(HorizontalAlignment.CENTER);
         style.setVerticalAlignment(VerticalAlignment.CENTER);
@@ -513,9 +717,62 @@ public class ExcelUtil<T>
         return cell;
     }
 
+
+    /**
+     * 创建单元格
+     */
+    public void createCellByColumn(GenTableColumn column, Row row, int columnIndex) {
+        // 创建列
+        Cell cell = row.createCell(columnIndex);
+        // 写入列信息
+        cell.setCellValue(column.getColumnComment());
+        setDataValidationByColumn(column, row, columnIndex);
+        if (GenTableColumn.IS_REQUIRED.equals(column.getIsRequired())) {
+            CellStyle style = wb.createCellStyle();
+            style.cloneStyleFrom(styles.get("data"));
+            style.setAlignment(HorizontalAlignment.CENTER);
+            style.setVerticalAlignment(VerticalAlignment.CENTER);
+//            style.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex());
+//            style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
+            Font headerFont = wb.createFont();
+            headerFont.setFontName("Arial");
+            headerFont.setFontHeightInPoints((short) 10);
+//            headerFont.setBold(true);
+            headerFont.setColor(IndexedColors.RED.getIndex());
+            style.setFont(headerFont);
+            cell.setCellStyle(style);
+        }
+    }
+
+
+    /**
+     * 创建单元格
+     */
+    public void createCellByMap(String columnComment, Row row, int columnIndex) {
+        // 创建列
+        Cell cell = row.createCell(columnIndex);
+        // 写入列信息
+        cell.setCellValue(columnComment);
+        setDataValidationByColumnComment(columnComment, columnIndex);
+
+        CellStyle style = wb.createCellStyle();
+        style.cloneStyleFrom(styles.get("data"));
+        style.setAlignment(HorizontalAlignment.CENTER);
+        style.setVerticalAlignment(VerticalAlignment.CENTER);
+//            style.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex());
+//            style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
+        Font headerFont = wb.createFont();
+        headerFont.setFontName("Arial");
+        headerFont.setFontHeightInPoints((short) 15);
+        headerFont.setBold(true);
+//        headerFont.setColor(IndexedColors.RED.getIndex());
+        style.setFont(headerFont);
+        cell.setCellStyle(style);
+    }
+
     /**
      * 设置单元格信息
-     * 
+     *
      * @param value 单元格值
      * @param attr 注解相关
      * @param cell 单元格信息
@@ -543,7 +800,7 @@ public class ExcelUtil<T>
             }
         }
     }
-    
+
     /**
      * 获取画布
      */
@@ -601,6 +858,132 @@ public class ExcelUtil<T>
         }
     }
 
+    /**
+     * 创建表格样式
+     */
+    public void setDataValidationByColumn(GenTableColumn column, Row row, int columnIndex) {
+        if (column.getColumnComment().contains("注:")) {
+            sheet.setColumnWidth(columnIndex, 6000);
+        } else {
+            // 设置列宽
+            sheet.setColumnWidth(columnIndex, (int) ((16 + 0.72) * 256));
+        }
+    }
+
+    /**
+     * 创建表格样式
+     */
+    public void setDataValidationByColumnComment(String columnComment, int columnIndex) {
+        if (columnComment.contains("注:")) {
+            sheet.setColumnWidth(columnIndex, 6000);
+        } else {
+            // 设置列宽
+            sheet.setColumnWidth(columnIndex, (int) ((16 + 0.72) * 256));
+        }
+    }
+        // 如果设置了提示信息则鼠标放上去提示.
+//        if (StringUtils.isNotEmpty(attr.prompt())) {
+//            // 这里默认设了2-101列提示.
+//            setXSSFPrompt(sheet, "", attr.prompt(), 1, 100, columnIndex, columnIndex);
+//        }
+        // 如果设置了combo属性则本列只能选择不能输入
+//        if (attr.combo().length > 0) {
+//            // 这里默认设了2-101列只能选择不能输入.
+//            setXSSFValidation(sheet, attr.combo(), 1, 100, columnIndex, columnIndex);
+//        }
+    
+
+    /**
+     * 添加单元格
+     */
+    public void addCellByColumns(Row row, Map<String, Object> jsonObject, List<GenTableColumn> listVisibleColumns) {
+        Cell cell;
+        try {
+            int columnIndex = 0;
+            for (GenTableColumn column : listVisibleColumns) {
+                for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
+                    String columnName = entry.getKey();
+                    Object value = entry.getValue();
+                    if (!column.getColumnName().equals(columnName)) {
+                        continue;
+                    }
+
+                    // 设置行高
+                    row.setHeight((short) 600);
+                    // 创建cell
+                    cell = row.createCell(columnIndex++);
+                    cell.setCellStyle(styles.get("data"));
+
+                    if (isNotEmpty(value) && FormDataConstant.BYTE_ARRAY.equals(value.getClass().getSimpleName())) {
+                        // blob
+                        cell.setCellValue(byteToString(((byte[]) value)));
+                    } else if (isNotEmpty(column.getDictType())) {
+                        // 字典
+                        cell.setCellValue(handleDictForExport(jsonObject, column));
+                    } else if (NEED_CONVERT_DATE_LIST.contains(column.getColumnType())) {
+                        // time
+                        if (isNotEmpty(value)) {
+                            cell.setCellValue(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, TypeUtils.castToTimestamp(value)));
+                        }
+                    } else {
+                        // 设置列类型
+                        cell.setCellValue(String.valueOf(value));
+                    }
+
+                    break;
+                }
+            }
+
+
+            // 用于读取对象中的属性
+//            Object value = getTargetValueByJSONObject(vo, field, attr);
+//            String dateFormat = attr.dateFormat();
+//            String readConverterExp = attr.readConverterExp();
+//            String separator = attr.separator();
+//
+//
+//
+//
+//            if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value)) {
+//                cell.setCellValue(DateUtils.parseDateToStr(dateFormat, (Date) value));
+//            } else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value)) {
+//                cell.setCellValue(convertByExp(Convert.toStr(value), readConverterExp, separator));
+//            } else if (value instanceof BigDecimal && -1 != attr.scale()) {
+//                cell.setCellValue((((BigDecimal) value).setScale(attr.scale(), attr.roundingMode())).toString());
+//            } else {
+//                // 设置列类型
+//                setCellVo(value, attr, cell);
+//            }
+//
+//            addStatisticsData(columnIndex, Convert.toStr(value), attr);
+
+        } catch (Exception e) {
+            log.error("导出Excel失败: {}", e);
+        }
+
+    }
+
+    /**
+     * 添加单元格
+     */
+    public void addCellByMap(Row row, Map<String, Object> jsonObject) {
+        Cell cell;
+        try {
+            int columnIndex = 0;
+            for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
+                Object value = entry.getValue();
+                // 设置行高
+                row.setHeight((short) 600);
+                // 创建cell
+                cell = row.createCell(columnIndex++);
+                cell.setCellStyle(styles.get("data"));
+                cell.setCellValue(String.valueOf(value));
+            }
+        } catch (Exception e) {
+            log.error("导出Excel失败: {}", e);
+        }
+    }
+
     /**
      * 添加单元格
      */
@@ -653,7 +1036,7 @@ public class ExcelUtil<T>
 
     /**
      * 设置 POI XSSFSheet 单元格提示
-     * 
+     *
      * @param sheet 表单
      * @param promptTitle 提示标题
      * @param promptContent 提示内容
@@ -676,7 +1059,7 @@ public class ExcelUtil<T>
 
     /**
      * 设置某些列的值只能输入预制的数据,显示下拉框.
-     * 
+     *
      * @param sheet 要设置的sheet.
      * @param textlist 下拉框显示的内容
      * @param firstRow 开始行
@@ -710,7 +1093,7 @@ public class ExcelUtil<T>
 
     /**
      * 解析导出值 0=男,1=女,2=未知
-     * 
+     *
      * @param propertyValue 参数值
      * @param converterExp 翻译注解
      * @param separator 分隔符
@@ -747,7 +1130,7 @@ public class ExcelUtil<T>
 
     /**
      * 反向解析值 男=0,女=1,未知=2
-     * 
+     *
      * @param propertyValue 参数值
      * @param converterExp 翻译注解
      * @param separator 分隔符
@@ -831,7 +1214,32 @@ public class ExcelUtil<T>
 
     /**
      * 获取bean中的属性值
-     * 
+     *
+     * @param vo    实体对象
+     * @param field 字段
+     * @param excel 注解
+     * @return 最终的属性值
+     * @throws Exception
+     */
+    private Object getTargetValueByJSONObject(T vo, Field field, Excel excel) throws Exception {
+        Object o = field.get(vo);
+        if (StringUtils.isNotEmpty(excel.targetAttr())) {
+            String target = excel.targetAttr();
+            if (target.contains(".")) {
+                String[] targets = target.split("[.]");
+                for (String name : targets) {
+                    o = getValue(o, name);
+                }
+            } else {
+                o = getValue(o, target);
+            }
+        }
+        return o;
+    }
+
+    /**
+     * 获取bean中的属性值
+     *
      * @param vo 实体对象
      * @param field 字段
      * @param excel 注解
@@ -862,7 +1270,7 @@ public class ExcelUtil<T>
 
     /**
      * 以类的属性的get方法方法形式获取值
-     * 
+     *
      * @param o
      * @param name
      * @return value
@@ -911,7 +1319,7 @@ public class ExcelUtil<T>
         this.fields = this.fields.stream().sorted(Comparator.comparing(objects -> ((Excel) objects[1]).sort())).collect(Collectors.toList());
         this.maxHeight = getRowHeight();
     }
-    
+
     /**
      * 根据注解获取最大行高
      */
@@ -947,7 +1355,7 @@ public class ExcelUtil<T>
 
     /**
      * 创建工作表
-     * 
+     *
      * @param sheetNo sheet数量
      * @param index 序号
      */
@@ -968,7 +1376,7 @@ public class ExcelUtil<T>
 
     /**
      * 获取单元格值
-     * 
+     *
      * @param row 获取的行
      * @param column 获取单元格列号
      * @return 单元格值
@@ -1025,4 +1433,102 @@ public class ExcelUtil<T>
         }
         return val;
     }
+
+    /**
+     * 功能描述: 把新增可见或者修改可见或者.....的列过滤出来
+     *
+     * @param allColumns 所有的列
+     * @param maskIndex       那六个1的顺序 [1,1,1,1,1,1]
+     *                   sort=0  =>  新增可见
+     *                   sort=1  =>  新增可修改
+     *                   sort=2  =>  修改可见
+     *                   sort=3  =>  修改可修改
+     *                   sort=4  =>  列表可见
+     *                   sort=5  =>  列表可修改
+     * @return List<GenTableColumn>
+     */
+    public static List<GenTableColumn> filterData(List<GenTableColumn> allColumns, int maskIndex, Predicate<String> predicate) {
+        assert maskIndex < 6;
+        List<GenTableColumn> returnData = new ArrayList<>(16);
+        for (GenTableColumn allColumn : allColumns) {
+            if (HR.equals(allColumn.getHtmlType())) {
+                continue;
+            }
+
+            if (checkMask(maskIndex, allColumn, predicate)) {
+                returnData.add(allColumn);
+            }
+        }
+
+        return returnData;
+    }
+
+    /**
+     * 功能描述: 判断mask  == 0 返回true
+     *
+     * @param maskIndex mask的索引
+     * @param column    column
+     * @param predicate predicate 注意传的是1还是0
+     * @return boolean
+     */
+    public static boolean checkMask(int maskIndex, GenTableColumn column, Predicate<String> predicate) {
+        String mask = column.getMask();
+        String columnName = column.getColumnName();
+        String tableName = column.getTableName();
+        String errorMsg = String.format("mask is empty, tableName = [ %s ], columnName = [ %s ]", tableName, columnName);
+        String[] maskArray = requireNonNull(mask, errorMsg).split("");
+        assert maskArray.length == 6;
+        String maskMark = maskArray[maskIndex];
+        return predicate.test(maskMark);
+    }
+
+    public static String byteToString(byte[] bytes) {
+        String result = "";
+        if (ArrayUtils.isNotEmpty(bytes)) {
+            result = new String(bytes, StandardCharsets.UTF_8);
+        }
+
+        return result;
+    }
+
+    /**
+     * 功能描述: 处理字典值,不查询所有的字典值, 不放入sysDictData,只根据dictValue查询dictLabel
+     *
+     * @param jsonObject db中查出的结果
+     * @param column     所有的列
+     */
+    public static String handleDictForExport(Map<String, Object> jsonObject, GenTableColumn column) {
+        if (isEmpty(jsonObject)) {
+            return "";
+        }
+
+        String columnName = column.getColumnName();
+        // 列表需要字典值的dictLabel, 不放入sysDictData
+        List<SysDictData> dictDataList = column.getSysDictData();
+        SysDictData sysDictData = filterOne(dictDataList, dict -> dict.getDictValue().equals(jsonObject.get(columnName)));
+
+        return sysDictData.getDictLabel();
+    }
+
+    /**
+     * 使用 Map按key进行排序
+     *
+     * @param mapList
+     * @return mapList
+     */
+    public static List<Map<String, Object>> sortMapByKey(List<Map<String, Object>> mapList) {
+        if (mapList == null || mapList.isEmpty()) {
+            return null;
+        }
+
+        List<Map<String, Object>> result = new ArrayList<>(mapList.size());
+        for (Map<String, Object> map : mapList) {
+            Map<String, Object> sortMap = new TreeMap<>(map);
+
+            result.add(sortMap);
+        }
+
+        return result;
+    }
+
 }

+ 2 - 2
boman-common/boman-common-core/src/main/java/com/boman/common/core/web/controller/BaseController.java

@@ -9,11 +9,11 @@ import org.springframework.web.bind.WebDataBinder;
 import org.springframework.web.bind.annotation.InitBinder;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
-import com.boman.common.core.constant.HttpStatus;
+import com.boman.domain.constant.HttpStatus;
 import com.boman.common.core.utils.DateUtils;
 import com.boman.common.core.utils.StringUtils;
 import com.boman.common.core.utils.sql.SqlUtil;
-import com.boman.common.core.web.domain.AjaxResult;
+import com.boman.domain.dto.AjaxResult;
 import com.boman.common.core.web.page.PageDomain;
 import com.boman.common.core.web.page.TableDataInfo;
 import com.boman.common.core.web.page.TableSupport;

+ 114 - 114
boman-common/boman-common-core/src/main/java/com/boman/common/core/web/domain/BaseEntity.java

@@ -1,114 +1,114 @@
-package com.boman.common.core.web.domain;
-
-import java.io.Serializable;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-import com.fasterxml.jackson.annotation.JsonFormat;
-
-/**
- * Entity基类
- * 
- * @author ruoyi
- */
-public class BaseEntity implements Serializable
-{
-    private static final long serialVersionUID = 1L;
-
-    /** 搜索值 */
-    private String searchValue;
-
-    /** 创建者 */
-    private String createBy;
-
-    /** 创建时间 */
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private Date createTime;
-
-    /** 更新者 */
-    private String updateBy;
-
-    /** 更新时间 */
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private Date updateTime;
-
-    /** 备注 */
-    private String remark;
-
-    /** 请求参数 */
-    private Map<String, Object> params;
-
-    public String getSearchValue()
-    {
-        return searchValue;
-    }
-
-    public void setSearchValue(String searchValue)
-    {
-        this.searchValue = searchValue;
-    }
-
-    public String getCreateBy()
-    {
-        return createBy;
-    }
-
-    public void setCreateBy(String createBy)
-    {
-        this.createBy = createBy;
-    }
-
-    public Date getCreateTime()
-    {
-        return createTime;
-    }
-
-    public void setCreateTime(Date createTime)
-    {
-        this.createTime = createTime;
-    }
-
-    public String getUpdateBy()
-    {
-        return updateBy;
-    }
-
-    public void setUpdateBy(String updateBy)
-    {
-        this.updateBy = updateBy;
-    }
-
-    public Date getUpdateTime()
-    {
-        return updateTime;
-    }
-
-    public void setUpdateTime(Date updateTime)
-    {
-        this.updateTime = updateTime;
-    }
-
-    public String getRemark()
-    {
-        return remark;
-    }
-
-    public void setRemark(String remark)
-    {
-        this.remark = remark;
-    }
-
-    public Map<String, Object> getParams()
-    {
-        if (params == null)
-        {
-            params = new HashMap<>();
-        }
-        return params;
-    }
-
-    public void setParams(Map<String, Object> params)
-    {
-        this.params = params;
-    }
-}
+//package com.boman.common.core.web.domain;
+//
+//import java.io.Serializable;
+//import java.util.Date;
+//import java.util.HashMap;
+//import java.util.Map;
+//import com.fasterxml.jackson.annotation.JsonFormat;
+//
+///**
+// * Entity基类
+// *
+// * @author ruoyi
+// */
+//public class BaseEntity implements Serializable
+//{
+//    private static final long serialVersionUID = 1L;
+//
+//    /** 搜索值 */
+//    private String searchValue;
+//
+//    /** 创建者 */
+//    private String createBy;
+//
+//    /** 创建时间 */
+//    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+//    private Date createTime;
+//
+//    /** 更新者 */
+//    private String updateBy;
+//
+//    /** 更新时间 */
+//    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+//    private Date updateTime;
+//
+//    /** 备注 */
+//    private String remark;
+//
+//    /** 请求参数 */
+//    private Map<String, Object> params;
+//
+//    public String getSearchValue()
+//    {
+//        return searchValue;
+//    }
+//
+//    public void setSearchValue(String searchValue)
+//    {
+//        this.searchValue = searchValue;
+//    }
+//
+//    public String getCreateBy()
+//    {
+//        return createBy;
+//    }
+//
+//    public void setCreateBy(String createBy)
+//    {
+//        this.createBy = createBy;
+//    }
+//
+//    public Date getCreateTime()
+//    {
+//        return createTime;
+//    }
+//
+//    public void setCreateTime(Date createTime)
+//    {
+//        this.createTime = createTime;
+//    }
+//
+//    public String getUpdateBy()
+//    {
+//        return updateBy;
+//    }
+//
+//    public void setUpdateBy(String updateBy)
+//    {
+//        this.updateBy = updateBy;
+//    }
+//
+//    public Date getUpdateTime()
+//    {
+//        return updateTime;
+//    }
+//
+//    public void setUpdateTime(Date updateTime)
+//    {
+//        this.updateTime = updateTime;
+//    }
+//
+//    public String getRemark()
+//    {
+//        return remark;
+//    }
+//
+//    public void setRemark(String remark)
+//    {
+//        this.remark = remark;
+//    }
+//
+//    public Map<String, Object> getParams()
+//    {
+//        if (params == null)
+//        {
+//            params = new HashMap<>();
+//        }
+//        return params;
+//    }
+//
+//    public void setParams(Map<String, Object> params)
+//    {
+//        this.params = params;
+//    }
+//}

+ 25 - 7
boman-common/boman-common-datascope/src/main/java/com/boman/common/datascope/aspect/DataScopeAspect.java

@@ -3,6 +3,7 @@ package com.boman.common.datascope.aspect;
 import java.lang.reflect.Method;
 import org.aspectj.lang.JoinPoint;
 import org.aspectj.lang.Signature;
+import org.aspectj.lang.annotation.AfterReturning;
 import org.aspectj.lang.annotation.Aspect;
 import org.aspectj.lang.annotation.Before;
 import org.aspectj.lang.annotation.Pointcut;
@@ -10,11 +11,11 @@ import org.aspectj.lang.reflect.MethodSignature;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import com.boman.common.core.utils.StringUtils;
-import com.boman.common.core.web.domain.BaseEntity;
+import com.boman.domain.BaseEntity;
 import com.boman.common.datascope.annotation.DataScope;
 import com.boman.common.security.service.TokenService;
-import com.boman.system.api.domain.SysRole;
-import com.boman.system.api.domain.SysUser;
+import com.boman.domain.SysRole;
+import com.boman.domain.SysUser;
 import com.boman.system.api.model.LoginUser;
 
 /**
@@ -71,6 +72,23 @@ public class DataScopeAspect
         handleDataScope(point);
     }
 
+   /**
+     * 功能描述: 拿到返回值
+     *
+     * @param joinPoint joinPoint
+     * @param rvt       别切的方法的返回值
+     * @return java.lang.Object
+     */
+    @AfterReturning(returning = "rvt", pointcut = "@annotation(com.boman.common.datascope.annotation.DataScope)")
+    public Object AfterExec(JoinPoint joinPoint, Object rvt) {
+//        System.out.println("AfterReturning增强:获取目标方法的返回值:" + rvt);
+        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+        Method method = signature.getMethod();
+        String name = method.getName();
+//        System.out.println("AfterReturning增强:获取目标方法的方法:" + name);
+        return rvt;
+    }
+
     protected void handleDataScope(final JoinPoint joinPoint)
     {
         // 获得注解
@@ -116,24 +134,24 @@ public class DataScopeAspect
             else if (DATA_SCOPE_CUSTOM.equals(dataScope))
             {
                 sqlString.append(StringUtils.format(
-                        " OR {}.dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", deptAlias,
+                        " OR {}.id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", deptAlias,
                         role.getId()));
             }
             else if (DATA_SCOPE_DEPT.equals(dataScope))
             {
-                sqlString.append(StringUtils.format(" OR {}.dept_id = {} ", deptAlias, user.getDeptId()));
+                sqlString.append(StringUtils.format(" OR {}.id = {} ", deptAlias, user.getDeptId()));
             }
             else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope))
             {
                 sqlString.append(StringUtils.format(
-                        " OR {}.dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) )",
+                        " OR {}.id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) )",
                         deptAlias, user.getDeptId(), user.getDeptId()));
             }
             else if (DATA_SCOPE_SELF.equals(dataScope))
             {
                 if (StringUtils.isNotBlank(userAlias))
                 {
-                    sqlString.append(StringUtils.format(" OR {}.user_id = {} ", userAlias, user.getId()));
+                    sqlString.append(StringUtils.format(" OR {}.id = {} ", userAlias, user.getId()));
                 }
                 else
                 {

+ 1 - 1
boman-common/boman-common-log/src/main/java/com/boman/common/log/aspect/LogAspect.java

@@ -27,7 +27,7 @@ import com.boman.common.core.utils.ip.IpUtils;
 import com.boman.common.log.annotation.Log;
 import com.boman.common.log.enums.BusinessStatus;
 import com.boman.common.log.service.AsyncLogService;
-import com.boman.system.api.domain.SysOperLog;
+import com.boman.domain.SysOperLog;
 
 /**
  * 操作日志记录处理

+ 1 - 1
boman-common/boman-common-log/src/main/java/com/boman/common/log/service/AsyncLogService.java

@@ -4,7 +4,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import com.boman.system.api.RemoteLogService;
-import com.boman.system.api.domain.SysOperLog;
+import com.boman.domain.SysOperLog;
 
 /**
  * 异步调用日志服务

+ 9 - 1
boman-common/boman-common-security/src/main/java/com/boman/common/security/feign/FeignRequestInterceptor.java

@@ -4,7 +4,7 @@ import java.util.Map;
 import javax.servlet.http.HttpServletRequest;
 import com.boman.common.core.utils.ip.IpUtils;
 import org.springframework.stereotype.Component;
-import com.boman.common.core.constant.CacheConstants;
+import com.boman.domain.constant.CacheConstants;
 import com.boman.common.core.utils.ServletUtils;
 import com.boman.common.core.utils.StringUtils;
 import feign.RequestInterceptor;
@@ -31,6 +31,14 @@ public class FeignRequestInterceptor implements RequestInterceptor
             {
                 requestTemplate.header(CacheConstants.DETAILS_USER_ID, userId);
             }
+            String token = headers.get(CacheConstants.HEADER);
+            if (StringUtils.isEmpty(token)) {
+                token = headers.get(CacheConstants.HEADER.toLowerCase());
+            }
+            if (StringUtils.isNotEmpty(token))
+            {
+                requestTemplate.header(CacheConstants.HEADER, token);
+            }
             String userName = headers.get(CacheConstants.DETAILS_USERNAME);
             if (StringUtils.isNotEmpty(userName))
             {

+ 1 - 1
boman-common/boman-common-security/src/main/java/com/boman/common/security/handler/GlobalExceptionHandler.java

@@ -11,7 +11,7 @@ import com.boman.common.core.exception.CustomException;
 import com.boman.common.core.exception.DemoModeException;
 import com.boman.common.core.exception.PreAuthorizeException;
 import com.boman.common.core.utils.StringUtils;
-import com.boman.common.core.web.domain.AjaxResult;
+import com.boman.domain.dto.AjaxResult;
 
 /**
  * 全局异常处理器

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
boman-common/boman-common-security/src/main/java/com/boman/common/security/service/TokenService.java


+ 125 - 0
boman-gateway/src/main/java/com/boman/gateway/config/CrosConfig.java

@@ -0,0 +1,125 @@
+/*
+package com.boman.gateway.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.reactive.CorsWebFilter;
+import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
+import org.springframework.web.util.pattern.PathPatternParser;
+
+//* 跨域请求
+// * @author shiqian
+// * @date 2021年06月04日 14:28
+// *
+
+
+@Configuration
+public class CorsConfig {
+
+//    private static final String MAX_AGE = "18000L";
+
+
+    @Bean
+    public CorsWebFilter corsFilter() {
+        CorsConfiguration config = new CorsConfiguration();
+        config.addAllowedMethod("*");
+        config.addAllowedOrigin("*");
+        config.addAllowedHeader("*");
+
+        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
+        source.registerCorsConfiguration("/**", config);
+
+        return new CorsWebFilter(source);
+    }
+
+//    @Bean
+//    public WebFilter corsFilter() {
+//        return (ServerWebExchange ctx, WebFilterChain chain) -> {
+//            ServerHttpRequest request = ctx.getRequest();
+//
+//            if (CorsUtils.isCorsRequest(request)) {
+//                HttpHeaders requestHeaders = request.getHeaders();
+//                ServerHttpResponse response = ctx.getResponse();
+//                HttpMethod requestMethod = requestHeaders.getAccessControlRequestMethod();
+//                HttpHeaders headers = response.getHeaders();
+//                headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, requestHeaders.getOrigin());
+//                headers.addAll(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, requestHeaders
+//                        .getAccessControlRequestHeaders());
+//                if(requestMethod != null){
+//                    headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, requestMethod.name());
+//                }
+//                headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
+//                headers.add(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, "*");
+//                headers.add(HttpHeaders.ACCESS_CONTROL_MAX_AGE, MAX_AGE);
+//                if (request.getMethod() == HttpMethod.OPTIONS) {
+//                    response.setStatusCode(HttpStatus.OK);
+//                    return Mono.empty();
+//                }
+//            }
+//            return chain.filter(ctx);
+//        };
+//    }
+
+}
+*/
+
+package com.boman.gateway.config;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.http.server.reactive.ServerHttpResponse;
+import org.springframework.web.cors.reactive.CorsUtils;
+import org.springframework.web.server.ServerWebExchange;
+import org.springframework.web.server.WebFilter;
+import org.springframework.web.server.WebFilterChain;
+import reactor.core.publisher.Mono;
+import static com.boman.common.core.utils.obj.ObjectUtils.*;
+
+/** 跨域请求
+ * @author shiqian
+ * @date 2021年06月04日 14:28
+ **/
+@Configuration
+public class CrosConfig {
+
+    @Bean
+    public WebFilter corsFilter() {
+        return (ServerWebExchange ctx, WebFilterChain chain) -> {
+            ServerHttpRequest request = ctx.getRequest();
+            if (CorsUtils.isCorsRequest(request)) {
+                ServerHttpResponse response = ctx.getResponse();
+                HttpHeaders headers = response.getHeaders();
+
+                if(isEmpty(headers.get("Access-Control-Allow-Credentials"))) {
+                    // 设置允许Cookie
+                    headers.add("Access-Control-Allow-Credentials", "true");
+                }
+                if(isEmpty(headers.get("Access-Control-Allow-Origin"))) {
+                    // 允许http://www.xxx.com域(自行设置,这里只做示例)发起跨域请求
+                    headers.add("Access-Control-Allow-Origin", "*");
+                }
+                if(isEmpty(headers.get("Access-Control-Allow-Methods"))) {
+                    // 设置允许跨域请求的方法
+                    headers.add("Access-Control-Allow-Methods", "*");
+                }
+                if(isEmpty(headers.get("Access-Control-Allow-Headers"))) {
+                    // 设置允许跨域请求的方法
+                    headers.add("Access-Control-Allow-Headers", "*");
+                }
+/*                headers.add("Access-Control-Allow-Origin", "*");
+                headers.add("Access-Control-Allow-Methods", "*");
+                headers.add("Access-Control-Allow-Headers", "*");
+                headers.add("Access-Control-Allow-Credentials", "true");*/
+                if (request.getMethod() == HttpMethod.OPTIONS) {
+                    response.setStatusCode(HttpStatus.OK);
+                    return Mono.empty();
+                }
+            }
+            return chain.filter(ctx);
+        };
+    }
+}

+ 4 - 4
boman-gateway/src/main/java/com/boman/gateway/filter/AuthFilter.java

@@ -17,9 +17,9 @@ import org.springframework.stereotype.Component;
 import org.springframework.web.server.ServerWebExchange;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
-import com.boman.common.core.constant.CacheConstants;
-import com.boman.common.core.constant.Constants;
-import com.boman.common.core.domain.R;
+import com.boman.domain.constant.CacheConstants;
+import com.boman.domain.constant.Constants;
+import com.boman.domain.dto.R;
 import com.boman.common.core.utils.ServletUtils;
 import com.boman.common.core.utils.StringUtils;
 import com.boman.common.redis.service.RedisService;
@@ -99,7 +99,7 @@ public class AuthFilter implements GlobalFilter, Ordered
 
         return response.writeWith(Mono.fromSupplier(() -> {
             DataBufferFactory bufferFactory = response.bufferFactory();
-            return bufferFactory.wrap(JSON.toJSONBytes(R.fail(msg)));
+            return bufferFactory.wrap(JSON.toJSONBytes(R.loginExpire(msg)));
         }));
     }
 

+ 1 - 1
boman-gateway/src/main/java/com/boman/gateway/filter/BlackListUrlFilter.java

@@ -8,7 +8,7 @@ import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFac
 import org.springframework.http.server.reactive.ServerHttpResponse;
 import org.springframework.stereotype.Component;
 import com.alibaba.fastjson.JSON;
-import com.boman.common.core.web.domain.AjaxResult;
+import com.boman.domain.dto.AjaxResult;
 import reactor.core.publisher.Mono;
 
 /**

+ 44 - 0
boman-gateway/src/main/java/com/boman/gateway/filter/CorsResponseHeaderFilter.java

@@ -0,0 +1,44 @@
+/*
+package com.boman.gateway.filter;
+
+import com.google.common.collect.Lists;
+import org.springframework.cloud.gateway.filter.GatewayFilterChain;
+import org.springframework.cloud.gateway.filter.GlobalFilter;
+import org.springframework.cloud.gateway.filter.NettyWriteResponseFilter;
+import org.springframework.core.Ordered;
+import org.springframework.http.HttpHeaders;
+import org.springframework.stereotype.Component;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Mono;
+
+*/
+/** 跨域请求头重复处理过滤器防止出现多个
+ * @author shiqian
+ * @date 2021年06月04日 14:53
+ **//*
+
+
+
+@Component("corsResponseHeaderFilter")
+public class CorsResponseHeaderFilter implements GlobalFilter, Ordered {
+
+    @Override
+    public int getOrder() {
+        return NettyWriteResponseFilter.WRITE_RESPONSE_FILTER_ORDER + 1;
+    }
+
+
+    @Override
+    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+        return chain.filter(exchange).then(Mono.defer(() -> {
+            exchange.getResponse().getHeaders().entrySet().stream()
+                    .filter(kv -> (kv.getValue() != null && kv.getValue().size() > 1))
+                    .filter(kv -> (kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN)
+                            || kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS)))
+                    .forEach(kv -> kv.setValue(Lists.newArrayList(kv.getValue().get(0))));
+
+            return chain.filter(exchange);
+        }));
+    }
+}
+*/

+ 1 - 1
boman-gateway/src/main/java/com/boman/gateway/filter/ValidateCodeFilter.java

@@ -14,7 +14,7 @@ import org.springframework.stereotype.Component;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.boman.common.core.utils.StringUtils;
-import com.boman.common.core.web.domain.AjaxResult;
+import com.boman.domain.dto.AjaxResult;
 import com.boman.gateway.service.ValidateCodeService;
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;

+ 1 - 1
boman-gateway/src/main/java/com/boman/gateway/handler/GatewayExceptionHandler.java

@@ -13,7 +13,7 @@ import org.springframework.http.server.reactive.ServerHttpResponse;
 import org.springframework.web.server.ResponseStatusException;
 import org.springframework.web.server.ServerWebExchange;
 import com.alibaba.fastjson.JSON;
-import com.boman.common.core.domain.R;
+import com.boman.domain.dto.R;
 import reactor.core.publisher.Mono;
 
 /**

+ 1 - 1
boman-gateway/src/main/java/com/boman/gateway/handler/ValidateCodeHandler.java

@@ -9,7 +9,7 @@ import org.springframework.web.reactive.function.server.HandlerFunction;
 import org.springframework.web.reactive.function.server.ServerRequest;
 import org.springframework.web.reactive.function.server.ServerResponse;
 import com.boman.common.core.exception.CaptchaException;
-import com.boman.common.core.web.domain.AjaxResult;
+import com.boman.domain.dto.AjaxResult;
 import com.boman.gateway.service.ValidateCodeService;
 import reactor.core.publisher.Mono;
 

+ 1 - 1
boman-gateway/src/main/java/com/boman/gateway/service/ValidateCodeService.java

@@ -2,7 +2,7 @@ package com.boman.gateway.service;
 
 import java.io.IOException;
 import com.boman.common.core.exception.CaptchaException;
-import com.boman.common.core.web.domain.AjaxResult;
+import com.boman.domain.dto.AjaxResult;
 
 /**
  * 验证码处理

+ 2 - 2
boman-gateway/src/main/java/com/boman/gateway/service/impl/ValidateCodeServiceImpl.java

@@ -9,12 +9,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.FastByteArrayOutputStream;
 import com.google.code.kaptcha.Producer;
-import com.boman.common.core.constant.Constants;
+import com.boman.domain.constant.Constants;
 import com.boman.common.core.exception.CaptchaException;
 import com.boman.common.core.utils.IdUtils;
 import com.boman.common.core.utils.StringUtils;
 import com.boman.common.core.utils.sign.Base64;
-import com.boman.common.core.web.domain.AjaxResult;
+import com.boman.domain.dto.AjaxResult;
 import com.boman.common.redis.service.RedisService;
 import com.boman.gateway.service.ValidateCodeService;
 

+ 2 - 0
boman-gateway/src/main/resources/bootstrap.yml

@@ -17,6 +17,7 @@ spring:
       discovery:
         # 服务注册地址
         server-addr: 192.168.101.10:8848
+        namespace: 0886e975-9ff6-4602-8ed2-f17b4d0ef1bc  #潜山数据局
       config:
         # 配置中心地址
         server-addr: 192.168.101.10:8848
@@ -25,6 +26,7 @@ spring:
         # 共享配置
         shared-configs:
           - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
+        namespace: 0886e975-9ff6-4602-8ed2-f17b4d0ef1bc  #潜山数据局
     sentinel:
       # 取消控制台懒加载
       eager: true

+ 14 - 1
boman-modules/boman-file/pom.xml

@@ -65,7 +65,20 @@
             <groupId>com.boman</groupId>
             <artifactId>boman-common-swagger</artifactId>
         </dependency>
-        
+
+        <!--        远程调用 web-core-->
+        <dependency>
+            <groupId>com.boman</groupId>
+            <artifactId>boman-api-web-core</artifactId>
+            <version>2.5.0-SNAPSHOT</version>
+        </dependency>
+
+        <!--         RuoYi redis-->
+        <dependency>
+            <groupId>com.boman</groupId>
+            <artifactId>boman-common-redis</artifactId>
+        </dependency>
+
     </dependencies>
 
     <build>

+ 2 - 0
boman-modules/boman-file/src/main/java/com/boman/file/RuoYFileApplication.java

@@ -4,6 +4,7 @@ import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
 import com.boman.common.swagger.annotation.EnableCustomSwagger2;
+import org.springframework.cloud.openfeign.EnableFeignClients;
 
 /**
  * 文件服务
@@ -12,6 +13,7 @@ import com.boman.common.swagger.annotation.EnableCustomSwagger2;
  */
 @EnableCustomSwagger2
 @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class })
+@EnableFeignClients(basePackages = {"com.boman"})
 public class RuoYFileApplication
 {
     public static void main(String[] args)

+ 85 - 0
boman-modules/boman-file/src/main/java/com/boman/file/controller/ExcelController.java

@@ -0,0 +1,85 @@
+package com.boman.file.controller;
+
+import com.boman.domain.dto.AjaxResult;
+import com.boman.domain.dto.ExportExcelDto;
+import com.boman.file.service.ISysFileService;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * @author shiqian
+ * @date 2021年06月07日 16:24
+ **/
+@RestController
+@RequestMapping("/common/file")
+public class ExcelController {
+
+    @Resource
+    private ISysFileService fileService;
+
+    /**
+     * 功能描述: 通用的导入接口
+     *
+     * @param multipartFile MultipartFile
+     * @param tableName     tableName
+     * @return void
+     */
+    @PostMapping("/import")
+    public AjaxResult importExcelCommon(MultipartFile multipartFile, String tableName) {
+        try {
+            return fileService.importExcelCommon(multipartFile, tableName);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return AjaxResult.error("失败");
+    }
+
+
+    /**
+     * 功能描述: 通用的导出接口
+     *
+     * @param response response
+     * @param dto      tableName
+     *                 empty(true=>只带表头的excel,不含数据, false=>带数据的excel)
+     *                 condition 查询条件
+     * @return com.boman.domain.dto.AjaxResult
+     */
+    @PostMapping("/export")
+    public AjaxResult exportExcelCommon(HttpServletResponse response, @RequestBody ExportExcelDto dto) {
+        try {
+            return fileService.exportExcelCommon(response, dto);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return AjaxResult.error("失败");
+    }
+
+
+    /**
+     * 功能描述: 导出数据,只是sql不一样,其余的都是通用接口的内容
+     *
+     * @param response response
+     * @param dto      tableName
+     *                 empty(true=>只带表头的excel,不含数据, false=>带数据的excel)
+     *                 condition 查询条件
+     * @return com.boman.domain.dto.AjaxResult
+     */
+    @PostMapping("/export/statisticsByMonth")
+    public AjaxResult statisticsByMonth(HttpServletResponse response, @RequestBody ExportExcelDto dto) {
+        try {
+            return fileService.statisticsByMonth(response, dto);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return AjaxResult.error("失败");
+    }
+
+
+
+}

+ 21 - 1
boman-modules/boman-file/src/main/java/com/boman/file/controller/SysFileController.java

@@ -1,12 +1,14 @@
 package com.boman.file.controller;
 
+import com.boman.domain.dto.AjaxResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
-import com.boman.common.core.domain.R;
+import com.boman.domain.dto.R;
 import com.boman.common.core.utils.file.FileUtils;
 import com.boman.file.service.ISysFileService;
 import com.boman.domain.SysFile;
@@ -45,4 +47,22 @@ public class SysFileController
             return R.fail(e.getMessage());
         }
     }
+
+    /**
+     * 通用上传请求
+     */
+    @PostMapping("/upload/base64")
+    public AjaxResult uploadFileBase64(@RequestBody String base64) {
+        try {
+            String url = sysFileService.uploadFileBase64(base64);
+            AjaxResult ajax = AjaxResult.success();
+            ajax.put("name", FileUtils.getName(url));
+            ajax.put("url", url);
+            return ajax;
+        } catch (Exception e) {
+            return AjaxResult.error(e.getMessage());
+        }
+    }
+
+
 }

+ 95 - 42
boman-modules/boman-file/src/main/java/com/boman/file/service/FastDfsSysFileServiceImpl.java

@@ -1,42 +1,95 @@
-package com.boman.file.service;
-
-import org.apache.commons.io.FilenameUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Service;
-import org.springframework.web.multipart.MultipartFile;
-import com.github.tobato.fastdfs.domain.fdfs.StorePath;
-import com.github.tobato.fastdfs.service.FastFileStorageClient;
-
-/**
- * FastDFS 文件存储
- * 
- * @author ruoyi
- */
-@Service
-public class FastDfsSysFileServiceImpl implements ISysFileService
-{
-    /**
-     * 域名或本机访问地址
-     */
-    @Value("${fdfs.domain}")
-    public String domain;
-
-    @Autowired
-    private FastFileStorageClient storageClient;
-
-    /**
-     * FastDfs文件上传接口
-     * 
-     * @param file 上传的文件
-     * @return 访问地址
-     * @throws Exception
-     */
-    @Override
-    public String uploadFile(MultipartFile file) throws Exception
-    {
-        StorePath storePath = storageClient.uploadFile(file.getInputStream(), file.getSize(),
-                FilenameUtils.getExtension(file.getOriginalFilename()), null);
-        return domain + "/" + storePath.getFullPath();
-    }
-}
+//package com.boman.file.service;
+//
+//import com.alibaba.fastjson.JSONObject;
+//import com.boman.domain.dto.AjaxResult;
+//import com.boman.domain.dto.ImportExcelDto;
+//import org.apache.commons.io.FilenameUtils;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.beans.factory.annotation.Value;
+//import org.springframework.stereotype.Service;
+//import org.springframework.web.multipart.MultipartFile;
+//import com.github.tobato.fastdfs.domain.fdfs.StorePath;
+//import com.github.tobato.fastdfs.service.FastFileStorageClient;
+//
+//import javax.servlet.http.HttpServletResponse;
+//import java.io.IOException;
+//import java.util.List;
+//
+///**
+// * FastDFS 文件存储
+// *
+// * @author ruoyi
+// */
+//@Service
+//public class FastDfsSysFileServiceImpl implements ISysFileService
+//{
+//    /**
+//     * 域名或本机访问地址
+//     */
+//    @Value("${fdfs.domain}")
+//    public String domain;
+//
+//    @Autowired
+//    private FastFileStorageClient storageClient;
+//
+//    /**
+//     * FastDfs文件上传接口
+//     *
+//     * @param file 上传的文件
+//     * @return 访问地址
+//     * @throws Exception
+//     */
+//    @Override
+//    public String uploadFile(MultipartFile file) throws Exception
+//    {
+//        StorePath storePath = storageClient.uploadFile(file.getInputStream(), file.getSize(),
+//                FilenameUtils.getExtension(file.getOriginalFilename()), null);
+//        return domain + "/" + storePath.getFullPath();
+//    }
+//
+//    /**
+//     * 功能描述: 上传base64
+//     *
+//     * @param base64 base64
+//     * @return java.lang.String
+//     */
+//    @Override
+//    public String uploadFileBase64(String base64) throws IOException {
+//        return null;
+//    }
+//
+//    /**
+//     * 功能描述: 通用的导入接口
+//     *
+//     * @param dto     dto
+//     * @return java.util.List<com.alibaba.fastjson.JSONObject>
+//     */
+//    @Override
+//    public List<JSONObject> importExcelCommon(ImportExcelDto dto) {
+//        return null;
+//    }
+//
+//    /**
+//     * 功能描述: 通用的导入接口
+//     *
+//     * @param multipartFile multipartFile
+//     * @param tableName     tableName
+//     * @return java.util.List<com.alibaba.fastjson.JSONObject>
+//     */
+//    @Override
+//    public AjaxResult importExcelCommon(MultipartFile multipartFile, String tableName) throws Exception {
+//        return null;
+//    }
+//
+//    /**
+//     * 功能描述: 通用的导出接口
+//     *
+//     * @param tableName tableName
+//     * @param empty     true=>只带表头的excel,不含数据, false=>带数据的excel
+//     * @return com.boman.domain.dto.AjaxResult
+//     */
+//    @Override
+//    public AjaxResult exportExcelCommon(HttpServletResponse response, String tableName, Boolean empty, JSONObject condition) {
+//        return null;
+//    }
+//}

+ 55 - 0
boman-modules/boman-file/src/main/java/com/boman/file/service/ISysFileService.java

@@ -1,7 +1,15 @@
 package com.boman.file.service;
 
+import com.alibaba.fastjson.JSONObject;
+import com.boman.domain.dto.AjaxResult;
+import com.boman.domain.dto.ExportExcelDto;
+import com.boman.domain.dto.ImportExcelDto;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
 /**
  * 文件上传接口
  * 
@@ -17,4 +25,51 @@ public interface ISysFileService
      * @throws Exception
      */
     public String uploadFile(MultipartFile file) throws Exception;
+
+    /**
+     * 功能描述: 上传base64
+     *
+     * @param base64 base64
+     * @return java.lang.String
+     */
+    String uploadFileBase64(String base64) throws IOException;
+
+    /**
+     * 功能描述: 通用的导入接口
+     *
+     * @param dto dto
+     * @return java.util.List<com.alibaba.fastjson.JSONObject>
+     */
+    List<JSONObject> importExcelCommon(ImportExcelDto dto) throws Exception;
+
+    /**
+     * 功能描述: 通用的导入接口
+     *
+     * @param multipartFile multipartFile
+     * @param tableName     tableName
+     * @return java.util.List<com.alibaba.fastjson.JSONObject>
+     */
+    AjaxResult importExcelCommon(MultipartFile multipartFile, String tableName) throws Exception;
+
+    /**
+     * 功能描述: 通用的导出接口
+     *
+     * @param response response
+     * @param dto      tableName
+     *                 empty(true=>只带表头的excel,不含数据, false=>带数据的excel)
+     *                 condition 查询条件
+     * @return com.boman.domain.dto.AjaxResult
+     */
+    AjaxResult exportExcelCommon(HttpServletResponse response, ExportExcelDto dto);
+
+    /**
+     * 功能描述: 导出数据,只是sql不一样,其余的都是通用接口的内容
+     *
+     * @param response response
+     * @param dto      tableName
+     *                 empty(true=>只带表头的excel,不含数据, false=>带数据的excel)
+     *                 condition 查询条件
+     * @return com.boman.domain.dto.AjaxResult
+     */
+    AjaxResult statisticsByMonth(HttpServletResponse response, ExportExcelDto dto);
 }

+ 209 - 1
boman-modules/boman-file/src/main/java/com/boman/file/service/LocalSysFileServiceImpl.java

@@ -1,11 +1,35 @@
 package com.boman.file.service;
 
+import com.alibaba.fastjson.JSONObject;
+import com.boman.common.core.utils.obj.ObjectUtils;
+import com.boman.common.core.utils.poi.ExcelUtil;
+import com.boman.domain.dto.AjaxResult;
+import com.boman.common.redis.RedisKey;
+import com.boman.common.redis.service.RedisService;
+import com.boman.domain.GenTable;
+import com.boman.domain.GenTableColumn;
+import com.boman.domain.constant.MaskConstant;
+import com.boman.domain.dto.ExportExcelDto;
+import com.boman.domain.dto.FormDataDto;
+import com.boman.domain.dto.ImportExcelDto;
+import com.boman.file.utils.FileUploadUtils;
+import com.boman.web.core.api.RemoteAttendanceService;
+import com.boman.web.core.api.RemoteObjService;
+import org.apache.commons.lang3.BooleanUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.cloud.context.config.annotation.RefreshScope;
 import org.springframework.context.annotation.Primary;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
-import com.boman.file.utils.FileUploadUtils;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.*;
+
+import static com.boman.common.core.utils.obj.ObjectUtils.map;
 
 /**
  * 本地文件存储
@@ -17,6 +41,16 @@ import com.boman.file.utils.FileUploadUtils;
 @RefreshScope
 public class LocalSysFileServiceImpl implements ISysFileService
 {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(LocalSysFileServiceImpl.class);
+
+    @Resource
+    private RemoteObjService remoteObjService;
+    @Resource
+    private RedisService redisService;
+    @Resource
+    private RemoteAttendanceService remoteAttendanceService;
+
     /**
      * 资源映射路径 前缀
      */
@@ -35,6 +69,15 @@ public class LocalSysFileServiceImpl implements ISysFileService
     @Value("${file.path}")
     private String localFilePath;
 
+    /******************************* 考勤表中的常量  *******************************/
+
+    public static final String USERNAME= "userName";
+    public static final String DEPT_NAME= "deptName";
+    public static final String ATTENDANCE_TABLE_LEAVE_OR_SUM= "attendanceTableLeaveOrSum";
+    public static final String ATTENDANCE_TABLE_LATE_SUM= "attendanceTableLateSum";
+    public static final String ATTENDANCE_TABLE_LEAVE_SUM= "attendanceTableLeaveSum";
+    public static final String DATE= "date";
+
     /**
      * 本地文件上传接口
      * 
@@ -47,6 +90,171 @@ public class LocalSysFileServiceImpl implements ISysFileService
     {
         String name = FileUploadUtils.upload(localFilePath, file);
         String url = domain + localFilePrefix + name;
+        LOGGER.info("上传的路径为: {}", url);
         return url;
     }
+
+    /**
+     * 功能描述: 上传base64
+     *
+     * @param base64 base64
+     * @return java.lang.String
+     */
+    @Override
+    public String uploadFileBase64(String base64) throws IOException {
+        MultipartFile multipartFile = FileUploadUtils.base64ToMultipart(base64);
+        String name = FileUploadUtils.upload(localFilePath, multipartFile);
+        String path = domain + localFilePrefix + name;
+        LOGGER.info("上传的路径为: {}", path);
+        return path;
+    }
+
+    /**
+     * 功能描述: 通用的导入接口
+     *
+     * @param multipartFile multipartFile
+     * @param tableName     tableName
+     * @return java.util.List<com.alibaba.fastjson.JSONObject>
+     */
+    @Override
+    public AjaxResult importExcelCommon(MultipartFile multipartFile, String tableName) throws Exception {
+        Objects.requireNonNull(multipartFile, "multipartFile is empty");
+        ObjectUtils.requireNonNull(tableName, "tableName is empty");
+
+        GenTable genTable = redisService.getCacheObject(RedisKey.TABLE_INFO + tableName);
+        List<GenTableColumn> columns = genTable.getColumns();
+
+        ExcelUtil<JSONObject> util = new ExcelUtil<>(JSONObject.class);
+        List<JSONObject> list = util.importCommonExcel("", multipartFile.getInputStream(), columns);
+
+        ImportExcelDto dto = new ImportExcelDto();
+        dto.setDataList(list);
+        dto.setTableName(tableName);
+
+        return remoteObjService.importCommonData(dto);
+    }
+
+    /**
+     * 功能描述: 通用的导出接口
+     *
+     * @param response response
+     * @param dto      tableName
+     *                 empty(true=>只带表头的excel,不含数据, false=>带数据的excel)
+     *                 condition 查询条件
+     * @return com.boman.domain.dto.AjaxResult
+     */
+    @Override
+    public AjaxResult exportExcelCommon(HttpServletResponse response, ExportExcelDto dto) {
+        String tableName = dto.getTableName();
+        Boolean empty = dto.getEmpty();
+        ObjectUtils.requireNonNull(tableName, "exportExcelCommon tableName is empty");
+        ObjectUtils.requireNonNull(empty, "exportExcelCommon empty is empty");
+
+        GenTable genTable = redisService.getCacheObject(RedisKey.TABLE_INFO + tableName);
+        List<GenTableColumn> columns = genTable.getColumns();
+
+        ExcelUtil<JSONObject> util = new ExcelUtil<>(JSONObject.class);
+        List<Map<String, Object>> list = null;
+        if (BooleanUtils.isTrue(empty)) {
+            list = new ArrayList<>(0);
+        } else {
+            FormDataDto condition = new FormDataDto();
+            condition.setTable(tableName);
+            condition.setFixedData(new JSONObject(dto.getCondition()));
+            AjaxResult ajaxResult = remoteObjService.getByMap(condition);
+            if (AjaxResult.checkSuccess(ajaxResult)) {
+                list = ((List<Map<String, Object>>) ajaxResult.get(AjaxResult.DATA_TAG));
+                columns = ExcelUtil.filterData(columns, 4, MaskConstant.LIST_VISIBLE::equals);
+                handleNullColumnValue(list, map(columns, GenTableColumn::getColumnName));
+            }
+        }
+
+        try {
+            util.exportExcelCommon(response, list, "sheet1", columns, empty, false);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 功能描述: 导出数据,只是sql不一样,其余的都是通用接口的内容
+     *
+     * @param response response
+     * @param dto      tableName
+     *                 empty(true=>只带表头的excel,不含数据, false=>带数据的excel)
+     *                 condition 查询条件
+     * @return com.boman.domain.dto.AjaxResult
+     */
+    @Override
+    public AjaxResult statisticsByMonth(HttpServletResponse response, ExportExcelDto dto) {
+
+        String tableName = dto.getTableName();
+        Boolean empty = dto.getEmpty();
+        ObjectUtils.requireNonNull(tableName, "exportExcelCommon tableName is empty");
+        ObjectUtils.requireNonNull(empty, "exportExcelCommon empty is empty");
+
+        ExcelUtil<JSONObject> util = new ExcelUtil<>(JSONObject.class);
+        List<Map<String, Object>> list = null;
+        if (BooleanUtils.isTrue(empty)) {
+            list = new ArrayList<>(0);
+        } else {
+            AjaxResult ajaxResult = remoteAttendanceService.statisticsByMonth(dto.getCondition());
+            if (AjaxResult.checkSuccess(ajaxResult)) {
+                list = ((List<Map<String, Object>>) ajaxResult.get(AjaxResult.DATA_TAG));
+                // 导出不需要user_id, 同时把map中的value换成int
+                List<Map<String, Object>> newList = new ArrayList<>(list.size());
+                for (Map<String, Object> map : list) {
+                    map.remove("user_id");
+                    for (Map.Entry<String, Object> entry : map.entrySet()) {
+                        Object value = entry.getValue();
+                        if (value instanceof Double) {
+                            Double value1 = (Double) value;
+                            entry.setValue(value1.intValue());
+                        }
+                    }
+
+                    Map<String, Object> newMap = new LinkedHashMap<>(map.size());
+                    newMap.put(USERNAME, map.get(USERNAME));
+                    newMap.put(DEPT_NAME, map.get(DEPT_NAME));
+                    newMap.put(ATTENDANCE_TABLE_LATE_SUM, map.get(ATTENDANCE_TABLE_LATE_SUM));
+                    newMap.put(ATTENDANCE_TABLE_LEAVE_SUM, map.get(ATTENDANCE_TABLE_LEAVE_SUM));
+                    newMap.put(ATTENDANCE_TABLE_LEAVE_OR_SUM, map.get(ATTENDANCE_TABLE_LEAVE_OR_SUM));
+                    newMap.put(DATE, map.get(DATE));
+                    newList.add(newMap);
+                }
+
+                list = newList;
+            }
+        }
+
+        try {
+            util.exportExcelCommon(response, list, "sheet1", null, empty, true);
+        } catch (IOException e) {
+            LOGGER.error("考勤统计导出失败,导出数据为:{}", list);
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 功能描述: 通用的导入接口
+     *
+     * @param dto@return java.util.List<com.alibaba.fastjson.JSONObject>
+     */
+    @Override
+    public List<JSONObject> importExcelCommon(ImportExcelDto dto) throws Exception {
+        return null;
+    }
+
+    public void handleNullColumnValue(List<Map<String, Object>> result, List<String> showData) {
+        for (Map<String, Object> map : result) {
+            Set<String> resultKeySet = map.keySet();
+            for (String columnName : showData) {
+                if (!resultKeySet.contains(columnName)) {
+                    map.put(columnName, "");
+                }
+            }
+        }
+    }
 }

+ 98 - 45
boman-modules/boman-file/src/main/java/com/boman/file/service/MinioSysFileServiceImpl.java

@@ -1,45 +1,98 @@
-package com.boman.file.service;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.web.multipart.MultipartFile;
-import com.boman.file.config.MinioConfig;
-import com.boman.file.utils.FileUploadUtils;
-import io.minio.MinioClient;
-import io.minio.PutObjectArgs;
-
-/**
- * Minio 文件存储
- * 
- * @author ruoyi
- */
-@Service
-public class MinioSysFileServiceImpl implements ISysFileService
-{
-    @Autowired
-    private MinioConfig minioConfig;
-
-    @Autowired
-    private MinioClient client;
-
-    /**
-     * 本地文件上传接口
-     * 
-     * @param file 上传的文件
-     * @return 访问地址
-     * @throws Exception
-     */
-    @Override
-    public String uploadFile(MultipartFile file) throws Exception
-    {
-        String fileName = FileUploadUtils.extractFilename(file);
-        PutObjectArgs args = PutObjectArgs.builder()
-                .bucket(minioConfig.getBucketName())
-                .object(fileName)
-                .stream(file.getInputStream(), file.getSize(), -1)
-                .contentType(file.getContentType())
-                .build();
-        client.putObject(args);
-        return minioConfig.getUrl() + "/" + minioConfig.getBucketName() + "/" + fileName;
-    }
-}
+//package com.boman.file.service;
+//
+//import com.alibaba.fastjson.JSONObject;
+//import com.boman.domain.dto.AjaxResult;
+//import com.boman.domain.dto.ImportExcelDto;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.stereotype.Service;
+//import org.springframework.web.multipart.MultipartFile;
+//import com.boman.file.config.MinioConfig;
+//import com.boman.file.utils.FileUploadUtils;
+//import io.minio.MinioClient;
+//import io.minio.PutObjectArgs;
+//
+//import javax.servlet.http.HttpServletResponse;
+//import java.io.IOException;
+//import java.util.List;
+//
+///**
+// * Minio 文件存储
+// *
+// * @author ruoyi
+// */
+//@Service
+//public class MinioSysFileServiceImpl implements ISysFileService
+//{
+//    @Autowired
+//    private MinioConfig minioConfig;
+//
+//    @Autowired
+//    private MinioClient client;
+//
+//    /**
+//     * 本地文件上传接口
+//     *
+//     * @param file 上传的文件
+//     * @return 访问地址
+//     * @throws Exception
+//     */
+//    @Override
+//    public String uploadFile(MultipartFile file) throws Exception
+//    {
+//        String fileName = FileUploadUtils.extractFilename(file);
+//        PutObjectArgs args = PutObjectArgs.builder()
+//                .bucket(minioConfig.getBucketName())
+//                .object(fileName)
+//                .stream(file.getInputStream(), file.getSize(), -1)
+//                .contentType(file.getContentType())
+//                .build();
+//        client.putObject(args);
+//        return minioConfig.getUrl() + "/" + minioConfig.getBucketName() + "/" + fileName;
+//    }
+//
+//    /**
+//     * 功能描述: 上传base64
+//     *
+//     * @param base64 base64
+//     * @return java.lang.String
+//     */
+//    @Override
+//    public String uploadFileBase64(String base64) throws IOException {
+//        return null;
+//    }
+//
+//    /**
+//     * 功能描述: 通用的导入接口
+//     *
+//     * @param dto     dto
+//     * @return java.util.List<com.alibaba.fastjson.JSONObject>
+//     */
+//    @Override
+//    public List<JSONObject> importExcelCommon(ImportExcelDto dto) {
+//        return null;
+//    }
+//
+//    /**
+//     * 功能描述: 通用的导入接口
+//     *
+//     * @param multipartFile multipartFile
+//     * @param tableName     tableName
+//     * @return java.util.List<com.alibaba.fastjson.JSONObject>
+//     */
+//    @Override
+//    public AjaxResult importExcelCommon(MultipartFile multipartFile, String tableName) throws Exception {
+//        return null;
+//    }
+//
+//    /**
+//     * 功能描述: 通用的导出接口
+//     *
+//     * @param tableName tableName
+//     * @param empty     true=>只带表头的excel,不含数据, false=>带数据的excel
+//     * @return com.boman.domain.dto.AjaxResult
+//     */
+//    @Override
+//    public AjaxResult exportExcelCommon(HttpServletResponse response, String tableName, Boolean empty, JSONObject condition) {
+//        return null;
+//    }
+//}

+ 62 - 0
boman-modules/boman-file/src/main/java/com/boman/file/utils/Base64DecodedMultipartFile.java

@@ -0,0 +1,62 @@
+package com.boman.file.utils;
+
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.*;
+
+/**
+ * @author tjf
+ * @Date: 2021/05/31/15:57
+ */
+public class Base64DecodedMultipartFile implements MultipartFile {
+    private final byte[] imgContent;
+    private final String header;
+
+    public Base64DecodedMultipartFile(byte[] imgContent, String header) {
+        this.imgContent = imgContent;
+        this.header = header.split(";")[0];
+    }
+
+    @Override
+    public String getName() {
+        // TODO - implementation depends on your requirements
+        return System.currentTimeMillis() + Math.random() + "." + header.split("/")[1];
+    }
+
+    @Override
+    public String getOriginalFilename() {
+        // TODO - implementation depends on your requirements
+        return System.currentTimeMillis() + (int) Math.random() * 10000 + "." + header.split("/")[1];
+    }
+
+    @Override
+    public String getContentType() {
+        // TODO - implementation depends on your requirements
+        return header.split(":")[1];
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return imgContent == null || imgContent.length == 0;
+    }
+
+    @Override
+    public long getSize() {
+        return imgContent.length;
+    }
+
+    @Override
+    public byte[] getBytes() {
+        return imgContent;
+    }
+
+    @Override
+    public InputStream getInputStream() {
+        return new ByteArrayInputStream(imgContent);
+    }
+
+    @Override
+    public void transferTo(File dest) throws IOException, IllegalStateException {
+        new FileOutputStream(dest).write(imgContent);
+    }
+}

+ 64 - 1
boman-modules/boman-file/src/main/java/com/boman/file/utils/FileUploadUtils.java

@@ -8,9 +8,9 @@ import com.boman.common.core.exception.file.FileNameLengthLimitExceededException
 import com.boman.common.core.exception.file.FileSizeLimitExceededException;
 import com.boman.common.core.exception.file.InvalidExtensionException;
 import com.boman.common.core.utils.DateUtils;
-import com.boman.common.core.utils.IdUtils;
 import com.boman.common.core.utils.StringUtils;
 import com.boman.common.core.utils.file.MimeTypeUtils;
+import sun.misc.BASE64Decoder;
 
 /**
  * 文件上传工具类
@@ -193,4 +193,67 @@ public class FileUploadUtils
         }
         return extension;
     }
+
+    /**
+     * base64转MultipartFile
+     * @param base64
+     * @return
+     */
+    public static MultipartFile base64ToMultipart(String base64) {
+        try {
+            String[] baseStrs = base64.split(",");
+            BASE64Decoder decoder = new BASE64Decoder();
+            byte[] b;
+            b = decoder.decodeBuffer(baseStrs[1]);
+            for(int i = 0; i < b.length; ++i) {
+                if (b[i] < 0) {
+                    b[i] += 256;
+                }
+            }
+            return new Base64DecodedMultipartFile(b, baseStrs[0]);
+        } catch (IOException e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 功能描述: multipartFile转换成file
+     *
+     * @param multipartFile multipartFile
+     * @return java.io.File
+     */
+    public static File multipartFile2File(MultipartFile multipartFile) {
+        File file = new File("TEMP_FILE_PATH" + multipartFile.getOriginalFilename());
+        transferTo(multipartFile, file);
+        return file;
+    }
+
+    /**
+     * 以流的形式存到服务器
+     *
+     * @param multipartFile multipartFile
+     * @param newFile       newFile
+     */
+    private static void transferTo(MultipartFile multipartFile, File newFile) {
+        try {
+            if (!newFile.getParentFile().exists()) {
+                newFile.getParentFile().mkdirs();
+            }
+            multipartFile.transferTo(newFile);
+        } catch (Exception ignored) {
+        }
+    }
+
+    /**
+     * 功能描述: 删除临时文件
+     *
+     * @param file file
+     */
+    public static void delete(File file) {
+        if (file != null) {
+            file.delete();
+        }
+    }
+
 }

+ 2 - 0
boman-modules/boman-file/src/main/resources/bootstrap.yml

@@ -15,6 +15,7 @@ spring:
       discovery:
         # 服务注册地址
         server-addr: 192.168.101.10:8848
+        namespace: 0886e975-9ff6-4602-8ed2-f17b4d0ef1bc  #潜山数据局
       config:
         # 配置中心地址
         server-addr: 192.168.101.10:8848
@@ -23,3 +24,4 @@ spring:
         # 共享配置
         shared-configs:
           - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
+        namespace: 0886e975-9ff6-4602-8ed2-f17b4d0ef1bc  #潜山数据局

+ 2 - 3
boman-modules/boman-gen/src/main/java/com/boman/gen/controller/GenController.java

@@ -6,9 +6,8 @@ import java.util.List;
 import java.util.Map;
 import javax.servlet.http.HttpServletResponse;
 
-import com.boman.common.core.constant.UserConstants;
+import com.boman.domain.constant.UserConstants;
 import com.boman.gen.service.ILoadTableServer;
-import com.boman.gen.service.LoadTableServerImpl;
 import org.apache.commons.io.IOUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -22,7 +21,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import com.boman.common.core.text.Convert;
 import com.boman.common.core.web.controller.BaseController;
-import com.boman.common.core.web.domain.AjaxResult;
+import com.boman.domain.dto.AjaxResult;
 import com.boman.common.core.web.page.TableDataInfo;
 import com.boman.common.log.annotation.Log;
 import com.boman.common.log.enums.BusinessType;

+ 2 - 2
boman-modules/boman-gen/src/main/java/com/boman/gen/controller/GenTableColumnController.java

@@ -1,10 +1,10 @@
 package com.boman.gen.controller;
 
 
-import com.boman.common.core.constant.UserConstants;
+import com.boman.domain.constant.UserConstants;
 import com.boman.common.core.utils.SecurityUtils;
 import com.boman.common.core.web.controller.BaseController;
-import com.boman.common.core.web.domain.AjaxResult;
+import com.boman.domain.dto.AjaxResult;
 import com.boman.common.core.web.page.TableDataInfo;
 import com.boman.common.log.annotation.Log;
 import com.boman.common.log.enums.BusinessType;

+ 1 - 1
boman-modules/boman-gen/src/main/java/com/boman/gen/controller/GenTableRelationController.java

@@ -3,7 +3,7 @@ package com.boman.gen.controller;
 
 import com.boman.common.core.utils.SecurityUtils;
 import com.boman.common.core.web.controller.BaseController;
-import com.boman.common.core.web.domain.AjaxResult;
+import com.boman.domain.dto.AjaxResult;
 import com.boman.common.core.web.page.TableDataInfo;
 import com.boman.domain.GenTableRelation;
 import com.boman.gen.service.IGenTableRelationService;

+ 1 - 20
boman-modules/boman-gen/src/main/java/com/boman/gen/controller/LoadTableController.java

@@ -1,33 +1,14 @@
 package com.boman.gen.controller;
 
-import com.boman.common.core.utils.obj.ObjectUtils;
 import com.boman.common.core.web.controller.BaseController;
-import com.boman.common.core.web.domain.AjaxResult;
-import com.boman.common.redis.RedisKey;
-import com.boman.common.redis.service.RedisService;
-import com.boman.domain.constant.FormDataConstant;
+import com.boman.domain.dto.AjaxResult;
 import com.boman.domain.GenTable;
-import com.boman.domain.GenTableColumn;
-import com.boman.domain.GenTableRelation;
-import com.boman.gen.service.IGenTableColumnService;
-import com.boman.gen.service.IGenTableRelationService;
-import com.boman.gen.service.IGenTableService;
 import com.boman.gen.service.ILoadTableServer;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
-
 import static com.boman.common.core.utils.obj.ObjectUtils.requireNonNull;
 
 /**

+ 1 - 1
boman-modules/boman-gen/src/main/java/com/boman/gen/controller/TableSqlController.java

@@ -1,7 +1,7 @@
 package com.boman.gen.controller;
 
 import com.boman.common.core.web.controller.BaseController;
-import com.boman.common.core.web.domain.AjaxResult;
+import com.boman.domain.dto.AjaxResult;
 import com.boman.domain.TableSql;
 import com.boman.gen.service.ITableSqlService;
 import org.springframework.beans.factory.annotation.Autowired;

+ 3 - 23
boman-modules/boman-gen/src/main/java/com/boman/gen/service/GenTableColumnServiceImpl.java

@@ -1,6 +1,6 @@
 package com.boman.gen.service;
 
-import com.boman.common.core.constant.UserConstants;
+import com.boman.domain.constant.UserConstants;
 import com.boman.common.core.text.Convert;
 import com.boman.common.core.utils.DateUtils;
 import com.boman.common.core.utils.SecurityUtils;
@@ -20,7 +20,6 @@ import com.google.common.collect.Maps;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
-import org.springframework.web.client.RestTemplate;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -141,7 +140,7 @@ public class GenTableColumnServiceImpl implements IGenTableColumnService {
         isAk(list);
         insertCreateLog(list, BusinessType.INSERT);
         //处理字段翻译器
-        fieldTranslator(list);
+        //fieldTranslator(list);
         return i;
     }
 
@@ -157,7 +156,7 @@ public class GenTableColumnServiceImpl implements IGenTableColumnService {
         list.add(genTableColumn);
         isAk(list);
         insertCreateLog(list, BusinessType.UPDATE);
-        fieldTranslator(list);
+        //fieldTranslator(list);
         return genTableColumnMapper.updateGenTableColumn(genTableColumn);
     }
 
@@ -261,25 +260,6 @@ public class GenTableColumnServiceImpl implements IGenTableColumnService {
         }
     }
 
-
-
-    /**
-     * 处理字段翻译器
-     * @param genTableColumnList
-     */
-    @Async
-    public void fieldTranslator (List<GenTableColumn> genTableColumnList) {
-        for (GenTableColumn genTableColumn : genTableColumnList) {
-            String fieldTranslator = genTableColumn.getFieldTranslator();
-            if (StringUtils.isNotBlank(fieldTranslator)){
-                RestTemplate restTemplate = new RestTemplate();
-                restTemplate.postForObject("http://" + fieldTranslator, genTableColumn, GenTableColumn.class);
-            }
-        }
-    }
-
-
-
     /**
      * 删除业务字段对象
      *

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно