From ea03b6efc7ad3beac795d4aec8ac0d4e343df835 Mon Sep 17 00:00:00 2001 From: "han\\hanst" Date: Wed, 17 Sep 2025 13:37:10 +0800 Subject: [PATCH] PartAttribute --- .../factory/dao/PartAttributeMapper.java | 33 +++ .../modules/factory/entity/PartAttribute.java | 59 +++++ .../entity/dto/PartAttributeQueryDto.java | 40 +++ .../factory/service/PartAttributeService.java | 50 ++++ .../impl/PartAttributeServiceImpl.java | 246 ++++++++++++++++++ .../mapper/factory/PartAttributeMapper.xml | 57 ++++ 6 files changed, 485 insertions(+) create mode 100644 src/main/java/com/gaotao/modules/factory/dao/PartAttributeMapper.java create mode 100644 src/main/java/com/gaotao/modules/factory/entity/PartAttribute.java create mode 100644 src/main/java/com/gaotao/modules/factory/entity/dto/PartAttributeQueryDto.java create mode 100644 src/main/java/com/gaotao/modules/factory/service/PartAttributeService.java create mode 100644 src/main/java/com/gaotao/modules/factory/service/impl/PartAttributeServiceImpl.java create mode 100644 src/main/resources/mapper/factory/PartAttributeMapper.xml diff --git a/src/main/java/com/gaotao/modules/factory/dao/PartAttributeMapper.java b/src/main/java/com/gaotao/modules/factory/dao/PartAttributeMapper.java new file mode 100644 index 0000000..8cf8ad7 --- /dev/null +++ b/src/main/java/com/gaotao/modules/factory/dao/PartAttributeMapper.java @@ -0,0 +1,33 @@ +package com.gaotao.modules.factory.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.gaotao.modules.factory.entity.PartAttribute; +import com.gaotao.modules.factory.entity.dto.PartAttributeQueryDto; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 料件属性Mapper接口 + */ +@Mapper +public interface PartAttributeMapper extends BaseMapper { + + /** + * 分页查询料件属性列表 + */ + IPage getPartAttributeList(Page page, @Param("params") PartAttributeQueryDto queryDto); + + /** + * 查询料件属性列表(不分页) + */ + List getPartAttributeList(@Param("params") PartAttributeQueryDto queryDto); + + /** + * 根据站点和料号查询料件属性 + */ + PartAttribute getPartAttributeByKey(@Param("site") String site, @Param("partNo") String partNo); +} diff --git a/src/main/java/com/gaotao/modules/factory/entity/PartAttribute.java b/src/main/java/com/gaotao/modules/factory/entity/PartAttribute.java new file mode 100644 index 0000000..76b8d05 --- /dev/null +++ b/src/main/java/com/gaotao/modules/factory/entity/PartAttribute.java @@ -0,0 +1,59 @@ +package com.gaotao.modules.factory.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 料件属性实体类 + */ +@Data +@TableName("part_attribute") +public class PartAttribute { + + /** + * 工厂/站点 + */ + private String site; + + /** + * 料号 + */ + private String partNo; + + /** + * 是否进立库 (Y/N) + */ + private String isInWh; + + /** + * 是否机械手臂拣选 (Y/N) + */ + private String isRobotPick; + + /** + * 重量 (kg) + */ + private BigDecimal weight; + + /** + * 长度 (mm) + */ + private BigDecimal length; + + /** + * 宽度 (mm) + */ + private BigDecimal width; + + /** + * 高度 (mm) + */ + private BigDecimal height; + + /** + * 直径 (mm) + */ + private BigDecimal diameter; +} diff --git a/src/main/java/com/gaotao/modules/factory/entity/dto/PartAttributeQueryDto.java b/src/main/java/com/gaotao/modules/factory/entity/dto/PartAttributeQueryDto.java new file mode 100644 index 0000000..e426864 --- /dev/null +++ b/src/main/java/com/gaotao/modules/factory/entity/dto/PartAttributeQueryDto.java @@ -0,0 +1,40 @@ +package com.gaotao.modules.factory.entity.dto; + +import lombok.Data; + +/** + * 料件属性查询DTO + */ +@Data +public class PartAttributeQueryDto { + + /** + * 当前页 + */ + private int page = 1; + + /** + * 每页显示条数 + */ + private int size = 10; + + /** + * 工厂/站点 + */ + private String site; + + /** + * 料号(支持模糊查询) + */ + private String partNo; + + /** + * 是否进立库 (Y/N) + */ + private String isInWh; + + /** + * 是否机械手臂拣选 (Y/N) + */ + private String isRobotPick; +} diff --git a/src/main/java/com/gaotao/modules/factory/service/PartAttributeService.java b/src/main/java/com/gaotao/modules/factory/service/PartAttributeService.java new file mode 100644 index 0000000..048c0d6 --- /dev/null +++ b/src/main/java/com/gaotao/modules/factory/service/PartAttributeService.java @@ -0,0 +1,50 @@ +package com.gaotao.modules.factory.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.gaotao.common.utils.PageUtils; +import com.gaotao.common.utils.R; +import com.gaotao.modules.factory.entity.PartAttribute; +import com.gaotao.modules.factory.entity.dto.PartAttributeQueryDto; + +import java.util.List; + +/** + * 料件属性服务接口 + */ +public interface PartAttributeService extends IService { + + /** + * 分页查询料件属性列表 + */ + PageUtils getPartAttributeList(PartAttributeQueryDto queryDto); + + /** + * 根据站点和料号查询料件属性 + */ + PartAttribute getPartAttributeByKey(String site, String partNo); + + /** + * 新增料件属性 + */ + R savePartAttribute(PartAttribute partAttribute); + + /** + * 修改料件属性 + */ + R updatePartAttribute(PartAttribute partAttribute); + + /** + * 删除料件属性 + */ + R deletePartAttribute(String site, String partNo); + + /** + * 批量删除料件属性 + */ + R batchDeletePartAttribute(List partAttributes); + + /** + * 验证料件属性数据 + */ + R validatePartAttribute(PartAttribute partAttribute); +} diff --git a/src/main/java/com/gaotao/modules/factory/service/impl/PartAttributeServiceImpl.java b/src/main/java/com/gaotao/modules/factory/service/impl/PartAttributeServiceImpl.java new file mode 100644 index 0000000..14c42fd --- /dev/null +++ b/src/main/java/com/gaotao/modules/factory/service/impl/PartAttributeServiceImpl.java @@ -0,0 +1,246 @@ +package com.gaotao.modules.factory.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gaotao.common.exception.XJException; +import com.gaotao.common.utils.PageUtils; +import com.gaotao.common.utils.R; +import com.gaotao.modules.factory.dao.PartAttributeMapper; +import com.gaotao.modules.factory.entity.PartAttribute; +import com.gaotao.modules.factory.entity.dto.PartAttributeQueryDto; +import com.gaotao.modules.factory.service.PartAttributeService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; + +import java.util.List; + +/** + * 料件属性服务实现类 + */ +@Slf4j +@Service +public class PartAttributeServiceImpl extends ServiceImpl implements PartAttributeService { + + @Autowired + private PartAttributeMapper partAttributeMapper; + + @Override + public PageUtils getPartAttributeList(PartAttributeQueryDto queryDto) { + IPage page = partAttributeMapper.getPartAttributeList( + new Page<>(queryDto.getPage(), queryDto.getSize()), queryDto); + return new PageUtils(page); + } + + @Override + public PartAttribute getPartAttributeByKey(String site, String partNo) { + return partAttributeMapper.getPartAttributeByKey(site, partNo); + } + + @Override + @Transactional + public R savePartAttribute(PartAttribute partAttribute) { + try { + // 数据验证 + R validateResult = validatePartAttribute(partAttribute); + if ((int)validateResult.get("code") != 0) { + return validateResult; + } + + // 检查是否已存在 + PartAttribute existing = getPartAttributeByKey(partAttribute.getSite(), partAttribute.getPartNo()); + if (existing != null) { + return R.error("料件属性已存在,请使用修改功能"); + } + + // 设置默认值 + if (!StringUtils.hasText(partAttribute.getIsInWh())) { + partAttribute.setIsInWh("N"); + } + if (!StringUtils.hasText(partAttribute.getIsRobotPick())) { + partAttribute.setIsRobotPick("N"); + } + + // 保存 + this.save(partAttribute); + + return R.ok("新增料件属性成功"); + + } catch (Exception e) { + log.error("新增料件属性失败: {}", e.getMessage(), e); + throw new XJException("新增料件属性失败: " + e.getMessage()); + } + } + + @Override + @Transactional + public R updatePartAttribute(PartAttribute partAttribute) { + try { + // 数据验证 + R validateResult = validatePartAttribute(partAttribute); + if ((int)validateResult.get("code") != 0) { + return validateResult; + } + + // 检查记录是否存在 + PartAttribute existing = getPartAttributeByKey(partAttribute.getSite(), partAttribute.getPartNo()); + if (existing == null) { + return R.error("料件属性不存在"); + } + + // 构建更新条件 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(PartAttribute::getSite, partAttribute.getSite()) + .eq(PartAttribute::getPartNo, partAttribute.getPartNo()); + + // 更新 + this.update(partAttribute, wrapper); + + return R.ok("修改料件属性成功"); + + } catch (Exception e) { + log.error("修改料件属性失败: {}", e.getMessage(), e); + throw new XJException("修改料件属性失败: " + e.getMessage()); + } + } + + @Override + @Transactional + public R deletePartAttribute(String site, String partNo) { + try { + // 检查记录是否存在 + PartAttribute existing = getPartAttributeByKey(site, partNo); + if (existing == null) { + return R.error("料件属性不存在"); + } + + // 构建删除条件 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(PartAttribute::getSite, site) + .eq(PartAttribute::getPartNo, partNo); + + // 删除 + this.remove(wrapper); + + return R.ok("删除料件属性成功"); + + } catch (Exception e) { + log.error("删除料件属性失败: {}", e.getMessage(), e); + throw new XJException("删除料件属性失败: " + e.getMessage()); + } + } + + @Override + @Transactional + public R batchDeletePartAttribute(List partAttributes) { + try { + if (partAttributes == null || partAttributes.isEmpty()) { + return R.error("删除列表不能为空"); + } + + int successCount = 0; + int failCount = 0; + StringBuilder errorMsg = new StringBuilder(); + + for (PartAttribute partAttribute : partAttributes) { + try { + R result = deletePartAttribute(partAttribute.getSite(), partAttribute.getPartNo()); + if ((int)result.get("code") == 0) { + successCount++; + } else { + failCount++; + errorMsg.append("料号").append(partAttribute.getPartNo()).append("删除失败: ") + .append(result.get("msg")).append("; "); + } + } catch (Exception e) { + failCount++; + errorMsg.append("料号").append(partAttribute.getPartNo()).append("删除异常: ") + .append(e.getMessage()).append("; "); + } + } + + String resultMsg = String.format("批量删除完成,成功%d条,失败%d条", successCount, failCount); + if (failCount > 0) { + resultMsg += "。失败原因: " + errorMsg.toString(); + } + + if (failCount == 0) { + return R.ok(resultMsg); + } else if (successCount > 0) { + return R.ok(resultMsg).put("hasError", true); + } else { + return R.error(resultMsg); + } + + } catch (Exception e) { + log.error("批量删除料件属性失败: {}", e.getMessage(), e); + throw new XJException("批量删除料件属性失败: " + e.getMessage()); + } + } + + @Override + public R validatePartAttribute(PartAttribute partAttribute) { + if (partAttribute == null) { + return R.error("料件属性数据不能为空"); + } + + if (!StringUtils.hasText(partAttribute.getSite())) { + return R.error("工厂/站点不能为空"); + } + + if (!StringUtils.hasText(partAttribute.getPartNo())) { + return R.error("料号不能为空"); + } + + // 验证工厂/站点长度 + if (partAttribute.getSite().length() > 50) { + return R.error("工厂/站点长度不能超过50个字符"); + } + + // 验证料号长度 + if (partAttribute.getPartNo().length() > 100) { + return R.error("料号长度不能超过100个字符"); + } + + // 验证是否进立库字段 + if (StringUtils.hasText(partAttribute.getIsInWh())) { + if (!"Y".equals(partAttribute.getIsInWh()) && !"N".equals(partAttribute.getIsInWh())) { + return R.error("是否进立库只能填写Y或N"); + } + } + + // 验证是否机械手臂拣选字段 + if (StringUtils.hasText(partAttribute.getIsRobotPick())) { + if (!"Y".equals(partAttribute.getIsRobotPick()) && !"N".equals(partAttribute.getIsRobotPick())) { + return R.error("是否机械手臂拣选只能填写Y或N"); + } + } + + // 验证数值字段不能为负数 + if (partAttribute.getWeight() != null && partAttribute.getWeight().signum() < 0) { + return R.error("重量不能为负数"); + } + + if (partAttribute.getLength() != null && partAttribute.getLength().signum() < 0) { + return R.error("长度不能为负数"); + } + + if (partAttribute.getWidth() != null && partAttribute.getWidth().signum() < 0) { + return R.error("宽度不能为负数"); + } + + if (partAttribute.getHeight() != null && partAttribute.getHeight().signum() < 0) { + return R.error("高度不能为负数"); + } + + if (partAttribute.getDiameter() != null && partAttribute.getDiameter().signum() < 0) { + return R.error("直径不能为负数"); + } + + return R.ok(); + } +} diff --git a/src/main/resources/mapper/factory/PartAttributeMapper.xml b/src/main/resources/mapper/factory/PartAttributeMapper.xml new file mode 100644 index 0000000..f7609b8 --- /dev/null +++ b/src/main/resources/mapper/factory/PartAttributeMapper.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + SELECT site, part_no, is_in_wh, is_robot_pick, weight, length, width, height, diameter + FROM part_attribute + + + + + + + AND site = #{params.site} + + + AND part_no LIKE CONCAT('%', #{params.partNo}, '%') + + + AND is_in_wh = #{params.isInWh} + + + AND is_robot_pick = #{params.isRobotPick} + + + + + + + + + + +