Browse Source

版本升级:4.1.1

fanxp 1 năm trước cách đây
mục cha
commit
8df68fe05f
100 tập tin đã thay đổi với 3146 bổ sung358 xóa
  1. 23 1
      pom.xml
  2. 1 1
      src/main/java/com/xjrsoft/common/advice/TransResponseBodyAdvice.java
  3. 43 8
      src/main/java/com/xjrsoft/common/advice/WorkflowResponseBodyAdvice.java
  4. 2 2
      src/main/java/com/xjrsoft/common/annotation/Trans.java
  5. 13 5
      src/main/java/com/xjrsoft/common/aspect/XjrLogAspect.java
  6. 18 3
      src/main/java/com/xjrsoft/common/constant/GlobalConstant.java
  7. 44 0
      src/main/java/com/xjrsoft/common/enums/DataAuthConditionTypeEnum.java
  8. 6 6
      src/main/java/com/xjrsoft/common/enums/OracleFieldsType.java
  9. 1 1
      src/main/java/com/xjrsoft/common/enums/PostgreSqlFieldsType.java
  10. 5 1
      src/main/java/com/xjrsoft/common/enums/ResponseCode.java
  11. 1 1
      src/main/java/com/xjrsoft/common/enums/SqlServerFieldsType.java
  12. 6 2
      src/main/java/com/xjrsoft/common/handler/MyMetaObjectHandler.java
  13. 45 0
      src/main/java/com/xjrsoft/common/handler/XjrEntityHandler.java
  14. 44 0
      src/main/java/com/xjrsoft/common/handler/XjrEntityListHandler.java
  15. 310 0
      src/main/java/com/xjrsoft/common/handler/XjrHandleHelper.java
  16. 65 0
      src/main/java/com/xjrsoft/common/handler/XjrLocalTimeTypeHandler.java
  17. 55 0
      src/main/java/com/xjrsoft/common/handler/XjrPageResultHandler.java
  18. 1 2
      src/main/java/com/xjrsoft/common/interceptor/MagicApiRequestInterceptor.java
  19. 1 1
      src/main/java/com/xjrsoft/common/interceptor/MagicApiWebLoginInterceptor.java
  20. 24 0
      src/main/java/com/xjrsoft/common/runner/DataAuthRunner.java
  21. 2 27
      src/main/java/com/xjrsoft/common/runner/DicCacheRunner.java
  22. 31 0
      src/main/java/com/xjrsoft/common/runner/XjrSqlConnRunner.java
  23. 44 7
      src/main/java/com/xjrsoft/common/utils/DatasourceUtil.java
  24. 31 70
      src/main/java/com/xjrsoft/common/utils/DingtalkUtil.java
  25. 22 2
      src/main/java/com/xjrsoft/common/utils/JdbcToJavaUtil.java
  26. 46 0
      src/main/java/com/xjrsoft/common/utils/LocalDateTimeUtil.java
  27. 0 1
      src/main/java/com/xjrsoft/common/utils/RedisUtil.java
  28. 2 2
      src/main/java/com/xjrsoft/common/utils/TreeUtil.java
  29. 8 2
      src/main/java/com/xjrsoft/common/xss/XssHttpServletRequestWrapper.java
  30. 41 0
      src/main/java/com/xjrsoft/config/DingtalkConfig.java
  31. 24 23
      src/main/java/com/xjrsoft/config/JacksonConfig.java
  32. 3 0
      src/main/java/com/xjrsoft/config/MybatisPlusConfig.java
  33. 41 0
      src/main/java/com/xjrsoft/config/WechatEnterpriseConfig.java
  34. 10 0
      src/main/java/com/xjrsoft/config/XjrSmsConfig.java
  35. 142 0
      src/main/java/com/xjrsoft/module/app/controller/AppFuncDesignController.java
  36. 116 0
      src/main/java/com/xjrsoft/module/app/controller/AppMenuController.java
  37. 25 10
      src/main/java/com/xjrsoft/module/app/controller/AppPageDesignController.java
  38. 37 0
      src/main/java/com/xjrsoft/module/app/dto/AddAppMenuDto.java
  39. 3 0
      src/main/java/com/xjrsoft/module/app/dto/AddAppPageDesignDto.java
  40. 55 0
      src/main/java/com/xjrsoft/module/app/dto/AddFuncDesignDto.java
  41. 18 0
      src/main/java/com/xjrsoft/module/app/dto/AppFuncDesignPageDto.java
  42. 20 0
      src/main/java/com/xjrsoft/module/app/dto/AppMenuListDto.java
  43. 20 0
      src/main/java/com/xjrsoft/module/app/dto/AppMenuPageDto.java
  44. 40 0
      src/main/java/com/xjrsoft/module/app/dto/AppPageDesignDraftDto.java
  45. 61 0
      src/main/java/com/xjrsoft/module/app/dto/UpdateAppFuncDesignDto.java
  46. 38 0
      src/main/java/com/xjrsoft/module/app/dto/UpdateAppMenuDto.java
  47. 6 0
      src/main/java/com/xjrsoft/module/app/dto/UpdateAppPageDesignDto.java
  48. 58 0
      src/main/java/com/xjrsoft/module/app/entity/AppFuncDesign.java
  49. 54 0
      src/main/java/com/xjrsoft/module/app/entity/AppMenu.java
  50. 3 0
      src/main/java/com/xjrsoft/module/app/entity/AppPageDesign.java
  51. 19 0
      src/main/java/com/xjrsoft/module/app/mapper/AppFuncDesignMapper.java
  52. 18 0
      src/main/java/com/xjrsoft/module/app/mapper/AppMenuMapper.java
  53. 24 0
      src/main/java/com/xjrsoft/module/app/service/IAppFuncDesignService.java
  54. 16 0
      src/main/java/com/xjrsoft/module/app/service/IAppMenuService.java
  55. 6 0
      src/main/java/com/xjrsoft/module/app/service/IAppPageDesignService.java
  56. 345 0
      src/main/java/com/xjrsoft/module/app/service/impl/AppFuncDesignServiceImpl.java
  57. 20 0
      src/main/java/com/xjrsoft/module/app/service/impl/AppMenuServiceImpl.java
  58. 207 1
      src/main/java/com/xjrsoft/module/app/service/impl/AppPageDesignServiceImpl.java
  59. 58 0
      src/main/java/com/xjrsoft/module/app/vo/AppFuncDesignPageVo.java
  60. 60 0
      src/main/java/com/xjrsoft/module/app/vo/AppFuncDesignVo.java
  61. 35 0
      src/main/java/com/xjrsoft/module/app/vo/AppMenuListVo.java
  62. 36 0
      src/main/java/com/xjrsoft/module/app/vo/AppMenuPageVo.java
  63. 35 0
      src/main/java/com/xjrsoft/module/app/vo/AppMenuVo.java
  64. 9 1
      src/main/java/com/xjrsoft/module/app/vo/AppPageDesignVo.java
  65. 204 82
      src/main/java/com/xjrsoft/module/authority/utils/AuthorityUtil.java
  66. 14 14
      src/main/java/com/xjrsoft/module/erpModel/caseErpBom/controller/CaseErpBomController.java
  67. 3 1
      src/main/java/com/xjrsoft/module/erpModel/caseErpBom/dto/UpdateCaseErpBomDto.java
  68. 1 1
      src/main/java/com/xjrsoft/module/erpModel/caseErpBom/entity/CaseErpBom.java
  69. 3 1
      src/main/java/com/xjrsoft/module/erpModel/caseErpBom/vo/CaseErpBomTreeVo.java
  70. 2 1
      src/main/java/com/xjrsoft/module/erpModel/caseErpCustomer/controller/CaseErpCustomerGatherDetailController.java
  71. 3 1
      src/main/java/com/xjrsoft/module/erpModel/caseErpCustomer/dto/AddCaseErpCustomerGatherDetailDto.java
  72. 3 1
      src/main/java/com/xjrsoft/module/erpModel/caseErpCustomer/dto/UpdateCaseErpCustomerGatherDetailDto.java
  73. 3 3
      src/main/java/com/xjrsoft/module/erpModel/caseErpCustomer/entity/CaseErpCustomerGatherDetail.java
  74. 2 2
      src/main/java/com/xjrsoft/module/erpModel/caseErpCustomer/service/impl/CaseErpCustomerServiceImpl.java
  75. 37 0
      src/main/java/com/xjrsoft/module/erpModel/caseErpCustomer/vo/CaseErpCusGatherDetailInfo.java
  76. 4 1
      src/main/java/com/xjrsoft/module/erpModel/caseErpCustomer/vo/CaseErpCustomerGatherDetailVo.java
  77. 4 2
      src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/controller/CaseErpDeviceInfoController.java
  78. 6 6
      src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/controller/CaseErpDeviceWarnController.java
  79. 3 1
      src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/dto/AddCaseErpDeviceInfoDto.java
  80. 5 2
      src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/dto/AddCaseErpDeviceInspectDto.java
  81. 3 1
      src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/dto/UpdateCaseErpDeviceInfoDto.java
  82. 5 2
      src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/dto/UpdateCaseErpDeviceInspectDto.java
  83. 1 1
      src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/entity/CaseErpDeviceInfo.java
  84. 2 2
      src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/entity/CaseErpDeviceInspect.java
  85. 3 3
      src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/entity/CaseErpDeviceWarn.java
  86. 2 2
      src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/service/impl/CaseErpDeviceInspectServiceImpl.java
  87. 59 0
      src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/vo/CaseErpDeviceCodeInfo.java
  88. 3 1
      src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/vo/CaseErpDeviceInfoExportVo.java
  89. 3 1
      src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/vo/CaseErpDeviceInfoVo.java
  90. 5 2
      src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/vo/CaseErpDeviceInspectExportVo.java
  91. 5 3
      src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/vo/CaseErpDeviceInspectInfoVo.java
  92. 5 2
      src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/vo/CaseErpDeviceInspectVo.java
  93. 5 2
      src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/vo/CaseErpDeviceWarnExportVo.java
  94. 62 0
      src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/vo/CaseErpDeviceWarnInfo.java
  95. 7 4
      src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/vo/CaseErpDeviceWarnInfoVo.java
  96. 5 2
      src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/vo/CaseErpDeviceWarnVo.java
  97. 24 23
      src/main/java/com/xjrsoft/module/erpModel/caseErpMaterial/controller/CaseErpMaterialController.java
  98. 50 5
      src/main/java/com/xjrsoft/module/erpModel/caseErpPurchase/controller/CaseErpPurchaseApplyController.java
  99. 2 2
      src/main/java/com/xjrsoft/module/erpModel/caseErpPurchase/controller/CaseErpPurchaseController.java
  100. 1 1
      src/main/java/com/xjrsoft/module/erpModel/caseErpPurchase/dto/AddCaseErpApplyDto.java

+ 23 - 1
pom.xml

@@ -19,7 +19,7 @@
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
         <java.version>11</java.version>
         <commons.lang.version>2.6</commons.lang.version>
-        <commons.fileupload.version>1.2.2</commons.fileupload.version>
+        <commons.fileupload.version>1.5</commons.fileupload.version>
         <commons.io.version>2.5</commons.io.version>
         <commons.codec.version>1.10</commons.codec.version>
         <commons.configuration.version>1.10</commons.configuration.version>
@@ -63,6 +63,9 @@
         <pinyin4j.version>2.5.1</pinyin4j.version>
         <sms4j.version>2.1.0</sms4j.version>
         <license.version>2.0</license.version>
+        <justauth.version>1.16.5</justauth.version>
+        <dingtalk.version>2.0.26</dingtalk.version>
+        <version.tomcat>9.0.71</version.tomcat>
         <easy.captcha.version>1.6.2</easy.captcha.version>
         <paho.mqttv5.version>1.2.5</paho.mqttv5.version>
         <liteflow.version>2.11.2</liteflow.version>
@@ -479,6 +482,25 @@
             <version>${license.version}</version>
         </dependency>
 
+        <dependency>
+            <groupId>me.zhyd.oauth</groupId>
+            <artifactId>JustAuth</artifactId>
+            <version>${justauth.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>dingtalk</artifactId>
+            <version>${dingtalk.version}</version>
+        </dependency>
+
+        <!-- 引入postgres依赖 -->
+        <dependency>
+            <groupId>org.postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+
 
     </dependencies>
 

+ 1 - 1
src/main/java/com/xjrsoft/common/advice/TransResponseBodyAdvice.java

@@ -159,7 +159,7 @@ public class TransResponseBodyAdvice implements ResponseBodyAdvice<Object> {
                     //数据字典转换
                     if (annotation.type() == TransType.DIC && detailList != null) {
                         for (DictionaryDetail detail : detailList) {
-                            if (values.contains(detail.getValue())) {
+                            if (values.contains(detail.getValue()) && StrUtil.equalsIgnoreCase(annotation.id(), detail.getItemId().toString())) {
                                 if (tranValue.length() > 0) {
                                     tranValue.append(StringPool.COMMA);
                                 }

+ 43 - 8
src/main/java/com/xjrsoft/common/advice/WorkflowResponseBodyAdvice.java

@@ -6,6 +6,8 @@ import cn.hutool.core.convert.Convert;
 import cn.hutool.core.util.*;
 import cn.hutool.db.Entity;
 import cn.hutool.extra.servlet.ServletUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.xjrsoft.common.enums.WorkflowIsRecycleType;
@@ -15,9 +17,11 @@ import com.xjrsoft.common.model.result.R;
 import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.common.utils.RedisUtil;
 import com.xjrsoft.module.workflow.constant.WorkflowConstant;
+import com.xjrsoft.module.workflow.entity.WorkflowDraft;
 import com.xjrsoft.module.workflow.entity.WorkflowFormRelation;
 import com.xjrsoft.module.workflow.entity.WorkflowSchema;
 import com.xjrsoft.module.workflow.model.WorkflowListResult;
+import com.xjrsoft.module.workflow.service.IWorkflowDraftService;
 import com.xjrsoft.module.workflow.service.IWorkflowFormRelationService;
 import com.xjrsoft.module.workflow.service.IWorkflowSchemaService;
 import javassist.*;
@@ -61,6 +65,8 @@ public class WorkflowResponseBodyAdvice implements ResponseBodyAdvice<Object> {
 
     private IWorkflowSchemaService workflowSchemaService;
 
+    private final IWorkflowDraftService workflowDraftService;
+
     private TaskService taskService;
 
     private static final Map<String, Constructor<?>> cacheClass = new HashMap<>();
@@ -150,9 +156,9 @@ public class WorkflowResponseBodyAdvice implements ResponseBodyAdvice<Object> {
             keyValueFormList.add(keyValue);
         }
 
-        WorkflowSchema schema = workflowSchemaService.getOne(Wrappers.lambdaQuery(WorkflowSchema.class).eq(WorkflowSchema::getFormId, headerFormId).select(WorkflowSchema::getId));
+        WorkflowSchema schema = workflowSchemaService.getOne(Wrappers.lambdaQuery(WorkflowSchema.class).eq(WorkflowSchema::getFormId, Long.parseLong(headerFormId)).select(WorkflowSchema::getId));
         //获取到所有关联的 流程id
-        List<WorkflowFormRelation> relations = formRelationService.list(Wrappers.lambdaQuery(WorkflowFormRelation.class).eq(WorkflowFormRelation::getFormId, headerFormId).in(WorkflowFormRelation::getFormKeyValue, keyValueFormList).select(WorkflowFormRelation::getProcessId, WorkflowFormRelation::getFormKeyValue));
+        List<WorkflowFormRelation> relations = formRelationService.list(Wrappers.lambdaQuery(WorkflowFormRelation.class).eq(WorkflowFormRelation::getFormId, Long.parseLong(headerFormId)).in(WorkflowFormRelation::getFormKeyValue, keyValueFormList).select(WorkflowFormRelation::getProcessId, WorkflowFormRelation::getFormKeyValue));
 
         Set<String> processIds = relations.stream().map(WorkflowFormRelation::getProcessId).collect(Collectors.toSet());
         List<HistoricProcessInstance> processInstanceList;
@@ -200,20 +206,35 @@ public class WorkflowResponseBodyAdvice implements ResponseBodyAdvice<Object> {
                 if (thisDataTask.size() > 0) {
                     workflowListResult.setTaskIds(thisDataTask.stream().map(Task::getId).collect(Collectors.toList()));
                 }
+
+
             });
 
             if (ObjectUtil.isNotNull(schema)) {
                 workflowListResult.setSchemaId(schema.getId());
+                // 查询草稿信息
+                LambdaQueryWrapper<WorkflowDraft> wrapper = Wrappers.<WorkflowDraft>query().lambda().select(WorkflowDraft::getId)
+                        .eq(WorkflowDraft::getCreateUserId, StpUtil.getLoginIdAsLong());
+                List<String> taskIds = workflowListResult.getTaskIds();
+                if (CollectionUtils.isNotEmpty(taskIds)) {
+                    wrapper.eq(WorkflowDraft::getTaskId, taskIds.get(0));
+                } else {
+                    wrapper.eq(WorkflowDraft::getDataId, String.valueOf(keyValue))
+                            .eq(WorkflowDraft::getSchemaId, schema.getId());
+                }
+                WorkflowDraft draft = workflowDraftService.getOne(wrapper, false);
+                if (draft != null) workflowListResult.setDraftId(draft.getId());
             } else {
                 workflowListResult.setEnabled(Boolean.FALSE);
             }
+
             rowValue.set(RESULT_KEY, workflowListResult);
         }
         return body;
     }
 
     private Object codeGetWorkflowDataHandler(Object body,String formId, String key) {
-        WorkflowSchema schema = workflowSchemaService.getOne(Wrappers.lambdaQuery(WorkflowSchema.class).eq(WorkflowSchema::getFormId, formId).select(WorkflowSchema::getId));
+        WorkflowSchema schema = workflowSchemaService.getOne(Wrappers.lambdaQuery(WorkflowSchema.class).eq(WorkflowSchema::getFormId, Long.parseLong(formId)).select(WorkflowSchema::getId));
 
         List<Object> keyValueList = new ArrayList<>();
 
@@ -232,7 +253,7 @@ public class WorkflowResponseBodyAdvice implements ResponseBodyAdvice<Object> {
 
             for (Object data : listData) {
                 Object keyValue = ReflectUtil.getFieldValue(data, key);
-                keyValueList.add(keyValue);
+                keyValueList.add(keyValue.toString());
             }
         }
         //判断是否为不分页列表返回值
@@ -245,7 +266,7 @@ public class WorkflowResponseBodyAdvice implements ResponseBodyAdvice<Object> {
 
             for (Object data : listData) {
                 Object keyValue = ReflectUtil.getFieldValue(data, key);
-                keyValueList.add(keyValue);
+                keyValueList.add(keyValue.toString());
             }
         } else {
             return body;
@@ -253,7 +274,7 @@ public class WorkflowResponseBodyAdvice implements ResponseBodyAdvice<Object> {
 
 
         //获取到所有关联的 流程id
-        List<WorkflowFormRelation> relations = formRelationService.list(Wrappers.lambdaQuery(WorkflowFormRelation.class).eq(WorkflowFormRelation::getFormId, formId).in(WorkflowFormRelation::getFormKeyValue, keyValueList).select(WorkflowFormRelation::getProcessId, WorkflowFormRelation::getFormKeyValue));
+        List<WorkflowFormRelation> relations = formRelationService.list(Wrappers.lambdaQuery(WorkflowFormRelation.class).eq(WorkflowFormRelation::getFormId, Long.parseLong(formId)).in(WorkflowFormRelation::getFormKeyValue, keyValueList).select(WorkflowFormRelation::getProcessId, WorkflowFormRelation::getFormKeyValue));
 //        if (relations.size() == 0) {
 //            return body;
 //        }
@@ -283,6 +304,7 @@ public class WorkflowResponseBodyAdvice implements ResponseBodyAdvice<Object> {
 
         ClassPool pool = new ClassPool(true);
 
+        pool.appendClassPath(new LoaderClassPath(Thread.currentThread().getContextClassLoader()));
         List<Object> result = new ArrayList<>();
         try {
             CtClass ctClass = pool.get(listData.get(0).getClass().getName());
@@ -310,8 +332,8 @@ public class WorkflowResponseBodyAdvice implements ResponseBodyAdvice<Object> {
 
             for (Object data : listData) {
                 Object keyValue = ReflectUtil.getFieldValue(data, key);
-
-                Optional<WorkflowFormRelation> thisRelationOp = relations.stream().filter(x -> x.getFormKeyValue().equals(keyValue)).findFirst();
+                //keyValue.toString是采购申请时使用的,因为采购表存的id是Long类型的
+                Optional<WorkflowFormRelation> thisRelationOp = relations.stream().filter(x -> x.getFormKeyValue().equals(keyValue) || x.getFormKeyValue().equals(keyValue.toString())).findFirst();
 
                 Object newObject = declaredConstructor.newInstance();
 
@@ -338,10 +360,23 @@ public class WorkflowResponseBodyAdvice implements ResponseBodyAdvice<Object> {
 
                 if (ObjectUtil.isNotNull(schema)) {
                     workflowListResult.setSchemaId(schema.getId());
+                    // 查询草稿信息
+                    LambdaQueryWrapper<WorkflowDraft> wrapper = Wrappers.<WorkflowDraft>query().lambda().select(WorkflowDraft::getId)
+                            .eq(WorkflowDraft::getCreateUserId, StpUtil.getLoginIdAsLong())
+                            .eq(WorkflowDraft::getDataId, String.valueOf(keyValue));
+                    List<String> taskIds = workflowListResult.getTaskIds();
+                    if (CollectionUtils.isNotEmpty(taskIds)) {
+                        wrapper.eq(WorkflowDraft::getTaskId, taskIds.get(0));
+                    } else {
+                        wrapper.eq(WorkflowDraft::getSchemaId, schema.getId());
+                    }
+                    WorkflowDraft draft = workflowDraftService.getOne(wrapper, false);
+                    if (draft != null) workflowListResult.setDraftId(draft.getId());
                 } else {
                     workflowListResult.setEnabled(Boolean.FALSE);
                 }
 
+
                 ReflectUtil.setFieldValue(newObject, RESULT_KEY, workflowListResult);
             }
 

+ 2 - 2
src/main/java/com/xjrsoft/common/annotation/Trans.java

@@ -21,8 +21,8 @@ public @interface Trans {
     TransType type();
 
     /**
-     * 如果转换类型是  Api
-     * @return Api 的 id
+     * 如果转换类型是  Api, 装换类型是数据字典则是数据字典id
+     * @return Api 的 id/ 数据字典id
      */
     String id() default "";
 

+ 13 - 5
src/main/java/com/xjrsoft/common/aspect/XjrLogAspect.java

@@ -46,18 +46,26 @@ public class XjrLogAspect {
 	@Around("logPointCut()")
 	public Object around(ProceedingJoinPoint point) throws Throwable {
 		long beginTime = System.currentTimeMillis();
-		//执行方法
-		Object result = point.proceed();
+		Object result = null;
+		try {
+			//执行方法
+			result = point.proceed();
+		} catch (Throwable e) {
+			//执行时长(毫秒)
+			long time = System.currentTimeMillis() - beginTime;
+			insertLog(point, time, LogCategoryEnum.EXCEPTION.getCode());
+			throw e;
+		}
 		//执行时长(毫秒)
 		long time = System.currentTimeMillis() - beginTime;
 
 		//保存日志
-		insertLog(point, time);
+		insertLog(point, time, null);
 
 		return result;
 	}
 
-	private void insertLog(ProceedingJoinPoint joinPoint, long time) {
+	private void insertLog(ProceedingJoinPoint joinPoint, long time, Integer category) {
 		MethodSignature signature = (MethodSignature) joinPoint.getSignature();
 		Method method = signature.getMethod();
 
@@ -96,7 +104,7 @@ public class XjrLogAspect {
 			User user = tokenSession.get(GlobalConstant.LOGIN_USER_INFO_KEY, new User());
 			logEntity.setUsername(user.getUserName());
 			logEntity.setTime(time);
-			logEntity.setCategory(getCategory(request));
+			logEntity.setCategory(category == null ? getCategory(request) : category);
 			logEntity.setCreateTime(LocalDateTime.now());
 			//保存系统日志
 			logMapper.insert(logEntity);

+ 18 - 3
src/main/java/com/xjrsoft/common/constant/GlobalConstant.java

@@ -1,5 +1,8 @@
 package com.xjrsoft.common.constant;
 
+import cn.hutool.core.collection.ListUtil;
+
+import javax.swing.plaf.ListUI;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -103,6 +106,11 @@ public interface GlobalConstant {
      * */
     String SYSTEM_MODULE_PREFIX = "/system";
 
+    /**
+     * @des 第三方登录模块 前缀
+     * */
+    String OAUTH_MODULE_PREFIX = "/oauth";
+
     /**
      * @des bi功能模块 前缀
      * */
@@ -359,7 +367,7 @@ public interface GlobalConstant {
     /**
      * 框架约定树结构的根节点parentId 统一设置为0
      */
-    String  FIRST_NODE_VALUE  = "0";
+    Long  FIRST_NODE_VALUE  = 0L;
 
     /**
      * 框架用户表缓存key
@@ -462,8 +470,12 @@ public interface GlobalConstant {
     /**
      * 验证码
      */
-    String CAPTCHA =  "captcha:";
+    String CAPTCHA =  "captcha";
 
+    /**
+     * 验证法发送次数前缀
+     */
+    String CACHE_COUNT_SMS_CODE_PREFIX = "COUNT_SMS_CODE_";
 
     /**
      * chatgpt 缓存前缀
@@ -484,7 +496,10 @@ public interface GlobalConstant {
      */
     String LOGIN_IMG_CAPTCHA = "imgCaptcha:";
 
-
+    /**
+     * 所支持的图片格式
+     */
+    List<String> imageType = ListUtil.toList("jpg","png","gif","jpeg","image","bmp");
     /**
      * mqtt 请求参数前缀
      */

+ 44 - 0
src/main/java/com/xjrsoft/common/enums/DataAuthConditionTypeEnum.java

@@ -0,0 +1,44 @@
+package com.xjrsoft.common.enums;
+
+/**
+ * @Author: hnyyzy
+ * @Date: 2023/9/19 15:12
+ */
+public enum DataAuthConditionTypeEnum {
+
+    EQUAL_TO(0, "等于"),
+
+    GREATER_THAN(1, "大于"),
+
+    GREATER_THAN_EQUAL(2,"大于等于"),
+
+    MINOR_THAN(3, "小于"),
+
+    MINOR_THAN_EQUAL(4,"小于等于"),
+
+    CONTAIN(5,"包含"),
+
+    CONTAINED_IN(6,"包含于"),
+
+    NO_EQUAL_TO(7, "不等于"),
+
+    NO_CONTAIN(8,"不包含"),
+
+    NO_CONTAINED_IN(9,"不包含于");
+
+    final int code;
+    final String value;
+
+    public int getCode() {
+        return this.code;
+    }
+
+    public String getValue() {
+        return this.value;
+    }
+
+    DataAuthConditionTypeEnum(final int code, final String message) {
+        this.code = code;
+        this.value = message;
+    }
+}

+ 6 - 6
src/main/java/com/xjrsoft/common/enums/OracleFieldsType.java

@@ -7,9 +7,9 @@ public enum OracleFieldsType {
     VARCHAR(0, "VARCHAR2", "短文本"),
 
     /**
-     * 阿里云
+     * 长文本
      * */
-    VARCHARMAX(1, "NCLOB", "长文本"),
+    VARCHARMAX(1, "NVARCHAR2", "长文本"),
 
     /**
      * 数字类型
@@ -24,16 +24,16 @@ public enum OracleFieldsType {
     /**
      * 日期
      * */
-    DATE(4, "TIMESTAMP", "日期"),
+    DATE(4, "DATE", "日期"),
 
     /**
      * 日期时间类型
      * */
-    DATETIME(5, "TIMESTAMP", "日期时间"),
+    DATETIME(5, "DATE", "日期时间"),
     /**
      * 主表主键
      * */
-    FK(6, "VARCHAR2", "主表主键"),
+    FK(6, "NUMBER", "主表主键"),
     /**
      * 长整数
      * */
@@ -41,7 +41,7 @@ public enum OracleFieldsType {
     /**
      * 时间
      * */
-    TIME(8, "TIME", "时间");
+    TIME(8, "INTERVAL DAY(0) TO SECOND(6)", "时间");
 
     final int code;
     final String type;

+ 1 - 1
src/main/java/com/xjrsoft/common/enums/PostgreSqlFieldsType.java

@@ -14,7 +14,7 @@ public enum PostgreSqlFieldsType {
     /**
      * 数字类型
      * */
-    INT(2, "bigint", "数字"),
+    INT(2, "int", "数字"),
 
     /**
      * 小数

+ 5 - 1
src/main/java/com/xjrsoft/common/enums/ResponseCode.java

@@ -57,7 +57,11 @@ public enum ResponseCode {
     /*
      * 参数校验失败
      * */
-    PARAM_VALID_ERROR(10400, "参数校验失败");
+    PARAM_VALID_ERROR(10400, "参数校验失败"),
+    /*
+     * 参数校验失败
+     * */
+    MAGIC_API_UN_AUTHORIZED(10404, "magicAPI接口未授权!");
 
     final int code;
     final String message;

+ 1 - 1
src/main/java/com/xjrsoft/common/enums/SqlServerFieldsType.java

@@ -14,7 +14,7 @@ public enum SqlServerFieldsType {
     /**
      * 数字类型
      * */
-    INT(2, "NUMBER", "数字"),
+    INT(2, "int", "数字"),
 
     /**
      * 小数

+ 6 - 2
src/main/java/com/xjrsoft/common/handler/MyMetaObjectHandler.java

@@ -33,9 +33,13 @@ public class MyMetaObjectHandler implements MetaObjectHandler {
             userId = StpUtil.getLoginIdAsLong();
         }
         catch (Exception e) {
-//            log.error("获取当前登录用户Id失败", e);
+            log.error("获取当前登录用户Id失败", e);
         }
 
+        //如果需要自定义主键生成策略 在此按照自己想法生成主键值
+        //this.strictInsertFill(metaObject, {主键字段名}, {主键字段类型.class}, {自己生成的主键id值});
+        //例如: this.strictInsertFill(metaObject, "id", Integer.class, 10000000000000);
+
         //默认插入创建人Id
         this.strictInsertFill(metaObject, GlobalConstant.CREATE_USER_ID_PROPERTY, Long.class, userId);
         //默认插入创建时间
@@ -61,7 +65,7 @@ public class MyMetaObjectHandler implements MetaObjectHandler {
             userId = StpUtil.getLoginIdAsLong();
         }
         catch (Exception e) {
-//            log.error("获取当前登录用户Id失败", e);
+            log.error("获取当前登录用户Id失败", e);
         }
         //默认插入修改人Id
         this.strictUpdateFill(metaObject, GlobalConstant.MODIFY_USER_ID_PROPERTY, Long.class, userId);

+ 45 - 0
src/main/java/com/xjrsoft/common/handler/XjrEntityHandler.java

@@ -0,0 +1,45 @@
+package com.xjrsoft.common.handler;
+
+import cn.hutool.db.Entity;
+import cn.hutool.db.handler.RsHandler;
+
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+
+public class XjrEntityHandler implements RsHandler<Entity> {
+    /** 是否大小写不敏感 */
+    private final boolean caseInsensitive;
+
+    /**
+     * 创建一个 EntityHandler对象
+     * @return EntityHandler对象
+     */
+    public static XjrEntityHandler create() {
+        return new XjrEntityHandler();
+    }
+
+    /**
+     * 构造
+     */
+    public XjrEntityHandler() {
+        this(false);
+    }
+
+    /**
+     * 构造
+     *
+     * @param caseInsensitive 是否大小写不敏感
+     */
+    public XjrEntityHandler(boolean caseInsensitive) {
+        this.caseInsensitive = caseInsensitive;
+    }
+
+    @Override
+    public Entity handle(ResultSet rs) throws SQLException {
+        final ResultSetMetaData meta = rs.getMetaData();
+        final int columnCount = meta.getColumnCount();
+
+        return rs.next() ? XjrHandleHelper.handleRow(columnCount, meta, rs, this.caseInsensitive) : null;
+    }
+}

+ 44 - 0
src/main/java/com/xjrsoft/common/handler/XjrEntityListHandler.java

@@ -0,0 +1,44 @@
+package com.xjrsoft.common.handler;
+
+import cn.hutool.db.Entity;
+import cn.hutool.db.handler.RsHandler;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+public class XjrEntityListHandler implements RsHandler<List<Entity>> {
+
+    /** 是否大小写不敏感 */
+    private final boolean caseInsensitive;
+
+    /**
+     * 创建一个 EntityListHandler对象
+     * @return EntityListHandler对象
+     */
+    public static XjrEntityListHandler create() {
+        return new XjrEntityListHandler();
+    }
+
+    /**
+     * 构造
+     */
+    public XjrEntityListHandler() {
+        this(false);
+    }
+
+    /**
+     * 构造
+     *
+     * @param caseInsensitive 是否大小写不敏感
+     */
+    public XjrEntityListHandler(boolean caseInsensitive) {
+        this.caseInsensitive = caseInsensitive;
+    }
+
+    @Override
+    public List<Entity> handle(ResultSet rs) throws SQLException {
+        return XjrHandleHelper.handleRs(rs, new ArrayList<>(), this.caseInsensitive);
+    }
+}

+ 310 - 0
src/main/java/com/xjrsoft/common/handler/XjrHandleHelper.java

@@ -0,0 +1,310 @@
+package com.xjrsoft.common.handler;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.bean.PropDesc;
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.util.ReflectUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.core.util.TypeUtil;
+import cn.hutool.db.Entity;
+import cn.hutool.db.handler.HandleHelper;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Type;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+public class XjrHandleHelper extends HandleHelper {
+    /**
+     * 处理单条数据
+     *
+     * @param <T> Bean类型
+     * @param columnCount 列数
+     * @param meta ResultSetMetaData
+     * @param rs 数据集
+     * @param bean 目标Bean
+     * @return 每一行的Entity
+     * @throws SQLException SQL执行异常
+     * @since 3.3.1
+     */
+    public static <T> T handleRow(int columnCount, ResultSetMetaData meta, ResultSet rs, T bean) throws SQLException {
+        return handleRow(columnCount, meta, rs).toBeanIgnoreCase(bean);
+    }
+
+    /**
+     * 处理单条数据
+     *
+     * @param <T> Bean类型
+     * @param columnCount 列数
+     * @param meta ResultSetMetaData
+     * @param rs 数据集
+     * @param beanClass 目标Bean类型
+     * @return 每一行的Entity
+     * @throws SQLException SQL执行异常
+     * @since 3.3.1
+     */
+    @SuppressWarnings("unchecked")
+    public static <T> T handleRow(int columnCount, ResultSetMetaData meta, ResultSet rs, Class<T> beanClass) throws SQLException {
+        Assert.notNull(beanClass, "Bean Class must be not null !");
+
+        if(beanClass.isArray()) {
+            //返回数组
+            final Class<?> componentType = beanClass.getComponentType();
+            final Object[] result = ArrayUtil.newArray(componentType, columnCount);
+            for(int i = 0,j = 1; i < columnCount; i++, j++) {
+                result[i] = getColumnValue(rs, j, meta.getColumnType(j), componentType);
+            }
+            return (T) result;
+        } else if(Iterable.class.isAssignableFrom(beanClass)) {
+            //集合
+            final Object[] objRow = handleRow(columnCount, meta, rs, Object[].class);
+            return Convert.convert(beanClass, objRow);
+        } else if(beanClass.isAssignableFrom(Entity.class)) {
+            //Entity的父类都可按照Entity返回
+            return (T) handleRow(columnCount, meta, rs);
+        } else if(String.class == beanClass) {
+            //字符串
+            final Object[] objRow = handleRow(columnCount, meta, rs, Object[].class);
+            return (T) StrUtil.join(", ", objRow);
+        }
+
+        //普通bean
+        final T bean = ReflectUtil.newInstanceIfPossible(beanClass);
+        //忽略字段大小写
+        final Map<String, PropDesc> propMap = BeanUtil.getBeanDesc(beanClass).getPropMap(true);
+        String columnLabel;
+        PropDesc pd;
+        Method setter;
+        Object value;
+        for (int i = 1; i <= columnCount; i++) {
+            columnLabel = meta.getColumnLabel(i);
+            pd = propMap.get(columnLabel);
+            if(null == pd) {
+                // 尝试驼峰命名风格
+                pd = propMap.get(StrUtil.toCamelCase(columnLabel));
+            }
+            setter = (null == pd) ? null : pd.getSetter();
+            if(null != setter) {
+                value = getColumnValue(rs, i,  meta.getColumnType(i), TypeUtil.getFirstParamType(setter));
+                ReflectUtil.invokeWithCheck(bean, setter, value);
+            }
+        }
+        return bean;
+    }
+
+    /**
+     * 处理单条数据
+     *
+     * @param columnCount 列数
+     * @param meta ResultSetMetaData
+     * @param rs 数据集
+     * @return 每一行的Entity
+     * @throws SQLException SQL执行异常
+     */
+    public static Entity handleRow(int columnCount, ResultSetMetaData meta, ResultSet rs) throws SQLException {
+        return handleRow(columnCount, meta, rs, false);
+    }
+
+    /**
+     * 处理单条数据
+     *
+     * @param columnCount 列数
+     * @param meta ResultSetMetaData
+     * @param rs 数据集
+     * @param caseInsensitive 是否大小写不敏感
+     * @return 每一行的Entity
+     * @throws SQLException SQL执行异常
+     * @since 4.5.16
+     */
+    public static Entity handleRow(int columnCount, ResultSetMetaData meta, ResultSet rs, boolean caseInsensitive) throws SQLException {
+        return handleRow(new Entity(null, caseInsensitive), columnCount, meta, rs, true);
+    }
+
+    /**
+     * 处理单条数据
+     *
+     * @param <T> Entity及其子对象
+     * @param row Entity对象
+     * @param columnCount 列数
+     * @param meta ResultSetMetaData
+     * @param rs 数据集
+     * @param withMetaInfo 是否包含表名、字段名等元信息
+     * @return 每一行的Entity
+     * @throws SQLException SQL执行异常
+     * @since 3.3.1
+     */
+    public static <T extends Entity> T handleRow(T row, int columnCount, ResultSetMetaData meta, ResultSet rs, boolean withMetaInfo) throws SQLException {
+        int type;
+        for (int i = 1; i <= columnCount; i++) {
+            type = meta.getColumnType(i);
+            row.put(meta.getColumnLabel(i), getColumnValue(rs, i, type, null));
+        }
+        if (withMetaInfo) {
+            try {
+                row.setTableName(meta.getTableName(1));
+            } catch (SQLException ignore){
+                //issue#I2AGLU@Gitee
+                // Hive等NoSQL中无表的概念,此处报错,跳过。
+            }
+            row.setFieldNames(row.keySet());
+        }
+        return row;
+    }
+
+    /**
+     * 处理单条数据
+     *
+     * @param rs 数据集
+     * @return 每一行的Entity
+     * @throws SQLException SQL执行异常
+     */
+    public static Entity handleRow(ResultSet rs) throws SQLException {
+        final ResultSetMetaData meta = rs.getMetaData();
+        final int columnCount = meta.getColumnCount();
+        return handleRow(columnCount, meta, rs);
+    }
+
+    /**
+     * 处理单行数据
+     *
+     * @param rs 数据集(行)
+     * @return 每一行的List
+     * @throws SQLException SQL执行异常
+     * @since 5.1.6
+     */
+    public static List<Object> handleRowToList(ResultSet rs) throws SQLException {
+        final ResultSetMetaData meta = rs.getMetaData();
+        final int columnCount = meta.getColumnCount();
+        final List<Object> row = new ArrayList<>(columnCount);
+        for (int i = 1; i <= columnCount; i++) {
+            row.add(getColumnValue(rs, i, meta.getColumnType(i), null));
+        }
+
+        return row;
+    }
+
+    /**
+     * 处理多条数据
+     *
+     * @param <T> 集合类型
+     * @param rs 数据集
+     * @param collection 数据集
+     * @return Entity列表
+     * @throws SQLException SQL执行异常
+     */
+    public static <T extends Collection<Entity>> T handleRs(ResultSet rs, T collection) throws SQLException {
+        return handleRs(rs, collection, false);
+    }
+
+    /**
+     * 处理多条数据
+     *
+     * @param <T> 集合类型
+     * @param rs 数据集
+     * @param collection 数据集
+     * @param caseInsensitive 是否大小写不敏感
+     * @return Entity列表
+     * @throws SQLException SQL执行异常
+     * @since 4.5.16
+     */
+    public static <T extends Collection<Entity>> T handleRs(ResultSet rs, T collection, boolean caseInsensitive) throws SQLException {
+        final ResultSetMetaData meta = rs.getMetaData();
+        final int columnCount = meta.getColumnCount();
+
+        while (rs.next()) {
+            collection.add(handleRow(columnCount, meta, rs, caseInsensitive));
+        }
+
+        return collection;
+    }
+
+    /**
+     * 处理多条数据并返回一个Bean列表
+     *
+     * @param <E> 集合元素类型
+     * @param <T> 集合类型
+     * @param rs 数据集
+     * @param collection 数据集
+     * @param elementBeanType Bean类型
+     * @return Entity列表
+     * @throws SQLException SQL执行异常
+     * @since 3.1.0
+     */
+    public static <E, T extends Collection<E>> T handleRsToBeanList(ResultSet rs, T collection, Class<E> elementBeanType) throws SQLException {
+        final ResultSetMetaData meta = rs.getMetaData();
+        final int columnCount = meta.getColumnCount();
+
+        while (rs.next()) {
+            collection.add(handleRow(columnCount, meta, rs, elementBeanType));
+        }
+
+        return collection;
+    }
+
+    // -------------------------------------------------------------------------------------------------------------- Private method start
+    /**
+     * 获取字段值<br>
+     * 针对日期时间等做单独处理判断
+     *
+     * @param <T> 返回类型
+     * @param rs {@link ResultSet}
+     * @param columnIndex 字段索引
+     * @param type 字段类型,默认Object
+     * @param targetColumnType 结果要求的类型,需进行二次转换(null或者Object不转换)
+     * @return 字段值
+     * @throws SQLException SQL异常
+     */
+    private static <T> Object getColumnValue(ResultSet rs, int columnIndex, int type, Type targetColumnType) throws SQLException {
+        Object rawValue = null;
+        switch (type) {
+            case Types.TIMESTAMP:
+                try{
+                    rawValue = rs.getTimestamp(columnIndex);
+                } catch (SQLException ignore){
+                    // issue#776@Github
+                    // 当数据库中日期为0000-00-00 00:00:00报错,转为null
+                }
+                break;
+            case Types.TIME:
+                rawValue = rs.getTime(columnIndex);
+                break;
+            case Types.NCLOB:
+                rawValue = rs.getNString(columnIndex);
+                break;
+            case Types.NUMERIC:
+                ResultSetMetaData metaData = rs.getMetaData();
+                if (metaData.getScale(columnIndex) == 0) {
+                    // 没有小数点
+                    if (metaData.getPrecision(columnIndex) > 11) {
+                        // 长度大于11转换成Long类型
+                        rawValue = rs.getLong(columnIndex);
+                    } else {
+                        // 长度小于等于11转成Integer类型
+                        rawValue = rs.getInt(columnIndex);
+                    }
+                } else {
+                    // 有小数点
+                    rawValue = rs.getObject(columnIndex);
+                }
+                break;
+            default:
+                rawValue = rs.getObject(columnIndex);
+        }
+        if (null == targetColumnType || Object.class == targetColumnType) {
+            // 无需转换
+            return rawValue;
+        } else {
+            // 按照返回值要求转换
+            return Convert.convert(targetColumnType, rawValue);
+        }
+    }
+    // -------------------------------------------------------------------------------------------------------------- Private method end
+}

+ 65 - 0
src/main/java/com/xjrsoft/common/handler/XjrLocalTimeTypeHandler.java

@@ -0,0 +1,65 @@
+package com.xjrsoft.common.handler;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.extension.toolkit.JdbcUtils;
+import com.xjrsoft.common.utils.LocalDateTimeUtil;
+import oracle.sql.INTERVALDS;
+import org.apache.ibatis.type.BaseTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.time.LocalTime;
+
+public class XjrLocalTimeTypeHandler extends BaseTypeHandler<LocalTime> {
+    @Override
+    public void setNonNullParameter(PreparedStatement ps, int i, LocalTime localTime, JdbcType jdbcType)
+            throws SQLException {
+        DbType dbType = JdbcUtils.getDbType(ps.getConnection().getMetaData().getURL());
+        if (dbType == DbType.ORACLE || dbType == DbType.ORACLE_12C) {
+            // oracle时间类型处理
+            ps.setObject(i, new INTERVALDS(StringPool.ZERO + StringPool.SPACE + LocalDateTimeUtil.format(localTime) + StringPool.DOT + StringPool.ZERO));
+        } else {
+            ps.setObject(i, localTime);
+        }
+    }
+
+    @Override
+    public LocalTime getNullableResult(ResultSet rs, String columnName) throws SQLException {
+        Object object = rs.getObject(columnName);
+        if (object == null) {
+            return null;
+        }
+        if (object instanceof INTERVALDS) {
+            return LocalDateTimeUtil.convertIntervalToLocalTime((INTERVALDS) object);
+        }
+        return rs.getObject(columnName, LocalTime.class);
+    }
+
+    @Override
+    public LocalTime getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
+        Object object = rs.getObject(columnIndex);
+        if (object == null) {
+            return null;
+        }
+        if (object instanceof INTERVALDS) {
+            return LocalDateTimeUtil.convertIntervalToLocalTime((INTERVALDS) object);
+        }
+        return rs.getObject(columnIndex, LocalTime.class);
+    }
+
+    @Override
+    public LocalTime getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
+        Object object = cs.getObject(columnIndex);
+        if (object == null) {
+            return null;
+        }
+        if (object instanceof INTERVALDS) {
+            return LocalDateTimeUtil.convertIntervalToLocalTime((INTERVALDS) object);
+        }
+        return cs.getObject(columnIndex, LocalTime.class);
+    }
+}

+ 55 - 0
src/main/java/com/xjrsoft/common/handler/XjrPageResultHandler.java

@@ -0,0 +1,55 @@
+package com.xjrsoft.common.handler;
+
+import cn.hutool.db.Entity;
+import cn.hutool.db.PageResult;
+import cn.hutool.db.handler.RsHandler;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+public class XjrPageResultHandler implements RsHandler<PageResult<Entity>> {
+
+    private final PageResult<Entity> pageResult;
+    /**
+     * 是否大小写不敏感
+     */
+    private final boolean caseInsensitive;
+
+    /**
+     * 创建一个 EntityHandler对象<br>
+     * 结果集根据给定的分页对象查询数据库,填充结果
+     *
+     * @param pageResult 分页结果集空对象
+     * @return EntityHandler对象
+     */
+    public static XjrPageResultHandler create(PageResult<Entity> pageResult) {
+        return new XjrPageResultHandler(pageResult);
+    }
+
+    /**
+     * 构造<br>
+     * 结果集根据给定的分页对象查询数据库,填充结果
+     *
+     * @param pageResult 分页结果集空对象
+     */
+    public XjrPageResultHandler(PageResult<Entity> pageResult) {
+        this(pageResult, false);
+    }
+
+    /**
+     * 构造<br>
+     * 结果集根据给定的分页对象查询数据库,填充结果
+     *
+     * @param pageResult      分页结果集空对象
+     * @param caseInsensitive 是否大小写不敏感
+     */
+    public XjrPageResultHandler(PageResult<Entity> pageResult, boolean caseInsensitive) {
+        this.pageResult = pageResult;
+        this.caseInsensitive = caseInsensitive;
+    }
+
+    @Override
+    public PageResult<Entity> handle(ResultSet rs) throws SQLException {
+        return XjrHandleHelper.handleRs(rs, pageResult, this.caseInsensitive);
+    }
+}

+ 1 - 2
src/main/java/com/xjrsoft/common/interceptor/MagicApiRequestInterceptor.java

@@ -4,7 +4,6 @@ import cn.dev33.satoken.exception.NotPermissionException;
 import cn.dev33.satoken.session.SaSession;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.dev33.satoken.strategy.SaStrategy;
-import com.github.xiaoymin.knife4j.core.util.CommonUtils;
 import com.xjrsoft.common.constant.GlobalConstant;
 import com.xjrsoft.common.enums.ResponseCode;
 import com.xjrsoft.common.model.result.R;
@@ -45,7 +44,7 @@ public class MagicApiRequestInterceptor implements RequestInterceptor {
 		//非管理员需要进行权限验证
 		if(!roleIds.contains(GlobalConstant.SUPER_ADMIN_ROLE_ID)) {
 			if (!SaStrategy.me.hasElement.apply(tokenSession.get(GlobalConstant.LOGIN_USER_INTERFACE_AUTH_CODE_KEY, new ArrayList<>()), requestEntity.getApiInfo().getId())) {
-				throw new NotPermissionException(requestEntity.getApiInfo().getName(), StpUtil.getLoginType());
+				return R.error(ResponseCode.MAGIC_API_UN_AUTHORIZED.getCode(), ResponseCode.MAGIC_API_UN_AUTHORIZED.getMessage());
 			}
 		}
 		return null;

+ 1 - 1
src/main/java/com/xjrsoft/common/interceptor/MagicApiWebLoginInterceptor.java

@@ -53,7 +53,7 @@ public class MagicApiWebLoginInterceptor implements HandlerInterceptor {
             return !ObjectUtil.isNull(loginIdByToken);
         }
 
-//        return true;
+
 
     }
 }

+ 24 - 0
src/main/java/com/xjrsoft/common/runner/DataAuthRunner.java

@@ -1,5 +1,6 @@
 package com.xjrsoft.common.runner;
 
+import cn.hutool.json.JSONUtil;
 import com.xjrsoft.common.constant.GlobalConstant;
 import com.xjrsoft.common.utils.RedisUtil;
 import com.xjrsoft.module.authority.entity.DataAuth;
@@ -14,6 +15,10 @@ import com.xjrsoft.module.system.entity.DictionaryDetail;
 import com.xjrsoft.module.system.entity.DictionaryItem;
 import com.xjrsoft.module.system.service.IDictionarydetailService;
 import com.xjrsoft.module.system.service.IDictionaryitemService;
+import com.xjrsoft.module.workflow.entity.WorkflowSchema;
+import com.xjrsoft.module.workflow.model.WorkflowSchemaConfig;
+import com.xjrsoft.module.workflow.service.IWorkflowSchemaService;
+import com.xjrsoft.module.workflow.utils.WorkFlowUtil;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.boot.CommandLineRunner;
@@ -21,6 +26,7 @@ import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
 
 import java.util.List;
+import java.util.concurrent.CompletableFuture;
 
 /**
  * @Description 加载数据权限 缓存
@@ -42,6 +48,7 @@ public class DataAuthRunner  implements CommandLineRunner {
 
     private IDataAuthTableRelationService dataAuthTableRelationService;
 
+    private IWorkflowSchemaService workflowSchemaService;
 
     @Override
     public void run(String... args) {
@@ -49,6 +56,7 @@ public class DataAuthRunner  implements CommandLineRunner {
         loadDataAuthConfigCache();
         loadDataAuthRelationCache();
         loadDataAuthTableRelationCache();
+        loadEventCache();
     }
 
     @Async
@@ -82,4 +90,20 @@ public class DataAuthRunner  implements CommandLineRunner {
         redisUtil.set(GlobalConstant.DATA_AUTH_TABLE_RELATION_CACHE_KEY, list);
         log.info("XJRSOFT: 加载所有数据权限与表关联缓存结束");
     }
+
+    @Async
+    void loadEventCache() {
+        log.info("XJRSOFT: 加载所有工作流模板开始与结束事件缓存开始");
+        List<WorkflowSchema> list = workflowSchemaService.list();
+        for (WorkflowSchema workflowSchema : list) {
+            //获取到整个流程模板的配置
+            WorkflowSchemaConfig workflowSchemaConfig = JSONUtil.toBean(workflowSchema.getJsonContent(), WorkflowSchemaConfig.class);
+            CompletableFuture.runAsync(() -> {
+                //先删除,后新增
+                WorkFlowUtil.removeNodeListener(workflowSchema.getDeploymentId());
+                WorkFlowUtil.cacheNodeListener(workflowSchema.getDeploymentId(), workflowSchemaConfig.getChildNodeConfig());
+            });
+        }
+        log.info("XJRSOFT: 加载所有工作流模板开始与结束事件缓存结束");
+    }
 }

+ 2 - 27
src/main/java/com/xjrsoft/common/runner/DicCacheRunner.java

@@ -1,19 +1,12 @@
 package com.xjrsoft.common.runner;
 
-import com.xjrsoft.common.constant.GlobalConstant;
-import com.xjrsoft.common.utils.RedisUtil;
-import com.xjrsoft.module.system.entity.DictionaryDetail;
-import com.xjrsoft.module.system.entity.DictionaryItem;
 import com.xjrsoft.module.system.service.IDictionarydetailService;
 import com.xjrsoft.module.system.service.IDictionaryitemService;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.boot.CommandLineRunner;
-import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
 
-import java.util.List;
-
 /**
  * 默认缓存数据字典
  *
@@ -25,8 +18,6 @@ import java.util.List;
 @Slf4j
 public class DicCacheRunner implements CommandLineRunner {
 
-    private RedisUtil redisUtil;
-
     private IDictionaryitemService dictionaryitemService;
 
     private IDictionarydetailService dictionarydetailService;
@@ -34,24 +25,8 @@ public class DicCacheRunner implements CommandLineRunner {
 
     @Override
     public void run(String... args) {
-        loadDicItemCache();
-        loadDicDetailCache();
-    }
-
-    @Async
-    void loadDicItemCache() {
-        log.info("XJRSOFT: 加载所有数据字典项目缓存开始");
-        List<DictionaryItem> list = dictionaryitemService.list();
-        redisUtil.set(GlobalConstant.DIC_ITEM_CACHE_KEY, list);
-        log.info("XJRSOFT: 加载所有数据字典项目缓存结束");
-    }
-
-    @Async
-    void loadDicDetailCache() {
-        log.info("XJRSOFT: 加载所有数据字典详情缓存开始");
-        List<DictionaryDetail> list = dictionarydetailService.list();
-        redisUtil.set(GlobalConstant.DIC_DETAIL_CACHE_KEY, list);
-        log.info("XJRSOFT: 加载所有数据字典详情缓存结束");
+        dictionaryitemService.loadCaches();
+        dictionarydetailService.loadCaches();
     }
 
 }

+ 31 - 0
src/main/java/com/xjrsoft/common/runner/XjrSqlConnRunner.java

@@ -0,0 +1,31 @@
+package com.xjrsoft.common.runner;
+
+import cn.hutool.db.Entity;
+import cn.hutool.db.Page;
+import cn.hutool.db.PageResult;
+import cn.hutool.db.SqlConnRunner;
+import cn.hutool.db.dialect.Dialect;
+import cn.hutool.db.handler.PageResultHandler;
+import cn.hutool.db.sql.SqlBuilder;
+import com.xjrsoft.common.handler.XjrPageResultHandler;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+
+public class XjrSqlConnRunner extends SqlConnRunner {
+    public XjrSqlConnRunner(Dialect dialect) {
+        super(dialect);
+    }
+
+    public XjrSqlConnRunner(String driverClassName) {
+        super(driverClassName);
+    }
+
+    @Override
+    public PageResult<Entity> page(Connection conn, SqlBuilder sqlBuilder, Page page) throws SQLException {
+        final XjrPageResultHandler pageResultHandler = new XjrPageResultHandler(
+                new PageResult<>(page.getPageNumber(), page.getPageSize(), (int) count(conn, sqlBuilder)),
+                this.caseInsensitive);
+        return page(conn, sqlBuilder, page, pageResultHandler);
+    }
+}

+ 44 - 7
src/main/java/com/xjrsoft/common/utils/DatasourceUtil.java

@@ -53,7 +53,11 @@ public class DatasourceUtil {
      */
     public static DataSource getDataSource(String id) {
         DynamicRoutingDataSource dynamicRoutingDataSource = SpringUtil.getBean(DynamicRoutingDataSource.class);
-        return dynamicRoutingDataSource.getDataSource(id);
+        try {
+            return dynamicRoutingDataSource.getDataSource(id);
+        } catch (Exception e) {
+            throw new RuntimeException("获取数据源失败: " + id);
+        }
     }
 
     public static DbType getDataSourceMasterDbType() {
@@ -184,6 +188,7 @@ public class DatasourceUtil {
             case DM:
             case DB2:
                 return wrapperCreateTableSqlForOracle(tableStructureConfigs);
+            case SQL_SERVER2005:
             case SQL_SERVER:
                 return wrapperCreateTableSqlForSqlServer(tableStructureConfigs);
             case POSTGRE_SQL:
@@ -221,7 +226,7 @@ public class DatasourceUtil {
                 switch (fieldType) {
                     //普通文本
                     case VARCHAR:
-                        sb.append(tableFieldConfig.getFieldName()).append(" ").append(type).append("(").append(tableFieldConfig.getFieldLength()).append(") ").append(" COMMENT '").append(tableFieldConfig.getFieldComment()).append("', \n");;
+                        sb.append(tableFieldConfig.getFieldName()).append(" ").append(type).append("(").append(tableFieldConfig.getFieldLength()).append(") COMMENT '" + tableFieldConfig.getFieldComment() + "',  \n");
                         break;
                     //长文本
                     case VARCHARMAX:
@@ -288,6 +293,8 @@ public class DatasourceUtil {
                         break;
                     //数字
                     case INT:
+                        sb.append(tableFieldConfig.getFieldName()).append(" ").append(type).append("(11, 0),  \n");
+                        break;
                     //长数字
                     case LONG:
                         sb.append(tableFieldConfig.getFieldName()).append(" ").append(type).append("(20, 0),  \n");
@@ -298,6 +305,8 @@ public class DatasourceUtil {
                         break;
                     //长文本
                     case VARCHARMAX:
+                        sb.append(tableFieldConfig.getFieldName()).append(" ").append(type).append("(2000),  \n");
+                        break;
                     //日期
                     case DATE:
                     case DATETIME:
@@ -313,12 +322,12 @@ public class DatasourceUtil {
             }
             //如果不是主表 默认需要新增主表关联字段 用于关联主表  默认字段名为 parent + _id
             if(!tableStructureConfig.getIsMain()){
-                sb.append("  `").append(GlobalConstant.DEFAULT_FK).append("` NUMBER(20, 0), \n");
+                sb.append("  ").append(GlobalConstant.DEFAULT_FK).append(" NUMBER(20, 0), \n");
             }
 
 
             sb.append("  PRIMARY KEY (").append(GlobalConstant.DEFAULT_PK).append(") \n");
-            sb.append("); \n");
+            sb.append(") \n");
 
             sqls.add(sb.toString());
         }
@@ -379,7 +388,7 @@ public class DatasourceUtil {
 
             //如果不是主表 默认需要新增主表关联字段 用于关联主表  默认字段名为 parent + _id
             if(!tableStructureConfig.getIsMain()){
-                sb.append("  `").append(GlobalConstant.DEFAULT_FK).append("` bigint , \n");
+                sb.append("  ").append(GlobalConstant.DEFAULT_FK).append(" bigint , \n");
             }
 
             sb.append("  PRIMARY KEY (").append(GlobalConstant.DEFAULT_PK).append(") \n");
@@ -439,13 +448,21 @@ public class DatasourceUtil {
             }
             //如果不是主表 默认需要新增主表关联字段 用于关联主表  默认字段名为 parent + _id
             if(!tableStructureConfig.getIsMain()){
-                sb.append("  `").append(GlobalConstant.DEFAULT_FK).append("` ").append(PostgreSqlFieldsType.FK.getType()).append(" , \n");
+                sb.append("  ").append(GlobalConstant.DEFAULT_FK).append(" ").append(PostgreSqlFieldsType.FK.getType()).append(" , \n");
             }
 
             sb.append("  PRIMARY KEY (").append(GlobalConstant.DEFAULT_PK).append(") \n");
             sb.append("); \n");
             sqls.add(sb.toString());
         }
+        for (TableStructureConfig tableStructureConfig : tableStructureConfigs) {
+            List<TableFieldConfig> tableFieldConfigs = tableStructureConfig.getTableFieldConfigs();
+            //遍历当前表配置的 字段配置
+            for (TableFieldConfig tableFieldConfig : tableFieldConfigs) {
+                sqls.add("COMMENT ON COLUMN " + tableStructureConfig.getTableName() + "." + tableFieldConfig.getFieldName() + " IS '" + tableFieldConfig.getFieldComment() + "'");
+            }
+
+        }
         return sqls;
     }
 
@@ -510,11 +527,15 @@ public class DatasourceUtil {
     }
 
     public static Boolean testConnection(String url, String userName, String password) {
+        Connection conn = null;
         try (SimpleDataSource ds = new SimpleDataSource(url, userName, password)) {
-            DbUtil.use(ds).query(wrapperTestSql(JdbcUtils.getDbType(url)));
+            ds.setLoginTimeout(5);
+            conn = ds.getConnection();
         } catch (Exception e) {
             log.error("数据库连接失败!url: " + url, e);
             return false;
+        } finally {
+            DbUtil.close(conn);
         }
         return true;
     }
@@ -536,4 +557,20 @@ public class DatasourceUtil {
                 return MySqlFieldsType.getFieldType(typeCode).getType();
         }
     }
+
+    public static DbType getDbType(String datasourceId) {
+        DataSource dataSource = getDataSource(datasourceId);
+        if (dataSource != null) {
+            Connection connection = null;
+            try {
+                connection = dataSource.getConnection();
+                return JdbcUtils.getDbType(connection.getMetaData().getURL());
+            } catch (Exception e) {
+                log.error("获取数据库类型失败!", e);
+            } finally {
+                DbUtil.close(connection);
+            }
+        }
+        return null;
+    }
 }

+ 31 - 70
src/main/java/com/xjrsoft/common/utils/DingtalkUtil.java

@@ -1,15 +1,15 @@
 package com.xjrsoft.common.utils;
 
 
+import com.aliyun.dingtalkcontact_1_0.Client;
+import com.aliyun.dingtalkcontact_1_0.models.GetUserResponse;
+import com.aliyun.dingtalkoauth2_1_0.models.GetUserTokenRequest;
+import com.aliyun.dingtalkoauth2_1_0.models.GetUserTokenResponse;
 import com.dingtalk.api.DefaultDingTalkClient;
 import com.dingtalk.api.DingTalkClient;
 import com.dingtalk.api.request.OapiGettokenRequest;
-import com.dingtalk.api.request.OapiV2DepartmentListsubRequest;
-import com.dingtalk.api.request.OapiV2UserListRequest;
 import com.dingtalk.api.response.OapiGettokenResponse;
-import com.dingtalk.api.response.OapiV2DepartmentListsubResponse;
-import com.dingtalk.api.response.OapiV2UserListResponse;
-import com.taobao.api.ApiException;
+import lombok.SneakyThrows;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 
@@ -18,77 +18,38 @@ import java.util.List;
 
 @Component
 public class DingtalkUtil {
-    @Value("${xjrsoft.dingtalk.appKey}")
-    public  String appKey;
 
-    @Value("${xjrsoft.dingtalk.appSecret}")
-    public  String appSecret;
-    
 
-
-    //获取token
-    public  String getToken() {
-        OapiGettokenResponse response = new OapiGettokenResponse();
-        try {
-            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
-            OapiGettokenRequest request = new OapiGettokenRequest();
-            request.setAppkey(appKey);
-            request.setAppsecret(appSecret);
-            request.setHttpMethod("GET");
-            response = client.execute(request);
-        } catch (ApiException e) {
-            e.printStackTrace();
-        }
-       String token = response.getAccessToken();
-        return token;
+    /**
+     * 使用 Token 初始化账号Client
+     * @return Client
+     * @throws Exception
+     */
+    public static com.aliyun.dingtalkcontact_1_0.Client createClient() throws Exception {
+        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
+        config.protocol = "https";
+        config.regionId = "central";
+        return new com.aliyun.dingtalkcontact_1_0.Client(config);
     }
 
+    @SneakyThrows
+    public static GetUserTokenResponse getToken(String unionId,String code){
 
-    //根据所有部门信息
-    public  List<OapiV2DepartmentListsubResponse.DeptBaseResponse> getDepartmentList(Long dept_id) throws Exception {
-        String token = this.getToken();
-        List<OapiV2DepartmentListsubResponse.DeptBaseResponse> deptBaseResponselist=new ArrayList<>();
-        try {
-            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/listsub");
-            OapiV2DepartmentListsubRequest req = new OapiV2DepartmentListsubRequest();
-            req.setDeptId(dept_id);
-            req.setLanguage("zh_CN");
-            OapiV2DepartmentListsubResponse response = client.execute(req, token);
-            if(!response.isSuccess()){
-                throw new Exception(response.getErrmsg());
-            }
-            deptBaseResponselist=response.getResult();
-        } catch (Exception e) {
-         throw new Exception(e.getMessage());
-        }
-        return deptBaseResponselist;
-    }
 
-    //获取部门的所有用户信息
-    public  List<OapiV2UserListResponse.ListUserResponse> getDepartmentUser(Long dept_id) {
-        String token = this.getToken();
-        List<OapiV2UserListResponse.ListUserResponse> userResponselist=new ArrayList<>();
-        try {
-            Long cursor=0L;
-            Boolean hasMore=true;
-            while (hasMore) {
-                DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/list");
-                OapiV2UserListRequest req = new OapiV2UserListRequest();
-                req.setDeptId(dept_id);
-                req.setCursor(cursor);
-                req.setSize(100L);
-                req.setOrderField("modify_desc");
-                req.setContainAccessLimit(false);
-                req.setLanguage("zh_CN");
-                OapiV2UserListResponse rsp = client.execute(req, token);
-                userResponselist.addAll(rsp.getResult().getList());
-                hasMore=rsp.getResult().getHasMore();
-                cursor=rsp.getResult().getNextCursor();
-            }
-        } catch (ApiException e) {
-            e.printStackTrace();
-        }
-        return userResponselist;
+
+        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
+        config.protocol = "https";
+        config.regionId = "central";
+        com.aliyun.dingtalkoauth2_1_0.Client client = new com.aliyun.dingtalkoauth2_1_0.Client(config);
+
+        GetUserTokenRequest getUserTokenRequest = new GetUserTokenRequest()
+                .setClientId("dingaex2gok1rllumlqs")
+                .setClientSecret("Nv2pe-UoR0Z_Iw8d29laZfL3kH6ElmhZpRdPwI7SvmKJmaCI29qCrSlFEiMM88MB")
+                .setCode(code)
+                .setRefreshToken(code)
+                .setGrantType("authorization_code");
+
+        return client.getUserToken(getUserTokenRequest);
     }
 
 

+ 22 - 2
src/main/java/com/xjrsoft/common/utils/JdbcToJavaUtil.java

@@ -1,7 +1,11 @@
 package com.xjrsoft.common.utils;
 
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.db.meta.Column;
 import cn.hutool.db.meta.JdbcType;
 import cn.hutool.db.meta.MetaUtil;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
 
 import java.sql.JDBCType;
 import java.sql.Timestamp;
@@ -16,8 +20,8 @@ public class JdbcToJavaUtil {
     /**
      * 根据jdbc类型 返回java类型字符串
      */
-    public static String getClassName(JdbcType type) {
-
+    public static String getClassName(Column column) {
+        JdbcType type = ObjectUtils.defaultIfNull(column.getTypeEnum(), JdbcType.NULL);
         switch (type) {
             case BIT:
                 return "Boolean";
@@ -36,10 +40,18 @@ public class JdbcToJavaUtil {
                 return "Double";
             case NUMERIC:
             case DECIMAL:
+                if (column.getDigit() == 0) {
+                    if (column.getSize() > 11) {
+                        return "Long";
+                    } else {
+                        return "Integer";
+                    }
+                }
                 return "BigDecimal";
             case CHAR:
             case VARCHAR:
             case LONGVARCHAR:
+            case NVARCHAR:
                 return "String";
             case DATE:
             case TIMESTAMP:
@@ -47,11 +59,19 @@ public class JdbcToJavaUtil {
             case TIME:
                 return "LocalTime";
             case BINARY:
+            case CLOB:
+            case BLOB:
             case VARBINARY:
             case LONGVARBINARY:
                 return "Byte[]";
             case DATETIMEOFFSET:
             default:
+                if (StrUtil.equalsIgnoreCase(column.getTypeName(), "NVARCHAR2")
+                        || StrUtil.equalsIgnoreCase(column.getTypeName(), "NCLOB")) {
+                    return "String";
+                } else if (StrUtil.startWithIgnoreCase(column.getTypeName(), "INTERVAL DAY")) {
+                    return "LocalTime";
+                }
                 return "Object";
 
         }

+ 46 - 0
src/main/java/com/xjrsoft/common/utils/LocalDateTimeUtil.java

@@ -1,7 +1,9 @@
 package com.xjrsoft.common.utils;
 
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.annotation.DbType;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import oracle.sql.INTERVALDS;
 import org.apache.commons.lang3.StringUtils;
 
 import java.time.*;
@@ -84,4 +86,48 @@ public final class LocalDateTimeUtil {
         }
         return time.format(DateTimeFormatter.ofPattern(LOCAL_TIME_FORMAT));
     }
+
+    /**
+     * 将时间字符串转换成数据库对应的时间类型
+     * @param time 时间字符串 格式 HH:mm:ss
+     * @param dbType 数据库类型
+     * @return 据库对应的时间类型对象
+     */
+    public static Object parseDbTime(String time, DbType dbType) {
+        if (dbType == DbType.ORACLE || dbType == DbType.ORACLE_12C) {
+            return new INTERVALDS("0 " + time + ".0");
+        } else {
+            return parseTime(time);
+        }
+    }
+
+    public static LocalDateTime parseDateByLength(String value) {
+        if (StrUtil.isNotBlank(value)) {
+            value = value.trim();
+            int length = value.length();
+            if (LOCAL_DATE_FORMAT.length() == length) {
+                LocalDate localDate = LocalDate.parse(value, DateTimeFormatter.ofPattern(LOCAL_DATE_FORMAT));
+                return LocalDateTime.from(localDate.atStartOfDay());
+            } else if (LOCAL_DATE_TIME_FORMAT.length() == length) {
+                return LocalDateTime.parse(value, DateTimeFormatter.ofPattern(LOCAL_DATE_TIME_FORMAT));
+            } else if (YEAR_MONTH_FORMAT.length() == length) {
+                YearMonth yearMonth = YearMonth.parse(value, DateTimeFormatter.ofPattern(YEAR_MONTH_FORMAT));
+                return LocalDateTime.from(yearMonth.atDay(1).atStartOfDay());
+            } else if (YEAR_FORMAT.length() == length) {
+                Year year = Year.parse(value, DateTimeFormatter.ofPattern(YEAR_FORMAT));
+                return LocalDateTime.from(year.atDay(1).atStartOfDay());
+            }
+        }
+        return null;
+    }
+
+    public static LocalTime convertIntervalToLocalTime(INTERVALDS intervalDS) {
+        if (intervalDS == null) {
+            return null;
+        }
+        String str = intervalDS.stringValue();
+        String timeStr = str.substring(str.indexOf(StringPool.SPACE) + 1, str.indexOf(StringPool.DOT));
+        String[] array = timeStr.split(StringPool.COLON);
+        return LocalTime.of(Integer.parseInt(array[0]), Integer.parseInt(array[1]), Integer.parseInt(array[2]));
+    }
 }

+ 0 - 1
src/main/java/com/xjrsoft/common/utils/RedisUtil.java

@@ -140,7 +140,6 @@ public class RedisUtil {
             return String.valueOf(object);
         }
         return GSON.toJson(object);
-//        return JSONUtil.toJsonStr(object);
     }
 
     /**

+ 2 - 2
src/main/java/com/xjrsoft/common/utils/TreeUtil.java

@@ -40,7 +40,7 @@ public class TreeUtil {
                 notParents.add(node.getId().toString());
             }
 
-            if (!StrUtil.isEmptyIfStr(parentId) || !StrUtil.equals(String.valueOf(parentId), GlobalConstant.FIRST_NODE_VALUE)) {
+            if (!StrUtil.isEmptyIfStr(parentId) || !StrUtil.equals(String.valueOf(parentId), String.valueOf(GlobalConstant.FIRST_NODE_VALUE))) {
                 items.stream().filter(x -> StrUtil.equals(x.getId().toString(), String.valueOf(parentId)))
                         .findAny()
                         .ifPresent(parentNode -> {
@@ -54,7 +54,7 @@ public class TreeUtil {
 
         });
 
-        return items.stream().filter(x -> StrUtil.isEmptyIfStr(x.getParentId()) || StrUtil.equals(String.valueOf(x.getParentId()), GlobalConstant.FIRST_NODE_VALUE) || notParents.contains(x.getId().toString())).collect(Collectors.toList());
+        return items.stream().filter(x -> StrUtil.isEmptyIfStr(x.getParentId()) || StrUtil.equals(String.valueOf(x.getParentId()), String.valueOf(GlobalConstant.FIRST_NODE_VALUE)) || notParents.contains(x.getId().toString())).collect(Collectors.toList());
     }
 
 }

+ 8 - 2
src/main/java/com/xjrsoft/common/xss/XssHttpServletRequestWrapper.java

@@ -1,9 +1,11 @@
 package com.xjrsoft.common.xss;
 
+import cn.hutool.core.collection.ListUtil;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.MediaType;
+import org.springframework.util.AntPathMatcher;
 
 import javax.servlet.ReadListener;
 import javax.servlet.ServletInputStream;
@@ -13,6 +15,7 @@ import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -25,6 +28,8 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
      * 没被包装过的HttpServletRequest(特殊场景,需要自己过滤)
      */
     HttpServletRequest orgRequest;
+
+    private final List<String> ignoreXssUrl = ListUtil.toList("/magic-api/**");
     //html过滤
     private final static HTMLFilter HTML_FILTER = new HTMLFilter();
 
@@ -45,9 +50,10 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
         if (StringUtils.isBlank(json)) {
             return super.getInputStream();
         }
+        AntPathMatcher matcher = new AntPathMatcher();
 
-        if(!orgRequest.getRequestURI().contains("/magic/") && !orgRequest.getRequestURI().contains("/magic-api/")){
-            //xss过滤
+        if(ignoreXssUrl.stream().noneMatch(url -> matcher.matchStart(url,orgRequest.getRequestURI()))){
+            //xss过滤 orgRequest.getRequestURI()
             json = xssEncode(json);
         }
         final ByteArrayInputStream bis = new ByteArrayInputStream(json.getBytes(StandardCharsets.UTF_8));

+ 41 - 0
src/main/java/com/xjrsoft/config/DingtalkConfig.java

@@ -0,0 +1,41 @@
+package com.xjrsoft.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Author: tzx
+ * @Date: 2023/8/9 16:51
+ */
+@Data
+@Component
+@ConfigurationProperties("xjrsoft.dingtalk")
+public class DingtalkConfig {
+
+
+    /**
+     * appkey 或者 clientId
+     */
+    private String appKey;
+
+    /**
+     * appSecret 或者 clientSecret
+     */
+    private String appSecret;
+
+    /**
+     * agentid
+     */
+    private String agentid;
+
+    /**
+     * redirectUri 回调地址
+     */
+    private String redirectUri;
+
+    /**
+     * frontUrl 回调地址
+     */
+    private String frontUrl;
+}

+ 24 - 23
src/main/java/com/xjrsoft/config/JacksonConfig.java

@@ -1,7 +1,5 @@
 package com.xjrsoft.config;
 
-import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ReflectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.excel.converters.ConverterKeyBuild;
@@ -9,16 +7,18 @@ import com.alibaba.excel.converters.DefaultConverterLoader;
 import com.fasterxml.jackson.annotation.JsonAutoDetect;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.core.JsonGenerator;
 import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.DeserializationContext;
 import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
 import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
 import com.xjrsoft.common.handler.EasyExcelLocalDateTimeConverter;
 import com.xjrsoft.common.utils.LocalDateTimeUtil;
 import lombok.SneakyThrows;
+import oracle.sql.INTERVALDS;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
@@ -28,9 +28,10 @@ import org.springframework.core.convert.converter.Converter;
 
 import java.io.IOException;
 import java.lang.reflect.Field;
-import java.time.*;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.time.format.DateTimeFormatter;
-import java.util.Date;
 
 /**
  * @Author: tzx
@@ -52,7 +53,9 @@ public class JacksonConfig {
         return builder -> {
             builder.serializerByType(Long.class, ToStringSerializer.instance);
             builder.serializerByType(Long.TYPE, ToStringSerializer.instance);
+            builder.serializerByType(BigDecimal.class, ToStringSerializer.instance);
             builder.serializerByType(LocalDateTime.class, localDateTimeSerializer());
+            builder.serializerByType(INTERVALDS.class, intervalDSSerializer());
             builder.deserializerByType(LocalDateTime.class, localDateTimeDeserializer());
             builder.visibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
             builder.visibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE);
@@ -70,6 +73,20 @@ public class JacksonConfig {
         return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(pattern));
     }
 
+    /**
+     * oracle字段类型INTERVALDS格式化
+     * @return
+     */
+    @Bean
+    public JsonSerializer<INTERVALDS> intervalDSSerializer() {
+        return new JsonSerializer<INTERVALDS>() {
+            @Override
+            public void serialize(INTERVALDS time, JsonGenerator g, SerializerProvider provider) throws IOException {
+                g.writeString(LocalDateTimeUtil.convertIntervalToLocalTime(time).format(DateTimeFormatter.ISO_LOCAL_TIME));
+            }
+        };
+    }
+
     /**
      * localDatetime格式化
      * @return
@@ -108,23 +125,7 @@ public class JacksonConfig {
         return new Converter<String, LocalDateTime>() {
             @Override
             public LocalDateTime convert(String value) {
-                if (StrUtil.isNotBlank(value)) {
-                    value = value.trim();
-                    int length = value.length();
-                    if (10 == length) {
-                        LocalDate localDate = LocalDate.parse(value, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
-                        return LocalDateTime.from(localDate.atStartOfDay());
-                    } else if (19 == length) {
-                        return LocalDateTime.parse(value, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
-                    } else if (7 == length) {
-                        YearMonth yearMonth = YearMonth.parse(value, DateTimeFormatter.ofPattern("yyyy-MM"));
-                        return LocalDateTime.from(yearMonth.atDay(1).atStartOfDay());
-                    } else if (4 == length) {
-                        Year year = Year.parse(value, DateTimeFormatter.ofPattern("yyyy"));
-                        return LocalDateTime.from(year.atDay(1).atStartOfDay());
-                    }
-                }
-                return null;
+                return LocalDateTimeUtil.parseDateByLength(value);
             }
         };
     }

+ 3 - 0
src/main/java/com/xjrsoft/config/MybatisPlusConfig.java

@@ -18,6 +18,7 @@ import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerIntercep
 import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
 import com.xjrsoft.common.constant.GlobalConstant;
 import com.xjrsoft.common.handler.MyLocalDateTimeTypeHandler;
+import com.xjrsoft.common.handler.XjrLocalTimeTypeHandler;
 import com.xjrsoft.common.interceptor.DataScopeInnerInterceptor;
 import com.xjrsoft.common.utils.DatasourceUtil;
 import lombok.extern.slf4j.Slf4j;
@@ -34,6 +35,7 @@ import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Properties;
@@ -231,6 +233,7 @@ public class MybatisPlusConfig {
                 configuration.getTypeAliasRegistry().registerAlias("BooleanTypeHandler", BooleanTypeHandler.class);
                 configuration.getTypeAliasRegistry().registerAlias("AbstractJsonTypeHandler", AbstractJsonTypeHandler.class);
                 configuration.getTypeHandlerRegistry().register(LocalDateTime.class, MyLocalDateTimeTypeHandler.class);
+                configuration.getTypeHandlerRegistry().register(LocalTime.class, XjrLocalTimeTypeHandler.class);
             }
         };
     }

+ 41 - 0
src/main/java/com/xjrsoft/config/WechatEnterpriseConfig.java

@@ -0,0 +1,41 @@
+package com.xjrsoft.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Author: tzx
+ * @Date: 2023/8/9 16:51
+ */
+@Data
+@Component
+@ConfigurationProperties("xjrsoft.wechatenterprise")
+public class WechatEnterpriseConfig {
+
+
+    /**
+     * appkey 或者 clientId
+     */
+    private String appKey;
+
+    /**
+     * appSecret 或者 clientSecret
+     */
+    private String appSecret;
+
+    /**
+     * agentid
+     */
+    private String agentid;
+
+    /**
+     * redirectUri 回调地址
+     */
+    private String redirectUri;
+
+    /**
+     * frontUrl 回调地址
+     */
+    private String frontUrl;
+}

+ 10 - 0
src/main/java/com/xjrsoft/config/XjrSmsConfig.java

@@ -13,6 +13,16 @@ import java.util.List;
 @ConfigurationProperties("xjrsoft.sms")
 public class XjrSmsConfig {
 
+    /**
+     * 短信限制时间(单位:小时,正整数)
+     */
+    private Integer limitTime;
+
+    /**
+     * 短信限制次数,与limitTime一起使用,限制时长内允许发送的次数
+     */
+    private Integer limitCount;
+
     /**
      * 云平台 服务提供商
      */

+ 142 - 0
src/main/java/com/xjrsoft/module/app/controller/AppFuncDesignController.java

@@ -0,0 +1,142 @@
+package com.xjrsoft.module.app.controller;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.yulichang.toolkit.MPJWrappers;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.annotation.XjrLog;
+import com.xjrsoft.common.constant.GlobalConstant;
+import com.xjrsoft.common.model.result.R;
+import com.xjrsoft.common.page.ConventPage;
+import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.app.dto.*;
+import com.xjrsoft.module.app.entity.AppFuncDesign;
+import com.xjrsoft.module.app.entity.AppMenu;
+import com.xjrsoft.module.app.entity.AppPageDesign;
+import com.xjrsoft.module.app.mapper.AppFuncDesignMapper;
+import com.xjrsoft.module.app.service.IAppFuncDesignService;
+import com.xjrsoft.module.app.service.IAppMenuService;
+import com.xjrsoft.module.app.service.IAppPageDesignService;
+import com.xjrsoft.module.app.vo.AppFuncDesignPageVo;
+import com.xjrsoft.module.app.vo.AppFuncDesignVo;
+import com.xjrsoft.module.app.vo.AppMenuVo;
+import com.xjrsoft.module.app.vo.AppPageDesignVo;
+import com.xjrsoft.module.erpModel.caseErpDevice.vo.CaseErpDeviceWarnVo;
+import com.xjrsoft.module.generator.entity.MenuConfig;
+import com.xjrsoft.module.organization.entity.User;
+import com.xjrsoft.module.organization.vo.UserPageVo;
+import com.xjrsoft.module.system.entity.DictionaryDetail;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.stereotype.Controller;
+
+import javax.validation.Valid;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author tzx
+ * @since 2023-07-26
+ */
+@RestController
+@RequestMapping(GlobalConstant.APP_MODEL +"/func-design")
+@Api(value = GlobalConstant.APP_MODEL +"/func-design", tags = "app端功能页面设计")
+@AllArgsConstructor
+public class AppFuncDesignController {
+
+    private IAppFuncDesignService funcDesignService;
+
+    private IAppMenuService appMenuService;
+
+    @GetMapping(value = "/page")
+    @ApiOperation("app端功能页面设计分页")
+    public R page(AppFuncDesignPageDto dto) {
+
+        IPage<AppFuncDesignPageVo> page = funcDesignService.selectJoinListPage(ConventPage.getPage(dto), AppFuncDesignPageVo.class, MPJWrappers.<AppFuncDesign>lambdaJoin()
+                .like(StrUtil.isNotBlank(dto.getKeyword()), AppMenu::getName, dto.getKeyword())
+                .eq(ObjectUtil.isNotEmpty(dto.getEnabledMark()), AppFuncDesign::getEnabledMark, dto.getEnabledMark())
+                .eq(dto.getFormType() != null, AppFuncDesign::getFormType, dto.getFormType())
+                .select(AppFuncDesign::getId)
+                .select(AppFuncDesign.class, x -> VoToColumnUtil.fieldsToColumns(AppFuncDesignPageVo.class).contains(x.getProperty()))
+                .selectAs(AppMenu::getName, AppFuncDesignPageVo::getName)
+                .selectAs(AppMenu::getRemark, AppFuncDesignPageVo::getMenuRemark)
+                .leftJoin(AppMenu.class, AppMenu::getId, AppFuncDesign::getAppMenuId)
+                .orderByDesc(AppFuncDesign::getCreateDate)
+        );
+
+        PageOutput<AppFuncDesignPageVo> pageOutput = ConventPage.getPageOutput(page, AppFuncDesignPageVo.class);
+        return R.ok(pageOutput);
+    }
+
+    @PostMapping
+    @ApiOperation(value = "新增app端功能页面设计")
+    public R add(@Valid @RequestBody AddFuncDesignDto dto) {
+        return R.ok(funcDesignService.add(dto));
+    }
+
+    @PutMapping
+    @ApiOperation(value = "修改app端功能页面设计")
+    public R update(@Valid @RequestBody UpdateAppFuncDesignDto dto) {
+        return R.ok(funcDesignService.modify(dto));
+    }
+
+    @GetMapping(value = "/info")
+    @ApiOperation(value = "根据id查询数app端功能页面设计详细信息")
+    public R info(@RequestParam Long id) {
+        AppFuncDesign appFuncDesign = funcDesignService.getById(id);
+        if (appFuncDesign == null) {
+            return R.error("找不到此功能页面设计!");
+        }
+        AppFuncDesignVo appFuncDesignVo = BeanUtil.toBean(appFuncDesign, AppFuncDesignVo.class);
+        AppMenu appMenu = appMenuService.getById(appFuncDesign.getAppMenuId());
+
+        appFuncDesignVo.setMenuConfigs(BeanUtil.toBean(appMenu, AppMenuVo.class));
+
+
+
+        return R.ok(appFuncDesignVo);
+    }
+
+
+    @DeleteMapping
+    @ApiOperation(value = "删除")
+    @XjrLog(value = "删除app端展示页面设计")
+    @Transactional(rollbackFor = Exception.class)
+    public R delete(@Valid @RequestBody DeleteAppPageDesignDto dto) {
+        AppFuncDesign appFuncDesign = funcDesignService.getById(dto.getId());
+
+        appMenuService.removeById(appFuncDesign.getAppMenuId());
+
+
+        funcDesignService.removeById(dto.getId());
+        return R.ok(Boolean.TRUE);
+    }
+
+    @PutMapping("/update-enable-mark")
+    @ApiOperation(value = "修改启用状态")
+    @XjrLog(value = "修改启用状态")
+    public R updateEnableMark(@Valid @RequestBody UpdateEnableMarkDto dto) {
+        AppFuncDesign appFuncDesign = new AppFuncDesign();
+        appFuncDesign.setId(dto.getId());
+        appFuncDesign.setEnabledMark(dto.getEnabledMark());
+        funcDesignService.updateById(appFuncDesign);
+
+        AppFuncDesign one = funcDesignService.getOne(Wrappers.lambdaQuery(AppFuncDesign.class).eq(AppFuncDesign::getId, dto.getId()).select(AppFuncDesign::getAppMenuId));
+        AppMenu appMenu = new AppMenu();
+        appMenu.setId(one.getAppMenuId());
+        appMenu.setEnabledMark(dto.getEnabledMark());
+        appMenuService.updateById(appMenu);
+        return R.ok(true);
+    }
+
+}

+ 116 - 0
src/main/java/com/xjrsoft/module/app/controller/AppMenuController.java

@@ -0,0 +1,116 @@
+package com.xjrsoft.module.app.controller;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.xjrsoft.common.annotation.XjrLog;
+import com.xjrsoft.common.constant.GlobalConstant;
+import com.xjrsoft.common.enums.EnabledMark;
+import com.xjrsoft.common.model.result.R;
+import com.xjrsoft.common.page.ConventPage;
+import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.app.dto.*;
+import com.xjrsoft.module.app.entity.AppFuncDesign;
+import com.xjrsoft.module.app.entity.AppMenu;
+import com.xjrsoft.module.app.service.IAppMenuService;
+import com.xjrsoft.module.app.vo.AppMenuListVo;
+import com.xjrsoft.module.app.vo.AppMenuPageVo;
+import com.xjrsoft.module.organization.entity.Role;
+import com.xjrsoft.module.organization.vo.RoleListVo;
+import com.xjrsoft.module.organization.vo.RolePageVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.stereotype.Controller;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * <p>
+ *  app 菜单前端控制器
+ * </p>
+ *
+ * @author tzx
+ * @since 2023-07-26
+ */
+@RestController
+@RequestMapping(GlobalConstant.APP_MODEL +"/menu")
+@Api(value = GlobalConstant.APP_MODEL +"/menu", tags = "app 菜单模块")
+@AllArgsConstructor
+public class AppMenuController {
+
+    private final IAppMenuService appMenuService;
+
+    @GetMapping("/page")
+    @ApiOperation("app菜单分页接口")
+    public R page(AppMenuPageDto dto){
+
+        LambdaQueryWrapper<AppMenu> queryWrapper = Wrappers.lambdaQuery(AppMenu.class)
+                .eq(StrUtil.isNotBlank(dto.getName()), AppMenu::getName, dto.getName())
+                .eq(StrUtil.isNotBlank(dto.getCode()), AppMenu::getCode, dto.getCode())
+                .eq(ObjectUtil.isNotNull(dto.getCategoryId()), AppMenu::getCategoryId, dto.getCategoryId())
+                .orderByAsc(AppMenu::getSortCode)
+                .select(AppMenu.class, x -> VoToColumnUtil.fieldsToColumns(AppMenuPageVo.class).contains(x.getProperty()));
+
+        IPage<AppMenu> page = appMenuService.page(ConventPage.getPage(dto), queryWrapper);
+        PageOutput<AppMenuPageVo> pageOutput = ConventPage.getPageOutput(page, AppMenuPageVo.class);
+        return R.ok(pageOutput);
+    }
+
+
+    @GetMapping("/list")
+    @ApiOperation("app菜单 列表 不分页")
+    public R list(AppMenuListDto dto){
+
+        LambdaQueryWrapper<AppMenu> queryWrapper = Wrappers.lambdaQuery(AppMenu.class)
+                .eq(StrUtil.isNotBlank(dto.getName()), AppMenu::getName, dto.getName())
+                .eq(StrUtil.isNotBlank(dto.getCode()), AppMenu::getCode, dto.getCode())
+                .eq(ObjectUtil.isNotNull(dto.getCategoryId()), AppMenu::getCategoryId, dto.getCategoryId())
+                .eq(AppMenu::getEnabledMark, EnabledMark.ENABLED.getCode())
+                .orderByAsc(AppMenu::getSortCode)
+                .select(AppMenu.class, x -> VoToColumnUtil.fieldsToColumns(AppMenuPageVo.class).contains(x.getProperty()));
+
+
+        List<AppMenu> list = appMenuService.list(queryWrapper);
+
+        List<AppMenuListVo> appMenuListVos = BeanUtil.copyToList(list, AppMenuListVo.class);
+
+        return R.ok(appMenuListVos);
+    }
+
+    @PostMapping
+    @ApiOperation("新增")
+    public R add(@Valid @RequestBody AddAppMenuDto dto){
+
+        AppMenu appMenu = BeanUtil.toBean(dto, AppMenu.class);
+
+        return R.ok(appMenuService.save(appMenu));
+
+    }
+
+
+    @PutMapping
+    @ApiOperation("修改")
+    public R update(@Valid @RequestBody UpdateAppMenuDto dto){
+
+        AppMenu appMenu = BeanUtil.toBean(dto, AppMenu.class);
+
+        return R.ok(appMenuService.updateById(appMenu));
+
+    }
+
+    @DeleteMapping
+    @ApiOperation(value = "删除")
+    @XjrLog(value = "删除app端展示页面设计")
+    public R delete(@Valid @RequestBody List<Long> ids) {
+        appMenuService.removeBatchByIds(ids);
+        return R.ok(Boolean.TRUE);
+    }
+}

+ 25 - 10
src/main/java/com/xjrsoft/module/app/controller/AppPageDesignController.java

@@ -14,11 +14,13 @@ import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.app.dto.*;
 import com.xjrsoft.module.app.entity.AppPageDesign;
+import com.xjrsoft.module.app.service.IAppMenuService;
 import com.xjrsoft.module.app.service.IAppPageDesignService;
 import com.xjrsoft.module.app.vo.AppPageDesignVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
@@ -39,8 +41,11 @@ public class AppPageDesignController {
 
     private IAppPageDesignService pageDesignService;
 
+    private IAppMenuService appMenuService;
+
     @GetMapping(value = "/page")
     @ApiOperation("app端展示页面设计分页")
+    @XjrLog("app端展示页面设计分页")
     public R page(AppPageDesignDto dto) {
         LambdaQueryWrapper<AppPageDesign> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.like(StrUtil.isNotBlank(dto.getKeyword()), AppPageDesign::getName, dto.getKeyword())
@@ -57,26 +62,30 @@ public class AppPageDesignController {
 
     @PostMapping
     @ApiOperation(value = "新增app端展示页面设计")
+    @XjrLog("新增app端展示页面设计")
     public R add(@Valid @RequestBody AddAppPageDesignDto dto) {
-        long count = pageDesignService.count(Wrappers.<AppPageDesign>query().lambda().eq(AppPageDesign::getName, dto.getName()));
-        if (count > 0) {
-            return R.error("此数据展示页已经存在!");
-        }
-        AppPageDesign appPageDesign = BeanUtil.toBean(dto, AppPageDesign.class);
-        pageDesignService.save(appPageDesign);
-        return R.ok(true);
+
+        return R.ok(pageDesignService.add(dto));
+    }
+
+    @PostMapping("/draft")
+    @ApiOperation(value = "app端展示页面设计保存草稿")
+    @XjrLog("app端展示页面设计保存草稿")
+    public R draft(@Valid @RequestBody AppPageDesignDraftDto dto) {
+        AppPageDesign bean = BeanUtil.toBean(dto, AppPageDesign.class);
+        return R.ok(pageDesignService.saveOrUpdate(bean));
     }
 
     @PutMapping
     @ApiOperation(value = "修改app端展示页面设计")
+    @XjrLog("修改app端展示页面设计")
     public R update(@Valid @RequestBody UpdateAppPageDesignDto dto) {
-        AppPageDesign appPageDesign = BeanUtil.toBean(dto, AppPageDesign.class);
-        pageDesignService.updateById(appPageDesign);
-        return R.ok(true);
+        return R.ok(pageDesignService.modify(dto));
     }
 
     @GetMapping(value = "/info")
     @ApiOperation(value = "根据id查询数app端展示页面设计详细信息")
+    @XjrLog("根据id查询数app端展示页面设计详细信息")
     public R info(@RequestParam Long id) {
         AppPageDesign appPageDesign = pageDesignService.getById(id);
         if (appPageDesign == null) {
@@ -89,7 +98,13 @@ public class AppPageDesignController {
     @DeleteMapping
     @ApiOperation(value = "删除")
     @XjrLog(value = "删除app端展示页面设计")
+    @Transactional(rollbackFor = Exception.class)
     public R delete(@Valid @RequestBody DeleteAppPageDesignDto dto) {
+
+        AppPageDesign pageDesign = pageDesignService.getById(dto.getId());
+
+        appMenuService.removeById(pageDesign.getAppMenuId());
+
         pageDesignService.removeById(dto.getId());
         return R.ok(true);
     }

+ 37 - 0
src/main/java/com/xjrsoft/module/app/dto/AddAppMenuDto.java

@@ -0,0 +1,37 @@
+package com.xjrsoft.module.app.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Author: tzx
+ * @Date: 2023/7/26 11:06
+ */
+@Data
+public class AddAppMenuDto {
+
+    @ApiModelProperty("菜单名称")
+    private String name;
+
+    @ApiModelProperty("菜单编码")
+    private String code;
+
+    @ApiModelProperty("菜单图标")
+    private String icon;
+
+    @ApiModelProperty("分类id")
+    private Long categoryId;
+
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+    @ApiModelProperty("url 路径")
+    private String url = "/pages/customForm/list";
+
+
+    @ApiModelProperty("排序")
+    private Integer sortCode;
+
+
+}

+ 3 - 0
src/main/java/com/xjrsoft/module/app/dto/AddAppPageDesignDto.java

@@ -36,4 +36,7 @@ public class AddAppPageDesignDto implements Serializable {
     @ApiModelProperty("1:启用,0:禁用,-1:草稿")
     private Integer enabledMark;
 
+    @ApiModelProperty("页面代码")
+    private String pageCode;
+
 }

+ 55 - 0
src/main/java/com/xjrsoft/module/app/dto/AddFuncDesignDto.java

@@ -0,0 +1,55 @@
+package com.xjrsoft.module.app.dto;
+
+import com.xjrsoft.module.generator.dto.GeneratorAppDto;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Author: tzx
+ * @Date: 2023/7/26 8:56
+ */
+@Data
+public class AddFuncDesignDto {
+
+
+    @ApiModelProperty("功能模块所选id")
+    private Long funcModule;
+
+    @ApiModelProperty("功能描述")
+    private String funcDescribe;
+
+
+    @ApiModelProperty("代码模板id")
+    @NotNull(message = "代码模板id不能为空!")
+    private Long codeSchemaId;
+
+    @ApiModelProperty("页面类型:0 系统表单 1 自定义表单")
+    @NotNull(message = "页面类型不能为空!")
+    private Integer formType;
+
+    @ApiModelProperty("是否生成代码  如果 formType 为自定义表单  需要传入  0 不生成  1 生成")
+    private Integer isGeneratorCode;
+
+    @ApiModelProperty("页面配置json")
+    private String jsonContent;
+
+    @ApiModelProperty("菜单配置")
+    private AddAppMenuDto menuConfigs;
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+    @ApiModelProperty("排序")
+    private Integer sortCode;
+
+    @ApiModelProperty("前端代码")
+    private GeneratorAppDto codes;
+
+    @ApiModelProperty("状态")
+    private Integer enabledMark;
+
+
+}

+ 18 - 0
src/main/java/com/xjrsoft/module/app/dto/AppFuncDesignPageDto.java

@@ -0,0 +1,18 @@
+package com.xjrsoft.module.app.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @Author: tzx
+ * @Date: 2023/7/26 8:58
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class AppFuncDesignPageDto extends PageInput {
+
+    private Integer formType;
+
+    private Integer enabledMark;
+}

+ 20 - 0
src/main/java/com/xjrsoft/module/app/dto/AppMenuListDto.java

@@ -0,0 +1,20 @@
+package com.xjrsoft.module.app.dto;
+
+import com.xjrsoft.common.page.ListInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @Author: tzx
+ * @Date: 2023/8/16 9:22
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class AppMenuListDto extends ListInput {
+    private String name;
+
+    private String code;
+
+    private Long categoryId;
+}

+ 20 - 0
src/main/java/com/xjrsoft/module/app/dto/AppMenuPageDto.java

@@ -0,0 +1,20 @@
+package com.xjrsoft.module.app.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @Author: tzx
+ * @Date: 2023/8/16 9:16
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class AppMenuPageDto extends PageInput {
+
+    private String name;
+
+    private String code;
+
+    private Long categoryId;
+}

+ 40 - 0
src/main/java/com/xjrsoft/module/app/dto/AppPageDesignDraftDto.java

@@ -0,0 +1,40 @@
+package com.xjrsoft.module.app.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class AppPageDesignDraftDto {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("主键")
+    private Long id;
+
+    @ApiModelProperty("页面名称")
+    private String name;
+
+    @ApiModelProperty("页面编码")
+    private String code;
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+    @ApiModelProperty("是否是菜单:(0:否,1:是)")
+    private Integer isMenu;
+
+    @ApiModelProperty("功能类别id")
+    private Long categoryId;
+
+    @ApiModelProperty("图标")
+    private String icon;
+
+    @ApiModelProperty("排序码")
+    private Integer sortCode;
+
+    @ApiModelProperty("json内容")
+    private String jsonContent;
+
+    @ApiModelProperty("1:启用,0:禁用,-1:草稿")
+    private Integer enabledMark;
+}

+ 61 - 0
src/main/java/com/xjrsoft/module/app/dto/UpdateAppFuncDesignDto.java

@@ -0,0 +1,61 @@
+package com.xjrsoft.module.app.dto;
+
+import com.xjrsoft.module.generator.dto.GeneratorAppDto;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Author: tzx
+ * @Date: 2023/7/26 9:07
+ */
+@Data
+public class UpdateAppFuncDesignDto {
+
+    private Long id;
+
+    @ApiModelProperty("功能模块所选id")
+    private Long funcModule;
+
+    @ApiModelProperty("功能描述")
+//    @NotBlank(message = "功能描述不能为空!")
+    private String funcDescribe;
+
+    @ApiModelProperty("app菜单id")
+    private Long appMenuId;
+
+    @ApiModelProperty("代码模板id")
+    private Long codeSchemaId;
+
+    @ApiModelProperty("页面类型:0 系统表单 1 自定义表单")
+    private Integer formType;
+
+    @ApiModelProperty("是否生成代码  如果 formType 为自定义表单  需要传入  0 不生成  1 生成")
+    private Integer isGeneratorCode;
+
+    @ApiModelProperty("页面配置json")
+    private String jsonContent;
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+
+    @ApiModelProperty("排序")
+    private Integer sortCode;
+
+
+
+    @ApiModelProperty("状态")
+    private Integer enabledMark;
+
+
+    @ApiModelProperty("菜单配置")
+    private AddAppMenuDto menuConfigs;
+
+
+    @ApiModelProperty("前端代码")
+    private GeneratorAppDto codes;
+
+}

+ 38 - 0
src/main/java/com/xjrsoft/module/app/dto/UpdateAppMenuDto.java

@@ -0,0 +1,38 @@
+package com.xjrsoft.module.app.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Author: tzx
+ * @Date: 2023/8/16 9:29
+ */
+@Data
+public class UpdateAppMenuDto {
+
+    @ApiModelProperty("id")
+    private Long id;
+
+    @ApiModelProperty("菜单名称")
+    private String name;
+
+    @ApiModelProperty("菜单编码")
+    private String code;
+
+    @ApiModelProperty("菜单图标")
+    private String icon;
+
+    @ApiModelProperty("分类id")
+    private Long categoryId;
+
+    @ApiModelProperty("url 路径")
+    private String url;
+
+
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+    @ApiModelProperty("排序")
+    private Integer sortCode;
+}

+ 6 - 0
src/main/java/com/xjrsoft/module/app/dto/UpdateAppPageDesignDto.java

@@ -14,6 +14,9 @@ public class UpdateAppPageDesignDto implements Serializable {
     @NotNull(message = "主键不能为空!")
     private Long id;
 
+    @ApiModelProperty("app菜单id")
+    private Long appMenuId;
+
     @ApiModelProperty("页面名称")
     private String name;
 
@@ -40,4 +43,7 @@ public class UpdateAppPageDesignDto implements Serializable {
 
     @ApiModelProperty("1:启用,0:禁用,-1:草稿")
     private Integer enabledMark;
+
+    @ApiModelProperty("页面代码")
+    private String pageCode;
 }

+ 58 - 0
src/main/java/com/xjrsoft/module/app/entity/AppFuncDesign.java

@@ -0,0 +1,58 @@
+package com.xjrsoft.module.app.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+import com.xjrsoft.common.model.base.AuditEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author tzx
+ * @since 2023-07-26
+ */
+@TableName("xjr_app_func_design")
+@ApiModel(value = "AppFuncDesign对象", description = "")
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class AppFuncDesign extends AuditEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    @ApiModelProperty("app菜单id")
+    private Long appMenuId;
+
+    @ApiModelProperty("功能模块所选id")
+    private Long funcModule;
+
+    @ApiModelProperty("功能描述")
+    private String funcDescribe;
+
+    @ApiModelProperty("代码模板id")
+    private Long codeSchemaId;
+
+    @ApiModelProperty("页面类型:0 系统表单 1 自定义表单")
+    private Integer formType;
+
+    @ApiModelProperty("页面配置json")
+    private String jsonContent;
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+
+    @ApiModelProperty("排序")
+    private Integer sortCode;
+
+
+}

+ 54 - 0
src/main/java/com/xjrsoft/module/app/entity/AppMenu.java

@@ -0,0 +1,54 @@
+package com.xjrsoft.module.app.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+import com.xjrsoft.common.model.base.AuditEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author tzx
+ * @since 2023-07-26
+ */
+@TableName("xjr_app_menu")
+@ApiModel(value = "AppMenu对象", description = "手机端菜单")
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class AppMenu extends AuditEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    @ApiModelProperty("菜单名称")
+    private String name;
+
+    @ApiModelProperty("菜单编码")
+    private String code;
+
+    @ApiModelProperty("菜单图标")
+    private String icon;
+
+    @ApiModelProperty("菜单类别")
+    private Long categoryId;
+
+    @ApiModelProperty("url 路径")
+    private String url;
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+    @ApiModelProperty("排序")
+    private Integer sortCode;
+
+
+}

+ 3 - 0
src/main/java/com/xjrsoft/module/app/entity/AppPageDesign.java

@@ -28,6 +28,9 @@ public class AppPageDesign extends AuditEntity implements Serializable {
     @ApiModelProperty("主键")
     private Long id;
 
+    @ApiModelProperty("app菜单id")
+    private Long appMenuId;
+
     @ApiModelProperty("页面名称")
     private String name;
 

+ 19 - 0
src/main/java/com/xjrsoft/module/app/mapper/AppFuncDesignMapper.java

@@ -0,0 +1,19 @@
+package com.xjrsoft.module.app.mapper;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.app.entity.AppFuncDesign;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author tzx
+ * @since 2023-07-26
+ */
+@Mapper
+public interface AppFuncDesignMapper extends MPJBaseMapper<AppFuncDesign> {
+
+}

+ 18 - 0
src/main/java/com/xjrsoft/module/app/mapper/AppMenuMapper.java

@@ -0,0 +1,18 @@
+package com.xjrsoft.module.app.mapper;
+
+import com.xjrsoft.module.app.entity.AppMenu;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author tzx
+ * @since 2023-07-26
+ */
+@Mapper
+public interface AppMenuMapper extends BaseMapper<AppMenu> {
+
+}

+ 24 - 0
src/main/java/com/xjrsoft/module/app/service/IAppFuncDesignService.java

@@ -0,0 +1,24 @@
+package com.xjrsoft.module.app.service;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.app.dto.AddFuncDesignDto;
+import com.xjrsoft.module.app.dto.UpdateAppFuncDesignDto;
+import com.xjrsoft.module.app.entity.AppFuncDesign;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author tzx
+ * @since 2023-07-26
+ */
+public interface IAppFuncDesignService extends MPJBaseService<AppFuncDesign> {
+
+    Boolean add(AddFuncDesignDto dto);
+
+    Boolean modify(UpdateAppFuncDesignDto dto);
+
+}

+ 16 - 0
src/main/java/com/xjrsoft/module/app/service/IAppMenuService.java

@@ -0,0 +1,16 @@
+package com.xjrsoft.module.app.service;
+
+import com.xjrsoft.module.app.entity.AppMenu;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author tzx
+ * @since 2023-07-26
+ */
+public interface IAppMenuService extends IService<AppMenu> {
+
+}

+ 6 - 0
src/main/java/com/xjrsoft/module/app/service/IAppPageDesignService.java

@@ -1,5 +1,7 @@
 package com.xjrsoft.module.app.service;
 
+import com.xjrsoft.module.app.dto.AddAppPageDesignDto;
+import com.xjrsoft.module.app.dto.UpdateAppPageDesignDto;
 import com.xjrsoft.module.app.entity.AppPageDesign;
 import com.baomidou.mybatisplus.extension.service.IService;
 
@@ -13,4 +15,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface IAppPageDesignService extends IService<AppPageDesign> {
 
+    Boolean add(AddAppPageDesignDto dto);
+
+    Boolean modify(UpdateAppPageDesignDto dto);
+
 }

+ 345 - 0
src/main/java/com/xjrsoft/module/app/service/impl/AppFuncDesignServiceImpl.java

@@ -0,0 +1,345 @@
+package com.xjrsoft.module.app.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.db.Db;
+import cn.hutool.db.meta.MetaUtil;
+import cn.hutool.db.meta.Table;
+import cn.hutool.json.JSON;
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.common.constant.GlobalConstant;
+import com.xjrsoft.common.enums.FormTemplateType;
+import com.xjrsoft.common.enums.YesOrNoEnum;
+import com.xjrsoft.common.exception.MyException;
+import com.xjrsoft.common.model.result.R;
+import com.xjrsoft.common.utils.DatasourceUtil;
+import com.xjrsoft.config.GeneratePathConfig;
+import com.xjrsoft.module.app.dto.AddAppMenuDto;
+import com.xjrsoft.module.app.dto.AddFuncDesignDto;
+import com.xjrsoft.module.app.dto.UpdateAppFuncDesignDto;
+import com.xjrsoft.module.app.entity.AppFuncDesign;
+import com.xjrsoft.module.app.entity.AppMenu;
+import com.xjrsoft.module.app.mapper.AppFuncDesignMapper;
+import com.xjrsoft.module.app.mapper.AppMenuMapper;
+import com.xjrsoft.module.app.service.IAppFuncDesignService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xjrsoft.module.form.entity.FormDesignConfig;
+import com.xjrsoft.module.form.entity.FormTemplate;
+import com.xjrsoft.module.form.service.IFormTemplateService;
+import com.xjrsoft.module.generator.dto.GeneratorAppDto;
+import com.xjrsoft.module.generator.entity.FrontCode;
+import com.xjrsoft.module.generator.entity.GeneratorConfig;
+import com.xjrsoft.module.generator.entity.OutputConfig;
+import com.xjrsoft.module.generator.entity.TableConfig;
+import com.xjrsoft.module.generator.service.IGeneratorService;
+import com.xjrsoft.module.generator.utils.GeneratorUtil;
+import com.xjrsoft.module.generator.utils.SqlUtil;
+import com.xjrsoft.module.system.service.IDatabaselinkService;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.SneakyThrows;
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.BooleanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.sql.DataSource;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author tzx
+ * @since 2023-07-26
+ */
+@Service
+@AllArgsConstructor
+public class AppFuncDesignServiceImpl extends MPJBaseServiceImpl<AppFuncDesignMapper, AppFuncDesign> implements IAppFuncDesignService {
+
+
+    private final AppMenuMapper appMenuMapper;
+
+    private final IGeneratorService generatorService;
+
+    private final GeneratePathConfig generatePathConfig;
+
+    private final IDatabaselinkService databaselinkService;
+
+
+
+    @Override
+    @SneakyThrows
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean add(AddFuncDesignDto dto) {
+
+        AppFuncDesign appFuncDesign = BeanUtil.toBean(dto, AppFuncDesign.class);
+
+
+        //如果是自定义表单  不需要生成代码 以及 page.json
+        if (dto.getFormType() == FormTemplateType.CUSTOM.getCode() && dto.getIsGeneratorCode() != YesOrNoEnum.YES.getCode()) {
+            AppMenu appMenu = BeanUtil.toBean(dto.getMenuConfigs(), AppMenu.class);
+
+
+            long snowflakeNextId = IdUtil.getSnowflakeNextId();
+            appMenu.setUrl(appMenu.getUrl() + StringPool.QUESTION_MARK + "id=" + snowflakeNextId);
+
+            appMenuMapper.insert(appMenu);
+
+            appFuncDesign.setId(snowflakeNextId);
+            appFuncDesign.setAppMenuId(appMenu.getId());
+            save(appFuncDesign);
+
+        } else {
+            if(dto.getFormType() == FormTemplateType.CUSTOM.getCode()){
+                GeneratorConfig generatorConfig = JSONUtil.toBean(dto.getJsonContent(), GeneratorConfig.class);
+                generatorEndCode(generatorConfig);
+            }
+            AppMenu appMenu = BeanUtil.toBean(dto.getMenuConfigs(), AppMenu.class);
+
+
+            appMenu.setUrl("/pages/" + dto.getCodes().getOutputValue() + StringPool.SLASH + dto.getCodes().getClassName().toLowerCase() + StringPool.SLASH + "list");
+            appMenuMapper.insert(appMenu);
+
+            appFuncDesign.setAppMenuId(appMenu.getId());
+            save(appFuncDesign);
+
+            //保存成功之后  生成代码
+            modifyPageJsonFile(dto.getCodes(), dto.getMenuConfigs());
+
+            generatorService.generateAppCodes(dto.getCodes());
+        }
+        return Boolean.TRUE;
+    }
+
+    @Override
+    @SneakyThrows
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean modify(UpdateAppFuncDesignDto dto) {
+
+        AppFuncDesign appFuncDesign = BeanUtil.toBean(dto, AppFuncDesign.class);
+
+        //如果是自定义表单  不需要生成代码 以及 page.json
+        if (dto.getFormType() == FormTemplateType.CUSTOM.getCode() && dto.getIsGeneratorCode() != YesOrNoEnum.YES.getCode()) {
+            AppMenu appMenu = BeanUtil.toBean(dto.getMenuConfigs(), AppMenu.class);
+
+            appMenu.setId(dto.getAppMenuId());
+            appMenu.setUrl(appMenu.getUrl() + StringPool.QUESTION_MARK + "id=" + appFuncDesign.getId());
+
+            appMenuMapper.updateById(appMenu);
+
+            appFuncDesign.setAppMenuId(appMenu.getId());
+            updateById(appFuncDesign);
+
+        } else {
+
+            if(dto.getFormType() == FormTemplateType.CUSTOM.getCode()){
+                GeneratorConfig generatorConfig = JSONUtil.toBean(dto.getJsonContent(), GeneratorConfig.class);
+                generatorEndCode(generatorConfig);
+            }
+
+            AppMenu appMenu = BeanUtil.toBean(dto.getMenuConfigs(), AppMenu.class);
+
+            appMenu.setId(dto.getAppMenuId());
+            appMenu.setUrl("/pages/" + dto.getCodes().getOutputValue() + StringPool.SLASH + dto.getCodes().getClassName().toLowerCase() + StringPool.SLASH + "list");
+            appMenuMapper.updateById(appMenu);
+
+            updateById(appFuncDesign);
+
+            //保存成功之后  生成代码
+            modifyPageJsonFile(dto.getCodes(), dto.getMenuConfigs());
+
+
+            generatorService.generateAppCodes(dto.getCodes());
+        }
+
+
+        return Boolean.TRUE;
+
+    }
+
+    private void modifyPageJsonFile(GeneratorAppDto dto, AddAppMenuDto menuDto) {
+        File tempFile = FileUtil.file(generatePathConfig.getAppPath() + StringPool.SLASH + "pages.json");
+
+        JSON jsonContent = JSONUtil.readJSON(tempFile, StandardCharsets.UTF_8);
+
+        //如果已经包含了此地址  就不再生成
+        if (jsonContent.getByPath("pages").toString().contains( "pages/" + dto.getOutputValue() + StringPool.SLASH + dto.getClassName().toLowerCase() + StringPool.SLASH + "list")) {
+            return;
+        }
+
+        Map<String, Object> listJsonMap = new HashMap<>();
+        listJsonMap.put("path", "pages/" + dto.getOutputValue() + StringPool.SLASH + dto.getClassName().toLowerCase() + StringPool.SLASH + "list");
+        Map<String, Object> listStyleMap = new HashMap<>();
+        listStyleMap.put("navigationBarTitleText", menuDto.getName());
+        listJsonMap.put("style", listStyleMap);
+
+
+        Map<String, Object> formJsonMap = new HashMap<>();
+        formJsonMap.put("path", "pages/" + dto.getOutputValue() + StringPool.SLASH + dto.getClassName().toLowerCase() + StringPool.SLASH + "form");
+        Map<String, Object> formStyleMap = new HashMap<>();
+        formStyleMap.put("navigationBarTitleText", "新增");
+        formJsonMap.put("style", formStyleMap);
+
+        JSONArray pages = JSONUtil.parseArray(jsonContent.getByPath("pages").toString());
+
+        pages.add(listJsonMap);
+        pages.add(formJsonMap);
+
+        jsonContent.putByPath("pages", pages);
+
+        FileUtil.writeString(jsonContent.toJSONString(4), tempFile, StandardCharsets.UTF_8);
+    }
+
+
+    /**
+     * 根据json 生成后端代码
+     * @param generatorConfig
+     */
+    @SneakyThrows
+    private void generatorEndCode(GeneratorConfig generatorConfig){
+
+        Optional<TableConfig> tableConfigOptional = generatorConfig.getTableConfigs().stream().filter(TableConfig::getIsMain).findFirst();
+        //主表
+        TableConfig mainTable;
+        if (tableConfigOptional.isPresent()) {
+            mainTable = tableConfigOptional.get();
+        } else {
+            throw new MyException("请选择主表");
+        }
+
+        OutputConfig outputConfig = generatorConfig.getOutputConfig();
+        String databaseId = generatorConfig.getDatabaseId();
+        if (BooleanUtils.isTrue(outputConfig.getIsDataAuth())) {
+            // 添加权限字段 rule_user_id
+            DataSource dataSource = DatasourceUtil.getDataSource(databaseId);
+            String[] columnNames = MetaUtil.getColumnNames(dataSource, mainTable.getTableName());
+            if (!ArrayUtils.contains(columnNames, GlobalConstant.AUTH_USER_ID)) {
+                DbType dbType = databaselinkService.getDbType(databaseId);
+                Db.use(dataSource).executeBatch(SqlUtil.buildAddDataAuthFieldSqls(dbType, mainTable.getTableName()));
+            }
+        }
+
+        //修改 getTableInfos  也记得修改 FromTemplateServiceImpl 的同名方法
+        List<Table> tableInfos = getTableInfos(generatorConfig);
+
+        createCodeFile(generatorConfig, mainTable, tableInfos);
+    }
+
+    /**
+     * 获取表结构信息
+     *
+     * @param generatorConfig
+     * @return
+     */
+    private List<Table> getTableInfos(GeneratorConfig generatorConfig) {
+        List<Table> tableInfos = new ArrayList<>();
+        for (TableConfig tableConfig : generatorConfig.getTableConfigs()) {
+            //判断是否为默认数据源
+            if (StrUtil.equalsIgnoreCase(generatorConfig.getDatabaseId(), GlobalConstant.DEFAULT_DATASOURCE_KEY)) {
+                tableInfos.add(MetaUtil.getTableMeta(DatasourceUtil.getDatasourceMaster(), tableConfig.getTableName()));
+            } else {
+                tableInfos.add(MetaUtil.getTableMeta(DatasourceUtil.getDataSource(generatorConfig.getDatabaseId()), tableConfig.getTableName()));
+            }
+        }
+        return tableInfos;
+    }
+
+    /**
+     * 根据配置生成文件
+     *
+     * @param generatorConfig
+     * @param mainTable
+     * @param tableInfos
+     * @throws FileNotFoundException
+     */
+    private void createCodeFile(GeneratorConfig generatorConfig, TableConfig mainTable, List<Table> tableInfos) throws FileNotFoundException {
+        String className = generatorConfig.getOutputConfig().getClassName();
+        String dirValue = generatorConfig.getOutputConfig().getOutputValue();
+
+        //---------------------------------------生成entity开始----------------------------------------------------
+        {
+            Map<String, String> entityCodeMap = GeneratorUtil.getEntityCode(generatorConfig, tableInfos);
+
+            for (Map.Entry<String, String> entry : entityCodeMap.entrySet()) {
+                GeneratorUtil.writeFile(GeneratorUtil.getEntityOutputDir(dirValue), entry.getKey() + StringPool.DOT_JAVA, entry.getValue());
+            }
+        }
+        //---------------------------------------生成entity结束----------------------------------------------------
+
+
+        //********************************************生成dto开始************************************************
+        {
+            Map<String, String> dtoMap = new HashMap<>(3);
+            dtoMap.putAll(GeneratorUtil.getAddDtoCode(generatorConfig, tableInfos));
+            dtoMap.putAll(GeneratorUtil.getUpdateDtoCode(generatorConfig, tableInfos));
+            dtoMap.putAll(GeneratorUtil.getPageDtoCode(generatorConfig, tableInfos, mainTable));
+
+            for (Map.Entry<String, String> entry : dtoMap.entrySet()) {
+                GeneratorUtil.writeFile(GeneratorUtil.getDtoOutputDir(dirValue), entry.getKey() + StringPool.DOT_JAVA, entry.getValue());
+            }
+        }
+        //********************************************生成dto结束************************************************
+
+        //###############################################生成Vo开始###############################################
+        {
+            Map<String, String> voMap = new HashMap<>(2);
+            voMap.putAll(GeneratorUtil.getPageVoCode(generatorConfig, tableInfos, mainTable));
+            voMap.putAll(GeneratorUtil.getInfoVoCode(generatorConfig, tableInfos, mainTable));
+
+            for (Map.Entry<String, String> entry : voMap.entrySet()) {
+                GeneratorUtil.writeFile(GeneratorUtil.getVoOutputDir(dirValue), entry.getKey() + StringPool.DOT_JAVA, entry.getValue());
+            }
+        }
+        //###############################################生成Vo结束###############################################
+
+
+        //---------------------------------------生成三层代码开始----------------------------------------------------
+        {
+            Map<String, String> mapperCode = GeneratorUtil.getMapperCode(generatorConfig, tableInfos);
+
+            for (Map.Entry<String, String> entry : mapperCode.entrySet()) {
+                GeneratorUtil.writeFile(GeneratorUtil.getMapperOutputDir(dirValue), entry.getKey() + StringPool.DOT_JAVA, entry.getValue());
+            }
+        }
+
+        {
+            Map<String, String> serviceCode = GeneratorUtil.getServiceCode(generatorConfig, mainTable, tableInfos.size() > 1);
+
+            for (Map.Entry<String, String> entry : serviceCode.entrySet()) {
+                GeneratorUtil.writeFile(GeneratorUtil.getServiceOutputDir(dirValue), entry.getKey() + StringPool.DOT_JAVA, entry.getValue());
+            }
+        }
+
+        {
+            Map<String, String> serviceImplCode = GeneratorUtil.getServiceImplCode(generatorConfig, mainTable, tableInfos.size() > 1);
+            for (Map.Entry<String, String> entry : serviceImplCode.entrySet()) {
+                GeneratorUtil.writeFile(GeneratorUtil.getServiceImplOutputDir(dirValue), entry.getKey() + StringPool.DOT_JAVA, entry.getValue());
+            }
+        }
+
+        {
+            Map<String, String> controllerCode = GeneratorUtil.getControllerCode(generatorConfig, tableInfos, mainTable);
+            for (Map.Entry<String, String> entry : controllerCode.entrySet()) {
+                GeneratorUtil.writeFile(GeneratorUtil.getControllerOutputDir(dirValue), entry.getKey() + StringPool.DOT_JAVA, entry.getValue());
+            }
+        }
+        //---------------------------------------生成三层代码结束----------------------------------------------------
+
+
+
+
+    }
+}

+ 20 - 0
src/main/java/com/xjrsoft/module/app/service/impl/AppMenuServiceImpl.java

@@ -0,0 +1,20 @@
+package com.xjrsoft.module.app.service.impl;
+
+import com.xjrsoft.module.app.entity.AppMenu;
+import com.xjrsoft.module.app.mapper.AppMenuMapper;
+import com.xjrsoft.module.app.service.IAppMenuService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author tzx
+ * @since 2023-07-26
+ */
+@Service
+public class AppMenuServiceImpl extends ServiceImpl<AppMenuMapper, AppMenu> implements IAppMenuService {
+
+}

+ 207 - 1
src/main/java/com/xjrsoft/module/app/service/impl/AppPageDesignServiceImpl.java

@@ -1,10 +1,42 @@
 package com.xjrsoft.module.app.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.IoUtil;
+import cn.hutool.core.lang.TypeReference;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.json.JSON;
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xjrsoft.common.constant.GlobalConstant;
+import com.xjrsoft.common.enums.YesOrNoEnum;
+import com.xjrsoft.common.exception.MyException;
+import com.xjrsoft.common.utils.RedisUtil;
+import com.xjrsoft.config.GeneratePathConfig;
+import com.xjrsoft.module.app.dto.AddAppPageDesignDto;
+import com.xjrsoft.module.app.dto.UpdateAppPageDesignDto;
+import com.xjrsoft.module.app.entity.AppMenu;
 import com.xjrsoft.module.app.entity.AppPageDesign;
+import com.xjrsoft.module.app.mapper.AppMenuMapper;
 import com.xjrsoft.module.app.mapper.AppPageDesignMapper;
 import com.xjrsoft.module.app.service.IAppPageDesignService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xjrsoft.module.generator.utils.GeneratorUtil;
+import com.xjrsoft.module.system.entity.DictionaryDetail;
+import lombok.AllArgsConstructor;
+import lombok.SneakyThrows;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
 
 /**
  * <p>
@@ -15,6 +47,180 @@ import org.springframework.stereotype.Service;
  * @since 2023-06-25
  */
 @Service
+@AllArgsConstructor
 public class AppPageDesignServiceImpl extends ServiceImpl<AppPageDesignMapper, AppPageDesign> implements IAppPageDesignService {
 
+    private final AppMenuMapper appMenuMapper;
+
+    private final GeneratePathConfig generatePathConfig;
+
+    private final RedisUtil redisUtil;
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    @SneakyThrows
+    public Boolean add(AddAppPageDesignDto dto) {
+        long count = count(Wrappers.<AppPageDesign>query().lambda().eq(AppPageDesign::getName, dto.getName()));
+        if (count > 0) {
+            throw new MyException("此数据展示页已经存在!");
+        }
+        AppPageDesign appPageDesign = BeanUtil.toBean(dto, AppPageDesign.class);
+
+        List<DictionaryDetail> detailList = redisUtil.get(GlobalConstant.DIC_DETAIL_CACHE_KEY, new TypeReference<List<DictionaryDetail>>() {
+        });
+
+
+        if (dto.getIsMenu() == YesOrNoEnum.YES.getCode()) {
+
+
+            Optional<DictionaryDetail> first = detailList.stream().filter(x -> x.getId().equals(dto.getCategoryId())).findFirst();
+
+            if (!first.isPresent()) {
+                throw new MyException("找不到当前功能类别信息!");
+            }
+            AppMenu appMenu = new AppMenu();
+            appMenu.setCode(dto.getCode());
+            appMenu.setName(dto.getName());
+            appMenu.setIcon(dto.getIcon());
+            appMenu.setCategoryId(dto.getCategoryId());
+            appMenu.setRemark(dto.getRemark());
+            appMenu.setUrl(StringPool.SLASH+"pages"+StringPool.SLASH +first.get().getValue().toLowerCase() + StringPool.SLASH + dto.getCode().toLowerCase());
+            appMenuMapper.insert(appMenu);
+
+            appPageDesign.setAppMenuId(appMenu.getId());
+            save(appPageDesign);
+
+            //保存成功之后  生成代码
+            GeneratorUtil.writeFile(getPageOutputDir(first.get().getValue()), dto.getCode().toLowerCase() + StringPool.DOT + "vue", dto.getPageCode());
+
+            File tempFile = FileUtil.file(generatePathConfig.getAppPath() + StringPool.SLASH + "pages.json");
+
+            JSON jsonContent = JSONUtil.readJSON(tempFile, StandardCharsets.UTF_8);
+
+            Map<String, Object> pageJsonMap = new HashMap<>();
+            pageJsonMap.put("path", "pages/" + first.get().getValue().toLowerCase() + StringPool.SLASH + dto.getCode().toLowerCase());
+            Map<String, Object> styleMap = new HashMap<>();
+            styleMap.put("navigationBarTitleText", dto.getName());
+            pageJsonMap.put("style", styleMap);
+
+            JSONArray pages = JSONUtil.parseArray(jsonContent.getByPath("pages").toString());
+
+            pages.add(pageJsonMap);
+
+            jsonContent.putByPath("pages", pages);
+
+            FileUtil.writeString(jsonContent.toJSONString(4), tempFile, StandardCharsets.UTF_8);
+
+
+        } else {
+            save(appPageDesign);
+
+            return Boolean.TRUE;
+        }
+
+
+
+        return Boolean.TRUE;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    @SneakyThrows
+    public Boolean modify(UpdateAppPageDesignDto dto) {
+
+        AppPageDesign appPageDesign = BeanUtil.toBean(dto, AppPageDesign.class);
+
+
+        if (dto.getIsMenu() == YesOrNoEnum.YES.getCode()) {
+            List<DictionaryDetail> detailList = redisUtil.get(GlobalConstant.DIC_DETAIL_CACHE_KEY, new TypeReference<List<DictionaryDetail>>() {
+            });
+
+            Optional<DictionaryDetail> first = detailList.stream().filter(x -> x.getId().equals(dto.getCategoryId())).findFirst();
+
+            if (!first.isPresent()) {
+                throw new MyException("找不到当前功能类别信息!");
+            }
+            GeneratorUtil.writeFile(getPageOutputDir(first.get().getValue().toLowerCase()), dto.getCode().toLowerCase() + StringPool.DOT + "vue", dto.getPageCode());
+
+            AppMenu appMenu = new AppMenu();
+            appMenu.setCode(dto.getCode());
+            appMenu.setName(dto.getName());
+            appMenu.setIcon(dto.getIcon());
+            appMenu.setCategoryId(dto.getCategoryId());
+            appMenu.setUrl(StringPool.SLASH+"pages"+StringPool.SLASH +first.get().getValue().toLowerCase() + StringPool.SLASH + dto.getCode().toLowerCase());
+            appMenu.setRemark(dto.getRemark());
+            //如果发布菜单  menuid 不为空  则需要修改
+            if (ObjectUtil.isNotNull(dto.getAppMenuId())) {
+                appMenu.setId(dto.getAppMenuId());
+
+                appMenuMapper.updateById(appMenu);
+
+
+            } else {
+
+                appMenuMapper.insert(appMenu);
+            }
+
+//            //保存成功之后  生成代码
+//            GeneratorUtil.writeFile(getPageOutputDir(first.get().getValue()), dto.getCode().toLowerCase() + StringPool.DOT + "vue", dto.getPageCode());
+
+            File tempFile = FileUtil.file(generatePathConfig.getAppPath() + StringPool.SLASH + "pages.json");
+
+            JSON jsonContent = JSONUtil.readJSON(tempFile, StandardCharsets.UTF_8);
+
+            //判断page.json里面是否有对应的路径,没有就进行生成
+            String path = "pages/" + first.get().getValue().toLowerCase() + StringPool.SLASH + dto.getCode().toLowerCase();
+
+            if (((JSONObject) jsonContent).get("pages").toString().contains(path)){
+                JSONArray pages = JSONUtil.parseArray(jsonContent.getByPath("pages").toString());
+                for (Object page : pages) {
+                    if (page.toString().contains(path) && !page.toString().contains(dto.getName())){//找到这个path路径的值,再判断页面名称是否改变,改变则先移除,再新增
+                        pages.remove(page);
+                        Map<String, Object> pageJsonMap = new HashMap<>();
+                        pageJsonMap.put("path", path);
+                        Map<String, Object> styleMap = new HashMap<>();
+                        styleMap.put("navigationBarTitleText", dto.getName());
+                        pageJsonMap.put("style", styleMap);
+                        pages.add(pageJsonMap);
+                        jsonContent.putByPath("pages", pages);
+                        FileUtil.writeString(jsonContent.toJSONString(4), tempFile, StandardCharsets.UTF_8);
+                    }
+                }
+            }else {
+                Map<String, Object> pageJsonMap = new HashMap<>();
+                pageJsonMap.put("path", path);
+                Map<String, Object> styleMap = new HashMap<>();
+                styleMap.put("navigationBarTitleText", dto.getName());
+                pageJsonMap.put("style", styleMap);
+                JSONArray pages = JSONUtil.parseArray(jsonContent.getByPath("pages").toString());
+                pages.add(pageJsonMap);
+                jsonContent.putByPath("pages", pages);
+                FileUtil.writeString(jsonContent.toJSONString(4), tempFile, StandardCharsets.UTF_8);
+            }
+
+            appPageDesign.setAppMenuId(appMenu.getId());
+
+        } else {
+            //如果不发布菜单  并且 appmenuId又在  需要删除菜单
+            if (ObjectUtil.isNotNull(dto.getAppMenuId())) {
+                appMenuMapper.deleteById(dto.getAppMenuId());
+            }
+        }
+        updateById(appPageDesign);
+        return Boolean.TRUE;
+    }
+
+
+
+    /**
+     * 获取实体类生成目录
+     *
+     * @param outputArea
+     * @return
+     */
+    private String getPageOutputDir(String outputArea) {
+        return generatePathConfig.getAppPath() + StringPool.SLASH + "pages" + StringPool.SLASH + outputArea.toLowerCase();
+    }
+
 }

+ 58 - 0
src/main/java/com/xjrsoft/module/app/vo/AppFuncDesignPageVo.java

@@ -0,0 +1,58 @@
+package com.xjrsoft.module.app.vo;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Author: tzx
+ * @Date: 2023/7/26 9:04
+ */
+@Data
+public class AppFuncDesignPageVo {
+
+    private Long id;
+
+    @ApiModelProperty("app菜单id")
+    private Long appMenuId;
+
+    @ApiModelProperty("功能模块所选id")
+    private Long funcModule;
+
+    @ApiModelProperty("功能描述")
+    private String funcDescribe;
+
+    @ApiModelProperty("功能名称")
+    private String name;
+
+    @ApiModelProperty("功能编码")
+    private String code;
+
+    @ApiModelProperty("代码模板id")
+    private Long codeSchemaId;
+
+    @ApiModelProperty("url 路径")
+    private String url;
+
+    @ApiModelProperty("页面类型:0 系统表单 1 自定义表单")
+    private Integer formType;
+
+    @ApiModelProperty("页面配置json")
+    private String jsonContent;
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+    @ApiModelProperty("app菜单备注")
+    private String menuRemark;
+
+
+    @ApiModelProperty("排序")
+    private Integer sortCode;
+
+    @ApiModelProperty("状态")
+    private Integer enabledMark;
+
+
+}

+ 60 - 0
src/main/java/com/xjrsoft/module/app/vo/AppFuncDesignVo.java

@@ -0,0 +1,60 @@
+package com.xjrsoft.module.app.vo;
+
+import com.xjrsoft.module.app.dto.AddAppMenuDto;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Author: tzx
+ * @Date: 2023/7/26 9:03
+ */
+@Data
+public class AppFuncDesignVo {
+
+
+    private Long id;
+
+    @ApiModelProperty("app菜单id")
+    private Long appMenuId;
+
+    @ApiModelProperty("功能模块所选id")
+    private Long funcModule;
+
+    @ApiModelProperty("功能描述")
+    private String funcDescribe;
+
+    @ApiModelProperty("功能名称")
+    private String name;
+
+    @ApiModelProperty("功能编码")
+    private String code;
+
+    @ApiModelProperty("url 路径")
+    private String url;
+
+    @ApiModelProperty("代码模板id")
+    private Long codeSchemaId;
+
+    @ApiModelProperty("页面类型:0 系统表单 1 自定义表单")
+    private Integer formType;
+
+    @ApiModelProperty("页面配置json")
+    private String jsonContent;
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+
+    @ApiModelProperty("排序")
+    private Integer sortCode;
+
+
+    @ApiModelProperty("菜单配置")
+    private AppMenuVo menuConfigs;
+
+
+    @ApiModelProperty("状态")
+    private Integer enabledMark;
+
+
+}

+ 35 - 0
src/main/java/com/xjrsoft/module/app/vo/AppMenuListVo.java

@@ -0,0 +1,35 @@
+package com.xjrsoft.module.app.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Author: tzx
+ * @Date: 2023/8/16 9:22
+ */
+@Data
+public class AppMenuListVo {
+    private Long id;
+
+    @ApiModelProperty("菜单名称")
+    private String name;
+
+    @ApiModelProperty("菜单编码")
+    private String code;
+
+    @ApiModelProperty("菜单图标")
+    private String icon;
+
+    @ApiModelProperty("菜单类别")
+    private Long categoryId;
+
+    @ApiModelProperty("url 路径")
+    private String url;
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+    @ApiModelProperty("排序")
+    private Integer sortCode;
+
+}

+ 36 - 0
src/main/java/com/xjrsoft/module/app/vo/AppMenuPageVo.java

@@ -0,0 +1,36 @@
+package com.xjrsoft.module.app.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Author: tzx
+ * @Date: 2023/8/16 9:17
+ */
+@Data
+public class AppMenuPageVo {
+
+    private Long id;
+
+    @ApiModelProperty("菜单名称")
+    private String name;
+
+    @ApiModelProperty("菜单编码")
+    private String code;
+
+    @ApiModelProperty("菜单图标")
+    private String icon;
+
+    @ApiModelProperty("菜单类别")
+    private Long categoryId;
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+    @ApiModelProperty("url 路径")
+    private String url;
+
+    @ApiModelProperty("排序")
+    private Integer sortCode;
+
+}

+ 35 - 0
src/main/java/com/xjrsoft/module/app/vo/AppMenuVo.java

@@ -0,0 +1,35 @@
+package com.xjrsoft.module.app.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Author: tzx
+ * @Date: 2023/7/31 10:26
+ */
+@Data
+public class AppMenuVo {
+
+    @ApiModelProperty("菜单名称")
+    private String name;
+
+    @ApiModelProperty("菜单编码")
+    private String code;
+
+    @ApiModelProperty("菜单图标")
+    private String icon;
+
+    @ApiModelProperty("分类id")
+    private Long categoryId;
+
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+    @ApiModelProperty("url 路径")
+    private String url;
+
+    @ApiModelProperty("排序")
+    private Integer sortCode;
+
+}

+ 9 - 1
src/main/java/com/xjrsoft/module/app/vo/AppPageDesignVo.java

@@ -12,6 +12,9 @@ public class AppPageDesignVo implements Serializable {
 
     private Long id;
 
+    @ApiModelProperty("app菜单id")
+    private Long appMenuId;
+
     @ApiModelProperty("页面名称")
     private String name;
 
@@ -21,11 +24,14 @@ public class AppPageDesignVo implements Serializable {
     @ApiModelProperty("备注")
     private String remark;
 
+    @ApiModelProperty("url 路径")
+    private String url;
+
     @ApiModelProperty("是否是菜单:(0:是,1:否)")
     private Integer isMenu;
 
     @ApiModelProperty("功能类别id")
-    private Long functionalCategoryId;
+    private Long categoryId;
 
     @ApiModelProperty("图标")
     private String icon;
@@ -39,4 +45,6 @@ public class AppPageDesignVo implements Serializable {
     @ApiModelProperty("1:启用,0:禁用,-1:草稿")
     private Integer enabledMark;
 
+
+
 }

+ 204 - 82
src/main/java/com/xjrsoft/module/authority/utils/AuthorityUtil.java

@@ -13,10 +13,8 @@ import cn.hutool.extra.spring.SpringUtil;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.xjrsoft.common.constant.GlobalConstant;
-import com.xjrsoft.common.enums.DataAuthFieldTypeEnum;
-import com.xjrsoft.common.enums.DataAuthMethodEnum;
-import com.xjrsoft.common.enums.DataAuthScopeEnum;
-import com.xjrsoft.common.enums.DataAuthTypeEnum;
+import com.xjrsoft.common.enums.*;
+import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.utils.RedisUtil;
 import com.xjrsoft.module.authority.entity.DataAuth;
 import com.xjrsoft.module.authority.entity.DataAuthConfig;
@@ -26,12 +24,12 @@ import com.xjrsoft.module.organization.entity.*;
 import lombok.SneakyThrows;
 import net.sf.jsqlparser.expression.Expression;
 import net.sf.jsqlparser.expression.LongValue;
+import net.sf.jsqlparser.expression.Parenthesis;
 import net.sf.jsqlparser.expression.StringValue;
+import net.sf.jsqlparser.expression.operators.arithmetic.Modulo;
 import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
 import net.sf.jsqlparser.expression.operators.conditional.OrExpression;
-import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
-import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
-import net.sf.jsqlparser.expression.operators.relational.InExpression;
+import net.sf.jsqlparser.expression.operators.relational.*;
 import net.sf.jsqlparser.parser.CCJSqlParserUtil;
 import net.sf.jsqlparser.schema.Column;
 
@@ -134,7 +132,7 @@ public class AuthorityUtil {
                 if (dataAuthExpression == null) {
                     dataAuthExpression = expression;
                 } else {
-                    dataAuthExpression = new OrExpression(dataAuthExpression, expression);
+                    dataAuthExpression = new OrExpression(dataAuthExpression, new Parenthesis(expression));
                 }
             }
         }
@@ -158,7 +156,7 @@ public class AuthorityUtil {
 
             for (String str : split) {
                 //如果是数字 并且  包含当前
-                if(StrUtil.isNumeric(str)){
+                if (StrUtil.isNumeric(str)) {
                     Integer order = Convert.toInt(str);
 
                     Optional<DataAuthConfig> configOptional = configs.stream().filter(x -> ObjectUtil.equals(x.getOrderNumber(), order)).findFirst();
@@ -167,8 +165,7 @@ public class AuthorityUtil {
                     }
                     Expression expression = getExpression(tableAlias, configOptional.get());
                     resultExpresionString.append(expression);
-                }
-                else {
+                } else {
                     resultExpresionString.append(str);
                 }
             }
@@ -248,60 +245,52 @@ public class AuthorityUtil {
 
     /**
      * 拼接所有的权限表达式
+     *
      * @param tableAlias
      * @param dataAuthExpression
      * @param config
      * @return
      */
     private static Expression getExpression(String tableAlias, Expression dataAuthExpression, DataAuthConfig config) {
+        Integer conditionType = config.getConditionType();
         if (config.getFieldType() == DataAuthFieldTypeEnum.STRING.getCode()) {
-            EqualsTo equalsTo = new EqualsTo();
-            equalsTo.setLeftExpression(buildColumn(tableAlias, config.getFieldName()));
-            equalsTo.setRightExpression(new StringValue(config.getFieldValue()));
-
             //如果是第一个条件 直接赋值
             if (ObjectUtil.isNull(dataAuthExpression)) {
-                dataAuthExpression = equalsTo;
+                dataAuthExpression = getConditionType(conditionType, tableAlias, config.getFieldName(), config.getFieldValue());
             } else {
-                dataAuthExpression = new AndExpression(dataAuthExpression, equalsTo);
+                dataAuthExpression = new AndExpression(dataAuthExpression, getConditionType(conditionType, tableAlias, config.getFieldName(), config.getFieldValue()));
             }
         } else if (config.getFieldType() == DataAuthFieldTypeEnum.INT.getCode()) {
-            EqualsTo equalsTo = new EqualsTo();
-            equalsTo.setLeftExpression(buildColumn(tableAlias, config.getFieldName()));
-            equalsTo.setRightExpression(new LongValue(config.getFieldValue()));
             //如果是第一个条件 直接赋值
             if (ObjectUtil.isNull(dataAuthExpression)) {
-                dataAuthExpression = equalsTo;
+                dataAuthExpression = getConditionTypeLong(conditionType, tableAlias, config.getFieldName(), config.getFieldValue());
             } else {
-                dataAuthExpression = new AndExpression(dataAuthExpression, equalsTo);
+                dataAuthExpression = new AndExpression(dataAuthExpression, getConditionTypeLong(conditionType, tableAlias, config.getFieldName(), config.getFieldValue()));
             }
-        } else if (config.getFieldType() == DataAuthFieldTypeEnum.LOGIN_USER_ID.getCode()) {
-            EqualsTo equalsTo = new EqualsTo();
-            equalsTo.setLeftExpression(buildColumn(tableAlias, config.getFieldName()));
-            equalsTo.setRightExpression(new LongValue(StpUtil.getLoginIdAsLong()));
+        } else if (config.getFieldType() == DataAuthFieldTypeEnum.LOGIN_USER_ID.getCode()) {//存在包含、不包含几种情况
+            User user = StpUtil.getTokenSession().get(GlobalConstant.LOGIN_USER_INFO_KEY, new User());
             //如果是第一个条件 直接赋值
             if (ObjectUtil.isNull(dataAuthExpression)) {
-                dataAuthExpression = equalsTo;
+                dataAuthExpression = getConditionType(conditionType, tableAlias, config.getFieldName(), user.getId().toString());
             } else {
-                dataAuthExpression = new AndExpression(dataAuthExpression, equalsTo);
+                dataAuthExpression = new AndExpression(dataAuthExpression, getConditionType(conditionType, tableAlias, config.getFieldName(), user.getId().toString()));
             }
-        } else if (config.getFieldType() == DataAuthFieldTypeEnum.LOGIN_DEP_ID.getCode()) {
+        } else if (config.getFieldType() == DataAuthFieldTypeEnum.LOGIN_DEP_ID.getCode()) {//只存在包含于,不包含于这两种,其它全部按包含于处理
             InExpression inExpression = new InExpression();
-            inExpression.setLeftExpression(buildColumn(tableAlias, config.getFieldName()));
             List<Department> departmentList = StpUtil.getTokenSession().get(GlobalConstant.LOGIN_USER_DEPT_LIST_KEY, new ArrayList<>(0));
             List<Expression> list = new ArrayList<>();
+            inExpression.setLeftExpression(buildColumn(tableAlias, config.getFieldName()));
             for (Department department : departmentList) {
-                list.add(new LongValue(department.getId()));
+                list.add(new StringValue(department.getId().toString()));
             }
-
-            inExpression.setRightItemsList(new ExpressionList(list));
-            //如果是第一个条件 直接赋值
+            String Message = "该登陆人没有所属部门";
+            inExpression = getConditionTypeList(inExpression,conditionType,list,Message);
             if (ObjectUtil.isNull(dataAuthExpression)) {
                 dataAuthExpression = inExpression;
             } else {
                 dataAuthExpression = new AndExpression(dataAuthExpression, inExpression);
             }
-        } else if (config.getFieldType() == DataAuthFieldTypeEnum.LOGIN_DEP_CHILD_ID.getCode()) {
+        } else if (config.getFieldType() == DataAuthFieldTypeEnum.LOGIN_DEP_CHILD_ID.getCode()) {//只存在包含于,不包含于这两种,其它全部按包含于处理
             InExpression inExpression = new InExpression();
             inExpression.setLeftExpression(buildColumn(tableAlias, config.getFieldName()));
             List<Department> departmentList = redisUtil.get(GlobalConstant.DEP_CACHE_KEY, new TypeReference<List<Department>>() {
@@ -313,43 +302,39 @@ public class AuthorityUtil {
             myAndOrgAndChildOrgUserId.addAll(currentDepartmentIdList);
             List<Expression> list = new ArrayList<>();
             for (Long id : myAndOrgAndChildOrgUserId) {
-                list.add(new LongValue(id));
+                list.add(new StringValue(id.toString()));
             }
-
-            inExpression.setRightItemsList(new ExpressionList(list));
-            //如果是第一个条件 直接赋值
+            String Message = "该登陆人没有所属部门";
+            inExpression = getConditionTypeList(inExpression,conditionType,list,Message);
             if (ObjectUtil.isNull(dataAuthExpression)) {
                 dataAuthExpression = inExpression;
             } else {
                 dataAuthExpression = new AndExpression(dataAuthExpression, inExpression);
             }
         } else if (config.getFieldType() == DataAuthFieldTypeEnum.LOGIN_USER_NAME.getCode()) {
-            EqualsTo equalsTo = new EqualsTo();
-            equalsTo.setLeftExpression(buildColumn(tableAlias, config.getFieldName()));
             User user = StpUtil.getTokenSession().get(GlobalConstant.LOGIN_USER_INFO_KEY, new User());
-            equalsTo.setRightExpression(new StringValue(user.getUserName()));
             //如果是第一个条件 直接赋值
             if (ObjectUtil.isNull(dataAuthExpression)) {
-                dataAuthExpression = equalsTo;
+                dataAuthExpression = getConditionType(conditionType, tableAlias, config.getFieldName(), user.getUserName());
             } else {
-                dataAuthExpression = new AndExpression(dataAuthExpression, equalsTo);
+                dataAuthExpression = new AndExpression(dataAuthExpression, getConditionType(conditionType, tableAlias, config.getFieldName(), user.getUserName()));
             }
-        } else if (config.getFieldType() == DataAuthFieldTypeEnum.LOGIN_POST_ID.getCode()) {
+        } else if (config.getFieldType() == DataAuthFieldTypeEnum.LOGIN_POST_ID.getCode()) {//只存在包含于,不包含于这两种,其它全部按包含于处理
             InExpression inExpression = new InExpression();
             inExpression.setLeftExpression(buildColumn(tableAlias, config.getFieldName()));
             List<Post> postList = StpUtil.getTokenSession().get(GlobalConstant.LOGIN_USER_POST_LIST_KEY, new ArrayList<>());
             List<Expression> list = new ArrayList<>();
             for (Post post : postList) {
-                list.add(new LongValue(post.getId()));
+                list.add(new StringValue(post.getId().toString()));
             }
-            inExpression.setRightItemsList(new ExpressionList(list));
-            //如果是第一个条件 直接赋值
+            String Message = "该登陆人没有所属岗位";
+            inExpression = getConditionTypeList(inExpression,conditionType,list,Message);
             if (ObjectUtil.isNull(dataAuthExpression)) {
                 dataAuthExpression = inExpression;
             } else {
                 dataAuthExpression = new AndExpression(dataAuthExpression, inExpression);
             }
-        } else {
+        } else {//只存在包含于,不包含于这两种,其它全部按包含于处理
             InExpression inExpression = new InExpression();
             inExpression.setLeftExpression(buildColumn(tableAlias, config.getFieldName()));
             List<Long> roleIdList = StpUtil.getTokenSession().get(GlobalConstant.LOGIN_USER_ROLE_ID_KEY, new ArrayList<>());
@@ -357,8 +342,8 @@ public class AuthorityUtil {
             for (Long id : roleIdList) {
                 list.add(new LongValue(id));
             }
-            inExpression.setRightItemsList(new ExpressionList(list));
-            //如果是第一个条件 直接赋值
+            String Message = "该登陆人没有所属角色";
+            inExpression = getConditionTypeList(inExpression,conditionType,list,Message);
             if (ObjectUtil.isNull(dataAuthExpression)) {
                 dataAuthExpression = inExpression;
             } else {
@@ -370,37 +355,30 @@ public class AuthorityUtil {
 
     /**
      * 只返回一个权限表达式
+     *
      * @param tableAlias
      * @param config
      * @return
      */
     private static Expression getExpression(String tableAlias, DataAuthConfig config) {
+        Integer conditionType = config.getConditionType();
         if (config.getFieldType() == DataAuthFieldTypeEnum.STRING.getCode()) {
-            EqualsTo equalsTo = new EqualsTo();
-            equalsTo.setLeftExpression(buildColumn(tableAlias, config.getFieldName()));
-            equalsTo.setRightExpression(new StringValue(config.getFieldValue()));
-            return equalsTo;
+            return getConditionType(conditionType, tableAlias, config.getFieldName(), config.getFieldValue());
         } else if (config.getFieldType() == DataAuthFieldTypeEnum.INT.getCode()) {
-            EqualsTo equalsTo = new EqualsTo();
-            equalsTo.setLeftExpression(buildColumn(tableAlias, config.getFieldName()));
-            equalsTo.setRightExpression(new LongValue(config.getFieldValue()));
-            return equalsTo;
-        } else if (config.getFieldType() == DataAuthFieldTypeEnum.LOGIN_USER_ID.getCode()) {
-            EqualsTo equalsTo = new EqualsTo();
-            equalsTo.setLeftExpression(buildColumn(tableAlias, config.getFieldName()));
-            equalsTo.setRightExpression(new LongValue(StpUtil.getLoginIdAsLong()));
-            return equalsTo;
+            return getConditionTypeLong(conditionType, tableAlias, config.getFieldName(), config.getFieldValue());
+        } else if (config.getFieldType() == DataAuthFieldTypeEnum.LOGIN_USER_ID.getCode()) {//存在包含、不包含两种情况
+            User user = StpUtil.getTokenSession().get(GlobalConstant.LOGIN_USER_INFO_KEY, new User());
+            return getConditionType(conditionType, tableAlias, config.getFieldName(), user.getId().toString());
         } else if (config.getFieldType() == DataAuthFieldTypeEnum.LOGIN_DEP_ID.getCode()) {
             InExpression inExpression = new InExpression();
             inExpression.setLeftExpression(buildColumn(tableAlias, config.getFieldName()));
             List<Department> departmentList = StpUtil.getTokenSession().get(GlobalConstant.LOGIN_USER_DEPT_LIST_KEY, new ArrayList<>(0));
             List<Expression> list = new ArrayList<>();
             for (Department department : departmentList) {
-                list.add(new LongValue(department.getId()));
+                list.add(new StringValue(department.getId().toString()));
             }
-
-            inExpression.setRightItemsList(new ExpressionList(list));
-            return inExpression;
+            String Message = "该登陆人没有所属部门";
+            return getConditionTypeList(inExpression,conditionType,list,Message);
         } else if (config.getFieldType() == DataAuthFieldTypeEnum.LOGIN_DEP_CHILD_ID.getCode()) {
             InExpression inExpression = new InExpression();
             inExpression.setLeftExpression(buildColumn(tableAlias, config.getFieldName()));
@@ -413,41 +391,185 @@ public class AuthorityUtil {
             myAndOrgAndChildOrgUserId.addAll(currentDepartmentIdList);
             List<Expression> list = new ArrayList<>();
             for (Long id : myAndOrgAndChildOrgUserId) {
-                list.add(new LongValue(id));
+                list.add(new StringValue(id.toString()));
             }
-
-            inExpression.setRightItemsList(new ExpressionList(list));
-            //如果是第一个条件 直接赋值
-            return inExpression;
+            String Message = "该登陆人没有所属部门";
+            return getConditionTypeList(inExpression,conditionType,list,Message);
         } else if (config.getFieldType() == DataAuthFieldTypeEnum.LOGIN_USER_NAME.getCode()) {
-            EqualsTo equalsTo = new EqualsTo();
-            equalsTo.setLeftExpression(buildColumn(tableAlias, config.getFieldName()));
             User user = StpUtil.getTokenSession().get(GlobalConstant.LOGIN_USER_INFO_KEY, new User());
-            equalsTo.setRightExpression(new StringValue(user.getUserName()));
-            return equalsTo;
+            return getConditionType(conditionType, tableAlias, config.getFieldName(), user.getUserName());
         } else if (config.getFieldType() == DataAuthFieldTypeEnum.LOGIN_POST_ID.getCode()) {
             InExpression inExpression = new InExpression();
             inExpression.setLeftExpression(buildColumn(tableAlias, config.getFieldName()));
             List<Post> postList = StpUtil.getTokenSession().get(GlobalConstant.LOGIN_USER_POST_LIST_KEY, new ArrayList<>());
             List<Expression> list = new ArrayList<>();
             for (Post post : postList) {
-                list.add(new LongValue(post.getId()));
+                list.add(new StringValue(post.getId().toString()));
             }
-            inExpression.setRightItemsList(new ExpressionList(list));
-            return inExpression;
+            String Message = "该登陆人没有所属岗位";
+            return getConditionTypeList(inExpression,conditionType,list,Message);
         } else {
             InExpression inExpression = new InExpression();
             inExpression.setLeftExpression(buildColumn(tableAlias, config.getFieldName()));
             List<Long> roleIdList = StpUtil.getTokenSession().get(GlobalConstant.LOGIN_USER_ROLE_ID_KEY, new ArrayList<>());
             List<Expression> list = new ArrayList<>();
             for (Long id : roleIdList) {
-                list.add(new LongValue(id));
+                list.add(new StringValue(id.toString()));
             }
+            String Message = "该登陆人没有所属角色";
+            return getConditionTypeList(inExpression,conditionType,list,Message);
+        }
+    }
+
+    public static InExpression getConditionTypeList(InExpression inExpression, Integer conditionType, List<Expression> list,String Message) {
+        if (conditionType == DataAuthConditionTypeEnum.NO_CONTAINED_IN.getCode()) {//包含于,其它全部按包含于处理
+            inExpression.setRightItemsList(new ExpressionList(list));
+            inExpression.setNot(true);
+        } else if (conditionType == DataAuthConditionTypeEnum.EQUAL_TO.getCode()) {//等于,获取第一个部门id
+            if (list.size() > 0) {
+                inExpression.setRightItemsList(new ExpressionList(list.get(0)));
+            } else {
+                throw new MyException(Message);
+            }
+        } else if (conditionType == DataAuthConditionTypeEnum.NO_EQUAL_TO.getCode()) {//不等于,获取第一个部门id
+            if (list.size() > 0) {
+                inExpression.setRightItemsList(new ExpressionList(list.get(0)));
+                inExpression.setNot(true);
+            } else {
+                throw new MyException(Message);
+            }
+        } else {
             inExpression.setRightItemsList(new ExpressionList(list));
-            return inExpression;
         }
+        return inExpression;
     }
 
+    public static Expression getConditionType(Integer conditionType, String tableAlias, String fieldName, String fieldValue) {
+        if (conditionType == DataAuthConditionTypeEnum.EQUAL_TO.getCode()) {
+            EqualsTo equalsTo = new EqualsTo(); //等于
+            equalsTo.setLeftExpression(buildColumn(tableAlias, fieldName));
+            equalsTo.setRightExpression(new StringValue(fieldValue));
+            return equalsTo;
+        } else if (conditionType == DataAuthConditionTypeEnum.GREATER_THAN.getCode()) {
+            GreaterThan greaterThan = new GreaterThan(); //大于
+            greaterThan.setLeftExpression(buildColumn(tableAlias, fieldName));
+            greaterThan.setRightExpression(new StringValue(fieldValue));
+            return greaterThan;
+        } else if (conditionType == DataAuthConditionTypeEnum.GREATER_THAN_EQUAL.getCode()) {
+            GreaterThanEquals greaterThanEquals = new GreaterThanEquals();//大于等于
+            greaterThanEquals.setLeftExpression(buildColumn(tableAlias, fieldName));
+            greaterThanEquals.setRightExpression(new StringValue(fieldValue));
+            return greaterThanEquals;
+        } else if (conditionType == DataAuthConditionTypeEnum.MINOR_THAN.getCode()) {
+            MinorThan minorThan = new MinorThan();//小于
+            minorThan.setLeftExpression(buildColumn(tableAlias, fieldName));
+            minorThan.setRightExpression(new StringValue(fieldValue));
+            return minorThan;
+        } else if (conditionType == DataAuthConditionTypeEnum.MINOR_THAN_EQUAL.getCode()) {
+            MinorThanEquals minorThanEquals = new MinorThanEquals();//小于等于
+            minorThanEquals.setLeftExpression(buildColumn(tableAlias, fieldName));
+            minorThanEquals.setRightExpression(new StringValue(fieldValue));
+            return minorThanEquals;
+        } else if (conditionType == DataAuthConditionTypeEnum.CONTAIN.getCode()) {//包含
+            LikeExpression likeExpression = new LikeExpression();
+            likeExpression.setLeftExpression(buildColumn(tableAlias, fieldName));
+            likeExpression.setRightExpression(new StringValue("%" + fieldValue + "%"));
+            return likeExpression;
+        } else if (conditionType == DataAuthConditionTypeEnum.CONTAINED_IN.getCode()) {//包含于
+            LikeExpression likeExpression = new LikeExpression();
+            likeExpression.setLeftExpression(new StringValue(fieldValue));
+            likeExpression.setRightExpression(buildColumn(tableAlias, fieldName));
+            return likeExpression;
+        } else if (conditionType == DataAuthConditionTypeEnum.NO_EQUAL_TO.getCode()) {//不等于
+            NotEqualsTo notEqualsTo = new NotEqualsTo();
+            notEqualsTo.setLeftExpression(buildColumn(tableAlias, fieldName));
+            notEqualsTo.setRightExpression(new StringValue(fieldValue));
+            return notEqualsTo;
+        } else if (conditionType == DataAuthConditionTypeEnum.NO_CONTAIN.getCode()) {//不包含
+            LikeExpression likeExpression = new LikeExpression();
+            likeExpression.setLeftExpression(buildColumn(tableAlias, fieldName));
+            likeExpression.setNot(true);
+            likeExpression.setRightExpression(new StringValue("%" + fieldValue + "%"));
+            return likeExpression;
+        } else if (conditionType == DataAuthConditionTypeEnum.NO_CONTAINED_IN.getCode()) {//不包含于
+            LikeExpression likeExpression = new LikeExpression();
+            likeExpression.setNot(true);
+            likeExpression.setLeftExpression(new StringValue(fieldValue));
+            likeExpression.setRightExpression(buildColumn(tableAlias, fieldName));
+            return likeExpression;
+        } else {
+            throw new MyException("条件不成立");
+        }
+    }
+
+    public static Expression getConditionTypeLong(Integer conditionType, String tableAlias, String fieldName, String fieldValue) {
+        if (conditionType == DataAuthConditionTypeEnum.EQUAL_TO.getCode()) {
+            EqualsTo equalsTo = new EqualsTo(); //等于
+            equalsTo.setLeftExpression(buildColumn(tableAlias, fieldName));
+            equalsTo.setRightExpression(new LongValue(fieldValue));
+            return equalsTo;
+        } else if (conditionType == DataAuthConditionTypeEnum.GREATER_THAN.getCode()) {
+            GreaterThan greaterThan = new GreaterThan(); //大于
+            greaterThan.setLeftExpression(buildColumn(tableAlias, fieldName));
+            greaterThan.setRightExpression(new LongValue(fieldValue));
+            return greaterThan;
+        } else if (conditionType == DataAuthConditionTypeEnum.GREATER_THAN_EQUAL.getCode()) {
+            GreaterThanEquals greaterThanEquals = new GreaterThanEquals();//大于等于
+            greaterThanEquals.setLeftExpression(buildColumn(tableAlias, fieldName));
+            greaterThanEquals.setRightExpression(new LongValue(fieldValue));
+            return greaterThanEquals;
+        } else if (conditionType == DataAuthConditionTypeEnum.MINOR_THAN.getCode()) {
+            MinorThan minorThan = new MinorThan();//小于
+            minorThan.setLeftExpression(buildColumn(tableAlias, fieldName));
+            minorThan.setRightExpression(new LongValue(fieldValue));
+            return minorThan;
+        } else if (conditionType == DataAuthConditionTypeEnum.MINOR_THAN_EQUAL.getCode()) {
+            MinorThanEquals minorThanEquals = new MinorThanEquals();//小于等于
+            minorThanEquals.setLeftExpression(buildColumn(tableAlias, fieldName));
+            minorThanEquals.setRightExpression(new LongValue(fieldValue));
+            return minorThanEquals;
+        } else if (conditionType == DataAuthConditionTypeEnum.CONTAIN.getCode()) {//包含
+            InExpression inExpression = new InExpression();
+            inExpression.setLeftExpression(buildColumn(tableAlias, fieldName));
+            List<Expression> list = new ArrayList<>();
+            list.add(new LongValue(fieldValue));
+            inExpression.setRightItemsList(new ExpressionList(list));
+//            LikeExpression likeExpression = new LikeExpression();
+//            likeExpression.setLeftExpression(buildColumn(tableAlias, fieldName));
+//            likeExpression.setRightExpression(new StringValue("%" + fieldValue + "%"));
+            return inExpression;
+        } else if (conditionType == DataAuthConditionTypeEnum.CONTAINED_IN.getCode()) {//包含于
+            InExpression inExpression = new InExpression();
+            inExpression.setLeftExpression(new LongValue(fieldValue));
+            List<Expression> list = new ArrayList<>();
+            list.add(buildColumn(tableAlias, fieldName));
+            inExpression.setRightItemsList(new ExpressionList(list));
+            return inExpression;
+        } else if (conditionType == DataAuthConditionTypeEnum.NO_EQUAL_TO.getCode()) {//不等于
+            NotEqualsTo notEqualsTo = new NotEqualsTo();
+            notEqualsTo.setLeftExpression(buildColumn(tableAlias, fieldName));
+            notEqualsTo.setRightExpression(new LongValue(fieldValue));
+            return notEqualsTo;
+        } else if (conditionType == DataAuthConditionTypeEnum.NO_CONTAIN.getCode()) {//不包含
+            InExpression inExpression = new InExpression();
+            inExpression.setLeftExpression(buildColumn(tableAlias, fieldName));
+            List<Expression> list = new ArrayList<>();
+            list.add(new LongValue(fieldValue));
+            inExpression.setRightItemsList(new ExpressionList(list));
+            inExpression.setNot(true);
+            return inExpression;
+        } else if (conditionType == DataAuthConditionTypeEnum.NO_CONTAINED_IN.getCode()) {//不包含于
+            InExpression inExpression = new InExpression();
+            inExpression.setLeftExpression(new LongValue(fieldValue));
+            List<Expression> list = new ArrayList<>();
+            list.add(buildColumn(tableAlias, fieldName));
+            inExpression.setRightItemsList(new ExpressionList(list));
+            inExpression.setNot(true);
+            return inExpression;
+        } else {
+            throw new MyException("条件不成立");
+        }
+    }
 
     /**
      * 构建Column

+ 14 - 14
src/main/java/com/xjrsoft/module/erpModel/caseErpBom/controller/CaseErpBomController.java

@@ -93,8 +93,8 @@ public class CaseErpBomController {
         CaseErpBom copy = BeanUtil.toBean(dto, CaseErpBom.class);
         if(ObjectUtil.isNotEmpty(dto.getParentId()) && dto.getParentId()!= 0L){
             CaseErpBom caseErpBom = list.stream().filter(x -> x.getId().equals(dto.getParentId())).findFirst().orElse(new CaseErpBom());
-            if (StrUtil.isNotBlank(caseErpBom.getLevel())){
-                List<Long> ids = StrUtil.split(caseErpBom.getLevel().toString(), StringPool.DASH)
+            if (StrUtil.isNotBlank(caseErpBom.getBomLevel())){
+                List<Long> ids = StrUtil.split(caseErpBom.getBomLevel().toString(), StringPool.DASH)
                         .stream().map(str -> Long.valueOf(str)).collect(Collectors.toList());
                 if (CollectionUtil.isNotEmpty(ids)){
                     List<Long> materialIds = list.stream().filter(x -> ids.contains(x.getId())).map(CaseErpBom::getMaterialId).collect(Collectors.toList());
@@ -120,9 +120,9 @@ public class CaseErpBomController {
         //保存层级
         if (ObjectUtil.isNotEmpty(dto.getParentId())&& dto.getParentId()!= 0L){
             CaseErpBom caseErpBom = list.stream().filter(x -> x.getId().equals(dto.getParentId())).findFirst().orElse(new CaseErpBom());
-            copy.setLevel(caseErpBom.getLevel()+ StringPool.DASH + copy.getId());
+            copy.setBomLevel(caseErpBom.getBomLevel()+ StringPool.DASH + copy.getId());
         }else {
-            copy.setLevel(copy.getId().toString());
+            copy.setBomLevel(copy.getId().toString());
         }
         caseErpBomService.updateById(copy);
         return R.ok();
@@ -139,8 +139,8 @@ public class CaseErpBomController {
                             .select(CaseErpBom::getId)
                             .select(CaseErpBom.class, x -> VoToColumnUtil.fieldsToColumns(CaseErpBomVo.class).contains(x.getProperty())));
             //子级物料信息
-            List<Long> childIds = caseErpBomService.list().stream().filter(x -> StrUtil.isNotBlank(x.getLevel())
-                    && x.getLevel().contains(id + StringPool.DASH)).map(CaseErpBom::getId).collect(Collectors.toList());
+            List<Long> childIds = caseErpBomService.list().stream().filter(x -> StrUtil.isNotBlank(x.getBomLevel())
+                    && x.getBomLevel().contains(id + StringPool.DASH)).map(CaseErpBom::getId).collect(Collectors.toList());
             if (CollectionUtil.isNotEmpty(childIds)){
                 List<CaseErpBomVo> caseErpBomVoList = caseErpBomService.selectJoinList(CaseErpBomVo.class,
                         MPJWrappers.<CaseErpBom>lambdaJoin()
@@ -168,9 +168,9 @@ public class CaseErpBomController {
         List<CaseErpBom> list = caseErpBomService.list();
         if(ObjectUtil.isNotEmpty(dto.getParentId())){
             CaseErpBom caseErpBom = list.stream().filter(x -> x.getId().equals(dto.getParentId())).findFirst().orElse(new CaseErpBom());
-            if (StrUtil.isNotBlank(caseErpBom.getLevel())){
+            if (StrUtil.isNotBlank(caseErpBom.getBomLevel())){
                 //上级bom信息
-                List<Long> ids = StrUtil.split(caseErpBom.getLevel().toString(), StringPool.DASH)
+                List<Long> ids = StrUtil.split(caseErpBom.getBomLevel().toString(), StringPool.DASH)
                         .stream().map(str -> Long.valueOf(str)).collect(Collectors.toList());
                 if (CollectionUtil.isNotEmpty(ids)){
                     List<Long> materialIds = list.stream().filter(x -> ids.contains(x.getId())).map(CaseErpBom::getMaterialId).collect(Collectors.toList());
@@ -179,8 +179,8 @@ public class CaseErpBomController {
                     }
                 }
                 //下级bom信息
-                List<Long> childIds = list.stream().filter(x -> StrUtil.isNotBlank(x.getLevel())
-                        && x.getLevel().contains(caseErpBom.getId() + StringPool.DASH)).map(CaseErpBom::getId).collect(Collectors.toList());
+                List<Long> childIds = list.stream().filter(x -> StrUtil.isNotBlank(x.getBomLevel())
+                        && x.getBomLevel().contains(caseErpBom.getId() + StringPool.DASH)).map(CaseErpBom::getId).collect(Collectors.toList());
                 if (CollectionUtil.isNotEmpty(childIds)){
                     List<Long> materialIds = list.stream().filter(x -> childIds.contains(x.getId())).map(CaseErpBom::getMaterialId).collect(Collectors.toList());
                     if(materialIds.contains(dto.getMaterialId())){
@@ -212,8 +212,8 @@ public class CaseErpBomController {
         CaseErpBom caseErpBom = list.stream().filter(x -> x.getId().equals(id)).findFirst().orElse(new CaseErpBom());
         if (ObjectUtil.isNotEmpty(caseErpBom)){
             //下级物料信息
-            List<Long> childIds = list.stream().filter(x -> StrUtil.isNotBlank(x.getLevel())
-                    && x.getLevel().contains(caseErpBom.getId() + StringPool.DASH)).map(CaseErpBom::getId).collect(Collectors.toList());
+            List<Long> childIds = list.stream().filter(x -> StrUtil.isNotBlank(x.getBomLevel())
+                    && x.getBomLevel().contains(caseErpBom.getId() + StringPool.DASH)).map(CaseErpBom::getId).collect(Collectors.toList());
             if (CollectionUtil.isNotEmpty(childIds)){
                 return R.error("存在下级物料信息,不允许删除");
             }
@@ -276,9 +276,9 @@ public class CaseErpBomController {
             //保存层级
             if (ObjectUtil.isNotEmpty(caseErpBom.getParentId())&& caseErpBom.getParentId()!= 0L){
                 CaseErpBom caseErpBom1 = list.stream().filter(x -> x.getId().equals(caseErpBom.getParentId())).findFirst().orElse(new CaseErpBom());
-                caseErpBom.setLevel(caseErpBom1.getLevel()+ StringPool.DASH + caseErpBom.getId());
+                caseErpBom.setBomLevel(caseErpBom1.getBomLevel()+ StringPool.DASH + caseErpBom.getId());
             }else {
-                caseErpBom.setLevel(caseErpBom.getId().toString());
+                caseErpBom.setBomLevel(caseErpBom.getId().toString());
             }
         }
         caseErpBomService.updateBatchById(caseErpBomList);

+ 3 - 1
src/main/java/com/xjrsoft/module/erpModel/caseErpBom/dto/UpdateCaseErpBomDto.java

@@ -1,6 +1,7 @@
 package com.xjrsoft.module.erpModel.caseErpBom.dto;
 
 import com.alibaba.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -17,7 +18,8 @@ public class UpdateCaseErpBomDto implements Serializable {
     private Long parentId;
 
     @ApiModelProperty("层级")
-    private String level;
+    @JsonProperty("level")
+    private String bomLevel;
 
     @ApiModelProperty("物料外键id")
     private Long materialId;

+ 1 - 1
src/main/java/com/xjrsoft/module/erpModel/caseErpBom/entity/CaseErpBom.java

@@ -34,7 +34,7 @@ public class CaseErpBom extends AuditEntity implements Serializable {
     private Long parentId;
 
     @ApiModelProperty("层级")
-    private String level;
+    private String bomLevel;
 
     @ApiModelProperty("物料外键id")
     private Long materialId;

+ 3 - 1
src/main/java/com/xjrsoft/module/erpModel/caseErpBom/vo/CaseErpBomTreeVo.java

@@ -1,6 +1,7 @@
 package com.xjrsoft.module.erpModel.caseErpBom.vo;
 
 import com.alibaba.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.xjrsoft.common.model.tree.ITreeNode;
 import com.xjrsoft.module.organization.vo.DepartmentTreeVo;
 import io.swagger.annotations.ApiModelProperty;
@@ -22,7 +23,8 @@ public class CaseErpBomTreeVo implements ITreeNode<CaseErpBomTreeVo,Long>, Seria
     private Long parentId;
 
     @ApiModelProperty("层级")
-    private String level;
+    @JsonProperty("level")
+    private String bomLevel;
 
     @ApiModelProperty("物料外键id")
     private Long materialId;

+ 2 - 1
src/main/java/com/xjrsoft/module/erpModel/caseErpCustomer/controller/CaseErpCustomerGatherDetailController.java

@@ -12,6 +12,7 @@ import com.xjrsoft.module.erpModel.caseErpCustomer.dto.UpdateCaseErpCustomerGath
 import com.xjrsoft.module.erpModel.caseErpCustomer.entity.CaseErpCustomerGather;
 import com.xjrsoft.module.erpModel.caseErpCustomer.entity.CaseErpCustomerGatherDetail;
 import com.xjrsoft.module.erpModel.caseErpCustomer.service.ICaseErpCustomerGatherDetailService;
+import com.xjrsoft.module.erpModel.caseErpCustomer.vo.CaseErpCusGatherDetailInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
@@ -56,7 +57,7 @@ public class CaseErpCustomerGatherDetailController {
         if (caseErpCustomerGatherDetail == null) {
             R.error("找不到此客户回款详情信息!");
         }
-        return R.ok(caseErpCustomerGatherDetail);
+        return R.ok(BeanUtil.toBean(caseErpCustomerGatherDetail, CaseErpCusGatherDetailInfo.class));
     }
 
     @DeleteMapping

+ 3 - 1
src/main/java/com/xjrsoft/module/erpModel/caseErpCustomer/dto/AddCaseErpCustomerGatherDetailDto.java

@@ -1,6 +1,7 @@
 package com.xjrsoft.module.erpModel.caseErpCustomer.dto;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -21,7 +22,8 @@ public class AddCaseErpCustomerGatherDetailDto implements Serializable {
 
     @ApiModelProperty("回款日期")
     @JsonFormat(pattern = "yyyy-MM-dd")
-    private Timestamp date;
+    @JsonProperty("date")
+    private Timestamp refundDate;
 
     @ApiModelProperty("附件")
     private String filePath;

+ 3 - 1
src/main/java/com/xjrsoft/module/erpModel/caseErpCustomer/dto/UpdateCaseErpCustomerGatherDetailDto.java

@@ -1,6 +1,7 @@
 package com.xjrsoft.module.erpModel.caseErpCustomer.dto;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -22,7 +23,8 @@ public class UpdateCaseErpCustomerGatherDetailDto implements Serializable {
 
     @ApiModelProperty("回款日期")
     @JsonFormat(pattern = "yyyy-MM-dd")
-    private Timestamp date;
+    @JsonProperty("date")
+    private Timestamp refundDate;
 
     @ApiModelProperty("附件")
     private String filePath;

+ 3 - 3
src/main/java/com/xjrsoft/module/erpModel/caseErpCustomer/entity/CaseErpCustomerGatherDetail.java

@@ -19,8 +19,8 @@ import lombok.EqualsAndHashCode;
  * @author hnyyzy
  * @since 2023-07-12
  */
-@TableName("case_erp_customer_gather_detail")
-@ApiModel(value = "CaseErpCustomerGatherDetail对象", description = "客户回款详情【case_erp_customer_gather_detail】")
+@TableName("case_erp_cus_gather_detail")
+@ApiModel(value = "CaseErpCusGatherDetail对象", description = "客户回款详情【case_erp_cus_gather_detail】")
 @Data
 @EqualsAndHashCode(callSuper = false)
 public class CaseErpCustomerGatherDetail extends AuditEntity implements Serializable {
@@ -37,7 +37,7 @@ public class CaseErpCustomerGatherDetail extends AuditEntity implements Serializ
     private BigDecimal amountCollect;
 
     @ApiModelProperty("回款日期")
-    private LocalDateTime date;
+    private LocalDateTime refundDate;
 
     @ApiModelProperty("附件")
     private String filePath;

+ 2 - 2
src/main/java/com/xjrsoft/module/erpModel/caseErpCustomer/service/impl/CaseErpCustomerServiceImpl.java

@@ -345,8 +345,8 @@ public class CaseErpCustomerServiceImpl extends MPJBaseServiceImpl<CaseErpCustom
         result.add(customerAllVo2);
 
         List<CaseErpCustomerGatherDetail> caseErpCustomergatherdetails = caseErpCustomerGatherDetailMapper.selectList(Wrappers.<CaseErpCustomerGatherDetail>query().lambda()
-                .gt(CaseErpCustomerGatherDetail::getDate,DateUtil.offset(DateUtil.parse(DateUtil.now(),"yyyy-MM-dd"), DateField.DAY_OF_MONTH,-1))
-                .lt(CaseErpCustomerGatherDetail::getDate,DateUtil.offset(DateUtil.parse(DateUtil.now(),"yyyy-MM-dd"), DateField.DAY_OF_MONTH,1)));
+                .gt(CaseErpCustomerGatherDetail::getRefundDate,DateUtil.offset(DateUtil.parse(DateUtil.now(),"yyyy-MM-dd"), DateField.DAY_OF_MONTH,-1))
+                .lt(CaseErpCustomerGatherDetail::getRefundDate,DateUtil.offset(DateUtil.parse(DateUtil.now(),"yyyy-MM-dd"), DateField.DAY_OF_MONTH,1)));
         CustomerAllVo customerAllVo3=new CustomerAllVo();
         customerAllVo3.setName("今日回款客户");
         customerAllVo3.setNum(caseErpCustomergatherdetails.size());

+ 37 - 0
src/main/java/com/xjrsoft/module/erpModel/caseErpCustomer/vo/CaseErpCusGatherDetailInfo.java

@@ -0,0 +1,37 @@
+package com.xjrsoft.module.erpModel.caseErpCustomer.vo;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.xjrsoft.common.model.base.AuditEntity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.sql.Timestamp;
+
+@Data
+public class CaseErpCusGatherDetailInfo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("主键")
+    private Long id;
+
+    @ApiModelProperty("客户回款外键(case_erp_customer)")
+    private Long gatherId;
+
+    @ApiModelProperty("回款金额")
+    private BigDecimal amountCollect;
+
+    @ApiModelProperty("回款日期")
+    @JsonProperty("date")
+    private Timestamp refundDate;
+
+    @ApiModelProperty("附件")
+    private String filePath;
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+
+}

+ 4 - 1
src/main/java/com/xjrsoft/module/erpModel/caseErpCustomer/vo/CaseErpCustomerGatherDetailVo.java

@@ -1,11 +1,13 @@
 package com.xjrsoft.module.erpModel.caseErpCustomer.vo;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
+import java.sql.Timestamp;
 import java.time.LocalDateTime;
 
 @Data
@@ -23,7 +25,8 @@ public class CaseErpCustomerGatherDetailVo implements Serializable {
 
     @ApiModelProperty("回款日期")
     @JsonFormat(pattern = "yyyy-MM-dd")
-    private LocalDateTime date;
+    @JsonProperty("date")
+    private LocalDateTime refundDate;
 
     @ApiModelProperty("附件")
     private String filePath;

+ 4 - 2
src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/controller/CaseErpDeviceInfoController.java

@@ -24,6 +24,7 @@ import com.xjrsoft.module.erpModel.caseErpDevice.dto.CaseErpDeviceInfoDto;
 import com.xjrsoft.module.erpModel.caseErpDevice.dto.UpdateCaseErpDeviceInfoDto;
 import com.xjrsoft.module.erpModel.caseErpDevice.entity.CaseErpDeviceInfo;
 import com.xjrsoft.module.erpModel.caseErpDevice.service.ICaseErpDeviceInfoService;
+import com.xjrsoft.module.erpModel.caseErpDevice.vo.CaseErpDeviceCodeInfo;
 import com.xjrsoft.module.erpModel.caseErpDevice.vo.CaseErpDeviceInfoExportVo;
 import com.xjrsoft.module.erpModel.caseErpDevice.vo.CaseErpDeviceInfoVo;
 import com.xjrsoft.module.erpModel.caseErpSupplier.entity.CaseErpSupplier;
@@ -126,7 +127,7 @@ public class CaseErpDeviceInfoController {
         if (caseErpDeviceInfo == null) {
             R.error("找不到此设备!");
         }
-        return R.ok(BeanUtil.toBean(caseErpDeviceInfo, CaseErpDeviceInfo.class));
+        return R.ok(BeanUtil.toBean(caseErpDeviceInfo, CaseErpDeviceCodeInfo.class));
     }
 
     @GetMapping(value = "/check")
@@ -174,7 +175,8 @@ public class CaseErpDeviceInfoController {
     @ApiOperation(value = "根据typeId查询相关设备信息")
     public R getByTypeId(@RequestParam Long typeId) {
         List<CaseErpDeviceInfo> caseErpDeviceInfoList = caseErpDeviceInfoService.list(Wrappers.<CaseErpDeviceInfo>query().lambda().eq(CaseErpDeviceInfo::getTypeId, typeId));
-        return R.ok(caseErpDeviceInfoList);
+        List<CaseErpDeviceCodeInfo> caseErpDeviceInfoVoList = BeanUtil.copyToList(caseErpDeviceInfoList, CaseErpDeviceCodeInfo.class);
+        return R.ok(caseErpDeviceInfoVoList);
     }
 
 

+ 6 - 6
src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/controller/CaseErpDeviceWarnController.java

@@ -88,7 +88,7 @@ public class CaseErpDeviceWarnController {
         if (caseErpDeviceWarn == null) {
             R.error("找不到此设备告警!");
         }
-        return R.ok(BeanUtil.toBean(caseErpDeviceWarn, CaseErpDeviceWarn.class));
+        return R.ok(BeanUtil.toBean(caseErpDeviceWarn, CaseErpDeviceWarnInfo.class));
     }
 
     @GetMapping(value = "/check")
@@ -99,8 +99,8 @@ public class CaseErpDeviceWarnController {
             R.error("找不到此设备告警!");
         }
         CaseErpDeviceWarnInfoVo caseErpDeviceWarnInfoVo = BeanUtil.toBean(caseErpDeviceWarn, CaseErpDeviceWarnInfoVo.class);
-        if (ObjectUtil.isNotEmpty(caseErpDeviceWarn.getLevel())){
-            final DictionaryDetail byId = dictionarydetailService.getById(caseErpDeviceWarn.getLevel());
+        if (ObjectUtil.isNotEmpty(caseErpDeviceWarn.getWarnLevel())){
+            final DictionaryDetail byId = dictionarydetailService.getById(caseErpDeviceWarn.getWarnLevel());
             if (StrUtil.isNotBlank(byId.getName())){
                 caseErpDeviceWarnInfoVo.setLevelName(byId.getName());
             }
@@ -141,10 +141,10 @@ public class CaseErpDeviceWarnController {
                         .select(CaseErpDeviceWarn.class, x -> VoToColumnUtil.fieldsToColumns(CaseErpDeviceWarnExportVo.class).contains(x.getProperty()))
                         .leftJoin(DictionaryDetail.class,DictionaryDetail::getId,CaseErpDeviceWarn::getTypeId));
         for (CaseErpDeviceWarnExportVo caseErpDeviceWarnExportVo : erpDeviceInspectExportVoList) {
-            if (ObjectUtil.isNotEmpty(caseErpDeviceWarnExportVo.getLevel())){
-                if (caseErpDeviceWarnExportVo.getLevel().equals(1679372259974070274L)){
+            if (ObjectUtil.isNotEmpty(caseErpDeviceWarnExportVo.getWarnLevel())){
+                if (caseErpDeviceWarnExportVo.getWarnLevel().equals(1679372259974070274L)){
                     caseErpDeviceWarnExportVo.setLevelName("一级故障");//一级故障
-                }else if (caseErpDeviceWarnExportVo.getLevel().equals(1679372325354881026L)){
+                }else if (caseErpDeviceWarnExportVo.getWarnLevel().equals(1679372325354881026L)){
                     caseErpDeviceWarnExportVo.setLevelName("二级故障");//二级故障
                 }else {
                     caseErpDeviceWarnExportVo.setLevelName("三级故障");//三级故障

+ 3 - 1
src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/dto/AddCaseErpDeviceInfoDto.java

@@ -2,6 +2,7 @@ package com.xjrsoft.module.erpModel.caseErpDevice.dto;
 
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import org.hibernate.validator.constraints.Length;
@@ -21,7 +22,8 @@ public class AddCaseErpDeviceInfoDto implements Serializable {
 
     @ApiModelProperty("设备编号")
     @ExcelProperty("设备编号")
-    private String number;
+    @JsonProperty("number")
+    private String code;
 
     @ApiModelProperty("设备名称")
     @ExcelProperty("设备名称")

+ 5 - 2
src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/dto/AddCaseErpDeviceInspectDto.java

@@ -2,6 +2,7 @@ package com.xjrsoft.module.erpModel.caseErpDevice.dto;
 
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.models.auth.In;
 import lombok.Data;
@@ -32,7 +33,8 @@ public class AddCaseErpDeviceInspectDto implements Serializable {
     private Long deviceId;
 
     @ApiModelProperty("设备编号")
-    private String number;
+    @JsonProperty("number")
+    private String code;
 
     @ApiModelProperty("设备位置")
     private String address;
@@ -45,7 +47,8 @@ public class AddCaseErpDeviceInspectDto implements Serializable {
 
     @ApiModelProperty("巡检时间")
     @JsonFormat(pattern = "yyyy-MM-dd")
-    private Timestamp date;
+    @JsonProperty("date")
+    private Timestamp inspectDate;
 
     @ApiModelProperty("附件")
     private String filePath;

+ 3 - 1
src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/dto/UpdateCaseErpDeviceInfoDto.java

@@ -1,6 +1,7 @@
 package com.xjrsoft.module.erpModel.caseErpDevice.dto;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -17,7 +18,8 @@ public class UpdateCaseErpDeviceInfoDto implements Serializable {
     private Long typeId;
 
     @ApiModelProperty("设备编号")
-    private String number;
+    @JsonProperty("number")
+    private String code;
 
     @ApiModelProperty("设备名称")
     private String name;

+ 5 - 2
src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/dto/UpdateCaseErpDeviceInspectDto.java

@@ -1,6 +1,7 @@
 package com.xjrsoft.module.erpModel.caseErpDevice.dto;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
@@ -32,7 +33,8 @@ public class UpdateCaseErpDeviceInspectDto implements Serializable {
     private Long deviceId;
 
     @ApiModelProperty("设备编号")
-    private String number;
+    @JsonProperty("number")
+    private String code;
 
     @ApiModelProperty("设备位置")
     private String address;
@@ -45,7 +47,8 @@ public class UpdateCaseErpDeviceInspectDto implements Serializable {
 
     @ApiModelProperty("巡检时间")
     @JsonFormat(pattern = "yyyy-MM-dd")
-    private Timestamp date;
+    @JsonProperty("date")
+    private Timestamp inspectDate;
 
     @ApiModelProperty("附件")
     private String filePath;

+ 1 - 1
src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/entity/CaseErpDeviceInfo.java

@@ -34,7 +34,7 @@ public class CaseErpDeviceInfo extends AuditEntity implements Serializable {
     private Long typeId;
 
     @ApiModelProperty("设备编号")
-    private String number;
+    private String code;
 
     @ApiModelProperty("设备名称")
     private String name;

+ 2 - 2
src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/entity/CaseErpDeviceInspect.java

@@ -49,7 +49,7 @@ public class CaseErpDeviceInspect  extends AuditEntity implements Serializable {
     private Long deviceId;
 
     @ApiModelProperty("设备编号")
-    private String number;
+    private String code;
 
     @ApiModelProperty("设备位置")
     private String address;
@@ -62,7 +62,7 @@ public class CaseErpDeviceInspect  extends AuditEntity implements Serializable {
 
     @ApiModelProperty("巡检时间")
     @JsonFormat(pattern="yyyy-MM-dd")
-    private LocalDateTime date;
+    private LocalDateTime inspectDate;
 
     @ApiModelProperty("附件")
     private String filePath;

+ 3 - 3
src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/entity/CaseErpDeviceWarn.java

@@ -42,7 +42,7 @@ public class CaseErpDeviceWarn extends AuditEntity implements Serializable {
     private Long typeId;
 
     @ApiModelProperty("设备编号")
-    private String number;
+    private String code;
 
     @ApiModelProperty("设备名称")
     private String name;
@@ -57,10 +57,10 @@ public class CaseErpDeviceWarn extends AuditEntity implements Serializable {
     private String dealWay;
 
     @ApiModelProperty("处理日期")
-    private LocalDateTime date;
+    private LocalDateTime dealDate;
 
     @ApiModelProperty("故障等级,数据字典id")
-    private Long level;
+    private Long warnLevel;
 
     @ApiModelProperty("故障描述")
     private String remark;

+ 2 - 2
src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/service/impl/CaseErpDeviceInspectServiceImpl.java

@@ -56,7 +56,7 @@ public class CaseErpDeviceInspectServiceImpl extends MPJBaseServiceImpl<CaseErpD
         }
         caseErpDeviceInspect.setDeviceId(caseErpDeviceInfo.getId());
         caseErpDeviceInspect.setName(caseErpDeviceInfo.getName());
-        caseErpDeviceInspect.setNumber(caseErpDeviceInfo.getNumber());
+        caseErpDeviceInspect.setCode(caseErpDeviceInfo.getCode());
         caseErpDeviceInspect.setModel(caseErpDeviceInfo.getModel());
         caseErpDeviceInspect.setAddress(caseErpDeviceInfo.getAddress());
         List<User> allUser = redisUtil.get(GlobalConstant.USER_CACHE_KEY, new TypeReference<List<User>>() {
@@ -84,7 +84,7 @@ public class CaseErpDeviceInspectServiceImpl extends MPJBaseServiceImpl<CaseErpD
         }
         caseErpDeviceInspect.setDeviceId(caseErpDeviceInfo.getId());
         caseErpDeviceInspect.setName(caseErpDeviceInfo.getName());
-        caseErpDeviceInspect.setNumber(caseErpDeviceInfo.getNumber());
+        caseErpDeviceInspect.setCode(caseErpDeviceInfo.getCode());
         caseErpDeviceInspect.setModel(caseErpDeviceInfo.getModel());
         caseErpDeviceInspect.setAddress(caseErpDeviceInfo.getAddress());
         List<User> allUser = redisUtil.get(GlobalConstant.USER_CACHE_KEY, new TypeReference<List<User>>() {

+ 59 - 0
src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/vo/CaseErpDeviceCodeInfo.java

@@ -0,0 +1,59 @@
+package com.xjrsoft.module.erpModel.caseErpDevice.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.sql.Timestamp;
+
+
+@Data
+public class CaseErpDeviceCodeInfo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("主键")
+    private Long id;
+
+    @ApiModelProperty("设备类型")
+    private Long typeId;
+
+    @ApiModelProperty("设备编号")
+    @ExcelProperty("设备编号")
+    @JsonProperty("number")
+    private String code;
+
+    @ApiModelProperty("设备名称")
+    private String name;
+
+    @ApiModelProperty("规格型号")
+    private String model;
+
+    @ApiModelProperty("供应商名称")
+    private Long supplierId;
+
+    @ApiModelProperty("购买日期")
+    private Timestamp buyDate;
+
+    @ApiModelProperty("维保日期")
+    private Timestamp maintainDate;
+
+    @ApiModelProperty("负责人ids")
+    private String principalIds;
+    @ApiModelProperty("负责人名称")
+    private String principalNames;
+
+    @ApiModelProperty("报废日期")
+    private Timestamp scrapDate;
+
+    @ApiModelProperty("设备位置")
+    private String address;
+
+    @ApiModelProperty("设备状态(0正常,1异常)")
+    private Integer state;
+
+    @ApiModelProperty("备注")
+    private String remark;
+}

+ 3 - 1
src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/vo/CaseErpDeviceInfoExportVo.java

@@ -2,6 +2,7 @@ package com.xjrsoft.module.erpModel.caseErpDevice.vo;
 
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -19,7 +20,8 @@ public class CaseErpDeviceInfoExportVo implements Serializable {
 
     @ApiModelProperty("设备编号")
     @ExcelProperty("设备编号")
-    private String number;
+    @JsonProperty("number")
+    private String code;
 
     @ApiModelProperty("设备名称")
     @ExcelProperty("设备名称")

+ 3 - 1
src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/vo/CaseErpDeviceInfoVo.java

@@ -2,6 +2,7 @@ package com.xjrsoft.module.erpModel.caseErpDevice.vo;
 
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -22,7 +23,8 @@ public class CaseErpDeviceInfoVo implements Serializable {
 
     @ApiModelProperty("设备编号")
     @ExcelProperty("设备编号")
-    private String number;
+    @JsonProperty("number")
+    private String code;
 
     @ApiModelProperty("设备名称")
     @ExcelProperty("设备名称")

+ 5 - 2
src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/vo/CaseErpDeviceInspectExportVo.java

@@ -1,6 +1,7 @@
 package com.xjrsoft.module.erpModel.caseErpDevice.vo;
 
 import com.alibaba.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.models.auth.In;
 import lombok.Data;
@@ -14,7 +15,8 @@ public class CaseErpDeviceInspectExportVo implements Serializable {
 
     @ApiModelProperty("设备编号")
     @ExcelProperty("设备编号")
-    private String number;
+    @JsonProperty("number")
+    private String code;
 
     @ApiModelProperty("设备名称")
     @ExcelProperty("设备名称")
@@ -42,7 +44,8 @@ public class CaseErpDeviceInspectExportVo implements Serializable {
 
     @ApiModelProperty("巡检时间")
     @ExcelProperty("巡检时间")
-    private LocalDateTime date;
+    @JsonProperty("date")
+    private LocalDateTime inspectDate;
 
     @ApiModelProperty("巡检状态(1已完成,0待维修)")
     @ExcelProperty("巡检状态(1已完成,0待维修)")

+ 5 - 3
src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/vo/CaseErpDeviceInspectInfoVo.java

@@ -2,6 +2,7 @@ package com.xjrsoft.module.erpModel.caseErpDevice.vo;
 
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -38,8 +39,8 @@ public class CaseErpDeviceInspectInfoVo implements Serializable {
     private Long deviceId;
 
     @ApiModelProperty("设备编号")
-    private String number;
-
+    @JsonProperty("number")
+    private String code;
     @ApiModelProperty("设备位置")
     private String address;
 
@@ -51,7 +52,8 @@ public class CaseErpDeviceInspectInfoVo implements Serializable {
 
     @ApiModelProperty("巡检时间")
     @JsonFormat(pattern="yyyy-MM-dd")
-    private LocalDateTime date;
+    @JsonProperty("date")
+    private LocalDateTime inspectDate;
 
     @ApiModelProperty("附件")
     private String filePath;

+ 5 - 2
src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/vo/CaseErpDeviceInspectVo.java

@@ -2,6 +2,7 @@ package com.xjrsoft.module.erpModel.caseErpDevice.vo;
 
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -39,7 +40,8 @@ public class CaseErpDeviceInspectVo implements Serializable {
     private Long deviceId;
 
     @ApiModelProperty("设备编号")
-    private String number;
+    @JsonProperty("number")
+    private String code;
 
     @ApiModelProperty("设备位置")
     private String address;
@@ -52,7 +54,8 @@ public class CaseErpDeviceInspectVo implements Serializable {
 
     @ApiModelProperty("巡检时间")
     @JsonFormat(pattern = "yyyy-MM-dd")
-    private LocalDateTime date;
+    @JsonProperty("date")
+    private LocalDateTime inspectDate;
 
     @ApiModelProperty("附件")
     private String filePath;

+ 5 - 2
src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/vo/CaseErpDeviceWarnExportVo.java

@@ -2,6 +2,7 @@ package com.xjrsoft.module.erpModel.caseErpDevice.vo;
 
 import com.alibaba.excel.annotation.ExcelIgnore;
 import com.alibaba.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -14,7 +15,8 @@ public class CaseErpDeviceWarnExportVo implements Serializable {
 
     @ApiModelProperty("设备编号")
     @ExcelProperty("设备编号")
-    private String number;
+    @JsonProperty("number")
+    private String code;
 
     @ApiModelProperty("设备名称")
     @ExcelProperty("设备名称")
@@ -35,7 +37,8 @@ public class CaseErpDeviceWarnExportVo implements Serializable {
     @ApiModelProperty("故障等级")
     @ExcelProperty("故障等级")
     @ExcelIgnore
-    private Long level;
+    @JsonProperty("level")
+    private String warnLevel;
 
     @ExcelProperty("故障等级")
     private String levelName;

+ 62 - 0
src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/vo/CaseErpDeviceWarnInfo.java

@@ -0,0 +1,62 @@
+package com.xjrsoft.module.erpModel.caseErpDevice.vo;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@Data
+public class CaseErpDeviceWarnInfo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("主键")
+    private Long id;
+
+    @ApiModelProperty("检查设备")
+    private Long deviceId;
+
+    @ApiModelProperty("处理人ids")
+    private String dealUserIds;
+
+    @ApiModelProperty("处理人名称")
+    private String dealUserNames;
+
+    @ApiModelProperty("设备类型数据字典id")
+    private Long typeId;
+
+    @ApiModelProperty("设备编号")
+    @JsonProperty("number")
+    private String code;
+
+    @ApiModelProperty("设备名称")
+    private String name;
+
+    @ApiModelProperty("规格型号")
+    private String model;
+
+    @ApiModelProperty("设备位置")
+    private String address;
+
+    @ApiModelProperty("处理方式")
+    private String dealWay;
+
+    @ApiModelProperty("处理日期")
+    @JsonProperty("date")
+    private LocalDateTime dealDate;
+
+    @ApiModelProperty("故障等级,数据字典id")
+    @JsonProperty("level")
+    private String warnLevel;
+
+    @ApiModelProperty("故障描述")
+    private String remark;
+
+    @ApiModelProperty("附件")
+    private String filePath;
+
+    @ApiModelProperty("处理状态(1已处理,0待处理)")
+    private Integer state;
+}

+ 7 - 4
src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/vo/CaseErpDeviceWarnInfoVo.java

@@ -2,6 +2,7 @@ package com.xjrsoft.module.erpModel.caseErpDevice.vo;
 
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -29,8 +30,8 @@ public class CaseErpDeviceWarnInfoVo implements Serializable {
     private Long typeId;
 
     @ApiModelProperty("设备编号")
-    private String number;
-
+    @JsonProperty("number")
+    private String code;
     @ApiModelProperty("设备名称")
     private String name;
 
@@ -44,10 +45,12 @@ public class CaseErpDeviceWarnInfoVo implements Serializable {
     private String dealWay;
 
     @ApiModelProperty("处理日期")
-    private LocalDateTime date;
+    @JsonProperty("date")
+    private LocalDateTime dealDate;
 
     @ApiModelProperty("故障等级,数据字典id")
-    private Long level;
+    @JsonProperty("level")
+    private String warnLevel;
 
     @ApiModelProperty("故障等级名称")
     private String levelName;

+ 5 - 2
src/main/java/com/xjrsoft/module/erpModel/caseErpDevice/vo/CaseErpDeviceWarnVo.java

@@ -2,6 +2,7 @@ package com.xjrsoft.module.erpModel.caseErpDevice.vo;
 
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -22,7 +23,8 @@ public class CaseErpDeviceWarnVo implements Serializable {
 
     @ApiModelProperty("设备编号")
     @ExcelProperty("设备编号")
-    private String number;
+    @JsonProperty("number")
+    private String code;
 
     @ApiModelProperty("设备名称")
     @ExcelProperty("设备名称")
@@ -38,7 +40,8 @@ public class CaseErpDeviceWarnVo implements Serializable {
     private String model;
 
     @ApiModelProperty("故障等级,数据字典id")
-    private Long level;
+    @JsonProperty("level")
+    private String warnLevel;
 
     @ApiModelProperty("故障描述")
     private String remark;

+ 24 - 23
src/main/java/com/xjrsoft/module/erpModel/caseErpMaterial/controller/CaseErpMaterialController.java

@@ -207,27 +207,27 @@ public class CaseErpMaterialController {
         log.setExecuteResultJson("新增物料信息");
         caseErpLogService.save(log);
 
-        CaseErpInstoreLog instoreLog = new CaseErpInstoreLog();
-        instoreLog.setMaterialId(caseErpMaterial.getId());
-        instoreLog.setTheme("201来料入库");
-        instoreLog.setNumber(caseErpMaterial.getCode());
-        instoreLog.setDate(LocalDateTime.now());
-        instoreLog.setInsertType("采购入库");
-        instoreLog.setCount(new BigDecimal("100"));
-        instoreLog.setPerson("张成");
-        instoreLog.setStore("原料库A01");
-        caseErpInstoreLogService.save(instoreLog);
-
-        CaseErpOutstoreLog outstoreLog = new CaseErpOutstoreLog();
-        outstoreLog.setMaterialId(caseErpMaterial.getId());
-        outstoreLog.setTheme("201来料出库");
-        outstoreLog.setNumber(caseErpMaterial.getCode());
-        outstoreLog.setDate(LocalDateTime.now());
-        outstoreLog.setOutType("内部领用");
-        outstoreLog.setCount(new BigDecimal("50"));
-        outstoreLog.setPerson("张成");
-        outstoreLog.setStore("原料库A01");
-        caseErpOutstoreLogService.save(outstoreLog);
+//        CaseErpInstoreLog instoreLog = new CaseErpInstoreLog();
+//        instoreLog.setMaterialId(caseErpMaterial.getId());
+//        instoreLog.setTheme("201来料入库");
+//        instoreLog.setCode(caseErpMaterial.getCode());
+//        instoreLog.setDate(LocalDateTime.now());
+//        instoreLog.setInsertType("采购入库");
+//        instoreLog.setCount(new BigDecimal("100"));
+//        instoreLog.setPerson("张成");
+//        instoreLog.setStore("原料库A01");
+//        caseErpInstoreLogService.save(instoreLog);
+//
+//        CaseErpOutstoreLog outstoreLog = new CaseErpOutstoreLog();
+//        outstoreLog.setMaterialId(caseErpMaterial.getId());
+//        outstoreLog.setTheme("201来料出库");
+//        outstoreLog.setCode(caseErpMaterial.getCode());
+//        outstoreLog.setDate(LocalDateTime.now());
+//        outstoreLog.setOutType("内部领用");
+//        outstoreLog.setCount(new BigDecimal("50"));
+//        outstoreLog.setPerson("张成");
+//        outstoreLog.setStore("原料库A01");
+//        caseErpOutstoreLogService.save(outstoreLog);
 
         return R.ok(true);
     }
@@ -391,6 +391,7 @@ public class CaseErpMaterialController {
                         .selectAs(CaseErpPurchaseDetail::getAfterTaxAmount, PurchaseVo::getAfterTaxAmount)
                         .selectAs(User::getName,PurchaseVo::getPurchasePersonName)
                         .selectAs(Department::getName,PurchaseVo::getPurchaseDeptName)
+                        .selectAs(CaseErpPurchase::getPurchaseNumber,PurchaseVo::getNumber)
                         .select(CaseErpPurchase::getId)
                         .select(CaseErpPurchase.class, x -> VoToColumnUtil.fieldsToColumns(PurchaseVo.class).contains(x.getProperty()))
                         .leftJoin(CaseErpPurchaseDetail.class,CaseErpPurchaseDetail::getPurchaseId,CaseErpPurchase::getId)
@@ -399,8 +400,8 @@ public class CaseErpMaterialController {
                         .leftJoin(CaseErpMaterial.class,CaseErpMaterial::getCode,CaseErpPurchaseDetail::getCode));
 
         for (PurchaseVo purchaseVo : vo) {
-            if(purchaseVo.getAfterTaxAmount()!=null&&purchaseVo.getCount()!=null){
-                purchaseVo.setAmountSum(purchaseVo.getCount().multiply(purchaseVo.getAfterTaxAmount()));
+            if(purchaseVo.getAfterTaxAmount()!=null){
+                purchaseVo.setAmountSum(purchaseVo.getAfterTaxAmount());
             }else {
                 purchaseVo.setAmountSum(new BigDecimal("0"));
             }

+ 50 - 5
src/main/java/com/xjrsoft/module/erpModel/caseErpPurchase/controller/CaseErpPurchaseApplyController.java

@@ -2,24 +2,41 @@ package com.xjrsoft.module.erpModel.caseErpPurchase.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.lang.TypeReference;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.support.ExcelTypeEnum;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.xjrsoft.common.constant.GlobalConstant;
 import com.xjrsoft.common.model.result.R;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.common.utils.RedisUtil;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.erpModel.caseErpPurchase.dto.AddCaseErpApplyDto;
 import com.xjrsoft.module.erpModel.caseErpPurchase.dto.CaseErpApplyPageDto;
 import com.xjrsoft.module.erpModel.caseErpPurchase.dto.UpdateCaseErpApplyDto;
 import com.xjrsoft.module.erpModel.caseErpPurchase.entity.CaseErpApply;
+import com.xjrsoft.module.erpModel.caseErpPurchase.entity.CaseErpApplyDetail;
+import com.xjrsoft.module.erpModel.caseErpPurchase.entity.CaseErpPurchase;
+import com.xjrsoft.module.erpModel.caseErpPurchase.service.ICaseErpPurchaseApplyDetailService;
 import com.xjrsoft.module.erpModel.caseErpPurchase.service.ICaseErpPurchaseApplyService;
+import com.xjrsoft.module.erpModel.caseErpPurchase.service.ICaseErpPurchaseDetailService;
+import com.xjrsoft.module.erpModel.caseErpPurchase.service.ICaseErpPurchaseService;
+import com.xjrsoft.module.erpModel.caseErpPurchase.vo.CaseErpApplyDetailVo;
 import com.xjrsoft.module.erpModel.caseErpPurchase.vo.CaseErpApplyPageVo;
 import com.xjrsoft.module.erpModel.caseErpPurchase.vo.CaseErpApplyVo;
+import com.xjrsoft.module.erpModel.caseErpPurchase.vo.CaseErpPurchasePageVo;
+import com.xjrsoft.module.organization.entity.Department;
+import com.xjrsoft.module.organization.entity.User;
+import com.xjrsoft.module.system.entity.DictionaryDetail;
+import com.xjrsoft.module.system.service.IDictionarydetailService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
@@ -28,8 +45,11 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
 import java.io.ByteArrayOutputStream;
+import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
 * @title: 采购申请
@@ -45,6 +65,7 @@ public class CaseErpPurchaseApplyController {
 
     private final ICaseErpPurchaseApplyService caseErpPurchaseApplyService;
 
+
     @GetMapping(value = "/list")
     @ApiOperation(value="CaseErpApply列表(不分页)")
     public R list(){
@@ -69,9 +90,16 @@ public class CaseErpPurchaseApplyController {
                 .like(StrUtil.isNotBlank(dto.getRemark()), CaseErpApply::getRemark,dto.getRemark())
                     .orderByDesc(CaseErpApply::getId)
                 .select(CaseErpApply.class, x -> VoToColumnUtil.fieldsToColumns(CaseErpApplyPageVo.class).contains(x.getProperty()));
-        IPage<CaseErpApply> page = caseErpPurchaseApplyService.page(ConventPage.getPage(dto), queryWrapper);
-        PageOutput<CaseErpApplyPageVo> pageOutput = ConventPage.getPageOutput(page, CaseErpApplyPageVo.class);
-        return R.ok(pageOutput);
+        List<CaseErpApply> list = caseErpPurchaseApplyService.list(queryWrapper);
+        List<CaseErpApplyPageVo> caseErpApplyPageVos = BeanUtil.copyToList(list, CaseErpApplyPageVo.class);
+        //转换
+        caseErpApplyPageVos = caseErpPurchaseApplyService.convert(caseErpApplyPageVos);
+        PageOutput<CaseErpApplyPageVo> output = new PageOutput<>();
+        output.setCurrentPage(dto.getLimit());
+        output.setPageSize(dto.getSize());
+        output.setTotal(list.size());
+        output.setList(caseErpApplyPageVos);
+        return R.ok(output);
     }
 
     @GetMapping(value = "/info")
@@ -82,7 +110,24 @@ public class CaseErpPurchaseApplyController {
         if (caseErpApply == null) {
            return R.error("找不到此数据!");
         }
-        return R.ok(BeanUtil.toBean(caseErpApply, CaseErpApplyVo.class));
+        CaseErpApplyVo caseErpApplyVo = BeanUtil.toBean(caseErpApply, CaseErpApplyVo.class);
+        caseErpApplyVo = caseErpPurchaseApplyService.convertInfo(caseErpApplyVo);
+        if (CollectionUtil.isNotEmpty(caseErpApplyVo.getCaseErpApplyDetailList())){
+            List<CaseErpApplyDetailVo> caseErpApplyDetailList = caseErpApplyVo.getCaseErpApplyDetailList();
+            BigDecimal amountSum = BigDecimal.ZERO;
+            BigDecimal countSum = BigDecimal.ZERO;
+            for (CaseErpApplyDetailVo caseErpApplyDetailVo : caseErpApplyDetailList) {
+                if (ObjectUtil.isNotEmpty(caseErpApplyDetailVo.getAmount())){
+                    amountSum = amountSum.add(caseErpApplyDetailVo.getAmount());
+                }
+                if (ObjectUtil.isNotEmpty(caseErpApplyDetailVo.getCount())){
+                    countSum = countSum.add(caseErpApplyDetailVo.getCount());
+                }
+            }
+            caseErpApplyVo.setAmountSum(amountSum);
+            caseErpApplyVo.setCountSum(countSum);
+        }
+        return R.ok(caseErpApplyVo);
     }
 
 
@@ -118,8 +163,8 @@ public class CaseErpPurchaseApplyController {
     public ResponseEntity<byte[]> exportData(@Valid CaseErpApplyPageDto dto, @RequestParam(defaultValue = "false") Boolean isTemplate) {
         List<CaseErpApplyPageVo> customerList = isTemplate != null && isTemplate ? new ArrayList<>() : ((PageOutput<CaseErpApplyPageVo>) page(dto).getData()).getList();
         ByteArrayOutputStream bot = new ByteArrayOutputStream();
+        customerList = caseErpPurchaseApplyService.convert(customerList);
         EasyExcel.write(bot, CaseErpApplyPageVo.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(customerList);
-
         return R.fileStream(bot.toByteArray(), "采购申请" + ExcelTypeEnum.XLSX.getValue());
     }
 }

+ 2 - 2
src/main/java/com/xjrsoft/module/erpModel/caseErpPurchase/controller/CaseErpPurchaseController.java

@@ -138,6 +138,8 @@ public class CaseErpPurchaseController {
         caseErpPurchase.setTicketState(YesOrNoEnum.NO.getCode());
         // 默认付款状态未完成
         caseErpPurchase.setPayState(YesOrNoEnum.NO.getCode());
+        //默认入库状态未完成
+        caseErpPurchase.setInStoreState(YesOrNoEnum.NO.getCode());
         caseErpPurchase.setAlreadyAmount(BigDecimal.ZERO);
         caseErpPurchase.setAlreadyTicket(BigDecimal.ZERO);
         caseErpPurchaseService.save(caseErpPurchase);
@@ -298,8 +300,6 @@ public class CaseErpPurchaseController {
                 inStoreLogVo.setStore("仓库一");
                 inStoreLogVos.add(inStoreLogVo);
             }
-        }else {
-            inStoreLogVos = DataUtil.buildInStoreLogList(dto.getPurchaseId());
         }
         List<InStoreLogVo> collect = inStoreLogVos.stream().filter(x -> dto.getIds().contains(x.getId())).collect(Collectors.toList());
         List<InStoreLogExportVo> saleExportVoList = BeanUtil.copyToList(collect, InStoreLogExportVo.class);

+ 1 - 1
src/main/java/com/xjrsoft/module/erpModel/caseErpPurchase/dto/AddCaseErpApplyDto.java

@@ -86,7 +86,7 @@ public class AddCaseErpApplyDto implements Serializable {
     * 是否使用系统编号(0-未使用,1-使用)
     */
     @ApiModelProperty("是否使用系统编号(0-未使用,1-使用)")
-    private Integer isSysNum;
+    private String isSysNum;
 
     /**
     * caseErpApplyDetail

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác