编辑 | blame | 历史 | 原始文档

问题分析

  1. 日期时间字段设置问题:在 ViewGrid/methods.js 中,所有日期和日期时间类型的查询字段都被强制设置为 range = true,意味着它们必须是范围查询

  2. 查询参数处理逻辑问题:在 getSearchParameters 方法中,对于日期时间类型的处理存在问题:

  • 代码期望日期时间值是一个数组,包含开始时间和结束时间
  • value 是字符串时,代码无法正确处理
  • 导致日期时间查询参数无法正确生成
  1. 查询条件格式问题:生成的查询条件格式可能与后端期望的格式不一致

解决方案

  1. 修改日期时间字段设置
  • 移除强制将所有日期时间字段设置为范围查询的代码
  • 允许根据实际需求设置单个日期时间查询或范围查询
  1. 优化查询参数处理逻辑
  • 正确处理日期时间类型的单个值和范围值
  • 确保生成的查询条件格式正确
  • 添加适当的日志记录,便于调试
  1. 增强错误处理
  • 添加对异常情况的处理
  • 确保查询功能在各种情况下都能正常工作

具体修改

  1. 修改 ViewGrid/methods.js
  • 移除或修改 initFormOptions 方法中强制设置 range = true 的代码
  • 优化 getSearchParameters 方法中的日期时间处理逻辑
  1. 修改建议
  • 保留 range 属性的设置,但允许通过配置覆盖
  • 增强 getSearchParameters 方法,正确处理日期时间的单个值和范围值
  • 添加适当的日志记录
  1. 修改 getSearchParameters 方法
    ```javascript
    getSearchParameters() {
    // 获取查询参数
    if (!this.fiexdSearchForm) {
    this.searchBoxShow = false;
    }

    let query = { wheres: [] };
    for (const key in this.searchFormFields) {
    let value = this.searchFormFields[key];
    if (this.emptyValue(value)) continue;

    if (typeof value == 'number') {
    value = value + '';
    }
    let displayType = this.getSearchItem(key);

    // 处理日期时间类型
    if (['date', 'datetime'].indexOf(displayType) != -1) {
    if (Array.isArray(value)) {
    // 范围查询
    for (let index = 0; index < value.length; index++) {
    if (!this.emptyValue(value[index])) {
    query.wheres.push({
    name: key,
    value: (value[index] + '').trim(),
    displayType: index === 0 ? 'greaterorequal' : 'lessorequal'
    });
    }
    }
    } else {
    // 单个值查询
    query.wheres.push({
    name: key,
    value: (value + '').trim(),
    displayType: 'equal'
    });
    }
    continue;
    }

    // 处理其他类型
    query.wheres.push({
    name: key,
    value: typeof value == 'string' ? (value + '').trim() : value.join(','),
    displayType: displayType
    });
    }
    return query;
    }
    ```

  2. 修改 initFormOptions 方法
    ```javascript
    initFormOptions(formOptions, keys, formFields, isEdit) {
    // 初始化查询、编辑对象的下拉框数据源、图片上传链接地址
    // ... 其他代码 ...

    // 移除或修改强制设置range=true的代码
    // this.searchFormOptions.forEach((item) => {
    // item.forEach((x) => {
    // if (x.type == 'date' || x.type == 'datetime') x.range = true;
    // });
    // });

    // ... 其他代码 ...
    }
    ```

这样修改后,日期时间查询功能应该能够正常工作,无论是单个值查询还是范围查询都能正确处理。