Browse Source

feat: 支持日期范围选择功能

- 在实体类中为 daterange 和 datetimerange 类型字段添加 String[] 属性定义
- 移除实体类中日期范围字段的 JacksonTypeHandler 注解
- 在查询条件中添加日期范围查询支持,使用 between 条件
- 在 Vue 表单组件中添加日期范围选择器控件
- 在 TypeScript 类型定义中为日期范围字段添加 any[] 类型
- 在表单初始化时为日期范围字段设置空数组默认值
PIGCLOUD 1 month ago
parent
commit
8c099c0b51
5 changed files with 56 additions and 7 deletions
  1. 0 1
      single/实体.java
  2. 3 1
      tree/树形Controller.java
  3. 15 1
      tree/树形实体.java
  4. 13 1
      tree/树形表单.vue
  5. 25 3
      tree/树形表格.vue

+ 0 - 1
single/实体.java

@@ -51,7 +51,6 @@ public class ${ClassName}Entity extends Model<${ClassName}Entity> {
 #if($field.formType == 'checkbox')
     private ${field.attrType}[] $field.attrName;
 #elseif($field.formType == 'daterange' || $field.formType == 'datetimerange')
-    @TableField(typeHandler = JacksonTypeHandler.class)
     private String[] $field.attrName;
 #else
     private $field.attrType $field.attrName;

+ 3 - 1
tree/树形Controller.java

@@ -74,7 +74,9 @@ public class ${ClassName}Controller {
 #else
 #set($expression="Objects.nonNull")
 #end
-#if($field.queryType == '=')
+#if($field.queryFormType == 'daterange' || $field.queryFormType == 'datetimerange')
+		wrapper.between(ArrayUtil.isNotEmpty(${className}.${getAttrName}Range()),${ClassName}Entity::$getAttrName,${className}.${getAttrName}Range()[0],${className}.${getAttrName}Range()[1]);
+#elseif($field.queryType == '=')
 		wrapper.eq($expression($var),${ClassName}Entity::$getAttrName,$var);
 #elseif( $field.queryType == 'like' )
 		wrapper.like($expression($var),${ClassName}Entity::$getAttrName,$var);

+ 15 - 1
tree/树形实体.java

@@ -52,8 +52,22 @@ public class ${ClassName}Entity extends Model<${ClassName}Entity> {
     @Schema(description="$comment"#if($field.hidden),hidden=$field.hidden#end)
 #if($field.formType == 'checkbox')
     private ${field.attrType}[] $field.attrName;
+#elseif($field.formType == 'daterange' || $field.formType == 'datetimerange')
+    private String[] $field.attrName;
 #else
     private $field.attrType $field.attrName;
-#end    
+#end
+#end
+#foreach ($field in $queryList)
+#if($field.queryFormType == 'daterange' || $field.queryFormType == 'datetimerange')
+#if(${field.fieldComment})#set($comment=${field.fieldComment})#else #set($comment=${field.attrName})#end
+
+	/**
+	* $comment 查询范围
+	*/
+    @TableField(exist = false)
+    @Schema(description="$comment 查询范围",hidden=true)
+    private String[] ${field.attrName}Range;
+#end
 #end
 }

+ 13 - 1
tree/树形表单.vue

@@ -84,6 +84,16 @@
             <el-date-picker type="datetime" placeholder="请选择#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" v-model="form.${field.attrName}" :value-format="dateTimeStr"></el-date-picker>
           </el-form-item>
         </el-col>
+#elseif($field.formType == 'daterange')
+          <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">
+            <el-date-picker type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" v-model="form.${field.attrName}" :value-format="dateStr"></el-date-picker>
+          </el-form-item>
+        </el-col>
+#elseif($field.formType == 'datetimerange')
+          <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">
+            <el-date-picker type="datetimerange" range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间" v-model="form.${field.attrName}" :value-format="dateTimeStr"></el-date-picker>
+          </el-form-item>
+        </el-col>
 #elseif($field.formType == 'number')
           <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">
             <el-input-number :min="1" :max="1000" v-model="form.${field.attrName}" placeholder="请输入#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end"></el-input-number>
@@ -163,6 +173,8 @@ interface FormData {
   ${field.attrName}: number;
 #elseif($field.formType == 'checkbox')
   ${field.attrName}: any[];
+#elseif($field.formType == 'daterange' || $field.formType == 'datetimerange')
+  ${field.attrName}: any[];
 #else
   ${field.attrName}: string;
 #end
@@ -202,7 +214,7 @@ const form = reactive<FormData>({
 #if($field.attrName != ${parentField})
 #if($field.formType == 'number')
   ${field.attrName}: 0, // ${field.fieldComment}
-#elseif($field.formType == 'checkbox')
+#elseif($field.formType == 'checkbox' || $field.formType == 'daterange' || $field.formType == 'datetimerange')
   ${field.attrName}: [], // ${field.fieldComment}
 #else
   ${field.attrName}: '', // ${field.fieldComment}

+ 25 - 3
tree/树形表格.vue

@@ -32,13 +32,35 @@
           </el-form-item>
 #elseif($field.queryFormType == 'datetime')
           <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">
-            <el-date-picker 
-              type="datetime" 
-              placeholder="请输入#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" 
+            <el-date-picker
+              type="datetime"
+              placeholder="请输入#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end"
               v-model="state.queryForm.${field.attrName}"
               :value-format="dateTimeStr"
             />
           </el-form-item>
+#elseif($field.queryFormType == 'daterange')
+          <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}Range">
+            <el-date-picker
+              type="daterange"
+              range-separator="至"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+              v-model="state.queryForm.${field.attrName}Range"
+              :value-format="dateStr"
+            />
+          </el-form-item>
+#elseif($field.queryFormType == 'datetimerange')
+          <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}Range">
+            <el-date-picker
+              type="datetimerange"
+              range-separator="至"
+              start-placeholder="开始时间"
+              end-placeholder="结束时间"
+              v-model="state.queryForm.${field.attrName}Range"
+              :value-format="dateTimeStr"
+            />
+          </el-form-item>
 #elseif($field.formType == 'radio')
           <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">
             <el-radio-group v-model="state.queryForm.${field.attrName}">