From 25dc4c37320b985fe598c4e731821c0f83c3e824 Mon Sep 17 00:00:00 2001 From: qiankanghui Date: Wed, 3 Jun 2026 17:09:34 +0800 Subject: [PATCH] =?UTF-8?q?feat(quality):=20=E6=96=B0=E5=A2=9E=E8=B4=A8?= =?UTF-8?q?=E9=87=8F=E5=8F=8D=E9=A6=88=E6=A8=A1=E5=9D=97=E5=AE=8C=E6=95=B4?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 创建QualityIssue实体类定义质量问题相关字段 - 实现QualityIssueController控制器提供CRUD接口 - 添加质量反馈保存、更新、删除和关闭功能 - 实现质量问题与采购订单绑定功能 - 添加可用采购订单查询和关联操作 - 集成供应商信息查询和事务号管理 - 实现分页查询和批量操作功能 - 添加完整的数据传输对象DTO定义 - 配置MyBatis映射文件和数据库操作 - 实现事务管理和异常处理机制 --- .../controller/QualityIssueController.java | 30 +++++ .../quality/data/QualityIssueBindPoDto.java | 15 +++ .../quality/data/QualityIssuePoSelectDto.java | 26 +++++ .../quality/data/QualityIssueSavePoDto.java | 19 +++ .../modules/quality/data/QueryPoDto.java | 46 ++++++++ .../modules/quality/entity/QualityIssue.java | 3 + .../quality/entity/SrmQualityIssuePo.java | 32 +++++ .../mapper/SrmQualityIssuePoMapper.java | 43 +++++++ .../quality/service/QualityIssueService.java | 14 +++ .../service/impl/QualityIssueServiceImpl.java | 110 ++++++++++++++++++ .../quality/SrmQualityIssuePoMapper.xml | 103 ++++++++++++++++ 11 files changed, 441 insertions(+) create mode 100644 src/main/java/com/xujie/modules/quality/data/QualityIssueBindPoDto.java create mode 100644 src/main/java/com/xujie/modules/quality/data/QualityIssuePoSelectDto.java create mode 100644 src/main/java/com/xujie/modules/quality/data/QualityIssueSavePoDto.java create mode 100644 src/main/java/com/xujie/modules/quality/data/QueryPoDto.java create mode 100644 src/main/java/com/xujie/modules/quality/entity/SrmQualityIssuePo.java create mode 100644 src/main/java/com/xujie/modules/quality/mapper/SrmQualityIssuePoMapper.java create mode 100644 src/main/resources/mapper/quality/SrmQualityIssuePoMapper.xml diff --git a/src/main/java/com/xujie/modules/quality/controller/QualityIssueController.java b/src/main/java/com/xujie/modules/quality/controller/QualityIssueController.java index 9a9be5e..0b29bf4 100644 --- a/src/main/java/com/xujie/modules/quality/controller/QualityIssueController.java +++ b/src/main/java/com/xujie/modules/quality/controller/QualityIssueController.java @@ -2,9 +2,13 @@ package com.xujie.modules.quality.controller; import com.xujie.common.utils.PageUtils; import com.xujie.common.utils.R; +import com.xujie.modules.quality.data.QualityIssueBindPoDto; +import com.xujie.modules.quality.data.QualityIssuePoSelectDto; +import com.xujie.modules.quality.data.QueryPoDto; import com.xujie.modules.quality.entity.QualityIssue; import com.xujie.modules.quality.entity.QualityIssueClaim; import com.xujie.modules.quality.entity.QualityIssueReply; +import com.xujie.modules.quality.entity.SrmQualityIssuePo; import com.xujie.modules.quality.service.QualityIssueClaimService; import com.xujie.modules.quality.service.QualityIssueReplyService; import com.xujie.modules.quality.service.QualityIssueService; @@ -15,6 +19,8 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.List; + @RestController @RequestMapping("/srm/qualityIssue") public class QualityIssueController { @@ -75,4 +81,28 @@ public class QualityIssueController { return R.ok(); } + @PostMapping("/bindIssuePo") + public R bindIssuePo(@RequestBody QualityIssueBindPoDto dto){ + qualityIssueService.bindIssuePo(dto); + return R.ok(); + } + + @PostMapping("/getAvailablePoList") + public R getAvailablePoList(@RequestBody QueryPoDto dto){ + PageUtils page = qualityIssueService.getAvailablePoList(dto); + return R.ok().put("page", page); + } + + @PostMapping("/getIssuePoList") + public R getIssuePoList(@RequestBody QualityIssue qualityIssue){ + List list = qualityIssueService.getIssuePoList(qualityIssue.getSite(), qualityIssue.getIssueNo()); + return R.ok().put("data", list); + } + + @PostMapping("/deleteIssuePo") + public R deleteIssuePo(@RequestBody QualityIssue qualityIssue){ + qualityIssueService.deleteIssuePo(qualityIssue.getSite(), qualityIssue.getIssueNo(), qualityIssue.getPoNo(), qualityIssue.getItemNo()); + return R.ok(); + } + } diff --git a/src/main/java/com/xujie/modules/quality/data/QualityIssueBindPoDto.java b/src/main/java/com/xujie/modules/quality/data/QualityIssueBindPoDto.java new file mode 100644 index 0000000..28ba426 --- /dev/null +++ b/src/main/java/com/xujie/modules/quality/data/QualityIssueBindPoDto.java @@ -0,0 +1,15 @@ +package com.xujie.modules.quality.data; + +import lombok.Data; + +import java.util.List; + +@Data +public class QualityIssueBindPoDto { + + private String site; + + private String issueNo; + + private List poList; +} diff --git a/src/main/java/com/xujie/modules/quality/data/QualityIssuePoSelectDto.java b/src/main/java/com/xujie/modules/quality/data/QualityIssuePoSelectDto.java new file mode 100644 index 0000000..ff0e503 --- /dev/null +++ b/src/main/java/com/xujie/modules/quality/data/QualityIssuePoSelectDto.java @@ -0,0 +1,26 @@ +package com.xujie.modules.quality.data; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +public class QualityIssuePoSelectDto { + + private String site; + + private String poNo; + + private Integer itemNo; + + private String partNo; + + private String sku; + + private Date poDate; + + private BigDecimal qty; + + private BigDecimal shippedQty; +} diff --git a/src/main/java/com/xujie/modules/quality/data/QualityIssueSavePoDto.java b/src/main/java/com/xujie/modules/quality/data/QualityIssueSavePoDto.java new file mode 100644 index 0000000..5090ac0 --- /dev/null +++ b/src/main/java/com/xujie/modules/quality/data/QualityIssueSavePoDto.java @@ -0,0 +1,19 @@ +package com.xujie.modules.quality.data; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class QualityIssueSavePoDto { + + private String poNo; + + private Integer itemNo; + + private String partNo; + + private BigDecimal qty; + + private BigDecimal shippedQty; +} diff --git a/src/main/java/com/xujie/modules/quality/data/QueryPoDto.java b/src/main/java/com/xujie/modules/quality/data/QueryPoDto.java new file mode 100644 index 0000000..0565b77 --- /dev/null +++ b/src/main/java/com/xujie/modules/quality/data/QueryPoDto.java @@ -0,0 +1,46 @@ +package com.xujie.modules.quality.data; + +import lombok.Data; + +import java.util.Date; + +@Data +public class QueryPoDto { + + /** + * 站点 + */ + private String site; + + /** + * 供应商编号 + */ + private String supplierNo; + + /** + * PO号 + */ + private String poNo; + + /** + * 料号 + */ + private String partNo; + + /** + * 开始日期 + */ + private Date beginDate; + + /** + * 结束日期 + */ + private Date endDate; + + /** + * 分页 + */ + private Integer pageIndex = 1; + + private Integer pageSize = 20; +} diff --git a/src/main/java/com/xujie/modules/quality/entity/QualityIssue.java b/src/main/java/com/xujie/modules/quality/entity/QualityIssue.java index 05dba94..a0698c1 100644 --- a/src/main/java/com/xujie/modules/quality/entity/QualityIssue.java +++ b/src/main/java/com/xujie/modules/quality/entity/QualityIssue.java @@ -86,6 +86,9 @@ public class QualityIssue extends QueryPage { private String poNo; + @TableField(exist = false) + private Integer itemNo; + private BigDecimal batchQty; private BigDecimal rejectBatchQty; diff --git a/src/main/java/com/xujie/modules/quality/entity/SrmQualityIssuePo.java b/src/main/java/com/xujie/modules/quality/entity/SrmQualityIssuePo.java new file mode 100644 index 0000000..07a42b6 --- /dev/null +++ b/src/main/java/com/xujie/modules/quality/entity/SrmQualityIssuePo.java @@ -0,0 +1,32 @@ +package com.xujie.modules.quality.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +public class SrmQualityIssuePo { + + private String site; + + private String issueNo; + + private String poNo; + + private Integer itemNo; + + private String partNo; + + @TableField(exist = false) + private String sku; + + private BigDecimal poQty; + + private BigDecimal shippedQty; + + private String createBy; + + private Date createDate; +} diff --git a/src/main/java/com/xujie/modules/quality/mapper/SrmQualityIssuePoMapper.java b/src/main/java/com/xujie/modules/quality/mapper/SrmQualityIssuePoMapper.java new file mode 100644 index 0000000..4046ca3 --- /dev/null +++ b/src/main/java/com/xujie/modules/quality/mapper/SrmQualityIssuePoMapper.java @@ -0,0 +1,43 @@ +package com.xujie.modules.quality.mapper; + +import com.xujie.modules.quality.data.QualityIssuePoSelectDto; +import com.xujie.modules.quality.entity.SrmQualityIssuePo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; + +@Mapper +public interface SrmQualityIssuePoMapper { + + List getAvailablePoList( + @Param("site") String site, + @Param("supplierNo") String supplierNo, + @Param("poNo") String poNo, + @Param("partNo") String partNo, + @Param("beginDate") Date beginDate, + @Param("endDate") Date endDate + ); + + int deleteByIssueNo( + @Param("site") String site, + @Param("issueNo") String issueNo + ); + + int batchInsert( + @Param("list") List list + ); + + List getIssuePoList( + @Param("site") String site, + @Param("issueNo") String issueNo + ); + + int deleteByPoNo( + @Param("site") String site, + @Param("issueNo") String issueNo, + @Param("poNo") String poNo, + @Param("itemNo") Integer itemNo + ); +} diff --git a/src/main/java/com/xujie/modules/quality/service/QualityIssueService.java b/src/main/java/com/xujie/modules/quality/service/QualityIssueService.java index 29ab845..cde2360 100644 --- a/src/main/java/com/xujie/modules/quality/service/QualityIssueService.java +++ b/src/main/java/com/xujie/modules/quality/service/QualityIssueService.java @@ -2,7 +2,13 @@ package com.xujie.modules.quality.service; import com.baomidou.mybatisplus.extension.service.IService; import com.xujie.common.utils.PageUtils; +import com.xujie.modules.quality.data.QualityIssueBindPoDto; +import com.xujie.modules.quality.data.QualityIssuePoSelectDto; +import com.xujie.modules.quality.data.QueryPoDto; import com.xujie.modules.quality.entity.QualityIssue; +import com.xujie.modules.quality.entity.SrmQualityIssuePo; + +import java.util.List; public interface QualityIssueService extends IService { @@ -16,4 +22,12 @@ public interface QualityIssueService extends IService { void updateByIssueNo(QualityIssue qualityIssue); void closeIssue(QualityIssue qualityIssue); + + void bindIssuePo(QualityIssueBindPoDto dto); + + PageUtils getAvailablePoList(QueryPoDto dto); + + List getIssuePoList(String site, String issueNo); + + void deleteIssuePo(String site, String issueNo, String poNo, Integer itemNo); } diff --git a/src/main/java/com/xujie/modules/quality/service/impl/QualityIssueServiceImpl.java b/src/main/java/com/xujie/modules/quality/service/impl/QualityIssueServiceImpl.java index 1b4a403..2a6e4d3 100644 --- a/src/main/java/com/xujie/modules/quality/service/impl/QualityIssueServiceImpl.java +++ b/src/main/java/com/xujie/modules/quality/service/impl/QualityIssueServiceImpl.java @@ -2,21 +2,32 @@ package com.xujie.modules.quality.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.xujie.common.utils.PageUtils; import com.xujie.common.utils.ShiroUtils; +import com.xujie.modules.quality.data.QualityIssueBindPoDto; +import com.xujie.modules.quality.data.QualityIssuePoSelectDto; +import com.xujie.modules.quality.data.QualityIssueSavePoDto; +import com.xujie.modules.quality.data.QueryPoDto; import com.xujie.modules.quality.entity.QualityIssue; +import com.xujie.modules.quality.entity.SrmQualityIssuePo; import com.xujie.modules.quality.mapper.QualityIssueMapper; +import com.xujie.modules.quality.mapper.SrmQualityIssuePoMapper; import com.xujie.modules.quality.service.QualityIssueService; import com.xujie.modules.srm.mapper.SrmSupplierMapper; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.SecurityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; import java.util.Date; import java.util.List; +@Slf4j @Service public class QualityIssueServiceImpl extends ServiceImpl implements QualityIssueService { @Autowired @@ -24,6 +35,8 @@ public class QualityIssueServiceImpl extends ServiceImpl 100) { + userName = userName.substring(0, 100); + } + + // 先删除旧的关联数据 + qualityIssuePoMapper.deleteByIssueNo(dto.getSite(), dto.getIssueNo()); + + List list = new ArrayList<>(); + for (int i = 0; i < dto.getPoList().size(); i++) { + QualityIssueSavePoDto item = dto.getPoList().get(i); + log.info("处理第{}条PO: poNo={}, itemNo={}, partNo={}, qty={}, shippedQty={}", + i + 1, item.getPoNo(), item.getItemNo(), item.getPartNo(), + item.getQty(), item.getShippedQty()); + + SrmQualityIssuePo po = new SrmQualityIssuePo(); + po.setSite(dto.getSite()); + po.setIssueNo(dto.getIssueNo()); + po.setPoNo(item.getPoNo()); + po.setItemNo(item.getItemNo()); + // 限制partNo长度 + if (item.getPartNo() != null && item.getPartNo().length() > 100) { + po.setPartNo(item.getPartNo().substring(0, 100)); + } else { + po.setPartNo(item.getPartNo()); + } + po.setPoQty(item.getQty()); + po.setShippedQty(item.getShippedQty()); // 设置已发货数量 + po.setCreateBy(userName); + list.add(po); + } + + log.info("准备插入{}条PO关联记录", list.size()); + qualityIssuePoMapper.batchInsert(list); + log.info("PO关联数据保存成功"); + } + + @Override + public PageUtils getAvailablePoList(QueryPoDto dto) { + IPage page = + new Page<>( + dto.getPageIndex(), + dto.getPageSize() + ); + + page.setRecords( + qualityIssuePoMapper.getAvailablePoList( + dto.getSite(), + dto.getSupplierNo(), + dto.getPoNo(), + dto.getPartNo(), + dto.getBeginDate(), + dto.getEndDate() + ) + ); + + return new PageUtils(page); + } + + @Override + public List getIssuePoList(String site, String issueNo) { + return qualityIssuePoMapper.getIssuePoList(site, issueNo); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteIssuePo(String site, String issueNo, String poNo, Integer itemNo) { + int result = qualityIssuePoMapper.deleteByPoNo(site, issueNo, poNo, itemNo); + if (result == 0) { + throw new RuntimeException("删除失败,PO记录不存在"); + } + } + + } diff --git a/src/main/resources/mapper/quality/SrmQualityIssuePoMapper.xml b/src/main/resources/mapper/quality/SrmQualityIssuePoMapper.xml new file mode 100644 index 0000000..0c5f59d --- /dev/null +++ b/src/main/resources/mapper/quality/SrmQualityIssuePoMapper.xml @@ -0,0 +1,103 @@ + + + + + + + + + DELETE FROM srm_quality_issue_po + WHERE site = #{site} + AND issue_no = #{issueNo} + + + + INSERT INTO srm_quality_issue_po + ( + site, + issue_no, + po_no, + item_no, + part_no, + po_qty, + shipped_qty, + create_by, + create_date + ) + VALUES + + ( + #{item.site}, + #{item.issueNo}, + #{item.poNo}, + #{item.itemNo}, + #{item.partNo}, + #{item.poQty}, + #{item.shippedQty}, + #{item.createBy}, + GETDATE() + ) + + + + + + + DELETE FROM srm_quality_issue_po + WHERE site = #{site} + AND issue_no = #{issueNo} + AND po_no = #{poNo} + AND item_no = #{itemNo} + +