diff --git a/src/main/java/com/gaotao/modules/inspection/controller/InspectionInboundController.java b/src/main/java/com/gaotao/modules/inspection/controller/InspectionInboundController.java index 24b557d..6a70977 100644 --- a/src/main/java/com/gaotao/modules/inspection/controller/InspectionInboundController.java +++ b/src/main/java/com/gaotao/modules/inspection/controller/InspectionInboundController.java @@ -2,6 +2,7 @@ package com.gaotao.modules.inspection.controller; import com.gaotao.common.utils.R; import com.gaotao.modules.inspection.entity.QualifiedInspectionDto; +import com.gaotao.modules.inspection.entity.UnqualifiedInspectionDto; import com.gaotao.modules.inspection.entity.InboundConfirmDto; import com.gaotao.modules.inspection.service.InspectionInboundService; import com.gaotao.modules.sys.controller.AbstractController; @@ -12,6 +13,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; +import java.util.Map; @RequestMapping("inspection") @RestController @@ -38,6 +40,15 @@ public class InspectionInboundController extends AbstractController { return R.ok(); } + /** + * 获取检验不合格待处理单据列表 + */ + @PostMapping("getUnqualifiedInspectionList") + public R getUnqualifiedInspectionList(@RequestBody UnqualifiedInspectionDto unqualifiedInspectionDto) { + List list = inspectionInboundService.getUnqualifiedInspectionList(unqualifiedInspectionDto); + return R.ok().put("rows", list); + } + /** * 获取入库历史记录 */ @@ -46,4 +57,17 @@ public class InspectionInboundController extends AbstractController { List list = inspectionInboundService.getInboundHistory(qualifiedInspectionDto); return R.ok().put("rows", list); } + + /** + * 确认不合格处理 + */ + @PostMapping("confirmUnqualifiedProcess") + public R confirmUnqualifiedProcess(@RequestBody Map params) { + String transNo = (String) params.get("transNo"); + String processType = (String) params.get("processType"); + List handlingUnitIds = (List) params.get("handlingUnitIds"); + + inspectionInboundService.confirmUnqualifiedProcess(transNo, processType, handlingUnitIds); + return R.ok(); + } } diff --git a/src/main/java/com/gaotao/modules/inspection/entity/UnqualifiedInspectionDto.java b/src/main/java/com/gaotao/modules/inspection/entity/UnqualifiedInspectionDto.java new file mode 100644 index 0000000..c5ae241 --- /dev/null +++ b/src/main/java/com/gaotao/modules/inspection/entity/UnqualifiedInspectionDto.java @@ -0,0 +1,41 @@ +package com.gaotao.modules.inspection.entity; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +public class UnqualifiedInspectionDto { + private String site; + private String transNo; + private String itemNo; + private String partNo; + private String partDesc; + private BigDecimal transQty; + private BigDecimal unqualifiedQty; + private String batchNo; + private String locationId; + private String warehouseId; + private String orderRef1; + private String orderRef2; + private String orderRef3; + private Date transDate; + private Date inspectionDate; + private String inspectionUser; + private String status; + private String userName; + private String remark; + + // 不合格处理类型:RETURN-退货, SCRAP-报废, EXCHANGE-换货 + private String processType; + + // 处理相关字段 + private BigDecimal processQty; + private String targetLocationId; + private Date processDate; + private String operatorName; + private String processRemark; + private String reasonCode; + private String reasonDesc; +} diff --git a/src/main/java/com/gaotao/modules/inspection/service/InspectionInboundService.java b/src/main/java/com/gaotao/modules/inspection/service/InspectionInboundService.java index 4f5737f..aad7059 100644 --- a/src/main/java/com/gaotao/modules/inspection/service/InspectionInboundService.java +++ b/src/main/java/com/gaotao/modules/inspection/service/InspectionInboundService.java @@ -1,6 +1,7 @@ package com.gaotao.modules.inspection.service; import com.gaotao.modules.inspection.entity.QualifiedInspectionDto; +import com.gaotao.modules.inspection.entity.UnqualifiedInspectionDto; import com.gaotao.modules.inspection.entity.InboundConfirmDto; import java.util.List; @@ -12,6 +13,11 @@ public interface InspectionInboundService { */ List getQualifiedInspectionList(QualifiedInspectionDto qualifiedInspectionDto); + /** + * 获取检验不合格待处理单据列表 + */ + List getUnqualifiedInspectionList(UnqualifiedInspectionDto unqualifiedInspectionDto); + /** * 确认检验合格入库 */ @@ -21,4 +27,9 @@ public interface InspectionInboundService { * 获取入库历史记录 */ List getInboundHistory(QualifiedInspectionDto qualifiedInspectionDto); + + /** + * 确认不合格处理 + */ + void confirmUnqualifiedProcess(String transNo, String processType, List handlingUnitIds); } diff --git a/src/main/java/com/gaotao/modules/inspection/service/impl/InspectionInboundServiceImpl.java b/src/main/java/com/gaotao/modules/inspection/service/impl/InspectionInboundServiceImpl.java index f47289d..4506d06 100644 --- a/src/main/java/com/gaotao/modules/inspection/service/impl/InspectionInboundServiceImpl.java +++ b/src/main/java/com/gaotao/modules/inspection/service/impl/InspectionInboundServiceImpl.java @@ -2,6 +2,7 @@ package com.gaotao.modules.inspection.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.gaotao.modules.inspection.entity.QualifiedInspectionDto; +import com.gaotao.modules.inspection.entity.UnqualifiedInspectionDto; import com.gaotao.modules.inspection.entity.InboundConfirmDto; import com.gaotao.modules.inspection.service.InspectionInboundService; import com.gaotao.modules.po.entity.PoReceipt; @@ -27,10 +28,14 @@ import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Service public class InspectionInboundServiceImpl implements InspectionInboundService { + private static final Logger log = LoggerFactory.getLogger(InspectionInboundServiceImpl.class); + @Autowired private TransHeaderService transHeaderService; @@ -323,4 +328,164 @@ public class InspectionInboundServiceImpl implements InspectionInboundService { .update(); } } + + @Override + public List getUnqualifiedInspectionList(UnqualifiedInspectionDto unqualifiedInspectionDto) { + // 查询po_receipt_detail表中所有不合格状态的记录 + QueryWrapper detailWrapper = new QueryWrapper<>(); + + // 查询所有不合格状态 + detailWrapper.in("status", "RETCREDIT", "RETWORK", "INVSCRAP", "SCPCREDIT", "EXCHANGE", "REWORK"); + + if (unqualifiedInspectionDto.getSite() != null) { + detailWrapper.eq("site", unqualifiedInspectionDto.getSite()); + } + + // 支持根据接收单号或采购单号查找 + if (unqualifiedInspectionDto.getTransNo() != null) { + detailWrapper.and(wrapper -> wrapper + .eq("receipt_no", unqualifiedInspectionDto.getTransNo()) // 接收单号 + .or() + .eq("order_no", unqualifiedInspectionDto.getTransNo()) // 采购单号 + ); + } + + detailWrapper.orderByDesc("receipt_no"); + + List details = poReceiptDetailService.list(detailWrapper); + List result = new ArrayList<>(); + + for (PoReceiptDetail detail : details) { + // 获取对应的接收单主记录 + QueryWrapper receiptWrapper = new QueryWrapper<>(); + receiptWrapper.eq("site", detail.getSite()); + receiptWrapper.eq("receipt_no", detail.getReceiptNo()); + PoReceipt receipt = poReceiptService.getOne(receiptWrapper); + + if (receipt != null) { + String status = detail.getStatus(); + String processType = mapStatusToProcessType(status); + BigDecimal unqualifiedQty = getUnqualifiedQtyByStatus(detail, status); + + // 只有数量大于0的记录才添加到结果中 + if (unqualifiedQty != null && unqualifiedQty.compareTo(BigDecimal.ZERO) > 0) { + UnqualifiedInspectionDto dto = new UnqualifiedInspectionDto(); + dto.setSite(detail.getSite()); + dto.setTransNo(detail.getReceiptNo()); // 使用接收单号作为事务号 + dto.setItemNo(String.valueOf(detail.getItemNo())); + dto.setPartNo(detail.getPartNo()); + dto.setPartDesc(detail.getPartDesc()); + dto.setTransQty(detail.getArriveQty()); + dto.setUnqualifiedQty(unqualifiedQty); // 根据状态获取对应的数量 + dto.setBatchNo(detail.getBatchNo()); + dto.setLocationId(detail.getLocationId()); + dto.setWarehouseId(receipt.getWarehouseId()); + dto.setOrderRef1(detail.getOrderNo()); // 采购单号 + dto.setOrderRef2(""); + dto.setOrderRef3(""); + dto.setTransDate(receipt.getReceiveDate()); + dto.setInspectionDate(detail.getInspectionTime()); + dto.setInspectionUser(detail.getInspector()); + dto.setStatus(status); // 原始状态 + dto.setUserName(receipt.getReceiver()); + dto.setRemark(receipt.getRemark()); + dto.setProcessType(processType); // 处理类型 + + result.add(dto); + } + } + } + + return result; + } + + /** + * 根据状态获取对应的不合格数量 + */ + private BigDecimal getUnqualifiedQtyByStatus(PoReceiptDetail detail, String status) { + if (status == null) { + return BigDecimal.ZERO; + } + + switch (status) { + case "RETCREDIT": + case "RETWORK": + // 退货数量 + return detail.getQtyReturned() != null ? detail.getQtyReturned() : BigDecimal.ZERO; + case "INVSCRAP": + case "SCPCREDIT": + // 报废数量 + return detail.getQtyScrapt()!= null ? detail.getQtyScrapt() : BigDecimal.ZERO; + case "EXCHANGE": + case "REWORK": + // 换货/返工数量 - 可能需要根据实际字段调整 + return detail.getQtyReplace() != null ? detail.getQtyReplace() : BigDecimal.ZERO; + default: + return BigDecimal.ZERO; + } + } + + /** + * 根据状态映射处理类型 + */ + private String mapStatusToProcessType(String status) { + if (status == null) { + return "UNKNOWN"; + } + + switch (status) { + case "RETWORK": + return "RETURN"; // 退货 + case "INVSCRAP": + case "SCPCREDIT": + return "SCRAP"; // 报废 + case "EXCHANGE": + case "REWORK": + case "RETCREDIT": + return "EXCHANGE"; // 换货 + default: + return "UNKNOWN"; + } + } + + @Override + @Transactional + public void confirmUnqualifiedProcess(String transNo, String processType, List handlingUnitIds) { + try { + // 1. 更新HandlingUnit状态为失效 + if (handlingUnitIds != null && !handlingUnitIds.isEmpty()) { + QueryWrapper huWrapper = new QueryWrapper<>(); + huWrapper.in("unit_id", handlingUnitIds); + + HandlingUnit huUpdate = new HandlingUnit(); + huUpdate.setStatus("INVALID"); // 设置为失效状态 + huUpdate.setModifiedDate(new Date()); + + boolean huResult = handlingUnitService.update(huUpdate, huWrapper); + if (!huResult) { + throw new RuntimeException("更新HandlingUnit状态失败"); + } + } + + // 2. 更新PoReceiptDetail状态为已处理 + QueryWrapper detailWrapper = new QueryWrapper<>(); + detailWrapper.eq("receipt_no", transNo); + + PoReceiptDetail detailUpdate = new PoReceiptDetail(); + detailUpdate.setStatus("PROCESSED"); // 设置为已处理状态 + //detailUpdate.setUpdateTime(new Date()); + + boolean detailResult = poReceiptDetailService.update(detailUpdate, detailWrapper); + if (!detailResult) { + throw new RuntimeException("更新接收单详情状态失败"); + } + + log.info("不合格处理确认成功 - 单据号: {}, 处理类型: {}, HandlingUnit数量: {}", + transNo, processType, handlingUnitIds != null ? handlingUnitIds.size() : 0); + + } catch (Exception e) { + log.error("确认不合格处理失败 - 单据号: {}, 错误: {}", transNo, e.getMessage(), e); + throw new RuntimeException("确认不合格处理失败: " + e.getMessage()); + } + } } diff --git a/src/main/java/com/gaotao/modules/po/service/impl/PoServiceImpl.java b/src/main/java/com/gaotao/modules/po/service/impl/PoServiceImpl.java index 3c894c1..8ae3b5c 100644 --- a/src/main/java/com/gaotao/modules/po/service/impl/PoServiceImpl.java +++ b/src/main/java/com/gaotao/modules/po/service/impl/PoServiceImpl.java @@ -146,7 +146,7 @@ public class PoServiceImpl extends ServiceImpl implemen SysUserEntity currentUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal(); String transType = "CRT"; // 获取流水号,出错不回滚 - TransNoControl transNo = transNoService.getTransNo(inData.getSite(),transType,8); + TransNoControl transNo = transNoService.getTransNo(inData.getSite(),transType,10); TransHeader transHeader = new TransHeader(); transHeader.setSite(inData.getSite()); transHeader.setTransNo(transNo.getNewTransNo());