Browse Source

检验不合格处理

master
han\hanst 5 months ago
parent
commit
c784143d1f
  1. 24
      src/main/java/com/gaotao/modules/inspection/controller/InspectionInboundController.java
  2. 41
      src/main/java/com/gaotao/modules/inspection/entity/UnqualifiedInspectionDto.java
  3. 11
      src/main/java/com/gaotao/modules/inspection/service/InspectionInboundService.java
  4. 165
      src/main/java/com/gaotao/modules/inspection/service/impl/InspectionInboundServiceImpl.java
  5. 2
      src/main/java/com/gaotao/modules/po/service/impl/PoServiceImpl.java

24
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<UnqualifiedInspectionDto> list = inspectionInboundService.getUnqualifiedInspectionList(unqualifiedInspectionDto);
return R.ok().put("rows", list);
}
/**
* 获取入库历史记录
*/
@ -46,4 +57,17 @@ public class InspectionInboundController extends AbstractController {
List<QualifiedInspectionDto> list = inspectionInboundService.getInboundHistory(qualifiedInspectionDto);
return R.ok().put("rows", list);
}
/**
* 确认不合格处理
*/
@PostMapping("confirmUnqualifiedProcess")
public R confirmUnqualifiedProcess(@RequestBody Map<String, Object> params) {
String transNo = (String) params.get("transNo");
String processType = (String) params.get("processType");
List<String> handlingUnitIds = (List<String>) params.get("handlingUnitIds");
inspectionInboundService.confirmUnqualifiedProcess(transNo, processType, handlingUnitIds);
return R.ok();
}
}

41
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;
}

11
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<QualifiedInspectionDto> getQualifiedInspectionList(QualifiedInspectionDto qualifiedInspectionDto);
/**
* 获取检验不合格待处理单据列表
*/
List<UnqualifiedInspectionDto> getUnqualifiedInspectionList(UnqualifiedInspectionDto unqualifiedInspectionDto);
/**
* 确认检验合格入库
*/
@ -21,4 +27,9 @@ public interface InspectionInboundService {
* 获取入库历史记录
*/
List<QualifiedInspectionDto> getInboundHistory(QualifiedInspectionDto qualifiedInspectionDto);
/**
* 确认不合格处理
*/
void confirmUnqualifiedProcess(String transNo, String processType, List<String> handlingUnitIds);
}

165
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<UnqualifiedInspectionDto> getUnqualifiedInspectionList(UnqualifiedInspectionDto unqualifiedInspectionDto) {
// 查询po_receipt_detail表中所有不合格状态的记录
QueryWrapper<PoReceiptDetail> 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<PoReceiptDetail> details = poReceiptDetailService.list(detailWrapper);
List<UnqualifiedInspectionDto> result = new ArrayList<>();
for (PoReceiptDetail detail : details) {
// 获取对应的接收单主记录
QueryWrapper<PoReceipt> 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<String> handlingUnitIds) {
try {
// 1. 更新HandlingUnit状态为失效
if (handlingUnitIds != null && !handlingUnitIds.isEmpty()) {
QueryWrapper<HandlingUnit> 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<PoReceiptDetail> 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());
}
}
}

2
src/main/java/com/gaotao/modules/po/service/impl/PoServiceImpl.java

@ -146,7 +146,7 @@ public class PoServiceImpl extends ServiceImpl<PoMapper, PurchaseOrder> 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());

Loading…
Cancel
Save