|
|
|
@ -2,7 +2,6 @@ package com.gaotao.modules.inboundNotification.service.impl; |
|
|
|
|
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage; |
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
|
|
|
import com.gaotao.common.exception.XJException; |
|
|
|
import com.gaotao.common.utils.PageUtils; |
|
|
|
import com.gaotao.modules.inboundNotification.dao.InboundNotificationDetailMapper; |
|
|
|
import com.gaotao.modules.inboundNotification.dao.InboundNotificationHeadMapper; |
|
|
|
@ -12,10 +11,6 @@ import com.gaotao.modules.inboundNotification.service.InboundNotificationService |
|
|
|
import com.gaotao.modules.inventoryStock.dao.InventoryStockMapper; |
|
|
|
import com.gaotao.modules.inventoryStock.entity.InventoryStock; |
|
|
|
import com.gaotao.modules.inventoryStock.service.InventoryStockService; |
|
|
|
import com.gaotao.modules.pms.data.QcFAIRecordData; |
|
|
|
import com.gaotao.modules.pms.data.QcMethodData; |
|
|
|
import com.gaotao.modules.pms.data.QcTemplateData; |
|
|
|
import com.gaotao.modules.pms.entity.vo.PartDefectTrackingVo; |
|
|
|
import com.gaotao.modules.pms.entity.vo.PartInformationVo; |
|
|
|
import com.gaotao.modules.pms.entity.vo.PartLabelTemplateVo; |
|
|
|
import com.gaotao.modules.schedule.mapper.ProcedureMapper; |
|
|
|
@ -34,7 +29,6 @@ import org.springframework.transaction.annotation.Transactional; |
|
|
|
|
|
|
|
import java.math.BigDecimal; |
|
|
|
import java.util.*; |
|
|
|
import java.util.stream.Collectors; |
|
|
|
|
|
|
|
@Service |
|
|
|
public class InboundNotificationServiceImpl implements InboundNotificationService { |
|
|
|
@ -81,86 +75,81 @@ public class InboundNotificationServiceImpl implements InboundNotificationServic |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public Map<String, Object> validateLabelWithInbound(String labelCode, String orderNo, String partNo,String site) { |
|
|
|
Map<String, Object> result = detailMapper.validateLabelWithInbound(labelCode, orderNo, partNo,site); |
|
|
|
|
|
|
|
if (result == null || result.isEmpty()) { |
|
|
|
throw new RuntimeException("该标签与入库单不符,请检查"); |
|
|
|
public Map<String, Object> validateLabelWithInbound(String site, String buNo, String inboundNo, String labelCode, String operationType, String userName) { |
|
|
|
logger.info("开始验证标签,标签条码: {}, 入库单号: {}, 操作类型: {}", labelCode, inboundNo, operationType); |
|
|
|
|
|
|
|
// 调用存储过程 GetScanLabelVerification |
|
|
|
List<Object> params = new ArrayList<>(); |
|
|
|
params.add(site); // 参数1: site |
|
|
|
params.add(buNo); // 参数2: buNo |
|
|
|
params.add(inboundNo); // 参数3: 入库单号 |
|
|
|
params.add(""); // 参数4: 空字符串 |
|
|
|
params.add(""); // 参数5: 空字符串 |
|
|
|
params.add(""); // 参数6: 空字符串 |
|
|
|
params.add(""); // 参数7: 空字符串 |
|
|
|
params.add(labelCode); // 参数8: 扫描的标签条码 |
|
|
|
params.add(""); // 参数9: 空字符串 |
|
|
|
params.add("采购入库"); // 参数10: 采购入库 |
|
|
|
params.add(operationType); // 参数11: I-添加 D-移除 |
|
|
|
params.add(userName); // 参数12: 当前登陆人 |
|
|
|
|
|
|
|
List<Map<String, Object>> resultList = procedureMapper.getProcedureData("GetScanLabelVerification", params); |
|
|
|
|
|
|
|
// 判断返回结果 |
|
|
|
if (resultList == null || resultList.isEmpty()) { |
|
|
|
throw new RuntimeException("存储过程调用失败"); |
|
|
|
} |
|
|
|
|
|
|
|
String hardtagInFlag = (String) result.get("hardtagInFlag"); |
|
|
|
if (!"未入库".equals(hardtagInFlag)) { |
|
|
|
throw new RuntimeException("该标签状态不允许入库"); |
|
|
|
|
|
|
|
Map<String, Object> result = resultList.get(0); |
|
|
|
String code = String.valueOf(result.get("code")); |
|
|
|
|
|
|
|
if (!"200".equals(code)) { |
|
|
|
String msg = String.valueOf(result.get("message")); |
|
|
|
throw new RuntimeException(msg); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
logger.info("标签验证成功,标签条码: {}", labelCode); |
|
|
|
return result; |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
@Transactional(rollbackFor = Exception.class) |
|
|
|
public boolean confirmInboundStorage(String orderNo, String locationCode, List<Map<String, Object>> labels, String site,String buNo) { |
|
|
|
logger.info("开始确认入库上架,入库单号: {}, 库位号: {}, 标签数量: {}", orderNo, locationCode, labels.size()); |
|
|
|
public boolean confirmInboundStorage(String site, String buNo, String inboundNo, String locationCode, String userName) { |
|
|
|
logger.info("开始确认入库上架,入库单号: {}, 库位号: {}", inboundNo, locationCode); |
|
|
|
|
|
|
|
try { |
|
|
|
// 1. 验证库位是否存在且可用 |
|
|
|
Map<String, Object> locationInfo = headMapper.validateLocation(locationCode, site); |
|
|
|
if (locationInfo == null || locationInfo.isEmpty()) { |
|
|
|
throw new RuntimeException("该库位不存在,请检查"); |
|
|
|
} |
|
|
|
|
|
|
|
String locationStatus = (String) locationInfo.get("status"); |
|
|
|
if (!"Y".equals(locationStatus)) { |
|
|
|
throw new RuntimeException("该库位已停用,请检查"); |
|
|
|
} |
|
|
|
|
|
|
|
// 根据库位获取仓库ID |
|
|
|
String warehouseId = (String) locationInfo.get("warehouseId"); |
|
|
|
if (warehouseId == null && warehouseId.trim().isEmpty()) { |
|
|
|
throw new RuntimeException("该库位未绑定仓库,请检查"); |
|
|
|
// 调用存储过程 GetSaveLabelVerification |
|
|
|
List<Object> params = new ArrayList<>(); |
|
|
|
params.add(site); // 参数1: site |
|
|
|
params.add(buNo); // 参数2: buNo |
|
|
|
params.add(inboundNo); // 参数3: 入库单号 |
|
|
|
params.add(""); // 参数4: 空字符串 |
|
|
|
params.add(""); // 参数5: 空字符串 |
|
|
|
params.add(""); // 参数6: 空字符串 |
|
|
|
params.add(""); // 参数7: 空字符串 |
|
|
|
params.add(locationCode); // 参数8: 入库库位 |
|
|
|
params.add("采购入库"); // 参数9: 采购入库 |
|
|
|
params.add(userName); // 参数10: 当前登陆人 |
|
|
|
|
|
|
|
List<Map<String, Object>> resultList = procedureMapper.getProcedureData("GetSaveLabelVerification", params); |
|
|
|
|
|
|
|
// 判断返回结果 |
|
|
|
if (resultList == null || resultList.isEmpty()) { |
|
|
|
throw new RuntimeException("存储过程调用失败"); |
|
|
|
} |
|
|
|
|
|
|
|
// 2. 提取标签条码列表 |
|
|
|
List<String> labelCodes = labels.stream() |
|
|
|
.map(label -> (String) label.get("labelCode")) |
|
|
|
.collect(Collectors.toList()); |
|
|
|
|
|
|
|
// 2. 更新标签状态为"已入库" |
|
|
|
int updatedLabels = detailMapper.updateLabelStatus(labelCodes, "已入库", site, buNo); |
|
|
|
if (updatedLabels != labelCodes.size()) { |
|
|
|
throw new RuntimeException("部分标签状态更新失败"); |
|
|
|
|
|
|
|
Map<String, Object> result = resultList.get(0); |
|
|
|
String code = String.valueOf(result.get("code")); |
|
|
|
|
|
|
|
if (!"200".equals(code)) { |
|
|
|
String msg = String.valueOf(result.get("message")); |
|
|
|
throw new RuntimeException(msg); |
|
|
|
} |
|
|
|
|
|
|
|
// // 3. 检查是否所有标签都已入库,决定是否更新入库单状态 |
|
|
|
// Map<String, Object> labelStats = headMapper.checkAllLabelsInbound(orderNo, site, buNo); |
|
|
|
// if (labelStats != null) { |
|
|
|
// Integer totalLabels = (Integer) labelStats.get("totalLabels"); |
|
|
|
// Integer inboundLabels = (Integer) labelStats.get("inboundLabels"); |
|
|
|
// |
|
|
|
// logger.info("入库单 {} 标签统计: 总标签数={}, 已入库标签数={}", orderNo, totalLabels, inboundLabels); |
|
|
|
// |
|
|
|
// // 只有当所有标签都已入库时,才更新入库单状态为"已完成" |
|
|
|
// if (totalLabels != null && inboundLabels != null && totalLabels.equals(inboundLabels) && totalLabels > 0) { |
|
|
|
// int updatedHead = headMapper.updateInboundStatus(orderNo, "已完成", site, buNo); |
|
|
|
// if (updatedHead > 0) { |
|
|
|
// logger.info("入库单 {} 所有标签已入库,状态更新为已完成", orderNo); |
|
|
|
// } |
|
|
|
// } else { |
|
|
|
// logger.info("入库单 {} 还有标签未入库,保持待入库状态", orderNo); |
|
|
|
// } |
|
|
|
// } |
|
|
|
|
|
|
|
// 5. 插入库存数据 |
|
|
|
insertInventoryStock(orderNo, warehouseId, locationCode, labels, site, buNo); |
|
|
|
|
|
|
|
// 6. 生成入库事务记录 |
|
|
|
generateInboundTransaction(orderNo, warehouseId, locationCode, labels, site, buNo); |
|
|
|
|
|
|
|
// 7. 异步调用ERP接口(这里可以发送消息到队列) |
|
|
|
//asyncCallErpInterface(orderNo, partNo, labels); |
|
|
|
|
|
|
|
logger.info("入库上架确认完成,入库单号: {}", orderNo); |
|
|
|
|
|
|
|
logger.info("入库上架成功,入库单号: {}", inboundNo); |
|
|
|
return true; |
|
|
|
} catch (Exception e) { |
|
|
|
logger.error("入库确认失败,入库单号: {}, 错误信息: {}", orderNo, e.getMessage(), e); |
|
|
|
logger.error("入库确认失败,入库单号: {}, 错误信息: {}", inboundNo, e.getMessage(), e); |
|
|
|
throw new RuntimeException("入库确认失败: " + e.getMessage(), e); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -347,6 +336,28 @@ public class InboundNotificationServiceImpl implements InboundNotificationServic |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public List<Map<String, Object>> getScannedLabelList(String site, String buNo, String inboundNo) { |
|
|
|
logger.info("获取已扫描标签列表,站点: {}, 业务单元: {}, 入库单号: {}", site, buNo, inboundNo); |
|
|
|
|
|
|
|
try { |
|
|
|
List<Map<String, Object>> scannedList = headMapper.getScannedLabelList(site, buNo, inboundNo); |
|
|
|
|
|
|
|
if (scannedList == null) { |
|
|
|
scannedList = new ArrayList<>(); |
|
|
|
} |
|
|
|
|
|
|
|
logger.info("获取已扫描标签列表成功,站点: {}, 业务单元: {}, 入库单号: {}, 记录数: {}", |
|
|
|
site, buNo, inboundNo, scannedList.size()); |
|
|
|
|
|
|
|
return scannedList; |
|
|
|
} catch (Exception e) { |
|
|
|
logger.error("获取已扫描标签列表失败,站点: {}, 业务单元: {}, 入库单号: {}, 错误信息: {}", |
|
|
|
site, buNo, inboundNo, e.getMessage(), e); |
|
|
|
throw new RuntimeException("获取已扫描标签列表失败: " + e.getMessage(), e); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 生成事务明细记录 |
|
|
|
* @return 生成的明细记录列表,用于子明细关联 |
|
|
|
|