diff --git a/nflg-qms-admin/pom.xml b/nflg-qms-admin/pom.xml index 417ec78e..6553b5ca 100644 --- a/nflg-qms-admin/pom.xml +++ b/nflg-qms-admin/pom.xml @@ -207,6 +207,29 @@ minio 8.5.17 + + + io.jsonwebtoken + jjwt-api + 0.12.6 + + + io.jsonwebtoken + jjwt-impl + 0.12.6 + runtime + + + io.jsonwebtoken + jjwt-jackson + 0.12.6 + runtime + + + software.amazon.awssdk + s3 + 2.39.5 + diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsQualityInspectorCategoryVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsQualityInspectorCategoryVO.java index 92050a6a..a01735f4 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsQualityInspectorCategoryVO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsQualityInspectorCategoryVO.java @@ -9,7 +9,7 @@ import lombok.Data; public class QmsQualityInspectorCategoryVO { /** - * 关联记录ID(qms_quality_inspector.id) + * 关联记录ID(qms_inspector_material_category_item.id) */ private Long id; diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsQualityInspectorMaterialVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsQualityInspectorMaterialVO.java index 5dad66d7..1efdfc05 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsQualityInspectorMaterialVO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsQualityInspectorMaterialVO.java @@ -9,7 +9,7 @@ import lombok.Data; public class QmsQualityInspectorMaterialVO { /** - * 关联记录ID(qms_quality_inspector.id) + * 关联记录ID(qms_inspector_material_item.id) */ private Long id; 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/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/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..7806c8ce 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 @@ -16,9 +16,15 @@ 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.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.service.IQmsQcMaterialCategoryService; import com.nflg.wms.repository.service.IQmsQualityInspectorService; import com.nflg.wms.repository.service.IUserService; import jakarta.annotation.Resource; @@ -29,8 +35,8 @@ import org.springframework.util.CollectionUtils; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Objects; -import java.util.Set; import java.util.stream.Collectors; /** @@ -48,6 +54,31 @@ 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 +86,76 @@ public class QmsQualityInspectorServiceImpl extends ServiceImpl records = new ArrayList<>(); - boolean hasMaterial = !CollectionUtils.isEmpty(request.getMaterialIds()); - boolean hasCategory = !CollectionUtils.isEmpty(request.getMaterialCategoryCodes()); - - 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.getId(); - /** - * 删除物料/物料类别关联行。 - * 若删除后该 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 +164,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 +196,68 @@ public class QmsQualityInspectorServiceImpl extends ServiceImpl toAdd = request.getAddMaterialIds().stream() - .map(materialId -> buildRecord(userId, inspectionType, materialId, null, operator, now)) + 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 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,12 +270,11 @@ 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 +410,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/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..3598fbcc 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 @@ - +