users;
/**
* 统一启用状态:所有关联记录均启用时为true,否则为false
diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsSupplierSqeUserVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsSupplierSqeUserVO.java
new file mode 100644
index 00000000..41ac7588
--- /dev/null
+++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsSupplierSqeUserVO.java
@@ -0,0 +1,20 @@
+package com.nflg.wms.common.pojo.vo;
+
+import lombok.Data;
+
+/**
+ * SQE用户简要信息(用于 QmsSupplierSqeMapVO 中的 users 列表)
+ */
+@Data
+public class QmsSupplierSqeUserVO {
+
+ /**
+ * 用户ID
+ */
+ private Long userId;
+
+ /**
+ * 用户名称
+ */
+ private String userName;
+}
diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsInspectorMaterialCategoryItem.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsInspectorMaterialCategoryItem.java
new file mode 100644
index 00000000..ad67c36d
--- /dev/null
+++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsInspectorMaterialCategoryItem.java
@@ -0,0 +1,63 @@
+package com.nflg.wms.repository.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ *
+ * 质检员物料类别表
+ *
+ *
+ * @author 代码生成器生成
+ * @since 2025
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+@TableName("qms_inspector_material_category_item")
+public class QmsInspectorMaterialCategoryItem implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId(value = "id", type = IdType.ASSIGN_ID)
+ private Long id;
+
+ /**
+ * 质检员ID (qms_quality_inspector.id)
+ */
+ private Long inspectorId;
+
+ /**
+ * 物料类别ID (qms_qc_material_category.id)
+ */
+ private Long materialCategoryId;
+
+ /**
+ * 创建人
+ */
+ private String createBy;
+
+ /**
+ * 创建时间
+ */
+ private LocalDateTime createTime;
+
+ /**
+ * 修改人
+ */
+ private String updateBy;
+
+ /**
+ * 修改时间
+ */
+ private LocalDateTime updateTime;
+}
diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsInspectorMaterialItem.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsInspectorMaterialItem.java
new file mode 100644
index 00000000..b561f791
--- /dev/null
+++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsInspectorMaterialItem.java
@@ -0,0 +1,63 @@
+package com.nflg.wms.repository.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ *
+ * 质检员物料明细表
+ *
+ *
+ * @author 代码生成器生成
+ * @since 2025
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+@TableName("qms_inspector_material_item")
+public class QmsInspectorMaterialItem implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId(value = "id", type = IdType.ASSIGN_ID)
+ private Long id;
+
+ /**
+ * 质检员ID (qms_quality_inspector.id)
+ */
+ private Long inspectorId;
+
+ /**
+ * 物料ID (qms_qc_material.id)
+ */
+ private Long materialId;
+
+ /**
+ * 创建人
+ */
+ private String createBy;
+
+ /**
+ * 创建时间
+ */
+ private LocalDateTime createTime;
+
+ /**
+ * 修改人
+ */
+ private String updateBy;
+
+ /**
+ * 修改时间
+ */
+ private LocalDateTime updateTime;
+}
diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsQualityInspector.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsQualityInspector.java
index 2afa67c2..7382364a 100644
--- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsQualityInspector.java
+++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsQualityInspector.java
@@ -36,11 +36,6 @@ public class QmsQualityInspector implements Serializable {
*/
private Long userId;
- /**
- * 物料ID (qms_qc_material.id),可为空
- */
- private Long materialId;
-
/**
* 启用状态:true=启用,false=禁用
*/
@@ -75,9 +70,4 @@ public class QmsQualityInspector implements Serializable {
* 修改时间
*/
private LocalDateTime updateTime;
-
- /**
- * 物料类别编码
- */
- private String materialCategoryCode;
}
diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/QmsInspectorMaterialCategoryItemMapper.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/QmsInspectorMaterialCategoryItemMapper.java
new file mode 100644
index 00000000..c41a8672
--- /dev/null
+++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/QmsInspectorMaterialCategoryItemMapper.java
@@ -0,0 +1,16 @@
+package com.nflg.wms.repository.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.nflg.wms.repository.entity.QmsInspectorMaterialCategoryItem;
+
+/**
+ *
+ * 质检员物料类别明细 Mapper 接口
+ *
+ *
+ * @author 代码生成器生成
+ * @since 2025
+ */
+public interface QmsInspectorMaterialCategoryItemMapper extends BaseMapper {
+
+}
diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/QmsInspectorMaterialItemMapper.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/QmsInspectorMaterialItemMapper.java
new file mode 100644
index 00000000..a47c3d09
--- /dev/null
+++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/QmsInspectorMaterialItemMapper.java
@@ -0,0 +1,16 @@
+package com.nflg.wms.repository.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.nflg.wms.repository.entity.QmsInspectorMaterialItem;
+
+/**
+ *
+ * 质检员物料明细 Mapper 接口
+ *
+ *
+ * @author 代码生成器生成
+ * @since 2025
+ */
+public interface QmsInspectorMaterialItemMapper extends BaseMapper {
+
+}
diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/QmsQualityInspectorMapper.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/QmsQualityInspectorMapper.java
index d1176e23..5fbb9116 100644
--- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/QmsQualityInspectorMapper.java
+++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/QmsQualityInspectorMapper.java
@@ -54,4 +54,14 @@ public interface QmsQualityInspectorMapper extends BaseMapper getCategoriesByUserId(@Param("userId") Long userId);
+
+ /**
+ * 按 userId(明细表 inspector_id 存的是 user.id)查询关联物料列表
+ */
+ List getMaterialsByInspectorId(@Param("inspectorId") Long inspectorId);
+
+ /**
+ * 按 userId(明细表 inspector_id 存的是 user.id)查询关联物料类别列表
+ */
+ List getCategoriesByInspectorId(@Param("inspectorId") Long inspectorId);
}
diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/QmsSupplierSqeMapMapper.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/QmsSupplierSqeMapMapper.java
index 1c1a1e50..82cdef43 100644
--- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/QmsSupplierSqeMapMapper.java
+++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/QmsSupplierSqeMapMapper.java
@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.nflg.wms.common.pojo.qo.QmsSupplierSqeSearchQO;
import com.nflg.wms.common.pojo.qo.QmsUserMaterialsQO;
+import com.nflg.wms.common.pojo.vo.QmsSupplierSqeMapFlatVO;
import com.nflg.wms.common.pojo.vo.QmsSupplierSqeMapVO;
import com.nflg.wms.common.pojo.vo.QmsUserSupplierVO;
import com.nflg.wms.repository.entity.QmsSupplierSqeMap;
@@ -27,6 +28,11 @@ public interface QmsSupplierSqeMapMapper extends BaseMapper {
*/
IPage searchMap(@Param("request") QmsSupplierSqeSearchQO request, Page page);
+ /**
+ * 平铺查询(每行一条关联记录,含 userId/userName,供 Service 层聚合为 List)
+ */
+ List searchMapFlat(@Param("request") QmsSupplierSqeSearchQO request);
+
/**
* 按 userId 查询关联的供应商列表(支持供应商过滤,分页)
*/
diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IQmsInspectorMaterialCategoryItemService.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IQmsInspectorMaterialCategoryItemService.java
new file mode 100644
index 00000000..e8ae945b
--- /dev/null
+++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IQmsInspectorMaterialCategoryItemService.java
@@ -0,0 +1,16 @@
+package com.nflg.wms.repository.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.nflg.wms.repository.entity.QmsInspectorMaterialCategoryItem;
+
+/**
+ *
+ * 质检员物料类别明细 服务类
+ *
+ *
+ * @author 代码生成器生成
+ * @since 2025
+ */
+public interface IQmsInspectorMaterialCategoryItemService extends IService {
+
+}
diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IQmsInspectorMaterialItemService.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IQmsInspectorMaterialItemService.java
new file mode 100644
index 00000000..64d01e07
--- /dev/null
+++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IQmsInspectorMaterialItemService.java
@@ -0,0 +1,16 @@
+package com.nflg.wms.repository.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.nflg.wms.repository.entity.QmsInspectorMaterialItem;
+
+/**
+ *
+ * 质检员物料明细 服务类
+ *
+ *
+ * @author 代码生成器生成
+ * @since 2025
+ */
+public interface IQmsInspectorMaterialItemService extends IService {
+
+}
diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IQmsQualityInspectorService.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IQmsQualityInspectorService.java
index b255ffae..09f7830d 100644
--- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IQmsQualityInspectorService.java
+++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IQmsQualityInspectorService.java
@@ -46,7 +46,7 @@ public interface IQmsQualityInspectorService extends IService search(QmsQualityInspectorSearchQO request);
/**
- * 按员工ID查询质检人员详情,将物料和物料类别分开返回(不分页)
+ * 按员工ID(user_id)查询质检人员详情,物料和物料类别分开返回(不分页)
*/
QmsQualityInspectorDetailVO getDetailByUserId(Long userId);
diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/QmsInspectorMaterialCategoryItemServiceImpl.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/QmsInspectorMaterialCategoryItemServiceImpl.java
new file mode 100644
index 00000000..95266728
--- /dev/null
+++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/QmsInspectorMaterialCategoryItemServiceImpl.java
@@ -0,0 +1,22 @@
+package com.nflg.wms.repository.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.nflg.wms.repository.entity.QmsInspectorMaterialCategoryItem;
+import com.nflg.wms.repository.mapper.QmsInspectorMaterialCategoryItemMapper;
+import com.nflg.wms.repository.service.IQmsInspectorMaterialCategoryItemService;
+import org.springframework.stereotype.Service;
+
+/**
+ *
+ * 质检员物料类别明细 服务实现类
+ *
+ *
+ * @author 代码生成器生成
+ * @since 2025
+ */
+@Service
+public class QmsInspectorMaterialCategoryItemServiceImpl
+ extends ServiceImpl
+ implements IQmsInspectorMaterialCategoryItemService {
+
+}
diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/QmsInspectorMaterialItemServiceImpl.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/QmsInspectorMaterialItemServiceImpl.java
new file mode 100644
index 00000000..d3cb3ee6
--- /dev/null
+++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/QmsInspectorMaterialItemServiceImpl.java
@@ -0,0 +1,22 @@
+package com.nflg.wms.repository.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.nflg.wms.repository.entity.QmsInspectorMaterialItem;
+import com.nflg.wms.repository.mapper.QmsInspectorMaterialItemMapper;
+import com.nflg.wms.repository.service.IQmsInspectorMaterialItemService;
+import org.springframework.stereotype.Service;
+
+/**
+ *
+ * 质检员物料明细 服务实现类
+ *
+ *
+ * @author 代码生成器生成
+ * @since 2025
+ */
+@Service
+public class QmsInspectorMaterialItemServiceImpl
+ extends ServiceImpl
+ implements IQmsInspectorMaterialItemService {
+
+}
diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/QmsQualityInspectorServiceImpl.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/QmsQualityInspectorServiceImpl.java
index b89092b7..7f03534c 100644
--- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/QmsQualityInspectorServiceImpl.java
+++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/QmsQualityInspectorServiceImpl.java
@@ -11,14 +11,23 @@ import com.nflg.wms.common.pojo.qo.QmsQualityInspectorAddQO;
import com.nflg.wms.common.pojo.qo.QmsQualityInspectorSearchQO;
import com.nflg.wms.common.pojo.qo.QmsQualityInspectorTransferQO;
import com.nflg.wms.common.pojo.qo.QmsQualityInspectorUpdateQO;
-import com.nflg.wms.common.pojo.vo.QmsQualityInspectorCategoryVO;
-import com.nflg.wms.common.pojo.vo.QmsQualityInspectorDetailVO;
-import com.nflg.wms.common.pojo.vo.QmsQualityInspectorMaterialVO;
-import com.nflg.wms.common.pojo.vo.QmsQualityInspectorVO;
+import com.nflg.wms.common.pojo.vo.*;
import com.nflg.wms.common.util.UserUtil;
+import com.nflg.wms.repository.entity.QmsInspectorMaterialCategoryItem;
+import com.nflg.wms.repository.entity.QmsInspectorMaterialItem;
+import com.nflg.wms.repository.entity.QmsQcMaterialCategory;
import com.nflg.wms.repository.entity.QmsQualityInspector;
import com.nflg.wms.repository.entity.User;
import com.nflg.wms.repository.mapper.QmsQualityInspectorMapper;
+import com.nflg.wms.repository.service.IQmsInspectorMaterialCategoryItemService;
+import com.nflg.wms.repository.service.IQmsInspectorMaterialItemService;
+import com.nflg.wms.repository.entity.Department;
+import com.nflg.wms.repository.entity.Position;
+import com.nflg.wms.repository.entity.UserInterior;
+import com.nflg.wms.repository.service.IDepartmentService;
+import com.nflg.wms.repository.service.IPositionService;
+import com.nflg.wms.repository.service.IUserInteriorService;
+import com.nflg.wms.repository.service.IQmsQcMaterialCategoryService;
import com.nflg.wms.repository.service.IQmsQualityInspectorService;
import com.nflg.wms.repository.service.IUserService;
import jakarta.annotation.Resource;
@@ -27,10 +36,7 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-import java.util.Set;
+import java.util.*;
import java.util.stream.Collectors;
/**
@@ -48,6 +54,40 @@ public class QmsQualityInspectorServiceImpl extends ServiceImpl id)
+ */
+ private Map getCategoryCodeToIdMap(List codes) {
+ if (CollectionUtils.isEmpty(codes)) {
+ return Map.of();
+ }
+ List categories = qcMaterialCategoryService.lambdaQuery()
+ .in(QmsQcMaterialCategory::getCategoryCode, codes)
+ .list();
+ return categories.stream()
+ .collect(Collectors.toMap(QmsQcMaterialCategory::getCategoryCode, QmsQcMaterialCategory::getId));
+ }
+
// ========================= 新增 =========================
@Transactional
@@ -55,99 +95,85 @@ public class QmsQualityInspectorServiceImpl extends ServiceImpl records = new ArrayList<>();
- boolean hasMaterial = !CollectionUtils.isEmpty(request.getMaterialIds());
- boolean hasCategory = !CollectionUtils.isEmpty(request.getMaterialCategoryCodes());
+ // 校验同一 userId + inspectionType 是否已存在
+ boolean exists = lambdaQuery()
+ .eq(QmsQualityInspector::getUserId, request.getUserId())
+ .eq(QmsQualityInspector::getInspectionType, request.getInspectionType())
+ .exists();
+ if (exists) {
+ throw new NflgException(STATE.BusinessError, "该质检人员已存在相同质检类型,不允许重复新增");
+ }
- if (hasMaterial) {
- for (Long materialId : request.getMaterialIds()) {
- records.add(buildRecord(request.getUserId(), request.getInspectionType(),
- materialId, null, operator, now));
+ // 校验物料ID是否已被其他质检员绑定
+ if (!CollectionUtils.isEmpty(request.getMaterialIds())) {
+ List conflictMaterials = materialItemService.lambdaQuery()
+ .in(QmsInspectorMaterialItem::getMaterialId, request.getMaterialIds())
+ .list();
+ if (!conflictMaterials.isEmpty()) {
+ throw new NflgException(STATE.BusinessError, "物料ID已被其他质检员绑定,不允许重复新增");
}
}
- if (hasCategory) {
- for (String categoryCode : request.getMaterialCategoryCodes()) {
- records.add(buildRecord(request.getUserId(), request.getInspectionType(),
- null, categoryCode, operator, now));
+
+ // 校验物料类别是否已被其他质检员绑定
+ if (!CollectionUtils.isEmpty(request.getMaterialCategoryCodes())) {
+ Map codeToIdMap = getCategoryCodeToIdMap(request.getMaterialCategoryCodes());
+ List categoryIds = new ArrayList<>(codeToIdMap.values());
+ if (!categoryIds.isEmpty()) {
+ List conflictCategories = materialCategoryItemService.lambdaQuery()
+ .in(QmsInspectorMaterialCategoryItem::getMaterialCategoryId, categoryIds)
+ .list();
+ if (!conflictCategories.isEmpty()) {
+ throw new NflgException(STATE.BusinessError, "物料类别已被其他质检员绑定,不允许重复新增");
+ }
}
}
- // 物料id和物料类别都不传时,插入一条无物料关联的记录
- if (!hasMaterial && !hasCategory) {
- records.add(buildRecord(request.getUserId(), request.getInspectionType(),
- null, null, operator, now));
- }
- saveBatch(records);
- }
-
- private QmsQualityInspector buildRecord(Long userId, Integer inspectionType,
- Long materialId, String categoryCode,
- String operator, LocalDateTime now) {
- return new QmsQualityInspector()
- .setUserId(userId)
- .setInspectionType(inspectionType)
- .setMaterialId(materialId)
- .setMaterialCategoryCode(categoryCode)
+ // 插入主表
+ QmsQualityInspector inspector = new QmsQualityInspector()
+ .setUserId(request.getUserId())
+ .setInspectionType(request.getInspectionType())
.setEnable(true)
.setCreateBy(operator)
.setCreateTime(now)
.setUpdateBy(operator)
.setUpdateTime(now);
- }
+ save(inspector);
+ Long inspectorId = inspector.getUserId();
- /**
- * 删除物料/物料类别关联行。
- * 若删除后该 userId 下记录数归零,则保留其中一条(清空 materialId 和 materialCategoryCode),
- * 不做物理删除,确保人员记录始终存在。
- */
- private void removeMaterialOrClear(Long userId, List toRemove,
- String operator, LocalDateTime now) {
- if (CollectionUtils.isEmpty(toRemove)) {
- return;
+ // 批量插入物料明细
+ if (!CollectionUtils.isEmpty(request.getMaterialIds())) {
+ List materialItems = request.getMaterialIds().stream()
+ .map(materialId -> new QmsInspectorMaterialItem()
+ .setInspectorId(inspectorId)
+ .setMaterialId(materialId)
+ .setCreateBy(operator)
+ .setCreateTime(now)
+ .setUpdateBy(operator)
+ .setUpdateTime(now))
+ .collect(Collectors.toList());
+ materialItemService.saveBatch(materialItems);
}
- // 该用户当前全部记录
- List all = lambdaQuery()
- .eq(QmsQualityInspector::getUserId, userId)
- .list();
- long total = all.size();
-
- // 待删除的行 ID 集合
- Set removeIdSet = toRemove.stream()
- .map(QmsQualityInspector::getId)
- .collect(Collectors.toSet());
-
- // 删除后剩余条数
- long remaining = total - removeIdSet.size();
-
- if (remaining <= 0) {
- // 删完后一条不剩:从所有记录中选一条保留(优先选不在 toRemove 中的,没有则从 toRemove 中选第一条)
- QmsQualityInspector keep = all.stream()
- .filter(r -> !removeIdSet.contains(r.getId()))
- .findFirst()
- .orElse(toRemove.get(0));
-
- // 删除其余所有行(保留行除外)
- List deleteIds = all.stream()
- .map(QmsQualityInspector::getId)
- .filter(id -> !id.equals(keep.getId()))
- .collect(Collectors.toList());
- if (!deleteIds.isEmpty()) {
- removeByIds(deleteIds);
+ // 批量插入物料类别明细(按编码查 ID)
+ if (!CollectionUtils.isEmpty(request.getMaterialCategoryCodes())) {
+ Map codeToIdMap = getCategoryCodeToIdMap(request.getMaterialCategoryCodes());
+ List categoryItems = new ArrayList<>();
+ for (String code : request.getMaterialCategoryCodes()) {
+ Long categoryId = codeToIdMap.get(code);
+ if (Objects.nonNull(categoryId)) {
+ categoryItems.add(new QmsInspectorMaterialCategoryItem()
+ .setInspectorId(inspectorId)
+ .setMaterialCategoryId(categoryId)
+ .setCreateBy(operator)
+ .setCreateTime(now)
+ .setUpdateBy(operator)
+ .setUpdateTime(now));
+ }
+ }
+ if (!categoryItems.isEmpty()) {
+ materialCategoryItemService.saveBatch(categoryItems);
}
-
- // 保留行的物料字段清空
- lambdaUpdate()
- .eq(QmsQualityInspector::getId, keep.getId())
- .set(QmsQualityInspector::getMaterialId, null)
- .set(QmsQualityInspector::getMaterialCategoryCode, null)
- .set(QmsQualityInspector::getUpdateBy, operator)
- .set(QmsQualityInspector::getUpdateTime, now)
- .update();
- } else {
- // 正常物理删除
- removeByIds(new ArrayList<>(removeIdSet));
}
}
@@ -156,21 +182,27 @@ public class QmsQualityInspectorServiceImpl extends ServiceImpl records = lambdaQuery()
+ // 查询主表记录
+ QmsQualityInspector inspector = lambdaQuery()
.eq(QmsQualityInspector::getUserId, userId)
- .list();
- if (records.isEmpty()) {
+ .one();
+ if (Objects.isNull(inspector)) {
throw new NflgException(STATE.BusinessError, "该质检人员不存在");
}
// 启用状态下不允许删除
- boolean enabled = records.stream().anyMatch(r -> Boolean.TRUE.equals(r.getEnable()));
- if (enabled) {
+ if (Boolean.TRUE.equals(inspector.getEnable())) {
throw new NflgException(STATE.BusinessError, "该质检人员处于启用状态,不允许删除,请先禁用后再删除");
}
- // 删除该用户所有记录
- List ids = records.stream().map(QmsQualityInspector::getId).collect(Collectors.toList());
- removeByIds(ids);
+ Long inspectorId = inspector.getId();
+ // 删除两张明细表
+ materialItemService.lambdaUpdate()
+ .eq(QmsInspectorMaterialItem::getInspectorId, inspectorId)
+ .remove();
+ materialCategoryItemService.lambdaUpdate()
+ .eq(QmsInspectorMaterialCategoryItem::getInspectorId, inspectorId)
+ .remove();
+ // 删除主表
+ removeById(inspectorId);
}
// ========================= 修改物料/物料类别 =========================
@@ -182,49 +214,85 @@ public class QmsQualityInspectorServiceImpl extends ServiceImpl toAdd = request.getAddMaterialIds().stream()
- .map(materialId -> buildRecord(userId, inspectionType, materialId, null, operator, now))
+ // 校验这些物料是否已被任意质检员绑定(含自己)
+ List conflictMaterials = materialItemService.lambdaQuery()
+ .in(QmsInspectorMaterialItem::getMaterialId, request.getAddMaterialIds())
+ .list();
+ if (!conflictMaterials.isEmpty()) {
+ throw new NflgException(STATE.BusinessError, "追加的物料中存在已被质检员绑定的物料,不允许重复追加");
+ }
+ List toAdd = request.getAddMaterialIds().stream()
+ .map(materialId -> new QmsInspectorMaterialItem()
+ .setInspectorId(inspectorId)
+ .setMaterialId(materialId)
+ .setCreateBy(operator)
+ .setCreateTime(now)
+ .setUpdateBy(operator)
+ .setUpdateTime(now))
.collect(Collectors.toList());
- saveBatch(toAdd);
+ materialItemService.saveBatch(toAdd);
}
- // 追加物料类别
- if (!CollectionUtils.isEmpty(request.getAddMaterialCategoryCodes())) {
- List toAdd = request.getAddMaterialCategoryCodes().stream()
- .map(code -> buildRecord(userId, inspectionType, null, code, operator, now))
- .collect(Collectors.toList());
- saveBatch(toAdd);
- }
-
- // 删除物料(按 userId + material_id)和 物料类别(按 userId + material_category_code)
- // 两者合并到一次操作,避免分步计算 total 不准确
- List toRemove = new ArrayList<>();
+ // 删除物料
if (!CollectionUtils.isEmpty(request.getRemoveMaterialIds())) {
- toRemove.addAll(lambdaQuery()
- .eq(QmsQualityInspector::getUserId, userId)
- .in(QmsQualityInspector::getMaterialId, request.getRemoveMaterialIds())
- .list());
+ materialItemService.lambdaUpdate()
+ .eq(QmsInspectorMaterialItem::getInspectorId, inspectorId)
+ .in(QmsInspectorMaterialItem::getMaterialId, request.getRemoveMaterialIds())
+ .remove();
}
+
+ // 追加物料类别(按编码查 ID)
+ if (!CollectionUtils.isEmpty(request.getAddMaterialCategoryCodes())) {
+ Map codeToIdMap = getCategoryCodeToIdMap(request.getAddMaterialCategoryCodes());
+ List addCategoryIds = new ArrayList<>(codeToIdMap.values());
+ // 校验这些物料类别是否已被任意质检员绑定(含自己)
+ if (!addCategoryIds.isEmpty()) {
+ List conflictCategories = materialCategoryItemService.lambdaQuery()
+ .in(QmsInspectorMaterialCategoryItem::getMaterialCategoryId, addCategoryIds)
+ .list();
+ if (!conflictCategories.isEmpty()) {
+ throw new NflgException(STATE.BusinessError, "追加的物料类别中存在已被质检员绑定的类别,不允许重复追加");
+ }
+ }
+ List toAdd = new ArrayList<>();
+ for (String code : request.getAddMaterialCategoryCodes()) {
+ Long categoryId = codeToIdMap.get(code);
+ if (Objects.nonNull(categoryId)) {
+ toAdd.add(new QmsInspectorMaterialCategoryItem()
+ .setInspectorId(inspectorId)
+ .setMaterialCategoryId(categoryId)
+ .setCreateBy(operator)
+ .setCreateTime(now)
+ .setUpdateBy(operator)
+ .setUpdateTime(now));
+ }
+ }
+ if (!toAdd.isEmpty()) {
+ materialCategoryItemService.saveBatch(toAdd);
+ }
+ }
+
+ // 删除物料类别(按编码查 ID)
if (!CollectionUtils.isEmpty(request.getRemoveMaterialCategoryCodes())) {
- toRemove.addAll(lambdaQuery()
- .eq(QmsQualityInspector::getUserId, userId)
- .in(QmsQualityInspector::getMaterialCategoryCode, request.getRemoveMaterialCategoryCodes())
- .list());
- }
- if (!toRemove.isEmpty()) {
- removeMaterialOrClear(userId, toRemove, operator, now);
+ Map codeToIdMap = getCategoryCodeToIdMap(request.getRemoveMaterialCategoryCodes());
+ List removeIds = new ArrayList<>(codeToIdMap.values());
+ if (!removeIds.isEmpty()) {
+ materialCategoryItemService.lambdaUpdate()
+ .eq(QmsInspectorMaterialCategoryItem::getInspectorId, inspectorId)
+ .in(QmsInspectorMaterialCategoryItem::getMaterialCategoryId, removeIds)
+ .remove();
+ }
}
}
@@ -237,33 +305,55 @@ public class QmsQualityInspectorServiceImpl extends ServiceImpl myMaterials = materialItemService.lambdaQuery()
+ .eq(QmsInspectorMaterialItem::getInspectorId, inspectorId)
+ .list();
+
+ // 查当前人员绑定的物料类别ID列表
+ List myCategories = materialCategoryItemService.lambdaQuery()
+ .eq(QmsInspectorMaterialCategoryItem::getInspectorId, inspectorId)
+ .list();
+
+ // 校验物料是否已被其他启用的质检员接管
+ if (!myMaterials.isEmpty()) {
+ List myMaterialIds = myMaterials.stream()
+ .map(QmsInspectorMaterialItem::getMaterialId)
+ .collect(Collectors.toList());
+ // 查其他人员中是否有相同物料绑定(排除自己)
+ List conflictItems = materialItemService.lambdaQuery()
+ .in(QmsInspectorMaterialItem::getMaterialId, myMaterialIds)
+ .ne(QmsInspectorMaterialItem::getInspectorId, inspectorId)
+ .list();
+ if (!conflictItems.isEmpty()) {
+ // 进一步判断接管人员是否处于启用状态
+ List conflictInspectorIds = conflictItems.stream()
+ .map(QmsInspectorMaterialItem::getInspectorId)
+ .distinct()
+ .collect(Collectors.toList());
+ long enabledCount = lambdaQuery()
+ .in(QmsQualityInspector::getId, conflictInspectorIds)
+ .eq(QmsQualityInspector::getEnable, true)
+ .count();
+ if (enabledCount > 0) {
+ throw new NflgException(STATE.BusinessError, "该质检员的部分物料已被其他启用的质检员接管,不允许启用");
+ }
+ }
+ }
+
+ // 校验物料类别是否已被其他启用的质检员接管
+ if (!myCategories.isEmpty()) {
+ List myCategoryIds = myCategories.stream()
+ .map(QmsInspectorMaterialCategoryItem::getMaterialCategoryId)
+ .collect(Collectors.toList());
+ List conflictItems = materialCategoryItemService.lambdaQuery()
+ .in(QmsInspectorMaterialCategoryItem::getMaterialCategoryId, myCategoryIds)
+ .ne(QmsInspectorMaterialCategoryItem::getInspectorId, inspectorId)
+ .list();
+ if (!conflictItems.isEmpty()) {
+ List conflictInspectorIds = conflictItems.stream()
+ .map(QmsInspectorMaterialCategoryItem::getInspectorId)
+ .distinct()
+ .collect(Collectors.toList());
+ long enabledCount = lambdaQuery()
+ .in(QmsQualityInspector::getId, conflictInspectorIds)
+ .eq(QmsQualityInspector::getEnable, true)
+ .count();
+ if (enabledCount > 0) {
+ throw new NflgException(STATE.BusinessError, "该质检员的部分物料类别已被其他启用的质检员接管,不允许启用");
+ }
+ }
+ }
+ }
+
lambdaUpdate()
.eq(QmsQualityInspector::getUserId, userId)
.set(QmsQualityInspector::getEnable, enable)
@@ -308,11 +469,13 @@ public class QmsQualityInspectorServiceImpl extends ServiceImpl getMaterialsByUserId(String materialNo, String materialCategoryCode, String materialDesc, Integer pageNum, Integer pageSize) {
+ public PageData getMaterialsByUserId(String materialNo, String materialCategoryCode,
+ String materialDesc, Integer pageNum, Integer pageSize) {
Long userId = UserUtil.getUserId();
Page page = new Page<>(pageNum, pageSize);
- IPage result = baseMapper.getMaterialsByUserIdWithFilter(page, userId, materialNo, materialCategoryCode, materialDesc);
-
+ IPage result = baseMapper.getMaterialsByUserIdWithFilter(
+ page, userId, materialNo, materialCategoryCode, materialDesc);
+
return new PageData()
.setPage((int) result.getCurrent())
.setPageSize((int) result.getSize())
diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/QmsSupplierSqeMapServiceImpl.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/QmsSupplierSqeMapServiceImpl.java
index 77a938ce..657d3626 100644
--- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/QmsSupplierSqeMapServiceImpl.java
+++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/QmsSupplierSqeMapServiceImpl.java
@@ -1,13 +1,16 @@
package com.nflg.wms.repository.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nflg.wms.common.constant.STATE;
import com.nflg.wms.common.exception.NflgException;
import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.qo.QmsSupplierSqeSearchQO;
+import com.nflg.wms.common.pojo.vo.QmsSupplierSqeMapFlatVO;
import com.nflg.wms.common.pojo.vo.QmsSupplierSqeMapVO;
+import com.nflg.wms.common.pojo.vo.QmsSupplierSqeUserVO;
import com.nflg.wms.common.pojo.vo.QmsUserSupplierVO;
import com.nflg.wms.common.util.UserUtil;
import com.nflg.wms.repository.entity.QmsSupplierSqeMap;
@@ -17,7 +20,10 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
import java.util.List;
+import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
@@ -36,7 +42,56 @@ public class QmsSupplierSqeMapServiceImpl extends ServiceImpl searchMap(QmsSupplierSqeSearchQO request) {
- return baseMapper.searchMap(request, new Page<>(request.getPage(), request.getPageSize()));
+ // 1. 查平铺列表
+ List flatList = baseMapper.searchMapFlat(request);
+
+ // 2. 按 supplierId 聚合(保持原始排序,LinkedHashMap)
+ Map grouped = new LinkedHashMap<>();
+ for (QmsSupplierSqeMapFlatVO flat : flatList) {
+ QmsSupplierSqeMapVO vo = grouped.computeIfAbsent(flat.getSupplierId(), id -> {
+ QmsSupplierSqeMapVO newVo = new QmsSupplierSqeMapVO();
+ newVo.setSupplierId(flat.getSupplierId());
+ newVo.setSupplierCode(flat.getSupplierCode());
+ newVo.setSupplierName(flat.getSupplierName());
+ newVo.setEnable(flat.getEnable());
+ newVo.setCreateTime(flat.getCreateTime());
+ newVo.setCreateBy(flat.getCreateBy());
+ newVo.setUpdateTime(flat.getUpdateTime());
+ newVo.setUpdateBy(flat.getUpdateBy());
+ newVo.setUsers(new ArrayList<>());
+ return newVo;
+ });
+ // 追加用户信息
+ if (Objects.nonNull(flat.getUserId())) {
+ QmsSupplierSqeUserVO userVO = new QmsSupplierSqeUserVO();
+ userVO.setUserId(flat.getUserId());
+ userVO.setUserName(flat.getUserName());
+ vo.getUsers().add(userVO);
+ }
+ // enable 取最严格(有一条禁用则整体禁用)
+ if (Boolean.FALSE.equals(flat.getEnable())) {
+ vo.setEnable(false);
+ }
+ // 取最晚修改时间
+ if (flat.getUpdateTime() != null && (vo.getUpdateTime() == null
+ || flat.getUpdateTime().isAfter(vo.getUpdateTime()))) {
+ vo.setUpdateTime(flat.getUpdateTime());
+ vo.setUpdateBy(flat.getUpdateBy());
+ }
+ }
+
+ // 3. 手动分页
+ List allList = new ArrayList<>(grouped.values());
+ int page = request.getPage();
+ int pageSize = request.getPageSize();
+ int total = allList.size();
+ int fromIndex = Math.min((page - 1) * pageSize, total);
+ int toIndex = Math.min(fromIndex + pageSize, total);
+ List pageList = allList.subList(fromIndex, toIndex);
+
+ Page result = new Page<>(page, pageSize, total);
+ result.setRecords(pageList);
+ return result;
}
@Transactional
@@ -71,28 +126,25 @@ public class QmsSupplierSqeMapServiceImpl extends ServiceImpl userIds) {
- // 查询该供应商已存在的用户ID集合
- Set existUserIds = lambdaQuery()
+ // 先删除该供应商所有负责人关联
+ lambdaUpdate()
.eq(QmsSupplierSqeMap::getSupplierId, supplierId)
- .list()
- .stream()
- .map(QmsSupplierSqeMap::getUserId)
- .collect(Collectors.toSet());
- // 只插入不存在的记录,跳过重复的
- String operator = UserUtil.getUserName();
- LocalDateTime now = LocalDateTime.now();
- List toAdd = userIds.stream()
- .filter(userId -> !existUserIds.contains(userId))
- .map(userId -> new QmsSupplierSqeMap()
- .setSupplierId(supplierId)
- .setUserId(userId)
- .setEnable(true)
- .setCreateBy(operator)
- .setCreateTime(now)
- .setUpdateBy(operator)
- .setUpdateTime(now))
- .collect(Collectors.toList());
- if (!toAdd.isEmpty()) {
+ .remove();
+
+ // 再全量插入传入的用户列表
+ if (!CollectionUtils.isEmpty(userIds)) {
+ String operator = UserUtil.getUserName();
+ LocalDateTime now = LocalDateTime.now();
+ List toAdd = userIds.stream()
+ .map(userId -> new QmsSupplierSqeMap()
+ .setSupplierId(supplierId)
+ .setUserId(userId)
+ .setEnable(true)
+ .setCreateBy(operator)
+ .setCreateTime(now)
+ .setUpdateBy(operator)
+ .setUpdateTime(now))
+ .collect(Collectors.toList());
saveBatch(toAdd);
}
}
diff --git a/nflg-wms-repository/src/main/resources/mapper/QmsInspectorMaterialCategoryItemMapper.xml b/nflg-wms-repository/src/main/resources/mapper/QmsInspectorMaterialCategoryItemMapper.xml
new file mode 100644
index 00000000..4d17c096
--- /dev/null
+++ b/nflg-wms-repository/src/main/resources/mapper/QmsInspectorMaterialCategoryItemMapper.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/nflg-wms-repository/src/main/resources/mapper/QmsInspectorMaterialItemMapper.xml b/nflg-wms-repository/src/main/resources/mapper/QmsInspectorMaterialItemMapper.xml
new file mode 100644
index 00000000..7bda46a5
--- /dev/null
+++ b/nflg-wms-repository/src/main/resources/mapper/QmsInspectorMaterialItemMapper.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/nflg-wms-repository/src/main/resources/mapper/QmsQualityInspectorMapper.xml b/nflg-wms-repository/src/main/resources/mapper/QmsQualityInspectorMapper.xml
index 7572a35e..1f85a407 100644
--- a/nflg-wms-repository/src/main/resources/mapper/QmsQualityInspectorMapper.xml
+++ b/nflg-wms-repository/src/main/resources/mapper/QmsQualityInspectorMapper.xml
@@ -3,8 +3,7 @@
-
+
+
+
+
+
+
+
diff --git a/nflg-wms-repository/src/main/resources/mapper/QmsSupplierSqeMapMapper.xml b/nflg-wms-repository/src/main/resources/mapper/QmsSupplierSqeMapMapper.xml
index 8b49cd2d..470b2f61 100644
--- a/nflg-wms-repository/src/main/resources/mapper/QmsSupplierSqeMapMapper.xml
+++ b/nflg-wms-repository/src/main/resources/mapper/QmsSupplierSqeMapMapper.xml
@@ -32,6 +32,36 @@
ORDER BY qssm.supplier_id DESC
+
+
+