diff --git a/apps/utils/mixins.py b/apps/utils/mixins.py index 5e0bd9ea..990d5926 100755 --- a/apps/utils/mixins.py +++ b/apps/utils/mixins.py @@ -252,6 +252,7 @@ class ComplexQueryMixin: queryset = self.get_queryset() querys = vdata.get('querys', []) annotate_field_list = vdata.get('annotate_field_list', []) + distinct = vdata.get('distinct', True) if not querys: new_qs = queryset @@ -274,6 +275,11 @@ class ComplexQueryMixin: new_qs = new_qs | one_qs except Exception as e: raise ParseError(str(e)) + + # 反向关联(右到左)查询容易因 JOIN 膨胀产生重复行,这里按主键回查去重 + if distinct: + pk_name = queryset.model._meta.pk.attname + new_qs = queryset.filter(**{f"{pk_name}__in": new_qs.values(pk_name)}) if annotate_field_list: annotate_dict = getattr(self, "annotate_dict", {}) diff --git a/apps/utils/serializers.py b/apps/utils/serializers.py index 263ec5f2..9a2f7f91 100755 --- a/apps/utils/serializers.py +++ b/apps/utils/serializers.py @@ -83,6 +83,7 @@ class ComplexSerializer(serializers.Serializer): page = serializers.IntegerField(min_value=0, required=False) page_size = serializers.IntegerField(min_value=1, required=False) ordering = serializers.CharField(required=False) + distinct = serializers.BooleanField(required=False, default=True, label="是否按主键去重") querys = serializers.ListField(child=QuerySerializer( many=True), label="查询列表", required=False) annotate_field_list = serializers.ListField(child=serializers.CharField(), label="RawSQL字段列表", required=False) diff --git a/changelog.md b/changelog.md index b811e411..e71ee5d2 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,50 @@ +## 3.1.2026031316 +- feat: 新增功能 + - 删除-ichat [TianyangZhang] + - mpr-物资管理模块(申购单、入库单、物料库存、领用记录) [TianyangZhang] + - hrm-人员合同变更 [TianyangZhang] + - hrm-migration 修改迁移文件 [TianyangZhang] + - qctmat create update 校验唯一 [caoqianming] + - gx-hrm-employee 人员导入功能 [TianyangZhang] + - hrm-views 修改employee 人员导入 [TianyangZhang] + - hrm-employee 增加人员导入功能 [TianyangZhang] + - fmlog返回route_material_in [caoqianming] + - 加工前不良当合格品处理 [caoqianming] + - hrm - 修改 人员调岗后更新部门和岗位 [TianyangZhang] + - 人员调岗申请 修改 [TianyangZhang] + - hrm-新增人员岗位调动 [TianyangZhang] + - wmaterial根据current_merged查询3 [caoqianming] + - wmaterial根据current_merged查询2 [caoqianming] + - wmaterial根据current_merged查询 [caoqianming] + - handoverb添加oinfo_json字段 [caoqianming] + - base user增加has_perm筛选条件 [caoqianming] + - base 升级后同步数据库 [caoqianming] + - 光子添加工段数据统计 [caoqianming] + - with_source_near筛选体现在swagger里 [caoqianming] + - base 调整asgi导入以保证正常启动 [caoqianming] + - wpr 返回wpr_from_ [caoqianming] + - base cquery支持add_info_for_list [caoqianming] + - wpr 添加筛选条件wpr_from [caoqianming] + - wpr_bxerp优化 [caoqianming] + - 未有ftest的也触发单个统计 [caoqianming] + - 交接记录子项需保证工段/车间一致2 [caoqianming] + - 交接记录子项需保证工段/车间一致 [caoqianming] + - mlog 并发优化 [caoqianming] + - handover可以查看仅交接到车间的记录 [caoqianming] + - handover_revert 并发优化 [caoqianming] + - handover_submit 并发优化2 [caoqianming] + - handover_submit 并发优化 [caoqianming] + - base 添加locked_get_or_create [caoqianming] + - 查询-n批次从正则改用like以优化性能 [caoqianming] + - 固定依赖包 [caoqianming] + - 升级依赖包 [caoqianming] +- fix: 问题修复 + - avoid duplicate rows in complex reverse queries [caoqianming] + - base user_exist完善 [caoqianming] + - batchst支持返回source_near修复 [caoqianming] + - base complexquerymixin支持add_info_for_list [caoqianming] + - base locked_get_or_create优化 [caoqianming] + - mlog并发优化的bug [caoqianming] ## 3.0.2026010716 - feat: 新增功能 - get_shift需要报错 [caoqianming] diff --git a/server/settings.py b/server/settings.py index fc46cb06..abc30d47 100755 --- a/server/settings.py +++ b/server/settings.py @@ -35,7 +35,7 @@ sys.path.insert(0, os.path.join(BASE_DIR, 'apps')) ALLOWED_HOSTS = ['*'] SYS_NAME = '星途工厂综合管理系统' -SYS_VERSION = '3.0.2026010716' +SYS_VERSION = '3.1.2026031316' X_FRAME_OPTIONS = 'SAMEORIGIN' # Application definition diff --git a/update_changelog.sh b/update_changelog.sh index ce0cfe26..dd7f2b87 100644 --- a/update_changelog.sh +++ b/update_changelog.sh @@ -1,7 +1,7 @@ #!/bin/bash -# 设置默认版本号 (格式: 3.0.YYYYMMDDHH) -DEFAULT_VERSION="3.0.$(date '+%Y%m%d%H')" +# 设置默认版本号 (格式: 3.1.YYYYMMDDHH) +DEFAULT_VERSION="3.1.$(date '+%Y%m%d%H')" # 获取参数 (起始tag) TARGET_TAG="$1"